0、はじめに&エフェクト名探し
エフェクトはBHAVによって開始、終了を制御されます。エフェクトはテキストファイルに登録されたエフェクト名から呼び出され、その起点は任意に設定したSlot位置となります。
多くのエフェクトはアニメーションが一巡すると終わりますが、BHAVで終了させない限り永遠にループするものもあります。
一つのSlotに複数のエフェクトを設定することも可能で、Slotの種類も問いませんがTarget Slotを使うのが一般的です。
原文チュートリアルでは、泥酔ノーム人形に「ZZZ」のエフェクトを追加していますが、この覚書では蒸気を自作オブジェクトに追加してみます。操作自体はまったく同じです。
まず最初に、必要なエフェクト名を探し出す作業から始めなくてはなりません。
プログラムフォルダ内にある「Effects.package」にエフェクトが格納されていますが、SimPEでも見ることができません。
そこで「Objects.package」を開き、Instance0x8FのSTR#ファイルを覗いて、そこに書かれているエフェクト名から必要なものをとってきます。ただしテキストファイルの数はかなり多いので、見つけ出すのは大変かも。
欲しいエフェクトを使用しているMaxisオブジェクトをクローンして、Instance0x8FのSTR#ファイルを覗くのが手っ取り早いかもしれません。
蒸気はいくつか種類があるようですが、出来たて料理などの蒸気で使われている「cooking_steam」を使うことにしました。
1、CRESの編集
Resource TreeからResource Node(CRES)を選択。
Resource Listのファイルを選択。
「Edit Brock」タブをクリック。
プルダウンリストから「cObjectGraphNode: trans=0,0,0; ......」を選択して「Add」ボタンを押します。
新しいエントリが加わります。
ここでは「0x4」のエントリが新たに加わりました。
「Content」タブに戻り、Brock Listから先ほど加えた新しいエントリを選択します。
下の「cObjectGraphNode」タブをクリック。
Filenameに好きなSlot名を入力します。ここの名前は後でテキストファイルにも入力するので、覚えておきます。
Slot名は「slot_fx_」の文字列からはじめるのが無難かと思います。
「cTransformNode」タブをクリック。
「Translation」にSlotの座標を入力。隣の「Rotation」などを入力すると、恐らくエフェクトの回転ができるかと思います。詳しくは「Slotの追加」を参照してください。
最後にParentに関連付けます。
まず「CRES hierarche」タブをクリックして、Block Listの構成を確認します。
Parentにするエントリーは「 [Joint#](#は数字) 」と書いてあり、他のSlotのエントリをChildとして持つものです。
他のSlotのエントリーが一つもない時は、名前が「Practical」から始まるエントリをParentにします。
どれをParentにするか決めたら、「Content」タブに戻りBlockListからParentにするエントリを選びます。
「cTransformNode」タブをクリック。
右の「ChildNodes」の枠で、「Add」を押す。
新しい行が加わったら、それを選択。
「Unkown 1」に0x0001、「Child Index」にはChildにするエントリのIndexナンバーを入れます。
このオブジェクトでは「0x0000004」になります。
この操作で不備があるとゲームがクラッシュするので、確実に行います。
できたらCommitします。
ちゃんと編集できているかどうかCRES Hierarcheを確かめたい所ですが、ここはセーブをするまで更新されません。
ここでいったんセーブして確かめてもいいですし、作業を全て終えた後で確認しても構いません。
※Slotの座標の決め方
CRESで入力したSlotの座標は、実はParentとの相対位置となります。
多くの場合Parentの位置は原点にあるので、3Dツールで得た座標をそのまま入力して構いません。
しかし鏡など、Parentとなる[Joint#] の位置が原点とは異なるオブジェクトもあります。
ゲームで確認した際Slotの位置がおかしい時、以上の点をチェックしてみて下さい。
2、STR#の編集・エフェクト名登録(Instance0x8F)
使用するエフェクトの名前を入力します。
Resource TreeからText Lists(STR#)を選択。
Resource Listに並んだファイルから、Instance 0x0000008F のテキストファイルを開きます。
無ければ既存のテキストファイルをCloneして、Instanceを0x0000008Fに変更します。Filenameを「Effects」に変更し、必要ないデータもすべてDeleteしてまっさらの状態にしておきます。
Cloneした場合は、下のResourceタブからInstanceを変更できます。変更したらCommitします。
「Add」ボタンを押してリストに新しい行を追加。
新しい行を選択し、エフェクト名を入力します。
Commitします。
3、STR#の編集・Slot名登録(Instance0x90)
Slot名を登録します。
Resource Listに並んだファイルから、Instance 0x00000090 のテキストファイルを開きます。
無ければ既存のテキストファイルをCloneして、Instanceを0x00000090に変更します。Filenameを「Bone Names」に変更し、必要ないデータもすべてDeleteしてまっさらの状態にしておきます。
「Add」ボタンを押してリストに新しい行を追加。
新しい行を選択し、Slot名を入力します。
このSlot名は、CRESで入力したSlot名と一致していないといけません。ミスタイプに注意してください。
できたらCommitします。
私は先にSLOTファイルを覗き既存のSlotを確認したうえで、「0x00」行を飛ばして「0x01」行に入力しました。
理由はこの次の工程で説明します。
今回のオブジェクトでは、Instance0x8Fのテキストファイルも0x90のテキストファイルもなかったため、クローンして編集しました。
4、SLOTの編集
エフェクト用にTarget Slotを追加します。
Resource TreeからSlot(SLOT)を選択。
Resource ListからSlotファイルを選択。
複数タイルのオブジェクトは、タイルの数だけSlotファイルがあります。その場合はエフェクトを追加したいタイルに属したSlotファイルを選択すればいいと思うのですが、試したことが無いのでよく分かりません。今後やり方が分かったら、追記しておきます。
ファイルを開いたら、既存のSlotをざっと確認。
「Add」を押して、新しいSlotを加えます。
最後の列に新しく行が加わるので、それをクリック。
プルダウンから、「Target」を選びます。
次に各項目の値をそれぞれ入力していきますが、大半の項目はどんな値を設定するのかよく分かりません。
同じエフェクトを使用しているMaxisオブジェクトのTarget Slotの値を書き写すのが一番無難かもしれませんが、まずはチュートリアルに示されている値を入力してみます。
ゲームで確認した時うまくいかなかったら、MaxisオブジェクトのSlotの値を参考にする、ということで。
ただし、以下の項目だけは自分で適切な値を決めて入力しなくてはいけません。
・S2(Short2)
「2」と入力します。
CRESでSlotの座標が設定されているためです。
ちなみに「0」だと、F1、F2、F3の値をXYZ座標として使用することになるそうですが、一般的な設定ではありません。
・I9(Int9)
Instance 0x90に登録されているSlot名の行番号を十進法で入力します。
今回の例では、既存のSlotのI9に「0」とあったため、テキストファイルの「0x0」行を空白にして「0x1」に新しいSlot名「slot_fx_steam」を入力した次第です。
既存のSlotが何に使用されているか分からないので、0x0行は空白にしておく以外、いい方法が思いつかなかっただけなんですが…。
・I10(Int10)
Slotファイルに登録されている全Slotの通し番号です。決して重複してはいけません。
複数のSlotファイルがある場合も、ファイルにまたがる形で通し番号になっているはずです。
複数のContainer Slotがある場合、Mキーを押すことで、I10の番号順に飾りオブジェクトがSlotを移動していくらしい。
普通は1から始まる十進法になっていますが、「-1」が重複して存在する例外もあります。
今回がその例外ですが、その場合も1を数え始めにして数値を決めてみました。ゲーム内で確認したところ、特に問題なく動作するようです。
これらの値はプルダウンリストの下の項目や、タブ内で編集できます。
最終的にこんな感じ。
I5~F6、F7、I8、F8の値もチュートリアル通りに埋めました。
Commitします。
5、BHAVの編集
オブジェクト設置後から永遠に蒸気のエフェクトが続くよう、エフェクト開始のコードをBHAVに挿入します。
↓チュートリアルに以下のように書かれています。
――どのBHAVにエフェクト開始のコードを挿入したらいいかですが、最初に考えられるのは「init (もしくはFunction init)」です。しかし「init」ではエフェクトのコードは動きません。
エフェクトは生活モードでのみ開始させる事が出来るので、「main (もしくはFunction main)」のIdleループが始まる前にコードを挿入します――
↑「init」BHAVは購入モードでオブジェクト購入&設置直後に一回だけ実行されるものらしいです。とすると生活モードに切り替わるとそれ以降、無限ループをもつ「main」BHAVがずっと実行され続けるということでしょうか。実際「init」にエフェクトのコードを入れてみても、オブジェクトからは蒸気は出ませんでした。
そういうわけで、エフェクト開始のコードは、「main」のBHAV内のIdle無限ループが始まる前の位置に挿入します。
またエフェクト開始前に、3tickくらいの空白時間を設けたほうがいいとも書いてあります。これもやはり、購入モードではエフェクトが開始できないことに関係しているらしいです。
ただ実際にやってみて、3tickだと蒸気が出始めるのが遅い気がしたので、「2tick」で行きたいと思います。
以上から、Idle(2tick)→Effect Startの流れを「main(もしくはFunction -main)」BHAVの無限ループ前に挿入していきます。
今回のオブジェクトの「main」です。
一行だけで無限ループしていますので、この前に新しいラインを入れなければなりません。
「Insert via true」をクリック。このボタンが無い時は、「Special bottom」にチェックを入れると出てきます。
選択されているラインの下に、新しいラインがコピーされて加わります。無限ループが壊れましたね。
0x1行を選択。
「True Target」に「0x0001」と入力して、無限ループを元通りに直します。
このように新しいラインを加える時は、元のBHAVの流れを壊さないように注意して作業しなくてはいけません。
壊れたら、すぐに直してから次の作業に入ります。
さて、ここから本作業です。
0x0行を選択。
「Opcode」に「0x0118」と入力。Idleのコードです。
「Operands」の数値欄の右に、バツ印のボタンがあるので押します。欄内の数値が全て「00」になります。
「Operands」の一番目の数値欄に「02」と入力。
「Operands」下方に、入力されているOperandsの翻訳文が出ています。Idle(1 arg: ticks=0x0002)になっているのを確認。
Idleの設定はこれでOK。
0x0行が選択されている状態で、「Insert via true」を押します。
新しい行0x1が下に加わります。
新しく出来た0x1行を選択。
「Opcode」に「0x0070」と入力。エフェクト開始/停止のコードです。
「True Target」と「False Target」の両方を、元のBHAVにリンクさせます。この場合は、どっちも「0x0002」へ繋ぎます。
「Operands」の数値欄の右に、バツ印のボタンがあるので押します。欄内の数値が全て「00」になります。
このOpcodeの「Operands」はWizardが使えないため、直接入力していかなくてはなりません。
各欄の設定は以下のようになります。
設定中はOperands下の翻訳文に注意しながら進めます。
・1番目(上段左端)
エフェクトの開始、停止を指示します。
ここでは開始させるので「00」のままです。
停止は「02」ですが、数値を変えるとOperandsの下の翻訳も色々変わるので、一通り見ても楽しいかも。
ちなみにSoft Start やSoft Stopは、フェードイン、フェードアウトみたいになって自然な感じ。
Hard Start、Stopは、スイッチをON、OFFしたみたいにパッと現れたり消えたりするので場合によっては不自然かも。
・2、3、4番目(上段左端から数えて2、3、4番目)
Deta Ownerとのことです。
順に(03 0B 00)と入力。
My(0x03) Object ID(0x000B)と訳されるようです。
・5番目(上段左端から数えて5番目)
Instance 0x8Fのテキストリストの行番号を入力。
Operandsの下の文字情報を見て、自分の設定したエフェクト名が表示されているか確認。
場合によっては、入力したエフェクト名とまったく別のエフェクト名がGlobal等から参照される時があります。
その時は、テキストファイルの設定とOperandsの設定が正しければ、無視して構わないとの事。SimPEのエラーみたいです。いずれにしても、ゲーム内での動作確認次第ですが。
・7番目
Slot番号を入力。
Slot番号の数え方は以下。
SLOTに登録されているSlotを種類別(Container、Routing、Target)に、それぞれSlotファイルのエントリー順に数えていくそうです。
【例】SLOTファイルの内容が上から順にこんな構成になっていたら
0:Container →(Container slot 0x00番)
1:Container →(Container slot 0x01番)
2:Routing →(Routing slot 0x00番)
3:Target →(Target slot 0x00番)
4:Container →(Container slot 0x02番)
5:Target →(Target slot 0x01番)
・10番目(下段左から2番目)
Target Slotを使用するので、デフォルトの「00」の設定を使用。
ここも数値をひとつずつ増やすと、Container、Routing、TargetとSlotの種類を直接指定できるみたいです。
・11番目
「00」のまま。
Package内に存在するInstance 0x8Fのテキストファイルを使用するため。
GlobalやSemiGlobalのテキストファイルを使用する時は、別の値を入力するようです。
・その他
「00」のまま。
最終的にこんなになりました。
赤と緑の矢印を見て、それぞれの行が正しく繋がっているか最終確認。
Commitします。
これで作業終了。
念のためファイルメニューから「Tools>Object Tools>Fix Integrity」を選び、ウィンドウが開いたらOKします。
セーブします。
SimPEを終了する前に、CRES Hierarchieが正しく編集できているか確かめます。
大丈夫のようです。
SimPEを閉じて、ゲーム内で確認します。
この記事にトラックバックする