改造実践編2

「改造実践編2」の編集履歴(バックアップ)一覧に戻る

改造実践編2 - (2015/03/20 (金) 00:10:27) のソース

*改造実践編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程度。記述が間違っているとエンコードした際におかしなサイズになる。
 何かあれば再び書き込んでいく。
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。