基礎知識
戦闘関係
本作には、味方キャラを相手に戦闘を行う場面が何度かある。
(ここで言う味方キャラは、味方キャラとして登録されている23キャラ+ブリキ大王の全24キャラとする)
この場合、敵対する味方キャラのステータスはどのように設定されるのかを紹介する。
敵対する味方キャラに関しては、世界の合言葉は森部様にも記載がある。
以下引用(原文ママ)。
■味方キャラが敵として出てくる場合
武器や防具の性能は0。側面背面補正0で回避とかもなし。
異常耐性は最終編で戦う人は眠耐性のみが付いてるかも。
移動パターンもマッドやストレイボウは特殊。
敵データの下の方のが影響していると思う。カラクリ丸はころころムシの側面背面補正と回避となっているようだ。
装備品の能力値変化は残る。
マッド1戦目は能力値変化が反映されてないけど、(これは味方も同じ)
仲間にいるときに装備画面を開くと能力値が反映されるので、
マッド2戦目では速が上がって被ダメが落ちている。
(ちなみに装備品の能力値が反映されるのは、装備画面を開いた時とLVアップの時)最後のストレイボウ戦は、ストレイボウのLVが16未満の場合16まで引き上げられる。
技もちゃんと覚える。
このLVアップでも装備品の能力値は反映される。ざき戦は、1戦目はLV通りの技構成だけど、
2戦目・3戦目・共闘ではLVそのままでばりぶる~んを覚えている。
敵の場合はばりききゅーんがなくなり、後方攻撃・後方反撃がなくなるかわりに、
前方反撃が追加されることになるので注意。
以上でほぼ説明できているので、以下では使用技について、実際の処理などについて説明していく。
味方キャラとの戦闘は以下のとおり。
選択肢で避けられる戦闘なども含む。
セレクトバグの解説でも紹介したが、ブリキ大王のように元々、敵キャラとしてデータが登録されている場合、そのまま敵側データとして使用できる。
だが、味方キャラの場合は問題が起こる。
例えば、敵は最大4種類しか使用技を設定できないが、味方キャラは最大16種類の技を所持している。
すべての技を使用することはできないが、どのようにして使用技を選んでセットしているのか?
また、敵は装備品が装備できず、攻撃や防御の値自体が存在しないが、味方側のステータスはどのようにセットしているのか?
更に、最終編では、セーブデータで持ち越せるのが各シナリオの主人公たちのステータスだけで、他の仲間キャラのステータスはデータに残っていない。
では、最終編でオルステッドを主人公にした時、敵対する仲間キャラたちのデータはどう計算されるのか?
といったあたりを、順に紹介していく。
最終編オルステッド主人公時は操作キャラ自体がラストボスという、一番特殊なパターンになるため、まずはそれ以外の味方キャラ対味方キャラの戦闘について解説する。
その後に別ページで最終編オルステッド主人公時についても解説しているので参照していただきたい。
今回の説明で必要となるデータ関係のアドレスを紹介しておく。
味方キャラとの戦闘かどうかは、敵パーティデータに格納された数値で判別できる。
敵パーティデータは、敵の総数により容量が変動するが、1パーティにつき9~37バイト分のデータが格納されている。
2バイト目、つまり敵パーティデータ01には共通して、操作側と敵側が味方ID扱いか、敵ID扱いかを判別する数値が入っている。
敵パーティデータ01に入る値は以下のようになっている。
| 値 | 内容 |
|---|---|
| $00 | 味方キャラ 対 敵キャラ(通常) |
| $01 | 敵キャラ 対 敵キャラ(ブリキ大王戦など) |
| $10 | 原始編 ざき1戦目 |
| $20 | カラクリ丸戦 |
| $40 | 味方1キャラ 対 味方1キャラ(功夫編修行など) |
今回は敵パーティデータ01に$10, $20, $40が入っている戦闘が対象ということになる。
世界の合言葉は森部様の敵パーティデータで、「元データ(16進)」にチェックを入れてから全パーティを見てみると、「1」の列に入っている値が敵パーティデータ01になっている。
敵パーティデータ01に$10, $20, $40が入っている敵パーティは、IDで言えば$AB, $AC, $CB, $CC, $CDと5種のみである。
この5種類の敵パーティは敵が誰なのかなどが記されていないが、実際には以下のようになっている。
アドレス位置は、該当の敵パーティデータの敵パーティデータ01の位置で、戦闘ではバンク$D6から読み込まれるため、バンクは$D6にしてある(実際には他バンクにもミラーリングがある)。
| ID | アドレス位置 | データ01 | 敵PtLV | 内容 |
|---|---|---|---|---|
| $AB | $D6:4D38 | $40 | 0 | 功夫編 修行以外 原始編 ざき2・3戦目 中世編 ストレイボウ1・2戦目 西部編 マッドドッグ1戦目 最終編 仲間にする時の戦闘 オルステッド戦(NEVER END) |
| $AC | $D6:4D3F | $40 | 8 | 功夫編 修行 |
| $CB | $D6:4EC3 | $40 | 0 | 西部編 マッドドッグ2戦目 |
| $CC | $D6:4ECA | $20 | 0 | 幕末編 カラクリ丸戦(初回時・ネズミ激突時) |
| $CD | $D6:4ED1 | $10 | 0 | 原始編 ざき1戦目 |
味方1キャラ対味方1キャラにおける、敵パーティの基本はID$ABである。
それ以外の4パターンだが、ID$ACは功夫編修行専用である。敵パーティレベルが8に設定されていて、修行戦闘時に弟子に経験値が入るようになっている。他の戦闘では敵パーティレベルが0に設定されているため、仲間との戦闘で経験値が得られない。
ID$CBは西部編のマッドドッグ2戦目のみ。マッドドッグ1戦目は$ABであり、違いは「逃げる」が可能かどうかのみである。ID$CB以外の味方との戦闘は「逃げる」コマンドの実行が不可能になっている。
ID$CCは幕末編のカラクリ丸戦のみで、仲間にする時も、ネズミに激突して再戦になる時も同じ。この戦闘はとらわれの男がいる場合といない場合があり、ID$ABなどとの違いは戦闘における操作キャラが2体以上になるかどうかである。
ID$CDは原始編のざき1戦目のみ。これもカラクリ丸戦と同じく、操作キャラが2体以上の戦闘であり、配置自体はカラクリ丸戦とほぼ同一である。
ただし仲間キャラの配置順が異なる。
シナリオ別キャラデータには、主人公以外の仲間キャラ(最大3キャラ)が各シナリオ毎に記録される。IDだと$08・$09・$0Aにあたるが、原始編だと順にゴリ・べる・ざき、幕末編だととらわれの男・カラクリ丸である。
敵パーティID$CCだと、仲間キャラIDの$09にあたるキャラが敵として左上に配置される。
敵パーティID$CDだと、仲間キャラIDの$0Aにあたるキャラが敵として左上に配置される。
この違いがあるために、カラクリ丸用とざき1戦目用で、別の敵パーティIDが用意されている。
シナリオ別キャラデータ$00:0D00~$00:0FBFに入っている各シナリオのキャラ用データ(1キャラあたり64バイト)や、ROM部分に入っている味方キャラデータ($D5:00C0~$D5:04CA)から、戦闘用の値が以下に読み込まれる。
シナリオ別キャラデータのデータは、戦闘終了時に更新される。
| 味方キャラ番号 | アドレス |
|---|---|
| 1 | $00:1C00~$00:1C3F |
| 2 | $00:1C40~$00:1C7F |
| 3 | $00:1C80~$00:1CBF |
| 4 | $00:1CC0~$00:1CFF |
戦闘では味方キャラが最大4キャラまで登場するが、最大4キャラ分のデータ領域が各64バイト分、$00:1C00~に入る。
たとえば味方キャラ1と味方キャラ2の戦闘という場合(功夫編修行や、最終編でのおぼろ丸らとの戦闘など)、操作する味方キャラ1のデータは$00:1C00~に入るが、敵として戦う味方キャラ2のデータも$00:1C40~に入るようになっている。
| 敵種類 | アドレス |
|---|---|
| 1 | $00:1A00~$00:1A3F |
| 2 | $00:1A40~$00:1A7F |
| 3 | $00:1A80~$00:1ABF |
| 4 | $00:1AC0~$00:1AFF |
| 敵番号 | アドレス |
|---|---|
| 0 | $7E:1B00~$7E:1B0F, $7E:AA00~$7E:AA0F, $7E:AB00~ |
| 1 | $7E:1B10~$7E:1B1F, $7E:AA10~$7E:AA1F, $7E:AB10~ |
| 2 | $7E:1B20~$7E:1B2F, $7E:AA20~$7E:AA2F, $7E:AB20~ |
| 3 | $7E:1B30~$7E:1B3F, $7E:AA30~$7E:AA3F, $7E:AB30~ |
| 4 | $7E:1B40~$7E:1B4F, $7E:AA40~$7E:AA4F, $7E:AB40~ |
| 5 | $7E:1B50~$7E:1B5F, $7E:AA50~$7E:AA5F, $7E:AB50~ |
| 6 | $7E:1B60~$7E:1B6F, $7E:AA60~$7E:AA6F, $7E:AB60~ |
| 7 | $7E:1B70~$7E:1B7F, $7E:AA70~$7E:AA7F, $7E:AB70~ |
| 8 | $7E:1B80~$7E:1B8F, $7E:AA80~$7E:AA8F, $7E:AB80~ |
| 9 | $7E:1B90~$7E:1B9F, $7E:AA90~$7E:AA9F, $7E:AB90~ |
| A | $7E:1BA0~$7E:1BAF, $7E:AAA0~$7E:AAAF, $7E:ABA0~ |
| B | $7E:1BB0~$7E:1BBF, $7E:AAB0~$7E:AABF, $7E:ABB0~ |
| C | $7E:1BC0~$7E:1BCF, $7E:AAC0~$7E:AACF, $7E:ABC0~ |
| D | $7E:1BD0~$7E:1BDF, $7E:AAD0~$7E:AADF, $7E:ABD0~ |
| E | $7E:1BE0~$7E:1BEF, $7E:AAE0~$7E:AAEF, $7E:ABE0~ |
戦闘において敵は最大4種類、敵の総数は最大15体。
敵種類1~4、敵個体は敵番号0~Eとする。
味方キャラが敵として登場する場合は、敵関係のアドレスにも値が入る。
例えば敵として戦う味方キャラ2がいるとしたら、味方として$00:1C40~にデータが入り、敵として敵種類1の$00:1A00~と、敵番号0として$7E:1B00~$7E:1B0F, $7E:AA00~$7E:AA0F, $7E:AB00~にも値が入っていくことになる。
敵キャラデータには256体分の敵のデータが入っているが(1キャラにつき00~31の32バイト分のデータ)、実は、この中に、味方キャラとして登録されている23キャラのうち、21キャラ分のデータが入っている。
ないのはキャプテンスクウェアとカラクリ丸の2体のみ。
データの並び順は味方キャラデータと同じで、22番目のキャプテンスクウェア、23番目のカラクリ丸のデータは入り切らずに、21番目のキューブのデータが最後になっている。
キャプテンスクウェアは敵対キャラになることがないため問題はないが、カラクリ丸は戦闘を行うことがあるため、少し特殊な設定になる。
カラクリ丸についてはこの後のサブルーチンの説明で詳しく説明をする。
敵キャラ登録済みのブリキ大王についても、説明は省く。
敵IDの$EB以降の21キャラ分、つまり敵キャラデータの最後の21キャラ分が「敵データ内の味方キャラのデータ」に該当するが、実際にはデータの大半が$00で埋まっている。
異なる部分のみ抜き出したのが以下。
全キャラ、敵キャラデータ02が$80、03が$81であることと、ストレイボウ、サンダウン、マッドドッグの敵キャラデータ00(移動パターン)、ストレイボウの敵キャラデータ01、高原 日勝の敵キャラデータ08(知)、キューブの敵キャラデータ10(無効状態異常)だけ、$00以外の数が入っている。それらの値だけ赤字にした。
| キャラ名 | 敵ID | 敵キャラデータ | |||||
|---|---|---|---|---|---|---|---|
| $00 | $01 | $02 | $03 | $08 | $10 | ||
| オルステッド | $EB | $00 | $00 | $80 | $81 | $00 | $00 |
| ストレイボウ | $EC | $06 | $16 | $80 | $81 | $00 | $00 |
| ウラヌス | $ED | $00 | $00 | $80 | $81 | $00 | $00 |
| ハッシュ | $EE | $00 | $00 | $80 | $81 | $00 | $00 |
| ポゴ | $EF | $00 | $00 | $80 | $81 | $00 | $00 |
| ゴリ | $F0 | $00 | $00 | $80 | $81 | $00 | $00 |
| べる | $F1 | $00 | $00 | $80 | $81 | $00 | $00 |
| ざき | $F2 | $00 | $00 | $80 | $81 | $00 | $00 |
| 心山拳老師 | $F3 | $00 | $00 | $80 | $81 | $00 | $00 |
| ユン・ジョウ | $F4 | $00 | $00 | $80 | $81 | $00 | $00 |
| レイ・クウゴ | $F5 | $00 | $00 | $80 | $81 | $00 | $00 |
| サモ・ハッカ | $F6 | $00 | $00 | $80 | $81 | $00 | $00 |
| サンダウン | $F7 | $16 | $00 | $80 | $81 | $00 | $00 |
| マッドドッグ | $F8 | $16 | $00 | $80 | $81 | $00 | $00 |
| おぼろ丸 | $F9 | $00 | $00 | $80 | $81 | $00 | $00 |
| とらわれの男 | $FA | $00 | $00 | $80 | $81 | $00 | $00 |
| 高原 日勝 | $FB | $00 | $00 | $80 | $81 | $08 | $00 |
| アキラ | $FC | $00 | $00 | $80 | $81 | $00 | $00 |
| タロイモ | $FD | $00 | $00 | $80 | $81 | $00 | $00 |
| 無法松 | $FE | $00 | $00 | $80 | $81 | $00 | $00 |
| キューブ | $FF | $00 | $00 | $80 | $81 | $00 | $20 |
敵キャラデータ01は、「上4ビット:フィールド吸収/下4ビット:移動頻度」なので、ストレイボウの$16 = %0001 0110という値は、「電撃フィールド吸収」かつ、移動頻度 = $06を意味する。
つまり、ストレイボウは、戦闘で敵対する時だけ電撃フィールド吸収の特性を持っている。味方キャラとして操作する時には適用されない。
電撃フィールド吸収の設定が生かされるのは、実際には中世編ラストバトルのみである。中世編冒頭の武闘大会時にも適用されるのだが、ストレイボウが電撃フィールドを作る技「アンバーストーム」を使えるのが中世編ラストバトルしかない。
これらの敵キャラデータは仮値のようなもので、実際には戦闘開始時、味方キャラデータなどから読み込まれた、実際のステータスが上書きされる。
敵の種類データ(最大4種類)が入るアドレス$00:1A00~は、敵種類1なら$00:1A20~$00:1A3Fに敵キャラデータ32バイトが丸ごと入るが、敵キャラデータ00~03は上の値がそのまま、敵キャラデータ05~08(力・速・体・知)や11~14(使用技ID)は味方キャラデータから値が上書きになる。
カウンター行動異常、ドロップアイテムなどは味方キャラには存在しないので$00で埋まったままである。
ただし、味方キャラデータから持ち込まれない値もあり、例えば敵キャラデータ29は上4ビット:背後補正/下4ビット:側面補正が入っているにも関わらず、味方敵対時、敵キャラデータ29が入るアドレス(敵種類1なら$00:1A3D)は$00である。
敵キャラデータ30~31には回避属性の値2バイト(+ダメージフィールド無効かどうか)の値が入るのだが、こちらも「00 00」が入る。
本来味方キャラにも、背後補正・側面補正が設定されているし(味方キャラデータ29)、回避属性は素の値が味方キャラデータ30~31に入っている他、装備品でも付くのであるが、それらの値は敵対時には適用されないことがわかる。
そして、最終編における仲間キャラとの戦闘なのだが、高原やポゴ、おぼろ丸などのデータが上に入っているから、それらの値が仮値として読み込まれる……はずが、実は読み込まれない。
なんと、最終編だと、一番下のキューブの値(ID$FF)が読み込まれるのである。
そのデータに各キャラのステータスが上書きされていくものの、無効状態異常は更新されない。
このため、最終編の味方キャラとの戦闘だと、全員に敵キャラデータ10の「$20」が適用されて、眠り無効耐性が付く。
(ついでに言えば、キューブ本人には眠り耐性はなく、耐性は足、腕、毒、麻、酔、石である)
これは最終編オルステッド主人公時における、敵として戦う味方キャラ全員にも適用されることになるが、今回は詳細を省く。
この謎の処理についてもおいおい説明していく。
ここからサブルーチンを紹介するが、長くなるので、まずは前段階の処理である、以下を紹介する。
例として、功夫編の修行で、サモが初期レベル(レベル5)で修行1戦目に挑む戦闘の開始時のサブルーチンを紹介するが、途中で適宜、他パターンも紹介する。
功夫編は、修行までにパーティメンバーが4人に増えるが、修行の戦闘では、主人公1人と弟子1人が戦闘に参加するため、一時的にパーティメンバーが2人(仲間キャラは1人)と設定される。
また、戦闘でも戦闘以外でも共通で、
| アドレス | 内容 |
|---|---|
$00:0A11 | 仲間1人目のシナリオ別キャラデータID |
$00:0A12 | 仲間2人目のシナリオ別キャラデータID |
$00:0A13 | 仲間3人目のシナリオ別キャラデータID |
$00:0A14 | パーティの仲間の人数 $00:0人、$01:1人、$02:2人、$03:3人 |
と、値が入っているのだが、修行の戦闘では、戦う弟子のシナリオ別キャラデータIDが$00:0A11に入る。
シナリオ別キャラデータIDは、キャラIDとは異なる。
各シナリオ専用で仲間キャラに割り振られる$08, $09, $0Aという番号になり、功夫編なら順にユン、レイ、サモである。
よって、修行では、$00:0A11に弟子のシナリオ別キャラデータID、ユン($08)・レイ($09)・サモ($0A)のどれかが入ることになる。
以上を踏まえて処理を見ていただきたい。
$C0/257C LDA $0D,x [$00:0F8D] ;A:0F80 Aに[$00:0F8E][$00:0F8D]をロード $C0/257E ORA $30 [$00:0030] ;A:001F Aと[$00:0031][$00:0030]で論理和 $C0/2580 STA $0D,x [$00:0F8D] ;A:801F Aを[$00:0F8E][$00:0F8D]に書き込み
これは戦闘突入時、ざき2戦目のみで発生する処理。
ざきとは3回敵として戦い、ラストバトルのみ味方キャラとして操作可能だが、ステータスはどの戦闘でもレベル4で変化しない。
だが、1戦目と2戦目以降では使用技が変わる。
2戦目以降はレベルは4のまま、レベル16の習得技「ばりぶる~ん」を覚えて使ってくるようになるのだが、その処理が上である。
原始編におけるシナリオ別キャラデータ3人目がざきで、[$00:0F8E][$00:0F8D]に習得技2バイト分のデータが入っており、1戦目だと2バイト分で「$001F」、2戦目以降は「$801F」が入っている。
2戦目以降はフラグ関係の処理の結果(詳細は省略)、他ステータスはそのままで、上の処理により、元の「$001F」に$8000が加算されて「$801F」が[$00:0F8E][$00:0F8D]に入る。
これで、ざきは本来レベル16で覚える技「ばりぶる~ん」が習得済みという扱いになり、2戦目以降の使用技が変化するという仕組みになっている。
$C1/6718 LDA $20 [$00:0320] ;Aに[$00:0320]をロード $C1/671A STA $0004,x[$00:1A04] ;Aを[$00:1A04](敵種類1 横の幅)に書き込み $C1/671D LDA $21 [$00:0321] ;Aに[$00:0321]をロード $C1/671F STA $0005,x[$00:1A05] ;Aを[$00:1A05](敵種類1 縦の幅)に書き込み $C1/6722 LDY #$3000 ;Yに$3000をロード $C1/6725 JSR $6665 [$C1:6665] ;[$C1:6665]へジャンプ
敵種類1のデータは$00:1A00から開始になるが、$00:1A04に敵の横の幅、$00:1A05に敵の縦の幅が記録される。
通常の敵キャラは複数マスにまたがる大きさのこともあるが、味方キャラは1×1マスで統一されており、まずは共通処理として[$00:1A04]と[$00:1A05]に01が入る。
それぞれ[$00:0320][$00:0321]からコピーされており、処理を遡ると味方キャラは共通で[$D5:FAFB]に入っている$89という値から計算されていることがわかるが、今回は計算は省略する。
$C1/2239 LDA $0070 [$00:0070] ;Aに[$00:0070]をロード $C1/223C CMP #$01 ;Aと$01を減算比較(ステータスレジスタ変更のみ) $C1/223E BEQ $3C [$227C] ;ゼロフラグが立っているとき[$227C]分岐 $C1/2240 LDA $0040 [$00:0040] ;Aに[$00:0040]をロード $C1/2243 CMP #$A8 ;Aと$A8を減算比較(ステータスレジスタ変更のみ) $C1/2245 BNE $34 [$227B] ;ゼロフラグが立っていないとき[$227B]分岐 $C1/227B RTS ;サブルーチン戻り
上の処理は功夫編修行におけるサモ戦での処理にあたるが、実はこの$C1/2239~の処理は、中世編ラストバトルに関係している。
[$00:0070]と[$00:0040]の値を呼び出しているが、[$00:0070]は通常$00で、戦闘で特殊な処理をする時にだけ値を入れて分岐処理をしているようだ(未確認)。
例えばゲーム開始時のデモ画面の最中では大抵$01以上が入るし、今回紹介するストレイボウのステータス処理の間も一時的に$01が入る。
通常の戦闘開始時は$00が入っているので、上のように$C1/223Eでゼロフラグが立つことはない。
次の[$00:0040]だが、このひとつ後のアドレス[$00:0041]と合わせて、戦闘時の背景番号または戦闘そのもののナンバリングに関係した値である(こちらも未確認)。
サモの修行1回目(山頂)だと、[$00:0040] = $A9であり、$C1/2243で$A8と減算比較してゼロフラグが立たないため、$C1/227Bにジャンプして処理を終了する。
つまり、修行の場合、この処理で特に何も起きない。
更に言えば中世編ラストバトル以外、何も起きない。
では、中世編ラストバトル、つまりストレイボウ戦だとどうなるかを見てみる。
$C1/2239 LDA $0070 [$00:0070] ;Aに[$00:0070]($00)をロード $C1/223C CMP #$01 ;Aと$01を減算比較(ステータスレジスタ変更のみ) $C1/223E BEQ $3C [$227C] ;ゼロフラグが立っているとき[$227C]分岐 $C1/2240 LDA $0040 [$00:0040] ;Aに[$00:0040]($A8)をロード $C1/2243 CMP #$A8 ;Aとを減算比較(ステータスレジスタ変更のみ) $C1/2245 BNE $34 [$227B] ;ゼロフラグが立っていないとき[$227B]分岐 $C1/2247 LDA $0041 [$00:0041] ;Aに[$00:0041]($61)をロード $C1/224A CMP #$61 ;Aと$61を減算比較(ステータスレジスタ変更のみ) $C1/224C BNE $2D [$227B] ;ゼロフラグが立っていないとき[$227B]分岐 $C1/224E LDA $0070 [$00:0070] ;Aに[$00:0070]($00)をロード $C1/2251 PHA ;Aをスタックにプッシュ $C1/2252 LDA #$01 ;Aに$01をロード $C1/2254 STA $0070 [$00:0070] ;Aを[$00:0070]に書き込み $C1/2257 LDY #$0F00 ;Yに$0F00をロード $C1/225A LDA $0006,y[$00:0F06] ;Aに[$00:0F06](中世編・ストレイボウのレベル)をロード $C1/225D CMP #$10 ;Aと$10を減算比較(ステータスレジスタ変更のみ) $C1/225F BCS $09 [$226A] ;キャリーフラグが立っているとき[$226A]分岐 $C1/2261 INC A ;Aをインクリメント +1 $C1/2262 STA $0006,y[$00:0F06] ;Aを[$00:0F06]に書き込み $C1/2265 JSR $2448 [$C1:2448] ;[$C1:2448]へジャンプ ;$C1/225FでキャリーフラグON $C1/226A REP #$20 ;Aを16bit幅に変更、Mフラグをクリア $C1/226C LDA #$03E7 ;Aに$03E7をロード $C1/226F STA $0F0A [$00:0F0A] ;Aを[$00:0F0A]に書き込み $C1/2272 STA $0F08 [$00:0F08] ;Aを[$00:0F08]に書き込み $C1/2275 SEP #$20 ;MフラグON Aレジスタは8bit幅 $C1/2277 PLA ;Aレジスタに値をプル $C1/2278 STA $0070 [$00:0070] ;Aを[$00:0070]に書き込み $C1/227B RTS ;サブルーチン戻り $C1/0099 JSR $0BF7 [$C1:0BF7] ;[$C1:0BF7]へジャンプ
処理を見ていくと、[$00:0040]が$A8、[$00:0041]が$61だと、中世編ラストバトルと判定されることがわかる。
$C1/2254で[$00:0070]に$01が書き込まれるが、これは後の処理のために一時的に入る値である。
$C1/225Aからが、ストレイボウのステータス関係の処理開始アドレスである。
まず、[$00:0F06]をロードしているが、これはシナリオ別キャラデータの仲間1人目のレベルの値であり、中世編ではストレイボウのレベルである。
中世編ラストバトル開始時、[$00:0F06]に入っているのは、ストレイボウが魔王戦後に離脱した時のレベルである。
この値と$10(10進法16)を減算比較し、キャリーフラグ判定をしている。
キャリーフラグが立つのは減算の結果が0か正の数の時だから、ストレイボウのレベルが16以上だとキャリーフラグが立って$C1/226Aにジャンプする。
ストレイボウのレベルが16未満の場合は$C1/2261に進むが、その場合は呼び出したレベルの値を+1してから[$00:0F06]に書き込み、[$C1:2448]へジャンプする。
つまりストレイボウのレベルを+1してから[$C1:2448]へ飛ぶが、その先ではストレイボウのレベルが16になるまでインクリメントを繰り返すループ処理があるので、「ストレイボウのレベルが16未満なら16まで上げる処理」ということになる。
一方、ストレイボウのレベルが16以上の場合は、$C1/226Aに進むが、ここで行う処理は、16bitモードに切り替えてから、[$00:0F0B][$00:0F0A](ストレイボウの最大HP・2バイト)と、[$00:0F09][$00:0F08](ストレイボウの現在HP・2バイト)に、$03E7(10進数999)を書き込む処理である。
つまり、ストレイボウのレベルが16以上なら、HPのみ999に上書きする、という処理を行って、[$00:0070]に再び$00を入れてサブルーチン終了となる。
よって、$C1/2239~は、中世編ラストバトル用のストレイボウのステータスを書き直すための処理であることがわかる。
ストレイボウのレベルが16以上の場合は、HP以外のステータスはそのままで、HPだけ999に書き換えることがわかるが、ストレイボウのレベルが16未満だと、16まで上げるサブルーチン処理が続くことになる。
ストレイボウのレベルが16未満の時の、$C1:2448~の処理を見てみよう。
ここでは例として、ストレイボウのレベルが9だった場合を掲載する。
$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:0108] ;Aに[$D5:0108](ストレイボウのキャラデータ27) $C1/245D JSR $1A09 [$C1:1A09] ;[$C1:1A09]へジャンプ
ストレイボウのキャラデータ27、レベルアップ時のHP上昇値計算値をロードして、$C1:1A09にジャンプしているのだが、この$C1:1A09というアドレスは、以前に紹介している。
レベルアップ処理 > ステータス上昇値
における、HP上昇値の処理のサブルーチン開始のアドレスなのである。
ストレイボウがレベル9の場合は、レベルの値を+1してから上処理へ飛んでいるのだが、その先では実際に「ストレイボウがレベル9から10に上がった」という扱いで、HPの上昇値を計算するサブルーチンを動かすのである。
もちろん乱数計算をするので、上昇幅は一定幅からランダムで、ストレイボウの場合はHP上昇値が22~32である。
HPの後は力・速・体・知上昇値の処理$C1/248B~$C1/24AEのループ処理も行う。
シナリオ別キャラデータへの上書きもきちんと行う。
そして、
レベルアップ処理 > 技習得
で紹介した、技習得処理も行う。
ストレイボウはレベル10で「シルバーファング」を覚えるため、シナリオ別キャラデータの習得技アドレス、$00:0F0D~$00:0F0Eの2バイト分の値もしっかり更新される。
ひととおりレベルアップ処理を行ったら、$C1/2257に戻って、[$00:0F06]に入っているストレイボウのレベルが$10(10進数16)になるまで繰り返しである。
習得技もすべて埋まるので、$00:0F0D~$00:0F0Eは$FFFFが入ることになる。
簡単に言えば、ストレイボウのレベルが16未満の時、レベルが16になるまでレベルアップ処理をし、その度に通常のレベルアップ同様にステータスの上昇・技習得を行っている、ということになる。
ただ、HPについては、最後に最大HPが999に上書きされるため、計算した意味はなくなってしまう。
また、力・速・体・知の上昇値は通常のレベルアップ同様に戦闘乱数で計算して決めているため、ラストバトル開始時にストレイボウのレベルを16まで引き上げた場合、力・体・知は常に一定ではない。速のみ上昇値が1で固定なので、レベル16での速は35で固定になるが。
以上が中世編ラストバトルにおける、ストレイボウのステータス関係の前処理になる。
この先は中世編ラストバトルでのストレイボウのステータスはレベル16(または16以上)で処理されていく。
他キャラは変動なしである。
(ただし、ざきのみ、習得技に変動が起こる。後ほど説明する)
$C1/EDB3 LDA $0A00 [$00:0A00] ;Aに[$00:0A00](シナリオID)をロード $C1/EDB6 CMP #$08 ;Aと$08(最終編)を減算比較(ステータスレジスタ変更のみ) $C1/EDB8 BCS $03 [$EDBD] ;キャリーフラグが立っているとき[$EDBD]分岐 $C1/EDBA BRL $008A [$EE47] ;フラグにかかわりなく常に分岐[$EE47] ; ;最終編分岐 $C1/EDBD LDA $0A10 [$00:0A10] ;Aに[$00:0A10](最終編主人公)をロード $C1/EDC0 STA $1C04 [$00:1C04] ;Aを[$00:1C04]に書き込み $C1/EDC3 JSR $EC59 [$C1:EC59] ;[$C1:EC59]へジャンプ ;最終編以外 $C1/EE47 LDA $0A00 [$00:0A00] ;Aに[$00:0A00](シナリオID)をロード $C1/EE4A STA $1C04 [$00:1C04] ;Aを[$00:1C04]に書き込み $C1/EE4D JSR $EC59 [$C1:EC59] ;[$C1:EC59]へジャンプ
ここで、シナリオや主人公が誰かによって少し処理が変化する。
$C1/EDB3で、[$00:0A00](現在プレイしているシナリオのID)がロードされ、$08(最終編のシナリオID)かどうかで分岐がある。
その後の処理を見てみると、[$00:1C04]に書き込む値が異なるだけで、その後は共通して[$C1:EC59]へジャンプしている。
最終編だと、[$00:0A10]に入っている最終編主人公の値(=最終編以外のシナリオIDの値)、最終編以外だと、[$00:0A00]のシナリオIDの値がそのまま[$00:1C04]に書き込まれている。
下表のように、要するに主人公に対応したIDの値を呼び出して[$00:1C04]に書き込んだことになる。
| シナリオ | ID | キャラクター |
|---|---|---|
| 中世 | $00 | オルステッド |
| 原始 | $01 | ポゴ |
| SF | $02 | キューブ |
| 功夫 | $03 | 心山拳老師 |
| 西部 | $04 | サンダウン |
| 現代 | $05 | 高原日勝 |
| 近未来 | $06 | アキラ |
| 幕末 | $07 | おぼろ丸 |
| 最終 | $08 | - |
$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 ;Aに[$D60000,x](主人公のキャラID)をロード $C1/EC60 CMP #$15 ;Aと#$15(キャプテンS ID=$15)を減算比較(ステータスレジスタ変更のみ) $C1/EC62 BEQ $09 [$EC6D] ;ゼロフラグが立っているとき[$EC6D]分岐 $C1/EC64 CMP #$08 ;Aと$08(心山拳老師 ID=$08)を減算比較(ステータスレジスタ変更のみ) $C1/EC66 BEQ $01 [$EC69] ;ゼロフラグが立っているとき[$EC69]分岐 $C1/EC68 RTS ;サブルーチン戻り ;功夫編分岐 $C1/EC69 LDA $0DC0 [$00:0DC0] ;Aに[$00:0DC0]をロード $C1/EC6C RTS ;サブルーチン戻り ;主人公のキャラID=$15の時の分岐 $C1/EC6D LDA $0A00 [$00:0A00] ;Aに[$00:0A00]をロード $C1/EC70 CMP #$08 ;Aと$08を減算比較(ステータスレジスタ変更のみ) $C1/EC72 BEQ $03 [$EC77] ;ゼロフラグが立っているとき[$EC77]分岐 $C1/EC74 LDA #$15 ;Aに$15をロード $C1/EC76 RTS ;サブルーチン戻り $C1/EC77 LDA #$14 ;Aに$14をロード $C1/EC79 RTS ;サブルーチン戻り
その後は、[$00:1C04]*4 + $D60040を計算し、$C1/EC5Cで計算値のアドレスをロードしている。
どのシナリオか、または最終編だとどの主人公かにより、計算値は変わることになるが、計算される値は、$D6:512F~$D6:514Fに入っている、最終編以外の各シナリオの主人公+仲間3人の味方キャラID一覧表のアドレスである。
$D6:512F~$D6:514Fに入っている値を表にしてまとめたのが以下である。
| シナリオ | 主人公 | 仲間1 | 仲間2 | 仲間3 |
|---|---|---|---|---|
| 中世 | $00 | $01 | $02 | $03 |
| 原始 | $04 | $05 | $06 | $07 |
| SF | $15 | $FF | $FF | $FF |
| 功夫 | $08 | $09 | $0A | $0B |
| 西部 | $0C | $0D | $FF | $FF |
| 現代 | $10 | $FF | $FF | $FF |
| 近未来 | $11 | $12 | $13 | $FF |
| 幕末 | $0E | $0F | $16 | $FF |
仲間が3人未満のシナリオの場合、仲間がいない部分のアドレスは$FFで埋まっている。
功夫編の修行時であれば、$C1/EC5CのLDA $D60000,xの呼び出し先アドレスは[$D6:513B]なのだが、これは上表の上から4列目、功夫編主人公である心山拳老師の味方キャラIDである$08が呼び出せる。
最終編であれば、最終編主人公に対応した味方キャラIDが呼び出せる、ということになる。
ただし、上表では、SF編主人公の値に$15が入っている。これはキャプテンスクウェアのIDである。
SF編はラストバトルまで、戦闘での操作キャラがキャプテンスクウェアで、ラストバトルでキューブと入れ替える形のため、上表のように指定されている。
だが、最終編でキューブを主人公にした場合は、$15だとキャプテンスクウェアの値がよびだされてしまう。
そこで、$C1/EC60で、呼び出した値が$15の時の分岐があり、$C1/EC6Dへジャンプするようになっている。
$C1/EC6D~$C1/EC79では、[$00:0A00](シナリオID)が$08、つまり最終編なら$14(キューブのキャラID)をロードし、それ以外なら$15(キャプテンスクウェアのキャラID)をロード、という処理を行う。これにより、主人公のキャラIDが正しく呼び出されることになる。
もうひとつ、$C1/EC64で、呼び出した値が$08(心山拳老師のキャラID)の分岐がある。
その場合は[$00:0DC0]の値を呼び出している。
[$00:0DC0]は、シナリオ別キャラデータにおける功夫編主人公のIDが入っているが、功夫編だと心山拳老師のID、最終編だと心山拳師範のID、つまりユン・レイ・サモのいずれかのIDが入る。
つまり、功夫編か最終編かで主人公IDが変動するため、$D6:512F~$D6:514Fの値ではなく、改めてシナリオ別キャラデータからIDを呼び出し直している、ということがわかる。
この後の処理は、最終編以外と最終編で変わる。
最終編だとアドレス開始が$C1/EDCCになるが、そちらは後述する。
ひとまず、最終編以外、ここでは功夫編修行について載せる。
$C1/EE56 LDA $0000,y[$00:0DC0] ;Aに[$00:0DC0](心山拳老師 ID)をロード $C1/EE59 STA $1C00 [$00:1C00] ;Aを[$00:1C00]に書き込み $C1/EE5C STY $1C02 [$00:1C02] ;Yを[$00:1C02]に書き込み $C1/EE5F LDA #$FF ;Aに$FFをロード $C1/EE61 STA $1C01 [$00:1C01] ;Aを[$00:1C01]に書き込み $C1/EE64 STZ $1C41 [$00:1C41] ;[$00:1C41]に$00を書き込み $C1/EE67 STZ $1C81 [$00:1C81] ;[$00:1C81]に$00を書き込み $C1/EE6A STZ $1CC1 [$00:1CC1] ;[$00:1CC1]に$00を書き込み $C1/EE6D LDA $0A11 [$00:0A11] ;Aに[$00:0A11]をロード $C1/EE70 STA $1C44 [$00:1C44] ;Aを[$00:1C44]に書き込み $C1/EE73 JSR $EC4B [$C1:EC4B] ;[$C1:EC4B]へジャンプ ;(中略) $C1/EE76 STY $1C42 [$00:1C42] ;Yを[$00:1C42]に書き込み $C1/EE79 LDA $0A12 [$00:0A12] ;Aに[$00:0A12]をロード $C1/EE7C STA $1C84 [$00:1C84] ;Aを[$00:1C84]に書き込み $C1/EE7F JSR $EC4B [$C1:EC4B] ;[$C1:EC4B]へジャンプ ;(中略) $C1/EE82 STY $1C82 [$00:1C82] ;Yを[$00:1C82]に書き込み $C1/EE85 LDA $0A13 [$00:0A13] ;Aに[$00:0A13]をロード $C1/EE88 STA $1CC4 [$00:1CC4] ;Aを[$00:1CC4]に書き込み $C1/EE8B JSR $EC4B [$C1:EC4B] ;[$C1:EC4B]へジャンプ
$C1/EE56で、主人公のシナリオ別キャラデータのIDを呼び出し、戦闘における仲間キャラ1人目のデータが入る[$00:1C00]に書き込む。
また、$C1/EE6D~の処理で、$00:0A11, $00:0A12, $00:0A13を、$00:1C44, $00:1C84, $00:1CC4に書き込んでいる。
$00:0A11~$00:0A12には、どのシナリオにおいても、仲間キャラのシナリオ別キャラデータID3人分が入っている。
最終編以外だと、仲間キャラには$08, $09, $0Aが割り振られており、功夫編では順にユン・レイ・サモに該当するが、弟子にした順で$00:0A11~に値が入っていくため、$08, $09, $0Aがどう並ぶかはプレイヤー次第である。
だが、修行時には、どの順で弟子にしたかは関係なく、$00:0A11に修行相手の弟子のIDが入る。
$08, $09, $0Aが順に入っていたとしても、サモに修行をつける場合、戦闘に入ると$0A, $09, $0Aが$00:0A11~に入るのである。
サモにあたる$0Aが一時的に$00:0A11に書き込まれて、仲間2人目となり、この戦闘は「味方キャラは老師とサモの2人」という扱いになる。
このため、サモに修行をつける戦闘において、$00:0A11と$00:1C44には必ず$0Aが入る。
同じような入れ替わりは、原始編のざき戦(2戦目以降)でも起こる。
原始編は通常、$00:0A11にはゴリの値$08が入っている。
だが、ざき2戦目以降はポゴとざきの一騎打ちなので、「味方キャラはポゴとざきの2人」という扱いであり、ざきのシナリオ別キャラデータが$0Aなので、戦闘の間は$00:0A11に$0Aが入ることになる。
ざき1戦目だとざきは味方キャラの4人目扱いなので、$00:0A13(仲間3人目)に$0Aが入ったままで変動はない。
$C1/EE8E STY $1CC2 [$00:1CC2] ;Yを[$00:1CC2]に書き込み $C1/EE91 LDA $0A14 [$00:0A14] ;Aに[$00:0A14](パーティの仲間の人数)をロード $C1/EE94 BEQ $32 [$EEC8] ;ゼロフラグが立っているとき[$EEC8]分岐 $C1/EE96 CMP #$01 ;Aと$01を減算比較(ステータスレジスタ変更のみ) $C1/EE98 BEQ $20 [$EEBA] ;ゼロフラグが立っているとき[$EEBA]分岐 ;$C1/EE98でゼロフラグOFF $C1/EE9A CMP #$02 ;Aと$02を減算比較(ステータスレジスタ変更のみ) $C1/EE9C BEQ $0E [$EEAC] ;ゼロフラグが立っているとき[$EEAC]分岐 ;仲間3人時(ざき1戦目) $C1/EE9E LDA $0A13 [$00:0A13] ;Aに[$00:0A13]をロード $C1/EEA1 JSR $EC7A [$C1:EC7A] ;[$C1:EC7A]へジャンプ ;仲間2人時(幕末・とらわれの男が居る時のカラクリ丸戦) $C1/EEAC LDA $0A12 [$00:0A12] ;Aに[$00:0A12]をロード $C1/EEAF JSR $EC7A [$C1:EC7A] ;[$C1:EC7A]へジャンプ ;$C1/EE98でゼロフラグON $C1/EEBA LDA $0A11 [$00:0A11] ;Aに[$00:0A11]をロード $C1/EEBD JSR $EC7A [$C1:EC7A] ;[$C1:EC7A]へジャンプ ; $C1/EC7A CMP #$0A ;Aと$0Aを減算比較(ステータスレジスタ変更のみ) $C1/EC7C BEQ $0E [$EC8C] ;ゼロフラグが立っているとき[$EC8C]分岐($0Aだった時の分岐) $C1/EC7E CMP #$09 ;Aと$09を減算比較(ステータスレジスタ変更のみ) $C1/EC80 BEQ $05 [$EC87] ;ゼロフラグが立っているとき[$EC87]分岐($09だった時の分岐) $C1/EC82 LDA $D60001,x ;Aに[$D60001,x]をロード($08だった時の処理) $C1/EC86 RTS ;サブルーチン戻り $C1/EC87 LDA $D60002,x ;Aに[$D60002,x]をロード($09だった時のジャンプ先) $C1/EC8B RTS ;サブルーチン戻り $C1/EC8C LDA $D60003,x ;Aに[$D60003,x]をロード($0Aだった時のジャンプ先) $C1/EC90 RTS ;サブルーチン戻り ; $C1/EEC0 STA $1C40 [$00:1C40] ;A(対戦相手キャラID)を[$00:1C40]に書き込み $C1/EEC3 LDA #$FF ;Aに$FFをロード $C1/EEC5 STA $1C41 [$00:1C41] ;A($FF)を[$00:1C41]に書き込み $C1/EEC8 RTS ;サブルーチン戻り
$C1/EE91で[$00:0A14]、つまりパーティの仲間の人数をロードしているが、この戦闘は老師とサモしか味方キャラがいないので、パーティの仲間の人数を1とカウントする。つまりこの戦闘では[$00:0A14] = $01である。
修行では3人の弟子を既に集めている状態だが、修行での戦闘では老師と弟子の2人のみが戦闘に参加するため、仲間は1人、という扱いになる点に注意。
原始編でのポゴとざきの一騎打ちなども該当するが、幕末編でとらわれの男がいる場合のカラクリ丸との戦闘にはおぼろ丸・とらわれの男・カラクリ丸の3キャラが戦闘に参加するため、仲間は2人という扱いである。
$C1/EE94のゼロフラグ判定は、仲間の数が0か1以上かになるから、修行ではゼロフラグが立たない。
$C1/EE98では、仲間の人数と$01を減算比較だから、ゼロフラグが立つ。
つまり仲間が1人の時のみここでゼロフラグが立って、$C1/EEBAへ進む。
$C1/EEBAではAに[$00:0A11]をロードして[$C1:EC7A]にジャンプする。
仲間1人目、つまり戦う仲間キャラのシナリオ別キャラデータのキャラIDが読み込まれたことになる。サモとの修行なら$0Aである。
$C1/EE94でゼロフラグが立たない場合、つまり仲間2人または3人の時の処理は上に記したが、違いは、仲間2人目または3人目のキャラIDが入っている、[$00:0A12]または[$00:0A13]をAにロードしていることで、ジャンプ先は[$C1:EC7A]と変わらない。
つまり、この戦闘における、「対戦する仲間キャラ」のIDをAに読み込む処理が行われたことになる。
シナリオ別キャラデータのキャラIDだが、最終編以外の仲間キャラには、どのシナリオでも$08, $09, $0Aが割り振られている、と先に説明した通りである。
よって、$C1:EC7Aにジャンプした時、Aには$08, $09, $0Aのいずれかが入っているはずである。
ジャンプ先の$C1:EC7Aでは、Aが$08, $09, $0Aのどれなのかで分岐している。
分岐先では、$D6で始まるアドレスの値を呼び出しているが、これは味方キャラIDにあたる。
A | 呼び出し先アドレス |
|---|---|
| $08 | $D60001,x |
| $09 | $D60002,x |
| $0A | $D60003,x |
Xだが、これより前に計算した、[$00:1C04]*4 + $D60040の下4桁がXに入った状態である。
先に紹介した通り、呼び出し先のアドレスは、$D6:512F~$D6:514Fにあたり、最終編以外の各シナリオの主人公+仲間3人の味方キャラID一覧表である。
つまり、分岐先で呼び出すアドレスは、「対戦する仲間キャラのキャラID」である。
功夫編におけるサモとの修行であれば、[$D6:513E]、サモのキャラID$0Bをロードする。
| シナリオ | 主人公 | 仲間1 | 仲間2 | 仲間3 |
|---|---|---|---|---|
| 中世 | $00 | $01 | $02 | $03 |
| 原始 | $04 | $05 | $06 | $07 |
| SF | $15 | $FF | $FF | $FF |
| 功夫 | $08 | $09 | $0A | $0B |
| 西部 | $0C | $0D | $FF | $FF |
| 現代 | $10 | $FF | $FF | $FF |
| 近未来 | $11 | $12 | $13 | $FF |
| 幕末 | $0E | $0F | $16 | $FF |
こうして呼び出された味方キャラIDは、修行の場合、$C1/EEC0で[$00:1C40]に書き込まれる。
修行において弟子は敵として戦うキャラにあたるが、[$00:1C40]に書き込まれていることがわかる。
今回はサモと対戦するので、サモのキャラID・$0Bが入る。
[$00:1C41]は味方キャラ2人目の戦闘状態が入るが、ここでは「通常」を意味する$FFが入る。
後にこの値は変更される。
なお、ざき1戦目であれば書き込み先は[$00:1CC0]だし、とらわれの男がいる時のカラクリ丸戦なら書き込み先は[$00:1C80]になる。
何にせよ、ここでパーティメンバーのキャラIDが$00:1C??~にひととおり書き込まれたことがわかる。
敵になる味方キャラのIDも、戦闘中における味方キャラとして、$00:1C??~に入ることがわかった。
とりあえずこの先の説明は、引き続き修行におけるサモとの対戦という前提でアドレスを記す。
その前に、最終編ではどういう処理になっているかを紹介しておく。
大まかには処理手順は変わらない。
最終編で味方キャラと戦う場合、必ず主人公との1対1である。
また、戦闘開始時に、[$00:0A11]に対戦相手のキャラIDが入るようになっている(シナリオ進行フラグなどで入るようだが未確認)。
既に1人以上仲間がいて、[$00:0A11]にその仲間キャラのIDが入っていても、戦闘時のみ、対戦相手のキャラIDが入る仕組みである。
処理自体は$C1/EE56~と似ているが、最終編におけるサブルーチンのアドレスは$C1/EDCC~なので、最終編用の処理ということになるようだ。
$C1/EDCC LDA $0000,y ;Aに[$0000,y](最終編主人公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]分岐 ; ;[$00:0A10]=$00以外(主人公がオルステッド以外) $C1/EDEB STZ $1C41 [$00:1C41] ;[$00:1C41]に$00を書き込み $C1/EDEE STZ $1C81 [$00:1C81] ;[$00:1C81]に$00を書き込み $C1/EDF1 STZ $1CC1 [$00:1CC1] ;[$00:1CC1]に$00を書き込み $C1/EDF4 LDA $0A14 [$00:0A14] ;Aに[$00:0A14](仲間の人数)をロード $C1/EDF7 BEQ $4D [$EE46] ;ゼロフラグが立っているとき[$EE46]分岐 $C1/EDF9 CMP #$01 ;Aと$01を減算比較(ステータスレジスタ変更のみ) $C1/EDFB BEQ $32 [$EE2F] ;ゼロフラグが立っているとき[$EE2F]分岐 ;仲間キャラとの戦闘は必ず1対1で、仲間人数=01のため、[$EE2F]分岐になる ; $C1/EE2F LDA $0A11 [$00:0A11] ;Aに[$00:0A11](仲間1人目シナリオ別キャラデータID)をロード $C1/EE32 STA $1C44 [$00:1C44] ;Aを[$00:1C44]に書き込み $C1/EE35 JSR $EC4B [$C1:EC4B] ;[$C1:EC4B]へジャンプ ;(中略) $C1/EE38 STY $1C42 [$00:1C42] ;Yを[$00:1C42]に書き込み $C1/EE3B LDA $0000,y ;Aに[$0000,y](仲間1人目のキャラID)をロード $C1/EE3E STA $1C40 [$00:1C40] ;Aを[$00:1C40]に書き込み $C1/EE41 LDA #$FF ;Aに$FFをロード $C1/EE43 STA $1C41 [$00:1C41] ;Aを[$00:1C41]に書き込み $C1/EE46 RTS ;サブルーチン戻り
最終編主人公のキャラIDは[$00:1C00]に入る。
$C1/EDDAで、[$00:0A10]、つまり最終編主人公IDを呼び出すが、ゼロフラグが立つのは最終編主人公がオルステッドの時である。
よって最終編オルステッドルート以外は、$C1/EDEBに飛ぶ。
今回はオルステッドルート以外の仲間キャラとの戦闘についての説明なので、$C1/EDEB~の説明を続ける。
その場合、他シナリオと同じく仲間の人数をロードし確認しているが、最終編における仲間キャラとの戦闘は必ず1対1なので、[$00:0A14] = $01である。
このため、$C1/EE2Fにジャンプし、以降、[$00:0A11]の仲間1人目が敵として戦うキャラとして扱われることになる。
最終編以外では、[$00:0A11]~[$00:0A13]に入る仲間のIDは$0A, $09, $0Aのいずれかと決まっていたが、最終編だと、シナリオIDが入って区別している。
たとえば、ポゴを仲間にする時の戦闘の場合、原始編のシナリオIDは$01なので、[$00:0A11] = $01である。
$C1/EE3Bで[$0000,y]を呼び出すが、これは[$00:0A11]に入っていたシナリオIDから、該当キャラのシナリオ別キャラデータにおける開始アドレスを計算して呼び出している。
ポゴならシナリオ別キャラデータは原始編開始位置の$00:0D40に入っており、味方キャラID$04が[$00:0D40]に格納されている。
この値が読み出されて[$00:1C40]に書き込まれる。
結局のところ、最終編であってもなくても、[$00:1C00]には主人公のキャラIDが入り、対戦する味方キャラのIDも[$00:1C40]または[$00:1C80]または[$00:1CC0]に入る、ということである。
ただ、仲間キャラのIDの呼び出し方が、最終編と最終編以外で異なるため、別のサブルーチンが用意されているということである。
ここまでで、
を行った。
次ページでは、続きのサブルーチンを紹介していく。