- SR: $023555 戦闘開始時初期設定等処理
 
| 023555 | PHP | Push P Flag | |
|---|---|---|---|
| 023556 | PHB | Push DB | |
| 023557 | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
| 023559 | PEA #$7E7E | Push #$7E7E | |
| 02355C | PLB | Pull DB | |
| 02355D | PLB | Pull DB | |
| 02355E | JSR $3573 | SR: $023573 | |
| 023561 | JSL $C2CA59 | SR: $02CA59 | |
| 023565 | JSL $C0268F | SR: $00268F | |
| 023569 | JSR $35AD | SR: $0235AD | モンスター出現処理+強襲メッセージ表示 | 
| 02356C | JSR $3610 | SR: $023610 | 出現時特殊ステータスセット | 
| 02356F | PLB | Pull DB | |
| 023570 | PLP | Pull P Flag | |
| 023571 | CLC | c=off | |
| 023572 | RTL | return | 
上3つのSRでは何をやっているのか、中を見てもよくわかりませんでした。
- SR: $0235AD モンスター出現処理+強襲メッセージ表示
 
| 0235AD | LDX #$0000 | X=#$0000 | |
|---|---|---|---|
| 0235B0 | LDA $2577,X | A=$2577+X | |
| 0235B3 | BEQ #$19 | if(z==on) goto $0235CE | |
| 0235B5 | LDA #$0004 | A=#$0004 | 戦闘メッセージID「○○が あらわれた!」 | 
| 0235B8 | PHA | Push A | |
| 0235B9 | LDA $2567,X | A=$2567+X | |
| 0235BC | STA $5A22 | $5A22=A | |
| 0235BF | CMP #$00F0 | A==#$00F0? | デスタムーア第2形態 | 
| 0235C2 | BNE #$05 | if(z==off) goto $0235C9 | |
| 0235C4 | LDA #$0005 | A=#$0005 | 戦闘メッセージID「○○が しょうたいを あらわした!」 | 
| 0235C7 | STA $01,S | Stack($01)=A | |
| 0235C9 | PLA | Pull A | |
| 0235CA | JSL $C02A29 | SR: $002A29 | 戦闘メッセージ表示 メッセージID:A | 
| 0235CE | INX | X++ | |
| 0235CF | INX | X++ | |
| 0235D0 | CPX #$0008 | X>=#$0008? | |
| 0235D3 | BCC #$DB | if(c==off) goto $0235B0 | |
| 0235D5 | JSL $C02A16 | SR: $002A16 引数:1#$0001 | 戦闘メッセージ表示 | 
| 0235DB | LDA #$0041 | A=#$0041 | |
| 0235DE | STA $2555 | $2555=A | |
| 0235E1 | PEA #$2513 | Push #$2513 | |
| 0235E4 | PEA #$0003 | Push #$0003 | |
| 0235E7 | PEA #$7E00 | Push #$7E00 | |
| 0235EA | JSL $C92965 | SR: $092965 | RAM上情報取得 | 
| 0235EE | BEQ #$17 | if(z==on) goto $023607 | |
| 0235F0 | DEC | A– | |
| 0235F1 | ASL | A< <1 | |
| 0235F2 | ASL | A< <1 | |
| 0235F3 | TAX | X=A | |
| 0235F4 | JSL $C00E97 | SR: $000E97 | 乱数発生(00-FF) | 
| 0235F8 | AND #$0001 | A&=#$0001 | |
| 0235FB | BEQ #$02 | if(z==on) goto $0235FF | |
| 0235FD | INX | X++ | |
| 0235FE | INX | X++ | |
| 0235FF | LDA $C23608,X | A=$023608+X | |
| 023603 | JSL $C02A29 | SR: $002A29 | 戦闘メッセージ表示 メッセージID:A | 
| 023607 | RTS | return | 
ここではモンスターの出現テキストの表示、および強襲時のメッセージを表示しているようです。$0235F4の乱数は1/2の確率で「○○は こちらが みがまえるまえに おそいかかってきた!」か「○○は いきなり おそいかかってきた!」のどちらを表示するかを決定しているだけのようです。どっちも先手をとられることには変わりないので表現の違いだけです。
- SR: $023610 出現時特殊ステータスセット
 
| 023610 | JSL $C0268F | SR: $00268F | |
|---|---|---|---|
| 023614 | LDX #$0000 | X=#$0000 | |
| 023617 | STX $2559 | $2559=X | |
| 02361A | JSL $C23625 | SR: $023625 | 出現時眠り状態決定? | 
| 02361E | INX | X++ | |
| 02361F | CPX #$0018 | X>=#$0018? | |
| 023622 | BCC #$F3 | if(c==off) goto $023617 | |
| 023624 | RTS | return | 
- SR: 023625 出現時眠り・マホカンタ状態決定?
 
| 023625 | PHP | Push P Flag | |
|---|---|---|---|
| 023626 | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
| 023628 | PHA | Push A | |
| 023629 | PHX | Push X | |
| 02362A | PHY | Push Y | |
| 02362B | PHB | Push DB | |
| 02362C | PEA #$7E7E | Push #$7E7E | |
| 02362F | PLB | Pull DB | |
| 023630 | PLB | Pull DB | |
| 023631 | LDX $2559 | X=$2559 | |
| 023634 | JSL $C2EFA7 | SR: $02EFA7 引数:1#$205F 引数:2#$0001 | 戦闘中キャラクター情報取得 インデックス:X | 
| 02363C | BEQ #$5B | if(z==on) goto $023699 | |
| 02363E | JSL $C2EFA7 | SR: $02EFA7 引数:1#$204F 引数:2#$01FF | 戦闘中キャラクター情報取得 インデックス:X | 
| 023646 | CMP #$0100 | A>=#$0100? | キャラクターIDが味方ならスキップ | 
| 023649 | BCS #$4E | if(c==on) goto $023699 | |
| 02364B | TAY | Y=A | |
| 02364C | JSL $C2F13D | SR: $02F13D 引数:1#$0170 引数:2#$000C | モンスター基本データアクセス インデックス:Y | 
| 023654 | PHX | Push X | |
| 023655 | ASL | A< <1 | |
| 023656 | TAX | X=A | |
| 023657 | JSL $C00E97 | SR: $000E97 | 乱数発生(00-FF) | 
| 02365B | AND #$0003 | A&=#$0003 | |
| 02365E | CMP $C236A1,X | A==or>=$0236A1+X? | |
| 023662 | PLX | Pull X | |
| 023663 | BCS #$34 | if(c==on) goto $023699 | |
| 023665 | JSL $C2F13D | SR: $02F13D 引数:1#$0176 引数:2#$0004 | モンスター基本データアクセス インデックス:Y | 
| 02366D | BEQ #$0D | if(z==on) goto $02367C | |
| 02366F | LDA #$0001 | A=#$0001 | マホカンタ設定 | 
| 023672 | JSL $C2F034 | SR: $02F034 引数:1#$2059 引数:2#$0040 | 戦闘中キャラクター情報変更 インデックス:X | 
| 02367A | BRA #$1D | goto $023699 | |
| 02367C | LDA #$0004 | A=#$0004 | 眠り深度設定 | 
| 02367F | JSL $C2F034 | SR: $02F034 引数:1#$2050 引数:2#$00E0 | 戦闘中キャラクター情報変更 インデックス:X | 
| 023687 | LDA $59AA | A=$59AA | |
| 02368A | CMP #$0007 | A>=#$0007? | |
| 02368D | BCC #$04 | if(c==off) goto $023693 | |
| 02368F | JSL $C0268F | SR: $00268F | |
| 023693 | JSL $C02A16 | SR: $002A16 引数:1#$000A | 戦闘メッセージ表示「しかし ○○は ねむっている!」 | 
| 023699 | PLB | Pull DB | |
| 02369A | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
| 02369C | PLY | Pull Y | |
| 02369D | PLX | Pull X | |
| 02369E | PLA | Pull A | |
| 02369F | PLP | Pull P Flag | |
| 0236A0 | RTL | return | 
ここでは出現モンスターの初期状態異常を設定しています。まずは乱数で異常発生するかを決定し、状態異常がマホカンタであるかフラグを見てONが立っていればマホカンタ状態、そうでなければ眠り状態にするという処理をやっています。眠りかマホカンタかは排他のようです。乱数のところの実装がちょっとわかりにくいですが、乱数値を#$03でマスクをかけ(この時点で乱数値の取りうる範囲は0-3)、それと$0236A1から並んでいるしきい値と比較してしきい値より大きければ状態異常にしない、となっています。しきい値は#$00, #$02, #$03, #04なので、確率はそれぞれ0%, 50%, 75%, 100%となります。実際にモンスターに設定されている値を見てみると(一部抜粋)
| モンスター名 | 確率 | マホカンタ状態 | 
|---|---|---|
| テールイーター | 75% | OFF | 
| いどまじん | 50% | ON | 
| あくまのカガミ | 75% | ON | 
| キラーマジンガ | 50% | ON | 
| しれんその2 | 100% | ON | 
と設定されているので、実際のゲームでの動作と一致してるっぽいです。キラーマジンガなんかは100%マホカンタのようなイメージでしたが、実際は50%だというのはあまり認識していませんでした。奇しくもDQ3 K.Mixにキラーマジンガを登場させたところで何度かの調整の後、キラーマジンガの初期マホカンタ率を25%にしたのですが(運によっては相方のバイキルトが攻撃力激高のキラーマジンガにはかからないようにするため)、オリジナルの実装に知らないうちに寄せていたことになります。
長くなったので今回はこの辺で。数ヶ月ぶりに解析をやったのですが、結構ポンコツになっていて、「強襲メッセージの表示」のところを最初「先制決定」だと思ってたりしてました(なんでドラゴンの職業レベルを取得するところがないんだと思っていましたが、先制強襲決定は戦闘に入る前に行われるのをすっかり忘れていました)。そういう意味でも表に出すエントリしてまとめる作業というのは自分の思考の整理が進んでいいのではと思ったりしています。

  
  
  
  
コメント