相手のAI(初代)

この記事では、初代ポケモンで相手が技を選ぶ・交代する・道具を使用する仕組みについて説明しています。

技選択について

相手が技を選ぶタイミングは、プレイヤーが技を選んだ・ポケモンを交代した・道具を使用した・逃げるに失敗したあとです*1はかいこうせん後の反動のようにメニューが出ない状態では、ターンはじめのタイミングで技選択が行われます。技選択の方法は以下のとおりです。

  1. 以下の状況のとき(=技が選べない状況のとき)は何もしない。
  2. 覚えている技が1つだけかつかなしばり状態のときは、わるあがきをする。
  3. 野生・たんパンこぞう・スキンヘッズ以外との戦闘の場合、AIによるフィルタリング(後述)で優先度が最も低い技のみ(複数ある場合はそれらすべて)を残し、それ以外の技は空欄扱いとする。
  4. (フィルタリング後の)技リストからランダムに技を1つ選ぶ。選ばれる確率は1番目が63/256、2番目が64/256、3番目が63/256、4番目が66/256。ただし、かなしばりされている技または空欄が選ばれた場合は選びなおす。

AIによるフィルタリング

野生・たんパンこぞう・スキンヘッズ以外との戦闘の場合、覚えている技すべてからランダムに技を選ぶのではなく、フィルタリングで残された技の中からランダムで選びます。残される技は、技ごとに設定された優先度が最も低い技です。優先度の決定方法は以下のとおりです。

  1. 優先度の初期値を10とする。
  2. 以下の補正0~3を順番に適用する。各補正は覚えている技すべてに対して1回だけ適用する。ただし、トレーナーの種類によっては適用されない補正がある(表1を参照)。
  3. 補正後の優先度がその技の最終的な優先度となる。
補正0 かなしばり補正

かなしばり状態の技は優先度が80になります。

補正1 状態異常補正

プレイヤーのポケモンが何らかの状態異常にかかっているとき、威力0かつねむり・どく・まひのいずれかの状態異常にする技*2の優先度を+5します。以下の技が対象です(五十音順、以降の技一覧も同様)。

  • あくまのキッス
  • うたう
  • キノコのほうし
  • さいみんじゅつ
  • しびれごな
  • でんじは
  • どくガス
  • どくどく
  • どくのこな
  • ねむりごな
  • へびにらみ
補正2 変化技+α補正

相手がポケモンを初手出しまたは死に出ししてから2ターン目(および256n+2ターン目、nは正の整数)のとき、変化技とその他一部の技*3の優先度を-1します。ただし、交代や道具を使ったターンは数えません。以下の技が対象です。

補正3 タイプ相性補正

以下の補正を行います。

  • プレイヤーのポケモンの弱点をつけるタイプの技の優先度を-1する
  • いまひとつまたは無効となるタイプの技は、「特定の技(自身を含む)または威力1以上の別タイプの技」を覚えている場合に限り優先度を+1する

タイプ相性の判定は表2に基づきます。プレイヤーのポケモンが複合タイプで表2にあてはまるものが2つある場合は、No.の若いほうで判定されます。

上記の「特定の技」および「威力1以上の技」は以下のとおりです。

特定の技*4
威力1以上の技
以下を除く相手に直接ダメージを与える技
表1 適用される補正(トレーナーの種類ごと、内部番号順) ○: 適用される
トレーナーの種類 補正0・1 補正2 補正3
たんパンこぞう      
むしとりのしょうねん    
ミニスカート    
ふなのり  
ボーイスカウト    
ガールスカウト    
かいじゅうマニア
りかけいのおとこ  
やまおとこ    
ぼうそうぞく    
かじばどろぼう  
でんきやのオヤジ    
ジプシージャグラー(D5h、未使用)  
つりびと  
かいパンやろう  
スキンヘッズ      
ギャンブラー    
おとなのおねえさん  
サイキッカー  
でんきグループ   ○(赤緑青のみ)
ジプシージャグラー(DDh)    
もうじゅうつかい    
とりつかい    
からておう    
ライバル1(ハナダシティまで)    
オーキドせんせい(未使用)  
シルフのチーフ(未使用)  
はぐれけんきゅういん  
サカキ  
ロケットだんいん    
エリートトレーナー(♂)  
エリートトレーナー(♀)  
シバ    
タケシ    
カスミ  
マチス   ○(赤緑青のみ)
エリカ  
キョウ  
カツラ   ○(赤緑青のみ)
ナツメ   ○(赤緑青のみ)
ジェントルマン  
ライバル2
(サントアンヌ号~22ばんどうろ2回目まで)
 
ライバル3(チャンピオン)  
カンナ
きとうし    
キクコ    
ワタル  

 

表2 タイプ相性表
No. 攻撃側のタイプ 防御側のタイプ 相性
1 みず ほのお ばつぐん
2 ほのお くさ ばつぐん
3 ほのお こおり ばつぐん
4 くさ みず ばつぐん
5 でんき みず ばつぐん
6 みず いわ ばつぐん
7 じめん ひこう 無効
8 みず みず いまひとつ
9 ほのお ほのお いまひとつ
10 でんき でんき いまひとつ
11 こおり こおり いまひとつ
12 くさ くさ いまひとつ
13 エスパー エスパー いまひとつ
14 ほのお みず いまひとつ
15 くさ ほのお いまひとつ
16 みず くさ いまひとつ
17 でんき くさ いまひとつ
18 ノーマル いわ いまひとつ
19 ノーマル ゴースト 無効
20 ゴースト ゴースト ばつぐん
21 ほのお むし ばつぐん
22 ほのお いわ いまひとつ
23 みず じめん ばつぐん
24 でんき じめん 無効
25 でんき ひこう ばつぐん
26 くさ じめん ばつぐん
27 くさ むし いまひとつ
28 くさ どく いまひとつ
29 くさ いわ ばつぐん
30 くさ ひこう いまひとつ
31 こおり みず いまひとつ
32 こおり くさ ばつぐん
33 こおり じめん ばつぐん
34 こおり ひこう ばつぐん
35 かくとう ノーマル ばつぐん
36 かくとう どく いまひとつ
37 かくとう ひこう いまひとつ
38 かくとう エスパー いまひとつ
39 かくとう むし いまひとつ
40 かくとう いわ ばつぐん
41 かくとう こおり ばつぐん
42 かくとう ゴースト 無効
43 どく くさ ばつぐん
44 どく どく いまひとつ
45 どく じめん いまひとつ
46 どく むし ばつぐん
47 どく いわ いまひとつ
48 どく ゴースト いまひとつ
49 じめん ほのお ばつぐん
50 じめん でんき ばつぐん
51 じめん くさ いまひとつ
52 じめん むし いまひとつ
53 じめん いわ ばつぐん
54 じめん どく ばつぐん
55 ひこう でんき いまひとつ
56 ひこう かくとう ばつぐん
57 ひこう むし ばつぐん
58 ひこう くさ ばつぐん
59 ひこう いわ いまひとつ
60 エスパー かくとう ばつぐん
61 エスパー どく ばつぐん
62 むし ほのお いまひとつ
63 むし くさ ばつぐん
64 むし かくとう いまひとつ
65 むし ひこう いまひとつ
66 むし エスパー ばつぐん
67 むし ゴースト いまひとつ
68 むし どく ばつぐん
69 いわ ほのお ばつぐん
70 いわ かくとう いまひとつ
71 いわ じめん いまひとつ
72 いわ ひこう ばつぐん
73 いわ むし ばつぐん
74 いわ こおり ばつぐん
75 ゴースト ノーマル 無効
76 ゴースト エスパー 無効
77 ほのお ドラゴン いまひとつ
78 みず ドラゴン いまひとつ
79 でんき ドラゴン いまひとつ
80 くさ ドラゴン いまひとつ
81 こおり ドラゴン ばつぐん
82 ドラゴン ドラゴン ばつぐん

交代・道具の使用について

以下に示す一部のトレーナーは、技を使うかわりにポケモンを交代したり道具を使用したりします。これらの行動は、相手が技を使う行動に替わって行われます*5。ただし、ピカチュウ版で相手が以下の状態のときは、交代や道具の使用は行いません。

※ジプシージャグラー以外のトレーナーの種類のあとにある数字は、ポケモン1匹につき使用する道具の上限回数です。使用回数は相手がポケモンを交代するとリセットされます。
※各行動の後の分数は、条件を満たしたときに(条件が書いていない場合は常に)それらの行動を行う確率です。確率が書いていない行動は、条件を満たしていれば常に行われます。
※「最大HPの1/n」は小数点以下切り捨てです。例えば最大HPが99のとき、最大HPの1/5は19となり、最大HPの1/5未満は18以下の値となります。
※交代先のポケモンは手持ちの他のポケモンのうち最も前に配置されているポケモンとなります[1]。

  • ジプシージャグラー(D5h・DDhともに)
    • 交代(64/256)
  • からておう(2)
    • プラスパワー(32/256)
  • サカキ(1)
    • エフェクトガード(64/256)
  • エリートトレーナー(♂) (2)
    • プラスパワー(64/256)
  • エリートトレーナー(♀) (1)
    • 現在HPが最大HPの1/10未満のとき、すごいキズぐすり
    • 現在HPが最大HPの1/10以上1/5未満のとき、交代 ※ただし、すごいキズぐすりを使ったあとは、そのポケモンに対して交代は行わない
    • これら2つの行動は、条件を満たしたときに64/256の確率で行われるはずだったが、バグにより常に行われる
  • シバ(2)
  • タケシ(5)
    • 何らかの状態異常になっているとき、なんでもなおし ※状態異常ともうどくを治す。まひ・やけどによるステータス低下は治らない。
  • カスミ(1)
  • マチス(1)
    • スピーダー(64/256)
  • エリカ(1)
    • 現在HPが最大HPの1/10未満のとき、いいキズぐすり(128/256)
  • キョウ(2)
  • カツラ(2)
    • 赤緑青: いいキズぐすり(64/256) ※HPが満タンのときにも使用することがあり、この場合でも使用回数にカウントされる
    • ピカチュウ版: 現在HPが最大HPの1/10未満のとき、いいキズぐすり(64/256)
  • ナツメ(1)
  • ライバル2(1)
    • 現在HPが最大HPの1/5未満のとき、キズぐすり(32/256)
  • ライバル3(1)
    • 現在HPが最大HPの1/5未満のとき、かいふくのくすり(32/256) ※状態異常の回復はタケシと同じ仕様
  • カンナ(2)
    • 現在HPが最大HPの1/5未満のとき、いいキズぐすり(128/256)
  • キクコ(2)
    • 交代(20/256) ※ただし、ポケモン1匹に交代を挟まずにいいキズぐすりを2回使ったあとは、そのポケモンに対して交代は行わない
    • 現在HPが最大HPの1/4未満のとき、いいキズぐすり(108/256)
  • ワタル(1)
    • 現在HPが最大HPの1/5未満のとき、すごいキズぐすり(128/256)

参考文献

[1] かみど、初代ポケモン 豆知識集 第11回 - ニコニコ動画https://www.nicovideo.jp/watch/sm20945406 (3:25~)、2023年12月29日閲覧。

 
 

*1:このため、NPC相手に対して交代で技を受けることはできない

*2:効果が01h・20h・42h・43hのいずれかに設定されている技

*3:効果が0Ah~19h・32h~41hのいずれかに設定されている技

*4:効果が28h・29h・2Bhのいずれかに設定されている技

*5:このため、後攻や溜め技中など技を選べない状況でも交代したり道具を使ったりすることがある

ZZAZZ glitch

はじめに

初代ポケモンで20番目セレクトバグ[1][2]やfifth法[3]を利用してバグトレーナーと戦うと、手持ちポケモンの情報が破壊されることがあります[4]。これはZZAZZ glitch[5]と呼ばれているバグによるもので、トレーナーに勝ったときにもらえる賞金の計算処理に起因します。以下、このバグについて解説します。

トレーナーからもらえる賞金

※これ以降に出てくるROMアドレスは、緑後期版のものです。他のバージョンでは異なる場合があります。

トレーナーに勝ったときにもらえる賞金は、アドレスD057h~D058hにBCD・ビッグエンディアンで書き込まれます*1。このアドレスは、0E:6074からの処理によって書き込まれます。以下にその処理内容を示します。

  1. 前処理によって、アドレスD025h~D026hに賞金の倍率(BCD・ビッグエンディアン)、アドレスD0EChに手持ち最後のポケモンのレベルが入っている。
  2. アドレスD056h~D058hを00hで初期化する。
  3. deレジスタ = D058hとする。
  4. アドレスD0EChに入っている値の回数分、以下の処理を繰り返し行う。ただしD0EChの値が00hの場合、以下の処理は256回繰り返す。
    1. hlレジスタ = D026h、cレジスタ = 02hとする。
    2. サブルーチン(03:7B53)を呼び出し、BCDの足し算を行う。これにより、アドレスD057h~D058hにD025h~D026hの値が加算される。
      ※「BCDの足し算を行うサブルーチンの仕様」も参照
    3. 2で呼び出したサブルーチンによってdeレジスタの値がD056hになっているため(本来は)、deレジスタを2加算する。

従って、賞金は「倍率*手持ち最後のレベル」となります(ただし、レベル0は256扱いとする)。ただし、後述の仕様により賞金が9999円を超える場合は、9999円となります。

BCDの足し算を行うサブルーチンの仕様

このルーチンは、メモリ上のBCDで表されている値同士の足し算を行います。パラメーターとしてdeレジスタに被加算BCDが格納されているアドレス、hlレジスタに加算BCDが格納されているアドレス、cレジスタにそれぞれのBCDのバイト数を指定します。従って、このルーチンは(de) = (de) + (hl)という計算を行います。

計算後に上限を超えた場合は、上限値に補正します。例えば、2バイトのBCDに対して計算を行って9999hを超えた場合は、9999hに補正します(以下、この補正を上限補正という。)。

バグ解説

ZZAZZ glitchは、BCDの足し算を行うサブルーチンによって上限補正が行われると引き起こされます。

賞金を求める処理の手順4-3は上限に到達することを想定していないため、上限補正が発生するとこの処理により賞金を書き込むアドレスが3バイト上位アドレス側にズレます。このズレは上限補正が発生するたびに起こります。

従って、このバグが発生すると、アドレスD059h~D355hまでの3の倍数以外のアドレスが99hで書き換えられます。ただし、書き換えられるアドレスの範囲は戦うトレーナーの種類や手持ちによって変化します。特に、バグトレーナーは賞金の倍率が通常のトレーナーよりも高いため、上限補正が起こりやすくなります。

書き換えられる範囲が十分に広い場合は、主人公の名前・手持ちポケモンの情報・手持ち道具などが書き換えられます。これらの情報に対して99hが何に対応しているかについては、表1を参照してください。

表1 99hに対応するもの
種類 99hに対応するもの
文字 カタカナの「ハ」
ポケモン(内部番号) フシギダネ
わざ だいばくはつ
PP ポイントアップ2回使用・残りPP25
状態異常 ねむり残り1ターン・どく・やけど・(bit7)*2
道具 使うとオーキドの言葉が表示されるバグ道具
緑後期以外は名前が長い

参考文献

[1] yue@・ゴーマもどき、オーキド"せんせい"とは何ぞやと | ネオ・グリーン、http://g-modoki.s59.xrea.com/x/Pokemon/okido/000.html、2023年9月12日閲覧。

[2] 20番目バグ - pokemonbug @ ウィキ - atwiki(アットウィキ)、https://w.atwiki.jp/pokemonbug/pages/16.html、2023年9月12日閲覧。

[3] fifth法 - pokemonbug @ ウィキ - atwiki(アットウィキ)、https://w.atwiki.jp/pokemonbug/pages/10.html、2023年9月12日閲覧。

[4] yue@・ゴーマもどき、不可思議現象、20番目の怪 | ネオ・グリーン、http://g-modoki.s59.xrea.com/x/Pokemon/okido/100.html、2023年9月12日閲覧。

[5] ZZAZZ glitch - Glitch City Wikihttps://glitchcity.wiki/wiki/ZZAZZ_glitch、、2023年9月12日閲覧。

*1:アドレスD056hも該当するが、00hで初期化されるのみ

*2:未使用bit

毒サファリ+いあいぎりによるPC道具欄拡張の仕組みについて

はじめに

ピカチュウバージョンの任意コード実行環境・バイナリエディタを構築する方法の1つに、毒サファリによる壁抜けといあいぎりを使用する方法があります[1][2]。この方法の途中に、バグ世界に侵入していあいぎりを使い、PC道具欄を拡張する手順があります。以下にその手順を示します。

準備

  1. PCに道具を50種類 (満タンまで) あずける.

(2~6は省略)

手順

(1~5と8は省略)

  1. 壁貫通モードのままセキチクシティのポケモンセンターにリスポーンするので,そこから下に 8 歩,左に 96 歩,上に 99 歩歩く.
  2. いあいぎりの木があるので切る.

[2]

この記事では、PCの道具欄拡張の仕組みと、それを行うために必要となる歩数の算出について説明します。

PCの道具欄拡張の仕組み

「はじめに」で示した手順は、Cut abuseと呼ばれる、特定のバグマップで細い木*1や草を切ることによってRAMの値を操作するバグを利用しています[3]。

このバグの説明の前に、ブロックについて説明します。

ブロック

初代ポケモンでは、マップはブロックで構成されています。1ブロックは2x2マスの4マスで構成され、各ブロックには1バイトのIDが割り当てられています。各IDに対応するブロックについては、以下を参照してください*2
File:TileBlockDex.png - Glitch City Wiki

バグマップについて

メモリ上には、マップデータが格納されている領域があります。この領域は通常プレイで見える分だけ確保されており、通常プレイにおいてはこの領域のみが参照されます。しかし、壁抜け状態などでマップの範囲外へアクセスした場合、領域外のアドレスを参照します。領域外のアドレスは他の用途に使用されているため、マップとしてみた場合はでたらめな値が入っています。

バグマップの正体は、この領域外のアドレスを無理やりマップとして表示したものです。

いあいぎりを使ったときの挙動について

フィールド上でいあいぎりを使って細い木や草を切ったとき、メモリ上の対応するアドレスの値が書き換わります。ブロックには細い木や草が存在するものがあり、いあいぎりを使うと細い木や草がないブロックに書き換わります。具体的にどのように変化するかについては、表1を参照してください。

表1 いあいぎりを使用したときのブロックIDの変化
いあいぎり使用前のブロックID いあいぎり使用後のブロックID 切るものとブロック内の位置
0Bh(11) 0Ah(10) 草むら(全体)
32h(50) 6Dh(109) 細い木(右上)
33h(51) 6Ch(108) 細い木(右下)
34h(52) 6Fh(111) 細い木(左上)
35h(53) 4Ch(76) 細い木(右上)
60h(96) 6Eh(110) 細い木(左下)

通常のマップでは、マップデータが格納されている領域を書き換えるので特に問題はありませんが、バグマップでこれを行うと、マップデータではない領域を書き換えることになります。

「はじめに」で歩いていった場所は、PCに預けている道具の個数(アドレスD4B9h)に対応しています。PCに道具を50個預けることで、このアドレスに対応するブロックに木が含まれるようになり、この木を切ることで値が50から109に書き換わり、PCに預けている道具の個数が109個になります。

歩数の算出

20ばんすいどうのバグマップで、目的のアドレスに対応するブロックにたどり着くための歩数を求める方法について説明します。

まず、当該ブロックがある座標を求めます。求め方は以下のとおりです。なお、以下の手順で求まる座標はブロックの左上の座標となるので、ブロックの左上以外の座標に行きたい場合は適宜求めた座標を調整してください。

アドレスAの座標(y, x)を求めるためには、次の手順を実行する。

  1. AからC793hを引く(これをBとする)
  2. Bを38hで割り、端数を切り捨てる(これをCとする)
  3. Cに38hを掛ける(これをDとする)
  4. BからDを引く(これをEとする)
  5. 目的地の座標は(C * 2, E * 2)で求められる

[3]を翻訳、ただし手順1のアドレスは日本語版向けに修正した

もしくは、以下のスプレッドシートから対応する座標を求めます。
20ばんすいどうの座標に対応するアドレス表 - Google スプレッドシート

次にセキチクポケモンセンター入り口から、求めた座標へ行くための歩数を求めます。上記で求めた座標(y, x)を、以下の文に代入します。

  • 下に8歩、左に99 - x + 10歩、上に220 - y歩
    ※y >= 222の場合は、「上」を「下」に読み替える

必要に応じて以下の調整をします。これは、細い木や草を切るためには、その1歩手前に立つ必要があるためです。

  • y = 220の場合は、左に歩く歩数を1減らす
  • y ≠ 220の場合は、上(下)に歩く歩数を1減らす

歩数を求めたら、セキチクシティのポケモンセンターの入口から求めたとおりに歩きます。

例: PCの道具欄を拡張するためのアクセス方法

まずは座標を求めます。

  • [3]の方法を用いて求める場合
    1. D4B9h - C793h = D26h (B)
    2. D26h / 38h = 3Ch (C)
    3. 3Ch * 38h = D20h (D)
    4. D26h - D20h = 6h (E)
    5. 目的地の座標は(3Ch * 2, 6h * 2)、すなわち(120, 12)
    6. 細い木はブロックの右上にあるのでx座標に1を足して、求める座標は(120, 13)となる
  • スプレッドシートを用いて求める場合
    1. スプレッドシートを開き、アドレス「D4B9」を検索する
    2. D4B9が書かれているセルはI63なので、これに対応する座標は(120~121、12~13)となる
    3. 細い木はブロックの右上にあるので、求める座標は(120, 13)となる

座標を求めたので、次は歩数を求めます。

下に8歩、左に99 - 13 + 10 = 96歩、上に220 - 120 = 100歩
調整を行ったあとの歩数は下に8歩、左に96歩、上に99歩

歩数を求める式について

上記の歩数の式を導出する過程について説明します。

20ばんすいどうのバグマップは、本来の19ばんすいどうと20ばんすいどうが繋がっている範囲より上から進入することで到達できます。

セキチクシティのポケモンセンター入口から下に8歩歩くと、19ばんすいどうの(y = 0, x = 9)に到達し、そこから左に10歩歩くと20ばんすいどうの(y = 220, x = 99)に到達します(図1参照)。ここから目的の座標(y, x)には左に99 - x歩、上に220 - y歩歩くと到達できます。目的の座標に存在する細い木や草を切るためにはその1歩手前に主人公が立つ必要があるので、その分の調整をします。これらを合わせると、前述の歩数の式が導出されます。

ところで、19ばんすいどうから左に歩いて20ばんすいどうへ到達したとき、y座標が220と不自然に大きくなることを疑問に思うかもしれません。これは本来繋がっている場所よりも上から侵入した結果、y座標がオーバーフローするためです(図1参照)。

19ばんすいどうから20ばんすいどうへの道は、下のほう(y = 36~53)でつながっています。19ばんすいどうのy = 0~35から20ばんすいどうへアクセスした場合は、20ばんすいどうのy座標がオーバーフローして20ばんすいどうのy = 220~255に到達します。

test

図1 セキチクシティのポケモンセンター入口から20ばんすいどうのバグマップへのアクセス

参考文献

[1] オーキドせんせい研究者、【初代ポケモンピカチュウ版任意コード実行チャート解説【完全版 バグ技 毒サファリ+いあいぎり】 | YouTubehttps://www.youtube.com/watch?v=6-_mu95YK9M、2023年5月4日閲覧。

[2] flag3、バイナリエディタ導入 毒サファリ・いあいぎりルート ピカチュウ版 | flag3833753、https://flag3833753.hatenablog.com/entry/2023/02/09/200159、2023年5月4日閲覧。

[3] Glitch City RAM manipulation (Cut abuse) - Glitch City Wikihttps://glitchcity.wiki/Glitch_City_RAM_manipulation_(Cut_abuse)、2023年5月4日閲覧。

*1:いあいぎりで切れる木

*2:ただしリンク先は海外版のものであるため、日本語版では異なる可能性があります。ただし、この記事で解説している内容には影響しません。

ピカチュウ版で、冒険の途中から任意コード実行環境を構築する(ミラー領域を使用しない方法)

※2023年2月9日に、flag3さんが通信交換無しでバイナリエディタを導入する方法を公開しました。今から任意コード実行環境を構築する場合は、1台で済むリンク先の方法がよいと思われます。

バイナリエディタ導入 毒サファリ・いあいぎりルート ピカチュウ版 - flag3833753

はじめに

ピカチュウ版で、冒険の途中から任意コード実行環境を構築する
上記の記事では、わざマシン05の不正な追加効果を利用して任意コード実行環境を構築する方法を説明しています。この方法はWRAMのミラー領域を使用しているため、ミラー領域が機能していない環境では、この手順を行うことはできないという問題があります。この記事では、ミラー領域を使用しないで任意コード実行環境を構築する方法を説明します。

構築手順

条件

  • ななしのどうくつに行けること
  • 赤緑青と通信交換できること
  • 使っていないボックスが1つ以上あること

赤緑青で用意するもの

※技やステータスの調整は、セレクトバグ・任意コード実行・バイナリエディタなどで行う。

ピカチュウ版で用意するもの

  • (v1.0のみ) いらないポケモン2匹(B)(C)
  • 回避率上昇以外の効果を持つ補助技を覚えているポケモン(D)

手順

  1. 通信交換で(A)をピカチュウ版に送る。
    ※送ったあとに(A)をポケモンボックスや育てやに預けてはいけない。引き出すときにステータスの再計算が行われ、調整したステータスが消えてしまう。
  2. 道具をすべてパソコンに預ける。
    ※預けていない道具は手順終了時点で消えるので注意。
  3. ポケモンボックスのニックネームを以下のようにする。
    • v1.0用 ※[1]のニックネームをこの手順用に修正したもの
       01:ョョョョョ
       02:がめぜルべ
       03:づョづぶづ
       04:ぶづよマづ
       05:にマづぜべ
       06:ョオづにカ
       07:づよナづぼ
       08:づにレづざ
       09:よバづにヨ
       10:づよそづぼ
       11:づにッづの
      
    • v1.1~v1.3用 ※[2]のニックネームをこの手順用に修正したもの
       01:ョョョョョ
       02:べがめぜュ
       03:づぶづぶづ
       04:ぶづよマづ
       05:にせづにさ
       06:づよさづそ
       07:にョづよバ
       08:づよノづづ
       09:にねづよー
       10:づの
      
  4. 手持ちポケモンを以下の順に並べる。
    • (v1.0) 先頭2匹は(B)(C)、3匹目以降は(A)(D)を含んだ任意のポケモン
    • (v1.1~v1.3) 先頭は(A)以外、2匹目以降は(A)(D)を含んだ任意のポケモン
  5. ななしのどうくつに行き、レベル60か65のメタモンとエンカウントする。
    ※条件を満たすメタモンの、フロアごとの出現率は以下のとおり[1]。
    • 1階: 1%
    • 2階: 10%
    • 地下1階: 15%
  6. (A)に交代する。交代後はメタモンが(A)に変身する。
  7. (D)に交代する。
  8. メタモンが使用するわざマシン42が命中し一撃で倒されなかった場合、手持ちの道具が以下のように変化する(v1.0の場合は手持ち1・2匹目の親名も変化する)。命中しなかった場合は、補助技を使ってターンを稼ぐ。

任意コード実行方法

上記の手順で任意コード実行環境を構築したあとの任意コード実行方法については、前回の記事を参照してください。

解説

この構築手順は、バグ技「わざマシン42」の不正な追加効果を利用してポケモンボックスのニックネームに書いたプログラムを実行し、任意コード実行環境を構築しています。

ピカチュウ版におけるわざマシン42の技データを表1に示します(v1.0~v1.3共通)。

表1 ピカチュウ版のわざマシン42の技データ
アニメーション 78h (じばくと同じ)
追加効果 71h (不正値)
威力 102
タイプ C6h (特殊技、タイプ名参照先はFE13h)
命中率 118/256 (約46.1%)
PP 43

わざマシン42のタイプ名は不正であり、不用意にメモリを書き換える可能性があります。そのため、構築手順ではタイプ名を表示させないようにしています。

ピカチュウ版で追加効果71hが発生した場合は、アドレスCD1Fhにジャンプします(v1.0~v1.3共通)。ここから、アドレスCD27h~CD29hに書いたジャンプ命令でボックス1番目のニックネーム1文字目のアドレスDE64hにジャンプし、ボックスのニックネームに書いた任意コード実行環境を構築するプログラムを実行しています。

アドレスCD1Fh~アドレスCD29hが何に使用されているかを表2に示します。

表2 アドレスCD1Fh~CD29hの内容
アドレス(16進数) 内容
CD1F 自分のポケモンの回避率補正(1~13、初期値7)
CD20 未使用(一度でも戦闘すると7になる)
CD21 未使用(一度でも戦闘すると7になる)
CD22 未使用(常に0)
CD23 相手のポケモンのレベル
CD24 相手のポケモンの最大HP上桁
CD25 相手のポケモンの最大HP下桁
CD26 相手のポケモンの補正前のこうげき実数値上桁
CD27 相手のポケモンの補正前のこうげき実数値下桁
CD28 相手のポケモンの補正前のぼうぎょ実数値上桁
CD29 相手のポケモンの補正前のぼうぎょ実数値下桁

表2に示したアドレスのうち、相手のポケモンが変身した場合は、アドレスCD26h~CD29hの値がこちらのポケモンの値となります。

メタモンとエンカウントする場所とレベルについて

ピカチュウ版では、メタモンはななしのどうくつ以外に、ポケモンやしきの地下1階にも出現します。構築手順でエンカウントする場所やレベルを指定している理由は、メタモンの個体によってはアドレスCD27h~CD29hに書いたジャンプ命令が実行できなかったり、ジャンプする前にスタックポインタやメモリを書き換えたりするためです。

それぞれの場所で出現するメタモンのレベルは、表3のとおりです。

表3 ピカチュウ版でメタモンが出現する場所と、出現するメタモンのレベル[1]
場所 レベル
ポケモンやしき 地下1階 12・18・24
ななしのどうくつ 1階 55・60
ななしのどうくつ 2階 60
ななしのどうくつ 地下1階 60・65

アドレスCD27h~CD29hに書いたジャンプ命令を実行するためには、アドレスCD1Fh~CD26hの間で停止しない・メモリを書き換えない・スタックポインタを書き換えない・ジャンプしない必要があります。このうちアドレスCD1Fh~CD22h・CD24h・CD26hに書かれた命令はこの条件を満たしているので、残りのCD23h・CD25h、すなわちメタモンのレベルと最大HPが問題となります。

表4はピカチュウ版での野生のメタモンのレベルごとの最大HPの値を示したものです。表4の太字で示しているレベルと最大HPは、それらの値を命令として解釈したときに条件を満たさない命令となります。出現する個体によらず安全に実行できるのはレベル60と65のときで、これらのレベルが出現するのはななしのどうくつのみとなります。

表4 メタモンのレベル別最大HPの値
レベル 最大HPの取りうる値
12 33~37 (34)
18 45~50 (48、49、50)
24 57~64 (59)
55 117~118・120~129・131~134 (117~118)
60 127~128・130~134・136~140・142~145
65

137~138・140~143・145~147・149~151・153~156

参考文献

[1] ゲームの匠、メタモンポケモン赤緑ピカチュウ攻略|ゲームの匠、https://pokemon.g-takumi.com/pokemon/132/、2023年1月29日閲覧。

[2] 昔のポケモンの裏技を語る【アネ゛デパミ゛】 14 [無断転載禁止]©2ch.net、https://medaka.5ch.net/test/read.cgi/poke/1477904768/87、2023年1月11日閲覧。

[3] 昔のポケモンの裏技を語る【アネ゛デパミ゛】 13、https://tamae.5ch.net/test/read.cgi/poke/1389422437/630、2023年1月11日閲覧。

更新履歴

2023年2月3日 公開

2023年2月9日 冒頭に通信交換無しでバイナリエディタを導入するflag3さんの記事へのリンクを追加

*1:メモリ上の値はFC 50 C3 82 DE、画面上での表示は「6」

*2:メモリ上の値はF7 50 C3 57 D2、画面上での表示は「1」

ピカチュウ版で、冒険の途中から任意コード実行環境を構築する

※2023年2月9日に、flag3さんが通信交換無しでバイナリエディタを導入する方法を公開しました。今から任意コード実行環境を構築する場合は、1台で済むリンク先の方法がよいと思われます。

バイナリエディタ導入 毒サファリ・いあいぎりルート ピカチュウ版 - flag3833753

はじめに

初代と第二世代のポケモンでは、自分で書いたプログラムを実行することができます。これを任意コード実行といいます。

初代と第二世代のポケモンで任意コード実行を行う方法として、以下の方法があります*1

赤緑青
5かい、てへ、なかよしバッヂを使用する方法[1][2]
ピカチュウ
はやぶさバッヂを使用する方法[3]
金銀
わざマシン17を使用する方法[4]*2
クリスタル(および金銀)
バグった図鑑のモードを使用する方法[5]*3

上記の方法を実行できるようにするための構築手順について、最初から始める場合の構築手順は、赤緑青[6]・ピカチュウ[3]・金銀[4]・クリスタル[5]で示されています。

また、赤緑青と金銀クリスタルでは、以下の方法で冒険の途中からでも任意コード実行環境を構築することができます。

赤緑青
壁抜けアイテムを使用して任意コード実行に必要な道具を入手する[1]
金銀クリスタル
自転車を持ったポケモンを通信交換で送る[5]

しかし、ピカチュウ版で冒険の途中から任意コード実行環境を構築する方法は、私が知る限り存在していません。

ピカチュウ版では[3]で示されているように、トキワの森のトレーナーに対してfifth法を行うことで任意コード実行環境の構築をしています。これを行うにはそのトレーナーを倒していない必要があり、そのトレーナーを倒している場合は構築できません。また、初代では持ち物の概念がないため、通信交換で道具を送ることもできません*4

青版では上記で示した方法以外に、ステータスを調整したポケモンとバグ技の追加効果を利用した任意コードの実行方法があります[7]。ピカチュウ版で同じようなことができれば、ピカチュウ版でも冒険の途中から任意コード実行環境の構築ができると考え調べたところ、青版と同じ方法ではないもののできることが分かりました。この記事では、ピカチュウ版でバグ技の追加効果を利用することによって冒険の途中からでも任意コード実行環境を構築する方法を説明します。

構築手順

条件

  • ポケモンやしき」か「ななしのどうくつ」に行けること
  • 赤緑青と通信交換できること
  • 使っていないボックスが1つ以上あること

赤緑青で用意するもの

  • 以下の条件を満たすポケモン(A)
    • 通信交換で進化しないポケモン、具体的にはユンゲラーゴーリキー・ゴローン・ゴースト以外のポケモン
    • ぼうぎょ実数値が50020(C364h)、すばやさ実数値が56832~57087(DE00h~DEFFh)
      ※ぼうぎょ実数値は、画面上では「ゥ20」と表示される
    • 覚えている技がわざマシン05のみ

※技やステータスの調整は、セレクトバグ・任意コード実行・バイナリエディタなどで行う。

ピカチュウ版で用意するもの

手順

  1. 通信交換で(A)をピカチュウ版に送る。
    ※送ったあとに(A)をポケモンボックスや育てやに預けてはいけない。引き出すときにステータスの再計算が行われ、調整したステータスが消えてしまう。
  2. 道具をすべてパソコンに預ける。
    ※預けていない道具は手順終了時点で消えるので注意。
  3. ポケモンボックスのニックネームを以下のようにする。
    • v1.0用 ※[8]のニックネームをこの手順用に修正したもの
       01:ョョョョョ
       02:がめぜルべ
       03:づョづぶづ
       04:ぶづよマづ
       05:にマづぜべ
       06:ョオづにカ
       07:づよナづぼ
       08:づにレづざ
       09:よバづにヨ
       10:づよそづぼ
       11:づにッづの
      
    • v1.1~v1.3用 ※[9]のニックネームをこの手順用に修正したもの
       01:ョョョョョ
       02:べがめぜュ
       03:づぶづぶづ
       04:ぶづよマづ
       05:にせづにさ
       06:づよさづそ
       07:にョづよバ
       08:づよノづづ
       09:にねづよー
       10:づの
      
  4. 手持ちポケモンを以下の順に並べる。
    • (v1.0) 先頭2匹は(B)(C)、3匹目以降は(A)を含んだ任意のポケモン
    • (v1.1~v1.3) 先頭は(A)以外、2匹目以降は(A)を含んだ任意のポケモン
  5. ポケモンやしき 地下1階かななしのどうくつに行き、メタモンとエンカウントする(レベルは不問)。
  6. (A)に交代する。交代後はメタモンが(A)に変身する。
  7. わざマシン05を使用する(メタモンわざマシン05を使用することも含む)。わざマシン05が命中し一撃で倒さなかった場合、手持ちの道具が以下のように変化する(v1.0の場合は手持ち1・2匹目の親名も変化する)。
    ※倒してしまった場合は手順5からやり直し。レベルが上った場合は手順1からやり直し。

任意コード実行方法

上記の手順で任意コード実行環境を構築したあとは、以下の方法で任意コード実行ができます。

v1.0の場合

親名が改ざんされた手持ちの2匹のいずれかをボックス5番目に置いてから、はやぶさバッヂを使用します[3]。

v1.1~1.3の場合

パソコンの道具欄9~11番目を以下のようにしてから、はやぶさバッヂを使用します。

Ver1.1~1.3の道具個数については、
09番目:かみなりのいし 99個
10番目:わざマシン22 35個
11番目:わざマシン33 何個でも

の場合は、ボックス1匹目NN
09番目:かみなりのいし 86個
10番目:わざマシン10 35個
11番目:わざマシン33 何個でも
の場合は、手持ち1匹目NNに飛ぶようになっています

[3]

解説

この構築手順は、バグ技「わざマシン05」の不正な追加効果を利用してポケモンボックスのニックネームに書いたプログラムを実行し、任意コード実行環境を構築しています。

追加効果がある技を使用したとき、ダメージを与えたあとに種類に応じて特定のアドレスへジャンプします*7。例えば、ピカチュウ版のv1.3で「どくばり(追加効果02h)」を使用すると、0F:74DFへジャンプします。追加効果のジャンプ先はジャンプテーブルによって指定され、このテーブルに対応した値がジャンプ先となります。例えば、追加効果の値が02hであれば、テーブルの2番目に書かれているアドレスへジャンプします。

バグ技の中には、一撃で倒さないとフリーズするものがあります[10]。これは、追加効果が不正な値となっているためです。この場合は、ジャンプテーブルからはみ出でている部分をジャンプ先として読み込むため、想定外のアドレスへジャンプすることになります。バグ技の使用による想定外のジャンプ先には、WRAM上かつプレイヤーが自由に書き換えられるアドレスが含まれています。ピカチュウ版のバグ技わざマシン05は、そのうちの1つです。

ピカチュウ版におけるわざマシン05の技データを表1に示します(v1.0~v1.3共通)。

表1 ピカチュウ版のわざマシン05の技データ
アニメーション 77h (数字上はオウムがえしと同じ、ただし実際は打撃モーション[10])
追加効果 FAh (不正値)
威力 117
タイプ 0Bh (物理技、表示上はノーマルだがタイプ一致・相性補正はともになし)
命中率 120/256 (約46.9%)
PP 33

ピカチュウ版で追加効果FAhが発生した場合は、アドレスED28hにジャンプします(v1.0~v1.3共通)。アドレスED28hはCD28hのミラーで、相手のポケモンの補正前のぼうぎょ実数値上桁が書き込まれています。また、CD29h・CD2Ahはそれぞれ、相手のポケモンの補正前のぼうぎょ実数値下桁・すばやさ実数値上桁が書き込まれています。

相手のポケモンが変身すると、これらのアドレスの値はその時に出ている自分のポケモンの値となります。そのため、ステータスを調整したポケモンに変身してもらうことで、任意の値を書き込むことができます。

この構築手順では、アドレスED28h~ED2Ahにボックス1番目のニックネーム1文字目のアドレスDE64hにジャンプする命令を書いています。これによりわざマシン05が命中して一撃で倒さなかった場合は追加効果により、ボックスのニックネームに書いた任意コード実行環境を構築するプログラムが実行されます。これにより、任意コード実行環境を構築することができます。

補足

この構築手順では、WRAMのミラー領域を使用しています。そのため、ミラー領域が機能していない環境では、この手順を行うことはできません。ミラー領域が機能していない環境で任意コード実行環境を構築したい場合は、以下の記事を参照してください。
ピカチュウ版で、冒険の途中から任意コード実行環境を構築する(ミラー領域を使用しない方法)

参考文献

[1] taba、【5かい】初代ポケモンの任意コード実行解説動画【なかよしバッヂ】 - ニコニコ動画https://www.nicovideo.jp/watch/sm28475711、2023年1月16日閲覧。

[2] taba、初代ポケモンの任意コード実行解説動画の謝罪と訂正:tabaのブロマガ - ブロマガ、https://web.archive.org/web/20211007040354/https://ch.nicovideo.jp/taba/blomaga/ar995222、2023年1月16日閲覧。

[3] 魚肉、【VC版対応】ポケットモンスターピカチュウ 任意コード実行下準備チュートリアル | 魚肉の雑記帳、http://blog.livedoor.jp/lpt9705/archives/34247654.html、2023年1月11日閲覧。

[4] Teraman64DD、【ポケモン銀】ポケモン第二世代任意コード実行講座 Part.01【VOICEROID紲星あかり】 - ニコニコ動画https://www.nicovideo.jp/watch/sm37261326、2023年1月16日閲覧。

[5] Teraman64DD、【ゲームボーイポケモン第二世代任意コード実行講座 Part.04【VOICEROID紲星あかり】 - ニコニコ動画https://www.nicovideo.jp/watch/sm38101743、2023年1月16日閲覧。

[6] ありす*、【初代ポケモン】なかよしバッヂ導入チャート【任意コード実行】 - Wonderland Seeker、https://alice-wreath.hatenablog.com/entry/2019/10/03/210029、2023年1月16日閲覧。

[7] imationポケモン青 「わざマシン42」を用いた任意コードの実行(バグ) - ニコニコ動画https://www.nicovideo.jp/watch/sm37244526、2023年1月17日閲覧。

[8] 昔のポケモンの裏技を語る【アネ゛デパミ゛】 14 [無断転載禁止]©2ch.net、https://medaka.5ch.net/test/read.cgi/poke/1477904768/87、2023年1月11日閲覧。

[9] 昔のポケモンの裏技を語る【アネ゛デパミ゛】 13、https://tamae.5ch.net/test/read.cgi/poke/1389422437/630、2023年1月11日閲覧。

[10] ROTF、ピカ版 バクわざ目録 | ROTFの覚え書き、https://rollingonthefloor.blog.fc2.com/blog-entry-48.html、2023年1月15日閲覧。

更新履歴

2023年2月3日 公開

2023年2月9日 冒頭に通信交換無しでバイナリエディタを導入するflag3さんの記事へのリンクを追加

*1:これ以外にも方法はありますが、代表的なものを示しています。

*2:13:06~の理論編

*3:16:51~の理論編

*4:ポケモンスタジアム金銀のカラーケースを使用すれば、ピカチュウ版に道具を送ることはできます。ただし、この方法はVC版では無理です。

*5:メモリ上の値はFC 50 C3 82 DE、画面上での表示は「6」

*6:メモリ上の値はF7 50 C3 57 D2、画面上での表示は「1」

*7:「オウムがえし」や「スピードスター」など、一部の技を除く

レポートバグ(SRAM glitch) (初代)

はじめに

初代ポケモンには、メニューからレポートを書く際に特定のタイミングで強制リセット*1をすると、手持ちデータのみセーブされていない状態で続きから始めることができます。

手順は以下のとおりです[1]。

  1. メニューを開き、レポートを書くかどうかの確認画面まで進む(「ここまでの かつやくを~」というメッセージが表示されるところまで)。
  2. 以下のタイミングで強制リセットをする。
    • 赤緑青版では、「~かきのこした!」が出た直後*2
    • ピカチュウ版では、「はい」を押してから約0.5秒後
  3. 強制リセットのタイミングが適切であれば、レポートバグが成功する。適切でなかった場合は、セーブされない・レポートが壊れる・正常にセーブされるのいずれかになる。

解説

この節では、メニューからのセーブ・ロード・レポートの削除について説明し、その後にレポートバグの原理について説明します。

セーブ

全体の流れ

メニューからレポートを書くときの処理は、以下のようになっています。

  1. レポートを書くかどうかを確認する(進行状況のダイアログと「ここまでの かつやくを~」の確認メッセージを表示)。
  2. 前に書かれたレポートが存在するかどうかを調べ、存在する場合は上書き確認をする(「まえに かかれた レポートが~」の確認メッセージを表示)。(※)
  3. 1・2ともに「はい」が選ばれた場合は、レポートを書く。

※: 実際には、後述のようにレポートが壊れているときに上書き確認される。

上書き確認について

以下の条件について、1を満たし、かつ2または3を満たす場合は、前に書かれたレポートが存在するものとみなします。ただし、青とピカチュウ版でタイトルメニューに「つづきからはじめる」がない状態で始めた場合は、常に前に書かれたレポートが存在しないものとみなします。

  1. レポート上の主人公名の1文字目が00hでない
  2. レポートが壊れている(01:B594hの値と01:A598h~01:B593hのチェックサムを計算した値が一致しない)
  3. レポート上の主人公のIDとWRAM上の主人公のIDが一致しない
レポートを書く処理

レポートを書く(SRAMに書き込む)処理は、以下のようになっています。

  • (赤緑青) セーブ完了のメッセージを表示してからSRAMに書き込む
  • (ピカチュウ) SRAMに書き込みを行ってからセーブ中のメッセージ表示→一定時間待機→セーブ完了のメッセージを表示する

SRAMへの書き込みは、以下のように3回に分けて行われます。

  1. 手持ちポケモンデータ以外のSRAMバンク01hに書き込まれるすべてのデータ
  2. 現在選択中のボックスデータ
  3. 手持ちポケモンデータと図鑑データ
    • ピカチュウ版では、これに加えてなつき度・ごきげん度もセーブする

1~3それぞれの書き込みごとに、チェックサムが計算され、その値がSRAMに書き込まれます。

ロード

タイトル画面でレポートのデータをロードする際は、まずレポート上の主人公名に50hが入っているかどうかを調べます。50hが入っていない場合はレポートが存在しないとみなし、ロードを行いません。50hが入っている場合はロード処理を呼び出します。

ロード処理は、セーブ時と同様に3回に分けて行われます。

  1. 手持ちポケモンデータ以外のSRAMバンク01hに書き込まれるすべてのデータ
  2. 現在選択中のボックスデータ
  3. 手持ちポケモンデータと図鑑データ

1~3それぞれの段階で、ロード前にレポートのチェックが行われます。レポートに記録されているチェックサムの値と、ロード時に計算したチェックサムの値を比較し、一致していない場合はレポートが壊れていると判断します*3。いずれかの地点で壊れていると判断された場合はそこでロード処理が中断され、「フアイルの データが こわれています!」というメッセージを表示し*4、続きから始められないようにします。

レポートの削除

タイトル画面で「↑+Select+B」を押し、その後の確認画面で「はい」を選ぶと、SRAMの全領域*5が赤緑版では00h・青ピカチュウ版ではFFhで初期化されます。

原理

このバグが発生する原因は、強制リセットでSRAMへの書き込みを強制的に中断することにより、手持ちデータのみセーブされず前の状態を引き継ぐためです。

SRAMへの書き込み中に強制リセットを行うと、その時点でSRAMへの書き込みが中断されます。レポートを書く処理の1番目か3番目が実行されているときに強制リセットを行った場合は、チェックサムが更新されないため、次のロード時にレポートが壊れていると判断されます*6

一方、レポートを書く処理の2番目が実行されているときに強制リセットを行った場合を考えてみます。レポートを書く処理の2番目で書き込まれる内容は同1番目に含まれているため、この処理でSRAMのデータとチェックサムが更新されることはありません。そのため、2番目の処理が実行されているときに強制リセットを行った場合は、次のロード時にレポートが壊れていないと判断されて正常にデータがロードされ、手持ちデータがセーブされていない状態で続きから始めることができます。レポートを削除してからレポートバグを行った場合はレポート削除時に初期化される値を引き継ぐため、手持ちデータ領域は00h(赤緑)またはFFh(青ピカチュウ)となります。

上記のとおり、強制リセットを行ったあとのレポートの状況は強制リセットを行うタイミングによって変わります。強制リセットを行ったタイミングごとのレポートの状況は、表1のようになります。

表1 強制リセットのタイミングごとのレポート状況
強制リセットのタイミング 結果
1より前 セーブされない
1の最中 レポートが壊れる
2の最中 レポートバグ成功、手持ちデータがセーブされない
3の最中 レポートが壊れる
3より後 正常にセーブされる(手持ちデータを含めて)
※強制リセットのタイミングの1~3は、レポートを書く処理の1~3に対応する。

応用例

このバグを利用して、以下のことができます。

  • (青・ピカチュウ版のみ)最初からゲームを始めて手持ちポケモンの数を255匹にする[1]
  • 前のデータの手持ちポケモンを引き継いだ状態で最初からゲームを始める[2][3]

参考文献

[1] オーキドせんせい研究者、オーキドせんせい撃破RTA06:14【ポケモン初代(青) ゆっくり解説】 - YouTubehttps://www.youtube.com/watch?v=YrMjEehtOAg、2022年11月16日閲覧。

[2] しづき、続々・レポートを書くときに電源を切ると | 伝説のスターブロブ2、https://hakuda2.web.fc2.com/wario/poke4/f26-2.html、2022年11月19日閲覧。

[3] SRAM glitch - Glitch City Wikihttps://glitchcity.wiki/SRAM_glitch、2022年11月19日閲覧。

*1:電源OFF→ONによるリセット。ハードリセットとも言う。

*2:参照元では赤緑版について触れられていないが、後述のとおりレポートを書く処理が青版と同じであるため、青と同じタイミングでできる。

*3:1のロード処理のみ、1度目の比較で不一致だった場合はもう1度比較が行われ、それでも不一致だった場合のみ壊れていると判断します。

*4:ピカチュウ版では「ファイル~」

*5:00:A000h~03:BFFFhまでの8192*4バイト

*6:チェックサムは1バイト値のため、たまたま一致してロードに成功することもあります。

レポートのデータ構造(初代)

初代ポケモンのレポートは、SRAMに記録されます。初代ポケモンSRAMは32KiBであり、各8KiBのバンク4つ(バンク0~3)で構成されています。この記事では、各SRAMバンクごとのデータ構造を示します。

※開始アドレス・終了アドレスは、メモリ上のアドレスを示しています。
※未使用領域は、データクリア以外で読み書きすることはありません。

バンク0

表1 バンク0の構造
開始アドレス 終了アドレス サイズ(byte) 内容 備考
A000h A187h 392 グラフィックバッファ領域0 圧縮されているグラフィックデータの展開に使用される
(他のバッファ領域も同様)
A188h A30Fh 392 グラフィックバッファ領域1  
A310h A497h 392 グラフィックバッファ領域2  
A498h A597h 256 未使用  
A598h B857h 4800 殿堂入りデータ(50回分)  
B858h BFFFh 1960 未使用  

殿堂入りデータ

殿堂入りデータは1回あたり96バイトで、下位アドレス側から古い順に入っています。

表2 1回の殿堂入りデータの構造
オフセット サイズ(byte) 内容
0 16 1匹目の殿堂入りポケモン
16 16 2匹目の殿堂入りポケモン
32 16 3匹目の殿堂入りポケモン
48 16 4匹目の殿堂入りポケモン
64 16 5匹目の殿堂入りポケモン
80 16 6匹目の殿堂入りポケモン
表3 殿堂入りポケモンの構造
オフセット サイズ(byte) 内容
0 1 外見の内部番号
1 1 レベル
2 6 ニックネーム
8 8 00h (パディング)

1回の殿堂入りポケモンが5匹以下の場合は、その回の最後の殿堂入りポケモンの直後にFFhが入り、FFhより後ろの領域は全て00hとなります。例えば3匹で殿堂入りした場合、最初の3匹分は表3のデータが書き込まれます。4匹目は外見の内部番号にFFhが書き込まれ、残りの15バイト分の領域に00hが書き込まれます。5匹目と6匹目のデータは全て00hが書き込まれます。

バンク1

表4 バンク1の構造
開始アドレス 終了アドレス サイズ(byte) 内容 WRAM・HRAMの対応アドレス 備考
A000h A597h 1432 未使用    
A598h A59Dh 6 主人公の名前 D11Dh~D122h  
A59Eh ACD4h 1847 メインデータ D27Bh~D9B1h  
ACD5h AED4h 512 スプライトデータ C100h~C2FFh  
AED5h B02Ch 344 手持ちポケモンのデータ D123h~D27Ah  
B02Dh B592h 1382 現在選択中のボックスのデータ D9B2h~DF17h  
B593h B593h 1 ? FFD7h 詳細不明(タイル関連の値)
B594h B594h 1 チェックサム - A598h~B593hのチェックサム
B595h BFFFh 2667 未使用    

チェックサムは、次のようにして計算されます: 範囲内の値を1バイト単位で全て足し合わた値を256で割った余りを求める。その値をビット反転した値がチェックサムとなる。

レポートに書き込まれるWRAMのアドレスを昇順に並べると、次のようになります: C100h~C2FFh、D11Dh~DF17h
(すなわち、アドレスC000h~C0FFh、C300h~D11Ch、DF18h~DFFFhのデータはセーブされない)

バンク2・3

表5 バンク2・3の構造
開始アドレス 終了アドレス サイズ(byte) 内容 備考
A000h A565h 1382 ボックス1・5 バンク2はボックス1、バンク3はボックス5
A566h AACBh 1382 ボックス2・6 バンク2はボックス2、バンク3はボックス6
AACCh B031h 1382 ボックス3・7 バンク2はボックス3、バンク3はボックス7
B032h B597h 1382 ボックス4・8 バンク2はボックス4、バンク3はボックス8
B598h B598h 1 チェックサム A000h~B598hのチェックサム(このアドレス自身もチェックサムの計算対象になる)
ただし、このアドレスが読み込まれることはない
B599h BFFFh 2663 未使用  

外部リンク

Save data structure (Generation I) - Bulbapedia, the community-driven Pokémon encyclopedia *1

*1:リンク先の解説は英語版を対象としており、日本語版とは構造が違う点に注意