DQ3 ぐんたいよび実装3

結構苦戦してますぐんたいよびの実装(昨日もテストプレイ中にフリーズするバグが見つかりました。直したけど)。ここまで苦労して実装する必要があるのかとさえ考えてしまいます。残りは「生きている敵をランダムに選択して4回攻撃する」という作業です。

  • SR: $027D53 戦闘行動実行処理メイン
027D98JSR $D61BSR: $02D61B
027D9BBCS #$1Dif(c==on) goto $027DBA

もともと$028400を呼んでいた部分を潰して上記のように書き換えます。

  • SR: $02D61B 現在のインデックスのキャラクターに対して戦闘行動をスキップするか調べる(スキップc=on)(新SR)
02D61BLDA $243E,YA=$243E+Y
02D61EAND #$00FFA&=#$00FF
02D621CMP #$0018A>=#$0018?
02D624BCS #$4Eif(c==on) goto $02D674
02D626PHAPush A
02D627LDA $23EEA=$23EE
02D62ACMP #$0114A==#$0114?
02D62DBNE #$2Aif(z==off) goto $02D659
02D62FPEA #$23AEPush #$23AE
02D632PEA #$0004Push #$0004
02D635PEA #$7E00Push #$7E00
02D638JSL $C9029ESR: $09029E
02D63CCMP #$0001A==#$0001?
02D63FBEQ #$32if(z==on) goto $02D673
02D641LDA $2600A=$2600
02D644CMP #$0004A>=#$0004?
02D647BCS #$2Aif(c==on) goto $02D673
02D649INCA++
02D64ASTA $2600$2600=A
02D64DJSR $D700SR: $02D700
02D650BCS #$21if(c==on) goto $02D673
02D652STA $00DP($00)=A
02D654PLAPull A
02D655LDA $00A=DP($00)
02D657BRA #$01goto $02D65A
02D659PLAPull A
02D65ASTA $23E8$23E8=A
02D65DJSL $C2CA04SR: $02CA04
02D661LDA $00A=DP($00)
02D663AND $23EAA&=$23EA
02D666STA $00DP($00)=A
02D668LDA $02A=DP($02)
02D66AAND $23ECA&=$23EC
02D66DORA $00Aor=DP($00)
02D66FBEQ #$03if(z==on) goto $02D674
02D671CLCc=off
02D672RTSreturn
02D673PLAPull A
02D674SECc=on
02D675RTSreturn

後半はSR: $28400のコピーです。$28400は何をしていたかというと、戦闘参加者全員に対してこれから実行する戦闘行動の対象者となるかをチェックして対象となる場合は実体の行動を呼び出す、という非常に重要なものです。C言語のイメージでは

for(int i=0; i<0x18; i++)
{
    if($28400(i)のリターンがc=on) continue;
    ・・・
}

というところでしょうか。従って、通常の$28400の処理の前に戦闘行動がぐんたいよびの場合「生きている敵をランダムに選択し、そのキャラクターを行動の対象とする」処理を割り込ませればいいことになります。

  • SR: $02D700 ぐんたいよびの対象決定(新SR)
02D700PHXPush X
02D701LDA $2428A=$2428
02D704PHAPush A
02D705LDY #$0000Y=#$0000
02D708STZ $00DP($00)=#$00
02D70ALDA $243E,YA=$243E+Y
02D70DAND #$00FFA&=#$00FF
02D710TAXX=A
02D711STX $2428$2428=X
02D714JSL $C2CAD9SR: $02CAD9 引数:1#$203C 引数:2#$00FF
02D71CCMP #$0005A>=#$0005?
02D71FBCS #$03if(c==on) goto $02D724
02D721INYY++
02D722BRA #$E6goto $02D70A
02D724STY $2602$2602=Y
02D727LDY #$0000Y=#$0000
02D72ALDX #$0000X=#$0000
02D72DLDA $243E,YA=$243E+Y
02D730AND #$00FFA&=#$00FF
02D733STA $2428$2428=A
02D736JSL $C2BE8ASR: $02BE8A 引数:1#$1C
02D73BBCS #$13if(c==on) goto $02D750
02D73DLDA $243E,YA=$243E+Y
02D740AND #$00FFA&=#$00FF
02D743SEP #$20m=on(A/M:8b)
02D745STA $2610,X$2610+X=A
02D748REP #$20m=off(A/M:16b)
02D74AINXX++
02D74BCPY $2602Y>=$2602?
02D74EBCS #$03if(c==on) goto $02D753
02D750INYY++
02D751BRA #$DAgoto $02D72D
02D753STX $2604$2604=X
02D756LDY #$0001Y=#$0001
02D759CPY $2604Y>=$2604?
02D75CBCS #$06if(c==on) goto $02D764
02D75ESECc=on
02D75FROL $00DP($00)<<1
02D761INYY++
02D762BRA #$F5goto $02D759
02D764LDA $00A=DP($00)
02D766BEQ #$2Dif(z==on) goto $02D795
02D768LDX #$0000X=#$0000
02D76BJSL $C01407SR: $001407
02D76FBCC #$FEif(c==off) goto $02D76F
02D771TAYY=A
02D772LDA $2610,YA=$2610+Y
02D775AND #$00FFA&=#$00FF
02D778STA $00DP($00)=A
02D77APLAPull A
02D77BSTA $2428$2428=A
02D77ELDA $00A=DP($00)
02D780PHAPush A
02D781LDX #$000EX=#$000E
02D784LDA #$FFFFA=#$FFFF
02D787STA $2610,X$2610+X=A
02D78ADEXX–
02D78BDEXX–
02D78CBPL #$F9if(n==off) goto $02D787
02D78EPLAPull A
02D78FLDX #$0000X=#$0000
02D792PLXPull X
02D793CLCc=off
02D794RTSreturn
02D795PLAPull A
02D796PLXPull X
02D797SECc=on
02D798RTSreturn

このSRではぐんたいよびの攻撃対象を決めるわけですが、いくつかの部分に分けて実装していきます。

  1. グループ順に並んでいる戦闘中キャラクターインデックスからグループ番号が5以上になる場所を調べ、その場所を$7E2602に保存する。($02D700-24)
  2. 1で調べた場所に到達するまで各キャラクターの生死状態を調べて生きていれば$7E2610+Xに加えていく。Xのカウントは最終的には$7E2604に保存する。($02D727-53)
  3. $7E2604のカウントの数だけ$00のビットを立てランダムでONのビットをOFFにするSR: $001407を呼び、ONのビットが1つになるまで(リターンがc=on)くり返し、onになっているビットの番号に該当するインデックスを$7E2610+Xで取得し、対象とする。($02D757-7A)
  4. 使用した領域の初期化($02D781-)

さて、一通り実装は終わったのですが、「誰に覚えさせるか」という点について少し考えてみました。覚えるキャラクターは商人でいいのですが、「商人なら誰でも覚えられるのか」か「バークの商人のみに覚えさせるか」という案が浮かびました。SFC版では牢屋に入れられた後再度ルイーダの酒場に戻ってPCとしてパーティに参加させることが可能です。「街を大きくする過程で知り合った傭兵団?をよぶことができる」という文脈でこの商人専用の特技として習得させれば、この商人のキャラ付けを他より際立てることができるかもしれません。しかし、この商人を戦闘で使えるようにするにはバークに預ける前にある程度呪文を覚えさせる必要があり、ベホマクラスの呪文を覚えてからバークに預けるのは話の進行上ちょっときついです。かといって逆にぐんたいよびを転職しても使えるようにすると、今度は呪文スペース上特殊な処理(位置をずらす?)をする必要があります。というわけで、とりあえずは商人がレベル35で覚える、という設定にしておきます。

スポンサーリンク

コメントを書く

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