例によって「ダウンロード」ページにうpしてあります。バグ修正とドラゴンの黒い霧の仕様変更をしています。一端Fixとか言ってたのに立て続けにリリースすることになるとは…。ゾーマの暗黒の波動の追加メッセージをすぐ消されないように少し前に変えたのですが、ウェイト用エスケープシークエンス(#$B1)を3つ並べるという邪道な方法だったのでメッセージスピードが7の場合(あんまりないと思いますが)にメッセージが表示される時間が異様に長くなるという問題が潜在的にあったので「表示速度が3以下の場合はこのメッセージだけ表示速度を4に強制的に変更する」という対処をしました。「メッセージスピードにかかわらず特定のメッセージだけプレイヤーにちゃんと見せるために表示速度を固定する」という変更は改造人間氏のパッチで「遊び人の遊びの内容を長く見せるために表示速度を7に落とす」というのを見たことがありますが、基本はやってることは同じだと思います(実装を見てないので不明)が、方針としては通常の戦闘メッセージ表示SRの頭でもともと設定されている表示速度を差し替えて終わりでもとに戻す、ということをすれば影響も少なく安全なはず。今回は戦闘メッセージIDを引数とするSRを実装したので多少大掛かりになりました。
- SR: $01E87E 特殊戦闘メッセージ(最低表示速度4)(新SR)
01E87E | PHP | Push P Flag | |
---|---|---|---|
01E87F | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
01E881 | PHA | Push A | |
01E882 | PHX | Push X | |
01E883 | PHY | Push Y | |
01E884 | PHB | Push DB | |
01E885 | SEI | i=on | |
01E886 | PEA #$7E7E | Push #$7E7E | |
01E889 | PLB | Pull DB | |
01E88A | PLB | Pull DB | |
01E88B | JSR $A8B7 | SR: $01A8B7 | 戦闘メッセージ表示SRの引数を取得する |
01E88E | LDA #$0000 | A=#$0000 | |
01E891 | STA $BE4B | $BE4B=A | |
01E894 | STA $BE49 | $BE49=A | |
01E897 | STZ $BE4D | $BE4D=#$00 | |
01E89A | STZ $BDF7 | $BDF7=#$00 | |
01E89D | STZ $BE55 | $BE55=#$00 | |
01E8A0 | LDA #$0001 | A=#$0001 | |
01E8A3 | STA $BE41 | $BE41=A | |
01E8A6 | LDA #$FFFF | A=#$FFFF | |
01E8A9 | STA $BE59 | $BE59=A | |
01E8AC | JSL $C1E8B8 | SR: $01E8B8 | |
01E8B0 | PLB | Pull DB | |
01E8B1 | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
01E8B3 | PLY | Pull Y | |
01E8B4 | PLX | Pull X | |
01E8B5 | PLA | Pull A | |
01E8B6 | PLP | Pull P Flag | |
01E8B7 | RTL | return |
- SR: $01E8B8 特殊戦闘メッセージ(最低表示速度4)(新SR)
01E8B8 | JSL $C42D43 | SR: $042D43 引数:1#$FF | 表示速度取得 |
---|---|---|---|
01E8BD | CMP #$0003 | A>=#$0003? | |
01E8C0 | BCC #$05 | if(c==off) goto $01E8C7 | 表示速度が4以上なら通常通り |
01E8C2 | JSL $C1ABC0 | SR: $01ABC0 | 戦闘メッセージ表示メイン |
01E8C6 | RTL | return | |
01E8C7 | PHA | Push A | 元の表示速度をキープしておく |
01E8C8 | LDA #$0003 | A=#$0003 | 表示速度を4に変更 |
01E8CB | JSL $C42D72 | SR: $042D72 引数:1#$FF | 表示速度変更 |
01E8D0 | JSL $C1ABC0 | SR: $01ABC0 | 戦闘メッセージ表示メイン |
01E8D4 | PLA | Pull A | 表示速度を元に戻す |
01E8D5 | JSL $C42D72 | SR: $042D72 引数:1#$FF | 表示速度変更 |
01E8DA | RTL | return |
内部では表示速度の値は0~7で$7E369Fの下位3ビットに保持されています。ちなみに表示速度のコントロールは以下のSRで行われているようです(今回はじめてまじめに調べた)。
- SR: $01B5C9 戦闘メッセージ表示ウェイト/プロンプト表示処理
01B5C9 | STZ $BE5F | $BE5F=#$00 | |
---|---|---|---|
01B5CC | JSL $C42D43 | SR: $042D43 引数:1#$FF | 表示速度取得 |
01B5D1 | PEA #$369F | Push #$369F | |
01B5D4 | PEA #$0007 | Push #$0007 | |
01B5D7 | PEA #$7E00 | Push #$7E00 | |
01B5DA | JSL $C9029E | SR: $09029E | <-既に表示速度を取得しているのに再度取得している 意味不明 |
01B5DE | CMP #$0007 | A>=#$0007? | 表示速度が8か |
01B5E1 | BCC #$03 | if(c==off) goto $01B5E6 | |
01B5E3 | JMP $B3D1 ($01B3D1) | goto $01B3D1 | 8ならプロンプト表示処理に飛ぶ |
01B5E6 | PHA | Push A | |
01B5E7 | JSL $C1AE11 | SR: $01AE11 | ? |
01B5EB | PLX | Pull X | |
01B5EC | LDA $C1B5FC,X | A=$01B5FC+X | ウェイトするフレーム数?を取得 |
01B5F0 | AND #$00FF | A&=#$00FF | |
01B5F3 | TAX | X=A | |
01B5F4 | JSL $C028B4 | SR: $0028B4 | 入力ブロック |
01B5F8 | DEX | X– | 0になるまでウェイト(表示上はメッセージが残ったまま)する |
01B5F9 | BNE #$F9 | if(z==off) goto $01B5F4 | |
01B5FB | RTL | return |
これも今回まじめに調べてわかったのですが、いわゆるエスケープシークエンス的なものは戦闘メッセージでは#$AB~#$C9となっているようで、それぞれどういった処理をするかは固定長データ: $010C3C-に処理アドレスが並んでいます。戦闘メッセージデコード中にこれらの範囲の文字がデコードされるとそれぞれ決まったところに処理が飛ばされるようにSR: $01ADBDで書かれています。あまり処理の内容を詳しく解析する必要がある部分ではないですが、見よう見まねでエスケープシークエンスを使うよりは一度ちゃんと解析してそれぞれの役割を理解しておくといいかもしれません。
(以下バイナリスレ15_483以降への反応)
現状問答無用でメガンテをぶっ放すのはハイデーモンのみです(思考パターンが「バカ」のため条件判断をしない)。マントゴーア(思考パターン「神」)は自分の行動開始時にHPが1/2を切っているとメガンテが選択肢に入ります(オリジナルの思考パターン「神」がメガンテを選択する閾値はHPの1/4以下)。なので半端にダメージを与えるとメガンテが飛んでくるという仕組みになっています。アレフガルド全般のモンスターが強いという話については、それなりに穴を用意してあるので現状余り変えるつもりはありません(ハイデーモンの素早さを多少落とすのはやるかも)。強すぎる、という原因は恐らくバラモスをほとんど強化していないのでラリホーを使いまくればオリジナルと同じくらいのレベルで(Lv20前後?)で倒せてしまうからなのでは、と思います*1。自分がプレイするときは(オリジナルでも)バラモス城でフバーハを覚えるまでちんたらレベル上げをするせいでアレフガルド到達時にはLv33,4にはなっているので、それほどきついとは自覚していませんでした。バラモスにラリホーを効きにくくするとか、攻撃力を上げる、ブレス攻撃の威力を上げてフバーハなしだときつくするなどしてハードルを高くすればある程度解消できるのでは、とも思いますが、やり過ぎると単独撃破がしづらくなるという。バランスの話になるとお互いの主観で話が進むだけで客観的な判断基準がないので実りのある結論にならないので何とかならんかなあとは思うんですが、プレイヤー側に負担をかけない方法だとSNES9Xのリプレイでも取って送ってもらうとかしかないんですかねえ…。
*1:ほとんど手を付けなかったのはあまりいじると単独撃破ができなくなると思ったので
コメント