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

チラ裏雑記帳

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

【ポケモンORAS】ID調整

ORASのID調整に成功したので適当に調整手順等を纏めます。





疑似乱数周りの仕組み(ID決定に関係するもののみ)

  • 乱数生成器はMT、TinyMTの2種類
  • ID決定にはTinyMTが使用される
  • それぞれの乱数生成器の初期seedは別の値になるが、「(セーブデータ依存の値)+(起動時間ミリ秒)」という点は共通
  • セーブデータが存在しない場合、「セーブデータ依存の値」は固定される
  • ID決定までのTinyMTの消費数は[13 + (名前決定後『いいえ』を選択した回数)]となる


ID調整方法の考察



ID決定に使用されるTinyMTは非線形となる処理を用いて乱数値を生成する為、逆算は困難。
但し、初期seedは高々32bitである為、以下の点を踏まえれば「起動時間を管理しながら出現するIDを複数個観測する」ことにより総当たりで特定可能なことが分かる。

  • 初期seedは「(セーブデータ依存の値)+(起動時間ミリ秒)」
  • セーブデータが存在しない場合、「セーブデータ依存の値」は固定される
  • 名前決定後、『いいえ』を選択しなければID決定までの消費数は固定される

初期seed決定に使用される起動時間は厳密には1ミリ秒単位だが、流石に人間業では管理不可能なので1秒(1000ミリ秒)程度に幅を広げる。
この場合、IDを4個ほど観測すれば充分に初期seed(以降基準seedと呼ぶ)を絞り込むことができる。

基準seedに経過時間ミリ秒を足した値がそのまま初期seedとなる為、ソフト起動時に1ミリ秒を合わせれば任意のIDを引くことができるようになる。
また、ミリ秒を合わせずとも出現したIDがどのseedから生成されたか高い精度で絞り込める為、SID/TSV/TRVの把握が非常に簡単に行える。

調整にあたっての理論的な説明っぽいのは以上の通り。
これらの作業を簡潔に行う為のツールを作成したので使い方を適当に紹介する。
DL:https://bzl.hatenablog.com/entry/2090/11/11/000000#6genTidSearch

基準seedの特定



ゲームを新しく開始し、出現したIDを確認する作業を4回行う。
この際にカウントダウンに対応したタイマーとカウントアップに対応したタイマーの2つを用意する。
この内前者は基準seed特定時の時間管理、後者は作業全体の時間管理に使用する。
1回目の確認を行う際、ソフト選択と同時に2つのタイマーを開始する。
筆者が調整した際は自作のタイマーを使用した。
DL:https://bzl.hatenablog.com/entry/2090/11/11/000000#CCTimer


基準seed検索タブの設定内容は以下の通り。

  • 「TID1-4」 → 出現したIDを入力する。
  • 「経過時間」 → [(ソフトの起動時刻)-(1回目のソフト起動時の起動時刻)]を秒数で入力する。
  • 「許容誤差」 → ソフト起動時刻の誤差の幅をミリ秒で入力する。

一通りの入力を済ませたら検索を開始する。
PCスペックにも依るが少し時間が掛かる。(検索処理が雑すぎるだけ)
複数の候補が表示された場合はミリ秒ズレの幅を見て現実的であるものを選ぶ。


目的のIDの検索



ID検索タブを開き、特定した基準seedを入力する。
目標ID条件を入力したら検索を開始する。
現在の経過時間から目標のフレームを決め、待機を行う。
この際に実際に待機する時間は[(出力された待機時間)-(1回目のソフト起動から経過した時間)]となる。

指定された消費数分TN決定後に『いいえ』を選択して乱数の消費を行う。
消費が終わったら『はい』を選択し、自由に動けるようになった時点でIDを確認する。
目標のIDでない場合、ズレ確認タブを開く。
目標フレームのseed、消費数と実際に出現したIDを入力し、計算を開始する。
ここで表示されるズレはミリ秒単位。
SID/TSV/TRVも出力されるので、これらの値を把握することが目的であるならここで作業終了してもよい。
任意のIDを狙う場合は再度目標フレームを決め、この手順を繰り返す。


あとがき



ポケモンXYのID調整に成功した」という噂を風の便りに聞いたので便乗してみました。
XYは持っていなかったので、取り敢えず手元にあったORASでチャレンジしてみましたがミリ秒合わせはかなり難しかったです…
難易度的に考えるとSID/TSV/TRVの把握の為に使った方がまあまあ実用的かと思います。
XYの方の手順/ツール等は噂の種の方が纏めてくれそうなのでそちらを待ちましょう。
詳細は知りませんがこちらはミリ秒ゲーではないようです。

XY買ったので調べてみたらできました。

bzl.hatenablog.com

作ったツールなど

何か気が向いたので、適当に作ったツールを纏めてみます。
ツール置き場(Google Driveに飛びます)

ハックロム開発用

ValzHex (バイナリエディタ)

開発言語 : C#

  • C#で多分初めて作ったツール。
  • バイナリエディタに関して周囲ではStirlingが一般的に多く使用されていたが、強制終了等のバグが多く微妙に不便だったので作った。
  • UI/基本機能はStirlingに搭載されていたものを参考に、ハックロム開発においてそれなりに使いそうな新機能を手当り次第適当に突っ込んだ。
  • デザインが陰湿なオタクっぽいので気に入っている。

追加した記憶が残っている機能は以下の通り。

f:id:BZL:20200623191921p:plain

GBA General Compressor (画像導入ツール)

開発言語 : VB.Net

  • プログラミングに触れてから多分初めて作ったツール。
  • 制作期間は1-2日くらい。
  • 既存の圧縮画像導入ツールが揃いも揃ってなんか致命的なバグを抱えていたので作った。(詳細はこちら)
  • LZ77圧縮アルゴリズムで参考になりそうなものが見つからなかったのでフルスクラッチで頑張った記憶がある。
  • 結果として、何かよく分からないが最高の圧縮率と解凍バグ回避を両立させることができた。

f:id:BZL:20200623194459p:plain

PokeDataGenerator (個体情報作成ツール)

開発言語 : VB.Net

  • ハックロムの各種データ拡張に対応した手持ちデータ作成ツールを要求されたので作った。
Trainer Edit (トレーナー情報編集ツール)

開発言語 : C#

  • 各種データ拡張に対応したトレーナー情報編集ツールが欲しくなったので作った。
  • シンセの代替品にできるように機能拡張する予定。
Space check

開発言語 : C#

  • 空き領域を検索してリスト表示するだけのツール。
BINtoIPS

開発言語 : VB.Net

普通にゲームを楽しむ為のツール

SW Seed Calculator (レイド乱数Seed検索ツール)

開発言語 : C#, C++

  • 8世代乱数調整が盛り上がっていたのでノリで作ったツール。
    レイド乱数用の初期Seedを検索できたりできなかったりする。
  • 学歴の都合上数Ⅱまでしか履修していないので検索処理の実装に滅茶苦茶苦労した。
  • 巣穴リストやGPU検索等の機能を1番初めに実装したツールだったりした気がする。(今となっては殆どのツールにある機能だけど)
  • 検索速度に拘りを持っていた時期があったので4連続個体値等でも現実的な時間でSeedを求められるようになっている。
  • もう少し検索処理を速くする案がいくつかあるのだが、再度数学とバトルしたり慣れないアーキテクチャアセンブリコード書かされたりしそうなのでまだ手を付けていない。
  • リスト表示機能は実装していないが、夜綱氏の8denSearchと機能連携させる形で対応している。→8denSearchの紹介記事

f:id:BZL:20200623201314p:plain f:id:BZL:20200623201418p:plain

TIDFinder (エメラルドID調整ツール)

開発言語 : C#

  • 乱数調整してるオタク共の集落に首を突っ込んだら「エメラルドのID調整は不可能」と色々な所で言われていたので作ったツール。
  • 実際の所、調整できないことはないが滅茶苦茶難易度高い。
  • 使い方とかの解説記事はこちら。

f:id:BZL:20200312221346p:plain

CCTimer (タイマー)

開発言語 : C#

  • トロデザインなフォームで何か作りたかったので突貫工事で制作した。
  • EonTImerの丸パクリ。

f:id:BZL:20200312221907p:plain

NX Macro Controller (Switch用画像認識マクロ管理ツール)

開発言語 : C#

  • OpenCVを使った何かを作ってみたかったので作った。
  • 作ったマクロを外部ファイル保存して他人にバラ撒くことができる。
  • 操作の記録機能や入力用フォーム等を用いて、GUI上の操作だけである程度自由にマクロを作ることができる。
  • ポケモンに関して言えばこれより良いツールいっぱいありそう。

f:id:BZL:20200120155920p:plain

用途不明

334Timer (タイマー)

開発言語 : C#

  • 3時34分に「334」とツイートするアレを高い精度でやりたかったので作った。
  • 目標の日付とミリ秒単位のズレを入力することでいい感じに時報ツイートを行える。
  • 慣れれば±8msくらいで大体安定する。

日本版エメラルドID調整

ほぼ不可能と言われていたエメラルドのID調整に成功しました。
先に言っておきますがルビサファのように簡単ではないのである程度乱数調整に慣れている方向けだと思います。
私自身は乱数調整したこと殆どないけど


まずIDの決定方法について。
決定タイミングは名前入力画面→OPの画面遷移時。
OP→名前入力画面の画面遷移時に開始したTimer-1の値を使用してIDを決定している。
この値はLCG32の乱数値とは異なり1F間隔ではなくCPUのクロック単位で値が変動する為、人力での調整は不可能と言われていた。
しかし、キー入力判定自体は1F間隔なのでいつも通り(?)フレームを合わせれば現実的な難易度でIDの再現ができる。
各フレームで出現するIDを予測することも可能だが、数式等で簡潔に表せるものではない為、詳細は割愛する。
数式等に起こす自信のある人が居られましたらちゃんとした情報提供するので連絡ください

因みに、SIDは通常のLCG32を用いて決定されている。
ID決定時にIDと同じ値をSeed値として格納している為、名前決定からOP終了までのフレーム数を調整すればIDからSIDを予測できる。

必要なもの



TIDFinder
・好みのタイマー(当記事ではCCTimerを使用しています)
・ボタンモードLR、サウンドステレオ設定の日本版エメラルド(海外版でも多少ズレはあるが可能)
・GBAROMが起動できるハード
神を信じる心

目標のIDを決める



適当に決めましょう。
今回はID00000を狙います。
同時にSIDのリストも表示されますので調整したい場合は適当に候補選んでおいてください。
f:id:BZL:20200312221346p:plain
赤字で表示されるものはSelectズレを使用することで目標ID付近が狙えるフレームです。
Selectズレによって目標ID付近が狙えるフレームの場合、ツールに表示されている回数分、名前入力画面でSelectボタンを押下してキーボード切り替えを行います。
そうでないフレームの場合はSelectボタンの押下回数が表示されている回数と一致しないようにします。
このフレームの場合はSelect押下回数0でズレが発生する為、平仮名のみのTNを使用する場合でもキーボード切り替えを行うようにします。

実践


!注意

ここでのキー入力は長押しではなくすぐ離すような形にしてください。
画面遷移時にキー入力が発生していると出現するIDが少しズレます。(ズレる値はフレームと入力されたキーによって変動する)
フレーム合わせ後はIDの微調整に利用可能なのでお試しあれ。


実際にやってる所を撮影したので参考程度にどうぞ。

今回狙うフレームはFrame1が1636F、Frame2が1208Fなのでこのようにタイマーセットしておきます。
f:id:BZL:20200312221907p:plain

まずはロード画面で『さいしょから はじめる』選択と同時にタイマーをスタートします。
f:id:BZL:20200312221657p:plain

この画面でFrame1の指定フレーム分待機を行います。
f:id:BZL:20200312222219p:plain

この画面でFrame2の指定フレーム分待機を行います。
Selectズレの調整も忘れずに。
f:id:BZL:20200312222420p:plain

SID調整を行う場合、この画面でFrame3の指定フレーム分待機を行います。
f:id:BZL:20200312222451p:plain

入力フレームに誤りがなければ、目標IDにある程度近いIDが出ると思います。
この手順を目標IDが出るまで繰り返します。
f:id:BZL:20200312223144p:plain

試行回数をある程度重ねれば神へ祈りが届けば目標のIDが出ます。
f:id:BZL:20200312223255p:plain

あとがき



調査を重ねた結果、ある程度現実的なレベルでエメラルドのID調整が出来るようになりました。
尚、実際にやってみると分かりますがSID調整まで行うのは割とマゾの所業です。
私人間じゃないよって方は是非チャレンジしてみてください!
任意IDでの固定シンボル色乱数等がやりたい場合、正直言ってルビサファの方で行うのが精神衛生上宜しい気がします。
FRLGも同じような手順でID調整が可能になったはずですがツール側の検索がまだ対応していません。
いつかやると思います。

【Nintendo Switch 自動化】画像認識マクロツール NX Macro Controllerの使い方

大幅更新に伴い、記事の内容の修正中です。
旧verのサポートについては今後行う予定はありません。

結構前に画像認識と入力キー設定をGUIのみで行えるツールを作ったのですが、使い方に関して全く説明していなかったので大雑把に纏めておきます。


1)このツールでできること

  • PCに接続したキーボード/コントローラーを使用したNintendo Switchの操作/記録/実行
  • PCに接続したキャプチャーボードを使用したNintendo Switchの画面キャプチャ
  • 独自構文を用いたマクロの作成/保存/読み込み
  • 入力補助フォームを用いたマクロの作成
  • 作成したマクロの公開
  • LINE Notifyとの連携
  • Poke-Controller用に作られたプログラムの実行 ※一部動作しないものもあり
  • CH552マイコンをコントローラーとして認識させる為のファームウェア書き込み
  • Bluetoothドングルをコントローラーとして認識させる為のドライバインストール

3)必要環境

4)操作方法

ブログでは纏め切れないため、wikiを立ち上げて纏める予定です。

大まかな使い方についてはDiscordサーバーのチュートリアルを確認してください。
開発バージョンの先行公開やバグ報告受付もこちらで行っているので、自動化という遊び方に興味を持っている方は是非入って頂けると幸いです。
discord.gg

【SwSh】ポケモン剣盾 レイド乱数調整用ツール SW Seed Calculatorの使い方

ツール作るだけ作っておいて使い方の解説を全くしていなかったので一応纏めておきます。

2020/02/27 追記
v3.00以降からツールの仕様が色々と変わったので加筆修正


1)ダウンロード



必要動作環境(普通にPCを使っていれば勝手に環境整っていると思うので上手く動作しなかった場合に確認するくらいでよいと思います。)

任意オプション

  • グラフィックボード
    • Seed検索でGPGPUを利用できます。GeforceRadeonで動作確認しています。
  • 8denSearch
    • 夜綱氏制作のリスト表示&消費数管理ツールです。本ツールの保存ファイルとの互換性があります。
バージョン 更新日 DL 更新内容
SW Seed Calculator v5.04 2022/03/22 Download CUDA Tool Kitの更新
世代の古いCPUで動かない可能性があったのを修正
SW Seed Calculator v5.03 2021/04/21 Download 起動処理の微修正
巣穴データベースの更新
SW Seed Calculator v5.02 2020/11/28 Download 起動処理の微修正
SW Seed Calculator v5.01 2020/11/26 Download プロファイル周りの不具合を修正
計算した個体値が出力されないことがあったのを修正
SW Seed Calculator v5.00 2020/11/23 Download カンムリ雪原の巣穴データ追加
プロファイル仕様変更
一部バグ修正
SW Seed Calculator v4.02b 2020/07/13 Download 連続で異なるseedを計算すると結果が出ない可能性があったので修正
再計算回数の上限を30に変更
SW Seed Calculator v4.02 2020/07/13 Download 日付の指定ができるように変更
Seed検索アルゴリズムの最適化
3連続個体値検索をオプションで使用可能に変更
一部バグ修正
SW Seed Calculator v4.01 2020/06/22 Download 個体値の入力補助機能の調整
一部バグ修正
3連続個体値検索を封印(機能自体は残っています)
SW Seed Calculator v4.00 2020/06/22 Download ヨロイじまの巣穴データ追加
Seed誤検出の対策機能追加
個体値入力フォームのバグ修正
英語版のバグ修正
SW Seed Calculator v3.10 2020/06/18 Download ポケモンの種族データ追加
SW Seed Calculator v3.09 2020/06/08 Download 説明書のミス修正
SW Seed Calculator v3.08 2020/06/06 Download 起動時に特性が正しく読み込まれていなかったのを修正
ミントのバグを修正
取扱説明書追加
SW Seed Calculator v3.06 2020/04/10 Download 特定の状況においてSeed計算が正しく行えていなかったので暫定対応
個体値計算機にミント使用のチェックを追加
SW Seed Calculator v3.05 2020/03/21 Download 夢固定スロット対応
ツールの更新チェック追加
その他色々変更
SW Seed Calculator v3.04f 2020/03/16 Download 一部環境で起動しない問題に暫定対応
3連続個体値検索に対応(NVIDIAGPUのみ、非常に時間が掛かる為非推奨)
中断処理の挙動を少し改善
その他色々変更
SW Seed Calculator v3.03 2020/02/28 配布停止 夜綱氏制作の8denSearchとの連携機能追加
巣穴選択GUIを追加
ポケモンの種族から巣穴を検索できるように
検索速度向上
CPUから4連続個体値での検索ができるように
その他色々変更
SW Seed Calculator v2.04 2020/01/16 Download Seed検索処理の高速化
4日目1体のみでも検索できるように
夢固定対応
SW Seed Calculator v2.03 2020/01/14 配布停止 Seed検索処理の最適化・バグ修正
個体値パズル処理のバグ修正
特性リスト取得時のバグ修正
SW Seed Calculator v2.02 2020/01/14 配布停止 イベントレイド対応
Seed検索処理のバグ修正
個体値パズル処理のバグ修正
英語OSで起動できない問題修正
SW Seed Calculator v2.01 2020/01/13 配布停止 個体値計算機がいつの間にか色々バグってたので修正
SW Seed Calculator v2.00 2020/01/13 配布停止 GPUを使用した計算処理に対応
巣穴リスト表示に対応
個体値パズル機能の最適化
計算処理の最適化

2)ツールの初期設定


  • ①. ツール起動後、『編集』ボタンをクリックしてプロファイル作成フォームを開く。

  • ②. TN、ROMのバージョン、バッジの数を入力してからセーブデータを登録する。
    • Seedとバッジの数は後から変更できる。
    • 保存されたプロファイルは夜綱氏制作のツール『8denSearch』のものと互換性があるので、『セーブデータ管理->プロファイルの参照ディレクトリを変更』から保存先を揃えておくと連携しやすい。
    • 保存されたプロファイルはツール終了時に更新しているが、『プロファイルの保存』からでも更新できる。


3)Seedの特定作業


目的のポケモンが出現する巣穴を調べる
  • ①. 『巣穴マップを開く』ボタンをクリックすると巣穴選択フォームが起動するので、狙いたいポケモンの種類を入力して『巣穴を検索』ボタンをクリックする。
  • ②. 巣穴のリストが表示されたら、適当な巣穴の項目をダブルクリックするとその巣穴が選択される。
    • リストが表示されない場合はゲームの進行状況が出現条件を満たしていないか、そもそもレイドに出現しないポケモンを選択している可能性がある。
  • ③. 『巣穴を決定』ボタンをクリックして巣穴を確定する。


4日目(1体目)の個体情報を調べる
  • ①. 最後にセーブした所から日付バグを3回行い、4日目のポケモンを捕獲する。(この際、捕獲するポケモンは1~3vの個体にすること)
    • この際、出現したポケモンが4v以上の場合はもう1度この手順を行う。
  • ②. 個体値を調べ、ツール左端の『4日目』の個体値入力欄に個体値を入力する。
    • 種族と性格を入力した後、『個体値計算』をクリックすると個体値計算機が起動する。
    • ツール内蔵の個体値計算機で個体値を確定させた後、『結果を出力して終了』を押せば個体値が自動的に入力される。
    • この際に特性等の他のパラメータも入力する。
    • ここで特定した個体値のV数が事前に調べていたV固定数と異なる場合、自然発生Vが混じっているので計算不能となる。
      この場合日付変更バグを1回行い、セーブしてから再度①に戻る。
    • 『利用できない個体値です』と表示された場合日付変更バグを1回行い、セーブしてから再度①に戻る。


4日目(2体目)の個体情報を調べる
  • ①. リセットし、最後にセーブした所から日付バグを3回行い、4日目にツールで指定された固定V数のポケモンが出るまで繰り返す。
    • 例として、『4V->6連 3V->5連』と表示された場合は4V又は3Vのポケモンが必要となる。このケースの場合は4Vの方が得られる連続個体値数が多くなるのでこちらを使用するのが望ましい。
    • 『1日目のみで検索可能です』と表示されている場合2体目を入力しなくても検索可能だが、得られる連続個体値数が少なくなるのでPCスペックによっては2体目を用意した方が良い。
  • ②. 個体値を調べ、ツール左端の『4日目(2体目)』の個体値入力欄に個体値を入力する。入力内容に誤りがなければツール左下の『連続個体値』欄に自動で値が入力される。
    • この際に特性等の他のパラメータも入力する。
    • 使用する個体値計算機は日付に合わせたものを使用する。
    • もしここで値が入力されない場合、V固定数が間違っているかツール側の不具合なので、後者の場合は自分で値を入力する。
      (個体値パズルについては夜綱氏のnoteを参考にすると分かりやすい)
5日目以降の個体情報を調べる
  • ①. リセットし、最後にセーブした所から日付バグを4回行い、5日目のポケモンを捕獲する。(この際に捕獲するポケモンのV固定数は問わないが少ないV固定数の方が候補を絞り込めるので効率がよい)
  • ②. 個体値を調べ、『5日目』のパラメータ入力欄に個体値、性格、特性、個性を入力する。
    • 『6日目の個体情報を使用する』を有効にしている場合は6日目の個体情報も同じように入力する。
      (この際に捕獲するポケモンのV固定数は問わない)
  • ③. 左下『最下位bit計算』をクリックすると個性に合わせてEC(暗号化定数)最下位bitが計算される。
    • 個性、個体値によっては計算できないこともあるが、そのまま操作を続行して差し支えない。
  • ④. 検索補助オプションを自分の環境に合わせて設定する。
    • 『Seedを一つ見つけたら計算終了』
      • 条件に合致したSeedが見つかった時点で計算処理を中断する。
    • 『Seedを見つけるまで計算を続ける』
      • 下記『再計算をn回まで考慮する』のリミット解除オプション。
    • 個体値再計算の考慮数』
      • V固定位置の再計算回数の指定
        この回数を増やせば増やす程Seed特定漏れのリスクが下がるが計算時間もそれに乗じて長くなる。
    • 『検索に使用するデバイス
      • CPU(100%):CPUをフルに使用する。
      • CPU(50%)CPUの最大スレッド数の半分を使用する。
      • OpenCL:GPUを使用する。
      • CUDA:NvidiaGPUでのみ使用できる。OpenCLと同様GPUを使用するがこちらの方が速い。


  • ⑤. 右下『検索』ボタンを押して計算処理を開始する。
    • 結果は『1日目のSeed』に出力される。
    • 必ず正確なSeed値が割り出されるとは限らないので、5日目以降の他のV固定数の個体や6日目以降の個体等との情報とも照らし合わせてSeedの確定を行うとよい。
    • 4日目、5日目に他のV固定数の個体が入手できる場合、それを捕獲して再度パラメータ入力、『Seedの絞り込み』で照らし合わせることができる。

特定したSeedの情報は『Seed情報出力』ボタンをクリックすると外部ファイル保存できる。
ここで保存したファイルは夜綱氏制作のツール『8denSearch』で使用可能。

【FRLG/Em】GBA版ポケモンの解析・ハック

はじめに



この記事はPokémon Past Generation Advent Calender 2019 14日目の記事です。

恐らくはじめましての方の方が多いと思うのでまずは自己紹介から入ろうと思います、ぼんじりと申す者です。
普段は3世代のROMハック界隈でASMハックやROM編集ツールの開発等を行っています。
要するに極悪違法改造厨なので苦手な方はブラウザバックをお願いします。

FRのハックロムである某ットモンスタープロキオン/デネブにASMハック(具体的には拡張PCボックスや新仕様のポケモン図鑑等)の提供をしていたりするので遊んだことのある方ならどういうことをしているオタクなのかある程度は想像つくかもしれません。
私自身は乱数勢でも何でもないのですが、ポケモン最新世代についての記事なら何でも良いと言われたのでこの度寄稿させて頂きました。

というわけでGBAポケモンの解析環境やハックの流れ等について大雑把に纏めてみようと思います。
どうでもいいですがこの文章を書いている時点で13日の22時だったので非常に焦りながら書いています。

解析・ハックに使用するツール類



解析するだけなら必要なツールはあんまり多くありません。
極論言ってしまえばエミュとバイナリエディタで全てを完結させることも可能なのですが、それでは効率があまり宜しくないのでハック界隈で良く使われる(多分)便利なツールを纏めます。

コンパイラ


devkitPro

プログラム周りのハックを行う上では非常に重要です。
asm,cで記述したソースコードコンパイルしてGBAで実行可能なバイナリデータに変換する為の開発環境です。

エミュレータ


VisualBoyAdvance-1.7.2

定番中の定番GBAエミュですね。
かなり古いものなので動作速度の再現性等に少々難があったりします。
ソフトウェアとしての安定性はピカイチです。
1.8以降のものもありますがブレークポイントが上手く機能しないので解析作業には向いてないと思います。
DL:https://ja.osdn.net/projects/sfnet_vba/downloads/VisualBoyAdvance/1.7.2/VisualBoyAdvance-1.7.2.zip/

VBALink

エグゼの熱帯等で使われるエミュです。
通信周りの処理やメモリの挙動を調べる時に使ったりします。
挙動がかなり不安定なのでデバッグがしたいだけならAndroidのMyBoy,又は実機で動作確認する方が楽です。
DL:https://web.archive.org/web/20150515221127/http://vbalink.wz.cz/#download

VBA-RR

TAS用エミュです。
音ズレの無い録画機能、LUAの実行といった強力な機能を備えているだけでなく、エミュとしての再現度も結構高いです。
ブレークポイントを踏むとバグるという欠点さえなければVBA1.7.2は完全に御役御免だったと思います。
DL:https://code.google.com/archive/p/vba-rerecording/

NO$GBA

エミュとしての再現性は終わってますがデバッガが非常に優秀です。
正直VBA1.7.2とこれだけあれば充分な気がします。
DL:http://problemkaputt.de/gba.htm

バイナリエディタ


Stirling

多分恐らく全人類が使っている超定番バイナリエディタです。
あなたのPCにもきっと入ってるはず。
事実機能性は他のバイナリエディタの追随を許しません。
バイナリエディタはこれ一つあればまあ充分だと思います。
DL:https://www.vector.co.jp/soft/win95/util/se079072.html

HxD

海外コミュニティで主流のバイナリエディタです。
というか海外勢でこれ以外のエディタ使ってる人見たことない。
GBA解析に関わる機能に絞って見ればStirlingに勝っている所が外部コピペ可能な所くらいしかないように思える…
海外でバイナリハックがクソとか言われてる原因の6割くらい占めてそうな機能性なのでメインで使うのはあまりおすすめしません。
DL:https://mh-nexus.de/en/hxd/

ValzHex

私が作ったバイナリエディタです。
StirlingのUIをベースに色々機能追加した感じになってるような気がしますがバグが多そうなのであまりおすすめしません。
DL:https://drive.google.com/drive/folders/1lL0zZ36J-qfxvkprHSRcb9GNSRXGmuro?usp=sharing

画像編集ツール


GBAGE

画像抽出に関して言えば最強です。
書き込みも可能で尚且圧縮効率がunlz並に良いので画像関係全部これで良いのでは?と思われるかもしれませんが実機BIOSで扱えないバイナリデータを書き込んでくれるので導入には絶対に使用しないでください
DL:https://forums.serenesforest.net/index.php?/topic/26913-nintenlords-hacking-utilities/

GBAGC

私が作った画像導入ツールです。
unlzと同程度の圧縮効率とGBAGE並の書き込みオプション数を実現できていると思います。
画像周りはこれ一つで大体完結しそうな気がします。
DL:https://drive.google.com/drive/folders/1BYcA2h4yLCRUaBli6ari1AgcXwacPFsE?usp=sharing

スクリプト編集ツール


XSE

海外製スクリプト編集ツールです。
日本語に対応していません。
DL:https://github.com/Gamer2020/Unofficial_XSE/releases

PKSV

海外製スクリプト編集ツールです。
日本語に対応していません。
DL:https://sourceforge.net/projects/pk-script-view/

ScripTEditor

日本製スクリプト編集ツールです。
スクリプトのフォーマットを外部ファイルで管理しているので自作スクリプトの定義を追加したりできます。
AM連携に対応していません(割と致命的)。
DL:http://seelog.nobody.jp/Pokemon_Hack/SoftWare/ScripTEditor.html

音楽編集ツール


Sappy2006mod17.1

ROM内のBGMを試聴したり自作BGMを書き込んだりできるツールです。
音楽周り詳しくないのでそれ以上に説明することがありません。
DL:https://u3.getuploader.com/pkkai/download/136

VG Music Studio

試聴に関しては最強です。
BGMをwav出力できたりもします。
DL:https://www.pokecommunity.com/showthread.php?t=409327

voicetable_check

私が作った音源移植ツールです。
完全に自分用に作ったお遊びツールだったのですが公開して欲しいとの声があったので公開しました。
適当に作っているだけあって使いづらさMAXなのでれどめには必ず目を通してください。
DL:https://drive.google.com/drive/folders/1YsU7Jhs4oOVx7mC5zyGpUoKHq2tsi6sd?usp=sharing

Cry Editor

海外製の鳴き声編集ツールです。(鳴き声が音楽関係のアレソレであるかはともかく)
DL:https://drive.google.com/drive/folders/1cjZjAsuUVHz-tTX_5hPECp4cgMZZfUzw?usp=sharing

その他用途が限定的なツール


AdvanceMap 1.92

超定番マップ編集ツールです。通称AM
マップ構造からエンカウントテーブルといったマップに直接紐付けられたデータの他、XSE等と連携することでNPCスクリプトも見られます。
DL:http://ampage.no-ip.info/index.php

pokemon_Synthesis

ポケシンセと呼ばれることが多いです。
ポケモン種族値やタイプといった種族情報、ポケモン画像、トレーナーデータの編集等ができます。
DL:https://ux.getuploader.com/hackwiki/download/13

PTE

テキストのバイナリ変換/導入がメインのツールです。
PDCでは対応していなかった漢字の読込にも対応しているので漢字パッチ導入環境の場合はこちら一択になります。
DL:https://ux.getuploader.com/freehack/download/165

PokeDataGenerator

手持ちポケモンデータを作成するツールです。
ボール拡張やポケモン枠拡張のような各種拡張系ハックの殆どに対応済みです。
DL:https://drive.google.com/drive/folders/1MBXTjRU5Y59ld5n1mt1_vJ-zIiaobtwG?usp=sharing



結構適当に纏めたので抜けはあると思います。
改めて見ると使うツールが多すぎる…

実際に適当なハックを作ってみる



前日眼鏡ポッポ氏が投稿した記事に『どなたか日本版FR-20集めてください。』とのコメントがあったので試しに初期Seed集め補助用のプログラムを組んでみようと思います。
ちゃんとFR-20(BPRJ1.0)用です。

初期Seedを集めるにあたって実機を利用することが大前提になると思うので、がいと氏やトノ氏が使用しているBot環境が必要になると思います。
Bot環境を利用する場合、画面内に初期Seedにあたる文字列を表示させることができれば画像認識等で簡単に取得することができるはずなので、今回は『初期Seed決定後のつづきからはじめる画面に初期Seedを表示させる』ハックを制作します。
この挙動を実現するにあたって必要な作業をリストアップしてみます。

①初期Seedの数値を取得、文字列変換
②つづきからはじめる画面内の何れかのテキストの参照を変更し、①を読むようにする

たったの2つなのでかなり少ないですね。(残り時間1時間しかないのでまあまあ妥当ではある)(現在時刻23時)
というわけで①の内容を実現するための処理を組んでみます。
言語はCです。

#include "lib/gba_types.h"
#include "lib/gba.h"

#define seed ((u16*)0x02020000)[0x0]
#define ram ((u8*)0x0203D000)

ROM_DATA void main()
{
	u8 seedbit;
	//16bitのデータを4bitずつに分けて文字列変換する
	for (u8 i = 0; i < 4; i++)
	{
		//4bit抽出
		seedbit = (seed >> (i * 4)) & 0x0F;

		//変換
		if (seedbit < 0x0A)
		{
			//数字
			seedbit += 0xA1;
		}
		else
		{
			//A-Fの英字
			seedbit += 0xB1;
		}

		//変換した文字の代入
		ram[3 - i] = seedbit;
	}
	//終端文字の設定
	ram[4] = 0xFF;
}

めちゃ雑ですが取り敢えずこの処理を通せば0x02020000に記録された初期Seedが文字列に変換されて0x0203D000に展開されるようになります。
次は②の参照先の変更を行います。

今回は『つづきから はじめる』の文字を初期Seedの変換後テキストに差し替えます。
まずはPTEを起動し、左側のテキストボックスに『つづきから はじめるΩ』と入力します。(Ωは終端文字)
『オフセットの検索』ボタンを押すと0x3dd22aというアドレスが引っ掛かります。
これが『つづきから はじめる』テキストの読込先アドレスです。
f:id:BZL:20191213233612p:plain

表示されるテキストの参照を変える為にはこの読込先アドレスを特定し、そのアドレスを指定したポインタを改変する必要があります。
今回は0x083dd22aを指すポインタを変更したいのでバイナリエディタを使用して『2A D2 3D 08』でサーチします。
f:id:BZL:20191213234307p:plain
f:id:BZL:20191213234656p:plain
2箇所ヒットしたので両方共[2A D2 3D 08][00 D0 03 02]に置換します。

当然ですがこの置換だけでは0x0203D000に値が代入されず、テキストが表示されないのでどこかしらに①で組んだ処理を埋め込む必要があります。
今回改変した領域は2箇所共関数0xC1A0にあたる箇所なのでこの関数の先頭に変換処理を埋め込みます。
ROM内の処理に直接挟み込む為、ARM7TDMIコアのアセンブリ言語を使用します。
処理の内容としては関数0xC1A0の頭を0xB00000へのジャンプ文に変更し、0xB00000で本来の処理と0xB00100に埋め込んだ①の処理を実行させてから元のアドレスにジャンプする、といったものになっています。

.thumb

.org 0xC1A0
	ldr r1, =0x08B00000
	mov pc, r1
.ltorg

.org 0xB00000
	push {r4-r7, lr}
	mov r7, r8
	push {r7}
	sub sp, #0x10
	mov r5, r0
	ldr r4, =0x08B00100
	bl linker
	mov r0, r5
	ldr r1, =0x0800C1A8
	mov pc, r1

linker:
	mov pc, r4
.ltorg

以上で導入作業は終了です。
f:id:BZL:20191214000201p:plain
実際に起動してみると初期Seedがバッチリ可視化されていますね。
画像認識やキーマクロと組み合わせれば初期Seed集めがかなり効率化されると思います。
実際に実機で動かす場合は海賊版カートリッジに焼くか、EzOmega等のマジコンを使用すれば実際の市販カートリッジと同様に動作させることができます。

今回作ったハックの差分パッチはこちらに投稿しておきます。
https://ux.getuploader.com/BZL/download/186

最後に



ハック勢、乱数勢問わず『解析関係に興味はあるが何から手を付ければ良いか分からない』という方は相当数いるかと思います。
今回私が投稿した記事がそのような方々の助けになれば幸いです。
色々と稚拙な文章でしたが、ここまで読んで頂きありがとうございました。


次回の担当は剣心氏です。

【Em】ふしぎなカードの偽造その2

この記事を読んでいることを前提とします。
bzl.hatenablog.com


今回はオリジナルのふしぎなカード(ポケモン受け取り)作成についてすごく雑に纏めます。
どんな具合の挙動になるかは以下の動画をご覧頂ければ理解できると思います。

データ作成ツールは以下のリンクからDLできます。
https://bzl-web.com/file/Wonder Card Printer/Wonder Card Printer.zip


このツールではカードのデザインやテキストデータ、受け取れるポケモンの情報等が設定できます。


設定後、データを保存したら出力された.wc3ファイルを適当なバイナリエディタで開いてください。


ここで開いたデータの頭から0xF8byteのデータがカードのデータになります。
偽造その1と同じ手順でカードのアドレスを特定し、そのまま0xF8byte分書き込んでください。

0xF8以降の0x3ECbyteのデータはスクリプトのデータです。
このデータは配達員スクリプトの格納メモリに書き込んでください。

書き込みが終了したらふしぎなおくりものメニューからミスがないか確認してください。

作成したカードが正常に読み込まれたら成功です。


また、このツールで作成できるカードは1度のみ受け取り可・カード再配布不可の設定にしています。
フラグは共用なので別のカードを作成しても受け取ることはできませんのでご了承ください。
任意スクリプト実行等でフラグ0x01E7をOFFにすれば一応は何度でも受け取れます

ポケモン受け取り以外のカードが作りたい方はこちらを参考にデータを作成してください。
イベントスクリプト - 改造ポケモン制作資料 Wiki*