DQ3 まんたん処理の仕組み3

前回からの続きです。

  • SR: $09204D キアリク詠唱
09204D LDY #$0000 Y=#$0000
092050 LDA $2BE8,Y A=$2BE8+Y
092053 AND #$2000 A&=#$2000 麻痺していなければスキップ
092056 BEQ #$62 if(z==on) goto $0920BA
092058 TYA A=Y
092059 LSR A>>1
09205A STA $7A DP($7A)=A
09205C STA $BE7F $BE7F=A
09205F LDX $2BB4 X=$2BB4 詠唱可能者をパーティの後ろから探す
092062 DEX X–
092063 DEX X–
092064 BMI #$54 if(n==on) goto $0920BA
092066 LDA $2BE8,X A=$2BE8+X
092069 BMI #$F7 if(n==on) goto $092062 行動不能フラグが立っていたらスキップ
09206B AND #$0001 A&=#$0001 キアリクを覚えていなければスキップ
09206E BEQ #$F2 if(z==on) goto $092062
092070 TXA A=X
092071 LSR A>>1
092072 STA $78 DP($78)=A
092074 STA $BE7D $BE7D=A
092077 LDA #$0047 A=#$0047
09207A JSR $20C5 SR: $0920C5 消費MP計算+減
09207D BCC #$E3 if(c==off) goto $092062
09207F JSL $C44129 SR: $044129 引数:1#$01 引数:2#$7A 麻痺回復
092085 JSL $C1E32E SR: $01E32E 引数:1#$0065 再生BGM設定?
09208B JSL $C1A8D4 SR: $01A8D4 引数:1#$0002 メッセージ表示
092091 JSL $C1A8D4 SR: $01A8D4 引数:1#$001F メッセージ表示
092097 LDA #$4000 A=#$4000
09209A ORA #$0400 Aor=#$0400 死亡・般若装備中か調べる
09209D AND $2BE8,Y A&=$2BE8+Y
0920A0 BNE #$06 if(z==off) goto $0920A8
0920A2 LDA #$8000 A=#$8000 死亡・般若装備中でなければ行動不能フラグもOFFにする
0920A5 JMP $20AB ($0920AB) goto $0920AB
0920A8 LDA #$0000 A=#$0000
0920AB ORA #$2000 Aor=#$2000 麻痺フラグをOFF
0920AE EOR #$FFFF A^=#$FFFF
0920B1 AND $2BE8,Y A&=$2BE8+Y
0920B4 STA $2BE8,Y $2BE8+Y=A
0920B7 INC $2BBA $2BBA++
0920BA INY Y++
0920BB INY Y++
0920BC CPY $2BB4 Y>=$2BB4?
0920BF BCS #$03 if(c==on) goto $0920C4
0920C1 JMP $2050 ($092050) goto $092050
0920C4 RTS return
  • SR: $0920E4 キアリー詠唱 省略

見ての通り、という感じの処理ですが、オリジナルのまんたん処理は後ろにいるキャラクターから優先に呪文使用者を選択しています。パーティの後ろにいる=呪文職であるという前提に立っているからでしょう。毒回復はともかく、麻痺回復はその後の回復行動に影響を与えるため(以降の回復処理の詠唱者に復帰できる)、一番最初に実行され、毒回復と比べて若干処理が複雑になっています($092097-B7)。ここでは、他の行動不能の要素(死亡・般若の面装備中)があるかを調べて該当しない場合のみ、麻痺の回復とともに行動不能フラグをクリアしています。

  • SR: $09214F 必要HP回復量取得(回復不要c=on)
09214F STZ $2BB6 $2BB6=#$00
092152 LDY $2BB4 Y=$2BB4
092155 DEY Y–
092156 DEY Y–
092157 BMI #$4A if(n==on) goto $0921A3
092159 LDA #$0800 A=#$0800
09215C EOR #$FFFF A^=#$FFFF
09215F AND $2BE8,Y A&=$2BE8+Y HP要回復フラグを一度クリア
092162 STA $2BE8,Y $2BE8+Y=A
092165 AND #$4000 A&=#$4000 死亡フラグがONなら対象外
092168 BNE #$EB if(z==off) goto $092155
09216A TYA A=Y
09216B LSR A>>1
09216C PHA Push A
09216D JSL $C43041 SR: $043041 引数:1#$01 引数:2#$FF 引数:3#$70 最大HP取得
092174 LDA #$0100 A=#$0100
092177 LDX #$0070 X=#$0070
09217A JSL $C01146 SR: $001146 DP($00+X)=A(1Byte)*DP($00+X)
09217E PLA Pull A
09217F JSL $C43115 SR: $043115 引数:1#$01 引数:2#$FF 引数:3#$FF 現在HP取得
092186 CMP $71 A>=DP($71)?
092188 BCS #$CB if(c==on) goto $092155
09218A PHA Push A
09218B LDA $71 A=DP($71)
09218D SEC c=on
09218E SBC $01,S A-=(Stack($01)+!c) 必要HP回復量を取得
092190 STA $2BCE,Y $2BCE+Y=A
092193 PLA Pull A
092194 LDA #$0800 A=#$0800 HP要回復フラグをON
092197 ORA $2BE8,Y Aor=$2BE8+Y
09219A STA $2BE8,Y $2BE8+Y=A
09219D INC $2BB6 $2BB6++ HP要回復
0921A0 JMP $2155 ($092155) goto $092155
0921A3 LDA $2BB6 A=$2BB6
0921A6 BEQ #$02 if(z==on) goto $0921AA
0921A8 CLC c=off
0921A9 RTS return
0921AA SEC c=on 誰もHP回復する必要なし
0921AB RTS return

この処理はHPを回復する必要があるかを調べています。$09216D-8Fのあたりはなぜ1バイトずらす必要があるのか意味不明ですが(単に比較してzを見ればいいと思う)、最大HPと現在HPを比較して同じでなければ回復の必要ありと判断して最大HPから現在HPを引いた数を回復必要HPとしてメモリにセットしています。

コメント

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