1 #include "mspell/mspell-damage-calculator.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 "monster/monster-status.h"
9 * @brief モンスターの使う呪文の威力を決定する /
11 * @param dice_num ダイス数
12 * @param dice_side ダイス面
15 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
16 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
18 static HIT_POINT monspell_damage_roll(HIT_POINT dam, int dice_num, int dice_side, int mult, int div, int TYPE)
22 dam += maxroll(dice_num, dice_side) * mult / div;
25 dam += dice_num * 1 * mult / div;
28 dam += damroll(dice_num, dice_side) * mult / div;
48 * @brief モンスターの使う呪文の威力を返す /
49 * @param target_ptr プレーヤーへの参照ポインタ (破滅の手用)
50 * @param SPELL_NUM 呪文番号
51 * @param hp 呪文を唱えるモンスターの体力
52 * @param rlev 呪文を唱えるモンスターのレベル
53 * @param powerful 呪文を唱えるモンスターのpowerfulフラグ
54 * @param shoot_dd 射撃のダイス数
55 * @param shoot_ds 射撃のダイス面
56 * @param shoot_base 射撃の固定威力値
57 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
58 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
60 static HIT_POINT monspell_damage_base(
61 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)
63 HIT_POINT dam = 0, dice_num = 0, dice_side = 0, mult = 1, div = 1;
73 dam = (hp / 4) > 800 ? 800 : (hp / 4);
91 dam = ((hp / 3) > 1600 ? 1600 : (hp / 3));
94 dam = ((hp / 3) > 800 ? 800 : (hp / 3));
97 dam = ((hp / 6) > 550 ? 550 : (hp / 6));
101 dam = ((hp / 6) > 400 ? 400 : (hp / 6));
105 dam = ((hp / 6) > 450 ? 450 : (hp / 6));
108 dam = ((hp / 6) > 600 ? 600 : (hp / 6));
111 dam = ((hp / 6) > 500 ? 500 : (hp / 6));
114 dam = ((hp / 3) > 250 ? 250 : (hp / 3));
117 dam = ((hp / 3) > 150 ? 150 : (hp / 3));
121 dam = ((hp / 6) > 200 ? 200 : (hp / 6));
124 dam = ((hp / 6) > 500 ? 500 : (hp / 6));
127 dam = ((hp / 6) > 150 ? 150 : (hp / 6));
130 dam = ((hp / 6) > 200 ? 200 : (hp / 6));
133 dam = ((hp / 3) > 250 ? 250 : (hp / 3));
136 mult = powerful ? 2 : 1;
137 dam = rlev * (mult / div);
142 dam = ((hp / 3) > 800 ? 800 : (hp / 3));
145 dam = (powerful ? (rlev * 3) : (rlev * 2));
150 dam = ((hp / 6) > 150 ? 150 : (hp / 6));
154 dam = (rlev * 4) + 50;
160 dice_side = rlev * 3;
166 dam = (rlev * 4) + 50;
172 dice_side = rlev * 3 / 2;
178 dam = (rlev * 4) + 50;
184 dice_side = rlev * 7 / 2;
190 dam = (rlev * 4) + 50;
196 dice_side = rlev * 3 / 2;
201 mult = powerful ? 2 : 1;
206 dam = 50 + rlev * (powerful ? 2 : 1);
213 dice_side = powerful ? (rlev * 3) : (rlev * 2);
217 dam = (rlev * 4) + 50;
252 mult = powerful ? 2 : 1;
253 dam = rlev / 3 * (mult / div);
258 mult = powerful ? 2 : 1;
259 dam = rlev / 3 * (mult / div);
264 mult = powerful ? 2 : 1;
265 dam = rlev / 3 * (mult / div);
270 mult = powerful ? 2 : 1;
271 dam = rlev / 3 * (mult / div);
276 dam = (rlev * 4) + 50;
281 dam = 30 + (rlev * 4) / (powerful ? 2 : 3);
286 dam = (rlev * 3 / (powerful ? 2 : 3));
293 dice_side = rlev * 7 / 2;
296 dam = 10 + (rlev * 3 / (powerful ? 2 : 3));
301 dam = (rlev * 3 / (powerful ? 2 : 3));
305 case MS_MAGIC_MISSILE:
324 mult = target_ptr->chp;
326 dam = 40 * (mult / div);
351 dam = powerful ? 150 : 100;
353 dice_side = powerful ? (rlev * 2) : (rlev * 3 / 2);
398 return monspell_damage_roll(dam, dice_num, dice_side, mult, div, TYPE);
402 * @brief モンスターの使う呪文の威力を返す /
403 * @param target_ptr プレーヤーへの参照ポインタ
404 * @param SPELL_NUM 呪文番号
405 * @param m_idx 呪文を唱えるモンスターID
406 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
407 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
409 HIT_POINT monspell_damage(player_type *target_ptr, monster_spell_type ms_type, MONSTER_IDX m_idx, int TYPE)
411 floor_type *floor_ptr = target_ptr->current_floor_ptr;
412 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
413 monster_race *r_ptr = &r_info[m_ptr->r_idx];
415 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
416 int shoot_dd = r_ptr->blow[0].d_dice;
417 int shoot_ds = r_ptr->blow[0].d_side;
419 hp = (TYPE == DAM_ROLL) ? m_ptr->hp : m_ptr->max_maxhp;
420 return monspell_damage_base(target_ptr, ms_type, hp, rlev, monster_is_powerful(floor_ptr, m_idx), shoot_dd, shoot_ds, 0, TYPE);
424 * @brief モンスターの使う呪文の威力を返す /
425 * @param target_ptr プレーヤーへの参照ポインタ
426 * @param SPELL_NUM 呪文番号
427 * @param r_idx 呪文を唱えるモンスターの種族ID
428 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
429 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
431 HIT_POINT monspell_race_damage(player_type *target_ptr, monster_spell_type ms_type, MONRACE_IDX r_idx, int TYPE)
433 monster_race *r_ptr = &r_info[r_idx];
434 int rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
435 bool powerful = r_ptr->flags2 & RF2_POWERFUL ? TRUE : FALSE;
436 u32b hp = r_ptr->hdice * (ironman_nightmare ? 2 : 1) * r_ptr->hside;
437 int shoot_dd = r_ptr->blow[0].d_dice;
438 int shoot_ds = r_ptr->blow[0].d_side;
440 return monspell_damage_base(target_ptr, ms_type, MIN(30000, hp), rlev, powerful, shoot_dd, shoot_ds, 0, TYPE);
444 * @brief 青魔導師の使う呪文の威力を返す /
445 * @param target_ptr プレーヤーへの参照ポインタ
446 * @param SPELL_NUM 呪文番号
447 * @param plev 使用するレベル。2倍して扱う。
448 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
449 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
451 HIT_POINT monspell_bluemage_damage(player_type *target_ptr, monster_spell_type ms_type, PLAYER_LEVEL plev, int TYPE)
453 int hp = target_ptr->chp;
454 int shoot_dd = 1, shoot_ds = 1, shoot_base = 0;
455 object_type *o_ptr = NULL;
457 if (has_melee_weapon(target_ptr, INVEN_RARM))
458 o_ptr = &target_ptr->inventory_list[INVEN_RARM];
459 else if (has_melee_weapon(target_ptr, INVEN_LARM))
460 o_ptr = &target_ptr->inventory_list[INVEN_LARM];
463 shoot_dd = o_ptr->dd;
464 shoot_ds = o_ptr->ds;
465 shoot_base = o_ptr->to_d;
468 return monspell_damage_base(target_ptr, ms_type, hp, plev * 2, FALSE, shoot_dd, shoot_ds, shoot_base, TYPE);