TOP > プログラミング関係解説&調査 > ブリキ大王戦の処理

ブリキ大王戦の処理

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

ブリキ大王戦についてはセレクトバグで触れたことがあるが、ここでは戦闘開始時について解説する。
功夫編終盤の解説にて、ラストバトルで功夫編主人公のデータ処理について触れた。
近未来編のブリキ大王戦では、本来近未来編の主人公であるアキラがいない状態でブリキ大王のみが戦闘に登場する。
だが、メニュー画面ではアキラのみが存在している。
シナリオ別キャラデータでも、アキラのデータをブリキ大王で上書きしているのではない。
ではどのように処理しているのだろうか。

世界の合言葉は森部様の敵パーティデータで、ブリキ大王に関する戦闘のデータを見てみると、妙な初期配置になっている。
これまでも述べた通り、ブリキ大王のデータは敵データとして登録されているので、ブリキ大王戦では敵キャラとしてブリキ大王とそのほかの敵が登場する。
では味方キャラはいないのかというと、マップ左上隅に味方キャラが存在しているのだ。
実際の戦闘に近未来編のブリキ大王以外の味方キャラ(アキラなど)が登場しないことは、プレイした方なら知っての通りである。
これはどういうことなのか。

ここで敵パーティデータについて説明する。
ここでは例として、ブリキ大王戦の初戦である翔電×3戦(敵パーティデータID$82, データ位置は$D6:4A9A~)について説明する。
敵パーティデータは敵の総数により容量が変動するが、今回は敵がブリキ大王+翔電×3で4体だから、敵4体分の座標を記録する都合で、14バイト分の領域を使用している。

No.数値内容
00$00敵パーティレベル
01$01味方・敵の状態
02$C0味方1 向き/初期座標
03$FF味方2 向き/初期座標
04$FF味方3 向き/初期座標
05$FF味方4 向き/初期座標
06$04上位8ビット:アイテム入手率補正
下位8ビット:敵の総数
07$69敵ID(0)
08$62向き/初期座標(0)
09$62敵ID(1)
10$09向き/初期座標(1)
11$62敵ID(2)
12$01向き/初期座標(2)
13$62敵ID(3)
14$0A向き/初期座標(3)

味方・敵の状態を表す$01は敵を操作して敵と戦う戦闘のこと。本作においては実質、ブリキ大王操作時専用の数値である。
味方キャラの座標や向きは、敵パーティデータ02~05に入っているが、この数値が$FFの時は該当キャラは存在しない。
よって、この戦闘では味方キャラ1、つまり主人公キャラ(アキラ)のみ、$C0というデータが入っている。
向きと初期座標は以下のように計算される。

上2ビット:向き

数値向き
%00右下
%01左下
%10右上
%11左上

下6ビット:座標

左上マスを(0,0)として、右方向がX0~6)、下方向がY0~6)。
3ビットずつ区切って、順に(X,Y)が入る。

以上から、味方キャラ1の向き/初期座標$C0 = %1100 0000は、

  • 向き:左上
  • 座標:(0,0)

を意味することがわかる。
敵パーティデータにおいて、ブリキ大王戦で、味方キャラ1、つまりアキラは、初期配置が左上隅マスで左上向きであることがわかった。

敵パーティデータ07以降は、敵IDと敵の初期配置を2バイトずつ記してある。
敵ID$69はブリキ大王で、向き/初期座標$62 = %0110 0010だから、向きは左下、座標:(4,2)。ちなみにブリキ大王の左上マスの位置になる。
敵ID$62は翔電で、3体いるから、以下の通り。

数値向き座標
$09%0000 1001右下(1,1)
$01%0000 0001右下(0,1)
$0A%0000 1010右下(1,2)

整理すると初期配置はこのようになる。

さて、戦闘では実際には味方キャラ1はいないが、どうなっているのか。
翔電×3戦で説明していくが、翔電×3戦開始時、敵パーティデータの開始位置$D6:4A9Aが読み込まれるのが以下の処理。

$C1/F60E LDA $D60000,x[$D6:4A9A] ;Aに[$D6:4A9A](敵パーティデータ00 $00)をロード
$C1/F612 STA $55    [$00:0355]   ;Aを[$00:0355]に書き込み
$C1/F614 LDA $D60001,x[$D6:4A9B] ;Aに[$D6:4A9B](敵パーティデータ01 $01)をロード
$C1/F618 STA $56    [$00:0356]   ;Aを[$00:0356]に書き込み
$C1/F61A LDA $D60006,x[$D6:4AA0] ;Aに[$D6:4AA0](敵パーティデータ06 $04)をロード
$C1/F61E STA $58    [$00:0358]   ;Aを[$00:0358]に書き込み
$C1/F620 PHX                     ;Xをスタックにプッシュ
$C1/F621 STZ $60    [$00:0360]   ;[$00:0360]に$00を書き込み
$C1/F623 JSR $FB2B  [$C1:FB2B]   ;[$C1:FB2B]へジャンプ

ここで一端、

  • 敵パーティデータ00→$00:0355
  • 敵パーティデータ01→$00:0356
  • 敵パーティデータ06→$00:0358

にコピーされている。

;味方キャラ1の向き・座標処理
$C1/F626 BEQ $39    [$F661]      ;ゼロフラグが立っているとき[$F661]分岐
$C1/F628 LDA $D60002,x[$D6:4A9C] ;Aに[$D6:4A9C](敵パーティデータ02 $C0)をロード
$C1/F62C AND #$3F                ;Aと$3Fで論理積
$C1/F62E CMP #$3F                ;Aと$3Fを減算比較(ステータスレジスタ変更のみ)
$C1/F630 BNE $07    [$F639]      ;ゼロフラグが立っていないとき[$F639]分岐
;ゼロフラグON
$C1/F632 LDA #$00                ;Aに$00をロード
$C1/F634 STA $0001,y             ;Aを[$0001,y]($00:1C41, $00:1C81, $00:1CC1)に書き込み
$C1/F637 BRA $28    [$F661]      ;フラグにかかわりなく常に分岐[$F661]
;ゼロフラグOFF
$C1/F639 AND #$07                ;Aと$07で論理積
$C1/F63B STA $0019,y[$00:1C19]   ;Aを[$00:1C19](初期Y座標)に書き込み
$C1/F63E LDA $D60002,x[$D6:4A9C] ;Aに[$D6:4A9C](敵パーティデータ02 $C0)をロード
$C1/F642 AND #$38                ;Aと$38で論理積
$C1/F644 LSR A                   ;Aを論理右シフト (/2)
$C1/F645 LSR A                   ;Aを論理右シフト (/2)
$C1/F646 LSR A                   ;Aを論理右シフト (/2)
$C1/F647 STA $0018,y[$00:1C18]   ;Aを[$00:1C18](初期X座標)に書き込み
$C1/F64A LDA $0001,y[$00:1C01]   ;Aに[$00:1C01]をロード
$C1/F64D AND #$FF                ;Aと$FFで論理積
$C1/F64F STA $0001,y[$00:1C01]   ;Aを[$00:1C01]に書き込み
$C1/F652 LDA $D60002,x[$D6:4A9C] ;Aに[$D6:4A9C](敵パーティデータ02 $C0)をロード
$C1/F656 ROL A                   ;Aをキャリーフラグを含めた9bitで左ローテート
$C1/F657 ROL A                   ;Aをキャリーフラグを含めた9bitで左ローテート
$C1/F658 ROL A                   ;Aをキャリーフラグを含めた9bitで左ローテート
$C1/F659 AND #$03                ;Aと$03で論理積
$C1/F65B STA $001D,y[$00:1C1D]   ;Aを[$00:1C1D](向き)に書き込み
$C1/F65E JSR $45EE  [$C1:45EE]   ;[$C1:45EE]へジャンプ

$C1/F626$C1/F65Eは、敵パーティデータ02~05から、味方キャラ4キャラ分の向きと座標を計算し、味方キャラ1人目であれば[$00:1C18](初期X座標)、[$00:1C19](初期Y座標)、[$00:1C1D](キャラの向き)に書き込む処理である。
処理前、$C1/F62Cでは敵パーティデータ02~05と$3Fで論理積を取り、その値と$3Fを減算比較してゼロフラグ判定している。
先に説明した通り、敵パーティデータ02~05に格納された数値は、上2ビットが向き、下6ビットが座標にあたるのだが、$3F = %0011 1111だから、$3Fとの論理積は座標部分の取り出しである。
座標部分は3ビットずつ分かれてX座標(0~6)、Y座標(0~6)だから、座標(6, 6)だとしても(%110, %110)%0011 0110 = $36である。$3Fを減算した場合、必ず負の値のはずである。
通常、$C1/F630でゼロフラグが立つことはない。
唯一ゼロフラグが立つのが、近未来編のブリキ大王戦、味方キャラ2~4人目に設定された敵パーティデータ03~05の$FFである。
その場合は$C1/F632$C1/F637の処理が入るが、$00を該当キャラの戦闘状態($00:1C41, $00:1C81, $00:1CC1)に書き込む。
戦闘状態$00は、戦闘離脱状態のことなので、ブリキ大王戦で味方キャラ2~4人目は存在しない扱いになる。

一方、味方キャラ1人目は敵パーティデータ02 = $C0なので、$C1/F630のゼロフラグ判定で$C1/F639に進む。
$07 = %0000 0111だから、論理積を取った値は下3ビット、Y座標の値となり、[$00:1C19](初期Y座標)に書き込む。
その後の$38 = %0011 1000との論理積でX座標の値を取り出し、右シフト3回で数値を右に3桁ずらすことでX座標の値となり、[$00:1C18](初期X座標)に書き込む。
[$00:1C01]には$FFを書き込んでいるが、味方キャラ1の戦闘状態であり、通常状態を意味する。
このため、ここまでの処理だと、味方キャラ1にあたるアキラは通常状態で戦闘に参加する扱いである。

最後に$C0($1100 0000)の上2ビットを取り出すため、キャリーフラグ含め左ローテートする。
$0 1100 0000→$1 1000 0000→$1 0000 0001→$0 0000 0011
で下2ビット位置に移動し、座標の値を取り除くため$03と論理積を取って[$00:1C1D](キャラの向き)に書き込み、処理終了である。
これを味方キャラ1~4で繰り返す。
4人目だと$C1/F637の後、$C1/F661にジャンプして、ループ処理終了後の処理が続く。

$C1/F661 INX                     ;Xをインクリメント +1
$C1/F662 INC $60    [$00:0360]   ;A[$00:0360]をインクリメント +1
$C1/F664 LDA $60    [$00:0360]   ;Aに[$00:0360]をロード
$C1/F666 CMP #$04                ;Aと$04を減算比較(ステータスレジスタ変更のみ)
$C1/F668 BNE $B9    [$F623]      ;ゼロフラグが立っていないとき[$F623]分岐
$C1/F66A LDA $1C00  [$00:1C00]   ;Aに[$00:1C00](味方キャラ1キャラID $11 アキラ)をロード
$C1/F66D BEQ $20    [$F68F]      ;ゼロフラグが立っているとき[$F68F]分岐
$C1/F66F LDA $56    [$00:0356]   ;Aに[$00:0356](敵パーティデータ01 $01)をロード
$C1/F671 AND #$0F                ;Aと$0Fで論理積
$C1/F673 BEQ $1A    [$F68F]      ;ゼロフラグが立っているとき[$F68F]分岐

$C1/F66Fにて、前に敵パーティデータ01が書き込まれた[$00:0356]がロードされる。
ブリキ大王操作時は敵パーティデータ01の値は$01だが、他の値を見てみると、

内容
$00味方 対 敵(通常)
$01敵 対 敵(ブリキ大王戦など)
$10原始編 ざき1戦目
$20幕末編 カラクリ丸戦(とらわれの男が居る場合)
$40味方1キャラ 対 味方1キャラ(功夫編修行など)

こうなっているため、$C1/F671$0Fと論理積をとり、ゼロフラグが立たないのはブリキ大王戦だけである。
よって$C1/F673の先は、ブリキ大王戦専用処理ということになる。

;ゼロフラグOFFはブリキ大王戦のみ
$C1/F675 LDY #$0F80              ;Yに$0F80をロード
$C1/F678 STY $1C02  [$00:1C02]   ;Yを[$00:1C02]に書き込み
$C1/F67B LDY #$1C00              ;Yに$1C00をロード
$C1/F67E LDA #$40                ;Aに$40をロード
$C1/F680 STA $0000,y[$00:1C00]   ;A($40)を[$00:1C00](ブリキ大王ID)に書き込み
$C1/F683 STA $0001,y[$00:1C01]   ;A($40)を[$00:1C01]($40:敵操作状態)に書き込み
$C1/F686 STZ $1C41  [$00:1C41]   ;[$00:1C41]に$00を書き込み($00:戦闘離脱)
$C1/F689 STZ $1C81  [$00:1C81]   ;[$00:1C81]に$00を書き込み($00:戦闘離脱)
$C1/F68C STZ $1CC1  [$00:1CC1]   ;[$00:1CC1]に$00を書き込み($00:戦闘離脱)
;ここから他戦闘と共通処理
$C1/F68F PLX                     ;Xレジスタにスタックからプル
$C1/F690 LDY #$1B00              ;Yに$1B00をロード
$C1/F693 STY $1E    [$00:031E]   ;Yを[$00:031E]に書き込み
$C1/F695 STZ $1A01  [$00:1A01]   ;[$00:1A01]に$00を書き込み
$C1/F698 STZ $1A41  [$00:1A41]   ;[$00:1A41]に$00を書き込み
$C1/F69B STZ $1A81  [$00:1A81]   ;[$00:1A81]に$00を書き込み
$C1/F69E STZ $1AC1  [$00:1AC1]   ;[$00:1AC1]に$00を書き込み
$C1/F6A1 LDA $58    [$00:0358]   ;Aに[$00:0358]をロード
$C1/F6A3 AND #$0F                ;Aと$0Fで論理積
$C1/F6A5 STA $57    [$00:0357]   ;Aを[$00:0357]に書き込み
$C1/F6A7 BEQ $49    [$F6F2]      ;ゼロフラグが立っているとき[$F6F2]分岐
$C1/F6A9 STA $08    [$00:0308]   ;Aを[$00:0308]に書き込み
$C1/F6AB LDA $0040  [$00:0040]   ;Aに[$00:0040]をロード
$C1/F6AE CMP #$D2                ;Aと$D2を減算比較(ステータスレジスタ変更のみ)
$C1/F6B0 BNE $37    [$F6E9]      ;ゼロフラグが立っていないとき[$F6E9]分岐
$C1/F6E9 JSR $FB62  [$C1:FB62]   ;[$C1:FB62]へジャンプ

$C1/F675$C1/F68Cがブリキ大王戦用の専用処理。
[$00:1C00][$00:1C01]どちらにも$40が書き込まれるが、[$00:1C00]は味方キャラ1、つまりアキラのキャラID$11が書き込まれていたアドレスである。
ここに$40、ブリキ大王を意味する値が上書きされたため、マップ左上隅に配置された味方キャラ1のデータそのものがブリキ大王のデータに上書きされた。
[$00:1C01]は戦闘状況で、$40は敵キャラを味方としてプレイヤーが操作する場合の値。
ここで「味方キャラ1はブリキ大王、本来敵データに登録されているが味方として操作」という設定になった。
だが、これだけではキャラIDを登録しただけで、ブリキ大王のステータスなどのデータは$00:1C??~などに一切登録されていない。
現状では味方キャラ1の座標はアキラとして計算した(0,0)のままであり、ブリキ大王の初期位置ではない。
この後に処理が続いていくことになる。

$C1/F68F~からは最終編オルステッド主人公時の、ラストボス(敵キャラ)を味方キャラとして操作する場合の処理と被る。
ただ、ブリキ大王戦では、ブリキ大王が敵種類1・敵番号0に登録される他にも敵キャラが存在する(戦う相手である)という違いがある。
この戦闘でいえば、敵種類1にブリキ大王([$00:1A00][$D6:4AA1] = $69をコピー)、敵種類2に翔電([$00:1A40][$D6:4AA3] = $62をコピー)、$00:1A??~・$7E:A???~などに敵データを登録していく($C1/FC0A$C1/FD0F)。
サブルーチンについては味方との戦闘 > 最終編オルステッド主人公時でも紹介したため省略。

敵番号0がブリキ大王([$00:1B00][$00:1A00]をコピー)になるが、敵ID及び、向き[$00:1B04]、X座標[$00:1B0A]、Y座標[$00:1B0B]は、敵パーティデータ08、敵番号0の向き/初期座標である[$D6:4AA2] = $62をロードし、$C1/FBBE$C1/FBFDで計算・書き込みを行っている。
向きや座標の計算方法は味方キャラと同一なので省略。

ブリキ大王のみに絞ると処理は以下のようになっている。

サブルーチンアドレス内容
$C1/FC0A$C1/FC3E敵キャラデータ$20バイト分を$00:1A20$00:1A3Fにコピー
$C1/FC3F$C1/FC58技1~4の反撃属性1/反撃属性2/使用不可になるステータス異常を$00:1A12$00:1A1Dに書き込み
$C1/FBBE$C1/FBFD敵番号0の$00:1B00に敵ID
$00:1B01$FF
敵パーティデータから$00:1B04に向き
$00:1B0A$00:1B0Bに座標を書き込み
$C1/FC78$C1/FD0F$00:1A10(HP)を$7E:AA00
$00:1A29下7バイト(レベル)を$00:1A0B$7E:AB00
$7E:AA08$7E:AA0F$00
$7E:AA02(行動異常)に$00
$00:1A25$00:1A28(力・体・速・知)を$7E:AA03$7E:AA06に書き込み
$C1/F6EC$C1/F6F9$00:1B11$80を書き込み(敵番号1が存在しないため書き込み)

アドレスは異なるが翔電も同様の処理を行う。
翔電のような敵対する敵キャラに関するステータス処理は以上である。

ブリキ大王についての処理はこの先、味方との戦闘 > 最終編オルステッド主人公時と共通部分が多い。

最終編オルステッド主人公時だと、まず主人公のオルステッドのデータが$00:1C00~に入り、続いて操作するラストボスのデータが敵種類1→敵番号0→オルステッドのシナリオ別キャラデータ及び戦闘データ$00:1C00~と順に上書きされた。
ラストボスのデータがシナリオ別キャラデータの中に存在していないため、ラストボスのデータをオルステッドの戦闘用ステータスのみならずシナリオ別キャラデータにも書き込む必要があったのである。

ブリキ大王の場合、シナリオ別キャラデータの中の仲間3人目($00:0F80$00:0FBF)として、近未来編の間はずっとデータが存在している。
よって、処理するサブルーチンは共通部分が多いものの、最終編オルステッド主人公時とは呼び出したり書き込むアドレスが少し変わってくる。

$C1/E894 STZ $0005,x[$00:1C05]   ;[$00:1C05](味方キャラ番号1 経験値)に$00を書き込み
$C1/E897 STZ $001E,x[$00:1C1E]   ;[$00:1C1E]に$00を書き込み
$C1/E89A LDA #$04                ;Aに$04をロード
$C1/E89C STA $001F,x[$00:1C1F]   ;Aを[$00:1C1F]に書き込み
$C1/E89F STZ $11    [$00:0311]   ;[$00:0311]に$00を書き込み
$C1/E8A1 STX $14    [$00:0314]   ;Xを[$00:0314]に書き込み
$C1/E8A3 LDY $0002,x[$00:1C02]   ;Yに[$00:1C02]をロード
$C1/E8A6 LDA $0006,y[$00:0F86]   ;Aに[$00:0F86](シナリオ別キャラデータ ブリキ大王 レベル = $13)をロード
$C1/E8A9 STA $0038,x[$00:1C38]   ;Aを[$00:1C38](味方キャラデータ1人目 LV(現在値))に書き込み
$C1/E8AC LDA #$00                ;Aに$00をロード
$C1/E8AE STA $0039,x[$00:1C39]   ;Aを[$00:1C39](味方キャラデータ1人目 状態異常)に書き込み
$C1/E8B1 LDA #$04                ;Aに$04をロード
$C1/E8B3 STA $08    [$00:0308]   ;Aを[$00:0308]に書き込み
;
;ループ処理
$C1/E8B5 LDA $0010,y             ;Aに[$00:0F90][$00:0F93][$00:0F96][$00:0F99](力/速/体/知)をロード
$C1/E8B8 STA $0030,x             ;Aを[$00:1C30]~[$00:1C33](力/速/体/知 通常値)に書き込み
$C1/E8BB STA $0034,x             ;Aを[$00:1C34]~[$00:1C37](力/速/体/知 現在値)に書き込み
$C1/E8BE INX                     ;Xをインクリメント +1
$C1/E8BF INY                     ;Yをインクリメント +1
$C1/E8C0 INY                     ;Yをインクリメント +1
$C1/E8C1 INY                     ;Yをインクリメント +1
$C1/E8C2 DEC $08    [$00:0308]   ;[$00:0308]をデクリメント -1
$C1/E8C4 BNE $EF    [$E8B5]      ;ゼロフラグが立っていないとき[$E8B5]分岐
;ループここまで
;
$C1/E8C6 LDX $14    [$00:0314]   ;Xに[$00:0314]をロード
$C1/E8C8 RTS                     ;サブルーチン戻り

例えば上のサブルーチンは最終編オルステッド主人公時でも処理されるが、$C1/E8A6でロードしているのは[$00:0F86](シナリオ別キャラデータのブリキ大王のレベルの値)であるのに対し、最終編オルステッド主人公時は[$00:0D06](シナリオ別キャラデータのオルステッドのレベルの値)がロードされる。
ブリキ大王戦では、呼び出される元となるシナリオ別キャラデータがアキラではなく、ブリキ大王なのである。
このため、最終編オルステッド主人公時だとオルステッドのシナリオ別キャラデータが操作するラストボスのデータで一部上書きされてしまうことに対し、ブリキ大王のデータがアキラのシナリオ別キャラデータに上書きされるなどの影響はない。

ただ、ブリキ大王のシナリオ別キャラデータ$00:0F80$00:0FBFは、セレクトバグで紹介したとおり、味方キャラデータ呼び出し用アドレスが入る$00:0F84$00:0F85に、ブリキ大王の値が入っておらず、それ以前に入っていた値(サモ、ざき、ハッシュの中の誰かのデータ)が残された状態である。
このため「ひとつ前の技」の登録だけは不具合が生じる。不具合といってもセレクトバグを使わない限り、実際のプレイで問題になることはないのだが。
「ひとつ前の技」の処理は上の$C1/E894$C1/E8C8の少し前である。
ここでは$00:0F84$00:0F85にサモのデータが残ったままとする。

$C1/E94B PHX                     ;Xをスタックにプッシュ
$C1/E94C STX $14    [$00:0314]   ;Xを[$00:0314]に書き込み
$C1/E94E LDY $0002,x[$00:1C02]   ;Yに[$00:1C02]をロード
$C1/E951 LDX $0004,y[$00:0F84]   ;Xに[$00:0F85][$00:0F84](味方キャラデータ呼び出し用アドレス)をロード
;[$00:0F85][$00:0F84] = X:02AF サモのデータ呼び出しアドレス
$C1/E954 REP #$20                ;Aを16bit幅に変更、Mフラグをクリア
$C1/E956 LDA $000D,y[$00:0F8D]   ;Aに[$00:0F8E][$00:0F8D](ブリキ大王の習得技2バイト $000F)をロード
$C1/E959 STA $10    [$00:0310]   ;Aを[$00:0310]に書き込み
$C1/E95B SEP #$20                ;MフラグON Aレジスタは8bit幅
$C1/E95D LDY $14    [$00:0314]   ;Yに[$00:0314]をロード
$C1/E95F LDA #$10                ;Aに$10をロード
$C1/E961 STA $08    [$00:0308]   ;Aを[$00:0308]に書き込み
$C1/E963 STA $09    [$00:0309]   ;Aを[$00:0309]に書き込み
$C1/E965 LDA $D50005,x[$D5:02B4] ;Aに[$D5:02B4](サモの技LV00の技ID$A5「クマの手」をロード)
$C1/E969 STA $12    [$00:0312]   ;A($A5)を[$00:0312]に書き込み
$C1/E96B BNE $06    [$E973]      ;ゼロフラグが立っていないとき[$E973]分岐
$C1/E973 STX $14    [$00:0314]   ;Xを[$00:0314]に書き込み
$C1/E975 JSR $3D93  [$C1:3D93]   ;[$C1:3D93]へジャンプ
;(中略)
$C1/E9A6 LDA $12    [$00:0312]   ;A($A5)に[$00:0312]をロード
$C1/E9A8 STA $7ECD00,x[$7E:E900] ;Aを[$7E:E900]($A5)に書き込み
;(中略)
$C1/E9F0 LDA $000C,y[$00:0F8C]   ;Aに[$00:0F8C](ブリキ大王のひとつ前に使った技 初期値$00)をロード
$C1/E9F3 BNE $07    [$E9FC]      ;ゼロフラグが立っていないとき[$E9FC]分岐
$C1/E9F5 LDA $7ECD00,x[$7E:E900] ;Aに[$7E:E900]($A5)をロード
$C1/E9F9 STA $000C,y[$00:0F8C]   ;A($A5)を[$00:0F8C](ブリキ大王のひとつ前に使った技)に書き込み
$C1/E9FC RTS                     ;サブルーチン戻り

こうしてブリキ大王のシナリオ別キャラデータの「ひとつ前に使った技」[$00:0F8C]の値が、サモの技LV00の技ID$A5に変更されてしまうのである。

他の技の処理では問題は起こらない。
敵種類1の使用技が書き込まれている$00:1A2B$00:1A2E(敵データ11~14)や、反撃属性、使用不可になるステータス異常などを味方キャラ1人目の技関連アドレス$7E:E900~にコピーする処理($C1/F89B$C1/F8C7)は、最終編オルステッド主人公時と同一である。
(ちなみに、$C1/F89B$C1/F8C7の前に行われる$C1/E978$C1/E9FCは、$7E:E900~の値を予め$00で埋め、最後にひとつ前の技を登録する処理であり、上処理の最後の部分にあたる)
これでブリキ大王の技4種が味方キャラ1の技として登録されたことになる。

ただ、最終編オルステッド主人公時はその直後に、敵種類1のデータをオルステッドのシナリオ別キャラデータへ上書きする$C1/F8C8$C1/F955の処理があった。
ブリキ大王戦の場合は、もちろんこのサブルーチンは通らない。

さて、ここまでで戦闘中の味方キャラ1のデータ$7E:1C00$7E:1C3Fの中に、初期状態で必要な値はそれなりに入った。
だが、敵番号1のデータ($00:1B??)内にある、ブリキ大王の座標・向きのコピーがされていない。
その処理が最後に以下のように入る。

$C1/16F4 REP #$20                ;Aを16bit幅に変更、Mフラグをクリア
$C1/16F6 LDA $000C,x[$00:1B0C]   ;Aに[$00:1B0D][$00:1B0C](キャラの位置のX軸(ピクセル単位))をロード
$C1/16F9 STA $0010,y[$00:1C10]   ;Aを[$00:1C11][$00:1C10](キャラの位置のX軸(ピクセル単位))に書き込み
$C1/16FC LDA $000E,x[$00:1B0E]   ;Aに[$00:1B0F][$00:1B0E](キャラの位置のY軸(ピクセル単位))をロード
$C1/16FF STA $0012,y[$00:1C12]   ;Aを[$00:1C13][$00:1C12](キャラの位置のY軸(ピクセル単位))に書き込み
$C1/1702 LDA $000A,x[$00:1B0A]   ;Aに[$00:1B0B][$00:1B0A](キャラ位置のマス目のY/X座標)をロード
$C1/1705 STA $0018,y[$00:1C18]   ;Aを[$00:1C19][$00:1C18](キャラ位置のマス目のY/X座標)に書き込み
$C1/1708 LDA $0028,y[$00:1C28]   ;Aに[$00:1C29][$00:1C28](技の範囲指定~使用中のマス目のY/X座標)をロード
$C1/170B STA $7E9102,x[$7E:AC02] ;Aを[$7E:AC03][$7E:AC02]に書き込み
$C1/170F SEP #$20                ;MフラグON Aレジスタは8bit幅
$C1/1711 LDA $0004,x[$00:1B04]   ;Aに[$00:1B04](向き・上2ビット)をロード
$C1/1714 ROL A                   ;Aをキャリーフラグを含めた9bitで左ローテート
$C1/1715 ROL A                   ;Aをキャリーフラグを含めた9bitで左ローテート
$C1/1716 ROL A                   ;Aをキャリーフラグを含めた9bitで左ローテート
$C1/1717 AND #$03                ;Aと$03で論理積
$C1/1719 STA $001D,y[$00:1C1D]   ;Aを[$00:1C1D](向き)に書き込み
$C1/171C RTS                     ;サブルーチン戻り

最後の向きについてだが、敵番号1のデータ[$00:1B04]に入っている値は、敵パーティデータの向き/初期座標の値のため、味方キャラデータ[$00:1C1D]にコピーする前に左ローテート3回で下2ビットへ移動させ、$03と論理積を取り向きの値だけ取り出している。

これで、戦闘開始時に必要な味方キャラのデータがブリキ大王のステータスとして登録された。
一方でシナリオ別キャラデータのアキラの値($00:0E80$00:0EBF)はそのまま維持されているため、戦闘以外でメニュー画面を開いた時、装備画面などはアキラのステータスが読み込まれて表示されることになる。

アドレスコピー元
$00:1C00$40
$00:1C01$40
$00:1C05$00
$00:1C10$00:1C11$00:1B0C$00:1B0D
$00:1C12$00:1C13$00:1B0E$00:1B0F
$00:1C18$00:1C19$00:1B0A$00:1B0B
$00:1C1D$00:1B04上2ビット
$00:1C1E$00
$00:1C1F$04
$00:1C38$00:0F86
$00:1C39$00
$00:1C30$00:0F90
$00:1C31$00:0F93
$00:1C32$00:0F96
$00:1C33$00:0F99
$00:1C34$00:0F90
$00:1C35$00:0F93
$00:1C36$00:0F96
$00:1C37$00:0F99

以上がブリキ大王戦における味方キャラのデータの仕組みである。
最終編オルステッド主人公時と似た処理ではあるが、アキラはオルステッドのようにシナリオ別キャラデータが上書きされない、という違いがあることがわかる。
また、最終編オルステッド主人公時とは異なり敵キャラばかりの戦闘なので、敵パーティデータに味方キャラの仮位置を入れておいてから戦闘離脱処理をすることがわかる。
このあたりは、功夫編ラストバトルで、味方キャラは主人公と弟子2人だが、主人公のみ戦闘離脱処理をして弟子を残すことと似た処理である。



このページをシェアする

上へ