DQ3 使用できる呪文の変更1

※2009/05/01 23:30追記。プログラム中の戦闘呪文数を変更するというコードを追加しました。

今回はプログラムの変更はありませんが(嘘でしたちょっと必要あります)、自分が作業していて試行錯誤が必要な作業だったのでその手順を説明することにします。新しい呪文を追加するにはまずコマンドウィンドウ上でその呪文が選択できないと話が始まりません。というわけで、実際に実装を行う前の準備として新しい呪文をPC*1が覚えて使える状態にしないといけないわけです。プログラムの修正はあまり必要ないですが、そのかわり関係する部分がいろいろとあるので、1ヶ所直せば終わりとはいかないので、別の意味でやっかいです。

さて、関係する部分は

  1. 呪文基本データ $121D00-*2
  2. 行動説明文 $023EE0-*3
  3. 戦闘呪文 $0416B7-*4とそのアドレスの配列
  4. 移動呪文 $041580-*5とそのアドレスの配列
  5. 戦闘行動 $020060-*6

です。まず1番目の呪文基本データですが、この並び順が各キャラクターの呪文習得状態($7E3925+24~2D)のビットに対応しています。つまり、24バイト目のの最下位1ビットがホイミ、最上位1ビットがベホマズンの習得状態に相当し、以下続く・・・となっています。それから、習得していれば1が立ちます。つまり、24-2Dの10バイトx8ビットで80種類の呪文までは拡張しないで設定できるわけです。オリジナルでは#$49の「設定なし」まで73種類の呪文がすでに定義されているので残り7種類までは既存の呪文を削らずに追加ができることになります。2番目の行動説明文は複雑な構造でもないので説明は省略します。3番目、4番目の戦闘呪文、移動呪文には、それぞれの状況で表示する呪文の位置、選択した場合に呼ばれる処理のインデックスなどを定義します。5番目の戦闘行動は戦闘中の行動に限らず呪文などの文字列、説明文などの処理の仕方を定義するDQ3においては非常に重要な構造体の1つです。

今回はメガンテを廃止して(ただしデータ上では残す)メガザルを新規に追加することにします。前提として固定文字列で「メガザル」という文字および説明文はすでに追加済みであるとします。メガザルは戦闘中しか使用しないので移動中の呪文の変更は今回のエントリを参考に作業してみてください。まずは枠の準備です。今回は戦闘呪文の要素数を4つ分増やします(後々の作業のため)。28バイト分$00を$041831から挿入します。その分戦闘呪文アドレスが後ろにずれるので注意してください。さらに、戦闘呪文アドレスの最後に追加した要素の先頭アドレス(下位2バイト)x4を設定します。最後に先ほど挿入した28バイト分を戦闘呪文アドレスの後ろで削ります。これに伴い戦闘呪文アドレスの開始位置がずれてしまっているのでプログラム中で参照している部分も変更する必要があります。参照している部分はどうやら2箇所のようなのでそこだけ直せばOKです(多分)。加えて呪文数も変更(#$35→#$3A)する必要があります。

  • SR: $045722 戦闘呪文情報をワークエリア($7E40F7-)にコピー
045736LDA #$003AA=#$003A
045741LDA $C4184E,XA=$04184E+X
04576ELDA $C4184E,XA=$04184E+X

まずはゲームが正しくロードされ、強さ画面で呪文リストが正しく表示されるか確認してください。作業に失敗しているとこの時点でゲームがハングします。自信がない場合はバックアップを取ってから作業した方がいいでしょう。これでようやく枠の準備ができました。次は設定を行っていきます。呪文基本データでは、その呪文が移動呪文、戦闘呪文それぞれのどのインデックスに対応するかと習得しにくいかどうかの情報しか持っていません。今回のメガザル(インデックス#$4A)では移動呪文は設定なし(#$1E)、戦闘呪文は(#$36)を設定します。同時にメガンテ(インデックス#$2F)を使用できなくするのでメガンテには移動、戦闘ともに設定なし(#$1E)、(#$35)を設定しておきます。次に戦闘呪文の設定です。メガンテを廃止するのでメガンテ(インデックス#$2F)の一般職戦闘中呪文リスト、強さウィンドウに表示される順番を0にして表示されないようにします。次にメガザル(インデックス#$36)です。呪文番号とは呪文基本データ上でのインデックスのことです。#$4Aを設定します。呪文効果とは対応する戦闘行動のことです。未設定ですが#$0112を設定します。そして先ほどメガンテのところで0を設定した一般職戦闘中呪文リスト、強さウィンドウに表示される順番を#$17を設定します。これだけではまだ半分です。次に戦闘行動にエントリを定義します。インデックス#$112に「メガザル」の固定文字列IDを設定します。これをしないと上記で定義した呪文が実際になんという文字列の呪文と関連づけられているかの情報がないので、定義しても呪文リストは空のままになってしまいます。とりあえずは「メガザル」を設定した固定文字列インデックスと行動説明分のインデックスを設定してください。あとはデバッガでRAM上のPCの習得呪文状態のビットを無理やり1にすれば「メガザル」を習得しているように見えます。

20090501150032.jpg

※このままだと戦闘中にコマンドで選択するとハングするので注意してください。ターゲットの範囲などを他にあわせればコマンド入力自体はハングしないはずです。

*1:プレイヤーキャラクター

*2:拡張パッチで場所が移動しています。これは移動後のアドレスです

*3:同上

*4:同上

*5:同上

*6:同上

コメント

  1. 7 より:

    呪文の追加がどうしても成功しません。
    (強さ画面で呪文リストが正しく表示されません)

    >さらに、戦闘呪文アドレスの最後に追加した要素の先頭アドレス(下位2バイト)x4を設定します。

    この部分をもう少し具体的に解説願えないでしょうか

    管理者より返信:

    「戦闘呪文アドレス」は「戦闘呪文」固定長データの開始位置の下位2バイトが配列になっているものです。レコード数を増やした場合は増やしたレコード数の分だけ戦闘呪文アドレスも増やす必要があるということです。

タイトルとURLをコピーしました