TOP > プログラミング関係解説&調査 > 行動異常 > カウンター行動異常

戦闘開始時行動異常

当ページの内容は、ある程度のプログラミングの知識を必要とする。
まず、プログラミング関係解説&調査をひととおり読んでいただきたい。

前ページの続き。
前ページではカウンター行動異常の説明を行ったが、このページでは、味方が特定の装備品を身に着けている時に、戦闘開始時、特定の種族に発生する行動異常について説明する。

まず、特定の装備品や特定の種族などについて説明する。
戦闘開始時に行動異常を引き起こす装備品は5種類である。
アイテムデータは、1アイテムにつき0~15の16バイト分の容量を使っているが、戦闘開始時の行動異常のデータはアイテムデータ13に入っている。
上1桁が敵種類の値、下1桁が行動異常の値になる。

アイテムID装備品敵種族行動異常アイテムデータ13
$21マーベラーソード魔法生命(E)$9$E9
$25勇者のたて魔法生命(E)$3$E9
$35メラメラこんぼう大型動物(A)$3$A3
$37ペシペシムチ小型動物(8)$4$84
$FAパラサイトソード小型動物(8)$C$8C

上装備品には右と左両方に装備できるものが含まれるが、左に装備しなければ行動異常が発生しない。
というのは、戦闘開始時の行動異常を引き起こすかどうかは、味方キャラの左装備をチェックして判定作業を行うからである。
左以外に装備していても判定自体が行われないので、戦闘開始時の行動異常が発生しないことになる。
また、後述するが、敵種族の「小型動物」は原始編と中世編しか出現せず、「パラサイトソード」は最終編でしか獲得できないので、「パラサイトソード」が戦闘開始時に行動異常を引き起こす機会はない。
(いかにも小型動物っぽい、最終編のおイヌ様やケルベロは、大型動物に分類されている)

敵種類だが、敵データ23の下位4ビットにデータが入っている。
敵データ16~23には、敵のカウンター行動異常の値が属性ごとに入っていて、敵データ23の上位4ビットは悪属性、下位4ビットは無属性に対応しているのだが、この無属性のカウンター行動異常の値がそのまま、敵種類の値も兼ねているという、少し特殊な値なのである。
上表の「小型動物(8)」などのカッコ内数値は、敵データ23の下位4ビットの値である。

下位
4ビット
種族
0(なし)
1超人
2妖怪
3悪魔
4猛禽
5
6機械
7植物
8小型動物
9(なし)
A大型動物
B宇宙人
C軟体動物
D物質
E魔法生命
F恐竜

魔法生命(E)・大型動物(A)・小型動物(8)の敵の一覧を掲載しておく。
大雑把には、魔法生命(E)は中世編終盤のフォビア系の敵など、大型動物(A)と小型動物(8)は見た目通りに大型・小型の野生動物が主で原始編に多く出現する。
隠呼大仏も魔法生命(E)だが、ブリキ大王は装備品が装備できないため、装備品による戦闘開始時の行動異常を発生させることは不可能。
また、功夫・幕末編の敵に対しても、該当装備が存在しないため、同じく装備品による戦闘開始時の行動異常を発生させることは不可能。

魔法生命(E)
シナリオ敵名
近未来隠呼大仏
中世アヌビノフォビア
中世アラクノフォビア
中世エントモフォビア
中世ドラグノフォビア
中世クラウストロPH
中世スコトフォビア
中世アクロフォビア
中世アクロフォビア器
最終イシュタール
最終エントモパイラム
最終ブラキオペルタ
最終バロクレスト
大型動物(A)
シナリオ敵名
原始サーベルタイガー
原始サーベルタイガ♀
原始ブロントテリウム
原始ブロント♀
原始ナウマンゾウ
原始ナウマンゾウ♀
原始マンモス
原始マンモス♀
原始キングマンモー
功夫
功夫猛虎
幕末虎(幕末)
中世ナギーベア
最終ベアナックル
最終ケルベロ
最終デスプロフェット
最終グラングラス
最終おイヌ様
小型動物(8)
シナリオ敵名
原始ころワン
原始ちびマンモス
原始ケケモグラ
原始アーケオテリウム
原始アーケオ♀
原始原始バイソン
原始原始バイソン♀
原始シンテトラケス
原始シンテトラケス♀
中世ライトライダー

装備品と敵種類の設定からも、原始編・中世編メインで考えられた行動異常の発生方法なのだろう。

では、実際に戦闘開始時にどのような処理が行われているのかを見てみる。
味方キャラ番号1・敵種類1の敵番号0の判定を行うものとする。
まず、味方キャラ番号1の左装備と、敵種類1の敵番号0の種族から、戦闘開始時に行動異常を発生させる判定を行うかどうか判断しているサブルーチンを紹介する。

$C1/3546 PHX                     ;Xをスタックにプッシュ
$C1/3547 LDA $0000,x[$00:1C00]   ;Aに[$00:1C00](味方キャラ番号1のキャラID)をロード
$C1/354A CMP #$FF                ;Aと$FFを減算比較(ステータスレジスタ変更のみ)
$C1/354C BEQ $59    [$35A7]      ;ゼロフラグが立っているとき[$35A7]分岐
$C1/354E LDA $0001,x[$00:1C01]   ;Aに[$00:1C01](味方キャラ番号1の戦闘状態)をロード
$C1/3551 BIT #$40                ;Aと$40で論理積(ステータスレジスタ変更のみ)
$C1/3553 BEQ $52    [$35A7]      ;ゼロフラグが立っているとき[$35A7]分岐
$C1/3555 LDY $0002,x[$00:1C02]   ;Yに[$00:1C02](シナリオ別キャラデータ呼び出し用数値)をロード
$C1/3558 LDA $0026,y             ;Aに[$0026,y](シナリオ別キャラデータの左装備ID)をロード
$C1/355B BEQ $4A    [$35A7]      ;ゼロフラグが立っているとき[$35A7]分岐
$C1/355D JSR $3505  [$C1:3505]   ;[$C1:3505]へジャンプ

まずは味方キャラ番号1のデータのチェックから開始になっている。
$C1/354Eの、キャラの戦闘状態のチェックだが、このアドレスには、

  • $00:戦闘離脱(またはパーティにいない)
  • $40:敵操作状態
  • $FF:通常

という値が入る。
$C1/3551で、$40で論理積を取っているため、$00(戦闘離脱)の時のみゼロフラグが立つ。
つまり、該当キャラが戦闘離脱状態(または味方キャラ番号1がパーティにはいない)の時は以降の判定がスキップになる。
味方キャラ番号1は通常主人公なので、戦闘開始時には$00が入ることはまずないはずだが、番号2以降はパーティ人数によっては$00が入っていることになる。
該当キャラがいることが判定されたら、シナリオ別キャラデータから、該当キャラの左装備のアイテムIDをロードする。
$C1/355Bではゼロフラグの判定をしているが、アイテムIDが$00、つまり左に何も装備していない場合も、以降の判定がスキップになる。
ここまでで「味方キャラ番号1が左に何かを装備している」ことが判定されて、次の判定に進むことになる。

$C1/3505 REP #$21                ;Aを16bit幅に変更、キャリーフラグクリア
$C1/3507 AND #$00FF              ;A(左装備アイテムID)と$00FFで論理積
$C1/350A ASL A                   ;算術左シフト *2
$C1/350B ASL A                   ;算術左シフト *2
$C1/350C ASL A                   ;算術左シフト *2
$C1/350D ASL A                   ;算術左シフト *2
$C1/350E ADC $D50068[$D5:0068]   ;左装備アイテムID*10 + [$D5:0069][$D5:0068]($71C4)
$C1/3512 TAX                     ;Aレジスタの値をXレジスタに転送
$C1/3513 SEP #$20                ;MフラグON Aレジスタは8bit幅
$C1/3515 RTS                     ;サブルーチン戻り

続けて、左装備アイテムIDから、左装備のアイテムデータ13を読み込むためのアドレス計算が行われている。
結論だけ書いてしまうと、16bit幅で、「左装備アイテムID」*10 + $71C4を計算し、その値をXレジスタに送っている。

$C1/3560 LDA $D5000D,x[$D5:7541] ;Aに[$D5000D,x](左装備のアイテムデータ13)を読み込み
$C1/3564 AND #$0F                ;Aと$0Fで論理積(=左装備の戦闘開始時行動異常)
$C1/3566 BEQ $3F    [$35A7]      ;ゼロフラグが立っているとき[$35A7]分岐
$C1/3568 STA $11    [$00:0311]   ;A(=左装備の戦闘開始時行動異常)を[$00:0311]に書き込み
$C1/356A LDA $D5000D,x[$D5:7541] ;Aに[$D5000D,x](左装備のアイテムデータ13)を読み込み
$C1/356E LSR A                   ;Aを論理右シフト /2
$C1/356F LSR A                   ;Aを論理右シフト /2
$C1/3570 LSR A                   ;Aを論理右シフト /2
$C1/3571 LSR A                   ;Aを論理右シフト /2(左装備のアイテムデータ13÷$10)
$C1/3572 STA $10    [$00:0310]   ;A(=左装備の戦闘開始時行動異常を起こす敵種類)を[$00:0310]に書き込み

$C1/3560で、先に計算しXレジスタに入れた値と$D5000Dを加算することで、該当の左装備のアイテムデータ13のアドレスになる。
既に説明した通り、アイテムデータ13の上1桁が敵種類の値、下1桁が行動異常の値である。
$C1/3564では、$0Fと論理積を取っているので、下1桁の行動異常の値が取り出されたことになる。
$C1/3566はゼロフラグ判定で、ここでゼロフラグが立つ場合は、該当の装備品には戦闘開始時行動異常が設定されていないということになるから、以降の処理をスキップする。
ここで、戦闘開始時行動異常判定を行うことが決定になり、行動異常の値は[$00:0311]に書き込みされた。

ついで、今度はアイテムデータ13の上1桁を取り出すため、アイテムデータ13を論理右シフト4回、つまり÷$10で小数点を左に1個ずらす計算を行っている。これで、上1桁の値が下1桁に移動したことになり、アイテムデータ13の上1桁・敵種類の値を取り出せた。
敵種類の値は[$00:0310]に書き込みされている。

$C1/3574 LDY #$1A00              ;Yに$1A00をロード
$C1/3577 LDA $0001,y[$00:1A01]   ;Aに[$00:1A01](敵種類1のデータ01・敵の状態)をロード
$C1/357A BIT #$40                ;Aと$40で論理積(ステータスレジスタ変更のみ)
$C1/357C BEQ $1B    [$3599]      ;ゼロフラグが立っているとき[$3599]分岐
$C1/357E LDA $0037,y[$00:1A37]   ;Aに[$00:1A37](敵データ23・下4ビット敵種類)をロード
$C1/3581 AND #$0F                ;Aと$0Fで論理積(= 敵データ23の敵種類)
$C1/3583 CMP $10    [$00:0310]   ;Aと[$00:0310](=左装備の戦闘開始時行動異常を起こす敵種類)を減算比較
$C1/3585 BNE $12    [$3599]      ;ゼロフラグが立っていないとき[$3599]分岐
$C1/3587 LDA $000A,y[$00:1A0A]   ;Aに[$00:1A0A](戦闘開始時に$00が入る)をロード
$C1/358A BEQ $08    [$3594]      ;ゼロフラグが立っているとき[$3594]分岐
$C1/3594 LDA $11    [$00:0311]   ;Aに[$00:0311](=左装備の戦闘開始時行動異常)をロード
$C1/3596 STA $000A,y[$00:1A0A]   ;A(=左装備の戦闘開始時行動異常)を[$00:1A0A]に書き込み
$C1/3599 REP #$21                ;Aを16bit幅に変更、キャリーフラグクリア
$C1/359B TYA                     ;Yレジスタの値をAレジスタに転送
$C1/359C ADC #$0040              ;A + #$0040(敵種類2のアドレス呼び出し用)
$C1/359F TAY                     ;Aレジスタの値をYレジスタに転送
$C1/35A0 SEP #$20                ;MフラグON Aレジスタは8bit幅
$C1/35A2 CPY #$1B00              ;Yと$1B00を減算比較(ステータスレジスタ変更のみ)
$C1/35A5 BNE $D0    [$3577]      ;ゼロフラグが立っていないとき[$3577]分岐

ここから、左装備の戦闘開始時行動異常を起こす敵種類の値[$00:0310]と、敵種類1の敵種類の値が一致しているかどうかの判定である。
$C1/357Eで、敵種類1の敵データ23[$00:1A37]Aにロードしている。敵データ23の下1桁が敵種類の値である。
$C1/3581で、$0Fと論理積を取り、下1桁の敵種類の値を取り出している。
$C1/3583で、敵データの敵種類の値と、[$00:0310]を減算比較している。
ここでゼロフラグが立つのなら、敵データの敵種類の値 = [$00:0310]であり、敵種類1は左装備の戦闘開始時行動異常を起こす敵種類である、という判定になる。
更に、[$00:0311](=左装備の戦闘開始時行動異常)は[$00:1A0A]に書き込まれる。
以上で、敵種類1に対しての処理は終了となり、敵種類2以降に同様の判定を行うことになる。ここでは敵種類2以降の処理は掲載しない。

さて、実際に行動異常を発生させるかどうかは、乱数で判定する。
技による行動異常は必ず発生していたのだが、左装備による戦闘開始時の行動異常は、確率で発生するということになる。
[$00:1A0A]には上の通りに、左装備の戦闘開始時行動異常の値が入っているが、それ以前、戦闘開始直後に必ず$00が書き込まれるようになっている。
よって、乱数判定は、[$00:1A0A]$00が入っていない時にだけ起こる。

$C1/35A9 LDY $0002,x[$00:1B02]   ;Yに[$00:1B02](敵番号0のアドレス用数値)をロード
$C1/35AC LDA $000A,y[$00:1A0A]   ;Aに[$00:1A0A](=左装備の戦闘開始時行動異常)をロード
$C1/35AF BEQ $12    [$35C3]      ;ゼロフラグが立っているとき[$35C3]分岐
$C1/35B1 CMP #$FF                ;Aと$FFを減算比較
$C1/35B3 BEQ $0E    [$35C3]      ;ゼロフラグが立っているとき[$35C3]分岐
$C1/35B5 JSR $6150  [$C1:6150]   ;[$C1:6150]へジャンプ
;
$C1/6150 PHX                     ;戦闘乱数計算
$C1/6151 PHB                     ;↓
$C1/6152 LDA #$00                ;↓
$C1/6154 PHA                     ;↓
$C1/6155 PLB                     ;↓
$C1/6156 LDA $38    [$00:0338]   ;↓
$C1/6158 ORA $39    [$00:0339]   ;↓
$C1/615A ORA $3A    [$00:033A]   ;↓
$C1/615C ORA $3B    [$00:033B]   ;↓
$C1/615E BNE $24    [$6184]      ;↓
$C1/6184 LDX $38    [$00:0338]   ;↓
$C1/6186 STX $4204  [$00:4204]   ;↓
$C1/6189 LDA #$0D                ;↓
$C1/618B STA $4206  [$00:4206]   ;↓
$C1/618E JSR $46C8  [$C1:46C8]   ;↓
;
$C1/46C8 NOP                     ;↓
$C1/46C9 RTS                     ;↓
;
$C1/6191 LDA $39    [$00:0339]   ;↓
$C1/6193 STA $38    [$00:0338]   ;↓
$C1/6195 LDA $3A    [$00:033A]   ;↓
$C1/6197 STA $39    [$00:0339]   ;↓
$C1/6199 LDA $3B    [$00:033B]   ;↓
$C1/619B STA $3A    [$00:033A]   ;↓
$C1/619D LDA $4214  [$00:4214]   ;↓
$C1/61A0 STA $3B    [$00:033B]   ;↓
$C1/61A2 PLB                     ;↓
$C1/61A3 PLX                     ;↓
$C1/61A4 RTS                     ;乱数がAと[$00:033B]に入る
;
$C1/35B8 CMP #$80                ;A(乱数)と$80を減算比較
$C1/35BA BCS $07    [$35C3]      ;キャリーフラグが立っているとき[$35C3]分岐
$C1/35BC LDA $000A,y[$00:1A0A]   ;Aに[$00:1A0A](=左装備の戦闘開始時行動異常)をロード
$C1/35BF STA $7E8F02,x[$7E:AA02] ;Aを[$7E:AA02](敵番号0の行動異常)に書き込み
$C1/35C3 RTS                     ;サブルーチン戻り

$C1/35AC[$00:1A0A]をロードし、ゼロフラグが立たなかった場合、かつ$FFと減算比較してゼロフラグが立たなかった場合は、戦闘乱数($00$FF)の計算に入る。
戦闘乱数生成の$C1/6150$C1/61A4の説明は省略する。
生成した乱数は、$C1/35B8で、$80と減算比較している。
キャリーフラグが立たない場合、つまり、乱数が$00$7Fだと、行動異常が発生することになり、$C1/35BCで行動異常の値[$00:1A0A]Aにロードし、その値を敵番号0の敵の行動異常のアドレス[$7E:AA02]に書き込みして、処理終了である。
キャリーフラグが立つ、つまり乱数が$80$FFの場合は、行動異常書き込み処理をスキップしているので、行動異常は発生しない。
以上から、戦闘開始時の行動異常発生確率は128/2561/2であることがわかる。
発生後の行動異常の処理は、技で発生させた場合と同じなので省く。

以上は味方キャラ番号1の左装備が戦闘開始時行動異常を起こす装備だった場合である。
では、2人以上の味方キャラの左装備が戦闘開始時行動異常を起こす装備だったら、判定はどうなるのか?
実は、2人目以降は、装備自体のチェックは行われるものの、判定は1人分しか行われない。
例えば原始編で、ポゴもべるも左に「ペシペシムチ」を装備して、小型動物(8)が含まれる敵パーティと戦闘を行う場合、戦闘開始時に「ペシペシムチ」による行動異常$4が起こるかどうかは、ポゴの分、つまり1回しか判定が行われないのである。
もし、ポゴが左に「ペシペシムチ」を装備せず、べるだけ左に「ペシペシムチ」を装備している場合は、べるの分で判定を行うので、キャラによってスキップされたということではなく、単純に、味方キャラ番号の最も小さいキャラの装備分しか行動異常判定を行わない、というだけである。
複数キャラに該当の装備を装備させておいても、行動異常の発生確率を上げられるということは残念ながらない。



このページをシェアする

上へ