基礎知識
戦闘関係
技の習得方法はシナリオによって複数あるが、ここではレベルアップ時における技の習得の処理について紹介する。
現代編・幕末編のラーニングや、功夫編の修行、幕末編のイベント習得は除く。
また、レベルアップによる技習得処理を見ていくと、功夫編における技習得バグの原因も理解できるので、一緒に解説する。
レベルアップ時には、キャラ毎に設定された上昇値分、ステータスがアップするレベルアップ時のステータス上昇値の処理が行われるが、その直後から、技習得の処理を行っている。
まず、技関係のデータが格納されているアドレスについて説明する。
味方キャラデータ($D5:00C0~$D5:04CA)は1キャラにつき00~44の45バイト分のデータが格納されているが、05~20番目の16バイト分に、習得可能な技IDが格納されている。
味方キャラデータには習得可能な技IDが入っているだけで、キャラが既に習得した技のデータではないことに注意。
下表における、「技レベル」の後の数値が、キャラが通常のレベルアップで覚える場合のレベルと対応している。
味方は全キャラレベル1以上で各シナリオを開始するから、技レベル00にあたる技はどのキャラも必ず習得している。
そして、技レベル「15」にあたる値は存在していないので、どの味方キャラもレベル15にレベルアップした時、何の技も習得しない。
| No. | 内容 |
|---|---|
| 05 | 技レベル00の技ID |
| 06 | 技レベル01の技ID |
| 07 | 技レベル02の技ID |
| 08 | 技レベル03の技ID |
| 09 | 技レベル04の技ID |
| 10 | 技レベル05の技ID |
| 11 | 技レベル06の技ID |
| 12 | 技レベル07の技ID |
| 13 | 技レベル08の技ID |
| 14 | 技レベル09の技ID |
| 15 | 技レベル10の技ID |
| 16 | 技レベル11の技ID |
| 17 | 技レベル12の技ID |
| 18 | 技レベル13の技ID |
| 19 | 技レベル14の技ID |
| 20 | 技レベル16の技ID |
各アドレスには技IDが入るが、覚える技が16種以下のキャラの場合、何も覚えないレベルのアドレスに入っている値は$00である。
たとえば、サモのように16種類の技を覚えるキャラであれば、全ての枠が$00以外の技IDで埋まっているが、オルステッドはレベル13とレベル14で習得する技がないので、該当箇所だけ$00が記録されている。
| 技レベル | サモ | オルステッド | ||
|---|---|---|---|---|
| 技ID | 技名 | 技ID | 技名 | |
| 00 | $A5 | クマの手 | $76 | カットワンウェイ |
| 01 | $A9 | ほいこーろー | $02 | Vシャイン |
| 02 | $A7 | とうばんじゃん | $03 | プラスリンク |
| 03 | $A8 | ばんばんじー | $06 | ハンマーパワー |
| 04 | $A6 | トン足 | $07 | ソードビュー |
| 05 | $AA | ちんじゃおろーす | $05 | インケイジ |
| 06 | $8D | 竜虎両破腕 | $08 | ムーンダウン |
| 07 | $8E | 百里道一歩脚 | $04 | ミラードライブ |
| 08 | $8F | 獅子の手 | $1B | スピンドル |
| 09 | $90 | 山猿拳 | $0A | ドラゴンソウル |
| 10 | $91 | シマリス脚 | $19 | レイザーソニック |
| 11 | $92 | 老狐の舞 | $1A | ジャンプショット |
| 12 | $93 | 不射の射 | $09 | ヘキサフランジ |
| 13 | $AB | まんがんぜんせき | $00 | - |
| 14 | $AC | おにくまん | $00 | - |
| 16 | $94 | 旋牙連山拳 | $1C | デストレイル |
ちなみにタロイモとキューブは、技レベル08~技レベル16に、メカ用装備で技が使用可能になる技(「昭和ヒヨコッコ砲」で「ヒヨコ弾」が追加になるなど)が登録されている。
ただしタロイモもキューブもレベルアップせず、レベル8以上になることがないので、自力習得はできない。
心山拳老師も実は技レベル16に「旋牙連山拳」が登録されているものの、タロイモらと同じ理由で使用できない。
セーブデータなどにも記録される、シナリオ別キャラデータは1キャラにつき64バイト分のデータが格納されているが、$0D番目と$0E番目のアドレスに、最大16種の技を習得したかどうかが記録される。
実質2バイト分の領域で16種類の技を記録していることになる。
覚えているかどうかを1ビットのON・OFFで記録している。
| 2進法の位 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
|---|---|---|---|---|---|---|---|---|
| $0D | 技レベル07 | 技レベル06 | 技レベル05 | 技レベル04 | 技レベル03 | 技レベル02 | 技レベル01 | 技レベル00 |
| $0E | 技レベル16 | 技レベル14 | 技レベル13 | 技レベル12 | 技レベル11 | 技レベル10 | 技レベル09 | 技レベル08 |
例えばオルステッドなら、シナリオ別キャラデータの$00:0D0Dと$00:0D0Eが習得済みの技のアドレスになる。
そして初期レベルは1なので、中世編開始時は、技レベル00と技レベル01の技を習得済みである。
$00:0D0E・$00:0D0Dを繋げて2バイトの2進法で表記すると、
%0000 0000 0000 0011
というように、一番下の2桁、技レベル00と技レベル01だけ1が入り、他は0である。
技レベルに入っているIDが$00、つまり該当のレベルにレベルアップ時に覚える技がない場合でも「技ID$00の技を覚えた」という扱いになって、該当のビットに1が立つようになっている。
先に記した通り、オルステッドはレベル13とレベル14で習得する技がないが、該当レベルでは「技ID$00の技を覚えた」という扱いになっており、オルステッドをレベル14まで上げると、
%0111 1111 1111 1111
$00:0D0Dに%1111 1111 = $FFが入り、$00:0D0Eに%0111 1111 = $7Fが入っている。
つまり、レベル16以外の技をすべて覚えているということである。
技レベル14・技レベル13も「覚えた」という扱いになっているのである。
この場合は、該当レベルにレベルアップした際、技習得処理をした、というチェックのようなものだと考えれば良いのだろう。
なお、「キャラのレベル以下の技レベルの技はすべて習得済みになる」という意味ではないことに注意。
功夫編の修行では例外が生じる。
上で技一覧を掲載したサモの場合、レベル5で修行を開始し、かつ、修行で「竜虎両破腕」を覚えさせずに「シマリス脚」を習得させてレベル6になったとする。
この時、修行以外でレベルアップしたのなら、「竜虎両破腕」をレベルアップ習得する。
だが、修行の場合は、レベル6に上がった時に「シマリス脚」を習得したので、
%0000 0100 0011 1111
このように、既に習得済みの下6桁+「シマリス脚」の部分だけ1が立ち、シナリオ別キャラデータに記録される。
修行後は通常のレベルアップで技を覚えていくが、修行終了時のレベルが6で、レベルが7に上がった時、本来レベル7で覚える「百里道一歩脚」ではなく、「0が入っている一番下の桁に対応した技」を覚える。
つまり、本来レベル6で覚える「竜虎両破腕」を覚えて、
%0000 0100 0111 1111
となる。
レベル7になったからといって、レベル6・レベル7に対応した技2種を同時に習得はしてくれない。
このズレが最終的に、功夫編の修行バグに繋がる。
話が少々ずれたが、とにかく、
「シナリオ別キャラデータの$0D番目と$0E番目に、習得済み技が記録されている」
ということが重要である。
レベルアップ時のステータス上昇値では、ステータスアップ処理として$C1/24C5まで紹介したが、その直後から、レベルアップ時における技習得の処理を行っている。
$C1/24C5 STA $0010,y[$00:0F59] ;Aを[$0010,y](シナリオ別キャラデータ 該当ステータス(ステータス+装備上昇分))に書き込み ;ここまでステータスアップ処理 ; $C1/24C8 INX ;Xをインクリメント +1 $C1/24C9 INY ;Yをインクリメント +1 $C1/24CA INY ;Yをインクリメント +1 $C1/24CB INY ;Yをインクリメント +1 $C1/24CC DEC $08 [$00:0308] ;[$00:0308]をデクリメント -1 $C1/24CE BNE $BB [$248B] ;ゼロフラグが立っていないとき[$248B]分岐 $C1/24D0 PLY ;Yレジスタにスタックからプル $C1/24D1 PLX ;Xレジスタにスタックからプル $C1/24D2 STX $1E [$00:031E] ;Xを[$00:031E]に書き込み $C1/24D4 LDA $0006,y ;Aに[$0006,y](シナリオ別キャラデータ$06 レベル)をロード $C1/24D7 CMP #$10 ;Aと$10を減算比較(ステータスレジスタ変更のみ) $C1/24D9 BCC $26 [$2501] ;キャリーフラグが立っていないとき[$2501]分岐
$C1/24C8~$C1/24D2は、シナリオ別キャラデータのレベルの値が入ったアドレスの計算用の処理なので、説明は省く。
$C1/24D4で呼び出された[$0006,y]は、シナリオ別キャラデータのレベルの値が入ったアドレスであり、既にレベルアップ処理の後なので、戦闘前のレベル+1にあたる、レベルアップ後の値が入っている。
$C1/24D7は、レベルアップ後の値と$10を比較している。10進数だと「16」である。
キャリーフラグが立つのは、減算の結果が0か正の数の時なので、レベルが16以上の時。
キャリーフラグが立たないのはレベルが15以下の時である。
つまりレベルアップ後のレベルが16以上と16未満とでは処理が分岐するのだが、まずはレベルが16以上の場合を見てみよう。
;キャリーフラグON時分岐(レベルが16以上) $C1/24DB LDA $0A00 [$00:0A00] ;Aに[$00:0A00](プレイ中のシナリオ)をロード $C1/24DE CMP #$03 ;Aと$03(功夫編)を減算比較(ステータスレジスタ変更のみ) $C1/24E0 BEQ $1E [$2500] ;ゼロフラグが立っているとき[$C1/2500]分岐 $C1/24E2 REP #$21 ;Aを16bit幅に変更、キャリーフラグクリア $C1/24E4 LDA #$8000 ;Aに$8000をロード $C1/24E7 STA $20 [$00:0320] ;Aを[$00:0320]に書き込み $C1/24E9 TXA ;Xレジスタの値をAレジスタに転送 $C1/24EA ADC #$000F ;A + $000F $C1/24ED TAX ;Aレジスタの値をXレジスタに転送 $C1/24EE SEP #$20 ;MフラグON Aレジスタは8bit幅 $C1/24F0 LDA $D50005,x ;Aに[$D50005,x](レベル16で覚える技ID)をロード $C1/24F4 STA $6A [$00:036A] ;Aを[$00:036A]に書き込み $C1/24F6 BEQ $08 [$2500] ;ゼロフラグが立っているとき[$2500]分岐 $C1/24F8 LDA $000E,y ;Aに[$000E,y](覚えた技(上位バイト))をロード $C1/24FB BMI $03 [$2500] ;ネガティブフラグが立っているとき[$2500]分岐 $C1/24FD BRL $0037 [$2537] ;フラグにかかわりなく常に分岐[$2537] $C1/2500 RTS ;サブルーチン戻り
まず、[$00:0A00]の値をロードしているが、このアドレスにはプレイ中のシナリオの値が入っている。
次で$03と比較しているが、$03は功夫編のことである。
もし功夫編だったらゼロフラグが立つので、$C1/2500にジャンプする。
その$C1/2500は上の処理の一番最後にあることからわかるとおり、$C1/24DE~$C1/24FDの処理を飛ばしている。
これは、「功夫編では、レベル16以上にレベルアップしても、技を習得する処理を行わない」ということを意味している。
要するに、功夫編で弟子3人がレベル16以上にレベルアップしても「旋牙連山拳」を習得させないための処理になる。
功夫編以外のシナリオでは$C1/24E2~の処理が入る。
レベルアップしたキャラがレベル16で覚える技IDが、$C1/24F0で[$D50005,x]からAにロードされ、更に[$00:036A]に書き込まれる。
もしレベル16で覚える技IDが$00なら、レベル16で覚える技はなしと設定されているキャラになるため、$C1/24F6でゼロフラグが立って処理終了、$C1/2500へジャンプする。
更に、$C1/24F8で、シナリオ別キャラデータの、覚えた技が入っているアドレスの中で上位バイトのアドレスをロードする。
ここには、技08~15の習得状態が8ビットに入っており、一番上の1ビットが、レベル16で覚える最後の技15の習得状況で、覚えていれば1が入っている。
つまり、レベル16で覚える技を既に覚えている場合、8ビットの一番上の桁は1であるから、符号つき8ビットで考えると負の数であり、ネガティブフラグが立つ。
要するに、$C1/24FBでネガティブフラグが立っているかどうか判定しているのは、「レベル16で覚える技を覚えているかどうか」の判定である。現代編や幕末編で、レベル16に対応した技をラーニング済みであれば、ネガティブフラグが立つことになる。
ネガティブフラグが立っていれば$C1/2500にジャンプ。
ここまでで、「レベルが16以上に上がった」かつ「功夫編ではない」かつ「レベル16で覚えている技を未習得」である場合は、レベル16で習得できる技IDを[$00:0320]に書き込んだ上で、$C1/24FDにたどりついて、$C1/2537にジャンプすることがわかる。
一方、それ以外だと、$C1/2500でサブルーチンが終了する。つまりレベルアップ時に新たな技を覚えない。
この処理から、シナリオは関係なく、「レベルアップでレベル16以上になった時、レベル16で覚える技を覚えていなかった場合は、レベル16で覚える技を習得する」ということもわかる。
この仕組みがあるため、功夫編で弟子をレベル16以上に育成した上で最終編に再登場した際、最終編でレベル17以上にレベルアップした時に、「旋牙連山拳」を覚えることが可能なのである。
ただし功夫編でレベルを99まで上げていると、最終編でレベルアップの機会がないので、「旋牙連山拳」は覚えられない。
(功夫編でレベルを99まで上げるケースは通常プレイの範囲ではまずないため、このような処理にしたのだろう)
問題は、
「レベルアップでレベル16以上になった時、レベル16未満で覚える技を覚えていなかった場合は、該当する技を習得する」
という処理は残念ながらない、ということである。
功夫編の修行で技の習得に抜けがあると、この罠のためにすべての技を覚えられないことになる。
では、話を戻して、$C1/24D9でキャリーフラグが立たない、つまりレベルアップ後のレベルが15以下の時の処理にあたる$C1/2501~を見てみる。
Aにはレベルの値が入った状態である。
上で$C1/2500に到達した分岐は、ここ以降の処理には飛ばない。
$C1/2501 CMP #$0F ;Aと$0Fを減算比較(ステータスレジスタ変更のみ) $C1/2503 BCC $03 [$2508] ;キャリーフラグが立っていないとき[$2508]分岐 ;キャリーフラグON = レベル15 $C1/2505 BRL $004B [$2553] ;フラグにかかわりなく常に分岐[$2553] ;キャリーフラグOFF $C1/2508 STA $08 [$00:0308] ;Aを[$00:0308]に書き込み $C1/250A STZ $09 [$00:0309] ;[$00:0309]に$00を書き込み $C1/250C REP #$20 ;Aを16bit幅に変更、Mフラグをクリア $C1/250E LDA $000D,y ;Aに[$000D,y+1][$000D,y](覚えた技・2バイト)をロード $C1/2511 ORA #$8000 ;Aと$8000で論理和 $C1/2514 STA $10 [$00:0310] ;Aを[$00:0310]に書き込み $C1/2516 LDA #$0001 ;Aに$0001をロード $C1/2519 STA $20 [$00:0320] ;Aを[$00:0320]に書き込み
$C1/2501は$0F、つまり10進数15との減算比較である。
先に$10と減算比較しており、この処理に進んでいる時点でレベル15以下ということだから、ここでキャリーフラグが立つのはレベル15の時のみである。
キャリーフラグが立たないのはレベル14以下である。
設定上、どのキャラもレベル15で覚える技はない(設定自体ない)。
よってキャリーフラグが立つ場合は$C1/2505に進み、$C1/2553にジャンプすることで、これ以降の技習得処理をスキップする。
ちなみに飛び先は
$C1/2553 RTS ;サブルーチン戻り
なので、現在のサブルーチンが終了になる。
$C1/2508以降は、レベルにより覚える技を計算するための前準備になる。
$C1/2508で、レベルの値が[$00:0308]に入る。
[$00:0309]には$00が入り、$C1/250Cで16bitモードになるので、[$00:0308]をロードする場合は[$00:0309][$00:0308]と、上に00がついたレベルの値を呼び出すことになる。
$C1/250Eで、シナリオ別キャラデータから、キャラが既に覚えている技(シナリオ別キャラデータ$0D番目と$0E番目)を2バイトで呼び出す。
$C1/2511で、この値と$8000 = %1000 0000 0000 0000で論理和を取っている。
習得済みの技2バイトは、2進数16ビットだと、下の位から順にレベル00、レベル01、……の技に対応している。
最初にも紹介したサモの場合なら、初期レベルが5で、最初から6種類の技を使えるから、シナリオ別キャラデータの習得技は
%0000 0000 0011 1111
である。
$8000と論理和を取ると、既に覚えている技+レベル16にあたる一番上の桁に「1」が立つことになる。
サモの場合は、
%1000 0000 0011 1111
になる。
この値は[$00:0311][$00:0310]に書き込まれる。
更に、$0001が、[$00:0321][$00:0320]に書き込まれて、ループ処理が開始になる。
;ループ処理ここから $C1/251B LSR $10 [$00:0310] ;[$00:0311][$00:0310]を論理右シフト (/2) $C1/251D BCC $0E [$252D] ;キャリーフラグが立っていないとき[$252D]分岐 $C1/251F INX ;Xをインクリメント +1 $C1/2520 ASL $20 [$00:0320] ;[$00:0321][$00:0320]を算術左シフト *2 $C1/2522 DEC $08 [$00:0308] ;[$00:0309][$00:0308]をデクリメント -1 $C1/2524 BNE $F5 [$251B] ;ゼロフラグが立っていないとき[$251B]分岐 ;ループ処理ここまで
ループ処理では、まず、[$00:0311][$00:0310]を論理右シフトしている。
つまり÷2であり、2進数でみれば右に値が1つずつずれる。
先のサモの例でいえば、
%1000 0000 0011 1111
が、論理右シフトにより、
%0100 0000 0001 1111
このようになり、一番下の桁が1の時に÷2したので、余りが出てキャリーフラグが立つ。
つまり、一番下の桁が0なら、$C1/251Dでキャリーフラグが立っていないという判定になるから、$C1/252D]にジャンプしてループを抜ける。
1が立っていないということは該当レベルの技を覚えていないということである。
一方、1が立つ場合は該当レベルの技は習得済みである。
ループ1回目の判定は、レベル00の技を習得しているかどうかだから、通常、どのキャラも習得済み扱いで、$C1/251Fに進むはずである。
$C1/251FでXをインクリメントした後、[$00:0321][$00:0320]を算術左シフトしている。
[$00:0321][$00:0320]の初期値は$0001 = %0000 0000 0000 0001だから、この処理を通ると、一番右に立っていた1が左へ1つずつ移動していくことになる。
つまりループ処理回数分、「1」が左に動く。
更に、[$00:0309][$00:0308]をデクリメントする。ここに入っているのはレベルの値であり、-1してゼロフラグが立つまでループを繰り返す、ということが上の処理からわかる。
結局、この判定で何をしているかというと、習得済みの技一覧から、未習得の技の中で一番低いレベルの技を検索しているのである。
また、ループ回数=レベルの値と決まっているから、例えばサモが修行以外で初期レベルの5から6に上がった時は$C1/2524でループを抜ける。
だが、例えば、ユンが修行で「竜虎両破腕」(通常のレベルアップだと、レベル2で習得)を覚えないまま修行を終えて、修行後にレベルが5から6に上がった時はどうなるか。
修行で「百里道一歩脚」「獅子の手」「山猿拳」を覚えていたら、ユンの習得状況に$8000との論理和を取っていたら、
%1000 0000 0011 1011
こうなっているはずだ。
このため、上のループの処理を通ると、ループ2周目で$C1/251DのキャリーフラグがOFFだから、ループを抜ける。
この後に、ユンはレベル6に上がったのに、レベル2で覚える「竜虎両破腕」の習得処理を行うことになる。
このループ処理がレベル16以上でも行われるのなら、修行で覚えそこねた技があっても、レベル16以上のレベルアップ時に習得できる。
だが、先に記した通りに、
このように処理されるので、心山拳師範は、修行で技の習得抜けがあると、「旋牙連山拳」以外の上位の技が覚えられなくなる。
「旋牙連山拳」以外は、レベルに対応した技を覚えるのではなく、下位レベルの技から順に習得する処理が入るためである。
何はともあれ、以下にループ以降の処理を記す。
;$C1/2524でゼロフラグが立った時の処理 $C1/2526 LDA $10 [$00:0310] ;Aに[$00:0311][$00:0310]をロード $C1/2528 BIT #$0001 ;Aと$0001で論理積(ステータスフラグ変更のみ) $C1/252B BNE $24 [$2551] ;ゼロフラグが立っていないとき[$2551]分岐 ;$C1/251Dでキャリーフラグが立たない時の飛び先(ここで合流) $C1/252D SEP #$20 ;MフラグON Aレジスタは8bit幅 $C1/252F LDA $D50005,x ;Aに[$D50005,x]をロード $C1/2533 STA $6A [$00:036A] ;Aを[$00:036A]に書き込み $C1/2535 BEQ $00 [$2537] ;ゼロフラグが立っているとき[$2537]分岐 $C1/2537 REP #$20 ;Aを16bit幅に変更、Mフラグをクリア $C1/2539 LDA $000D,y ;Aに[$000D,y+1][$000D,y](覚えた技・2バイト)をロード $C1/253C ORA $20 [$00:0320] ;Aと[$00:0321][$00:0320]で論理和 $C1/253E STA $000D,y ;Aを[$000D,y+1][$000D,y](覚えた技・2バイト)に書き込み
$C1/2526~は、ループ処理回数がレベルの値と同じだった時にあたる。
先のサモの例でいえば、修行以外でレベル5から6に上がる時、
%1000 0000 0011 1111
が、6回右シフトして、
%0000 0010 0000 0000
このようになっている。
つまり、レベル6で覚える値が入るビットが一番右に来ており、未習得なら0が入っているはずである。
だが、例えば高原が現代編にてラーニングで技を習得していた場合、最終編にてレベル6で覚えるのは「C.H.ホールド」だが、ラーニング済みなら一番右のビットは1が入っていることになる。
そして、次の$C1/2528で$0001と論理積をとり、ゼロフラグが立つか確認をしているから、
「レベルアップしたレベルで覚える技を、既に習得しているかどうか」
という判断がされていて、既に習得済みならゼロフラグが立たないので、この後の技習得処理が飛ばされる。
これは同じくラーニングやイベントで技を覚えられる、幕末編のおぼろ丸やカラクリ丸でも起こる処理である。
だが、条件からして、功夫編の修行で技を覚え損なった場合には関係がない。
ユンが本来レベル2で覚える「竜虎両破腕」を修行で覚えずにレベル2以上に上がった場合、それ以上のレベルでは「竜虎両破腕」の判定をしてくれなくなるからである。
そもそも、この場合はループ途中の$C1/251Dでキャリーフラグが立たないために$C1/252Dにジャンプしているため、処理自体関係がない。
その$C1/252D~は、$C1/252Bでゼロフラグが立った時及び、ループ途中の$C1/251Dでキャリーフラグが立たない時の飛び先になる。
ここからが技習得処理である。
計算は端折るが、この時点で[$D50005,x]に、これから習得する技のIDが入っている。ループ回数によってインクリメントされたXの値が対応している。
ただし、該当のレベルで覚える技がないキャラだと、[$D50005,x]には$00が入っている。
技を16種類覚えないキャラが該当し、例えばサンダウンならレベル12では何も覚えないし、ポゴはレベル10、12~14は習得技がないので$00で埋まる。
$C1/2535でゼロフラグ判定をしているため、本来なら、該当のレベルで覚える技がない、つまり$00だと、何か別処理をするつもりだったのかもしれない。
なのだが、$C1/2535でのニーモニックが、BEQ $00である。
これは「ゼロフラグが立っているとき、現在のアドレスに+$00したアドレスに分岐」という意味である。つまり飛び先アドレスは、現在のアドレスに何も加算していないのと同じである。
実質分岐先がないので、$C1/2535は「何もせず次の処理に進む」と同義なのである。
ということで、結局、技IDが$00でも$00でなくても、$C1/2537に進む。
$C1/2539~で、既に習得した技2バイト分のデータ[$000D,y+1][$000D,y]に、[$00:0321][$00:0320]を加算する。
[$00:0321][$00:0320]は初期値が%0000 0000 0000 0001で、ループ回数分、左シフトしている。
レベルアップしたレベルで覚える技を習得するなら、該当レベルのビットに1が立っていることになる。
サモの例でいえば、修行以外でレベル5から6に上がるなら、
[$00:0321][$00:0320] = %0000 0000 0100 0000
下から7桁目に1が立っており、技レベル06「竜虎両破腕」にあたる。
よって、$C1/253Cで[$000D,y+1]と[$000D,y][$00:0321][$00:0320]で論理和をとる(実質加算にあたる)と、技レベル06「竜虎両破腕」の部分に1が立って習得したことになる。
最後にこの論理和を[$000D,y+1][$000D,y]に新たにセットして、レベルアップによる習得技処理が終了する。
よって、覚えた技IDが$00、つまり「該当レベルに習得技がなかった」時でも、該当レベル部分に「1」が立つ。
最初にも記したが、オルステッドはレベル13とレベル14で習得する技がないにもかかわらず、該当レベルでは「技ID$00の技を覚えた」という扱いになっており、オルステッドをレベル14まで上げると、[$000D,y+1][$000D,y]に%0111 1111 1111 1111、つまりそれぞれのアドレスに$FFと$7Fが入るという仕組みである。
以上の仕様から、功夫編での技習得バグがなぜ起こるのかが理解できる。
これまでの繰り返しになるが、まとめておく。
現代編や幕末編のラーニングでも、功夫編の修行のように、キャラの現在のレベルよりも高レベルで覚える技をラーニングで習得できる。
おぼろ丸が、本来レベル12で習得する「忍法火の鳥」を、ラーニング習得して、レベル10で幕末編をクリアしたとしても、最終編ではレベル11以降の技を順に覚えていく(レベル12に上がった時の技習得処理が飛ばされるのみ)。
高原の場合、現代編でラーニング可能な技は最終編でレベルアップした時でも覚えるが、現代編クリア時のレベルが必ず2であり、ラーニングできなかった技はレベル3以上のレベルアップで順に覚えていくことになる。
というように、ラーニングやイベント習得以外の技は該当レベルできちんと覚えていくので、問題は起こらない。
だが、功夫編の弟子たちの場合、修行中にレベルアップが起きた時に、レベルアップによる技習得が行われず、逆ラーニングの技習得しか行われない。
修行が終わった後のレベルアップでは、「レベルアップしたレベルよりも下位で覚える技を習得していない時、最も下位の技から1つずつ習得」という処理が、レベル14まで行われる。
レベル15に上がった時には、全キャラ共通で、レベルアップによる技習得処理がスキップ。
レベル16以上では、「旋牙連山拳を覚えていない場合、旋牙連山拳を習得」という処理しか行われない。
このため、修行中、レベルアップ時に必ず何かの技を覚えておかないと、最終的にレベル14に上がった時に、本来レベル14(修行次第ではそれ以下のレベルも)で覚える技が覚えられない、という事態が生じる。
しかも、ユンとサモは、修行で反撃専用の「不射の射」を覚えられないこともあり、特にユンは低レベルで修行を開始し修行を集中させた場合、修行終了までに「レベルアップ時、何の技も覚えられない」という事態に陥りやすい。
最終編でユンが「西安破裏拳」を覚えてくれなかったが「旋牙連山拳」は使える、というような場合は修行バグに引っかかっていることになる。
リメイク版では、功夫編の修業後は、レベルアップ時に、「レベルアップ時、キャラのレベルより低いレベルで覚える技を覚えていないのならそれを1種類、更に本来そのレベルで覚える技を1種類」というように習得できるようになった。
これにより、技習得バグは起こらないようになった。
また、功夫編をレベル16以上でクリアすると、最終編を開始した直後に「旋牙連山拳」を習得している。
通常プレイではまずない事態ではあったが、レベル99で功夫編をクリアすると「旋牙連山拳」が習得できないというバグも発生しないようになっている。
リメイク版はそもそも、修業後に竹林で虎が出現しなくなるため、高レベルクリアがかなりやりにくい環境になっている。レベル99で功夫編をクリアを目指すのなら、修業前に弟子のレベルを98くらいまでは上げなければならなくなるため、SFC版以上の難易度のやりこみと化している。