今更なオブリビオンブログ
おもにMOD関連のメモを書いていくと思います、MODをいじったり、作ってるのが楽しいです。
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スクリプトのスキップ
以前作ったMODで何故か実行されるべきコマンドが実行されていない、という現象がありましたが、(ZoomModDropTorchMOD、解決済み)調べてみた所、どうやら「オブジェクトスクリプト」や「マジックエフェクトスクリプト」は、実行頻度が高いかわりにスクリプトの実行がスキップされることがあるようです。

今までの自分のMODの動きから見ると、全部のスクリプトがスキップされるのではなく、最後の命令文のみがスキップされています。
なので、最後に実行する命令文にはスキップされても問題の無いものを持ってくるといいのかもしれません。

もしかすると、もっと重たい環境で実験すれば変わるかもしれませんが、それだとたぶんもうまともにゲームが出来ない環境になると思うので考えなくてもいいでしょう。
…いや、でもよく考えたら1フレームだけスキップされてもゲーム中にはよくわからないし、全部の処理がスキップされているかも…?

一方、クエストスクリプトは他と比べて実行頻度が低いものの必ず反応するようになっているそうです。
実際自分で作っていた時にクエストスクリプトはオブジェクトスクリプト並みの実行頻度には出来ないのは確認しています。


ヴァニラのクエストで、ダイアログのスクリプトでも、スキップされることがあるのを確認しました。
シーフギルドのクエストで、あるアイテムのクエストアイテムフラグがオフになるべき所を、クエストが終わってもそのままになっていることがありました。

そういえば、シギルストーンを取得しても、オブリビオン内に取り残されるという原因不明のバグがありますが、これって、このスクリプトのスキップが原因なんじゃないでしょうか?

テーマ:Oblivion - ジャンル:ゲーム

リスポーンに関して
どうも、リスポーンに関する挙動で、勘違いしていた所やよくわかっていなかった所があったので、もう一度、自分で調べてまとめました。


一度訪れたことのあるセルから離れてデフォルトで3日以上経つと、再び訪れた時にそのセルで「リスポーン」と呼ばれるものが起こり、その際にそのセルにあるモノが以下の挙動をします。
これは、宝箱や罠を復活させたり、色んな情報を一度リセットすることでセーブデータの無駄な膨張を防ぐ目的で行われているものだと自分では理解しています。



・生きているNPC…中身を個別で設定、リスポーンをチェックすると中身がリセットされるが、QuestItem属性のアイテムを持っていると中身がリセットされない。ただし、リスポーン時にLeveldItemからアイテムの抽選は受け取る。

・死んでいるNPC…消滅する、QuestItem属性だと消滅しない。リスポーンをチェックすると中身がリセットされ復活するが、QuestItem属性のアイテムを持っていると中身がリセットされず、復活もしない、消滅もしない。ただし、リスポーン時にLeveldItemからアイテムの抽選は受け取る。

・元から落ちているアイテム…移動させていたら元の場所に戻る、取得した場合は復活しない。

・PCやNPCが落としたアイテム…そのまま。

・コンテナ…中身を個別で設定、リスポーンをチェックすると中身がリセットされるが、QuestItem属性のアイテムが入っていると中身がリセットされない。ただし、リスポーン時にLeveldItemからアイテムの抽選は受け取る。

・植物…復活する。


・罠…元に戻る。ただし、元に戻るのは、そうなるようにスクリプトでリセットしているからです。(開始条件に「Begin OnReset」を使っている。これは指定オブジェクトのあるセルがリスポーンされた時一度だけ走る。)
 罠は、Activatorに付けられたスクリプトを作動させ、アニメーションの再生と同時にダメージを発生させることで実現しています。その際に変数の操作をしています。変数をリセットしなければ罠のリセットはできないので、スクリプトでリセットする必要があります。

Disableしていると復活はしませんが、リスポーン自体はしているようで中身があるものは中身がリセットされています。

NPCをResurrectで生き返らせるとリスポーンして復活します。リスポーンさせるコマンドは存在していませんが、この仕様を利用すればNPCを強制的にリスポーンさせることが出来そうです。
 (QuestItem属性のアイテムを持っている場合は上記と同様)

NPCの持っているSpellもリスポーンでリセットされますが、Abilityだけは別で、これだけは忘れないようです。
 (毒りんごを食べたNPCは、スリップダメージのAbilityが付与されているため、コンソールで生き返らせてもすぐ死んでしまう。)

リスポーン時にLeveledItemを持っているモノは、LeveldItemからアイテムの抽選を受け取り、LeveldCreatureからは、NPCの再配置がなされます。
 この際、LeveldCreatureから作り出されたNPCはゲーム内で新規に作り出された扱いらしく、NPCはFormIDの先頭二文字が「FF」になっています。(通常ここはMOD番号が入る所。システムはこの番号を見ることで、どのMOD由来のモノなのかが分かる仕組み。エンチャント台で新しく作り出したアイテムや魔法も「FF」になる。)
 LeveldCreatureから抽選で選ばれたNPCが以前のNPCとは違う場合は、以前のNPCは消滅してしまいます。(LeveldCreatureのNPCは生きていても、死んでいるNPCと同じ扱いで基本的に消滅してしまう?)
 また、そのLeveldCreatureのNPCがQuestItem属性のアイテムを持っていて、同じNPCが抽選で選ばれた場合は、消滅せずに、新しく作り出されもしないようです。(リスポーンのたびにNPCが増えてしまうため?)

セル単位でリスポーンさせる「ResetInterior」というコマンドはあるようです。コマンド実行後、次にそのセルがロードされた時にリスポーンが起こります。
 ・書式
 ResetInterior [CellID]


基本的に、中身があるものは、その中身をリスポーンするか個別に設定できて、
オブジェクトとして配置してあるものは元の位置に戻るという動作をする模様。(場所が戻るだけで復活していない、この辺勘違いしていた)
(検証はしていませんが、岩や家具などの各種WorldObjectsも位置情報がリセットされている?)

NPCは生きている時は歩き回りますが、リスポーンするのはあくまでもそのセルでリスポーンが起こった時になります。
NPCが死んでいる時は基本的に消滅する扱いですが、QuestItem属性だと消滅しない。


セルの所有権による違いは確認できませんでした。自宅などがリスポーンしないというのは勘違いのようでした。(自宅に限らずPCが落としたアイテムはそのまま)
また、ニルンルートが植物なのに復活しないのは、取得した時にスクリプトでDisableしていたからでした。


Doorはリスポーンしても動かないようです。(場所移動できるDoorやニルンルートは必ずPersistentなので、それが原因かと思っていたのですが、どうやらDoorの方が特殊で、Persistentなのはリスポーンとは関係がないみたいです。)
ただ、動かないのはヴァニラのDoorだけのようで、MODで追加したDoorはCSで場所を変えたらちゃんと動いてました。(esmとespの違い、つまりデータを変更するデータかデータそのものの変更の違いでこうなる?)

テーマ:Oblivion - ジャンル:ゲーム

メッセージを表示させない方法
…前回からの続きです。

AddSpellをすると、そのたびに魔法を追加された旨のメッセージが発生してしまうので、これはなんとも目障りなので、どうにかできないものかと思い、調べてみると、解決策が複数あるようでした。



■まず一つ目の方法は、「Message」の仕様をうまく活用することです。
画面左上に表示されるメッセージを同時に発生させると、システムは、現在表示されているメッセージと次に表示するメッセージの、一度に2つまでしか覚えることが出来ないため、連続で「Message」を表示させれば、3つ目以降は表示をさせないことが出来ます。


Message " "
Message " "
AddSpell Spell

この例だと、半角スペースのメッセージを2回表示させてからAddSpellをしているため、一見するとメッセージが無いように見えます。
元から何らかのメッセージを表示させるつもりなら、同じ文章のメッセージを2回続けるといいです。



■もう一つの方法は、OBSEで追加される専用の関数を使うことです。
以下の関数は、「NS」が付いていないものと同じ動作ですが、メッセージを発生させません。

・AddSpellNS
・RemoveSpellNS
・EquipItemNS
・UnequipItemNS

以下の関数は、「NS」が付いていないものと同じ動作ですが、メッセージおよび、本来発生する音を再生させません。

・AddItemNS
・RemoveItemNS
・EquipItemSilent
・UnequipItemSilent



■また、アイテムの場合だけですが、「activate」のコマンドを使えば、メッセージ無しでアイテムの追加が出来ます。


[アイテムのRefID].activate player



これらのいづれかの方法を使うことで、メッセージの問題は解決です。
…それにしても、最近はゲーム本体よりもCSを開いている時間のほうが長い気がする…

テーマ:Oblivion - ジャンル:ゲーム

変数に値を入れる時の計算の順番について
変数に数値を入れる時に下記のように足し算と掛け算が混じった計算式だった場合、入る数値はどうなるでしょうか?


set Count to 2 + 4 / 2


普通は掛け算や割り算を先に行ってから、足し算や引き算は後から行うようにと学校とかでは習ったと思います。
だから、本当は「Count」の中身は「4」になるはずですよね?

ですが、Oblivionのスクリプトでは、実際は前のほうから順番に計算をしていくようで、これだと「3」になります。
…感覚としては、計算してから入れるのではなく、変数の中に順番に符号つきの数値を一つずつ放り込んでいくという感じでしょうか。


もう一度試してみた所、どうも計算式で変数に数字を入れようとするとうまく動かないようです。
例のように、足し算が先で掛け算が後だと変数が変化していませんでした。
しかし、掛け算が先で足し算が後だと正常に働いていました。

…掛け算や割り算を置く場所によって結果が変わる?
どの道、足し算と掛け算が混じった計算式は使わない方がよさそうです。

テーマ:Oblivion - ジャンル:ゲーム

ダミーセルの存在意義について
ダミーセルの利用法についての覚書です。

ワールドスペースの中には、「○○Warld」という名前で街中用のセルがありますが、室内用のセルである、Interiorsの中にも、街の名前のダミーセルが存在しています。
実際に使用しているのは、ワールドスペースの中にあるほうなので、街のダミーセルを作る意味が無いように思われますが、実はこれ、利用法があります。

それは、「その街の中でだけ」という条件にしたい時に「GetInCell」で街のダミーセルを指定することです。

似たような関数で、「GetInWorldspace」がありますが、「GetInWorldspace」の場合は、指定した外部セルにいる場合のみになるので、
街の建物の中などに入っている場合は条件から漏れてしまいます。

一方、「GetInCell」を使った場合は、これは実は、指定した「CellDName」が含まれている場合、1を返すという動作をするものなので、
街の建物の中などに入っている場合も条件に合います。(建物の中のセルは、その街の名前が先頭にあるため)
そして、当然ワールドスペースの中の街の、「○○Warld」もこれに含まれます。(街が作られている部分のセル名は、「AnvilExterior01」のようにその街の名前が先頭にあるため)




…便利そうですが、その動作ゆえに気をつけなければいけないこともあります。
実は、ワールドスペースの「Tamriel」の中には、農村や宿屋、街の近くなどの一部の場所で、周辺の町や建物の名前が含まれたEditorIDになっているため、そこも含まれてしまいます。
なので、場合によっては「GetInWorldspace」を使って「Tamriel」を除いておく必要があるかもしれません。

また、宿屋や農家のような一つの室内セルだけを指定にしたい時には「GetDistance」をつかって、指定したい室内セルの動かないもの、XMarkerなどを広範囲で指定するという手もあります。

テーマ:PCゲーム - ジャンル:ゲーム



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。