反撃命令による武器選択の基準がよく分からないと言われているSFC版第3次スーパーロボット大戦ですが、反撃命令の設定箇所をざっと解析してみたところ、それぞれの命令で使用武器の選択基準が違っている事が分かりました。大まかな内容ですが、基本的には以下のような基準で反撃武器や行動を選択しています(なお、原則として敵軍やNPCのパイロットは「必ず反撃せよ!」に設定されています)。 「必ず反撃せよ!」は、残弾や残りENにかかわらず命中率が1%以上ある最強の武器を選択。その武器の命中率がゼロになる場合は、次に威力が高く命中率が1%以上ある武器を選択するという思考を繰り返す。どうしようもない場合は命中率がゼロでもとにかく現状で使用可能な最強の武器を選択する。これに合致する武器がない場合は反撃不能扱いになる。弾切れや射程外からの攻撃には何もしない。先攻側の攻撃でHPがゼロになると判断しても反撃を試み、それができない場合は反撃不能扱いとなる。原則として武器選択の際に相手の残りHPは考慮しないため、反撃相手のHPが仮に残り1であろうとも最強の武器で反撃する。前述の通り、敵軍やNPCは原則としてこの命令が設定されているため、回避力(=パイロットの反応と操縦と直感の総和に機体のサイズ補正を適用した数値)が低いユニットは威力重視の武器で反撃される事が多い。残弾やEN消費も気になるところだが、分身持ちであるゲッター2系やF91であればこの命令を活用できるかもしれない。 「積極的にいけ!」は、相手が一撃で倒せる場合は命中率が1%以上ある最強の武器を選択。但し、その武器の残弾が残り1だったり、その武器を使用してもう一度使用できるだけの残りENがなくなる場合は使わず、次に威力が高く命中率が1%以上あり、かつ残弾が残り2以上か現在のENで二回以上使用できるEN消費武器を選択するという思考を繰り返す(EN消費武器に関してはたまに例外あり)。どうしようもない場合は弾切れ、またはEN枯渇にならない命中率がゼロの現在選択できる最強の武器を選択する。これに合致する武器がない場合は反撃不能扱いになる(そのため、条件を成立させれば弾切れでなくともパイロットが弾切れの台詞を吐く姿を拝める)弾切れや射程外からの攻撃には何もしない。。相手を一撃で倒せない場合の思考も同様。やはり原則として武器選択の際に反撃相手...
ご無沙汰しております。さて、メカ戦士ギメリアの特殊能力「超弾性金属」はダイモスがイベントで取得する「必殺烈風正拳突き改」でのみダメージを与えられるのですが、その仕組みはダメージ計算中のサブルーチンからユニットID、及び武器IDを取得してダメージを0にするか否かの処理(先攻側…3EF48:20 FD F1=03F1FDのサブルーチンを呼び出し、後攻側…3F117:20 FD F1=03F1FDのサブルーチンを呼び出し)にて行っています。なお、アドレスはいずれも初期ROMの場合です。
(サブルーチン読み込み直前に武器ID取得のコマンドが実行されている) 03F1FD 29 FF 03 AND #$03FF (武器IDの)上限を03FFに絞り込み 03F200 85 00 STA $00 (取得した武器IDを)7E0000に書き込み 03F202 A2 00 00 LDX #$000 Xに即値0000を読み込み
03F205 B9 65 18 LDA $1865,Y $7E1865 ユニットID(2バイト)を取得03F208 29 FF 01 AND #$01FF (ユニットIDの)上限を01FFに絞り込み 03F20B DF 26 F2 83 CMP $83F1AD,X $03F226 X.Aから03F226の指定値を減算
03F20F F0 0B BEQ $0B $03F21C 指定値ならば03F21Cにジャンプ 03F211 E8 INX Xに1を加算
03F212 E8 INX Xに1を加算
03F213 E8 INX Xに1を加算
03F214 E8 INX Xに1を加算
03F215 E0 04 00 CPX #$0004 Xから即値0004を減算 03F218 D0 F1 BNE $F1 $03F20B 結果が0以外ならば03F20Bにジャンプ 03F21A 18 CLC Cフラグをクリア 03F21B 60 RTS サブルーチン終了
03F21C BF 28 F2 83 LDA $83F228,X $03F228 X.Aに03F228の指定値を読み込み
03F220 C5 00 CMP $00 Aから7E0000の値を減算 03F222 F0 F6 BEQ $F6 $03F21A 指定値ならば03F21Aにジャンプ 03F224 38 SEC Cフラグをセット 03F225 60 RTS サブルーチン終了
03F226 C4 00 ユニットID:00C4(=ギメリア)03F228 FB 01 武器ID:01FB(=烈風正拳突き改)
後期ROMの場合はこちらです。先攻側…3EECF:20 84 F1=03F184のサブルーチンを呼び出し、後攻側…3F09E:20 84 F1=03F184のサブルーチンを呼び出し)にて行っています。
(サブルーチン読み込み直前に武器ID取得のコマンドが実行されている) 03F184 29 FF 03 AND #$03FF (武器IDの)上限を03FFに絞り込み 03F187 85 00 STA $00 (取得した武器IDを)7E0000に書き込み 03F189 A2 00 00 LDX #$000 Xに即値0000を読み込み 03F18C B9 65 18 LDA $1865,Y $7E1865 ユニットID(2バイト)を取得03F18F 29 FF 01 AND #$01FF (ユニットIDの)上限を01FFに絞り込み 03F192 DF AD F1 83 CMP $83F1AD,X $03F1AD X.Aから03F1ADの指定値を減算
03F196 F0 0B BEQ $0B $03F1A3 指定値ならば03F1A3にジャンプ 03F198 E8 INX Xに1を加算
03F199 E8 INX Xに1を加算
03F19A E8 INX Xに1を加算
03F19B E8 INX Xに1を加算
03F19C E0 04 00 CPX #$0004 Xから即値0004を減算 03F19F D0 F1 BNE $F1 $03F192 結果が0以外ならば03F192にジャンプ 03F1A1 18 CLC Cフラグをクリア 03F1A2 60 RTS サブルーチン終了
03F1A3 BF AF F1 83 LDA $83F1AF,X $03F1AF X.Aに03F1AFの指定値を読み込み
03F1A7 C5 00 CMP $00 Aから7E0000の値を減算 03F1A9 F0 F6 BEQ $F6 $03F1A1 指定値ならば03F1A3にジャンプ 03F1AB 38 SEC Cフラグをセット 03F1AC 60 RTS サブルーチン終了
03F1AD C4 00 ユニットID:00C4(=ギメリア)
03F1AF FB 01 武器ID:01FB(=烈風正拳突き改)
この値を変更したり、サブルーチンを拡張すれば様々な武器耐性を持つユニットを作る事が可能です。また、ユニットIDではなく武器属性を取得(ビームや近接攻撃武器など)してダメージ無効処理をしてみるのも面白いかもしれませんね。
コメント
コメントを投稿