3 @brief Angbandゲームエンジン / Angband game engine
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.
23 #include "cmd-activate.h"
26 #include "cmd-hissatsu.h"
28 #include "cmd-magiceat.h"
30 #include "cmd-quaff.h"
32 #include "cmd-smith.h"
33 #include "cmd-usestaff.h"
34 #include "cmd-zaprod.h"
35 #include "cmd-zapwand.h"
37 #include "cmd-basic.h"
43 #include "floor-events.h"
44 #include "floor-town.h"
46 #include "object-ego.h"
47 #include "object-curse.h"
48 #include "object-flavor.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"
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"
74 #include "monster-process.h"
75 #include "monster-status.h"
76 #include "monsterrace-hook.h"
77 #include "floor-save.h"
79 #include "player-skill.h"
80 #include "player-inventory.h"
82 #include "view-mainwindow.h"
83 #include "dungeon-file.h"
89 #include "realm-song.h"
90 #include "targeting.h"
94 * Hack -- Link a copyright message into the executable
96 const concptr copyright[5] =
98 "Copyright (c) 1989 James E. Wilson, Robert A. Keoneke",
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."
105 bool can_save = FALSE; /* Game can be saved */
107 COMMAND_CODE now_message;
109 bool repair_monsters; /* Hack -- optimize detect monsters */
110 bool repair_objects; /* Hack -- optimize detect objects */
112 concptr ANGBAND_SYS = "xxx"; //!< Hack -- The special Angband "System Suffix" This variable is used to choose an appropriate "pref-xxx" file
115 concptr ANGBAND_KEYBOARD = "JAPAN"; //!< Hack -- The special Angband "Keyboard Suffix" This variable is used to choose an appropriate macro-trigger definition
117 concptr ANGBAND_KEYBOARD = "0";
120 concptr ANGBAND_GRAF = "ascii"; //!< Hack -- The special Angband "Graphics Suffix" This variable is used to choose an appropriate "graf-xxx" file
122 static bool load = TRUE; /*!<ロード処理中の分岐フラグ*/
123 static int wild_regen = 20; /*!<広域マップ移動時の自然回復処理カウンタ(広域マップ1マス毎に20回処理を基本とする)*/
126 * Flags for initialization
131 * @brief 擬似鑑定を実際に行い判定を反映する
132 * @param slot 擬似鑑定を行うプレイヤーの所持リストID
133 * @param creature_ptr プレーヤーへの参照ポインタ
134 * @param heavy 重度の擬似鑑定を行うならばTRUE
137 static void sense_inventory_aux(player_type *creature_ptr, INVENTORY_IDX slot, bool heavy)
140 object_type *o_ptr = &creature_ptr->inventory_list[slot];
141 GAME_TEXT o_name[MAX_NLEN];
143 /* We know about it already, do not tell us again */
144 if (o_ptr->ident & (IDENT_SENSE))return;
146 /* It is fully known, no information needed */
147 if (object_is_known(o_ptr)) return;
149 /* Check for a feeling */
150 feel = (heavy ? value_check_aux1(o_ptr) : value_check_aux2(o_ptr));
152 /* Skip non-feelings */
156 if ((creature_ptr->muta3 & MUT3_BAD_LUCK) && !randint0(13))
167 feel = FEEL_EXCELLENT;
173 feel = randint0(3) ? FEEL_GOOD : FEEL_AVERAGE;
175 feel = FEEL_UNCURSED;
180 feel = randint0(2) ? FEEL_CURSED : FEEL_GOOD;
186 feel = randint0(3) ? FEEL_CURSED : FEEL_AVERAGE;
193 feel = FEEL_WORTHLESS;
198 feel = FEEL_TERRIBLE;
204 /* Stop everything */
205 if (disturb_minor) disturb(creature_ptr, FALSE, FALSE);
207 /* Get an object description */
208 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
210 /* Message (equipment) */
211 if (slot >= INVEN_RARM)
214 msg_format("%s%s(%c)は%sという感じがする...",
215 describe_use(creature_ptr, slot), o_name, index_to_label(slot), game_inscriptions[feel]);
217 msg_format("You feel the %s (%c) you are %s %s %s...",
218 o_name, index_to_label(slot), describe_use(creature_ptr, slot),
219 ((o_ptr->number == 1) ? "is" : "are"),
220 game_inscriptions[feel]);
227 msg_format("ザックの中の%s(%c)は%sという感じがする...",
228 o_name, index_to_label(slot), game_inscriptions[feel]);
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]);
238 o_ptr->ident |= (IDENT_SENSE);
240 /* Set the "inscription" */
241 o_ptr->feeling = feel;
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);
251 * @brief 1プレイヤーターン毎に武器、防具の擬似鑑定が行われるかを判定する。
254 * Sense the inventory\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
263 static void sense_inventory1(player_type *creature_ptr)
266 PLAYER_LEVEL plev = creature_ptr->lev;
271 /*** Check for "sensing" ***/
273 /* No sensing when confused */
274 if (creature_ptr->confused) return;
276 /* Analyze the class */
277 switch (creature_ptr->pclass)
285 if (0 != randint0(9000L / (plev * plev + 40))) return;
296 if (0 != randint0(6000L / (plev * plev + 50))) return;
305 case CLASS_HIGH_MAGE:
307 case CLASS_MAGIC_EATER:
309 /* Very bad (light) sensing */
310 if (0 != randint0(240000L / (plev + 5))) return;
318 /* Good (light) sensing */
319 if (0 != randint0(10000L / (plev * plev + 40))) return;
328 if (0 != randint0(20000L / (plev * plev + 40))) return;
339 if (0 != randint0(95000L / (plev * plev + 40))) return;
351 if (0 != randint0(77777L / (plev * plev + 40))) return;
359 case CLASS_WARRIOR_MAGE:
363 if (0 != randint0(75000L / (plev * plev + 40))) return;
368 case CLASS_MINDCRAFTER:
370 case CLASS_BLUE_MAGE:
371 case CLASS_MIRROR_MASTER:
374 if (0 != randint0(55000L / (plev * plev + 40))) return;
379 case CLASS_CHAOS_WARRIOR:
382 if (0 != randint0(80000L / (plev * plev + 40))) return;
391 case CLASS_FORCETRAINER:
394 if (0 != randint0(20000L / (plev * plev + 40))) return;
402 if (0 != randint0(20000L / ((plev + 50)*(plev + 50)))) return;
410 case CLASS_BEASTMASTER:
413 if (0 != randint0(65000L / (plev * plev + 40))) return;
417 case CLASS_BERSERKER:
426 if (compare_virtue(creature_ptr, V_KNOWLEDGE, 100, VIRTUE_LARGE)) heavy = TRUE;
428 /*** Sense everything ***/
430 /* Check everything */
431 for (i = 0; i < INVEN_TOTAL; i++)
435 o_ptr = &creature_ptr->inventory_list[i];
437 /* Skip empty slots */
438 if (!o_ptr->k_idx) continue;
440 /* Valid "tval" codes */
467 /* Skip non-sense machines */
470 /* Occasional failure on creature_ptr->inventory_list items */
471 if ((i < INVEN_RARM) && (0 != randint0(5))) continue;
474 if ((creature_ptr->muta3 & MUT3_GOOD_LUCK) && !randint0(13))
479 sense_inventory_aux(creature_ptr, i, heavy);
484 * @brief 1プレイヤーターン毎に武器、防具以外の擬似鑑定が行われるかを判定する。
487 static void sense_inventory2(player_type *creature_ptr)
490 PLAYER_LEVEL plev = creature_ptr->lev;
494 /*** Check for "sensing" ***/
496 /* No sensing when confused */
497 if (creature_ptr->confused) return;
499 /* Analyze the class */
500 switch (creature_ptr->pclass)
506 case CLASS_BERSERKER:
514 case CLASS_CHAOS_WARRIOR:
516 case CLASS_BEASTMASTER:
519 /* Very bad (light) sensing */
520 if (0 != randint0(240000L / (plev + 5))) return;
526 case CLASS_WARRIOR_MAGE:
531 if (0 != randint0(95000L / (plev * plev + 40))) return;
539 case CLASS_FORCETRAINER:
540 case CLASS_MINDCRAFTER:
543 if (0 != randint0(20000L / (plev * plev + 40))) return;
549 case CLASS_HIGH_MAGE:
551 case CLASS_MAGIC_EATER:
552 case CLASS_MIRROR_MASTER:
553 case CLASS_BLUE_MAGE:
556 if (0 != randint0(9000L / (plev * plev + 40))) return;
564 if (0 != randint0(20000L / ((plev + 50)*(plev + 50)))) return;
570 /*** Sense everything ***/
572 /* Check everything */
573 for (i = 0; i < INVEN_TOTAL; i++)
577 o_ptr = &creature_ptr->inventory_list[i];
579 /* Skip empty slots */
580 if (!o_ptr->k_idx) continue;
582 /* Valid "tval" codes */
595 /* Skip non-sense machines */
598 /* Occasional failure on creature_ptr->inventory_list items */
599 if ((i < INVEN_RARM) && (0 != randint0(5))) continue;
601 sense_inventory_aux(creature_ptr, i, TRUE);
607 * @brief パターン終点到達時のテレポート処理を行う
608 * @param creature_ptr プレーヤーへの参照ポインタ
611 static void pattern_teleport(player_type *creature_ptr)
614 DEPTH max_level = 99;
617 if (get_check(_("他の階にテレポートしますか?", "Teleport level? ")))
622 /* Only downward in ironman mode */
623 if (ironman_downward)
624 min_level = creature_ptr->current_floor_ptr->dun_level;
627 if (creature_ptr->dungeon_idx == DUNGEON_ANGBAND)
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)
636 max_level = d_info[creature_ptr->dungeon_idx].maxdepth;
637 min_level = d_info[creature_ptr->dungeon_idx].mindepth;
641 sprintf(ppp, _("テレポート先:(%d-%d)", "Teleport to level (%d-%d): "), (int)min_level, (int)max_level);
644 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
646 /* Ask for a level */
647 if (!get_string(ppp, tmp_val, 10)) return;
649 /* Extract request */
650 command_arg = (COMMAND_ARG)atoi(tmp_val);
652 else if (get_check(_("通常テレポート?", "Normal teleport? ")))
654 teleport_player(creature_ptr, 200, 0L);
661 if (command_arg < min_level) command_arg = (COMMAND_ARG)min_level;
662 if (command_arg > max_level) command_arg = (COMMAND_ARG)max_level;
665 msg_format(_("%d 階にテレポートしました。", "You teleport to dungeon level %d."), command_arg);
667 if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
670 creature_ptr->current_floor_ptr->dun_level = command_arg;
672 leave_quest_check(creature_ptr);
674 if (record_stair) exe_write_diary(creature_ptr, DIARY_PAT_TELE, 0, NULL);
676 creature_ptr->current_floor_ptr->inside_quest = 0;
677 free_turn(creature_ptr);
680 * Clear all saved floors
681 * and create a first saved floor
683 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
684 creature_ptr->leaving = TRUE;
688 * @brief 各種パターン地形上の特別な処理 / Returns TRUE if we are on the Pattern...
689 * @return 実際にパターン地形上にプレイヤーが居た場合はTRUEを返す。
691 static bool pattern_effect(player_type *creature_ptr)
695 if (!pattern_tile(creature_ptr->y, creature_ptr->x)) return FALSE;
697 if ((PRACE_IS_(creature_ptr, RACE_AMBERITE)) &&
698 (creature_ptr->cut > 0) && one_in_(10))
700 wreck_the_pattern(creature_ptr);
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;
706 switch (pattern_type)
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);
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."));
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...
725 case PATTERN_TILE_OLD:
729 case PATTERN_TILE_TELEPORT:
730 pattern_teleport(creature_ptr);
733 case PATTERN_TILE_WRECKED:
734 if (!IS_INVULN(creature_ptr))
735 take_hit(creature_ptr, DAMAGE_NOESCAPE, 200, _("壊れた「パターン」を歩いたダメージ", "walking the corrupted Pattern"), -1);
739 if (PRACE_IS_(creature_ptr, RACE_AMBERITE) && !one_in_(2))
741 else if (!IS_INVULN(creature_ptr))
742 take_hit(creature_ptr, DAMAGE_NOESCAPE, damroll(1, 3), _("「パターン」を歩いたダメージ", "walking the Pattern"), -1);
751 * @brief プレイヤーのHP自然回復処理 / Regenerate hit points -RAK-
752 * @param percent 回復比率
755 static void regenhp(player_type *creature_ptr, int percent)
761 if (creature_ptr->special_defense & KATA_KOUKIJIN) return;
762 if (creature_ptr->action == ACTION_HAYAGAKE) return;
764 /* Save the old hitpoints */
765 old_chp = creature_ptr->chp;
768 * Extract the new hitpoints
770 * 'percent' is the Regen factor in unit (1/2^16)
773 new_chp_frac = (creature_ptr->mhp * percent + PY_REGEN_HPBASE);
775 /* Convert the unit (1/2^16) to (1/2^32) */
776 s64b_LSHIFT(new_chp, new_chp_frac, 16);
779 s64b_add(&(creature_ptr->chp), &(creature_ptr->chp_frac), new_chp, new_chp_frac);
783 if (0 < s64b_cmp(creature_ptr->chp, creature_ptr->chp_frac, creature_ptr->mhp, 0))
785 creature_ptr->chp = creature_ptr->mhp;
786 creature_ptr->chp_frac = 0;
790 if (old_chp != creature_ptr->chp)
792 creature_ptr->redraw |= (PR_HP);
793 creature_ptr->window |= (PW_PLAYER);
800 * @brief プレイヤーのMP自然回復処理(regen_magic()のサブセット) / Regenerate mana points
801 * @param upkeep_factor ペット維持によるMPコスト量
802 * @param regen_amount 回復量
805 static void regenmana(player_type *creature_ptr, MANA_POINT upkeep_factor, MANA_POINT regen_amount)
807 MANA_POINT old_csp = creature_ptr->csp;
808 s32b regen_rate = regen_amount * 100 - upkeep_factor * PY_REGEN_NORMAL;
811 * Excess mana will decay 32 times faster than normal
814 if (creature_ptr->csp > creature_ptr->msp)
816 /* PY_REGEN_NORMAL is the Regen factor in unit (1/2^16) */
818 u32b decay_frac = (creature_ptr->msp * 32 * PY_REGEN_NORMAL + PY_REGEN_MNBASE);
820 /* Convert the unit (1/2^16) to (1/2^32) */
821 s64b_LSHIFT(decay, decay_frac, 16);
824 s64b_sub(&(creature_ptr->csp), &(creature_ptr->csp_frac), decay, decay_frac);
827 if (creature_ptr->csp < creature_ptr->msp)
829 creature_ptr->csp = creature_ptr->msp;
830 creature_ptr->csp_frac = 0;
834 /* Regenerating mana (unless the player has excess mana) */
835 else if (regen_rate > 0)
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);
841 /* Convert the unit (1/2^16) to (1/2^32) */
842 s64b_LSHIFT(new_mana, new_mana_frac, 16);
845 s64b_add(&(creature_ptr->csp), &(creature_ptr->csp_frac), new_mana, new_mana_frac);
847 /* Must set frac to zero even if equal */
848 if (creature_ptr->csp >= creature_ptr->msp)
850 creature_ptr->csp = creature_ptr->msp;
851 creature_ptr->csp_frac = 0;
856 /* Reduce mana (even when the player has excess mana) */
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);
863 /* Convert the unit (1/2^16) to (1/2^32) */
864 s64b_LSHIFT(reduce_mana, reduce_mana_frac, 16);
867 s64b_sub(&(creature_ptr->csp), &(creature_ptr->csp_frac), reduce_mana, reduce_mana_frac);
870 if (creature_ptr->csp < 0)
872 creature_ptr->csp = 0;
873 creature_ptr->csp_frac = 0;
877 if (old_csp != creature_ptr->csp)
879 creature_ptr->redraw |= (PR_MANA);
880 creature_ptr->window |= (PW_PLAYER);
881 creature_ptr->window |= (PW_SPELL);
887 * @brief プレイヤーのMP自然回復処理 / Regenerate magic regen_amount: PY_REGEN_NORMAL * 2 (if resting) * 2 (if having regenarate)
888 * @param regen_amount 回復量
891 static void regenmagic(player_type *creature_ptr, int regen_amount)
896 int mult = (dev + adj_mag_mana[creature_ptr->stat_ind[A_INT]]); /* x1 to x2 speed bonus for recharging */
898 for (i = 0; i < EATER_EXT * 2; i++)
900 if (!creature_ptr->magic_num2[i]) continue;
901 if (creature_ptr->magic_num1[i] == ((long)creature_ptr->magic_num2[i] << 16)) continue;
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;
907 /* Check maximum charge */
908 if (creature_ptr->magic_num1[i] > (creature_ptr->magic_num2[i] << 16))
910 creature_ptr->magic_num1[i] = ((long)creature_ptr->magic_num2[i] << 16);
914 for (i = EATER_EXT * 2; i < EATER_EXT * 3; i++)
916 if (!creature_ptr->magic_num1[i]) continue;
917 if (!creature_ptr->magic_num2[i]) continue;
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;
924 /* Check minimum remaining period for charging */
925 if (creature_ptr->magic_num1[i] < 0) creature_ptr->magic_num1[i] = 0;
932 * @brief 100ゲームターン毎のモンスターのHP自然回復処理 / Regenerate the monsters (once per 100 game turns)
933 * @param player_ptr プレーヤーへの参照ポインタ
935 * @note Should probably be done during monster turns.
937 static void regenerate_monsters(player_type *player_ptr)
939 for (int i = 1; i < player_ptr->current_floor_ptr->m_max; i++)
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];
945 if (!monster_is_valid(m_ptr)) continue;
947 /* Allow regeneration (if needed) */
948 if (m_ptr->hp < m_ptr->maxhp)
950 /* Hack -- Base regeneration */
951 int frac = m_ptr->maxhp / 100;
953 /* Hack -- Minimal regeneration rate */
954 if (!frac) if (one_in_(2)) frac = 1;
956 /* Hack -- Some monsters regenerate quickly */
957 if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2;
959 /* Hack -- Regenerate */
962 /* Do not over-regenerate */
963 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
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);
974 * @brief 30ゲームターン毎のボール中モンスターのHP自然回復処理 / Regenerate the captured monsters (once per 30 game turns)
975 * @param creature_ptr プレーヤーへの参照ポインタ
977 * @note Should probably be done during monster turns.
979 static void regenerate_captured_monsters(player_type *creature_ptr)
984 /* Regenerate everyone */
985 for (i = 0; i < INVEN_TOTAL; i++)
988 object_type *o_ptr = &creature_ptr->inventory_list[i];
990 if (!o_ptr->k_idx) continue;
991 if (o_ptr->tval != TV_CAPTURE) continue;
992 if (!o_ptr->pval) continue;
996 r_ptr = &r_info[o_ptr->pval];
998 /* Allow regeneration (if needed) */
999 if (o_ptr->xtra4 < o_ptr->xtra5)
1001 /* Hack -- Base regeneration */
1002 frac = o_ptr->xtra5 / 100;
1004 /* Hack -- Minimal regeneration rate */
1005 if (!frac) if (one_in_(2)) frac = 1;
1007 /* Hack -- Some monsters regenerate quickly */
1008 if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2;
1010 /* Hack -- Regenerate */
1011 o_ptr->xtra4 += (XTRA16)frac;
1013 /* Do not over-regenerate */
1014 if (o_ptr->xtra4 > o_ptr->xtra5) o_ptr->xtra4 = o_ptr->xtra5;
1021 creature_ptr->update |= (PU_COMBINE);
1022 creature_ptr->window |= (PW_INVEN);
1023 creature_ptr->window |= (PW_EQUIP);
1029 * @brief 寿命つき光源の警告メッセージ処理
1030 * @param creature_ptr プレーヤーへの参照ポインタ
1031 * @param o_ptr 現在光源として使っているオブジェクトの構造体参照ポインタ
1034 static void notice_lite_change(player_type *creature_ptr, object_type *o_ptr)
1036 /* Hack -- notice interesting fuel steps */
1037 if ((o_ptr->xtra4 < 100) || (!(o_ptr->xtra4 % 100)))
1039 creature_ptr->window |= (PW_EQUIP);
1042 /* Hack -- Special treatment when blind */
1043 if (creature_ptr->blind)
1045 /* Hack -- save some light for later */
1046 if (o_ptr->xtra4 == 0) o_ptr->xtra4++;
1049 /* The light is now out */
1050 else if (o_ptr->xtra4 == 0)
1052 disturb(creature_ptr, FALSE, TRUE);
1053 msg_print(_("明かりが消えてしまった!", "Your light has gone out!"));
1055 /* Recalculate torch radius */
1056 creature_ptr->update |= (PU_TORCH);
1058 /* Some ego light lose its effects without fuel */
1059 creature_ptr->update |= (PU_BONUS);
1062 /* The light is getting dim */
1063 else if (o_ptr->name2 == EGO_LITE_LONG)
1065 if ((o_ptr->xtra4 < 50) && (!(o_ptr->xtra4 % 5))
1066 && (current_world_ptr->game_turn % (TURNS_PER_TICK * 2)))
1068 if (disturb_minor) disturb(creature_ptr, FALSE, TRUE);
1069 msg_print(_("明かりが微かになってきている。", "Your light is growing faint."));
1073 /* The light is getting dim */
1074 else if ((o_ptr->xtra4 < 100) && (!(o_ptr->xtra4 % 10)))
1076 if (disturb_minor) disturb(creature_ptr, FALSE, TRUE);
1077 msg_print(_("明かりが微かになってきている。", "Your light is growing faint."));
1083 * @brief !!を刻んだ魔道具の時間経過による再充填を知らせる処理 / If player has inscribed the object with "!!", let him know when it's recharged. -LM-
1084 * @param o_ptr 対象オブジェクトの構造体参照ポインタ
1087 static void recharged_notice(player_type *owner_ptr, object_type *o_ptr)
1089 GAME_TEXT o_name[MAX_NLEN];
1093 /* No inscription */
1094 if (!o_ptr->inscription) return;
1097 s = my_strchr(quark_str(o_ptr->inscription), '!');
1099 /* Process notification request. */
1102 /* Find another '!' */
1105 /* Describe (briefly) */
1106 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1108 /* Notify the player */
1110 msg_format("%sは再充填された。", o_name);
1112 if (o_ptr->number > 1)
1113 msg_format("Your %s are recharged.", o_name);
1115 msg_format("Your %s is recharged.", o_name);
1118 disturb(owner_ptr, FALSE, FALSE);
1124 /* Keep looking for '!'s */
1125 s = my_strchr(s + 1, '!');
1130 * @brief プレイヤーの歌に関する継続処理
1133 static void check_music(player_type *caster_ptr)
1135 const magic_type *s_ptr;
1137 MANA_POINT need_mana;
1138 u32b need_mana_frac;
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;
1144 if (caster_ptr->anti_magic)
1146 stop_singing(caster_ptr);
1150 spell = SINGING_SONG_ID(caster_ptr);
1151 s_ptr = &technic_info[REALM_MUSIC - MIN_TECHNIC][spell];
1153 need_mana = mod_need_mana(caster_ptr, s_ptr->smana, spell, REALM_MUSIC);
1157 s64b_RSHIFT(need_mana, need_mana_frac, 1);
1159 if (s64b_cmp(caster_ptr->csp, caster_ptr->csp_frac, need_mana, need_mana_frac) < 0)
1161 stop_singing(caster_ptr);
1166 s64b_sub(&(caster_ptr->csp), &(caster_ptr->csp_frac), need_mana, need_mana_frac);
1168 caster_ptr->redraw |= PR_MANA;
1169 if (INTERUPTING_SONG_EFFECT(caster_ptr))
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);
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)
1184 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;
1186 else if (caster_ptr->spell_exp[spell] < SPELL_EXP_EXPERT)
1188 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;
1190 else if (caster_ptr->spell_exp[spell] < SPELL_EXP_MASTER)
1192 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;
1195 /* Do any effects of continual song */
1196 exe_spell(caster_ptr, REALM_MUSIC, spell, SPELL_CONT);
1200 * @brief 現在呪いを保持している装備品を一つランダムに探し出す / Choose one of items that have cursed flag
1201 * @param flag 探し出したい呪いフラグ配列
1202 * @return 該当の呪いが一つでもあった場合にランダムに選ばれた装備品のオブジェクト構造体参照ポインタを返す。\n
1205 static object_type *choose_cursed_obj_name(player_type *player_ptr, BIT_FLAGS flag)
1208 int choices[INVEN_TOTAL - INVEN_RARM];
1211 /* Paranoia -- Player has no warning-item */
1212 if (!(player_ptr->cursed & flag)) return NULL;
1214 /* Search Inventry */
1215 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
1217 object_type *o_ptr = &player_ptr->inventory_list[i];
1219 if (o_ptr->curse_flags & flag)
1221 choices[number] = i;
1224 else if ((flag == TRC_ADD_L_CURSE) ||
1225 (flag == TRC_ADD_H_CURSE) ||
1226 (flag == TRC_DRAIN_HP) ||
1227 (flag == TRC_DRAIN_MANA) ||
1228 (flag == TRC_CALL_ANIMAL) ||
1229 (flag == TRC_CALL_DEMON) ||
1230 (flag == TRC_CALL_DRAGON) ||
1231 (flag == TRC_CALL_UNDEAD) ||
1232 (flag == TRC_COWARDICE) ||
1233 (flag == TRC_LOW_MELEE) ||
1234 (flag == TRC_LOW_AC) ||
1235 (flag == TRC_LOW_MAGIC) ||
1236 (flag == TRC_FAST_DIGEST) ||
1237 (flag == TRC_SLOW_REGEN))
1240 BIT_FLAGS flgs[TR_FLAG_SIZE];
1241 object_flags(o_ptr, flgs);
1244 case TRC_ADD_L_CURSE: cf = TR_ADD_L_CURSE; break;
1245 case TRC_ADD_H_CURSE: cf = TR_ADD_H_CURSE; break;
1246 case TRC_DRAIN_HP: cf = TR_DRAIN_HP; break;
1247 case TRC_DRAIN_MANA: cf = TR_DRAIN_MANA; break;
1248 case TRC_CALL_ANIMAL: cf = TR_CALL_ANIMAL; break;
1249 case TRC_CALL_DEMON: cf = TR_CALL_DEMON; break;
1250 case TRC_CALL_DRAGON: cf = TR_CALL_DRAGON; break;
1251 case TRC_CALL_UNDEAD: cf = TR_CALL_UNDEAD; break;
1252 case TRC_COWARDICE: cf = TR_COWARDICE; break;
1253 case TRC_LOW_MELEE: cf = TR_LOW_MELEE; break;
1254 case TRC_LOW_AC: cf = TR_LOW_AC; break;
1255 case TRC_LOW_MAGIC: cf = TR_LOW_MAGIC; break;
1256 case TRC_FAST_DIGEST: cf = TR_FAST_DIGEST; break;
1257 case TRC_SLOW_REGEN: cf = TR_SLOW_REGEN; break;
1260 if (have_flag(flgs, cf))
1262 choices[number] = i;
1268 return &player_ptr->inventory_list[choices[randint0(number)]];
1272 static void process_world_aux_digestion(player_type *creature_ptr)
1274 if (!creature_ptr->phase_out)
1276 /* Digest quickly when gorged */
1277 if (creature_ptr->food >= PY_FOOD_MAX)
1279 /* Digest a lot of food */
1280 (void)set_food(creature_ptr, creature_ptr->food - 100);
1283 /* Digest normally -- Every 50 game turns */
1284 else if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 5)))
1286 /* Basic digestion rate based on speed */
1287 int digestion = SPEED_TO_ENERGY(creature_ptr->pspeed);
1289 /* Regeneration takes more food */
1290 if (creature_ptr->regenerate)
1292 if (creature_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1294 if (creature_ptr->cursed & TRC_FAST_DIGEST)
1297 /* Slow digestion takes less food */
1298 if (creature_ptr->slow_digest)
1301 /* Minimal digestion */
1302 if (digestion < 1) digestion = 1;
1303 /* Maximal digestion */
1304 if (digestion > 100) digestion = 100;
1306 /* Digest some food */
1307 (void)set_food(creature_ptr, creature_ptr->food - digestion);
1312 if ((creature_ptr->food < PY_FOOD_FAINT))
1314 /* Faint occasionally */
1315 if (!creature_ptr->paralyzed && (randint0(100) < 10))
1317 msg_print(_("あまりにも空腹で気絶してしまった。", "You faint from the lack of food."));
1318 disturb(creature_ptr, TRUE, TRUE);
1320 /* Hack -- faint (bypass free action) */
1321 (void)set_paralyzed(creature_ptr, creature_ptr->paralyzed + 1 + randint0(5));
1324 /* Starve to death (slowly) */
1325 if (creature_ptr->food < PY_FOOD_STARVE)
1327 /* Calculate damage */
1328 HIT_POINT dam = (PY_FOOD_STARVE - creature_ptr->food) / 10;
1330 if (!IS_INVULN(creature_ptr)) take_hit(creature_ptr, DAMAGE_LOSELIFE, dam, _("空腹", "starvation"), -1);
1337 * @brief 10ゲームターンが進行するごとにプレイヤーのHPとMPの増減処理を行う。
1338 * / Handle timed damage and regeneration every 10 game turns
1341 static void process_world_aux_hp_and_sp(player_type *creature_ptr)
1343 feature_type *f_ptr = &f_info[creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].feat];
1344 bool cave_no_regen = FALSE;
1345 int upkeep_factor = 0;
1347 /* Default regeneration */
1348 int regen_amount = PY_REGEN_NORMAL;
1351 /*** Damage over Time ***/
1353 /* Take damage from poison */
1354 if (creature_ptr->poisoned && !IS_INVULN(creature_ptr))
1356 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, _("毒", "poison"), -1);
1359 /* Take damage from cuts */
1360 if (creature_ptr->cut && !IS_INVULN(creature_ptr))
1364 /* Mortal wound or Deep Gash */
1365 if (creature_ptr->cut > 1000)
1370 else if (creature_ptr->cut > 200)
1376 else if (creature_ptr->cut > 100)
1381 else if (creature_ptr->cut > 50)
1386 else if (creature_ptr->cut > 25)
1391 else if (creature_ptr->cut > 10)
1402 take_hit(creature_ptr, DAMAGE_NOESCAPE, dam, _("致命傷", "a fatal wound"), -1);
1405 /* (Vampires) Take damage from sunlight */
1406 if (PRACE_IS_(creature_ptr, RACE_VAMPIRE) || (creature_ptr->mimic_form == MIMIC_VAMPIRE))
1408 if (!creature_ptr->current_floor_ptr->dun_level && !creature_ptr->resist_lite && !IS_INVULN(creature_ptr) && is_daytime())
1410 if ((creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
1412 msg_print(_("日光があなたのアンデッドの肉体を焼き焦がした!", "The sun's rays scorch your undead flesh!"));
1413 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, _("日光", "sunlight"), -1);
1414 cave_no_regen = TRUE;
1418 if (creature_ptr->inventory_list[INVEN_LITE].tval && (creature_ptr->inventory_list[INVEN_LITE].name2 != EGO_LITE_DARKNESS) &&
1419 !creature_ptr->resist_lite)
1421 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
1422 GAME_TEXT o_name[MAX_NLEN];
1423 char ouch[MAX_NLEN + 40];
1425 /* Get an object description */
1426 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1427 msg_format(_("%sがあなたのアンデッドの肉体を焼き焦がした!", "The %s scorches your undead flesh!"), o_name);
1429 cave_no_regen = TRUE;
1431 /* Get an object description */
1432 object_desc(o_name, o_ptr, OD_NAME_ONLY);
1433 sprintf(ouch, _("%sを装備したダメージ", "wielding %s"), o_name);
1435 if (!IS_INVULN(creature_ptr)) take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, ouch, -1);
1439 if (have_flag(f_ptr->flags, FF_LAVA) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_fire)
1443 if (have_flag(f_ptr->flags, FF_DEEP))
1445 damage = 6000 + randint0(4000);
1447 else if (!creature_ptr->levitation)
1449 damage = 3000 + randint0(2000);
1454 if (PRACE_IS_(creature_ptr, RACE_ENT)) damage += damage / 3;
1455 if (creature_ptr->resist_fire) damage = damage / 3;
1456 if (is_oppose_fire(creature_ptr)) damage = damage / 3;
1457 if (creature_ptr->levitation) damage = damage / 5;
1459 damage = damage / 100 + (randint0(100) < (damage % 100));
1461 if (creature_ptr->levitation)
1463 msg_print(_("熱で火傷した!", "The heat burns you!"));
1464 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1465 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1469 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1470 msg_format(_("%sで火傷した!", "The %s burns you!"), name);
1471 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1474 cave_no_regen = TRUE;
1478 if (have_flag(f_ptr->flags, FF_COLD_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_cold)
1482 if (have_flag(f_ptr->flags, FF_DEEP))
1484 damage = 6000 + randint0(4000);
1486 else if (!creature_ptr->levitation)
1488 damage = 3000 + randint0(2000);
1493 if (creature_ptr->resist_cold) damage = damage / 3;
1494 if (is_oppose_cold(creature_ptr)) damage = damage / 3;
1495 if (creature_ptr->levitation) damage = damage / 5;
1497 damage = damage / 100 + (randint0(100) < (damage % 100));
1499 if (creature_ptr->levitation)
1501 msg_print(_("冷気に覆われた!", "The cold engulfs you!"));
1502 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1503 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1507 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1508 msg_format(_("%sに凍えた!", "The %s frostbites you!"), name);
1509 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1512 cave_no_regen = TRUE;
1516 if (have_flag(f_ptr->flags, FF_ELEC_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_elec)
1520 if (have_flag(f_ptr->flags, FF_DEEP))
1522 damage = 6000 + randint0(4000);
1524 else if (!creature_ptr->levitation)
1526 damage = 3000 + randint0(2000);
1531 if (creature_ptr->resist_elec) damage = damage / 3;
1532 if (is_oppose_elec(creature_ptr)) damage = damage / 3;
1533 if (creature_ptr->levitation) damage = damage / 5;
1535 damage = damage / 100 + (randint0(100) < (damage % 100));
1537 if (creature_ptr->levitation)
1539 msg_print(_("電撃を受けた!", "The electric shocks you!"));
1540 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1541 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1545 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1546 msg_format(_("%sに感電した!", "The %s shocks you!"), name);
1547 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1550 cave_no_regen = TRUE;
1554 if (have_flag(f_ptr->flags, FF_ACID_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_acid)
1558 if (have_flag(f_ptr->flags, FF_DEEP))
1560 damage = 6000 + randint0(4000);
1562 else if (!creature_ptr->levitation)
1564 damage = 3000 + randint0(2000);
1569 if (creature_ptr->resist_acid) damage = damage / 3;
1570 if (is_oppose_acid(creature_ptr)) damage = damage / 3;
1571 if (creature_ptr->levitation) damage = damage / 5;
1573 damage = damage / 100 + (randint0(100) < (damage % 100));
1575 if (creature_ptr->levitation)
1577 msg_print(_("酸が飛び散った!", "The acid melt you!"));
1578 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1579 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1583 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1584 msg_format(_("%sに溶かされた!", "The %s melts you!"), name);
1585 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1588 cave_no_regen = TRUE;
1592 if (have_flag(f_ptr->flags, FF_POISON_PUDDLE) && !IS_INVULN(creature_ptr))
1596 if (have_flag(f_ptr->flags, FF_DEEP))
1598 damage = 6000 + randint0(4000);
1600 else if (!creature_ptr->levitation)
1602 damage = 3000 + randint0(2000);
1607 if (creature_ptr->resist_pois) damage = damage / 3;
1608 if (is_oppose_pois(creature_ptr)) damage = damage / 3;
1609 if (creature_ptr->levitation) damage = damage / 5;
1611 damage = damage / 100 + (randint0(100) < (damage % 100));
1613 if (creature_ptr->levitation)
1615 msg_print(_("毒気を吸い込んだ!", "The gas poisons you!"));
1616 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1617 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1618 if (creature_ptr->resist_pois) (void)set_poisoned(creature_ptr, creature_ptr->poisoned + 1);
1622 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1623 msg_format(_("%sに毒された!", "The %s poisons you!"), name);
1624 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1625 if (creature_ptr->resist_pois) (void)set_poisoned(creature_ptr, creature_ptr->poisoned + 3);
1628 cave_no_regen = TRUE;
1632 if (have_flag(f_ptr->flags, FF_WATER) && have_flag(f_ptr->flags, FF_DEEP) &&
1633 !creature_ptr->levitation && !creature_ptr->can_swim && !creature_ptr->resist_water)
1635 if (creature_ptr->total_weight > weight_limit(creature_ptr))
1637 msg_print(_("溺れている!", "You are drowning!"));
1638 take_hit(creature_ptr, DAMAGE_NOESCAPE, randint1(creature_ptr->lev), _("溺れ", "drowning"), -1);
1639 cave_no_regen = TRUE;
1643 if (creature_ptr->riding)
1646 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags2 & RF2_AURA_FIRE) && !creature_ptr->immune_fire)
1648 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1649 if (PRACE_IS_(creature_ptr, RACE_ENT)) damage += damage / 3;
1650 if (creature_ptr->resist_fire) damage = damage / 3;
1651 if (is_oppose_fire(creature_ptr)) damage = damage / 3;
1652 msg_print(_("熱い!", "It's hot!"));
1653 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("炎のオーラ", "Fire aura"), -1);
1655 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags2 & RF2_AURA_ELEC) && !creature_ptr->immune_elec)
1657 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1658 if (PRACE_IS_(creature_ptr, RACE_ANDROID)) damage += damage / 3;
1659 if (creature_ptr->resist_elec) damage = damage / 3;
1660 if (is_oppose_elec(creature_ptr)) damage = damage / 3;
1661 msg_print(_("痛い!", "It hurts!"));
1662 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("電気のオーラ", "Elec aura"), -1);
1664 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags3 & RF3_AURA_COLD) && !creature_ptr->immune_cold)
1666 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1667 if (creature_ptr->resist_cold) damage = damage / 3;
1668 if (is_oppose_cold(creature_ptr)) damage = damage / 3;
1669 msg_print(_("冷たい!", "It's cold!"));
1670 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("冷気のオーラ", "Cold aura"), -1);
1674 /* Spectres -- take damage when moving through walls */
1676 * Added: ANYBODY takes damage if inside through walls
1677 * without wraith form -- NOTE: Spectres will never be
1678 * reduced below 0 hp by being inside a stone wall; others
1681 if (!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY))
1683 if (!IS_INVULN(creature_ptr) && !creature_ptr->wraith_form && !creature_ptr->kabenuke && ((creature_ptr->chp > (creature_ptr->lev / 5)) || !creature_ptr->pass_wall))
1686 cave_no_regen = TRUE;
1688 if (creature_ptr->pass_wall)
1690 msg_print(_("体の分子が分解した気がする!", "Your molecules feel disrupted!"));
1691 dam_desc = _("密度", "density");
1695 msg_print(_("崩れた岩に押し潰された!", "You are being crushed!"));
1696 dam_desc = _("硬い岩", "solid rock");
1699 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1 + (creature_ptr->lev / 5), dam_desc, -1);
1704 /*** handle regeneration ***/
1707 if (creature_ptr->food < PY_FOOD_WEAK)
1709 /* Lower regeneration */
1710 if (creature_ptr->food < PY_FOOD_STARVE)
1714 else if (creature_ptr->food < PY_FOOD_FAINT)
1716 regen_amount = PY_REGEN_FAINT;
1720 regen_amount = PY_REGEN_WEAK;
1724 /* Are we walking the pattern? */
1725 if (pattern_effect(creature_ptr))
1727 cave_no_regen = TRUE;
1731 /* Regeneration ability */
1732 if (creature_ptr->regenerate)
1734 regen_amount = regen_amount * 2;
1736 if (creature_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1740 if (creature_ptr->cursed & TRC_SLOW_REGEN)
1747 /* Searching or Resting */
1748 if ((creature_ptr->action == ACTION_SEARCH) || (creature_ptr->action == ACTION_REST))
1750 regen_amount = regen_amount * 2;
1753 upkeep_factor = calculate_upkeep(creature_ptr);
1755 /* No regeneration while special action */
1756 if ((creature_ptr->action == ACTION_LEARN) ||
1757 (creature_ptr->action == ACTION_HAYAGAKE) ||
1758 (creature_ptr->special_defense & KATA_KOUKIJIN))
1760 upkeep_factor += 100;
1763 /* Regenerate the mana */
1764 regenmana(creature_ptr, upkeep_factor, regen_amount);
1767 /* Recharge magic eater's power */
1768 if (creature_ptr->pclass == CLASS_MAGIC_EATER)
1770 regenmagic(creature_ptr, regen_amount);
1773 if ((creature_ptr->csp == 0) && (creature_ptr->csp_frac == 0))
1775 while (upkeep_factor > 100)
1777 msg_print(_("こんなに多くのペットを制御できない!", "Too many pets to control at once!"));
1779 do_cmd_pet_dismiss(creature_ptr);
1781 upkeep_factor = calculate_upkeep(creature_ptr);
1783 msg_format(_("維持MPは %d%%", "Upkeep: %d%% mana."), upkeep_factor);
1788 /* Poisoned or cut yields no healing */
1789 if (creature_ptr->poisoned) regen_amount = 0;
1790 if (creature_ptr->cut) regen_amount = 0;
1792 /* Special floor -- Pattern, in a wall -- yields no healing */
1793 if (cave_no_regen) regen_amount = 0;
1795 regen_amount = (regen_amount * creature_ptr->mutant_regenerate_mod) / 100;
1797 /* Regenerate Hit Points if needed */
1798 if ((creature_ptr->chp < creature_ptr->mhp) && !cave_no_regen)
1800 regenhp(creature_ptr, regen_amount);
1805 * @brief 10ゲームターンが進行するごとに魔法効果の残りターンを減らしていく処理
1806 * / Handle timeout every 10 game turns
1809 static void process_world_aux_timeout(player_type *creature_ptr)
1811 const int dec_count = (easy_band ? 2 : 1);
1813 /*** Timeout Various Things ***/
1816 if (creature_ptr->tim_mimic)
1818 (void)set_mimic(creature_ptr, creature_ptr->tim_mimic - 1, creature_ptr->mimic_form, TRUE);
1821 /* Hack -- Hallucinating */
1822 if (creature_ptr->image)
1824 (void)set_image(creature_ptr, creature_ptr->image - dec_count);
1828 if (creature_ptr->blind)
1830 (void)set_blind(creature_ptr, creature_ptr->blind - dec_count);
1833 /* Times see-invisible */
1834 if (creature_ptr->tim_invis)
1836 (void)set_tim_invis(creature_ptr, creature_ptr->tim_invis - 1, TRUE);
1839 if (creature_ptr->suppress_multi_reward)
1841 creature_ptr->suppress_multi_reward = FALSE;
1845 if (creature_ptr->tim_esp)
1847 (void)set_tim_esp(creature_ptr, creature_ptr->tim_esp - 1, TRUE);
1850 /* Timed temporary elemental brands. -LM- */
1851 if (creature_ptr->ele_attack)
1853 creature_ptr->ele_attack--;
1855 /* Clear all temporary elemental brands. */
1856 if (!creature_ptr->ele_attack) set_ele_attack(creature_ptr, 0, 0);
1859 /* Timed temporary elemental immune. -LM- */
1860 if (creature_ptr->ele_immune)
1862 creature_ptr->ele_immune--;
1864 /* Clear all temporary elemental brands. */
1865 if (!creature_ptr->ele_immune) set_ele_immune(creature_ptr, 0, 0);
1868 /* Timed infra-vision */
1869 if (creature_ptr->tim_infra)
1871 (void)set_tim_infra(creature_ptr, creature_ptr->tim_infra - 1, TRUE);
1875 if (creature_ptr->tim_stealth)
1877 (void)set_tim_stealth(creature_ptr, creature_ptr->tim_stealth - 1, TRUE);
1880 /* Timed levitation */
1881 if (creature_ptr->tim_levitation)
1883 (void)set_tim_levitation(creature_ptr, creature_ptr->tim_levitation - 1, TRUE);
1886 /* Timed sh_touki */
1887 if (creature_ptr->tim_sh_touki)
1889 (void)set_tim_sh_touki(creature_ptr, creature_ptr->tim_sh_touki - 1, TRUE);
1893 if (creature_ptr->tim_sh_fire)
1895 (void)set_tim_sh_fire(creature_ptr, creature_ptr->tim_sh_fire - 1, TRUE);
1899 if (creature_ptr->tim_sh_holy)
1901 (void)set_tim_sh_holy(creature_ptr, creature_ptr->tim_sh_holy - 1, TRUE);
1905 if (creature_ptr->tim_eyeeye)
1907 (void)set_tim_eyeeye(creature_ptr, creature_ptr->tim_eyeeye - 1, TRUE);
1910 /* Timed resist-magic */
1911 if (creature_ptr->resist_magic)
1913 (void)set_resist_magic(creature_ptr, creature_ptr->resist_magic - 1, TRUE);
1916 /* Timed regeneration */
1917 if (creature_ptr->tim_regen)
1919 (void)set_tim_regen(creature_ptr, creature_ptr->tim_regen - 1, TRUE);
1922 /* Timed resist nether */
1923 if (creature_ptr->tim_res_nether)
1925 (void)set_tim_res_nether(creature_ptr, creature_ptr->tim_res_nether - 1, TRUE);
1928 /* Timed resist time */
1929 if (creature_ptr->tim_res_time)
1931 (void)set_tim_res_time(creature_ptr, creature_ptr->tim_res_time - 1, TRUE);
1935 if (creature_ptr->tim_reflect)
1937 (void)set_tim_reflect(creature_ptr, creature_ptr->tim_reflect - 1, TRUE);
1941 if (creature_ptr->multishadow)
1943 (void)set_multishadow(creature_ptr, creature_ptr->multishadow - 1, TRUE);
1946 /* Timed Robe of dust */
1947 if (creature_ptr->dustrobe)
1949 (void)set_dustrobe(creature_ptr, creature_ptr->dustrobe - 1, TRUE);
1952 /* Timed infra-vision */
1953 if (creature_ptr->kabenuke)
1955 (void)set_kabenuke(creature_ptr, creature_ptr->kabenuke - 1, TRUE);
1959 if (creature_ptr->paralyzed)
1961 (void)set_paralyzed(creature_ptr, creature_ptr->paralyzed - dec_count);
1965 if (creature_ptr->confused)
1967 (void)set_confused(creature_ptr, creature_ptr->confused - dec_count);
1971 if (creature_ptr->afraid)
1973 (void)set_afraid(creature_ptr, creature_ptr->afraid - dec_count);
1977 if (creature_ptr->fast)
1979 (void)set_fast(creature_ptr, creature_ptr->fast - 1, TRUE);
1983 if (creature_ptr->slow)
1985 (void)set_slow(creature_ptr, creature_ptr->slow - dec_count, TRUE);
1988 /* Protection from evil */
1989 if (creature_ptr->protevil)
1991 (void)set_protevil(creature_ptr, creature_ptr->protevil - 1, TRUE);
1994 /* Invulnerability */
1995 if (creature_ptr->invuln)
1997 (void)set_invuln(creature_ptr, creature_ptr->invuln - 1, TRUE);
2001 if (creature_ptr->wraith_form)
2003 (void)set_wraith_form(creature_ptr, creature_ptr->wraith_form - 1, TRUE);
2007 if (creature_ptr->hero)
2009 (void)set_hero(creature_ptr, creature_ptr->hero - 1, TRUE);
2013 if (creature_ptr->shero)
2015 (void)set_shero(creature_ptr, creature_ptr->shero - 1, TRUE);
2019 if (creature_ptr->blessed)
2021 (void)set_blessed(creature_ptr, creature_ptr->blessed - 1, TRUE);
2025 if (creature_ptr->shield)
2027 (void)set_shield(creature_ptr, creature_ptr->shield - 1, TRUE);
2031 if (creature_ptr->tsubureru)
2033 (void)set_tsubureru(creature_ptr, creature_ptr->tsubureru - 1, TRUE);
2037 if (creature_ptr->magicdef)
2039 (void)set_magicdef(creature_ptr, creature_ptr->magicdef - 1, TRUE);
2043 if (creature_ptr->tsuyoshi)
2045 (void)set_tsuyoshi(creature_ptr, creature_ptr->tsuyoshi - 1, TRUE);
2049 if (creature_ptr->oppose_acid)
2051 (void)set_oppose_acid(creature_ptr, creature_ptr->oppose_acid - 1, TRUE);
2054 /* Oppose Lightning */
2055 if (creature_ptr->oppose_elec)
2057 (void)set_oppose_elec(creature_ptr, creature_ptr->oppose_elec - 1, TRUE);
2061 if (creature_ptr->oppose_fire)
2063 (void)set_oppose_fire(creature_ptr, creature_ptr->oppose_fire - 1, TRUE);
2067 if (creature_ptr->oppose_cold)
2069 (void)set_oppose_cold(creature_ptr, creature_ptr->oppose_cold - 1, TRUE);
2073 if (creature_ptr->oppose_pois)
2075 (void)set_oppose_pois(creature_ptr, creature_ptr->oppose_pois - 1, TRUE);
2078 if (creature_ptr->ult_res)
2080 (void)set_ultimate_res(creature_ptr, creature_ptr->ult_res - 1, TRUE);
2083 /*** Poison and Stun and Cut ***/
2086 if (creature_ptr->poisoned)
2088 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
2090 /* Apply some healing */
2091 (void)set_poisoned(creature_ptr, creature_ptr->poisoned - adjust);
2095 if (creature_ptr->stun)
2097 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
2099 /* Apply some healing */
2100 (void)set_stun(creature_ptr, creature_ptr->stun - adjust);
2104 if (creature_ptr->cut)
2106 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
2108 /* Hack -- Truly "mortal" wound */
2109 if (creature_ptr->cut > 1000) adjust = 0;
2111 /* Apply some healing */
2112 (void)set_cut(creature_ptr, creature_ptr->cut - adjust);
2118 * @brief 10ゲームターンが進行する毎に光源の寿命を減らす処理
2119 * / Handle burning fuel every 10 game turns
2122 static void process_world_aux_light(player_type *creature_ptr)
2124 /* Check for light being wielded */
2125 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
2127 /* Burn some fuel in the current lite */
2128 if (o_ptr->tval == TV_LITE)
2130 /* Hack -- Use some fuel (except on artifacts) */
2131 if (!(object_is_fixed_artifact(o_ptr) || o_ptr->sval == SV_LITE_FEANOR) && (o_ptr->xtra4 > 0))
2133 /* Decrease life-span */
2134 if (o_ptr->name2 == EGO_LITE_LONG)
2136 if (current_world_ptr->game_turn % (TURNS_PER_TICK * 2)) o_ptr->xtra4--;
2138 else o_ptr->xtra4--;
2140 /* Notice interesting fuel steps */
2141 notice_lite_change(creature_ptr, o_ptr);
2148 * @brief 10ゲームターンが進行するごとに突然変異の発動判定を行う処理
2149 * / Handle mutation effects once every 10 game turns
2152 static void process_world_aux_mutation(player_type *creature_ptr)
2154 /* No mutation with effects */
2155 if (!creature_ptr->muta2) return;
2157 /* No effect on monster arena */
2158 if (creature_ptr->phase_out) return;
2160 /* No effect on the global map */
2161 if (creature_ptr->wild_mode) return;
2163 if ((creature_ptr->muta2 & MUT2_BERS_RAGE) && one_in_(3000))
2165 disturb(creature_ptr, FALSE, TRUE);
2166 msg_print(_("ウガァァア!", "RAAAAGHH!"));
2167 msg_print(_("激怒の発作に襲われた!", "You feel a fit of rage coming over you!"));
2168 (void)set_shero(creature_ptr, 10 + randint1(creature_ptr->lev), FALSE);
2169 (void)set_afraid(creature_ptr, 0);
2172 if ((creature_ptr->muta2 & MUT2_COWARDICE) && (randint1(3000) == 13))
2174 if (!creature_ptr->resist_fear)
2176 disturb(creature_ptr, FALSE, TRUE);
2177 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
2178 set_afraid(creature_ptr, creature_ptr->afraid + 13 + randint1(26));
2182 if ((creature_ptr->muta2 & MUT2_RTELEPORT) && (randint1(5000) == 88))
2184 if (!creature_ptr->resist_nexus && !(creature_ptr->muta1 & MUT1_VTELEPORT) && !creature_ptr->anti_tele)
2186 disturb(creature_ptr, FALSE, TRUE);
2187 msg_print(_("あなたの位置は突然ひじょうに不確定になった...", "Your position suddenly seems very uncertain..."));
2189 teleport_player(creature_ptr, 40, TELEPORT_PASSIVE);
2193 if ((creature_ptr->muta2 & MUT2_ALCOHOL) && (randint1(6400) == 321))
2195 if (!creature_ptr->resist_conf && !creature_ptr->resist_chaos)
2197 disturb(creature_ptr, FALSE, TRUE);
2198 creature_ptr->redraw |= PR_EXTRA;
2199 msg_print(_("いひきがもーろーとひてきたきがふる...ヒック!", "You feel a SSSCHtupor cOmINg over yOu... *HIC*!"));
2202 if (!creature_ptr->resist_conf)
2204 (void)set_confused(creature_ptr, creature_ptr->confused + randint0(20) + 15);
2207 if (!creature_ptr->resist_chaos)
2212 if (one_in_(3)) lose_all_info(creature_ptr);
2213 else wiz_dark(creature_ptr);
2214 (void)teleport_player_aux(creature_ptr, 100, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE);
2215 wiz_dark(creature_ptr);
2216 msg_print(_("あなたは見知らぬ場所で目が醒めた...頭が痛い。", "You wake up somewhere with a sore head..."));
2217 msg_print(_("何も覚えていない。どうやってここに来たかも分からない!", "You can't remember a thing, or how you got here!"));
2223 msg_print(_("き~れいなちょおちょらとんれいる~", "Thishcischs GooDSChtuff!"));
2224 (void)set_image(creature_ptr, creature_ptr->image + randint0(150) + 150);
2230 if ((creature_ptr->muta2 & MUT2_HALLU) && (randint1(6400) == 42))
2232 if (!creature_ptr->resist_chaos)
2234 disturb(creature_ptr, FALSE, TRUE);
2235 creature_ptr->redraw |= PR_EXTRA;
2236 (void)set_image(creature_ptr, creature_ptr->image + randint0(50) + 20);
2240 if ((creature_ptr->muta2 & MUT2_FLATULENT) && (randint1(3000) == 13))
2242 disturb(creature_ptr, FALSE, TRUE);
2243 msg_print(_("ブゥーーッ!おっと。", "BRRAAAP! Oops."));
2245 fire_ball(creature_ptr, GF_POIS, 0, creature_ptr->lev, 3);
2248 if ((creature_ptr->muta2 & MUT2_PROD_MANA) &&
2249 !creature_ptr->anti_magic && one_in_(9000))
2252 disturb(creature_ptr, FALSE, TRUE);
2253 msg_print(_("魔法のエネルギーが突然あなたの中に流れ込んできた!エネルギーを解放しなければならない!",
2254 "Magical energy flows through you! You must release it!"));
2258 (void)get_hack_dir(creature_ptr, &dire);
2259 fire_ball(creature_ptr, GF_MANA, dire, creature_ptr->lev * 2, 3);
2262 if ((creature_ptr->muta2 & MUT2_ATT_DEMON) && !creature_ptr->anti_magic && (randint1(6666) == 666))
2264 bool pet = one_in_(6);
2265 BIT_FLAGS mode = PM_ALLOW_GROUP;
2267 if (pet) mode |= PM_FORCE_PET;
2268 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2270 if (summon_specific(creature_ptr, (pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DEMON, mode))
2272 msg_print(_("あなたはデーモンを引き寄せた!", "You have attracted a demon!"));
2273 disturb(creature_ptr, FALSE, TRUE);
2277 if ((creature_ptr->muta2 & MUT2_SPEED_FLUX) && one_in_(6000))
2279 disturb(creature_ptr, FALSE, TRUE);
2282 msg_print(_("精力的でなくなった気がする。", "You feel less energetic."));
2284 if (creature_ptr->fast > 0)
2286 set_fast(creature_ptr, 0, TRUE);
2290 set_slow(creature_ptr, randint1(30) + 10, FALSE);
2295 msg_print(_("精力的になった気がする。", "You feel more energetic."));
2297 if (creature_ptr->slow > 0)
2299 set_slow(creature_ptr, 0, TRUE);
2303 set_fast(creature_ptr, randint1(30) + 10, FALSE);
2308 if ((creature_ptr->muta2 & MUT2_BANISH_ALL) && one_in_(9000))
2310 disturb(creature_ptr, FALSE, TRUE);
2311 msg_print(_("突然ほとんど孤独になった気がする。", "You suddenly feel almost lonely."));
2313 banish_monsters(creature_ptr, 100);
2314 if (!creature_ptr->current_floor_ptr->dun_level && creature_ptr->town_num)
2318 /* Pick a random shop (except home) */
2321 n = randint0(MAX_STORES);
2322 } while ((n == STORE_HOME) || (n == STORE_MUSEUM));
2324 msg_print(_("店の主人が丘に向かって走っている!", "You see one of the shopkeepers running for the hills!"));
2325 store_shuffle(creature_ptr, n);
2330 if ((creature_ptr->muta2 & MUT2_EAT_LIGHT) && one_in_(3000))
2334 msg_print(_("影につつまれた。", "A shadow passes over you."));
2337 /* Absorb light from the current possition */
2338 if ((creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
2340 hp_player(creature_ptr, 10);
2343 o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
2345 /* Absorb some fuel in the current lite */
2346 if (o_ptr->tval == TV_LITE)
2348 /* Use some fuel (except on artifacts) */
2349 if (!object_is_fixed_artifact(o_ptr) && (o_ptr->xtra4 > 0))
2351 /* Heal the player a bit */
2352 hp_player(creature_ptr, o_ptr->xtra4 / 20);
2354 /* Decrease life-span of lite */
2356 msg_print(_("光源からエネルギーを吸収した!", "You absorb energy from your light!"));
2358 /* Notice interesting fuel steps */
2359 notice_lite_change(creature_ptr, o_ptr);
2364 * Unlite the area (radius 10) around player and
2365 * do 50 points damage to every affected monster
2367 unlite_area(creature_ptr, 50, 10);
2370 if ((creature_ptr->muta2 & MUT2_ATT_ANIMAL) && !creature_ptr->anti_magic && one_in_(7000))
2372 bool pet = one_in_(3);
2373 BIT_FLAGS mode = PM_ALLOW_GROUP;
2375 if (pet) mode |= PM_FORCE_PET;
2376 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2378 if (summon_specific(creature_ptr, (pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_ANIMAL, mode))
2380 msg_print(_("動物を引き寄せた!", "You have attracted an animal!"));
2381 disturb(creature_ptr, FALSE, TRUE);
2385 if ((creature_ptr->muta2 & MUT2_RAW_CHAOS) && !creature_ptr->anti_magic && one_in_(8000))
2387 disturb(creature_ptr, FALSE, TRUE);
2388 msg_print(_("周りの空間が歪んでいる気がする!", "You feel the world warping around you!"));
2391 fire_ball(creature_ptr, GF_CHAOS, 0, creature_ptr->lev, 8);
2393 if ((creature_ptr->muta2 & MUT2_NORMALITY) && one_in_(5000))
2395 if (!lose_mutation(creature_ptr, 0))
2396 msg_print(_("奇妙なくらい普通になった気がする。", "You feel oddly normal."));
2398 if ((creature_ptr->muta2 & MUT2_WRAITH) && !creature_ptr->anti_magic && one_in_(3000))
2400 disturb(creature_ptr, FALSE, TRUE);
2401 msg_print(_("非物質化した!", "You feel insubstantial!"));
2404 set_wraith_form(creature_ptr, randint1(creature_ptr->lev / 2) + (creature_ptr->lev / 2), FALSE);
2406 if ((creature_ptr->muta2 & MUT2_POLY_WOUND) && one_in_(3000))
2408 do_poly_wounds(creature_ptr);
2410 if ((creature_ptr->muta2 & MUT2_WASTING) && one_in_(3000))
2412 int which_stat = randint0(A_MAX);
2413 int sustained = FALSE;
2418 if (creature_ptr->sustain_str) sustained = TRUE;
2421 if (creature_ptr->sustain_int) sustained = TRUE;
2424 if (creature_ptr->sustain_wis) sustained = TRUE;
2427 if (creature_ptr->sustain_dex) sustained = TRUE;
2430 if (creature_ptr->sustain_con) sustained = TRUE;
2433 if (creature_ptr->sustain_chr) sustained = TRUE;
2436 msg_print(_("不正な状態!", "Invalid stat chosen!"));
2442 disturb(creature_ptr, FALSE, TRUE);
2443 msg_print(_("自分が衰弱していくのが分かる!", "You can feel yourself wasting away!"));
2445 (void)dec_stat(creature_ptr, which_stat, randint1(6) + 6, one_in_(3));
2448 if ((creature_ptr->muta2 & MUT2_ATT_DRAGON) && !creature_ptr->anti_magic && one_in_(3000))
2450 bool pet = one_in_(5);
2451 BIT_FLAGS mode = PM_ALLOW_GROUP;
2453 if (pet) mode |= PM_FORCE_PET;
2454 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2456 if (summon_specific(creature_ptr, (pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DRAGON, mode))
2458 msg_print(_("ドラゴンを引き寄せた!", "You have attracted a dragon!"));
2459 disturb(creature_ptr, FALSE, TRUE);
2462 if ((creature_ptr->muta2 & MUT2_WEIRD_MIND) && !creature_ptr->anti_magic && one_in_(3000))
2464 if (creature_ptr->tim_esp > 0)
2466 msg_print(_("精神にもやがかかった!", "Your mind feels cloudy!"));
2467 set_tim_esp(creature_ptr, 0, TRUE);
2471 msg_print(_("精神が広がった!", "Your mind expands!"));
2472 set_tim_esp(creature_ptr, creature_ptr->lev, FALSE);
2475 if ((creature_ptr->muta2 & MUT2_NAUSEA) && !creature_ptr->slow_digest && one_in_(9000))
2477 disturb(creature_ptr, FALSE, TRUE);
2478 msg_print(_("胃が痙攣し、食事を失った!", "Your stomach roils, and you lose your lunch!"));
2480 set_food(creature_ptr, PY_FOOD_WEAK);
2481 if (music_singing_any(creature_ptr)) stop_singing(creature_ptr);
2482 if (hex_spelling_any(creature_ptr)) stop_hex_spell_all(creature_ptr);
2485 if ((creature_ptr->muta2 & MUT2_WALK_SHAD) && !creature_ptr->anti_magic && one_in_(12000) && !creature_ptr->current_floor_ptr->inside_arena)
2487 reserve_alter_reality(creature_ptr);
2490 if ((creature_ptr->muta2 & MUT2_WARNING) && one_in_(1000))
2492 int danger_amount = 0;
2493 MONSTER_IDX monster;
2495 for (monster = 0; monster < creature_ptr->current_floor_ptr->m_max; monster++)
2497 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[monster];
2498 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2499 if (!monster_is_valid(m_ptr)) continue;
2501 if (r_ptr->level >= creature_ptr->lev)
2503 danger_amount += r_ptr->level - creature_ptr->lev + 1;
2507 if (danger_amount > 100)
2508 msg_print(_("非常に恐ろしい気がする!", "You feel utterly terrified!"));
2509 else if (danger_amount > 50)
2510 msg_print(_("恐ろしい気がする!", "You feel terrified!"));
2511 else if (danger_amount > 20)
2512 msg_print(_("非常に心配な気がする!", "You feel very worried!"));
2513 else if (danger_amount > 10)
2514 msg_print(_("心配な気がする!", "You feel paranoid!"));
2515 else if (danger_amount > 5)
2516 msg_print(_("ほとんど安全な気がする。", "You feel almost safe."));
2518 msg_print(_("寂しい気がする。", "You feel lonely."));
2521 if ((creature_ptr->muta2 & MUT2_INVULN) && !creature_ptr->anti_magic && one_in_(5000))
2523 disturb(creature_ptr, FALSE, TRUE);
2524 msg_print(_("無敵な気がする!", "You feel invincible!"));
2526 (void)set_invuln(creature_ptr, randint1(8) + 8, FALSE);
2529 if ((creature_ptr->muta2 & MUT2_SP_TO_HP) && one_in_(2000))
2531 MANA_POINT wounds = (MANA_POINT)(creature_ptr->mhp - creature_ptr->chp);
2535 HIT_POINT healing = creature_ptr->csp;
2536 if (healing > wounds) healing = wounds;
2538 hp_player(creature_ptr, healing);
2539 creature_ptr->csp -= healing;
2540 creature_ptr->redraw |= (PR_HP | PR_MANA);
2544 if ((creature_ptr->muta2 & MUT2_HP_TO_SP) && !creature_ptr->anti_magic && one_in_(4000))
2546 HIT_POINT wounds = (HIT_POINT)(creature_ptr->msp - creature_ptr->csp);
2550 HIT_POINT healing = creature_ptr->chp;
2551 if (healing > wounds) healing = wounds;
2553 creature_ptr->csp += healing;
2554 creature_ptr->redraw |= (PR_HP | PR_MANA);
2555 take_hit(creature_ptr, DAMAGE_LOSELIFE, healing, _("頭に昇った血", "blood rushing to the head"), -1);
2559 if ((creature_ptr->muta2 & MUT2_DISARM) && one_in_(10000))
2561 INVENTORY_IDX slot = 0;
2562 object_type *o_ptr = NULL;
2564 disturb(creature_ptr, FALSE, TRUE);
2565 msg_print(_("足がもつれて転んだ!", "You trip over your own feet!"));
2566 take_hit(creature_ptr, DAMAGE_NOESCAPE, randint1(creature_ptr->wt / 6), _("転倒", "tripping"), -1);
2569 if (has_melee_weapon(creature_ptr, INVEN_RARM))
2572 o_ptr = &creature_ptr->inventory_list[INVEN_RARM];
2574 if (has_melee_weapon(creature_ptr, INVEN_LARM) && one_in_(2))
2576 o_ptr = &creature_ptr->inventory_list[INVEN_LARM];
2580 else if (has_melee_weapon(creature_ptr, INVEN_LARM))
2582 o_ptr = &creature_ptr->inventory_list[INVEN_LARM];
2585 if (slot && !object_is_cursed(o_ptr))
2587 msg_print(_("武器を落としてしまった!", "You drop your weapon!"));
2588 drop_from_inventory(creature_ptr, slot, 1);
2595 * @brief 10ゲームターンが進行するごとに装備効果の発動判定を行う処理
2596 * / Handle curse effects once every 10 game turns
2599 static void process_world_aux_curse(player_type *creature_ptr)
2601 if ((creature_ptr->cursed & TRC_P_FLAG_MASK) && !creature_ptr->phase_out && !creature_ptr->wild_mode)
2604 * Hack: Uncursed teleporting items (e.g. Trump Weapons)
2605 * can actually be useful!
2607 if ((creature_ptr->cursed & TRC_TELEPORT_SELF) && one_in_(200))
2609 GAME_TEXT o_name[MAX_NLEN];
2611 int i, i_keep = 0, count = 0;
2613 /* Scan the equipment with random teleport ability */
2614 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
2616 BIT_FLAGS flgs[TR_FLAG_SIZE];
2617 o_ptr = &creature_ptr->inventory_list[i];
2618 if (!o_ptr->k_idx) continue;
2620 object_flags(o_ptr, flgs);
2622 if (have_flag(flgs, TR_TELEPORT))
2624 /* {.} will stop random teleportation. */
2625 if (!o_ptr->inscription || !my_strchr(quark_str(o_ptr->inscription), '.'))
2628 if (one_in_(count)) i_keep = i;
2633 o_ptr = &creature_ptr->inventory_list[i_keep];
2634 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2635 msg_format(_("%sがテレポートの能力を発動させようとしている。", "Your %s is activating teleportation."), o_name);
2636 if (get_check_strict(_("テレポートしますか?", "Teleport? "), CHECK_OKAY_CANCEL))
2638 disturb(creature_ptr, FALSE, TRUE);
2639 teleport_player(creature_ptr, 50, 0L);
2643 msg_format(_("%sに{.}(ピリオド)と銘を刻むと発動を抑制できます。",
2644 "You can inscribe {.} on your %s to disable random teleportation. "), o_name);
2645 disturb(creature_ptr, TRUE, TRUE);
2648 /* Make a chainsword noise */
2649 if ((creature_ptr->cursed & TRC_CHAINSWORD) && one_in_(CHAINSWORD_NOISE))
2652 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, noise))
2654 disturb(creature_ptr, FALSE, FALSE);
2657 if ((creature_ptr->cursed & TRC_TY_CURSE) && one_in_(TY_CURSE_CHANCE))
2660 (void)activate_ty_curse(creature_ptr, FALSE, &count);
2662 /* Handle experience draining */
2663 if (creature_ptr->prace != RACE_ANDROID && ((creature_ptr->cursed & TRC_DRAIN_EXP) && one_in_(4)))
2665 creature_ptr->exp -= (creature_ptr->lev + 1) / 2;
2666 if (creature_ptr->exp < 0) creature_ptr->exp = 0;
2667 creature_ptr->max_exp -= (creature_ptr->lev + 1) / 2;
2668 if (creature_ptr->max_exp < 0) creature_ptr->max_exp = 0;
2669 check_experience(creature_ptr);
2671 /* Add light curse (Later) */
2672 if ((creature_ptr->cursed & TRC_ADD_L_CURSE) && one_in_(2000))
2674 BIT_FLAGS new_curse;
2677 o_ptr = choose_cursed_obj_name(creature_ptr, TRC_ADD_L_CURSE);
2679 new_curse = get_curse(0, o_ptr);
2680 if (!(o_ptr->curse_flags & new_curse))
2682 GAME_TEXT o_name[MAX_NLEN];
2684 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2686 o_ptr->curse_flags |= new_curse;
2687 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2689 o_ptr->feeling = FEEL_NONE;
2691 creature_ptr->update |= (PU_BONUS);
2694 /* Add heavy curse (Later) */
2695 if ((creature_ptr->cursed & TRC_ADD_H_CURSE) && one_in_(2000))
2697 BIT_FLAGS new_curse;
2700 o_ptr = choose_cursed_obj_name(creature_ptr, TRC_ADD_H_CURSE);
2702 new_curse = get_curse(1, o_ptr);
2703 if (!(o_ptr->curse_flags & new_curse))
2705 GAME_TEXT o_name[MAX_NLEN];
2707 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2709 o_ptr->curse_flags |= new_curse;
2710 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2711 o_ptr->feeling = FEEL_NONE;
2713 creature_ptr->update |= (PU_BONUS);
2717 if ((creature_ptr->cursed & TRC_CALL_ANIMAL) && one_in_(2500))
2719 if (summon_specific(creature_ptr, 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)))
2721 GAME_TEXT o_name[MAX_NLEN];
2723 object_desc(o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_ANIMAL), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2724 msg_format(_("%sが動物を引き寄せた!", "Your %s has attracted an animal!"), o_name);
2725 disturb(creature_ptr, FALSE, TRUE);
2729 if ((creature_ptr->cursed & TRC_CALL_DEMON) && one_in_(1111))
2731 if (summon_specific(creature_ptr, 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)))
2733 GAME_TEXT o_name[MAX_NLEN];
2735 object_desc(o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_DEMON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2736 msg_format(_("%sが悪魔を引き寄せた!", "Your %s has attracted a demon!"), o_name);
2737 disturb(creature_ptr, FALSE, TRUE);
2741 if ((creature_ptr->cursed & TRC_CALL_DRAGON) && one_in_(800))
2743 if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DRAGON,
2744 (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2746 GAME_TEXT o_name[MAX_NLEN];
2748 object_desc(o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_DRAGON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2749 msg_format(_("%sがドラゴンを引き寄せた!", "Your %s has attracted an dragon!"), o_name);
2750 disturb(creature_ptr, FALSE, TRUE);
2754 if ((creature_ptr->cursed & TRC_CALL_UNDEAD) && one_in_(1111))
2756 if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_UNDEAD,
2757 (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2759 GAME_TEXT o_name[MAX_NLEN];
2761 object_desc(o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_UNDEAD), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2762 msg_format(_("%sが死霊を引き寄せた!", "Your %s has attracted an undead!"), o_name);
2763 disturb(creature_ptr, FALSE, TRUE);
2766 if ((creature_ptr->cursed & TRC_COWARDICE) && one_in_(1500))
2768 if (!creature_ptr->resist_fear)
2770 disturb(creature_ptr, FALSE, TRUE);
2771 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
2772 set_afraid(creature_ptr, creature_ptr->afraid + 13 + randint1(26));
2775 /* Teleport player */
2776 if ((creature_ptr->cursed & TRC_TELEPORT) && one_in_(200) && !creature_ptr->anti_tele)
2778 disturb(creature_ptr, FALSE, TRUE);
2780 /* Teleport player */
2781 teleport_player(creature_ptr, 40, TELEPORT_PASSIVE);
2783 /* Handle HP draining */
2784 if ((creature_ptr->cursed & TRC_DRAIN_HP) && one_in_(666))
2786 GAME_TEXT o_name[MAX_NLEN];
2788 object_desc(o_name, choose_cursed_obj_name(creature_ptr, TRC_DRAIN_HP), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2789 msg_format(_("%sはあなたの体力を吸収した!", "Your %s drains HP from you!"), o_name);
2790 take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev * 2, 100), o_name, -1);
2792 /* Handle mana draining */
2793 if ((creature_ptr->cursed & TRC_DRAIN_MANA) && creature_ptr->csp && one_in_(666))
2795 GAME_TEXT o_name[MAX_NLEN];
2797 object_desc(o_name, choose_cursed_obj_name(creature_ptr, TRC_DRAIN_MANA), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2798 msg_format(_("%sはあなたの魔力を吸収した!", "Your %s drains mana from you!"), o_name);
2799 creature_ptr->csp -= MIN(creature_ptr->lev, 50);
2800 if (creature_ptr->csp < 0)
2802 creature_ptr->csp = 0;
2803 creature_ptr->csp_frac = 0;
2805 creature_ptr->redraw |= PR_MANA;
2809 /* Rarely, take damage from the Jewel of Judgement */
2810 if (one_in_(999) && !creature_ptr->anti_magic)
2812 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
2814 if (o_ptr->name1 == ART_JUDGE)
2816 if (object_is_known(o_ptr))
2817 msg_print(_("『審判の宝石』はあなたの体力を吸収した!", "The Jewel of Judgement drains life from you!"));
2819 msg_print(_("なにかがあなたの体力を吸収した!", "Something drains life from you!"));
2820 take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev, 50), _("審判の宝石", "the Jewel of Judgement"), -1);
2827 * @brief 10ゲームターンが進行するごとに魔道具の自然充填を行う処理
2828 * / Handle recharging objects once every 10 game turns
2831 static void process_world_aux_recharge(player_type *creature_ptr)
2836 /* Process equipment */
2837 for (changed = FALSE, i = INVEN_RARM; i < INVEN_TOTAL; i++)
2839 /* Get the object */
2840 object_type *o_ptr = &creature_ptr->inventory_list[i];
2841 if (!o_ptr->k_idx) continue;
2843 /* Recharge activatable objects */
2844 if (o_ptr->timeout > 0)
2849 /* Notice changes */
2850 if (!o_ptr->timeout)
2852 recharged_notice(creature_ptr, o_ptr);
2858 /* Notice changes */
2861 creature_ptr->window |= (PW_EQUIP);
2866 * Recharge rods. Rods now use timeout to control charging status,
2867 * and each charging rod in a stack decreases the stack's timeout by
2868 * one per turn. -LM-
2870 for (changed = FALSE, i = 0; i < INVEN_PACK; i++)
2872 object_type *o_ptr = &creature_ptr->inventory_list[i];
2873 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2874 if (!o_ptr->k_idx) continue;
2876 /* Examine all charging rods or stacks of charging rods. */
2877 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2879 /* Determine how many rods are charging. */
2880 TIME_EFFECT temp = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval;
2881 if (temp > o_ptr->number) temp = (TIME_EFFECT)o_ptr->number;
2883 /* Decrease timeout by that number. */
2884 o_ptr->timeout -= temp;
2886 /* Boundary control. */
2887 if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2889 /* Notice changes, provide message if object is inscribed. */
2890 if (!(o_ptr->timeout))
2892 recharged_notice(creature_ptr, o_ptr);
2896 /* One of the stack of rod is charged */
2897 else if (o_ptr->timeout % k_ptr->pval)
2904 /* Notice changes */
2907 creature_ptr->window |= (PW_INVEN);
2911 /* Process objects on floor */
2912 for (i = 1; i < creature_ptr->current_floor_ptr->o_max; i++)
2914 object_type *o_ptr = &creature_ptr->current_floor_ptr->o_list[i];
2916 if (!OBJECT_IS_VALID(o_ptr)) continue;
2918 /* Recharge rods on the ground. No messages. */
2919 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2922 o_ptr->timeout -= (TIME_EFFECT)o_ptr->number;
2924 /* Boundary control. */
2925 if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2932 * @brief 10ゲームターンが進行するごとに帰還や現実変容などの残り時間カウントダウンと発動を処理する。
2933 * / Handle involuntary movement once every 10 game turns
2936 static void process_world_aux_movement(player_type *creature_ptr)
2938 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
2939 /* Delayed Word-of-Recall */
2940 if (creature_ptr->word_recall)
2943 * HACK: Autosave BEFORE resetting the recall counter (rr9)
2944 * The player is yanked up/down as soon as
2945 * he loads the autosaved game.
2947 if (autosave_l && (creature_ptr->word_recall == 1) && !creature_ptr->phase_out)
2948 do_cmd_save_game(creature_ptr, TRUE);
2950 /* Count down towards recall */
2951 creature_ptr->word_recall--;
2953 creature_ptr->redraw |= (PR_STATUS);
2955 /* Activate the recall */
2956 if (!creature_ptr->word_recall)
2959 disturb(creature_ptr, FALSE, TRUE);
2961 /* Determine the level */
2962 if (floor_ptr->dun_level || creature_ptr->current_floor_ptr->inside_quest || creature_ptr->enter_dungeon)
2964 msg_print(_("上に引っ張りあげられる感じがする!", "You feel yourself yanked upwards!"));
2966 if (creature_ptr->dungeon_idx) creature_ptr->recall_dungeon = creature_ptr->dungeon_idx;
2968 exe_write_diary(creature_ptr, DIARY_RECALL, floor_ptr->dun_level, NULL);
2970 floor_ptr->dun_level = 0;
2971 creature_ptr->dungeon_idx = 0;
2973 leave_quest_check(creature_ptr);
2974 leave_tower_check(creature_ptr);
2976 creature_ptr->current_floor_ptr->inside_quest = 0;
2978 creature_ptr->leaving = TRUE;
2982 msg_print(_("下に引きずり降ろされる感じがする!", "You feel yourself yanked downwards!"));
2984 creature_ptr->dungeon_idx = creature_ptr->recall_dungeon;
2987 exe_write_diary(creature_ptr, DIARY_RECALL, floor_ptr->dun_level, NULL);
2990 floor_ptr->dun_level = max_dlv[creature_ptr->dungeon_idx];
2991 if (floor_ptr->dun_level < 1) floor_ptr->dun_level = 1;
2993 /* Nightmare mode makes recall more dangerous */
2994 if (ironman_nightmare && !randint0(666) && (creature_ptr->dungeon_idx == DUNGEON_ANGBAND))
2996 if (floor_ptr->dun_level < 50)
2998 floor_ptr->dun_level *= 2;
3000 else if (floor_ptr->dun_level < 99)
3002 floor_ptr->dun_level = (floor_ptr->dun_level + 99) / 2;
3004 else if (floor_ptr->dun_level > 100)
3006 floor_ptr->dun_level = d_info[creature_ptr->dungeon_idx].maxdepth - 1;
3010 if (creature_ptr->wild_mode)
3012 creature_ptr->wilderness_y = creature_ptr->y;
3013 creature_ptr->wilderness_x = creature_ptr->x;
3017 /* Save player position */
3018 creature_ptr->oldpx = creature_ptr->x;
3019 creature_ptr->oldpy = creature_ptr->y;
3021 creature_ptr->wild_mode = FALSE;
3024 * Clear all saved floors
3025 * and create a first saved floor
3027 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
3028 creature_ptr->leaving = TRUE;
3030 if (creature_ptr->dungeon_idx == DUNGEON_ANGBAND)
3034 for (i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++)
3036 quest_type* const q_ptr = &quest[i];
3039 if ((q_ptr->type == QUEST_TYPE_RANDOM) &&
3040 (q_ptr->status == QUEST_STATUS_TAKEN) &&
3041 (q_ptr->level < floor_ptr->dun_level))
3043 q_ptr->status = QUEST_STATUS_FAILED;
3044 q_ptr->complev = (byte)creature_ptr->lev;
3046 q_ptr->comptime = current_world_ptr->play_time;
3047 r_info[q_ptr->r_idx].flags1 &= ~(RF1_QUESTOR);
3053 sound(SOUND_TPLEVEL);
3058 /* Delayed Alter reality */
3059 if (creature_ptr->alter_reality)
3061 if (autosave_l && (creature_ptr->alter_reality == 1) && !creature_ptr->phase_out)
3062 do_cmd_save_game(creature_ptr, TRUE);
3064 /* Count down towards alter */
3065 creature_ptr->alter_reality--;
3067 creature_ptr->redraw |= (PR_STATUS);
3069 /* Activate the alter reality */
3070 if (!creature_ptr->alter_reality)
3073 disturb(creature_ptr, FALSE, TRUE);
3075 /* Determine the level */
3076 if (!quest_number(creature_ptr, floor_ptr->dun_level) && floor_ptr->dun_level)
3078 msg_print(_("世界が変わった!", "The world changes!"));
3081 * Clear all saved floors
3082 * and create a first saved floor
3084 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
3085 creature_ptr->leaving = TRUE;
3089 msg_print(_("世界が少しの間変化したようだ。", "The world seems to change for a moment!"));
3092 sound(SOUND_TPLEVEL);
3098 * @brief 10ゲームターンが進行する毎にゲーム世界全体の処理を行う。
3099 * / Handle certain things once every 10 game turns
3102 static void process_world(player_type *player_ptr)
3106 const s32b A_DAY = TURNS_PER_TICK * TOWN_DAWN;
3107 s32b prev_turn_in_today = ((current_world_ptr->game_turn - TURNS_PER_TICK) % A_DAY + A_DAY / 4) % A_DAY;
3108 int prev_min = (1440 * prev_turn_in_today / A_DAY) % 60;
3110 extract_day_hour_min(player_ptr, &day, &hour, &min);
3112 /* Update dungeon feeling, and announce it if changed */
3113 update_dungeon_feeling(player_ptr);
3115 /* 帰還無しモード時のレベルテレポバグ対策 / Fix for level teleport bugs on ironman_downward.*/
3116 floor_type *floor_ptr = player_ptr->current_floor_ptr;
3117 if (ironman_downward && (player_ptr->dungeon_idx != DUNGEON_ANGBAND && player_ptr->dungeon_idx != 0))
3119 floor_ptr->dun_level = 0;
3120 player_ptr->dungeon_idx = 0;
3121 prepare_change_floor_mode(player_ptr, CFM_FIRST_FLOOR | CFM_RAND_PLACE);
3122 floor_ptr->inside_arena = FALSE;
3123 player_ptr->wild_mode = FALSE;
3124 player_ptr->leaving = TRUE;
3127 /*** Check monster arena ***/
3128 if (player_ptr->phase_out && !player_ptr->leaving)
3134 /* Count all hostile monsters */
3135 for (i2 = 0; i2 < floor_ptr->width; ++i2)
3136 for (j2 = 0; j2 < floor_ptr->height; j2++)
3138 grid_type *g_ptr = &floor_ptr->grid_array[j2][i2];
3140 if ((g_ptr->m_idx > 0) && (g_ptr->m_idx != player_ptr->riding))
3143 win_m_idx = g_ptr->m_idx;
3147 if (number_mon == 0)
3149 msg_print(_("相打ちに終わりました。", "They have kill each other at the same time."));
3151 player_ptr->energy_need = 0;
3152 update_gambling_monsters(player_ptr);
3154 else if ((number_mon - 1) == 0)
3156 GAME_TEXT m_name[MAX_NLEN];
3157 monster_type *wm_ptr;
3159 wm_ptr = &floor_ptr->m_list[win_m_idx];
3161 monster_desc(m_name, wm_ptr, 0);
3162 msg_format(_("%sが勝利した!", "%s is winner!"), m_name);
3165 if (win_m_idx == (sel_monster + 1))
3167 msg_print(_("おめでとうございます。", "Congratulations."));
3168 msg_format(_("%d$を受け取った。", "You received %d gold."), battle_odds);
3169 player_ptr->au += battle_odds;
3173 msg_print(_("残念でした。", "You lost gold."));
3176 player_ptr->energy_need = 0;
3177 update_gambling_monsters(player_ptr);
3179 else if (current_world_ptr->game_turn - floor_ptr->generated_turn == 150 * TURNS_PER_TICK)
3181 msg_print(_("申し分けありませんが、この勝負は引き分けとさせていただきます。", "This battle have ended in a draw."));
3182 player_ptr->au += kakekin;
3184 player_ptr->energy_need = 0;
3185 update_gambling_monsters(player_ptr);
3189 /* Every 10 game turns */
3190 if (current_world_ptr->game_turn % TURNS_PER_TICK) return;
3192 /*** Attempt timed autosave ***/
3193 if (autosave_t && autosave_freq && !player_ptr->phase_out)
3195 if (!(current_world_ptr->game_turn % ((s32b)autosave_freq * TURNS_PER_TICK)))
3196 do_cmd_save_game(player_ptr, TRUE);
3199 if (floor_ptr->monster_noise && !ignore_unview)
3201 msg_print(_("何かが聞こえた。", "You hear noise."));
3204 /*** Handle the wilderness/town (sunshine) ***/
3206 /* While in town/wilderness */
3207 if (!floor_ptr->dun_level && !floor_ptr->inside_quest && !player_ptr->phase_out && !floor_ptr->inside_arena)
3209 /* Hack -- Daybreak/Nighfall in town */
3210 if (!(current_world_ptr->game_turn % ((TURNS_PER_TICK * TOWN_DAWN) / 2)))
3214 /* Check for dawn */
3215 dawn = (!(current_world_ptr->game_turn % (TURNS_PER_TICK * TOWN_DAWN)));
3217 if (dawn) day_break(player_ptr);
3218 else night_falls(player_ptr);
3223 /* While in the dungeon (vanilla_town or lite_town mode only) */
3224 else if ((vanilla_town || (lite_town && !floor_ptr->inside_quest && !player_ptr->phase_out && !floor_ptr->inside_arena)) && floor_ptr->dun_level)
3226 /*** Shuffle the Storekeepers ***/
3228 /* Chance is only once a day (while in dungeon) */
3229 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * STORE_TICKS)))
3231 /* Sometimes, shuffle the shop-keepers */
3232 if (one_in_(STORE_SHUFFLE))
3237 /* Pick a random shop (except home and museum) */
3240 n = randint0(MAX_STORES);
3241 } while ((n == STORE_HOME) || (n == STORE_MUSEUM));
3243 /* Check every feature */
3244 for (i = 1; i < max_f_idx; i++)
3246 feature_type *f_ptr = &f_info[i];
3248 /* Skip empty index */
3249 if (!f_ptr->name) continue;
3251 /* Skip non-store features */
3252 if (!have_flag(f_ptr->flags, FF_STORE)) continue;
3254 /* Verify store type */
3255 if (f_ptr->subtype == n)
3257 if (cheat_xtra) msg_format(_("%sの店主をシャッフルします。", "Shuffle a Shopkeeper of %s."), f_name + f_ptr->name);
3260 store_shuffle(player_ptr, n);
3269 /*** Process the monsters ***/
3271 /* Check for creature generation. */
3272 if (one_in_(d_info[player_ptr->dungeon_idx].max_m_alloc_chance) &&
3273 !floor_ptr->inside_arena && !floor_ptr->inside_quest && !player_ptr->phase_out)
3275 /* Make a new monster */
3276 (void)alloc_monster(player_ptr, MAX_SIGHT + 5, 0);
3279 /* Hack -- Check for creature regeneration */
3280 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 10)) && !player_ptr->phase_out) regenerate_monsters(player_ptr);
3281 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 3))) regenerate_captured_monsters(player_ptr);
3283 if (!player_ptr->leaving)
3287 /* Hack -- Process the counters of monsters if needed */
3288 for (i = 0; i < MAX_MTIMED; i++)
3290 if (floor_ptr->mproc_max[i] > 0) process_monsters_mtimed(player_ptr, i);
3297 if (min != prev_min)
3299 exe_write_diary(player_ptr, DIARY_DIALY, 0, NULL);
3300 determine_daily_bounty(player_ptr, FALSE);
3305 * Nightmare mode activates the TY_CURSE at midnight
3306 * Require exact minute -- Don't activate multiple times in a minute
3309 if (ironman_nightmare && (min != prev_min))
3312 /* Every 15 minutes after 11:00 pm */
3313 if ((hour == 23) && !(min % 15))
3315 disturb(player_ptr, FALSE, TRUE);
3320 msg_print(_("遠くで不気味な鐘の音が鳴った。", "You hear a distant bell toll ominously."));
3324 msg_print(_("遠くで鐘が二回鳴った。", "A distant bell sounds twice."));
3328 msg_print(_("遠くで鐘が三回鳴った。", "A distant bell sounds three times."));
3332 msg_print(_("遠くで鐘が四回鳴った。", "A distant bell tolls four times."));
3337 /* TY_CURSE activates at midnight! */
3341 disturb(player_ptr, TRUE, TRUE);
3342 msg_print(_("遠くで鐘が何回も鳴り、死んだような静けさの中へ消えていった。", "A distant bell tolls many times, fading into an deathly silence."));
3344 if (player_ptr->wild_mode)
3346 /* Go into large wilderness view */
3347 player_ptr->oldpy = randint1(MAX_HGT - 2);
3348 player_ptr->oldpx = randint1(MAX_WID - 2);
3349 change_wild_mode(player_ptr, TRUE);
3351 /* Give first move to monsters */
3352 take_turn(player_ptr, 100);
3356 player_ptr->invoking_midnight_curse = TRUE;
3360 process_world_aux_digestion(player_ptr);
3361 process_world_aux_hp_and_sp(player_ptr);
3362 process_world_aux_timeout(player_ptr);
3363 process_world_aux_light(player_ptr);
3364 process_world_aux_mutation(player_ptr);
3365 process_world_aux_curse(player_ptr);
3366 process_world_aux_recharge(player_ptr);
3367 sense_inventory1(player_ptr);
3368 sense_inventory2(player_ptr);
3369 process_world_aux_movement(player_ptr);
3373 * @brief ウィザードモードへの導入処理
3374 * / Verify use of "wizard" mode
3375 * @param player_ptr プレーヤーへの参照ポインタ
3376 * @return 実際にウィザードモードへ移行したらTRUEを返す。
3378 static bool enter_wizard_mode(player_type *player_ptr)
3380 /* Ask first time */
3381 if (!current_world_ptr->noscore)
3383 /* Wizard mode is not permitted */
3384 if (!allow_debug_opts || arg_wizard)
3386 msg_print(_("ウィザードモードは許可されていません。 ", "Wizard mode is not permitted."));
3390 /* Mention effects */
3391 msg_print(_("ウィザードモードはデバッグと実験のためのモードです。 ", "Wizard mode is for debugging and experimenting."));
3392 msg_print(_("一度ウィザードモードに入るとスコアは記録されません。", "The game will not be scored if you enter wizard mode."));
3395 /* Verify request */
3396 if (!get_check(_("本当にウィザードモードに入りたいのですか? ", "Are you sure you want to enter wizard mode? ")))
3401 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, _("ウィザードモードに突入してスコアを残せなくなった。", "give up recording score to enter wizard mode."));
3403 current_world_ptr->noscore |= 0x0002;
3414 * @brief デバッグコマンドへの導入処理
3415 * / Verify use of "debug" commands
3416 * @param player_ptr プレーヤーへの参照ポインタ
3417 * @return 実際にデバッグコマンドへ移行したらTRUEを返す。
3419 static bool enter_debug_mode(player_type *player_ptr)
3421 /* Ask first time */
3422 if (!current_world_ptr->noscore)
3424 /* Debug mode is not permitted */
3425 if (!allow_debug_opts)
3427 msg_print(_("デバッグコマンドは許可されていません。 ", "Use of debug command is not permitted."));
3431 /* Mention effects */
3432 msg_print(_("デバッグ・コマンドはデバッグと実験のためのコマンドです。 ", "The debug commands are for debugging and experimenting."));
3433 msg_print(_("デバッグ・コマンドを使うとスコアは記録されません。", "The game will not be scored if you use debug commands."));
3437 /* Verify request */
3438 if (!get_check(_("本当にデバッグ・コマンドを使いますか? ", "Are you sure you want to use debug commands? ")))
3443 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, _("デバッグモードに突入してスコアを残せなくなった。", "give up sending score to use debug commands."));
3445 current_world_ptr->noscore |= 0x0008;
3453 * Hack -- Declare the Debug Routines
3455 extern void do_cmd_debug(player_type *creature_ptr);
3457 #endif /* ALLOW_WIZARD */
3463 * @brief ボーグコマンドへの導入処理
3464 * / Verify use of "borg" commands
3465 * @return 実際にボーグコマンドへ移行したらTRUEを返す。
3467 static bool enter_borg_mode(void)
3469 /* Ask first time */
3470 if (!(current_world_ptr->noscore & 0x0010))
3472 /* Mention effects */
3473 msg_print(_("ボーグ・コマンドはデバッグと実験のためのコマンドです。 ", "The borg commands are for debugging and experimenting."));
3474 msg_print(_("ボーグ・コマンドを使うとスコアは記録されません。", "The game will not be scored if you use borg commands."));
3478 /* Verify request */
3479 if (!get_check(_("本当にボーグ・コマンドを使いますか? ", "Are you sure you want to use borg commands? ")))
3484 exe_write_diary(p_ptr, NIKKI_BUNSHOU, 0, _("ボーグ・コマンドを使用してスコアを残せなくなった。", "give up recording score to use borg commands."));
3486 current_world_ptr->noscore |= 0x0010;
3494 * Hack -- Declare the Ben Borg
3496 extern void do_cmd_borg(void);
3498 #endif /* ALLOW_BORG */
3502 * @brief プレイヤーから受けた入力コマンドの分岐処理。
3503 * / Parse and execute the current command Give "Warning" on illegal commands.
3504 * @todo Make some "blocks"
3507 static void process_command(player_type *creature_ptr)
3509 COMMAND_CODE old_now_message = now_message;
3511 /* Handle repeating the last command */
3517 if ((creature_ptr->pclass == CLASS_SNIPER) && (creature_ptr->concent))
3518 creature_ptr->reset_concent = TRUE;
3520 /* Parse the command */
3521 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
3522 switch (command_cmd)
3538 /*** Wizard Commands ***/
3541 if (current_world_ptr->wizard)
3543 current_world_ptr->wizard = FALSE;
3544 msg_print(_("ウィザードモード解除。", "Wizard mode off."));
3546 else if (enter_wizard_mode(creature_ptr))
3548 current_world_ptr->wizard = TRUE;
3549 msg_print(_("ウィザードモード突入。", "Wizard mode on."));
3551 creature_ptr->update |= (PU_MONSTERS);
3552 creature_ptr->redraw |= (PR_TITLE);
3560 /* Special "debug" commands */
3563 if (enter_debug_mode(creature_ptr))
3565 do_cmd_debug(creature_ptr);
3570 #endif /* ALLOW_WIZARD */
3575 /* Special "borg" commands */
3578 if (enter_borg_mode())
3580 if (!creature_ptr->wild_mode) do_cmd_borg();
3585 #endif /* ALLOW_BORG */
3589 /*** Inventory Commands ***/
3591 /* Wear/wield equipment */
3594 if (!creature_ptr->wild_mode) do_cmd_wield(creature_ptr);
3598 /* Take off equipment */
3601 if (!creature_ptr->wild_mode) do_cmd_takeoff(creature_ptr);
3608 if (!creature_ptr->wild_mode) do_cmd_drop(creature_ptr);
3612 /* Destroy an item */
3615 do_cmd_destroy(creature_ptr);
3619 /* Equipment list */
3622 do_cmd_equip(creature_ptr);
3626 /* Inventory list */
3629 do_cmd_inven(creature_ptr);
3634 /*** Various commands ***/
3636 /* Identify an object */
3639 do_cmd_observe(creature_ptr);
3645 toggle_inventory_equipment(creature_ptr);
3650 /*** Standard "Movement" Commands ***/
3655 if (!creature_ptr->wild_mode) do_cmd_alter(creature_ptr);
3662 if (!creature_ptr->wild_mode) do_cmd_tunnel(creature_ptr);
3666 /* Move (usually pick up things) */
3669 do_cmd_walk(creature_ptr, FALSE);
3673 /* Move (usually do not pick up) */
3676 do_cmd_walk(creature_ptr, TRUE);
3681 /*** Running, Resting, Searching, Staying */
3683 /* Begin Running -- Arg is Max Distance */
3686 if (!creature_ptr->wild_mode) do_cmd_run(creature_ptr);
3690 /* Stay still (usually pick things up) */
3693 do_cmd_stay(creature_ptr, always_pickup);
3697 /* Stay still (usually do not pick up) */
3700 do_cmd_stay(creature_ptr, !always_pickup);
3704 /* Rest -- Arg is time */
3707 do_cmd_rest(creature_ptr);
3711 /* Search for traps/doors */
3714 do_cmd_search(creature_ptr);
3720 if (creature_ptr->action == ACTION_SEARCH) set_action(creature_ptr, ACTION_NONE);
3721 else set_action(creature_ptr, ACTION_SEARCH);
3726 /*** Stairs and Doors and Chests and Traps ***/
3729 case SPECIAL_KEY_STORE:
3731 do_cmd_store(creature_ptr);
3735 /* Enter building -KMW- */
3736 case SPECIAL_KEY_BUILDING:
3738 do_cmd_bldg(creature_ptr);
3742 /* Enter quest level -KMW- */
3743 case SPECIAL_KEY_QUEST:
3745 do_cmd_quest(creature_ptr);
3749 /* Go up staircase */
3752 if (!creature_ptr->wild_mode && !floor_ptr->dun_level && !floor_ptr->inside_arena && !floor_ptr->inside_quest)
3754 if (vanilla_town) break;
3756 if (creature_ptr->ambush_flag)
3758 msg_print(_("襲撃から逃げるにはマップの端まで移動しなければならない。", "To flee the ambush you have to reach the edge of the map."));
3762 if (creature_ptr->food < PY_FOOD_WEAK)
3764 msg_print(_("その前に食事をとらないと。", "You must eat something here."));
3768 change_wild_mode(creature_ptr, FALSE);
3771 do_cmd_go_up(creature_ptr);
3775 /* Go down staircase */
3778 if (creature_ptr->wild_mode)
3779 change_wild_mode(creature_ptr, FALSE);
3781 do_cmd_go_down(creature_ptr);
3785 /* Open a door or chest */
3788 do_cmd_open(creature_ptr);
3795 do_cmd_close(creature_ptr);
3799 /* Jam a door with spikes */
3802 do_cmd_spike(creature_ptr);
3809 do_cmd_bash(creature_ptr);
3813 /* Disarm a trap or chest */
3816 do_cmd_disarm(creature_ptr);
3821 /*** Magic and Prayers ***/
3823 /* Gain new spells/prayers */
3826 if ((creature_ptr->pclass == CLASS_SORCERER) || (creature_ptr->pclass == CLASS_RED_MAGE))
3827 msg_print(_("呪文を学習する必要はない!", "You don't have to learn spells!"));
3828 else if (creature_ptr->pclass == CLASS_SAMURAI)
3829 do_cmd_gain_hissatsu(creature_ptr);
3830 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3831 import_magic_device(creature_ptr);
3833 do_cmd_study(creature_ptr);
3840 if ((creature_ptr->pclass == CLASS_MINDCRAFTER) ||
3841 (creature_ptr->pclass == CLASS_BERSERKER) ||
3842 (creature_ptr->pclass == CLASS_NINJA) ||
3843 (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3844 ) do_cmd_mind_browse(creature_ptr);
3845 else if (creature_ptr->pclass == CLASS_SMITH)
3846 do_cmd_kaji(creature_ptr, TRUE);
3847 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3848 do_cmd_magic_eater(creature_ptr, TRUE, FALSE);
3849 else if (creature_ptr->pclass == CLASS_SNIPER)
3850 do_cmd_snipe_browse(creature_ptr);
3851 else do_cmd_browse(creature_ptr);
3859 if (!creature_ptr->wild_mode)
3861 if ((creature_ptr->pclass == CLASS_WARRIOR) || (creature_ptr->pclass == CLASS_ARCHER) || (creature_ptr->pclass == CLASS_CAVALRY))
3863 msg_print(_("呪文を唱えられない!", "You cannot cast spells!"));
3865 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))
3867 msg_print(_("ダンジョンが魔法を吸収した!", "The dungeon absorbs all attempted magic!"));
3870 else if (creature_ptr->anti_magic && (creature_ptr->pclass != CLASS_BERSERKER) && (creature_ptr->pclass != CLASS_SMITH))
3872 concptr which_power = _("魔法", "magic");
3873 if (creature_ptr->pclass == CLASS_MINDCRAFTER)
3874 which_power = _("超能力", "psionic powers");
3875 else if (creature_ptr->pclass == CLASS_IMITATOR)
3876 which_power = _("ものまね", "imitation");
3877 else if (creature_ptr->pclass == CLASS_SAMURAI)
3878 which_power = _("必殺剣", "hissatsu");
3879 else if (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3880 which_power = _("鏡魔法", "mirror magic");
3881 else if (creature_ptr->pclass == CLASS_NINJA)
3882 which_power = _("忍術", "ninjutsu");
3883 else if (mp_ptr->spell_book == TV_LIFE_BOOK)
3884 which_power = _("祈り", "prayer");
3886 msg_format(_("反魔法バリアが%sを邪魔した!", "An anti-magic shell disrupts your %s!"), which_power);
3887 free_turn(creature_ptr);
3889 else if (creature_ptr->shero && (creature_ptr->pclass != CLASS_BERSERKER))
3891 msg_format(_("狂戦士化していて頭が回らない!", "You cannot think directly!"));
3892 free_turn(creature_ptr);
3896 if ((creature_ptr->pclass == CLASS_MINDCRAFTER) ||
3897 (creature_ptr->pclass == CLASS_BERSERKER) ||
3898 (creature_ptr->pclass == CLASS_NINJA) ||
3899 (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3901 do_cmd_mind(creature_ptr);
3902 else if (creature_ptr->pclass == CLASS_IMITATOR)
3903 do_cmd_mane(creature_ptr, FALSE);
3904 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3905 do_cmd_magic_eater(creature_ptr, FALSE, FALSE);
3906 else if (creature_ptr->pclass == CLASS_SAMURAI)
3907 do_cmd_hissatsu(creature_ptr);
3908 else if (creature_ptr->pclass == CLASS_BLUE_MAGE)
3909 do_cmd_cast_learned(creature_ptr);
3910 else if (creature_ptr->pclass == CLASS_SMITH)
3911 do_cmd_kaji(creature_ptr, FALSE);
3912 else if (creature_ptr->pclass == CLASS_SNIPER)
3913 do_cmd_snipe(creature_ptr);
3915 do_cmd_cast(creature_ptr);
3921 /* Issue a pet command */
3924 do_cmd_pet(creature_ptr);
3928 /*** Use various objects ***/
3930 /* Inscribe an object */
3933 do_cmd_inscribe(creature_ptr);
3937 /* Uninscribe an object */
3940 do_cmd_uninscribe(creature_ptr);
3944 /* Activate an artifact */
3947 do_cmd_activate(creature_ptr);
3954 do_cmd_eat_food(creature_ptr);
3958 /* Fuel your lantern/torch */
3961 do_cmd_refill(creature_ptr);
3968 do_cmd_fire(creature_ptr, SP_NONE);
3975 do_cmd_throw(creature_ptr, 1, FALSE, -1);
3982 do_cmd_aim_wand(creature_ptr);
3989 if (use_command && rogue_like_commands)
3991 do_cmd_use(creature_ptr);
3995 do_cmd_zap_rod(creature_ptr);
4000 /* Quaff a potion */
4003 do_cmd_quaff_potion(creature_ptr);
4010 do_cmd_read_scroll(creature_ptr);
4017 if (use_command && !rogue_like_commands)
4018 do_cmd_use(creature_ptr);
4020 do_cmd_use_staff(creature_ptr);
4024 /* Use racial power */
4027 do_cmd_racial_power(creature_ptr);
4032 /*** Looking at Things (nearby or on map) ***/
4034 /* Full dungeon map */
4037 do_cmd_view_map(creature_ptr);
4041 /* Locate player on map */
4044 do_cmd_locate(creature_ptr);
4051 do_cmd_look(creature_ptr);
4055 /* Target monster or location */
4058 do_cmd_target(creature_ptr);
4064 /*** Help and Such ***/
4069 do_cmd_help(creature_ptr);
4073 /* Identify symbol */
4076 do_cmd_query_symbol(creature_ptr);
4080 /* Character description */
4083 do_cmd_player_status(creature_ptr);
4088 /*** System Commands ***/
4090 /* Hack -- User interface */
4097 /* Single line from a pref file */
4100 do_cmd_pref(creature_ptr);
4106 do_cmd_reload_autopick(creature_ptr);
4112 do_cmd_edit_autopick(creature_ptr);
4116 /* Interact with macros */
4119 do_cmd_macros(creature_ptr);
4123 /* Interact with visuals */
4126 do_cmd_visuals(creature_ptr);
4127 do_cmd_redraw(creature_ptr);
4131 /* Interact with colors */
4134 do_cmd_colors(creature_ptr);
4135 do_cmd_redraw(creature_ptr);
4139 /* Interact with options */
4143 (void)combine_and_reorder_home(STORE_HOME);
4144 do_cmd_redraw(creature_ptr);
4148 /*** Misc Commands ***/
4164 /* Repeat level feeling */
4167 do_cmd_feeling(creature_ptr);
4171 /* Show previous message */
4174 do_cmd_message_one();
4178 /* Show previous messages */
4181 do_cmd_messages(old_now_message);
4185 /* Show quest status -KMW- */
4188 do_cmd_checkquest(creature_ptr);
4192 /* Redraw the screen */
4195 now_message = old_now_message;
4196 do_cmd_redraw(creature_ptr);
4200 #ifndef VERIFY_SAVEFILE
4202 /* Hack -- Save and don't quit */
4205 do_cmd_save_game(creature_ptr, FALSE);
4209 #endif /* VERIFY_SAVEFILE */
4213 do_cmd_time(creature_ptr);
4219 case SPECIAL_KEY_QUIT:
4221 do_cmd_save_and_exit(creature_ptr);
4225 /* Quit (commit suicide) */
4228 do_cmd_suicide(creature_ptr);
4234 do_cmd_diary(creature_ptr);
4238 /* Check artifacts, uniques, objects */
4241 do_cmd_knowledge(creature_ptr);
4245 /* Load "screen dump" */
4248 do_cmd_load_screen();
4252 /* Save "screen dump" */
4255 do_cmd_save_screen(creature_ptr);
4259 /* Record/stop "Movie" */
4262 prepare_movie_hooks();
4266 /* Make random artifact list */
4269 spoil_random_artifact(creature_ptr, "randifact.txt");
4276 if (!creature_ptr->wild_mode) do_cmd_travel(creature_ptr);
4277 if (creature_ptr->special_defense & KATA_MUSOU)
4279 set_action(creature_ptr, ACTION_NONE);
4285 /* Hack -- Unknown command */
4288 if (flush_failure) flush();
4292 sound(SOUND_ILLEGAL);
4293 if (!get_rnd_line(_("error_j.txt", "error.txt"), 0, error_m))
4298 prt(_(" '?' でヘルプが表示されます。", "Type '?' for help."), 0, 0);
4304 if (!creature_ptr->energy_use && !now_message)
4305 now_message = old_now_message;
4309 * @brief アイテムの所持種類数が超えた場合にアイテムを床に落とす処理 / Hack -- Pack Overflow
4312 static void pack_overflow(player_type *owner_ptr)
4314 if (owner_ptr->inventory_list[INVEN_PACK].k_idx == 0) return;
4316 GAME_TEXT o_name[MAX_NLEN];
4319 /* Is auto-destroy done? */
4320 update_creature(owner_ptr);
4321 if (!owner_ptr->inventory_list[INVEN_PACK].k_idx) return;
4323 /* Access the slot to be dropped */
4324 o_ptr = &owner_ptr->inventory_list[INVEN_PACK];
4326 disturb(owner_ptr, FALSE, TRUE);
4329 msg_print(_("ザックからアイテムがあふれた!", "Your pack overflows!"));
4330 object_desc(o_name, o_ptr, 0);
4332 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(INVEN_PACK));
4334 /* Drop it (carefully) near the player */
4335 (void)drop_near(owner_ptr, o_ptr, 0, owner_ptr->y, owner_ptr->x);
4337 vary_item(owner_ptr, INVEN_PACK, -255);
4338 handle_stuff(owner_ptr);
4342 * @brief プレイヤーの行動エネルギーが充填される(=プレイヤーのターンが回る)毎に行われる処理 / process the effects per 100 energy at player speed.
4345 static void process_upkeep_with_speed(player_type *creature_ptr)
4347 /* Give the player some energy */
4348 if (!load && creature_ptr->enchant_energy_need > 0 && !creature_ptr->leaving)
4350 creature_ptr->enchant_energy_need -= SPEED_TO_ENERGY(creature_ptr->pspeed);
4354 if (creature_ptr->enchant_energy_need > 0) return;
4356 while (creature_ptr->enchant_energy_need <= 0)
4358 /* Handle the player song */
4359 if (!load) check_music(creature_ptr);
4361 /* Hex - Handle the hex spells */
4362 if (!load) check_hex(creature_ptr);
4363 if (!load) revenge_spell(creature_ptr);
4365 /* There is some randomness of needed energy */
4366 creature_ptr->enchant_energy_need += ENERGY_NEED();
4370 static void process_fishing(player_type *creature_ptr)
4372 Term_xtra(TERM_XTRA_DELAY, 10);
4376 bool success = FALSE;
4377 get_mon_num_prep(monster_is_fishing_target, NULL);
4378 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);
4380 if (r_idx && one_in_(2))
4383 y = creature_ptr->y + ddy[creature_ptr->fishing_dir];
4384 x = creature_ptr->x + ddx[creature_ptr->fishing_dir];
4385 if (place_monster_aux(creature_ptr, 0, y, x, r_idx, PM_NO_KAGE))
4387 GAME_TEXT m_name[MAX_NLEN];
4388 monster_desc(m_name, &creature_ptr->current_floor_ptr->m_list[creature_ptr->current_floor_ptr->grid_array[y][x].m_idx], 0);
4389 msg_format(_("%sが釣れた!", "You have a good catch!"), m_name);
4395 msg_print(_("餌だけ食われてしまった!くっそ~!", "Damn! The fish stole your bait!"));
4397 disturb(creature_ptr, FALSE, TRUE);
4402 * @brief プレイヤーの行動処理 / Process the player
4405 * Notice the annoying code to handle "pack overflow", which\n
4406 * must come first just in case somebody manages to corrupt\n
4407 * the savefiles by clever use of menu commands or something.\n
4409 static void process_player(player_type *creature_ptr)
4413 /*** Apply energy ***/
4415 if (creature_ptr->hack_mutation)
4417 msg_print(_("何か変わった気がする!", "You feel different!"));
4419 (void)gain_mutation(creature_ptr, 0);
4420 creature_ptr->hack_mutation = FALSE;
4423 if (creature_ptr->invoking_midnight_curse)
4426 activate_ty_curse(creature_ptr, FALSE, &count);
4427 creature_ptr->invoking_midnight_curse = FALSE;
4430 if (creature_ptr->phase_out)
4432 for (m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
4434 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
4436 if (!monster_is_valid(m_ptr)) continue;
4438 m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
4439 update_monster(creature_ptr, m_idx, FALSE);
4442 print_time(creature_ptr);
4445 /* Give the player some energy */
4446 else if (!(load && creature_ptr->energy_need <= 0))
4448 creature_ptr->energy_need -= SPEED_TO_ENERGY(creature_ptr->pspeed);
4452 if (creature_ptr->energy_need > 0) return;
4453 if (!command_rep) print_time(creature_ptr);
4455 /*** Check for interupts ***/
4457 /* Complete resting */
4458 if (creature_ptr->resting < 0)
4461 if (creature_ptr->resting == COMMAND_ARG_REST_FULL_HEALING)
4464 if ((creature_ptr->chp == creature_ptr->mhp) &&
4465 (creature_ptr->csp >= creature_ptr->msp))
4467 set_action(creature_ptr, ACTION_NONE);
4471 /* Complete resting */
4472 else if (creature_ptr->resting == COMMAND_ARG_REST_UNTIL_DONE)
4475 if ((creature_ptr->chp == creature_ptr->mhp) &&
4476 (creature_ptr->csp >= creature_ptr->msp) &&
4477 !creature_ptr->blind && !creature_ptr->confused &&
4478 !creature_ptr->poisoned && !creature_ptr->afraid &&
4479 !creature_ptr->stun && !creature_ptr->cut &&
4480 !creature_ptr->slow && !creature_ptr->paralyzed &&
4481 !creature_ptr->image && !creature_ptr->word_recall &&
4482 !creature_ptr->alter_reality)
4484 set_action(creature_ptr, ACTION_NONE);
4489 if (creature_ptr->action == ACTION_FISH) process_fishing(creature_ptr);
4491 /* Handle "abort" */
4494 /* Check for "player abort" (semi-efficiently for resting) */
4495 if (creature_ptr->running || travel.run || command_rep || (creature_ptr->action == ACTION_REST) || (creature_ptr->action == ACTION_FISH))
4500 /* Check for a key */
4503 flush(); /* Flush input */
4505 disturb(creature_ptr, FALSE, TRUE);
4507 /* Hack -- Show a Message */
4508 msg_print(_("中断しました。", "Canceled."));
4513 if (creature_ptr->riding && !creature_ptr->confused && !creature_ptr->blind)
4515 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
4516 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4518 if (MON_CSLEEP(m_ptr))
4520 GAME_TEXT m_name[MAX_NLEN];
4523 (void)set_monster_csleep(creature_ptr, creature_ptr->riding, 0);
4524 monster_desc(m_name, m_ptr, 0);
4525 msg_format(_("%^sを起こした。", "You have woken %s up."), m_name);
4528 if (MON_STUNNED(m_ptr))
4530 /* Hack -- Recover from stun */
4531 if (set_monster_stunned(creature_ptr, creature_ptr->riding,
4532 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_STUNNED(m_ptr) - 1)))
4534 GAME_TEXT m_name[MAX_NLEN];
4535 monster_desc(m_name, m_ptr, 0);
4536 msg_format(_("%^sを朦朧状態から立ち直らせた。", "%^s is no longer stunned."), m_name);
4540 if (MON_CONFUSED(m_ptr))
4542 /* Hack -- Recover from confusion */
4543 if (set_monster_confused(creature_ptr, creature_ptr->riding,
4544 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_CONFUSED(m_ptr) - 1)))
4546 GAME_TEXT m_name[MAX_NLEN];
4547 monster_desc(m_name, m_ptr, 0);
4548 msg_format(_("%^sを混乱状態から立ち直らせた。", "%^s is no longer confused."), m_name);
4552 if (MON_MONFEAR(m_ptr))
4554 /* Hack -- Recover from fear */
4555 if (set_monster_monfear(creature_ptr, creature_ptr->riding,
4556 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_MONFEAR(m_ptr) - 1)))
4558 GAME_TEXT m_name[MAX_NLEN];
4559 monster_desc(m_name, m_ptr, 0);
4560 msg_format(_("%^sを恐怖から立ち直らせた。", "%^s is no longer afraid."), m_name);
4564 handle_stuff(creature_ptr);
4570 if (creature_ptr->lightspeed)
4572 (void)set_lightspeed(creature_ptr, creature_ptr->lightspeed - 1, TRUE);
4574 if ((creature_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
4576 if (P_PTR_KI < 40) P_PTR_KI = 0;
4577 else P_PTR_KI -= 40;
4578 creature_ptr->update |= (PU_BONUS);
4580 if (creature_ptr->action == ACTION_LEARN)
4583 u32b cost_frac = (creature_ptr->msp + 30L) * 256L;
4585 /* Convert the unit (1/2^16) to (1/2^32) */
4586 s64b_LSHIFT(cost, cost_frac, 16);
4588 if (s64b_cmp(creature_ptr->csp, creature_ptr->csp_frac, cost, cost_frac) < 0)
4591 creature_ptr->csp = 0;
4592 creature_ptr->csp_frac = 0;
4593 set_action(creature_ptr, ACTION_NONE);
4598 s64b_sub(&(creature_ptr->csp), &(creature_ptr->csp_frac), cost, cost_frac);
4600 creature_ptr->redraw |= PR_MANA;
4603 if (creature_ptr->special_defense & KATA_MASK)
4605 if (creature_ptr->special_defense & KATA_MUSOU)
4607 if (creature_ptr->csp < 3)
4609 set_action(creature_ptr, ACTION_NONE);
4613 creature_ptr->csp -= 2;
4614 creature_ptr->redraw |= (PR_MANA);
4619 /*** Handle actual user input ***/
4621 /* Repeat until out of energy */
4622 while (creature_ptr->energy_need <= 0)
4624 creature_ptr->window |= PW_PLAYER;
4625 creature_ptr->sutemi = FALSE;
4626 creature_ptr->counter = FALSE;
4627 creature_ptr->now_damaged = FALSE;
4629 handle_stuff(creature_ptr);
4631 /* Place the cursor on the player */
4632 move_cursor_relative(creature_ptr->y, creature_ptr->x);
4634 /* Refresh (optional) */
4635 if (fresh_before) Term_fresh();
4637 /* Hack -- Pack Overflow */
4638 pack_overflow(creature_ptr);
4640 /* Hack -- cancel "lurking browse mode" */
4641 if (!command_new) command_see = FALSE;
4643 /* Assume free turn */
4644 free_turn(creature_ptr);
4646 if (creature_ptr->phase_out)
4648 /* Place the cursor on the player */
4649 move_cursor_relative(creature_ptr->y, creature_ptr->x);
4651 command_cmd = SPECIAL_KEY_BUILDING;
4653 /* Process the command */
4654 process_command(creature_ptr);
4657 /* Paralyzed or Knocked Out */
4658 else if (creature_ptr->paralyzed || (creature_ptr->stun >= 100))
4660 take_turn(creature_ptr, 100);
4664 else if (creature_ptr->action == ACTION_REST)
4667 if (creature_ptr->resting > 0)
4669 /* Reduce rest count */
4670 creature_ptr->resting--;
4672 if (!creature_ptr->resting) set_action(creature_ptr, ACTION_NONE);
4673 creature_ptr->redraw |= (PR_STATE);
4676 take_turn(creature_ptr, 100);
4680 else if (creature_ptr->action == ACTION_FISH)
4682 take_turn(creature_ptr, 100);
4686 else if (creature_ptr->running)
4689 run_step(creature_ptr, 0);
4694 else if (travel.run)
4697 travel_step(creature_ptr);
4701 /* Repeated command */
4702 else if (command_rep)
4704 /* Count this execution */
4707 creature_ptr->redraw |= (PR_STATE);
4708 handle_stuff(creature_ptr);
4710 /* Hack -- Assume messages were seen */
4713 /* Clear the top line */
4716 /* Process the command */
4717 process_command(creature_ptr);
4720 /* Normal command */
4723 /* Place the cursor on the player */
4724 move_cursor_relative(creature_ptr->y, creature_ptr->x);
4727 /* Get a command (normal) */
4728 request_command(creature_ptr, FALSE);
4731 /* Process the command */
4732 process_command(creature_ptr);
4735 /* Hack -- Pack Overflow */
4736 pack_overflow(creature_ptr);
4741 if (creature_ptr->energy_use)
4743 /* Use some energy */
4744 if (creature_ptr->timewalk || creature_ptr->energy_use > 400)
4746 /* The Randomness is irrelevant */
4747 creature_ptr->energy_need += creature_ptr->energy_use * TURNS_PER_TICK / 10;
4751 /* There is some randomness of needed energy */
4752 creature_ptr->energy_need += (s16b)((s32b)creature_ptr->energy_use * ENERGY_NEED() / 100L);
4755 /* Hack -- constant hallucination */
4756 if (creature_ptr->image) creature_ptr->redraw |= (PR_MAP);
4758 /* Shimmer multi-hued monsters */
4759 for (m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
4761 monster_type *m_ptr;
4762 monster_race *r_ptr;
4764 m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
4765 if (!monster_is_valid(m_ptr)) continue;
4767 /* Skip unseen monsters */
4768 if (!m_ptr->ml) continue;
4770 /* Access the monster race */
4771 r_ptr = &r_info[m_ptr->ap_r_idx];
4773 /* Skip non-multi-hued monsters */
4774 if (!(r_ptr->flags1 & (RF1_ATTR_MULTI | RF1_SHAPECHANGER)))
4777 /* Redraw regardless */
4778 lite_spot(m_ptr->fy, m_ptr->fx);
4782 /* Handle monster detection */
4783 if (repair_monsters)
4785 /* Reset the flag */
4786 repair_monsters = FALSE;
4788 /* Rotate detection flags */
4789 for (m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
4791 monster_type *m_ptr;
4792 m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
4793 if (!monster_is_valid(m_ptr)) continue;
4795 /* Nice monsters get mean */
4796 if (m_ptr->mflag & MFLAG_NICE)
4798 /* Nice monsters get mean */
4799 m_ptr->mflag &= ~(MFLAG_NICE);
4802 /* Handle memorized monsters */
4803 if (m_ptr->mflag2 & MFLAG2_MARK)
4805 /* Maintain detection */
4806 if (m_ptr->mflag2 & MFLAG2_SHOW)
4809 m_ptr->mflag2 &= ~(MFLAG2_SHOW);
4811 /* Still need repairs */
4812 repair_monsters = TRUE;
4815 /* Remove detection */
4819 m_ptr->mflag2 &= ~(MFLAG2_MARK);
4821 /* Assume invisible */
4823 update_monster(creature_ptr, m_idx, FALSE);
4825 if (creature_ptr->health_who == m_idx) creature_ptr->redraw |= (PR_HEALTH);
4826 if (creature_ptr->riding == m_idx) creature_ptr->redraw |= (PR_UHEALTH);
4828 /* Redraw regardless */
4829 lite_spot(m_ptr->fy, m_ptr->fx);
4834 if (creature_ptr->pclass == CLASS_IMITATOR)
4837 if (creature_ptr->mane_num > (creature_ptr->lev > 44 ? 3 : creature_ptr->lev > 29 ? 2 : 1))
4839 creature_ptr->mane_num--;
4840 for (j = 0; j < creature_ptr->mane_num; j++)
4842 creature_ptr->mane_spell[j] = creature_ptr->mane_spell[j + 1];
4843 creature_ptr->mane_dam[j] = creature_ptr->mane_dam[j + 1];
4846 creature_ptr->new_mane = FALSE;
4847 creature_ptr->redraw |= (PR_IMITATION);
4849 if (creature_ptr->action == ACTION_LEARN)
4851 creature_ptr->new_mane = FALSE;
4852 creature_ptr->redraw |= (PR_STATE);
4855 if (creature_ptr->timewalk && (creature_ptr->energy_need > -1000))
4858 creature_ptr->redraw |= (PR_MAP);
4859 creature_ptr->update |= (PU_MONSTERS);
4860 creature_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
4862 msg_print(_("「時は動きだす…」", "You feel time flowing around you once more."));
4864 creature_ptr->timewalk = FALSE;
4865 creature_ptr->energy_need = ENERGY_NEED();
4867 handle_stuff(creature_ptr);
4871 /* Hack -- notice death */
4872 if (!creature_ptr->playing || creature_ptr->is_dead)
4874 creature_ptr->timewalk = FALSE;
4879 if (creature_ptr->energy_use && creature_ptr->reset_concent) reset_concentration(creature_ptr, TRUE);
4881 /* Handle "leaving" */
4882 if (creature_ptr->leaving) break;
4885 /* Update scent trail */
4886 update_smell(creature_ptr->current_floor_ptr, creature_ptr);
4890 * @brief 現在プレイヤーがいるダンジョンの全体処理 / Interact with the current dungeon level.
4894 * この関数から現在の階層を出る、プレイヤーがキャラが死ぬ、
4895 * ゲームを終了するかのいずれかまでループする。
4898 * This function will not exit until the level is completed,\n
4899 * the user dies, or the game is terminated.\n
4902 static void dungeon(player_type *player_ptr, bool load_game)
4906 /* Set the base level */
4907 floor_type *floor_ptr = player_ptr->current_floor_ptr;
4908 floor_ptr->base_level = floor_ptr->dun_level;
4910 /* Reset various flags */
4911 current_world_ptr->is_loading_now = FALSE;
4914 player_ptr->leaving = FALSE;
4916 /* Reset the "command" vars */
4922 /* Cancel the target */
4924 player_ptr->pet_t_m_idx = 0;
4925 player_ptr->riding_t_m_idx = 0;
4926 player_ptr->ambush_flag = FALSE;
4928 health_track(player_ptr, 0);
4930 /* Check visual effects */
4931 repair_monsters = TRUE;
4932 repair_objects = TRUE;
4935 disturb(player_ptr, TRUE, TRUE);
4937 /* Get index of current quest (if any) */
4938 quest_num = quest_number(player_ptr, floor_ptr->dun_level);
4940 /* Inside a quest? */
4943 /* Mark the quest monster */
4944 r_info[quest[quest_num].r_idx].flags1 |= RF1_QUESTOR;
4947 /* Track maximum player level */
4948 if (player_ptr->max_plv < player_ptr->lev)
4950 player_ptr->max_plv = player_ptr->lev;
4954 /* Track maximum dungeon level (if not in quest -KMW-) */
4955 if ((max_dlv[player_ptr->dungeon_idx] < floor_ptr->dun_level) && !floor_ptr->inside_quest)
4957 max_dlv[player_ptr->dungeon_idx] = floor_ptr->dun_level;
4958 if (record_maxdepth) exe_write_diary(player_ptr, DIARY_MAXDEAPTH, floor_ptr->dun_level, NULL);
4961 (void)calculate_upkeep(player_ptr);
4963 /* Validate the panel */
4964 panel_bounds_center();
4966 /* Verify the panel */
4967 verify_panel(player_ptr);
4972 /* Enter "xtra" mode */
4973 current_world_ptr->character_xtra = TRUE;
4975 player_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER | PW_MONSTER | PW_OVERHEAD | PW_DUNGEON);
4976 player_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_EQUIPPY | PR_MAP);
4977 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);
4979 handle_stuff(player_ptr);
4981 /* Leave "xtra" mode */
4982 current_world_ptr->character_xtra = FALSE;
4984 player_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
4985 player_ptr->update |= (PU_COMBINE | PU_REORDER);
4986 handle_stuff(player_ptr);
4989 if (quest_num && (is_fixed_quest_idx(quest_num) &&
4990 !((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT) ||
4991 !(quest[quest_num].flags & QUEST_FLAG_PRESET)))) do_cmd_feeling(player_ptr);
4993 if (player_ptr->phase_out)
4997 player_ptr->energy_need = 0;
4998 update_gambling_monsters(player_ptr);
5002 msg_print(_("試合開始!", "Ready..Fight!"));
5007 if ((player_ptr->pclass == CLASS_BARD) && (SINGING_SONG_EFFECT(player_ptr) > MUSIC_DETECT))
5008 SINGING_SONG_EFFECT(player_ptr) = MUSIC_DETECT;
5010 /* Hack -- notice death or departure */
5011 if (!player_ptr->playing || player_ptr->is_dead) return;
5013 /* Print quest message if appropriate */
5014 if (!floor_ptr->inside_quest && (player_ptr->dungeon_idx == DUNGEON_ANGBAND))
5016 quest_discovery(random_quest_number(player_ptr, floor_ptr->dun_level));
5017 floor_ptr->inside_quest = random_quest_number(player_ptr, floor_ptr->dun_level);
5019 if ((floor_ptr->dun_level == d_info[player_ptr->dungeon_idx].maxdepth) && d_info[player_ptr->dungeon_idx].final_guardian)
5021 if (r_info[d_info[player_ptr->dungeon_idx].final_guardian].max_num)
5023 msg_format("この階には%sの主である%sが棲んでいる。",
5024 d_name + d_info[player_ptr->dungeon_idx].name,
5025 r_name + r_info[d_info[player_ptr->dungeon_idx].final_guardian].name);
5027 msg_format("%^s lives in this level as the keeper of %s.",
5028 r_name + r_info[d_info[player_ptr->dungeon_idx].final_guardian].name,
5029 d_name + d_info[player_ptr->dungeon_idx].name);
5033 if (!load_game && (player_ptr->special_defense & NINJA_S_STEALTH)) set_superstealth(player_ptr, FALSE);
5035 /*** Process this dungeon level ***/
5037 /* Reset the monster generation level */
5038 floor_ptr->monster_level = floor_ptr->base_level;
5040 /* Reset the object generation level */
5041 floor_ptr->object_level = floor_ptr->base_level;
5043 current_world_ptr->is_loading_now = TRUE;
5045 if (player_ptr->energy_need > 0 && !player_ptr->phase_out &&
5046 (floor_ptr->dun_level || player_ptr->leaving_dungeon || floor_ptr->inside_arena))
5047 player_ptr->energy_need = 0;
5049 /* Not leaving dungeon */
5050 player_ptr->leaving_dungeon = FALSE;
5052 /* Initialize monster process */
5053 mproc_init(floor_ptr);
5058 /* Hack -- Compact the monster list occasionally */
5059 if ((floor_ptr->m_cnt + 32 > current_world_ptr->max_m_idx) && !player_ptr->phase_out) compact_monsters(player_ptr, 64);
5061 /* Hack -- Compress the monster list occasionally */
5062 if ((floor_ptr->m_cnt + 32 < floor_ptr->m_max) && !player_ptr->phase_out) compact_monsters(player_ptr, 0);
5065 /* Hack -- Compact the object list occasionally */
5066 if (floor_ptr->o_cnt + 32 > current_world_ptr->max_o_idx) compact_objects(player_ptr, 64);
5068 /* Hack -- Compress the object list occasionally */
5069 if (floor_ptr->o_cnt + 32 < floor_ptr->o_max) compact_objects(player_ptr, 0);
5071 /* Process the player */
5072 process_player(player_ptr);
5073 process_upkeep_with_speed(player_ptr);
5075 handle_stuff(player_ptr);
5077 /* Hack -- Hilite the player */
5078 move_cursor_relative(player_ptr->y, player_ptr->x);
5080 /* Optional fresh */
5081 if (fresh_after) Term_fresh();
5083 /* Hack -- Notice death or departure */
5084 if (!player_ptr->playing || player_ptr->is_dead) break;
5086 /* Process all of the monsters */
5087 process_monsters(player_ptr);
5089 handle_stuff(player_ptr);
5091 /* Hack -- Hilite the player */
5092 move_cursor_relative(player_ptr->y, player_ptr->x);
5094 /* Optional fresh */
5095 if (fresh_after) Term_fresh();
5097 /* Hack -- Notice death or departure */
5098 if (!player_ptr->playing || player_ptr->is_dead) break;
5100 /* Process the world */
5101 process_world(player_ptr);
5103 handle_stuff(player_ptr);
5105 /* Hack -- Hilite the player */
5106 move_cursor_relative(player_ptr->y, player_ptr->x);
5108 /* Optional fresh */
5109 if (fresh_after) Term_fresh();
5111 /* Hack -- Notice death or departure */
5112 if (!player_ptr->playing || player_ptr->is_dead) break;
5114 /* Count game turns */
5115 current_world_ptr->game_turn++;
5117 if (current_world_ptr->dungeon_turn < current_world_ptr->dungeon_turn_limit)
5119 if (!player_ptr->wild_mode || wild_regen) current_world_ptr->dungeon_turn++;
5120 else if (player_ptr->wild_mode && !(current_world_ptr->game_turn % ((MAX_HGT + MAX_WID) / 2))) current_world_ptr->dungeon_turn++;
5123 prevent_turn_overflow(player_ptr);
5125 /* Handle "leaving" */
5126 if (player_ptr->leaving) break;
5128 if (wild_regen) wild_regen--;
5131 /* Inside a quest and non-unique questor? */
5132 if (quest_num && !(r_info[quest[quest_num].r_idx].flags1 & RF1_UNIQUE))
5134 /* Un-mark the quest monster */
5135 r_info[quest[quest_num].r_idx].flags1 &= ~RF1_QUESTOR;
5138 /* Not save-and-quit and not dead? */
5139 if (player_ptr->playing && !player_ptr->is_dead)
5142 * Maintain Unique monsters and artifact, save current
5143 * floor, then prepare next floor
5145 leave_floor(player_ptr);
5147 /* Forget the flag */
5148 reinit_wilderness = FALSE;
5151 /* Write about current level on the play record once per level */
5157 * @brief 全ユーザプロファイルをロードする / Load some "user pref files"
5158 * @paaram player_ptr プレーヤーへの参照ポインタ
5161 * Modified by Arcum Dagsson to support
5162 * separate macro files for different realms.
5164 static void load_all_pref_files(player_type *player_ptr)
5168 /* Access the "user" pref file */
5169 sprintf(buf, "user.prf");
5171 /* Process that file */
5172 process_pref_file(player_ptr, buf);
5174 /* Access the "user" system pref file */
5175 sprintf(buf, "user-%s.prf", ANGBAND_SYS);
5177 /* Process that file */
5178 process_pref_file(player_ptr, buf);
5180 /* Access the "race" pref file */
5181 sprintf(buf, "%s.prf", rp_ptr->title);
5183 /* Process that file */
5184 process_pref_file(player_ptr, buf);
5186 /* Access the "class" pref file */
5187 sprintf(buf, "%s.prf", cp_ptr->title);
5189 /* Process that file */
5190 process_pref_file(player_ptr, buf);
5192 /* Access the "character" pref file */
5193 sprintf(buf, "%s.prf", player_ptr->base_name);
5195 /* Process that file */
5196 process_pref_file(player_ptr, buf);
5198 /* Access the "realm 1" pref file */
5199 if (player_ptr->realm1 != REALM_NONE)
5201 sprintf(buf, "%s.prf", realm_names[player_ptr->realm1]);
5203 /* Process that file */
5204 process_pref_file(player_ptr, buf);
5207 /* Access the "realm 2" pref file */
5208 if (player_ptr->realm2 != REALM_NONE)
5210 sprintf(buf, "%s.prf", realm_names[player_ptr->realm2]);
5212 /* Process that file */
5213 process_pref_file(player_ptr, buf);
5217 /* Load an autopick preference file */
5218 autopick_load_pref(player_ptr, FALSE);
5223 * @brief 1ゲームプレイの主要ルーチン / Actually play a game
5226 * If the "new_game" parameter is true, then, after loading the
5227 * savefile, we will commit suicide, if necessary, to allow the
5228 * player to start a new game.
5230 void play_game(player_type *player_ptr, bool new_game)
5233 bool load_game = TRUE;
5234 bool init_random_seed = FALSE;
5244 else if (chuukei_server)
5246 prepare_chuukei_hooks();
5252 reset_visuals(player_ptr);
5257 player_ptr->hack_mutation = FALSE;
5259 /* Hack -- Character is "icky" */
5260 current_world_ptr->character_icky = TRUE;
5262 /* Make sure main term is active */
5263 Term_activate(angband_term[0]);
5265 /* Initialise the resize hooks */
5266 angband_term[0]->resize_hook = resize_map;
5268 for (i = 1; i < 8; i++)
5270 /* Does the term exist? */
5271 if (angband_term[i])
5273 /* Add the redraw on resize hook */
5274 angband_term[i]->resize_hook = redraw_window;
5278 /* Hack -- turn off the cursor */
5279 (void)Term_set_cursor(0);
5282 /* Attempt to load */
5283 if (!load_player(player_ptr))
5285 quit(_("セーブファイルが壊れています", "broken savefile"));
5288 /* Extract the options */
5289 extract_option_vars();
5291 /* Report waited score */
5292 if (player_ptr->wait_report_score)
5297 if (!get_check_strict(_("待機していたスコア登録を今行ないますか?", "Do you register score now? "), CHECK_NO_HISTORY))
5300 player_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
5301 update_creature(player_ptr);
5303 player_ptr->is_dead = TRUE;
5305 current_world_ptr->start_time = (u32b)time(NULL);
5307 /* No suspending now */
5308 signals_ignore_tstp();
5310 /* Hack -- Character is now "icky" */
5311 current_world_ptr->character_icky = TRUE;
5312 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
5314 /* Open the high score file, for reading/writing */
5315 highscore_fd = fd_open(buf, O_RDWR);
5317 /* 町名消失バグ対策(#38205)のためここで世界マップ情報を読み出す */
5318 process_dungeon_file(player_ptr, "w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
5320 /* Handle score, show Top scores */
5321 success = send_world_score(player_ptr, TRUE);
5323 if (!success && !get_check_strict(_("スコア登録を諦めますか?", "Do you give up score registration? "), CHECK_NO_HISTORY))
5325 prt(_("引き続き待機します。", "standing by for future registration..."), 0, 0);
5330 player_ptr->wait_report_score = FALSE;
5331 top_twenty(player_ptr);
5332 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
5334 /* Shut the high score file */
5335 (void)fd_close(highscore_fd);
5337 /* Forget the high score fd */
5340 /* Allow suspending now */
5341 signals_handle_tstp();
5346 current_world_ptr->creating_savefile = new_game;
5348 /* Nothing loaded */
5349 if (!current_world_ptr->character_loaded)
5351 /* Make new player */
5354 /* The dungeon is not ready */
5355 current_world_ptr->character_dungeon = FALSE;
5357 /* Prepare to init the RNG */
5358 init_random_seed = TRUE;
5360 /* Initialize the saved floors data */
5361 init_saved_floors(player_ptr, FALSE);
5364 /* Old game is loaded. But new game is requested. */
5367 /* Initialize the saved floors data */
5368 init_saved_floors(player_ptr, TRUE);
5371 /* Process old character */
5374 /* Process the player name */
5375 process_player_name(player_ptr, FALSE);
5379 if (init_random_seed)
5384 /* Roll new character */
5385 floor_type *floor_ptr = player_ptr->current_floor_ptr;
5388 /* The dungeon is not ready */
5389 current_world_ptr->character_dungeon = FALSE;
5392 floor_ptr->dun_level = 0;
5393 floor_ptr->inside_quest = 0;
5394 floor_ptr->inside_arena = FALSE;
5395 player_ptr->phase_out = FALSE;
5399 /* Hack -- seed for flavors */
5400 current_world_ptr->seed_flavor = randint0(0x10000000);
5402 /* Hack -- seed for town layout */
5403 current_world_ptr->seed_town = randint0(0x10000000);
5405 /* Roll up a new character */
5406 player_birth(player_ptr);
5408 counts_write(player_ptr, 2, 0);
5409 player_ptr->count = 0;
5413 determine_bounty_uniques();
5414 determine_daily_bounty(player_ptr, FALSE);
5416 /* Initialize object array */
5417 wipe_o_list(floor_ptr);
5421 write_level = FALSE;
5423 exe_write_diary(player_ptr, DIARY_GAMESTART, 1,
5425 " ---- Restart Game ----"));
5428 * 1.0.9 以前はセーブ前に player_ptr->riding = -1 としていたので、再設定が必要だった。
5429 * もう不要だが、以前のセーブファイルとの互換のために残しておく。
5431 if (player_ptr->riding == -1)
5433 player_ptr->riding = 0;
5434 for (i = floor_ptr->m_max; i > 0; i--)
5436 if (player_bold(player_ptr, floor_ptr->m_list[i].fy, floor_ptr->m_list[i].fx))
5438 player_ptr->riding = i;
5445 current_world_ptr->creating_savefile = FALSE;
5447 player_ptr->teleport_town = FALSE;
5448 player_ptr->sutemi = FALSE;
5449 current_world_ptr->timewalk_m_idx = 0;
5450 player_ptr->now_damaged = FALSE;
5452 current_world_ptr->start_time = time(NULL) - 1;
5453 record_o_name[0] = '\0';
5455 /* Reset map panel */
5456 panel_row_min = floor_ptr->height;
5457 panel_col_min = floor_ptr->width;
5459 /* Sexy gal gets bonus to maximum weapon skill of whip */
5460 if (player_ptr->pseikaku == SEIKAKU_SEXY)
5461 s_info[player_ptr->pclass].w_max[TV_HAFTED - TV_WEAPON_BEGIN][SV_WHIP] = WEAPON_EXP_MASTER;
5463 /* Fill the arrays of floors and walls in the good proportions */
5464 set_floor_and_wall(player_ptr->dungeon_idx);
5466 /* Flavor the objects */
5469 /* Flash a message */
5470 prt(_("お待ち下さい...", "Please wait..."), 0, 0);
5472 /* Flush the message */
5476 /* Hack -- Enter wizard mode */
5479 if (enter_wizard_mode(player_ptr))
5481 current_world_ptr->wizard = TRUE;
5483 if (player_ptr->is_dead || !player_ptr->y || !player_ptr->x)
5485 /* Initialize the saved floors data */
5486 init_saved_floors(player_ptr, TRUE);
5489 floor_ptr->inside_quest = 0;
5491 /* Avoid crash in update_view() */
5492 player_ptr->y = player_ptr->x = 10;
5495 else if (player_ptr->is_dead)
5497 quit("Already dead.");
5501 /* Initialize the town-buildings if necessary */
5502 if (!floor_ptr->dun_level && !floor_ptr->inside_quest)
5504 process_dungeon_file(player_ptr, "w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
5505 init_flags = INIT_ONLY_BUILDINGS;
5506 process_dungeon_file(player_ptr, "t_info.txt", 0, 0, MAX_HGT, MAX_WID);
5507 select_floor_music(player_ptr);
5510 /* Generate a dungeon level if needed */
5511 if (!current_world_ptr->character_dungeon)
5513 change_floor(player_ptr);
5517 /* HACK -- Restore from panic-save */
5518 if (player_ptr->panic_save)
5520 /* No player? -- Try to regenerate floor */
5521 if (!player_ptr->y || !player_ptr->x)
5523 msg_print(_("プレイヤーの位置がおかしい。フロアを再生成します。", "What a strange player location. Regenerate the dungeon floor."));
5524 change_floor(player_ptr);
5527 /* Still no player? -- Try to locate random place */
5528 if (!player_ptr->y || !player_ptr->x) player_ptr->y = player_ptr->x = 10;
5530 /* No longer in panic */
5531 player_ptr->panic_save = 0;
5535 /* Character is now "complete" */
5536 current_world_ptr->character_generated = TRUE;
5538 /* Hack -- Character is no longer "icky" */
5539 current_world_ptr->character_icky = FALSE;
5544 sprintf(buf, _("%sに降り立った。", "You are standing in the %s."), map_name(player_ptr));
5545 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, buf);
5549 player_ptr->playing = TRUE;
5551 /* Reset the visual mappings */
5552 reset_visuals(player_ptr);
5554 /* Load the "pref" files */
5555 load_all_pref_files(player_ptr);
5557 /* Give startup outfit (after loading pref files) */
5560 player_outfit(player_ptr);
5563 /* React to changes */
5564 Term_xtra(TERM_XTRA_REACT, 0);
5566 player_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
5567 player_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
5568 handle_stuff(player_ptr);
5570 /* Set or clear "rogue_like_commands" if requested */
5571 if (arg_force_original) rogue_like_commands = FALSE;
5572 if (arg_force_roguelike) rogue_like_commands = TRUE;
5574 /* Hack -- Enforce "delayed death" */
5575 if (player_ptr->chp < 0) player_ptr->is_dead = TRUE;
5577 if (player_ptr->prace == RACE_ANDROID) calc_android_exp(player_ptr);
5579 if (new_game && ((player_ptr->pclass == CLASS_CAVALRY) || (player_ptr->pclass == CLASS_BEASTMASTER)))
5581 monster_type *m_ptr;
5582 MONRACE_IDX pet_r_idx = ((player_ptr->pclass == CLASS_CAVALRY) ? MON_HORSE : MON_YASE_HORSE);
5583 monster_race *r_ptr = &r_info[pet_r_idx];
5584 place_monster_aux(player_ptr, 0, player_ptr->y, player_ptr->x - 1, pet_r_idx,
5585 (PM_FORCE_PET | PM_NO_KAGE));
5586 m_ptr = &floor_ptr->m_list[hack_m_idx_ii];
5587 m_ptr->mspeed = r_ptr->speed;
5588 m_ptr->maxhp = r_ptr->hdice*(r_ptr->hside + 1) / 2;
5589 m_ptr->max_maxhp = m_ptr->maxhp;
5590 m_ptr->hp = r_ptr->hdice*(r_ptr->hside + 1) / 2;
5591 m_ptr->dealt_damage = 0;
5592 m_ptr->energy_need = ENERGY_NEED() + ENERGY_NEED();
5595 (void)combine_and_reorder_home(STORE_HOME);
5596 (void)combine_and_reorder_home(STORE_MUSEUM);
5598 select_floor_music(player_ptr);
5603 /* Process the level */
5604 dungeon(player_ptr, load_game);
5606 /* Hack -- prevent "icky" message */
5607 current_world_ptr->character_xtra = TRUE;
5609 handle_stuff(player_ptr);
5611 current_world_ptr->character_xtra = FALSE;
5613 /* Cancel the target */
5616 health_track(player_ptr, 0);
5618 forget_lite(floor_ptr);
5619 forget_view(floor_ptr);
5620 clear_mon_lite(floor_ptr);
5622 /* Handle "quit and save" */
5623 if (!player_ptr->playing && !player_ptr->is_dead) break;
5625 wipe_o_list(floor_ptr);
5626 if (!player_ptr->is_dead) wipe_m_list();
5633 /* Accidental Death */
5634 if (player_ptr->playing && player_ptr->is_dead)
5636 if (floor_ptr->inside_arena)
5638 floor_ptr->inside_arena = FALSE;
5639 if (player_ptr->arena_number > MAX_ARENA_MONS)
5640 player_ptr->arena_number++;
5642 player_ptr->arena_number = -1 - player_ptr->arena_number;
5643 player_ptr->is_dead = FALSE;
5644 player_ptr->chp = 0;
5645 player_ptr->chp_frac = 0;
5646 player_ptr->exit_bldg = TRUE;
5647 reset_tim_flags(player_ptr);
5649 /* Leave through the exit */
5650 prepare_change_floor_mode(player_ptr, CFM_SAVE_FLOORS | CFM_RAND_CONNECT);
5652 /* prepare next floor */
5653 leave_floor(player_ptr);
5657 /* Mega-Hack -- Allow player to cheat death */
5658 if ((current_world_ptr->wizard || cheat_live) && !get_check(_("死にますか? ", "Die? ")))
5660 cheat_death(player_ptr);
5665 /* Handle "death" */
5666 if (player_ptr->is_dead) break;
5668 /* Make a new level */
5669 change_floor(player_ptr);
5673 close_game(player_ptr);
5680 * @brief ゲームターンからの実時間換算を行うための補正をかける
5681 * @param hoge ゲームターン
5682 * @details アンデッド種族は18:00からゲームを開始するので、この修正を予め行う。
5683 * @return 修正をかけた後のゲームターン
5685 s32b turn_real(player_type *player_ptr, s32b hoge)
5687 switch (player_ptr->start_race)
5693 return hoge - (TURNS_PER_TICK * TOWN_DAWN * 3 / 4);
5701 * @brief ターンのオーバーフローに対する対処
5702 * @param player_ptr プレーヤーへの参照ポインタ
5703 * @details ターン及びターンを記録する変数をターンの限界の1日前まで巻き戻す.
5704 * @return 修正をかけた後のゲームターン
5706 void prevent_turn_overflow(player_type *player_ptr)
5708 int rollback_days, i, j;
5709 s32b rollback_turns;
5711 if (current_world_ptr->game_turn < current_world_ptr->game_turn_limit) return;
5713 rollback_days = 1 + (current_world_ptr->game_turn - current_world_ptr->game_turn_limit) / (TURNS_PER_TICK * TOWN_DAWN);
5714 rollback_turns = TURNS_PER_TICK * TOWN_DAWN * rollback_days;
5716 if (current_world_ptr->game_turn > rollback_turns) current_world_ptr->game_turn -= rollback_turns;
5717 else current_world_ptr->game_turn = 1;
5718 floor_type *floor_ptr = player_ptr->current_floor_ptr;
5719 if (floor_ptr->generated_turn > rollback_turns) floor_ptr->generated_turn -= rollback_turns;
5720 else floor_ptr->generated_turn = 1;
5721 if (current_world_ptr->arena_start_turn > rollback_turns) current_world_ptr->arena_start_turn -= rollback_turns;
5722 else current_world_ptr->arena_start_turn = 1;
5723 if (player_ptr->feeling_turn > rollback_turns) player_ptr->feeling_turn -= rollback_turns;
5724 else player_ptr->feeling_turn = 1;
5726 for (i = 1; i < max_towns; i++)
5728 for (j = 0; j < MAX_STORES; j++)
5730 store_type *st_ptr = &town_info[i].store[j];
5732 if (st_ptr->last_visit > -10L * TURNS_PER_TICK * STORE_TICKS)
5734 st_ptr->last_visit -= rollback_turns;
5735 if (st_ptr->last_visit < -10L * TURNS_PER_TICK * STORE_TICKS) st_ptr->last_visit = -10L * TURNS_PER_TICK * STORE_TICKS;
5738 if (st_ptr->store_open)
5740 st_ptr->store_open -= rollback_turns;
5741 if (st_ptr->store_open < 1) st_ptr->store_open = 1;
5750 * Close up the current game (player may or may not be dead)
5751 * @param creature_ptr プレーヤーへの参照ポインタ
5755 * This function is called only from "main.c" and "signals.c".
5758 void close_game(player_type *player_ptr)
5761 bool do_send = TRUE;
5763 /* concptr p = "[i:キャラクタの情報, f:ファイル書き出し, t:スコア, x:*鑑定*, ESC:ゲーム終了]"; */
5764 handle_stuff(player_ptr);
5766 /* Flush the messages */
5769 /* Flush the input */
5773 /* No suspending now */
5774 signals_ignore_tstp();
5777 /* Hack -- Character is now "icky" */
5778 current_world_ptr->character_icky = TRUE;
5780 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
5782 /* Grab permissions */
5785 /* Open the high score file, for reading/writing */
5786 highscore_fd = fd_open(buf, O_RDWR);
5788 /* Drop permissions */
5792 if (player_ptr->is_dead)
5794 /* Handle retirement */
5795 if (current_world_ptr->total_winner) kingly(player_ptr);
5798 if (!cheat_save || get_check(_("死んだデータをセーブしますか? ", "Save death? ")))
5800 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
5802 else do_send = FALSE;
5805 print_tomb(player_ptr);
5809 /* Show more info */
5810 show_info(player_ptr);
5813 if (check_score(player_ptr))
5815 if ((!send_world_score(player_ptr, do_send)))
5817 if (get_check_strict(_("後でスコアを登録するために待機しますか?", "Stand by for later score registration? "),
5818 (CHECK_NO_ESCAPE | CHECK_NO_HISTORY)))
5820 player_ptr->wait_report_score = TRUE;
5821 player_ptr->is_dead = FALSE;
5822 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
5825 if (!player_ptr->wait_report_score)
5826 (void)top_twenty(player_ptr);
5828 else if (highscore_fd >= 0)
5830 display_scores_aux(0, 10, -1, NULL);
5838 do_cmd_save_game(player_ptr, FALSE);
5840 /* Prompt for scores */
5841 prt(_("リターンキーか ESC キーを押して下さい。", "Press Return (or Escape)."), 0, 40);
5842 play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_EXIT);
5844 /* Predict score (or ESCAPE) */
5845 if (inkey() != ESCAPE) predict_score(player_ptr);
5849 /* Shut the high score file */
5850 (void)fd_close(highscore_fd);
5852 /* Forget the high score fd */
5855 /* Kill all temporary files */
5856 clear_saved_floor_files(player_ptr);
5858 /* Allow suspending now */
5859 signals_handle_tstp();
5864 * @brief 全更新処理をチェックして処理していく
5865 * Handle "player_ptr->update" and "player_ptr->redraw" and "player_ptr->window"
5868 void handle_stuff(player_type *player_ptr)
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);
5876 void update_output(player_type *player_ptr)
5878 if (player_ptr->redraw) redraw_stuff(player_ptr);
5879 if (player_ptr->window) window_stuff(player_ptr);