Fallout好き:主にFallout New Vegas

Fallout好き:主にFallout new Vegas

2013年6月30日日曜日

MODの基盤:GetCauseOfDeath

GECKのScriptコマンドに死因を取得する GetCauseOfDeath がある。
これを使って死因を取得するMODを作るため、作りつつ調べつつわかったことをメモする。
※まだ充分わかってないので思い込みもあると思う
→作った。
YMT_CauseofDeathhttp://yomota.blogspot.jp/2013/07/modmodymtcauseofdeath.html

追記:
下記Perkのスクリプトが動作した。つまり set コマンドは動作した。showmessage の引数が動作していなかった可能性がある。
------------------------------------
ref TargetRef

set TargetRef to GetOwnerLastTarget
TargetRef.cios YMTcodActorEffect
------------------------------------

作りたいMOD

GetCaauseOfDeathで得た値に基づき、死因をメッセージボックスに表示する。
その際、他にも死に関係する情報を表示する。
(例えばGetHitLocationは攻撃された部位(頭、胴など)がわかるらしい。)

GECKのWEBサイトでの説明

http://geck.bethsoft.com/index.php/GetCauseofDeath

GetCauseOfDeathの返り値

このコマンドを実行した時、-1~7の値が返ってくる。各値の意味は下記の通り。

NONE = -1
EXPLOSION = 0
GUN or Throwing?=1 ←WEBサイトに載っていない
GUN = 2
BLUNT_WEAPON = 3
HAND_TO_HAND = 4
OBJECT_IMPACT = 5
POISON = 6
RADIATION = 7

Blunt=鈍い。なのでBlunt Weaponで鈍器って意味かも。
hand-to-hand=接近した。hand-to-hand fightingで白兵戦の意味だそうだ。
object_impactは多分オブジェクトがぶつかってダメージを受けた場合かな・・

その他、GetCauseOfDeathの値について調べてわかったこと(武器は極一部しか使っていない)

・kill or killall コマンドで殺した場合、プラズマピストルで殺した場合、-1(NONE)になる。

・爆発物(試したのはダイナマイト)で殺す、ポケグレ(ポケットに爆発物スリ渡し)した場合、爆発したオブジェクトに巻き込まれた場合、0(Explosion)になる。

・銃で殺した場合、1(説明無し)になる。これはWEBサイトに書いていない(1だけないのが不思議なので書き漏れかもしれない)。でも 2(GUN)にならないのが不思議(2が出た事がない)。

・落下死(EasyPeteを高所に移動させ落下させた)は-1(NONE)

・殴るor近接武器は3(Blunt_Weapon)になる。

・殺した後に、部位破壊(四肢・頭切断)すると死因が上書きされるようだ。例えば銃で殺すと1になるが、その後ダイナマイトで手足や頭のどれかを吹っ飛ばすと0(Explosion)になる。

GetCauseOfDeathの各実装方法

GetCaauseOfDeathで得たに基づき、死因はShowmessageでメッセージボックスに表示したい。

GetCauseOfDeathを実装するには3通り考えられた。


1.Questのスクリプトとして実行
  常駐のQuestから0.5秒以下のサイクルでスクリプトを走らせ、クロスヘアーに死体を合わせ、専用キー押下などで、GetCauseOfDeathを実行。デメリットは常駐して結構な頻度で動作するスクリプトが増えてしまう。これは負荷が大きくなりすぎると思うので試していない。


2.専用Perkのスクリプトとして実装
  Cammibal Perkの真似をして、死体をしゃがんでアクティベートすると、メニューに「GetCauseOfDeath」を追加(画面表示)し、それを選ぶとPerkで設定したスクリプトが動作する。

これはスクリプトが「Edit」ボタンを押して記述するタイプ(Miscellaneous→Script ではない)。このタイプのスクリプトはコマンドが大きく制限されるようで、わかっているところだとset(代入)コマンドが効かない。set(代入)コマンドで変数に必ず0がセットされるようだ(そもそも設定されていないのか、セットされても保持されないのか不明)。

この問題により、GetCauseOfDeathの結果を変数に保持出来ない。

(変数の宣言は出来る(ex.short aaa)し、変数を判断や引数に使える。しかしsetコマンドが使えないとほとんど使い所が無いかもしれない)

例えば下記のようにすれば

if TargetRef.GetCauseOfDeath == 0
  showmessage GetCauseOfDeathMessageExplosion
elseif TargetRef.GetCauseOfDeath == 1
  showmessage GetCauseOfDeathMessageGun
endif

メッセージボックスに表示出来る(取得した値をその場で判定しているため)。

しかし、この方法だと GetCauseOfDeath 以外にも値を同時表示出来ない。
複数の値を同時表示する場合、複数の変数を用意、それぞれの変数に値をセット(setコマンド)した後で、引数をつけて Showmessage を実行することになるから。


3.銃の弾のスクリプトとして実行
銃を撃ち、弾があたったNPC/クリーチャーに対してスクリプトが実行される。
これはやり方がわからなかったが、参考になるMODがあるので出来た。

参考にしたNexusの「Nude Ray 5000」。銃でNPCを撃つと、服を脱がせられるというもの。

簡単に説明すると、銃の弾がNPCに当たる→スクリプトがCIOS(CastImmediateOnSelf)
)というコマンドで、2つのActorEffectを呼び出す→一つのActorEffectが撃たれたことでNPCが敵対しないようにし、もう一つのActorEffectは外見が下着状態のアーマーを着せる。

(ActorEffectの説明。Type=Spel。Actorに様々な効果を与える。想像だけどOblivionでは魔法として使われていたかも)

最初、弾のスクリプト内からCIOSでわざわざActorEffectを呼び出さないでもいいんじゃないか?と、スクリプト内でGetCauseOfDeath を実行してみたが、2.の時と同様に set コマンドが働いていないようで思うように動作しなかった。そのためNude Ray 5000と同様の構造にしたら動作した。

各オブジェクトの数が多くややこしい。一応その関係を並べてみた。

銃型武器(Weapon)→その弾としてAmmoオブジェクト→その特殊効果としてActorEffect→その具体的な効果としてBaseEffect(その中のスクリプトでGetCauseOfDeathを実行し、返り値を引数に Showmessage呼び出し)→Showmessageオブジェクトで死因表示

この方法で気付いた注意点が一つある。
Weaponのダメージ(通常ダメージとクリティカルダメージ)を最低でも1にしないと弾のスクリプトが動作しない。死因を調べるだけなので、ダメージを入れる必要が無い、そのためダメージを0に設定したところ、NPCに当てた時だけ着弾の表示もされなくなった。弾が当たることがなくなるのかもしれない。
自分はこのMODをカメラに組み込もうとしているので、ダメージは0にしたいのだがNude Ray 5000でもダメージが1になっているので、これは仕方ないのかもしれない。ダメージがあることで、「GetCauseOfDeathの返り値」で書いたように、死体の手足が破損し、死因が変化してしまう可能性もあるのだけど、仕方ない。

0 件のコメント:

コメントを投稿