『バーチャルコンソール版 ポケットモンスター金・銀』における任意コード実行について
あらかた遊んで楽しんだので、実用性のある自作コードをまとめておきます。
任意コード実行について
まず「任意コード実行とはなんぞや?」ということから説明いたしますと
ゲームのバグを利用して外部操作なしにゲーム中で任意のプログラムを記述し実行することです。(あってるかな・・・)
ポケモン、とくにGBシリーズではバグ技がもはやゲームの一要素として認知されており、
ニンテンドー3DSバーチャルコンソールにて配信された赤緑青ピカチュウ金銀クリスタルにおいても
原作と同様のバグ技が再現できることが話題になりました。
中でも金銀での任意コード実行は導入の手間が少ないことやメールによるコーディング環境のバランスが絶妙でお手軽に楽しめるようになっています。
このようにバグ技を利用した遊び方であるため、忌避される方もいらっしゃると思いますので利用の際はそういった配慮も必要かと思います。
基本的な導入案内は参考サイト様へお願いし、ここでは実際に実行するコードの紹介を行っていきます。
これらは主に「ポケムーバー」を通して第7世代へ転送することを目的としており、
VC内での対戦等にはあまり向かない内容です。
導入まとめ
理解できなくても出来る任意コード実行解説【ポケモン金銀ver】 - nakayoshibaddi’s blog
情報元
昔のポケモンの裏技を語る【アネ゛デパミ゛】 14 [無断転載禁止]©2ch.net
昔のポケモンの裏技を語る【アネ゛デパミ゛】 15
コーディング資料
ぽけもんばぐ・りっちーず
内部コード
Gameboy (LR35902) OPCODES
Z80命令説明書
金銀用翻訳機(メール・ボックス文→ニーモニック / 機械語→ニーモニック)
ポケモニック・逆アセンブラ
関連バグ
ポケムーバー 増殖バグ
コード集
種族変更
;手持ちの6番目の種族をボールポケット1番目の個数に応じて変更 ;1度使うとボールポケットの1番目と2番目の個数が251になり、 ;2番目が251個の状態で実行すると1番目の個数の図鑑番号に対応したポケモンに変化します。 ;参考リンク内の『ハイパー技マシン』を元に作成したものです。 ;@mail ;ぜ/がゆぼ5せづざはぞまづのョキ ;ゥゃれぜをがるひゼづの 000 ld l,F3 002 ld h,D5 004 ld a,FB 006 cp (hl) 007 ldd (hl),a 008 dec hl 009 jp z,CF2F 012 ldd (hl),a 013 ret 014 xor a 015 add (hl) 016 ld c,(hl) ; 改行 017 ld (DAE0),a 020 ld l,DD 022 ld h,D9 024 rrc l 026 ldd (hl),a 027 ret
経験値調整(レベル99調整・転送時の性格調整)(※コメントにてご指摘いただきコードの誤植を訂正しました。2018/08/19)
;手持ちの6番目の経験値を調整 ;経験値中位下位を0xd8c9に設定 ;*Lv99でなければ使うたびに経験値を65536増加 ;-経験値タイプによって使用回数が異なるが低レベルからだと12〜18回で99止めにできる。 ;-経験値をレベルに反映させるにはボックスに預けてすぐ引き取る。 ;*Lv99なら使うたびに経験値を1増加 ;-性格調整用 ;@mail ;ぜ9がれョににダせぜゥぐグぼのづ ;にダづどの 000 ld l,FF 002 ld h,DA 004 xor a 005 add a,C6 007 rrca 008 cp (hl) 009 ld l,EA 011 jr z,+07 013 ld a,C9 015 ldd (hl),a 016 ld c,(hl) ; 改行 017 add a,0F 019 ldd (hl),a 020 inc (hl) 021 ret
個体値調整(色違い調整・性別調整)
;色違い用個体値調整 ;手持ちの6番目の個体値を*AAAに固定し、攻撃個体値を+1し続けることで色違いと性別調整を兼ねる。 ;性別比にも無関係に全ての種族に対応している代わりに色違いになったかどうかいちいち確認しなければならない。 ;@mail ;ぜ0がれぼヲづにぷルにヂ0ザづの 000 ld l,F6 002 ld h,DA 004 ld a,AA 006 ldd (hl),a 007 add a,46 009 and (hl) 010 add a,10 012 or a,0A 014 ldd (hl),a 015 ret
転送用コピー(少々上級者向け)
;起動用関数 ;手持ちの6匹目を現在のボックスへ30匹コピーする。 ;上書きになるためその時点でボックスにいたポケモンは消滅します。 ;@mail ;ョぶへマだらへザよへャだの空空空 ;空はスペース。埋まってれば別になんでもいいけどバグ避けかつ入力が楽なので ;ごデドゼつづまの 000 xor a 001 inc a 002 call 309D 005 rst 10 006 call D60A 009 call 30AD 012 ret 013 ld a,a 014 ld a,a 015 ld a,a 016 ld c,(hl) ; 改行 017 ldi a,(hl) ; ここから転写用関数 018 ld (de),a 019 inc de 020 dec c 021 jp nz,CF32 024 ret
;メイン関数 ;非常に長いためわざマシンポケットで記述→パソコンの預かりアイテムへ転写するようになっています。 ;呼び出し先もそこになっているので起動用とメイン関数はこのペアで使用してください。 3E 1E 11 10 AD 12 13 47 21 E0 DA 7E 12 13 05 20 FB AF 3D 12 13 06 1E 21 E0 DA 0E 20 CD 32 CF 05 20 F5 11 F0 B0 06 1E 21 2E DB 0E 06 CD 32 CF 05 20 F5 06 1E 21 52 DB 0E 06 CD 32 CF 05 20 F5 C9 000 ld a,1E 002 ld de,AD10 005 ld (de),a 006 inc de 007 ld b,a 008 ld hl,DAE0 011 ld a,(hl) 012 ld (de),a 013 inc de 014 dec b 015 jr nz,+FB 017 xor a 018 dec a 019 ld (de),a 020 inc de 021 ld b,1E 023 ld hl,DAE0 026 ld c,20 028 call CF32 031 dec b 032 jr nz,+F5 034 ld de,B0F0 037 ld b,1E 039 ld hl,DB2E 042 ld c,06 044 call CF32 047 dec b 048 jr nz,+F5 050 ld b,1E 052 ld hl,DB52 055 ld c,06 057 call CF32 060 dec b 061 jr nz,+F5 063 ret
;転写用コード ;『わざマシンALL255個』と組み合わせてわざマシンで上記メイン関数コードを記述したらこのコードで転写。 ;@mail ;ゾづ ;ぜょがゆひゼ ;ヅザよ ; 必要に応じてこの部分を変更して転写先アドレスをいじる。これはパソコンのアイテムリスト先頭アドレス。 ;へよだの 000 ld c,32 002 ld l,E2 004 ld h,D5 006 rrc l 008 ld de,D60A 011 call 30D6 014 ret