だいぶ間が空いてしまいました。まずは回復系の効果値の算出について見てみます。
- SR: $02D8FC AI判断用_SR_0007
02D8FC | STZ $14 | DP($14)=#$00 | |
---|---|---|---|
02D8FE | LDA #$0017 | A=#$0017 | |
02D901 | STA $258B | $258B=A | |
02D904 | LDY #$04AC | Y=#$04AC | |
02D907 | LDA $205F,Y | A=$205F+Y | |
02D90A | AND #$0001 | A&=#$0001 | |
02D90D | BEQ #$34 | if(z==on) goto $02D943 | |
02D90F | LDA $204E,Y | A=$204E+Y | |
02D912 | AND #$0007 | A&=#$0007 | |
02D915 | CMP #$0006 | A>=#$0006? | |
02D918 | BCC #$29 | if(c==off) goto $02D943 | |
02D91A | LDA $205E,Y | A=$205E+Y | |
02D91D | AND #$0004 | A&=#$0004 | |
02D920 | BNE #$21 | if(z==off) goto $02D943 | |
02D922 | LDA $2050,Y | A=$2050+Y | |
02D925 | AND #$0002 | A&=#$0002 | |
02D928 | BNE #$19 | if(z==off) goto $02D943 | |
02D92A | LDA $2059,Y | A=$2059+Y | |
02D92D | AND #$00C0 | A&=#$00C0 | |
02D930 | BNE #$11 | if(z==off) goto $02D943 | |
02D932 | JSR $D94F | SR: $02D94F | 回復行動効果値算出 |
02D935 | LDA $00 | A=DP($00) | |
02D937 | CMP $14 | A>=DP($14)? | |
02D939 | BCC #$08 | if(c==off) goto $02D943 | |
02D93B | STA $14 | DP($14)=A | |
02D93D | LDA $258B | A=$258B | |
02D940 | STA $2591 | $2591=A | |
02D943 | TYA | A=Y | |
02D944 | SEC | c=on | |
02D945 | SBC #$0034 | A-=(#$0034+!c) | |
02D948 | TAY | Y=A | |
02D949 | DEC $258B | $258B– | |
02D94C | BPL #$B9 | if(n==off) goto $02D907 | |
02D94E | RTS | return |
ここは単に外枠に当たる部分で戦闘に参加しているキャラクターでループしているだけなので取り立てて説明するべきところはありません。
- SR: $02D94F 回復行動効果値算出
02D94F | STZ $00 | DP($00)=#$00 | |
---|---|---|---|
02D951 | LDA $203C,Y | A=$203C+Y | $203Cには最大HPがセットされている |
02D954 | PHA | Push A | |
02D955 | SEC | c=on | |
02D956 | SBC $2030,Y | A-=($2030+Y+!c) | 最大HPと現HPの差(HP減少分)を取得 |
02D959 | STA $02 | DP($02)=A | HP減少分をセット |
02D95B | PLA | Pull A | |
02D95C | LSR | A>>1 | |
02D95D | CMP $2030,Y | A>=$2030+Y? | |
02D960 | BCC #$0C | if(c==off) goto $02D96E | HPが最大HPの50%以上 |
02D962 | LSR | A>>1 | |
02D963 | CMP $2030,Y | A>=$2030+Y? | |
02D966 | BCC #$13 | if(c==off) goto $02D97B | HPが最大HPの25%を切っている |
02D968 | JSR $D988 | SR: $02D988 | 回復量最小値をHP減少分でクリップ |
02D96B | ASL $00 | DP($00)<<1 | ピンチなので効果値を2倍にする |
02D96D | RTS | return | |
02D96E | JSR $D988 | SR: $02D988 | 回復量最小値をHP減少分でクリップ |
02D971 | LDA $0E | A=DP($0E) | |
02D973 | CMP #$0004 | A==#$0004? | 作戦がいのちだいじにでなければ効果値1/2 |
02D976 | BEQ #$02 | if(z==on) goto $02D97A | |
02D978 | LSR $00 | DP($00)>>1 | |
02D97A | RTS | return | |
02D97B | JSR $D988 | SR: $02D988 | 回復量最小値をHP減少分でクリップ |
02D97E | LDA $0E | A=DP($0E) | |
02D980 | CMP #$0000 | A==#$0000? | 作戦がガンガンいこうぜなら効果値1/2 |
02D983 | BNE #$02 | if(z==off) goto $02D987 | |
02D985 | LSR $00 | DP($00)>>1 | |
02D987 | RTS | return |
現HPが最大HPの50%以上、25%~50%、25%未満の3パターンで効果値の動作が変わっています。行動種別ごとの作戦毎の補正とは別に特別な処理をしているわけです。
アドレス | 動作 | |
---|---|---|
50%以上 | $02D96E-7A | 「いのちだいじに」でなければ効果値1/2(あまり必要性がない) |
25%~50% | $02D97B-87 | 「ガンガンいこうぜ」であれば効果値1/2 |
25%未満 | $02D966-6D | 作戦にかかわらず効果値2倍(ピンチなので) |
- SR: $02D988 回復量最小値をHP減少分でクリップ
02D988 | LDA $258B | A=$258B | |
---|---|---|---|
02D98B | STA $2559 | $2559=A | |
02D98E | PHY | Push Y | |
02D98F | JSL $C9291A | SR: $09291A | 回復量の最小値を取得 |
02D993 | PLY | Pull Y | |
02D994 | LDA $0C | A=DP($0C) | |
02D996 | CMP #$8020 | A==#$8020? | 山彦による2回発動対象か |
02D999 | BNE #$02 | if(z==off) goto $02D99D | |
02D99B | ASL $00 | DP($00)<<1 | 山彦発動なら2倍にする |
02D99D | LDA $02 | A=DP($02) | |
02D99F | CMP $00 | A>=DP($00)? | |
02D9A1 | BCS #$02 | if(c==on) goto $02D9A5 | |
02D9A3 | STA $00 | DP($00)=A | |
02D9A5 | RTS | return |
効果値の算出ですが、最大HP-HPの値と対象の戦闘行動の最小回復値を比較して値の小さいものを効果値として採用しています。これは最大HP30、現HP10のキャラクターに無意味にベホマを使わないようにするためです(ホイミで事足りるのでホイミを使うべき)。次回以降はダメージ系、確率系の効果値の算出を見ていきます。
コメント