2015-08-28−2

で、Wizardryなんだけども、戦闘の処理って↓のことを全部しないといけないみたい。

えー無理とか思うけどもすごい量だ。ひでまるの内容をコピペしたらガタガタになったけど直す気力も起きない量だ。問題は行動順のソート処理だ。普段jsとかphpとかのスクリプト言語しか触ってないと、アルゴリズムを使うって感覚が抜け落ちていくので、こんな簡単なこともよくわからなくなってくる。イカンですよ。いかんね。

 

戦闘開始手順
1.参加メンバーの確定
 1.PT内でステータス異常にかかっていない者のLV合計算出
 2.ステータス異常にかかっていない敵のLV合計算出
 3.PT生存者数算出
 4.敵グループの生存者数算出 unsigned char[4]
 5.敵グループのMAGE呪文LV算出 unsigned char[4]
 6.敵グループのPRIEST呪文LV算出 unsigned char[4]
 7.メイン敵ID決定(画像を表示するモンスター)
 8.敵グループのモンスターID決定
 9.PTキャラのタイプ別打撃防御フラグ決定 int[6]
 10.PTキャラの命中力決定 unsigned char[6]
 11.PTキャラのクリティカルフラグ決定 unsigned char[6]
 12.PTキャラのヒーリング値決定 char[6]
 13.PTキャラの攻撃回数決定 unsigned char[6]
 14.PTキャラの属性抵抗 unsigned char[6]
 15.PTキャラのステータス unsigned char[6]
 16.敵のステータス unsigned char[4][9]
    ※存在しない敵は0xFF
 17.味方/敵のHP int[42]
 18.味方/敵の最大HP int[42]
 19.味方/敵のLV unsigned char[42]
    ※0xFFを超える場合は0xFFに補正
 20.戦闘時の行動ID unsigned char[42]
 21.戦闘時の行動順位 unsigned char[42]
 22.敵のAC char[36]
 23.PTキャラクタの攻撃対象グループ番号 unsigned char[6]
 24.運勢値1 unsigned char[6]
 25.運勢値2 unsigned char[6]
 26.運勢値3 unsigned char[6]
 27.運勢値4 unsigned char[6]
 28.運勢値5 unsigned char[6]
 29.PTキャラのタイプ別倍打 int[6]
 30.PTキャラがドレインを受けたかどうかのフラグ unsigned char[6]
    0 = 受けてない、1 = 受けた
 31.PTキャラレベル int[6]
 32.PTキャラのPOISON値 unsigned char[6]
 33.PTキャラのキャラデータアドレスの上位バイト(0x60 + 訓練所内ID)
 34.エンカウント種類: 0:徘徊(廊下), 1:徘徊(室内),2:玄室
2.先制パーティの決定
3.プレイヤーパーティの行動決定
4.行動順決定
5.敵行動(1体ごと処理)
 1.攻撃対象決定
 2.PT先制(モンスターを驚かした)の時は処理しない
 3.敵先制(モンスターに驚かされた)でない場合、呪文を唱えるかどうかを決定
  1.唱える場合、どの呪文にするかを決定
  2.所属グループのMAGE LVを調べ、0でなければMAGE呪文を唱えるかどうかの判定を行う
   1.モンスタータイプが魔術師なら100%、それ以外の場合は75%の確立でMAGE呪文を唱える
  3.MAGE呪文を唱えない場合、所属グループのPRIEST LVを調べ、0でなければPRIEST呪文を唱えるかどうかの判定を行う
   1.モンスタータイプが僧侶なら100%、それ以外の場合は75%の確立でMAGE呪文を唱える
  ※先にMAGE呪文判定を行うので、僧侶タイプでもMAGE呪文を唱える可能性がある!
  4.使用呪文の決定
   1.呪文LV低下判定を行う。
     (呪文LV低下率)=1 / ((グループ生存者数)+2)
   2.判定に引っかかった場合、対応する種類(MAGE/PRIEST)の呪文LVが1減少する。この結果呪文LVが0になった場合は、LV1に補正し、
     ブレス判定に移る(そのターンでは呪文を唱えない)
   3.使用する呪文LVを決定する
     (使用呪文LV)=(所属グループの呪文LV)とし、77/256の確立で使用呪文LVをデクリメントし続ける。LV0になった場合はLV1に補正する
   4.使用する呪文を決定する
MAGE呪文
LV 呪文1 (85/256) 呪文2 (171/256)
1 KATINO HALITO
2 DILTO SOPIC
3 MOLITO MAHALITO
4 DALTO LAHALITO
5 LAHALITO MADALTO
6 MADALTO ZILWAN
7 TILTOWAIT TILTOWAIT

PRIEST呪文
LV 呪文1 (85/256) 呪文2 (171/256)
1 BADIOS BADIOS
2 MONTINO MONTINO
3 BADIOS BADIAL
4 BADIAL BADIAL
5 BADIALMA BADI
6 LORTO MABADI
7 MABADI MABADI
     上記の確立によって決定する.

 4.ブレスを吐くかどうか決定
  1.ブレス属性が0でない場合、153/256の確立でブレスを吐く
 5.仲間を呼ぶかどうか決定
  1.仲間を呼ぶフラグを持っていて、所属グループの生存者数が6以下の場合、75%の確立で仲間を呼ぶ
 6.逃走するかどうか決定
  1.逃走フラグを持っていて、
    ・(敵の合計LV) < (PTの合計LV)
    ※グループごとではなく、固体単位での合計
    ※ステータス異常の者のLVは加えない
   ならば、166/256の確立で逃走する。
 7.打撃攻撃を行うかどうかを決定
  1.グループ内後方に位置する敵は攻撃しない可能性がある
敵第 1 グループの 5~9 体目は 5/10 の確率で攻撃しない
敵第 2 グループの 4~9 体目は 4/10 の確率で攻撃しない
敵第 3 グループの 3~9 体目は 3/10 の確率で攻撃しない
敵第 4 グループの 2~9 体目は 2/10 の確率で攻撃しない
2.攻撃対象を決定する。乱数で決定してあるが、後衛には攻撃できないので、後衛n人目は前衛n人目に読み替える
3.タイプ別打撃防御判定を行う。攻撃対象がモンスタータイプに対する打撃防御を持っている場合、50%の確立で攻撃を行わない。
    攻撃対象者の全装備品(呪い、アライメント不一致含む)のタイプ別打撃防御のORとなる。
 8.ここまでで行動が決定しない場合はPARRYを行う