OSDN Git Service

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