夢想メモリ

ゲームの攻略、データ、感想、縛りプレイのこと等を中心に、ゲームとは無関係の雑記も書きます。

ドラえもん きみとペットの物語 戦闘中の状態を表すメモリアドレス

キャラクター毎の状態を表すメモリアドレス

戦闘中のキャラクターの状態は敵味方共に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について追記