2 #include "effect/effect-monster-util.h"
3 #include "effect/effect-monster-oldies.h"
5 #include "monster-status.h"
7 // Powerful monsters can resist.
8 gf_switch_result effect_monster_old_poly(effect_monster_type *em_ptr)
10 if (em_ptr->seen) em_ptr->obvious = TRUE;
11 em_ptr->do_polymorph = TRUE;
13 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
14 (em_ptr->r_ptr->flags1 & RF1_QUESTOR) ||
15 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
17 em_ptr->note = _("には効果がなかった。", " is unaffected.");
18 em_ptr->do_polymorph = FALSE;
19 em_ptr->obvious = FALSE;
23 return GF_SWITCH_CONTINUE;
27 gf_switch_result effect_monster_old_clone(player_type *caster_ptr, effect_monster_type *em_ptr)
29 if (em_ptr->seen) em_ptr->obvious = TRUE;
31 if ((caster_ptr->current_floor_ptr->inside_arena) ||
32 is_pet(em_ptr->m_ptr) ||
33 (em_ptr->r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) ||
34 (em_ptr->r_ptr->flags7 & (RF7_NAZGUL | RF7_UNIQUE2)))
36 em_ptr->note = _("には効果がなかった。", " is unaffected.");
38 return GF_SWITCH_CONTINUE;
41 em_ptr->m_ptr->hp = em_ptr->m_ptr->maxhp;
42 if (multiply_monster(caster_ptr, em_ptr->g_ptr->m_idx, TRUE, 0L))
43 em_ptr->note = _("が分裂した!", " spawns!");
46 return GF_SWITCH_CONTINUE;
50 gf_switch_result effect_monster_star_heal(player_type *caster_ptr, effect_monster_type *em_ptr)
52 if (em_ptr->seen) em_ptr->obvious = TRUE;
54 (void)set_monster_csleep(caster_ptr, em_ptr->g_ptr->m_idx, 0);
56 if (em_ptr->m_ptr->maxhp < em_ptr->m_ptr->max_maxhp)
59 msg_format(_("%^sの強さが戻った。", "%^s recovers %s vitality."), em_ptr->m_name, em_ptr->m_poss);
60 em_ptr->m_ptr->maxhp = em_ptr->m_ptr->max_maxhp;
65 if (caster_ptr->health_who == em_ptr->g_ptr->m_idx)
66 caster_ptr->redraw |= (PR_HEALTH);
67 if (caster_ptr->riding == em_ptr->g_ptr->m_idx)
68 caster_ptr->redraw |= (PR_UHEALTH);
70 return GF_SWITCH_FALSE;
73 return GF_SWITCH_TRUE;
77 // who == 0ならばプレーヤーなので、それの判定.
78 static void effect_monster_old_heal_check_player(player_type *caster_ptr, effect_monster_type *em_ptr)
80 if (em_ptr->who != 0) return;
82 chg_virtue(caster_ptr, V_VITALITY, 1);
83 if (em_ptr->r_ptr->flags1 & RF1_UNIQUE)
84 chg_virtue(caster_ptr, V_INDIVIDUALISM, 1);
86 if (is_friendly(em_ptr->m_ptr))
87 chg_virtue(caster_ptr, V_HONOUR, 1);
88 else if (!(em_ptr->r_ptr->flags3 & RF3_EVIL))
90 if (em_ptr->r_ptr->flags3 & RF3_GOOD)
91 chg_virtue(caster_ptr, V_COMPASSION, 2);
93 chg_virtue(caster_ptr, V_COMPASSION, 1);
96 if (em_ptr->r_ptr->flags3 & RF3_ANIMAL)
97 chg_virtue(caster_ptr, V_NATURE, 1);
101 static void effect_monster_old_heal_recovery(player_type *caster_ptr, effect_monster_type *em_ptr)
103 if (MON_STUNNED(em_ptr->m_ptr))
105 if (em_ptr->seen_msg)
106 msg_format(_("%^sは朦朧状態から立ち直った。", "%^s is no longer stunned."), em_ptr->m_name);
108 (void)set_monster_stunned(caster_ptr, em_ptr->g_ptr->m_idx, 0);
111 if (MON_CONFUSED(em_ptr->m_ptr))
113 if (em_ptr->seen_msg)
114 msg_format(_("%^sは混乱から立ち直った。", "%^s is no longer confused."), em_ptr->m_name);
116 (void)set_monster_confused(caster_ptr, em_ptr->g_ptr->m_idx, 0);
119 if (MON_MONFEAR(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);
124 (void)set_monster_monfear(caster_ptr, em_ptr->g_ptr->m_idx, 0);
129 // todo サーペントのHPがマジックナンバー扱いになっている
130 gf_switch_result effect_monster_old_heal(player_type *caster_ptr, effect_monster_type *em_ptr)
132 if (em_ptr->seen) em_ptr->obvious = TRUE;
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) em_ptr->m_ptr->hp += em_ptr->dam;
138 if (em_ptr->m_ptr->hp > em_ptr->m_ptr->maxhp) em_ptr->m_ptr->hp = em_ptr->m_ptr->maxhp;
140 effect_monster_old_heal_check_player(caster_ptr, em_ptr);
141 if (em_ptr->m_ptr->r_idx == MON_LEPER)
143 em_ptr->heal_leper = TRUE;
144 if (!em_ptr->who) chg_virtue(caster_ptr, V_COMPASSION, 5);
147 if (caster_ptr->health_who == em_ptr->g_ptr->m_idx) caster_ptr->redraw |= (PR_HEALTH);
148 if (caster_ptr->riding == em_ptr->g_ptr->m_idx) caster_ptr->redraw |= (PR_UHEALTH);
150 em_ptr->note = _("は体力を回復したようだ。", " looks healthier.");
152 return GF_SWITCH_CONTINUE;
156 gf_switch_result effect_monster_old_speed(player_type *caster_ptr, effect_monster_type *em_ptr)
158 if (em_ptr->seen) em_ptr->obvious = TRUE;
160 if (set_monster_fast(caster_ptr, em_ptr->g_ptr->m_idx, MON_FAST(em_ptr->m_ptr) + 100))
162 em_ptr->note = _("の動きが速くなった。", " starts moving faster.");
167 if (em_ptr->r_ptr->flags1 & RF1_UNIQUE)
168 chg_virtue(caster_ptr, V_INDIVIDUALISM, 1);
169 if (is_friendly(em_ptr->m_ptr))
170 chg_virtue(caster_ptr, V_HONOUR, 1);
174 return GF_SWITCH_CONTINUE;
178 gf_switch_result effect_monster_old_slow(player_type *caster_ptr, effect_monster_type *em_ptr)
180 if (em_ptr->seen) em_ptr->obvious = TRUE;
182 /* Powerful monsters can resist */
183 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
184 (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;
189 return GF_SWITCH_CONTINUE;
192 if (set_monster_slow(caster_ptr, em_ptr->g_ptr->m_idx, MON_SLOW(em_ptr->m_ptr) + 50))
193 em_ptr->note = _("の動きが遅くなった。", " starts moving slower.");
196 return GF_SWITCH_CONTINUE;
200 gf_switch_result effect_monster_old_sleep(player_type *caster_ptr, effect_monster_type *em_ptr)
202 if (em_ptr->seen) em_ptr->obvious = TRUE;
204 if ((em_ptr->r_ptr->flags1 & RF1_UNIQUE) ||
205 (em_ptr->r_ptr->flags3 & RF3_NO_SLEEP) ||
206 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
208 if (em_ptr->r_ptr->flags3 & RF3_NO_SLEEP)
210 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_NO_SLEEP);
213 em_ptr->note = _("には効果がなかった。", " is unaffected.");
214 em_ptr->obvious = FALSE;
218 em_ptr->note = _("は眠り込んでしまった!", " falls asleep!");
219 em_ptr->do_sleep = 500;
223 return GF_SWITCH_CONTINUE;
227 gf_switch_result effect_monster_old_conf(player_type *caster_ptr, effect_monster_type *em_ptr)
229 if (em_ptr->seen) em_ptr->obvious = TRUE;
231 em_ptr->do_conf = damroll(3, (em_ptr->dam / 2)) + 1;
232 if ((em_ptr->r_ptr->flags1 & (RF1_UNIQUE)) ||
233 (em_ptr->r_ptr->flags3 & (RF3_NO_CONF)) ||
234 (em_ptr->r_ptr->level > randint1((em_ptr->dam - 10) < 1 ? 1 : (em_ptr->dam - 10)) + 10))
236 if (em_ptr->r_ptr->flags3 & (RF3_NO_CONF))
238 if (is_original_ap_and_seen(caster_ptr, em_ptr->m_ptr)) em_ptr->r_ptr->r_flags3 |= (RF3_NO_CONF);
242 em_ptr->note = _("には効果がなかった。", " is unaffected.");
243 em_ptr->obvious = FALSE;
247 return GF_SWITCH_CONTINUE;