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下位Byte | PT1人目のLV上位Byte |
(2,5) | PT2人目のLV下位Byte | PT2人目のLV上位Byte |
(2,6) | PT3人目のLV下位Byte | PT3人目のLV上位Byte |
(2,7) | PT4人目のLV下位Byte | PT4人目のLV上位Byte |
(2,8) | PT5人目のLV下位Byte | PT5人目のLV上位Byte |
(2,9) | PT6人目のLV下位Byte | PT6人目のLV上位Byte |
(3,1) | PT1人目のLV上位Byte | PT1人目のAC |
(3,2) | PT2人目のLV上位Byte | PT2人目のAC |
(3,3) | PT3人目のLV上位Byte | PT3人目のAC |
(3,4) | PT4人目のLV上位Byte | PT4人目のAC |
(3,5) | PT5人目のLV上位Byte | PT5人目のAC |
(3,6) | PT6人目のLV上位Byte | PT6人目のAC |
(3,7) | PT1人目のAC | PT1人目のPOISON値 |
(3,8) | PT2人目のAC | PT2人目のPOISON値 |
(3,9) | PT3人目のAC | PT3人目のPOISON値 |
(4,1) | PT4人目のAC | PT4人目のPOISON値 |
(4,2) | PT5人目のAC | PT5人目のPOISON値 |
(4,3) | PT6人目のAC | PT6人目の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%となる可能性もありそうだが未 調査(乱数値総当たり調査予定)。