1 #include "mspell/mspell-damage-calculator.h"
2 #include "game-option/birth-options.h"
3 #include "inventory/inventory-slot-types.h"
4 #include "monster-race/monster-race.h"
5 #include "monster-race/race-ability-flags.h"
6 #include "monster-race/race-flags2.h"
7 #include "monster/monster-status.h"
8 #include "player-info/equipment-info.h"
9 #include "system/floor-type-definition.h"
10 #include "system/monster-race-definition.h"
11 #include "system/monster-type-definition.h"
12 #include "system/object-type-definition.h"
13 #include "system/player-type-definition.h"
16 * @brief モンスターの使う呪文の威力を決定する /
18 * @param dice_num ダイス数
19 * @param dice_side ダイス面
22 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
23 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
25 static HIT_POINT monspell_damage_roll(HIT_POINT dam, int dice_num, int dice_side, int mult, int div, int TYPE)
29 dam += maxroll(dice_num, dice_side) * mult / div;
32 dam += dice_num * 1 * mult / div;
35 dam += damroll(dice_num, dice_side) * mult / div;
55 * @brief モンスターの使う呪文の威力を返す /
56 * @param target_ptr プレーヤーへの参照ポインタ (破滅の手用)
57 * @param SPELL_NUM 呪文番号
58 * @param hp 呪文を唱えるモンスターの体力
59 * @param rlev 呪文を唱えるモンスターのレベル
60 * @param powerful 呪文を唱えるモンスターのpowerfulフラグ
61 * @param shoot_dd 射撃のダイス数
62 * @param shoot_ds 射撃のダイス面
63 * @param shoot_base 射撃の固定威力値
64 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
65 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
67 static HIT_POINT monspell_damage_base(
68 player_type *target_ptr, RF_ABILITY ms_type, int hp, int rlev, bool powerful, int shoot_dd, int shoot_ds, int shoot_base, int TYPE)
70 HIT_POINT dam = 0, dice_num = 0, dice_side = 0, mult = 1, div = 1;
73 case RF_ABILITY::SHRIEK:
75 case RF_ABILITY::XXX1:
77 case RF_ABILITY::DISPEL:
79 case RF_ABILITY::ROCKET:
80 dam = (hp / 4) > 800 ? 800 : (hp / 4);
82 case RF_ABILITY::SHOOT:
87 case RF_ABILITY::XXX2:
89 case RF_ABILITY::XXX3:
91 case RF_ABILITY::XXX4:
94 case RF_ABILITY::BR_ACID:
95 case RF_ABILITY::BR_ELEC:
96 case RF_ABILITY::BR_FIRE:
97 case RF_ABILITY::BR_COLD:
98 dam = ((hp / 3) > 1600 ? 1600 : (hp / 3));
100 case RF_ABILITY::BR_POIS:
101 dam = ((hp / 3) > 800 ? 800 : (hp / 3));
103 case RF_ABILITY::BR_NETH:
104 dam = ((hp / 6) > 550 ? 550 : (hp / 6));
106 case RF_ABILITY::BR_LITE:
107 case RF_ABILITY::BR_DARK:
108 dam = ((hp / 6) > 400 ? 400 : (hp / 6));
110 case RF_ABILITY::BR_CONF:
111 case RF_ABILITY::BR_SOUN:
112 dam = ((hp / 6) > 450 ? 450 : (hp / 6));
114 case RF_ABILITY::BR_CHAO:
115 dam = ((hp / 6) > 600 ? 600 : (hp / 6));
117 case RF_ABILITY::BR_DISE:
118 dam = ((hp / 6) > 500 ? 500 : (hp / 6));
120 case RF_ABILITY::BR_NEXU:
121 dam = ((hp / 3) > 250 ? 250 : (hp / 3));
123 case RF_ABILITY::BR_TIME:
124 dam = ((hp / 3) > 150 ? 150 : (hp / 3));
126 case RF_ABILITY::BR_INER:
127 case RF_ABILITY::BR_GRAV:
128 dam = ((hp / 6) > 200 ? 200 : (hp / 6));
130 case RF_ABILITY::BR_SHAR:
131 dam = ((hp / 6) > 500 ? 500 : (hp / 6));
133 case RF_ABILITY::BR_PLAS:
134 dam = ((hp / 6) > 150 ? 150 : (hp / 6));
136 case RF_ABILITY::BR_FORC:
137 dam = ((hp / 6) > 200 ? 200 : (hp / 6));
139 case RF_ABILITY::BR_MANA:
140 dam = ((hp / 3) > 250 ? 250 : (hp / 3));
142 case RF_ABILITY::BA_NUKE:
143 mult = powerful ? 2 : 1;
144 dam = rlev * (mult / div);
148 case RF_ABILITY::BR_NUKE:
149 dam = ((hp / 3) > 800 ? 800 : (hp / 3));
151 case RF_ABILITY::BA_CHAO:
152 dam = (powerful ? (rlev * 3) : (rlev * 2));
156 case RF_ABILITY::BR_DISI:
157 dam = ((hp / 6) > 150 ? 150 : (hp / 6));
159 case RF_ABILITY::BA_ACID:
161 dam = (rlev * 4) + 50;
167 dice_side = rlev * 3;
171 case RF_ABILITY::BA_ELEC:
173 dam = (rlev * 4) + 50;
179 dice_side = rlev * 3 / 2;
183 case RF_ABILITY::BA_FIRE:
185 dam = (rlev * 4) + 50;
191 dice_side = rlev * 7 / 2;
195 case RF_ABILITY::BA_COLD:
197 dam = (rlev * 4) + 50;
203 dice_side = rlev * 3 / 2;
207 case RF_ABILITY::BA_POIS:
208 mult = powerful ? 2 : 1;
212 case RF_ABILITY::BA_NETH:
213 dam = 50 + rlev * (powerful ? 2 : 1);
217 case RF_ABILITY::BA_WATE:
220 dice_side = powerful ? (rlev * 3) : (rlev * 2);
222 case RF_ABILITY::BA_MANA:
223 case RF_ABILITY::BA_DARK:
224 dam = (rlev * 4) + 50;
228 case RF_ABILITY::DRAIN_MANA:
234 case RF_ABILITY::MIND_BLAST:
238 case RF_ABILITY::BRAIN_SMASH:
242 case RF_ABILITY::CAUSE_1:
246 case RF_ABILITY::CAUSE_2:
250 case RF_ABILITY::CAUSE_3:
254 case RF_ABILITY::CAUSE_4:
258 case RF_ABILITY::BO_ACID:
259 mult = powerful ? 2 : 1;
260 dam = rlev / 3 * (mult / div);
264 case RF_ABILITY::BO_ELEC:
265 mult = powerful ? 2 : 1;
266 dam = rlev / 3 * (mult / div);
270 case RF_ABILITY::BO_FIRE:
271 mult = powerful ? 2 : 1;
272 dam = rlev / 3 * (mult / div);
276 case RF_ABILITY::BO_COLD:
277 mult = powerful ? 2 : 1;
278 dam = rlev / 3 * (mult / div);
282 case RF_ABILITY::BA_LITE:
283 dam = (rlev * 4) + 50;
287 case RF_ABILITY::BO_NETH:
288 dam = 30 + (rlev * 4) / (powerful ? 2 : 3);
292 case RF_ABILITY::BO_WATE:
293 dam = (rlev * 3 / (powerful ? 2 : 3));
297 case RF_ABILITY::BO_MANA:
300 dice_side = rlev * 7 / 2;
302 case RF_ABILITY::BO_PLAS:
303 dam = 10 + (rlev * 3 / (powerful ? 2 : 3));
307 case RF_ABILITY::BO_ICEE:
308 dam = (rlev * 3 / (powerful ? 2 : 3));
312 case RF_ABILITY::MISSILE:
317 case RF_ABILITY::SCARE:
319 case RF_ABILITY::BLIND:
321 case RF_ABILITY::CONF:
323 case RF_ABILITY::SLOW:
325 case RF_ABILITY::HOLD:
327 case RF_ABILITY::HASTE:
330 case RF_ABILITY::HAND_DOOM:
331 mult = target_ptr->chp;
333 dam = 40 * (mult / div);
338 case RF_ABILITY::HEAL:
340 case RF_ABILITY::INVULNER:
342 case RF_ABILITY::BLINK:
344 case RF_ABILITY::TPORT:
346 case RF_ABILITY::WORLD:
348 case RF_ABILITY::SPECIAL:
350 case RF_ABILITY::TELE_TO:
352 case RF_ABILITY::TELE_AWAY:
354 case RF_ABILITY::TELE_LEVEL:
357 case RF_ABILITY::PSY_SPEAR:
358 dam = powerful ? 150 : 100;
360 dice_side = powerful ? (rlev * 2) : (rlev * 3 / 2);
363 case RF_ABILITY::DARKNESS:
365 case RF_ABILITY::TRAPS:
367 case RF_ABILITY::FORGET:
369 case RF_ABILITY::RAISE_DEAD:
371 case RF_ABILITY::S_KIN:
373 case RF_ABILITY::S_CYBER:
375 case RF_ABILITY::S_MONSTER:
377 case RF_ABILITY::S_MONSTERS:
379 case RF_ABILITY::S_ANT:
381 case RF_ABILITY::S_SPIDER:
383 case RF_ABILITY::S_HOUND:
385 case RF_ABILITY::S_HYDRA:
387 case RF_ABILITY::S_ANGEL:
389 case RF_ABILITY::S_DEMON:
391 case RF_ABILITY::S_UNDEAD:
393 case RF_ABILITY::S_DRAGON:
395 case RF_ABILITY::S_HI_UNDEAD:
397 case RF_ABILITY::S_HI_DRAGON:
399 case RF_ABILITY::S_AMBERITES:
401 case RF_ABILITY::S_UNIQUE:
403 case RF_ABILITY::MAX:
407 return monspell_damage_roll(dam, dice_num, dice_side, mult, div, TYPE);
411 * @brief モンスターの使う射撃のダイス情報を返す /
412 * @param r_ptr モンスター種族への参照ポインタ
413 * @param dd ダイス数への参照ポインタ
414 * @param ds ダイス面への参照ポインタ
416 void monspell_shoot_dice(monster_race *r_ptr, int *dd, int *ds)
418 int p = -1; /* Position of SHOOT */
419 int n = 0; /* Number of blows */
420 const int max_blows = 4;
421 for (int m = 0; m < max_blows; m++) {
422 if (r_ptr->blow[m].method != RBM_NONE)
423 n++; /* Count blows */
425 if (r_ptr->blow[m].method == RBM_SHOOT) {
426 p = m; /* Remember position */
431 /* When full blows, use a first damage */
439 (*dd) = r_ptr->blow[p].d_dice;
440 (*ds) = r_ptr->blow[p].d_side;
445 * @brief モンスターの使う呪文の威力を返す /
446 * @param target_ptr プレーヤーへの参照ポインタ
447 * @param ms_type 呪文番号
448 * @param m_idx 呪文を唱えるモンスターID
449 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
450 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
452 HIT_POINT monspell_damage(player_type *target_ptr, RF_ABILITY ms_type, MONSTER_IDX m_idx, int TYPE)
454 floor_type *floor_ptr = target_ptr->current_floor_ptr;
455 monster_type *m_ptr = &floor_ptr->m_list[m_idx];
456 monster_race *r_ptr = &r_info[m_ptr->r_idx];
457 DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
458 HIT_POINT hp = (TYPE == DAM_ROLL) ? m_ptr->hp : m_ptr->max_maxhp;
459 int shoot_dd, shoot_ds;
461 monspell_shoot_dice(r_ptr, &shoot_dd, &shoot_ds);
462 return monspell_damage_base(target_ptr, ms_type, hp, rlev, monster_is_powerful(floor_ptr, m_idx), shoot_dd, shoot_ds, 0, TYPE);
466 * @brief モンスターの使う所属としての呪文の威力を返す /
467 * @param target_ptr プレーヤーへの参照ポインタ
468 * @param ms_type 呪文番号
469 * @param r_idx 呪文を唱えるモンスターの種族ID
470 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
471 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
473 HIT_POINT monspell_race_damage(player_type *target_ptr, RF_ABILITY ms_type, MONRACE_IDX r_idx, int TYPE)
475 monster_race *r_ptr = &r_info[r_idx];
476 DEPTH rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
477 bool powerful = r_ptr->flags2 & RF2_POWERFUL ? TRUE : false;
478 HIT_POINT hp = r_ptr->hdice * (ironman_nightmare ? 2 : 1) * r_ptr->hside;
479 int shoot_dd, shoot_ds;
481 monspell_shoot_dice(r_ptr, &shoot_dd, &shoot_ds);
482 return monspell_damage_base(target_ptr, ms_type, MIN(30000, hp), rlev, powerful, shoot_dd, shoot_ds, 0, TYPE);
486 * @brief 青魔導師の使う呪文の威力を返す /
487 * @param target_ptr プレーヤーへの参照ポインタ
488 * @param SPELL_NUM 呪文番号
489 * @param plev 使用するレベル。2倍して扱う。
490 * @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
491 * @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
493 HIT_POINT monspell_bluemage_damage(player_type *target_ptr, RF_ABILITY ms_type, PLAYER_LEVEL plev, int TYPE)
495 int hp = target_ptr->chp;
496 int shoot_dd = 1, shoot_ds = 1, shoot_base = 0;
497 object_type *o_ptr = NULL;
499 if (has_melee_weapon(target_ptr, INVEN_MAIN_HAND))
500 o_ptr = &target_ptr->inventory_list[INVEN_MAIN_HAND];
501 else if (has_melee_weapon(target_ptr, INVEN_SUB_HAND))
502 o_ptr = &target_ptr->inventory_list[INVEN_SUB_HAND];
505 shoot_dd = o_ptr->dd;
506 shoot_ds = o_ptr->ds;
507 shoot_base = o_ptr->to_d;
510 return monspell_damage_base(target_ptr, ms_type, hp, plev * 2, false, shoot_dd, shoot_ds, shoot_base, TYPE);