DQ3 K.Mix 1.3.3リリース

例によって「ダウンロード」ページにうpしてあります。バグ修正とドラゴンの黒い霧の仕様変更をしています。一端Fixとか言ってたのに立て続けにリリースすることになるとは…。ゾーマの暗黒の波動の追加メッセージをすぐ消されないように少し前に変えたのですが、ウェイト用エスケープシークエンス(#$B1)を3つ並べるという邪道な方法だったのでメッセージスピードが7の場合(あんまりないと思いますが)にメッセージが表示される時間が異様に長くなるという問題が潜在的にあったので「表示速度が3以下の場合はこのメッセージだけ表示速度を4に強制的に変更する」という対処をしました。「メッセージスピードにかかわらず特定のメッセージだけプレイヤーにちゃんと見せるために表示速度を固定する」という変更は改造人間氏のパッチで「遊び人の遊びの内容を長く見せるために表示速度を7に落とす」というのを見たことがありますが、基本はやってることは同じだと思います(実装を見てないので不明)が、方針としては通常の戦闘メッセージ表示SRの頭でもともと設定されている表示速度を差し替えて終わりでもとに戻す、ということをすれば影響も少なく安全なはず。今回は戦闘メッセージIDを引数とするSRを実装したので多少大掛かりになりました。

  • SR: $01E87E 特殊戦闘メッセージ(最低表示速度4)(新SR)
01E87EPHPPush P Flag
01E87FREP #$30m=off(A/M:16b) x=off(X/Y:16b)
01E881PHAPush A
01E882PHXPush X
01E883PHYPush Y
01E884PHBPush DB
01E885SEIi=on
01E886PEA #$7E7EPush #$7E7E
01E889PLBPull DB
01E88APLBPull DB
01E88BJSR $A8B7SR: $01A8B7戦闘メッセージ表示SRの引数を取得する
01E88ELDA #$0000A=#$0000
01E891STA $BE4B$BE4B=A
01E894STA $BE49$BE49=A
01E897STZ $BE4D$BE4D=#$00
01E89ASTZ $BDF7$BDF7=#$00
01E89DSTZ $BE55$BE55=#$00
01E8A0LDA #$0001A=#$0001
01E8A3STA $BE41$BE41=A
01E8A6LDA #$FFFFA=#$FFFF
01E8A9STA $BE59$BE59=A
01E8ACJSL $C1E8B8SR: $01E8B8
01E8B0PLBPull DB
01E8B1REP #$30m=off(A/M:16b) x=off(X/Y:16b)
01E8B3PLYPull Y
01E8B4PLXPull X
01E8B5PLAPull A
01E8B6PLPPull P Flag
01E8B7RTLreturn

  • SR: $01E8B8 特殊戦闘メッセージ(最低表示速度4)(新SR)
01E8B8JSL $C42D43SR: $042D43 引数:1#$FF表示速度取得
01E8BDCMP #$0003A>=#$0003?
01E8C0BCC #$05if(c==off) goto $01E8C7表示速度が4以上なら通常通り
01E8C2JSL $C1ABC0SR: $01ABC0戦闘メッセージ表示メイン
01E8C6RTLreturn
01E8C7PHAPush A元の表示速度をキープしておく
01E8C8LDA #$0003A=#$0003表示速度を4に変更
01E8CBJSL $C42D72SR: $042D72 引数:1#$FF表示速度変更
01E8D0JSL $C1ABC0SR: $01ABC0戦闘メッセージ表示メイン
01E8D4PLAPull A表示速度を元に戻す
01E8D5JSL $C42D72SR: $042D72 引数:1#$FF表示速度変更
01E8DARTLreturn

内部では表示速度の値は0~7で$7E369Fの下位3ビットに保持されています。ちなみに表示速度のコントロールは以下のSRで行われているようです(今回はじめてまじめに調べた)。

  • SR: $01B5C9 戦闘メッセージ表示ウェイト/プロンプト表示処理
01B5C9STZ $BE5F$BE5F=#$00
01B5CCJSL $C42D43SR: $042D43 引数:1#$FF表示速度取得
01B5D1PEA #$369FPush #$369F
01B5D4PEA #$0007Push #$0007
01B5D7PEA #$7E00Push #$7E00
01B5DAJSL $C9029ESR: $09029E<-既に表示速度を取得しているのに再度取得している 意味不明
01B5DECMP #$0007A>=#$0007?表示速度が8か
01B5E1BCC #$03if(c==off) goto $01B5E6
01B5E3JMP $B3D1 ($01B3D1)goto $01B3D18ならプロンプト表示処理に飛ぶ
01B5E6PHAPush A
01B5E7JSL $C1AE11SR: $01AE11?
01B5EBPLXPull X
01B5ECLDA $C1B5FC,XA=$01B5FC+Xウェイトするフレーム数?を取得
01B5F0AND #$00FFA&=#$00FF
01B5F3TAXX=A
01B5F4JSL $C028B4SR: $0028B4入力ブロック
01B5F8DEXX–0になるまでウェイト(表示上はメッセージが残ったまま)する
01B5F9BNE #$F9if(z==off) goto $01B5F4
01B5FBRTLreturn

これも今回まじめに調べてわかったのですが、いわゆるエスケープシークエンス的なものは戦闘メッセージでは#$AB~#$C9となっているようで、それぞれどういった処理をするかは固定長データ: $010C3C-に処理アドレスが並んでいます。戦闘メッセージデコード中にこれらの範囲の文字がデコードされるとそれぞれ決まったところに処理が飛ばされるようにSR: $01ADBDで書かれています。あまり処理の内容を詳しく解析する必要がある部分ではないですが、見よう見まねでエスケープシークエンスを使うよりは一度ちゃんと解析してそれぞれの役割を理解しておくといいかもしれません。

(以下バイナリスレ15_483以降への反応)
現状問答無用でメガンテをぶっ放すのはハイデーモンのみです(思考パターンが「バカ」のため条件判断をしない)。マントゴーア(思考パターン「神」)は自分の行動開始時にHPが1/2を切っているとメガンテが選択肢に入ります(オリジナルの思考パターン「神」がメガンテを選択する閾値はHPの1/4以下)。なので半端にダメージを与えるとメガンテが飛んでくるという仕組みになっています。アレフガルド全般のモンスターが強いという話については、それなりに穴を用意してあるので現状余り変えるつもりはありません(ハイデーモンの素早さを多少落とすのはやるかも)。強すぎる、という原因は恐らくバラモスをほとんど強化していないのでラリホーを使いまくればオリジナルと同じくらいのレベルで(Lv20前後?)で倒せてしまうからなのでは、と思います*1。自分がプレイするときは(オリジナルでも)バラモス城でフバーハを覚えるまでちんたらレベル上げをするせいでアレフガルド到達時にはLv33,4にはなっているので、それほどきついとは自覚していませんでした。バラモスにラリホーを効きにくくするとか、攻撃力を上げる、ブレス攻撃の威力を上げてフバーハなしだときつくするなどしてハードルを高くすればある程度解消できるのでは、とも思いますが、やり過ぎると単独撃破がしづらくなるという。バランスの話になるとお互いの主観で話が進むだけで客観的な判断基準がないので実りのある結論にならないので何とかならんかなあとは思うんですが、プレイヤー側に負担をかけない方法だとSNES9Xのリプレイでも取って送ってもらうとかしかないんですかねえ…。

*1:ほとんど手を付けなかったのはあまりいじると単独撃破ができなくなると思ったので

コメント

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