*改造実践編2(その他) **Snorkの足とか食べたいんですけど。 とりあえず、fleshの目を食べてみましょうか。~ misc→monster_items.ltxを開く。~ [mutant_flesh_eye]:identity_immunities 略 class = II_FOOD クラスをフードに変更。~ attach_angle_offset = -0.287979, 1.560923, 1.544060 attach_position_offset = 0.096910, -0.013594, 0.107925 attach_bone_name = bip01_r_hand auto_attach = false // should be deleted after update bone_name = bip01_r_hand position_offset = 0.0,0.0,0.0 angle_offset = 1.570790,1.570790,3.92699 ; eatable item eat_health = 0 eat_satiety = 0.6 eat_power = 0.01 eat_radiation = 0.1 wounds_heal_perc = 0 eat_portions_num = -1 ; food item slot = 4 animation_slot = 4 ;hud item hud = wpn_vodka_hud これを、cost以下に、追加。~ すると、目が食べられる。~ eat_health = 0 eat_satiety = 0.6 eat_power = 0.01 eat_radiation = 0.1 wounds_heal_perc = 0 eat_portions_num = -1 healthは食べたときの体力の増減。1がMAX。-をつけると減る。~ satietyは食べたときの空腹度の増減。1がMAX。食べたら腹が満たされるんだから当然+。~ powerはスタミナの増減。~ radiationは放射能が溜まるかどうか。溜まるといいと思う。~ wound_heal_percは出血。~ 他のモンスターの体でも可能。~ また、ここに追記してコントローラーなどの肉を落とさせることも可能。~ アイテムを落とさないクリーチャーに落とさせるには、~ Spawn_[[Inventory]]_[[Item]]_Section = mutant_snork_leg(落とさせるアイテム) Spawn_Inventory_Item_Probability = 0.2(確立20%) これをcreaturesの各モンスターのltxに追記すればいい。~ **ベッドとか持ち運び出来ないの? items.ltx(アイテムを出現させれればどこでもいいんだけど、とりあえず分かりやすくここで) [bed]:identity_immunities GroupControlSection = spawn_group discovery_dependency = $spawn = "food and drugs\bed" class = II_ATTCH cform = skeleton visual = objects\dynamics\bed\bed_01.ogf radius = 1 description = bed inv_name = bed inv_name_short = bed inv_weight = 20 inv_grid_width = 2 inv_grid_height = 2 inv_grid_x = 2 inv_grid_y = 39 cost = 2000 attach_angle_offset = -0.287979, 1.560923, 1.544060 attach_position_offset = 0.096910, -0.013594, 0.107925 attach_bone_name = bip01_r_hand auto_attach = false // should be deleted after update bone_name = bip01_r_hand position_offset = 0.0,0.0,0.0 angle_offset = 1.570790,1.570790,3.92699 とりあえず、これを記述すればbedというアイテムが入手できる。 スタッシュに忍ばせておくなりするといいよ。 ただし、初期配置の物は持っていけ無い。 spawnerでこのベッドと入れ替えしないといけない。 他の物でも可能だから試してみるのもいいかもね。 **Spawnerで敵やアイテムを出現させてみたい。 先ずはXrspawnerの入手をしなければなりません。 ここにあるのは英語バージョンです。~ http://www.unknown-plant.7box.jp/Xrspawner.zip まずは、all.spawnを開きます。 ゾンビ(さっちゃんとかも可)の追加の仕方です。 左側のentityより、zombie_normalを選択する。 ↓ edit より、add database objectを選択する。 ↓ 上はカテゴリ、下は名前です。ゾンビなら、上はMonsterかZombieなんかがいいかと。 下はZombie1という感じで。 ↓ Zombieが右に追加されました。(いなかったらプルダウンメニューで探す) ↓ 右側で追加したいのを選択。 ↓ Addを押す。 ↓ entityの最下部に追加される。それを選択。 ↓ CoordX,Y,Zに座標入力する。(座標の入手に関しては後で) ↓ プルダウンメニューでスポーンさせたいレベルを選ぶ。Level IDは自動的に変化。 ↓ Save Changes、file→saveする。 ↓ OK 座標を得るためには、user.ltxを開く。 rs_stats offをrs_stats onにする。 左側にでる大きな数字がその場所の座標。 注意事項としては、 Save Changesを押さないと、別のオブジェクトの項目をクリックして戻ると、 元の数値に戻ってる。 Coordは位置だが、Vectorというのは向きのこと。 Showの部分で、Object Nameにすると探すとき楽かも。 物を出現させたいのであれば、ogfファイル(メッシュ)の在り処を記述すればいい模様。ただし、武器とかの場合はいろいろ種類があるので、 サンプルFast Shooter AKの場合 Entity wpn_ak74_m1 Object Name kat_wpn_ak74_m1 Object Path weapons\ak74\wpn_ak74 これでいいらしい。 人間はよくわかんね。 **Xrspawner不便 ActivePerlが必要。 コマンドプロンプト開くと、 ~ C:\Document and Settings\ユーザー名> ~ とでるから、ユーザー名フォルダにacdc.plとall.spawnを設置。 acdc.pl -d all.spawn -o ltxでデコードされる。 acdc.pl -c ltx -o outputでspawnファイルにエンコード。 これでltxで弄れる。~ なお、acdc.plについては~ http://www.unknown-plant.7box.jp/acdc.zip こちらで手に入れるとよい。~ などと書いたが、手軽にデコードエンコードが行えるツールを作ってくれました。 STALKERスレ66の>>201ありがとう!~ http://www.unknown-plant.7box.jp/tool.zip さらに、同スレ>>201がActivePerlを必要としないものを作ってくれました。~ http://www.unknown-plant.7box.jp/verNoAP.zip ↑リンク切れの模様なので、ここに添付しときます。~ <リンク切れ修正しました。>~ サイズ制限の都合上、分割自己解凍書庫になってます。(上限1,000KB 1,024,000ではなく1,000,000扱い)~ &ref(SpawnToolNoAPver.part1.exe);と&ref(SpawnToolNoAPver.part2.rar);をダウンロードしてSpawnToolNoAPver.part1.exeを実行すれば解凍されます。~ フォルダは含んでないので適当に作ってください。~ 注意点としては、ltxで弄った後、spawnに戻しても反映されねぇって人は、 そのspawnファイルをXrspawnerで開いてSaveすると反映される。 なお、何故かはわからないがこのオブジェクトを他のマップから持ってくると出現しない。 ひょっとしたらレベルID以外にも他の要素が絡むかもしれない。 というわけで、同じマップのオブジェクトを使うのを推奨する。 リンク切れ修正しました。お騒がせいたしました。 うp主ZoDより SpawnToolNoAPverのミス修正しました。 パ、パマギ・・・ うp主66@201より **ゾンビー設置めんどくさい all.spawnをltx化しただろうか? [663]←この数字は連番になっているが、他の数字と被っていなければかまわない。 ; cse_abstract properties section_name = physic_destroyable_object name = esc_surprise_box_003 position = 110.779426574707,0.186818599700928,-26.2778778076172 direction = 8.84161082126411e-008,0.865800440311432,7.52302184992004e-008 ; cse_alife_object properties game_vertex_id = 0 distance = 0 level_vertex_id = 594270 object_flags = 0xffffff3a custom_data = <<END [drop_box] community = def_box items = ammo_12x76_zhekan, 2 END ; cse_visual properties visual_name = physics\box\box_metall_01 ; cse_ph_skeleton properties ; cse_alife_object_physic properties physic_type = 0x3 mass = 10 コレ自体は撃つと壊れるアイテム箱なのだが、 items = ammo_12x76_zhekan, 2 この部分を変えることによって様々なものが登場する。 items = m_burer_e,10 フードデブが壊した瞬間10匹召還される。~ items = stalker, 100 Lonerが100匹召還される 同じ座標に人を置くことで、自動的に箱を壊すことができる。~ 召還をプレイヤーの手にゆだねることなくできるわけだ。 なお、何故かはわからないがこのオブジェクトを他のマップから持ってくると出現しない。 ひょっとしたらレベルID以外にも他の要素が絡むかもしれない。 というわけで、同じマップのオブジェクトを使うのを推奨する。 メモ stalker m_boar_e(このようなm_???_eという形式になってないと召還できない模様、stalkerは例外) ポルターガイストは召還不能。 カラス(crow)は召還可能。 **トレーダーの無駄話が長い config\scripts\esc_trader.ltx をひらいて、 [mob_trader@new_start_wait]←この項目を以下のスクリプトに書き換える。 anim_global = desk_talk anim_head = normal sound_phrase = trader_come_here2 on_signal = sound_phrase_end | mob_trader@new_idle1 ;on_info = {=talking} mob_trader@new_idle1 ; 髜顋籵鴾 ・珸・ on_actor_dist_ge_nvis = 5 | {-esc_trader_bye_played+esc_trader_hello_played} mob_trader@new_bye %+esc_trader_bye_played% *NPCを意のままに操りたいです そこのNPCがうっとおしい、自分だけのサポートキャラを作りたい 自分の拠点を作りたい、初心者キャンプを外骨格で埋めたい モノリスになってNPCを自分の意のままに操りたい そんなあなたにはLogic(NPCの行動パターン)を学ぶといいでしょう。 **まずはLogicの基礎から では、Logicとはどんなものか gamedata\config\scripts を開いてください ずらーっと .ltxファイルが出てきているはずです(バニラの場合) これ一つ一つが、NPC(もしくはスクリプトオブジェクト)のLogicになっているわけです。 例として [logic] active = walker@1 on_death = death [walker@1] path_walk = val_escort_guard3_return_walk path_look = val_escort_guard3_return_look combat_ignore_cond = {=val_fighting_captive -val_escort_captive_fight -val_escort_captive_can_leave} [death] on_info = {=killed_by_actor} %+val_escort_actor_helped% 大抵のファイルは似たような構造になっているはずです *** [logic] これはLogicがここから始まるよ、という宣言のようなものです ここ以外の [ ] に囲まれているところは区切りになっていて、ジャンプする先の目印(自分ではラベルと呼んでる)になります。 このラベルにも規則があるようで、[logic名@○○]という感じらしいのですが、案外どうでもいいらしいです。 ***active これは優先的にどこのラベルへジャンプするかを決めます この場合はwalker1というラベルにジャンプします ***on_death これはいわゆるスイッチ的なジャンプ命令で、そのNPCが死亡した際に [death] というラベルへ飛びます ***[walker@1] ここですが、ここから解説し始めると切りないのでLogic命令の大御所 http://sdk.stalker-game.com/en/index.php?title=Logic#walker_scheme に丸投げします ようは歩かせたいポイントを指定してるだけです ***on_info [death] の on_info = {=killed_by_actor} %+val_escort_actor_helped% ですが、このon_infoもいわばスイッチ式で killed_by_actorというPortion(フラグ)を受け取った場合にval_escort_actor_helpedというPortionを追加するという命令です さながらIF条件式のようなものですね このように、NPCの行動はこれらの命令によってきめられています **どのNPCのLogicかわからない 基本的に定義されている場所として all.spawn(ここに直接Logicが書かれてる場合も) config\creatures\spawn_section.ltx が主な場所です それらのファイルを開いたら custom_data = という感じの行があるはずです そのパス先にNPCのロジックファイルがあります all.spawnに書かれている場合は custom_data = <<END ~~~~~~~~~ END という感じのところに記述されています どれがどのNPCなのかは、頑張って推察してください XMLファイルを所持武器から逆引き→all.spawnのモデルデータと照らし合わせる 普通に名前から推察する とかいろいろありますが……暇があれば書きます **自分で好きなNPCを湧かせたい よく質問があるので、無許可ながら偉大なるMODスレ22の>>848氏のやり方を掲載させていただく gamedata\scripts ここにjoinjoin.scriptというファイルを作り、中に以下の記述をする function spawn(spawn_item) local actor_position = vector() actor_position = db.actor:position() actor_position.z = actor_position.z - 2 return alife():create(spawn_item, vector():set(actor_position.x, actor_position.y, actor_position.z), db.actor:level_vertex_id(), db.actor:game_vertex_id()) end function paaaan() spawn("mil_stalker_respawn_2") end 次にui_main_menu.scriptのなかにある main_menu:OnKeyboard()を探し、他のを参考にしながら以下を加える if dik == DIK_keys.DIK_F11 then joinjoin.paaaan() end これでゲーム中にEscを押し、F11をおせばLonerが自分のそばにリスポンする しかしこのままだと召喚させたLonerはただ不規則に歩き回ってるだけ。 奴らを思い通りに操りたい、思い通りに行動させたい。 そしてLonerだけじゃなくてDutyも出したいという人へ ***キャラを変える joinjoin.scriptにある spawn("mil_stalker_respawn_2") のmil_stalker_respawn_2を gamedata\config\creatures\spawn_sections.ltx から引用したものにすればいい ただし、custom_dataの記述がある奴はそのマップ独自の行動パターンが設定されているので 記述を変えるか、その記述がないものを選んだ方がいい また、Dutyはdolgと記述されているので注意 ***沸かせる専用のキャラを作る [mil_stalker_respawn_sp]:stalker ← [spawnで呼び出す用の名前]:ベース(人ならstalkerでおk) $spawn = "respawn\mil_stalker_respawn_sp" ← たぶんエディタ上での設定 名前と同じでいいと思う character_profile = sim_stalker_master ← キャラのステータスとか config\gameplay\character_desc_OO.xml にある spec_rank = master ←ランク community = stalker ←派閥 (custom_data = scripts\mil_stalker1.ltx) ←追加データ(記述がない場合もある) ***動きを変える 例としてキャンプ まず上のように custom_data = scripts\mil_stalker1.ltx を付け加える そしてmil_stalker1.ltx を作成し、以下にこう記述する [logic] active = kamp@test [kamp@test] center_point = mil_dolg_camp_center radius = 2 def_state_moving = walk これで『割れハウスで召喚されたLoner』はSkullさんのいた焚き火のところへ行く(満員だったらうろちょろするが) これらの命令はhttp://sdk.stalker-game.com/en/index.php?title=Logicに大量にあるからここを参考にするとすごくやりやすい それともいっその事データベースを作ったらいいかも ***アイテムを召喚する joinjoin.scriptにある spawn("mil_stalker_respawn_2") のmil_stalker_respawn_2を explosive_barrel としてやれば赤いドラムをいくらでも召喚出来る。 調子に乗って大量にばら撒いて大爆発させると落とした武器(大体お尋ね者になる奴はレア武器持ちだろう)が壊れて耐久値が0になったり 衝撃でMAPの外へすっ飛んでいったりするので程々にしておこう。何しろ何回でも召喚し直せるのだから。 ちなみに同じようにして好きな武器や防具、弾薬も召喚させる事も出来るが、さすがにチート過ぎるのでその辺は自分で考えて使おう。 ***既に配置されているNPCをTrader化する 基本的には、既に[logic]が設定されているはずなので、そのlogicにtrade = を設定すればいいはずです。 どこに設定されているかはバラバラですが、例えば gamedata\config\misc の中のgulag_〇〇.ltxの中で設定されていたり、all.spawnの中で設定されていたりします。 ***無口なあの人と話してみたい BarのYou Can't Go there.て言い続けてた人。彼と話せるようにしてみましょう。~ まずは彼(Garikっていう名前らしいです)の行動ロジックを探さなければなりません。とりあえず適当なテキストエディタでgrep検索をかけてみましょう。(どうやるかはググッてください。知ってる前提で進めます)。まずはgamedata\config\以下を検索すればいいと思います。gamedata\以下を全部検索してるとテクスチャとか3Dモデルとか全部一々検索されて時間がかかりますから。~ さて、検索してみると、多分バニラのアンパックだとgamedata\config\text\eng\stable_bio_name.xml等々、各国語版のファイルが引っかかってくると思います。SFPS系列のMODでも同じです。そこでこのファイルを開いてみるとこう書いてあります。~ <string id="bar_bar_guard_name"> <text>Garik</text> </string> <string id="bar_bar_guard2_bio"> <text>Garik's twin brother. Bouncer at the bar. As close-mouthed as his brother.</text> </string> 日本語化してたら日本語で書いてあります。さて、ここで多分Garikさんはゲーム内でbar_bar_guardと呼ばれてるっぽいことがわかりますね。~ それじゃこんどはbar_bar_guardでgrep検索してみましょう。gamedata\config\ 以下を検索するとgamedata\config\gameplay\character_desc_bar.xmlしか引っかかりませんね。ここにはロジックは書いてなさそうです。~ ではall.spawnの中をgrep検索してみましょう。all.spawnのltx化はすでにやりましたね?まだできてない人は「Xrspawner不便。助けて!」の項目に戻りましょう。~ さて、all.spawnをltx化したフォルダでgrep検索をかけると、alife_l05_bar.ltxとall.spawnとway_l05_bar.ltxが引っかかりました。ここでalife_l05_bar.ltxを開いて、bar_bar_guardで検索すると1710行目に行き着きます。このちょっと下の方に行動ロジックが書いてあります。~ [logic] active = walker@guard_door [walker@guard_door] path_walk = bar_bar_guard_door_walk path_look = bar_bar_guard_door_look def_state_standing = ward def_state_moving1 = walk def_state_moving2 = walk def_state_moving3 = walk on_info = {+bar_barman_need_room} walker@guard_nodoor ; soundgroup = bar_visitors1 danger = danger_ignore on_actor_in_zone = bar_bar_room_area | walker@guard_nodoor meet = meet@1 [meet@1] ; meet_state = 2 | ward@{+bar_barman_need_room} bar_guard_enter,bar_guard_stop meet_state = 2 | ward@{-bar_barman_need_room} bar_guard_stop ; meet_state_wpn = 2 | ward@{+bar_barman_need_room} bar_guard_enter,bar_guard_stop meet_state_wpn = 2 | ward@{-bar_barman_need_room} bar_guard_stop victim = nil victim_wpn = nil use = false use_wpn = false abuse = false http://sdk.stalker-game.com/en/index.php?title=Logic によるとFキーで話しかけた時の挙動はmeetロジックで規定してるっぽいので(テキトーです)、このサイトの記述と他のキャラのmeetロジックを参考に下三行を次のように書き換えてみてください。~ use = true use_wpn = false abuse = false %%meet_dialogは喋りかけた時にどんなセリフをいうかですが、BarにいるNPCのセリフはgamedata\config\text\eng\stable_dialogs_bar.xmlに記述されているようなので、ここからBarkeepの「What do you want, Marked One?(何が望みだ、Marked One?)」というそれっぽいセリフを持って来ました。~%% ICPで試したらエラー吐いたので取り消しです。話しかけるようにするためにはuse = true にするだけで十分みたいです。~ さて、書き換えたところでファイルを上書きし、ltx2spawn.batでall.spawn.newというファイルが出来ます。これを「名前を変更する」でall.spawnというファイル名に書き換えてgamedata\spawnの中のall.spawnと差し替えましょう(両方共きちんとバックアップをとりましょう)。~ all.spawnはnew gameの時にしか読み込まれないので、これまでのセーブデータでは変更は楽しめません。new gameから始めて、Barに行くとgarik君としゃべれるようになっているはずです。(何回もテストしたいのに面倒くさいって人はactor.ltx書き換えて超絶ジャンプ使ってnimbleとかfoxとかmoleとかガン無視でbarまでいっちゃうと楽です。)~ garic君は結構ロジックを探すのに手間取りましたが、voronin将軍なんかはalife_l05_bar.ltxをvoroninで検索するとすぐに見つかりますし、トレーダーはtraderで検索すると引っかかることがあります。色々な探し方を駆使してください。~ **Spawn講座(メモ?) 大した物じゃないが、迷える子羊のために。 配置関係 ・壊れる金属の箱は立った状態で2番目の座標を-2か-3くらいするとちょうどいい。 ・スタッシュの箱は2番目の座標を-1.7くらいするとちょうどいい。 ・あんまり箱で大量に出現させると出現がキャンセルされる恐れあり。 ・箱の最大出現数(物)は30程度?ダイナマイトでやったらクラッシュした。敵は最大出現数に引っかからない…… ・all.spawnの正しいサイズは4MB程度。記述が間違っているとエンコードした際におかしなサイズになる。 何かあれば再び書き込んでいく。