Wizardry(NES) 解析 - 敵への打撃攻撃

FIGHTコマンドによる敵への打撃攻撃について。

対象決定

指定した敵グループ内でDEAD未満の状態にある者のうち先頭にいるものが攻撃対 象となる(この処理は実際に攻撃を行う時点で行われる)。グループ内の全員がDEAD以 上の状態ならば何も起こらない。

命中力

命中率に寄与する要素のうちPTキャラ側に属するものを「命中力」と呼称する。

命中力はキャラの職業、LV, STR, 装備に依存し、次式で表される:

(命中力) = (LVボーナス) + (STRボーナス) + (全装備品のST値合計)

ここで、LVボーナスは

である(ただし、LVが 0xFF を超える場合は 0xFF として計算する)。STRボーナス は

である。装備品については、アラインメントが一致していない場合ST値を -1 と して扱う(それ以外の呪い装備はST値をそのまま使う)。

命中力が負になった場合はそのまま負として扱う。

命中率

攻撃1回ごとに命中判定が行われる。攻撃1回当たりの命中率は攻撃者の命中力、 攻撃対象グループ番号、攻撃対象のACに依存す る。まず、「命中判定値」を以下のように定義する:

(命中判定値) = 19 + (グループ番号) - (AC) - (命中力)
※負になったら0に、19を超えたら19に補正

このとき、攻撃1回当たりの命中率は次式で表される:

(命中率) = (19-(命中判定値)) / 20

つまり、命中判定値が19ならば攻撃は決して命中しない。また、命中率は最大 19/20 である。

命中判定値の計算ではオーバーフロー/アンダーフローが考慮されていないが、各 種データを見る限りオーバーフロー/アンダーフローが発生することはないはず。

攻撃回数

攻撃回数はキャラの職業、LV, 装備武器のAT値に依存し、以下のように決まる:

ただし、LVによる攻撃回数は10が上限。なお、武器AT値に関しては上限がないの で、AT値が10を超える武器を装備していれば10回を超える攻撃が可能(実際にはそん な武器はないが)。

ダメージ

攻撃が1回命中するごとにダイスを振ってダメージを計算し、その合計がダメージ となる。その際のダイス式は攻撃者のSTRと装備武器に依存し、以下のようになる:

(ダイス個数) = (武器のダイス個数)
(ダイス面数) = (武器のダイス面数)
(ダイス追加値) = (武器のダイス追加値) + (STRボーナス)

ここで、STRボーナスは STR >= 16 の場合 STR-15, それ以外の場合は0。また、 素手は 2d2 の武器として扱う。

なお、職業がNINJAであっても素手のダメージダイス式には影響しない。

倍打

倍打条件を満たした場合、ダメージの項で得られたダメージが更に2倍になる。倍打条件は

のいずれか(両方を満たしてもダメージは2倍のまま)。ただし、モンスタータイプ による倍打判定処理にはバグがあり、誤ったアドレスの値をタイプ別倍打として使っ てしまう。これについては以下で詳しく述べる。

本来は攻撃者の全装備品(呪われていたりアラインメント不一致でも構わない)の タイプ別倍打の論理和が使われるべきなのだが、バグのため「攻撃対象の位置」に依 存した値がタイプ別倍打として使われてしまう。以下に対応表を示す(位置 (a,b) は 「敵第aグループ目のb体目」を表す。また、ドレインフラグは既にドレインを受けて いる場合1, そうでない場合0。訓練所内IDはキャラの訓練所内での番号 (0-origin)):

位置タイプ別倍打1Byte目タイプ別倍打2Byte目
(1,1)PT1人目の(本来の)タイプ別倍打2Byte目PT1人目のドレインフラグ
(1,2)PT2人目の(本来の)タイプ別倍打2Byte目PT2人目のドレインフラグ
(1,3)PT3人目の(本来の)タイプ別倍打2Byte目PT3人目のドレインフラグ
(1,4)PT4人目の(本来の)タイプ別倍打2Byte目PT4人目のドレインフラグ
(1,5)PT5人目の(本来の)タイプ別倍打2Byte目PT5人目のドレインフラグ
(1,6)PT6人目の(本来の)タイプ別倍打2Byte目PT6人目のドレインフラグ
(1,7)PT1人目のドレインフラグPT1人目のLV下位Byte
(1,8)PT2人目のドレインフラグPT2人目のLV下位Byte
(1,9)PT3人目のドレインフラグPT3人目のLV下位Byte
(2,1)PT4人目のドレインフラグPT4人目のLV下位Byte
(2,2)PT5人目のドレインフラグPT5人目のLV下位Byte
(2,3)PT6人目のドレインフラグPT6人目のLV下位Byte
(2,4)PT1人目のLV下位BytePT1人目のLV上位Byte
(2,5)PT2人目のLV下位BytePT2人目のLV上位Byte
(2,6)PT3人目のLV下位BytePT3人目のLV上位Byte
(2,7)PT4人目のLV下位BytePT4人目のLV上位Byte
(2,8)PT5人目のLV下位BytePT5人目のLV上位Byte
(2,9)PT6人目のLV下位BytePT6人目のLV上位Byte
(3,1)PT1人目のLV上位BytePT1人目のAC
(3,2)PT2人目のLV上位BytePT2人目のAC
(3,3)PT3人目のLV上位BytePT3人目のAC
(3,4)PT4人目のLV上位BytePT4人目のAC
(3,5)PT5人目のLV上位BytePT5人目のAC
(3,6)PT6人目のLV上位BytePT6人目のAC
(3,7)PT1人目のACPT1人目のPOISON値
(3,8)PT2人目のACPT2人目のPOISON値
(3,9)PT3人目のACPT3人目のPOISON値
(4,1)PT4人目のACPT4人目のPOISON値
(4,2)PT5人目のACPT5人目のPOISON値
(4,3)PT6人目のACPT6人目のPOISON値
(4,4)PT1人目のPOISON値0x60 + (PT1人目の訓練所内ID)
(4,5)PT2人目のPOISON値0x60 + (PT2人目の訓練所内ID)
(4,6)PT3人目のPOISON値0x60 + (PT3人目の訓練所内ID)
(4,7)PT4人目のPOISON値0x60 + (PT4人目の訓練所内ID)
(4,8)PT5人目のPOISON値0x60 + (PT5人目の訓練所内ID)
(4,9)PT6人目のPOISON値0x60 + (PT6人目の訓練所内ID)

このタイプ別倍打に関するバグは、該当コード PRG #6 $B95B にお いて X に攻撃対象の番号を代入したまま元に戻していないのが原因で 発生している。これを修正するには、$B963 の直前で

  ldx $027C

を行うようにすればよい(実際にはスペースが足りないので空き領域にサブルーチ ンを作成するなどの処置が必要だろう)。

なお、モンスタータイプの項目で述べた通り、 タイプ別倍打そのものも本来の値の1Byte目と2Byte目を入れ替えて処理されるので、 結果的に、PT内の n 人目が位置 (1,n) にいるタイプ0~7の敵を攻撃する場合は本来 の(制作者が意図していたであろう)倍打判定が行われることになる。

クリティカル

攻撃者が非0のクリティカルフラグを持つ場合、1回でも攻撃が命中するとクリティ カル判定が行われ、成功すると対象は即死する。

NINJAは常にクリティカルフラグを持つ。また、クリティカルフラグを付与する装 備品も存在する。ただし、アラインメントが一致しない装備品ではクリティカルフラ グは得られない。なお、NINJAがアラインメントの一致しない装備を持っていてもク リティカルフラグは失われない。

クリティカル成功率は攻撃者と対象のLVに依存する。まず、CLV = (攻撃者のLV) (上限 25) として成功率 CLV/50 の確率判定を行い、成功したら更に成功率 (24-(対 象のLV)) / 35 (負の場合は0%) の確率判定を行い、これも成功するとクリティカル が発動する。

以上より、MAELIFIC(LV 25)に対しては決してクリティカルが発動しない。 VAMPIRE LORD(LV 20)あたりも攻撃者のLVが低いと0%となる可能性もありそうだが未 調査(乱数値総当たり調査予定)。


Back