OSDN Git Service

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