OSDN Git Service

Merge branch 'Feature/Version-Expression' into develop/3.0.0.1Alpha
[hengband/hengband.git] / src / mspell / mspell-damage-calculator.c
index cfbe36e..0c7396e 100644 (file)
@@ -1,10 +1,11 @@
 #include "mspell/mspell-damage-calculator.h"
-#include "floor/floor.h"
+#include "inventory/inventory-slot-types.h"
 #include "game-option/birth-options.h"
 #include "monster-race/monster-race.h"
 #include "monster-race/race-flags2.h"
 #include "monster/monster-status.h"
-#include "mspell/monster-spell.h"
+#include "system/floor-type-definition.h"
+#include "system/object-type-definition.h"
 
 /*!
  * @brief モンスターの使う呪文の威力を決定する /
@@ -400,9 +401,44 @@ static HIT_POINT monspell_damage_base(
 }
 
 /*!
+ * @brief モンスターの使う射撃のダイス情報を返す /
+ * @param r_ptr モンスター種族への参照ポインタ
+ * @param dd ダイス数への参照ポインタ
+ * @param ds ダイス面への参照ポインタ
+ * @return なし
+ */
+void monspell_shoot_dice(monster_race *r_ptr, int *dd, int *ds)
+{
+    int p = -1; /* Position of SHOOT */
+    int n = 0; /* Number of blows */
+    const int max_blows = 4;
+    for (int m = 0; m < max_blows; m++) {
+        if (r_ptr->blow[m].method != RBM_NONE)
+            n++; /* Count blows */
+
+        if (r_ptr->blow[m].method == RBM_SHOOT) {
+            p = m; /* Remember position */
+            break;
+        }
+    }
+
+    /* When full blows, use a first damage */
+    if (n == max_blows)
+        p = 0;
+
+    if (p < 0) {
+        (*dd) = 0;
+        (*ds) = 0;
+    } else {
+        (*dd) = r_ptr->blow[p].d_dice;
+        (*ds) = r_ptr->blow[p].d_side;
+    }
+}
+
+/*!
  * @brief モンスターの使う呪文の威力を返す /
  * @param target_ptr プレーヤーへの参照ポインタ
- * @param SPELL_NUM 呪文番号
+ * @param ms_type 呪文番号
  * @param m_idx 呪文を唱えるモンスターID
  * @param TYPE  DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
  * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
@@ -412,19 +448,18 @@ HIT_POINT monspell_damage(player_type *target_ptr, monster_spell_type ms_type, M
     floor_type *floor_ptr = target_ptr->current_floor_ptr;
     monster_type *m_ptr = &floor_ptr->m_list[m_idx];
     monster_race *r_ptr = &r_info[m_ptr->r_idx];
-    int hp;
     DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
-    int shoot_dd = r_ptr->blow[0].d_dice;
-    int shoot_ds = r_ptr->blow[0].d_side;
+    HIT_POINT hp = (TYPE == DAM_ROLL) ? m_ptr->hp : m_ptr->max_maxhp;
+    int shoot_dd, shoot_ds;
 
-    hp = (TYPE == DAM_ROLL) ? m_ptr->hp : m_ptr->max_maxhp;
+    monspell_shoot_dice(r_ptr, &shoot_dd, &shoot_ds);
     return monspell_damage_base(target_ptr, ms_type, hp, rlev, monster_is_powerful(floor_ptr, m_idx), shoot_dd, shoot_ds, 0, TYPE);
 }
 
 /*!
- * @brief モンスターの使う呪文の威力を返す /
+ * @brief モンスターの使う所属としての呪文の威力を返す /
  * @param target_ptr プレーヤーへの参照ポインタ
- * @param SPELL_NUM 呪文番号
+ * @param ms_type 呪文番号
  * @param r_idx 呪文を唱えるモンスターの種族ID
  * @param TYPE  DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
  * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
@@ -432,12 +467,12 @@ HIT_POINT monspell_damage(player_type *target_ptr, monster_spell_type ms_type, M
 HIT_POINT monspell_race_damage(player_type *target_ptr, monster_spell_type ms_type, MONRACE_IDX r_idx, int TYPE)
 {
     monster_race *r_ptr = &r_info[r_idx];
-    int rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
+    DEPTH rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
     bool powerful = r_ptr->flags2 & RF2_POWERFUL ? TRUE : FALSE;
-    u32b hp = r_ptr->hdice * (ironman_nightmare ? 2 : 1) * r_ptr->hside;
-    int shoot_dd = r_ptr->blow[0].d_dice;
-    int shoot_ds = r_ptr->blow[0].d_side;
+    HIT_POINT hp = r_ptr->hdice * (ironman_nightmare ? 2 : 1) * r_ptr->hside;
+    int shoot_dd, shoot_ds;
 
+    monspell_shoot_dice(r_ptr, &shoot_dd, &shoot_ds);
     return monspell_damage_base(target_ptr, ms_type, MIN(30000, hp), rlev, powerful, shoot_dd, shoot_ds, 0, TYPE);
 }