OSDN Git Service

[Refactor] #38997 do_cmd_go_up() に player_type * 引数を対象として追加.
[hengband/hengband.git] / src / core.c
1 /*!
2     @file dungeon.c
3     @brief Angbandゲームエンジン / Angband game engine
4     @date 2013/12/31
5     @author
6     Copyright (c) 1989 James E. Wilson, Robert A. Koeneke\n
7     This software may be copied and distributed for educational, research, and\n
8     not for profit purposes provided that this copyright and statement are\n
9     included in all such copies.\n
10     2013 Deskull rearranged comment for Doxygen.
11  */
12
13 #include "angband.h"
14 #include "util.h"
15 #include "core.h"
16 #include "inet.h"
17 #include "term.h"
18
19 #include "creature.h"
20
21 #include "birth.h"
22 #include "bldg.h"
23 #include "cmd-activate.h"
24 #include "cmd-dump.h"
25 #include "cmd-eat.h"
26 #include "cmd-hissatsu.h"
27 #include "cmd-item.h"
28 #include "cmd-magiceat.h"
29 #include "cmd-mane.h"
30 #include "cmd-quaff.h"
31 #include "cmd-read.h"
32 #include "cmd-smith.h"
33 #include "cmd-usestaff.h"
34 #include "cmd-zaprod.h"
35 #include "cmd-zapwand.h"
36 #include "cmd-pet.h"
37 #include "cmd-basic.h"
38 #include "racial.h"
39 #include "snipe.h"
40 #include "dungeon.h"
41 #include "feature.h"
42 #include "floor.h"
43 #include "floor-events.h"
44 #include "floor-town.h"
45 #include "grid.h"
46 #include "object-ego.h"
47 #include "object-curse.h"
48 #include "object-flavor.h"
49 #include "store.h"
50 #include "spells.h"
51 #include "spells-summon.h"
52 #include "spells-object.h"
53 #include "spells-status.h"
54 #include "spells-floor.h"
55 #include "monster-spell.h"
56 #include "mind.h"
57 #include "world.h"
58 #include "mutation.h"
59 #include "quest.h"
60 #include "artifact.h"
61 #include "avatar.h"
62 #include "player-move.h"
63 #include "player-status.h"
64 #include "player-class.h"
65 #include "player-race.h"
66 #include "player-personality.h"
67 #include "player-damage.h"
68 #include "player-effects.h"
69 #include "cmd-spell.h"
70 #include "realm-hex.h"
71 #include "objectkind.h"
72 #include "object-hook.h"
73 #include "wild.h"
74 #include "monster-process.h"
75 #include "monster-status.h"
76 #include "monsterrace-hook.h"
77 #include "floor-save.h"
78 #include "feature.h"
79 #include "player-skill.h"
80
81 #include "view-mainwindow.h"
82 #include "dungeon-file.h"
83 #include "files.h"
84 #include "scores.h"
85 #include "autopick.h"
86 #include "save.h"
87 #include "realm.h"
88 #include "realm-song.h"
89 #include "targeting.h"
90
91  /*!
92   * コピーライト情報 /
93   * Hack -- Link a copyright message into the executable
94   */
95 const concptr copyright[5] =
96 {
97         "Copyright (c) 1989 James E. Wilson, Robert A. Keoneke",
98         "",
99         "This software may be copied and distributed for educational, research,",
100         "and not for profit purposes provided that this copyright and statement",
101         "are included in all such copies."
102 };
103
104 bool can_save = FALSE;        /* Game can be saved */
105
106 COMMAND_CODE now_message;
107
108 bool repair_monsters;   /* Hack -- optimize detect monsters */
109 bool repair_objects;    /* Hack -- optimize detect objects */
110
111 concptr ANGBAND_SYS = "xxx"; //!< Hack -- The special Angband "System Suffix" This variable is used to choose an appropriate "pref-xxx" file
112
113 #ifdef JP
114 concptr ANGBAND_KEYBOARD = "JAPAN"; //!< Hack -- The special Angband "Keyboard Suffix" This variable is used to choose an appropriate macro-trigger definition
115 #else
116 concptr ANGBAND_KEYBOARD = "0";
117 #endif
118
119 concptr ANGBAND_GRAF = "ascii"; //!< Hack -- The special Angband "Graphics Suffix" This variable is used to choose an appropriate "graf-xxx" file
120
121 static bool load = TRUE; /*!<ロード処理中の分岐フラグ*/
122 static int wild_regen = 20; /*!<広域マップ移動時の自然回復処理カウンタ(広域マップ1マス毎に20回処理を基本とする)*/
123
124 /*
125  * Flags for initialization
126  */
127 int init_flags;
128
129 /*!
130  * @brief 擬似鑑定を実際に行い判定を反映する
131  * @param slot 擬似鑑定を行うプレイヤーの所持リストID
132  * @param heavy 重度の擬似鑑定を行うならばTRUE
133  * @return なし
134  */
135 static void sense_inventory_aux(INVENTORY_IDX slot, bool heavy)
136 {
137         byte feel;
138         object_type *o_ptr = &p_ptr->inventory_list[slot];
139         GAME_TEXT o_name[MAX_NLEN];
140
141         /* We know about it already, do not tell us again */
142         if (o_ptr->ident & (IDENT_SENSE))return;
143
144         /* It is fully known, no information needed */
145         if (object_is_known(o_ptr)) return;
146
147         /* Check for a feeling */
148         feel = (heavy ? value_check_aux1(o_ptr) : value_check_aux2(o_ptr));
149
150         /* Skip non-feelings */
151         if (!feel) return;
152
153         /* Bad luck */
154         if ((p_ptr->muta3 & MUT3_BAD_LUCK) && !randint0(13))
155         {
156                 switch (feel)
157                 {
158                         case FEEL_TERRIBLE:
159                         {
160                                 feel = FEEL_SPECIAL;
161                                 break;
162                         }
163                         case FEEL_WORTHLESS:
164                         {
165                                 feel = FEEL_EXCELLENT;
166                                 break;
167                         }
168                         case FEEL_CURSED:
169                         {
170                                 if (heavy)
171                                         feel = randint0(3) ? FEEL_GOOD : FEEL_AVERAGE;
172                                 else
173                                         feel = FEEL_UNCURSED;
174                                 break;
175                         }
176                         case FEEL_AVERAGE:
177                         {
178                                 feel = randint0(2) ? FEEL_CURSED : FEEL_GOOD;
179                                 break;
180                         }
181                         case FEEL_GOOD:
182                         {
183                                 if (heavy)
184                                         feel = randint0(3) ? FEEL_CURSED : FEEL_AVERAGE;
185                                 else
186                                         feel = FEEL_CURSED;
187                                 break;
188                         }
189                         case FEEL_EXCELLENT:
190                         {
191                                 feel = FEEL_WORTHLESS;
192                                 break;
193                         }
194                         case FEEL_SPECIAL:
195                         {
196                                 feel = FEEL_TERRIBLE;
197                                 break;
198                         }
199                 }
200         }
201
202         /* Stop everything */
203         if (disturb_minor) disturb(FALSE, FALSE);
204
205         /* Get an object description */
206         object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
207
208         /* Message (equipment) */
209         if (slot >= INVEN_RARM)
210         {
211 #ifdef JP
212                 msg_format("%s%s(%c)は%sという感じがする...",
213                         describe_use(slot),o_name, index_to_label(slot),game_inscriptions[feel]);
214 #else
215                 msg_format("You feel the %s (%c) you are %s %s %s...",
216                            o_name, index_to_label(slot), describe_use(slot),
217                            ((o_ptr->number == 1) ? "is" : "are"),
218                                    game_inscriptions[feel]);
219 #endif
220
221         }
222
223         /* Message (p_ptr->inventory_list) */
224         else
225         {
226 #ifdef JP
227                 msg_format("ザックの中の%s(%c)は%sという感じがする...",
228                         o_name, index_to_label(slot),game_inscriptions[feel]);
229 #else
230                 msg_format("You feel the %s (%c) in your pack %s %s...",
231                            o_name, index_to_label(slot),
232                            ((o_ptr->number == 1) ? "is" : "are"),
233                                    game_inscriptions[feel]);
234 #endif
235
236         }
237
238         o_ptr->ident |= (IDENT_SENSE);
239
240         /* Set the "inscription" */
241         o_ptr->feeling = feel;
242
243         /* Auto-inscription/destroy */
244         autopick_alter_item(slot, destroy_feeling);
245         p_ptr->update |= (PU_COMBINE | PU_REORDER);
246
247         p_ptr->window |= (PW_INVEN | PW_EQUIP);
248 }
249
250
251
252 /*!
253  * @brief 1プレイヤーターン毎に武器、防具の擬似鑑定が行われるかを判定する。
254  * @return なし
255  * @details
256  * Sense the p_ptr->inventory_list\n
257  *\n
258  *   Class 0 = Warrior --> fast and heavy\n
259  *   Class 1 = Mage    --> slow and light\n
260  *   Class 2 = Priest  --> fast but light\n
261  *   Class 3 = Rogue   --> okay and heavy\n
262  *   Class 4 = Ranger  --> slow but heavy  (changed!)\n
263  *   Class 5 = Paladin --> slow but heavy\n
264  */
265 static void sense_inventory1(void)
266 {
267         INVENTORY_IDX i;
268         PLAYER_LEVEL plev = p_ptr->lev;
269         bool heavy = FALSE;
270         object_type *o_ptr;
271
272
273         /*** Check for "sensing" ***/
274
275         /* No sensing when confused */
276         if (p_ptr->confused) return;
277
278         /* Analyze the class */
279         switch (p_ptr->pclass)
280         {
281                 case CLASS_WARRIOR:
282                 case CLASS_ARCHER:
283                 case CLASS_SAMURAI:
284                 case CLASS_CAVALRY:
285                 {
286                         /* Good sensing */
287                         if (0 != randint0(9000L / (plev * plev + 40))) return;
288
289                         /* Heavy sensing */
290                         heavy = TRUE;
291
292                         break;
293                 }
294
295                 case CLASS_SMITH:
296                 {
297                         /* Good sensing */
298                         if (0 != randint0(6000L / (plev * plev + 50))) return;
299
300                         /* Heavy sensing */
301                         heavy = TRUE;
302
303                         break;
304                 }
305
306                 case CLASS_MAGE:
307                 case CLASS_HIGH_MAGE:
308                 case CLASS_SORCERER:
309                 case CLASS_MAGIC_EATER:
310                 {
311                         /* Very bad (light) sensing */
312                         if (0 != randint0(240000L / (plev + 5))) return;
313
314                         break;
315                 }
316
317                 case CLASS_PRIEST:
318                 case CLASS_BARD:
319                 {
320                         /* Good (light) sensing */
321                         if (0 != randint0(10000L / (plev * plev + 40))) return;
322
323                         break;
324                 }
325
326                 case CLASS_ROGUE:
327                 case CLASS_NINJA:
328                 {
329                         /* Okay sensing */
330                         if (0 != randint0(20000L / (plev * plev + 40))) return;
331
332                         /* Heavy sensing */
333                         heavy = TRUE;
334
335                         break;
336                 }
337
338                 case CLASS_RANGER:
339                 {
340                         /* Bad sensing */
341                         if (0 != randint0(95000L / (plev * plev + 40))) return;
342
343                         /* Changed! */
344                         heavy = TRUE;
345
346                         break;
347                 }
348
349                 case CLASS_PALADIN:
350                 case CLASS_SNIPER:
351                 {
352                         /* Bad sensing */
353                         if (0 != randint0(77777L / (plev * plev + 40))) return;
354
355                         /* Heavy sensing */
356                         heavy = TRUE;
357
358                         break;
359                 }
360
361                 case CLASS_WARRIOR_MAGE:
362                 case CLASS_RED_MAGE:
363                 {
364                         /* Bad sensing */
365                         if (0 != randint0(75000L / (plev * plev + 40))) return;
366
367                         break;
368                 }
369
370                 case CLASS_MINDCRAFTER:
371                 case CLASS_IMITATOR:
372                 case CLASS_BLUE_MAGE:
373                 case CLASS_MIRROR_MASTER:
374                 {
375                         /* Bad sensing */
376                         if (0 != randint0(55000L / (plev * plev + 40))) return;
377
378                         break;
379                 }
380
381                 case CLASS_CHAOS_WARRIOR:
382                 {
383                         /* Bad sensing */
384                         if (0 != randint0(80000L / (plev * plev + 40))) return;
385
386                         /* Changed! */
387                         heavy = TRUE;
388
389                         break;
390                 }
391
392                 case CLASS_MONK:
393                 case CLASS_FORCETRAINER:
394                 {
395                         /* Okay sensing */
396                         if (0 != randint0(20000L / (plev * plev + 40))) return;
397
398                         break;
399                 }
400
401                 case CLASS_TOURIST:
402                 {
403                         /* Good sensing */
404                         if (0 != randint0(20000L / ((plev+50)*(plev+50)))) return;
405
406                         /* Heavy sensing */
407                         heavy = TRUE;
408
409                         break;
410                 }
411
412                 case CLASS_BEASTMASTER:
413                 {
414                         /* Bad sensing */
415                         if (0 != randint0(65000L / (plev * plev + 40))) return;
416
417                         break;
418                 }
419                 case CLASS_BERSERKER:
420                 {
421                         /* Heavy sensing */
422                         heavy = TRUE;
423
424                         break;
425                 }
426         }
427
428         if (compare_virtue(V_KNOWLEDGE, 100, VIRTUE_LARGE)) heavy = TRUE;
429
430         /*** Sense everything ***/
431
432         /* Check everything */
433         for (i = 0; i < INVEN_TOTAL; i++)
434         {
435                 bool okay = FALSE;
436
437                 o_ptr = &p_ptr->inventory_list[i];
438
439                 /* Skip empty slots */
440                 if (!o_ptr->k_idx) continue;
441
442                 /* Valid "tval" codes */
443                 switch (o_ptr->tval)
444                 {
445                         case TV_SHOT:
446                         case TV_ARROW:
447                         case TV_BOLT:
448                         case TV_BOW:
449                         case TV_DIGGING:
450                         case TV_HAFTED:
451                         case TV_POLEARM:
452                         case TV_SWORD:
453                         case TV_BOOTS:
454                         case TV_GLOVES:
455                         case TV_HELM:
456                         case TV_CROWN:
457                         case TV_SHIELD:
458                         case TV_CLOAK:
459                         case TV_SOFT_ARMOR:
460                         case TV_HARD_ARMOR:
461                         case TV_DRAG_ARMOR:
462                         case TV_CARD:
463                         {
464                                 okay = TRUE;
465                                 break;
466                         }
467                 }
468
469                 /* Skip non-sense machines */
470                 if (!okay) continue;
471
472                 /* Occasional failure on p_ptr->inventory_list items */
473                 if ((i < INVEN_RARM) && (0 != randint0(5))) continue;
474
475                 /* Good luck */
476                 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && !randint0(13))
477                 {
478                         heavy = TRUE;
479                 }
480
481                 sense_inventory_aux(i, heavy);
482         }
483 }
484
485 /*!
486  * @brief 1プレイヤーターン毎に武器、防具以外の擬似鑑定が行われるかを判定する。
487  * @return なし
488  */
489 static void sense_inventory2(void)
490 {
491         INVENTORY_IDX i;
492         PLAYER_LEVEL plev = p_ptr->lev;
493         object_type *o_ptr;
494
495
496         /*** Check for "sensing" ***/
497
498         /* No sensing when confused */
499         if (p_ptr->confused) return;
500
501         /* Analyze the class */
502         switch (p_ptr->pclass)
503         {
504                 case CLASS_WARRIOR:
505                 case CLASS_ARCHER:
506                 case CLASS_SAMURAI:
507                 case CLASS_CAVALRY:
508                 case CLASS_BERSERKER:
509                 case CLASS_SNIPER:
510                 {
511                         return;
512                 }
513
514                 case CLASS_SMITH:
515                 case CLASS_PALADIN:
516                 case CLASS_CHAOS_WARRIOR:
517                 case CLASS_IMITATOR:
518                 case CLASS_BEASTMASTER:
519                 case CLASS_NINJA:
520                 {
521                         /* Very bad (light) sensing */
522                         if (0 != randint0(240000L / (plev + 5))) return;
523
524                         break;
525                 }
526
527                 case CLASS_RANGER:
528                 case CLASS_WARRIOR_MAGE:
529                 case CLASS_RED_MAGE:
530                 case CLASS_MONK:
531                 {
532                         /* Bad sensing */
533                         if (0 != randint0(95000L / (plev * plev + 40))) return;
534
535                         break;
536                 }
537
538                 case CLASS_PRIEST:
539                 case CLASS_BARD:
540                 case CLASS_ROGUE:
541                 case CLASS_FORCETRAINER:
542                 case CLASS_MINDCRAFTER:
543                 {
544                         /* Good sensing */
545                         if (0 != randint0(20000L / (plev * plev + 40))) return;
546
547                         break;
548                 }
549
550                 case CLASS_MAGE:
551                 case CLASS_HIGH_MAGE:
552                 case CLASS_SORCERER:
553                 case CLASS_MAGIC_EATER:
554                 case CLASS_MIRROR_MASTER:
555                 case CLASS_BLUE_MAGE:
556                 {
557                         /* Good sensing */
558                         if (0 != randint0(9000L / (plev * plev + 40))) return;
559
560                         break;
561                 }
562
563                 case CLASS_TOURIST:
564                 {
565                         /* Good sensing */
566                         if (0 != randint0(20000L / ((plev+50)*(plev+50)))) return;
567
568                         break;
569                 }
570         }
571
572         /*** Sense everything ***/
573
574         /* Check everything */
575         for (i = 0; i < INVEN_TOTAL; i++)
576         {
577                 bool okay = FALSE;
578
579                 o_ptr = &p_ptr->inventory_list[i];
580
581                 /* Skip empty slots */
582                 if (!o_ptr->k_idx) continue;
583
584                 /* Valid "tval" codes */
585                 switch (o_ptr->tval)
586                 {
587                         case TV_RING:
588                         case TV_AMULET:
589                         case TV_LITE:
590                         case TV_FIGURINE:
591                         {
592                                 okay = TRUE;
593                                 break;
594                         }
595                 }
596
597                 /* Skip non-sense machines */
598                 if (!okay) continue;
599
600                 /* Occasional failure on p_ptr->inventory_list items */
601                 if ((i < INVEN_RARM) && (0 != randint0(5))) continue;
602
603                 sense_inventory_aux(i, TRUE);
604         }
605 }
606
607 /*!
608  * @brief パターン終点到達時のテレポート処理を行う
609  * @return なし
610  */
611 static void pattern_teleport(void)
612 {
613         DEPTH min_level = 0;
614         DEPTH max_level = 99;
615
616         /* Ask for level */
617         if (get_check(_("他の階にテレポートしますか?", "Teleport level? ")))
618         {
619                 char ppp[80];
620                 char tmp_val[160];
621
622                 /* Only downward in ironman mode */
623                 if (ironman_downward)
624                         min_level = current_floor_ptr->dun_level;
625
626                 /* Maximum level */
627                 if (p_ptr->dungeon_idx == DUNGEON_ANGBAND)
628                 {
629                         if (current_floor_ptr->dun_level > 100)
630                                 max_level = MAX_DEPTH - 1;
631                         else if (current_floor_ptr->dun_level == 100)
632                                 max_level = 100;
633                 }
634                 else
635                 {
636                         max_level = d_info[p_ptr->dungeon_idx].maxdepth;
637                         min_level = d_info[p_ptr->dungeon_idx].mindepth;
638                 }
639
640                 /* Prompt */
641                 sprintf(ppp, _("テレポート先:(%d-%d)", "Teleport to level (%d-%d): "), (int)min_level, (int)max_level);
642
643                 /* Default */
644                 sprintf(tmp_val, "%d", (int)current_floor_ptr->dun_level);
645
646                 /* Ask for a level */
647                 if (!get_string(ppp, tmp_val, 10)) return;
648
649                 /* Extract request */
650                 command_arg = (COMMAND_ARG)atoi(tmp_val);
651         }
652         else if (get_check(_("通常テレポート?", "Normal teleport? ")))
653         {
654                 teleport_player(200, 0L);
655                 return;
656         }
657         else
658         {
659                 return;
660         }
661         if (command_arg < min_level) command_arg = (COMMAND_ARG)min_level;
662         if (command_arg > max_level) command_arg = (COMMAND_ARG)max_level;
663
664         /* Accept request */
665         msg_format(_("%d 階にテレポートしました。", "You teleport to dungeon level %d."), command_arg);
666
667         if (autosave_l) do_cmd_save_game(TRUE);
668
669         /* Change level */
670         current_floor_ptr->dun_level = command_arg;
671
672         leave_quest_check();
673
674         if (record_stair) do_cmd_write_nikki(NIKKI_PAT_TELE, 0, NULL);
675
676         p_ptr->inside_quest = 0;
677         free_turn(p_ptr);
678
679         /*
680          * Clear all saved floors
681          * and create a first saved floor
682          */
683         prepare_change_floor_mode(CFM_FIRST_FLOOR);
684         p_ptr->leaving = TRUE;
685 }
686
687 /*!
688  * @brief 各種パターン地形上の特別な処理 / Returns TRUE if we are on the Pattern...
689  * @return 実際にパターン地形上にプレイヤーが居た場合はTRUEを返す。
690  */
691 static bool pattern_effect(void)
692 {
693         int pattern_type;
694
695         if (!pattern_tile(p_ptr->y, p_ptr->x)) return FALSE;
696
697         if ((PRACE_IS_(p_ptr, RACE_AMBERITE)) &&
698             (p_ptr->cut > 0) && one_in_(10))
699         {
700                 wreck_the_pattern();
701         }
702
703         pattern_type = f_info[current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].feat].subtype;
704
705         switch (pattern_type)
706         {
707         case PATTERN_TILE_END:
708                 (void)set_image(0);
709                 (void)restore_all_status();
710                 (void)restore_level();
711                 (void)cure_critical_wounds(1000);
712
713                 cave_set_feat(p_ptr->y, p_ptr->x, feat_pattern_old);
714                 msg_print(_("「パターン」のこの部分は他の部分より強力でないようだ。", "This section of the Pattern looks less powerful."));
715
716                 /*
717                  * We could make the healing effect of the
718                  * Pattern center one-time only to avoid various kinds
719                  * of abuse, like luring the win monster into fighting you
720                  * in the middle of the pattern...
721                  */
722                 break;
723
724         case PATTERN_TILE_OLD:
725                 /* No effect */
726                 break;
727
728         case PATTERN_TILE_TELEPORT:
729                 pattern_teleport();
730                 break;
731
732         case PATTERN_TILE_WRECKED:
733                 if (!IS_INVULN())
734                         take_hit(DAMAGE_NOESCAPE, 200, _("壊れた「パターン」を歩いたダメージ", "walking the corrupted Pattern"), -1);
735                 break;
736
737         default:
738                 if (PRACE_IS_(p_ptr, RACE_AMBERITE) && !one_in_(2))
739                         return TRUE;
740                 else if (!IS_INVULN())
741                         take_hit(DAMAGE_NOESCAPE, damroll(1, 3), _("「パターン」を歩いたダメージ", "walking the Pattern"), -1);
742                 break;
743         }
744
745         return TRUE;
746 }
747
748
749 /*!
750  * @brief プレイヤーのHP自然回復処理 / Regenerate hit points -RAK-
751  * @param percent 回復比率
752  * @return なし
753  */
754 static void regenhp(int percent)
755 {
756         HIT_POINT new_chp;
757         u32b new_chp_frac;
758         HIT_POINT old_chp;
759
760         if (p_ptr->special_defense & KATA_KOUKIJIN) return;
761         if (p_ptr->action == ACTION_HAYAGAKE) return;
762
763         /* Save the old hitpoints */
764         old_chp = p_ptr->chp;
765
766         /*
767          * Extract the new hitpoints
768          *
769          * 'percent' is the Regen factor in unit (1/2^16)
770          */
771         new_chp = 0;
772         new_chp_frac = (p_ptr->mhp * percent + PY_REGEN_HPBASE);
773
774         /* Convert the unit (1/2^16) to (1/2^32) */
775         s64b_LSHIFT(new_chp, new_chp_frac, 16);
776
777         /* Regenerating */
778         s64b_add(&(p_ptr->chp), &(p_ptr->chp_frac), new_chp, new_chp_frac);
779
780
781         /* Fully healed */
782         if (0 < s64b_cmp(p_ptr->chp, p_ptr->chp_frac, p_ptr->mhp, 0))
783         {
784                 p_ptr->chp = p_ptr->mhp;
785                 p_ptr->chp_frac = 0;
786         }
787
788         /* Notice changes */
789         if (old_chp != p_ptr->chp)
790         {
791                 p_ptr->redraw |= (PR_HP);
792                 p_ptr->window |= (PW_PLAYER);
793                 wild_regen = 20;
794         }
795 }
796
797
798 /*!
799  * @brief プレイヤーのMP自然回復処理(regen_magic()のサブセット) / Regenerate mana points
800  * @param upkeep_factor ペット維持によるMPコスト量
801  * @param regen_amount 回復量
802  * @return なし
803  */
804 static void regenmana(MANA_POINT upkeep_factor, MANA_POINT regen_amount)
805 {
806         MANA_POINT old_csp = p_ptr->csp;
807         s32b regen_rate = regen_amount * 100 - upkeep_factor * PY_REGEN_NORMAL;
808
809         /*
810          * Excess mana will decay 32 times faster than normal
811          * regeneration rate.
812          */
813         if (p_ptr->csp > p_ptr->msp)
814         {
815                 /* PY_REGEN_NORMAL is the Regen factor in unit (1/2^16) */
816                 s32b decay = 0;
817                 u32b decay_frac = (p_ptr->msp * 32 * PY_REGEN_NORMAL + PY_REGEN_MNBASE);
818
819                 /* Convert the unit (1/2^16) to (1/2^32) */
820                 s64b_LSHIFT(decay, decay_frac, 16);
821
822                 /* Decay */
823                 s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), decay, decay_frac);
824
825                 /* Stop decaying */
826                 if (p_ptr->csp < p_ptr->msp)
827                 {
828                         p_ptr->csp = p_ptr->msp;
829                         p_ptr->csp_frac = 0;
830                 }
831         }
832
833         /* Regenerating mana (unless the player has excess mana) */
834         else if (regen_rate > 0)
835         {
836                 /* (percent/100) is the Regen factor in unit (1/2^16) */
837                 MANA_POINT new_mana = 0;
838                 u32b new_mana_frac = (p_ptr->msp * regen_rate / 100 + PY_REGEN_MNBASE);
839
840                 /* Convert the unit (1/2^16) to (1/2^32) */
841                 s64b_LSHIFT(new_mana, new_mana_frac, 16);
842
843                 /* Regenerate */
844                 s64b_add(&(p_ptr->csp), &(p_ptr->csp_frac), new_mana, new_mana_frac);
845
846                 /* Must set frac to zero even if equal */
847                 if (p_ptr->csp >= p_ptr->msp)
848                 {
849                         p_ptr->csp = p_ptr->msp;
850                         p_ptr->csp_frac = 0;
851                 }
852         }
853
854
855         /* Reduce mana (even when the player has excess mana) */
856         if (regen_rate < 0)
857         {
858                 /* PY_REGEN_NORMAL is the Regen factor in unit (1/2^16) */
859                 s32b reduce_mana = 0;
860                 u32b reduce_mana_frac = (p_ptr->msp * (-1) * regen_rate / 100 + PY_REGEN_MNBASE);
861
862                 /* Convert the unit (1/2^16) to (1/2^32) */
863                 s64b_LSHIFT(reduce_mana, reduce_mana_frac, 16);
864
865                 /* Reduce mana */
866                 s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), reduce_mana, reduce_mana_frac);
867
868                 /* Check overflow */
869                 if (p_ptr->csp < 0)
870                 {
871                         p_ptr->csp = 0;
872                         p_ptr->csp_frac = 0;
873                 }
874         }
875
876         if (old_csp != p_ptr->csp)
877         {
878                 p_ptr->redraw |= (PR_MANA);
879                 p_ptr->window |= (PW_PLAYER);
880                 p_ptr->window |= (PW_SPELL);
881                 wild_regen = 20;
882         }
883 }
884
885 /*!
886  * @brief プレイヤーのMP自然回復処理 / Regenerate magic regen_amount: PY_REGEN_NORMAL * 2 (if resting) * 2 (if having regenarate)
887  * @param regen_amount 回復量
888  * @return なし
889  */
890 static void regenmagic(int regen_amount)
891 {
892         MANA_POINT new_mana;
893         int i;
894         int dev = 30;
895         int mult = (dev + adj_mag_mana[p_ptr->stat_ind[A_INT]]); /* x1 to x2 speed bonus for recharging */
896
897         for (i = 0; i < EATER_EXT*2; i++)
898         {
899                 if (!p_ptr->magic_num2[i]) continue;
900                 if (p_ptr->magic_num1[i] == ((long)p_ptr->magic_num2[i] << 16)) continue;
901
902                 /* Increase remaining charge number like float value */
903                 new_mana = (regen_amount * mult * ((long)p_ptr->magic_num2[i] + 13)) / (dev * 8);
904                 p_ptr->magic_num1[i] += new_mana;
905
906                 /* Check maximum charge */
907                 if (p_ptr->magic_num1[i] > (p_ptr->magic_num2[i] << 16))
908                 {
909                         p_ptr->magic_num1[i] = ((long)p_ptr->magic_num2[i] << 16);
910                 }
911                 wild_regen = 20;
912         }
913         for (i = EATER_EXT*2; i < EATER_EXT*3; i++)
914         {
915                 if (!p_ptr->magic_num1[i]) continue;
916                 if (!p_ptr->magic_num2[i]) continue;
917
918                 /* Decrease remaining period for charging */
919                 new_mana = (regen_amount * mult * ((long)p_ptr->magic_num2[i] + 10) * EATER_ROD_CHARGE) 
920                                         / (dev * 16 * PY_REGEN_NORMAL); 
921                 p_ptr->magic_num1[i] -= new_mana;
922
923                 /* Check minimum remaining period for charging */
924                 if (p_ptr->magic_num1[i] < 0) p_ptr->magic_num1[i] = 0;
925                 wild_regen = 20;
926         }
927 }
928
929
930 /*!
931  * @brief 100ゲームターン毎のモンスターのHP自然回復処理 / Regenerate the monsters (once per 100 game turns)
932  * @return なし
933  * @note Should probably be done during monster turns.
934  */
935 static void regen_monsters(void)
936 {
937         int i, frac;
938
939
940         /* Regenerate everyone */
941         for (i = 1; i < current_floor_ptr->m_max; i++)
942         {
943                 /* Check the i'th monster */
944                 monster_type *m_ptr = &current_floor_ptr->m_list[i];
945                 monster_race *r_ptr = &r_info[m_ptr->r_idx];
946
947                 if (!monster_is_valid(m_ptr)) continue;
948
949                 /* Allow regeneration (if needed) */
950                 if (m_ptr->hp < m_ptr->maxhp)
951                 {
952                         /* Hack -- Base regeneration */
953                         frac = m_ptr->maxhp / 100;
954
955                         /* Hack -- Minimal regeneration rate */
956                         if (!frac) if (one_in_(2)) frac = 1;
957
958                         /* Hack -- Some monsters regenerate quickly */
959                         if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2;
960
961                         /* Hack -- Regenerate */
962                         m_ptr->hp += frac;
963
964                         /* Do not over-regenerate */
965                         if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
966
967                         /* Redraw (later) if needed */
968                         if (p_ptr->health_who == i) p_ptr->redraw |= (PR_HEALTH);
969                         if (p_ptr->riding == i) p_ptr->redraw |= (PR_UHEALTH);
970                 }
971         }
972 }
973
974
975 /*!
976  * @brief 30ゲームターン毎のボール中モンスターのHP自然回復処理 / Regenerate the captured monsters (once per 30 game turns)
977  * @return なし
978  * @note Should probably be done during monster turns.
979  */
980 static void regen_captured_monsters(void)
981 {
982         int i, frac;
983         bool heal = FALSE;
984
985         /* Regenerate everyone */
986         for (i = 0; i < INVEN_TOTAL; i++)
987         {
988                 monster_race *r_ptr;
989                 object_type *o_ptr = &p_ptr->inventory_list[i];
990
991                 if (!o_ptr->k_idx) continue;
992                 if (o_ptr->tval != TV_CAPTURE) continue;
993                 if (!o_ptr->pval) continue;
994
995                 heal = TRUE;
996
997                 r_ptr = &r_info[o_ptr->pval];
998
999                 /* Allow regeneration (if needed) */
1000                 if (o_ptr->xtra4 < o_ptr->xtra5)
1001                 {
1002                         /* Hack -- Base regeneration */
1003                         frac = o_ptr->xtra5 / 100;
1004
1005                         /* Hack -- Minimal regeneration rate */
1006                         if (!frac) if (one_in_(2)) frac = 1;
1007
1008                         /* Hack -- Some monsters regenerate quickly */
1009                         if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2;
1010
1011                         /* Hack -- Regenerate */
1012                         o_ptr->xtra4 += (XTRA16)frac;
1013
1014                         /* Do not over-regenerate */
1015                         if (o_ptr->xtra4 > o_ptr->xtra5) o_ptr->xtra4 = o_ptr->xtra5;
1016                 }
1017         }
1018
1019         if (heal)
1020         {
1021                 /* Combine pack */
1022                 p_ptr->update |= (PU_COMBINE);
1023                 p_ptr->window |= (PW_INVEN);
1024                 p_ptr->window |= (PW_EQUIP);
1025                 wild_regen = 20;
1026         }
1027 }
1028
1029 /*!
1030  * @brief 寿命つき光源の警告メッセージ処理
1031  * @param o_ptr 現在光源として使っているオブジェクトの構造体参照ポインタ
1032  * @return なし
1033  */
1034 static void notice_lite_change(object_type *o_ptr)
1035 {
1036         /* Hack -- notice interesting fuel steps */
1037         if ((o_ptr->xtra4 < 100) || (!(o_ptr->xtra4 % 100)))
1038         {
1039                 p_ptr->window |= (PW_EQUIP);
1040         }
1041
1042         /* Hack -- Special treatment when blind */
1043         if (p_ptr->blind)
1044         {
1045                 /* Hack -- save some light for later */
1046                 if (o_ptr->xtra4 == 0) o_ptr->xtra4++;
1047         }
1048
1049         /* The light is now out */
1050         else if (o_ptr->xtra4 == 0)
1051         {
1052                 disturb(FALSE, TRUE);
1053                 msg_print(_("明かりが消えてしまった!", "Your light has gone out!"));
1054
1055                 /* Recalculate torch radius */
1056                 p_ptr->update |= (PU_TORCH);
1057
1058                 /* Some ego light lose its effects without fuel */
1059                 p_ptr->update |= (PU_BONUS);
1060         }
1061
1062         /* The light is getting dim */
1063         else if (o_ptr->name2 == EGO_LITE_LONG)
1064         {
1065                 if ((o_ptr->xtra4 < 50) && (!(o_ptr->xtra4 % 5))
1066                     && (current_world_ptr->game_turn % (TURNS_PER_TICK*2)))
1067                 {
1068                         if (disturb_minor) disturb(FALSE, TRUE);
1069                         msg_print(_("明かりが微かになってきている。", "Your light is growing faint."));
1070                 }
1071         }
1072
1073         /* The light is getting dim */
1074         else if ((o_ptr->xtra4 < 100) && (!(o_ptr->xtra4 % 10)))
1075         {
1076                 if (disturb_minor) disturb(FALSE, TRUE);
1077                         msg_print(_("明かりが微かになってきている。", "Your light is growing faint."));
1078         }
1079 }
1080
1081
1082 /*!
1083  * @brief !!を刻んだ魔道具の時間経過による再充填を知らせる処理 / If player has inscribed the object with "!!", let him know when it's recharged. -LM-
1084  * @param o_ptr 対象オブジェクトの構造体参照ポインタ
1085  * @return なし
1086  */
1087 static void recharged_notice(object_type *o_ptr)
1088 {
1089         GAME_TEXT o_name[MAX_NLEN];
1090
1091         concptr s;
1092
1093         /* No inscription */
1094         if (!o_ptr->inscription) return;
1095
1096         /* Find a '!' */
1097         s = my_strchr(quark_str(o_ptr->inscription), '!');
1098
1099         /* Process notification request. */
1100         while (s)
1101         {
1102                 /* Find another '!' */
1103                 if (s[1] == '!')
1104                 {
1105                         /* Describe (briefly) */
1106                         object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1107
1108                         /* Notify the player */
1109 #ifdef JP
1110                         msg_format("%sは再充填された。", o_name);
1111 #else
1112                         if (o_ptr->number > 1)
1113                                 msg_format("Your %s are recharged.", o_name);
1114                         else
1115                                 msg_format("Your %s is recharged.", o_name);
1116 #endif
1117
1118                         disturb(FALSE, FALSE);
1119
1120                         /* Done. */
1121                         return;
1122                 }
1123
1124                 /* Keep looking for '!'s */
1125                 s = my_strchr(s + 1, '!');
1126         }
1127 }
1128
1129 /*!
1130  * @brief プレイヤーの歌に関する継続処理
1131  * @return なし
1132  */
1133 static void check_music(void)
1134 {
1135         const magic_type *s_ptr;
1136         int spell;
1137         MANA_POINT need_mana;
1138         u32b need_mana_frac;
1139
1140         /* Music singed by player */
1141         if (p_ptr->pclass != CLASS_BARD) return;
1142         if (!SINGING_SONG_EFFECT(p_ptr) && !INTERUPTING_SONG_EFFECT(p_ptr)) return;
1143
1144         if (p_ptr->anti_magic)
1145         {
1146                 stop_singing(p_ptr);
1147                 return;
1148         }
1149
1150         spell = SINGING_SONG_ID(p_ptr);
1151         s_ptr = &technic_info[REALM_MUSIC - MIN_TECHNIC][spell];
1152
1153         need_mana = mod_need_mana(s_ptr->smana, spell, REALM_MUSIC);
1154         need_mana_frac = 0;
1155
1156         /* Divide by 2 */
1157         s64b_RSHIFT(need_mana, need_mana_frac, 1);
1158
1159         if (s64b_cmp(p_ptr->csp, p_ptr->csp_frac, need_mana, need_mana_frac) < 0)
1160         {
1161                 stop_singing(p_ptr);
1162                 return;
1163         }
1164         else
1165         {
1166                 s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), need_mana, need_mana_frac);
1167
1168                 p_ptr->redraw |= PR_MANA;
1169                 if (INTERUPTING_SONG_EFFECT(p_ptr))
1170                 {
1171                         SINGING_SONG_EFFECT(p_ptr) = INTERUPTING_SONG_EFFECT(p_ptr);
1172                         INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
1173                         msg_print(_("歌を再開した。", "You restart singing."));
1174                         p_ptr->action = ACTION_SING;
1175                         p_ptr->update |= (PU_BONUS | PU_HP | PU_MONSTERS);
1176                         p_ptr->redraw |= (PR_MAP | PR_STATUS | PR_STATE);
1177                         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
1178                 }
1179         }
1180         if (p_ptr->spell_exp[spell] < SPELL_EXP_BEGINNER)
1181                 p_ptr->spell_exp[spell] += 5;
1182         else if(p_ptr->spell_exp[spell] < SPELL_EXP_SKILLED)
1183         { if (one_in_(2) && (current_floor_ptr->dun_level > 4) && ((current_floor_ptr->dun_level + 10) > p_ptr->lev)) p_ptr->spell_exp[spell] += 1; }
1184         else if(p_ptr->spell_exp[spell] < SPELL_EXP_EXPERT)
1185         { if (one_in_(5) && ((current_floor_ptr->dun_level + 5) > p_ptr->lev) && ((current_floor_ptr->dun_level + 5) > s_ptr->slevel)) p_ptr->spell_exp[spell] += 1; }
1186         else if(p_ptr->spell_exp[spell] < SPELL_EXP_MASTER)
1187         { if (one_in_(5) && ((current_floor_ptr->dun_level + 5) > p_ptr->lev) && (current_floor_ptr->dun_level > s_ptr->slevel)) p_ptr->spell_exp[spell] += 1; }
1188
1189         /* Do any effects of continual song */
1190         do_spell(REALM_MUSIC, spell, SPELL_CONT);
1191 }
1192
1193 /*!
1194  * @brief 現在呪いを保持している装備品を一つランダムに探し出す / Choose one of items that have cursed flag
1195  * @param flag 探し出したい呪いフラグ配列
1196  * @return 該当の呪いが一つでもあった場合にランダムに選ばれた装備品のオブジェクト構造体参照ポインタを返す。\n
1197  * 呪いがない場合NULLを返す。
1198  */
1199 static object_type *choose_cursed_obj_name(BIT_FLAGS flag)
1200 {
1201         int i;
1202         int choices[INVEN_TOTAL-INVEN_RARM];
1203         int number = 0;
1204
1205         /* Paranoia -- Player has no warning-item */
1206         if (!(p_ptr->cursed & flag)) return NULL;
1207
1208         /* Search Inventry */
1209         for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
1210         {
1211                 object_type *o_ptr = &p_ptr->inventory_list[i];
1212
1213                 if (o_ptr->curse_flags & flag)
1214                 {
1215                         choices[number] = i;
1216                         number++;
1217                 }
1218                 else if ((flag == TRC_ADD_L_CURSE) || 
1219                                         (flag == TRC_ADD_H_CURSE) || 
1220                                         (flag == TRC_DRAIN_HP) || 
1221                                         (flag == TRC_DRAIN_MANA) || 
1222                                         (flag == TRC_CALL_ANIMAL) || 
1223                                         (flag == TRC_CALL_DEMON) || 
1224                                         (flag == TRC_CALL_DRAGON) || 
1225                                         (flag == TRC_CALL_UNDEAD) || 
1226                                         (flag == TRC_COWARDICE) || 
1227                                         (flag == TRC_LOW_MELEE) || 
1228                                         (flag == TRC_LOW_AC) || 
1229                                         (flag == TRC_LOW_MAGIC) || 
1230                                         (flag == TRC_FAST_DIGEST) || 
1231                                         (flag == TRC_SLOW_REGEN) )
1232                 {
1233                         u32b cf = 0L;
1234                         BIT_FLAGS flgs[TR_FLAG_SIZE];
1235                         object_flags(o_ptr, flgs);
1236                         switch (flag)
1237                         {
1238                           case TRC_ADD_L_CURSE  : cf = TR_ADD_L_CURSE; break;
1239                           case TRC_ADD_H_CURSE  : cf = TR_ADD_H_CURSE; break;
1240                           case TRC_DRAIN_HP             : cf = TR_DRAIN_HP; break;
1241                           case TRC_DRAIN_MANA   : cf = TR_DRAIN_MANA; break;
1242                           case TRC_CALL_ANIMAL  : cf = TR_CALL_ANIMAL; break;
1243                           case TRC_CALL_DEMON   : cf = TR_CALL_DEMON; break;
1244                           case TRC_CALL_DRAGON  : cf = TR_CALL_DRAGON; break;
1245                           case TRC_CALL_UNDEAD  : cf = TR_CALL_UNDEAD; break;
1246                           case TRC_COWARDICE    : cf = TR_COWARDICE; break;
1247                           case TRC_LOW_MELEE    : cf = TR_LOW_MELEE; break;
1248                           case TRC_LOW_AC               : cf = TR_LOW_AC; break;
1249                           case TRC_LOW_MAGIC    : cf = TR_LOW_MAGIC; break;
1250                           case TRC_FAST_DIGEST  : cf = TR_FAST_DIGEST; break;
1251                           case TRC_SLOW_REGEN   : cf = TR_SLOW_REGEN; break;
1252                           default                               : break;
1253                         }
1254                         if (have_flag(flgs, cf))
1255                         {
1256                                 choices[number] = i;
1257                                 number++;
1258                         }
1259                 }
1260         }
1261
1262         /* Choice one of them */
1263         return (&p_ptr->inventory_list[choices[randint0(number)]]);
1264 }
1265
1266 static void process_world_aux_digestion(void)
1267 {
1268         if (!p_ptr->inside_battle)
1269         {
1270                 /* Digest quickly when gorged */
1271                 if (p_ptr->food >= PY_FOOD_MAX)
1272                 {
1273                         /* Digest a lot of food */
1274                         (void)set_food(p_ptr->food - 100);
1275                 }
1276
1277                 /* Digest normally -- Every 50 game turns */
1278                 else if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 5)))
1279                 {
1280                         /* Basic digestion rate based on speed */
1281                         int digestion = SPEED_TO_ENERGY(p_ptr->pspeed);
1282
1283                         /* Regeneration takes more food */
1284                         if (p_ptr->regenerate)
1285                                 digestion += 20;
1286                         if (p_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1287                                 digestion += 20;
1288                         if (p_ptr->cursed & TRC_FAST_DIGEST)
1289                                 digestion += 30;
1290
1291                         /* Slow digestion takes less food */
1292                         if (p_ptr->slow_digest)
1293                                 digestion -= 5;
1294
1295                         /* Minimal digestion */
1296                         if (digestion < 1) digestion = 1;
1297                         /* Maximal digestion */
1298                         if (digestion > 100) digestion = 100;
1299
1300                         /* Digest some food */
1301                         (void)set_food(p_ptr->food - digestion);
1302                 }
1303
1304
1305                 /* Getting Faint */
1306                 if ((p_ptr->food < PY_FOOD_FAINT))
1307                 {
1308                         /* Faint occasionally */
1309                         if (!p_ptr->paralyzed && (randint0(100) < 10))
1310                         {
1311                                 msg_print(_("あまりにも空腹で気絶してしまった。", "You faint from the lack of food."));
1312                                 disturb(TRUE, TRUE);
1313
1314                                 /* Hack -- faint (bypass free action) */
1315                                 (void)set_paralyzed(p_ptr->paralyzed + 1 + randint0(5));
1316                         }
1317
1318                         /* Starve to death (slowly) */
1319                         if (p_ptr->food < PY_FOOD_STARVE)
1320                         {
1321                                 /* Calculate damage */
1322                                 HIT_POINT dam = (PY_FOOD_STARVE - p_ptr->food) / 10;
1323
1324                                 if (!IS_INVULN()) take_hit(DAMAGE_LOSELIFE, dam, _("空腹", "starvation"), -1);
1325                         }
1326                 }
1327         }
1328 }
1329
1330 /*!
1331  * @brief 10ゲームターンが進行するごとにプレイヤーのHPとMPの増減処理を行う。
1332  *  / Handle timed damage and regeneration every 10 game turns
1333  * @return なし
1334  */
1335 static void process_world_aux_hp_and_sp(void)
1336 {
1337         feature_type *f_ptr = &f_info[current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].feat];
1338         bool cave_no_regen = FALSE;
1339         int upkeep_factor = 0;
1340
1341         /* Default regeneration */
1342         int regen_amount = PY_REGEN_NORMAL;
1343
1344
1345         /*** Damage over Time ***/
1346
1347         /* Take damage from poison */
1348         if (p_ptr->poisoned && !IS_INVULN())
1349         {
1350                 take_hit(DAMAGE_NOESCAPE, 1, _("毒", "poison"), -1);
1351         }
1352
1353         /* Take damage from cuts */
1354         if (p_ptr->cut && !IS_INVULN())
1355         {
1356                 HIT_POINT dam;
1357
1358                 /* Mortal wound or Deep Gash */
1359                 if (p_ptr->cut > 1000)
1360                 {
1361                         dam = 200;
1362                 }
1363
1364                 else if (p_ptr->cut > 200)
1365                 {
1366                         dam = 80;
1367                 }
1368
1369                 /* Severe cut */
1370                 else if (p_ptr->cut > 100)
1371                 {
1372                         dam = 32;
1373                 }
1374
1375                 else if (p_ptr->cut > 50)
1376                 {
1377                         dam = 16;
1378                 }
1379
1380                 else if (p_ptr->cut > 25)
1381                 {
1382                         dam = 7;
1383                 }
1384
1385                 else if (p_ptr->cut > 10)
1386                 {
1387                         dam = 3;
1388                 }
1389
1390                 /* Other cuts */
1391                 else
1392                 {
1393                         dam = 1;
1394                 }
1395
1396                 take_hit(DAMAGE_NOESCAPE, dam, _("致命傷", "a fatal wound"), -1);
1397         }
1398
1399         /* (Vampires) Take damage from sunlight */
1400         if (PRACE_IS_(p_ptr, RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE))
1401         {
1402                 if (!current_floor_ptr->dun_level && !p_ptr->resist_lite && !IS_INVULN() && is_daytime())
1403                 {
1404                         if ((current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
1405                         {
1406                                 msg_print(_("日光があなたのアンデッドの肉体を焼き焦がした!", "The sun's rays scorch your undead flesh!"));
1407                                 take_hit(DAMAGE_NOESCAPE, 1, _("日光", "sunlight"), -1);
1408                                 cave_no_regen = TRUE;
1409                         }
1410                 }
1411
1412                 if (p_ptr->inventory_list[INVEN_LITE].tval && (p_ptr->inventory_list[INVEN_LITE].name2 != EGO_LITE_DARKNESS) &&
1413                     !p_ptr->resist_lite)
1414                 {
1415                         object_type * o_ptr = &p_ptr->inventory_list[INVEN_LITE];
1416                         GAME_TEXT o_name [MAX_NLEN];
1417                         char ouch [MAX_NLEN+40];
1418
1419                         /* Get an object description */
1420                         object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1421                         msg_format(_("%sがあなたのアンデッドの肉体を焼き焦がした!", "The %s scorches your undead flesh!"), o_name);
1422
1423                         cave_no_regen = TRUE;
1424
1425                         /* Get an object description */
1426                         object_desc(o_name, o_ptr, OD_NAME_ONLY);
1427                         sprintf(ouch, _("%sを装備したダメージ", "wielding %s"), o_name);
1428
1429                         if (!IS_INVULN()) take_hit(DAMAGE_NOESCAPE, 1, ouch, -1);
1430                 }
1431         }
1432
1433         if (have_flag(f_ptr->flags, FF_LAVA) && !IS_INVULN() && !p_ptr->immune_fire)
1434         {
1435                 int damage = 0;
1436
1437                 if (have_flag(f_ptr->flags, FF_DEEP))
1438                 {
1439                         damage = 6000 + randint0(4000);
1440                 }
1441                 else if (!p_ptr->levitation)
1442                 {
1443                         damage = 3000 + randint0(2000);
1444                 }
1445
1446                 if (damage)
1447                 {
1448                         if(PRACE_IS_(p_ptr, RACE_ENT)) damage += damage / 3;
1449                         if(p_ptr->resist_fire) damage = damage / 3;
1450                         if(IS_OPPOSE_FIRE()) damage = damage / 3;
1451                         if(p_ptr->levitation) damage = damage / 5;
1452
1453                         damage = damage / 100 + (randint0(100) < (damage % 100));
1454
1455                         if (p_ptr->levitation)
1456                         {
1457                                 msg_print(_("熱で火傷した!", "The heat burns you!"));
1458                                 take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"), 
1459                                                                 f_name + f_info[get_feat_mimic(&current_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1);
1460                         }
1461                         else
1462                         {
1463                                 concptr name = f_name + f_info[get_feat_mimic(&current_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name;
1464                                 msg_format(_("%sで火傷した!", "The %s burns you!"), name);
1465                                 take_hit(DAMAGE_NOESCAPE, damage, name, -1);
1466                         }
1467
1468                         cave_no_regen = TRUE;
1469                 }
1470         }
1471
1472         if (have_flag(f_ptr->flags, FF_COLD_PUDDLE) && !IS_INVULN() && !p_ptr->immune_cold)
1473         {
1474                 int damage = 0;
1475
1476                 if (have_flag(f_ptr->flags, FF_DEEP))
1477                 {
1478                         damage = 6000 + randint0(4000);
1479                 }
1480                 else if (!p_ptr->levitation)
1481                 {
1482                         damage = 3000 + randint0(2000);
1483                 }
1484
1485                 if (damage)
1486                 {
1487                         if (p_ptr->resist_cold) damage = damage / 3;
1488                         if (IS_OPPOSE_COLD()) damage = damage / 3;
1489                         if (p_ptr->levitation) damage = damage / 5;
1490
1491                         damage = damage / 100 + (randint0(100) < (damage % 100));
1492
1493                         if (p_ptr->levitation)
1494                         {
1495                                 msg_print(_("冷気に覆われた!", "The cold engulfs you!"));
1496                                 take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1497                                         f_name + f_info[get_feat_mimic(&current_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1);
1498                         }
1499                         else
1500                         {
1501                                 concptr name = f_name + f_info[get_feat_mimic(&current_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name;
1502                                 msg_format(_("%sに凍えた!", "The %s frostbites you!"), name);
1503                                 take_hit(DAMAGE_NOESCAPE, damage, name, -1);
1504                         }
1505
1506                         cave_no_regen = TRUE;
1507                 }
1508         }
1509
1510         if (have_flag(f_ptr->flags, FF_ELEC_PUDDLE) && !IS_INVULN() && !p_ptr->immune_elec)
1511         {
1512                 int damage = 0;
1513
1514                 if (have_flag(f_ptr->flags, FF_DEEP))
1515                 {
1516                         damage = 6000 + randint0(4000);
1517                 }
1518                 else if (!p_ptr->levitation)
1519                 {
1520                         damage = 3000 + randint0(2000);
1521                 }
1522
1523                 if (damage)
1524                 {
1525                         if (p_ptr->resist_elec) damage = damage / 3;
1526                         if (IS_OPPOSE_ELEC()) damage = damage / 3;
1527                         if (p_ptr->levitation) damage = damage / 5;
1528
1529                         damage = damage / 100 + (randint0(100) < (damage % 100));
1530
1531                         if (p_ptr->levitation)
1532                         {
1533                                 msg_print(_("電撃を受けた!", "The electric shocks you!"));
1534                                 take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1535                                         f_name + f_info[get_feat_mimic(&current_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1);
1536                         }
1537                         else
1538                         {
1539                                 concptr name = f_name + f_info[get_feat_mimic(&current_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name;
1540                                 msg_format(_("%sに感電した!", "The %s shocks you!"), name);
1541                                 take_hit(DAMAGE_NOESCAPE, damage, name, -1);
1542                         }
1543
1544                         cave_no_regen = TRUE;
1545                 }
1546         }
1547
1548         if (have_flag(f_ptr->flags, FF_ACID_PUDDLE) && !IS_INVULN() && !p_ptr->immune_acid)
1549         {
1550                 int damage = 0;
1551
1552                 if (have_flag(f_ptr->flags, FF_DEEP))
1553                 {
1554                         damage = 6000 + randint0(4000);
1555                 }
1556                 else if (!p_ptr->levitation)
1557                 {
1558                         damage = 3000 + randint0(2000);
1559                 }
1560
1561                 if (damage)
1562                 {
1563                         if (p_ptr->resist_acid) damage = damage / 3;
1564                         if (IS_OPPOSE_ACID()) damage = damage / 3;
1565                         if (p_ptr->levitation) damage = damage / 5;
1566
1567                         damage = damage / 100 + (randint0(100) < (damage % 100));
1568
1569                         if (p_ptr->levitation)
1570                         {
1571                                 msg_print(_("酸が飛び散った!", "The acid melt you!"));
1572                                 take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1573                                         f_name + f_info[get_feat_mimic(&current_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1);
1574                         }
1575                         else
1576                         {
1577                                 concptr name = f_name + f_info[get_feat_mimic(&current_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name;
1578                                 msg_format(_("%sに溶かされた!", "The %s melts you!"), name);
1579                                 take_hit(DAMAGE_NOESCAPE, damage, name, -1);
1580                         }
1581
1582                         cave_no_regen = TRUE;
1583                 }
1584         }
1585
1586         if (have_flag(f_ptr->flags, FF_POISON_PUDDLE) && !IS_INVULN())
1587         {
1588                 int damage = 0;
1589
1590                 if (have_flag(f_ptr->flags, FF_DEEP))
1591                 {
1592                         damage = 6000 + randint0(4000);
1593                 }
1594                 else if (!p_ptr->levitation)
1595                 {
1596                         damage = 3000 + randint0(2000);
1597                 }
1598
1599                 if (damage)
1600                 {
1601                         if (p_ptr->resist_pois) damage = damage / 3;
1602                         if (IS_OPPOSE_POIS()) damage = damage / 3;
1603                         if (p_ptr->levitation) damage = damage / 5;
1604
1605                         damage = damage / 100 + (randint0(100) < (damage % 100));
1606
1607                         if (p_ptr->levitation)
1608                         {
1609                                 msg_print(_("毒気を吸い込んだ!", "The gas poisons you!"));
1610                                 take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1611                                         f_name + f_info[get_feat_mimic(&current_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1);
1612                                 if (p_ptr->resist_pois) (void)set_poisoned(p_ptr->poisoned + 1);
1613                         }
1614                         else
1615                         {
1616                                 concptr name = f_name + f_info[get_feat_mimic(&current_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name;
1617                                 msg_format(_("%sに毒された!", "The %s poisons you!"), name);
1618                                 take_hit(DAMAGE_NOESCAPE, damage, name, -1);
1619                                 if (p_ptr->resist_pois) (void)set_poisoned(p_ptr->poisoned + 3);
1620                         }
1621
1622                         cave_no_regen = TRUE;
1623                 }
1624         }
1625
1626         if (have_flag(f_ptr->flags, FF_WATER) && have_flag(f_ptr->flags, FF_DEEP) &&
1627             !p_ptr->levitation && !p_ptr->can_swim && !p_ptr->resist_water)
1628         {
1629                 if (p_ptr->total_weight > weight_limit())
1630                 {
1631                         msg_print(_("溺れている!", "You are drowning!"));
1632                         take_hit(DAMAGE_NOESCAPE, randint1(p_ptr->lev), _("溺れ", "drowning"), -1);
1633                         cave_no_regen = TRUE;
1634                 }
1635         }
1636
1637         if (p_ptr->riding)
1638         {
1639                 HIT_POINT damage;
1640                 if ((r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].flags2 & RF2_AURA_FIRE) && !p_ptr->immune_fire)
1641                 {
1642                         damage = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level / 2;
1643                         if (PRACE_IS_(p_ptr, RACE_ENT)) damage += damage / 3;
1644                         if (p_ptr->resist_fire) damage = damage / 3;
1645                         if (IS_OPPOSE_FIRE()) damage = damage / 3;
1646                         msg_print(_("熱い!", "It's hot!"));
1647                         take_hit(DAMAGE_NOESCAPE, damage, _("炎のオーラ", "Fire aura"), -1);
1648                 }
1649                 if ((r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].flags2 & RF2_AURA_ELEC) && !p_ptr->immune_elec)
1650                 {
1651                         damage = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level / 2;
1652                         if (PRACE_IS_(p_ptr, RACE_ANDROID)) damage += damage / 3;
1653                         if (p_ptr->resist_elec) damage = damage / 3;
1654                         if (IS_OPPOSE_ELEC()) damage = damage / 3;
1655                         msg_print(_("痛い!", "It hurts!"));
1656                         take_hit(DAMAGE_NOESCAPE, damage, _("電気のオーラ", "Elec aura"), -1);
1657                 }
1658                 if ((r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].flags3 & RF3_AURA_COLD) && !p_ptr->immune_cold)
1659                 {
1660                         damage = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level / 2;
1661                         if (p_ptr->resist_cold) damage = damage / 3;
1662                         if (IS_OPPOSE_COLD()) damage = damage / 3;
1663                         msg_print(_("冷たい!", "It's cold!"));
1664                         take_hit(DAMAGE_NOESCAPE, damage, _("冷気のオーラ", "Cold aura"), -1);
1665                 }
1666         }
1667
1668         /* Spectres -- take damage when moving through walls */
1669         /*
1670          * Added: ANYBODY takes damage if inside through walls
1671          * without wraith form -- NOTE: Spectres will never be
1672          * reduced below 0 hp by being inside a stone wall; others
1673          * WILL BE!
1674          */
1675         if (!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY))
1676         {
1677                 if (!IS_INVULN() && !p_ptr->wraith_form && !p_ptr->kabenuke && ((p_ptr->chp > (p_ptr->lev / 5)) || !p_ptr->pass_wall))
1678                 {
1679                         concptr dam_desc;
1680                         cave_no_regen = TRUE;
1681
1682                         if (p_ptr->pass_wall)
1683                         {
1684                                 msg_print(_("体の分子が分解した気がする!", "Your molecules feel disrupted!"));
1685                                 dam_desc = _("密度", "density");
1686                         }
1687                         else
1688                         {
1689                                 msg_print(_("崩れた岩に押し潰された!", "You are being crushed!"));
1690                                 dam_desc = _("硬い岩", "solid rock");
1691                         }
1692
1693                         take_hit(DAMAGE_NOESCAPE, 1 + (p_ptr->lev / 5), dam_desc, -1);
1694                 }
1695         }
1696
1697
1698         /*** handle regeneration ***/
1699
1700         /* Getting Weak */
1701         if (p_ptr->food < PY_FOOD_WEAK)
1702         {
1703                 /* Lower regeneration */
1704                 if (p_ptr->food < PY_FOOD_STARVE)
1705                 {
1706                         regen_amount = 0;
1707                 }
1708                 else if (p_ptr->food < PY_FOOD_FAINT)
1709                 {
1710                         regen_amount = PY_REGEN_FAINT;
1711                 }
1712                 else
1713                 {
1714                         regen_amount = PY_REGEN_WEAK;
1715                 }
1716         }
1717
1718         /* Are we walking the pattern? */
1719         if (pattern_effect())
1720         {
1721                 cave_no_regen = TRUE;
1722         }
1723         else
1724         {
1725                 /* Regeneration ability */
1726                 if (p_ptr->regenerate)
1727                 {
1728                         regen_amount = regen_amount * 2;
1729                 }
1730                 if (p_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1731                 {
1732                         regen_amount /= 2;
1733                 }
1734                 if (p_ptr->cursed & TRC_SLOW_REGEN)
1735                 {
1736                         regen_amount /= 5;
1737                 }
1738         }
1739
1740
1741         /* Searching or Resting */
1742         if ((p_ptr->action == ACTION_SEARCH) || (p_ptr->action == ACTION_REST))
1743         {
1744                 regen_amount = regen_amount * 2;
1745         }
1746
1747         upkeep_factor = calculate_upkeep();
1748
1749         /* No regeneration while special action */
1750         if ((p_ptr->action == ACTION_LEARN) ||
1751             (p_ptr->action == ACTION_HAYAGAKE) ||
1752             (p_ptr->special_defense & KATA_KOUKIJIN))
1753         {
1754                 upkeep_factor += 100;
1755         }
1756
1757         /* Regenerate the mana */
1758         regenmana(upkeep_factor, regen_amount);
1759
1760
1761         /* Recharge magic eater's power */
1762         if (p_ptr->pclass == CLASS_MAGIC_EATER)
1763         {
1764                 regenmagic(regen_amount);
1765         }
1766
1767         if ((p_ptr->csp == 0) && (p_ptr->csp_frac == 0))
1768         {
1769                 while (upkeep_factor > 100)
1770                 {
1771                         msg_print(_("こんなに多くのペットを制御できない!", "Too many pets to control at once!"));
1772                         msg_print(NULL);
1773                         do_cmd_pet_dismiss();
1774
1775                         upkeep_factor = calculate_upkeep();
1776
1777                         msg_format(_("維持MPは %d%%", "Upkeep: %d%% mana."), upkeep_factor);
1778                         msg_print(NULL);
1779                 }
1780         }
1781
1782         /* Poisoned or cut yields no healing */
1783         if (p_ptr->poisoned) regen_amount = 0;
1784         if (p_ptr->cut) regen_amount = 0;
1785
1786         /* Special floor -- Pattern, in a wall -- yields no healing */
1787         if (cave_no_regen) regen_amount = 0;
1788
1789         regen_amount = (regen_amount * p_ptr->mutant_regenerate_mod) / 100;
1790
1791         /* Regenerate Hit Points if needed */
1792         if ((p_ptr->chp < p_ptr->mhp) && !cave_no_regen)
1793         {
1794                 regenhp(regen_amount);
1795         }
1796 }
1797
1798 /*!
1799  * @brief 10ゲームターンが進行するごとに魔法効果の残りターンを減らしていく処理
1800  * / Handle timeout every 10 game turns
1801  * @return なし
1802  */
1803 static void process_world_aux_timeout(void)
1804 {
1805         const int dec_count = (easy_band ? 2 : 1);
1806
1807         /*** Timeout Various Things ***/
1808
1809         /* Mimic */
1810         if (p_ptr->tim_mimic)
1811         {
1812                 (void)set_mimic(p_ptr->tim_mimic - 1, p_ptr->mimic_form, TRUE);
1813         }
1814
1815         /* Hack -- Hallucinating */
1816         if (p_ptr->image)
1817         {
1818                 (void)set_image(p_ptr->image - dec_count);
1819         }
1820
1821         /* Blindness */
1822         if (p_ptr->blind)
1823         {
1824                 (void)set_blind(p_ptr->blind - dec_count);
1825         }
1826
1827         /* Times see-invisible */
1828         if (p_ptr->tim_invis)
1829         {
1830                 (void)set_tim_invis(p_ptr->tim_invis - 1, TRUE);
1831         }
1832
1833         if (p_ptr->suppress_multi_reward)
1834         {
1835                 p_ptr->suppress_multi_reward = FALSE;
1836         }
1837
1838         /* Timed esp */
1839         if (p_ptr->tim_esp)
1840         {
1841                 (void)set_tim_esp(p_ptr->tim_esp - 1, TRUE);
1842         }
1843
1844         /* Timed temporary elemental brands. -LM- */
1845         if (p_ptr->ele_attack)
1846         {
1847                 p_ptr->ele_attack--;
1848
1849                 /* Clear all temporary elemental brands. */
1850                 if (!p_ptr->ele_attack) set_ele_attack(0, 0);
1851         }
1852
1853         /* Timed temporary elemental immune. -LM- */
1854         if (p_ptr->ele_immune)
1855         {
1856                 p_ptr->ele_immune--;
1857
1858                 /* Clear all temporary elemental brands. */
1859                 if (!p_ptr->ele_immune) set_ele_immune(0, 0);
1860         }
1861
1862         /* Timed infra-vision */
1863         if (p_ptr->tim_infra)
1864         {
1865                 (void)set_tim_infra(p_ptr->tim_infra - 1, TRUE);
1866         }
1867
1868         /* Timed stealth */
1869         if (p_ptr->tim_stealth)
1870         {
1871                 (void)set_tim_stealth(p_ptr->tim_stealth - 1, TRUE);
1872         }
1873
1874         /* Timed levitation */
1875         if (p_ptr->tim_levitation)
1876         {
1877                 (void)set_tim_levitation(p_ptr->tim_levitation - 1, TRUE);
1878         }
1879
1880         /* Timed sh_touki */
1881         if (p_ptr->tim_sh_touki)
1882         {
1883                 (void)set_tim_sh_touki(p_ptr->tim_sh_touki - 1, TRUE);
1884         }
1885
1886         /* Timed sh_fire */
1887         if (p_ptr->tim_sh_fire)
1888         {
1889                 (void)set_tim_sh_fire(p_ptr->tim_sh_fire - 1, TRUE);
1890         }
1891
1892         /* Timed sh_holy */
1893         if (p_ptr->tim_sh_holy)
1894         {
1895                 (void)set_tim_sh_holy(p_ptr->tim_sh_holy - 1, TRUE);
1896         }
1897
1898         /* Timed eyeeye */
1899         if (p_ptr->tim_eyeeye)
1900         {
1901                 (void)set_tim_eyeeye(p_ptr->tim_eyeeye - 1, TRUE);
1902         }
1903
1904         /* Timed resist-magic */
1905         if (p_ptr->resist_magic)
1906         {
1907                 (void)set_resist_magic(p_ptr->resist_magic - 1, TRUE);
1908         }
1909
1910         /* Timed regeneration */
1911         if (p_ptr->tim_regen)
1912         {
1913                 (void)set_tim_regen(p_ptr->tim_regen - 1, TRUE);
1914         }
1915
1916         /* Timed resist nether */
1917         if (p_ptr->tim_res_nether)
1918         {
1919                 (void)set_tim_res_nether(p_ptr->tim_res_nether - 1, TRUE);
1920         }
1921
1922         /* Timed resist time */
1923         if (p_ptr->tim_res_time)
1924         {
1925                 (void)set_tim_res_time(p_ptr->tim_res_time - 1, TRUE);
1926         }
1927
1928         /* Timed reflect */
1929         if (p_ptr->tim_reflect)
1930         {
1931                 (void)set_tim_reflect(p_ptr->tim_reflect - 1, TRUE);
1932         }
1933
1934         /* Multi-shadow */
1935         if (p_ptr->multishadow)
1936         {
1937                 (void)set_multishadow(p_ptr->multishadow - 1, TRUE);
1938         }
1939
1940         /* Timed Robe of dust */
1941         if (p_ptr->dustrobe)
1942         {
1943                 (void)set_dustrobe(p_ptr->dustrobe - 1, TRUE);
1944         }
1945
1946         /* Timed infra-vision */
1947         if (p_ptr->kabenuke)
1948         {
1949                 (void)set_kabenuke(p_ptr->kabenuke - 1, TRUE);
1950         }
1951
1952         /* Paralysis */
1953         if (p_ptr->paralyzed)
1954         {
1955                 (void)set_paralyzed(p_ptr->paralyzed - dec_count);
1956         }
1957
1958         /* Confusion */
1959         if (p_ptr->confused)
1960         {
1961                 (void)set_confused(p_ptr->confused - dec_count);
1962         }
1963
1964         /* Afraid */
1965         if (p_ptr->afraid)
1966         {
1967                 (void)set_afraid(p_ptr->afraid - dec_count);
1968         }
1969
1970         /* Fast */
1971         if (p_ptr->fast)
1972         {
1973                 (void)set_fast(p_ptr->fast - 1, TRUE);
1974         }
1975
1976         /* Slow */
1977         if (p_ptr->slow)
1978         {
1979                 (void)set_slow(p_ptr->slow - dec_count, TRUE);
1980         }
1981
1982         /* Protection from evil */
1983         if (p_ptr->protevil)
1984         {
1985                 (void)set_protevil(p_ptr->protevil - 1, TRUE);
1986         }
1987
1988         /* Invulnerability */
1989         if (p_ptr->invuln)
1990         {
1991                 (void)set_invuln(p_ptr->invuln - 1, TRUE);
1992         }
1993
1994         /* Wraith form */
1995         if (p_ptr->wraith_form)
1996         {
1997                 (void)set_wraith_form(p_ptr->wraith_form - 1, TRUE);
1998         }
1999
2000         /* Heroism */
2001         if (p_ptr->hero)
2002         {
2003                 (void)set_hero(p_ptr->hero - 1, TRUE);
2004         }
2005
2006         /* Super Heroism */
2007         if (p_ptr->shero)
2008         {
2009                 (void)set_shero(p_ptr->shero - 1, TRUE);
2010         }
2011
2012         /* Blessed */
2013         if (p_ptr->blessed)
2014         {
2015                 (void)set_blessed(p_ptr->blessed - 1, TRUE);
2016         }
2017
2018         /* Shield */
2019         if (p_ptr->shield)
2020         {
2021                 (void)set_shield(p_ptr->shield - 1, TRUE);
2022         }
2023
2024         /* Tsubureru */
2025         if (p_ptr->tsubureru)
2026         {
2027                 (void)set_tsubureru(p_ptr->tsubureru - 1, TRUE);
2028         }
2029
2030         /* Magicdef */
2031         if (p_ptr->magicdef)
2032         {
2033                 (void)set_magicdef(p_ptr->magicdef - 1, TRUE);
2034         }
2035
2036         /* Tsuyoshi */
2037         if (p_ptr->tsuyoshi)
2038         {
2039                 (void)set_tsuyoshi(p_ptr->tsuyoshi - 1, TRUE);
2040         }
2041
2042         /* Oppose Acid */
2043         if (p_ptr->oppose_acid)
2044         {
2045                 (void)set_oppose_acid(p_ptr->oppose_acid - 1, TRUE);
2046         }
2047
2048         /* Oppose Lightning */
2049         if (p_ptr->oppose_elec)
2050         {
2051                 (void)set_oppose_elec(p_ptr->oppose_elec - 1, TRUE);
2052         }
2053
2054         /* Oppose Fire */
2055         if (p_ptr->oppose_fire)
2056         {
2057                 (void)set_oppose_fire(p_ptr->oppose_fire - 1, TRUE);
2058         }
2059
2060         /* Oppose Cold */
2061         if (p_ptr->oppose_cold)
2062         {
2063                 (void)set_oppose_cold(p_ptr->oppose_cold - 1, TRUE);
2064         }
2065
2066         /* Oppose Poison */
2067         if (p_ptr->oppose_pois)
2068         {
2069                 (void)set_oppose_pois(p_ptr->oppose_pois - 1, TRUE);
2070         }
2071
2072         if (p_ptr->ult_res)
2073         {
2074                 (void)set_ultimate_res(p_ptr->ult_res - 1, TRUE);
2075         }
2076
2077         /*** Poison and Stun and Cut ***/
2078
2079         /* Poison */
2080         if (p_ptr->poisoned)
2081         {
2082                 int adjust = adj_con_fix[p_ptr->stat_ind[A_CON]] + 1;
2083
2084                 /* Apply some healing */
2085                 (void)set_poisoned(p_ptr->poisoned - adjust);
2086         }
2087
2088         /* Stun */
2089         if (p_ptr->stun)
2090         {
2091                 int adjust = adj_con_fix[p_ptr->stat_ind[A_CON]] + 1;
2092
2093                 /* Apply some healing */
2094                 (void)set_stun(p_ptr->stun - adjust);
2095         }
2096
2097         /* Cut */
2098         if (p_ptr->cut)
2099         {
2100                 int adjust = adj_con_fix[p_ptr->stat_ind[A_CON]] + 1;
2101
2102                 /* Hack -- Truly "mortal" wound */
2103                 if (p_ptr->cut > 1000) adjust = 0;
2104
2105                 /* Apply some healing */
2106                 (void)set_cut(p_ptr->cut - adjust);
2107         }
2108 }
2109
2110
2111 /*!
2112  * @brief 10ゲームターンが進行する毎に光源の寿命を減らす処理
2113  * / Handle burning fuel every 10 game turns
2114  * @return なし
2115  */
2116 static void process_world_aux_light(void)
2117 {
2118         /* Check for light being wielded */
2119         object_type *o_ptr = &p_ptr->inventory_list[INVEN_LITE];
2120
2121         /* Burn some fuel in the current lite */
2122         if (o_ptr->tval == TV_LITE)
2123         {
2124                 /* Hack -- Use some fuel (except on artifacts) */
2125                 if (!(object_is_fixed_artifact(o_ptr) || o_ptr->sval == SV_LITE_FEANOR) && (o_ptr->xtra4 > 0))
2126                 {
2127                         /* Decrease life-span */
2128                         if (o_ptr->name2 == EGO_LITE_LONG)
2129                         {
2130                                 if (current_world_ptr->game_turn % (TURNS_PER_TICK*2)) o_ptr->xtra4--;
2131                         }
2132                         else o_ptr->xtra4--;
2133
2134                         /* Notice interesting fuel steps */
2135                         notice_lite_change(o_ptr);
2136                 }
2137         }
2138 }
2139
2140
2141 /*!
2142  * @brief 10ゲームターンが進行するごとに突然変異の発動判定を行う処理
2143  * / Handle mutation effects once every 10 game turns
2144  * @return なし
2145  */
2146 static void process_world_aux_mutation(void)
2147 {
2148         /* No mutation with effects */
2149         if (!p_ptr->muta2) return;
2150
2151         /* No effect on monster arena */
2152         if (p_ptr->inside_battle) return;
2153
2154         /* No effect on the global map */
2155         if (p_ptr->wild_mode) return;
2156
2157         if ((p_ptr->muta2 & MUT2_BERS_RAGE) && one_in_(3000))
2158         {
2159                 disturb(FALSE, TRUE);
2160                 msg_print(_("ウガァァア!", "RAAAAGHH!"));
2161                 msg_print(_("激怒の発作に襲われた!", "You feel a fit of rage coming over you!"));
2162                 (void)set_shero(10 + randint1(p_ptr->lev), FALSE);
2163                 (void)set_afraid(0);
2164         }
2165
2166         if ((p_ptr->muta2 & MUT2_COWARDICE) && (randint1(3000) == 13))
2167         {
2168                 if (!p_ptr->resist_fear)
2169                 {
2170                         disturb(FALSE, TRUE);
2171                         msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
2172                         set_afraid(p_ptr->afraid + 13 + randint1(26));
2173                 }
2174         }
2175
2176         if ((p_ptr->muta2 & MUT2_RTELEPORT) && (randint1(5000) == 88))
2177         {
2178                 if (!p_ptr->resist_nexus && !(p_ptr->muta1 & MUT1_VTELEPORT) && !p_ptr->anti_tele)
2179                 {
2180                         disturb(FALSE, TRUE);
2181                         msg_print(_("あなたの位置は突然ひじょうに不確定になった...", "Your position suddenly seems very uncertain..."));
2182                         msg_print(NULL);
2183                         teleport_player(40, TELEPORT_PASSIVE);
2184                 }
2185         }
2186
2187         if ((p_ptr->muta2 & MUT2_ALCOHOL) && (randint1(6400) == 321))
2188         {
2189                 if (!p_ptr->resist_conf && !p_ptr->resist_chaos)
2190                 {
2191                         disturb(FALSE, TRUE);
2192                         p_ptr->redraw |= PR_EXTRA;
2193                         msg_print(_("いひきがもーろーとひてきたきがふる...ヒック!", "You feel a SSSCHtupor cOmINg over yOu... *HIC*!"));
2194                 }
2195
2196                 if (!p_ptr->resist_conf)
2197                 {
2198                         (void)set_confused(p_ptr->confused + randint0(20) + 15);
2199                 }
2200
2201                 if (!p_ptr->resist_chaos)
2202                 {
2203                         if (one_in_(20))
2204                         {
2205                                 msg_print(NULL);
2206                                 if (one_in_(3)) lose_all_info();
2207                                 else wiz_dark();
2208                                 (void)teleport_player_aux(100, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE);
2209                                 wiz_dark();
2210                                 msg_print(_("あなたは見知らぬ場所で目が醒めた...頭が痛い。", "You wake up somewhere with a sore head..."));
2211                                 msg_print(_("何も覚えていない。どうやってここに来たかも分からない!", "You can't remember a thing, or how you got here!"));
2212                         }
2213                         else
2214                         {
2215                                 if (one_in_(3))
2216                                 {
2217                                         msg_print(_("き~れいなちょおちょらとんれいる~", "Thishcischs GooDSChtuff!"));
2218                                         (void)set_image(p_ptr->image + randint0(150) + 150);
2219                                 }
2220                         }
2221                 }
2222         }
2223
2224         if ((p_ptr->muta2 & MUT2_HALLU) && (randint1(6400) == 42))
2225         {
2226                 if (!p_ptr->resist_chaos)
2227                 {
2228                         disturb(FALSE, TRUE);
2229                         p_ptr->redraw |= PR_EXTRA;
2230                         (void)set_image(p_ptr->image + randint0(50) + 20);
2231                 }
2232         }
2233
2234         if ((p_ptr->muta2 & MUT2_FLATULENT) && (randint1(3000) == 13))
2235         {
2236                 disturb(FALSE, TRUE);
2237                 msg_print(_("ブゥーーッ!おっと。", "BRRAAAP! Oops."));
2238                 msg_print(NULL);
2239                 fire_ball(GF_POIS, 0, p_ptr->lev, 3);
2240         }
2241
2242         if ((p_ptr->muta2 & MUT2_PROD_MANA) &&
2243             !p_ptr->anti_magic && one_in_(9000))
2244         {
2245                 int dire = 0;
2246                 disturb(FALSE, TRUE);
2247                 msg_print(_("魔法のエネルギーが突然あなたの中に流れ込んできた!エネルギーを解放しなければならない!", 
2248                                                 "Magical energy flows through you! You must release it!"));
2249
2250                 flush();
2251                 msg_print(NULL);
2252                 (void)get_hack_dir(&dire);
2253                 fire_ball(GF_MANA, dire, p_ptr->lev * 2, 3);
2254         }
2255
2256         if ((p_ptr->muta2 & MUT2_ATT_DEMON) && !p_ptr->anti_magic && (randint1(6666) == 666))
2257         {
2258                 bool pet = one_in_(6);
2259                 BIT_FLAGS mode = PM_ALLOW_GROUP;
2260
2261                 if (pet) mode |= PM_FORCE_PET;
2262                 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2263
2264                 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_DEMON, mode))
2265                 {
2266                         msg_print(_("あなたはデーモンを引き寄せた!", "You have attracted a demon!"));
2267                         disturb(FALSE, TRUE);
2268                 }
2269         }
2270
2271         if ((p_ptr->muta2 & MUT2_SPEED_FLUX) && one_in_(6000))
2272         {
2273                 disturb(FALSE, TRUE);
2274                 if (one_in_(2))
2275                 {
2276                         msg_print(_("精力的でなくなった気がする。", "You feel less energetic."));
2277
2278                         if (p_ptr->fast > 0)
2279                         {
2280                                 set_fast(0, TRUE);
2281                         }
2282                         else
2283                         {
2284                                 set_slow(randint1(30) + 10, FALSE);
2285                         }
2286                 }
2287                 else
2288                 {
2289                         msg_print(_("精力的になった気がする。", "You feel more energetic."));
2290
2291                         if (p_ptr->slow > 0)
2292                         {
2293                                 set_slow(0, TRUE);
2294                         }
2295                         else
2296                         {
2297                                 set_fast(randint1(30) + 10, FALSE);
2298                         }
2299                 }
2300                 msg_print(NULL);
2301         }
2302         if ((p_ptr->muta2 & MUT2_BANISH_ALL) && one_in_(9000))
2303         {
2304                 disturb(FALSE, TRUE);
2305                 msg_print(_("突然ほとんど孤独になった気がする。", "You suddenly feel almost lonely."));
2306
2307                 banish_monsters(100);
2308                 if (!current_floor_ptr->dun_level && p_ptr->town_num)
2309                 {
2310                         int n;
2311
2312                         /* Pick a random shop (except home) */
2313                         do
2314                         {
2315                                 n = randint0(MAX_STORES);
2316                         }
2317                         while ((n == STORE_HOME) || (n == STORE_MUSEUM));
2318
2319                         msg_print(_("店の主人が丘に向かって走っている!", "You see one of the shopkeepers running for the hills!"));
2320                         store_shuffle(n);
2321                 }
2322                 msg_print(NULL);
2323         }
2324
2325         if ((p_ptr->muta2 & MUT2_EAT_LIGHT) && one_in_(3000))
2326         {
2327                 object_type *o_ptr;
2328
2329                 msg_print(_("影につつまれた。", "A shadow passes over you."));
2330                 msg_print(NULL);
2331
2332                 /* Absorb light from the current possition */
2333                 if ((current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
2334                 {
2335                         hp_player(10);
2336                 }
2337
2338                 o_ptr = &p_ptr->inventory_list[INVEN_LITE];
2339
2340                 /* Absorb some fuel in the current lite */
2341                 if (o_ptr->tval == TV_LITE)
2342                 {
2343                         /* Use some fuel (except on artifacts) */
2344                         if (!object_is_fixed_artifact(o_ptr) && (o_ptr->xtra4 > 0))
2345                         {
2346                                 /* Heal the player a bit */
2347                                 hp_player(o_ptr->xtra4 / 20);
2348
2349                                 /* Decrease life-span of lite */
2350                                 o_ptr->xtra4 /= 2;
2351                                 msg_print(_("光源からエネルギーを吸収した!", "You absorb energy from your light!"));
2352
2353                                 /* Notice interesting fuel steps */
2354                                 notice_lite_change(o_ptr);
2355                         }
2356                 }
2357
2358                 /*
2359                  * Unlite the area (radius 10) around player and
2360                  * do 50 points damage to every affected monster
2361                  */
2362                 unlite_area(50, 10);
2363         }
2364
2365         if ((p_ptr->muta2 & MUT2_ATT_ANIMAL) && !p_ptr->anti_magic && one_in_(7000))
2366         {
2367                 bool pet = one_in_(3);
2368                 BIT_FLAGS mode = PM_ALLOW_GROUP;
2369
2370                 if (pet) mode |= PM_FORCE_PET;
2371                 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2372
2373                 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_ANIMAL, mode))
2374                 {
2375                         msg_print(_("動物を引き寄せた!", "You have attracted an animal!"));
2376                         disturb(FALSE, TRUE);
2377                 }
2378         }
2379
2380         if ((p_ptr->muta2 & MUT2_RAW_CHAOS) && !p_ptr->anti_magic && one_in_(8000))
2381         {
2382                 disturb(FALSE, TRUE);
2383                 msg_print(_("周りの空間が歪んでいる気がする!", "You feel the world warping around you!"));
2384
2385                 msg_print(NULL);
2386                 fire_ball(GF_CHAOS, 0, p_ptr->lev, 8);
2387         }
2388         if ((p_ptr->muta2 & MUT2_NORMALITY) && one_in_(5000))
2389         {
2390                 if (!lose_mutation(0))
2391                         msg_print(_("奇妙なくらい普通になった気がする。", "You feel oddly normal."));
2392         }
2393         if ((p_ptr->muta2 & MUT2_WRAITH) && !p_ptr->anti_magic && one_in_(3000))
2394         {
2395                 disturb(FALSE, TRUE);
2396                 msg_print(_("非物質化した!", "You feel insubstantial!"));
2397
2398                 msg_print(NULL);
2399                 set_wraith_form(randint1(p_ptr->lev / 2) + (p_ptr->lev / 2), FALSE);
2400         }
2401         if ((p_ptr->muta2 & MUT2_POLY_WOUND) && one_in_(3000))
2402         {
2403                 do_poly_wounds();
2404         }
2405         if ((p_ptr->muta2 & MUT2_WASTING) && one_in_(3000))
2406         {
2407                 int which_stat = randint0(A_MAX);
2408                 int sustained = FALSE;
2409
2410                 switch (which_stat)
2411                 {
2412                 case A_STR:
2413                         if (p_ptr->sustain_str) sustained = TRUE;
2414                         break;
2415                 case A_INT:
2416                         if (p_ptr->sustain_int) sustained = TRUE;
2417                         break;
2418                 case A_WIS:
2419                         if (p_ptr->sustain_wis) sustained = TRUE;
2420                         break;
2421                 case A_DEX:
2422                         if (p_ptr->sustain_dex) sustained = TRUE;
2423                         break;
2424                 case A_CON:
2425                         if (p_ptr->sustain_con) sustained = TRUE;
2426                         break;
2427                 case A_CHR:
2428                         if (p_ptr->sustain_chr) sustained = TRUE;
2429                         break;
2430                 default:
2431                         msg_print(_("不正な状態!", "Invalid stat chosen!"));
2432                         sustained = TRUE;
2433                 }
2434
2435                 if (!sustained)
2436                 {
2437                         disturb(FALSE, TRUE);
2438                         msg_print(_("自分が衰弱していくのが分かる!", "You can feel yourself wasting away!"));
2439                         msg_print(NULL);
2440                         (void)dec_stat(which_stat, randint1(6) + 6, one_in_(3));
2441                 }
2442         }
2443         if ((p_ptr->muta2 & MUT2_ATT_DRAGON) && !p_ptr->anti_magic && one_in_(3000))
2444         {
2445                 bool pet = one_in_(5);
2446                 BIT_FLAGS mode = PM_ALLOW_GROUP;
2447
2448                 if (pet) mode |= PM_FORCE_PET;
2449                 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2450
2451                 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_DRAGON, mode))
2452                 {
2453                         msg_print(_("ドラゴンを引き寄せた!", "You have attracted a dragon!"));
2454                         disturb(FALSE, TRUE);
2455                 }
2456         }
2457         if ((p_ptr->muta2 & MUT2_WEIRD_MIND) && !p_ptr->anti_magic && one_in_(3000))
2458         {
2459                 if (p_ptr->tim_esp > 0)
2460                 {
2461                         msg_print(_("精神にもやがかかった!", "Your mind feels cloudy!"));
2462                         set_tim_esp(0, TRUE);
2463                 }
2464                 else
2465                 {
2466                         msg_print(_("精神が広がった!", "Your mind expands!"));
2467                         set_tim_esp(p_ptr->lev, FALSE);
2468                 }
2469         }
2470         if ((p_ptr->muta2 & MUT2_NAUSEA) && !p_ptr->slow_digest && one_in_(9000))
2471         {
2472                 disturb(FALSE, TRUE);
2473                 msg_print(_("胃が痙攣し、食事を失った!", "Your stomach roils, and you lose your lunch!"));
2474                 msg_print(NULL);
2475                 set_food(PY_FOOD_WEAK);
2476                 if (music_singing_any()) stop_singing(p_ptr);
2477                 if (hex_spelling_any()) stop_hex_spell_all();
2478         }
2479
2480         if ((p_ptr->muta2 & MUT2_WALK_SHAD) && !p_ptr->anti_magic && one_in_(12000) && !p_ptr->inside_arena)
2481         {
2482                 alter_reality();
2483         }
2484
2485         if ((p_ptr->muta2 & MUT2_WARNING) && one_in_(1000))
2486         {
2487                 int danger_amount = 0;
2488                 MONSTER_IDX monster;
2489
2490                 for (monster = 0; monster < current_floor_ptr->m_max; monster++)
2491                 {
2492                         monster_type *m_ptr = &current_floor_ptr->m_list[monster];
2493                         monster_race *r_ptr = &r_info[m_ptr->r_idx];
2494                         if (!monster_is_valid(m_ptr)) continue;
2495
2496                         if (r_ptr->level >= p_ptr->lev)
2497                         {
2498                                 danger_amount += r_ptr->level - p_ptr->lev + 1;
2499                         }
2500                 }
2501
2502                 if (danger_amount > 100)
2503                         msg_print(_("非常に恐ろしい気がする!", "You feel utterly terrified!"));
2504                 else if (danger_amount > 50)
2505                         msg_print(_("恐ろしい気がする!", "You feel terrified!"));
2506                 else if (danger_amount > 20)
2507                         msg_print(_("非常に心配な気がする!", "You feel very worried!"));
2508                 else if (danger_amount > 10)
2509                         msg_print(_("心配な気がする!", "You feel paranoid!"));
2510                 else if (danger_amount > 5)
2511                         msg_print(_("ほとんど安全な気がする。", "You feel almost safe."));
2512                 else
2513                         msg_print(_("寂しい気がする。", "You feel lonely."));
2514         }
2515
2516         if ((p_ptr->muta2 & MUT2_INVULN) && !p_ptr->anti_magic && one_in_(5000))
2517         {
2518                 disturb(FALSE, TRUE);
2519                 msg_print(_("無敵な気がする!", "You feel invincible!"));
2520                 msg_print(NULL);
2521                 (void)set_invuln(randint1(8) + 8, FALSE);
2522         }
2523
2524         if ((p_ptr->muta2 & MUT2_SP_TO_HP) && one_in_(2000))
2525         {
2526                 MANA_POINT wounds = (MANA_POINT)(p_ptr->mhp - p_ptr->chp);
2527
2528                 if (wounds > 0)
2529                 {
2530                         HIT_POINT healing = p_ptr->csp;
2531                         if (healing > wounds) healing = wounds;
2532
2533                         hp_player(healing);
2534                         p_ptr->csp -= healing;
2535                         p_ptr->redraw |= (PR_HP | PR_MANA);
2536                 }
2537         }
2538
2539         if ((p_ptr->muta2 & MUT2_HP_TO_SP) && !p_ptr->anti_magic && one_in_(4000))
2540         {
2541                 HIT_POINT wounds = (HIT_POINT)(p_ptr->msp - p_ptr->csp);
2542
2543                 if (wounds > 0)
2544                 {
2545                         HIT_POINT healing = p_ptr->chp;
2546                         if (healing > wounds) healing = wounds;
2547
2548                         p_ptr->csp += healing;
2549                         p_ptr->redraw |= (PR_HP | PR_MANA);
2550                         take_hit(DAMAGE_LOSELIFE, healing, _("頭に昇った血", "blood rushing to the head"), -1);
2551                 }
2552         }
2553
2554         if ((p_ptr->muta2 & MUT2_DISARM) && one_in_(10000))
2555         {
2556                 INVENTORY_IDX slot = 0;
2557                 object_type *o_ptr = NULL;
2558
2559                 disturb(FALSE, TRUE);
2560                 msg_print(_("足がもつれて転んだ!", "You trip over your own feet!"));
2561                 take_hit(DAMAGE_NOESCAPE, randint1(p_ptr->wt / 6), _("転倒", "tripping"), -1);
2562
2563                 msg_print(NULL);
2564                 if (has_melee_weapon(INVEN_RARM))
2565                 {
2566                         slot = INVEN_RARM;
2567                         o_ptr = &p_ptr->inventory_list[INVEN_RARM];
2568
2569                         if (has_melee_weapon(INVEN_LARM) && one_in_(2))
2570                         {
2571                                 o_ptr = &p_ptr->inventory_list[INVEN_LARM];
2572                                 slot = INVEN_LARM;
2573                         }
2574                 }
2575                 else if (has_melee_weapon(INVEN_LARM))
2576                 {
2577                         o_ptr = &p_ptr->inventory_list[INVEN_LARM];
2578                         slot = INVEN_LARM;
2579                 }
2580                 if (slot && !object_is_cursed(o_ptr))
2581                 {
2582                         msg_print(_("武器を落としてしまった!", "You drop your weapon!"));
2583                         inven_drop(slot, 1);
2584                 }
2585         }
2586
2587 }
2588
2589 /*!
2590  * @brief 10ゲームターンが進行するごとに装備効果の発動判定を行う処理
2591  * / Handle curse effects once every 10 game turns
2592  * @return なし
2593  */
2594 static void process_world_aux_curse(void)
2595 {
2596         if ((p_ptr->cursed & TRC_P_FLAG_MASK) && !p_ptr->inside_battle && !p_ptr->wild_mode)
2597         {
2598                 /*
2599                  * Hack: Uncursed teleporting items (e.g. Trump Weapons)
2600                  * can actually be useful!
2601                  */
2602                 if ((p_ptr->cursed & TRC_TELEPORT_SELF) && one_in_(200))
2603                 {
2604                         GAME_TEXT o_name[MAX_NLEN];
2605                         object_type *o_ptr;
2606                         int i, i_keep = 0, count = 0;
2607
2608                         /* Scan the equipment with random teleport ability */
2609                         for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
2610                         {
2611                                 BIT_FLAGS flgs[TR_FLAG_SIZE];
2612                                 o_ptr = &p_ptr->inventory_list[i];
2613                                 if (!o_ptr->k_idx) continue;
2614
2615                                 object_flags(o_ptr, flgs);
2616
2617                                 if (have_flag(flgs, TR_TELEPORT))
2618                                 {
2619                                         /* {.} will stop random teleportation. */
2620                                         if (!o_ptr->inscription || !my_strchr(quark_str(o_ptr->inscription), '.'))
2621                                         {
2622                                                 count++;
2623                                                 if (one_in_(count)) i_keep = i;
2624                                         }
2625                                 }
2626                         }
2627
2628                         o_ptr = &p_ptr->inventory_list[i_keep];
2629                         object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2630                         msg_format(_("%sがテレポートの能力を発動させようとしている。", "Your %s is activating teleportation."), o_name);
2631                         if (get_check_strict(_("テレポートしますか?", "Teleport? "), CHECK_OKAY_CANCEL))
2632                         {
2633                                 disturb(FALSE, TRUE);
2634                                 teleport_player(50, 0L);
2635                         }
2636                         else
2637                         {
2638                                 msg_format(_("%sに{.}(ピリオド)と銘を刻むと発動を抑制できます。", 
2639                                                          "You can inscribe {.} on your %s to disable random teleportation. "), o_name);
2640                                 disturb(TRUE, TRUE);
2641                         }
2642                 }
2643                 /* Make a chainsword noise */
2644                 if ((p_ptr->cursed & TRC_CHAINSWORD) && one_in_(CHAINSWORD_NOISE))
2645                 {
2646                         char noise[1024];
2647                         if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, noise))
2648                                 msg_print(noise);
2649                         disturb(FALSE, FALSE);
2650                 }
2651                 /* TY Curse */
2652                 if ((p_ptr->cursed & TRC_TY_CURSE) && one_in_(TY_CURSE_CHANCE))
2653                 {
2654                         int count = 0;
2655                         (void)activate_ty_curse(FALSE, &count);
2656                 }
2657                 /* Handle experience draining */
2658                 if (p_ptr->prace != RACE_ANDROID && ((p_ptr->cursed & TRC_DRAIN_EXP) && one_in_(4)))
2659                 {
2660                         p_ptr->exp -= (p_ptr->lev + 1) / 2;
2661                         if (p_ptr->exp < 0) p_ptr->exp = 0;
2662                         p_ptr->max_exp -= (p_ptr->lev + 1) / 2;
2663                         if (p_ptr->max_exp < 0) p_ptr->max_exp = 0;
2664                         check_experience();
2665                 }
2666                 /* Add light curse (Later) */
2667                 if ((p_ptr->cursed & TRC_ADD_L_CURSE) && one_in_(2000))
2668                 {
2669                         BIT_FLAGS new_curse;
2670                         object_type *o_ptr;
2671
2672                         o_ptr = choose_cursed_obj_name(TRC_ADD_L_CURSE);
2673
2674                         new_curse = get_curse(0, o_ptr);
2675                         if (!(o_ptr->curse_flags & new_curse))
2676                         {
2677                                 GAME_TEXT o_name[MAX_NLEN];
2678
2679                                 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2680
2681                                 o_ptr->curse_flags |= new_curse;
2682                                 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2683
2684                                 o_ptr->feeling = FEEL_NONE;
2685
2686                                 p_ptr->update |= (PU_BONUS);
2687                         }
2688                 }
2689                 /* Add heavy curse (Later) */
2690                 if ((p_ptr->cursed & TRC_ADD_H_CURSE) && one_in_(2000))
2691                 {
2692                         BIT_FLAGS new_curse;
2693                         object_type *o_ptr;
2694
2695                         o_ptr = choose_cursed_obj_name(TRC_ADD_H_CURSE);
2696
2697                         new_curse = get_curse(1, o_ptr);
2698                         if (!(o_ptr->curse_flags & new_curse))
2699                         {
2700                                 GAME_TEXT o_name[MAX_NLEN];
2701
2702                                 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2703
2704                                 o_ptr->curse_flags |= new_curse;
2705                                 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2706                                 o_ptr->feeling = FEEL_NONE;
2707
2708                                 p_ptr->update |= (PU_BONUS);
2709                         }
2710                 }
2711                 /* Call animal */
2712                 if ((p_ptr->cursed & TRC_CALL_ANIMAL) && one_in_(2500))
2713                 {
2714                         if (summon_specific(0, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_ANIMAL, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2715                         {
2716                                 GAME_TEXT o_name[MAX_NLEN];
2717
2718                                 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_ANIMAL), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2719                                 msg_format(_("%sが動物を引き寄せた!", "Your %s have attracted an animal!"), o_name);
2720                                 disturb(FALSE, TRUE);
2721                         }
2722                 }
2723                 /* Call demon */
2724                 if ((p_ptr->cursed & TRC_CALL_DEMON) && one_in_(1111))
2725                 {
2726                         if (summon_specific(0, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2727                         {
2728                                 GAME_TEXT o_name[MAX_NLEN];
2729
2730                                 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DEMON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2731                                 msg_format(_("%sが悪魔を引き寄せた!", "Your %s have attracted a demon!"), o_name);
2732                                 disturb(FALSE, TRUE);
2733                         }
2734                 }
2735                 /* Call dragon */
2736                 if ((p_ptr->cursed & TRC_CALL_DRAGON) && one_in_(800))
2737                 {
2738                         if (summon_specific(0, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_DRAGON,
2739                             (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2740                         {
2741                                 GAME_TEXT o_name[MAX_NLEN];
2742
2743                                 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DRAGON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2744                                 msg_format(_("%sがドラゴンを引き寄せた!", "Your %s have attracted an dragon!"), o_name);
2745                                 disturb(FALSE, TRUE);
2746                         }
2747                 }
2748                 /* Call undead */
2749                 if ((p_ptr->cursed & TRC_CALL_UNDEAD) && one_in_(1111))
2750                 {
2751                         if (summon_specific(0, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_UNDEAD,
2752                             (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2753                         {
2754                                 GAME_TEXT o_name[MAX_NLEN];
2755
2756                                 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_UNDEAD), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2757                                 msg_format(_("%sが死霊を引き寄せた!", "Your %s have attracted an undead!"), o_name);
2758                                 disturb(FALSE, TRUE);
2759                         }
2760                 }
2761                 if ((p_ptr->cursed & TRC_COWARDICE) && one_in_(1500))
2762                 {
2763                         if (!p_ptr->resist_fear)
2764                         {
2765                                 disturb(FALSE, TRUE);
2766                                 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
2767                                 set_afraid(p_ptr->afraid + 13 + randint1(26));
2768                         }
2769                 }
2770                 /* Teleport player */
2771                 if ((p_ptr->cursed & TRC_TELEPORT) && one_in_(200) && !p_ptr->anti_tele)
2772                 {
2773                         disturb(FALSE, TRUE);
2774
2775                         /* Teleport player */
2776                         teleport_player(40, TELEPORT_PASSIVE);
2777                 }
2778                 /* Handle HP draining */
2779                 if ((p_ptr->cursed & TRC_DRAIN_HP) && one_in_(666))
2780                 {
2781                         GAME_TEXT o_name[MAX_NLEN];
2782
2783                         object_desc(o_name, choose_cursed_obj_name(TRC_DRAIN_HP), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2784                         msg_format(_("%sはあなたの体力を吸収した!", "Your %s drains HP from you!"), o_name);
2785                         take_hit(DAMAGE_LOSELIFE, MIN(p_ptr->lev*2, 100), o_name, -1);
2786                 }
2787                 /* Handle mana draining */
2788                 if ((p_ptr->cursed & TRC_DRAIN_MANA) && p_ptr->csp && one_in_(666))
2789                 {
2790                         GAME_TEXT o_name[MAX_NLEN];
2791
2792                         object_desc(o_name, choose_cursed_obj_name(TRC_DRAIN_MANA), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2793                         msg_format(_("%sはあなたの魔力を吸収した!", "Your %s drains mana from you!"), o_name);
2794                         p_ptr->csp -= MIN(p_ptr->lev, 50);
2795                         if (p_ptr->csp < 0)
2796                         {
2797                                 p_ptr->csp = 0;
2798                                 p_ptr->csp_frac = 0;
2799                         }
2800                         p_ptr->redraw |= PR_MANA;
2801                 }
2802         }
2803
2804         /* Rarely, take damage from the Jewel of Judgement */
2805         if (one_in_(999) && !p_ptr->anti_magic)
2806         {
2807                 object_type *o_ptr = &p_ptr->inventory_list[INVEN_LITE];
2808
2809                 if (o_ptr->name1 == ART_JUDGE)
2810                 {
2811                         if (object_is_known(o_ptr))
2812                                 msg_print(_("『審判の宝石』はあなたの体力を吸収した!", "The Jewel of Judgement drains life from you!"));
2813                         else
2814                                 msg_print(_("なにかがあなたの体力を吸収した!", "Something drains life from you!"));
2815                         take_hit(DAMAGE_LOSELIFE, MIN(p_ptr->lev, 50), _("審判の宝石", "the Jewel of Judgement"), -1);
2816                 }
2817         }
2818 }
2819
2820
2821 /*!
2822  * @brief 10ゲームターンが進行するごとに魔道具の自然充填を行う処理
2823  * / Handle recharging objects once every 10 game turns
2824  * @return なし
2825  */
2826 static void process_world_aux_recharge(void)
2827 {
2828         int i;
2829         bool changed;
2830
2831         /* Process equipment */
2832         for (changed = FALSE, i = INVEN_RARM; i < INVEN_TOTAL; i++)
2833         {
2834                 /* Get the object */
2835                 object_type *o_ptr = &p_ptr->inventory_list[i];
2836                 if (!o_ptr->k_idx) continue;
2837
2838                 /* Recharge activatable objects */
2839                 if (o_ptr->timeout > 0)
2840                 {
2841                         /* Recharge */
2842                         o_ptr->timeout--;
2843
2844                         /* Notice changes */
2845                         if (!o_ptr->timeout)
2846                         {
2847                                 recharged_notice(o_ptr);
2848                                 changed = TRUE;
2849                         }
2850                 }
2851         }
2852
2853         /* Notice changes */
2854         if (changed)
2855         {
2856                 p_ptr->window |= (PW_EQUIP);
2857                 wild_regen = 20;
2858         }
2859
2860         /*
2861          * Recharge rods.  Rods now use timeout to control charging status,
2862          * and each charging rod in a stack decreases the stack's timeout by
2863          * one per current_world_ptr->game_turn. -LM-
2864          */
2865         for (changed = FALSE, i = 0; i < INVEN_PACK; i++)
2866         {
2867                 object_type *o_ptr = &p_ptr->inventory_list[i];
2868                 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2869                 if (!o_ptr->k_idx) continue;
2870
2871                 /* Examine all charging rods or stacks of charging rods. */
2872                 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2873                 {
2874                         /* Determine how many rods are charging. */
2875                         TIME_EFFECT temp = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval;
2876                         if (temp > o_ptr->number) temp = (TIME_EFFECT)o_ptr->number;
2877
2878                         /* Decrease timeout by that number. */
2879                         o_ptr->timeout -= temp;
2880
2881                         /* Boundary control. */
2882                         if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2883
2884                         /* Notice changes, provide message if object is inscribed. */
2885                         if (!(o_ptr->timeout))
2886                         {
2887                                 recharged_notice(o_ptr);
2888                                 changed = TRUE;
2889                         }
2890
2891                         /* One of the stack of rod is charged */
2892                         else if (o_ptr->timeout % k_ptr->pval)
2893                         {
2894                                 changed = TRUE;
2895                         }
2896                 }
2897         }
2898
2899         /* Notice changes */
2900         if (changed)
2901         {
2902                 p_ptr->window |= (PW_INVEN);
2903                 wild_regen = 20;
2904         }
2905
2906         /* Process objects on floor */
2907         for (i = 1; i < current_floor_ptr->o_max; i++)
2908         {
2909                 object_type *o_ptr = &current_floor_ptr->o_list[i];
2910
2911                 if (!OBJECT_IS_VALID(o_ptr)) continue;
2912
2913                 /* Recharge rods on the ground.  No messages. */
2914                 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2915                 {
2916                         /* Charge it */
2917                         o_ptr->timeout -= (TIME_EFFECT)o_ptr->number;
2918
2919                         /* Boundary control. */
2920                         if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2921                 }
2922         }
2923 }
2924
2925
2926 /*!
2927  * @brief 10ゲームターンが進行するごとに帰還や現実変容などの残り時間カウントダウンと発動を処理する。
2928  * / Handle involuntary movement once every 10 game turns
2929  * @return なし
2930  */
2931 static void process_world_aux_movement(void)
2932 {
2933         /* Delayed Word-of-Recall */
2934         if (p_ptr->word_recall)
2935         {
2936                 /*
2937                  * HACK: Autosave BEFORE resetting the recall counter (rr9)
2938                  * The player is yanked up/down as soon as
2939                  * he loads the autosaved game.
2940                  */
2941                 if (autosave_l && (p_ptr->word_recall == 1) && !p_ptr->inside_battle)
2942                         do_cmd_save_game(TRUE);
2943
2944                 /* Count down towards recall */
2945                 p_ptr->word_recall--;
2946
2947                 p_ptr->redraw |= (PR_STATUS);
2948
2949                 /* Activate the recall */
2950                 if (!p_ptr->word_recall)
2951                 {
2952                         /* Disturbing! */
2953                         disturb(FALSE, TRUE);
2954
2955                         /* Determine the level */
2956                         if (current_floor_ptr->dun_level || p_ptr->inside_quest || p_ptr->enter_dungeon)
2957                         {
2958                                 msg_print(_("上に引っ張りあげられる感じがする!", "You feel yourself yanked upwards!"));
2959
2960                                 if (p_ptr->dungeon_idx) p_ptr->recall_dungeon = p_ptr->dungeon_idx;
2961                                 if (record_stair)
2962                                         do_cmd_write_nikki(NIKKI_RECALL, current_floor_ptr->dun_level, NULL);
2963
2964                                 current_floor_ptr->dun_level = 0;
2965                                 p_ptr->dungeon_idx = 0;
2966
2967                                 leave_quest_check();
2968                                 leave_tower_check();
2969
2970                                 p_ptr->inside_quest = 0;
2971
2972                                 p_ptr->leaving = TRUE;
2973                         }
2974                         else
2975                         {
2976                                 msg_print(_("下に引きずり降ろされる感じがする!", "You feel yourself yanked downwards!"));
2977
2978                                 p_ptr->dungeon_idx = p_ptr->recall_dungeon;
2979
2980                                 if (record_stair)
2981                                         do_cmd_write_nikki(NIKKI_RECALL, current_floor_ptr->dun_level, NULL);
2982
2983                                 /* New depth */
2984                                 current_floor_ptr->dun_level = max_dlv[p_ptr->dungeon_idx];
2985                                 if (current_floor_ptr->dun_level < 1) current_floor_ptr->dun_level = 1;
2986
2987                                 /* Nightmare mode makes recall more dangerous */
2988                                 if (ironman_nightmare && !randint0(666) && (p_ptr->dungeon_idx == DUNGEON_ANGBAND))
2989                                 {
2990                                         if (current_floor_ptr->dun_level < 50)
2991                                         {
2992                                                 current_floor_ptr->dun_level *= 2;
2993                                         }
2994                                         else if (current_floor_ptr->dun_level < 99)
2995                                         {
2996                                                 current_floor_ptr->dun_level = (current_floor_ptr->dun_level + 99) / 2;
2997                                         }
2998                                         else if (current_floor_ptr->dun_level > 100)
2999                                         {
3000                                                 current_floor_ptr->dun_level = d_info[p_ptr->dungeon_idx].maxdepth - 1;
3001                                         }
3002                                 }
3003
3004                                 if (p_ptr->wild_mode)
3005                                 {
3006                                         p_ptr->wilderness_y = p_ptr->y;
3007                                         p_ptr->wilderness_x = p_ptr->x;
3008                                 }
3009                                 else
3010                                 {
3011                                         /* Save player position */
3012                                         p_ptr->oldpx = p_ptr->x;
3013                                         p_ptr->oldpy = p_ptr->y;
3014                                 }
3015                                 p_ptr->wild_mode = FALSE;
3016
3017                                 /*
3018                                  * Clear all saved floors
3019                                  * and create a first saved floor
3020                                  */
3021                                 prepare_change_floor_mode(CFM_FIRST_FLOOR);
3022                                 p_ptr->leaving = TRUE;
3023
3024                                 if (p_ptr->dungeon_idx == DUNGEON_ANGBAND)
3025                                 {
3026                                         int i;
3027
3028                                         for (i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++)
3029                                         {
3030                                                 quest_type* const q_ptr = &quest[i];
3031
3032                                                 
3033                                                 if ((q_ptr->type == QUEST_TYPE_RANDOM) &&
3034                                                     (q_ptr->status == QUEST_STATUS_TAKEN) &&
3035                                                     (q_ptr->level < current_floor_ptr->dun_level))
3036                                                 {
3037                                                         q_ptr->status = QUEST_STATUS_FAILED;
3038                                                         q_ptr->complev = (byte)p_ptr->lev;
3039                                                         update_playtime();
3040                                                         q_ptr->comptime = current_world_ptr->play_time;
3041                                                         r_info[q_ptr->r_idx].flags1 &= ~(RF1_QUESTOR);
3042                                                 }
3043                                         }
3044                                 }
3045                         }
3046
3047                         sound(SOUND_TPLEVEL);
3048                 }
3049         }
3050
3051
3052         /* Delayed Alter reality */
3053         if (p_ptr->alter_reality)
3054         {
3055                 if (autosave_l && (p_ptr->alter_reality == 1) && !p_ptr->inside_battle)
3056                         do_cmd_save_game(TRUE);
3057
3058                 /* Count down towards alter */
3059                 p_ptr->alter_reality--;
3060
3061                 p_ptr->redraw |= (PR_STATUS);
3062
3063                 /* Activate the alter reality */
3064                 if (!p_ptr->alter_reality)
3065                 {
3066                         /* Disturbing! */
3067                         disturb(FALSE, TRUE);
3068
3069                         /* Determine the level */
3070                         if (!quest_number(current_floor_ptr->dun_level) && current_floor_ptr->dun_level)
3071                         {
3072                                 msg_print(_("世界が変わった!", "The world changes!"));
3073
3074                                 /*
3075                                  * Clear all saved floors
3076                                  * and create a first saved floor
3077                                  */
3078                                 prepare_change_floor_mode(CFM_FIRST_FLOOR);
3079                                 p_ptr->leaving = TRUE;
3080                         }
3081                         else
3082                         {
3083                                 msg_print(_("世界が少しの間変化したようだ。", "The world seems to change for a moment!"));
3084                         }
3085
3086                         sound(SOUND_TPLEVEL);
3087                 }
3088         }
3089 }
3090
3091 /*!
3092  * @brief 10ゲームターンが進行する毎にゲーム世界全体の処理を行う。
3093  * / Handle certain things once every 10 game turns
3094  * @return なし
3095  */
3096 static void process_world(void)
3097 {
3098         int day, hour, min;
3099
3100         const s32b A_DAY = TURNS_PER_TICK * TOWN_DAWN;
3101         s32b prev_turn_in_today = ((current_world_ptr->game_turn - TURNS_PER_TICK) % A_DAY + A_DAY / 4) % A_DAY;
3102         int prev_min = (1440 * prev_turn_in_today / A_DAY) % 60;
3103         
3104         extract_day_hour_min(&day, &hour, &min);
3105
3106         /* Update dungeon feeling, and announce it if changed */
3107         update_dungeon_feeling();
3108
3109         /* 帰還無しモード時のレベルテレポバグ対策 / Fix for level teleport bugs on ironman_downward.*/
3110         if (ironman_downward && (p_ptr->dungeon_idx != DUNGEON_ANGBAND && p_ptr->dungeon_idx != 0))
3111         {
3112                 current_floor_ptr->dun_level = 0;
3113                 p_ptr->dungeon_idx = 0;
3114                 prepare_change_floor_mode(CFM_FIRST_FLOOR | CFM_RAND_PLACE);
3115                 p_ptr->inside_arena = FALSE;
3116                 p_ptr->wild_mode = FALSE;
3117                 p_ptr->leaving = TRUE;
3118         }
3119
3120         /*** Check monster arena ***/
3121         if (p_ptr->inside_battle && !p_ptr->leaving)
3122         {
3123                 int i2, j2;
3124                 int win_m_idx = 0;
3125                 int number_mon = 0;
3126
3127                 /* Count all hostile monsters */
3128                 for (i2 = 0; i2 < current_floor_ptr->width; ++i2)
3129                         for (j2 = 0; j2 < current_floor_ptr->height; j2++)
3130                         {
3131                                 grid_type *g_ptr = &current_floor_ptr->grid_array[j2][i2];
3132
3133                                 if ((g_ptr->m_idx > 0) && (g_ptr->m_idx != p_ptr->riding))
3134                                 {
3135                                         number_mon++;
3136                                         win_m_idx = g_ptr->m_idx;
3137                                 }
3138                         }
3139
3140                 if (number_mon == 0)
3141                 {
3142                         msg_print(_("相打ちに終わりました。", "They have kill each other at the same time."));
3143                         msg_print(NULL);
3144                         p_ptr->energy_need = 0;
3145                         update_gambling_monsters();
3146                 }
3147                 else if ((number_mon-1) == 0)
3148                 {
3149                         GAME_TEXT m_name[MAX_NLEN];
3150                         monster_type *wm_ptr;
3151
3152                         wm_ptr = &current_floor_ptr->m_list[win_m_idx];
3153
3154                         monster_desc(m_name, wm_ptr, 0);
3155                         msg_format(_("%sが勝利した!", "%s is winner!"), m_name);
3156                         msg_print(NULL);
3157
3158                         if (win_m_idx == (sel_monster+1))
3159                         {
3160                                 msg_print(_("おめでとうございます。", "Congratulations."));
3161                                 msg_format(_("%d$を受け取った。", "You received %d gold."), battle_odds);
3162                                 p_ptr->au += battle_odds;
3163                         }
3164                         else
3165                         {
3166                                 msg_print(_("残念でした。", "You lost gold."));
3167                         }
3168                         msg_print(NULL);
3169                         p_ptr->energy_need = 0;
3170                         update_gambling_monsters();
3171                 }
3172                 else if (current_world_ptr->game_turn - current_floor_ptr->generated_turn == 150 * TURNS_PER_TICK)
3173                 {
3174                         msg_print(_("申し分けありませんが、この勝負は引き分けとさせていただきます。", "This battle have ended in a draw."));
3175                         p_ptr->au += kakekin;
3176                         msg_print(NULL);
3177                         p_ptr->energy_need = 0;
3178                         update_gambling_monsters();
3179                 }
3180         }
3181
3182         /* Every 10 game turns */
3183         if (current_world_ptr->game_turn % TURNS_PER_TICK) return;
3184
3185         /*** Attempt timed autosave ***/
3186         if (autosave_t && autosave_freq && !p_ptr->inside_battle)
3187         {
3188                 if (!(current_world_ptr->game_turn % ((s32b)autosave_freq * TURNS_PER_TICK)))
3189                         do_cmd_save_game(TRUE);
3190         }
3191
3192         if (current_floor_ptr->monster_noise && !ignore_unview)
3193         {
3194                 msg_print(_("何かが聞こえた。", "You hear noise."));
3195         }
3196
3197         /*** Handle the wilderness/town (sunshine) ***/
3198
3199         /* While in town/wilderness */
3200         if (!current_floor_ptr->dun_level && !p_ptr->inside_quest && !p_ptr->inside_battle && !p_ptr->inside_arena)
3201         {
3202                 /* Hack -- Daybreak/Nighfall in town */
3203                 if (!(current_world_ptr->game_turn % ((TURNS_PER_TICK * TOWN_DAWN) / 2)))
3204                 {
3205                         bool dawn;
3206
3207                         /* Check for dawn */
3208                         dawn = (!(current_world_ptr->game_turn % (TURNS_PER_TICK * TOWN_DAWN)));
3209
3210                         if (dawn) day_break();
3211                         else night_falls();
3212
3213                 }
3214         }
3215
3216         /* While in the dungeon (vanilla_town or lite_town mode only) */
3217         else if ((vanilla_town || (lite_town && !p_ptr->inside_quest && !p_ptr->inside_battle && !p_ptr->inside_arena)) && current_floor_ptr->dun_level)
3218         {
3219                 /*** Shuffle the Storekeepers ***/
3220
3221                 /* Chance is only once a day (while in dungeon) */
3222                 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * STORE_TICKS)))
3223                 {
3224                         /* Sometimes, shuffle the shop-keepers */
3225                         if (one_in_(STORE_SHUFFLE))
3226                         {
3227                                 int n;
3228                                 FEAT_IDX i;
3229
3230                                 /* Pick a random shop (except home and museum) */
3231                                 do
3232                                 {
3233                                         n = randint0(MAX_STORES);
3234                                 }
3235                                 while ((n == STORE_HOME) || (n == STORE_MUSEUM));
3236
3237                                 /* Check every feature */
3238                                 for (i = 1; i < max_f_idx; i++)
3239                                 {
3240                                         feature_type *f_ptr = &f_info[i];
3241
3242                                         /* Skip empty index */
3243                                         if (!f_ptr->name) continue;
3244
3245                                         /* Skip non-store features */
3246                                         if (!have_flag(f_ptr->flags, FF_STORE)) continue;
3247
3248                                         /* Verify store type */
3249                                         if (f_ptr->subtype == n)
3250                                         {
3251                                                 if (cheat_xtra) msg_format(_("%sの店主をシャッフルします。", "Shuffle a Shopkeeper of %s."), f_name + f_ptr->name);
3252
3253                                                 /* Shuffle it */
3254                                                 store_shuffle(n);
3255
3256                                                 break;
3257                                         }
3258                                 }
3259                         }
3260                 }
3261         }
3262
3263
3264         /*** Process the monsters ***/
3265
3266         /* Check for creature generation. */
3267         if (one_in_(d_info[p_ptr->dungeon_idx].max_m_alloc_chance) &&
3268             !p_ptr->inside_arena && !p_ptr->inside_quest && !p_ptr->inside_battle)
3269         {
3270                 /* Make a new monster */
3271                 (void)alloc_monster(MAX_SIGHT + 5, 0);
3272         }
3273
3274         /* Hack -- Check for creature regeneration */
3275         if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 10)) && !p_ptr->inside_battle) regen_monsters();
3276         if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 3))) regen_captured_monsters();
3277
3278         if (!p_ptr->leaving)
3279         {
3280                 int i;
3281
3282                 /* Hack -- Process the counters of monsters if needed */
3283                 for (i = 0; i < MAX_MTIMED; i++)
3284                 {
3285                         if (current_floor_ptr->mproc_max[i] > 0) process_monsters_mtimed(i);
3286                 }
3287         }
3288
3289
3290         /* Date changes */
3291         if (!hour && !min)
3292         {
3293                 if (min != prev_min)
3294                 {
3295                         do_cmd_write_nikki(NIKKI_HIGAWARI, 0, NULL);
3296                         determine_today_mon(FALSE);
3297                 }
3298         }
3299
3300         /*
3301          * Nightmare mode activates the TY_CURSE at midnight
3302          * Require exact minute -- Don't activate multiple times in a minute
3303          */
3304
3305         if (ironman_nightmare && (min != prev_min))
3306         {
3307
3308                 /* Every 15 minutes after 11:00 pm */
3309                 if ((hour == 23) && !(min % 15))
3310                 {
3311                         disturb(FALSE, TRUE);
3312
3313                         switch (min / 15)
3314                         {
3315                         case 0:
3316                                 msg_print(_("遠くで不気味な鐘の音が鳴った。", "You hear a distant bell toll ominously."));
3317                                 break;
3318
3319                         case 1:
3320                                 msg_print(_("遠くで鐘が二回鳴った。", "A distant bell sounds twice."));
3321                                 break;
3322
3323                         case 2:
3324                                 msg_print(_("遠くで鐘が三回鳴った。", "A distant bell sounds three times."));
3325                                 break;
3326
3327                         case 3:
3328                                 msg_print(_("遠くで鐘が四回鳴った。", "A distant bell tolls four times."));
3329                                 break;
3330                         }
3331                 }
3332
3333                 /* TY_CURSE activates at midnight! */
3334                 if (!hour && !min)
3335                 {
3336
3337                         disturb(TRUE, TRUE);
3338                         msg_print(_("遠くで鐘が何回も鳴り、死んだような静けさの中へ消えていった。", "A distant bell tolls many times, fading into an deathly silence."));
3339
3340                         if (p_ptr->wild_mode)
3341                         {
3342                                 /* Go into large wilderness view */
3343                                 p_ptr->oldpy = randint1(MAX_HGT - 2);
3344                                 p_ptr->oldpx = randint1(MAX_WID - 2);
3345                                 change_wild_mode(TRUE);
3346
3347                                 /* Give first move to monsters */
3348                                 take_turn(p_ptr, 100);
3349
3350                         }
3351
3352                         p_ptr->invoking_midnight_curse = TRUE;
3353                 }
3354         }
3355
3356
3357
3358         /* Check the Food */
3359         process_world_aux_digestion();
3360
3361         /* Process timed damage and regeneration */
3362         process_world_aux_hp_and_sp();
3363
3364         /* Process timeout */
3365         process_world_aux_timeout();
3366
3367         /* Process light */
3368         process_world_aux_light();
3369
3370         /* Process mutation effects */
3371         process_world_aux_mutation();
3372
3373         /* Process curse effects */
3374         process_world_aux_curse();
3375
3376         /* Process recharging */
3377         process_world_aux_recharge();
3378
3379         /* Feel the p_ptr->inventory_list */
3380         sense_inventory1();
3381         sense_inventory2();
3382
3383         /* Involuntary Movement */
3384         process_world_aux_movement();
3385 }
3386
3387 /*!
3388  * @brief ウィザードモードへの導入処理
3389  * / Verify use of "wizard" mode
3390  * @return 実際にウィザードモードへ移行したらTRUEを返す。
3391  */
3392 static bool enter_wizard_mode(void)
3393 {
3394         /* Ask first time */
3395         if (!p_ptr->noscore)
3396         {
3397                 /* Wizard mode is not permitted */
3398                 if (!allow_debug_opts || arg_wizard)
3399                 {
3400                         msg_print(_("ウィザードモードは許可されていません。 ", "Wizard mode is not permitted."));
3401                         return FALSE;
3402                 }
3403
3404                 /* Mention effects */
3405                 msg_print(_("ウィザードモードはデバッグと実験のためのモードです。 ", "Wizard mode is for debugging and experimenting."));
3406                 msg_print(_("一度ウィザードモードに入るとスコアは記録されません。", "The game will not be scored if you enter wizard mode."));
3407                 msg_print(NULL);
3408
3409                 /* Verify request */
3410                 if (!get_check(_("本当にウィザードモードに入りたいのですか? ", "Are you sure you want to enter wizard mode? ")))
3411                 {
3412                         return (FALSE);
3413                 }
3414
3415                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("ウィザードモードに突入してスコアを残せなくなった。", "give up recording score to enter wizard mode."));
3416                 /* Mark savefile */
3417                 p_ptr->noscore |= 0x0002;
3418         }
3419
3420         /* Success */
3421         return (TRUE);
3422 }
3423
3424
3425 #ifdef ALLOW_WIZARD
3426
3427 /*!
3428  * @brief デバッグコマンドへの導入処理
3429  * / Verify use of "debug" commands
3430  * @return 実際にデバッグコマンドへ移行したらTRUEを返す。
3431  */
3432 static bool enter_debug_mode(void)
3433 {
3434         /* Ask first time */
3435         if (!p_ptr->noscore)
3436         {
3437                 /* Debug mode is not permitted */
3438                 if (!allow_debug_opts)
3439                 {
3440                         msg_print(_("デバッグコマンドは許可されていません。 ", "Use of debug command is not permitted."));
3441                         return FALSE;
3442                 }
3443
3444                 /* Mention effects */
3445                 msg_print(_("デバッグ・コマンドはデバッグと実験のためのコマンドです。 ", "The debug commands are for debugging and experimenting."));
3446                 msg_print(_("デバッグ・コマンドを使うとスコアは記録されません。", "The game will not be scored if you use debug commands."));
3447
3448                 msg_print(NULL);
3449
3450                 /* Verify request */
3451                 if (!get_check(_("本当にデバッグ・コマンドを使いますか? ", "Are you sure you want to use debug commands? ")))
3452                 {
3453                         return (FALSE);
3454                 }
3455
3456                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("デバッグモードに突入してスコアを残せなくなった。", "give up sending score to use debug commands."));
3457                 /* Mark savefile */
3458                 p_ptr->noscore |= 0x0008;
3459         }
3460
3461         /* Success */
3462         return (TRUE);
3463 }
3464
3465 /*
3466  * Hack -- Declare the Debug Routines
3467  */
3468 extern void do_cmd_debug(void);
3469
3470 #endif /* ALLOW_WIZARD */
3471
3472
3473 #ifdef ALLOW_BORG
3474
3475 /*!
3476  * @brief ボーグコマンドへの導入処理
3477  * / Verify use of "borg" commands
3478  * @return 実際にボーグコマンドへ移行したらTRUEを返す。
3479  */
3480 static bool enter_borg_mode(void)
3481 {
3482         /* Ask first time */
3483         if (!(p_ptr->noscore & 0x0010))
3484         {
3485                 /* Mention effects */
3486                 msg_print(_("ボーグ・コマンドはデバッグと実験のためのコマンドです。 ", "The borg commands are for debugging and experimenting."));
3487                 msg_print(_("ボーグ・コマンドを使うとスコアは記録されません。", "The game will not be scored if you use borg commands."));
3488
3489                 msg_print(NULL);
3490
3491                 /* Verify request */
3492                 if (!get_check(_("本当にボーグ・コマンドを使いますか? ", "Are you sure you want to use borg commands? ")))
3493                 {
3494                         return (FALSE);
3495                 }
3496
3497                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("ボーグ・コマンドを使用してスコアを残せなくなった。", "give up recording score to use borg commands."));
3498                 /* Mark savefile */
3499                 p_ptr->noscore |= 0x0010;
3500         }
3501
3502         /* Success */
3503         return (TRUE);
3504 }
3505
3506 /*
3507  * Hack -- Declare the Ben Borg
3508  */
3509 extern void do_cmd_borg(void);
3510
3511 #endif /* ALLOW_BORG */
3512
3513
3514 /*!
3515  * @brief プレイヤーから受けた入力コマンドの分岐処理。
3516  * / Parse and execute the current command Give "Warning" on illegal commands.
3517  * @todo Make some "blocks"
3518  * @return なし
3519  */
3520 static void process_command(void)
3521 {
3522         COMMAND_CODE old_now_message = now_message;
3523
3524         /* Handle repeating the last command */
3525         repeat_check();
3526
3527         now_message = 0;
3528
3529         /* Sniper */
3530         if ((p_ptr->pclass == CLASS_SNIPER) && (p_ptr->concent))
3531                 p_ptr->reset_concent = TRUE;
3532
3533         /* Parse the command */
3534         switch (command_cmd)
3535         {
3536                 /* Ignore */
3537                 case ESCAPE:
3538                 case ' ':
3539                 {
3540                         break;
3541                 }
3542
3543                 /* Ignore return */
3544                 case '\r':
3545                 case '\n':
3546                 {
3547                         break;
3548                 }
3549
3550                 /*** Wizard Commands ***/
3551
3552                 /* Toggle Wizard Mode */
3553                 case KTRL('W'):
3554                 {
3555                         if (p_ptr->wizard)
3556                         {
3557                                 p_ptr->wizard = FALSE;
3558                                 msg_print(_("ウィザードモード解除。", "Wizard mode off."));
3559                         }
3560                         else if (enter_wizard_mode())
3561                         {
3562                                 p_ptr->wizard = TRUE;
3563                                 msg_print(_("ウィザードモード突入。", "Wizard mode on."));
3564                         }
3565                         p_ptr->update |= (PU_MONSTERS);
3566
3567                         /* Redraw "title" */
3568                         p_ptr->redraw |= (PR_TITLE);
3569
3570                         break;
3571                 }
3572
3573
3574 #ifdef ALLOW_WIZARD
3575
3576                 /* Special "debug" commands */
3577                 case KTRL('A'):
3578                 {
3579                         /* Enter debug mode */
3580                         if (enter_debug_mode())
3581                         {
3582                                 do_cmd_debug();
3583                         }
3584                         break;
3585                 }
3586
3587 #endif /* ALLOW_WIZARD */
3588
3589
3590 #ifdef ALLOW_BORG
3591
3592                 /* Special "borg" commands */
3593                 case KTRL('Z'):
3594                 {
3595                         /* Enter borg mode */
3596                         if (enter_borg_mode())
3597                         {
3598                                 if (!p_ptr->wild_mode) do_cmd_borg();
3599                         }
3600
3601                         break;
3602                 }
3603
3604 #endif /* ALLOW_BORG */
3605
3606
3607
3608                 /*** Inventory Commands ***/
3609
3610                 /* Wear/wield equipment */
3611                 case 'w':
3612                 {
3613                         if (!p_ptr->wild_mode) do_cmd_wield();
3614                         break;
3615                 }
3616
3617                 /* Take off equipment */
3618                 case 't':
3619                 {
3620                         if (!p_ptr->wild_mode) do_cmd_takeoff();
3621                         break;
3622                 }
3623
3624                 /* Drop an item */
3625                 case 'd':
3626                 {
3627                         if (!p_ptr->wild_mode) do_cmd_drop();
3628                         break;
3629                 }
3630
3631                 /* Destroy an item */
3632                 case 'k':
3633                 {
3634                         do_cmd_destroy();
3635                         break;
3636                 }
3637
3638                 /* Equipment list */
3639                 case 'e':
3640                 {
3641                         do_cmd_equip();
3642                         break;
3643                 }
3644
3645                 /* Inventory list */
3646                 case 'i':
3647                 {
3648                         do_cmd_inven();
3649                         break;
3650                 }
3651
3652
3653                 /*** Various commands ***/
3654
3655                 /* Identify an object */
3656                 case 'I':
3657                 {
3658                         do_cmd_observe();
3659                         break;
3660                 }
3661
3662                 /* Hack -- toggle windows */
3663                 case KTRL('I'):
3664                 {
3665                         toggle_inven_equip();
3666                         break;
3667                 }
3668
3669
3670                 /*** Standard "Movement" Commands ***/
3671
3672                 /* Alter a grid */
3673                 case '+':
3674                 {
3675                         if (!p_ptr->wild_mode) do_cmd_alter();
3676                         break;
3677                 }
3678
3679                 /* Dig a tunnel */
3680                 case 'T':
3681                 {
3682                         if (!p_ptr->wild_mode) do_cmd_tunnel();
3683                         break;
3684                 }
3685
3686                 /* Move (usually pick up things) */
3687                 case ';':
3688                 {
3689                         do_cmd_walk(FALSE);
3690                         break;
3691                 }
3692
3693                 /* Move (usually do not pick up) */
3694                 case '-':
3695                 {
3696                         do_cmd_walk(TRUE);
3697                         break;
3698                 }
3699
3700
3701                 /*** Running, Resting, Searching, Staying */
3702
3703                 /* Begin Running -- Arg is Max Distance */
3704                 case '.':
3705                 {
3706                         if (!p_ptr->wild_mode) do_cmd_run();
3707                         break;
3708                 }
3709
3710                 /* Stay still (usually pick things up) */
3711                 case ',':
3712                 {
3713                         do_cmd_stay(always_pickup);
3714                         break;
3715                 }
3716
3717                 /* Stay still (usually do not pick up) */
3718                 case 'g':
3719                 {
3720                         do_cmd_stay(!always_pickup);
3721                         break;
3722                 }
3723
3724                 /* Rest -- Arg is time */
3725                 case 'R':
3726                 {
3727                         do_cmd_rest();
3728                         break;
3729                 }
3730
3731                 /* Search for traps/doors */
3732                 case 's':
3733                 {
3734                         do_cmd_search();
3735                         break;
3736                 }
3737
3738                 /* Toggle search mode */
3739                 case 'S':
3740                 {
3741                         if (p_ptr->action == ACTION_SEARCH) set_action(ACTION_NONE);
3742                         else set_action(ACTION_SEARCH);
3743                         break;
3744                 }
3745
3746
3747                 /*** Stairs and Doors and Chests and Traps ***/
3748
3749                 /* Enter store */
3750                 case SPECIAL_KEY_STORE:
3751                 {
3752                         do_cmd_store();
3753                         break;
3754                 }
3755
3756                 /* Enter building -KMW- */
3757                 case SPECIAL_KEY_BUILDING:
3758                 {
3759                         do_cmd_bldg();
3760                         break;
3761                 }
3762
3763                 /* Enter quest level -KMW- */
3764                 case SPECIAL_KEY_QUEST:
3765                 {
3766                         do_cmd_quest();
3767                         break;
3768                 }
3769
3770                 /* Go up staircase */
3771                 case '<':
3772                 {
3773                         if (!p_ptr->wild_mode && !current_floor_ptr->dun_level && !p_ptr->inside_arena && !p_ptr->inside_quest)
3774                         {
3775                                 if (vanilla_town) break;
3776
3777                                 if (p_ptr->ambush_flag)
3778                                 {
3779                                         msg_print(_("襲撃から逃げるにはマップの端まで移動しなければならない。", "To flee the ambush you have to reach the edge of the map."));
3780                                         break;
3781                                 }
3782
3783                                 if (p_ptr->food < PY_FOOD_WEAK)
3784                                 {
3785                                         msg_print(_("その前に食事をとらないと。", "You must eat something here."));
3786                                         break;
3787                                 }
3788
3789                                 change_wild_mode(FALSE);
3790                         }
3791                         else
3792                                 do_cmd_go_up(p_ptr);
3793                         break;
3794                 }
3795
3796                 /* Go down staircase */
3797                 case '>':
3798                 {
3799                         if (p_ptr->wild_mode)
3800                                 change_wild_mode(FALSE);
3801                         else
3802                                 do_cmd_go_down();
3803                         break;
3804                 }
3805
3806                 /* Open a door or chest */
3807                 case 'o':
3808                 {
3809                         do_cmd_open();
3810                         break;
3811                 }
3812
3813                 /* Close a door */
3814                 case 'c':
3815                 {
3816                         do_cmd_close();
3817                         break;
3818                 }
3819
3820                 /* Jam a door with spikes */
3821                 case 'j':
3822                 {
3823                         do_cmd_spike();
3824                         break;
3825                 }
3826
3827                 /* Bash a door */
3828                 case 'B':
3829                 {
3830                         do_cmd_bash();
3831                         break;
3832                 }
3833
3834                 /* Disarm a trap or chest */
3835                 case 'D':
3836                 {
3837                         do_cmd_disarm();
3838                         break;
3839                 }
3840
3841
3842                 /*** Magic and Prayers ***/
3843
3844                 /* Gain new spells/prayers */
3845                 case 'G':
3846                 {
3847                         if ((p_ptr->pclass == CLASS_SORCERER) || (p_ptr->pclass == CLASS_RED_MAGE))
3848                                 msg_print(_("呪文を学習する必要はない!", "You don't have to learn spells!"));
3849                         else if (p_ptr->pclass == CLASS_SAMURAI)
3850                                 do_cmd_gain_hissatsu();
3851                         else if (p_ptr->pclass == CLASS_MAGIC_EATER)
3852                                 import_magic_device();
3853                         else
3854                                 do_cmd_study();
3855                         break;
3856                 }
3857
3858                 /* Browse a book */
3859                 case 'b':
3860                 {
3861                         if ( (p_ptr->pclass == CLASS_MINDCRAFTER) ||
3862                              (p_ptr->pclass == CLASS_BERSERKER) ||
3863                              (p_ptr->pclass == CLASS_NINJA) ||
3864                              (p_ptr->pclass == CLASS_MIRROR_MASTER) 
3865                              ) do_cmd_mind_browse();
3866                         else if (p_ptr->pclass == CLASS_SMITH)
3867                                 do_cmd_kaji(TRUE);
3868                         else if (p_ptr->pclass == CLASS_MAGIC_EATER)
3869                                 do_cmd_magic_eater(TRUE, FALSE);
3870                         else if (p_ptr->pclass == CLASS_SNIPER)
3871                                 do_cmd_snipe_browse();
3872                         else do_cmd_browse();
3873                         break;
3874                 }
3875
3876                 /* Cast a spell */
3877                 case 'm':
3878                 {
3879                         /* -KMW- */
3880                         if (!p_ptr->wild_mode)
3881                         {
3882                                 if ((p_ptr->pclass == CLASS_WARRIOR) || (p_ptr->pclass == CLASS_ARCHER) || (p_ptr->pclass == CLASS_CAVALRY))
3883                                 {
3884                                         msg_print(_("呪文を唱えられない!", "You cannot cast spells!"));
3885                                 }
3886                                 else if (current_floor_ptr->dun_level && (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MAGIC) && (p_ptr->pclass != CLASS_BERSERKER) && (p_ptr->pclass != CLASS_SMITH))
3887                                 {
3888                                         msg_print(_("ダンジョンが魔法を吸収した!", "The dungeon absorbs all attempted magic!"));
3889                                         msg_print(NULL);
3890                                 }
3891                                 else if (p_ptr->anti_magic && (p_ptr->pclass != CLASS_BERSERKER) && (p_ptr->pclass != CLASS_SMITH))
3892                                 {
3893                                         concptr which_power = _("魔法", "magic");
3894                                         if (p_ptr->pclass == CLASS_MINDCRAFTER)
3895                                                 which_power = _("超能力", "psionic powers");
3896                                         else if (p_ptr->pclass == CLASS_IMITATOR)
3897                                                 which_power = _("ものまね", "imitation");
3898                                         else if (p_ptr->pclass == CLASS_SAMURAI)
3899                                                 which_power = _("必殺剣", "hissatsu");
3900                                         else if (p_ptr->pclass == CLASS_MIRROR_MASTER)
3901                                                 which_power = _("鏡魔法", "mirror magic");
3902                                         else if (p_ptr->pclass == CLASS_NINJA)
3903                                                 which_power = _("忍術", "ninjutsu");
3904                                         else if (mp_ptr->spell_book == TV_LIFE_BOOK)
3905                                                 which_power = _("祈り", "prayer");
3906
3907                                         msg_format(_("反魔法バリアが%sを邪魔した!", "An anti-magic shell disrupts your %s!"), which_power);
3908                                         free_turn(p_ptr);
3909                                 }
3910                                 else if (p_ptr->shero && (p_ptr->pclass != CLASS_BERSERKER))
3911                                 {
3912                                         msg_format(_("狂戦士化していて頭が回らない!", "You cannot think directly!"));
3913                                         free_turn(p_ptr);
3914                                 }
3915                                 else
3916                                 {
3917                                         if ((p_ptr->pclass == CLASS_MINDCRAFTER) ||
3918                                             (p_ptr->pclass == CLASS_BERSERKER) ||
3919                                             (p_ptr->pclass == CLASS_NINJA) ||
3920                                             (p_ptr->pclass == CLASS_MIRROR_MASTER)
3921                                             )
3922                                                 do_cmd_mind();
3923                                         else if (p_ptr->pclass == CLASS_IMITATOR)
3924                                                 do_cmd_mane(FALSE);
3925                                         else if (p_ptr->pclass == CLASS_MAGIC_EATER)
3926                                                 do_cmd_magic_eater(FALSE, FALSE);
3927                                         else if (p_ptr->pclass == CLASS_SAMURAI)
3928                                                 do_cmd_hissatsu();
3929                                         else if (p_ptr->pclass == CLASS_BLUE_MAGE)
3930                                                 do_cmd_cast_learned();
3931                                         else if (p_ptr->pclass == CLASS_SMITH)
3932                                                 do_cmd_kaji(FALSE);
3933                                         else if (p_ptr->pclass == CLASS_SNIPER)
3934                                                 do_cmd_snipe();
3935                                         else
3936                                                 do_cmd_cast();
3937                                 }
3938                         }
3939                         break;
3940                 }
3941
3942                 /* Issue a pet command */
3943                 case 'p':
3944                 {
3945                         do_cmd_pet();
3946                         break;
3947                 }
3948
3949                 /*** Use various objects ***/
3950
3951                 /* Inscribe an object */
3952                 case '{':
3953                 {
3954                         do_cmd_inscribe();
3955                         break;
3956                 }
3957
3958                 /* Uninscribe an object */
3959                 case '}':
3960                 {
3961                         do_cmd_uninscribe();
3962                         break;
3963                 }
3964
3965                 /* Activate an artifact */
3966                 case 'A':
3967                 {
3968                         do_cmd_activate(p_ptr);
3969                         break;
3970                 }
3971
3972                 /* Eat some food */
3973                 case 'E':
3974                 {
3975                         do_cmd_eat_food();
3976                         break;
3977                 }
3978
3979                 /* Fuel your lantern/torch */
3980                 case 'F':
3981                 {
3982                         do_cmd_refill();
3983                         break;
3984                 }
3985
3986                 /* Fire an item */
3987                 case 'f':
3988                 {
3989                         do_cmd_fire(SP_NONE);
3990                         break;
3991                 }
3992
3993                 /* Throw an item */
3994                 case 'v':
3995                 {
3996                         do_cmd_throw(1, FALSE, -1);
3997                         break;
3998                 }
3999
4000                 /* Aim a wand */
4001                 case 'a':
4002                 {
4003                         do_cmd_aim_wand();
4004                         break;
4005                 }
4006
4007                 /* Zap a rod */
4008                 case 'z':
4009                 {
4010                         if (use_command && rogue_like_commands)
4011                         {
4012                                 do_cmd_use();
4013                         }
4014                         else
4015                         {
4016                                 do_cmd_zap_rod();
4017                         }
4018                         break;
4019                 }
4020
4021                 /* Quaff a potion */
4022                 case 'q':
4023                 {
4024                         do_cmd_quaff_potion();
4025                         break;
4026                 }
4027
4028                 /* Read a scroll */
4029                 case 'r':
4030                 {
4031                         do_cmd_read_scroll();
4032                         break;
4033                 }
4034
4035                 /* Use a staff */
4036                 case 'u':
4037                 {
4038                         if (use_command && !rogue_like_commands)
4039                                 do_cmd_use();
4040                         else
4041                                 do_cmd_use_staff();
4042                         break;
4043                 }
4044
4045                 /* Use racial power */
4046                 case 'U':
4047                 {
4048                         do_cmd_racial_power();
4049                         break;
4050                 }
4051
4052
4053                 /*** Looking at Things (nearby or on map) ***/
4054
4055                 /* Full dungeon map */
4056                 case 'M':
4057                 {
4058                         do_cmd_view_map();
4059                         break;
4060                 }
4061
4062                 /* Locate player on map */
4063                 case 'L':
4064                 {
4065                         do_cmd_locate();
4066                         break;
4067                 }
4068
4069                 /* Look around */
4070                 case 'l':
4071                 {
4072                         do_cmd_look();
4073                         break;
4074                 }
4075
4076                 /* Target monster or location */
4077                 case '*':
4078                 {
4079                         do_cmd_target();
4080                         break;
4081                 }
4082
4083
4084
4085                 /*** Help and Such ***/
4086
4087                 /* Help */
4088                 case '?':
4089                 {
4090                         do_cmd_help();
4091                         break;
4092                 }
4093
4094                 /* Identify symbol */
4095                 case '/':
4096                 {
4097                         do_cmd_query_symbol();
4098                         break;
4099                 }
4100
4101                 /* Character description */
4102                 case 'C':
4103                 {
4104                         do_cmd_player_status();
4105                         break;
4106                 }
4107
4108
4109                 /*** System Commands ***/
4110
4111                 /* Hack -- User interface */
4112                 case '!':
4113                 {
4114                         (void)Term_user(0);
4115                         break;
4116                 }
4117
4118                 /* Single line from a pref file */
4119                 case '"':
4120                 {
4121                         do_cmd_pref();
4122                         break;
4123                 }
4124
4125                 case '$':
4126                 {
4127                         do_cmd_reload_autopick();
4128                         break;
4129                 }
4130
4131                 case '_':
4132                 {
4133                         do_cmd_edit_autopick();
4134                         break;
4135                 }
4136
4137                 /* Interact with macros */
4138                 case '@':
4139                 {
4140                         do_cmd_macros();
4141                         break;
4142                 }
4143
4144                 /* Interact with visuals */
4145                 case '%':
4146                 {
4147                         do_cmd_visuals();
4148                         do_cmd_redraw();
4149                         break;
4150                 }
4151
4152                 /* Interact with colors */
4153                 case '&':
4154                 {
4155                         do_cmd_colors();
4156                         do_cmd_redraw();
4157                         break;
4158                 }
4159
4160                 /* Interact with options */
4161                 case '=':
4162                 {
4163                         do_cmd_options();
4164                         (void)combine_and_reorder_home(STORE_HOME);
4165                         do_cmd_redraw();
4166                         break;
4167                 }
4168
4169                 /*** Misc Commands ***/
4170
4171                 /* Take notes */
4172                 case ':':
4173                 {
4174                         do_cmd_note();
4175                         break;
4176                 }
4177
4178                 /* Version info */
4179                 case 'V':
4180                 {
4181                         do_cmd_version();
4182                         break;
4183                 }
4184
4185                 /* Repeat level feeling */
4186                 case KTRL('F'):
4187                 {
4188                         do_cmd_feeling();
4189                         break;
4190                 }
4191
4192                 /* Show previous message */
4193                 case KTRL('O'):
4194                 {
4195                         do_cmd_message_one();
4196                         break;
4197                 }
4198
4199                 /* Show previous messages */
4200                 case KTRL('P'):
4201                 {
4202                         do_cmd_messages(old_now_message);
4203                         break;
4204                 }
4205
4206                 /* Show quest status -KMW- */
4207                 case KTRL('Q'):
4208                 {
4209                         do_cmd_checkquest();
4210                         break;
4211                 }
4212
4213                 /* Redraw the screen */
4214                 case KTRL('R'):
4215                 {
4216                         now_message = old_now_message;
4217                         do_cmd_redraw();
4218                         break;
4219                 }
4220
4221 #ifndef VERIFY_SAVEFILE
4222
4223                 /* Hack -- Save and don't quit */
4224                 case KTRL('S'):
4225                 {
4226                         do_cmd_save_game(FALSE);
4227                         break;
4228                 }
4229
4230 #endif /* VERIFY_SAVEFILE */
4231
4232                 case KTRL('T'):
4233                 {
4234                         do_cmd_time();
4235                         break;
4236                 }
4237
4238                 /* Save and quit */
4239                 case KTRL('X'):
4240                 case SPECIAL_KEY_QUIT:
4241                 {
4242                         do_cmd_save_and_exit();
4243                         break;
4244                 }
4245
4246                 /* Quit (commit suicide) */
4247                 case 'Q':
4248                 {
4249                         do_cmd_suicide();
4250                         break;
4251                 }
4252
4253                 case '|':
4254                 {
4255                         do_cmd_nikki();
4256                         break;
4257                 }
4258
4259                 /* Check artifacts, uniques, objects */
4260                 case '~':
4261                 {
4262                         do_cmd_knowledge();
4263                         break;
4264                 }
4265
4266                 /* Load "screen dump" */
4267                 case '(':
4268                 {
4269                         do_cmd_load_screen();
4270                         break;
4271                 }
4272
4273                 /* Save "screen dump" */
4274                 case ')':
4275                 {
4276                         do_cmd_save_screen();
4277                         break;
4278                 }
4279
4280                 /* Record/stop "Movie" */
4281                 case ']':
4282                 {
4283                         prepare_movie_hooks();
4284                         break;
4285                 }
4286
4287                 /* Make random artifact list */
4288                 case KTRL('V'):
4289                 {
4290                         spoil_random_artifact("randifact.txt");
4291                         break;
4292                 }
4293
4294 #ifdef TRAVEL
4295                 case '`':
4296                 {
4297                         if (!p_ptr->wild_mode) do_cmd_travel();
4298                         if (p_ptr->special_defense & KATA_MUSOU)
4299                         {
4300                                 set_action(ACTION_NONE);
4301                         }
4302                         break;
4303                 }
4304 #endif
4305
4306                 /* Hack -- Unknown command */
4307                 default:
4308                 {
4309                         if (flush_failure) flush();
4310                         if (one_in_(2))
4311                         {
4312                                 char error_m[1024];
4313                                 sound(SOUND_ILLEGAL);
4314                                 if (!get_rnd_line(_("error_j.txt", "error.txt"), 0, error_m))
4315                                         msg_print(error_m);
4316                         }
4317                         else
4318                         {
4319                                 prt(_(" '?' でヘルプが表示されます。", "Type '?' for help."), 0, 0);
4320                         }
4321
4322                         break;
4323                 }
4324         }
4325         if (!p_ptr->energy_use && !now_message)
4326                 now_message = old_now_message;
4327 }
4328
4329 /*!
4330  * @brief アイテムの所持種類数が超えた場合にアイテムを床に落とす処理 / Hack -- Pack Overflow
4331  * @return なし
4332  */
4333 static void pack_overflow(void)
4334 {
4335         if (p_ptr->inventory_list[INVEN_PACK].k_idx)
4336         {
4337                 GAME_TEXT o_name[MAX_NLEN];
4338                 object_type *o_ptr;
4339
4340                 /* Is auto-destroy done? */
4341                 update_creature(p_ptr);
4342                 if (!p_ptr->inventory_list[INVEN_PACK].k_idx) return;
4343
4344                 /* Access the slot to be dropped */
4345                 o_ptr = &p_ptr->inventory_list[INVEN_PACK];
4346
4347                 disturb(FALSE, TRUE);
4348
4349                 /* Warning */
4350                 msg_print(_("ザックからアイテムがあふれた!", "Your pack overflows!"));
4351                 object_desc(o_name, o_ptr, 0);
4352
4353                 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(INVEN_PACK));
4354
4355                 /* Drop it (carefully) near the player */
4356                 (void)drop_near(o_ptr, 0, p_ptr->y, p_ptr->x);
4357
4358                 /* Modify, Describe, Optimize */
4359                 inven_item_increase(INVEN_PACK, -255);
4360                 inven_item_describe(INVEN_PACK);
4361                 inven_item_optimize(INVEN_PACK);
4362
4363                 handle_stuff();
4364         }
4365 }
4366
4367 /*!
4368  * @brief プレイヤーの行動エネルギーが充填される(=プレイヤーのターンが回る)毎に行われる処理  / process the effects per 100 energy at player speed.
4369  * @return なし
4370  */
4371 static void process_upkeep_with_speed(void)
4372 {
4373         /* Give the player some energy */
4374         if (!load && p_ptr->enchant_energy_need > 0 && !p_ptr->leaving)
4375         {
4376                 p_ptr->enchant_energy_need -= SPEED_TO_ENERGY(p_ptr->pspeed);
4377         }
4378         
4379         /* No current_world_ptr->game_turn yet */
4380         if (p_ptr->enchant_energy_need > 0) return;
4381         
4382         while (p_ptr->enchant_energy_need <= 0)
4383         {
4384                 /* Handle the player song */
4385                 if (!load) check_music();
4386
4387                 /* Hex - Handle the hex spells */
4388                 if (!load) check_hex();
4389                 if (!load) revenge_spell();
4390                 
4391                 /* There is some randomness of needed energy */
4392                 p_ptr->enchant_energy_need += ENERGY_NEED();
4393         }
4394 }
4395
4396 static void process_fishing(void)
4397 {
4398         Term_xtra(TERM_XTRA_DELAY, 10);
4399         if (one_in_(1000))
4400         {
4401                 MONRACE_IDX r_idx;
4402                 bool success = FALSE;
4403                 get_mon_num_prep(monster_is_fishing_target, NULL);
4404                 r_idx = get_mon_num(current_floor_ptr->dun_level ? current_floor_ptr->dun_level : wilderness[p_ptr->wilderness_y][p_ptr->wilderness_x].level);
4405                 msg_print(NULL);
4406                 if (r_idx && one_in_(2))
4407                 {
4408                         POSITION y, x;
4409                         y = p_ptr->y + ddy[p_ptr->fishing_dir];
4410                         x = p_ptr->x + ddx[p_ptr->fishing_dir];
4411                         if (place_monster_aux(0, y, x, r_idx, PM_NO_KAGE))
4412                         {
4413                                 GAME_TEXT m_name[MAX_NLEN];
4414                                 monster_desc(m_name, &current_floor_ptr->m_list[current_floor_ptr->grid_array[y][x].m_idx], 0);
4415                                 msg_format(_("%sが釣れた!", "You have a good catch!"), m_name);
4416                                 success = TRUE;
4417                         }
4418                 }
4419                 if (!success)
4420                 {
4421                         msg_print(_("餌だけ食われてしまった!くっそ~!", "Damn!  The fish stole your bait!"));
4422                 }
4423                 disturb(FALSE, TRUE);
4424         }
4425 }
4426
4427 /*!
4428  * @brief プレイヤーの行動処理 / Process the player
4429  * @return なし
4430  * @note
4431  * Notice the annoying code to handle "pack overflow", which\n
4432  * must come first just in case somebody manages to corrupt\n
4433  * the savefiles by clever use of menu commands or something.\n
4434  */
4435 static void process_player(void)
4436 {
4437         MONSTER_IDX m_idx;
4438
4439         /*** Apply energy ***/
4440
4441         if (p_ptr->hack_mutation)
4442         {
4443                 msg_print(_("何か変わった気がする!", "You feel different!"));
4444
4445                 (void)gain_mutation(p_ptr, 0);
4446                 p_ptr->hack_mutation = FALSE;
4447         }
4448
4449         if (p_ptr->invoking_midnight_curse)
4450         {
4451                 int count = 0;
4452                 activate_ty_curse(FALSE, &count);
4453                 p_ptr->invoking_midnight_curse = FALSE;
4454         }
4455
4456         if (p_ptr->inside_battle)
4457         {
4458                 for(m_idx = 1; m_idx < current_floor_ptr->m_max; m_idx++)
4459                 {
4460                         monster_type *m_ptr = &current_floor_ptr->m_list[m_idx];
4461
4462                         if (!monster_is_valid(m_ptr)) continue;
4463
4464                         m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
4465                         update_monster(m_idx, FALSE);
4466                 }
4467                 prt_time();
4468         }
4469
4470         /* Give the player some energy */
4471         else if (!(load && p_ptr->energy_need <= 0))
4472         {
4473                 p_ptr->energy_need -= SPEED_TO_ENERGY(p_ptr->pspeed);
4474         }
4475
4476         /* No current_world_ptr->game_turn yet */
4477         if (p_ptr->energy_need > 0) return;
4478         if (!command_rep) prt_time();
4479
4480         /*** Check for interupts ***/
4481
4482         /* Complete resting */
4483         if (p_ptr->resting < 0)
4484         {
4485                 /* Basic resting */
4486                 if (p_ptr->resting == COMMAND_ARG_REST_FULL_HEALING)
4487                 {
4488                         /* Stop resting */
4489                         if ((p_ptr->chp == p_ptr->mhp) &&
4490                             (p_ptr->csp >= p_ptr->msp))
4491                         {
4492                                 set_action(ACTION_NONE);
4493                         }
4494                 }
4495
4496                 /* Complete resting */
4497                 else if (p_ptr->resting == COMMAND_ARG_REST_UNTIL_DONE)
4498                 {
4499                         /* Stop resting */
4500                         if ((p_ptr->chp == p_ptr->mhp) &&
4501                             (p_ptr->csp >= p_ptr->msp) &&
4502                             !p_ptr->blind && !p_ptr->confused &&
4503                             !p_ptr->poisoned && !p_ptr->afraid &&
4504                             !p_ptr->stun && !p_ptr->cut &&
4505                             !p_ptr->slow && !p_ptr->paralyzed &&
4506                             !p_ptr->image && !p_ptr->word_recall &&
4507                             !p_ptr->alter_reality)
4508                         {
4509                                 set_action(ACTION_NONE);
4510                         }
4511                 }
4512         }
4513
4514         if (p_ptr->action == ACTION_FISH) process_fishing();
4515
4516         /* Handle "abort" */
4517         if (check_abort)
4518         {
4519                 /* Check for "player abort" (semi-efficiently for resting) */
4520                 if (p_ptr->running || travel.run || command_rep || (p_ptr->action == ACTION_REST) || (p_ptr->action == ACTION_FISH))
4521                 {
4522                         /* Do not wait */
4523                         inkey_scan = TRUE;
4524
4525                         /* Check for a key */
4526                         if (inkey())
4527                         {
4528                                 flush(); /* Flush input */
4529
4530                                 disturb(FALSE, TRUE);
4531
4532                                 /* Hack -- Show a Message */
4533                                 msg_print(_("中断しました。", "Canceled."));
4534                         }
4535                 }
4536         }
4537
4538         if (p_ptr->riding && !p_ptr->confused && !p_ptr->blind)
4539         {
4540                 monster_type *m_ptr = &current_floor_ptr->m_list[p_ptr->riding];
4541                 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4542
4543                 if (MON_CSLEEP(m_ptr))
4544                 {
4545                         GAME_TEXT m_name[MAX_NLEN];
4546
4547                         /* Recover fully */
4548                         (void)set_monster_csleep(p_ptr->riding, 0);
4549                         monster_desc(m_name, m_ptr, 0);
4550                         msg_format(_("%^sを起こした。", "You have waked %s up."), m_name);
4551                 }
4552
4553                 if (MON_STUNNED(m_ptr))
4554                 {
4555                         /* Hack -- Recover from stun */
4556                         if (set_monster_stunned(p_ptr->riding,
4557                                 (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_STUNNED(m_ptr) - 1)))
4558                         {
4559                                 GAME_TEXT m_name[MAX_NLEN];
4560                                 monster_desc(m_name, m_ptr, 0);
4561                                 msg_format(_("%^sを朦朧状態から立ち直らせた。", "%^s is no longer stunned."), m_name);
4562                         }
4563                 }
4564
4565                 if (MON_CONFUSED(m_ptr))
4566                 {
4567                         /* Hack -- Recover from confusion */
4568                         if (set_monster_confused(p_ptr->riding,
4569                                 (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_CONFUSED(m_ptr) - 1)))
4570                         {
4571                                 GAME_TEXT m_name[MAX_NLEN];
4572                                 monster_desc(m_name, m_ptr, 0);
4573                                 msg_format(_("%^sを混乱状態から立ち直らせた。", "%^s is no longer confused."), m_name);
4574                         }
4575                 }
4576
4577                 if (MON_MONFEAR(m_ptr))
4578                 {
4579                         /* Hack -- Recover from fear */
4580                         if(set_monster_monfear(p_ptr->riding,
4581                                 (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_MONFEAR(m_ptr) - 1)))
4582                         {
4583                                 GAME_TEXT m_name[MAX_NLEN];
4584                                 monster_desc(m_name, m_ptr, 0);
4585                                 msg_format(_("%^sを恐怖から立ち直らせた。", "%^s is no longer fear."), m_name);
4586                         }
4587                 }
4588
4589                 handle_stuff();
4590         }
4591         
4592         load = FALSE;
4593
4594         /* Fast */
4595         if (p_ptr->lightspeed)
4596         {
4597                 (void)set_lightspeed(p_ptr->lightspeed - 1, TRUE);
4598         }
4599         if ((p_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
4600         {
4601                 if(P_PTR_KI < 40) P_PTR_KI = 0;
4602                 else P_PTR_KI -= 40;
4603                 p_ptr->update |= (PU_BONUS);
4604         }
4605         if (p_ptr->action == ACTION_LEARN)
4606         {
4607                 s32b cost = 0L;
4608                 u32b cost_frac = (p_ptr->msp + 30L) * 256L;
4609
4610                 /* Convert the unit (1/2^16) to (1/2^32) */
4611                 s64b_LSHIFT(cost, cost_frac, 16);
4612  
4613                 if (s64b_cmp(p_ptr->csp, p_ptr->csp_frac, cost, cost_frac) < 0)
4614                 {
4615                         /* Mana run out */
4616                         p_ptr->csp = 0;
4617                         p_ptr->csp_frac = 0;
4618                         set_action(ACTION_NONE);
4619                 }
4620                 else
4621                 {
4622                         /* Reduce mana */
4623                         s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), cost, cost_frac);
4624                 }
4625                 p_ptr->redraw |= PR_MANA;
4626         }
4627
4628         if (p_ptr->special_defense & KATA_MASK)
4629         {
4630                 if (p_ptr->special_defense & KATA_MUSOU)
4631                 {
4632                         if (p_ptr->csp < 3)
4633                         {
4634                                 set_action(ACTION_NONE);
4635                         }
4636                         else
4637                         {
4638                                 p_ptr->csp -= 2;
4639                                 p_ptr->redraw |= (PR_MANA);
4640                         }
4641                 }
4642         }
4643
4644         /*** Handle actual user input ***/
4645
4646         /* Repeat until out of energy */
4647         while (p_ptr->energy_need <= 0)
4648         {
4649                 p_ptr->window |= PW_PLAYER;
4650                 p_ptr->sutemi = FALSE;
4651                 p_ptr->counter = FALSE;
4652                 p_ptr->now_damaged = FALSE;
4653
4654                 handle_stuff();
4655
4656                 /* Place the cursor on the player */
4657                 move_cursor_relative(p_ptr->y, p_ptr->x);
4658
4659                 /* Refresh (optional) */
4660                 if (fresh_before) Term_fresh();
4661
4662                 /* Hack -- Pack Overflow */
4663                 pack_overflow();
4664
4665                 /* Hack -- cancel "lurking browse mode" */
4666                 if (!command_new) command_see = FALSE;
4667
4668                 /* Assume free current_world_ptr->game_turn */
4669                 free_turn(p_ptr);
4670
4671                 if (p_ptr->inside_battle)
4672                 {
4673                         /* Place the cursor on the player */
4674                         move_cursor_relative(p_ptr->y, p_ptr->x);
4675
4676                         command_cmd = SPECIAL_KEY_BUILDING;
4677
4678                         /* Process the command */
4679                         process_command();
4680                 }
4681
4682                 /* Paralyzed or Knocked Out */
4683                 else if (p_ptr->paralyzed || (p_ptr->stun >= 100))
4684                 {
4685                         take_turn(p_ptr, 100);
4686                 }
4687
4688                 /* Resting */
4689                 else if (p_ptr->action == ACTION_REST)
4690                 {
4691                         /* Timed rest */
4692                         if (p_ptr->resting > 0)
4693                         {
4694                                 /* Reduce rest count */
4695                                 p_ptr->resting--;
4696
4697                                 if (!p_ptr->resting) set_action(ACTION_NONE);
4698                                 p_ptr->redraw |= (PR_STATE);
4699                         }
4700
4701                         take_turn(p_ptr, 100);
4702                 }
4703
4704                 /* Fishing */
4705                 else if (p_ptr->action == ACTION_FISH)
4706                 {
4707                         take_turn(p_ptr, 100);
4708                 }
4709
4710                 /* Running */
4711                 else if (p_ptr->running)
4712                 {
4713                         /* Take a step */
4714                         run_step(0);
4715                 }
4716
4717 #ifdef TRAVEL
4718                 /* Traveling */
4719                 else if (travel.run)
4720                 {
4721                         /* Take a step */
4722                         travel_step();
4723                 }
4724 #endif
4725
4726                 /* Repeated command */
4727                 else if (command_rep)
4728                 {
4729                         /* Count this execution */
4730                         command_rep--;
4731
4732                         p_ptr->redraw |= (PR_STATE);
4733                         handle_stuff();
4734
4735                         /* Hack -- Assume messages were seen */
4736                         msg_flag = FALSE;
4737
4738                         /* Clear the top line */
4739                         prt("", 0, 0);
4740
4741                         /* Process the command */
4742                         process_command();
4743                 }
4744
4745                 /* Normal command */
4746                 else
4747                 {
4748                         /* Place the cursor on the player */
4749                         move_cursor_relative(p_ptr->y, p_ptr->x);
4750
4751                         can_save = TRUE;
4752                         /* Get a command (normal) */
4753                         request_command(FALSE);
4754                         can_save = FALSE;
4755
4756                         /* Process the command */
4757                         process_command();
4758                 }
4759
4760                 /* Hack -- Pack Overflow */
4761                 pack_overflow();
4762
4763                 /*** Clean up ***/
4764
4765                 /* Significant */
4766                 if (p_ptr->energy_use)
4767                 {
4768                         /* Use some energy */
4769                         if (p_ptr->timewalk || p_ptr->energy_use > 400)
4770                         {
4771                                 /* The Randomness is irrelevant */
4772                                 p_ptr->energy_need += p_ptr->energy_use * TURNS_PER_TICK / 10;
4773                         }
4774                         else
4775                         {
4776                                 /* There is some randomness of needed energy */
4777                                 p_ptr->energy_need += (s16b)((s32b)p_ptr->energy_use * ENERGY_NEED() / 100L);
4778                         }
4779
4780                         /* Hack -- constant hallucination */
4781                         if (p_ptr->image) p_ptr->redraw |= (PR_MAP);
4782
4783                         /* Shimmer multi-hued monsters */
4784                         for (m_idx = 1; m_idx < current_floor_ptr->m_max; m_idx++)
4785                         {
4786                                 monster_type *m_ptr;
4787                                 monster_race *r_ptr;
4788
4789                                 m_ptr = &current_floor_ptr->m_list[m_idx];
4790                                 if (!monster_is_valid(m_ptr)) continue;
4791
4792                                 /* Skip unseen monsters */
4793                                 if (!m_ptr->ml) continue;
4794
4795                                 /* Access the monster race */
4796                                 r_ptr = &r_info[m_ptr->ap_r_idx];
4797
4798                                 /* Skip non-multi-hued monsters */
4799                                 if (!(r_ptr->flags1 & (RF1_ATTR_MULTI | RF1_SHAPECHANGER)))
4800                                         continue;
4801
4802                                 /* Redraw regardless */
4803                                 lite_spot(m_ptr->fy, m_ptr->fx);
4804                         }
4805
4806
4807                         /* Handle monster detection */
4808                         if (repair_monsters)
4809                         {
4810                                 /* Reset the flag */
4811                                 repair_monsters = FALSE;
4812
4813                                 /* Rotate detection flags */
4814                                 for (m_idx = 1; m_idx < current_floor_ptr->m_max; m_idx++)
4815                                 {
4816                                         monster_type *m_ptr;
4817                                         m_ptr = &current_floor_ptr->m_list[m_idx];
4818                                         if (!monster_is_valid(m_ptr)) continue;
4819
4820                                         /* Nice monsters get mean */
4821                                         if (m_ptr->mflag & MFLAG_NICE)
4822                                         {
4823                                                 /* Nice monsters get mean */
4824                                                 m_ptr->mflag &= ~(MFLAG_NICE);
4825                                         }
4826
4827                                         /* Handle memorized monsters */
4828                                         if (m_ptr->mflag2 & MFLAG2_MARK)
4829                                         {
4830                                                 /* Maintain detection */
4831                                                 if (m_ptr->mflag2 & MFLAG2_SHOW)
4832                                                 {
4833                                                         /* Forget flag */
4834                                                         m_ptr->mflag2 &= ~(MFLAG2_SHOW);
4835
4836                                                         /* Still need repairs */
4837                                                         repair_monsters = TRUE;
4838                                                 }
4839
4840                                                 /* Remove detection */
4841                                                 else
4842                                                 {
4843                                                         /* Forget flag */
4844                                                         m_ptr->mflag2 &= ~(MFLAG2_MARK);
4845
4846                                                         /* Assume invisible */
4847                                                         m_ptr->ml = FALSE;
4848                                                         update_monster(m_idx, FALSE);
4849
4850                                                         if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
4851                                                         if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
4852
4853                                                         /* Redraw regardless */
4854                                                         lite_spot(m_ptr->fy, m_ptr->fx);
4855                                                 }
4856                                         }
4857                                 }
4858                         }
4859                         if (p_ptr->pclass == CLASS_IMITATOR)
4860                         {
4861                                 int j;
4862                                 if (p_ptr->mane_num > (p_ptr->lev > 44 ? 3 : p_ptr->lev > 29 ? 2 : 1))
4863                                 {
4864                                         p_ptr->mane_num--;
4865                                         for (j = 0; j < p_ptr->mane_num; j++)
4866                                         {
4867                                                 p_ptr->mane_spell[j] = p_ptr->mane_spell[j + 1];
4868                                                 p_ptr->mane_dam[j] = p_ptr->mane_dam[j + 1];
4869                                         }
4870                                 }
4871                                 p_ptr->new_mane = FALSE;
4872                                 p_ptr->redraw |= (PR_IMITATION);
4873                         }
4874                         if (p_ptr->action == ACTION_LEARN)
4875                         {
4876                                 p_ptr->new_mane = FALSE;
4877                                 p_ptr->redraw |= (PR_STATE);
4878                         }
4879
4880                         if (p_ptr->timewalk && (p_ptr->energy_need > - 1000))
4881                         {
4882
4883                                 p_ptr->redraw |= (PR_MAP);
4884                                 p_ptr->update |= (PU_MONSTERS);
4885                                 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
4886
4887                                 msg_print(_("「時は動きだす…」", "You feel time flowing around you once more."));
4888                                 msg_print(NULL);
4889                                 p_ptr->timewalk = FALSE;
4890                                 p_ptr->energy_need = ENERGY_NEED();
4891
4892                                 handle_stuff();
4893                         }
4894                 }
4895
4896                 /* Hack -- notice death */
4897                 if (!p_ptr->playing || p_ptr->is_dead)
4898                 {
4899                         p_ptr->timewalk = FALSE;
4900                         break;
4901                 }
4902
4903                 /* Sniper */
4904                 if (p_ptr->energy_use && p_ptr->reset_concent) reset_concentration(TRUE);
4905
4906                 /* Handle "leaving" */
4907                 if (p_ptr->leaving) break;
4908         }
4909
4910         /* Update scent trail */
4911         update_smell();
4912 }
4913
4914 /*!
4915  * @brief 現在プレイヤーがいるダンジョンの全体処理 / Interact with the current dungeon level.
4916  * @return なし
4917  * @details
4918  * <p>
4919  * この関数から現在の階層を出る、プレイヤーがキャラが死ぬ、
4920  * ゲームを終了するかのいずれかまでループする。
4921  * </p>
4922  * <p>
4923  * This function will not exit until the level is completed,\n
4924  * the user dies, or the game is terminated.\n
4925  * </p>
4926  */
4927 static void dungeon(bool load_game)
4928 {
4929         int quest_num = 0;
4930
4931         /* Set the base level */
4932         current_floor_ptr->base_level = current_floor_ptr->dun_level;
4933
4934         /* Reset various flags */
4935         current_world_ptr->is_loading_now = FALSE;
4936
4937         /* Not leaving */
4938         p_ptr->leaving = FALSE;
4939
4940         /* Reset the "command" vars */
4941         command_cmd = 0;
4942
4943 #if 0 /* Don't reset here --- It's used for Arena */
4944         command_new = 0;
4945 #endif
4946
4947         command_rep = 0;
4948         command_arg = 0;
4949         command_dir = 0;
4950
4951
4952         /* Cancel the target */
4953         target_who = 0;
4954         p_ptr->pet_t_m_idx = 0;
4955         p_ptr->riding_t_m_idx = 0;
4956         p_ptr->ambush_flag = FALSE;
4957
4958         /* Cancel the health bar */
4959         health_track(0);
4960
4961         /* Check visual effects */
4962         repair_monsters = TRUE;
4963         repair_objects = TRUE;
4964
4965
4966         disturb(TRUE, TRUE);
4967
4968         /* Get index of current quest (if any) */
4969         quest_num = quest_number(current_floor_ptr->dun_level);
4970
4971         /* Inside a quest? */
4972         if (quest_num)
4973         {
4974                 /* Mark the quest monster */
4975                 r_info[quest[quest_num].r_idx].flags1 |= RF1_QUESTOR;
4976         }
4977
4978         /* Track maximum player level */
4979         if (p_ptr->max_plv < p_ptr->lev)
4980         {
4981                 p_ptr->max_plv = p_ptr->lev;
4982         }
4983
4984
4985         /* Track maximum dungeon level (if not in quest -KMW-) */
4986         if ((max_dlv[p_ptr->dungeon_idx] < current_floor_ptr->dun_level) && !p_ptr->inside_quest)
4987         {
4988                 max_dlv[p_ptr->dungeon_idx] = current_floor_ptr->dun_level;
4989                 if (record_maxdepth) do_cmd_write_nikki(NIKKI_MAXDEAPTH, current_floor_ptr->dun_level, NULL);
4990         }
4991
4992         (void)calculate_upkeep();
4993
4994         /* Validate the panel */
4995         panel_bounds_center();
4996
4997         /* Verify the panel */
4998         verify_panel();
4999
5000         msg_erase();
5001
5002
5003         /* Enter "xtra" mode */
5004         current_world_ptr->character_xtra = TRUE;
5005
5006         p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER | PW_MONSTER | PW_OVERHEAD | PW_DUNGEON);
5007         p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_EQUIPPY | PR_MAP);
5008         p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS | PU_VIEW | PU_LITE | PU_MON_LITE | PU_TORCH | PU_MONSTERS | PU_DISTANCE | PU_FLOW);
5009
5010         handle_stuff();
5011
5012         /* Leave "xtra" mode */
5013         current_world_ptr->character_xtra = FALSE;
5014
5015         p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
5016         p_ptr->update |= (PU_COMBINE | PU_REORDER);
5017         handle_stuff();
5018         Term_fresh();
5019
5020         if (quest_num && (is_fixed_quest_idx(quest_num) &&
5021             !((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT) ||
5022             !(quest[quest_num].flags & QUEST_FLAG_PRESET)))) do_cmd_feeling();
5023
5024         if (p_ptr->inside_battle)
5025         {
5026                 if (load_game)
5027                 {
5028                         p_ptr->energy_need = 0;
5029                         update_gambling_monsters();
5030                 }
5031                 else
5032                 {
5033                         msg_print(_("試合開始!", "Ready..Fight!"));
5034                         msg_print(NULL);
5035                 }
5036         }
5037
5038         if ((p_ptr->pclass == CLASS_BARD) && (SINGING_SONG_EFFECT(p_ptr) > MUSIC_DETECT))
5039                 SINGING_SONG_EFFECT(p_ptr) = MUSIC_DETECT;
5040
5041         /* Hack -- notice death or departure */
5042         if (!p_ptr->playing || p_ptr->is_dead) return;
5043
5044         /* Print quest message if appropriate */
5045         if (!p_ptr->inside_quest && (p_ptr->dungeon_idx == DUNGEON_ANGBAND))
5046         {
5047                 quest_discovery(random_quest_number(current_floor_ptr->dun_level));
5048                 p_ptr->inside_quest = random_quest_number(current_floor_ptr->dun_level);
5049         }
5050         if ((current_floor_ptr->dun_level == d_info[p_ptr->dungeon_idx].maxdepth) && d_info[p_ptr->dungeon_idx].final_guardian)
5051         {
5052                 if (r_info[d_info[p_ptr->dungeon_idx].final_guardian].max_num)
5053 #ifdef JP
5054                         msg_format("この階には%sの主である%sが棲んでいる。",
5055                                    d_name+d_info[p_ptr->dungeon_idx].name, 
5056                                    r_name+r_info[d_info[p_ptr->dungeon_idx].final_guardian].name);
5057 #else
5058                         msg_format("%^s lives in this level as the keeper of %s.",
5059                                            r_name+r_info[d_info[p_ptr->dungeon_idx].final_guardian].name, 
5060                                            d_name+d_info[p_ptr->dungeon_idx].name);
5061 #endif
5062         }
5063
5064         if (!load_game && (p_ptr->special_defense & NINJA_S_STEALTH)) set_superstealth(FALSE);
5065
5066         /*** Process this dungeon level ***/
5067
5068         /* Reset the monster generation level */
5069         current_floor_ptr->monster_level = current_floor_ptr->base_level;
5070
5071         /* Reset the object generation level */
5072         current_floor_ptr->object_level = current_floor_ptr->base_level;
5073
5074         current_world_ptr->is_loading_now = TRUE;
5075
5076         if (p_ptr->energy_need > 0 && !p_ptr->inside_battle &&
5077             (current_floor_ptr->dun_level || p_ptr->leaving_dungeon || p_ptr->inside_arena))
5078                 p_ptr->energy_need = 0;
5079
5080         /* Not leaving dungeon */
5081         p_ptr->leaving_dungeon = FALSE;
5082
5083         /* Initialize monster process */
5084         mproc_init();
5085
5086         /* Main loop */
5087         while (TRUE)
5088         {
5089                 /* Hack -- Compact the monster list occasionally */
5090                 if ((current_floor_ptr->m_cnt + 32 > current_floor_ptr->max_m_idx) && !p_ptr->inside_battle) compact_monsters(64);
5091
5092                 /* Hack -- Compress the monster list occasionally */
5093                 if ((current_floor_ptr->m_cnt + 32 < current_floor_ptr->m_max) && !p_ptr->inside_battle) compact_monsters(0);
5094
5095
5096                 /* Hack -- Compact the object list occasionally */
5097                 if (current_floor_ptr->o_cnt + 32 > current_floor_ptr->max_o_idx) compact_objects(64);
5098
5099                 /* Hack -- Compress the object list occasionally */
5100                 if (current_floor_ptr->o_cnt + 32 < current_floor_ptr->o_max) compact_objects(0);
5101
5102                 /* Process the player */
5103                 process_player();
5104                 process_upkeep_with_speed();
5105
5106                 handle_stuff();
5107
5108                 /* Hack -- Hilite the player */
5109                 move_cursor_relative(p_ptr->y, p_ptr->x);
5110
5111                 /* Optional fresh */
5112                 if (fresh_after) Term_fresh();
5113
5114                 /* Hack -- Notice death or departure */
5115                 if (!p_ptr->playing || p_ptr->is_dead) break;
5116
5117                 /* Process all of the monsters */
5118                 process_monsters();
5119
5120                 handle_stuff();
5121
5122                 /* Hack -- Hilite the player */
5123                 move_cursor_relative(p_ptr->y, p_ptr->x);
5124
5125                 /* Optional fresh */
5126                 if (fresh_after) Term_fresh();
5127
5128                 /* Hack -- Notice death or departure */
5129                 if (!p_ptr->playing || p_ptr->is_dead) break;
5130
5131                 /* Process the world */
5132                 process_world();
5133
5134                 handle_stuff();
5135
5136                 /* Hack -- Hilite the player */
5137                 move_cursor_relative(p_ptr->y, p_ptr->x);
5138
5139                 /* Optional fresh */
5140                 if (fresh_after) Term_fresh();
5141
5142                 /* Hack -- Notice death or departure */
5143                 if (!p_ptr->playing || p_ptr->is_dead) break;
5144
5145                 /* Count game turns */
5146                 current_world_ptr->game_turn++;
5147
5148                 if (current_world_ptr->dungeon_turn < current_world_ptr->dungeon_turn_limit)
5149                 {
5150                         if (!p_ptr->wild_mode || wild_regen) current_world_ptr->dungeon_turn++;
5151                         else if (p_ptr->wild_mode && !(current_world_ptr->game_turn % ((MAX_HGT + MAX_WID) / 2))) current_world_ptr->dungeon_turn++;
5152                 }
5153
5154                 prevent_turn_overflow();
5155
5156                 /* Handle "leaving" */
5157                 if (p_ptr->leaving) break;
5158
5159                 if (wild_regen) wild_regen--;
5160         }
5161
5162         /* Inside a quest and non-unique questor? */
5163         if (quest_num && !(r_info[quest[quest_num].r_idx].flags1 & RF1_UNIQUE))
5164         {
5165                 /* Un-mark the quest monster */
5166                 r_info[quest[quest_num].r_idx].flags1 &= ~RF1_QUESTOR;
5167         }
5168
5169         /* Not save-and-quit and not dead? */
5170         if (p_ptr->playing && !p_ptr->is_dead)
5171         {
5172                 /*
5173                  * Maintain Unique monsters and artifact, save current
5174                  * floor, then prepare next floor
5175                  */
5176                 leave_floor(p_ptr->change_floor_mode);
5177
5178                 /* Forget the flag */
5179                 reinit_wilderness = FALSE;
5180         }
5181
5182         /* Write about current level on the play record once per level */
5183         write_level = TRUE;
5184 }
5185
5186
5187 /*!
5188  * @brief 全ユーザプロファイルをロードする / Load some "user pref files"
5189  * @return なし
5190  * @note
5191  * Modified by Arcum Dagsson to support
5192  * separate macro files for different realms.
5193  */
5194 static void load_all_pref_files(void)
5195 {
5196         char buf[1024];
5197
5198         /* Access the "user" pref file */
5199         sprintf(buf, "user.prf");
5200
5201         /* Process that file */
5202         process_pref_file(buf);
5203
5204         /* Access the "user" system pref file */
5205         sprintf(buf, "user-%s.prf", ANGBAND_SYS);
5206
5207         /* Process that file */
5208         process_pref_file(buf);
5209
5210         /* Access the "race" pref file */
5211         sprintf(buf, "%s.prf", rp_ptr->title);
5212
5213         /* Process that file */
5214         process_pref_file(buf);
5215
5216         /* Access the "class" pref file */
5217         sprintf(buf, "%s.prf", cp_ptr->title);
5218
5219         /* Process that file */
5220         process_pref_file(buf);
5221
5222         /* Access the "character" pref file */
5223         sprintf(buf, "%s.prf", p_ptr->base_name);
5224
5225         /* Process that file */
5226         process_pref_file(buf);
5227
5228         /* Access the "realm 1" pref file */
5229         if (p_ptr->realm1 != REALM_NONE)
5230         {
5231                 sprintf(buf, "%s.prf", realm_names[p_ptr->realm1]);
5232
5233                 /* Process that file */
5234                 process_pref_file(buf);
5235         }
5236
5237         /* Access the "realm 2" pref file */
5238         if (p_ptr->realm2 != REALM_NONE)
5239         {
5240                 sprintf(buf, "%s.prf", realm_names[p_ptr->realm2]);
5241
5242                 /* Process that file */
5243                 process_pref_file(buf);
5244         }
5245
5246
5247         /* Load an autopick preference file */
5248         autopick_load_pref(FALSE);
5249 }
5250
5251 /*!
5252  * @brief 1ゲームプレイの主要ルーチン / Actually play a game
5253  * @return なし
5254  * @note
5255  * If the "new_game" parameter is true, then, after loading the
5256  * savefile, we will commit suicide, if necessary, to allow the
5257  * player to start a new game.
5258  */
5259 void play_game(bool new_game)
5260 {
5261         MONSTER_IDX i;
5262         bool load_game = TRUE;
5263         bool init_random_seed = FALSE;
5264
5265 #ifdef CHUUKEI
5266         if (chuukei_client)
5267         {
5268                 reset_visuals();
5269                 browse_chuukei();
5270                 return;
5271         }
5272
5273         else if (chuukei_server)
5274         {
5275                 prepare_chuukei_hooks();
5276         }
5277 #endif
5278
5279         if (browsing_movie)
5280         {
5281                 reset_visuals();
5282                 browse_movie();
5283                 return;
5284         }
5285
5286         p_ptr->hack_mutation = FALSE;
5287
5288         /* Hack -- Character is "icky" */
5289         current_world_ptr->character_icky = TRUE;
5290
5291         /* Make sure main term is active */
5292         Term_activate(angband_term[0]);
5293
5294         /* Initialise the resize hooks */
5295         angband_term[0]->resize_hook = resize_map;
5296
5297         for (i = 1; i < 8; i++)
5298         {
5299                 /* Does the term exist? */
5300                 if (angband_term[i])
5301                 {
5302                         /* Add the redraw on resize hook */
5303                         angband_term[i]->resize_hook = redraw_window;
5304                 }
5305         }
5306
5307         /* Hack -- current_world_ptr->game_turn off the cursor */
5308         (void)Term_set_cursor(0);
5309
5310
5311         /* Attempt to load */
5312         if (!load_player())
5313         {
5314                 quit(_("セーブファイルが壊れています", "broken savefile"));
5315         }
5316
5317         /* Extract the options */
5318         extract_option_vars();
5319
5320         /* Report waited score */
5321         if (p_ptr->wait_report_score)
5322         {
5323                 char buf[1024];
5324                 bool success;
5325
5326                 if (!get_check_strict(_("待機していたスコア登録を今行ないますか?", "Do you register score now? "), CHECK_NO_HISTORY))
5327                         quit(0);
5328
5329                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
5330                 update_creature(p_ptr);
5331
5332                 p_ptr->is_dead = TRUE;
5333
5334                 current_world_ptr->start_time = (u32b)time(NULL);
5335
5336                 /* No suspending now */
5337                 signals_ignore_tstp();
5338                 
5339                 /* Hack -- Character is now "icky" */
5340                 current_world_ptr->character_icky = TRUE;
5341
5342                 /* Build the filename */
5343                 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
5344
5345                 /* Open the high score file, for reading/writing */
5346                 highscore_fd = fd_open(buf, O_RDWR);
5347
5348                 /* 町名消失バグ対策(#38205)のためここで世界マップ情報を読み出す */
5349                 process_dungeon_file("w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
5350
5351                 /* Handle score, show Top scores */
5352                 success = send_world_score(TRUE);
5353
5354                 if (!success && !get_check_strict(_("スコア登録を諦めますか?", "Do you give up score registration? "), CHECK_NO_HISTORY))
5355                 {
5356                         prt(_("引き続き待機します。", "standing by for future registration..."), 0, 0);
5357                         (void)inkey();
5358                 }
5359                 else
5360                 {
5361                         p_ptr->wait_report_score = FALSE;
5362                         top_twenty();
5363                         if (!save_player()) msg_print(_("セーブ失敗!", "death save failed!"));
5364                 }
5365                 /* Shut the high score file */
5366                 (void)fd_close(highscore_fd);
5367
5368                 /* Forget the high score fd */
5369                 highscore_fd = -1;
5370                 
5371                 /* Allow suspending now */
5372                 signals_handle_tstp();
5373
5374                 quit(0);
5375         }
5376
5377         current_world_ptr->creating_savefile = new_game;
5378
5379         /* Nothing loaded */
5380         if (!current_world_ptr->character_loaded)
5381         {
5382                 /* Make new player */
5383                 new_game = TRUE;
5384
5385                 /* The dungeon is not ready */
5386                 current_world_ptr->character_dungeon = FALSE;
5387
5388                 /* Prepare to init the RNG */
5389                 init_random_seed = TRUE;
5390
5391                 /* Initialize the saved floors data */
5392                 init_saved_floors(FALSE);
5393         }
5394
5395         /* Old game is loaded.  But new game is requested. */
5396         else if (new_game)
5397         {
5398                 /* Initialize the saved floors data */
5399                 init_saved_floors(TRUE);
5400         }
5401
5402         /* Process old character */
5403         if (!new_game)
5404         {
5405                 /* Process the player name */
5406                 process_player_name(FALSE);
5407         }
5408
5409         /* Init the RNG */
5410         if (init_random_seed)
5411         {
5412                 Rand_state_init();
5413         }
5414
5415         /* Roll new character */
5416         if (new_game)
5417         {
5418                 /* The dungeon is not ready */
5419                 current_world_ptr->character_dungeon = FALSE;
5420
5421                 /* Start in town */
5422                 current_floor_ptr->dun_level = 0;
5423                 p_ptr->inside_quest = 0;
5424                 p_ptr->inside_arena = FALSE;
5425                 p_ptr->inside_battle = FALSE;
5426
5427                 write_level = TRUE;
5428
5429                 /* Hack -- seed for flavors */
5430                 current_world_ptr->seed_flavor = randint0(0x10000000);
5431
5432                 /* Hack -- seed for town layout */
5433                 current_world_ptr->seed_town = randint0(0x10000000);
5434
5435                 /* Roll up a new character */
5436                 player_birth();
5437
5438                 counts_write(2,0);
5439                 p_ptr->count = 0;
5440
5441                 load = FALSE;
5442
5443                 determine_bounty_uniques();
5444                 determine_today_mon(FALSE);
5445
5446                 /* Initialize object array */
5447                 wipe_o_list();
5448         }
5449         else
5450         {
5451                 write_level = FALSE;
5452
5453                 do_cmd_write_nikki(NIKKI_GAMESTART, 1, 
5454                                           _("                            ----ゲーム再開----",
5455                                                 "                            ---- Restart Game ----"));
5456
5457 /*
5458  * 1.0.9 以前はセーブ前に p_ptr->riding = -1 としていたので、再設定が必要だった。
5459  * もう不要だが、以前のセーブファイルとの互換のために残しておく。
5460  */
5461                 if (p_ptr->riding == -1)
5462                 {
5463                         p_ptr->riding = 0;
5464                         for (i = current_floor_ptr->m_max; i > 0; i--)
5465                         {
5466                                 if (player_bold(current_floor_ptr->m_list[i].fy, current_floor_ptr->m_list[i].fx))
5467                                 {
5468                                         p_ptr->riding = i;
5469                                         break;
5470                                 }
5471                         }
5472                 }
5473         }
5474
5475         current_world_ptr->creating_savefile = FALSE;
5476
5477         p_ptr->teleport_town = FALSE;
5478         p_ptr->sutemi = FALSE;
5479         current_world_ptr->timewalk_m_idx = 0;
5480         p_ptr->now_damaged = FALSE;
5481         now_message = 0;
5482         current_world_ptr->start_time = time(NULL) - 1;
5483         record_o_name[0] = '\0';
5484
5485         /* Reset map panel */
5486         panel_row_min = current_floor_ptr->height;
5487         panel_col_min = current_floor_ptr->width;
5488
5489         /* Sexy gal gets bonus to maximum weapon skill of whip */
5490         if (p_ptr->pseikaku == SEIKAKU_SEXY)
5491                 s_info[p_ptr->pclass].w_max[TV_HAFTED-TV_WEAPON_BEGIN][SV_WHIP] = WEAPON_EXP_MASTER;
5492
5493         /* Fill the arrays of floors and walls in the good proportions */
5494         set_floor_and_wall(p_ptr->dungeon_idx);
5495
5496         /* Flavor the objects */
5497         flavor_init();
5498
5499         /* Flash a message */
5500         prt(_("お待ち下さい...", "Please wait..."), 0, 0);
5501
5502         /* Flush the message */
5503         Term_fresh();
5504
5505
5506         /* Hack -- Enter wizard mode */
5507         if (arg_wizard)
5508         {
5509                 if (enter_wizard_mode())
5510                 {
5511                         p_ptr->wizard = TRUE;
5512
5513                         if (p_ptr->is_dead || !p_ptr->y || !p_ptr->x)
5514                         {
5515                                 /* Initialize the saved floors data */
5516                                 init_saved_floors(TRUE);
5517
5518                                 /* Avoid crash */
5519                                 p_ptr->inside_quest = 0;
5520
5521                                 /* Avoid crash in update_view() */
5522                                 p_ptr->y = p_ptr->x = 10;
5523                         }
5524                 }
5525                 else if (p_ptr->is_dead)
5526                 {
5527                         quit("Already dead.");
5528                 }
5529         }
5530
5531         /* Initialize the town-buildings if necessary */
5532         if (!current_floor_ptr->dun_level && !p_ptr->inside_quest)
5533         {
5534                 process_dungeon_file("w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
5535                 init_flags = INIT_ONLY_BUILDINGS;
5536                 process_dungeon_file("t_info.txt", 0, 0, MAX_HGT, MAX_WID);
5537                 select_floor_music();
5538         }
5539
5540         /* Generate a dungeon level if needed */
5541         if (!current_world_ptr->character_dungeon)
5542         {
5543                 change_floor(p_ptr->change_floor_mode);
5544         }
5545         else
5546         {
5547                 /* HACK -- Restore from panic-save */
5548                 if (p_ptr->panic_save)
5549                 {
5550                         /* No player?  -- Try to regenerate floor */
5551                         if (!p_ptr->y || !p_ptr->x)
5552                         {
5553                                 msg_print(_("プレイヤーの位置がおかしい。フロアを再生成します。", "What a strange player location.  Regenerate the dungeon floor."));
5554                                 change_floor(p_ptr->change_floor_mode);
5555                         }
5556
5557                         /* Still no player?  -- Try to locate random place */
5558                         if (!p_ptr->y || !p_ptr->x) p_ptr->y = p_ptr->x = 10;
5559
5560                         /* No longer in panic */
5561                         p_ptr->panic_save = 0;
5562                 }
5563         }
5564
5565         /* Character is now "complete" */
5566         current_world_ptr->character_generated = TRUE;
5567
5568
5569         /* Hack -- Character is no longer "icky" */
5570         current_world_ptr->character_icky = FALSE;
5571
5572
5573         if (new_game)
5574         {
5575                 char buf[80];
5576                 sprintf(buf, _("%sに降り立った。", "You are standing in the %s."), map_name());
5577                 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, buf);
5578         }
5579
5580
5581         /* Start game */
5582         p_ptr->playing = TRUE;
5583
5584         /* Reset the visual mappings */
5585         reset_visuals();
5586
5587         /* Load the "pref" files */
5588         load_all_pref_files();
5589
5590         /* Give startup outfit (after loading pref files) */
5591         if (new_game)
5592         {
5593                 player_outfit();
5594         }
5595
5596         /* React to changes */
5597         Term_xtra(TERM_XTRA_REACT, 0);
5598
5599         p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
5600         p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
5601         handle_stuff();
5602
5603         /* Set or clear "rogue_like_commands" if requested */
5604         if (arg_force_original) rogue_like_commands = FALSE;
5605         if (arg_force_roguelike) rogue_like_commands = TRUE;
5606
5607         /* Hack -- Enforce "delayed death" */
5608         if (p_ptr->chp < 0) p_ptr->is_dead = TRUE;
5609
5610         if (p_ptr->prace == RACE_ANDROID) calc_android_exp();
5611
5612         if (new_game && ((p_ptr->pclass == CLASS_CAVALRY) || (p_ptr->pclass == CLASS_BEASTMASTER)))
5613         {
5614                 monster_type *m_ptr;
5615                 MONRACE_IDX pet_r_idx = ((p_ptr->pclass == CLASS_CAVALRY) ? MON_HORSE : MON_YASE_HORSE);
5616                 monster_race *r_ptr = &r_info[pet_r_idx];
5617                 place_monster_aux(0, p_ptr->y, p_ptr->x - 1, pet_r_idx,
5618                                   (PM_FORCE_PET | PM_NO_KAGE));
5619                 m_ptr = &current_floor_ptr->m_list[hack_m_idx_ii];
5620                 m_ptr->mspeed = r_ptr->speed;
5621                 m_ptr->maxhp = r_ptr->hdice*(r_ptr->hside+1)/2;
5622                 m_ptr->max_maxhp = m_ptr->maxhp;
5623                 m_ptr->hp = r_ptr->hdice*(r_ptr->hside+1)/2;
5624                 m_ptr->dealt_damage = 0;
5625                 m_ptr->energy_need = ENERGY_NEED() + ENERGY_NEED();
5626         }
5627
5628         (void)combine_and_reorder_home(STORE_HOME);
5629         (void)combine_and_reorder_home(STORE_MUSEUM);
5630
5631         select_floor_music();
5632
5633         /* Process */
5634         while (TRUE)
5635         {
5636                 /* Process the level */
5637                 dungeon(load_game);
5638
5639                 /* Hack -- prevent "icky" message */
5640                 current_world_ptr->character_xtra = TRUE;
5641
5642                 handle_stuff();
5643
5644                 current_world_ptr->character_xtra = FALSE;
5645
5646                 /* Cancel the target */
5647                 target_who = 0;
5648
5649                 /* Cancel the health bar */
5650                 health_track(0);
5651
5652                 forget_lite();
5653                 forget_view();
5654                 clear_mon_lite();
5655
5656                 /* Handle "quit and save" */
5657                 if (!p_ptr->playing && !p_ptr->is_dead) break;
5658
5659                 /* Erase the old current_floor_ptr->grid_array */
5660                 wipe_o_list();
5661                 if (!p_ptr->is_dead) wipe_m_list();
5662
5663
5664                 msg_print(NULL);
5665
5666                 load_game = FALSE;
5667
5668                 /* Accidental Death */
5669                 if (p_ptr->playing && p_ptr->is_dead)
5670                 {
5671                         if (p_ptr->inside_arena)
5672                         {
5673                                 p_ptr->inside_arena = FALSE;
5674                                 if (p_ptr->arena_number > MAX_ARENA_MONS)
5675                                         p_ptr->arena_number++;
5676                                 else
5677                                         p_ptr->arena_number = -1 - p_ptr->arena_number;
5678                                 p_ptr->is_dead = FALSE;
5679                                 p_ptr->chp = 0;
5680                                 p_ptr->chp_frac = 0;
5681                                 p_ptr->exit_bldg = TRUE;
5682                                 reset_tim_flags();
5683
5684                                 /* Leave through the exit */
5685                                 prepare_change_floor_mode(CFM_SAVE_FLOORS | CFM_RAND_CONNECT);
5686
5687                                 /* prepare next floor */
5688                                 leave_floor(p_ptr->change_floor_mode);
5689                         }
5690                         else
5691                         {
5692                                 /* Mega-Hack -- Allow player to cheat death */
5693                                 if ((p_ptr->wizard || cheat_live) && !get_check(_("死にますか? ", "Die? ")))
5694                                 {
5695                                         cheat_death(p_ptr);
5696                                 }
5697                         }
5698                 }
5699
5700                 /* Handle "death" */
5701                 if (p_ptr->is_dead) break;
5702
5703                 /* Make a new level */
5704                 change_floor(p_ptr->change_floor_mode);
5705         }
5706
5707         /* Close stuff */
5708         close_game();
5709
5710         /* Quit */
5711         quit(NULL);
5712 }
5713
5714 /*!
5715  * @brief ゲームターンからの実時間換算を行うための補正をかける
5716  * @param hoge ゲームターン
5717  * @details アンデッド種族は18:00からゲームを開始するので、この修正を予め行う。
5718  * @return 修正をかけた後のゲームターン
5719  */
5720 s32b turn_real(s32b hoge)
5721 {
5722         switch (p_ptr->start_race)
5723         {
5724         case RACE_VAMPIRE:
5725         case RACE_SKELETON:
5726         case RACE_ZOMBIE:
5727         case RACE_SPECTRE:
5728                 return hoge - (TURNS_PER_TICK * TOWN_DAWN * 3 / 4);
5729         default:
5730                 return hoge;
5731         }
5732 }
5733
5734 /*!
5735  * @brief ターンのオーバーフローに対する対処
5736  * @details ターン及びターンを記録する変数をターンの限界の1日前まで巻き戻す.
5737  * @return 修正をかけた後のゲームターン
5738  */
5739 void prevent_turn_overflow(void)
5740 {
5741         int rollback_days, i, j;
5742         s32b rollback_turns;
5743
5744         if (current_world_ptr->game_turn < current_world_ptr->game_turn_limit) return;
5745
5746         rollback_days = 1 + (current_world_ptr->game_turn - current_world_ptr->game_turn_limit) / (TURNS_PER_TICK * TOWN_DAWN);
5747         rollback_turns = TURNS_PER_TICK * TOWN_DAWN * rollback_days;
5748
5749         if (current_world_ptr->game_turn > rollback_turns) current_world_ptr->game_turn -= rollback_turns;
5750         else current_world_ptr->game_turn = 1;
5751         if (current_floor_ptr->generated_turn > rollback_turns) current_floor_ptr->generated_turn -= rollback_turns;
5752         else current_floor_ptr->generated_turn = 1;
5753         if (current_world_ptr->arena_start_turn > rollback_turns) current_world_ptr->arena_start_turn -= rollback_turns;
5754         else current_world_ptr->arena_start_turn = 1;
5755         if (p_ptr->feeling_turn > rollback_turns) p_ptr->feeling_turn -= rollback_turns;
5756         else p_ptr->feeling_turn = 1;
5757
5758         for (i = 1; i < max_towns; i++)
5759         {
5760                 for (j = 0; j < MAX_STORES; j++)
5761                 {
5762                         store_type *st_ptr = &town_info[i].store[j];
5763
5764                         if (st_ptr->last_visit > -10L * TURNS_PER_TICK * STORE_TICKS)
5765                         {
5766                                 st_ptr->last_visit -= rollback_turns;
5767                                 if (st_ptr->last_visit < -10L * TURNS_PER_TICK * STORE_TICKS) st_ptr->last_visit = -10L * TURNS_PER_TICK * STORE_TICKS;
5768                         }
5769
5770                         if (st_ptr->store_open)
5771                         {
5772                                 st_ptr->store_open -= rollback_turns;
5773                                 if (st_ptr->store_open < 1) st_ptr->store_open = 1;
5774                         }
5775                 }
5776         }
5777 }
5778
5779 /*!
5780  * @brief ゲーム終了処理 /
5781  * Close up the current game (player may or may not be dead)
5782  * @return なし
5783  * @details
5784  * <pre>
5785  * This function is called only from "main.c" and "signals.c".
5786  * </pre>
5787  */
5788 void close_game(void)
5789 {
5790         char buf[1024];
5791         bool do_send = TRUE;
5792
5793         /*      concptr p = "[i:キャラクタの情報, f:ファイル書き出し, t:スコア, x:*鑑定*, ESC:ゲーム終了]"; */
5794         handle_stuff();
5795
5796         /* Flush the messages */
5797         msg_print(NULL);
5798
5799         /* Flush the input */
5800         flush();
5801
5802
5803         /* No suspending now */
5804         signals_ignore_tstp();
5805
5806
5807         /* Hack -- Character is now "icky" */
5808         current_world_ptr->character_icky = TRUE;
5809
5810
5811         /* Build the filename */
5812         path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
5813
5814         /* Grab permissions */
5815         safe_setuid_grab();
5816
5817         /* Open the high score file, for reading/writing */
5818         highscore_fd = fd_open(buf, O_RDWR);
5819
5820         /* Drop permissions */
5821         safe_setuid_drop();
5822
5823         /* Handle death */
5824         if (p_ptr->is_dead)
5825         {
5826                 /* Handle retirement */
5827                 if (p_ptr->total_winner) kingly();
5828
5829                 /* Save memories */
5830                 if (!cheat_save || get_check(_("死んだデータをセーブしますか? ", "Save death? ")))
5831                 {
5832                         if (!save_player()) msg_print(_("セーブ失敗!", "death save failed!"));
5833                 }
5834                 else do_send = FALSE;
5835
5836                 /* You are dead */
5837                 print_tomb();
5838
5839                 flush();
5840
5841                 /* Show more info */
5842                 show_info();
5843                 Term_clear();
5844
5845                 if (check_score())
5846                 {
5847                         if ((!send_world_score(do_send)))
5848                         {
5849                                 if (get_check_strict(_("後でスコアを登録するために待機しますか?", "Stand by for later score registration? "),
5850                                         (CHECK_NO_ESCAPE | CHECK_NO_HISTORY)))
5851                                 {
5852                                         p_ptr->wait_report_score = TRUE;
5853                                         p_ptr->is_dead = FALSE;
5854                                         if (!save_player()) msg_print(_("セーブ失敗!", "death save failed!"));
5855                                 }
5856                         }
5857                         if (!p_ptr->wait_report_score)
5858                                 (void)top_twenty();
5859                 }
5860                 else if (highscore_fd >= 0)
5861                 {
5862                         display_scores_aux(0, 10, -1, NULL);
5863                 }
5864 #if 0
5865                 /* Dump bones file */
5866                 make_bones();
5867 #endif
5868         }
5869
5870         /* Still alive */
5871         else
5872         {
5873                 /* Save the game */
5874                 do_cmd_save_game(FALSE);
5875
5876                 /* Prompt for scores */
5877                 prt(_("リターンキーか ESC キーを押して下さい。", "Press Return (or Escape)."), 0, 40);
5878                 play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_EXIT);
5879
5880                 /* Predict score (or ESCAPE) */
5881                 if (inkey() != ESCAPE) predict_score();
5882         }
5883
5884
5885         /* Shut the high score file */
5886         (void)fd_close(highscore_fd);
5887
5888         /* Forget the high score fd */
5889         highscore_fd = -1;
5890
5891         /* Kill all temporal files */
5892         clear_saved_floor_files();
5893
5894         /* Allow suspending now */
5895         signals_handle_tstp();
5896 }
5897
5898
5899 /*!
5900  * @brief 全更新処理をチェックして処理していく
5901  * Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window"
5902  * @return なし
5903  */
5904 void handle_stuff(void)
5905 {
5906         if (p_ptr->update) update_creature(p_ptr);
5907         if (p_ptr->redraw) redraw_stuff();
5908         if (p_ptr->window) window_stuff();
5909 }
5910
5911 void update_output(void)
5912 {
5913         if (p_ptr->redraw) redraw_stuff();
5914         if (p_ptr->window) window_stuff();
5915 }
5916