OSDN Git Service

[Refactor] #37285 Separated monster-attach-lose.c/h from monster-attack-switcher.c
[hengband/hengband.git] / src / monster-attack / monster-attack-lose.c
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 "view/display-messages.h"
12
13 /*!
14  * @brief \95a\8bC\83_\83\81\81[\83W\82ð\8cv\8eZ\82·\82é (\93Å\91Ï\90«\82ª\82 \82ê\82Î\81A(1d4 + 4) / 9\82É\82È\82é\81B\93ñ\8fd\91Ï\90«\82È\82ç\8dX\82É(1d4 + 4) / 9)
15  * @param target_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
16  * @param monap_ptr \83\82\83\93\83X\83^\81[\82©\82ç\83v\83\8c\81[\83\84\81[\82Ö\82Ì\92¼\90Ú\8dU\8c\82\8d\\91¢\91Ì\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
17  * @return \82È\82µ
18  * @details 10% (\93Å\82Ì\88ê\8e\9f\91Ï\90«\82ª\82 \82ê\82Î4%\81A\93ñ\8fd\91Ï\90«\82È\82ç\82Î1.6%)\82Ì\8am\97¦\82Å\91Ï\8bv\82ª\92á\89º\82µ\81A\8dX\82É1/10\82Ì\8am\97¦\82Å\89i\8bv\92á\89º\82·\82é
19  */
20 void calc_blow_disease(player_type *target_ptr, monap_type *monap_ptr)
21 {
22     if (is_resist_pois(target_ptr))
23         monap_ptr->damage = monap_ptr->damage * (randint1(4) + 4) / 9;
24
25     if (is_oppose_pois(target_ptr))
26         monap_ptr->damage = monap_ptr->damage * (randint1(4) + 4) / 9;
27
28     monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
29     if (target_ptr->is_dead || check_multishadow(target_ptr))
30         return;
31
32     if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)) && set_poisoned(target_ptr, target_ptr->poisoned + randint1(monap_ptr->rlev) + 5))
33         monap_ptr->obvious = TRUE;
34
35     bool disease_possibility = randint1(100) > calc_nuke_damage_rate(target_ptr);
36     if (disease_possibility || (randint1(100) > 10) || (target_ptr->prace == RACE_ANDROID))
37         return;
38
39     bool perm = one_in_(10);
40     if (dec_stat(target_ptr, A_CON, randint1(10), perm)) {
41         msg_print(_("\95a\82ª\82 \82È\82½\82ð\90I\82ñ\82Å\82¢\82é\8bC\82ª\82·\82é\81B", "You feel sickly."));
42         monap_ptr->obvious = TRUE;
43     }
44 }
45
46 /*!
47  * @brief \98r\97Í\92á\89º\83_\83\81\81[\83W\82ð\8cv\8eZ\82·\82é (\88Û\8e\9d\82ª\82 \82ê\82Î\81A(1d4 + 4) / 9\82É\82È\82é)
48  * @param target_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
49  * @param monap_ptr \83\82\83\93\83X\83^\81[\82©\82ç\83v\83\8c\81[\83\84\81[\82Ö\82Ì\92¼\90Ú\8dU\8c\82\8d\\91¢\91Ì\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
50  * @return \82È\82µ
51  */
52 void calc_blow_lose_strength(player_type *target_ptr, monap_type *monap_ptr)
53 {
54     if (is_sustain_str(target_ptr))
55         monap_ptr->get_damage = monap_ptr->get_damage * (randint1(4) + 4) / 9;
56
57     monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
58     if (target_ptr->is_dead || check_multishadow(target_ptr))
59         return;
60
61     if (do_dec_stat(target_ptr, A_STR))
62         monap_ptr->obvious = TRUE;
63 }
64
65 /*!
66  * @brief \92m\94\\92á\89º\83_\83\81\81[\83W\82ð\8cv\8eZ\82·\82é (\88Û\8e\9d\82ª\82 \82ê\82Î\81A(1d4 + 4) / 9\82É\82È\82é)
67  * @param target_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
68  * @param monap_ptr \83\82\83\93\83X\83^\81[\82©\82ç\83v\83\8c\81[\83\84\81[\82Ö\82Ì\92¼\90Ú\8dU\8c\82\8d\\91¢\91Ì\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
69  * @return \82È\82µ
70  */
71 void calc_blow_lose_intelligence(player_type *target_ptr, monap_type *monap_ptr)
72 {
73     if (is_sustain_int(target_ptr))
74         monap_ptr->get_damage = monap_ptr->get_damage * (randint1(4) + 4) / 9;
75
76     monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
77     if (target_ptr->is_dead || check_multishadow(target_ptr))
78         return;
79
80     if (do_dec_stat(target_ptr, A_INT))
81         monap_ptr->obvious = TRUE;
82 }
83
84 /*!
85  * @brief \8c«\82³\92á\89º\83_\83\81\81[\83W\82ð\8cv\8eZ\82·\82é (\88Û\8e\9d\82ª\82 \82ê\82Î\81A(1d4 + 4) / 9\82É\82È\82é)
86  * @param target_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
87  * @param monap_ptr \83\82\83\93\83X\83^\81[\82©\82ç\83v\83\8c\81[\83\84\81[\82Ö\82Ì\92¼\90Ú\8dU\8c\82\8d\\91¢\91Ì\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
88  * @return \82È\82µ
89  */
90 void calc_blow_lose_wisdom(player_type *target_ptr, monap_type *monap_ptr)
91 {
92     if (is_sustain_wis(target_ptr))
93         monap_ptr->get_damage = monap_ptr->get_damage * (randint1(4) + 4) / 9;
94
95     monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
96     if (target_ptr->is_dead || check_multishadow(target_ptr))
97         return;
98
99     if (do_dec_stat(target_ptr, A_WIS))
100         monap_ptr->obvious = TRUE;
101 }
102
103 /*!
104  * @brief \8aí\97p\92á\89º\83_\83\81\81[\83W\82ð\8cv\8eZ\82·\82é (\88Û\8e\9d\82ª\82 \82ê\82Î\81A(1d4 + 4) / 9\82É\82È\82é)
105  * @param target_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
106  * @param monap_ptr \83\82\83\93\83X\83^\81[\82©\82ç\83v\83\8c\81[\83\84\81[\82Ö\82Ì\92¼\90Ú\8dU\8c\82\8d\\91¢\91Ì\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
107  * @return \82È\82µ
108  */
109 void calc_blow_lose_dexterity(player_type *target_ptr, monap_type *monap_ptr)
110 {
111     if (is_sustain_dex(target_ptr))
112         monap_ptr->get_damage = monap_ptr->get_damage * (randint1(4) + 4) / 9;
113
114     monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
115     if (target_ptr->is_dead || check_multishadow(target_ptr))
116         return;
117
118     if (do_dec_stat(target_ptr, A_DEX))
119         monap_ptr->obvious = TRUE;
120 }
121
122 /*!
123  * @brief \91Ï\8bv\92á\89º\83_\83\81\81[\83W\82ð\8cv\8eZ\82·\82é (\88Û\8e\9d\82ª\82 \82ê\82Î\81A(1d4 + 4) / 9\82É\82È\82é)
124  * @param target_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
125  * @param monap_ptr \83\82\83\93\83X\83^\81[\82©\82ç\83v\83\8c\81[\83\84\81[\82Ö\82Ì\92¼\90Ú\8dU\8c\82\8d\\91¢\91Ì\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
126  * @return \82È\82µ
127  */
128 void calc_blow_lose_constitution(player_type *target_ptr, monap_type *monap_ptr)
129 {
130     if (is_sustain_con(target_ptr))
131         monap_ptr->get_damage = monap_ptr->get_damage * (randint1(4) + 4) / 9;
132
133     monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
134     if (target_ptr->is_dead || check_multishadow(target_ptr))
135         return;
136
137     if (do_dec_stat(target_ptr, A_CON))
138         monap_ptr->obvious = TRUE;
139 }
140
141 /*!
142  * @brief \96£\97Í\92á\89º\83_\83\81\81[\83W\82ð\8cv\8eZ\82·\82é (\88Û\8e\9d\82ª\82 \82ê\82Î\81A(1d4 + 4) / 9\82É\82È\82é)
143  * @param target_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
144  * @param monap_ptr \83\82\83\93\83X\83^\81[\82©\82ç\83v\83\8c\81[\83\84\81[\82Ö\82Ì\92¼\90Ú\8dU\8c\82\8d\\91¢\91Ì\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
145  * @return \82È\82µ
146  */
147 void calc_blow_lose_charisma(player_type *target_ptr, monap_type *monap_ptr)
148 {
149     if (is_sustain_chr(target_ptr))
150         monap_ptr->get_damage = monap_ptr->get_damage * (randint1(4) + 4) / 9;
151
152     monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
153     if (target_ptr->is_dead || check_multishadow(target_ptr))
154         return;
155
156     if (do_dec_stat(target_ptr, A_CHR))
157         monap_ptr->obvious = TRUE;
158 }
159
160 /*!
161  * @brief \91S\94\\97Í\92á\89º\83_\83\81\81[\83W\82ð\8cv\8eZ\82·\82é (\88Û\8e\9d\82ª\82 \82ê\82Î\81A1\82Â\82É\95t\82«-3%\8cy\8c¸\82·\82é)
162  * @param target_ptr \83v\83\8c\81[\83\84\81[\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
163  * @param monap_ptr \83\82\83\93\83X\83^\81[\82©\82ç\83v\83\8c\81[\83\84\81[\82Ö\82Ì\92¼\90Ú\8dU\8c\82\8d\\91¢\91Ì\82Ö\82Ì\8eQ\8fÆ\83|\83C\83\93\83^
164  * @return \82È\82µ
165  */
166 void calc_blow_lose_all(player_type *target_ptr, monap_type *monap_ptr)
167 {
168     int damage_ratio = 100;
169     if (is_sustain_str(target_ptr))
170         damage_ratio -= 3;
171
172     if (is_sustain_int(target_ptr))
173         damage_ratio -= 3;
174
175     if (is_sustain_wis(target_ptr))
176         damage_ratio -= 3;
177
178     if (is_sustain_dex(target_ptr))
179         damage_ratio -= 3;
180
181     if (is_sustain_con(target_ptr))
182         damage_ratio -= 3;
183
184     if (is_sustain_chr(target_ptr))
185         damage_ratio -= 3;
186
187     monap_ptr->damage = monap_ptr->damage * damage_ratio / 100;
188     monap_ptr->get_damage += take_hit(target_ptr, DAMAGE_ATTACK, monap_ptr->damage, monap_ptr->ddesc, -1);
189     if (target_ptr->is_dead || check_multishadow(target_ptr))
190         return;
191
192     process_lose_all_attack(target_ptr, monap_ptr);
193 }