DQ3 ガイアの剣ギミック追加2

今回から実装を開始します。エフェクトは別途実装するとして、実処理は以下のようにして実装していきます。

  1. ガイアの剣による直接攻撃専用の戦闘行動(ID:#$135)を用意する(内容は通常の直接攻撃と同じ)
  2. ガイアの剣による追加攻撃用の戦闘行動(ID:#$136)を用意する
  3. 直接攻撃のコマンド入力時に装備をチェックし、ガイアの剣を装備していれば1の戦闘行動に差し替える
  4. 「行動後追加処理を行う戦闘行動」にID:#$135を追加する
  5. ID:#$135の行動後追加処理として、追加攻撃が発生する条件を満たしているか確認し、満たしていれば戦闘行動をID:#$136に差し替えて戦闘行動を入れ子で実行する

DQ6の解析はまるでやっていないのでわかりませんが、ラミアスの剣で直接攻撃した後の処理と表面上は似ているのでは、と思います。

  • SR: $025F39 直接攻撃戦闘行動セット
025F50JSR $EB00SR: $02EB00ガイアの剣装備時戦闘行動ID変更
  • SR: $2EB00 ガイアの剣装備時戦闘行動ID変更(新SR)
02EB00CMP #$0012A==#$0012?装備武器がガイアの剣なら戦闘行動ID:#$135に差し替え
02EB03BEQ #$04if(z==on) goto $02EB09
02EB05LDA #$0001A=#$0001通常の直接攻撃
02EB08RTSreturn
02EB09LDA #$0135A=#$0135ガイアの剣での直接攻撃
02EB0CRTSreturn

$025F50の時点でAレジスタにはコマンド入力主体が装備しているアイテムIDがセットされています。したがって、Aレジスタを見て条件に一致していれば戦闘行動を差し替えてやればいい、ということになります。

  • SR: $02EB0D 実行後追加処理を行う戦闘行動SR_SR_001D(新SR)
02EB0DJSL $02B32FSR: $02B32F戦闘終了時フラグセット 直接攻撃で戦闘が終了していれば追加攻撃を発動させない
02EB11BCC #$01if(c==off) goto $02EB14
02EB13RTSreturn
02EB14JSR $EAE7SR: $02EAE7ガイアの剣追加攻撃が発生するフロアか(該当c=on)
02EB17BCC #$FAif(c==off) goto $02EB13
02EB19LDX $23E6X=$7E23E6
02EB1CSTX $2428$7E2428=X
02EB1FJSL $02CAD9SR: $02CAD9 引数:1#$203C 引数:2#$00FF行動対象のグループID取得
02EB27CMP #$0005A>=#$0005?
02EB2ABCS #$E7if(c==on) goto $02EB13
02EB2CLDA #$0001A=#$0001
02EB2FJSL $00133ESR: $00133E乱数発生 1/2の確率
02EB33BNE #$DEif(z==off) goto $02EB13
02EB35LDX $23E4X=$7E23E4
02EB38STX $2428$7E2428=X
02EB3BJSL $02BE8ASR: $02BE8A 引数:1#$08現在MP取得
02EB40CMP #$000AA>=#$000A?MPが10なければ発動しない
02EB43BCC #$CEif(c==off) goto $02EB13
02EB45JSR $EAD0SR: $02EAD0ガイアの剣追加攻撃発動時MP減算+HPMPウィンドウ再描画
02EB48LDA $23EEA=$7E23EE
02EB4BPHAPush A
02EB4CLDA $23E6A=$7E23E6
02EB4FPHAPush A
02EB50LDA #$0136A=#$0136戦闘行動を差し替え
02EB53STA $23EE$7E23EE=A
02EB56LDA #$0041A=#$0041ターゲット情報を全体に差し替え
02EB59STA $23E6$7E23E6=A
02EB5CJSL $01A867SR: $01A867 引数:1#$01AE戦闘メッセージ表示:「ガイアのつるぎの きっさきが じめんに ふれた! だいちが はげしく ふるえだす!」
02EB62JSR $7D53SR: $027D53戦闘行動実行
02EB65PLAPull A
02EB66STA $23E6$7E23E6=Aターゲット情報を元に戻す
02EB69PLAPull A
02EB6ASTA $23EE$7E23EE=A戦闘行動をもとに戻す
02EB6DRTSreturn

追加攻撃が発生した後は何も起きないからいちいち戦闘行動情報をもとに戻さなくてもいいとは思うのですが、念のためということで。

  • SR: $02EAE7 ガイアの剣追加攻撃が発生するフロアか(該当c=on)(新SR)
02EAE7LDA $DB05A=$7EDB05
02EAEACMP #$0002A==#$0002?地上の海上か
02EAEDBEQ #$0Fif(z==on) goto $02EAFE
02EAEFCMP #$000AA==#$000A?ALFの海上か
02EAF2BEQ #$0Aif(z==on) goto $02EAFE
02EAF4LDA $99F9A=$7E99F9
02EAF7CMP #$0142A==#$0142?フロアが神竜のフロアか
02EAFABEQ #$02if(z==on) goto $02EAFE
02EAFCSECc=on
02EAFDRTSreturn
02EAFECLCc=off
02EAFFRTSreturn

あまり汎用性のある判定の仕方ではありませんが、特別対処ということでまあこれでいいでしょう。

  • SR: $02EAD0 ガイアの剣追加攻撃発動時MP減算+HPMPウィンドウ再描画(新SR)
02EAD0LDA #$000AA=#$000A
02EAD3STA $00$000000=AMPを10消費する
02EAD5JSL $02BE8ASR: $02BE8A 引数:1#$0EMP減算
02EADAJSL $02B977SR: $02B97702B977 パーティウィンドウ再描画?
02EADERTSreturn

あとは、行動対象1体に対するダメージ計算処理を実装して終わりです。

  • SR: $02EA40 ガイアの剣追加攻撃(新SR)
02EA40STZ $00$000000=#$00追加攻撃ダメージ値リセット
02EA42LDX $23E8X=$7E23E8
02EA45STX $2428$7E2428=X
02EA48JSL $02CA5BSR: $02CA5B 引数:1#$2049
02EA4ETAYY=A
02EA4FJSL $02CC92SR: $02CC92 引数:1#$0024 引数:2#$0001メタル系判定
02EA57CMP #$0001A==#$0001?メタル系ならノーダメージ
02EA5ABNE #$02if(z==off) goto $02EA5E
02EA5CBRA #$4Bgoto $02EAA9
02EA5ELDX $23E4X=$7E23E4
02EA61STX $2428$7E2428=X
02EA64JSL $02C240SR: $02C240 引数:1#$0A行動主体のレベル取得
02EA69STA $04$000004=A
02EA6BLDX #$0004X=#$0004
02EA6ELDA #$0014A=#$0014
02EA71JSL $00121CSR: $00121Cレベル/20で商を取得(0~4)
02EA75INC $04$000004++
02EA77STZ $06$000006=#$00
02EA79STZ $08$000008=#$00
02EA7BSTZ $0A$00000A=#$00
02EA7DCLCc=off
02EA7ELDA #$0004A=#$0004
02EA81ADC $08A+=$000008
02EA83STA $08$000008=A
02EA85CLCc=off
02EA86LDA #$0015A=#$0015
02EA89ADC $0AA+=$00000A
02EA8BSTA $0A$00000A=A
02EA8DINC $06$000006++
02EA8FLDA $06A=$000006
02EA91CMP $04A>=$000004?
02EA93BCC #$E8if(c==off) goto $02EA7D
02EA95JSL $001383SR: $001383乱数発生 $0000-FFFF
02EA99STA $04$000004=A
02EA9BLDX #$0004X=#$0004
02EA9ELDA $0AA=$00000A
02EAA0JSL $00121CSR: $00121C
02EAA4CLCc=off
02EAA5ADC $08A+=$000008
02EAA7STA $00$000000=A
02EAA9JSR $8E70SR: $028E70ダメージ確定メイン
02EAACRTLreturn

パッと見分かりにくいですが、ダメージ値の計算方法は

  1. 行動主体のレベル/20の商を取得する(0~4)
  2. ダメージ変動値として1の回数分+1だけ21の倍数を取得する(21~105)。ダメージ基礎値として1の回数分+1だけ4の倍数を取得する(4~20)
  3. #$0000-FFFFの乱数を取得し、変動値で割り、余りを取得し、それに基礎値を加算する

となっています。こういうの数式で書くとどうなるんでしょうかね。これにより、低レベルではあまりダメージが高くならず、高レベルでは振り幅の多いダメージ値を算出することができます。表にすると以下のとおり。

レベル最小値最大値
1-19424
20-39849
40-591275
60-791699
80-9920124

この算出方法を対象1体毎に行うため、ダメージ値が安定しません。ただ、メタル系を除いて対象の防御無視でダメージを与えるため、防御力の高い敵にもある程度ダメージ値は見込めます。MPを10消費する上に発動もランダムなので、これを使うか使わないか、単純に攻撃力の高低では判断できない武器をプレイヤーに選択させることが実装の目的です。実体部分は終わったので次回はエフェクトを実装してこのギミックは終りになります。

コメント

  1. Dt より:

    たびたび質問すみません。

    追加攻撃の攻撃範囲を単体にしたい場合は
    02EB56 LDA #$0041 A=#$0041
    の部分を変えるだけでいいのでしょうか?

    管理者より返信:

    そうです。

  2. Dt より:

    返信ありがとうございます。

    該当部分の数値を変えることで攻撃範囲が単体やグループになることはなったのですが、
    追加攻撃が発生するのがその戦闘中の最初の通常攻撃の後だけで2回目以降はメッセージのみ、
    追加攻撃が発生したりしなかったり、
    とどうも上手くいきません。

  3. タカオ より:

    これで詳細なダメージ計算方法が分かりました。
    ただ現在商人に鑑定させるとMP消費が8となっていて、データセンターでは5と示しています。
    実際のMPの減り方を見れば分かることですが。
    レベルが高いと中々強いのですが、単純なレベル上げ作業を強いられてしまいます。
    やはり「大地の精霊の力が宿っている」ということで、「岩落とし」のような属性依存の方が勝手ながらより腑に落ちる気がしました。宙に浮いている敵にも効いてしまうのも少し言い訳が通るようになりますしね。(^^p

    管理者より返信:

    詳細鑑定時の消費MPの乖離は次回リリースに修正を含めます。ご指摘ありがとうございました。

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