DQ3 エターナル の開発環境を、備忘録も兼ねてご紹介しておこうと思います。あと裏話なども。
1. 開発ツール
1-1. SFCGENEditor
パッチ内容のほとんどをこちらのツールで作成しました。データの閲覧や編集をはじめ、SR(サブルーチン)までも扱うことが可能です。別のアセンブラを用意する必要もなく、SRの新規定義、行の一括挿入、ジャンプ先の表示や移動もサポートしており、非常に扱いやすいソフトウェアです。そして、Alt+← と Alt+→ とで画面を行き来する機能がとても嬉しい。配布サイトを見ると個人製作されたようなのですが、これ1つだけでパッチ開発ができるほどの完成度に仕上がっていて脱帽です。
1-2. Stirling
バイナリエディタです。SFCGENEditor にもバイナリエディタは付属していますが、Stirling の利点はバイナリ比較にあります。2つのバイナリの相違点をシンクロスクロールで見られるのと、アドレスにマークを付けて移動できるので重宝しています。
1-3. bsnes-plus
デバッガとして使用しています。メモリやレジスタの値をリアルタイムで追えるので、SRが何をしているのかを理解するのに非常に役立ちます。ややCPU負荷がかかるため、通常プレイでは後述するエミュレータを使用した方が良いです。Geiger’s Snes9x Debugger というデバッガもありますが、そちらは環境によって別途DLLが必要になります。
1-4. WinIPS
IPS形式のパッチを作成、適用する際に使用しています。編集中の .smc にテスト用パッチをささっと適用してテストプレイ、という流れでパッチの開発を行っています。
1-5. Flips
BPS形式のパッチを作成する際に使用しています。DQ3ではマイナーな形式ですが、規格は新しいらしく、ファイル容量がかなり小さくなります。利用者が環境に合わせて選べるよう、こちらの形式も同梱しています。
2. エミュレータ
2-1. Snes9x
おそらく最も有名なSFCエミュレータかと思います。私も、パッチ開発だけでなく通常プレイの際もこちらを利用しています。
特に開発段階においては、”snes9x.conf” を開いて以下の行を FALSE にした方が良いです。ROMと同名のパッチがある場合に自動適用する設定のようで、テストプレイに支障をきたします。
[ROM]
Patch = FALSE
他はデフォルトのままで問題ありません。画質については、メニューの Video > Display Configuration を開いて Output Image Processing を変更すると、高解像度化することができます。
それから、どうしてもデバッグモードを利用したいときは、ドラクエ命 様の情報を参考に、チートに次のコードを入力すれば良いでしょう。通常プレイで使用することはお勧めしません。
C1FFFE=FF+C1FFFF=FF+C02799=80+C6FFFA=80
2-2. bsnes
こちらのエミュレータも、同名のパッチが自動で適用されるようです。設定を変更する箇所が見当たらないため、そもそもROMのフォルダにパッチを入れておかない方が良いと思います。
通常プレイにおいても、IPS形式のパッチが存在すると「IPS is a terrible patch file format」というダイアログが出てしまいます。一方のBPS形式の方は、ROMサイズを拡張している場合に「error: source size mismatch」というダイアログが出てしまいます。どちらもダイアログを閉じればプレイ可能ですが、煩わしいのでパッチファイルは別にしておきましょう。
3. エターナルの裏話
3-1. 開発の思い
今回、DQ3のハックロム開発というものに手を出しました。2024年に発売されたHD-2D版はクリアしたんですけれども、なんだかDQ3とは別のゲームになっていて、これは自分でリメイクしちゃおうと思いました。とにかくSFC版が神すぎる。
IPSパッチ自体は昔から知っており、いくつか利用させていただいたこともあります。大掛かりなパッチにはとても追いつける状況ではありませんから、私は私らしくシンプルなものを作ろうということになりました。
目玉の1つ、やまびこのぼうしはどうしても入れたくて頑張って作りました。やまびこイオナズンが好き。これを理由にDQ5ではフローラしか選んだことがないくらいです。バランスブレイカーであることは承知の上で、アレフガルドの途中で入手できるようにしてあります。ゲームですから、こういった爽快感はとても大事。ザオリクについては、こだましても同じキャラにかかるため意味はありません。対象外にするか悩んだものの、ザオラルはこだまするのにおかしいかなと思って残してあります。ベホマはゾーマ戦のためにこだまする仕様になっています。
もう1つの目玉で、個人的に気に入っているのがほぼまんたんです。まんたんコマンドってHPが1でも減っていると回復してしまうので使ったことがないんですが、ほぼまんたんは他のナンバリングで愛用しています。エターナルに導入するに当たり、まんたんを残すか悩んだ末に完全に入れ替えることにしました。わざわざまんたんの方を使う場面って…ないよね?MPが多いキャラが回復呪文を唱えるようにしたのもこだわった部分で、最後尾の賢者が攻撃も回復も担当して一人だけ消耗しまくる、みたいな事態は避けられたと思います。
それから、UIの動作も変更してあります。特に、つよさコマンドから習得呪文を見ていったとき、最後の呪文ウィンドウの後に全ウィンドウが閉じてしまうのを防いでいます。これにより、各キャラの呪文をチェックしやすくなったと思います。同様に、他のコマンドでもなるべく決定ボタンで全ウィンドウが閉じないように動作を変更しています。元々「Y」ボタン(おぼえるボタン)で全ウィンドウを閉じることができるので、問題ないでしょう。
変更点の数はそこそこありますが、全体的に考慮したのは「パッチを入れていることをいつの間にか忘れてしまう」ようなパッチになればいいな、ということです。オリジナルのゲームバランスが素晴らしいので、シンプルなパッチとしてそれらを崩し過ぎないように気を付けました。適当に設定した項目は1つもありません。オリジナルを最大限に尊重しつつ、よりプレイしやすいものに仕上がっていたら嬉しいです。
3-2. 今後やりたいこと
- 宝箱の設置方法を学ぶ
- イベント戦闘の方法を学ぶ
- 戦闘AIの実装
まず宝箱の設置が未だにできません。マップ編集ツールを使ってみたもののROMを保存できず、マップデータとして保存してバイナリを見てもどこに対して何をしているのかさっぱり…。さらにアイテム拾得を管理しているデータの後ろに空きアドレスがなくてレコード数を増やせず、ごっそり移動させなきゃいけないのか?そうしたら関連SRも書き換えなきゃいけないんじゃ?という感じで詰まっています。
それからイベント戦闘の方法も学びたいです。ゾーマの城のだいまじんみたいなやつ。とりあえずSRは見た…さっぱりわからぬ。マップの特定の場所に来たときにどうやってSRをトリガーしているのかさえわからず、今のところ実現の可能性は低いです。中ボスとか追加したかったのだけれど。
あとは戦闘AIですね。ひとまず公開されているAI追加パッチを併用推奨とさせていただいています。とても素晴らしいパッチで、動作については何ら問題ありません。が、私「じゅもんせつやく」の大ファンでして、なんとかこれを実装したいなぁというのが夢です。まだアセンブリ言語歴が浅いためか、これまた一切わからず、もしかして5年くらい経ったらちょっとは理解できているかもしれない、というレベル。現段階で見込みはゼロです。
3-3. アセンブリ言語の感想
今の時代にアセンブリ言語を学び始めるなんて私くらいのもんでしょうが、なかなか楽しい言語です。アドレスとかレジスタとか資格試験の勉強でしか触れたことがなく、ここでばんばん使うことになるとは思ってもいませんでした。バイナリエディタを使ったのも今回が初めてです。
アセンブリ言語では if 分岐で飛ぶ先を相対位置(しかも行数じゃなくてバイト数)で指定しなければいけなかったりして、Python などの言語がいかに楽に書けるのかということを再認識しています。ただ、Python と同様に編集してテストプレイするまでが早く、ちょっと書き換えて試す、という作業はスムーズです。エミュレータにクイックセーブみたいな保存機能があって、王様から始めなくていいのも助かる。たとえ戦闘の最中でも保存できるからね。
Python も Papyrus も最初の頃はさっぱりわからなかったんですから、今後アセンブリ言語の理解度が増してどんどんレベルアップしていける未来を想像しています。きっとそうなる。たぶん。