ジェネレーター 解析メモ

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バッファ更新するかどうか


更新メモはこちらへ移動 →メモ