1 #include "monster-attack/monster-attack-lose.h"
2 #include "mind/mind-mirror-master.h"
3 #include "monster-attack/monster-attack-status.h"
4 #include "monster-attack/monster-attack-util.h"
5 #include "player/player-damage.h"
6 #include "player/player-status-flags.h"
7 #include "player/player-status-resist.h"
8 #include "status/bad-status-setter.h"
9 #include "status/base-status.h"
10 #include "status/element-resistance.h"
11 #include "system/player-type-definition.h"
12 #include "view/display-messages.h"
15 * @brief 病気ダメージを計算する (毒耐性があれば、(1d4 + 4) / 9になる。二重耐性なら更に(1d4 + 4) / 9)
16 * @param player_ptr プレイヤーへの参照ポインタ
17 * @param monap_ptr モンスターからプレイヤーへの直接攻撃構造体への参照ポインタ
18 * @details 10% (毒の一次耐性があれば4%、二重耐性ならば1.6%)の確率で耐久が低下し、更に1/10の確率で永久低下する
20 void calc_blow_disease(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
22 if (has_resist_pois(player_ptr))
23 monap_ptr->damage = monap_ptr->damage * (randint1(4) + 4) / 9;
25 if (is_oppose_pois(player_ptr))
26 monap_ptr->damage = monap_ptr->damage * (randint1(4) + 4) / 9;
28 monap_ptr->get_damage += take_hit(player_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc);
29 if (player_ptr->is_dead || check_multishadow(player_ptr))
32 if (!(has_resist_pois(player_ptr) || is_oppose_pois(player_ptr)) && BadStatusSetter(player_ptr).mod_poison(randint1(monap_ptr->rlev) + 5))
33 monap_ptr->obvious = true;
35 bool disease_possibility = randint1(100) > calc_nuke_damage_rate(player_ptr);
36 if (disease_possibility || (randint1(100) > 10) || (player_ptr->prace == PlayerRaceType::ANDROID))
39 bool perm = one_in_(10);
40 if (dec_stat(player_ptr, A_CON, randint1(10), perm)) {
41 msg_print(_("病があなたを蝕んでいる気がする。", "You feel sickly."));
42 monap_ptr->obvious = true;
47 * @brief 腕力低下ダメージを計算する (維持があれば、(1d4 + 4) / 9になる)
48 * @param player_ptr プレイヤーへの参照ポインタ
49 * @param monap_ptr モンスターからプレイヤーへの直接攻撃構造体への参照ポインタ
51 void calc_blow_lose_strength(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
53 if (has_sustain_str(player_ptr))
54 monap_ptr->get_damage = monap_ptr->get_damage * (randint1(4) + 4) / 9;
56 monap_ptr->get_damage += take_hit(player_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc);
57 if (player_ptr->is_dead || check_multishadow(player_ptr))
60 if (do_dec_stat(player_ptr, A_STR))
61 monap_ptr->obvious = true;
65 * @brief 知能低下ダメージを計算する (維持があれば、(1d4 + 4) / 9になる)
66 * @param player_ptr プレイヤーへの参照ポインタ
67 * @param monap_ptr モンスターからプレイヤーへの直接攻撃構造体への参照ポインタ
69 void calc_blow_lose_intelligence(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
71 if (has_sustain_int(player_ptr))
72 monap_ptr->get_damage = monap_ptr->get_damage * (randint1(4) + 4) / 9;
74 monap_ptr->get_damage += take_hit(player_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc);
75 if (player_ptr->is_dead || check_multishadow(player_ptr))
78 if (do_dec_stat(player_ptr, A_INT))
79 monap_ptr->obvious = true;
83 * @brief 賢さ低下ダメージを計算する (維持があれば、(1d4 + 4) / 9になる)
84 * @param player_ptr プレイヤーへの参照ポインタ
85 * @param monap_ptr モンスターからプレイヤーへの直接攻撃構造体への参照ポインタ
87 void calc_blow_lose_wisdom(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
89 if (has_sustain_wis(player_ptr))
90 monap_ptr->get_damage = monap_ptr->get_damage * (randint1(4) + 4) / 9;
92 monap_ptr->get_damage += take_hit(player_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc);
93 if (player_ptr->is_dead || check_multishadow(player_ptr))
96 if (do_dec_stat(player_ptr, A_WIS))
97 monap_ptr->obvious = true;
101 * @brief 器用低下ダメージを計算する (維持があれば、(1d4 + 4) / 9になる)
102 * @param player_ptr プレイヤーへの参照ポインタ
103 * @param monap_ptr モンスターからプレイヤーへの直接攻撃構造体への参照ポインタ
105 void calc_blow_lose_dexterity(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
107 if (has_sustain_dex(player_ptr))
108 monap_ptr->get_damage = monap_ptr->get_damage * (randint1(4) + 4) / 9;
110 monap_ptr->get_damage += take_hit(player_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc);
111 if (player_ptr->is_dead || check_multishadow(player_ptr))
114 if (do_dec_stat(player_ptr, A_DEX))
115 monap_ptr->obvious = true;
119 * @brief 耐久低下ダメージを計算する (維持があれば、(1d4 + 4) / 9になる)
120 * @param player_ptr プレイヤーへの参照ポインタ
121 * @param monap_ptr モンスターからプレイヤーへの直接攻撃構造体への参照ポインタ
123 void calc_blow_lose_constitution(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
125 if (has_sustain_con(player_ptr))
126 monap_ptr->get_damage = monap_ptr->get_damage * (randint1(4) + 4) / 9;
128 monap_ptr->get_damage += take_hit(player_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc);
129 if (player_ptr->is_dead || check_multishadow(player_ptr))
132 if (do_dec_stat(player_ptr, A_CON))
133 monap_ptr->obvious = true;
137 * @brief 魅力低下ダメージを計算する (維持があれば、(1d4 + 4) / 9になる)
138 * @param player_ptr プレイヤーへの参照ポインタ
139 * @param monap_ptr モンスターからプレイヤーへの直接攻撃構造体への参照ポインタ
141 void calc_blow_lose_charisma(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
143 if (has_sustain_chr(player_ptr))
144 monap_ptr->get_damage = monap_ptr->get_damage * (randint1(4) + 4) / 9;
146 monap_ptr->get_damage += take_hit(player_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc);
147 if (player_ptr->is_dead || check_multishadow(player_ptr))
150 if (do_dec_stat(player_ptr, A_CHR))
151 monap_ptr->obvious = true;
155 * @brief 全能力低下ダメージを計算する (維持があれば、1つに付き-3%軽減する)
156 * @param player_ptr プレイヤーへの参照ポインタ
157 * @param monap_ptr モンスターからプレイヤーへの直接攻撃構造体への参照ポインタ
159 void calc_blow_lose_all(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
161 int damage_ratio = 100;
162 if (has_sustain_str(player_ptr))
165 if (has_sustain_int(player_ptr))
168 if (has_sustain_wis(player_ptr))
171 if (has_sustain_dex(player_ptr))
174 if (has_sustain_con(player_ptr))
177 if (has_sustain_chr(player_ptr))
180 monap_ptr->damage = monap_ptr->damage * damage_ratio / 100;
181 monap_ptr->get_damage += take_hit(player_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc);
182 if (player_ptr->is_dead || check_multishadow(player_ptr))
185 process_lose_all_attack(player_ptr, monap_ptr);