箱の中身や敵ドロップを追加

ページ名:箱の中身や敵ドロップを追加

箱の中身や敵ドロップを追加したりする方法

アイテムドロップを調整するだけでも、わりと色々とやれることが増えて新鮮に遊べるような気がするので、 方法を書いておく。

※注意※
この文章は、2023/02/28(ゲームバージョン0.29.4)時点でのものです。
将来的にずっと同じ方法が使える保証はありません。

※重要な注意※
ゲームやセーブデータに不具合が発生したりしても執筆者は一切関知しません。
自分でバックアップして自分でなんとかしてください。

 

0、準備

UndertaleModToolのインストールや設定を行おう。

ゲームデータとかセーブデータはバックアップしておこう。

codeを書き出しておこう。

今後のことを考えて、codeを全て書き出しておくことをおすすめ。
あれこれ修正した後で、元の内容を確認したくなることがわりとあるので。

 

codeを書き出しておくと……

書き出したファイルに対して文字列検索とかすれば、
この設定をどこで使ってるか、とか、この変数はどこで設定したのか、
とかを辿ることができて、もっと色々とやりたくなったときに助かる。

modtoolsが勝手にコードを書き換えてエラーになる場合が時々あるので、
その場合に、元コードと比較して修正方法を検討したりするのに使う。

バージョンアップしたときにもコード書き出して、バージョンアップ前のものと比較すると、
バージョンアップの修正内容を確認できたりする。

このページで扱うコード

gml_GlobalScript_lista_item.gml
アイテム一覧

gml_GlobalScript_lista_chest.gml
チェスト(箱や死体)の一覧

gml_GlobalScript_scr_chest_loot_human_general_1.gml
一般的なNPC死体の中身設定(gml_GlobalScript_lista_chest.gml)から呼び出されている。

gml_Object_obj_chest_general_Alarm_0.gml
チェストを開けるときの実処理


1、チェストの出現アイテムを追加する

CABINET(よく2つ並びで見かける金属棚)から『Backpack 1』が出てくる。

というのをとりあえずの目標にしてみよう。

gml_GlobalScript_lista_chest.gml
から、cabinetを探す。

チェストの各種パラメータ設定の後に、出現するアイテムのリストが並んでいる。
例えば、
    chest_item[a][i] = (311 << 0)
    chest_item_rare[a][i] = 40
は、アイテム311(Wire)が、出現する可能性があり、そのレアリティは40(アンコモン:そこそこ出る)である。
という設定になっている。

(311 << 0)
これは、311を0ビット左シフトしていて、まあ、結局311だ。
なんでこういう書き方になってるのかはよくわからない。

chest_item_rare には、60とか40とかの数値が設定されているが、これは、

60  コモン
40  アンコモン
25  レア
12  エピック
5   レジェンダリ

という段階を示しているだけで、この5種類以外の数値は無効になる。

この数値自体にも特に意味はなく、それぞれの出現確率はチェストごとに設定されている。

具体的な選抜処理について
実際に、アイテム抽選がどのように行われているか、というと、

1、アイテムの個数を決める。

最小値(chest_quanti_item_min)から最大値(chest_quanti_item_max)までの間で、
ランダムにアイテム数を決定する。

キャビネットなら2~4個の範囲で出現する。

2、アイテムごとにレアリティを決める。

それぞれのアイテムについて、レアリティを判定する。

キャビネットで言えば、
    chest_chance_uncommon[a] = 30
    chest_chance_rare[a] = 15
    chest_chance_epic[a] = 4
    chest_chance_legendary[a] = 1
という設定が各段階の出現頻度を決めるパラメータになる。

30%でアンコモン、15%でレア、4%でエピック、1%でレジェンダリ、という判定ではあるが、
この4つの判定を順番に行って、後からの判定が成功すれば上書き。
という処理になっている様子なので、実際の確率は、
24.2352%  14.256%  3.96%  1%  のようになる。

3、出現アイテムを決定する。

各アイテムごとに、決定したレアリティに対応するアイテムがランダムに1つ選ばれる。
そのレアリティが設定されたアイテムのなかから1つが選ばれるので、
そのレアリティにアイテムが多く設定されている場合には、実際の出現率は低くなる。

例えば、キャビネットのエピックでは、
『Smartphone』『Electric motor』『Bottle of water』のうちどれかが出現するので、
1個あたりの出現率は 3.96% / 3 で 1.32%だが、
レアには、12個のアイテムが設定されているので、
1個あたりの出現率は14.256% / 12 で 1.188%になり、エピック指定アイテムの方が出現率が高かったり。

別の例として、
バッグのレジェンダリ(1%)には『Book cooking』が含まれてるんだけど、
同じ枠に鍵とかスマホとかが設定されてるので、実際の出現率はさらに1/9になって、滅多に見かけることはない。
ちなみに、武器箱や薬箱のレジェンダリ(1%)は本しか設定されてない。

では、キャビネットのアンコモンあたりに、『Backpack 1』を追加してみよう。

アイテムのIDが必要なので、
gml_GlobalScript_lista_item.gml
から、backpackを検索する。

アイテム情報の設定時に a に代入されている数値がアイテムのIDなので、
Backpack 1 のアイテムIDは 402 となる。

gml_GlobalScript_lista_chest.gml に戻って

アイテムID402が出現するように追記してやれば、キャビネットから『Backpack 1』が出現するようになる。

同じようにしてやれば、出現アイテムを好きなように追加することができる。
gml_GlobalScript_lista_item.gml
から、他のバックパックのIDも探して、同じようにリストに追加すれば、
他のバックパックもキャビネットから出現するようになる。


当然だが、アイテムを追加すればするほど、それぞれの出現率は下がるし、
何かのアイテムの出現率を高くすれば、その分、それ以外の出現率が下がる。

もちろん、リストからアイテムを削除することも可能なので、
好きなように調整してみても面白いんじゃないかと思う。

 

2、一般NPCのドロップ品を追加する

gml_GlobalScript_lista_chest.gml

には、BanditやArmyなどのNPCも設定されているが、ほとんどのNPCは、アイテムリストの代わりに、
    scr_chest_loot_human_general_1(1)
と書かれている。

その実体は、
gml_GlobalScript_scr_chest_loot_human_general_1.gml
であり、書いている内容は、gml_GlobalScript_lista_chest.gmlのアイテムリストと同じようなものだ。

つまり、 gml_GlobalScript_scr_chest_loot_human_general_1.gml を修正すれば、ほとんどの一般NPCのドロップをまとめて調整できる、ということになる。

ちなみに、リストそのものは同じだが、ドロップ個数やレアリティ出現率などはNPCごとに異なり、
例えばBanditよりもArmyの方がアイテムを多く持っていて、希少アイテムの出現率も高い。

というわけで、
gml_GlobalScript_scr_chest_loot_human_general_1.gml に
gml_GlobalScript_lista_chest.gml のときと同じようにアイテムID 402 の設定を追加してやれば、

一般NPCが『Backpack 1』をドロップしたりするようになる。

 

3、一般NPCのドロップに、一定確率で特定のアイテムを追加する

ここまでの方法は、リストにアイテムを追加するだけなので楽だが、
思うような確率でアイテムを出現させようとすると、なかなかに調整が難しい。
というわけで、ここでは、もう一歩進んで、

一般NPCは、25%の確率でランダムなバックパックを1つドロップする。

を実装してみたいと思う。

gml_Object_obj_chest_general_Alarm_0.gml
に、チェストのアイテムを決定する処理が書かれている。

上に書いた 具体的な選抜処理 もここに書かれている処理になる。
だから、その気になればアイテムの出現処理をまるっと書き換えることも可能である。

そのチェストが一般NPCだったら、の判定方法は色々あるが、
既にコード内で判定に使っている場所があるので、それにならうこととしよう。

1つめのドロップを武器に、2つめのドロップを弾薬に上書きする。

という処理を行っている場所があるので、
そこに、25%の確率で、通常のドロップアイテムに追加で、バックパックを1つランダムにドロップする。
という処理を追加する。

scr_chance(25)
は、1以上100未満の乱数(小数有り)を振って、引数以下ならtrueを返す関数。要するに25%。

bpary という配列で、バックパックのIDを並べ、
その中からランダムで1個選んで出現アイテムリストの最後に追加している。

バックパックが色々出てきてちょっと楽しい。

 

たぶん、これだといいバックパックが出過ぎだろうな、とは思うんで、

シンプルに25%じゃなくて10%とかにするとか、

var bpary = [410,410,410,402,402,402,403,403,403,404,405,406,407,408,409]
みたいに、高性能すぎるものを省いて、性能の低いモノの出現率を上げるとか、

if (scr_chance(25) && global.backpack_equipped == 0)
みたいに書いて、バックパックを装備してない場合のみ出現、とかでも面白いかもしれない。

 


このページの総アクセス数: 4261

今日: 1

昨日: 10

シェアボタン: このページをSNSに投稿するのに便利です。

コメント

返信元返信をやめる

※ 悪質なユーザーの書き込みは制限します。

最新を表示する
名無し
>> 返信元

次のアプデまでの良い暇つぶしになりそうだ。

返信
2023-03-01 20:01:44

名無し

需要あると言われたから書いておく。自分でゲームデータいじり始めると、なかなかに面倒で楽しいぞ。

返信
2023-02-28 21:32:42

NG表示方式

NGID一覧