TOP > プログラミング関係解説&調査 > 味方との戦闘 > 最終編オルステッド主人公時(2)

最終編オルステッド主人公時(続き)

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

前ページの続き。
前ページまでで、下の4.までの処理が終わっている。
このページは、5.以降の説明になる。

  1. 操作するラストボスのシナリオに登場する仲間キャラ1~3人目の初期データ+最終編追加レベル分を計算し、該当シナリオのシナリオ別キャラデータを作成
  2. シナリオ別キャラデータの、主人公及び仲間キャラのステータスを、戦闘中の味方キャラデータが入る$00:1C40~(味方キャラ2人目以降)にコピー
  3. 操作するラストボスのデータを、敵種類1及び敵番号0のアドレスにコピー
  4. 敵キャラデータID$FF(味方キャラ用仮値)を、敵種類2以降及び敵番号1以降のアドレスにコピー
  5. シナリオ別キャラデータから、$00:1C00~にオルステッド、$00:1C40~に主人公、$00:1C80~に仲間キャラのデータをコピー
  6. シナリオ別キャラデータから、主人公と仲間キャラのステータス&技を、敵番号1以降と敵種類2以降のアドレスに上書きコピー
  7. 味方キャラ用の技データアドレス$7E:E900~に、ラストボス、主人公、仲間キャラの技データをコピー
  8. $00:1C00~のオルステッドのデータに、ラストボスのステータスを上書きコピー

さて、敵関係のアドレスだが、ここまでではおーでぃーおー自身のデータしか該当アドレスに入っていない。
ポゴ以降は敵キャラデータID$FFが仮値として入ったのみである。
また、味方キャラ関係のアドレス$00:1C??~も、キャラIDが入ったのみである。
しかも$00:1C00はオルステッドのID$00が入ったままで、おーでぃーおーのデータは今のところ何も移動していない。

ということで次なのだが、シナリオ別キャラデータに入っている味方キャラのデータを、$00:1C??~にコピーする処理が行われる。
この処理は味方との戦闘でのサブルーチン$C1/E894$C1/E8C8と共通だがもう一度紹介する。

ここでコピーされるのは、$00:1C00, $00:1C40, $00:1C80, $00:1CC0に既に入っているキャラIDの値に対応したキャラである。
つまり、

シナリオ別
キャラデータ
コピー先
アドレス
オルステッド$00:1C00
ポゴ$00:1C40
ゴリ$00:1C80
べる$00:1CC0

このようになる。
オルステッド自身は戦闘に参加しないが、ここで一度、オルステッドのデータを$00:1C00~に入れる。
その後に、おーでぃーおーのデータで上書きしていくのである。
いわば、オルステッドの値を仮値として入れる作業である。
この時に、「ひとつ前に使った技」のデータが、オルステッドが中世編で最後に使った技IDが入った状態で上書きされず残るため、セレクトバグによるセレクト+Xボタンで出せてしまえるというバグが発生するが、その話はセレクトバグを参照していただきたい。

実際のサブルーチンは以下。

$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($04)を[$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:0D06]   ;Aに[$00:0D06](シナリオ別キャラデータ オルステッド レベル)をロード
$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:0D10], [$00:0D13], [$00:0D13], [$00:0D16], [$00:0D19]をロード
$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                     ;サブルーチン戻り

以上で、シナリオ別キャラデータのオルステッドの値が以下のように入ったことになる。
これらは経験値以外、中世編クリア時のオルステッドのステータスである。

アドレス内容
$00:1C00ID($00)
$00:1C01戦闘状態($FF)
$00:1C05経験値($00)
$00:1C30力(通常値)
$00:1C31速(通常値)
$00:1C32体(通常値)
$00:1C33知(通常値)
$00:1C34力(現在値)
$00:1C35速(現在値)
$00:1C36体(現在値)
$00:1C37知(現在値)
$00:1C38LV(現在値)
$00:1C39状態異常($00)

同じ処理が、ポゴ、ゴリ、べるでも行われる。

その後の処理$C1/FA31$C1/FB2Aも味方との戦闘時と同じなのだが、この処理は「シナリオ別キャラデータの値を敵データに書き込む処理」にあたり、1人目のオルステッドのみ処理がスキップされ、2人目以降、つまりポゴ、ゴリ、べるのみ行われる。
オルステッド自身のデータを敵データに書き込む必要はないし、そもそも既におーでぃーおーの敵キャラデータは$00:1A00~と$7E:AA00~に書き込み済みだからである。
ポゴなら以下のようにデータが入る。

アドレス内容
$7E:AA10敵番号1 現在HP(下1バイト)
$7E:AA11敵番号1 現在HP(上1バイト)
$7E:AA13敵番号1 力(現在値)
$7E:AA14敵番号1 速(現在値)
$7E:AA15敵番号1 体(現在値)
$7E:AA16敵番号1 知(現在値)
$7E:AB10敵番号1 LV(現在値)
$00:1A4B敵種類2 レベル
$00:1A50敵種類2 現在HP(下1バイト)
$00:1A51敵種類2 現在HP(上1バイト)
$00:1A61敵種類2 敵データ01(上4ビット:フィールド吸収/下4ビット:移動頻度)
$00:1A65敵種類2 敵データ05 力
$00:1A66敵種類2 敵データ06 速
$00:1A67敵種類2 敵データ07 体
$00:1A68敵種類2 敵データ08 知

注意するべき点として、ポゴなら$00:1A61にあたる、敵データ01の上4ビットの「フィールド吸収」については、シナリオ別キャラデータ$32のフィールド吸収の値と、敵データ01のフィールド吸収の値の論理和を取る方法で値が入っている。これは味方との戦闘> サブルーチンでも説明しているので参照のこと。
ゴリやべる、ざきは、元の敵データ01がID$FFから取られており、フィールド吸収の値には0が入っている。
更に、シナリオ別キャラデータに入った、初期装備品の中に、フィールド吸収可能な装備がない。
よって最終編オルステッドルートで戦う味方キャラの大半は、フィールド吸収能力を持たない。

だが、各シナリオの主人公たちは、シナリオクリア時の装備のフィールド吸収能力がシナリオ別キャラデータ$32に入っている。
ベースとなる敵データ01の値が何であっても、論理和を取ることで元々の装備のフィールド吸収能力が残ることになる。
よって、幕末編クリア時におぼろ丸が「水神のたび」「げんじのタビ」「コイツぁタマゲタ」のいずれかを装備していると、装備によるフィールド吸収能力が発動する。
「コイツぁタマゲタ」を装備している場合は、ガマヘビ変化が発生させられる毒フィールドも吸収してくるので厄介ということになる。
一方で、とらわれの男は、戦闘開始時にシナリオ別キャラデータに初期装備かつレベル11の状態のステータスを生成したため、幕末編クリア時のとらわれの男の装備は反映されない。つまり装備は右装備の「ヨシユキ」だけなので、フィールド吸収は不可能ということになる。

アキラは近未来編で入手可能な「サンゴのゆびわ」で水フィールドを吸収できるが、最終編オルステッドルートで戦うのはブリキ大王で、近未来編クリア時のアキラのステータスは関わらない。よってブリキ大王にフィールド吸収能力が付くこともない。
幕末編と近未来編と最終編でしか、フィールド吸収能力のある装備が手に入らないので、他シナリオの主人公たちについては装備によるフィールド吸収能力は考慮する必要はない。

敵データ内に、味方キャラの使用技を入れていく処理も味方との戦闘時と共通である。
ポゴの場合は原始編クリア時に覚えていた習得技により、使用技が変動するが(上位で習得する技4種)、それらの技のデータが以下に入ることになる。

アドレス内容
$00:1A52技1の反撃属性1
$00:1A53技2の反撃属性1
$00:1A54技3の反撃属性1
$00:1A55技4の反撃属性1
$00:1A56技1の反撃属性2
$00:1A57技2の反撃属性2
$00:1A58技3の反撃属性2
$00:1A59技4の反撃属性2
$00:1A5A技1が使用不可になるステータス異常
$00:1A5B技2が使用不可になるステータス異常
$00:1A5C技3が使用不可になるステータス異常
$00:1A5D技4が使用不可になるステータス異常
$00:1A6B敵データ11 使用技1 技ID
$00:1A6C敵データ12 使用技2 技ID
$00:1A6D敵データ13 使用技3 技ID
$00:1A6E敵データ14 使用技4 技ID

味方キャラ用アドレスに技をセットする処理も同様に行われる(サブルーチンは$C1/FAC7$C1/FAFE)。
ただし、ざきは原始編だと、1戦目ではレベル4までの習得技から上位4種「ばりききゅーん」「ばりたんく」「ごごんが」「ばりどりーん」を使用、2戦目以降は戦闘開始時に「ばりぶる~ん」を習得する処理が入って使用技が「ばりたんく」「ごごんが」「ばりどりーん」「ばりぶる~ん」に変化する、という仕様があった。
だが最終編オルステッドルート時には、「ばりぶる~ん」習得処理が入らず、1戦目用の技「ばりききゅーん」「ばりたんく」「ごごんが」「ばりどりーん」がセットされる。

味方キャラ1はおーでぃーおーになるが、$7E:E900$7E:E93Fに値を入れる処理は後回しになる。
先に、味方キャラ2以降、つまり$7E:E940~に技IDを入れていく。

味方キャラ番号アドレス
1$7E:E900$7E:E93F
2$7E:E940$7E:E97F
3$7E:E980$7E:E9BF
4$7E:E9C0$7E:E9FF

結果として、以下のアドレスは敵データID$FFの値のままである。

アドレス内容
$00:1A6A敵データ10 無効状態異常
$00:1A7D敵データ29 背後補正/側面補正
$00:1A7E敵データ30 回避属性 8ビットが手足突鋭鈍締飛背に対応
$00:1A7F敵データ31 回避属性 8ビットが火水風土精善悪無に対応

よって、味方キャラはすべて無効状態異常が$20(眠り状態のみ無効)、背後補正/側面補正は$00、回避属性も$00ということになる。

残っているのは、$00:1C00~に書き込まれたオルステッドのデータに、おーでぃーおーのデータを上書きする作業である。
また、味方キャラ番号1の技が入る$7E:E900$7E:E93Fに、おーでぃーおーの技のデータが入っていないので、こちらの処理も必要である。
といっても、$00:1C00のオルステッドのID自体は上書きされない。
該当の処理は以下のようになっている。

$C1/F89B LDX #$1C00              ;Xに$1C00をロード
$C1/F89E LDY #$1A00              ;Yに$1A00をロード
$C1/F8A1 LDA #$04                ;Aに$04をロード
$C1/F8A3 STA $08    [$00:0308]   ;Aを[$00:0308]に書き込み
;
;使用技1ループ処理
$C1/F8A5 LDA $002B,y[$00:1A2B]   ;Aに[$00:1A2B](敵データ11 使用技1)をロード
$C1/F8A8 STA $7ECD00,x[$7E:E900] ;Aを[$7E:E900](味方1 使用技1)に書き込み
$C1/F8AC LDA $0012,y[$00:1A12]   ;Aに[$00:1A12](技1の反撃属性1)をロード
$C1/F8AF STA $7ECD20,x[$7E:E920] ;Aを[$7E:E920](味方1 技1反撃属性1)に書き込み
$C1/F8B3 LDA $0016,y[$00:1A16]   ;Aに[$00:1A16](技1の反撃属性2)をロード
$C1/F8B6 STA $7ECD30,x[$7E:E930] ;Aを[$7E:E930](味方1 技1反撃属性2)に書き込み
$C1/F8BA LDA $001A,y[$00:1A1A]   ;Aに[$00:1A1A](技1が使用不可になるステータス異常)をロード
$C1/F8BD STA $7ECD10,x[$7E:E910] ;Aを[$7E:E910](味方1 技1が使用不可になるステータス異常)に書き込み
$C1/F8C1 INX                     ;Xをインクリメント +1
$C1/F8C2 INY                     ;Yをインクリメント +1
$C1/F8C3 DEC $08    [$00:0308]   ;[$00:0308]をデクリメント -1
$C1/F8C5 BNE $DE    [$F8A5]      ;ゼロフラグが立っていないとき[$F8A5]分岐
;使用技1ループ処理ここまで
;
;使用技2ループ処理
$C1/F8A5 LDA $002B,y[$00:1A2C]   ;Aに[$00:1A2C](敵データ12 使用技2)をロード
$C1/F8A8 STA $7ECD00,x[$7E:E901] ;Aを[$7E:E901](味方1 使用技2)に書き込み
$C1/F8AC LDA $0012,y[$00:1A13]   ;Aに[$00:1A13](技2の反撃属性1)をロード
$C1/F8AF STA $7ECD20,x[$7E:E921] ;Aを[$7E:E921](味方1 技2反撃属性1)に書き込み
$C1/F8B3 LDA $0016,y[$00:1A17]   ;Aに[$00:1A17](技2の反撃属性2)をロード
$C1/F8B6 STA $7ECD30,x[$7E:E931] ;Aを[$7E:E931](味方1 技2反撃属性2)に書き込み
$C1/F8BA LDA $001A,y[$00:1A1B]   ;Aに[$00:1A1B](技2が使用不可になるステータス異常)をロード
$C1/F8BD STA $7ECD10,x[$7E:E911] ;Aを[$7E:E911](味方1 技1が使用不可になるステータス異常)に書き込み
$C1/F8C1 INX                     ;Xをインクリメント +1
$C1/F8C2 INY                     ;Yをインクリメント +1
$C1/F8C3 DEC $08    [$00:0308]   ;[$00:0308]をデクリメント -1
$C1/F8C5 BNE $DE    [$F8A5]      ;ゼロフラグが立っていないとき[$F8A5]分岐
;使用技2ループ処理ここまで
;
;使用技3ループ処理
$C1/F8A5 LDA $002B,y[$00:1A2D]   ;Aに[$00:1A2D](敵データ13 使用技3)をロード
$C1/F8A8 STA $7ECD00,x[$7E:E902] ;Aを[$7E:E902](味方1 使用技3)に書き込み
$C1/F8AC LDA $0012,y[$00:1A14]   ;Aに[$00:1A14](技3の反撃属性1)をロード
$C1/F8AF STA $7ECD20,x[$7E:E922] ;Aを[$7E:E922](味方1 技3反撃属性1)に書き込み
$C1/F8B3 LDA $0016,y[$00:1A18]   ;Aに[$00:1A18](技3の反撃属性2)をロード
$C1/F8B6 STA $7ECD30,x[$7E:E932] ;Aを[$7E:E932](味方1 技3反撃属性2)に書き込み
$C1/F8BA LDA $001A,y[$00:1A1C]   ;Aに[$00:1A1C](技3が使用不可になるステータス異常)をロード
$C1/F8BD STA $7ECD10,x[$7E:E912] ;Aを[$7E:E912](味方1 技3が使用不可になるステータス異常)に書き込み
$C1/F8C1 INX                     ;Xをインクリメント +1
$C1/F8C2 INY                     ;Yをインクリメント +1
$C1/F8C3 DEC $08    [$00:0308]   ;[$00:0308]をデクリメント -1
$C1/F8C5 BNE $DE    [$F8A5]      ;ゼロフラグが立っていないとき[$F8A5]分岐
;使用技3ループ処理ここまで
;
;使用技4ループ処理
$C1/F8A5 LDA $002B,y[$00:1A2E]   ;Aに[$00:1A2E](敵データ14 使用技4)をロード
$C1/F8A8 STA $7ECD00,x[$7E:E903] ;Aを[$7E:E903](味方1 使用技4)に書き込み
$C1/F8AC LDA $0012,y[$00:1A15]   ;Aに[$00:1A15](技4の反撃属性1)をロード
$C1/F8AF STA $7ECD20,x[$7E:E923] ;Aを[$7E:E923](味方1 技4反撃属性1)に書き込み
$C1/F8B3 LDA $0016,y[$00:1A19]   ;Aに[$00:1A19](技4の反撃属性2)をロード
$C1/F8B6 STA $7ECD30,x[$7E:E933] ;Aを[$7E:E933](味方1 技4反撃属性2)に書き込み
$C1/F8BA LDA $001A,y[$00:1A1D]   ;Aに[$00:1A1D](技4が使用不可になるステータス異常)をロード
$C1/F8BD STA $7ECD10,x[$7E:E913] ;Aを[$7E:E913](味方1 技4が使用不可になるステータス異常)に書き込み
$C1/F8C1 INX                     ;Xをインクリメント +1
$C1/F8C2 INY                     ;Yをインクリメント +1
$C1/F8C3 DEC $08    [$00:0308]   ;[$00:0308]をデクリメント -1
$C1/F8C5 BNE $DE    [$F8A5]      ;ゼロフラグが立っていないとき[$F8A5]分岐
;使用技4ループ処理ここまで
;
$C1/F8C7 RTS                     ;サブルーチン戻り
;
$C1/F76F JSR $F8C8  [$C1:F8C8]   ;[$C1:F8C8]へジャンプ
;
$C1/F8C8 LDX #$0D00              ;Xに$0D00をロード
$C1/F8CB LDY #$1A00              ;Yに$1A00をロード
$C1/F8CE REP #$20                ;Aを16bit幅に変更、Mフラグをクリア
$C1/F8D0 LDA $0010,y[$00:1A10]   ;Aに[$00:1A11][$00:1A10](敵種類1のHP2バイト)をロード
$C1/F8D3 STA $0008,x[$00:0D08]   ;Aを[$00:0D09][$00:0D08](シナリオ別キャラデータ オルステッド/現在HP)に書き込み
$C1/F8D6 STA $000A,x[$00:0D0A]   ;Aを[$00:0D0B][$00:0D0A](シナリオ別キャラデータ オルステッド/最大HP)に書き込み
$C1/F8D9 LDA $003E,y[$00:1A3E]   ;Aに[$00:1A3F][$00:1A3E](敵データ30~31 回避属性)をロード
$C1/F8DC STA $0021,x[$00:0D21]   ;Aを[$00:0D22][$00:0D21](シナリオ別キャラデータ オルステッド/回避属性)に書き込み
$C1/F8DF SEP #$20                ;MフラグON Aレジスタは8bit幅
$C1/F8E1 LDA $000B,y[$00:1A0B]   ;Aに[$00:1A0B](敵種類1 レベル)をロード
$C1/F8E4 STA $0006,x[$00:0D06]   ;Aを[$00:0D06](シナリオ別キャラデータ オルステッド/レベル)に書き込み
$C1/F8E7 LDA $0025,y[$00:1A25]   ;Aに[$00:1A25](敵種類1 敵データ05 力)をロード
$C1/F8EA STA $0010,x[$00:0D10]   ;Aを[$00:0D10](シナリオ別キャラデータ オルステッド/力+装備上昇分)に書き込み
$C1/F8ED LDA $0026,y[$00:1A26]   ;Aに[$00:1A26](敵種類1 敵データ06 速)をロード
$C1/F8F0 STA $0013,x[$00:0D13]   ;Aを[$00:0D13](シナリオ別キャラデータ オルステッド/速+装備上昇分)に書き込み
$C1/F8F3 LDA $0027,y[$00:1A27]   ;Aに[$00:1A27](敵種類1 敵データ07 体)をロード
$C1/F8F6 STA $0016,x[$00:0D16]   ;Aを[$00:0D16](シナリオ別キャラデータ オルステッド/体+装備上昇分)に書き込み
$C1/F8F9 LDA $0028,y[$00:1A28]   ;Aに[$00:1A28](敵種類1 敵データ08 知)をロード
$C1/F8FC STA $0019,x[$00:0D19]   ;Aを[$00:0D19](シナリオ別キャラデータ オルステッド/知+装備上昇分)に書き込み
$C1/F8FF LDA $003D,y[$00:1A3D]   ;Aに[$00:1A3D](敵種類1 敵データ29 背後補正/側面補正)をロード
$C1/F902 AND #$0F                ;Aと$0Fで論理積
$C1/F904 STA $001C,x[$00:0D1C]   ;Aを[$00:0D1C](シナリオ別キャラデータ オルステッド/側面補正)に書き込み
$C1/F907 LDA $003D,y[$00:1A3D]   ;Aに[$00:1A3D](敵データ29 背後補正/側面補正)をロード
$C1/F90A LSR A                   ;Aを論理右シフト (/2)
$C1/F90B LSR A                   ;Aを論理右シフト (/2)
$C1/F90C LSR A                   ;Aを論理右シフト (/2)
$C1/F90D LSR A                   ;Aを論理右シフト (/2)
$C1/F90E AND #$0F                ;Aと$0Fで論理積
$C1/F910 STA $001D,x[$00:0D1D]   ;Aを[$00:0D1D](シナリオ別キャラデータ オルステッド/背後補正)に書き込み
$C1/F913 LDA $002A,y[$00:1A2A]   ;Aに[$00:1A2A](敵データ10 無効状態異常)をロード
$C1/F916 STA $0020,x[$00:0D20]   ;Aを[$00:0D20](シナリオ別キャラデータ オルステッド/無効状態異常)に書き込み
$C1/F919 LDA $0021,y[$00:1A21]   ;Aに[$00:1A21](敵データ01 上4ビット:フィールド吸収/下4ビット:移動頻度)をロード
$C1/F91C LSR A                   ;Aを論理右シフト (/2)
$C1/F91D LSR A                   ;Aを論理右シフト (/2)
$C1/F91E LSR A                   ;Aを論理右シフト (/2)
$C1/F91F LSR A                   ;Aを論理右シフト (/2)
$C1/F920 AND #$0F                ;Aと$0Fで論理積
$C1/F922 STA $0031,x[$00:0D31]   ;Aを[$00:0D31](シナリオ別キャラデータ オルステッド/フィールド吸収)に書き込み
$C1/F925 LDY #$1C00              ;Yに$1C00をロード
$C1/F928 LDA $0010,x[$00:0D10]   ;Aに[$00:0D10](=[$00:1A25] おーでぃーおー 力の値)をロード
$C1/F92B STA $0030,y[$00:1C30]   ;Aを[$00:1C30](味方キャラ1 力(通常値))に書き込み
$C1/F92E STA $0034,y[$00:1C34]   ;Aを[$00:1C34](味方キャラ1 力(現在値))に書き込み
$C1/F931 LDA $0013,x[$00:0D13]   ;Aに[$00:0D13](=[$00:1A26] おーでぃーおー 速の値)をロード
$C1/F934 STA $0031,y[$00:1C31]   ;Aを[$00:1C31](味方キャラ1 速(通常値))に書き込み
$C1/F937 STA $0035,y[$00:1C35]   ;Aを[$00:1C35](味方キャラ1 速(現在値))に書き込み
$C1/F93A LDA $0016,x[$00:0D16]   ;Aに[$00:0D16](=[$00:1A27] おーでぃーおー 体の値)をロード
$C1/F93D STA $0032,y[$00:1C32]   ;Aを[$00:1C32](味方キャラ1 体(通常値))に書き込み
$C1/F940 STA $0036,y[$00:1C36]   ;Aを[$00:1C36](味方キャラ1 体(現在値))に書き込み
$C1/F943 LDA $0019,x[$00:0D19]   ;Aに[$00:0D19](=[$00:1A28] おーでぃーおー 知の値)をロード
$C1/F946 STA $0033,y[$00:1C33]   ;Aを[$00:1C33](味方キャラ1 知(通常値))に書き込み
$C1/F949 STA $0037,y[$00:1C37]   ;Aを[$00:1C37](味方キャラ1 知(現在値))に書き込み
$C1/F94C LDA $0006,x[$00:0D06]   ;Aに[$00:0D06](=[$00:1A0B](敵種類1 レベル))をロード
$C1/F94F STA $0038,y[$00:1C38]   ;Aを[$00:1C38](味方キャラ1 LV(現在値))に書き込み
$C1/F952 LDX #$1C00              ;Xに$1C00をロード
$C1/F955 JSR $E8C9  [$C1:E8C9]   ;[$C1:E8C9]へジャンプ
;
$C1/E8C9 LDY $0002,x[$00:1C02]   ;Yに[$00:1C02]をロード
$C1/E8CC REP #$21                ;Aを16bit幅に変更、キャリーフラグクリア
$C1/E8CE LDA $000A,y[$00:0D0A]   ;Aに[$00:0D0A]をロード
$C1/E8D1 STA $0008,y[$00:0D08]   ;Aを[$00:0D08]に書き込み
$C1/E8D4 STA $4204  [$00:4204]   ;Aを[$00:4204]に書き込み
$C1/E8D7 SEP #$20                ;MフラグON Aレジスタは8bit幅
$C1/E8D9 JSR $CE0B  [$C1:CE0B]   ;[$C1:CE0B]へジャンプ

大まかに言えば、[$00:1A??]に既に書き込まれていた、敵種類1(おーでぃーおー)の技関係データは味方1の技関係データアドレス[$7E:E9??]にコピー、ステータスはシナリオ別キャラデータ$00:1A01~のオルステッドのデータに一部コピーされてから、更に[$00:1C01]~の味方キャラ1のアドレスにコピーされている。
具体的には以下の通り。

元アドレスコピー先アドレス
[$00:1A2B]
(敵データ11 使用技1)
[$7E:E900]
(味方1 使用技1)
[$00:1A2C]
(敵データ12 使用技2)
[$7E:E901]
(味方1 使用技2)
[$00:1A2D]
(敵データ13 使用技3)
[$7E:E902]
(味方1 使用技3)
[$00:1A2E]
(敵データ14 使用技4)
[$7E:E903]
(味方1 使用技4)
[$00:1A12]
(技1の反撃属性1)
[$7E:E920]
(味方1 技1反撃属性1)
[$00:1A13]
(技2の反撃属性1)
[$7E:E921]
(味方1 技2反撃属性1)
[$00:1A14]
(技3の反撃属性1)
[$7E:E922]
(味方1 技3反撃属性1)
[$00:1A15]
(技4の反撃属性1)
[$7E:E923]
(味方1 技4反撃属性1)
[$00:1A16]
(技1の反撃属性2)
[$7E:E930]
(味方1 技1反撃属性2)
[$00:1A17]
(技2の反撃属性2)
[$7E:E931]
(味方1 技2反撃属性2)
[$00:1A18]
(技3の反撃属性2)
[$7E:E932]
(味方1 技3反撃属性2)
[$00:1A19]
(技4の反撃属性2)
[$7E:E933]
(味方1 技4反撃属性2)
[$00:1A1A]
(技1が使用不可になる状態異常)
[$7E:E910]
(味方1 技1が使用不可になる状態異常)
[$00:1A1B]
(技2が使用不可になる状態異常)
[$7E:E911]
(味方1 技1が使用不可になる状態異常)
[$00:1A1C]
(技3が使用不可になる状態異常)
[$7E:E912]
(味方1 技3が使用不可になる状態異常)
[$00:1A1D]
(技4が使用不可になる状態異常)
[$7E:E913]
(味方1 技4が使用不可になる状態異常)
[$00:1A11][$00:1A10]
(敵種類1のHP 2バイト)
[$00:0D09][$00:0D08]
(シナリオ別キャラデータ オルステッド/現在HP)
[$00:0D0B][$00:0D0A]
(シナリオ別キャラデータ オルステッド/最大HP)
[$00:1A3F][$00:1A3E]
(敵データ30~31 回避属性)
[$00:0D22][$00:0D21]
(シナリオ別キャラデータ オルステッド/回避属性)
[$00:1A2A]
(敵データ10 無効状態異常)
[$00:0D20]
(シナリオ別キャラデータ オルステッド/無効状態異常)
[$00:1A21]
(敵データ01 上4ビット:フィールド吸収)
[$00:0D31]
(シナリオ別キャラデータ オルステッド/フィールド吸収)
[$00:1A3D]
(敵種類1 敵データ29 背後補正/側面補正)
[$00:0D1C]
(シナリオ別キャラデータ オルステッド/側面補正)
[$00:0D1D]
(シナリオ別キャラデータ オルステッド/背後補正)
元アドレスコピー先アドレス1コピー先アドレス2
[$00:1A0B]
(敵種類1 レベル)
[$00:0D06]
(シナリオ別キャラデータ オルステッド/レベル)
[$00:1C38]
(味方キャラ1 LV(現在値))
[$00:1A25]
(敵種類1 敵データ05 力)
[$00:0D10]
(シナリオ別キャラデータ オルステッド/力+装備上昇分)
[$00:1C30]
(味方キャラ1 力(通常値))
[$00:1C34]
(味方キャラ1 力(現在値))
[$00:1A26]
(敵種類1 敵データ06 速)
[$00:0D13]
(シナリオ別キャラデータ オルステッド/速+装備上昇分)
[$00:1C31]
(味方キャラ1 速(通常値))
[$00:1C35]
(味方キャラ1 速(現在値))
[$00:1A27]
(敵種類1 敵データ07 体)
[$00:0D16]
(シナリオ別キャラデータ オルステッド/体+装備上昇分)
[$00:1C32]
(味方キャラ1 体(通常値))
[$00:1C36
(味方キャラ1 体(現在値))
[$00:1A28]
(敵種類1 敵データ08 知)
[$00:0D19]
(シナリオ別キャラデータ オルステッド/知+装備上昇分)
[$00:1C33]
(味方キャラ1 知(通常値))
[$00:1C37]
(味方キャラ1 知(現在値))

$7E:E900~への使用技関係のコピーは、戦闘中のみ有効だが、オルステッドのシナリオ別キャラデータ$00:0D00$00:0D3Fに一度上書きした上で$00:1C00~へコピーされた値については、シナリオ別キャラデータ$00:0D00$00:0D3Fの値が戦闘終了後もそのまま残ってしまう。
戦闘終了後、メニュー画面を開いてオルステッドの装備画面からステータスを確認すると、シナリオ別キャラデータからステータスを計算して値が入るため、レベルとHPは直前のラストボスの値がそのまま表示されることになってしまう。
ただし力・速・体・知は、「ステータス+装備上昇分」のアドレスに上書きされたのみで、素のステータスと装備には影響がない。
よってメニュー画面では、オルステッドのデータをそのまま表示することになる。

一方、オルステッドのシナリオ別キャラデータの中で、ボスのデータに上書きされなかったのは以下の値になる。

アドレス内容
$00:0D00キャラID
$00:0D0Cひとつ前に出した技ID
$00:0D0D$00:0D0E覚えた技2バイト
$00:0D11
$00:0D14
$00:0D17
$00:0D1A
$00:0D1E経験値
$00:0D24$00:0D2E装備品
$00:0D34$00:0D3Fキャラクター名

キャラIDを上書きしてしまうと、メニュー画面のみならず、フィールドで表示されるキャラクターのグラフィックなどの問題も生じると思われるため、オルステッドのIDが残されている。
他の値も、メニュー画面でのオルステッドのステータス表示に不具合が生じないように残したのであろうということが推測できる。
ただしレベルとHPだけは、ラストボスの値が残ってしまう。
そして$00:0D0Cの「ひとつ前に出した技」も残る結果、セレクトバグで、中世編にてオルステッドが最後に出した技をボスに無理やり使わせることができる。ただし技IDを敵技IDで読み込むので、オルステッドの使用技(すべて味方技ID)がそのまま使えるのではない。

戦闘終了時には、$00:0D0Cの「ひとつ前に出した技」だけは戦闘中の技IDで上書きされる。
おーでぃーおー戦なら、おーでぃーおーが最後に出した技IDが書き込まれて戦闘終了し、次のボス戦に移る。
そして、次のボス戦では「ひとつ前に出した技」におーでぃーおーが最後に使った技IDが残るため、「ひとつ前の戦闘でボスが出した技」をセレクトバグで強引に出すことができてしまう、ということになる。

これで、最終編オルステッドルートにおける戦闘開始時のステータス配置は終了である。
おまけとして、おーでぃーおー戦における、「ポゴ・ゴリ・べるの中で誰かが戦闘不能になるとざきと入れ替わりになる」処理を簡単に説明しておく。
戦闘開始時には存在しないざきだが、ざきのシナリオ別キャラデータ自体は、戦闘開始時に$00:0F80~に入ることになるのは既に説明した通りである。
ここでは仮に、ゴリが倒されて、ざきが戦闘に入る場合の処理を紹介する。
ゴリの戦闘中味方キャラデータは$00:1C80~に入っている。

$C1/C1C9 PLX                     ;Xレジスタにスタックからプル(X:1B20)
$C1/C1CA JSR $6F7C  [$C1:6F7C]   ;[$C1:6F7C]へジャンプ

$C1/6F7C STX $60    [$00:0360]   ;X(1B20/※HPが0になった敵番号アドレス)を[$00:0360]に書き込み
$C1/6F7E JSR $FD76  [$C1:FD76]   ;[$C1:FD76]へジャンプ

$C1/FD76 LDA $0A00  [$00:0A00]   ;Aに[$00:0A00](シナリオID)をロード
$C1/FD79 CMP #$08                ;Aと$08を減算比較(ステータスレジスタ変更のみ)
$C1/FD7B BNE $03    [$FD80]      ;ゼロフラグが立っていないとき[$FD80]分岐
$C1/FD7D LDA $0A10  [$00:0A10]   ;Aに[$00:0A10](最終編主人公)をロード
$C1/FD80 RTS                     ;サブルーチン戻り
;
$C1/6F81 BNE $64    [$6FE7]      ;ゼロフラグが立っていないとき[$6FE7]分岐
$C1/6F83 LDA $50    [$00:0350]   ;Aに[$00:0350](※おーでぃーおー戦 F2)をロード
$C1/6F85 CMP #$F2                ;Aと$F2を減算比較(ステータスレジスタ変更のみ)
$C1/6F87 BNE $5E    [$6FE7]      ;ゼロフラグが立っていないとき[$6FE7]分岐
$C1/6F89 LDA #$07                ;Aに$07(ざきのキャラID)をロード
$C1/6F8B CMP $1C40  [$00:1C40]   ;Aと[$00:1C40](味方2人目・ポゴのID)を減算比較(ステータスレジスタ変更のみ)
$C1/6F8E BEQ $57    [$6FE7]      ;ゼロフラグが立っているとき[$6FE7]分岐
$C1/6F90 CMP $1C80  [$00:1C80]   ;Aと[$00:1C80](味方3人目・ゴリのID)を減算比較(ステータスレジスタ変更のみ)
$C1/6F93 BEQ $52    [$6FE7]      ;ゼロフラグが立っているとき[$6FE7]分岐
$C1/6F95 CMP $1CC0  [$00:1CC0]   ;Aと[$00:1CC0](味方4人目・べるのID)を減算比較(ステータスレジスタ変更のみ)
$C1/6F98 BEQ $4D    [$6FE7]      ;ゼロフラグが立っているとき[$6FE7]分岐
$C1/6F9A LDX $60    [$00:0360]   ;Xに[$00:0360](1B20)をロード
$C1/6F9C LDA #$40                ;Aに$40をロード
$C1/6F9E STA $0001,x[$00:1B21]   ;Aを[$00:1B21](敵番号2 戦闘状態)に書き込み
$C1/6FA1 REP #$20                ;Aを16bit幅に変更、Mフラグをクリア
$C1/6FA3 LDA $7E900E,x[$7E:AB2E] ;Aに[$7E:AB2E]をロード
$C1/6FA7 TAX                     ;Aレジスタの値をXレジスタに転送
$C1/6FA8 LDA #$0F80              ;Aに$0F80をロード
$C1/6FAB STA $0002,x[$00:1C82]   ;Aを[$00:1C82]に書き込み
$C1/6FAE SEP #$20                ;MフラグON Aレジスタは8bit幅
$C1/6FB0 LDA #$07                ;Aに$07(ざきのキャラID)をロード
$C1/6FB2 STA $0000,x[$00:1C80]   ;Aを[$00:1C80](味方キャラ3人目ID)に書き込み
$C1/6FB5 LDA #$20                ;Aに$20をロード
$C1/6FB7 STA $0001,x[$00:1C81]   ;A($20)を[$00:1C81](味方キャラ3人目戦闘状態)に書き込み
$C1/6FBA JSR $E88B  [$C1:E88B]   ;[$C1:E88B]へジャンプ

上処理は「味方キャラ2~4人目の中で誰かが戦闘不能になった時、2~4人目がざきではない(キャラIDが$07ではない)なら、ざきのデータに上書き」という処理の開始部分になる。最終編オルステッドルートのおーでぃーおー戦専用処理になる。
この後にざきのステータスなどのデータが上書きされることになるが、キャラの座標はそのままなので、ゴリが戦闘不能になったマスにざきが登場するということになる。



このページをシェアする

上へ