OSDN Git Service

[Refactor] #37353 再描画フラグ PR_* 定義を view-mainwindow.h へ移動.
[hengband/hengband.git] / src / player-effects.c
1 /*!
2  * @file effects.c
3  * @brief プレイヤーのステータス管理 / effects of various "objects"
4  * @date 2014/01/01
5  * @author
6  * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
7  *\n
8  * This software may be copied and distributed for educational, research,\n
9  * and not for profit purposes provided that this copyright and statement\n
10  * are included in all such copies.  Other copyrights may also apply.\n
11  *\n
12  * 2013 Deskull rearranged comment for Doxygen.\n
13  */
14
15 #include "angband.h"
16 #include "term.h"
17 #include "core.h"
18 #include "util.h"
19
20 #include "creature.h"
21
22 #include "artifact.h"
23 #include "cmd-dump.h"
24 #include "floor.h"
25 #include "bldg.h"
26 #include "birth.h"
27 #include "grid.h"
28 #include "mutation.h"
29 #include "quest.h"
30 #include "avatar.h"
31 #include "spells-status.h"
32 #include "realm-song.h"
33 #include "realm-hex.h"
34 #include "object-ego.h"
35 #include "object-hook.h"
36 #include "wild.h"
37 #include "spells-floor.h"
38 #include "player-status.h"
39 #include "player-class.h"
40 #include "player-move.h"
41 #include "player-effects.h"
42 #include "player-race.h"
43 #include "player-class.h"
44 #include "player-personality.h"
45 #include "player-sex.h"
46 #include "monster-status.h"
47 #include "snipe.h"
48 #include "files.h"
49 #include "monster-spell.h"
50 #include "world.h"
51 #include "objectkind.h"
52 #include "autopick.h"
53 #include "save.h"
54 #include "report.h"
55
56 #include "view-mainwindow.h"
57
58  /*!
59   * @brief 修行僧の構え能力テーブル
60   */
61 const kamae kamae_shurui[MAX_KAMAE] =
62 {
63 #ifdef JP
64         {"玄武", 25, ""},
65         {"白虎", 30, ""},
66         {"青竜", 35, ""},
67         {"朱雀", 40, ""},
68 #else
69         {"Genbu", 25, "(Black Tortoise) "},
70         {"Byakko", 30, "(White Tiger) "},
71         {"Seiryuu", 35, "(Blue Dragon) "},
72         {"Suzaku", 40, "(Red Phoenix) "},
73 #endif
74 };
75
76 /*!
77  * @brief 剣術家の構え能力テーブル
78  */
79 const kamae kata_shurui[MAX_KATA] =
80 {
81 #ifdef JP
82         {"居合", 25, ""},
83         {"風塵", 30, ""},
84         {"降鬼", 35, ""},
85         {"無想", 40, ""},
86 #else
87         {"Iai", 25, ""},
88         {"Huujin", 30, ""},
89         {"Kouki", 35, ""},
90         {"Musou", 40, ""},
91 #endif
92 };
93
94
95 /*!
96  * @brief プレイヤーの継続行動を設定する。
97  * @param typ 継続行動のID\n
98  * #ACTION_NONE / #ACTION_SEARCH / #ACTION_REST / #ACTION_LEARN / #ACTION_FISH / #ACTION_KAMAE / #ACTION_KATA / #ACTION_SING / #ACTION_HAYAGAKE / #ACTION_SPELL から選択。
99  * @return なし
100  */
101 void set_action(ACTION_IDX typ)
102 {
103         int prev_typ = p_ptr->action;
104
105         if (typ == prev_typ)
106         {
107                 return;
108         }
109         else
110         {
111                 switch (prev_typ)
112                 {
113                         case ACTION_SEARCH:
114                         {
115                                 msg_print(_("探索をやめた。", "You no longer walk carefully."));
116                                 p_ptr->redraw |= (PR_SPEED);
117                                 break;
118                         }
119                         case ACTION_REST:
120                         {
121                                 p_ptr->resting = 0;
122                                 break;
123                         }
124                         case ACTION_LEARN:
125                         {
126                                 msg_print(_("学習をやめた。", "You stop Learning"));
127                                 new_mane = FALSE;
128                                 break;
129                         }
130                         case ACTION_KAMAE:
131                         {
132                                 msg_print(_("構えをといた。", "You stop assuming the posture."));
133                                 p_ptr->special_defense &= ~(KAMAE_MASK);
134                                 break;
135                         }
136                         case ACTION_KATA:
137                         {
138                                 msg_print(_("型を崩した。", "You stop assuming the posture."));
139                                 p_ptr->special_defense &= ~(KATA_MASK);
140                                 p_ptr->update |= (PU_MONSTERS);
141                                 p_ptr->redraw |= (PR_STATUS);
142                                 break;
143                         }
144                         case ACTION_SING:
145                         {
146                                 msg_print(_("歌うのをやめた。", "You stop singing."));
147                                 break;
148                         }
149                         case ACTION_HAYAGAKE:
150                         {
151                                 msg_print(_("足が重くなった。", "You are no longer walking extremely fast."));
152                                 take_turn(p_ptr, 100);
153                                 break;
154                         }
155                         case ACTION_SPELL:
156                         {
157                                 msg_print(_("呪文の詠唱を中断した。", "You stopped spelling all spells."));
158                                 break;
159                         }
160                 }
161         }
162
163         p_ptr->action = typ;
164
165         /* If we are requested other action, stop singing */
166         if (prev_typ == ACTION_SING) stop_singing(p_ptr);
167         if (prev_typ == ACTION_SPELL) stop_hex_spell();
168
169         switch (p_ptr->action)
170         {
171                 case ACTION_SEARCH:
172                 {
173                         msg_print(_("注意深く歩き始めた。", "You begin to walk carefully."));
174                         p_ptr->redraw |= (PR_SPEED);
175                         break;
176                 }
177                 case ACTION_LEARN:
178                 {
179                         msg_print(_("学習を始めた。", "You begin Learning"));
180                         break;
181                 }
182                 case ACTION_FISH:
183                 {
184                         msg_print(_("水面に糸を垂らした...", "You begin fishing..."));
185                         break;
186                 }
187                 case ACTION_HAYAGAKE:
188                 {
189                         msg_print(_("足が羽のように軽くなった。", "You begin to walk extremely fast."));
190                         break;
191                 }
192                 default:
193                 {
194                         break;
195                 }
196         }
197         p_ptr->update |= (PU_BONUS);
198         p_ptr->redraw |= (PR_STATE);
199 }
200
201 /*!
202  * @brief プレイヤーの全ての時限効果をリセットする。 / reset timed flags
203  * @return なし
204  */
205 void reset_tim_flags(void)
206 {
207         p_ptr->fast = 0;            /* Timed -- Fast */
208         p_ptr->lightspeed = 0;
209         p_ptr->slow = 0;            /* Timed -- Slow */
210         p_ptr->blind = 0;           /* Timed -- Blindness */
211         p_ptr->paralyzed = 0;       /* Timed -- Paralysis */
212         p_ptr->confused = 0;        /* Timed -- Confusion */
213         p_ptr->afraid = 0;          /* Timed -- Fear */
214         p_ptr->image = 0;           /* Timed -- Hallucination */
215         p_ptr->poisoned = 0;        /* Timed -- Poisoned */
216         p_ptr->cut = 0;             /* Timed -- Cut */
217         p_ptr->stun = 0;            /* Timed -- Stun */
218
219         p_ptr->protevil = 0;        /* Timed -- Protection */
220         p_ptr->invuln = 0;          /* Timed -- Invulnerable */
221         p_ptr->ult_res = 0;
222         p_ptr->hero = 0;            /* Timed -- Heroism */
223         p_ptr->shero = 0;           /* Timed -- Super Heroism */
224         p_ptr->shield = 0;          /* Timed -- Shield Spell */
225         p_ptr->blessed = 0;         /* Timed -- Blessed */
226         p_ptr->tim_invis = 0;       /* Timed -- Invisibility */
227         p_ptr->tim_infra = 0;       /* Timed -- Infra Vision */
228         p_ptr->tim_regen = 0;       /* Timed -- Regeneration */
229         p_ptr->tim_stealth = 0;     /* Timed -- Stealth */
230         p_ptr->tim_esp = 0;
231         p_ptr->wraith_form = 0;     /* Timed -- Wraith Form */
232         p_ptr->tim_levitation = 0;
233         p_ptr->tim_sh_touki = 0;
234         p_ptr->tim_sh_fire = 0;
235         p_ptr->tim_sh_holy = 0;
236         p_ptr->tim_eyeeye = 0;
237         p_ptr->magicdef = 0;
238         p_ptr->resist_magic = 0;
239         p_ptr->tsuyoshi = 0;
240         p_ptr->kabenuke = 0;
241         p_ptr->tim_res_nether = 0;
242         p_ptr->tim_res_time = 0;
243         p_ptr->tim_mimic = 0;
244         p_ptr->mimic_form = 0;
245         p_ptr->tim_reflect = 0;
246         p_ptr->multishadow = 0;
247         p_ptr->dustrobe = 0;
248         p_ptr->action = ACTION_NONE;
249
250         p_ptr->oppose_acid = 0;     /* Timed -- oppose acid */
251         p_ptr->oppose_elec = 0;     /* Timed -- oppose lightning */
252         p_ptr->oppose_fire = 0;     /* Timed -- oppose heat */
253         p_ptr->oppose_cold = 0;     /* Timed -- oppose cold */
254         p_ptr->oppose_pois = 0;     /* Timed -- oppose poison */
255
256         p_ptr->word_recall = 0;
257         p_ptr->alter_reality = 0;
258         p_ptr->sutemi = FALSE;
259         p_ptr->counter = FALSE;
260         p_ptr->ele_attack = 0;
261         p_ptr->ele_immune = 0;
262         p_ptr->special_attack = 0L;
263         p_ptr->special_defense = 0L;
264
265         while(p_ptr->energy_need < 0) p_ptr->energy_need += ENERGY_NEED();
266         p_ptr->timewalk = FALSE;
267
268         if (prace_is_(RACE_DEMON) && (p_ptr->lev > 44)) p_ptr->oppose_fire = 1;
269         if ((p_ptr->pclass == CLASS_NINJA) && (p_ptr->lev > 44)) p_ptr->oppose_pois = 1;
270         if (p_ptr->pclass == CLASS_BERSERKER) p_ptr->shero = 1;
271
272         if (p_ptr->riding)
273         {
274                 (void)set_monster_fast(p_ptr->riding, 0);
275                 (void)set_monster_slow(p_ptr->riding, 0);
276                 (void)set_monster_invulner(p_ptr->riding, 0, FALSE);
277         }
278
279         if (p_ptr->pclass == CLASS_BARD)
280         {
281                 SINGING_SONG_EFFECT(p_ptr) = 0;
282                 SINGING_SONG_ID(p_ptr) = 0;
283         }
284 }
285
286 /*!
287  * @brief プレイヤーに魔力消去効果を与える。
288  * @return なし
289  */
290 void dispel_player(void)
291 {
292         (void)set_fast(0, TRUE);
293         (void)set_lightspeed(0, TRUE);
294         (void)set_slow(0, TRUE);
295         (void)set_shield(0, TRUE);
296         (void)set_blessed(0, TRUE);
297         (void)set_tsuyoshi(0, TRUE);
298         (void)set_hero(0, TRUE);
299         (void)set_shero(0, TRUE);
300         (void)set_protevil(0, TRUE);
301         (void)set_invuln(0, TRUE);
302         (void)set_wraith_form(0, TRUE);
303         (void)set_kabenuke(0, TRUE);
304         (void)set_tim_res_nether(0, TRUE);
305         (void)set_tim_res_time(0, TRUE);
306         /* by henkma */
307         (void)set_tim_reflect(0,TRUE);
308         (void)set_multishadow(0,TRUE);
309         (void)set_dustrobe(0,TRUE);
310
311         (void)set_tim_invis(0, TRUE);
312         (void)set_tim_infra(0, TRUE);
313         (void)set_tim_esp(0, TRUE);
314         (void)set_tim_regen(0, TRUE);
315         (void)set_tim_stealth(0, TRUE);
316         (void)set_tim_levitation(0, TRUE);
317         (void)set_tim_sh_touki(0, TRUE);
318         (void)set_tim_sh_fire(0, TRUE);
319         (void)set_tim_sh_holy(0, TRUE);
320         (void)set_tim_eyeeye(0, TRUE);
321         (void)set_magicdef(0, TRUE);
322         (void)set_resist_magic(0, TRUE);
323         (void)set_oppose_acid(0, TRUE);
324         (void)set_oppose_elec(0, TRUE);
325         (void)set_oppose_fire(0, TRUE);
326         (void)set_oppose_cold(0, TRUE);
327         (void)set_oppose_pois(0, TRUE);
328         (void)set_ultimate_res(0, TRUE);
329         (void)set_mimic(0, 0, TRUE);
330         (void)set_ele_attack(0, 0);
331         (void)set_ele_immune(0, 0);
332
333         /* Cancel glowing hands */
334         if (p_ptr->special_attack & ATTACK_CONFUSE)
335         {
336                 p_ptr->special_attack &= ~(ATTACK_CONFUSE);
337                 msg_print(_("手の輝きがなくなった。", "Your hands stop glowing."));
338         }
339
340         if (music_singing_any() || hex_spelling_any())
341         {
342                 concptr str = (music_singing_any()) ? _("歌", "singing") : _("呪文", "spelling");
343                 INTERUPTING_SONG_EFFECT(p_ptr) = SINGING_SONG_EFFECT(p_ptr);
344                 SINGING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
345                 msg_format(_("%sが途切れた。", "Your %s is interrupted."), str);
346
347                 p_ptr->action = ACTION_NONE;
348                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MONSTERS);
349                 p_ptr->redraw |= (PR_MAP | PR_STATUS | PR_STATE);
350                 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
351                 p_ptr->energy_need += ENERGY_NEED();
352         }
353 }
354
355
356 /*!
357  * @brief 変身効果の継続時間と変身先をセットする / Set "p_ptr->tim_mimic", and "p_ptr->mimic_form", notice observable changes
358  * @param v 継続時間
359  * @param p 変身内容
360  * @param do_dec 現在の継続時間より長い値のみ上書きする
361  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
362  */
363 bool set_mimic(TIME_EFFECT v, IDX p, bool do_dec)
364 {
365         bool notice = FALSE;
366         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
367
368         if (p_ptr->is_dead) return FALSE;
369
370         /* Open */
371         if (v)
372         {
373                 if (p_ptr->tim_mimic && (p_ptr->mimic_form == p) && !do_dec)
374                 {
375                         if (p_ptr->tim_mimic > v) return FALSE;
376                 }
377                 else if ((!p_ptr->tim_mimic) || (p_ptr->mimic_form != p))
378                 {
379                         msg_print(_("自分の体が変わってゆくのを感じた。", "You feel that your body changes."));
380                         p_ptr->mimic_form = p;
381                         notice = TRUE;
382                 }
383         }
384
385         /* Shut */
386         else
387         {
388                 if (p_ptr->tim_mimic)
389                 {
390                         msg_print(_("変身が解けた。", "You are no longer transformed."));
391                         if (p_ptr->mimic_form == MIMIC_DEMON) set_oppose_fire(0, TRUE);
392                         p_ptr->mimic_form=0;
393                         notice = TRUE;
394                         p = 0;
395                 }
396         }
397
398         /* Use the value */
399         p_ptr->tim_mimic = v;
400
401         /* Nothing to notice */
402         if (!notice) return (FALSE);
403
404         if (disturb_state) disturb(FALSE, TRUE);
405
406         p_ptr->redraw |= (PR_BASIC | PR_STATUS);
407         p_ptr->update |= (PU_BONUS | PU_HP);
408
409         handle_stuff();
410         return (TRUE);
411 }
412
413 /*!
414  * @brief 盲目の継続時間をセットする / Set "p_ptr->blind", notice observable changes
415  * @param v 継続時間
416  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
417  * @details
418  * Note the use of "PU_UN_LITE" and "PU_UN_VIEW", which is needed to\n
419  * memorize any terrain features which suddenly become "visible".\n
420  * Note that blindness is currently the only thing which can affect\n
421  * "player_can_see_bold()".\n
422  */
423 bool set_blind(TIME_EFFECT v)
424 {
425         bool notice = FALSE;
426         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
427
428         if (p_ptr->is_dead) return FALSE;
429
430         /* Open */
431         if (v)
432         {
433                 if (!p_ptr->blind)
434                 {
435                         if (p_ptr->prace == RACE_ANDROID)
436                         {
437                                 msg_print(_("センサーをやられた!", "You are blind!"));
438                         }
439                         else
440                         {
441                                 msg_print(_("目が見えなくなってしまった!", "You are blind!"));
442                         }
443
444                         notice = TRUE;
445                         chg_virtue(V_ENLIGHTEN, -1);
446                 }
447         }
448
449         /* Shut */
450         else
451         {
452                 if (p_ptr->blind)
453                 {
454                         if (p_ptr->prace == RACE_ANDROID)
455                         {
456                                 msg_print(_("センサーが復旧した。", "You can see again."));
457                         }
458                         else
459                         {
460                                 msg_print(_("やっと目が見えるようになった。", "You can see again."));
461                         }
462
463                         notice = TRUE;
464                 }
465         }
466
467         /* Use the value */
468         p_ptr->blind = v;
469         p_ptr->redraw |= (PR_STATUS);
470
471         /* Nothing to notice */
472         if (!notice) return (FALSE);
473         if (disturb_state) disturb(FALSE, FALSE);
474
475         /* Fully update the visuals */
476         p_ptr->update |= (PU_UN_VIEW | PU_UN_LITE | PU_VIEW | PU_LITE | PU_MONSTERS | PU_MON_LITE);
477         p_ptr->redraw |= (PR_MAP);
478         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
479         handle_stuff();
480         return (TRUE);
481 }
482
483
484 /*!
485  * @brief 混乱の継続時間をセットする / Set "p_ptr->confused", notice observable changes
486  * @param v 継続時間
487  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
488  */
489 bool set_confused(TIME_EFFECT v)
490 {
491         bool notice = FALSE;
492         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
493
494         if (p_ptr->is_dead) return FALSE;
495
496         /* Open */
497         if (v)
498         {
499                 if (!p_ptr->confused)
500                 {
501                         msg_print(_("あなたは混乱した!", "You are confused!"));
502
503                         if (p_ptr->action == ACTION_LEARN)
504                         {
505                                 msg_print(_("学習が続けられない!", "You cannot continue Learning!"));
506                                 new_mane = FALSE;
507
508                                 p_ptr->redraw |= (PR_STATE);
509                                 p_ptr->action = ACTION_NONE;
510                         }
511                         if (p_ptr->action == ACTION_KAMAE)
512                         {
513                                 msg_print(_("構えがとけた。", "Your posture gets loose."));
514                                 p_ptr->special_defense &= ~(KAMAE_MASK);
515                                 p_ptr->update |= (PU_BONUS);
516                                 p_ptr->redraw |= (PR_STATE);
517                                 p_ptr->action = ACTION_NONE;
518                         }
519                         else if (p_ptr->action == ACTION_KATA)
520                         {
521                                 msg_print(_("型が崩れた。", "Your posture gets loose."));
522                                 p_ptr->special_defense &= ~(KATA_MASK);
523                                 p_ptr->update |= (PU_BONUS);
524                                 p_ptr->update |= (PU_MONSTERS);
525                                 p_ptr->redraw |= (PR_STATE);
526                                 p_ptr->redraw |= (PR_STATUS);
527                                 p_ptr->action = ACTION_NONE;
528                         }
529
530                         /* Sniper */
531                         if (p_ptr->concent) reset_concentration(TRUE);
532
533                         /* Hex */
534                         if (hex_spelling_any()) stop_hex_spell_all();
535
536                         notice = TRUE;
537                         p_ptr->counter = FALSE;
538                         chg_virtue(V_HARMONY, -1);
539                 }
540         }
541
542         /* Shut */
543         else
544         {
545                 if (p_ptr->confused)
546                 {
547                         msg_print(_("やっと混乱がおさまった。", "You feel less confused now."));
548                         p_ptr->special_attack &= ~(ATTACK_SUIKEN);
549                         notice = TRUE;
550                 }
551         }
552
553         /* Use the value */
554         p_ptr->confused = v;
555         p_ptr->redraw |= (PR_STATUS);
556
557         /* Nothing to notice */
558         if (!notice) return (FALSE);
559
560         if (disturb_state) disturb(FALSE, FALSE);
561         handle_stuff();
562         return (TRUE);
563 }
564
565
566 /*!
567  * @brief 毒の継続時間をセットする / Set "p_ptr->poisoned", notice observable changes
568  * @param v 継続時間
569  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
570  */
571 bool set_poisoned(TIME_EFFECT v)
572 {
573         bool notice = FALSE;
574         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
575
576         if (p_ptr->is_dead) return FALSE;
577
578         /* Open */
579         if (v)
580         {
581                 if (!p_ptr->poisoned)
582                 {
583                         msg_print(_("毒に侵されてしまった!", "You are poisoned!"));
584                         notice = TRUE;
585                 }
586         }
587
588         /* Shut */
589         else
590         {
591                 if (p_ptr->poisoned)
592                 {
593                         msg_print(_("やっと毒の痛みがなくなった。", "You are no longer poisoned."));
594                         notice = TRUE;
595                 }
596         }
597
598         /* Use the value */
599         p_ptr->poisoned = v;
600         p_ptr->redraw |= (PR_STATUS);
601
602         /* Nothing to notice */
603         if (!notice) return (FALSE);
604
605         if (disturb_state) disturb(FALSE, FALSE);
606         handle_stuff();
607         return (TRUE);
608 }
609
610
611 /*!
612  * @brief 恐怖の継続時間をセットする / Set "p_ptr->afraid", notice observable changes
613  * @param v 継続時間
614  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
615  */
616 bool set_afraid(TIME_EFFECT v)
617 {
618         bool notice = FALSE;
619         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
620
621         if (p_ptr->is_dead) return FALSE;
622
623         /* Open */
624         if (v)
625         {
626                 if (!p_ptr->afraid)
627                 {
628                         msg_print(_("何もかも恐くなってきた!", "You are terrified!"));
629
630                         if (p_ptr->special_defense & KATA_MASK)
631                         {
632                                 msg_print(_("型が崩れた。", "Your posture gets loose."));
633                                 p_ptr->special_defense &= ~(KATA_MASK);
634                                 p_ptr->update |= (PU_BONUS);
635                                 p_ptr->update |= (PU_MONSTERS);
636                                 p_ptr->redraw |= (PR_STATE);
637                                 p_ptr->redraw |= (PR_STATUS);
638                                 p_ptr->action = ACTION_NONE;
639                         }
640
641                         notice = TRUE;
642                         p_ptr->counter = FALSE;
643                         chg_virtue(V_VALOUR, -1);
644                 }
645         }
646
647         /* Shut */
648         else
649         {
650                 if (p_ptr->afraid)
651                 {
652                         msg_print(_("やっと恐怖を振り払った。", "You feel bolder now."));
653                         notice = TRUE;
654                 }
655         }
656
657         /* Use the value */
658         p_ptr->afraid = v;
659         p_ptr->redraw |= (PR_STATUS);
660
661         /* Nothing to notice */
662         if (!notice) return (FALSE);
663
664         if (disturb_state) disturb(FALSE, FALSE);
665         handle_stuff();
666         return (TRUE);
667 }
668
669 /*!
670  * @brief 麻痺の継続時間をセットする / Set "p_ptr->paralyzed", notice observable changes
671  * @param v 継続時間
672  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
673  */
674 bool set_paralyzed(TIME_EFFECT v)
675 {
676         bool notice = FALSE;
677         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
678
679         if (p_ptr->is_dead) return FALSE;
680
681         /* Open */
682         if (v)
683         {
684                 if (!p_ptr->paralyzed)
685                 {
686                         msg_print(_("体が麻痺してしまった!", "You are paralyzed!"));
687                         /* Sniper */
688                         if (p_ptr->concent) reset_concentration(TRUE);
689
690                         /* Hex */
691                         if (hex_spelling_any()) stop_hex_spell_all();
692
693                         p_ptr->counter = FALSE;
694                         notice = TRUE;
695                 }
696         }
697
698         /* Shut */
699         else
700         {
701                 if (p_ptr->paralyzed)
702                 {
703                         msg_print(_("やっと動けるようになった。", "You can move again."));
704                         notice = TRUE;
705                 }
706         }
707
708         /* Use the value */
709         p_ptr->paralyzed = v;
710         p_ptr->redraw |= (PR_STATUS);
711
712         /* Nothing to notice */
713         if (!notice) return (FALSE);
714
715         if (disturb_state) disturb(FALSE, FALSE);
716         p_ptr->redraw |= (PR_STATE);
717         handle_stuff();
718         return (TRUE);
719 }
720
721 /*!
722  * @brief 幻覚の継続時間をセットする / Set "p_ptr->image", notice observable changes
723  * @param v 継続時間
724  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
725  * @details Note that we must redraw the map when hallucination changes.
726  */
727 bool set_image(TIME_EFFECT v)
728 {
729         bool notice = FALSE;
730         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
731
732         if (p_ptr->is_dead) return FALSE;
733         if (p_ptr->pseikaku == SEIKAKU_CHARGEMAN) v = 0;
734
735
736         /* Open */
737         if (v)
738         {
739                 set_tsuyoshi(0, TRUE);
740                 if (!p_ptr->image)
741                 {
742                         msg_print(_("ワーオ!何もかも虹色に見える!", "Oh, wow! Everything looks so cosmic now!"));
743
744                         /* Sniper */
745                         if (p_ptr->concent) reset_concentration(TRUE);
746
747                         p_ptr->counter = FALSE;
748                         notice = TRUE;
749                 }
750         }
751
752         /* Shut */
753         else
754         {
755                 if (p_ptr->image)
756                 {
757                         msg_print(_("やっとはっきりと物が見えるようになった。", "You can see clearly again."));
758                         notice = TRUE;
759                 }
760         }
761
762         /* Use the value */
763         p_ptr->image = v;
764         p_ptr->redraw |= (PR_STATUS);
765
766         /* Nothing to notice */
767         if (!notice) return (FALSE);
768
769         if (disturb_state) disturb(FALSE, TRUE);
770
771         p_ptr->redraw |= (PR_MAP | PR_HEALTH | PR_UHEALTH);
772         p_ptr->update |= (PU_MONSTERS);
773         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
774         handle_stuff();
775         return (TRUE);
776 }
777
778 /*!
779  * @brief 加速の継続時間をセットする / Set "p_ptr->fast", notice observable changes
780  * @param v 継続時間
781  * @param do_dec 現在の継続時間より長い値のみ上書きする
782  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
783  */
784 bool set_fast(TIME_EFFECT v, bool do_dec)
785 {
786         bool notice = FALSE;
787         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
788
789         if (p_ptr->is_dead) return FALSE;
790
791         /* Open */
792         if (v)
793         {
794                 if (p_ptr->fast && !do_dec)
795                 {
796                         if (p_ptr->fast > v) return FALSE;
797                 }
798                 else if (!IS_FAST() && !p_ptr->lightspeed)
799                 {
800                         msg_print(_("素早く動けるようになった!", "You feel yourself moving much faster!"));
801                         notice = TRUE;
802                         chg_virtue(V_PATIENCE, -1);
803                         chg_virtue(V_DILIGENCE, 1);
804                 }
805         }
806
807         /* Shut */
808         else
809         {
810                 if (p_ptr->fast && !p_ptr->lightspeed && !music_singing(MUSIC_SPEED) && !music_singing(MUSIC_SHERO))
811                 {
812                         msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
813                         notice = TRUE;
814                 }
815         }
816
817         /* Use the value */
818         p_ptr->fast = v;
819
820         /* Nothing to notice */
821         if (!notice) return (FALSE);
822
823         if (disturb_state) disturb(FALSE, FALSE);
824         p_ptr->update |= (PU_BONUS);
825         handle_stuff();
826         return (TRUE);
827 }
828
829 /*!
830  * @brief 光速移動の継続時間をセットする / Set "p_ptr->lightspeed", notice observable changes
831  * @param v 継続時間
832  * @param do_dec 現在の継続時間より長い値のみ上書きする
833  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
834  */
835 bool set_lightspeed(TIME_EFFECT v, bool do_dec)
836 {
837         bool notice = FALSE;
838         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
839
840         if (p_ptr->is_dead) return FALSE;
841
842         if (p_ptr->wild_mode) v = 0;
843
844         /* Open */
845         if (v)
846         {
847                 if (p_ptr->lightspeed && !do_dec)
848                 {
849                         if (p_ptr->lightspeed > v) return FALSE;
850                 }
851                 else if (!p_ptr->lightspeed)
852                 {
853                         msg_print(_("非常に素早く動けるようになった!", "You feel yourself moving extremely faster!"));
854                         notice = TRUE;
855                         chg_virtue(V_PATIENCE, -1);
856                         chg_virtue(V_DILIGENCE, 1);
857                 }
858         }
859
860         /* Shut */
861         else
862         {
863                 if (p_ptr->lightspeed)
864                 {
865                         msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));
866                         notice = TRUE;
867                 }
868         }
869
870         /* Use the value */
871         p_ptr->lightspeed = v;
872
873         /* Nothing to notice */
874         if (!notice) return (FALSE);
875
876         if (disturb_state) disturb(FALSE, FALSE);
877         p_ptr->update |= (PU_BONUS);
878         handle_stuff();
879         return (TRUE);
880 }
881
882 /*!
883  * @brief 減速の継続時間をセットする / Set "p_ptr->slow", notice observable changes
884  * @param v 継続時間
885  * @param do_dec 現在の継続時間より長い値のみ上書きする
886  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
887  */
888 bool set_slow(TIME_EFFECT v, bool do_dec)
889 {
890         bool notice = FALSE;
891         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
892
893         if (p_ptr->is_dead) return FALSE;
894
895         /* Open */
896         if (v)
897         {
898                 if (p_ptr->slow && !do_dec)
899                 {
900                         if (p_ptr->slow > v) return FALSE;
901                 }
902                 else if (!p_ptr->slow)
903                 {
904                         msg_print(_("体の動きが遅くなってしまった!", "You feel yourself moving slower!"));
905                         notice = TRUE;
906                 }
907         }
908
909         /* Shut */
910         else
911         {
912                 if (p_ptr->slow)
913                 {
914                         msg_print(_("動きの遅さがなくなったようだ。", "You feel yourself speed up."));
915                         notice = TRUE;
916                 }
917         }
918
919         /* Use the value */
920         p_ptr->slow = v;
921
922         /* Nothing to notice */
923         if (!notice) return (FALSE);
924
925         if (disturb_state) disturb(FALSE, FALSE);
926         p_ptr->update |= (PU_BONUS);
927         handle_stuff();
928         return (TRUE);
929 }
930
931
932 /*!
933  * @brief 肌石化の継続時間をセットする / Set "p_ptr->shield", notice observable changes
934  * @param v 継続時間
935  * @param do_dec 現在の継続時間より長い値のみ上書きする
936  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
937  */
938 bool set_shield(TIME_EFFECT v, bool do_dec)
939 {
940         bool notice = FALSE;
941         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
942
943         if (p_ptr->is_dead) return FALSE;
944
945         /* Open */
946         if (v)
947         {
948                 if (p_ptr->shield && !do_dec)
949                 {
950                         if (p_ptr->shield > v) return FALSE;
951                 }
952                 else if (!p_ptr->shield)
953                 {
954                         msg_print(_("肌が石になった。", "Your skin turns to stone."));
955                         notice = TRUE;
956                 }
957         }
958
959         /* Shut */
960         else
961         {
962                 if (p_ptr->shield)
963                 {
964                         msg_print(_("肌が元に戻った。", "Your skin returns to normal."));
965                         notice = TRUE;
966                 }
967         }
968
969         /* Use the value */
970         p_ptr->shield = v;
971         p_ptr->redraw |= (PR_STATUS);
972
973         /* Nothing to notice */
974         if (!notice) return (FALSE);
975
976         if (disturb_state) disturb(FALSE, FALSE);
977         p_ptr->update |= (PU_BONUS);
978         handle_stuff();
979         return (TRUE);
980 }
981
982
983 /*!
984  * @brief つぶれるの継続時間をセットする / Set "p_ptr->tsubureru", notice observable changes
985  * @param v 継続時間
986  * @param do_dec 現在の継続時間より長い値のみ上書きする
987  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
988  */
989 bool set_tsubureru(TIME_EFFECT v, bool do_dec)
990 {
991         bool notice = FALSE;
992         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
993
994         if (p_ptr->is_dead) return FALSE;
995
996         /* Open */
997         if (v)
998         {
999                 if (p_ptr->tsubureru && !do_dec)
1000                 {
1001                         if (p_ptr->tsubureru > v) return FALSE;
1002                 }
1003                 else if (!p_ptr->tsubureru)
1004                 {
1005                         msg_print(_("横に伸びた。", "Your body expands horizontally."));
1006                         notice = TRUE;
1007                 }
1008         }
1009
1010         /* Shut */
1011         else
1012         {
1013                 if (p_ptr->tsubureru)
1014                 {
1015                         msg_print(_("もう横に伸びていない。", "Your body returns to normal."));
1016                         notice = TRUE;
1017                 }
1018         }
1019
1020         /* Use the value */
1021         p_ptr->tsubureru = v;
1022         p_ptr->redraw |= (PR_STATUS);
1023
1024         /* Nothing to notice */
1025         if (!notice) return (FALSE);
1026
1027         if (disturb_state) disturb(FALSE, FALSE);
1028         p_ptr->update |= (PU_BONUS);
1029         handle_stuff();
1030         return (TRUE);
1031 }
1032
1033
1034 /*!
1035  * @brief 魔法の鎧の継続時間をセットする / Set "p_ptr->magicdef", notice observable changes
1036  * @param v 継続時間
1037  * @param do_dec 現在の継続時間より長い値のみ上書きする
1038  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1039  */
1040 bool set_magicdef(TIME_EFFECT v, bool do_dec)
1041 {
1042         bool notice = FALSE;
1043         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
1044
1045         if (p_ptr->is_dead) return FALSE;
1046
1047         /* Open */
1048         if (v)
1049         {
1050                 if (p_ptr->magicdef && !do_dec)
1051                 {
1052                         if (p_ptr->magicdef > v) return FALSE;
1053                 }
1054                 else if (!p_ptr->magicdef)
1055                 {
1056                         msg_print(_("魔法の防御力が増したような気がする。", "You feel more resistant to magic."));
1057                         notice = TRUE;
1058                 }
1059         }
1060
1061         /* Shut */
1062         else
1063         {
1064                 if (p_ptr->magicdef)
1065                 {
1066                         msg_print(_("魔法の防御力が元に戻った。", "You feel less resistant to magic."));
1067                         notice = TRUE;
1068                 }
1069         }
1070
1071         /* Use the value */
1072         p_ptr->magicdef = v;
1073         p_ptr->redraw |= (PR_STATUS);
1074
1075         /* Nothing to notice */
1076         if (!notice) return (FALSE);
1077
1078         if (disturb_state) disturb(FALSE, FALSE);
1079         p_ptr->update |= (PU_BONUS);
1080         handle_stuff();
1081         return (TRUE);
1082 }
1083
1084 /*!
1085  * @brief 祝福の継続時間をセットする / Set "p_ptr->blessed", notice observable changes
1086  * @param v 継続時間
1087  * @param do_dec 現在の継続時間より長い値のみ上書きする
1088  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1089  */
1090 bool set_blessed(TIME_EFFECT v, bool do_dec)
1091 {
1092         bool notice = FALSE;
1093         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
1094
1095         if (p_ptr->is_dead) return FALSE;
1096
1097         /* Open */
1098         if (v)
1099         {
1100                 if (p_ptr->blessed && !do_dec)
1101                 {
1102                         if (p_ptr->blessed > v) return FALSE;
1103                 }
1104                 else if (!IS_BLESSED())
1105                 {
1106                         msg_print(_("高潔な気分になった!", "You feel righteous!"));
1107                         notice = TRUE;
1108                 }
1109         }
1110
1111         /* Shut */
1112         else
1113         {
1114                 if (p_ptr->blessed && !music_singing(MUSIC_BLESS))
1115                 {
1116                         msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
1117                         notice = TRUE;
1118                 }
1119         }
1120
1121         /* Use the value */
1122         p_ptr->blessed = v;
1123         p_ptr->redraw |= (PR_STATUS);
1124
1125         /* Nothing to notice */
1126         if (!notice) return (FALSE);
1127
1128         if (disturb_state) disturb(FALSE, FALSE);
1129         p_ptr->update |= (PU_BONUS);
1130         handle_stuff();
1131         return (TRUE);
1132 }
1133
1134
1135 /*!
1136  * @brief 士気高揚の継続時間をセットする / Set "p_ptr->hero", notice observable changes
1137  * @param v 継続時間
1138  * @param do_dec 現在の継続時間より長い値のみ上書きする
1139  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1140  */
1141 bool set_hero(TIME_EFFECT v, bool do_dec)
1142 {
1143         bool notice = FALSE;
1144         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
1145
1146         if (p_ptr->is_dead) return FALSE;
1147
1148         /* Open */
1149         if (v)
1150         {
1151                 if (p_ptr->hero && !do_dec)
1152                 {
1153                         if (p_ptr->hero > v) return FALSE;
1154                 }
1155                 else if (!IS_HERO())
1156                 {
1157                         msg_print(_("ヒーローになった気がする!", "You feel like a hero!"));
1158                         notice = TRUE;
1159                 }
1160         }
1161
1162         /* Shut */
1163         else
1164         {
1165                 if (p_ptr->hero && !music_singing(MUSIC_HERO) && !music_singing(MUSIC_SHERO))
1166                 {
1167                         msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));
1168                         notice = TRUE;
1169                 }
1170         }
1171
1172         /* Use the value */
1173         p_ptr->hero = v;
1174         p_ptr->redraw |= (PR_STATUS);
1175
1176         /* Nothing to notice */
1177         if (!notice) return (FALSE);
1178
1179         if (disturb_state) disturb(FALSE, FALSE);
1180         p_ptr->update |= (PU_BONUS);
1181
1182         /* Recalculate hitpoints */
1183         p_ptr->update |= (PU_HP);
1184         handle_stuff();
1185         return (TRUE);
1186 }
1187
1188 /*!
1189  * @brief 狂戦士化の継続時間をセットする / Set "p_ptr->shero", notice observable changes
1190  * @param v 継続時間/ 0ならば無条件にリセット
1191  * @param do_dec FALSEの場合現在の継続時間より長い値のみ上書きする
1192  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1193  */
1194 bool set_shero(TIME_EFFECT v, bool do_dec)
1195 {
1196         bool notice = FALSE;
1197         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
1198
1199         if (p_ptr->is_dead) return FALSE;
1200
1201         if (p_ptr->pclass == CLASS_BERSERKER) v = 1;
1202         /* Open */
1203         if (v)
1204         {
1205                 if (p_ptr->shero && !do_dec)
1206                 {
1207                         if (p_ptr->shero > v) return FALSE;
1208                 }
1209                 else if (!p_ptr->shero)
1210                 {
1211                         msg_print(_("殺戮マシーンになった気がする!", "You feel like a killing machine!"));
1212                         notice = TRUE;
1213                 }
1214         }
1215
1216         /* Shut */
1217         else
1218         {
1219                 if (p_ptr->shero)
1220                 {
1221                         msg_print(_("野蛮な気持ちが消え失せた。", "You feel less Berserk."));
1222                         notice = TRUE;
1223                 }
1224         }
1225
1226         /* Use the value */
1227         p_ptr->shero = v;
1228         p_ptr->redraw |= (PR_STATUS);
1229
1230         /* Nothing to notice */
1231         if (!notice) return (FALSE);
1232
1233         if (disturb_state) disturb(FALSE, FALSE);
1234         p_ptr->update |= (PU_BONUS);
1235
1236         /* Recalculate hitpoints */
1237         p_ptr->update |= (PU_HP);
1238         handle_stuff();
1239         return (TRUE);
1240 }
1241
1242 /*!
1243  * @brief 対邪悪結界の継続時間をセットする / Set "p_ptr->protevil", notice observable changes
1244  * @param v 継続時間
1245  * @param do_dec 現在の継続時間より長い値のみ上書きする
1246  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1247  */
1248 bool set_protevil(TIME_EFFECT v, bool do_dec)
1249 {
1250         bool notice = FALSE;
1251         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
1252
1253         if (p_ptr->is_dead) return FALSE;
1254
1255         /* Open */
1256         if (v)
1257         {
1258                 if (p_ptr->protevil && !do_dec)
1259                 {
1260                         if (p_ptr->protevil > v) return FALSE;
1261                 }
1262                 else if (!p_ptr->protevil)
1263                 {
1264                         msg_print(_("邪悪なる存在から守られているような感じがする!", "You feel safe from evil!"));
1265                         notice = TRUE;
1266                 }
1267         }
1268
1269         /* Shut */
1270         else
1271         {
1272                 if (p_ptr->protevil)
1273                 {
1274                         msg_print(_("邪悪なる存在から守られている感じがなくなった。", "You no longer feel safe from evil."));
1275                         notice = TRUE;
1276                 }
1277         }
1278
1279         /* Use the value */
1280         p_ptr->protevil = v;
1281         p_ptr->redraw |= (PR_STATUS);
1282
1283         /* Nothing to notice */
1284         if (!notice) return (FALSE);
1285
1286         if (disturb_state) disturb(FALSE, FALSE);
1287         handle_stuff();
1288         return (TRUE);
1289 }
1290
1291 /*!
1292  * @brief 幽体化の継続時間をセットする / Set "p_ptr->wraith_form", notice observable changes
1293  * @param v 継続時間
1294  * @param do_dec 現在の継続時間より長い値のみ上書きする
1295  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1296  */
1297 bool set_wraith_form(TIME_EFFECT v, bool do_dec)
1298 {
1299         bool notice = FALSE;
1300         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
1301
1302         if (p_ptr->is_dead) return FALSE;
1303
1304         /* Open */
1305         if (v)
1306         {
1307                 if (p_ptr->wraith_form && !do_dec)
1308                 {
1309                         if (p_ptr->wraith_form > v) return FALSE;
1310                 }
1311                 else if (!p_ptr->wraith_form)
1312                 {
1313                         msg_print(_("物質界を離れて幽鬼のような存在になった!", "You leave the physical world and current_world_ptr->game_turn into a wraith-being!"));
1314                         notice = TRUE;
1315                         chg_virtue(V_UNLIFE, 3);
1316                         chg_virtue(V_HONOUR, -2);
1317                         chg_virtue(V_SACRIFICE, -2);
1318                         chg_virtue(V_VALOUR, -5);
1319
1320                         p_ptr->redraw |= (PR_MAP);
1321                         p_ptr->update |= (PU_MONSTERS);
1322
1323                         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
1324                 }
1325         }
1326
1327         /* Shut */
1328         else
1329         {
1330                 if (p_ptr->wraith_form)
1331                 {
1332                         msg_print(_("不透明になった感じがする。", "You feel opaque."));
1333                         notice = TRUE;
1334
1335                         p_ptr->redraw |= (PR_MAP);
1336                         p_ptr->update |= (PU_MONSTERS);
1337
1338                         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
1339                 }
1340         }
1341
1342         /* Use the value */
1343         p_ptr->wraith_form = v;
1344         p_ptr->redraw |= (PR_STATUS);
1345
1346         /* Nothing to notice */
1347         if (!notice) return (FALSE);
1348
1349         if (disturb_state) disturb(FALSE, FALSE);
1350         p_ptr->update |= (PU_BONUS);
1351         handle_stuff();
1352         return (TRUE);
1353
1354 }
1355
1356 /*!
1357  * @brief 無傷球の継続時間をセットする / Set "p_ptr->invuln", notice observable changes
1358  * @param v 継続時間
1359  * @param do_dec 現在の継続時間より長い値のみ上書きする
1360  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1361  */
1362 bool set_invuln(TIME_EFFECT v, bool do_dec)
1363 {
1364         bool notice = FALSE;
1365         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
1366
1367         if (p_ptr->is_dead) return FALSE;
1368
1369         /* Open */
1370         if (v)
1371         {
1372                 if (p_ptr->invuln && !do_dec)
1373                 {
1374                         if (p_ptr->invuln > v) return FALSE;
1375                 }
1376                 else if (!IS_INVULN())
1377                 {
1378                         msg_print(_("無敵だ!", "Invulnerability!"));
1379                         notice = TRUE;
1380
1381                         chg_virtue(V_UNLIFE, -2);
1382                         chg_virtue(V_HONOUR, -2);
1383                         chg_virtue(V_SACRIFICE, -3);
1384                         chg_virtue(V_VALOUR, -5);
1385
1386                         p_ptr->redraw |= (PR_MAP);
1387                         p_ptr->update |= (PU_MONSTERS);
1388
1389                         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
1390                 }
1391         }
1392
1393         /* Shut */
1394         else
1395         {
1396                 if (p_ptr->invuln && !music_singing(MUSIC_INVULN))
1397                 {
1398                         msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));
1399                         notice = TRUE;
1400
1401                         p_ptr->redraw |= (PR_MAP);
1402                         p_ptr->update |= (PU_MONSTERS);
1403
1404                         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
1405
1406                         p_ptr->energy_need += ENERGY_NEED();
1407                 }
1408         }
1409
1410         /* Use the value */
1411         p_ptr->invuln = v;
1412         p_ptr->redraw |= (PR_STATUS);
1413
1414         /* Nothing to notice */
1415         if (!notice) return (FALSE);
1416
1417         if (disturb_state) disturb(FALSE, FALSE);
1418         p_ptr->update |= (PU_BONUS);
1419         handle_stuff();
1420         return (TRUE);
1421 }
1422
1423 /*!
1424  * @brief 時限ESPの継続時間をセットする / Set "p_ptr->tim_esp", notice observable changes
1425  * @param v 継続時間
1426  * @param do_dec 現在の継続時間より長い値のみ上書きする
1427  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1428  */
1429 bool set_tim_esp(TIME_EFFECT v, bool do_dec)
1430 {
1431         bool notice = FALSE;
1432         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
1433
1434         if (p_ptr->is_dead) return FALSE;
1435
1436         /* Open */
1437         if (v)
1438         {
1439                 if (p_ptr->tim_esp && !do_dec)
1440                 {
1441                         if (p_ptr->tim_esp > v) return FALSE;
1442                 }
1443                 else if (!IS_TIM_ESP())
1444                 {
1445                         msg_print(_("意識が広がった気がする!", "You feel your consciousness expand!"));
1446                         notice = TRUE;
1447                 }
1448         }
1449
1450         /* Shut */
1451         else
1452         {
1453                 if (p_ptr->tim_esp && !music_singing(MUSIC_MIND))
1454                 {
1455                         msg_print(_("意識は元に戻った。", "Your consciousness contracts again."));
1456                         notice = TRUE;
1457                 }
1458         }
1459
1460         /* Use the value */
1461         p_ptr->tim_esp = v;
1462         p_ptr->redraw |= (PR_STATUS);
1463
1464         /* Nothing to notice */
1465         if (!notice) return (FALSE);
1466
1467         if (disturb_state) disturb(FALSE, FALSE);
1468         p_ptr->update |= (PU_BONUS);
1469         p_ptr->update |= (PU_MONSTERS);
1470         handle_stuff();
1471         return (TRUE);
1472 }
1473
1474 /*!
1475  * @brief 時限透明視の継続時間をセットする / Set "p_ptr->tim_invis", notice observable changes
1476  * @param v 継続時間
1477  * @param do_dec 現在の継続時間より長い値のみ上書きする
1478  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1479  */
1480 bool set_tim_invis(TIME_EFFECT v, bool do_dec)
1481 {
1482         bool notice = FALSE;
1483         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
1484
1485         if (p_ptr->is_dead) return FALSE;
1486
1487         /* Open */
1488         if (v)
1489         {
1490                 if (p_ptr->tim_invis && !do_dec)
1491                 {
1492                         if (p_ptr->tim_invis > v) return FALSE;
1493                 }
1494                 else if (!p_ptr->tim_invis)
1495                 {
1496                         msg_print(_("目が非常に敏感になった気がする!", "Your eyes feel very sensitive!"));
1497                         notice = TRUE;
1498                 }
1499         }
1500
1501         /* Shut */
1502         else
1503         {
1504                 if (p_ptr->tim_invis)
1505                 {
1506                         msg_print(_("目の敏感さがなくなったようだ。", "Your eyes feel less sensitive."));
1507                         notice = TRUE;
1508                 }
1509         }
1510
1511         /* Use the value */
1512         p_ptr->tim_invis = v;
1513         p_ptr->redraw |= (PR_STATUS);
1514
1515         /* Nothing to notice */
1516         if (!notice) return (FALSE);
1517
1518         if (disturb_state) disturb(FALSE, FALSE);
1519         p_ptr->update |= (PU_BONUS);
1520
1521         /* Update the monsters */
1522         p_ptr->update |= (PU_MONSTERS);
1523         handle_stuff();
1524         return (TRUE);
1525 }
1526
1527 /*!
1528  * @brief 時限赤外線視力の継続時間をセットする / Set "p_ptr->tim_infra", notice observable changes
1529  * @param v 継続時間
1530  * @param do_dec 現在の継続時間より長い値のみ上書きする
1531  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1532  */
1533 bool set_tim_infra(TIME_EFFECT v, bool do_dec)
1534 {
1535         bool notice = FALSE;
1536         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
1537
1538         if (p_ptr->is_dead) return FALSE;
1539
1540         /* Open */
1541         if (v)
1542         {
1543                 if (p_ptr->tim_infra && !do_dec)
1544                 {
1545                         if (p_ptr->tim_infra > v) return FALSE;
1546                 }
1547                 else if (!p_ptr->tim_infra)
1548                 {
1549                         msg_print(_("目がランランと輝き始めた!", "Your eyes begin to tingle!"));
1550                         notice = TRUE;
1551                 }
1552         }
1553
1554         /* Shut */
1555         else
1556         {
1557                 if (p_ptr->tim_infra)
1558                 {
1559                         msg_print(_("目の輝きがなくなった。", "Your eyes stop tingling."));
1560                         notice = TRUE;
1561                 }
1562         }
1563
1564         /* Use the value */
1565         p_ptr->tim_infra = v;
1566         p_ptr->redraw |= (PR_STATUS);
1567
1568         /* Nothing to notice */
1569         if (!notice) return (FALSE);
1570
1571         if (disturb_state) disturb(FALSE, FALSE);
1572         p_ptr->update |= (PU_BONUS);
1573
1574         /* Update the monsters */
1575         p_ptr->update |= (PU_MONSTERS);
1576         handle_stuff();
1577         return (TRUE);
1578 }
1579
1580 /*!
1581  * @brief 時限急回復の継続時間をセットする / Set "p_ptr->tim_regen", notice observable changes
1582  * @param v 継続時間
1583  * @param do_dec 現在の継続時間より長い値のみ上書きする
1584  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1585  */
1586 bool set_tim_regen(TIME_EFFECT v, bool do_dec)
1587 {
1588         bool notice = FALSE;
1589         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
1590
1591         if (p_ptr->is_dead) return FALSE;
1592
1593         /* Open */
1594         if (v)
1595         {
1596                 if (p_ptr->tim_regen && !do_dec)
1597                 {
1598                         if (p_ptr->tim_regen > v) return FALSE;
1599                 }
1600                 else if (!p_ptr->tim_regen)
1601                 {
1602                         msg_print(_("回復力が上がった!", "You feel yourself regenerating quickly!"));
1603                         notice = TRUE;
1604                 }
1605         }
1606
1607         /* Shut */
1608         else
1609         {
1610                 if (p_ptr->tim_regen)
1611                 {
1612                         msg_print(_("素早く回復する感じがなくなった。", "You feel yourself regenerating slowly."));
1613                         notice = TRUE;
1614                 }
1615         }
1616
1617         /* Use the value */
1618         p_ptr->tim_regen = v;
1619         p_ptr->redraw |= (PR_STATUS);
1620
1621         /* Nothing to notice */
1622         if (!notice) return (FALSE);
1623
1624         if (disturb_state) disturb(FALSE, FALSE);
1625         p_ptr->update |= (PU_BONUS);
1626         handle_stuff();
1627         return (TRUE);
1628 }
1629
1630 /*!
1631  * @brief 隠密の歌の継続時間をセットする / Set "p_ptr->tim_stealth", notice observable changes
1632  * @param v 継続時間
1633  * @param do_dec 現在の継続時間より長い値のみ上書きする
1634  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1635  */
1636 bool set_tim_stealth(TIME_EFFECT v, bool do_dec)
1637 {
1638         bool notice = FALSE;
1639         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
1640
1641         if (p_ptr->is_dead) return FALSE;
1642
1643         /* Open */
1644         if (v)
1645         {
1646                 if (p_ptr->tim_stealth && !do_dec)
1647                 {
1648                         if (p_ptr->tim_stealth > v) return FALSE;
1649                 }
1650                 else if (!IS_TIM_STEALTH())
1651                 {
1652                         msg_print(_("足音が小さくなった!", "You begin to walk silently!"));
1653                         notice = TRUE;
1654                 }
1655         }
1656
1657         /* Shut */
1658         else
1659         {
1660                 if (p_ptr->tim_stealth && !music_singing(MUSIC_STEALTH))
1661                 {
1662                         msg_print(_("足音が大きくなった。", "You no longer walk silently."));
1663                         notice = TRUE;
1664                 }
1665         }
1666
1667         /* Use the value */
1668         p_ptr->tim_stealth = v;
1669         p_ptr->redraw |= (PR_STATUS);
1670
1671         /* Nothing to notice */
1672         if (!notice) return (FALSE);
1673
1674         if (disturb_state) disturb(FALSE, FALSE);
1675         p_ptr->update |= (PU_BONUS);
1676         handle_stuff();
1677         return (TRUE);
1678 }
1679
1680 /*!
1681  * @brief 超隠密状態をセットする
1682  * @param set TRUEならば超隠密状態になる。
1683  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1684  */
1685 bool set_superstealth(bool set)
1686 {
1687         bool notice = FALSE;
1688
1689         if (p_ptr->is_dead) return FALSE;
1690
1691         /* Open */
1692         if (set)
1693         {
1694                 if (!(p_ptr->special_defense & NINJA_S_STEALTH))
1695                 {
1696                         if (current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].info & CAVE_MNLT)
1697                         {
1698                                 msg_print(_("敵の目から薄い影の中に覆い隠された。", "You are mantled in weak shadow from ordinary eyes."));
1699                                 p_ptr->monlite = p_ptr->old_monlite = TRUE;
1700                         }
1701                         else
1702                         {
1703                                 msg_print(_("敵の目から影の中に覆い隠された!", "You are mantled in shadow from ordinary eyes!"));
1704                                 p_ptr->monlite = p_ptr->old_monlite = FALSE;
1705                         }
1706
1707                         notice = TRUE;
1708
1709                         /* Use the value */
1710                         p_ptr->special_defense |= NINJA_S_STEALTH;
1711                 }
1712         }
1713
1714         /* Shut */
1715         else
1716         {
1717                 if (p_ptr->special_defense & NINJA_S_STEALTH)
1718                 {
1719                         msg_print(_("再び敵の目にさらされるようになった。", "You are exposed to common sight once more."));
1720                         notice = TRUE;
1721
1722                         /* Use the value */
1723                         p_ptr->special_defense &= ~(NINJA_S_STEALTH);
1724                 }
1725         }
1726
1727         /* Nothing to notice */
1728         if (!notice) return (FALSE);
1729         p_ptr->redraw |= (PR_STATUS);
1730
1731         if (disturb_state) disturb(FALSE, FALSE);
1732         return (TRUE);
1733 }
1734
1735 /*!
1736  * @brief 一時的浮遊の継続時間をセットする / Set "p_ptr->tim_levitation", notice observable changes
1737  * @param v 継続時間
1738  * @param do_dec 現在の継続時間より長い値のみ上書きする
1739  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1740  */
1741 bool set_tim_levitation(TIME_EFFECT v, bool do_dec)
1742 {
1743         bool notice = FALSE;
1744         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
1745
1746         if (p_ptr->is_dead) return FALSE;
1747
1748         /* Open */
1749         if (v)
1750         {
1751                 if (p_ptr->tim_levitation && !do_dec)
1752                 {
1753                         if (p_ptr->tim_levitation > v) return FALSE;
1754                 }
1755                 else if (!p_ptr->tim_levitation)
1756                 {
1757                         msg_print(_("体が宙に浮き始めた。", "You begin to fly!"));
1758                         notice = TRUE;
1759                 }
1760         }
1761
1762         /* Shut */
1763         else
1764         {
1765                 if (p_ptr->tim_levitation)
1766                 {
1767                         msg_print(_("もう宙に浮かべなくなった。", "You stop flying."));
1768                         notice = TRUE;
1769                 }
1770         }
1771
1772         /* Use the value */
1773         p_ptr->tim_levitation = v;
1774         p_ptr->redraw |= (PR_STATUS);
1775
1776         /* Nothing to notice */
1777         if (!notice) return (FALSE);
1778
1779         if (disturb_state) disturb(FALSE, FALSE);
1780         p_ptr->update |= (PU_BONUS);
1781         handle_stuff();
1782         return (TRUE);
1783 }
1784
1785 /*!
1786  * @brief 一時的闘気のオーラの継続時間をセットする / Set "p_ptr->tim_sh_touki", notice observable changes
1787  * @param v 継続時間
1788  * @param do_dec 現在の継続時間より長い値のみ上書きする
1789  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1790  */
1791 bool set_tim_sh_touki(TIME_EFFECT v, bool do_dec)
1792 {
1793         bool notice = FALSE;
1794         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
1795
1796         if (p_ptr->is_dead) return FALSE;
1797
1798         /* Open */
1799         if (v)
1800         {
1801                 if (p_ptr->tim_sh_touki && !do_dec)
1802                 {
1803                         if (p_ptr->tim_sh_touki > v) return FALSE;
1804                 }
1805                 else if (!p_ptr->tim_sh_touki)
1806                 {
1807                         msg_print(_("体が闘気のオーラで覆われた。", "You have enveloped by the aura of the Force!"));
1808                         notice = TRUE;
1809                 }
1810         }
1811
1812         /* Shut */
1813         else
1814         {
1815                 if (p_ptr->tim_sh_touki)
1816                 {
1817                         msg_print(_("闘気が消えた。", "Aura of the Force disappeared."));
1818                         notice = TRUE;
1819                 }
1820         }
1821
1822         /* Use the value */
1823         p_ptr->tim_sh_touki = v;
1824         p_ptr->redraw |= (PR_STATUS);
1825
1826         /* Nothing to notice */
1827         if (!notice) return (FALSE);
1828
1829         if (disturb_state) disturb(FALSE, FALSE);
1830         handle_stuff();
1831         return (TRUE);
1832 }
1833
1834 /*!
1835  * @brief 一時的火炎のオーラの継続時間をセットする / Set "p_ptr->tim_sh_fire", notice observable changes
1836  * @param v 継続時間
1837  * @param do_dec 現在の継続時間より長い値のみ上書きする
1838  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1839  */
1840 bool set_tim_sh_fire(TIME_EFFECT v, bool do_dec)
1841 {
1842         bool notice = FALSE;
1843         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
1844
1845         if (p_ptr->is_dead) return FALSE;
1846
1847         /* Open */
1848         if (v)
1849         {
1850                 if (p_ptr->tim_sh_fire && !do_dec)
1851                 {
1852                         if (p_ptr->tim_sh_fire > v) return FALSE;
1853                 }
1854                 else if (!p_ptr->tim_sh_fire)
1855                 {
1856                         msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));
1857                         notice = TRUE;
1858                 }
1859         }
1860
1861         /* Shut */
1862         else
1863         {
1864                 if (p_ptr->tim_sh_fire)
1865                 {
1866                         msg_print(_("炎のオーラが消えた。", "Fiery aura disappeared."));
1867                         notice = TRUE;
1868                 }
1869         }
1870
1871         /* Use the value */
1872         p_ptr->tim_sh_fire = v;
1873         p_ptr->redraw |= (PR_STATUS);
1874
1875         /* Nothing to notice */
1876         if (!notice) return (FALSE);
1877
1878         if (disturb_state) disturb(FALSE, FALSE);
1879         p_ptr->update |= (PU_BONUS);
1880         handle_stuff();
1881         return (TRUE);
1882 }
1883
1884 /*!
1885  * @brief 一時的聖なるのオーラの継続時間をセットする / Set "p_ptr->tim_sh_holy", notice observable changes
1886  * @param v 継続時間
1887  * @param do_dec 現在の継続時間より長い値のみ上書きする
1888  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1889  */
1890 bool set_tim_sh_holy(TIME_EFFECT v, bool do_dec)
1891 {
1892         bool notice = FALSE;
1893         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
1894
1895         if (p_ptr->is_dead) return FALSE;
1896
1897         /* Open */
1898         if (v)
1899         {
1900                 if (p_ptr->tim_sh_holy && !do_dec)
1901                 {
1902                         if (p_ptr->tim_sh_holy > v) return FALSE;
1903                 }
1904                 else if (!p_ptr->tim_sh_holy)
1905                 {
1906                         msg_print(_("体が聖なるオーラで覆われた。", "You have enveloped by holy aura!"));
1907                         notice = TRUE;
1908                 }
1909         }
1910
1911         /* Shut */
1912         else
1913         {
1914                 if (p_ptr->tim_sh_holy)
1915                 {
1916                         msg_print(_("聖なるオーラが消えた。", "Holy aura disappeared."));
1917                         notice = TRUE;
1918                 }
1919         }
1920
1921         /* Use the value */
1922         p_ptr->tim_sh_holy = v;
1923         p_ptr->redraw |= (PR_STATUS);
1924
1925         /* Nothing to notice */
1926         if (!notice) return (FALSE);
1927
1928         if (disturb_state) disturb(FALSE, FALSE);
1929         p_ptr->update |= (PU_BONUS);
1930         handle_stuff();
1931         return (TRUE);
1932 }
1933
1934 /*!
1935  * @brief 目には目をの残り時間をセットする / Set "p_ptr->tim_eyeeye", notice observable changes
1936  * @param v 継続時間
1937  * @param do_dec 現在の継続時間より長い値のみ上書きする
1938  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1939  */
1940 bool set_tim_eyeeye(TIME_EFFECT v, bool do_dec)
1941 {
1942         bool notice = FALSE;
1943         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
1944
1945         if (p_ptr->is_dead) return FALSE;
1946
1947         /* Open */
1948         if (v)
1949         {
1950                 if (p_ptr->tim_eyeeye && !do_dec)
1951                 {
1952                         if (p_ptr->tim_eyeeye > v) return FALSE;
1953                 }
1954                 else if (!p_ptr->tim_eyeeye)
1955                 {
1956                         msg_print(_("法の守り手になった気がした!", "You feel like a keeper of commandments!"));
1957                         notice = TRUE;
1958                 }
1959         }
1960
1961         /* Shut */
1962         else
1963         {
1964                 if (p_ptr->tim_eyeeye)
1965                 {
1966                         msg_print(_("懲罰を執行することができなくなった。", "You no longer feel like a keeper."));
1967                         notice = TRUE;
1968                 }
1969         }
1970
1971         /* Use the value */
1972         p_ptr->tim_eyeeye = v;
1973         p_ptr->redraw |= (PR_STATUS);
1974
1975         /* Nothing to notice */
1976         if (!notice) return (FALSE);
1977
1978         if (disturb_state) disturb(FALSE, FALSE);
1979         p_ptr->update |= (PU_BONUS);
1980         handle_stuff();
1981         return (TRUE);
1982 }
1983
1984
1985 /*!
1986  * @brief 一時的魔法防御の継続時間をセットする / Set "p_ptr->resist_magic", notice observable changes
1987  * @param v 継続時間
1988  * @param do_dec 現在の継続時間より長い値のみ上書きする
1989  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
1990  */
1991 bool set_resist_magic(TIME_EFFECT v, bool do_dec)
1992 {
1993         bool notice = FALSE;
1994         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
1995
1996         if (p_ptr->is_dead) return FALSE;
1997
1998         /* Open */
1999         if (v)
2000         {
2001                 if (p_ptr->resist_magic && !do_dec)
2002                 {
2003                         if (p_ptr->resist_magic > v) return FALSE;
2004                 }
2005                 else if (!p_ptr->resist_magic)
2006                 {
2007                         msg_print(_("魔法への耐性がついた。", "You have been protected from magic!"));
2008                         notice = TRUE;
2009                 }
2010         }
2011
2012         /* Shut */
2013         else
2014         {
2015                 if (p_ptr->resist_magic)
2016                 {
2017                         msg_print(_("魔法に弱くなった。", "You are no longer protected from magic."));
2018                         notice = TRUE;
2019                 }
2020         }
2021
2022         /* Use the value */
2023         p_ptr->resist_magic = v;
2024         p_ptr->redraw |= (PR_STATUS);
2025
2026         /* Nothing to notice */
2027         if (!notice) return (FALSE);
2028
2029         if (disturb_state) disturb(FALSE, FALSE);
2030         p_ptr->update |= (PU_BONUS);
2031         handle_stuff();
2032         return (TRUE);
2033 }
2034
2035 /*!
2036  * @brief 一時的反射の継続時間をセットする / Set "p_ptr->tim_reflect", notice observable changes
2037  * @param v 継続時間
2038  * @param do_dec 現在の継続時間より長い値のみ上書きする
2039  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
2040  */
2041 bool set_tim_reflect(TIME_EFFECT v, bool do_dec)
2042 {
2043         bool notice = FALSE;
2044         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
2045
2046         if (p_ptr->is_dead) return FALSE;
2047
2048         /* Open */
2049         if (v)
2050         {
2051                 if (p_ptr->tim_reflect && !do_dec)
2052                 {
2053                         if (p_ptr->tim_reflect > v) return FALSE;
2054                 }
2055                 else if (!p_ptr->tim_reflect)
2056                 {
2057                         msg_print(_("体の表面が滑かになった気がする。", "Your body becames smooth."));
2058                         notice = TRUE;
2059                 }
2060         }
2061
2062         /* Shut */
2063         else
2064         {
2065                 if (p_ptr->tim_reflect)
2066                 {
2067                         msg_print(_("体の表面が滑かでなくなった。", "Your body is no longer smooth."));
2068                         notice = TRUE;
2069                 }
2070         }
2071
2072         /* Use the value */
2073         p_ptr->tim_reflect = v;
2074         p_ptr->redraw |= (PR_STATUS);
2075
2076         /* Nothing to notice */
2077         if (!notice) return (FALSE);
2078
2079         if (disturb_state) disturb(FALSE, FALSE);
2080         p_ptr->update |= (PU_BONUS);
2081         handle_stuff();
2082         return (TRUE);
2083 }
2084
2085
2086 /*
2087  * Set "p_ptr->multishadow", notice observable changes
2088  */
2089 bool set_multishadow(TIME_EFFECT v, bool do_dec)
2090 {
2091         bool notice = FALSE;
2092         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
2093
2094         if (p_ptr->is_dead) return FALSE;
2095
2096         /* Open */
2097         if (v)
2098         {
2099                 if (p_ptr->multishadow && !do_dec)
2100                 {
2101                         if (p_ptr->multishadow > v) return FALSE;
2102                 }
2103                 else if (!p_ptr->multishadow)
2104                 {
2105                         msg_print(_("あなたの周りに幻影が生まれた。", "Your Shadow enveloped you."));
2106                         notice = TRUE;
2107                 }
2108         }
2109
2110         /* Shut */
2111         else
2112         {
2113                 if (p_ptr->multishadow)
2114                 {
2115                         msg_print(_("幻影が消えた。", "Your Shadow disappears."));
2116                         notice = TRUE;
2117                 }
2118         }
2119
2120         /* Use the value */
2121         p_ptr->multishadow = v;
2122         p_ptr->redraw |= (PR_STATUS);
2123
2124         /* Nothing to notice */
2125         if (!notice) return (FALSE);
2126
2127         if (disturb_state) disturb(FALSE, FALSE);
2128         p_ptr->update |= (PU_BONUS);
2129         handle_stuff();
2130         return (TRUE);
2131 }
2132
2133 /*!
2134  * @brief 一時的破片のオーラの継続時間をセットする / Set "p_ptr->dustrobe", notice observable changes
2135  * @param v 継続時間
2136  * @param do_dec 現在の継続時間より長い値のみ上書きする
2137  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
2138  */
2139 bool set_dustrobe(TIME_EFFECT v, bool do_dec)
2140 {
2141         bool notice = FALSE;
2142         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
2143
2144         if (p_ptr->is_dead) return FALSE;
2145
2146         /* Open */
2147         if (v)
2148         {
2149                 if (p_ptr->dustrobe && !do_dec)
2150                 {
2151                         if (p_ptr->dustrobe > v) return FALSE;
2152                 }
2153                 else if (!p_ptr->dustrobe)
2154                 {
2155                         msg_print(_("体が鏡のオーラで覆われた。", "You were enveloped by mirror shards."));
2156                         notice = TRUE;
2157                 }
2158         }
2159
2160         /* Shut */
2161         else
2162         {
2163                 if (p_ptr->dustrobe)
2164                 {
2165                         msg_print(_("鏡のオーラが消えた。", "The mirror shards disappear."));
2166                         notice = TRUE;
2167                 }
2168         }
2169
2170         /* Use the value */
2171         p_ptr->dustrobe = v;
2172         p_ptr->redraw |= (PR_STATUS);
2173
2174         /* Nothing to notice */
2175         if (!notice) return (FALSE);
2176
2177         if (disturb_state) disturb(FALSE, FALSE);
2178         p_ptr->update |= (PU_BONUS);
2179         handle_stuff();
2180         return (TRUE);
2181 }
2182
2183 /*!
2184  * @brief 一時的壁抜けの継続時間をセットする / Set "p_ptr->kabenuke", notice observable changes
2185  * @param v 継続時間
2186  * @param do_dec 現在の継続時間より長い値のみ上書きする
2187  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
2188  */
2189 bool set_kabenuke(TIME_EFFECT v, bool do_dec)
2190 {
2191         bool notice = FALSE;
2192         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
2193
2194         if (p_ptr->is_dead) return FALSE;
2195
2196         /* Open */
2197         if (v)
2198         {
2199                 if (p_ptr->kabenuke && !do_dec)
2200                 {
2201                         if (p_ptr->kabenuke > v) return FALSE;
2202                 }
2203                 else if (!p_ptr->kabenuke)
2204                 {
2205                         msg_print(_("体が半物質の状態になった。", "You became ethereal form."));
2206                         notice = TRUE;
2207                 }
2208         }
2209
2210         /* Shut */
2211         else
2212         {
2213                 if (p_ptr->kabenuke)
2214                 {
2215                         msg_print(_("体が物質化した。", "You are no longer in an ethereal form."));
2216                         notice = TRUE;
2217                 }
2218         }
2219
2220         /* Use the value */
2221         p_ptr->kabenuke = v;
2222         p_ptr->redraw |= (PR_STATUS);
2223
2224         /* Nothing to notice */
2225         if (!notice) return (FALSE);
2226
2227         if (disturb_state) disturb(FALSE, FALSE);
2228         p_ptr->update |= (PU_BONUS);
2229         handle_stuff();
2230         return (TRUE);
2231 }
2232
2233 /*!
2234  * @brief オクレ兄さんの継続時間をセットする / Set "p_ptr->tsuyoshi", notice observable changes
2235  * @param v 継続時間
2236  * @param do_dec 現在の継続時間より長い値のみ上書きする
2237  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
2238  */
2239 bool set_tsuyoshi(TIME_EFFECT v, bool do_dec)
2240 {
2241         bool notice = FALSE;
2242         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
2243
2244         if (p_ptr->is_dead) return FALSE;
2245
2246         /* Open */
2247         if (v)
2248         {
2249                 if (p_ptr->tsuyoshi && !do_dec)
2250                 {
2251                         if (p_ptr->tsuyoshi > v) return FALSE;
2252                 }
2253                 else if (!p_ptr->tsuyoshi)
2254                 {
2255                         msg_print(_("「オクレ兄さん!」", "Brother OKURE!"));
2256                         notice = TRUE;
2257                         chg_virtue(V_VITALITY, 2);
2258                 }
2259         }
2260
2261         /* Shut */
2262         else
2263         {
2264                 if (p_ptr->tsuyoshi)
2265                 {
2266                         msg_print(_("肉体が急速にしぼんでいった。", "Your body had quickly shriveled."));
2267
2268                         (void)dec_stat(A_CON, 20, TRUE);
2269                         (void)dec_stat(A_STR, 20, TRUE);
2270
2271                         notice = TRUE;
2272                         chg_virtue(V_VITALITY, -3);
2273                 }
2274         }
2275
2276         /* Use the value */
2277         p_ptr->tsuyoshi = v;
2278         p_ptr->redraw |= (PR_STATUS);
2279
2280         /* Nothing to notice */
2281         if (!notice) return (FALSE);
2282
2283         if (disturb_state) disturb(FALSE, FALSE);
2284         p_ptr->update |= (PU_BONUS);
2285
2286         /* Recalculate hitpoints */
2287         p_ptr->update |= (PU_HP);
2288         handle_stuff();
2289         return (TRUE);
2290 }
2291
2292 /*!
2293  * @brief 一時的元素スレイの継続時間をセットする / Set a temporary elemental brand. Clear all other brands. Print status messages. -LM-
2294  * @param attack_type スレイのタイプID
2295  * @param v 継続時間
2296  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
2297  */
2298 bool set_ele_attack(u32b attack_type, TIME_EFFECT v)
2299 {
2300         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
2301
2302         /* Clear all elemental attacks (only one is allowed at a time). */
2303         if ((p_ptr->special_attack & (ATTACK_ACID)) && (attack_type != ATTACK_ACID))
2304         {
2305                 p_ptr->special_attack &= ~(ATTACK_ACID);
2306                 msg_print(_("酸で攻撃できなくなった。", "Your temporary acidic brand fades away."));
2307         }
2308         if ((p_ptr->special_attack & (ATTACK_ELEC)) && (attack_type != ATTACK_ELEC))
2309         {
2310                 p_ptr->special_attack &= ~(ATTACK_ELEC);
2311                 msg_print(_("電撃で攻撃できなくなった。", "Your temporary electrical brand fades away."));
2312         }
2313         if ((p_ptr->special_attack & (ATTACK_FIRE)) && (attack_type != ATTACK_FIRE))
2314         {
2315                 p_ptr->special_attack &= ~(ATTACK_FIRE);
2316                 msg_print(_("火炎で攻撃できなくなった。", "Your temporary fiery brand fades away."));
2317         }
2318         if ((p_ptr->special_attack & (ATTACK_COLD)) && (attack_type != ATTACK_COLD))
2319         {
2320                 p_ptr->special_attack &= ~(ATTACK_COLD);
2321                 msg_print(_("冷気で攻撃できなくなった。", "Your temporary frost brand fades away."));
2322         }
2323         if ((p_ptr->special_attack & (ATTACK_POIS)) && (attack_type != ATTACK_POIS))
2324         {
2325                 p_ptr->special_attack &= ~(ATTACK_POIS);
2326                 msg_print(_("毒で攻撃できなくなった。", "Your temporary poison brand fades away."));
2327         }
2328
2329         if ((v) && (attack_type))
2330         {
2331                 /* Set attack type. */
2332                 p_ptr->special_attack |= (attack_type);
2333
2334                 /* Set duration. */
2335                 p_ptr->ele_attack = v;
2336
2337 #ifdef JP
2338                 msg_format("%sで攻撃できるようになった!",
2339                              ((attack_type == ATTACK_ACID) ? "酸" :
2340                               ((attack_type == ATTACK_ELEC) ? "電撃" :
2341                                ((attack_type == ATTACK_FIRE) ? "火炎" : 
2342                                 ((attack_type == ATTACK_COLD) ? "冷気" : 
2343                                  ((attack_type == ATTACK_POIS) ? "毒" : 
2344                                         "(なし)"))))));
2345 #else
2346                 msg_format("For a while, the blows you deal will %s",
2347                              ((attack_type == ATTACK_ACID) ? "melt with acid!" :
2348                               ((attack_type == ATTACK_ELEC) ? "shock your foes!" :
2349                                ((attack_type == ATTACK_FIRE) ? "burn with fire!" : 
2350                                 ((attack_type == ATTACK_COLD) ? "chill to the bone!" : 
2351                                  ((attack_type == ATTACK_POIS) ? "poison your enemies!" : 
2352                                         "do nothing special."))))));
2353 #endif
2354         }
2355
2356         if (disturb_state) disturb(FALSE, FALSE);
2357         p_ptr->redraw |= (PR_STATUS);
2358
2359         p_ptr->update |= (PU_BONUS);
2360         handle_stuff();
2361
2362         return (TRUE);
2363 }
2364
2365 /*!
2366  * @brief 一時的元素免疫の継続時間をセットする / Set a temporary elemental brand.  Clear all other brands.  Print status messages. -LM-
2367  * @param immune_type 免疫のタイプID
2368  * @param v 継続時間
2369  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
2370  */
2371 bool set_ele_immune(u32b immune_type, TIME_EFFECT v)
2372 {
2373         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
2374
2375         /* Clear all elemental attacks (only one is allowed at a time). */
2376         if ((p_ptr->special_defense & (DEFENSE_ACID)) && (immune_type != DEFENSE_ACID))
2377         {
2378                 p_ptr->special_defense &= ~(DEFENSE_ACID);
2379                 msg_print(_("酸の攻撃で傷つけられるようになった。。", "You are no longer immune to acid."));
2380         }
2381         if ((p_ptr->special_defense & (DEFENSE_ELEC)) && (immune_type != DEFENSE_ELEC))
2382         {
2383                 p_ptr->special_defense &= ~(DEFENSE_ELEC);
2384                 msg_print(_("電撃の攻撃で傷つけられるようになった。。", "You are no longer immune to electricity."));
2385         }
2386         if ((p_ptr->special_defense & (DEFENSE_FIRE)) && (immune_type != DEFENSE_FIRE))
2387         {
2388                 p_ptr->special_defense &= ~(DEFENSE_FIRE);
2389                 msg_print(_("火炎の攻撃で傷つけられるようになった。。", "You are no longer immune to fire."));
2390         }
2391         if ((p_ptr->special_defense & (DEFENSE_COLD)) && (immune_type != DEFENSE_COLD))
2392         {
2393                 p_ptr->special_defense &= ~(DEFENSE_COLD);
2394                 msg_print(_("冷気の攻撃で傷つけられるようになった。。", "You are no longer immune to cold."));
2395         }
2396         if ((p_ptr->special_defense & (DEFENSE_POIS)) && (immune_type != DEFENSE_POIS))
2397         {
2398                 p_ptr->special_defense &= ~(DEFENSE_POIS);
2399                 msg_print(_("毒の攻撃で傷つけられるようになった。。", "You are no longer immune to poison."));
2400         }
2401
2402         if ((v) && (immune_type))
2403         {
2404                 /* Set attack type. */
2405                 p_ptr->special_defense |= (immune_type);
2406
2407                 /* Set duration. */
2408                 p_ptr->ele_immune = v;
2409
2410                 msg_format(_("%sの攻撃を受けつけなくなった!", "For a while, You are immune to %s"),
2411                              ((immune_type == DEFENSE_ACID) ? _("酸", "acid!") :
2412                               ((immune_type == DEFENSE_ELEC) ? _("電撃", "electricity!") :
2413                                ((immune_type == DEFENSE_FIRE) ? _("火炎", "fire!") : 
2414                                 ((immune_type == DEFENSE_COLD) ? _("冷気", "cold!") : 
2415                                  ((immune_type == DEFENSE_POIS) ? _("毒", "poison!") : 
2416                                         _("(なし)", "do nothing special.")))))));
2417         }
2418
2419         if (disturb_state) disturb(FALSE, FALSE);
2420         p_ptr->redraw |= (PR_STATUS);
2421         p_ptr->update |= (PU_BONUS);
2422         handle_stuff();
2423
2424         return (TRUE);
2425 }
2426
2427 /*!
2428  * @brief 一時的酸耐性の継続時間をセットする / Set "p_ptr->oppose_acid", notice observable changes
2429  * @param v 継続時間
2430  * @param do_dec 現在の継続時間より長い値のみ上書きする
2431  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
2432  */
2433 bool set_oppose_acid(TIME_EFFECT v, bool do_dec)
2434 {
2435         bool notice = FALSE;
2436         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
2437
2438         if (p_ptr->is_dead) return FALSE;
2439
2440         /* Open */
2441         if (v)
2442         {
2443                 if (p_ptr->oppose_acid && !do_dec)
2444                 {
2445                         if (p_ptr->oppose_acid > v) return FALSE;
2446                 }
2447                 else if (!IS_OPPOSE_ACID())
2448                 {
2449                         msg_print(_("酸への耐性がついた気がする!", "You feel resistant to acid!"));
2450                         notice = TRUE;
2451                 }
2452         }
2453
2454         /* Shut */
2455         else
2456         {
2457                 if (p_ptr->oppose_acid && !music_singing(MUSIC_RESIST) && !(p_ptr->special_defense & KATA_MUSOU))
2458                 {
2459                         msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));
2460                         notice = TRUE;
2461                 }
2462         }
2463
2464         /* Use the value */
2465         p_ptr->oppose_acid = v;
2466
2467         /* Nothing to notice */
2468         if (!notice) return (FALSE);
2469         p_ptr->redraw |= (PR_STATUS);
2470
2471         if (disturb_state) disturb(FALSE, FALSE);
2472         handle_stuff();
2473         return (TRUE);
2474 }
2475
2476 /*!
2477  * @brief 一時的電撃耐性の継続時間をセットする / Set "p_ptr->oppose_elec", notice observable changes
2478  * @param v 継続時間
2479  * @param do_dec 現在の継続時間より長い値のみ上書きする
2480  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
2481  */
2482 bool set_oppose_elec(TIME_EFFECT v, bool do_dec)
2483 {
2484         bool notice = FALSE;
2485         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
2486
2487         if (p_ptr->is_dead) return FALSE;
2488
2489         /* Open */
2490         if (v)
2491         {
2492                 if (p_ptr->oppose_elec && !do_dec)
2493                 {
2494                         if (p_ptr->oppose_elec > v) return FALSE;
2495                 }
2496                 else if (!IS_OPPOSE_ELEC())
2497                 {
2498                         msg_print(_("電撃への耐性がついた気がする!", "You feel resistant to electricity!"));
2499                         notice = TRUE;
2500                 }
2501         }
2502
2503         /* Shut */
2504         else
2505         {
2506                 if (p_ptr->oppose_elec && !music_singing(MUSIC_RESIST) && !(p_ptr->special_defense & KATA_MUSOU))
2507                 {
2508                         msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to electricity."));
2509                         notice = TRUE;
2510                 }
2511         }
2512
2513         /* Use the value */
2514         p_ptr->oppose_elec = v;
2515
2516         /* Nothing to notice */
2517         if (!notice) return (FALSE);
2518         p_ptr->redraw |= (PR_STATUS);
2519
2520         if (disturb_state) disturb(FALSE, FALSE);
2521         handle_stuff();
2522         return (TRUE);
2523 }
2524
2525 /*!
2526  * @brief 一時的火炎耐性の継続時間をセットする / Set "p_ptr->oppose_fire", notice observable changes
2527  * @param v 継続時間
2528  * @param do_dec 現在の継続時間より長い値のみ上書きする
2529  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
2530  */
2531 bool set_oppose_fire(TIME_EFFECT v, bool do_dec)
2532 {
2533         bool notice = FALSE;
2534         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
2535
2536         if (p_ptr->is_dead) return FALSE;
2537
2538         if ((prace_is_(RACE_DEMON) && (p_ptr->lev > 44)) || (p_ptr->mimic_form == MIMIC_DEMON)) v = 1;
2539         /* Open */
2540         if (v)
2541         {
2542                 if (p_ptr->oppose_fire && !do_dec)
2543                 {
2544                         if (p_ptr->oppose_fire > v) return FALSE;
2545                 }
2546                 else if (!IS_OPPOSE_FIRE())
2547                 {
2548                         msg_print(_("火への耐性がついた気がする!", "You feel resistant to fire!"));
2549                         notice = TRUE;
2550                 }
2551         }
2552
2553         /* Shut */
2554         else
2555         {
2556                 if (p_ptr->oppose_fire && !music_singing(MUSIC_RESIST) && !(p_ptr->special_defense & KATA_MUSOU))
2557                 {
2558                         msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));
2559                         notice = TRUE;
2560                 }
2561         }
2562
2563         /* Use the value */
2564         p_ptr->oppose_fire = v;
2565
2566         /* Nothing to notice */
2567         if (!notice) return (FALSE);
2568         p_ptr->redraw |= (PR_STATUS);
2569
2570         if (disturb_state) disturb(FALSE, FALSE);
2571         handle_stuff();
2572         return (TRUE);
2573 }
2574
2575 /*!
2576  * @brief 一時的冷気耐性の継続時間をセットする / Set "p_ptr->oppose_cold", notice observable changes
2577  * @param v 継続時間
2578  * @param do_dec 現在の継続時間より長い値のみ上書きする
2579  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
2580  */
2581 bool set_oppose_cold(TIME_EFFECT v, bool do_dec)
2582 {
2583         bool notice = FALSE;
2584         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
2585
2586         if (p_ptr->is_dead) return FALSE;
2587
2588         /* Open */
2589         if (v)
2590         {
2591                 if (p_ptr->oppose_cold && !do_dec)
2592                 {
2593                         if (p_ptr->oppose_cold > v) return FALSE;
2594                 }
2595                 else if (!IS_OPPOSE_COLD())
2596                 {
2597                         msg_print(_("冷気への耐性がついた気がする!", "You feel resistant to cold!"));
2598                         notice = TRUE;
2599                 }
2600         }
2601
2602         /* Shut */
2603         else
2604         {
2605                 if (p_ptr->oppose_cold && !music_singing(MUSIC_RESIST) && !(p_ptr->special_defense & KATA_MUSOU))
2606                 {
2607                         msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));
2608                         notice = TRUE;
2609                 }
2610         }
2611
2612         /* Use the value */
2613         p_ptr->oppose_cold = v;
2614
2615         /* Nothing to notice */
2616         if (!notice) return (FALSE);
2617         p_ptr->redraw |= (PR_STATUS);
2618
2619         if (disturb_state) disturb(FALSE, FALSE);
2620         handle_stuff();
2621         return (TRUE);
2622 }
2623
2624 /*!
2625  * @brief 一時的毒耐性の継続時間をセットする / Set "p_ptr->oppose_pois", notice observable changes
2626  * @param v 継続時間
2627  * @param do_dec 現在の継続時間より長い値のみ上書きする
2628  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
2629  */
2630 bool set_oppose_pois(TIME_EFFECT v, bool do_dec)
2631 {
2632         bool notice = FALSE;
2633         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
2634
2635         if ((p_ptr->pclass == CLASS_NINJA) && (p_ptr->lev > 44)) v = 1;
2636         if (p_ptr->is_dead) return FALSE;
2637
2638         /* Open */
2639         if (v)
2640         {
2641                 if (p_ptr->oppose_pois && !do_dec)
2642                 {
2643                         if (p_ptr->oppose_pois > v) return FALSE;
2644                 }
2645                 else if (!IS_OPPOSE_POIS())
2646                 {
2647                         msg_print(_("毒への耐性がついた気がする!", "You feel resistant to poison!"));
2648                         notice = TRUE;
2649                 }
2650         }
2651
2652         /* Shut */
2653         else
2654         {
2655                 if (p_ptr->oppose_pois && !music_singing(MUSIC_RESIST) && !(p_ptr->special_defense & KATA_MUSOU))
2656                 {
2657                         msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to poison."));
2658                         notice = TRUE;
2659                 }
2660         }
2661
2662         /* Use the value */
2663         p_ptr->oppose_pois = v;
2664
2665         /* Nothing to notice */
2666         if (!notice) return (FALSE);
2667         p_ptr->redraw |= (PR_STATUS);
2668
2669         if (disturb_state) disturb(FALSE, FALSE);
2670         handle_stuff();
2671         return (TRUE);
2672 }
2673
2674 /*!
2675  * @brief 朦朧の継続時間をセットする / Set "p_ptr->stun", notice observable changes
2676  * @param v 継続時間
2677  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
2678  * @details
2679  * Note the special code to only notice "range" changes.
2680  */
2681 bool set_stun(TIME_EFFECT v)
2682 {
2683         int old_aux, new_aux;
2684         bool notice = FALSE;
2685         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
2686
2687         if (p_ptr->is_dead) return FALSE;
2688         if (prace_is_(RACE_GOLEM) || ((p_ptr->pclass == CLASS_BERSERKER) && (p_ptr->lev > 34))) v = 0;
2689
2690         /* Knocked out */
2691         if (p_ptr->stun > 100)
2692         {
2693                 old_aux = 3;
2694         }
2695
2696         /* Heavy stun */
2697         else if (p_ptr->stun > 50)
2698         {
2699                 old_aux = 2;
2700         }
2701
2702         /* Stun */
2703         else if (p_ptr->stun > 0)
2704         {
2705                 old_aux = 1;
2706         }
2707
2708         /* None */
2709         else
2710         {
2711                 old_aux = 0;
2712         }
2713
2714         /* Knocked out */
2715         if (v > 100)
2716         {
2717                 new_aux = 3;
2718         }
2719
2720         /* Heavy stun */
2721         else if (v > 50)
2722         {
2723                 new_aux = 2;
2724         }
2725
2726         /* Stun */
2727         else if (v > 0)
2728         {
2729                 new_aux = 1;
2730         }
2731
2732         /* None */
2733         else
2734         {
2735                 new_aux = 0;
2736         }
2737
2738         /* Increase cut */
2739         if (new_aux > old_aux)
2740         {
2741                 /* Describe the state */
2742                 switch (new_aux)
2743                 {
2744                         /* Stun */
2745                         case 1: msg_print(_("意識がもうろうとしてきた。", "You have been stunned.")); break;
2746
2747                         /* Heavy stun */
2748                         case 2: msg_print(_("意識がひどくもうろうとしてきた。", "You have been heavily stunned.")); break;
2749
2750                         /* Knocked out */
2751                         case 3: msg_print(_("頭がクラクラして意識が遠のいてきた。", "You have been knocked out.")); break;
2752                 }
2753
2754                 if (randint1(1000) < v || one_in_(16))
2755                 {
2756                         msg_print(_("割れるような頭痛がする。", "A vicious blow hits your head."));
2757
2758                         if (one_in_(3))
2759                         {
2760                                 if (!p_ptr->sustain_int) (void)do_dec_stat(A_INT);
2761                                 if (!p_ptr->sustain_wis) (void)do_dec_stat(A_WIS);
2762                         }
2763                         else if (one_in_(2))
2764                         {
2765                                 if (!p_ptr->sustain_int) (void)do_dec_stat(A_INT);
2766                         }
2767                         else
2768                         {
2769                                 if (!p_ptr->sustain_wis) (void)do_dec_stat(A_WIS);
2770                         }
2771                 }
2772                 if (p_ptr->special_defense & KATA_MASK)
2773                 {
2774                         msg_print(_("型が崩れた。", "Your posture gets loose."));
2775                         p_ptr->special_defense &= ~(KATA_MASK);
2776                         p_ptr->update |= (PU_BONUS);
2777                         p_ptr->update |= (PU_MONSTERS);
2778                         p_ptr->redraw |= (PR_STATE);
2779                         p_ptr->redraw |= (PR_STATUS);
2780                         p_ptr->action = ACTION_NONE;
2781                 }
2782
2783                 /* Sniper */
2784                 if (p_ptr->concent) reset_concentration(TRUE);
2785
2786                 /* Hex */
2787                 if (hex_spelling_any()) stop_hex_spell_all();
2788
2789                 notice = TRUE;
2790         }
2791
2792         /* Decrease cut */
2793         else if (new_aux < old_aux)
2794         {
2795                 /* Describe the state */
2796                 switch (new_aux)
2797                 {
2798                         /* None */
2799                 case 0:
2800                         msg_print(_("やっと朦朧状態から回復した。", "You are no longer stunned."));
2801
2802                         if (disturb_state) disturb(FALSE, FALSE);
2803                         break;
2804                 }
2805
2806                 notice = TRUE;
2807         }
2808
2809         /* Use the value */
2810         p_ptr->stun = v;
2811
2812         /* No change */
2813         if (!notice) return (FALSE);
2814
2815         if (disturb_state) disturb(FALSE, FALSE);
2816         p_ptr->update |= (PU_BONUS);
2817
2818         /* Redraw the "stun" */
2819         p_ptr->redraw |= (PR_STUN);
2820         handle_stuff();
2821         return (TRUE);
2822 }
2823
2824
2825 /*!
2826  * @brief 出血の継続時間をセットする / Set "p_ptr->cut", notice observable changes
2827  * @param v 継続時間
2828  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
2829  * @details
2830  * Note the special code to only notice "range" changes.
2831  */
2832 bool set_cut(TIME_EFFECT v)
2833 {
2834         int old_aux, new_aux;
2835         bool notice = FALSE;
2836         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
2837
2838         if (p_ptr->is_dead) return FALSE;
2839
2840         if ((p_ptr->prace == RACE_GOLEM ||
2841             p_ptr->prace == RACE_SKELETON ||
2842             p_ptr->prace == RACE_SPECTRE ||
2843                 (p_ptr->prace == RACE_ZOMBIE && p_ptr->lev > 11)) &&
2844             !p_ptr->mimic_form)
2845                 v = 0;
2846
2847         /* Mortal wound */
2848         if (p_ptr->cut > 1000)
2849         {
2850                 old_aux = 7;
2851         }
2852
2853         /* Deep gash */
2854         else if (p_ptr->cut > 200)
2855         {
2856                 old_aux = 6;
2857         }
2858
2859         /* Severe cut */
2860         else if (p_ptr->cut > 100)
2861         {
2862                 old_aux = 5;
2863         }
2864
2865         /* Nasty cut */
2866         else if (p_ptr->cut > 50)
2867         {
2868                 old_aux = 4;
2869         }
2870
2871         /* Bad cut */
2872         else if (p_ptr->cut > 25)
2873         {
2874                 old_aux = 3;
2875         }
2876
2877         /* Light cut */
2878         else if (p_ptr->cut > 10)
2879         {
2880                 old_aux = 2;
2881         }
2882
2883         /* Graze */
2884         else if (p_ptr->cut > 0)
2885         {
2886                 old_aux = 1;
2887         }
2888
2889         /* None */
2890         else
2891         {
2892                 old_aux = 0;
2893         }
2894
2895         /* Mortal wound */
2896         if (v > 1000)
2897         {
2898                 new_aux = 7;
2899         }
2900
2901         /* Deep gash */
2902         else if (v > 200)
2903         {
2904                 new_aux = 6;
2905         }
2906
2907         /* Severe cut */
2908         else if (v > 100)
2909         {
2910                 new_aux = 5;
2911         }
2912
2913         /* Nasty cut */
2914         else if (v > 50)
2915         {
2916                 new_aux = 4;
2917         }
2918
2919         /* Bad cut */
2920         else if (v > 25)
2921         {
2922                 new_aux = 3;
2923         }
2924
2925         /* Light cut */
2926         else if (v > 10)
2927         {
2928                 new_aux = 2;
2929         }
2930
2931         /* Graze */
2932         else if (v > 0)
2933         {
2934                 new_aux = 1;
2935         }
2936
2937         /* None */
2938         else
2939         {
2940                 new_aux = 0;
2941         }
2942
2943         /* Increase cut */
2944         if (new_aux > old_aux)
2945         {
2946                 /* Describe the state */
2947                 switch (new_aux)
2948                 {
2949                         /* Graze */
2950                         case 1: msg_print(_("かすり傷を負ってしまった。", "You have been given a graze.")); break;
2951
2952                         /* Light cut */
2953                         case 2: msg_print(_("軽い傷を負ってしまった。", "You have been given a light cut.")); break;
2954
2955                         /* Bad cut */
2956                         case 3: msg_print(_("ひどい傷を負ってしまった。", "You have been given a bad cut.")); break;
2957
2958                         /* Nasty cut */
2959                         case 4: msg_print(_("大変な傷を負ってしまった。", "You have been given a nasty cut.")); break;
2960
2961                         /* Severe cut */
2962                         case 5: msg_print(_("重大な傷を負ってしまった。", "You have been given a severe cut.")); break;
2963
2964                         /* Deep gash */
2965                         case 6: msg_print(_("ひどい深手を負ってしまった。", "You have been given a deep gash.")); break;
2966
2967                         /* Mortal wound */
2968                         case 7: msg_print(_("致命的な傷を負ってしまった。", "You have been given a mortal wound.")); break;
2969                 }
2970
2971                 notice = TRUE;
2972
2973                 if (randint1(1000) < v || one_in_(16))
2974                 {
2975                         if (!p_ptr->sustain_chr)
2976                         {
2977                                 msg_print(_("ひどい傷跡が残ってしまった。", "You have been horribly scarred."));
2978                                 do_dec_stat(A_CHR);
2979                         }
2980                 }
2981         }
2982
2983         /* Decrease cut */
2984         else if (new_aux < old_aux)
2985         {
2986                 /* Describe the state */
2987                 switch (new_aux)
2988                 {
2989                         /* None */
2990                         case 0:
2991                         msg_format(_("やっと%s。", "You are no longer bleeding."), p_ptr->prace == RACE_ANDROID ? "怪我が直った" : "出血が止まった");
2992
2993                         if (disturb_state) disturb(FALSE, FALSE);
2994                         break;
2995                 }
2996
2997                 notice = TRUE;
2998         }
2999
3000         /* Use the value */
3001         p_ptr->cut = v;
3002
3003         /* No change */
3004         if (!notice) return (FALSE);
3005
3006         if (disturb_state) disturb(FALSE, FALSE);
3007         p_ptr->update |= (PU_BONUS);
3008
3009         /* Redraw the "cut" */
3010         p_ptr->redraw |= (PR_CUT);
3011         handle_stuff();
3012         return (TRUE);
3013 }
3014
3015 /*!
3016  * @brief 空腹状態をセットする / Set "p_ptr->food", notice observable changes
3017  * @param v 継続時間
3018  * @return ステータスに影響を及ぼす変化があった場合TRUEを返す。
3019  * @details
3020  * Set "", notice observable changes\n
3021  *\n
3022  * The "p_ptr->food" variable can get as large as 20000, allowing the
3023  * addition of the most "filling" item, Elvish Waybread, which adds
3024  * 7500 food units, without overflowing the 32767 maximum limit.\n
3025  *\n
3026  * Perhaps we should disturb the player with various messages,
3027  * especially messages about hunger status changes.  \n
3028  *\n
3029  * Digestion of food is handled in "dungeon.c", in which, normally,
3030  * the player digests about 20 food units per 100 game turns, more
3031  * when "fast", more when "regenerating", less with "slow digestion",
3032  * but when the player is "gorged", he digests 100 food units per 10
3033  * game turns, or a full 1000 food units per 100 game turns.\n
3034  *\n
3035  * Note that the player's speed is reduced by 10 units while gorged,
3036  * so if the player eats a single food ration (5000 food units) when
3037  * full (15000 food units), he will be gorged for (5000/100)*10 = 500
3038  * game turns, or 500/(100/5) = 25 player turns (if nothing else is
3039  * affecting the player speed).\n
3040  */
3041 bool set_food(TIME_EFFECT v)
3042 {
3043         int old_aux, new_aux;
3044
3045         bool notice = FALSE;
3046         v = (v > 20000) ? 20000 : (v < 0) ? 0 : v;
3047
3048         /* Fainting / Starving */
3049         if (p_ptr->food < PY_FOOD_FAINT)
3050         {
3051                 old_aux = 0;
3052         }
3053
3054         /* Weak */
3055         else if (p_ptr->food < PY_FOOD_WEAK)
3056         {
3057                 old_aux = 1;
3058         }
3059
3060         /* Hungry */
3061         else if (p_ptr->food < PY_FOOD_ALERT)
3062         {
3063                 old_aux = 2;
3064         }
3065
3066         /* Normal */
3067         else if (p_ptr->food < PY_FOOD_FULL)
3068         {
3069                 old_aux = 3;
3070         }
3071
3072         /* Full */
3073         else if (p_ptr->food < PY_FOOD_MAX)
3074         {
3075                 old_aux = 4;
3076         }
3077
3078         /* Gorged */
3079         else
3080         {
3081                 old_aux = 5;
3082         }
3083
3084         /* Fainting / Starving */
3085         if (v < PY_FOOD_FAINT)
3086         {
3087                 new_aux = 0;
3088         }
3089
3090         /* Weak */
3091         else if (v < PY_FOOD_WEAK)
3092         {
3093                 new_aux = 1;
3094         }
3095
3096         /* Hungry */
3097         else if (v < PY_FOOD_ALERT)
3098         {
3099                 new_aux = 2;
3100         }
3101
3102         /* Normal */
3103         else if (v < PY_FOOD_FULL)
3104         {
3105                 new_aux = 3;
3106         }
3107
3108         /* Full */
3109         else if (v < PY_FOOD_MAX)
3110         {
3111                 new_aux = 4;
3112         }
3113
3114         /* Gorged */
3115         else
3116         {
3117                 new_aux = 5;
3118         }
3119
3120         if (old_aux < 1 && new_aux > 0)
3121                 chg_virtue(V_PATIENCE, 2);
3122         else if (old_aux < 3 && (old_aux != new_aux))
3123                 chg_virtue(V_PATIENCE, 1);
3124         if (old_aux == 2)
3125                 chg_virtue(V_TEMPERANCE, 1);
3126         if (old_aux == 0)
3127                 chg_virtue(V_TEMPERANCE, -1);
3128
3129         /* Food increase */
3130         if (new_aux > old_aux)
3131         {
3132                 /* Describe the state */
3133                 switch (new_aux)
3134                 {
3135                         /* Weak */
3136                         case 1: msg_print(_("まだ空腹で倒れそうだ。", "You are still weak.")); break;
3137
3138                         /* Hungry */
3139                         case 2: msg_print(_("まだ空腹だ。", "You are still hungry.")); break;
3140
3141                         /* Normal */
3142                         case 3: msg_print(_("空腹感がおさまった。", "You are no longer hungry.")); break;
3143
3144                         /* Full */
3145                         case 4: msg_print(_("満腹だ!", "You are full!")); break;
3146
3147                         /* Bloated */
3148                         case 5:
3149                         msg_print(_("食べ過ぎだ!", "You have gorged yourself!"));
3150                         chg_virtue(V_HARMONY, -1);
3151                         chg_virtue(V_PATIENCE, -1);
3152                         chg_virtue(V_TEMPERANCE, -2);
3153
3154                         break;
3155                 }
3156
3157                 /* Change */
3158                 notice = TRUE;
3159         }
3160
3161         /* Food decrease */
3162         else if (new_aux < old_aux)
3163         {
3164                 /* Describe the state */
3165                 switch (new_aux)
3166                 {
3167                         /* Fainting / Starving */
3168                         case 0: msg_print(_("あまりにも空腹で気を失ってしまった!", "You are getting faint from hunger!")); break;
3169
3170                         /* Weak */
3171                         case 1: msg_print(_("お腹が空いて倒れそうだ。", "You are getting weak from hunger!")); break;
3172
3173                         /* Hungry */
3174                         case 2: msg_print(_("お腹が空いてきた。", "You are getting hungry.")); break;
3175
3176                         /* Normal */
3177                         case 3: msg_print(_("満腹感がなくなった。", "You are no longer full.")); break;
3178
3179                         /* Full */
3180                         case 4: msg_print(_("やっとお腹がきつくなくなった。", "You are no longer gorged.")); break;
3181                 }
3182
3183                 if (p_ptr->wild_mode && (new_aux < 2))
3184                 {
3185                         change_wild_mode(FALSE);
3186                 }
3187
3188                 /* Change */
3189                 notice = TRUE;
3190         }
3191
3192         /* Use the value */
3193         p_ptr->food = v;
3194
3195         /* Nothing to notice */
3196         if (!notice) return (FALSE);
3197
3198         if (disturb_state) disturb(FALSE, FALSE);
3199         p_ptr->update |= (PU_BONUS);
3200
3201         /* Redraw hunger */
3202         p_ptr->redraw |= (PR_HUNGER);
3203         handle_stuff();
3204         return (TRUE);
3205 }
3206
3207 /*!
3208  * @brief プレイヤーの基本能力値を増加させる / Increases a stat by one randomized level -RAK-
3209  * @param stat 上昇させるステータスID
3210  * @return 実際に上昇した場合TRUEを返す。
3211  * @details
3212  * Note that this function (used by stat potions) now restores\n
3213  * the stat BEFORE increasing it.\n
3214  */
3215 bool inc_stat(int stat)
3216 {
3217         BASE_STATUS value, gain;
3218
3219         /* Then augment the current/max stat */
3220         value = p_ptr->stat_cur[stat];
3221
3222         /* Cannot go above 18/100 */
3223         if (value < p_ptr->stat_max_max[stat])
3224         {
3225                 /* Gain one (sometimes two) points */
3226                 if (value < 18)
3227                 {
3228                         gain = ((randint0(100) < 75) ? 1 : 2);
3229                         value += gain;
3230                 }
3231
3232                 /* Gain 1/6 to 1/3 of distance to 18/100 */
3233                 else if (value < (p_ptr->stat_max_max[stat]-2))
3234                 {
3235                         /* Approximate gain value */
3236                         gain = (((p_ptr->stat_max_max[stat]) - value) / 2 + 3) / 2;
3237                         if (gain < 1) gain = 1;
3238
3239                         /* Apply the bonus */
3240                         value += randint1(gain) + gain / 2;
3241
3242                         /* Maximal value */
3243                         if (value > (p_ptr->stat_max_max[stat]-1)) value = p_ptr->stat_max_max[stat]-1;
3244                 }
3245
3246                 /* Gain one point at a time */
3247                 else
3248                 {
3249                         value++;
3250                 }
3251
3252                 /* Save the new value */
3253                 p_ptr->stat_cur[stat] = value;
3254
3255                 /* Bring up the maximum too */
3256                 if (value > p_ptr->stat_max[stat])
3257                 {
3258                         p_ptr->stat_max[stat] = value;
3259                 }
3260                 p_ptr->update |= (PU_BONUS);
3261
3262                 /* Success */
3263                 return (TRUE);
3264         }
3265
3266         /* Nothing to gain */
3267         return (FALSE);
3268 }
3269
3270 /*!
3271  * @brief プレイヤーの基本能力値を減少させる / Decreases a stat by an amount indended to vary from 0 to 100 percent.
3272  * @param stat 減少させるステータスID
3273  * @param amount 減少させる基本量
3274  * @param permanent TRUEならば現在の最大値を減少させる
3275  * @return 実際に減少した場合TRUEを返す。
3276  * @details
3277  *\n
3278  * Amount could be a little higher in extreme cases to mangle very high\n
3279  * stats from massive assaults.  -CWS\n
3280  *\n
3281  * Note that "permanent" means that the *given* amount is permanent,\n
3282  * not that the new value becomes permanent.  This may not work exactly\n
3283  * as expected, due to "weirdness" in the algorithm, but in general,\n
3284  * if your stat is already drained, the "max" value will not drop all\n
3285  * the way down to the "cur" value.\n
3286  */
3287 bool dec_stat(int stat, int amount, int permanent)
3288 {
3289         BASE_STATUS cur, max;
3290         int loss, same;
3291         bool res = FALSE;
3292
3293
3294         /* Acquire current value */
3295         cur = p_ptr->stat_cur[stat];
3296         max = p_ptr->stat_max[stat];
3297
3298         /* Note when the values are identical */
3299         same = (cur == max);
3300
3301         /* Damage "current" value */
3302         if (cur > 3)
3303         {
3304                 /* Handle "low" values */
3305                 if (cur <= 18)
3306                 {
3307                         if (amount > 90) cur--;
3308                         if (amount > 50) cur--;
3309                         if (amount > 20) cur--;
3310                         cur--;
3311                 }
3312
3313                 /* Handle "high" values */
3314                 else
3315                 {
3316                         /* Hack -- Decrement by a random amount between one-quarter */
3317                         /* and one-half of the stat bonus times the percentage, with a */
3318                         /* minimum damage of half the percentage. -CWS */
3319                         loss = (((cur-18) / 2 + 1) / 2 + 1);
3320                         if (loss < 1) loss = 1;
3321
3322                         /* Randomize the loss */
3323                         loss = ((randint1(loss) + loss) * amount) / 100;
3324
3325                         /* Maximal loss */
3326                         if (loss < amount/2) loss = amount/2;
3327
3328                         /* Lose some points */
3329                         cur = cur - loss;
3330
3331                         /* Hack -- Only reduce stat to 17 sometimes */
3332                         if (cur < 18) cur = (amount <= 20) ? 18 : 17;
3333                 }
3334
3335                 /* Prevent illegal values */
3336                 if (cur < 3) cur = 3;
3337
3338                 /* Something happened */
3339                 if (cur != p_ptr->stat_cur[stat]) res = TRUE;
3340         }
3341
3342         /* Damage "max" value */
3343         if (permanent && (max > 3))
3344         {
3345                 chg_virtue(V_SACRIFICE, 1);
3346                 if (stat == A_WIS || stat == A_INT)
3347                         chg_virtue(V_ENLIGHTEN, -2);
3348
3349                 /* Handle "low" values */
3350                 if (max <= 18)
3351                 {
3352                         if (amount > 90) max--;
3353                         if (amount > 50) max--;
3354                         if (amount > 20) max--;
3355                         max--;
3356                 }
3357
3358                 /* Handle "high" values */
3359                 else
3360                 {
3361                         /* Hack -- Decrement by a random amount between one-quarter */
3362                         /* and one-half of the stat bonus times the percentage, with a */
3363                         /* minimum damage of half the percentage. -CWS */
3364                         loss = (((max-18) / 2 + 1) / 2 + 1);
3365                         loss = ((randint1(loss) + loss) * amount) / 100;
3366                         if (loss < amount/2) loss = amount/2;
3367
3368                         /* Lose some points */
3369                         max = max - loss;
3370
3371                         /* Hack -- Only reduce stat to 17 sometimes */
3372                         if (max < 18) max = (amount <= 20) ? 18 : 17;
3373                 }
3374
3375                 /* Hack -- keep it clean */
3376                 if (same || (max < cur)) max = cur;
3377
3378                 /* Something happened */
3379                 if (max != p_ptr->stat_max[stat]) res = TRUE;
3380         }
3381
3382         if (res)
3383         {
3384                 /* Actually set the stat to its new value. */
3385                 p_ptr->stat_cur[stat] = cur;
3386                 p_ptr->stat_max[stat] = max;
3387
3388                 p_ptr->redraw |= (PR_STATS);
3389                 p_ptr->update |= (PU_BONUS);
3390         }
3391
3392         return (res);
3393 }
3394
3395
3396 /*!
3397  * @brief プレイヤーの基本能力値を回復させる / Restore a stat.  Return TRUE only if this actually makes a difference.
3398  * @param stat 回復ステータスID
3399  * @return 実際に回復した場合TRUEを返す。
3400  */
3401 bool res_stat(int stat)
3402 {
3403         /* Restore if needed */
3404         if (p_ptr->stat_cur[stat] != p_ptr->stat_max[stat])
3405         {
3406                 p_ptr->stat_cur[stat] = p_ptr->stat_max[stat];
3407                 p_ptr->update |= (PU_BONUS);
3408                 p_ptr->redraw |= (PR_STATS);
3409
3410                 /* Success */
3411                 return (TRUE);
3412         }
3413
3414         /* Nothing to restore */
3415         return (FALSE);
3416 }
3417
3418
3419 /*
3420  * Increase players hit points, notice effects
3421  */
3422 bool hp_player(int num)
3423 {
3424         int vir;
3425         vir = virtue_number(V_VITALITY);
3426
3427         if(num <= 0) return (FALSE);
3428
3429         if(vir)
3430         {
3431                 num = num * (p_ptr->virtues[vir - 1] + 1250) / 1250;
3432         }
3433         /* Healing needed */
3434         if (p_ptr->chp < p_ptr->mhp)
3435         {
3436                 if ((num > 0) && (p_ptr->chp < (p_ptr->mhp/3)))
3437                         chg_virtue(V_TEMPERANCE, 1);
3438                 /* Gain hitpoints */
3439                 p_ptr->chp += num;
3440
3441                 /* Enforce maximum */
3442                 if (p_ptr->chp >= p_ptr->mhp)
3443                 {
3444                         p_ptr->chp = p_ptr->mhp;
3445                         p_ptr->chp_frac = 0;
3446                 }
3447
3448                 p_ptr->redraw |= (PR_HP);
3449
3450                 p_ptr->window |= (PW_PLAYER);
3451
3452                 /* Heal 0-4 */
3453                 if (num < 5)
3454                 {
3455                         msg_print(_("少し気分が良くなった。", "You feel a little better."));
3456                 }
3457
3458                 /* Heal 5-14 */
3459                 else if (num < 15)
3460                 {
3461                         msg_print(_("気分が良くなった。", "You feel better."));
3462                 }
3463
3464                 /* Heal 15-34 */
3465                 else if (num < 35)
3466                 {
3467                         msg_print(_("とても気分が良くなった。", "You feel much better."));
3468                 }
3469
3470                 /* Heal 35+ */
3471                 else
3472                 {
3473                         msg_print(_("ひじょうに気分が良くなった。", "You feel very good."));
3474                 }
3475
3476                 return (TRUE);
3477         }
3478
3479         /* Ignore */
3480         return (FALSE);
3481 }
3482
3483
3484 /*
3485  * Array of stat "descriptions"
3486  */
3487 static concptr desc_stat_pos[] =
3488 {
3489         _("強く", "strong"),
3490         _("知的に", "smart"),
3491         _("賢く", "wise"),
3492         _("器用に", "dextrous"),
3493         _("健康に", "healthy"),
3494         _("美しく", "cute")
3495 };
3496
3497
3498 /*
3499  * Array of stat "descriptions"
3500  */
3501 static concptr desc_stat_neg[] =
3502 {
3503         _("弱く", "weak"),
3504         _("無知に", "stupid"),
3505         _("愚かに", "naive"),
3506         _("不器用に", "clumsy"),
3507         _("不健康に", "sickly"),
3508         _("醜く", "ugly")
3509 };
3510
3511
3512 /*
3513  * Lose a "point"
3514  */
3515 bool do_dec_stat(int stat)
3516 {
3517         bool sust = FALSE;
3518
3519         /* Access the "sustain" */
3520         switch (stat)
3521         {
3522                 case A_STR: if (p_ptr->sustain_str) sust = TRUE; break;
3523                 case A_INT: if (p_ptr->sustain_int) sust = TRUE; break;
3524                 case A_WIS: if (p_ptr->sustain_wis) sust = TRUE; break;
3525                 case A_DEX: if (p_ptr->sustain_dex) sust = TRUE; break;
3526                 case A_CON: if (p_ptr->sustain_con) sust = TRUE; break;
3527                 case A_CHR: if (p_ptr->sustain_chr) sust = TRUE; break;
3528         }
3529
3530         /* Sustain */
3531         if (sust && (!ironman_nightmare || randint0(13)))
3532         {
3533                 msg_format(_("%sなった気がしたが、すぐに元に戻った。", "You feel %s for a moment, but the feeling passes."),
3534                                         desc_stat_neg[stat]);
3535
3536                 /* Notice effect */
3537                 return (TRUE);
3538         }
3539
3540         /* Attempt to reduce the stat */
3541         if (dec_stat(stat, 10, (ironman_nightmare && !randint0(13))))
3542         {
3543                 msg_format(_("ひどく%sなった気がする。", "You feel very %s."), desc_stat_neg[stat]);
3544
3545                 /* Notice effect */
3546                 return (TRUE);
3547         }
3548
3549         /* Nothing obvious */
3550         return (FALSE);
3551 }
3552
3553
3554 /*
3555  * Restore lost "points" in a stat
3556  */
3557 bool do_res_stat(int stat)
3558 {
3559         /* Attempt to increase */
3560         if (res_stat(stat))
3561         {
3562                 msg_format(_("元通りに%sなった気がする。", "You feel less %s."), desc_stat_pos[stat]);
3563
3564                 return (TRUE);
3565         }
3566
3567         /* Nothing obvious */
3568         return (FALSE);
3569 }
3570
3571
3572 /*
3573  * Gain a "point" in a stat
3574  */
3575 bool do_inc_stat(int stat)
3576 {
3577         bool res;
3578
3579         /* Restore strength */
3580         res = res_stat(stat);
3581
3582         /* Attempt to increase */
3583         if (inc_stat(stat))
3584         {
3585                 if (stat == A_WIS)
3586                 {
3587                         chg_virtue(V_ENLIGHTEN, 1);
3588                         chg_virtue(V_FAITH, 1);
3589                 }
3590                 else if (stat == A_INT)
3591                 {
3592                         chg_virtue(V_KNOWLEDGE, 1);
3593                         chg_virtue(V_ENLIGHTEN, 1);
3594                 }
3595                 else if (stat == A_CON)
3596                         chg_virtue(V_VITALITY, 1);
3597
3598                 msg_format(_("ワーオ!とても%sなった!", "Wow!  You feel very %s!"), desc_stat_pos[stat]);
3599
3600                 return (TRUE);
3601         }
3602
3603         /* Restoration worked */
3604         if (res)
3605         {
3606                 msg_format(_("元通りに%sなった気がする。", "You feel less %s."), desc_stat_pos[stat]);
3607
3608                 return (TRUE);
3609         }
3610
3611         /* Nothing obvious */
3612         return (FALSE);
3613 }
3614
3615
3616 /*
3617  * Restores any drained experience
3618  */
3619 bool restore_level(void)
3620 {
3621         /* Restore experience */
3622         if (p_ptr->exp < p_ptr->max_exp)
3623         {
3624                 msg_print(_("経験値が戻ってきた気がする。", "You feel your experience returning."));
3625
3626                 /* Restore the experience */
3627                 p_ptr->exp = p_ptr->max_exp;
3628
3629                 /* Check the experience */
3630                 check_experience();
3631
3632                 /* Did something */
3633                 return (TRUE);
3634         }
3635
3636         /* No effect */
3637         return (FALSE);
3638 }
3639
3640 /*
3641  * Forget everything
3642  */
3643 bool lose_all_info(void)
3644 {
3645         int i;
3646
3647         chg_virtue(V_KNOWLEDGE, -5);
3648         chg_virtue(V_ENLIGHTEN, -5);
3649
3650         /* Forget info about objects */
3651         for (i = 0; i < INVEN_TOTAL; i++)
3652         {
3653                 object_type *o_ptr = &p_ptr->inventory_list[i];
3654                 if (!o_ptr->k_idx) continue;
3655
3656                 /* Allow "protection" by the MENTAL flag */
3657                 if (o_ptr->ident & (IDENT_MENTAL)) continue;
3658
3659                 /* Remove "default inscriptions" */
3660                 o_ptr->feeling = FEEL_NONE;
3661
3662                 /* Hack -- Clear the "empty" flag */
3663                 o_ptr->ident &= ~(IDENT_EMPTY);
3664
3665                 /* Hack -- Clear the "known" flag */
3666                 o_ptr->ident &= ~(IDENT_KNOWN);
3667
3668                 /* Hack -- Clear the "felt" flag */
3669                 o_ptr->ident &= ~(IDENT_SENSE);
3670         }
3671         p_ptr->update |= (PU_BONUS);
3672         p_ptr->update |= (PU_COMBINE | PU_REORDER);
3673
3674         p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER);
3675
3676         /* Mega-Hack -- Forget the map */
3677         wiz_dark();
3678
3679         /* It worked */
3680         return (TRUE);
3681 }
3682
3683
3684 void do_poly_wounds(void)
3685 {
3686         /* Changed to always provide at least _some_ healing */
3687         s16b wounds = p_ptr->cut;
3688         s16b hit_p = (p_ptr->mhp - p_ptr->chp);
3689         s16b change = damroll(p_ptr->lev, 5);
3690         bool Nasty_effect = one_in_(5);
3691
3692         if (!(wounds || hit_p || Nasty_effect)) return;
3693
3694         msg_print(_("傷がより軽いものに変化した。", "Your wounds are polymorphed into less serious ones."));
3695         hp_player(change);
3696         if (Nasty_effect)
3697         {
3698                 msg_print(_("新たな傷ができた!", "A new wound was created!"));
3699                 take_hit(DAMAGE_LOSELIFE, change / 2, _("変化した傷", "a polymorphed wound"), -1);
3700                 set_cut(change);
3701         }
3702         else
3703         {
3704                 set_cut(p_ptr->cut - (change / 2));
3705         }
3706 }
3707
3708
3709 /*
3710  * Change player race
3711  */
3712 void change_race(CHARACTER_IDX new_race, concptr effect_msg)
3713 {
3714         concptr title = race_info[new_race].title;
3715         int  old_race = p_ptr->prace;
3716
3717 #ifdef JP
3718         msg_format("あなたは%s%sに変化した!", effect_msg, title);
3719 #else
3720         msg_format("You current_world_ptr->game_turn into %s %s%s!", (!effect_msg[0] && is_a_vowel(title[0]) ? "an" : "a"), effect_msg, title);
3721 #endif
3722
3723         chg_virtue(V_CHANCE, 2);
3724
3725         if (p_ptr->prace < 32)
3726         {
3727                 p_ptr->old_race1 |= 1L << p_ptr->prace;
3728         }
3729         else
3730         {
3731                 p_ptr->old_race2 |= 1L << (p_ptr->prace - 32);
3732         }
3733         p_ptr->prace = new_race;
3734         rp_ptr = &race_info[p_ptr->prace];
3735
3736         /* Experience factor */
3737         p_ptr->expfact = rp_ptr->r_exp + cp_ptr->c_exp;
3738
3739         /*
3740          * The speed bonus of Klackons and Sprites are disabled
3741          * and the experience penalty is decreased.
3742          */
3743         if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_NINJA)) && ((p_ptr->prace == RACE_KLACKON) || (p_ptr->prace == RACE_SPRITE)))
3744                 p_ptr->expfact -= 15;
3745
3746         /* Get character's height and weight */
3747         get_height_weight();
3748
3749         /* Hitdice */
3750         if (p_ptr->pclass == CLASS_SORCERER)
3751                 p_ptr->hitdie = rp_ptr->r_mhp/2 + cp_ptr->c_mhp + ap_ptr->a_mhp;
3752         else
3753                 p_ptr->hitdie = rp_ptr->r_mhp + cp_ptr->c_mhp + ap_ptr->a_mhp;
3754
3755         roll_hitdice(p_ptr, 0L);
3756
3757         /* The experience level may be modified */
3758         check_experience();
3759
3760         p_ptr->redraw |= (PR_BASIC);
3761
3762         p_ptr->update |= (PU_BONUS);
3763
3764         handle_stuff();
3765
3766         /* Load an autopick preference file */
3767         if (old_race != p_ptr->prace) autopick_load_pref(FALSE);
3768
3769         /* Player's graphic tile may change */
3770         lite_spot(p_ptr->y, p_ptr->x);
3771 }
3772
3773
3774 void do_poly_self(void)
3775 {
3776         int power = p_ptr->lev;
3777
3778         msg_print(_("あなたは変化の訪れを感じた...", "You feel a change coming over you..."));
3779         chg_virtue(V_CHANCE, 1);
3780
3781         if ((power > randint0(20)) && one_in_(3) && (p_ptr->prace != RACE_ANDROID))
3782         {
3783                 char effect_msg[80] = "";
3784                 CHARACTER_IDX new_race;
3785
3786                 /* Some form of racial polymorph... */
3787                 power -= 10;
3788
3789                 if ((power > randint0(5)) && one_in_(4))
3790                 {
3791                         /* sex change */
3792                         power -= 2;
3793
3794                         if (p_ptr->psex == SEX_MALE)
3795                         {
3796                                 p_ptr->psex = SEX_FEMALE;
3797                                 sp_ptr = &sex_info[p_ptr->psex];
3798                                 sprintf(effect_msg, _("女性の", "female "));
3799                         }
3800                         else
3801                         {
3802                                 p_ptr->psex = SEX_MALE;
3803                                 sp_ptr = &sex_info[p_ptr->psex];
3804                                 sprintf(effect_msg, _("男性の", "male "));
3805                         }
3806                 }
3807
3808                 if ((power > randint0(30)) && one_in_(5))
3809                 {
3810                         int tmp = 0;
3811
3812                         /* Harmful deformity */
3813                         power -= 15;
3814
3815                         while (tmp < A_MAX)
3816                         {
3817                                 if (one_in_(2))
3818                                 {
3819                                         (void)dec_stat(tmp, randint1(6) + 6, one_in_(3));
3820                                         power -= 1;
3821                                 }
3822                                 tmp++;
3823                         }
3824
3825                         /* Deformities are discriminated against! */
3826                         (void)dec_stat(A_CHR, randint1(6), TRUE);
3827
3828                         if (effect_msg[0])
3829                         {
3830                                 char tmp_msg[10];
3831                                 sprintf(tmp_msg,_("%s", "%s "),effect_msg);
3832                                 sprintf(effect_msg,_("奇形の%s", "deformed %s "),tmp_msg);
3833                         }
3834                         else
3835                         {
3836                                 sprintf(effect_msg,_("奇形の", "deformed "));
3837                         }
3838                 }
3839
3840                 while ((power > randint0(20)) && one_in_(10))
3841                 {
3842                         /* Polymorph into a less mutated form */
3843                         power -= 10;
3844
3845                         if (!lose_mutation(0))
3846                         msg_print(_("奇妙なくらい普通になった気がする。", "You feel oddly normal."));
3847                 }
3848
3849                 do
3850                 {
3851                         new_race = (CHARACTER_IDX)randint0(MAX_RACES);
3852                 }
3853                 while ((new_race == p_ptr->prace) || (new_race == RACE_ANDROID));
3854
3855                 change_race(new_race, effect_msg);
3856         }
3857
3858         if ((power > randint0(30)) && one_in_(6))
3859         {
3860                 int tmp = 0;
3861
3862                 /* Abomination! */
3863                 power -= 20;
3864                 msg_format(_("%sの構成が変化した!", "Your internal organs are rearranged!"), p_ptr->prace == RACE_ANDROID ? "機械" : "内臓");
3865
3866                 while (tmp < A_MAX)
3867                 {
3868                         (void)dec_stat(tmp, randint1(6) + 6, one_in_(3));
3869                         tmp++;
3870                 }
3871                 if (one_in_(6))
3872                 {
3873                         msg_print(_("現在の姿で生きていくのは困難なようだ!", "You find living difficult in your present form!"));
3874                         take_hit(DAMAGE_LOSELIFE, damroll(randint1(10), p_ptr->lev), _("致命的な突然変異", "a lethal mutation"), -1);
3875
3876                         power -= 10;
3877                 }
3878         }
3879
3880         if ((power > randint0(20)) && one_in_(4))
3881         {
3882                 power -= 10;
3883
3884                 get_max_stats();
3885                 roll_hitdice(p_ptr, 0L);
3886         }
3887
3888         while ((power > randint0(15)) && one_in_(3))
3889         {
3890                 power -= 7;
3891                 (void)gain_mutation(p_ptr, 0);
3892         }
3893
3894         if (power > randint0(5))
3895         {
3896                 power -= 5;
3897                 do_poly_wounds();
3898         }
3899
3900         /* Note: earlier deductions may have left power < 0 already. */
3901         while (power > 0)
3902         {
3903                 status_shuffle();
3904                 power--;
3905         }
3906 }
3907
3908
3909 /*
3910  * Decreases players hit points and sets death flag if necessary
3911  *
3912  * Invulnerability needs to be changed into a "shield"
3913  *
3914  * Hack -- this function allows the user to save (or quit)
3915  * the game when he dies, since the "You die." message is shown before
3916  * setting the player to "dead".
3917  */
3918
3919 int take_hit(int damage_type, HIT_POINT damage, concptr hit_from, int monspell)
3920 {
3921         int old_chp = p_ptr->chp;
3922
3923         char death_message[1024];
3924         char tmp[1024];
3925
3926         int warning = (p_ptr->mhp * hitpoint_warn / 10);
3927         if (p_ptr->is_dead) return 0;
3928
3929         if (p_ptr->sutemi) damage *= 2;
3930         if (p_ptr->special_defense & KATA_IAI) damage += (damage + 4) / 5;
3931
3932         if (easy_band) damage = (damage+1)/2;
3933
3934         if (damage_type != DAMAGE_USELIFE)
3935         {
3936                 disturb(TRUE, TRUE);
3937                 if (auto_more)
3938                 {
3939                         p_ptr->now_damaged = TRUE;
3940                 }
3941         }
3942
3943         if (monspell >= 0) learn_spell(monspell);
3944
3945         /* Mega-Hack -- Apply "invulnerability" */
3946         if ((damage_type != DAMAGE_USELIFE) && (damage_type != DAMAGE_LOSELIFE))
3947         {
3948                 if (IS_INVULN() && (damage < 9000))
3949                 {
3950                         if (damage_type == DAMAGE_FORCE)
3951                         {
3952                                 msg_print(_("バリアが切り裂かれた!", "The attack cuts your shield of invulnerability open!"));
3953                         }
3954                         else if (one_in_(PENETRATE_INVULNERABILITY))
3955                         {
3956                                 msg_print(_("無敵のバリアを破って攻撃された!", "The attack penetrates your shield of invulnerability!"));
3957                         }
3958                         else
3959                         {
3960                                 return 0;
3961                         }
3962                 }
3963
3964                 if (CHECK_MULTISHADOW())
3965                 {
3966                         if (damage_type == DAMAGE_FORCE)
3967                         {
3968                                 msg_print(_("幻影もろとも体が切り裂かれた!", "The attack hits Shadow together with you!"));
3969                         }
3970                         else if (damage_type == DAMAGE_ATTACK)
3971                         {
3972                                 msg_print(_("攻撃は幻影に命中し、あなたには届かなかった。", "The attack hits Shadow, you are unharmed!"));
3973                                 return 0;
3974                         }
3975                 }
3976
3977                 if (p_ptr->wraith_form)
3978                 {
3979                         if (damage_type == DAMAGE_FORCE)
3980                         {
3981                                 msg_print(_("半物質の体が切り裂かれた!", "The attack cuts through your ethereal body!"));
3982                         }
3983                         else
3984                         {
3985                                 damage /= 2;
3986                                 if ((damage == 0) && one_in_(2)) damage = 1;
3987                         }
3988                 }
3989
3990                 if (p_ptr->special_defense & KATA_MUSOU)
3991                 {
3992                         damage /= 2;
3993                         if ((damage == 0) && one_in_(2)) damage = 1;
3994                 }
3995         } /* not if LOSELIFE USELIFE */
3996
3997         /* Hurt the player */
3998         p_ptr->chp -= damage;
3999         if(damage_type == DAMAGE_GENO && p_ptr->chp < 0)
4000         {
4001                 damage += p_ptr->chp;
4002                 p_ptr->chp = 0;
4003         }
4004
4005         /* Display the hitpoints */
4006         p_ptr->redraw |= (PR_HP);
4007
4008         p_ptr->window |= (PW_PLAYER);
4009
4010         if (damage_type != DAMAGE_GENO && p_ptr->chp == 0)
4011         {
4012                 chg_virtue(V_SACRIFICE, 1);
4013                 chg_virtue(V_CHANCE, 2);
4014         }
4015
4016         /* Dead player */
4017         if (p_ptr->chp < 0)
4018         {
4019                 bool android = (p_ptr->prace == RACE_ANDROID ? TRUE : FALSE);
4020
4021 #ifdef JP       /* 死んだ時に強制終了して死を回避できなくしてみた by Habu */
4022                 if (!cheat_save)
4023                         if(!save_player()) msg_print("セーブ失敗!");
4024 #endif
4025
4026                 sound(SOUND_DEATH);
4027
4028                 chg_virtue(V_SACRIFICE, 10);
4029
4030                 handle_stuff();
4031                 p_ptr->leaving = TRUE;
4032
4033                 /* Note death */
4034                 p_ptr->is_dead = TRUE;
4035
4036                 if (p_ptr->inside_arena)
4037                 {
4038                         concptr m_name = r_name+r_info[arena_info[p_ptr->arena_number].r_idx].name;
4039                         msg_format(_("あなたは%sの前に敗れ去った。", "You are beaten by %s."), m_name);
4040                         msg_print(NULL);
4041                         if (record_arena) do_cmd_write_nikki(NIKKI_ARENA, -1 - p_ptr->arena_number, m_name);
4042                 }
4043                 else
4044                 {
4045                         QUEST_IDX q_idx = quest_number(current_floor_ptr->dun_level);
4046                         bool seppuku = streq(hit_from, "Seppuku");
4047                         bool winning_seppuku = p_ptr->total_winner && seppuku;
4048
4049                         play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_GAMEOVER);
4050
4051 #ifdef WORLD_SCORE
4052                         /* Make screen dump */
4053                         screen_dump = make_screen_dump();
4054 #endif
4055
4056                         /* Note cause of death */
4057                         if (seppuku)
4058                         {
4059                                 strcpy(p_ptr->died_from, hit_from);
4060 #ifdef JP
4061                                 if (!winning_seppuku) strcpy(p_ptr->died_from, "切腹");
4062 #endif
4063                         }
4064                         else
4065                         {
4066                                 char dummy[1024];
4067 #ifdef JP
4068                                 sprintf(dummy, "%s%s%s", !p_ptr->paralyzed ? "" : p_ptr->free_act ? "彫像状態で" : "麻痺状態で", p_ptr->image ? "幻覚に歪んだ" : "", hit_from);
4069 #else
4070                                 sprintf(dummy, "%s%s", hit_from, !p_ptr->paralyzed ? "" : " while helpless");
4071 #endif
4072                                 my_strcpy(p_ptr->died_from, dummy, sizeof p_ptr->died_from);
4073                         }
4074
4075                         /* No longer a winner */
4076                         p_ptr->total_winner = FALSE;
4077
4078                         if (winning_seppuku)
4079                         {
4080                                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("勝利の後切腹した。", "did Seppuku after the winning."));
4081                         }
4082                         else
4083                         {
4084                                 char buf[20];
4085
4086                                 if (p_ptr->inside_arena)
4087                                         strcpy(buf,_("アリーナ", "in the Arena"));
4088                                 else if (!current_floor_ptr->dun_level)
4089                                         strcpy(buf,_("地上", "on the surface"));
4090                                 else if (q_idx && (is_fixed_quest_idx(q_idx) &&
4091                                          !((q_idx == QUEST_OBERON) || (q_idx == QUEST_SERPENT))))
4092                                         strcpy(buf,_("クエスト", "in a quest"));
4093                                 else
4094                                         sprintf(buf,_("%d階", "level %d"), (int)current_floor_ptr->dun_level);
4095
4096                                 sprintf(tmp, _("%sで%sに殺された。", "killed by %s %s."), buf, p_ptr->died_from);
4097                                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, tmp);
4098                         }
4099
4100                         do_cmd_write_nikki(NIKKI_GAMESTART, 1, _("-------- ゲームオーバー --------", "--------   Game  Over   --------"));
4101                         do_cmd_write_nikki(NIKKI_BUNSHOU, 1, "\n\n\n\n");
4102
4103                         flush();
4104
4105                         if (get_check_strict(_("画面を保存しますか?", "Dump the screen? "), CHECK_NO_HISTORY))
4106                         {
4107                                 do_cmd_save_screen();
4108                         }
4109
4110                         flush();
4111
4112                         /* Initialize "last message" buffer */
4113                         if (p_ptr->last_message) string_free(p_ptr->last_message);
4114                         p_ptr->last_message = NULL;
4115
4116                         /* Hack -- Note death */
4117                         if (!last_words)
4118                         {
4119 #ifdef JP
4120                                 msg_format("あなたは%sました。", android ? "壊れ" : "死に");
4121 #else
4122                                 msg_print(android ? "You are broken." : "You die.");
4123 #endif
4124
4125                                 msg_print(NULL);
4126                         }
4127                         else
4128                         {
4129                                 if (winning_seppuku)
4130                                 {
4131                                         get_rnd_line(_("seppuku_j.txt", "seppuku.txt"), 0, death_message);
4132                                 }
4133                                 else
4134                                 {
4135                                         get_rnd_line(_("death_j.txt", "death.txt"), 0, death_message);
4136                                 }
4137
4138                                 do
4139                                 {
4140 #ifdef JP
4141                                         while (!get_string(winning_seppuku ? "辞世の句: " : "断末魔の叫び: ", death_message, 1024)) ;
4142 #else
4143                                         while (!get_string("Last word: ", death_message, 1024)) ;
4144 #endif
4145                                 }
4146                                 while (winning_seppuku && !get_check_strict(_("よろしいですか?", "Are you sure? "), CHECK_NO_HISTORY));
4147
4148                                 if (death_message[0] == '\0')
4149                                 {
4150 #ifdef JP
4151                                         strcpy(death_message, format("あなたは%sました。", android ? "壊れ" : "死に"));
4152 #else
4153                                         strcpy(death_message, android ? "You are broken." : "You die.");
4154 #endif
4155                                 }
4156                                 else p_ptr->last_message = string_make(death_message);
4157
4158 #ifdef JP
4159                                 if (winning_seppuku)
4160                                 {
4161                                         int i, len;
4162                                         int w = Term->wid;
4163                                         int h = Term->hgt;
4164                                         int msg_pos_x[9] = {  5,  7,  9, 12,  14,  17,  19,  21, 23};
4165                                         int msg_pos_y[9] = {  3,  4,  5,  4,   5,   4,   5,   6,  4};
4166                                         concptr str;
4167                                         char* str2;
4168
4169                                         Term_clear();
4170
4171                                         /* 桜散る */
4172                                         for (i = 0; i < 40; i++)
4173                                                 Term_putstr(randint0(w / 2) * 2, randint0(h), 2, TERM_VIOLET, "υ");
4174
4175                                         str = death_message;
4176                                         if (strncmp(str, "「", 2) == 0) str += 2;
4177
4178                                         str2 = my_strstr(str, "」");
4179                                         if (str2 != NULL) *str2 = '\0';
4180
4181                                         i = 0;
4182                                         while (i < 9)
4183                                         {
4184                                                 str2 = my_strstr(str, " ");
4185                                                 if (str2 == NULL) len = strlen(str);
4186                                                 else len = str2 - str;
4187
4188                                                 if (len != 0)
4189                                                 {
4190                                                         Term_putstr_v(w * 3 / 4 - 2 - msg_pos_x[i] * 2, msg_pos_y[i], len,
4191                                                         TERM_WHITE, str);
4192                                                         if (str2 == NULL) break;
4193                                                         i++;
4194                                                 }
4195                                                 str = str2 + 1;
4196                                                 if (*str == 0) break;
4197                                         }
4198
4199                                         /* Hide cursor */
4200                                         Term_putstr(w-1, h-1, 1, TERM_WHITE, " ");
4201
4202                                         flush();
4203 #ifdef WORLD_SCORE
4204                                         /* Make screen dump */
4205                                         screen_dump = make_screen_dump();
4206 #endif
4207
4208                                         /* Wait a key press */
4209                                         (void)inkey();
4210                                 }
4211                                 else
4212 #endif
4213                                         msg_print(death_message);
4214                         }
4215                 }
4216
4217                 /* Dead */
4218                 return damage;
4219         }
4220
4221         handle_stuff();
4222
4223         /* Hitpoint warning */
4224         if (p_ptr->chp < warning)
4225         {
4226                 /* Hack -- bell on first notice */
4227                 if (old_chp > warning) bell();
4228
4229                 sound(SOUND_WARN);
4230
4231                 if (record_danger && (old_chp > warning))
4232                 {
4233                         if (p_ptr->image && damage_type == DAMAGE_ATTACK)
4234                                 hit_from = _("何か", "something");
4235
4236                         sprintf(tmp,_("%sによってピンチに陥った。", "A critical situation because of %s."),hit_from);
4237                         do_cmd_write_nikki(NIKKI_BUNSHOU, 0, tmp);
4238                 }
4239
4240                 if (auto_more)
4241                 {
4242                         /* stop auto_more even if DAMAGE_USELIFE */
4243                         p_ptr->now_damaged = TRUE;
4244                 }
4245
4246                 msg_print(_("*** 警告:低ヒット・ポイント! ***", "*** LOW HITPOINT WARNING! ***"));
4247                 msg_print(NULL);
4248                 flush();
4249         }
4250         if (p_ptr->wild_mode && !p_ptr->leaving && (p_ptr->chp < MAX(warning, p_ptr->mhp/5)))
4251         {
4252                 change_wild_mode(FALSE);
4253         }
4254         return damage;
4255 }
4256
4257
4258 /*
4259  * Gain experience
4260  */
4261 void gain_exp_64(s32b amount, u32b amount_frac)
4262 {
4263         if (p_ptr->is_dead) return;
4264
4265         if (p_ptr->prace == RACE_ANDROID) return;
4266
4267         /* Gain some experience */
4268         s64b_add(&(p_ptr->exp), &(p_ptr->exp_frac), amount, amount_frac);
4269
4270         /* Slowly recover from experience drainage */
4271         if (p_ptr->exp < p_ptr->max_exp)
4272         {
4273                 /* Gain max experience (20%) (was 10%) */
4274                 p_ptr->max_exp += amount / 5;
4275         }
4276
4277         /* Check Experience */
4278         check_experience();
4279 }
4280
4281
4282 /*
4283  * Gain experience
4284  */
4285 void gain_exp(s32b amount)
4286 {
4287         gain_exp_64(amount, 0L);
4288 }
4289
4290
4291 void calc_android_exp(void)
4292 {
4293         int i;
4294         u32b total_exp = 0;
4295         if (p_ptr->is_dead) return;
4296
4297         if (p_ptr->prace != RACE_ANDROID) return;
4298
4299         for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
4300         {
4301                 object_type *o_ptr = &p_ptr->inventory_list[i];
4302                 object_type forge;
4303                 object_type *q_ptr = &forge;
4304                 u32b value, exp;
4305                 DEPTH level = MAX(k_info[o_ptr->k_idx].level - 8, 1);
4306
4307                 if ((i == INVEN_RIGHT) || (i == INVEN_LEFT) || (i == INVEN_NECK) || (i == INVEN_LITE)) continue;
4308                 if (!o_ptr->k_idx) continue;
4309                 object_wipe(q_ptr);
4310
4311                 object_copy(q_ptr, o_ptr);
4312                 q_ptr->discount = 0;
4313                 q_ptr->curse_flags = 0L;
4314
4315                 if (object_is_fixed_artifact(o_ptr))
4316                 {
4317                         level = (level + MAX(a_info[o_ptr->name1].level - 8, 5)) / 2;
4318                         level += MIN(20, a_info[o_ptr->name1].rarity/(a_info[o_ptr->name1].gen_flags & TRG_INSTA_ART ? 10 : 3));
4319                 }
4320                 else if (object_is_ego(o_ptr))
4321                 {
4322                         level += MAX(3, (e_info[o_ptr->name2].rating - 5)/2);
4323                 }
4324                 else if (o_ptr->art_name)
4325                 {
4326                         s32b total_flags = flag_cost(o_ptr, o_ptr->pval);
4327                         int fake_level;
4328
4329                         if (!object_is_weapon_ammo(o_ptr))
4330                         {
4331                                 /* For armors */
4332                                 if (total_flags < 15000) fake_level = 10;
4333                                 else if (total_flags < 35000) fake_level = 25;
4334                                 else fake_level = 40;
4335                         }
4336                         else
4337                         {
4338                                 /* For weapons */
4339                                 if (total_flags < 20000) fake_level = 10;
4340                                 else if (total_flags < 45000) fake_level = 25;
4341                                 else fake_level = 40;
4342                         }
4343
4344                         level = MAX(level, (level + MAX(fake_level - 8, 5)) / 2 + 3);
4345                 }
4346
4347                 value = object_value_real(q_ptr);
4348
4349                 if (value <= 0) continue;
4350                 if ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ABUNAI_MIZUGI) && (p_ptr->pseikaku != SEIKAKU_SEXY)) value /= 32;
4351                 if (value > 5000000L) value = 5000000L;
4352                 if ((o_ptr->tval == TV_DRAG_ARMOR) || (o_ptr->tval == TV_CARD)) level /= 2;
4353
4354                 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr) ||
4355                     (o_ptr->tval == TV_DRAG_ARMOR) ||
4356                     ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
4357                     ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
4358                     ((o_ptr->tval == TV_GLOVES) && (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES)) ||
4359                     ((o_ptr->tval == TV_BOOTS) && (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE)) ||
4360                     ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)))
4361                 {
4362                         if (level > 65) level = 35 + (level - 65) / 5;
4363                         else if (level > 35) level = 25 + (level - 35) / 3;
4364                         else if (level > 15) level = 15 + (level - 15) / 2;
4365                         exp = MIN(100000L, value) / 2 * level * level;
4366                         if (value > 100000L)
4367                                 exp += (value - 100000L) / 8 * level * level;
4368                 }
4369                 else
4370                 {
4371                         exp = MIN(100000L, value) * level;
4372                         if (value > 100000L)
4373                                 exp += (value - 100000L) / 4  * level;
4374                 }
4375                 if ((((i == INVEN_RARM) || (i == INVEN_LARM)) && (has_melee_weapon(i))) || (i == INVEN_BOW)) total_exp += exp / 48;
4376                 else total_exp += exp / 16;
4377                 if (i == INVEN_BODY) total_exp += exp / 32;
4378         }
4379         p_ptr->exp = p_ptr->max_exp = total_exp;
4380
4381         /* Check Experience */
4382         check_experience();
4383 }
4384
4385
4386 /*
4387  * Lose experience
4388  */
4389 void lose_exp(s32b amount)
4390 {
4391         if (p_ptr->prace == RACE_ANDROID) return;
4392
4393         /* Never drop below zero experience */
4394         if (amount > p_ptr->exp) amount = p_ptr->exp;
4395
4396         /* Lose some experience */
4397         p_ptr->exp -= amount;
4398
4399         /* Check Experience */
4400         check_experience();
4401 }
4402
4403
4404 /*
4405  * Drain experience
4406  * If resisted to draining, return FALSE
4407  */
4408 bool drain_exp(s32b drain, s32b slip, int hold_exp_prob)
4409 {
4410         /* Androids and their mimics are never drained */
4411         if (p_ptr->prace == RACE_ANDROID) return FALSE;
4412
4413         if (p_ptr->hold_exp && (randint0(100) < hold_exp_prob))
4414         {
4415                 /* Hold experience */
4416                 msg_print(_("しかし自己の経験値を守りきった!", "You keep hold of your experience!"));
4417                 return FALSE;
4418         }
4419
4420         /* Hold experience failed */
4421         if (p_ptr->hold_exp)
4422         {
4423                 msg_print(_("経験値を少し吸い取られた気がする!", "You feel your experience slipping away!"));
4424                 lose_exp(slip);
4425         }
4426         else
4427         {
4428                 msg_print(_("経験値が体から吸い取られた気がする!", "You feel your experience draining away!"));
4429                 lose_exp(drain);
4430         }
4431
4432         return TRUE;
4433 }
4434
4435
4436 bool set_ultimate_res(TIME_EFFECT v, bool do_dec)
4437 {
4438         bool notice = FALSE;
4439         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
4440
4441         if (p_ptr->is_dead) return FALSE;
4442
4443         /* Open */
4444         if (v)
4445         {
4446                 if (p_ptr->ult_res && !do_dec)
4447                 {
4448                         if (p_ptr->ult_res > v) return FALSE;
4449                 }
4450                 else if (!p_ptr->ult_res)
4451                 {
4452                         msg_print(_("あらゆることに対して耐性がついた気がする!", "You feel resistant!"));
4453                         notice = TRUE;
4454                 }
4455         }
4456
4457         /* Shut */
4458         else
4459         {
4460                 if (p_ptr->ult_res)
4461                 {
4462                         msg_print(_("あらゆることに対する耐性が薄れた気がする。", "You feel less resistant"));
4463                         notice = TRUE;
4464                 }
4465         }
4466
4467         /* Use the value */
4468         p_ptr->ult_res = v;
4469         p_ptr->redraw |= (PR_STATUS);
4470
4471         /* Nothing to notice */
4472         if (!notice) return (FALSE);
4473
4474         if (disturb_state) disturb(FALSE, FALSE);
4475         p_ptr->update |= (PU_BONUS);
4476         handle_stuff();
4477         return (TRUE);
4478 }
4479
4480 bool set_tim_res_nether(TIME_EFFECT v, bool do_dec)
4481 {
4482         bool notice = FALSE;
4483         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
4484
4485         if (p_ptr->is_dead) return FALSE;
4486
4487         /* Open */
4488         if (v)
4489         {
4490                 if (p_ptr->tim_res_nether && !do_dec)
4491                 {
4492                         if (p_ptr->tim_res_nether > v) return FALSE;
4493                 }
4494                 else if (!p_ptr->tim_res_nether)
4495                 {
4496                         msg_print(_("地獄の力に対して耐性がついた気がする!", "You feel nether resistant!"));
4497                         notice = TRUE;
4498                 }
4499         }
4500
4501         /* Shut */
4502         else
4503         {
4504                 if (p_ptr->tim_res_nether)
4505                 {
4506                         msg_print(_("地獄の力に対する耐性が薄れた気がする。", "You feel less nether resistant"));
4507                         notice = TRUE;
4508                 }
4509         }
4510
4511         /* Use the value */
4512         p_ptr->tim_res_nether = v;
4513         p_ptr->redraw |= (PR_STATUS);
4514
4515         /* Nothing to notice */
4516         if (!notice) return (FALSE);
4517
4518         if (disturb_state) disturb(FALSE, FALSE);
4519         p_ptr->update |= (PU_BONUS);
4520         handle_stuff();
4521         return (TRUE);
4522 }
4523
4524 bool set_tim_res_time(TIME_EFFECT v, bool do_dec)
4525 {
4526         bool notice = FALSE;
4527         v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
4528
4529         if (p_ptr->is_dead) return FALSE;
4530
4531         /* Open */
4532         if (v)
4533         {
4534                 if (p_ptr->tim_res_time && !do_dec)
4535                 {
4536                         if (p_ptr->tim_res_time > v) return FALSE;
4537                 }
4538                 else if (!p_ptr->tim_res_time)
4539                 {
4540                         msg_print(_("時間逆転の力に対して耐性がついた気がする!", "You feel time resistant!"));
4541                         notice = TRUE;
4542                 }
4543         }
4544
4545         /* Shut */
4546         else
4547         {
4548                 if (p_ptr->tim_res_time)
4549                 {
4550                         msg_print(_("時間逆転の力に対する耐性が薄れた気がする。", "You feel less time resistant"));
4551                         notice = TRUE;
4552                 }
4553         }
4554
4555         /* Use the value */
4556         p_ptr->tim_res_time = v;
4557         p_ptr->redraw |= (PR_STATUS);
4558
4559         /* Nothing to notice */
4560         if (!notice) return (FALSE);
4561
4562         if (disturb_state) disturb(FALSE, FALSE);
4563         p_ptr->update |= (PU_BONUS);
4564         handle_stuff();
4565         return (TRUE);
4566 }
4567
4568
4569 /*
4570  * Choose a warrior-mage elemental attack. -LM-
4571  */
4572 bool choose_ele_attack(void)
4573 {
4574         int num;
4575
4576         char choice;
4577
4578         if (!has_melee_weapon(INVEN_RARM) && !has_melee_weapon(INVEN_LARM))
4579         {
4580                 msg_format(_("武器を持たないと魔法剣は使えない。", "You cannot use temporary branding with no weapon."));
4581                 return FALSE;
4582         }
4583         screen_save();
4584
4585         num = (p_ptr->lev - 20) / 5;
4586         c_prt(TERM_RED,    _("        a) 焼棄", "        a) Fire Brand"), 2, 14);
4587
4588         if (num >= 2) 
4589                 c_prt(TERM_L_WHITE,_("        b) 凍結", "        b) Cold Brand"), 3, 14);
4590         else 
4591                 prt("", 3, 14);
4592         
4593         if (num >= 3) 
4594                 c_prt(TERM_GREEN,  _("        c) 毒殺", "        c) Poison Brand"), 4, 14);
4595         else 
4596                 prt("", 4, 14);
4597
4598         if (num >= 4) 
4599                 c_prt(TERM_L_DARK, _("        d) 溶解", "        d) Acid Brand"), 5, 14);
4600         else 
4601                 prt("", 5, 14);
4602
4603         if (num >= 5) 
4604                 c_prt(TERM_BLUE,   _("        e) 電撃", "        e) Elec Brand"), 6, 14);
4605         else 
4606                 prt("", 6, 14);
4607
4608         prt("", 7, 14);
4609         prt("", 8, 14);
4610         prt("", 9, 14);
4611
4612         prt("", 1, 0);
4613         prt(_("        どの元素攻撃をしますか?", "        Choose a temporary elemental brand "), 1, 14);
4614
4615         choice = inkey();
4616
4617         if ((choice == 'a') || (choice == 'A')) 
4618                 set_ele_attack(ATTACK_FIRE, p_ptr->lev/2 + randint1(p_ptr->lev/2));
4619         else if (((choice == 'b') || (choice == 'B')) && (num >= 2))
4620                 set_ele_attack(ATTACK_COLD, p_ptr->lev/2 + randint1(p_ptr->lev/2));
4621         else if (((choice == 'c') || (choice == 'C')) && (num >= 3))
4622                 set_ele_attack(ATTACK_POIS, p_ptr->lev/2 + randint1(p_ptr->lev/2));
4623         else if (((choice == 'd') || (choice == 'D')) && (num >= 4))
4624                 set_ele_attack(ATTACK_ACID, p_ptr->lev/2 + randint1(p_ptr->lev/2));
4625         else if (((choice == 'e') || (choice == 'E')) && (num >= 5))
4626                 set_ele_attack(ATTACK_ELEC, p_ptr->lev/2 + randint1(p_ptr->lev/2));
4627         else
4628         {
4629                 msg_print(_("魔法剣を使うのをやめた。", "You cancel the temporary branding."));
4630                 screen_load();
4631                 return FALSE;
4632         }
4633         screen_load();
4634         return TRUE;
4635 }
4636
4637
4638 /*
4639  * Choose a elemental immune. -LM-
4640  */
4641 bool choose_ele_immune(TIME_EFFECT immune_turn)
4642 {
4643         char choice;
4644         screen_save();
4645
4646         c_prt(TERM_RED,    _("        a) 火炎", "        a) Immune Fire"), 2, 14);
4647         c_prt(TERM_L_WHITE,_("        b) 冷気", "        b) Immune Cold"), 3, 14);
4648         c_prt(TERM_L_DARK, _("        c) 酸", "        c) Immune Acid"), 4, 14);
4649         c_prt(TERM_BLUE,   _("        d) 電撃", "        d) Immune Elec"), 5, 14);
4650
4651         prt("", 6, 14);
4652         prt("", 7, 14);
4653         prt("", 8, 14);
4654         prt("", 9, 14);
4655
4656         prt("", 1, 0);
4657         prt(_("        どの元素の免疫をつけますか?", "        Choose a temporary elemental immune "), 1, 14);
4658
4659         choice = inkey();
4660
4661         if ((choice == 'a') || (choice == 'A')) 
4662                 set_ele_immune(DEFENSE_FIRE, immune_turn);
4663         else if ((choice == 'b') || (choice == 'B'))
4664                 set_ele_immune(DEFENSE_COLD, immune_turn);
4665         else if ((choice == 'c') || (choice == 'C'))
4666                 set_ele_immune(DEFENSE_ACID, immune_turn);
4667         else if ((choice == 'd') || (choice == 'D'))
4668                 set_ele_immune(DEFENSE_ELEC, immune_turn);
4669         else
4670         {
4671                 msg_print(_("免疫を付けるのをやめた。", "You cancel the temporary immune."));
4672                 screen_load();
4673                 return FALSE;
4674         }
4675         screen_load();
4676         return TRUE;
4677 }
4678