OSDN Git Service

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