top / 1 / 2 / 3 / 4 / ex1 / 5 / 6 / ex2 / 7 / 8 / 9 / 10 / 11 / ex3 / 12 / 13 / 14 /..../ 関数 / 覚え書き / 倉庫
第14回 【 色々と応用してこまごまとした物を作る 】

「アイコン追加、チョコエッグ、敵が落とすアイテムの変更」

とりあえず、「Repair Kit with Choco Egg Mod」を作るところまでカバーする事を目標にしてはいたので、今までのおさらいがてら、解説しますね。
他にもウインドウ表示系の小技とかも新たに覚えたので、そのうちそこら辺もやろうとは思うけど。
実はチョコエッグを食うと、ランダムで色々なキャラ(中華ハルヒ、アッー!含む)のメッセージカードが表示されるバレンタインMODを作ってたんだけど、その強烈な痛さがオイラの許容量を超えてしまったので、途中で断念しました。(我に返ったとも言う)


とりあえずアイコンを作っちまいますね。
構成は前回の修理キットにアイコンの画像ファイルを追加する形でいきましょう。

□repair_kit_with_choco_egg ┣□gamedata ┃┣□config ┃┃┣□misc ┃┃┃┗■items.ltx ┃┃┣□text ┃┃┃┗□eng ┃┃┃ ┗■string_table_ngcmod.xml ┃┃┗■localization.ltx ┃┣□scripts ┃┃┣■bind_stalker.script ┃┃┗■ngc_mod.script ┃┗□textures ┃ ┗□ui ┃  ┗■ui_icon_equipment.dds(前回の環境にこれを追加) ┗■readme.txt


あとで使うことになるのでチョコエッグ用のも一緒にやります。
つっても、やり方は【7. 痛銃の造り方】とまったく同じで、新しいテクとかは何も無いですが。
GIMP以外でDDS編集した事ない人には実感が無いかもしれませんが、GIMPはフツーにDDS編集できるけど、これが実はアルファチャネルと言う透明度に関する処理を全自動でやってくれてるので、凄まじい便利さなんです。もう手放せません。

それはさておき、まずは貼り付ける画像をそこらへんで拾ってきます。



工具箱とか。



チョコエッグとか。

これを痛銃と同じ手順で好きな場所に貼り付けるだけなんですが、その際にひとつだけ。
このアイコンファイルは前にも触れたとおり50x50を1マスとして描画されています。
よって、GIMPでグリッド線を表示したほうが良いでしょう。
グリッド線もデフォルトでは見にくいので、GIMPの道具箱にてメニューより「ファイル」「環境設定」で環境設定画面を開き、「初期グリッド」にて見やすいように変更します。
オイラは線種を「破線」に描画色を「白」幅と高さを「50x50ピクセル」に変更してます。
ちなみに変更したグリッド線は一旦GIMPを終了して再起動しないと反映されません
変更したグリッド線は描画ウインドウの方でメニューより「表示」「グリッドを表示する」で表示されるようになります。

座標

こんな感じ。「itemsltx」に追加する座標番号も覚えておきましょう。
座標は問題の絵の先頭座標を50で割ればオッケー。
今回の場合、修理キットは「250, 1700」が先頭座標なので、座標番号は「5, 34」に、同じ計算でチョコエッグは「6, 34」と言うことになります。

あとはファイル「items.ltx」内の修理キットの項目にて以下の項目を変更するだけです。

inv_grid_width = 1 ;アイコンの高さ inv_grid_height = 1 ;アイコンの幅 inv_grid_x = 5 ;X座標番号 inv_grid_y = 34 ;Y座標番号

とりあえず修理キットに関してはこれで完了です。
痛銃をやった後では簡単過ぎますね。


次、チョコエッグ行きましょう。
まずは修理キットと同じくファイル「items.ltx」にチョコエッグを追加しましょう。

;@Choco Egg [choco_egg]:identity_immunities GroupControlSection = spawn_group discovery_dependency = $spawn = "food and drugs\choco_egg" ;$prefetch = 32 class = II_FOOD cform = skeleton visual = food\conserv1.ogf description = enc_equipment_chocoegg inv_name = chocoegg inv_name_short = chocoegg inv_weight = 0.01 quest_item = true inv_grid_width = 1 inv_grid_height = 1 inv_grid_x = 6 inv_grid_y = 34 cost = 0 eat_health = 0.3 eat_satiety = 0.4 eat_power = 0 eat_radiation = 0 wounds_heal_perc = 0 eat_portions_num = -1 slot = 4 animation_slot = 4

こんな感じ。
修理キットと決定的に違うのは、

eat_health = 0.3(回復する体力) eat_satiety = 0.4(満腹度)

このへんでしょうか?後は似たようなもんです。


次、ファイル「string_table_ngcmod.xml」にチョコエッグの名前と説明文を追加します。

<string id="enc_equipment_chocoegg"> <text>This imitation egg made of Chocolate. It has very high calorie, It expect health recovery and satiety as one of foods. In the egg shell, an unspecified item exists. You can't know what is it until eating. Rarely, it has the possibility that is the very useful item.</text> </string> <string id="chocoegg"> <text>Choco Egg</text> </string>

こんなもんでしょうか?
表示の都合上半角スペースでインデントおよび改行してますが、実際には半角スペースは書かないでください
コピペするならインデントや不要な改行は消しちゃってください。


次。スクリプトです。駆け足ですね。前やった事と同じですからね。ジャンジャン行きましょう。
今回はファイル「bind_stalker.script」は弄りません。前回のままでオッケーです。
まずはファイル「ngc_mod.script」のファンクション「itemuse」にて、前回書いたような修正をします。
こうです。

function itemuse(what) if (string.find(obj_name, "repair_kit") == true) then use_repair_kit(what) elseif (string.find(obj_name, "choco_egg") == true) then use_choco_egg(what) -- If you want to add new trigger item, add [elseif] script this line. end end

ファンクション「use_choco_egg」は新規作成しましょう。
つっても、ランダム数値取得とアイテム追加の関数を知ってりゃ、何も迷うことはないと思いますが。
大まかに説明すると、こんな感じです。

function use_choco_egg(what) local lucky_num_1 lucky_num_1 = math.random(1, 3) if (lucky_num_1 == 1) then alife():create("アイテム1", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) elseif (lucky_num_1 == 2) then alife():create("アイテム2", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) elseif (lucky_num_1 == 3) then alife():create("アイテム3", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) end end

基本はこんだけです。マジ簡単です。
ただ、このゲームは登場するアイテムも凄く多いので、普通にやるとグチャグチャになります。あと、レア度とかも設定したいですよね。
そこでオイラはランダム数値を複数使って、こんな感じにしました。

local lucky_num_1(アイテム分類) local lucky_num_2(アイテムランク) local lucky_num_3(アイテム)

例えば、lucky_num_1の値を「1〜10」の範囲でシャッフルして、「1:アーティファクト、2〜7:ハズレ。弾丸その他、8〜9:武器、10:防具」みたいに分類します。
そして、それぞれの中でlucky_num_2の値を「1〜10」でシャッフルして、「1〜4:ランク1、5〜7:ランク2、8〜9:ランク3、10:ランク4」のようにアイテムのランクとして振り分けます。
このアイテムランクはエクセルでアイテム一覧表を作って、ウンウン唸りながら適当に作りました。スッゲー面倒でした。途中で嫌になりました。
で、最後にそれぞれのランクの中でlucky_num_3の値を「アイテムの数」でシャッフルし、最終的なアイテムを決定しました。
こうする事で、出来るだけ多くのアイテムをレア度も含めて扱えるようにしているのです。

あ、あと弾丸についてですが、使っている武器と異なるタイプの弾丸が出たらゴミ大量発生になってしまうので、もしも弾丸を引き当てたら、「装備中のメイン武器で最も強い弾丸」が出現するようにしてあります。
メイン武器を装備していなかったら、自動的に「その他のハズレアイテム」になります。
やり方は実にシンプル。

weapon_name = item_in_slot_2:name() if (string.find(weapon_name, "wpn_ak74u")) or (string.find(weapon_name, "wpn_ak74")) or (string.find(weapon_name, "wpn_abakan")) or (string.find(weapon_name, "wpn_abakan_m1")) or (string.find(weapon_name, "wpn_aksu_anom")) or (string.find(weapon_name, "wpn_ak74_m1")) or (string.find(weapon_name, "wpn_abakan_m2")) or (string.find(weapon_name, "wpn_groza_m1")) or (string.find(weapon_name, "wpn_ak74u_m1")) then alife():create("ammo_5.45x39_ap", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) alife():create("ammo_5.45x39_ap", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) alife():create("ammo_5.45x39_ap", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) elseif (string.find(weapon_name, "wpn_groza")) or (string.find(weapon_name, "wpn_val")) or (string.find(weapon_name, "wpn_vintorez")) or 中略 end

ハイ。そのまんまですね。
メイン武器名を全て並べました。禿げ上がるほど面倒でした。

チョコエッグの作り方はこれで以上です。
いつもだったら、まとめとして、ここまでの内容を貼り付けるところですが、さすがに今回はやめときます。何しろ、アイテム量がアレなもんでチョコエッグだけで1319行あるので。
見たい人はお土産の中身を見てください。


さて、最後に敵が落とすアイテムを修正しましょう。
自分で使ってみて思ったんだけど、たまーに修理キットとかチョコエッグとかが出ると、敵の死体をクリックする時のワクワク度がちょっぴりアップしますね。
ゲーム性としてもモチベーションが結構上がるので、敵が落とすアイテムを増やすのはMODとしてはお手軽で比較的簡単な割に、体感的な効果(楽しさ)は大きい、とても良い修正だと感じます。

さて、ついでなんで、修理キットとチョコエッグでやってみましょう。
まずは構造を。以下のファイルを追加します。

□repair_kit_with_choco_egg ┣□gamedata ┃┣□config ┃┃┣□misc ┃┃┃┣■death_items_by_communities.ltx ┃┃┃┣■death_items_by_levels.ltx ┃┃┃┣■death_items_count.ltx ┃┃┃┗■items.ltx ┃┃┣□text ┃┃┃┗□eng ┃┃┃ ┗■string_table_ngcmod.xml ┃┃┗■localization.ltx ┃┣□scripts ┃┃┣■bind_stalker.script ┃┃┗■ngc_mod.script ┃┗□textures ┃ ┗□ui ┃  ┗■ui_icon_equipment.dds ┗■readme.txt

追加した3つのファイルはセットです。
追加したアイテムに食い違いがあったりすると、アイテム発生の瞬間(敵が死んだ瞬間)にクラッシュします。
それぞれはこんな内容です。

death_items_by_communities.ltx :敵が目的のアイテムを出す確率
death_items_by_levels.ltx :目的のアイテム(を出す敵)が出現するエリア
death_items_count.ltx :目的のアイテムが出る個数

順番にいきましょう。
まずはファイル「death_items_by_communities.ltx」です。
開くとまず[stalker]と書いてあり、そこからアイテム名と数値が記述されています。
この数値がアイテムを落とす確率という訳です。
「0.01」「1%」として、「0〜1」の範囲で指定できます。小数点以下は4桁くらいまでは余裕でサポートしてるようですが、1%以下の世界では確認のしようもありませんね。
更に行を送って行くと、

[bandit]:stalker

とか、

[killer]:stalker

とか、こんなカテゴリーが見つかると思います。
これはそれぞれの派閥の敵が目的のアイテムを落とす確率を指定する場所なんですが、ここでカテゴリー名の横に「:stalker」と書いてありますね。
これは実は、武器を追加したときにも説明した「継承」で設定されてます。

[killer]:stalker ;ナ萵 bread = 0 kolbasa = 0 vodka = 0 energy_drink = 0.3

この記述は、「Killer」に分類されてる敵は「bread、kolbasa、vodkaを出す確率は0に、energy_drinkを出す確率は0.3(30%)に、それ以外はstalkerと同じ設定」と言う意味です。
Banditに至っては、Stalkerと全く同じ内容と言うわけですね。

ちょっと余談です。
「stalker」が全ての継承元であるのは判りますが、その内容を良く見ると、全ての弾丸が「1」つまり「100%」になっています。これでは死体が弾丸で埋まってしまいます。
これは、今回は関係ないので紹介しなかった同じフォルダ内の「death_generic.ltx」に関係しています。
この中に、[item_dependence]と言うカテゴリーがありまして、そこで、

弾丸名 = 武器名1, 武器名2, 武器名3

のような形で弾丸と武器の対応表が記述されてます。
この対応表にある武器を装備している場合だけ、その弾丸が出現する、と言った仕組みになっています。
余談終わり。

さて、ではファイル「death_items_by_communities.ltx」にどのような修正を施すかですが、ここは取り合えず「全ての人間型の敵が落とす可能性を持つ」と言う設定でいきましょう。
よって、カテゴリー「stalker」の最終行行で言うと72行目らへんでしょうか?
カテゴリー[Bandit]の直前に以下の行を突っ込みましょう。

repair_kit = 0.08 ;NGC_MOD ADDITIONAL choco_egg = 0.08 ;NGC_MOD ADDITIONAL

これで、両方とも8%の確率で敵が落とすようになります。(もちろん、これから行う残り二つのファイルの修正も必須ですが)
8%と言うのはオイラの体感でバランス取っただけなんで、好みでどうぞ。
動作確認ならば「0.5」とか「1」とかでも良いと思います。


次、ファイル「death_items_by_levels.ltx」です。
これはエリア毎の設定で、数値は「0(出現しない)」「1(出現する)」の二択です。
更にここでは全てのエリアの継承元として「default」と言うカテゴリが用意されています。
手っ取り速いので、この「default」の最後に追加しましょう。

repair_kit = 1 ;NGC_MOD ADDITIONAL choco_egg = 1 ;NGC_MOD ADDITIONAL

こうです。


最後にファイル「death_items_count.ltx」です。
これはアイテムが出る場合、一度に何個出るかの設定です。
推定ですがここのカテゴライズは難易度を示している模様です。「item_count_0」が難易度NOVICE、「item_count_3」が難易度MASTERだと思われます。
で、ここも「item_count_0」が全ての継承元になっているので、同じように修正しましょう。

repair_kit = 1 ;NGC_MOD ADDITIONAL choco_egg = 1 ;NGC_MOD ADDITIONAL

1個ならばこれでオッケーです。
修理キットを一度に2個出したいなら、

repair_kit = 2 ;NGC_MOD ADDITIONAL

これで2個セットで出るようになります。
弾丸のようにランダムにしたいのであれば、,(カンマ)」で区切って最小値と最大値を指定します。
修理キットを1個〜5個の範囲でランダムに出るようにしたいのであれば、

repair_kit = 1, 5 ;NGC_MOD ADDITIONAL

こうですね。
これで敵の落とすアイテムを変更することができるようになりました。


とりあえず、この時点でオイラがSTALKER filesに投稿した「Repair Kit with Choco Egg Mod」の内容は完全に網羅できたと思います。
前にも触れたけど、このMODで使っている変数名とかは、まだ慣れてない頃にテキトーに命名しちゃったものでオイラ的には黒歴史に放り込みたい部分なので、今後登場するときには名前がこっそり変わってるかも知れません。
命名規則は速い段階でしっかりと決めておかないと、後で恥ずかしいと言う例ですね。

今回は簡単すぎるのと、長すぎるのもあるのでまとめは無しにしときます。
でも、チョコエッグの苦労の跡は是非見て欲しいところではありますw
ちなみに、今回の↓のお土産は、STALKER filesに投稿した内容に、「ゲーム開始時にアイテムを所持させる」の修正を加えたものになってます。


今回作ったもの:RepairKit_ChocoEgg_v101.zip
超オマケ:ChocoEgg for Priboi.zip(Priboiにチョコエッグと修理キット出現。初期アイテムは無し)



top / 1 / 2 / 3 / 4 / ex1 / 5 / 6 / ex2 / 7 / 8 / 9 / 10 / 11 / ex3 / 12 / 13 / 14 /..../ 関数 / 覚え書き / 倉庫
ニャギ茶★SPOT --工作部屋--