ジェネレーター 解析メモ
Last Update 4th Dec, 2007
ジェネレーターは魔法や、マップ上の炎や天候、水面などさまざまなところで利用されていて
これが表現出来ると、マップなどの再現性がかなり上がるはずなのでここで解析を進めて行きたい思います。
当面は、ケアルとレイズのエフェクトが再生できるように、それで使われている物を優先で。
現在は、ファイアを優先。描画関係と発生位置(その2)とか
ウォータ優先に移行。発生位置(その3) ここまでおわるとかなりいい感じになるかと。
↑が終わったら、シェル。回転移動や、可能なら描画向きなど
スケジュールからは、発生するタイミングで呼び出されて、さらに発生長さを指定してくる。
発生長さは、パーティクル(?)が発生する時間帯の長さで 個々のライフタイムは考慮されてない。
データは ヘッダー部、 データ1部、 データ2部、 データ3部、 データ4部と分かれている
ヘッダー部は70hバイト データ1〜4へのオフセットなどを含む。
+00h | 所属となにか | 所属フラグ1 | 所属フラグ2 | |||||||||||||
+10h | float | float | float | float | ||||||||||||
+20h | float | float | float | float | ||||||||||||
+30h | float | float | float | float | ||||||||||||
+40h | float | float | float | float | ||||||||||||
+50h | なんかのフラグ? | |||||||||||||||
+60h | 発生間隔 | 発生数 | e(1) | なんかのフラグ? | ||||||||||||
+70h | データ1へのオフセット | データ2へのオフセット | データ3へのオフセット | データ4へのオフセット |
・所属
下位4bitが1の時。それ以外は無効なのかな??9の時は斜めになる
その上6bitが所属っぽい
(0x80 0x08が続く場合)
0x001 腰中心 画面向き
0x011 腰中心 画面向き
0x021 頭上 手を伸ばした位の高さ 画面向き
0x031 首中心 画面向き
0x041 正面前方 画面向き
0x051 頭上 画面向き
0x061 頭上 画面向き
0x071 胸前 画面向き
0x081 右足中央下 画面向き
0x091 左足中央下 画面向き
0x0A1 右手内 画面向き
0x0B1 左手内 画面向き
0x0C1 頭上少し後方 画面向き
0x0D1 腰(ベルト位置) 握り拳程度前方 画面向き
0x0E1 腰(ベルト位置)の高さで右腕との中央 握り拳程度前方 画面向き
0x0F1 右腕手首より少し上の位置にから握り拳程度右方 画面向き
0x101 右腰 後方 画面向き
0x111 腰 握り拳程度後方 画面向き
0x121 左腰 後方 画面向き
0x131 左腕手首より少し上の位置にから握り拳程度左方 画面向き
0x141 腰(ベルト位置)の高さで左腕との中央 握り拳程度前方 画面向き
0x201 右太もも 背丈ほど前方 画面向き
ボーンに対応してるのではないかと
・発生間隔
0だと沢山 おそらく 0-1/60 1-1/30 2-1/20 2
・発生数
0だと 一度にひとつ。 1だと2つかな
・e 10hを指定すると 発生期間が無限になる。(00〜0Fhだとそんな変わったしない)
データ1〜4は同じデータフォーマットをしていて、データタイプとそのパラメータが並んでいる。
但し、各データ部の違い(役割)は不明。 2がメインで使われている。
初期値、実行、終了処理、条件 などに分かれているのではないかと予測
データ1
役割は不明
No. | DataSize | ||
00h | 0 | 終了。データの最後 | ---- |
04h | |||
07h | |||
0Ah | 12 | ||
0Ch | |||
0Fh | |||
10h | |||
11h | 4 | LONG ?? | |
15h |
データ2
役割は不明 各種パラメータかな。
No. | DataSize | Switch | ||
00h | 0 | - | 終了。データの最後 | |
01h | 44 | - | 初期値。ロードするid やxyz座標など、が入っている typeDataは IDのデータ種別。 1Dh→ [25]、0Bh→[1F]、3D→[3D]、47→ポイントライト(データ無し)[]、??→[]、??→[] [1F] ← 34 0B、 44 0B、0C 0B、 28 0B [21] ← 24 0E、 14 0E、08 39、、、、 [2E] ← 0C 0B、1C 0B、 20 0B、 08 0B、34 0B、 24 0B、 14 0B、、 [3D] ← 08 3D、、、、、 [25] ← 54 1D、50 1D 別ファイル(システム共有)のID指定の判別方法も見つけないと・・。 (ring や hit? あたりがそう) らいと 08 47、、、、、 *hit8 ← 24 0E *ring ← 44 24 うそかも LifeTimeは生存時間。60(1Eh)で1秒だと思う bil は 向き 0 は普通で 1はビルボード それ以外は未調査 0Dhがあった。これは視点や位置関係が関係しない画面に張り付くタイプ? |
WORD bil WORD ?? LONG ?? ID LONG dmy float x, y, z BYTE ??,typeData WORD LifeTime LONG ??,?? |
02h | 12 | 02h | フレームあたりの移動量 dy -が↑ dx-が奥 dz-が←(但しこれはビルボードデータでの話し) 値が高いと移動が速くなる |
float dx,dy, dz |
03h | 12 | 02h | ↑の組み合わせの 移動量の揺らぎを作っている。 | float dx,dy, dz |
06h | 12 | 発生位置の調整 球面上発生パターン 半径 r + addr(ランダム) の位置に発生させます。発生位置はランダム 最後はなんだろう?値を変えても何も変化がないのでもしかすると何かの角度を表しているのかも |
float addr, r, ?? | |
07h | 28 | 発生位置の調整 球体内に発生するのは間違いないけど 08が0になると、発生位置が原点になる。 しかも、08が+にも関わらず、中央へ向かおうとする。 ライフタイムと08の掛け合わせで距離が伸びる。 原点へ向かう球面上の発生パターンなのかな。06では原点で終了できないし。 cを上げると 前奥からの発生が増大する。 dを上げると 縦軸(上下)からの発生が増大する。 eを上げると 横軸(左右)からの発生が増大する。 bに変化は見られない。 08がなぜ他と違う使われ方をするのか、 なぜ07のデータとして入らないのか納得できない。 08 や 41の解釈を間違ってるのかなぁ |
float a,b,c,d,e (4); (4); |
|
08h | 4 | 02h | フレームあたりの原点から発生位置へ方向への移動量となる。 マイナスだと、原点に向かう。 |
float length |
09h | 12 | - | 初期姿勢。 | float rx, ry, ry |
0Ah | 12 | - | 初期姿勢の揺らぎ | float rx, ry, ry |
0Bh | 12 | 05h | フレームあたりの回転の指定 | float rx, ry, rz |
0Ch | 12 | 05h | 上記の回転の揺らぎ | float rx, ry, rz |
0Fh | 12 | - | スケール | float sx, sy, sz |
10h | 12 | - | スケールの揺らぎ sx,sy,szそれぞれ別の値が足される。 | float sx, sy, sy |
11h | 4 | - | スケールの揺らぎ sx,sy,sz全てに同じ値が足される。 | float adds |
12h | 12 | 08h | フレームあたりスケールの変化量。 | float sx, sy, sz |
13h | 12 | 08h | ↑その揺らぎ? | float sx, sy, sz |
16h | 4 | - | 着色。 | COL |
17h | 4 | - | 色っぽいデータ。着色の揺らぎだったりして | LONG ?? |
18h | 4 | - | LONG ?? | |
19h | 8 | 0Bh | float??,?? | |
1Ah | 8 | 0Bh | ||
1Dh | 4 | |||
1Eh | 4 | - | 描画方法かな。 0x48 0x44 &0x06 が 0=加算(Default) 2=?? 4=通常 6=減算 指定無しでZ比較ありのデータがあった。もしかしてZ比較はここでの指定ではない? ファイアの黒い煙みたいなのは、通常のアルファブレンディング ファイアの煙でバリがでるのはなんで? 0.5テクセルこちらでずらす処理が必要なのかなぁ |
LONG flgDraw |
1Fh | 44 | - | 発生位置の調整 回転しながら発生パターン r + addr(ランダム) は半径。 rx(前後),ry(上下),rz(左右)は拡大倍率 ry ryは半径。 rtx(左右軸) rty は軸回転 div+1で1周するようできる。 h が基準高さ +が下。 addhまでのランダム値が足される 拡大縮小や、回転など、演算順番で結果が変わるためにいろいろな エフェクトを検証しながら演算順番を調整する必要がある。 |
float addr,r; float rx,ry,rz float rtx,rtz; float h,addh; (4), LONG div |
21h | 12 | 0Fh | X座標のキーフレームを使った変化 | (4); ID; (4) |
22h | 12 | 10h | Y座標のキーフレームを使った変化 | (4); ID; (4) |
23h | 12 | 11h | Z座標のキーフレームを使った変化 | (4); ID; (4) |
24h | 12 | 12h | X回転のキーフレームを使った変化 | (4); ID; (4) |
25h | 12 | 13h | Y回転のキーフレームを使った変化 | (4); ID; (4) |
26h | 12 | 14h | Z回転のキーフレームを使った変化 | (4); ID; (4) |
27h | 12 | 15h | X軸方向のスケールのキーフレームを使った変化 | (4); ID; (4) |
28h | 12 | 16h | Y軸方向のスケールのキーフレームを使った変化 | (4); ID; (4) |
29h | 12 | 17h | Z軸方向のスケールのキーフレームを使った変化 | (4); ID; (4) |
2Ah | 12 | 18h | 色R(青)のをキーフレームを使った変化 | (4); ID; (4) |
2Bh | 12 | 19h | 色G(緑)のをキーフレームを使った変化 | (4); ID; (4) |
2Ch | 12 | 1Ah | 色B(青)のをキーフレームを使った変化 | (4); ID; (4) |
2Dh | 12 | 1Bh | 色A(透過率)のキーフレームを使った変化 | (4); ID; (4) |
2Eh | 12 | 1Ch | テクスチャ u座標のキーフレームを使った追加変化 | (4); ID; (4) |
2Fh | 12 | 1Dh | テクスチャ v座標のキーフレームを使った追加変化 | (4); ID; (4) |
30h | 4 | float ?? | ||
31h | 4 | - | float ?? | |
32h | 8 | float ??,?? | ||
33h | 12 | 1Eh | キーフレームへのID tam0 mf10 13015 で発見 34hとペアでモーフィングのデータに必ず出てくるっぽい。 再生速度のコントロールっぽいけど 0.0fが2〜3回続く事があり意味不明。 データも 0.0f〜1.0fを少し大きい事もあり。 |
(4); ID; (4) |
34h | 12 | 1Fh | キーフレームへのID tam1mf11mp20 13015 で発見 33hとペアでモーフィングのデータに必ず出てくるっぽい。 再生速度のコントロールっぽいけど 0.0fが2〜3回続く事があり意味不明。 データも 0.0f〜1.0fを少し大きい事もあり。 |
(4); ID; (4) |
35h | 12 | 20h | キーフレームへのID 13015 で発見 mp30 33h 34hと用途は同じなんだろうけど・・ |
(4); ID; (4) |
36h | 12 | 21h | キーフレームへのID | (4); ID; (4) |
39h | 12 | 24h | キーフレームへのID dmm0 11090で発見 |
(4); ID; (4) |
3Ah | 36 | |||
3Bh | 12 | - | ラジアン各っぽいでーた 10039で発見 |
float ??, ??, ?? |
3Ch | 8 | ジェネレーターへのID 指定ジェネレータの起動 または強制終了かも。 タイミングは このジェネレーターが起動した時、終了した時(ライフタイムを過ぎた時)と、全てのパーティクルも終了した時。が考えられる |
(4); ID; | |
3Dh | 0 | 29h 2Bh | --- | |
3Eh | 8 | 29h 2Ah |
float ??, ?? | |
3Fh | 8 | 29h 2Ah |
float ??, ?? | |
40h | 8 | 2Bh | float ??, ?? | |
41h | 4 | 02h | 08hのランダム追加量。08hの値にここのランダム値が追加される。詳細は08hで | float addlength |
42h | 8 | - | float ??,?? | |
43h | 4 | もしかすると Zバッファーに関する 描画関係のフラグしれない。 値は 0x48 0x42 など |
long ?? | |
44h | 8 | ジェネレーターへのID 指定ジェネレータの起動 または強制終了かも。 タイミングは このジェネレーターが起動した時、終了した時(ライフタイムを過ぎた時)と、全てのパーティクルも終了した時。が考えられる |
(4); ID; | |
45h | 0 | - | 10066で発見 | --- |
47h | 0 | - | 11092で発見 | --- |
49h | 0 | - | 11092で発見 | --- |
4Ch | 12 | SEの再生? SEを指定した時に唯一出てくるやつ 60.0fが出てきたので 長さか、音の強さ(音量)? |
float ??;(8) | |
4Fh | 12 | 不明なデータタイプ[3E]へのID 白魔法シェルで使われている 以下はシェルの場合の話し [3E]のデータには 2 と 0.0f -1.0f 0.0f 1.0f 0.0f 1.0f 0.0f 1.0f が入っている おそらく発生位置の直指定。 上記だと 2つのデータがあって x,y,z,? = 0.0f, -1.0f, 0.0f, 1.0f x,y,z,? = 0.0f, 1.0f, 0.0f, 1.0f になってるんだと思う。つじつまも合ってるし。発生数がこの数よりおおければ、繰り返しになるのかな。このへんは他のデータをみてみないとわからない。謎なのは最後の1.0fの数値。 |
(4); ID; (4) | |
53h | 8 | 33h | ジェネレーターへのID 指定ジェネレータの起動 または強制終了かも。 タイミングは このジェネレーターが起動した時、終了した時(ライフタイムを過ぎた時)と、全てのパーティクルも終了した時。が考えられる |
(4); ID; |
54h | 20 | 34h | 不明なデータタイプ[3E]へのIDをもつ | |
55h | 36 | |||
56h | 4 | |||
58h | 16 | ライトに関することかな | ||
59h | 12 | 35h | キーフレームへのID | (4); ID; (4) |
5Ah | 12 | 36h | キーフレームへのID | (4); ID; (4) |
5Bh | 12 | キーフレームへのID | (4); ID; (4) | |
60h | 12 | 3Ch | キーフレームへのID R? |
(4); ID; (4) |
61h | 12 | 3Dh | キーフレームへのID G? |
(4); ID; (4) |
62h | 12 | 3Eh | キーフレームへのID B? |
(4); ID; (4) |
63h | 12 | 3Fh | キーフレームへのID | (4); ID; (4) |
67h | 4 | 02h | 10067で発見 | |
6Ah | 8 | 46h? | ジェネレーターへのID 指定ジェネレータの起動。起動先は親の位置やサイズ、回転の影響をうけるもよう。 おそらくパーティクル単位での機能かと。←これで間違いないみたい。 |
(4); ID; |
6Ch | 12 | 49h | キーフレームへのID ポイントライト強さ |
(4); ID; (4) |
72h | 8 | 使用率が高い割には 使い道が謎。値を変えても変化ないし。 だいたい 0.5f, 0.0f にという値が多い |
float ??, ?? | |
78h | 12 | 58h | キーフレームへのID | (4); ID; (4) |
82h | 20 | キーフレームへのID | (4); ID; (4) (4) (4) | |
87h | 0 | --- | ||
8Fh | 0 | --- |
データ3
パラメータ有効スイッチ
データ2のパラメータで利用実行するものを指定してする
No. | DataSize | ||
00h | 0 | 終了。データの最後 | --- |
02h | 0 | 02h 03h 08h 41hの移動を使用 | --- |
03h | 12 | 02h 03h | |
05h | 0 | 0Bh 0Ch の回転を使用 | --- |
06h | 12 | ||
08h | 0 | 12h 13h の??を使用 | --- |
09h | 8 | ||
0Bh | 19h の??を使用 | ||
0Dh | 0 | --- | |
0Eh | 0 | 01h のエフェクトモデルを使用 ← うそでした | |
0Fh | 0 | 21h のキーフレームを使用 | --- |
10h | 0 | 22h のキーフレームを使用 | --- |
11h | 0 | 23h のキーフレームを使用 | --- |
12h | 0 | 24h のキーフレームを使用 | --- |
13h | 0 | 25h のキーフレームを使用 | --- |
14h | 0 | 26h のキーフレームを使用 | --- |
15h | 0 | 27h のキーフレームを使用 | --- |
16h | 0 | 28h のキーフレームを使用 | --- |
17h | 0 | 29h のキーフレームを使用 | --- |
18h | 0 | 2Ah のキーフレームを使用 | --- |
19h | 0 | 2Bh のキーフレームを使用 | --- |
1Ah | 0 | 2Ch のキーフレームを使用 | --- |
1Bh | 0 | 2Dh のキーフレームを使用 | --- |
1Dh | 0 | 2Fh のキーフレームを使用 | --- |
1Eh | 0 | 33h のキーフレームを使用 | --- |
1Fh | 0 | 34h のキーフレームを使用 | --- |
20h | |||
21h | |||
24h | |||
25h | 0 | --- | |
26h | |||
27h | 4 | テクスチャ座標 u の追加変化。フレーム単位でadduが足される | float addu |
28h | 4 | テクスチャ座標 v の追加変化。フレーム単位でaddvが足される | float addv |
29h | 12 | float ??, ??, ?? | |
2Ah | |||
2Bh | 3Dh 40hの??を使用 | ||
2Ch | 8 | float ??, ?? | |
2Eh | 12 | 01h のMMBを使用 ← うそでした | float ??, ??, ?? |
2Fh | |||
33h | 0 | 53h の???を使用 | --- |
34h | 0 | 54h の???を使用 | --- |
35h | 0 | 59h のキーフレームを使用 | --- |
36h | 0 | 5Ah のキーフレームを使用 | --- |
37h | |||
3Ch | 0 | 60h のキーフレームを使用 | --- |
3Dh | 0 | 61h のキーフレームを使用 | --- |
3Eh | 0 | 62h のキーフレームを使用 | --- |
3Fh | 0 | 63h のキーフレームを使用 | --- |
45h | 0 | --- | |
46h | 0 | 6Ahのジェネレータ起動かなぁ? | --- |
49h | 0 | 6Ch のキーフレームを使用 | |
4Eh | 36 | ||
4Fh | 52 | ||
50h | 4 | ||
57h | |||
58h | |||
5Fh | 82hを使用? | ||
60h | 24 | ||
69h | |||
64h | 16 |
データ4
役割は不明
No. | DataSize | ||
00h | 0 | 終了。データの最後 | --- |
01h | 8 | ジェネレーターへのID 指定ジェネレータの起動かも。 タイミングは このジェネレーターが起動した時、終了した時(ライフタイムを過ぎた時)か、パーティクルが終わった時か |
(4); ID; |
04h |
必要な情報。
・向き。(視点に関係無し。こちらを向く。立て札のように一軸を固定されてこちらを向く。タイトルのように画面に張り付く)
・パーティクルの発生時間。 発生間隔 ←判明
・パーティクルのライフタイム
・パーティクル単位の変化。 (回転しながら発生など) ←判明
・位置。 キャラクタのどの位置に属するか。 頭、手、背中など。 ←判明
・描画方法1。 加算合成。減算合成。普通の透過 ←判明
・描画方法2。前後の判定 Zバッファ更新するかどうか