ドラえもん きみとペットの物語 戦闘中の状態を表すメモリアドレス
- キャラクター毎の状態を表すメモリアドレス
- 全般的な事項
- メモリの値が表すデータの詳細・補足・バグ等
- 0x00 キャラクターID
- 0x02 顔アイコン
- 0x03 レベル
- 0x0D~0x0F 武器、防具、その他の装備
- 0x10~0x11 現在HP
- 0x12~0x13 現在BP
- 0x16 使える特技の数
- 0x1C~0x1D 装備のすばやさ上昇量
- 0x20 敵の種類
- 0x21 状態異常
- 0x22 生存・存在判定
- 0x23~0x25 選択済みの行動
- 0x27~0x28 表示座標
- 0x29~0x2C 倒して得られる経験値
- 0x2E 所持しているカードの番号
- 0x2F~0x30 敵の名前
- 0x34 被対象フラグ
- 0x3C~0x3D 受けるダメージや回復量
- 0x3E 攻撃された時に受ける状態異常
- 0x3F~0x44 ステータスの変化量
- 0x45 スモールライトの残りターン数
- 0x46 休み判定
- 0x48~0x49 与える/受けるダメージの追加割合(十分率)
- 0x51 特殊装備フラグ
- 0x52 追加回避率
- 0x53~0x54 ターン終了時のHP/BP回復量
- 0x55 状態異常への耐性
- 不明について
- 全体の状態を表すメモリアドレス
- 解析方法
- 更新履歴
キャラクター毎の状態を表すメモリアドレス
戦闘中のキャラクターの状態は敵味方共に87(0x57)バイトで表される。キャラクターとメモリアドレスの対応を以下に示す。
キャラクター | アドレスの範囲 |
---|---|
仲間1人目 | 0xD43D~0xD493 |
仲間2人目 | 0xD494~0xD4EA |
仲間3人目 | 0xD4EB~0xD541 |
敵1体目 | 0xD542~0xD598 |
敵2体目 | 0xD599~0xD5EF |
敵3体目 | 0xD5F0~0xD647 |
最初のアドレスから何バイト目であるかが、どのようなデータであるかを表しており、 それは敵でも味方でも変わらない。87バイトの中での相対的なアドレスと、そこに格納される値が何に利用されるかは以下の通り。
アドレス | 内容 |
---|---|
0x00 | キャラクターID |
0x01 | 不明 |
0x02 | 顔アイコン |
0x03 | レベル |
0x04~0x05 | 最大HP |
0x06~0x07 | 最大BP |
0x08 | ちから |
0x09 | まもり |
0x0A | すばやさ |
0x0B | うん |
0x0C | 不明 |
0x0D | 武器 |
0x0E | 防具 |
0x0F | その他の装備 |
0x10~0x11 | 現在HP |
0x12~0x13 | 現在BP |
0x14~0x15 | 次のレベルまでの経験値 |
0x16 | 使える特技の数 |
0x17 | 友情ポイント |
0x18~0x19 | 装備のちから上昇量 |
0x1A~0x1B | 装備のまもり上昇量 |
0x1C~0x1D | 装備のすばやさ上昇量 |
0x1E~0x1F | 装備のうん上昇量 |
0x20 | 敵の種類 |
0x21 | 状態異常 |
0x22 | 生存・存在判定 |
0x23 | 選択済みの行動内容 |
0x24 | 選択済みの行動内容詳細 |
0x25 | 選択済みの行動の対象 |
0x26 | 不明 |
0x27 | 表示X座標 |
0x28 | 表示Y座標 |
0x29~0x2A | 倒して得られる経験値 |
0x2B~0x2C | 倒して得られる宝石 |
0x2D | ドロップアイテム |
0x2E | 所持しているカードの番号 |
0x2F~0x30 | 敵の名前 |
0x31~0x33 | 不明 |
0x34 | 被対象フラグ |
0x35~0x3B | 不明 |
0x3C~0x3D | 受けるダメージや回復量 |
0x3E | 受ける状態異常 |
0x3F~0x40 | ちからの変化量 |
0x41~0x42 | まもりの変化量 |
0x43~0x44 | すばやさの変化量 |
0x45 | スモールライト有効ターン数 |
0x46 | 休み判定 |
0x47 | 不明 |
0x48 | 受けるダメージの追加割合(十分率) |
0x49 | 与えるダメージの追加割合(十分率) |
0x50 | 不明 |
0x51 | 特殊装備フラグ |
0x52 | 追加回避率 |
0x53 | ターン終了時のHP回復量 |
0x54 | ターン終了時のBP回復量 |
0x55 | 状態異常への耐性 |
0x56 | 攻撃時に付加する状態異常 |
例えば、0x08が力を表しているというのは、 仲間1人目の力は0xD445に、仲間2人目の力は0xD49Cに、 敵1体目の力は0xD54Aに、その値が格納されているということである。
全般的な事項
味方の「倒して得られる経験値」や敵の「装備している武器ID」などの使われない部分は、 データが0x00で埋められているが、 敵の「装備のちから上昇量」などメモリの値を改竄すれば機能する(この場合は値の分だけ攻撃時のダメージが上がる)部分もある。
2バイトのデータのバイトオーダーは全てリトルエンディアン。 例えば、現在HPはアドレス0x10~0x11に格納されているが、 値が999(0x03E7)の場合、アドレス0x10に値0xE7、アドレス0x11に値0x03が格納されている。
上記の表は戦闘中の状態を表すアドレスであり、 戦闘時以外に値を改竄してもステータス等は変わらない。 ただし、戦闘終了後はステータスにも戦闘中の値が適用されるものがある。
非戦闘時のキャラクター毎の状態は32(0x20)バイトで表され、 先頭のキャラから順に、アドレス0xD8AD~0xD96Cに格納されていると思う。
メモリの値が表すデータの詳細・補足・バグ等
0x00 キャラクターID
キャラクター | 値 |
---|---|
主人公男 | 0x01 |
主人公女 | 0x02 |
ドラえもん | 0x03 |
のび太 | 0x04 |
ジャイアン | 0x05 |
スネ夫 | 0x06 |
しずか | 0x07 |
敵 | カード番号-140(例外は後述) |
ジーブルのカード番号は197だが、IDは57ではなく63。 また、カードは200までしかないが、敵のIDは72まで存在する。しかし、IDが57と65の敵は存在しない。 ID61~72の敵は以下の通り。
ID | 名前 | 出現場所 |
---|---|---|
61 | エイプ | ジャングル星 |
62 | リザド | デザード星 |
63 | ジーブル | サバンナ星 |
64 | いぬへいし | サバンナ星 |
66 | ねこへいし | ハイランド星 |
67 | いぬへいし | アニマリアン星 |
68 | てんちょう | 巨大戦艦 |
69 | ロボットへいし | シンジケートボスと共に出現するもの |
70 | なぞのゆーふぉー | エイプと共に出現するもの |
71 | とげとげボール | リザドと共に出現するもの |
72 | かえんとかげ | ジーブルと共に出現するもの |
0x02 顔アイコン
戦闘開始時に決まるので戦闘中に書き換えても効果は無い。
0x03 レベル
特技のダメージ計算に用いられる。 特技で与えられるダメージの最小値は、小数切捨(レベル×3.5) + 特技に設定された威力。
使える特技の判定には用いない。
0x0D~0x0F 武器、防具、その他の装備
それぞれ装備のIDが格納されている。 武器は攻撃時のエフェクトを決めるのに利用されている。
しかし、装備によるステータスの変化量、特殊装備フラグ、状態異常耐性は他のアドレスに 格納されている為、他に何に利用されているのか分からない。
0x10~0x11 現在HP
最大HP1000以上の敵も出現時のHPは何故か999である。最大HP1000以上の敵は以下の通り。
キャラクター | 最大HP |
---|---|
モケモケ | 1200 |
ガオー | 1100 |
なぞのたまご | 2800 |
ラムー | 3800 |
てんちょう(2戦目) | 1000 |
シンジケートのボス | 2750 |
もし出現時のHP制限が制作者の意図しないものであったとすると、 本来想定していたバランスのラスボスと終盤の隠しボスは実際より大幅に強いかも知れない。
モケモケは戦闘中に回復してHPが1200になることを確認している。
0x12~0x13 現在BP
敵にもBPがあり、通常攻撃以外を行うと消費する。消費量は確認した限り全て1。
0x16 使える特技の数
アドレス0x00に格納されるキャラクターIDから基準となる特技IDが決定され、 アドレス0x16は基準となる特技を含めてIDが隣接する特技をいくつ使えるかを表す。 例えば、基準の特技IDが0x09で、アドレス0x16の値が0x04の場合、 特技IDが0x09、0x0A、0x0B、0x0Cである4つの特技を使用できる。
特技に付されるIDは、とおる→あすか→ドラえもん→のび太→ジャイアン→スネ夫→しずかの順に大きくなっているので、 メモリの値を適切に大きく改竄すれば、他キャラクターの特技を使用できる。
しずかの特技より後はデバッグ用と思しき友情攻撃、敵専用と思われる特技、空白などが並んでいる。 しかし、これらの特技を参照できるほど大きな値を入れると、 カーソル位置によって、スクロール処理だけで時間がかかったり、表示がおかしくなったりする上、 本来自分が使える特技を使う、ヘルプの開閉等の些細な操作でフリーズする。
0x1C~0x1D 装備のすばやさ上昇量
0x0Aに格納されるすばやさは行動順、クリティカル率、回避率、逃走成功率の決定に用いられるが、 装備による上昇量はこのいずれにも影響を与えない。 恐らく全く機能していない。
0x20 敵の種類
仲間は0x00。ザコ敵は0x01。ボス敵は0x02。
値が0x01または0x02である場合、アドレス0x2F~0x30を用いて名前を表示するようになる。
0x02の敵は、毒、麻痺、眠り、休みなどが成功した場合に「まったくうけつけない」
値が0x02なのは、あしミミズ、あるくせきぞう、エイプ(1戦目)、エイプ(2戦目)、ガオー、ジーブル、シンジケートボス、てんちょう(1戦目)、てんちょう(2戦目)、なぞのたまご、まほうつかい、ラムー、リザド(1戦目)、リザド(2戦目)の14体。 あるくせきぞう、まほうつかいは通常エンカウントに含まれるが0x02であり、モケモケは固定戦闘だが0x01。
0x21 状態異常
下位から数えて1ビット目が毒、2ビット目が眠り、3ビット目が麻痺、4ビット目が混乱1、5ビット目が混乱2、6ビット目が封印を表しており、0b1の時に有効。 例えば毒と封印を同時に受けている時、0b00100001 = 0x21となる。 ここ以外も状態異常はこの方法で表現されている。
ちなみに、スネ夫がくちからでまかせで付加するのは混乱1、くちぐるまで付加するのは混乱2であり、別のものである。 なお、混乱1と混乱2の効果の違いは確認できていない。
0x22 生存・存在判定
0x01だと生存・存在している。0x00だと生存・存在していない。 敵の場合、倒した・逃げた次のターンに値が更新される。
0x23~0x25 選択済みの行動
アドレス0x23には選択した行動によって次の値が格納される。
行動 | 値 |
---|---|
こうげき | 0x01 |
とくぎ | 0x02 |
どうぐ | 0x03 |
ぼうぎょ | 0x04 |
にげる | 0x05 |
ゆうじょう | 0x06 |
アドレス0x24には、選択した行動が特技、道具、友情であった場合、そのIDが格納される。
アドレス0x25は行動の対象によって次の値が格納される。敵の場合、敵と仲間が反対になる。
対象 | 値 |
---|---|
先頭の仲間 | 0x00 |
2番目の仲間 | 0x01 |
3番目の仲間 | 0x02 |
仲間全体 | 0x04 |
左から1番目の敵 | 0x80 |
左から2番目の敵 | 0x81 |
左から3番目の敵 | 0x82 |
敵全体 | 0x84 |
アドレス0x23~0x25の値はターン開始時に0x00に戻るが、キャンセルしても値が変化しない。 例えば、特技を選んでキャンセル→防御を選び直すと、アドレス0x24~0x25に値を入れたまま防御を実行する。 バグがあれば悪用できそうな気がする、
0x27~0x28 表示座標
敵だけ有効。右下に向かうと値が大きくなる。 Y座標は確認した限り全て0x04であった。
0x29~0x2C 倒して得られる経験値
仲間の場合0x0000であり、値を改竄して気絶した状態で戦闘を終えても経験値や宝石は得られなかった。
0x2E 所持しているカードの番号
0xFFはカードを所持していないことを表す。
0x2F~0x30 敵の名前
この値は名前そのものを表現している訳ではなく、何らかの変換がなされたアドレスであり、 値が1大きくなると参照するアドレスも1大きくなると思う。 名前を表示する時は、この値が表すアドレスを参照し、 そこから終了の意味を表す値を見つけるまでの値を文字として解釈し、名前として表示しているんだと思う。 このような仕組みだと考えているのは、 ある名前が表示されている時、 この値が1大きくなると先頭の文字が1つ減り、 この値が1小さくなると先頭に文字が1つ追加されるか何も表示されなくなるという挙動による。 例えば、この値が0x724Eだと「おおこうもり」と表示するが、 0x7251にすると「うもり」に、0x7249にすると「■/゙//おおこうもり」と表示される。
参照先のアドレスに並ぶ敵の名前は、アドレス0x00に格納されるID(あるいはカード番号で考えても良い)の順になる。 ある敵の名前が表示されている時、この値に、敵の名前の文字数(濁点と半濁点は1文字として数える)+0x17を加えると、 IDが1つ大きい敵の名前が表示されるようになる。 例えば、「ていさつボール」を表示する値は0x71D3であり、 「ていさつボール」は8文字なので、0x08 + 0x17 = 0x1Fを加えて、 値を0x71F2にすると「したっぱへいし」と表示される。
IDが57と65の敵はそれぞれ存在しないと述べたが、 メモリの値を改竄して相当する部分の名前を表示した所、「ジーブル」と「いぬへいし」であった。
確認した限り正常に名前を表示する時の開始アドレスの6つ前にアドレスに終了記号があり、 敵の名前間のデータの長さが0x17で固定なので、 この値が参照するデータ群には、名前の表示以外に使われるデータも含まれているのかも知れない。
ていさつボールを表示する値より小さな値を入れてみると地名などを出せることを確認している。 敵以外の名前の表示でも同じ仕組みが使われているようだ。
0x34 被対象フラグ
攻撃を受ける時などに0x01になっている。
0x3C~0x3D 受けるダメージや回復量
計算用の値を一時的に格納しているだけだと思う。
0x3E 攻撃された時に受ける状態異常
これも計算用に一時的に格納しているだけだと思う。
0x3F~0x44 ステータスの変化量
特技や道具によるステータスの変化量を格納している。運の変化は無い。
負数も表す。2の補数表現だと思う。
名前の横にステータス変化のアイコンが表示されるかはこの値で決まる。
ドラえもんのスモールライトが成功してもちからの変化量は変わらない。 ダメージ計算式に直接分岐が作られていると思う。
0x45 スモールライトの残りターン数
スモールライトが成功すると対象のアドレス0x45の値が0x02になる。 値が1以上の時、攻撃で与えるダメージが小さくなる(計算式不明)。 ターン経過毎に1減少する。
0x46 休み判定
しずかのおねがいを使うと0x02になり、「みうごきができない!」ようになる。
0x48~0x49 与える/受けるダメージの追加割合(十分率)
例えば0x05が入っていると与える/受けるダメージが2倍になる。 値が大き過ぎると無効。 アドレス0x48は通常攻撃で一度ダメージを与えると0x00に戻る。 アドレス0x49は一度ダメージを受けると0x00に戻る。
のび太→ドラえもんの友情でアドレス0x48に0x05が、 スネ夫←→のび太の友情でアドレス0x49に0x0Aがセットされる。 スネ夫とのび太の友情技は受けるダメージを軽減するとヘルプが表示されるが、実際には2倍になっている。
0x51 特殊装備フラグ
下位から数えて1ビット目がみがわりのいし、3ビット目がひっさつヨーヨーであることを確認している。
0x52 追加回避率
通常の回避率は、攻撃の主体の素早さと対象の素早さの差で決まるっぽい(計算式不明)が、 ここに値が入っていると回避率が高まる(計算式不明)。 0x60くらいで攻撃が当たらなくなる。
0x53~0x54 ターン終了時のHP/BP回復量
ターン終了時のHP回復量とBP回復量が共に0x01以上の時、 実際のBPの回復量はHPの回復量を足したものになる。 例えば、勇気の印はターン終了時にBPを5回復するが、 毛皮のTシャツ(ターン終了時HP15回復)と同時に装備するとターン終了時にBPが20回復するようになる。 恐らく、ターン終了時のHP回復後にアドレス0x3C~0x3Dを0x00にする処理が無く、BP回復時に加算を行っている。
0x55 状態異常への耐性
0b1なら対応する状態異常を無効化。値がどの状態異常を表すかはアドレス0x21の項を参照。 状態異常耐性のある装備をしていると値が入る。きせきのおまもりだと0x3F。
敵は確認した限り全て0x00。 値を改竄して耐性を付けてみると、その状態異常を付加する特技が成功した時、 何のメッセージも表示されずに無効化される。
不明について
何に利用されているかが分からないのに加え、 思いつく通常の操作で変化しない、 何のために存在するのか分からない等の特徴がある箇所を不明とした。
まずはキャラクター毎に固有の値を示すと考えられるものを以下に示す。 装備やレベルによる変化も、戦闘中に書き換わることも確認できなかった。
キャラクター\アドレス | 0x01 | 0x0C |
---|---|---|
主人公男 | 0x13 | 0x00 |
ドラえもん | 0x19 | 0x03 |
のび太 | 0x1C | 0x02 |
ジャイアン | 0x1F | 0x04 |
スネ夫 | 0x00 | 0x05 |
しずか | 0x00 | 0x06 |
敵 | 0x01 | 0x00 |
次に敵味方で値が異なるものを示す。
種類\アドレス | 0x26 | 0x31 | 0x32 |
---|---|---|---|
味方 | 0x06 | 0x00 | 0x00 |
敵 | 0x01 | 0x01 | 0xA8 |
アドレス0x35の値は最初0x00で、1ターン経過後0xFFになる。
アドレス0x33、0x36~0x3B、0x47、0x50は値を0x00以外確認できていない。
隣接するアドレスのデータが表す内容から考えると、 0x36~0x3Bは計算用の値を一時的に格納してそうだし、 0x47、0x50は特殊な装備や状態に関連しそうだと思う。
全体の状態を表すメモリアドレス
0xD648以降、キャラクター毎の情報とは別に、戦闘全体の状態を表している部分がある。 まだ範囲も分かっていないけど分かったことだけ書く。
アドレス | 内容 |
---|---|
0xD648 | 実行中の行動内容 |
0xD649 | 実行中の行動詳細 |
0xD64A | 実行中の行動の対象 |
0xD64B~0xD64C | 戦闘勝利時に得られる宝石 |
0xD64D~0xD64E | 戦闘勝利時に得られる経験値 |
0xD65C | ひらりマントの効果対象 |
0xD65D | ひらいマントの残りターン数 |
0xD65E | いしころぼうしの効果対象 |
0xD65F | いしころぼうしの残りターン数 |
0xD648~0xD64Aはキャラクター毎の0x23~0x25みたいな感じ。ただ行動内容の値は特技だと同じにならない。 ひらりマント、いしころぼうしの対象は先頭から0x00、0x01、0x02。
解析方法
エミュレータとしてVisualBoyAdvance-mを使用し、主にメモリの値の改竄で動作を確認していった。 逆アセンブルは行っていない。
更新履歴
- 20/04/28 記事公開
- 20/05/08 装備の素早さ上昇量に関する記述を追加
- 22/01/30 0x48と0x49について追記