Fallout好き:主にFallout New Vegas

Fallout好き:主にFallout new Vegas

2013年8月14日水曜日

MODの基盤:NPCのスクリプト実行回数

ふと、NPCのスクリプトってどれくらいの頻度で実行されているのかと知りたくなった。

ということで、雑貨屋チェットの10秒間のスクリプト実行回数を10秒毎に表示するMODを作って実行してみた。

早速チェットの雑貨屋に来た。
表示を見逃さないようにゲームが一時停止するように
メッセージボックスを表示させたんだけど、
こんな風に妙に少ない時がある。

なぜかというと

どうやらこのメッセージが表示されている間、つまりゲームが止まっている間は
チェットのスクリプトは動かないらしい。
(というか、後で気付いたけどそういう風にスクリプト書いてた。。)

でもその間もこのメッセージを表示するクエストは、
設定通り10秒毎に動いているらしい。

例えば、このメッセージボックスが表示されたあと、
これを閉じたタイミングが例えば9秒目だったら
1秒後にまたメッセージボックスが表示される。

ということを考えつつ、
10秒毎に表示するんなら見逃すこともないだろうと気付いた。




ということでMODをちょっと変更。
これがメッセージを表示してる。
ID=YMTP2ITMesg このIDはスクリプトから呼び出す時に使う。

変更点は Message Box のチェックをはずし、
その右側の Display Time に 3 秒を入力。

ちなみに、YMTP2I というのはたまたまそのMODをいじっていたから。

ついでに他の部分も書いておく。
これはカウンターの変数。YMTP2ITimeという名前で初期値が0。

ちなみにグローバル変数なので、どのスクリプトからでも参照・変更出来る。
スクリプト内で定義している変数だと、他のスクリプトから参照出来ても変更は出来ない。
これがチェットについてるスクリプト。

begin gamemode
  set YMTP2ITime to YMTP2ITime + 1
end

この部分がカウント部分。
単純にさっきグローバル変数として設定した YMTP2ITime の値を+1する。

begin gamemode ~ end の間に書かれたスクリプトは、ゲームモード(キャラが動いてるモード。ピップボーイ開いていない、メッセージボックスが表示されていない時)の時だけ実行される。
だから、さっきメッセージボックスが表示された時は実行されなかったわけで。

ちなみに、そういう時も実行するなら、begin MenuMode とする(大文字小文字は関係ない)。
下記GECKのWEBサイトに説明と設定値一覧がある。


(begin ondeath ~ en d の間に書き足してある部分があるが、今回は関係ない)

これはクエスト。
ゲーム中のクエストもこれで作られている。

それ以外にもスクリプトの定期的な実行にも使える。
今回は「10秒毎にYMTP2ITime の数値を表示する」のに使う。
Start Game Enabled でゲームがスタートした時(ロードが終わった時)から実行される。
ここにチェックをつけないと、例えばスクリプトから実行されるまで動作しない。

Script にこの後で説明するスクリプト名を設定する。

Script Processing Delay(スクリプト実行間隔?かな)。
Default にチェックを入れると5秒毎にスクリプトを実行。
今回は10秒でやりたいので、右側に10(秒)と入力。

Priority(優先度)は50。これは0?~100まで指定出来るので、間をとって50。
優先度というのは、多分負荷が大きい時にどの程度他のクエストより優先して実行するかだと思う(適当)。
全部のクエストが10秒に一回とか5秒に一回くらいなら負荷は問題にならないだろうが、
さっきの Script Processing Delay の設定で1万分の1秒毎に実行させることも出来るようなので、
そうなると例え小さく単純なスクリプトしかなくても、かなりな負荷になるんだろう。
これがクエストから呼ばれるスクリプト。
Script Type を Quest にしている。こうしないと、クエストからこのスクリプトを選べない
(選択肢として表示されない)。

ここに書いてあるのは全部自分が書いたもので既存のものはない。

scn YMTP2ITimeQuesetScript  ←scn = ScriptName の略だと思う。その後がスクリプト名。名前は自分ルールでクエスト名+「Script」にしている。

begin gamemode

  showmessage YMTP2ITMesg YMTP2ITime
  ↑さっき作ったメッセージ「YMTP2ITMesg 」を showmessage コマンドで表示。
    最後の YMTP2ITime の値は、メッセージに書いた 「%.0f」 部分に置き換わって表示される。
    ゲーム中の「%0.f / 10 sec.」と表示されている部分の事。
  set YMTP2ITime to 0  ← YMTP2ITime に 0 をセット(カウンターをリセット)する。

end
こうやって見ると、グローバル変数・クエスト・スクリプト・メッセージを設定しているが、
それぞれとても単純なのがわかると思う。

一応ダウンロード先(念のため書いておくけれどもこんなものDLしなくて良い)。
https://sites.google.com/site/yomotaxxx/file/YMT_P2ITest.esp

で、左上に3秒間表示されるようにした。

うむ、これならゲーム時間は止まらない。

止まることでチェットのスクリプト回数が減る事もない

595回。

593回。

10秒の間にちょっとピップボーイ開いてみた。

回数が187回に減った。
ピップボーイを開いてる最中もNPCのスクリプトは停止するようだ。


677回。
多いな。

ということでその後もカウンターが表示される度にスクリーンショットを撮った。





平均して580くらいと見ればいいかな。
まあ600回でいいか。
約200回。減った

0回。
さっきのは減ったというか、外に出てからの分スクリプトが実行されなかったからか。


0回が続く

400回。

飽きたので

チェットを殴った


怒って銃撃ってきたけど、特にスクリプト実行回数は変わらないようだ。

外に逃げた。
300回くらいに減った。

ついでにビッグホーナーを殴った。
これで近くの住人も襲ってくる

400回

300回






多分3人に外で襲われて大体300回位だろうか。
(途中でイージーピートの家にも入ったので襲ってきてる)


ま、何も無くチェット一人だと600回弱。
外でチェットともう一人が襲ってきたら300回位かな。

プロスペクターサルーンに入った



0回。
なるほど、チェットが居ないからチェットのスクリプトは動かないんだな。

1?

?190?なんか急に増えた。

470回。
どうやらチェットが追いかけて入ってきたっぽい。

やっぱり居た。。

なぜかこっちにこない。
600回

どうせ鉛球でしょ・・・

600回


600回。
雑貨屋に居る時と同じ位か。




やっぱりピップボーイを開くと回数減るなー。



HIDDENになった

チェットが外に出ていった。
回数も0になった。

このメッセージうっとうしいなあ。


また1回だ。またチェットが戻ってきたのか?




チェットや他のキャラは誰もここには居なかった。
でも0回になったり1回になったりする。
0回はわかるんだけど1回ってなんだろう?
外とはつながってるから、そっちにチェットが居たら一応スクリプト1回だけ実行するんだろうか?

随分単純なMODなのでバグとも思えないし。

チェットさん居るかなー?と外に出たが居ない。
イージーピートと住人一人が帰っていく。
もう敵対していない。

ここでも1回だなー。

雑貨屋に入ったらチェットさんまだ怒ってた

ここで200回なのはカウント途中だからかも

ふむ、大体600回。

600回。変わらず。

ということで、ゲームモード中は、普段600回/10秒位。1秒に60回。
戦闘中は一人なら変わらないけど、複数で襲ってきたら300回(1秒に30回)まで落ちる。
多分状況次第でもっと落ちるんだろうなー。
あとは、チェットがいなくても10秒に1回(もしかしたら20秒とか30秒とかに1回)
スクリプトが実行されているのが謎。

まーなんとなく実績値わかったから今はこれでいいや。


負荷の状態により、ある程度はプログラムが実行回数を自動的に調整しているんだろう。
ではどれだけの時どういう方法でどれだけ負荷を減らしているか?
それは適性か?
なんてことは一切わからないので、
今回の実行回数が負荷の面で多いか少ないかはさっぱりわからない。

だけど、MODを作るという面から見ると
結構な頻度で実行してるなーという感じ。
これくらいの頻度で動作するなら大抵の事には不便しなさそう。
1秒に30回なら昔の格闘ゲームなら充分なんじゃなかろか。
アナログテレビも1秒に20回表示だっけ。

例えば1秒に1回実行すれば充分だよ、というMODなら
クエストを使って1秒に1回実行させ方がいいかもしれない
(クエストから実行出来るものならば、だが)。

こういう負荷を調べられる方法とか、外部ツールとかあるんだろうか?
まーあっても、重くて落ちてるようなMODでも作らない限り使わなさそうだけど。
そんな大層なもの作らないだろうし。
そういえばFPSを表示するツールがあるようだから
それを使えば大雑把にはわかるか。

0 件のコメント:

コメントを投稿