DQ3 ショートカット機能の一部修正1

以前ろだにうpされていた改造初心者氏のショートカット機能のプログラムですが、基本問題ないんですが一点ルーラを実行すると天井に頭をぶつける場所でルーラをショートカット経由で実行するとハングします。改造初心者氏のプログラムと違うところだけ記載しようと思ったんですが、どこが違うのか調べるのが面倒くさいので、ショートカットの実行部分の実装をまるごと貼ることにします。※現在公開しているDQ3 K.Mixではこの対処は予め組み込んであるので現象は発生しません。

  • SR: $0768C4 移動中パッド入力解釈処理
0768DBJSR $CF00SR: $07CF00ショートカット実行処理
0768DEBCC #$03if(c==off) goto $0768E3
0768E0RTSreturn
0768E1NOP

  • SR: $07CF00 ショートカット実行処理
07CF00LDA $7F70A=$7F70パッド入力内容のチェック
07CF03BIT #$0010A & #$0010
07CF06BNE #$0Eif(z==off) goto $07CF16
07CF08STZ $20C4$20C4=#$00
07CF0BLDA $18A=DP($18)
07CF0DSTA $7F72$7F72=A
07CF10AND $1AA&=DP($1A)
07CF12STA $18DP($18)=A
07CF14CLCc=off
07CF15RTSreturn
07CF16CMP $20C4A==$20C4?
07CF19BEQ #$EDif(z==on) goto $07CF08
07CF1BCMP #$0010A==#$0010?
07CF1EBEQ #$E8if(z==on) goto $07CF08
07CF20JSR $CF4CSR: $07CF4C各キーに割り当てた移動呪文IDから戦闘行動IDを取得(未設定c=off)
07CF23BCC #$E3if(c==off) goto $07CF08
07CF25JSL $C7CFE4SR: $07CFE4対象行動が現パーティの状態で実行可能か判定(可能c=on)
07CF29BCC #$DDif(c==off) goto $07CF08
07CF2BJSL $C7D100SR: $07D100ショートカット用呪文実行処理
07CF2FLDA $7F70A=$7F70
07CF32STY $20C4$20C4=Y
07CF35JSL $C31EE4SR: $031EE4フィールド画面復帰?
07CF39SECc=on
07CF3ARTSreturn

  • SR: $07CF4C 各キーに割り当てた移動呪文IDから戦闘行動IDを取得(未設定c=off)(省略)
  • SR: $07CFE4 対象行動が現パーティの状態で実行可能か判定(可能c=on)(省略)

  • SR: $07D100 ショートカット用呪文実行処理
07D100PHPPush P FlagPUSH 1回目
07D101REP #$30m=off(A/M:16b) x=off(X/Y:16b)
07D103PHAPush APUSH 2回目
07D104PHXPush XPUSH 3回目
07D105PHYPush YPUSH 4回目
07D106PHBPush DBPUSH 5回目
07D107PEA #$7E7EPush #$7E7E
07D10APLBPull DB
07D10BPLBPull DB
07D10CJSL $C32060SR: $032060戦闘画面切り替え?
07D110TSCA=S
07D111STA $33FC$33FC=A
07D114LDA #$AD3BA=#$AD3B
07D117LDX #$00C3X=#$00C3
07D11AJSL $C316DESR: $0316DEY,Rボタン時ジャンプ先アドレスセット?
07D11ELDA $06,SA=Stack($06)
07D120CMP #$0174A==#$0174?処理がまんたん(戦闘行動ID:#$0174として定義)か調べる
07D123BNE #$11if(z==off) goto $07D136
07D125JSL $C32251SR: $032251 引数:1#$D9ウィンドウ表示更新(1枚) まんたん専用
07D12AJSL $C91F27SR: $091F27まんたん処理メイン
07D12EPLBPull DB
07D12FREP #$30m=off(A/M:16b) x=off(X/Y:16b)
07D131PLYPull Y
07D132PLXPull X
07D133PLAPull A
07D134PLPPull P Flag
07D135RTLreturn
07D136LDA $06,SA=Stack($06)
07D138JSR $D14FSR: $07D14Fショートカット用呪文実行処理(コア・移動中通常メニュー処理と階層を合わせるため別関数化した)
07D13BBRA #$F1goto $07D12E

  • SR: $07D14F ショートカット用呪文実行処理(コア・移動中通常メニュー処理と階層を合わせるため別関数化した)
07D14FSTA $33DA$33DA=A
07D152JSR $D04BSR: $07D04Bショートカット呪文実行者決定処理
07D155STA $33D6$33D6=A
07D158STA $BE7D$BE7D=A
07D15BLDX $33DAX=$33DA
07D15EJSL $C2CC03SR: $02CC03 引数:1#$0060戦闘行動構造体アクセスSR インデックス:X
07D164STA $BE77$BE77=A
07D167JSL $C32251SR: $032251 引数:1#$DAウィンドウ表示更新(1枚)ショートカット汎用
07D16CJSL $C90D2FSR: $090D2F移動中呪文使用処理
07D170RTSreturn

ポイントは$07D100、$07D14Fです。ここの出だしを移動中メインメニュー処理($03AC8A)と同じにすることでルーラで頭をぶつけた時のハングを回避できます。ルーラで頭をぶつけた後の処理は以下のようになっています。

  • SR: $090E80 キメラの翼使用(移動中)
090EAFJSL $C3416ASR: $03416A頭をぶつける場所でルーラを実行するとここに飛ぶ
090EB3JSL $C31EE4SR: $031EE4
090EB7JSL $C1D22ASR: $01D22AルーラでPCが頭をぶつける描画
090EBBJSL $C1A8D4SR: $01A8D4 引数:1#$0021メッセージ表示:「頭をぶつけた」
090EC1JSL $C340F7SR: $0340F7ウィンドウでのキー入力結果取得(キャンセルc=on)
090EC5PLAPull A$091188でPUSHした分をPULL
090EC6JMP $090EDAgoto $090EDA
090EDASEP #$20m=on(A/M:8b)
090EDCPLAPull APULL 1バイト
090EDDREP #$20m=off(A/M:16b)
090EDFPLAPull APULL 合計3バイト
090EE0PLAPull APULL 合計5バイト
090EE1JSL $C31EE4SR: $031EE4
090EE5PLBPull DBPULL 1回目
090EE6REP #$30m=off(A/M:16b) x=off(X/Y:16b)
090EE8PLYPull YPULL 2回目
090EE9PLXPull XPULL 3回目
090EEAPLAPull APULL 4回目
090EEBPLPPull P FlagPULL 5回目
090EECRTLreturn

移動中メインメニュー処理($03AC8A)から各呪文を実行するまで、プログラムカウンタは各種メニューSR(SR: $($03AD2F+X))をコールして(2バイト1回)、移動中呪文使用処理(SR: $090D2F)をコールして(3バイト1回)の合計5バイトスタックに積まれます。この分のプログラムカウンタをPULLして帳尻を合わせているのが$090EDA~EE0です。下流でこういう処理がされている以上、上流で同じようにプログラムをコールしてやらないとスタックの対応関係がおかしくなってハングすることになります。従って、$07D14Fを2バイトコールにして2バイト分、$090D2Fをコールして3バイト分にすると辻褄が合うことになります。回復呪文などの処理は$07D12Eに戻ってくるので関係ありません。

さて、最近は例のDQ6のAIの解析+DQ3 K.MixへのAI移植をつらつらとやっています*1。AI部分の解析率は40%~50%くらいといったところで、大枠に関しては大体把握したのでいつまで眺めてばかりいても話が進まないので、見よう見まねで一部を移植しています。とりあえずはUI+枠組みとモンスターの情報が関係ない回復・蘇生系に関しては大体終わり、実装の終わっている範囲でテストを繰り返してベースに関してはまあそこそこできているかなというところです。バイナリwikiにRAMの意味が詳細に書いてあるのでDQ6の解析はやる気になれば割と捗ります。基本的にはDQ3はDQ6より情報量が少ないので移植は楽なはずですが、DQ3にはモシャスというバグの温床のような仕組みがあるのでこの点には十分注意が必要になります(あとは呪術師の思考パターンが結構面倒そう)。また、気になるのはAIの思考速度です。呪文・特技の量が多いDQ6と違ってDQ3の呪文数はそれほど多くないのでDQ6と同じレベルで実装できれば問題無いと思うのですが、まだ解析が進んでいない攻撃・補助系の実装如何では体感できる遅さが現れるかもしれません。ちなみに、DQ6では実行コード量を極力少なくするため、各種情報へのアクセスはSRを使わずメモリへのダイレクトアクセスを多用しているようです。依然として公開できるレベルの満足の行くものができるかの見通しは不透明のままです。作業してて面白いことは確かですが。

*1:作業進度は極めて遅い

スポンサーリンク

コメントを書く

メールアドレスが公開されることはありません。コメントは管理者の承認後表示されます。