Fallout好き:主にFallout New Vegas

Fallout好き:主にFallout new Vegas

2013年9月14日土曜日

MODの基盤:ボルダーシティの石碑。NVWarMemorial

MODを作る関係でボルダーシティの石碑(ID=NVWarMemorial)を調べた。

この石碑の文章については以前書いた。http://yomota.blogspot.jp/2013/04/blog-post_25.html

MODでこの石碑に細工をしようと思ったので、今回はこの石碑の機能、というかこの石碑に関わるものについて調べた。

-------------------------------------------------------------------------------
と言っても、GECKで見たら正確に言えばこの石碑自体にはなんの機能も無い。なんのクエストも関わっていない。ここで?と思う人がいるかも知れない。この石碑を撃つと石碑前のコワルスキー(NCR兵)が怒ってこっちに話しかけてくるからだ。でもそれは石碑自体に設定されているのではない。

画像の石碑を見ると、オレンジ色の枠がある。これはActivatorというオブジェクトで、ここで使われているActivatorはゲーム中は見えない。GECKの中でだけ扱いやすいように見えるようになっているようだ。で、これがなんのためにあるかというと、さっきの「石碑を攻撃するとコワルスキーが怒る」ために使われている。このActivatorは文章の書いてある側(コワルスキーが見ている面)のIDは「MemorialTriggerA」、裏側は「MemorialTriggerB」、コワルスキーから見て左側面はID無しとなっている。
それぞれを見ると、
TriggerAはTriggerBとリンクしている。
リンクすることでどうなるかというと、
連動して動作したり、スクリプトからリンク先を操作出来たりする。
TriggerBはTriggerAとリンクしている

左側面のActivatorはどこともリンクしていない。

3つのActivatorの元となっているActivator(正確にはこっちだけをActivatorと言うのだろうか)。
スクリプトが設定されている。

これがスクリプト。
-------------------------------------------------------------------------------
scn BoulderCityMemorialTriggerScript

; If the player hits the memorial, Private Kowalski angrily confronts the player. If, after the conversation
; is over, the player hits the memorial again, Kowalski goes berserk and turns hostile.
  もしプレイヤーがメモリアル(石碑)を攻撃した場合、コワルスキーは怒りつつ立ち向かいます。
  もし会話終了後、プレイヤーが石碑を再度攻撃したら、コワルスキーはバーサーク(凶暴化)し敵対する。

ref LinkedRef

begin OnHitWith ←攻撃された場合のみ以下のスクリプトを実行

if VFreeformBoulderCity.Desecrator ←VFreeformBoulderCityというクエストのDesecrator変数が1ならば
PrivateKowalskiRef.Say BCPrivateKowalskiAttack ←コワルスキーにBCPrivateKowalskiAttackという音声をしゃべらせる。
PrivateKowalskiRef.StartCombat player ←コワルスキーにプレイヤーと戦闘させる
else ←Desecratorが1以外ならば
set LinkedRef to GetLinkedRef ←このスクリプトを実行しているオブジェクトとリンクしているオブジェクト(上にあるLinkedRef画像参照)をLinkedRef変数に入れる
LinkedRef.Disable ←このスクリプトを実行しているオブジェクトとリンクしているオブジェクトをDisable(見えなく)する。
Disable ←このスクリプトを実行しているオブジェクトをDisableする。
set VFreeformBoulderCity.Desecrator to 1 ←VFreeformBoulderCityというクエストのDesecrator変数に1をセット
PrivateKowalskiRef.AddScriptPackage BCPrivateKowalskiDialoguePackage ←コワルスキーにBCPrivateKowalskiDialoguePackageというAIパッケージを追加する。このAIパッケージはプレイヤーと強制的に会話をする。
endif

end


-------------------------------------------------------------------------------
まー、グチャグチャ書いて見づらいが、要するにこれが石碑を攻撃した時にコワルスキーが怒るスクリプト。


■スクリプト以外も含め、もう少し詳細に書いてみる。

(1) 石碑の3面に配置してあるActivatorのどれかに1回目の攻撃が当たる

1回目はelse行以降が実行される。
else以降は、リンク先のオブジェクトをdisableし、スクリプトを実行しているオブジェクト自体もdisableし、コワルスキーにAIパッケージを追加。
追加されるのはこのAIパッケージ。
武器を構えて走って(この画面)
プレイヤーに話しかける(前の画面)。
実際はこんな感じ
そして選択肢
一番下(Yeah,whatever)を選ぶと会話終了
(英語と日本語混じってるのは気にせずに)。
一番下を選んだ場合、Result Script (begin)に書いてあるように
MemorialTriggerA.Enable
MemorialTriggerB.Enable
AddReputation RepNVNCR 0 2
が実行される。
ここでDisableされていたTriggerAとBをEnableにしている。
AddReputationで Reputation(評判)を操作している。
http://geck.bethsoft.com/index.php?title=AddReputation
RevNVNCRはNCRの評判。
その次のは 0=悪評 1=名声。0なので悪名。
その次のは 変化する大きさ。これは下記の通り。
 1 = FREPUTATIONBUMPVERYMINOR、デフォルト設定= 1
 2 = FREPUTATIONBUMPMINOR、デフォルト設定= 2
 3 = FREPUTATIONBUMPAVERAGE、デフォルト設定= 4
 4 = FREPUTATIONBUMPMAJOR、デフォルト設定= 7
 5 = FREPUTATIONBUMPVERYMAJOR、デフォルト設定= 12
値が2なので2番のFREPUTATIONBUMPMINOR。よって値は2。
これらをまとめると、AddReputation RepNVNCR 0 2 でNCRの悪評が2上がる(先ほどのゲーム画面でも表示されている)。

調べてないが、この会話の後にAIパッケージは除去される(どこかで取り除くよう設定されていなくても自動的に除去される)。

(2) 石碑の3面に配置してあるActivatorのどれかに2回目の攻撃が当たる

2回目はelse行より上が実行される

PrivateKowalskiRef.Say BCPrivateKowalskiAttack ←コワルスキーにBCPrivateKowalskiAttackという音声をしゃべらせる。
PrivateKowalskiRef.StartCombat player ←コワルスキーにプレイヤーと戦闘させる

BCPrivateKowalskiAttack は調べてないけど、「このやろう!死ね!」とかそんな意味だと思う。
そしてプレイヤーとの戦闘が開始される。

おそらく、これがこの仕組の基本的な流れで、本来の想定した流れだと思う。

-------------------------------------------------------------------------------
■これで大体石碑を攻撃した時の流れはわかったんだけど、ちょっと補完。

最初にActivatorを撃たれた時にdisableしてコワルスキーとの会話後Enableしているのはなぜか?
コワルスキーが話しかける前に2回以上攻撃したり連射武器を使った場合、話しかけるのをやめてプレイヤーを攻撃してしまうのを防ぐためだと思われる(これに気づいたのはたった今なんだけど)。

-------------------------------------------------------------------------------
■次にこの仕組の問題点。

GECKで気づいたこと、それを確認するためゲームプレイして気づいたことを以下に書く。

(1) 石碑の上部と右側面、左側面上部を攻撃してもコワルスキーは怒らない。
   最初にActivator(オレンジ色の枠)の配置を見て思った人もいるかもしれないが、
   上部と右側面にはActivatorが無いため、コワルスキが怒ることは無い。

(2) 左側面のActivatorを攻撃後、コワルスキーが話しかけてくる前に
   TriggerAかBを攻撃した場合、コワルスキーと戦闘になってしまう。
   これは左側面を攻撃した場合、TriggerAとTriggerBはdisableにならないので攻撃が当たり、
   2回目の攻撃をしたのと同じになってしまうため。

(3) TriggerAかBを攻撃した後コワルスキーのスピーチチャレンジ(Speech30)を成功させ会話を終了すると、左側面以外を攻撃してもコワルスキーが怒らない。
   これはスピーチチャレンジ成功後、TriggreAとBがEnableされていないため。

一応動画も撮ってみた。一時停止しながらでないと読めないと思う。

-------------------------------------------------------------------------------
■感想

なぜActivatorは右側面に無いんだろう?横とか上には文字が無いから、石碑を攻撃されてもウェイストランド風に気にしないとしても、それならなぜ左側面のActivatorを残しておくんだろう?
TriggreAかBを撃った時、なぜTriggerAとBしかdisableしないんだろう?側面のActivatorにもReferenceIDを付けてスクリプトからdisable、会話の終了時にenableすれば上記のような問題も起こらないのに。

仕組みの作り方としても疑問がある。
石碑 ( NVWarMemorial )はStatic Objectなのでスクリプトが付けられない。
そのためActivatorを周りに配置してコワルスキーが反応する仕組みを作っているんだろう。
だけど、そもそもこの石碑を一つのActivatorとして作った方が複数のActivatorをコントロールする必要も無く、ゲームの負荷もわずかだろうけど軽くなるだろう。

なぜこんな中途半端な作りになっているんだろう?
まったく不思議。
時間が無くて作り込めなかったとか、イレギュラーな流れのテストが出来なかったとかありそうだけど。

■おまけ

関係無いけど、GECKでコワルスキー(NPC)のAnimationタブを見ると、なぜかガクガクプルプルしてる。

0 件のコメント:

コメントを投稿