OSDN Git Service

Merge remote-tracking branch 'remotes/hengbandosx/english-3.0.0.4-lost-spelling-corre...
[hengbandforosx/hengbandosx.git] / src / effect / effect-monster-oldies.c
1 #include "effect/effect-monster-oldies.h"
2 #include "core/player-redraw-types.h"
3 #include "effect/effect-monster-util.h"
4 #include "monster-floor/monster-generator.h"
5 #include "monster-race/monster-race.h"
6 #include "monster-race/race-flags1.h"
7 #include "monster-race/race-flags3.h"
8 #include "monster-race/race-flags7.h"
9 #include "monster-race/race-indice-types.h"
10 #include "monster/monster-info.h"
11 #include "monster/monster-status-setter.h"
12 #include "monster/monster-status.h"
13 #include "player-info/avatar.h"
14 #include "system/floor-type-definition.h"
15 #include "view/display-messages.h"
16
17 // Powerful monsters can resist.
18 process_result effect_monster_old_poly(effect_monster_type *em_ptr)
19 {
20     if (em_ptr->seen)
21         em_ptr->obvious = TRUE;
22     em_ptr->do_polymorph = TRUE;
23
24     if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) || (em_ptr->r_ptr->flags1 & RF1_QUESTOR)
25         || (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10)) {
26         em_ptr->note = _("には効果がなかった。", " is unaffected.");
27         em_ptr->do_polymorph = FALSE;
28         em_ptr->obvious = FALSE;
29     }
30
31     em_ptr->dam = 0;
32     return PROCESS_CONTINUE;
33 }
34
35 process_result effect_monster_old_clone(player_type *caster_ptr, effect_monster_type *em_ptr)
36 {
37     if (em_ptr->seen)
38         em_ptr->obvious = TRUE;
39
40     if ((caster_ptr->current_floor_ptr->inside_arena) || is_pet(em_ptr->m_ptr) || (em_ptr->r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR))
41         || (em_ptr->r_ptr->flags7 & (RF7_NAZGUL | RF7_UNIQUE2))) {
42         em_ptr->note = _("には効果がなかった。", " is unaffected.");
43         em_ptr->dam = 0;
44         return PROCESS_CONTINUE;
45     }
46
47     em_ptr->m_ptr->hp = em_ptr->m_ptr->maxhp;
48     if (multiply_monster(caster_ptr, em_ptr->g_ptr->m_idx, TRUE, 0L))
49         em_ptr->note = _("が分裂した!", " spawns!");
50
51     em_ptr->dam = 0;
52     return PROCESS_CONTINUE;
53 }
54
55 process_result effect_monster_star_heal(player_type *caster_ptr, effect_monster_type *em_ptr)
56 {
57     if (em_ptr->seen)
58         em_ptr->obvious = TRUE;
59
60     (void)set_monster_csleep(caster_ptr, em_ptr->g_ptr->m_idx, 0);
61
62     if (em_ptr->m_ptr->maxhp < em_ptr->m_ptr->max_maxhp) {
63         if (em_ptr->seen_msg)
64             msg_format(_("%^sの強さが戻った。", "%^s recovers %s vitality."), em_ptr->m_name, em_ptr->m_poss);
65         em_ptr->m_ptr->maxhp = em_ptr->m_ptr->max_maxhp;
66     }
67
68     if (!em_ptr->dam) {
69         if (caster_ptr->health_who == em_ptr->g_ptr->m_idx)
70             caster_ptr->redraw |= (PR_HEALTH);
71         if (caster_ptr->riding == em_ptr->g_ptr->m_idx)
72             caster_ptr->redraw |= (PR_UHEALTH);
73
74         return PROCESS_FALSE;
75     }
76
77     effect_monster_old_heal(caster_ptr, em_ptr);
78     return PROCESS_TRUE;
79 }
80
81 // who == 0ならばプレーヤーなので、それの判定.
82 static void effect_monster_old_heal_check_player(player_type *caster_ptr, effect_monster_type *em_ptr)
83 {
84     if (em_ptr->who != 0)
85         return;
86
87     chg_virtue(caster_ptr, V_VITALITY, 1);
88     if (em_ptr->r_ptr->flags1 & RF1_UNIQUE)
89         chg_virtue(caster_ptr, V_INDIVIDUALISM, 1);
90
91     if (is_friendly(em_ptr->m_ptr))
92         chg_virtue(caster_ptr, V_HONOUR, 1);
93     else if (!(em_ptr->r_ptr->flags3 & RF3_EVIL)) {
94         if (em_ptr->r_ptr->flags3 & RF3_GOOD)
95             chg_virtue(caster_ptr, V_COMPASSION, 2);
96         else
97             chg_virtue(caster_ptr, V_COMPASSION, 1);
98     }
99
100     if (em_ptr->r_ptr->flags3 & RF3_ANIMAL)
101         chg_virtue(caster_ptr, V_NATURE, 1);
102 }
103
104 static void effect_monster_old_heal_recovery(player_type *caster_ptr, effect_monster_type *em_ptr)
105 {
106     if (monster_stunned_remaining(em_ptr->m_ptr)) {
107         if (em_ptr->seen_msg)
108             msg_format(_("%^sは朦朧状態から立ち直った。", "%^s is no longer stunned."), em_ptr->m_name);
109
110         (void)set_monster_stunned(caster_ptr, em_ptr->g_ptr->m_idx, 0);
111     }
112
113     if (monster_confused_remaining(em_ptr->m_ptr)) {
114         if (em_ptr->seen_msg)
115             msg_format(_("%^sは混乱から立ち直った。", "%^s is no longer confused."), em_ptr->m_name);
116
117         (void)set_monster_confused(caster_ptr, em_ptr->g_ptr->m_idx, 0);
118     }
119
120     if (monster_fear_remaining(em_ptr->m_ptr)) {
121         if (em_ptr->seen_msg)
122             msg_format(_("%^sは勇気を取り戻した。", "%^s recovers %s courage."), em_ptr->m_name, em_ptr->m_poss);
123
124         (void)set_monster_monfear(caster_ptr, em_ptr->g_ptr->m_idx, 0);
125     }
126 }
127
128 // todo サーペントのHPがマジックナンバー扱いになっている
129 process_result effect_monster_old_heal(player_type *caster_ptr, effect_monster_type *em_ptr)
130 {
131     if (em_ptr->seen)
132         em_ptr->obvious = TRUE;
133
134     /* Wake up */
135     (void)set_monster_csleep(caster_ptr, em_ptr->g_ptr->m_idx, 0);
136     effect_monster_old_heal_recovery(caster_ptr, em_ptr);
137     if (em_ptr->m_ptr->hp < 30000)
138         em_ptr->m_ptr->hp += em_ptr->dam;
139     if (em_ptr->m_ptr->hp > em_ptr->m_ptr->maxhp)
140         em_ptr->m_ptr->hp = em_ptr->m_ptr->maxhp;
141
142     effect_monster_old_heal_check_player(caster_ptr, em_ptr);
143     if (em_ptr->m_ptr->r_idx == MON_LEPER) {
144         em_ptr->heal_leper = TRUE;
145         if (!em_ptr->who)
146             chg_virtue(caster_ptr, V_COMPASSION, 5);
147     }
148
149     if (caster_ptr->health_who == em_ptr->g_ptr->m_idx)
150         caster_ptr->redraw |= (PR_HEALTH);
151     if (caster_ptr->riding == em_ptr->g_ptr->m_idx)
152         caster_ptr->redraw |= (PR_UHEALTH);
153
154     em_ptr->note = _("は体力を回復したようだ。", " looks healthier.");
155     em_ptr->dam = 0;
156     return PROCESS_CONTINUE;
157 }
158
159 process_result effect_monster_old_speed(player_type *caster_ptr, effect_monster_type *em_ptr)
160 {
161     if (em_ptr->seen)
162         em_ptr->obvious = TRUE;
163
164     if (set_monster_fast(caster_ptr, em_ptr->g_ptr->m_idx, monster_fast_remaining(em_ptr->m_ptr) + 100)) {
165         em_ptr->note = _("の動きが速くなった。", " starts moving faster.");
166     }
167
168     if (!em_ptr->who) {
169         if (em_ptr->r_ptr->flags1 & RF1_UNIQUE)
170             chg_virtue(caster_ptr, V_INDIVIDUALISM, 1);
171         if (is_friendly(em_ptr->m_ptr))
172             chg_virtue(caster_ptr, V_HONOUR, 1);
173     }
174
175     em_ptr->dam = 0;
176     return PROCESS_CONTINUE;
177 }
178
179 process_result effect_monster_old_slow(player_type *caster_ptr, effect_monster_type *em_ptr)
180 {
181     if (em_ptr->seen)
182         em_ptr->obvious = TRUE;
183
184     /* Powerful monsters can resist */
185     if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) || (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10)) {
186         em_ptr->note = _("には効果がなかった。", " is unaffected.");
187         em_ptr->obvious = FALSE;
188         em_ptr->dam = 0;
189         return PROCESS_CONTINUE;
190     }
191
192     if (set_monster_slow(caster_ptr, em_ptr->g_ptr->m_idx, monster_slow_remaining(em_ptr->m_ptr) + 50))
193         em_ptr->note = _("の動きが遅くなった。", " starts moving slower.");
194
195     em_ptr->dam = 0;
196     return PROCESS_CONTINUE;
197 }
198
199 /*!
200  * todo 「ユニークは (魔法では)常に眠らない」はr_infoの趣旨に反すると思われる
201  * 眠る確率を半分にするとかしておいた方が良さそう
202  */
203 process_result effect_monster_old_sleep(player_type *caster_ptr, effect_monster_type *em_ptr)
204 {
205     if (em_ptr->seen)
206         em_ptr->obvious = TRUE;
207
208     if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) || (em_ptr->r_ptr->flags3 & RF3_NO_SLEEP)
209         || (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10)) {
210         if (em_ptr->r_ptr->flags3 & RF3_NO_SLEEP) {
211             if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
212                 em_ptr->r_ptr->r_flags3 |= (RF3_NO_SLEEP);
213         }
214
215         em_ptr->note = _("には効果がなかった。", " is unaffected.");
216         em_ptr->obvious = FALSE;
217     } else {
218         em_ptr->note = _("は眠り込んでしまった!", " falls asleep!");
219         em_ptr->do_sleep = 500;
220     }
221
222     em_ptr->dam = 0;
223     return PROCESS_CONTINUE;
224 }
225
226 /*!
227  * todo 「ユニークは (魔法では)常に混乱しない」はr_infoの趣旨に反すると思われる
228  * 眠る確率を半分にするとかしておいた方が良さそう
229  */
230 process_result effect_monster_old_conf(player_type *caster_ptr, effect_monster_type *em_ptr)
231 {
232     if (em_ptr->seen)
233         em_ptr->obvious = TRUE;
234
235     em_ptr->do_conf = damroll(3, (em_ptr->dam / 2)) + 1;
236     if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) || (em_ptr->r_ptr->flags3 & (RF3_NO_CONF))
237         || (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10)) {
238         if (em_ptr->r_ptr->flags3 & (RF3_NO_CONF)) {
239             if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr))
240                 em_ptr->r_ptr->r_flags3 |= (RF3_NO_CONF);
241         }
242
243         em_ptr->do_conf = 0;
244         em_ptr->note = _("には効果がなかった。", " is unaffected.");
245         em_ptr->obvious = FALSE;
246     }
247
248     em_ptr->dam = 0;
249     return PROCESS_CONTINUE;
250 }
251
252 process_result effect_monster_stasis(effect_monster_type *em_ptr, bool to_evil)
253 {
254     if (em_ptr->seen)
255         em_ptr->obvious = TRUE;
256
257     int stasis_damage = (em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10);
258     bool has_resistance = (em_ptr->r_ptr->flags1 & RF1_UNIQUE) != 0;
259     has_resistance |= em_ptr->r_ptr->level > randint1(stasis_damage) + 10;
260     if (to_evil)
261         has_resistance |= (em_ptr->r_ptr->flags3 & RF3_EVIL) == 0;
262
263     if (has_resistance) {
264         em_ptr->note = _("には効果がなかった。", " is unaffected.");
265         em_ptr->obvious = FALSE;
266     } else {
267         em_ptr->note = _("は動けなくなった!", " is suspended!");
268         em_ptr->do_sleep = 500;
269     }
270
271     em_ptr->dam = 0;
272     return PROCESS_CONTINUE;
273 }
274
275 process_result effect_monster_stun(effect_monster_type *em_ptr)
276 {
277     if (em_ptr->seen)
278         em_ptr->obvious = TRUE;
279
280     em_ptr->do_stun = damroll((em_ptr->caster_lev / 20) + 3, (em_ptr->dam)) + 1;
281     if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) || (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10)) {
282         em_ptr->do_stun = 0;
283         em_ptr->note = _("には効果がなかった。", " is unaffected.");
284         em_ptr->obvious = FALSE;
285     }
286
287     em_ptr->dam = 0;
288     return PROCESS_CONTINUE;
289 }