DQ3 仲間呼びのパターンを増やす1

スレで質問のあった「仲間呼びのパターンを増やす」の解説をします(宣伝したみたいで若干心苦しいのですがここで商売をする気はさらさらないのでそれで勘弁してください)。実装自体はそれほど大変ではないのですが、戦闘システムを理解していないと手間がかかるかもしれません。

「同種のモンスターを呼ぶ」場合は既存の戦闘行動(#$60)を設定すればいいのですが、異種のモンスターを呼ぶパターンを増やしたい場合は多少のプログラム変更が必要です。やらなくてはいけないのは

  1. モンスターの思考ルーチンの実装
  2. 行動後追加処理を行うSRの実装
  3. モンスターの思考ルーチンSRアドレスリストの拡張(未拡張の場合)
  4. 行動後追加処理を行う戦闘行動IDおよび対応するSRアドレスリストの拡張(未拡張の場合)

です。 1,2がメインで必須です。3,4は必要に応じて行ってください。「モンスターの思考ルーチン」といっても大げさなものではなく、「いまの空き横幅が呼ぼうとする仲間より大きいか」(仲間を呼んだ場合に表示するスペースがあるか)を判断するだけです。”仲間呼び(だいまじん)”(戦闘行動ID#$62)を例にとって説明します。

  • データ: $020060 戦闘行動*1
ID 対象選択ルーチン(バカ) 対象選択ルーチン(人間) 対象選択ルーチン(神) 行動プログラムアドレス
62 42 3C 3C C28DA7

仲間呼びの戦闘行動を見ると対象選択ルーチンの番号は、バカは#$42、人間と神は同じID(この場合は#$3C)が設定されています。バカの場合は追加で仲間を呼ぶスペース(画面上の横幅的な意味で)があるかどうかをチェックしないで「仲間を呼ぶ」行動を選択します(実際には行動が実行された時点でスペースがないので「しかし たすけが こなかった」になる)。人間・神の場合は空きスペースをチェックして十分なスペースがない場合は別の戦闘行動を選択する、ということをするようです。ちなみに人間と神の違いは、人間はPC側と同様ターン開始時に行動を決定するのに対し、神は自分の行動順が回ってきた時点で行動を決定する(つまり後だしジャンケン)ということのようです。AIと似たようなものでしょう。AIだと頭がよすぎるので多少バカにしてあるという話をどこかで聞いたことがありますが。さて、バカの場合の選択ルーチン#$42の内容は、あやしいかげでないばあいは仲間呼びの行動を選択する、というものだけなので省略します。

  • SR: $026F2F 敵の対照決定処理SR_SR_003C
026F2F LDA #$0077 A=#$0077 だいまじんのモンスターID
026F32 JSR $6F4B SR: $026F4B 仲間呼びが可能な場合にはAレジスタのモンスターを呼ぶ行動を選択する
026F35 RTS return

この近辺のSRに同じものがあるのでモンスターIDを見て戦闘行動と対応していることを確認してみてください。次に実際にモンスターが追加される部分です。「仲間呼び」の戦闘行動プログラムアドレス$C28DA7の中身は実質空で何も起きません。代わりに「戦闘行動実行後追加処理を行う戦闘行動リスト」で呼んだモンスターを表示させる処理を行っています。

  • SR: $028A96 戦闘行動実行後追加処理
028A96 LDX #$0046 X=#$0046 追加処理定義レコード最大数
028A99 LDA $23EE A=$23EE
028A9C CMP $C236E0,X A==$0236E0+X?
028AA0 BEQ #$05 if(z==on) goto $028AA7
028AA2 DEX X–
028AA3 DEX X–
028AA4 BPL #$F6 if(n==off) goto $028A9C
028AA6 RTS return
028AA7 JSR $8AAB SR: $($028AAB+X)
028AAA RTS return

このSRは現在の戦闘行動IDが$028AAB-のIDと一致する場合は$028AD1-の対応する位置のSRを実行する、というものです。

  • データ: $028AAB 実行後追加処理を行う戦闘行動ID
ID 戦闘行動ID
0A 0062 仲間呼び(だいまじん)の戦闘行動ID
  • データ: $028AD1 実行後追加処理を行う戦闘行動SRアドレス群
ID アドレス(下位2バイト)
0A 8CF8
  • SR: $028CF8 実行後追加処理を行う戦闘行動SR_SR_000A
028CF8 LDA #$0077 A=#$0077 だいまじんのモンスターID
028CFB JSR $8D14 SR: $028D14 仲間を呼んだ場合のモンスター追加メイン
028CFE RTS return

というわけで新しく仲間呼びを実装する場合には、SR: $026F2F、SR: $028CF8に相当するSRを追加してあとはチョコチョコとデータをいじればいいわけです。長くなったので実装編は次回。

*1:拡張パッチ使用のためアドレスが移動しています