1 #include "system/angband.h"
2 #include "floor/floor.h"
3 #include "game-option/birth-options.h"
4 #include "monster-race/monster-race.h"
5 #include "monster-race/race-flags2.h"
6 #include "mspell/mspell-type.h"
7 #include "mspell/mspell-damage-calculator.h"
8 #include "mspell/monster-spell.h"
9 #include "monster/monster-status.h"
12 * @brief モンスターの使う呪文の威力を決定する /
14 * @param dice_num ダイス数
15 * @param dice_side ダイス面
18 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
19 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
21 static HIT_POINT monspell_damage_roll(HIT_POINT dam, int dice_num, int dice_side, int mult, int div, int TYPE)
25 dam += maxroll(dice_num, dice_side) * mult / div;
28 dam += dice_num * 1 * mult / div;
31 dam += damroll(dice_num, dice_side) * mult / div;
51 * @brief モンスターの使う呪文の威力を返す /
52 * @param target_ptr プレーヤーへの参照ポインタ (破滅の手用)
53 * @param SPELL_NUM 呪文番号
54 * @param hp 呪文を唱えるモンスターの体力
55 * @param rlev 呪文を唱えるモンスターのレベル
56 * @param powerful 呪文を唱えるモンスターのpowerfulフラグ
57 * @param shoot_dd 射撃のダイス数
58 * @param shoot_ds 射撃のダイス面
59 * @param shoot_base 射撃の固定威力値
60 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
61 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
63 static HIT_POINT monspell_damage_base(player_type* target_ptr, monster_spell_type ms_type, int hp, int rlev, bool powerful, int shoot_dd, int shoot_ds, int shoot_base, int TYPE)
65 HIT_POINT dam = 0, dice_num = 0, dice_side = 0, mult = 1, div = 1;
75 dam = (hp / 4) > 800 ? 800 : (hp / 4);
93 dam = ((hp / 3) > 1600 ? 1600 : (hp / 3));
96 dam = ((hp / 3) > 800 ? 800 : (hp / 3));
99 dam = ((hp / 6) > 550 ? 550 : (hp / 6));
103 dam = ((hp / 6) > 400 ? 400 : (hp / 6));
107 dam = ((hp / 6) > 450 ? 450 : (hp / 6));
110 dam = ((hp / 6) > 600 ? 600 : (hp / 6));
113 dam = ((hp / 6) > 500 ? 500 : (hp / 6));
116 dam = ((hp / 3) > 250 ? 250 : (hp / 3));
119 dam = ((hp / 3) > 150 ? 150 : (hp / 3));
123 dam = ((hp / 6) > 200 ? 200 : (hp / 6));
126 dam = ((hp / 6) > 500 ? 500 : (hp / 6));
129 dam = ((hp / 6) > 150 ? 150 : (hp / 6));
132 dam = ((hp / 6) > 200 ? 200 : (hp / 6));
135 dam = ((hp / 3) > 250 ? 250 : (hp / 3));
138 mult = powerful ? 2 : 1;
139 dam = rlev * (mult / div);
144 dam = ((hp / 3) > 800 ? 800 : (hp / 3));
147 dam = (powerful ? (rlev * 3) : (rlev * 2));
152 dam = ((hp / 6) > 150 ? 150 : (hp / 6));
156 dam = (rlev * 4) + 50;
162 dice_side = rlev * 3;
168 dam = (rlev * 4) + 50;
174 dice_side = rlev * 3 / 2;
180 dam = (rlev * 4) + 50;
186 dice_side = rlev * 7 / 2;
192 dam = (rlev * 4) + 50;
198 dice_side = rlev * 3 / 2;
203 mult = powerful ? 2 : 1;
208 dam = 50 + rlev * (powerful ? 2 : 1);
215 dice_side = powerful ? (rlev * 3) : (rlev * 2);
219 dam = (rlev * 4) + 50;
254 mult = powerful ? 2 : 1;
255 dam = rlev / 3 * (mult / div);
260 mult = powerful ? 2 : 1;
261 dam = rlev / 3 * (mult / div);
266 mult = powerful ? 2 : 1;
267 dam = rlev / 3 * (mult / div);
272 mult = powerful ? 2 : 1;
273 dam = rlev / 3 * (mult / div);
278 dam = (rlev * 4) + 50;
283 dam = 30 + (rlev * 4) / (powerful ? 2 : 3);
288 dam = (rlev * 3 / (powerful ? 2 : 3));
295 dice_side = rlev * 7 / 2;
298 dam = 10 + (rlev * 3 / (powerful ? 2 : 3));
303 dam = (rlev * 3 / (powerful ? 2 : 3));
307 case MS_MAGIC_MISSILE:
326 mult = target_ptr->chp;
328 dam = 40 * (mult / div);
353 dam = powerful ? 150 : 100;
355 dice_side = powerful ? (rlev * 2) : (rlev * 3 / 2);
400 return monspell_damage_roll(dam, dice_num, dice_side, mult, div, TYPE);
404 * @brief モンスターの使う呪文の威力を返す /
405 * @param target_ptr プレーヤーへの参照ポインタ
406 * @param SPELL_NUM 呪文番号
407 * @param m_idx 呪文を唱えるモンスターID
408 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
409 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
411 HIT_POINT monspell_damage(player_type* target_ptr, monster_spell_type ms_type, MONSTER_IDX m_idx, int TYPE)
413 floor_type* floor_ptr = target_ptr->current_floor_ptr;
414 monster_type* m_ptr = &floor_ptr->m_list[m_idx];
415 monster_race* r_ptr = &r_info[m_ptr->r_idx];
417 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
418 int shoot_dd = r_ptr->blow[0].d_dice;
419 int shoot_ds = r_ptr->blow[0].d_side;
421 hp = (TYPE == DAM_ROLL) ? m_ptr->hp : m_ptr->max_maxhp;
422 return monspell_damage_base(target_ptr, ms_type, hp, rlev, monster_is_powerful(floor_ptr, m_idx), shoot_dd, shoot_ds, 0, TYPE);
426 * @brief モンスターの使う呪文の威力を返す /
427 * @param target_ptr プレーヤーへの参照ポインタ
428 * @param SPELL_NUM 呪文番号
429 * @param r_idx 呪文を唱えるモンスターの種族ID
430 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
431 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
433 HIT_POINT monspell_race_damage(player_type* target_ptr, monster_spell_type ms_type, MONRACE_IDX r_idx, int TYPE)
435 monster_race* r_ptr = &r_info[r_idx];
436 int rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
437 bool powerful = r_ptr->flags2 & RF2_POWERFUL ? TRUE : FALSE;
438 u32b hp = r_ptr->hdice * (ironman_nightmare ? 2 : 1) * r_ptr->hside;
439 int shoot_dd = r_ptr->blow[0].d_dice;
440 int shoot_ds = r_ptr->blow[0].d_side;
442 return monspell_damage_base(target_ptr, ms_type, MIN(30000, hp), rlev, powerful, shoot_dd, shoot_ds, 0, TYPE);
446 * @brief 青魔導師の使う呪文の威力を返す /
447 * @param target_ptr プレーヤーへの参照ポインタ
448 * @param SPELL_NUM 呪文番号
449 * @param plev 使用するレベル。2倍して扱う。
450 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
451 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
453 HIT_POINT monspell_bluemage_damage(player_type* target_ptr, monster_spell_type ms_type, PLAYER_LEVEL plev, int TYPE)
455 int hp = target_ptr->chp;
456 int shoot_dd = 1, shoot_ds = 1, shoot_base = 0;
457 object_type* o_ptr = NULL;
459 if (has_melee_weapon(target_ptr, INVEN_RARM))
460 o_ptr = &target_ptr->inventory_list[INVEN_RARM];
461 else if (has_melee_weapon(target_ptr, INVEN_LARM))
462 o_ptr = &target_ptr->inventory_list[INVEN_LARM];
465 shoot_dd = o_ptr->dd;
466 shoot_ds = o_ptr->ds;
467 shoot_base = o_ptr->to_d;
470 return monspell_damage_base(target_ptr, ms_type, hp, plev * 2, FALSE, shoot_dd, shoot_ds, shoot_base, TYPE);