ACのメモリ解析のための覚え書き


ACのメモリ解析のための覚え書き / ガレージのメモリ情報
戦闘時のメモリ情報01 / 戦闘時のメモリ情報02 / 戦闘時のメモリ情報03 / 戦闘時のメモリ情報04


注:このテキストも経津さんより頂いていたものをhtml化したものになります。各種調べものや改造コードの作成などで使わせてもらっています。


<<データの相互生成>>

ACのメモリ管理は主にシステム画面とミッション、アリーナステージでそれぞれ全面的にメモリが書き換えられる。
つまり、システム画面中に割り当てられたメモリは戦闘ステージに移行する際にリセットされ戦闘中関連のメモリが上書きされるため、
PARなどで恒常的に任意のアドレスに任意の数値を割り込ませると正常に動作しない場合がある。

なお、戦闘ステージやミッションではそれぞれのステージで戦闘中の動作関連のメモリが割り当てられるアドレスが異るため、
メモリを解析の際は一定のステージに固定して行う必要がある。

メモリの割り当てられるおおまかな構成は以下のとおり。

システム画面 ガレージ関連
パーツパラメータ関連
戦闘画面 <リプレイや再戦で維持されるもの>

戦闘ステージデータ
各パーツの描画・挙動パラメータ
弾グラフィック関連


<リプレイや再戦時にリセットされるもの>

戦闘中の機体動作関連(座標・速度・角度・AP・安定性・機体サイズ・被弾サイズ他)
戦闘中の機体構成(運動性能・機体構成・各火器管制他)

読み込み中のメッセージと共に上記の「システム画面」と「戦闘画面」の継続情報が参照され、それを元にCDから再度読み込まれて生成される。
したがって、戦闘中にデータを書き換えてもごく一部の継続されるデータ以外はすべてリセットされる。

<<再現性テスト>>

アリーナ戦は元となるアセンブルデータの他に1P側のキー操作のみを記憶している。つまりCPUは常に条件分岐で処理されている。
これを利用して再現性の確認テストを行うことができる。

リプレイのために記録されている内容 ・自機の各フレームの入力履歴
リプレイ開始時(現在読み込み中)に
生成される対戦ステージや各機体データ
・両者の機体運動性能、機体システム、火器管制の各データ
 どの対戦ステージでも常に同じアドレスに生成される。
・対戦ステージに関する各データ(両者の開始位置、AP、安定性、当り判定、状況他)
 対戦ステージによって異るアドレスに生成される。
※リプレイ開始時に生成される各データはメモリ上のアセンブルデータや
 選択している対戦ステージ情報を参照しており、リプレイのたびに新しく読み込まれる。
対戦開始時に読み込まれ、
対戦からリプレイにわたって引き継がれるデータ
・アセンブルデータ以外の基本的な構成データ(機体パーツの形状や特性、弾グラフィックごとの各特性等)
※対戦ステージの地形情報や機体パーツの形状、弾速など、パーツパラメータとして
独立して設定されて生成される運動性能や攻撃力等を除いた基本的なデータは
アリーナ対戦開始時にメモリ上によみこまれ、再びシステム画面にもどるまで新たに読み込まれず引き継がれる。

この仕様により、対戦開始直後に両者の機体データを書き換えることで、異る武器や運動性能を与えてまったく同じ入力を再現することができ、
解析したデータがどのように処理されているのかや、パーツごとに性能が異るかどうかなどを調べることができる。
ただし、リプレイ中に両者の位置関係に対戦時と異る変動を与えたり、CPUロジックに異る分岐条件を与えた場合は、CPUが対戦時とは別の行動をとるようになる。

ついでにランカーメイキング利用法

・「FLY FREQ」を“0”にした四脚・タンクの運動性能を“0”にすると、開幕位置で釘付けにできる。
・ロックと射撃のロジックのみを与えた状態の四脚は同じ速度の四脚で開幕後に左平行移動を行うと状況が変わるまで双方平行移動をしつづける。
・水平方向への速度は振幅があるので正確な速度調節は機体実サイズを変更して限界速度で調整した方がいい。
・被弾判定サイズに手を加える場合、運動するとリセットされてしまうためキーコンフィグデータを無効化するといい。
・「FLY FREQ」を“0”にした重量二脚はブースト速度を“1”、ブースト消費を“0”にすると速度“1”でブーストしつづける。ブースト“0”にすると歩く。

ほかにもいろいろ、アイデア次第。

<<内部タイマー>>

内部でフレームをカウントしているアドレスがあり、フレームを監視して時間を実測する場合に必須。

検索方法は旋回最大速度を“1”にして左旋回し、機体角度の増加量(つまり1フレームで1増加する)と同じ増加量のデータをサーチする。
1づつ増加させられれば他のものでもかまわない。ちなみに該当するアドレスは複数あるが、タイマーとして利用する分にはどれでもかまわない。

また、スローモーションで動きを観察したい場合でもミサイル大量発射などで処理落ちさせると一部の処理をスキップするようになるため、
正確に測れなくなる場合があるので注意。フレームレートを変更させればいいんだろうけどいまのとこ調べてない。

入力後の動作計測はポーズ状態でタイマーをリセット(100程度がいい、小さすぎると再度開幕動作になってしまう)し、
目的動作の入力をした状態からポーズ解除がやりやすい。

<<各データセット配列、検索方法>>

○パーツパラメータデータセット(システム画面)

各パーツパラメータが与えられているデータセットで、戦闘に移行する際にはこのパラメータを参照して戦闘中の機体データを生成する。
ただし、戦闘からシステム画面へ移行する際には再度CDから読み込まれて生成されるため、戦闘前に設定したものはリセットされる。
なお、戦闘中の地形データ群が当てられるアドレスと同じ範囲に設定されているためPARで強制介入しつづけると地形のポリゴンが飛ぶなどの問題が発生する。

ガレージやSHOPなどで確認できるパーツパラメータを確認できるが、表示されない隠しパラメータも含む。ただし、大きさやグラフィック関連のデータは含まない。

検索方法は戦闘中からシステム画面へ移行した際に各パーツの値段を32bitデータサーチすると得られる。

・ヘッドパーツ
・コアパーツ
・アームパーツ
・ウェポンアームパーツ(種別を含む)
・レッグパーツ(種別・待機EG・旋回加速度・旋回速度・射撃体勢時加速度及び速度・ダミー移動速度を含む、脚部カテゴリごとに固有となるデータは含まず。)
・ジェネレータパーツ
・FCSパーツ(各サイトサイズ・各ロック速度を含む ※Mロック速度は含まず)
・ブースターパーツ
・武器パーツ

各パーツの重量やEGなどは戦闘に反映されるため戦闘中の重量をコントロールする場合にはこのデータを変更するのが最も容易な方法。
戦闘中のメモリデータでは再計算された異る扱われ方をするので重量と運動性能の関係を調べる場合にはいったんシステム画面を経由してリセットしたほうがいい。

※パーツパラメータは上記の値段を検索キーとして得られるアドレスと分離してパラメータデータ群を形成しているものがある。
 例えば射撃武器のパラメータは値段で検索した場合には、値段、重量、最大EG、等が得られるが、これとは別の場所に
 弾ID、サイトタイプ、戦闘中の名称、弾数、E消費、弾単価、射程、ロック数、発射間隔、タイプ、攻撃力が一群で格納されている。
 (これはRF/Eの射程22000あたりで検索すれば見つかる)

○機体運動性能データセット(すべて16bit)

戦闘中に実際に機体運動性能に反映される値群。
検索方法は戦闘中に右手武器残弾のデータサーチ(16bit)を行い、そのアドレスから「232byte」さかのぼることで上昇加速度のアドレスを得られる。
機体運動性能データセットは機体構成及び火器管制データセットと並んで配置され、その後に敵のデータセットが同じ順列で配列される。
また、自機上昇加速度のアドレスから238Byte後方に敵機上昇加速度のアドレスがあり以降自機と同じ配列でデータが配置されている。

・0
・0
・0
・レーダーもしくはレーダーサイト関連の数値1
・レーダーもしくはレーダーサイト関連の数値2
・上昇加速度
・上昇最大速度
・空中水平加速度
・空中水平最大速度
・地上ブースター加速度
・地上ブースター最大速度
・旋回加速度
・旋回最大速度
・射撃体勢時旋回加速度
・射撃体勢時旋回最大速度
・射撃衝撃耐性
・「「 用途不明な値 」」
・0(戦闘中に変化)
・0(戦闘中に変化)
・0(戦闘中に変化)

以下、機体構成データセットへ続く

運動性能データセットは戦闘開始時に生成され、リプレイの際はリセットされて再び生成される。
戦闘中の機体性能データ関連はステージに関わらず同じアドレスに生成される。システム画面では割り当てられている数値は意味をなさない。

各数値が実際に有効となる値は

空中の加速度及び最大速度は垂直方向と水平方向で分離しており、相互依存性はないと思われる。
空中水平方向と地上でのブースター速度は相互依存関係にあり、かつX軸とy軸も相互に依存する。
これらに与えられる数値はおそらく機体構成データセット内の数値と対応して上昇加速度は2倍、上昇最大速度は200倍、
空中水平加速度および地上ブースト加速度は14倍、空中水平最大速度及び地上ブースト最大速度は140倍の値となる。

旋回加速度と旋回最大速度は機体構成データセット内の対応数値よりも低い。
射撃体勢旋回関連は射撃体勢をとる度に機体構成データセットの該当レベルを参照して再生成される。
射撃衝撃耐性は数値が小さくなるほど耐性が強くなり、「SP−SAP」と脚部安定性、有効重量に依存。

用途不明な値は有効重量に比例し、機体構成データセットの該当レベルの4倍の値で最低値は“128”。
変更しても機体挙動に影響を与えないため用途は不明である。

※ 機体構成データセット内にこれらの数値に対応した“64”と“50”を上限とした値(8bit)があるが、その数値は実際の戦闘には反映されない。

○機体構成データセット

機体アセンブル関連、運動性能レベル、エネルギー管理関連、キー設定他。戦闘中に反映されるデータであるが、
運動性能レベル(射撃体勢旋回性能レベルを除く)は書き換えても実際の運動性能には反映されない。
検索方法は戦闘中に右手武器残弾のデータサーチ(16bit)を行い、そのアドレスから「98byte」さかのぼることで
このデータヘッドのアドレスを得られる。

配列は以下の通り(16bitで示す、8bitのものは同じ行で並べてリスト)

・データヘッド(用途不明)
・視点(詳しくは不明、“44”がデフォルト、“45”でコクピットビュー)
・常に“0”(8bit),ミッションモード(8bit)
・上昇加速度レベル(8bit),上昇最大速度レベル(8bit)
・空中水平加速度レベル(8bit),空中水平最大速度レベル(8bit)
・地上ブースト加速度レベル(8bit),地上ブースト最大速度レベル(8bit)
・旋回加速度レベル(8bit),旋回最大速度レベル(8bit)
・有効重量レベル(8bit),コア迎撃確率(8bit),
・コア迎撃範囲(8bit),常に“0”(8bit),
・ジェネレータ容量
・ブースト消費
・待機時エネルギー回復速度
・レッドゾーン容量
・稼働時エネルギー回復速度
・ブレード発動時エネルギー消費
・レーダーサイト深度(サイトの範囲。レーダー範囲は運動性能データセット内)
・最大AP
・実弾ダメージ係数(8bit),エネルギーダメージ係数(8bit)
・機体安定レベル(8bit),ミサイル表示機能(8bit)
・マップタイプ(8bit),レーダーサイトタイプ(8bit)
・常に“0”(8bit),不明値でアセンブルによって変動(8bit)
・CPUタイプ(8bit),コアパーツID(8bit)
・レッグパーツID(8bit),ヘッドパーツID(8bit)
・アームパーツID(8bit),ブースターパーツID(8bit)
・右腕武器ID(8bit),左肩武器ID(8bit)
・右肩武器ID(8bit),ブレードID(8bit)
・ノイズキャンセラー&バイオセンサー(パターン代入)
・不明
・不明
・不明
・キーコンフィグ
・キーコンフィグ
・キーコンフィグ
・キーコンフィグ
・キーコンフィグ
・キーコンフィグ
・キーコンフィグ
・キーコンフィグ
・キーコンフィグ
・キーコンフィグ
・キーコンフィグ
・キーコンフィグ
・不明値(脚部アセンブル等で変動)
・不明値(脚部アセンブル等で変動)
・不明値(脚部アセンブル等で変動)
・不明値(脚部アセンブル等で変動)
・不明値(脚部アセンブル等で変動)
・不明値(脚部アセンブル等で変動)
・不明値(脚部アセンブル等で変動)
・不明値(8bit),常に“0”(8bit)
・ブレード関連不明値(8bit),常に“0”(8bit)
・ブレード攻撃力
・ブレード衝撃(8bit),常に“0”(8bit)
・不明値(8bit),

○火器管制データセット

火器管制データセットはブレードを除く各武器ごとに一連のデータセットを構成しており、右手武器、左肩武器、右肩武器の順に並んでいる。
該当武器を装備していない場合は全て“0”、両肩武器は左肩武器として扱われる。
検索方法は戦闘中に右手武器残弾のデータサーチ(16bit)を行い、そのアドレスから「18byte」さかのぼることで火器管制データヘッドのアドレスを得られる。

配列は以下の通り(16bitで示す、8bitのものは同じ行で並べてリスト)

・データヘッドで常に“0”(8bit),武器パーツの装備数(8bit)
・武器カテゴリID(8bit),弾ID(8bit)
・不明値(射出位置などの設定?)
・不明値(射出位置などの設定?)
・不明値
・不明(8bit),射出モード(射撃武器のみ)orミサイルロック速度(ミサイルの場合のみ)(8bit)
・エイミング動作モード(8bit),リコイルモード(8bit)
・ロックガイドタイプ(8bit),常に“0”(8bit)
・弾数
・残弾数
・エネジードレイン
・ロック距離
・射程距離
・1次ロック 縦角度
・1次ロック 横角度
・2次ロック 縦角度
・2次ロック 横角度
・ロックスピード
・最大ロック数(8bit),リロードタイム(8bit)
・攻撃タイプ(8bit),常に“0”(8bit)
・攻撃力
・衝撃(8bit),不明(8bit)
・以降不明

射撃武器の射出モードとミサイルのMロック速度アドレスを共用しており、射出モードは射出する弾の発射モードや発射数などをコントロールする、
値によってはリロード0も真っ青なトンデモ連射が可能。ミサイルロック速度はどういうわけだかFCSのパラメータにはなく、
戦闘時にこのアドレスに配置されるが、検証した限りではFCSに固有な値をとり他のアセンブルやミサイルの種類などには影響されない。

エイミング動作モードはうでや上半身などの動きの種類、リコイルモードは発射時の動きやリコイルの有無の設定。

ガイドタイプやサイトの形状やガイドレールの表示。

エナジードレインは射撃時のエネ消費で実弾系も代入されるが消費しない。

攻撃タイプは実弾系かエネルギー系などのタイプIDで、無属性や特殊効果攻撃などもこれに含まれる。
(エネルギー系“39”、実弾系“23”、ジャマー“87”、焼夷“151”)

○弾速の検索方法例

弾速の測定は実測でもできますが、パーツの数が多いのでデータから抽出する方法を考えてみました。
いくつか検証してみた結果射撃した直後に弾がまだ消滅していない状態で弾に関するパラメータを変更しても移動中の弾には反映されないことが判ったので、
マップ上に存在する弾それぞれが射撃の瞬間に弾の移動処理や攻撃に関わるデータを持っており、その中に弾速が含まれると仮定してみます。

なお実測する場合には、弾は弾速の距離おきにしか表示されないのでリロード“0”にした状態で連射するとちょうど弾速の間隔に弾が並ぶように表示されることが利用できます。
んで、適当な位置に表示されている弾が機体のエンカウントで消える瞬間の位置と一つ前の弾が同じようにエンカウントで消える瞬間の位置の差が弾速になります。
位置は機体座標から抽出するのが簡単です。ただ拡散するタイプの武器は射撃フレームでの飛翔距離も前後に散るため正確に実測できません。

ほかには結果論的な測定方法ですが攻撃判定が維持される実際の射程距離が必ず弾速の倍数となるという仕様になっていることから、
市街地あたりで敵を釘づけにして(タンク等の運動性能を0にする)パラメータ射程距離を変更しながら実際ダメージが発生しうる射程距離が変動する境界を探すという方法もあります。
例えばRF/Eの実射程が変動する境界が“21600”と“18900”なので弾速が“2700”と特定できます。
1箇所境界を調べてリロード0連射で上空などから幾つ弾が表示されているかを確認することでも特定できます。

いずれにしても全ての武器を一つづつ調べるのは手間がかかるので、できるだけ検索で絞りこみやすい弾速をもつとおもわれるRF/Eの速度を特定して
おおもとのデータ群にアプローチを試みます。

以下はその手順の一例です。

(1)ランカーメイキングで非武装の機体を作成(通常ランカーの弾を撃ちきらせても可)

マップ中で移動処理中の弾のデータを検索により発見することが目的なので、自分の射撃する弾以外がマップ中に存在しないようにします。
PSACではステージによってそれぞれのメモリが割り当てられるアドレスが異るので固定したほうがいいでしょう。
また、ACテストやミッションではデータの配置や弾などの処理行程が対戦ステージとは異っているようなのでオススメできません。

(2)現在の残弾から火器管制データセットを検索し、「攻撃力」を確保。

最も簡単に任意の値を設定できる攻撃力を起点にします。
衝撃は8bitなので検索の起点にするには絞り込む余地が少ないのでここでは攻撃力を採用しました。

(3)攻撃力に16bitの個性的な任意の数値(例えば12321)にセット。

検索で絞り込みやすいように他に使われていなさそうな値を代入します。9999や16の倍数などは絞り込みにくいです。
大抵の場合大きい値ほど絞り込みやすいことが多いです。

(4)単発の射撃を行い、弾が消滅する前にセットした攻撃力を検索。マップ中で移動処理中の弾のデータを確保。

結果論ですが弾速はxyz軸それぞれに分配されて目的のデータ群に格納されています。つまりx軸に平行に射撃することで
x軸のみに分配されるため弾速と同じ数値が得られます(最初はデータ群を見つけてから試し撃ちしてデータ構造を調べましたがここでは割愛します)。
x軸に平行に開幕するステージ(多分すべてのステージがそうなっている)で、一切動かずにかつロックせず(ロック距離を“0”に固定しておくと楽)に射撃して、設定した攻撃力を検索します。

以下も結果論ですが、弾の移動処理のデータ群は弾1発づつにそれぞれ割り当てられますが、マップ中に1発しか弾が無い場合には常に同じアドレスに当てられます。
複数の弾があると後ろへ団子のようにつながって割り当てられていきますが、1発目が消滅すればその後に撃った弾がその場所に割り当てられます。
したがって、敵弾があると目的のアドレスが占有されてしまうので注意が必要です。
またこの結果、一回の検索で目標が絞り込めない場合には攻撃力を変えて繰り返すことで絞り込みが可能です。

参考までにMAでの対象のデータ群の構造は以下の通り(全て16bit)です。弾速付近以外は細かく調べていません。



・弾寿命(f)
・不明
・不明
・攻撃力
・衝撃
・カテゴリ内ID
・不明
・x軸速度
・z軸速度(x軸速度)
・y軸速度(z軸速度)
・(y軸速度)

前後に描画関連のデータ群があります。
各軸速度はどういうわけか精密予測武器及び肩キャノンは16bit下流へずれて代入されています(カッコ)。

※ほかには弾速の遅いものを選んで前述したタイマーと弾寿命(1fに1減少する)を起点に検索する方法もあります。
※余談ですがブレード光波の移動処理もにたような構造のデータを当てられる(アドレスは射撃武器とは異る)ているので
同じような手順で検索できますが、LS−1000Wの空中攻撃力はしっかり設定値の3倍になっています。

(5)移動処理中の弾のデータ内から弾速を抜き出す。

x軸に平行に射撃できている場合にはx軸速度が弾速とほぼ同等と考えてかまいません。場合によっては他の軸速度に僅かに分配されてしまい
どうしても1〜2程度ずれてしまう場合もあるかと思いますが、この手のパラメータは多くの場合きりのいい数値か16の倍数等の値となっていることが多いです。
たとえば“898”だったら“896”か“900”の可能性が濃厚でしょう。“448”であれば16の倍数なのでそのままが正しいと思われます。

そして全てのパーツを一つづつ調べるのは手間がかかるし、拡散タイプはランダムに分配されてしまうので正確な弾速が得られず、
弾速の他にも有用なパラメータが一群をなしているという期待もあるので参照もとのデータを調べるべく絞り込み検索に有利なできるだけ弾速の速いRF/Eの弾速を抽出します。

(6)システム画面から戦闘画面で変化したアドレスから任意の弾速を検索

システム画面では弾速はメモリ上に割り当てられていないため、そこから戦闘画面へ移行した後にRF/Eの弾速“2700”に変化したアドレスを検索します。
ゲーム開始前からの変化で検索してもある程度絞り込めますが件数がだいぶ増加してしまう場合があります。

PSACの場合は幸い“2700”という数値は数個しかヒットしないので楽に特定できます。“900”などは結構多いので
数十件ヒットしてしまいます(弾速のあとは散開角度0が入るので32ビットで検索すると数個になります)が、その検索結果内に目的のアドレスがあるかどうかはそれを変更して射撃すれば判ります。
極端には検索結果を一括して例えば“100”にしてしまって該当武器を射撃して弾速が遅くなればその中に必ずあるということになりますが、
残念ながら値を変更するとクラッシュしてしまう場合があり、弾速のデータ付近に他にどんな値があるかも事前に判っていないため
特定するにはある程度しらみつぶし的な作業が必要になります。もしクラッシュしないようなら1回の操作で対象を1/2に減らせるので楽に見つけることができます。

(7)イモヅル式に発見。

対象の弾速がみつかれば他のパーツの弾速はその一群の中にデータセットを形成して順番に配置されています。
大抵の場合には同じような構造と考えていいと思います。PSACでは弾IDという形で順列を暗に示してくれているので比較的容易に他の弾速を特定することができます。
確証はありませんが別シリーズでも似たような手順で弾速を調べることができると思います。

○弾グラフィック関連のデータセット及び配列。

 武器関連のデータの扱い。

(1)ガレージでの武器アセンブル。設定されているパラメータは攻略本とほとんど同じ。
 戦闘に移行する際にこのデータと各パーツパラメータ及びCDを参照してそれぞれのデータセットが生成される。
(2)機体構成データセットの武器。(戦闘中は変更しても反映せず)
(3)火器管制データセット。弾ID及び各武器の設定(上記の火器管制データセットを参照)
(4)機体挙動関連のアセンブルデータ。(アドレス不明のため未調査)
(5)個別の武器データ関連。弾IDから系列ごとのデータを参照。
 例えば弾ID“25”の場合には20系データセット内の5番目に配列されたデータセットを参照。
 暫定的に弾IDと表現しているが実際には火器管制データセットで設定されているのは「武器ID」でその武器IDが実際の弾データを参照している構造になっている。
 射撃武器の場合には武器IDと弾IDに順列の違いが無いため同じものとして説明できるが、ミサイルの場合には順列が異るので注意。(詳しくは未調査)
(6)弾系列ごとのデータセット。各弾の描画関連のデータが戦闘に移行する際に生成される。弾速、拡散角度、色、グラフィック種別、爆風ID等。
(7)各弾IDが参照する爆風関連のデータ。爆風タイプ・継続時間・初期爆縮サイズ・速度・周期・威力減衰・エフェクト関連他。
(8)(6)の参照する描画関連のデータ。(構造が不明なため未調査)

 以上のように各武器のパラメータは参照先が細かく分岐しており、調べても意味のないものや構造が不明のものが多いので(3)と(6)で十分。
(6)〜(8)のデータセットは不明なデータ群や0の羅列を挟んで一群をなしており配列は以下のとおり

・0の羅列
・不明なデータ群
・「「0系」」
・不明なデータ群
・「「キャノン」」(チェーンガン・実グレ・Eグレ及び敵専用?、他の弾は20系〜60系に配置)
・描画関連(この辺は変更すると弾や爆風の描画がにバグる)
・0の羅列
・描画関連
・0の羅列
・描画関連
・0の羅列
・不明なデータ
・「「60系」」
・0の羅列
・「「90系・70系」」
・0の羅列
・「「20系」」
・0の羅列
・不明なデータ
・「「40系」」
・0の羅列
・不明なデータ群
・「「ミサイル」」
・「「爆風」」
・0の羅列
・「「機体データ」」(機体構成データセットとほとんど同じ構造、変更しても戦闘中には反映しないが未調査)
・0の羅列

 不明なデータ群や描画関連は調べてない。

そしてそれぞれのデータセットの検索方法は以下の通り

○0系データセット

 精密射撃武器のみ他の系列とはやや離れた位置に配列されており、前後に構造不明なデータ群を持つ。
 戦闘移行後に32bitで“8323772”をデータサーチ、16bitに変換した“700”“127”が0系の二番目ID1(MGA1)の弾速及び拡散角度(0系先頭は拡散角度が0のため32bitでは700で検索することになりヒット数が多すぎるので)。
 0系の配列データ長は弾一種類につき“28Byte”で連続配置されている。

○20系データセット

 戦闘移行後に32bitで“25101008”をデータサーチ、16bitに変換した“720”“383”が20系の三番目ID22(HG1等)の弾速及び拡散角度(20系先頭は拡散角度が0のため32bitでは800で検索することになりヒット数が多すぎるので)。
 20系の配列データ長は弾一種類につき“40Byte”で連続配置されている。

○40系データセット

 戦闘移行後に32bitで“7864768”をデータサーチ、16bitに変換した“448”が40系先頭のID40(Sロケ等)の弾速。
 40系の配列データ長は弾一種類につき“36Byte”で連続配置されている。
 データ配列には拡散角度を含まない、また弾速から弾速アドレスから“23Byte”の位置に爆風ID(8bit)がある。他は調べていない。

○60系データセット

 戦闘移行後に32bitで“2098052”をデータサーチ、16bitに変換した“900”“32”が60系三番目のID62(XC65)の弾速及び拡散角度(60系先頭は拡散角度が0のため32bitでは900で検索することになりヒット数が多すぎるので)。
 60系の配列データ長は弾一種類につき“24Byte”で連続配置されている。

データ構造(16bit)
・弾速
・散開角度
・弾グラフィック幅
・弾グラフィック種別
・不明
・“0”
・不明
・不明
・Rレッド値(8bit),Gグリーン値(8bit)
・Bブルー値(8bit),常に“0”(8bit),
・不明
・不明

不明値は調べていない

○70系・90系データセット

 戦闘移行後に32bitで“4194374”をデータサーチ、16bitに変換した“70”“64”が70系先頭のID70(爆雷)の射出速度及び不明値。
 70系の配列データ長は弾一種類につき“28Byte”で連続配置されている(3パーツ分)。

 90系のアドレスは上記ID70の射出速度から“44Byte”前方、値“200”はID90(機雷)の射出速度。
 90系の配列データ長は弾一種類につき“22Byte”で連続配置されている(2パーツ分)。

90系配列
・初速
・加速度(※負の値をとる)
・判定サイズ
・振幅
・爆風ID(8bit),常に“0”(8bit)
・寿命
・判定発生カウンタ
・xサイズ
・zサイズ
・yサイズ

 爆雷データは操作して分かりやすく反映できる値が多いので結構面白い。
 初速は発射速度、加速度は初速から各フレームで加速する値で実際には減速するためマイナスの値をもつ。(254,255)で“ー1”けっこう無理やりっぽい。
 判定サイズは確証はないが恐らく円柱。振幅は上下垂直運動の幅のようだ。爆風IDは8bit。
 寿命は発射から自動爆破までの時間(f)、判定発生カウンタは射出後にエンカウント判定を開始するまでの時間(f)。
 サイズは各成分で単位は不明、元の値はそれぞれ“1280”おそらく移動処理をするために速度値の単位に換算してある。つまり距離の64倍。
 2パーツ目は敵専用爆雷。

70系配列
・初速
・不明
・寿命
・発射数
・散開角度
・不明
・Rレッド値(8bit),Gグリーン値(8bit)
・Bブルー値(8bit),爆風ID(8bit),
・0
・以下着弾エフェクト

○キャノンデータセット

戦闘移行後に32bitで“2097652”をデータサーチ、16bitに変換した“500”“32”が肩キャノン系先頭のID0(CN35)の射出速度及び発射反動。
尚、検索で同値が複数ヒットするがほとんど一連のデータ群。
肩キャノン系の配列データ長は弾一種類につき“6Byte”で連続配置されており、弾グラフィック関連は他の系列に分散配置されている。

・弾速(16bit)
・発射反動(16bit)
・連射フラグ(8bit、“0”で連射不可、“1”で連射可)
・不明値(8bit、GN230のみ固有値をもつ)

○ミサイルデータセット

戦闘移行後に32bitで“3932210”をデータサーチ、16bitに変換すると“50”“60”となる。それぞれミサイルID1(小ミサ)の推進寿命と弾薬寿命。
ミサイルのみ火器管制データセットに設定された弾IDとは順列が異る。実際には火器管制データのIDが個別武器関連のデータセットを参照し
そこからさらにミサイルデータセットを参照するという構造になっている。火器管制データセットでは参照先のID指定のみ、
武器関連のデータセットで射出角度や初速等の設定していると推測され(未調査)、このミサイルデータセットで弾頭の運動性能や描画関連のデータを配置している。
配列データ長はミサイル一種類につき“40Byte”で連続配置されている。

ミサイルデータセットの構造

・推進寿命(16bit)
・弾薬寿命(16bit)
・尾グラフィック種類(16bit)
・尾グラフィック太さ(16bit)
・弾グラフィック種類(16bit)
・弾頭推進光(16bit)
・加速度(16bit)
・最大速度(16bit)
・旋回速度(16bit)
・以降描画関連(色・エフェクト等)

推進寿命は弾頭が推進できる限界時間で単位はフレーム。寿命後は自由落下する。落下中もエンカウント判定を維持する。
弾薬寿命は推進開始から自爆までの時間。推進寿命より短い場合には推進中に自爆、長い場合には自由落下中に自爆する。
尾グラフィックの種類はおそらくテクスチャの指定。
尾グラフィックの太さは幅のみの指定。もともと立体ではなく平面。
弾グラフィックの種類は弾頭の形状指定。別に生成されているグラフィックデータの参照先と思われる。
弾頭推進光は弾頭後部のブースターの発光の強さ。したがって推進中のみ適用される。
加速度はフレームごとに弾頭の向いている方向に加速される値。尾の長さはこの値に比例する。
余談だが推進寿命末期には推進煙が弱くなり瞬きながらきえてゆく。加速度が実際に弱くなっているかは不明。
最大速度は弾頭速度の上限値。水平と垂直方向の速度は独立しているかは未確認。
旋回速度はフレームごとに弾頭が旋回できる最大の角度。単位は内部角度で“512”で実際の45°に相当する。
また現在位置ではなく予測位置へ旋回する、これは弾頭の速度を極端に遅くすると移動目標のはるか前方へ旋回することでも確認できる。
なお、推進末期は旋回しなくなると思われる(未確認)。
描画関連はエフェクトの種類やその色。色の指定はRGBごとに8bit(上限255)で指定。
爆風IDは参照する爆風データセットの配列順のID。

○爆風データセット

戦闘移行後に32bitで“6557490”をデータサーチ、16bitに変換すると“3890”“100”となる。
この“3890”が爆風ID1(光波ブレ等)のヘッダで8bitに変換して“50(爆風タイプ)”“15(継続時間)”。 
爆風は各弾データのグラフィック種が個別に参照しているデータで、爆風の処理関連のパラメータが格納されている。
配列データ長は爆風一種類につき“46Byte”で連続配置されている。

爆風データセットの配列(詳しくは調査していない)

・爆風タイプ(8bit)
・継続時間(8bit)
・爆縮開始サイズ(16bit)
・爆風速度(16bit)
・周期速度(32bit)
・威力減衰値(16bit)
・威力減衰値(16bit)
・以降描画エフェクト関連

爆風タイプは詳細不明、ほとんどの爆風が“50”に設定されているが設定例のない数値にすると着弾と同時にフリーズするので
おそらくなんらかのID(ID関連は参照先が存在しないとフリーズする)。
継続時間は爆風が発生している時間で単位はフレーム。
爆縮開始サイズは爆風発生時の爆風球体の初期サイズで単位は不明。ここからいったん爆縮し半径が0に達すると膨張へ転ずる。
爆風速度は発生直後の爆風の初速で単位は不明(弾速などとは異る単位)。
爆風の速度は最終的に周期速度に収束するため発生直後の爆風の爆縮膨張速度に関係する。したがって爆風速度が早いほど結果的に爆風半径は大きくなる。
周期速度は爆風が膨張と収縮を繰り返す周期で単位は不明。値と周期は反比例しており大きいほど周期速度が遅くなり、
設定されている継続時間の間この周期にしたがって膨張と収縮を繰り返す。したがって周期速度が早いと結果的に爆風半径は小さくなり遅いと半径が大きくなる。
威力減衰値は詳しくは不明。係数なのか種類設定なのかも解っていない。値によっては攻撃力が0の弾でも爆風の1撃であらゆる機体を撃破する。
爆風関連のデータの調査は爆風半径を調べることを目的としていて、設定値が距離に換算できないことがわかったので詳しくは調査していない。
したがって一部で説明されている爆風レベルというパラメータは存在せず、距離という単位で説明できない。

○戦況関連データセット

戦闘中にAP、安定性、機体座標、速度値、機体サイズなどが格納されているメモリ周辺のデータ配置。
検索は現在APで探す場合はモニタ表示数値の4倍、天井が高いステージであれば空中から落下して
最大速度に達したあたりで最大落下速度“9600”をキーワードに。
なお、垂直方向には速度振幅はないが水平方向には速度に振幅が発生するので注意。
バイト値はデータ同士の間隔、間は不明なので省略。あとに続いてCPUもしくは2P機、構造は同じ。

データの配列は以下のとおり(すべて16bit)。間のものは詳しく調べていないがいろいろ発掘できるかも、適当に代入すると空中で宙返りしたりロック状態が変わったりする。
つまりプログラム状はACは横になることができるらしい。

・機y座標
・機z座標
・機x座標
・0
・0
・旋回角度
+22byte

・機体実半径
・機体実全高
+26byte

・常に“0”?(8bit),動作ID(8bit)
・動作関連 不明(8bit),常に“0”?(8bit)
+44byte

・機体被弾半径
・機体被弾半径
・動作カウンタ
・動作関連不明知(動作カウンタ稼働時と空中で“1”それ以外で“0”他不明)
+92byte

・y軸速度
・z軸速度
・x軸速度
・硬直カウンタ
+142byte

・現在AP
・最大AP
・機体安定性

続CPUデータ

座標軸はx軸が北、y軸が東方向が正の値となる水平方向、z軸は下向きが正の値となる垂直方向。座標は水平が機体中心、垂直が円柱底面(接地時は“ー1”)。
速度と同じ扱いをうけるものに下にある速度値以外に、この座標が1f間に変化した量をモニタしているらしい。二脚系通常歩行からのブースト適用時はそこから速度値に換算される。
また衝撃加速度と被弾側の機体の挙動の相互関係は速度値ではなく座標の変移になっている(ブレード衝撃で確認)。
旋回角度はx軸正方向(北)が0、一周で4096、直角で1024。

機体実サイズは戦闘中変化しない。ブレードホーミングの追跡起点がこの円柱の中心。大きくすると二脚系でも着地せずに連続へにょ可能。
また、各機体の限界速度の元データとなっており戦闘中にこれを変更すると限界速度が増大する。解析時の速度調整にはこれが便利。
地形や障害物とのエンカウントはこちら。

動作IDは現在の動作状態を格納するアドレス。通常歩行やブースト、着地硬直、ジャンプ予備動作などなど。
動作関連は調べていない。多分動作IDの補助的な役割。

機体被弾サイズは開幕時は機体実サイズと同じ、開幕後移動などを行うと運動特性マニで示した数値に変化、それ以降は二脚系の射撃姿勢を除いて変化せず。
射撃、ミサイルの予測基準。機体同士のエンカウントはこちら。動作カウンタは規定動作の際に0からカウント、動作終了後0に戻る。つまりカウンタを監視すると動作の要求時間がわかる。
通常歩行、着地硬直、ジャンプ予備動作、ブレホ、地上ブレードなど。
動作関連不明値は上記の動作カウンタ稼働時に1が代入されるが空中でも1で、地上や停止時は0。不明。

速度は運動性能値の加速度にしたがって与えられる速度値のアドレス。ここに速度を代入すると次のフレームでその数値にしたがって座標が変わる。
入力後2fにこのアドレスに数値が代入される。したがって入力・代入・反映という手順をとるので速度が関わる処理は操作から
反映までに2fある(入力fは厳密には前のfで入力操作でついで受理となるので、ただし連続動作が可能なものは入力fが前動作の最後のfになるので1fスキップされるっぽい)。
あたりまえだけどこれが最短だよね。どうして内部タイマーから2f遅れるのかきがつかなかったね。
旋回速度独立したアドレスではなく各絶対軸に一定の割合の数値を配分しているようだ。x軸速度とy軸速度に旋回速度値を加算して代入し、
垂直速度に同旋回速度値の1/6を代入?。なんでこれで旋回と移動が競合しないんだ?
硬直カウンタは着弾した瞬間に算出された硬直時間が代入されカウントダウン。最大5で0になったフレームで硬直が解除される。
二脚系も算出される数字が代入されるが、地上にいると1f後に0にリセットされる。

APはモニタ表示の4倍。4おきにしか数値をとらない。誤差のときは4の倍数以外とも思ったが違った。最大APはレッドシグナルに関係するかな?
機体安定性に代入される数値は6.25きで最大1593だけど任意の数値でも反映されるため衝撃255まで無効化できる。0で完全無効化。


戻る