OSDN Git Service

[Refactor] #1389 Changed monap_type from struct to class MonsterAttackPlayer
[hengbandforosx/hengbandosx.git] / src / monster-attack / monster-attack-lose.cpp
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"
13
14 /*!
15  * @brief 病気ダメージを計算する (毒耐性があれば、(1d4 + 4) / 9になる。二重耐性なら更に(1d4 + 4) / 9)
16  * @param player_ptr プレイヤーへの参照ポインタ
17  * @param monap_ptr モンスターからプレイヤーへの直接攻撃構造体への参照ポインタ
18  * @details 10% (毒の一次耐性があれば4%、二重耐性ならば1.6%)の確率で耐久が低下し、更に1/10の確率で永久低下する
19  */
20 void calc_blow_disease(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
21 {
22     if (has_resist_pois(player_ptr))
23         monap_ptr->damage = monap_ptr->damage * (randint1(4) + 4) / 9;
24
25     if (is_oppose_pois(player_ptr))
26         monap_ptr->damage = monap_ptr->damage * (randint1(4) + 4) / 9;
27
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))
30         return;
31
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;
34
35     bool disease_possibility = randint1(100) > calc_nuke_damage_rate(player_ptr);
36     if (disease_possibility || (randint1(100) > 10) || (player_ptr->prace == PlayerRaceType::ANDROID))
37         return;
38
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;
43     }
44 }
45
46 /*!
47  * @brief 腕力低下ダメージを計算する (維持があれば、(1d4 + 4) / 9になる)
48  * @param player_ptr プレイヤーへの参照ポインタ
49  * @param monap_ptr モンスターからプレイヤーへの直接攻撃構造体への参照ポインタ
50  */
51 void calc_blow_lose_strength(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
52 {
53     if (has_sustain_str(player_ptr))
54         monap_ptr->get_damage = monap_ptr->get_damage * (randint1(4) + 4) / 9;
55
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))
58         return;
59
60     if (do_dec_stat(player_ptr, A_STR))
61         monap_ptr->obvious = true;
62 }
63
64 /*!
65  * @brief 知能低下ダメージを計算する (維持があれば、(1d4 + 4) / 9になる)
66  * @param player_ptr プレイヤーへの参照ポインタ
67  * @param monap_ptr モンスターからプレイヤーへの直接攻撃構造体への参照ポインタ
68  */
69 void calc_blow_lose_intelligence(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
70 {
71     if (has_sustain_int(player_ptr))
72         monap_ptr->get_damage = monap_ptr->get_damage * (randint1(4) + 4) / 9;
73
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))
76         return;
77
78     if (do_dec_stat(player_ptr, A_INT))
79         monap_ptr->obvious = true;
80 }
81
82 /*!
83  * @brief 賢さ低下ダメージを計算する (維持があれば、(1d4 + 4) / 9になる)
84  * @param player_ptr プレイヤーへの参照ポインタ
85  * @param monap_ptr モンスターからプレイヤーへの直接攻撃構造体への参照ポインタ
86  */
87 void calc_blow_lose_wisdom(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
88 {
89     if (has_sustain_wis(player_ptr))
90         monap_ptr->get_damage = monap_ptr->get_damage * (randint1(4) + 4) / 9;
91
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))
94         return;
95
96     if (do_dec_stat(player_ptr, A_WIS))
97         monap_ptr->obvious = true;
98 }
99
100 /*!
101  * @brief 器用低下ダメージを計算する (維持があれば、(1d4 + 4) / 9になる)
102  * @param player_ptr プレイヤーへの参照ポインタ
103  * @param monap_ptr モンスターからプレイヤーへの直接攻撃構造体への参照ポインタ
104  */
105 void calc_blow_lose_dexterity(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
106 {
107     if (has_sustain_dex(player_ptr))
108         monap_ptr->get_damage = monap_ptr->get_damage * (randint1(4) + 4) / 9;
109
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))
112         return;
113
114     if (do_dec_stat(player_ptr, A_DEX))
115         monap_ptr->obvious = true;
116 }
117
118 /*!
119  * @brief 耐久低下ダメージを計算する (維持があれば、(1d4 + 4) / 9になる)
120  * @param player_ptr プレイヤーへの参照ポインタ
121  * @param monap_ptr モンスターからプレイヤーへの直接攻撃構造体への参照ポインタ
122  */
123 void calc_blow_lose_constitution(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
124 {
125     if (has_sustain_con(player_ptr))
126         monap_ptr->get_damage = monap_ptr->get_damage * (randint1(4) + 4) / 9;
127
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))
130         return;
131
132     if (do_dec_stat(player_ptr, A_CON))
133         monap_ptr->obvious = true;
134 }
135
136 /*!
137  * @brief 魅力低下ダメージを計算する (維持があれば、(1d4 + 4) / 9になる)
138  * @param player_ptr プレイヤーへの参照ポインタ
139  * @param monap_ptr モンスターからプレイヤーへの直接攻撃構造体への参照ポインタ
140  */
141 void calc_blow_lose_charisma(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
142 {
143     if (has_sustain_chr(player_ptr))
144         monap_ptr->get_damage = monap_ptr->get_damage * (randint1(4) + 4) / 9;
145
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))
148         return;
149
150     if (do_dec_stat(player_ptr, A_CHR))
151         monap_ptr->obvious = true;
152 }
153
154 /*!
155  * @brief 全能力低下ダメージを計算する (維持があれば、1つに付き-3%軽減する)
156  * @param player_ptr プレイヤーへの参照ポインタ
157  * @param monap_ptr モンスターからプレイヤーへの直接攻撃構造体への参照ポインタ
158  */
159 void calc_blow_lose_all(PlayerType *player_ptr, MonsterAttackPlayer *monap_ptr)
160 {
161     int damage_ratio = 100;
162     if (has_sustain_str(player_ptr))
163         damage_ratio -= 3;
164
165     if (has_sustain_int(player_ptr))
166         damage_ratio -= 3;
167
168     if (has_sustain_wis(player_ptr))
169         damage_ratio -= 3;
170
171     if (has_sustain_dex(player_ptr))
172         damage_ratio -= 3;
173
174     if (has_sustain_con(player_ptr))
175         damage_ratio -= 3;
176
177     if (has_sustain_chr(player_ptr))
178         damage_ratio -= 3;
179
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))
183         return;
184
185     process_lose_all_attack(player_ptr, monap_ptr);
186 }