OSDN Git Service

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