なるほどえたきちのブログじゃねーの

チラ裏雑記帳

ポケモン過去作の解析とか乱数調整とかそこら辺。不定期更新。

【FRLG】任意コード実行による色違いデオキシスの動的生成

色違い固定のエンカウント処理を走らせてみたくなったので作りました。

デバッグ環境はFR前期ROMですが呼び出し元を調整すればFRLG前期後期の4バージョンで動くと思います。
FRLGにおいてバグ技持ちの個体を入手していることを前提とします。

色個体生成の原理は以前投稿したこの記事のものとほぼ同じです。
bzl.hatenablog.com

以前のものと違う点は個体検索処理を全て任意コード側に任せていることです。
そのため、任意コードを打ち込んで実行するだけで任意の種族のポケモンとの色違い固定エンカウントが行えるようになります。

任意コードが長くなってしまっているので本来はバイナリエディタ起動環境を整えた後に実行する方が望ましいのですが、興味のある方は是非試してみてください。

・ボックス配置ポケモン



スクリプト呼び出し用ポケモン
TNの変更が面倒な場合はNNのみで充分です。
NNのみの場合バグ技の成功率は1/8から1/16に下がります。
へ(平仮名)と(カタカナ)の区別が付き辛いのでカタカナのみ赤字で記述しています。

FR 0x38C9用
ボックス12/22:NN『てムにうい』TN『てナにうい』
ボックス12/23:NN『てむにうい』TN『てなにうい』

LG 0x21BE用
ボックス12/23:NN『てにうい』TN『てチにうい』
ボックス12/24:NN『てへにうい』TN『てちにうい』


プログラム用ポケモン(ボックス13/12からスタート)
かなり数が多くなっているので、作業の簡略化のため容量度外視でNNのみ使用する形式にしています。

ボックス13/12:NN『てぺぷl』
ボックス13/13:NN『 Vうい』
ボックス13/14:NN『てぶぷl』
ボックス13/15:NN『7せ う』
ボックス13/16:NN『 むゆl』
ボックス13/17:NN『あミゆl』
ボックス13/18:NN『Gタゆl』
ボックス13/19:NN『かチゆl』
ボックス13/20:NN『あむゆl』
ボックス13/21:NN『あメゆl』
ボックス13/22:NN『いむゆl』
ボックス13/23:NN『だメゆl』
ボックス13/24:NN『てぶぷl』
ボックス13/25:NN『にえィボ』
ボックス13/26:NN『てべぷl』
ボックス13/27:NN『あにおィ』
ボックス13/28:NN『てぼぷl』
ボックス13/29:NN『ほ にか』
ボックス13/30:NN『てぱぷl』

ボックス14/1:NN『ィ  も』
ボックス14/2:NN『てぴぷl』
ボックス14/3:NN『へVうい』
ボックス14/4:NN『てぷぷl』
ボックス14/5:NN『ゆAあゆ』
ボックス14/6:NN『てぽぷl』
ボックス14/7:NN『ぎあい 』
ボックス14/8:NN『ELゆl』
ボックス14/9:NN『てぶぷl』
ボックス14/10:NN『ミ♂すぱ』
ボックス14/11:NN『てべぷl』
ボックス14/12:NN『hネ わ』
ボックス14/13:NN『てぼぷl』
ボックス14/14:NN『あWッぉ』
ボックス14/15:NN『てぱぷl』
ボックス14/16:NN『hネタグ』
ボックス14/17:NN『てぴぷl』
ボックス14/18:NN『3グでぞ』
ボックス14/19:NN『まLゆl』
ボックス14/20:NN『nぶゆl』
ボックス14/21:NN『Uべゆl』
ボックス14/22:NN『Cぼゆl』
ボックス14/23:NN『!ぱゆl』
ボックス14/24:NN『ぴゆl』
ボックス14/25:NN『ガぷゆl』
ボックス14/26:NN『ヤぽゆl』
ボックス14/27:NN『ELゆl』
ボックス14/28:NN『ぺぶレl』
ボックス14/29:空欄
ボックス14/30:空欄

・ボックス名



ボックス1:『リばレらァあFひ』
ボックス2:『アしぎガば』
ボックス3:『つべてぼなぱなぴ』
ボックス4:『アまLミBィC』
ボックス5:『へネリばくぼんふ』
ボックス6:『アアアくべぷづ』
ボックス7:『アア。ねノづ』
ボックス8:『アグねノぞ』
ボックス9:『けしチぞきる e』
ボックス10:『アアアガばほタ』
ボックス11:『アアミC  』
ボックス12:『アッぽ う』
ボックス13:『モタ  ぺLだ』
ボックス14:『うダなういィ く』

上記の打ち込みが終了したら、適当な野生ポケモン相手にバグ技を使用します。
技成功後に逃げるを選択し、戦闘を終了させるとイベントスクリプトが実行され、色違いデオキシス(フラグ付き)lv30が出現します。
f:id:BZL:20190923100219p:plain

使用したコードは以下の通りです。
このコードをSpecial0x1BB(固定シンボル個体生成処理)の前に挟んでSeed値を書き換えることにより、実行したROMに適合した色違いPIDを生成させています。
但し、この処理とPID生成処理の間に割り込みが入って乱数値が更新されてしまう可能性もあるので完全な100%出現ではありません。(所謂メソズレ)

.thumb
	
shinyseed_get:
	push {r4-r6, lr}
	ldr r3, =0x03004fa0
	ldr r4, [r3, #0xc] /*後期ROM*/
	cmp r4, #0x0
	bne tidget
	add r3, #0xa0
	ldr r4, [r3, #0xc] /*前期ROM*/
	
tidget:
	ldrh r0, [r4, #0xa] /*TID*/
	ldrh r4, [r4, #0xc] /*SID*/
	eor r4, r0 /*TID xor SID -> TSV*/
	ldr r5, [r3] /*初期Seed取得*/
	mov r0, pc /*b命令が後ろに飛べないのでpc更新で代用*/
	ldr r2, =0x00006073
	
shinysearch:
	mov r6, r5
	ldr r1, =0x41c64e6d
	mul r5, r1
	add r5, r2 /*LID生成*/
	mul r1, r5
	add r1, r2 /*HID生成*/
	eor r1, r5 /*HID xor LID -> PSV*/
	lsr r1, #0x10
	eor r1, r4 /*PSV xor TSV*/
	cmp r1, #0x7
	bls setseed
	mov pc, r0
	
setseed:
	str r6, [r3]
	pop {r4-r6, pc}
	
/*
イベントスクリプト
	setvar 0x8004 0x019A
	setvar 0x8005 0x001E
	setvar 0x8006 0x0000
	callasm shinyseed_get+1
	special 0x1BB
	special 0x138
	end
*/