1 #include "mspell/mspell-damage-calculator.h"
2 #include "inventory/inventory-slot-types.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"
7 #include "system/floor-type-definition.h"
8 #include "system/object-type-definition.h"
11 * @brief モンスターの使う呪文の威力を決定する /
13 * @param dice_num ダイス数
14 * @param dice_side ダイス面
17 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
18 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
20 static HIT_POINT monspell_damage_roll(HIT_POINT dam, int dice_num, int dice_side, int mult, int div, int TYPE)
24 dam += maxroll(dice_num, dice_side) * mult / div;
27 dam += dice_num * 1 * mult / div;
30 dam += damroll(dice_num, dice_side) * mult / div;
50 * @brief モンスターの使う呪文の威力を返す /
51 * @param target_ptr プレーヤーへの参照ポインタ (破滅の手用)
52 * @param SPELL_NUM 呪文番号
53 * @param hp 呪文を唱えるモンスターの体力
54 * @param rlev 呪文を唱えるモンスターのレベル
55 * @param powerful 呪文を唱えるモンスターのpowerfulフラグ
56 * @param shoot_dd 射撃のダイス数
57 * @param shoot_ds 射撃のダイス面
58 * @param shoot_base 射撃の固定威力値
59 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
60 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
62 static HIT_POINT monspell_damage_base(
63 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 r_ptr モンスター種族への参照ポインタ
406 * @param dd ダイス数への参照ポインタ
407 * @param ds ダイス面への参照ポインタ
410 void monspell_shoot_dice(monster_race *r_ptr, int *dd, int *ds)
412 int p = -1; /* Position of SHOOT */
413 int n = 0; /* Number of blows */
414 const int max_blows = 4;
415 for (int m = 0; m < max_blows; m++) {
416 if (r_ptr->blow[m].method != RBM_NONE)
417 n++; /* Count blows */
419 if (r_ptr->blow[m].method == RBM_SHOOT) {
420 p = m; /* Remember position */
425 /* When full blows, use a first damage */
433 (*dd) = r_ptr->blow[p].d_dice;
434 (*ds) = r_ptr->blow[p].d_side;
439 * @brief モンスターの使う呪文の威力を返す /
440 * @param target_ptr プレーヤーへの参照ポインタ
441 * @param ms_type 呪文番号
442 * @param m_idx 呪文を唱えるモンスターID
443 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
444 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
446 HIT_POINT monspell_damage(player_type *target_ptr, monster_spell_type ms_type, MONSTER_IDX m_idx, int TYPE)
448 floor_type *floor_ptr = target_ptr->current_floor_ptr;
449 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
450 monster_race *r_ptr = &r_info[m_ptr->r_idx];
451 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
452 HIT_POINT hp = (TYPE == DAM_ROLL) ? m_ptr->hp : m_ptr->max_maxhp;
453 int shoot_dd, shoot_ds;
455 monspell_shoot_dice(r_ptr, &shoot_dd, &shoot_ds);
456 return monspell_damage_base(target_ptr, ms_type, hp, rlev, monster_is_powerful(floor_ptr, m_idx), shoot_dd, shoot_ds, 0, TYPE);
460 * @brief モンスターの使う所属としての呪文の威力を返す /
461 * @param target_ptr プレーヤーへの参照ポインタ
462 * @param ms_type 呪文番号
463 * @param r_idx 呪文を唱えるモンスターの種族ID
464 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
465 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
467 HIT_POINT monspell_race_damage(player_type *target_ptr, monster_spell_type ms_type, MONRACE_IDX r_idx, int TYPE)
469 monster_race *r_ptr = &r_info[r_idx];
470 DEPTH rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
471 bool powerful = r_ptr->flags2 & RF2_POWERFUL ? TRUE : FALSE;
472 HIT_POINT hp = r_ptr->hdice * (ironman_nightmare ? 2 : 1) * r_ptr->hside;
473 int shoot_dd, shoot_ds;
475 monspell_shoot_dice(r_ptr, &shoot_dd, &shoot_ds);
476 return monspell_damage_base(target_ptr, ms_type, MIN(30000, hp), rlev, powerful, shoot_dd, shoot_ds, 0, TYPE);
480 * @brief 青魔導師の使う呪文の威力を返す /
481 * @param target_ptr プレーヤーへの参照ポインタ
482 * @param SPELL_NUM 呪文番号
483 * @param plev 使用するレベル。2倍して扱う。
484 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
485 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
487 HIT_POINT monspell_bluemage_damage(player_type *target_ptr, monster_spell_type ms_type, PLAYER_LEVEL plev, int TYPE)
489 int hp = target_ptr->chp;
490 int shoot_dd = 1, shoot_ds = 1, shoot_base = 0;
491 object_type *o_ptr = NULL;
493 if (has_melee_weapon(target_ptr, INVEN_MAIN_HAND))
494 o_ptr = &target_ptr->inventory_list[INVEN_MAIN_HAND];
495 else if (has_melee_weapon(target_ptr, INVEN_SUB_HAND))
496 o_ptr = &target_ptr->inventory_list[INVEN_SUB_HAND];
499 shoot_dd = o_ptr->dd;
500 shoot_ds = o_ptr->ds;
501 shoot_base = o_ptr->to_d;
504 return monspell_damage_base(target_ptr, ms_type, hp, plev * 2, FALSE, shoot_dd, shoot_ds, shoot_base, TYPE);