基礎知識
戦闘関係
前ページまででは、最終編オルステッド主人公時以外の味方との戦闘について説明をした。
ここでは、最終編オルステッド主人公時の戦闘のステータス処理について説明する。
長くなるため2ページに分けている。
最終編でオルステッドを主人公にすると、各シナリオのラストボスを操作して、各シナリオの主人公&味方キャラを倒していくことになる。
つまり各シナリオのラストバトルを逆の立場で再現することになる。
味方キャラが敵側になるという意味では、前ページまでで説明した味方との戦闘と似た仕組みで戦闘が行われるということでもある。
異なるのは、主人公はオルステッドなのだが、戦闘ではラストボスを操作キャラに設定するという点。
もうひとつ、各シナリオの味方キャラのステータスだが、シナリオ別キャラデータ(セーブデータ)に、各シナリオの主人公たちのデータは常に保存されているものの、主人公以外の仲間キャラのデータは、各シナリオプレイ中でしか保存されず、最終編開始時点では中世編より前にプレイしたシナリオの仲間キャラのデータは残っていない、という点である。
これらの処理について説明する。
味方との戦闘の解説をひととおり読んでいただいてから、以下をお読みいただきたい。
処理手順をざっとまとめると、以下のようになる。
$00:1C40~(味方キャラ2人目以降)にコピー$00:1C00~にオルステッド、$00:1C40~に主人公、$00:1C80~に仲間キャラのデータをコピー$7E:E900~に、ラストボス、主人公、仲間キャラの技データをコピー$00:1C00~のオルステッドのデータに、ラストボスのステータスを上書きコピーデータのコピーといっても、後述していくとおり、全てのデータがコピーされるのではないので、各シナリオの主人公キャラのステータスが完全に再現される、ということはない。仕様としては味方との戦闘と似ている。
大雑把には以下のようにデータが入る。
| 味方キャラ番号 | アドレス | 戦闘状態 | 内容 |
|---|---|---|---|
| 1 | $00:1C00~$00:1C3F | $40 | キャラIDはオルステッド($00)で、ステータスはラストボスの値 |
| 2 | $00:1C40~$00:1C7F | $20 | 各シナリオの主人公 ※ブリキ大王は戦闘状態$FF(通常) |
| 3 | $00:1C80~$00:1CBF | $20 | 各シナリオの仲間1 |
| 4 | $00:1CC0~$00:1CFF | $20 | 各シナリオの仲間2 |
| 敵種類 | アドレス | 内容 |
|---|---|---|
| 1 | $00:1A00~$00:1A3F | ラストボス |
| 2 | $00:1A40~$00:1A7F | 敵ID$FF、各シナリオの主人公 |
| 3 | $00:1A80~$00:1ABF | 敵ID$FF、各シナリオの仲間1 |
| 4 | $00:1AC0~$00:1AFF | 敵ID$FF、各シナリオの仲間2 |
| 敵番号 | アドレス | 戦闘状態 | 内容 |
|---|---|---|---|
| 0 | $00:1B00~$00:1B0F, $7E:AA00~ | $20 | ラストボス |
| 1 | $00:1B10~$00:1B1F, $7E:AA10~ | $40 | 各シナリオの主人公 ※ブリキ大王は戦闘状態$FF(通常) |
| 2 | $00:1B20~$00:1B2F, $7E:AA20~ | $40 | 各シナリオの仲間1 |
| 3 | $00:1B30~$00:1B3F, $7E:AA30~ | $40 | 各シナリオの仲間2 |
上表の「戦闘状態」は、「プレイヤーが操作できるキャラか、それともプレイヤーが倒す相手か」の判別用の値である。
戦闘中の味方キャラデータと敵キャラデータの両方で指定される。
通常、味方キャラは味方キャラデータに、敵キャラは敵キャラデータにだけデータが入るが、最終編オルステッドルートは、
「味方キャラを一度味方キャラデータに登録し、敵対キャラとして扱うので、敵キャラデータにも登録する」
「敵キャラ(ラストボス)を一度敵キャラデータに登録し、操作可能キャラとして扱うので、味方キャラデータにも登録する」
という、非常にややこしい戦闘なので、味方キャラとしての「戦闘状態」と、敵キャラとしての「戦闘状態」が逆転して書き込まれることになる。
味方キャラデータの「戦闘状態」は以下の通り。
| 値 | 状態 |
|---|---|
| $00 | 戦闘離脱 |
| $20 | 味方キャラ敵対 |
| $40 | 敵キャラを操作 |
| $FF | 通常 |
オルステッドルートだと、各シナリオのラストボスは$40が指定される。
これは「本来敵キャラだが、プレイヤーが操作可能」の意味である。
各シナリオの主人公や仲間キャラは、「本来味方キャラだが、敵になる」ということで、$20が指定される。
ブリキ大王のみ、敵キャラとして敵データに登録されていることから、隠呼大仏を操作するオルステッドルートにおいては、「本来敵キャラ、かつ敵」であるから、通常を意味する$FFが入る。
(近未来編などでプレイヤーが操作できるブリキ大王の時は$40である。敵キャラを操作している扱いのため)
敵キャラデータの「戦闘状態」は以下の通り。敵番号0~のデータに入る。
| 値 | 状態 |
|---|---|
| $00 | 戦闘離脱 |
| $20 | 敵キャラをプレイヤーが操作 |
| $40 | 味方キャラが敵状態 |
| $80 | 敵総数+1の敵番号 |
| $FF | 通常 |
オルステッドルートだと、各シナリオのラストボスは「敵キャラをプレイヤーが操作」なので$20が入る。
一方、各シナリオの主人公や仲間キャラは、「味方キャラが敵状態」だから$40が入る。
また、ブリキ大王は「敵キャラが敵状態」だから、通常という扱いで$FFが入ることになる。
ちなみに「敵総数+1の敵番号」に入る$80は、敵番号0以降、何体目まで敵がいるのかの目印に$80を入れるようなものなので、ここではあまり気にしなくて構わない。
以上の仕様のため、やや特殊な処理を行うのが原始編である。
戦闘に参加できる味方キャラは最大4キャラだが、オルステッドルートではラストボスを味方キャラ1人目として扱うので、味方キャラの枠は残り3キャラ分。
原始編のラストバトルは、ポゴ・ゴリ・べる・ざき対おーでぃーおーであったが、最終編だとおーでぃーおー対ポゴたちであり、おーでぃーおーを味方キャラとして扱うと、ポゴ・ゴリ・べる・ざき全員を味方キャラとして扱えなくなってしまう。
ということで、味方キャラ1人目におーでぃーおー、2人目以降にポゴ・ゴリ・べるとして、味方側の誰かが戦闘離脱した時に、ざきと入れ替えるという手段を取っている。
各シナリオのラストバトルで登場した、ラストボス以外の敵(SF編のスタビライザーや、西部編のクレイジーバンチの部下たち)が、最終編の戦闘には登場しないのも同じ理由である。味方キャラとして登録できる枠が4キャラ分しかないので、登場させられないのである。
各シナリオの主人公以外の味方キャラ、つまり仲間キャラは、上で少し述べたが、該当キャラのデータを新たに計算し直し、一度シナリオ別キャラデータに入れるという処理を行う。
シナリオ別キャラデータの仲間キャラのデータは、該当シナリオをプレイしている間しか保存されない。
下の表で言えば、ID$08・$09・$0Aに登録されるキャラたちである。
例えば原始編のゴリなら、原始編プレイ中はレベルやステータスなどが、シナリオ別キャラデータID$08のキャラとして保存されるのだが、原始編をクリアして西部編をプレイし始めると、西部編のシナリオ別キャラデータID$08のキャラであるマッドドッグのデータに上書きされてなくなってしまう。
最終的には、7つのシナリオをプレイ後に出現する中世編をプレイするため、ストレイボウ・ウラヌス・ハッシュのデータに上書きされて、7つのシナリオのどのキャラのデータも消えてしまう、ということになる。
功夫編については伝承者になった弟子のデータが心山拳師範のデータとしてID$03に入るので、該当の弟子のデータだけは残ることになる。
| ID | アドレス | 原始 | SF | 功夫 | 西部 | 現代 | 近未来 | 幕末 | 中世 | 最終 |
|---|---|---|---|---|---|---|---|---|---|---|
| $00 | $00:0D00~ | - | - | - | - | - | - | - | オルステッド | オルステッド |
| $01 | $00:0D40~ | ポゴ | - | - | - | - | - | - | - | ポゴ |
| $02 | $00:0D80~ | - | キャプテン スクウェア /キューブ | - | - | - | - | - | - | キューブ |
| $03 | $00:0DC0~ | - | - | 心山拳老師 | - | - | - | - | - | 心山拳師範 |
| $04 | $00:0E00~ | - | - | - | サンダウン | - | - | - | - | サンダウン |
| $05 | $00:0E40~ | - | - | - | - | 高原 日勝 | - | - | - | 高原 日勝 |
| $06 | $00:0E80~ | - | - | - | - | - | アキラ | - | - | アキラ |
| $07 | $00:0EC0~ | - | - | - | - | - | - | おぼろ丸 | - | おぼろ丸 |
| $08 | $00:0F00~ | ゴリ | - | ユン・ジョウ | マッドドッグ | - | タロイモ | とらわれの男 | ストレイボウ | - |
| $09 | $00:0F40~ | べる | - | レイ・クウゴ | - | - | 無法松 | カラクリ丸 | ウラヌス | - |
| $0A | $00:0F80~ | ざき | - | サモ・ハッカ | - | - | ブリキ大王 | - | ハッシュ | ブリキ大王 |
オルステッドルートでもうひとつ重要なのが、味方キャラデータ44にあたる「最終編追加レベル」である。
オルステッドルートで再計算して仲間キャラのデータを作り直す時、初期レベルに「最終編追加レベル」を足したレベルのキャラのデータを作成して、シナリオ別キャラデータに登録するのである。
最終編追加レベル一覧を掲載するが、0以外の値が入っている場合は文字色を赤くしている。
| キャラ名 | ID | 味方キャラデータ44 最終編追加レベル |
|---|---|---|
| オルステッド | $00 | $00 |
| ストレイボウ | $01 | $00 |
| ウラヌス | $02 | $00 |
| ハッシュ | $03 | $00 |
| ポゴ | $04 | $00 |
| ゴリ | $05 | $04 |
| べる | $06 | $06 |
| ざき | $07 | $00 |
| 心山拳老師 | $08 | $00 |
| ユン・ジョウ | $09 | $00 |
| レイ・クウゴ | $0A | $00 |
| サモ・ハッカ | $0B | $00 |
| サンダウン | $0C | $00 |
| マッドドッグ | $0D | $00 |
| おぼろ丸 | $0E | $00 |
| とらわれの男 | $0F | $02 |
| 高原 日勝 | $10 | $00 |
| アキラ | $11 | $00 |
| タロイモ | $12 | $05 |
| 無法松 | $13 | $02 |
| キューブ | $14 | $00 |
| キャプテンスクウェア | $15 | $00 |
| カラクリ丸 | $16 | $00 |
上の通り、ほとんどのキャラの最終編追加レベルは$00である。
$00以外が設定されているのは、ゴリ、べる、とらわれの男、タロイモ、無法松の5キャラのみである。
その上、近未来編ラストバトルにタロイモと無法松は加わらないため、実質意味があるのはゴリ、べる、とらわれの男の3キャラということになる。
| キャラ名 | ID | 味方キャラデータ44 最終編追加レベル | 初期レベル | 最終編レベル |
|---|---|---|---|---|
| ゴリ | $05 | $04 | $04 | $08 |
| べる | $06 | $06 | $01 | $07 |
| とらわれの男 | $0F | $02 | $09 | $11 |
実際の処理としては、味方キャラデータ($D5:00C0~$D5:04CA)から、初期レベルのキャラのステータスや装備、習得技などを取り出して、シナリオ別キャラデータに書き込む。
その上で、ゴリ、べる、とらわれの男のように、最終編追加レベルが$00ではないキャラは、追加レベル分、レベルアップ処理をして、ステータスを加算し、習得技も更新する。
味方との戦闘における、中世編ラストバトルで、ストレイボウが離脱時レベル16未満だったら、レベル16までレベルアップ処理をするのと同じ方法が使われている。
隠呼大仏戦においても、近未来編のキャラであるタロイモと無法松のレベルアップ処理も行われてシナリオ別キャラデータに書き込まれている。ロボットなのでレベルアップしないはずのタロイモだが、レベルは$0A、つまり10進数の10に上がっている。
だが、ブリキ大王での戦闘になるため、近未来編のキャラのステータスはアキラも含めて結局使われないままとなってしまう。
ステータス上昇は乱数計算されるので、ゴリ、べる、とらわれの男のステータスは多少ブレがある、ということになる。
また、ゴリとべるはレベル上昇に伴い技も習得するため、べるなら使用技は「ぽかぽか」「てーてー」「ふれふれー」「るーるー」になる。
ゴリならレベル8までの習得技4種、「ンガ」「ウホ」「ウキッ」「ウキぷぅ」である。
なお、味方との戦闘と同じく、味方キャラは「敵データID$FFのキューブのデータを敵種類データに書き込んでから、各キャラのステータスを上書きしていく」という方法で敵データをセットしていくため、ブリキ大王を除いて、
が、全キャラ共通となっている。
ブリキ大王は自身の敵キャラデータがそのまま入る。
ここからは主に、味方との戦闘と異なる部分について説明する。
まず、オルステッドが主人公であるにも関わらず、戦闘中はラストボスのステータスを主人公として扱うための処理を紹介していく。
ここでは例として、おーでぃーおー戦の処理を紹介する。
オルステッドのシナリオ別キャラデータは、$00:0D00~$00:0D3Fに入っており、キャラIDは$00である。
おーでぃーおーの敵データが格納されているアドレスは$D5:0B8B~$D5:0BAA。
おーでぃーおー戦の敵パーティデータは$D6:5090~$D6:5099。
なお、各シナリオのラストボス戦の敵パーティデータのみ、最後の1バイトにシナリオIDが入る仕様になっている。
また、主人公(操作キャラ)のステータスは、
| 内容 | アドレス |
|---|---|
| 味方キャラ番号1 | $00:1C00~$00:1C3F |
| 敵種類1 | $00:1A00~$00:1A3F |
| 敵番号0 | $00:1B00~$00:1B0F, $7E:AA00~ |
に、入っていく。
;サイズ書き込み $C1/670C LDX $9A [$00:039A] ;Xに[$00:039A]をロード $C1/670E LDA $10 [$00:0310] ;Aに[$00:0310]をロード $C1/6710 STA $0002,x[$00:1A02] ;Aを[$00:1A02]に書き込み $C1/6713 LDA $11 [$00:0311] ;Aに[$00:0311]をロード $C1/6715 STA $0003,x[$00:1A03] ;Aを[$00:1A03]に書き込み $C1/6718 LDA $20 [$00:0320] ;Aに[$00:0320]をロード $C1/671A STA $0004,x[$00:1A04] ;Aを[$00:1A04]に書き込み $C1/671D LDA $21 [$00:0321] ;Aに[$00:0321]をロード $C1/671F STA $0005,x[$00:1A05] ;Aを[$00:1A05]に書き込み $C1/6722 LDY #$3000 ;Yに$3000をロード $C1/6725 JSR $6665 [$C1:6665] ;[$C1:6665]へジャンプ
敵種類1のサイズは、[$00:1A04]に横の幅、[$00:1A05]に縦の幅が入るが、この戦闘においてはおーでぃーおーの値が入る。
上では[$00:1A04]に03、[$00:1A05]に04を入れる処理だけ紹介したが、実際にはこの前に、[$D5:FAE3](=$5C)をロードして、以下のように計算をしている。
| 敵種類1アドレス | 元アドレス | 計算値 |
|---|---|---|
[$00:1A02] | [$00:0310] | $5C & $38 /2 = $0C |
[$00:1A03] | [$00:0311] | $5C & $07 *2 + $5C & $07 = $0C |
[$00:1A04] | [$00:0320] | $5C & $38 /2/2/2 = $03 |
[$00:1A05] | [$00:0321] | $5C & $07 = $04 |
つまり[$D5:FAE3]に入っている値の上3~5ビットが横幅、上6~8ビットが縦幅になっている。
$D5:F9??~D5:FA??あたりに敵のサイズなどのデータが入っているようだが未確認のため、ここでは説明は飛ばす。
[$00:1A02]~[$00:1A05]はオルステッド関係の値は入らず、おーでぃーおーの敵データが入ったことになる。
;シナリオID分岐 $C1/EDB3 LDA $0A00 [$00:0A00] ;Aに[$00:0A00]をロード $C1/EDB6 CMP #$08 ;Aと$08(最終編)を減算比較(ステータスレジスタ変更のみ) $C1/EDB8 BCS $03 [$EDBD] ;キャリーフラグが立っているとき[$EDBD]分岐 ;最終編分岐 $C1/EDBD LDA $0A10 [$00:0A10] ;Aに[$00:0A10](最終編主人公ID=オルステッド=$00)をロード $C1/EDC0 STA $1C04 [$00:1C04] ;A(=$00)を[$00:1C04]に書き込み $C1/EDC3 JSR $EC59 [$C1:EC59] ;[$C1:EC59]へジャンプ ; $C1/EC59 JSR $EB02 [$C1:EB02] ;[$C1:EB02]へジャンプ ; $C1/EB02 REP #$21 ;Aを16bit幅に変更、キャリーフラグクリア $C1/EB04 AND #$000F ;Aと$000Fで論理積 $C1/EB07 ASL A ;Aを算術左シフト *2 $C1/EB08 ASL A ;Aを算術左シフト *2 $C1/EB09 ADC $D60040[$D6:0040] ;A + [$D6:0040] $C1/EB0D TAX ;Aレジスタの値をXレジスタに転送 $C1/EB0E SEP #$20 ;MフラグON Aレジスタは8bit幅 $C1/EB10 RTS ;サブルーチン戻り ; $C1/EC5C LDA $D60000,x[$D6:512F] ;Aに[$D6:512F](主人公のキャラID・オルステッド=$00)をロード $C1/EC60 CMP #$15 ;Aと$15を減算比較(ステータスレジスタ変更のみ) $C1/EC62 BEQ $09 [$EC6D] ;ゼロフラグが立っているとき[$EC6D]分岐 $C1/EC64 CMP #$08 ;Aと$08を減算比較(ステータスレジスタ変更のみ) $C1/EC66 BEQ $01 [$EC69] ;ゼロフラグが立っているとき[$EC69]分岐 $C1/EC68 RTS ;サブルーチン戻り ; $C1/EDC6 LDA $0A10 [$00:0A10] ;Aに[$00:0A10](最終編主人公ID=$00)をロード $C1/EDC9 JSR $EC4B [$C1:EC4B] ;[$C1:EC4B]へジャンプ
このあたりの処理は、味方との戦闘でも共通。
最終編分岐を通り、戦闘中の味方キャラデータの[$00:1C04]にオルステッドのID$00が入る。
$C1/EDCC LDA $0000,y[$00:0D00] ;Aに[$00:0D00](シナリオ別キャラデータ オルステッドID)をロード $C1/EDCF STA $1C00 [$00:1C00] ;Aを[$00:1C00]に書き込み $C1/EDD2 STY $1C02 [$00:1C02] ;Yを[$00:1C02]に書き込み $C1/EDD5 LDA #$FF ;Aに$FFをロード $C1/EDD7 STA $1C01 [$00:1C01] ;Aを[$00:1C01]に書き込み $C1/EDDA LDA $0A10 [$00:0A10] ;Aに[$00:0A10](最終編主人公)をロード $C1/EDDD BNE $0C [$EDEB] ;ゼロフラグが立っていないとき[$EDEB]分岐 ; ;最終編オルステッドルートではゼロフラグが立つ $C1/EDDF LDA $0A14 [$00:0A14] ;Aに[$00:0A14](仲間の人数=00)をロード $C1/EDE2 PHA ;Aをスタックにプッシュ $C1/EDE3 JSR $EC91 [$C1:EC91] ;[$C1:EC91]へジャンプ
更に、味方キャラデータのキャラIDが入るアドレス[$00:1C00]にも$00が入る。
ここから先が、味方との戦闘との分岐である。
[$00:0A10]に入っている最終編主人公IDが$00、つまりオルステッドなら、$C1/EDDDでゼロフラグが立つため、分岐先の[$EDEB]に飛ばない。
よってこの先の$C1/EDDF~がオルステッドルート用処理になる。
$C1/EDDFでは[$00:0A14]、つまり仲間キャラの人数をロードするが、オルステッドルートだと戦闘において主人公(操作するラストボス)ひとりだけであるから、仲間の人数は$00である。
$C1/EC91 JSR $ED50 [$C1:ED50] ;[$C1:ED50]へジャンプ ; $C1/ED50 REP #$20 ;Aを16bit幅に変更、Mフラグをクリア $C1/ED52 LDA $0040 [$00:0040] ;Aに[$00:0040]をロード $C1/ED55 AND #$00FF ;Aと$00FFで論理積 $C1/ED58 ASL A ;Aを算術左シフト *2 $C1/ED59 ADC $D60020[$D6:0020] ;A + [$D6:0020] $C1/ED5D TAX ;Aレジスタの値をXレジスタに転送 $C1/ED5E LDA $D60000,x[$D6:4264] ;Aに[$D6:4264]をロード $C1/ED62 STA $52 [$00:0352] ;Aを[$00:0352]に書き込み $C1/ED64 TAX ;Aレジスタの値をXレジスタに転送 $C1/ED65 LDA $D60006,x[$D6:5096] ;Aに[$D6:5096](おーでぃーおー戦 敵パーティデータ06)をロード $C1/ED69 AND #$000F ;Aと$000Fで論理積 $C1/ED6C ASL A ;Aを算術左シフト *2 $C1/ED6D ADC $52 [$00:0352] ;A + [$00:0352] $C1/ED6F STA $52 [$00:0352] ;Aを[$00:0352]に書き込み $C1/ED71 TAX ;Aレジスタの値をXレジスタに転送 $C1/ED72 SEP #$20 ;MフラグON Aレジスタは8bit幅 $C1/ED74 LDA $D60007,x[$D6:5099] ;Aに[$D6:5099]をロード $C1/ED78 JSR $EB02 [$C1:EB02] ;[$C1:EB02]へジャンプ
$C1/ED65で読み込まれる[$D6:5096]は、おーでぃーおー戦の敵パーティデータ06である。
敵パーティデータ06は、上位8ビットにアイテム入手率補正、下位8ビットに敵の総数が格納されている。
そして、敵パーティデータ07以降は、出現する敵番号ごとに敵IDと向き/初期座標を2バイトで格納している。
更に、各シナリオのラストボス戦では、最後にシナリオIDを1バイトで追加している(他の敵パーティにはない)。
つまり、上で敵パーティデータ06と$000Fで論理積を取ることで敵の総数を取り出し、これを算術左シフトで2倍した値を、敵パーティデータ06のアドレス[$D6:5096]に加算することで、
「各シナリオのラストボス戦の敵パーティデータの最後に入っている、シナリオIDの値1バイト」
のアドレスを読み取れることになる。
そのアドレスが$C1/ED74の[$D6:5099]で、おーでぃーおー戦の場合は、原始編に対応した「$01」が入っている。
ここでシナリオIDを獲得したことで、対戦することになる味方キャラのデータの獲得が開始になるのである。
$C1/EB02 REP #$21 ;Aを16bit幅に変更、キャリーフラグクリア $C1/EB04 AND #$000F ;Aと$000Fで論理積 $C1/EB07 ASL A ;Aを算術左シフト *2 $C1/EB08 ASL A ;Aを算術左シフト *2 $C1/EB09 ADC $D60040[$D6:0040] ;A + [$D6:0040] $C1/EB0D TAX ;Aレジスタの値をXレジスタに転送 $C1/EB0E SEP #$20 ;MフラグON Aレジスタは8bit幅 $C1/EB10 RTS ;サブルーチン戻り ; $C1/ED7B LDA $D60001,x[$D6:5134] ;Aに[$D6:5134]をロード $C1/ED7F STA $1D [$00:031D] ;Aを[$00:031D]に書き込み $C1/ED81 LDA $D60002,x[$D6:5135] ;Aに[$D6:5135]をロード $C1/ED85 STA $1E [$00:031E] ;Aを[$00:031E]に書き込み $C1/ED87 LDA $D60003,x[$D6:5136] ;Aに[$D6:5136]をロード $C1/ED8B STA $1F [$00:031F] ;Aを[$00:031F]に書き込み $C1/ED8D LDY #$0F00 ;Yに$0F00をロード $C1/ED90 LDA $1D [$00:031D] ;Aに[$00:031D]をロード $C1/ED92 STA $1C40 [$00:1C40] ;Aを[$00:1C40]に書き込み $C1/ED95 JSR $F02C [$C1:F02C] ;[$C1:F02C]へジャンプ
$C1/ED7B以降は、味方パーティIDリスト$D6:512F~$D6:514Fから、原始編の仲間1・仲間2・仲間3のIDが入っている、[$D6:5134]~[$D6:5136]を[$00:031D]~[$00:031F]にロードしている。
原始編の場合、順にゴリ($05)・べる($06)・ざき($07)である。
更に、[$00:031D]に書き込んだゴリ($05)の値が[$00:1C40]に書き込まれる。
これは戦闘中の味方キャラデータ2人目の開始アドレスにあたる。
だが、実際の戦闘では、味方キャラ1人目がおーでぃーおー、2人目がポゴ、3人目がゴリ、4人目がべる、という順になるはずだ。
これはステータス計算のために一時的に入る値になる。
$C1/F02C STA $1B [$00:031B] ;A(ゴリのID$05)を[$00:031B]に書き込み $C1/F02E JSR $F040 [$C1:F040] ;[$C1:F040]へジャンプ ; $C1/F040 CMP #$FF ;Aと$FFを減算比較(ステータスレジスタ変更のみ) $C1/F042 BNE $01 [$F045] ;ゼロフラグが立っていないとき[$F045]分岐 $C1/F045 LDA $1B [$00:031B] ;Aに[$00:031B](ゴリのID$05)をロード $C1/F047 STA $0000,y[$00:0F00] ;Aを[$00:0F00](シナリオ別キャラデータID$08)に書き込み $C1/F04A LDA #$00 ;Aに$00をロード $C1/F04C STA $0001,y[$00:0F01] ;Aを[$00:0F01]に書き込み $C1/F04F STA $000C,y[$00:0F0C] ;Aを[$00:0F0C](前に出した技)に書き込み $C1/F052 STA $000F,y[$00:0F0F] ;Aを[$00:0F0F]に書き込み $C1/F055 STA $001E,y[$00:0F1E] ;Aを[$00:0F1E](経験値)に書き込み $C1/F058 STA $0007,y[$00:0F07] ;Aを[$00:0F07]に書き込み $C1/F05B TYX ;Yレジスタの値をXレジスタに転送 $C1/F05C JSR $EC25 [$C1:EC25] ;[$C1:EC25]へジャンプ
ゴリのID$05は、[$00:031B]→[$00:0F00]と書き込まれる。
[$00:0F00]は、シナリオ別キャラデータIDの$08開始アドレスにあたる。
つまり、原始編において、ゴリのステータスが格納されていたアドレス$00:0F00~$00:0F3Fの最初、キャラIDが格納されていたアドレスに、再びゴリのID$05が入ったことになる。
その後、$00:0F00~$00:0F3Fの一部アドレスに$00を書き込んでいる。
この後、$00:0F00~$00:0F3Fに、ゴリの初期ステータスや装備を書き込む処理が行われる。
初期ステータスなので、ゴリの初期レベル5のステータスが入る。
長くなるので処理の内容のみざっと紹介する。
なお、このあたりの処理は、SF編ラストバトルでのみキャプテンスクウェアからキューブに主人公データが上書きされて変更される時と同じサブルーチンなので、詳細はSF編・主人公データ切り替えで紹介している。参照していただきたい。
| サブルーチンアドレス | 内容 |
|---|---|
$C1/EC25~$C1/EC4A | アドレス計算 |
$C1/F05F~$C1/F091 | [$00:0F0A][$00:0F0B](最大HP 2バイト)[$00:0F08][$00:0F09](現在HP 2バイト)[$00:0F0D](覚えた技(下位バイト))を書き込み |
$C1/F094~$C1/F0ED | [$00:0F10]~[$00:0F19]に力・速・体・知を装備上昇分込で書き込み[$00:0F06]にレベル[$00:0F1C]に側面補正[$00:0F1D]に背後補正[$00:0F21][$00:0F22]に回避属性を書き込み |
$C1/F0F0~$C1/F103 | ループ処理で頭・右・左・体・足・アクセサリ1から5を[$00:0F24]~[$00:0F2D]に書き込み |
$C1/F107~$C1/F137 | [$00:0F30]に無効状態異常書き込み |
$C1/F13A~$C1/F22B | ループ処理で装備アイテムのステータス増加分を[$00:0F10]~[$00:0F19]に加算する処理(装備なしの箇所はループスキップ) |
$C1/F277~$C1/F2B1 | キャラ名を[$00:0F34]~[$00:0F3F]に書き込み |
この処理は各シナリオ開始時にも行われている、味方キャラのステータス初期値のセットになるが、最終編オルステッドルートでは、各戦闘でもう一度、この処理を行っているということになる。
更に、先に説明した通り、おーでぃーおー戦ならゴリとべるは最終編追加レベル分をステータス初期値に加算する処理も入る。
下はゴリについての処理。もちろんべるでも同じサブルーチンが入る。
$C1/ED22 LDX $0004,y[$00:0F04] ;Xに[$00:0F04]をロード $C1/ED25 LDA $D5002C,x[$D5:01CD] ;Aに[$D5:01CD](ゴリ キャラデータ32 最終編追加レベル=$04)をロード $C1/ED29 BEQ $24 [$ED4F] ;ゼロフラグが立っているとき[$ED4F]分岐 $C1/ED2B STA $60 [$00:0360] ;A($04)を[$00:0360]に書き込み $C1/ED2D LDA $0000,y[$00:0F00] ;Aに[$00:0F00](キャラID ゴリ=$05)をロード $C1/ED30 CMP #$20 ;Aと$20を減算比較(ステータスレジスタ変更のみ) $C1/ED32 BCS $1B [$ED4F] ;キャリーフラグが立っているとき[$ED4F]分岐 $C1/ED34 LDA $0006,y[$00:0F06] ;Aに[$00:0F06](シナリオ別キャラデータ レベル)をロード $C1/ED37 INC A ;Aをインクリメント +1 $C1/ED38 STA $0006,y[$00:0F06] ;Aを[$00:0F06](レベル+1)に書き込み $C1/ED3B LDA $0070 [$00:0070] ;Aに[$00:0070]をロード $C1/ED3E PHA ;Aをスタックにプッシュ $C1/ED3F LDA #$01 ;Aに$01をロード $C1/ED41 STA $0070 [$00:0070] ;Aを[$00:0070]に書き込み $C1/ED44 JSR $2448 [$C1:2448] ;[$C1:2448]へジャンプ ; $C1/2448 LDX $0004,y[$00:0F04] ;Xに[$00:0F04]をロード $C1/244B LDA $50 [$00:0350] ;Aに[$00:0350]をロード $C1/244D CMP #$A9 ;Aと$A9を減算比較(ステータスレジスタ変更のみ) $C1/244F BNE $08 [$2459] ;ゼロフラグが立っていないとき[$2459]分岐 $C1/2459 LDA $D5001B,x[$D5:01BC] ;Aに[$D5:01BC]をロード $C1/245D JSR $1A09 [$C1:1A09] ;[$C1:1A09]へジャンプ ; $C1/1A09 STA $10 [$00:0310] ;Aを[$00:0310]に書き込み ;(以下レベルアップ時のステータス処理)
$C1/2448~は、中世編ラストバトルにおける、ストレイボウのレベルを16まで引き上げるサブルーチンと同一になる。
ゴリの場合は、初期レベル4から、最終編追加レベル4を加えたレベル8までレベルアップ処理を行う。
ステータス上昇値は乱数によるブレの計算も行う。
そしてべる・ざきと順に計算して、元からシナリオ別キャラデータ$00:0D40~に入っていたポゴのデータを含め、この戦闘に登場する敵対側の味方キャラのデータがシナリオ別キャラデータに入ることになる。
オルステッドルート用・おーでぃーおー戦時に必要なシナリオ別キャラデータは以下で、ゴリ・べる・ざきについては戦闘開始時に新たに計算し直したことになる。
他のボスの戦闘でも、該当シナリオの仲間キャラについて、同様の処理が行われる。
| ID | アドレス | 名前 | 状況 |
|---|---|---|---|
| $01 | $00:0D40~ | ポゴ | 原始編クリア時ステータス |
| $08 | $00:0F00~ | ゴリ | 初期レベル4 + 最終編追加レベル4 = レベル8 |
| $09 | $00:0F40~ | べる | 初期レベル1 + 最終編追加レベル6 = レベル7 |
| $0A | $00:0F80~ | ざき | 初期レベル4 + 最終編追加レベル0 = レベル4 |
$C1/ECFB LDA $0000,y[$00:0D40] ;Aに[$00:0D40](シナリオ別キャラデータ ポゴのデータ開始位置)ロード $C1/ECFE STA $0000,x[$00:1C40] ;A(ポゴのキャラID$04)を[$00:1C40]に書き込み $C1/ED01 LDA #$FF ;Aに$FFをロード $C1/ED03 STA $0001,x[$00:1C41] ;A($FF)を[$00:1C41]に書き込み $C1/ED06 REP #$21 ;Aを16bit幅に変更、キャリーフラグクリア $C1/ED08 TYA ;Yレジスタの値をAレジスタに転送 $C1/ED09 STA $0002,x[$00:1C42] ;Aを[$00:1C42]に書き込み $C1/ED0C SEP #$20 ;MフラグON Aレジスタは8bit幅 $C1/ED0E RTS ;サブルーチン戻り ; $C1/ECAB STZ $1C81 [$00:1C81] ;[$00:1C81]に$00を書き込み $C1/ECAE STZ $1CC1 [$00:1CC1] ;[$00:1CC1]に$00を書き込み $C1/ECB1 PLA ;Aレジスタに値をプル ;Aにプルされた値は対戦時のシナリオID(おーでぃーおー戦は$01) ;戦闘による味方人数などの分岐 $C1/ECB2 CMP #$00 ;Aと$00を減算比較(ステータスレジスタ変更のみ) $C1/ECB4 BEQ $04 [$ECBA] ;ゼロフラグが立っているとき[$ECBA]分岐 $C1/ECB6 CMP #$08 ;Aと$08を減算比較(ステータスレジスタ変更のみ) $C1/ECB8 BCC $08 [$ECC2] ;キャリーフラグが立っていないとき[$ECC2]分岐 $C1/ECC2 CMP #$02 ;Aと$02を減算比較(ステータスレジスタ変更のみ) $C1/ECC4 BEQ $26 [$ECEC] ;ゼロフラグが立っているとき[$ECEC]分岐 $C1/ECC6 CMP #$03 ;Aと$03を減算比較(ステータスレジスタ変更のみ) $C1/ECC8 BEQ $22 [$ECEC] ;ゼロフラグが立っているとき[$ECEC]分岐 $C1/ECCA CMP #$05 ;Aと$05を減算比較(ステータスレジスタ変更のみ) $C1/ECCC BEQ $1E [$ECEC] ;ゼロフラグが立っているとき[$ECEC]分岐 $C1/ECCE CMP #$06 ;Aと$06を減算比較(ステータスレジスタ変更のみ) $C1/ECD0 BEQ $1B [$ECED] ;ゼロフラグが立っているとき[$ECED]分岐 $C1/ECD2 CMP #$04 ;Aと$04を減算比較(ステータスレジスタ変更のみ) $C1/ECD4 BEQ $0D [$ECE3] ;ゼロフラグが立っているとき[$ECE3]分岐 $C1/ECD6 CMP #$07 ;Aと$07を減算比較(ステータスレジスタ変更のみ) $C1/ECD8 BEQ $09 [$ECE3] ;ゼロフラグが立っているとき[$ECE3]分岐 $C1/ECDA LDY #$0F40 ;Yに$0F40をロード $C1/ECDD LDX #$1CC0 ;Xに$1CC0をロード $C1/ECE0 JSR $ECFB [$C1:ECFB] ;[$C1:ECFB]へジャンプ ; $C1/ECFB LDA $0000,y[$00:0F40] ;Aに[$00:0F40](シナリオ別キャラデータ べる)をロード $C1/ECFE STA $0000,x[$00:1CC0] ;A($06)を[$00:1CC0](味方キャラ番号4)に書き込み $C1/ED01 LDA #$FF ;Aに$FFをロード $C1/ED03 STA $0001,x[$00:1CC1] ;Aを[$00:1CC1]に書き込み $C1/ED06 REP #$21 ;Aを16bit幅に変更、キャリーフラグクリア $C1/ED08 TYA ;Yレジスタの値をAレジスタに転送 $C1/ED09 STA $0002,x[$00:1CC2] ;Aを[$00:1CC2]に書き込み $C1/ED0C SEP #$20 ;MフラグON Aレジスタは8bit幅 $C1/ED0E RTS ;サブルーチン戻り ; $C1/ECE3 LDY #$0F00 ;Yに$0F00をロード $C1/ECE6 LDX #$1C80 ;Xに$1C80をロード $C1/ECE9 JSR $ECFB [$C1:ECFB] ;[$C1:ECFB]へジャンプ ; $C1/ECFB LDA $0000,y[$00:0F00] ;Aに[$00:0F00](シナリオ別キャラデータ ゴリ)をロード $C1/ECFE STA $0000,x[$00:1C80] ;A($05)を[$00:1C80](味方キャラ番号3)に書き込み $C1/ED01 LDA #$FF ;Aに$FFをロード $C1/ED03 STA $0001,x[$00:1C81] ;Aを[$00:1C81]に書き込み $C1/ED06 REP #$21 ;Aを16bit幅に変更、キャリーフラグクリア $C1/ED08 TYA ;Yレジスタの値をAレジスタに転送 $C1/ED09 STA $0002,x[$00:1C82] ;Aを[$00:1C82]に書き込み $C1/ED0C SEP #$20 ;MフラグON Aレジスタは8bit幅 $C1/ED0E RTS ;サブルーチン戻り
ひととおりシナリオ別キャラデータが完成したところで、上のように処理が行われた結果、戦闘中の味方キャラデータの味方キャラ2~4にあたるアドレスに、ポゴ・ゴリ・べるのIDが入る。
$C1/ECB2~からシナリオID(シナリオ別キャラデータID)で仲間キャラのアドレス位置を指定しているので、オルステッドルートの誰の戦闘かにより分岐があるが、結局は以下のように$00:1C40~に対戦する味方キャラのキャラIDを入れる処理である。
| 味方キャラ | アドレス | キャラID | キャラ |
|---|---|---|---|
| 味方キャラ2 | $00:1C40 | $04 | ポゴ |
| 味方キャラ3 | $00:1C80 | $05 | ゴリ |
| 味方キャラ4 | $00:1CC0 | $06 | べる |
また、それぞれを+1したアドレス$00:1C41, $00:1C81, $00:1CC1に$FFが入る。
このアドレスは戦闘状態の値が入り、$FFだと通常を意味するが、この戦闘の場合最終的には$20(味方キャラ敵対)に上書きされる。
味方キャラ1の$00:1C00には、オルステッドのキャラID$00が入ったままである。
ともあれ、原始編なら主人公のポゴのIDが$00:1C00に入っていたところが、全キャラ$40ずつアドレスがズレて入ったことになる。
原始編においては、4人目の味方キャラであるざきの値が入らない状態で戦闘開始になることがわかる。
この後に敵パーティデータから、各キャラの初期位置(座標)も書き込まれるが省略。
次におーでぃーおーのデータの処理が開始される。
$C1/F66A LDA $1C00 [$00:1C00] ;Aに[$00:1C00](オルステッドのID=$00)をロード $C1/F66D BEQ $20 [$F68F] ;ゼロフラグが立っているとき[$F68F]分岐 $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](敵種類1開始アドレス+1)に$00を書き込み $C1/F698 STZ $1A41 [$00:1A41] ;[$00:1A41](敵種類2開始アドレス+1)に$00を書き込み $C1/F69B STZ $1A81 [$00:1A81] ;[$00:1A81](敵種類3開始アドレス+1)に$00を書き込み $C1/F69E STZ $1AC1 [$00:1AC1] ;[$00:1AC1](敵種類4開始アドレス+1)に$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/FB62 LDA $0040 [$00:0040] ;Aに[$00:0040]をロード $C1/FB65 CMP #$04 ;Aと$04を減算比較(ステータスレジスタ変更のみ) $C1/FB67 BNE $0F [$FB78] ;ゼロフラグが立っていないとき[$FB78]分岐 $C1/FB78 LDA $D60007,x[$D6:5097] ;Aに[$D6:5097](敵パーティデータ07 敵ID(0) = おーでぃーおー $36)をロード $C1/FB7C STA $10 [$00:0310] ;A($36)を[$00:0310]に書き込み $C1/FB7E LDY #$1A00 ;Yに$1A00をロード $C1/FB81 LDA $0001,y[$00:1A01] ;Aに[$00:1A01]($00)をロード $C1/FB84 BEQ $23 [$FBA9] ;ゼロフラグが立っているとき[$FBA9]分岐 $C1/FBA9 LDA $10 [$00:0310] ;Aに[$00:0310]($36)をロード $C1/FBAB STA $0000,y[$00:1A00] ;Aを[$00:1A00](敵種類1 敵ID)に書き込み $C1/FBAE LDA #$FF ;Aに#$FFをロード $C1/FBB0 STA $0001,y[$00:1A01] ;Aを[$00:1A01]に書き込み $C1/FBB3 LDA #$00 ;Aに$00をロード $C1/FBB5 STA $000A,y[$00:1A0A] ;Aを[$00:1A0A]に書き込み $C1/FBB8 JSR $FC0A [$C1:FC0A] ;[$C1:FC0A]へジャンプ
ここから、敵種類1~4にデータを入れていく。
$C1/FB78で敵パーティデータ07をロードしているが、敵パーティデータの07以降は2バイトずつ、出現する敵の敵ID+向き/初期座標が入っている。
おーでぃーおー戦では敵として登録されているのはおーでぃーおーだけなので、敵パーティデータ07におーでぃーおーの敵IDである$36が入っている。
これが敵種類1の敵IDとして、[$00:1A00]に入る。
$C1/FC0A PHX ;Xをスタックにプッシュ $C1/FC0B PHY ;Yをスタックへプッシュ $C1/FC0C LDA $0000,y[$00:1A00] ;Aに[$00:1A00]をロード $C1/FC0F STA $211B [$00:211B] ;Aを[$00:211B]に書き込み $C1/FC12 LDA #$00 ;Aに$00をロード $C1/FC14 STA $211B [$00:211B] ;Aを[$00:211B]に書き込み $C1/FC17 LDA #$20 ;Aにをロード $C1/FC19 STA $211C [$00:211C] ;Aを[$00:211C]に書き込み $C1/FC1C STA $211C [$00:211C] ;Aを[$00:211C]に書き込み $C1/FC1F REP #$21 ;Aを16bit幅に変更、キャリーフラグクリア $C1/FC21 LDA $2134 [$00:2134] ;Aに[$00:2134]をロード $C1/FC24 ADC $D50010[$D5:0010] ;A + [$D5:0010] $C1/FC28 TAX ;Aレジスタの値をXレジスタに転送 $C1/FC29 SEP #$20 ;MフラグON Aレジスタは8bit幅 $C1/FC2B LDA #$20 ;Aに$20をロード $C1/FC2D STA $09 [$00:0309] ;Aを[$00:0309]に書き込み ; ;おーでぃーおーの敵キャラデータ$D5:0B8B~$D5:0BAA($20バイト分)を ;$00:1A20~$00:1A3Fにコピーするループ処理 $C1/FC2F LDA $D50000,x[$D5:0B8B] ;Aに[$D5:0B8B]をロード おーでぃーおー 敵データ開始位置 $C1/FC33 INX ;Xをインクリメント +1 $C1/FC34 STA $0020,y[$00:1A20] ;Aを[$00:1A20]に書き込み $C1/FC37 INY ;Yをインクリメント +1 $C1/FC38 DEC $09 [$00:0309] ;[$00:0309]をデクリメント -1 $C1/FC3A BNE $F3 [$FC2F] ;ゼロフラグが立っていないとき[$FC2F]分岐 ;ループ処理ここまで ; $C1/FC3C PLY ;Yレジスタにスタックからプル $C1/FC3D PLX ;Xレジスタにスタックからプル $C1/FC3E RTS ;サブルーチン戻り
上のループ処理で、おーでぃーおーの敵キャラデータ$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が存在しないため書き込み) |
敵種類1のアドレス$00:1A00~$00:1A3F、敵番号0のアドレス$00:1B00~, $7E:AA00~に、おーでぃーおーのステータス関係の値が入っていることがわかる。
この時点では、$00:1B01の戦闘状態は$FF、通常が設定される。
最終的には敵操作状態$40が入る。
また、$00:1B11に$80を書き込むのは通常、敵番号0は存在しているが敵番号1はいない、という場合であるが、実際にはこの戦闘には敵番号0~3まで敵がいるという扱いなので、これも仮の値で、この後に値が上書きされる。
ここまでなら原始編ラストバトルと同じ処理である。
今回は敵種類2、敵種類3、敵種類4及び、敵番号1~3にポゴ・ゴリ・べるが入るので、処理が続く。
おーでぃーおーの場合、おーでぃーおーの敵キャラデータ$D5:0B8B~$D5:0BAAを$00:1A20~$00:1A3Fに入れたが、味方キャラの場合、味方との戦闘でも紹介した通りに、最終編における味方との戦闘では、どのキャラであっても敵キャラデータをID$FFから取得する。
該当の処理が以下である。
$C1/F9CA LDA $0A00 [$00:0A00] ;Aに[$00:0A00]をロード $C1/F9CD CMP #$08 ;Aと$08を減算比較(ステータスレジスタ変更のみ) $C1/F9CF BNE $04 [$F9D5] ;ゼロフラグが立っていないとき[$F9D5]分岐 $C1/F9D1 LDA #$FF ;Aに$FFをロード $C1/F9D3 BRA $06 [$F9DB] ;フラグにかかわりなく常に分岐[$F9DB] $C1/F9DB STA $10 [$00:0310] ;Aを[$00:0310]($FF)に書き込み $C1/F9DD PHX ;Xをスタックにプッシュ $C1/F9DE JSR $FB81 [$C1:FB81] ;[$C1:FB81]へジャンプ (中略) $C1/FBA9 LDA $10 [$00:0310] ;Aに[$00:0310]をロード $C1/FBAB STA $0000,y[$00:1A40] ;Aを[$00:1A40](敵種類2 ID $FF)に書き込み $C1/FBAE LDA #$FF ;Aに$FFをロード $C1/FBB0 STA $0001,y[$00:1A41] ;Aを[$00:1A41]に書き込み $C1/FBB3 LDA #$00 ;Aに$00をロード $C1/FBB5 STA $000A,y[$00:1A4A] ;Aを[$00:1A4A]に書き込み $C1/FBB8 JSR $FC0A [$C1:FC0A] ;[$C1:FC0A]へジャンプ
上がポゴの分の処理になるが、[$00:0A00]、つまりシナリオIDが最終編$08なら、$FFを[$00:1A40](敵種類2の敵データID)に書き込んでいる。
この処理がこの後、ゴリとべるの分も続くので、敵キャラデータID$FF(キューブ)の敵キャラデータ$D5:24AB~$D5:24CA($20バイト分)が、$00:1A60~, $00:1AA0~, $00:1AE0~とポゴ・ゴリ・べる共通で入る。
この後の処理もおーでぃーおーと同じで、ポゴなら敵種類2のアドレス$00:1A40~$00:1A7F、敵番号1のアドレス$00:1B10~, $7E:AA10~に、敵キャラデータID$FFの値が仮値として入ることになる。
先に紹介した通り、敵キャラデータID$FFはほとんどの値が$00で埋まっており、無効状態異常だけ$20が入っているため、オルステッドルートで戦う味方キャラも全員、眠り状態のみ無効化されている。
(ブリキ大王にはブリキ大王のID$69が入るため適用外。なお、ブリキ大王は元々、毒・マヒ・眠り・酔・石化耐性がある)
ただし味方キャラ、つまり敵番号1以降だと、ステータスをひととおり書き終えた$C1/FD0F~からの処理が変わる。
以下はポゴの場合の処理。
$C1/F9E1 LDA #$40 ;Aに$40をロード $C1/F9E3 STA $0001,y[$00:1B11] ;Aを[$00:1B11](敵番号1・戦闘状態)に書き込み $C1/F9E6 TYX ;Yレジスタの値をXレジスタに転送 $C1/F9E7 REP #$20 ;Aを16bit幅に変更、Mフラグをクリア $C1/F9E9 LDA $1C [$00:031C] ;Aに[$00:031C]をロード $C1/F9EB STA $7E900E,x[$7E:AB1E] ;Aを[$7E:AB1E]に書き込み $C1/F9EF SEP #$20 ;MフラグON Aレジスタは8bit幅 $C1/F9F1 LDA $23 [$00:0323] ;Aに[$00:0323]をロード $C1/F9F3 STA $000A,x[$00:1B1A] ;Aを[$00:1B1A](マス目のX座標)に書き込み $C1/F9F6 STA $0008,x[$00:1B18] ;Aを[$00:1B18](計算用・マス目のX座標)に書き込み $C1/F9F9 LDA $24 [$00:0324] ;Aに[$00:0324]をロード $C1/F9FB STA $000B,x[$00:1B1B] ;Aを[$00:1B1B](マス目のY座標)に書き込み $C1/F9FE STA $0009,x[$00:1B19] ;Aを[$00:1B19](計算用・マス目のY座標)に書き込み $C1/FA01 LDA $25 [$00:0325] ;Aに[$00:0325]をロード $C1/FA03 STA $000C,x[$00:1B1C] ;Aを[$00:1B1C](キャラの位置のX軸)に書き込み $C1/FA06 STZ $000D,x[$00:1B1D] ;[$00:1B1D]に$00(X軸2バイトの上1桁)を書き込み $C1/FA09 LDA $26 [$00:0326] ;Aに[$00:0326]をロード $C1/FA0B STA $000E,x[$00:1B1E] ;Aを[$00:1B1E](キャラの位置のY軸)に書き込み $C1/FA0E STZ $000F,x[$00:1B1F] ;[$00:1B1F]に$00(Y軸2バイトの上1桁)を書き込み $C1/FA11 LDY $1E [$00:031E] ;Yに[$00:031E]をロード $C1/FA13 LDA #$80 ;Aに$80をロード $C1/FA15 STA $0001,y[$00:1B21] ;Aを[$00:1B21]に書き込み $C1/FA18 PLX ;Xレジスタにスタックからプル $C1/FA19 RTS ;サブルーチン戻り
[$00:1B11]に$40を書き込んでいる。
[$00:1B11]は敵番号1、つまりポゴの戦闘状態で、敵操作状態$40を意味する。
「味方キャラだが敵状態」であるという状態が、ここで入ることになる。
上のサブルーチンは敵番号2のゴリ、敵番号3のべるにしか処理されない。
また、最後に[$00:1B21]に$80を書き込んでいる。
最終的に、敵番号3のべるの処理の時に、[$00:1B41]に$80を書き込むことで、敵番号は0~3まで、という処理が終了することになる。
$C1/F72B BEQ $07 [$F734] ;ゼロフラグが立っているとき[$F734]分岐 $C1/F734 LDA #$20 ;Aに$20をロード $C1/F736 STA $1B01 [$00:1B01] ;Aを[$00:1B01]に書き込み $C1/F739 RTS ;サブルーチン戻り
そして敵番号0の戦闘状態[$00:1B01]だが、ここで$20を入れる処理が入る。
これで敵キャラだが味方扱いという意味になり、敵番号0はプレイヤーが操作する敵キャラで、敵番号1以降は味方キャラだが敵状態、という、最終編オルステッドルート用の戦闘状態がセットされたことになる。
長くなるので、ここでページを変える。
続きは次ページで。