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(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, NIKKI_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(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(p_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)
1183 { if (one_in_(2) && (caster_ptr->current_floor_ptr->dun_level > 4) && ((caster_ptr->current_floor_ptr->dun_level + 10) > caster_ptr->lev)) caster_ptr->spell_exp[spell] += 1; }
1184 else if(caster_ptr->spell_exp[spell] < SPELL_EXP_EXPERT)
1185 { if (one_in_(5) && ((caster_ptr->current_floor_ptr->dun_level + 5) > caster_ptr->lev) && ((caster_ptr->current_floor_ptr->dun_level + 5) > s_ptr->slevel)) caster_ptr->spell_exp[spell] += 1; }
1186 else if(caster_ptr->spell_exp[spell] < SPELL_EXP_MASTER)
1187 { if (one_in_(5) && ((caster_ptr->current_floor_ptr->dun_level + 5) > caster_ptr->lev) && (caster_ptr->current_floor_ptr->dun_level > s_ptr->slevel)) caster_ptr->spell_exp[spell] += 1; }
1189 /* Do any effects of continual song */
1190 exe_spell(caster_ptr, REALM_MUSIC, spell, SPELL_CONT);
1194 * @brief 現在呪いを保持している装備品を一つランダムに探し出す / Choose one of items that have cursed flag
1195 * @param flag 探し出したい呪いフラグ配列
1196 * @return 該当の呪いが一つでもあった場合にランダムに選ばれた装備品のオブジェクト構造体参照ポインタを返す。\n
1199 static object_type *choose_cursed_obj_name(BIT_FLAGS flag)
1202 int choices[INVEN_TOTAL-INVEN_RARM];
1205 /* Paranoia -- Player has no warning-item */
1206 if (!(p_ptr->cursed & flag)) return NULL;
1208 /* Search Inventry */
1209 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
1211 object_type *o_ptr = &p_ptr->inventory_list[i];
1213 if (o_ptr->curse_flags & flag)
1215 choices[number] = i;
1218 else if ((flag == TRC_ADD_L_CURSE) ||
1219 (flag == TRC_ADD_H_CURSE) ||
1220 (flag == TRC_DRAIN_HP) ||
1221 (flag == TRC_DRAIN_MANA) ||
1222 (flag == TRC_CALL_ANIMAL) ||
1223 (flag == TRC_CALL_DEMON) ||
1224 (flag == TRC_CALL_DRAGON) ||
1225 (flag == TRC_CALL_UNDEAD) ||
1226 (flag == TRC_COWARDICE) ||
1227 (flag == TRC_LOW_MELEE) ||
1228 (flag == TRC_LOW_AC) ||
1229 (flag == TRC_LOW_MAGIC) ||
1230 (flag == TRC_FAST_DIGEST) ||
1231 (flag == TRC_SLOW_REGEN) )
1234 BIT_FLAGS flgs[TR_FLAG_SIZE];
1235 object_flags(o_ptr, flgs);
1238 case TRC_ADD_L_CURSE : cf = TR_ADD_L_CURSE; break;
1239 case TRC_ADD_H_CURSE : cf = TR_ADD_H_CURSE; break;
1240 case TRC_DRAIN_HP : cf = TR_DRAIN_HP; break;
1241 case TRC_DRAIN_MANA : cf = TR_DRAIN_MANA; break;
1242 case TRC_CALL_ANIMAL : cf = TR_CALL_ANIMAL; break;
1243 case TRC_CALL_DEMON : cf = TR_CALL_DEMON; break;
1244 case TRC_CALL_DRAGON : cf = TR_CALL_DRAGON; break;
1245 case TRC_CALL_UNDEAD : cf = TR_CALL_UNDEAD; break;
1246 case TRC_COWARDICE : cf = TR_COWARDICE; break;
1247 case TRC_LOW_MELEE : cf = TR_LOW_MELEE; break;
1248 case TRC_LOW_AC : cf = TR_LOW_AC; break;
1249 case TRC_LOW_MAGIC : cf = TR_LOW_MAGIC; break;
1250 case TRC_FAST_DIGEST : cf = TR_FAST_DIGEST; break;
1251 case TRC_SLOW_REGEN : cf = TR_SLOW_REGEN; break;
1254 if (have_flag(flgs, cf))
1256 choices[number] = i;
1262 /* Choice one of them */
1263 return (&p_ptr->inventory_list[choices[randint0(number)]]);
1267 static void process_world_aux_digestion(player_type *creature_ptr)
1269 if (!creature_ptr->phase_out)
1271 /* Digest quickly when gorged */
1272 if (creature_ptr->food >= PY_FOOD_MAX)
1274 /* Digest a lot of food */
1275 (void)set_food(creature_ptr, creature_ptr->food - 100);
1278 /* Digest normally -- Every 50 game turns */
1279 else if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 5)))
1281 /* Basic digestion rate based on speed */
1282 int digestion = SPEED_TO_ENERGY(creature_ptr->pspeed);
1284 /* Regeneration takes more food */
1285 if (creature_ptr->regenerate)
1287 if (creature_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1289 if (creature_ptr->cursed & TRC_FAST_DIGEST)
1292 /* Slow digestion takes less food */
1293 if (creature_ptr->slow_digest)
1296 /* Minimal digestion */
1297 if (digestion < 1) digestion = 1;
1298 /* Maximal digestion */
1299 if (digestion > 100) digestion = 100;
1301 /* Digest some food */
1302 (void)set_food(creature_ptr, creature_ptr->food - digestion);
1307 if ((creature_ptr->food < PY_FOOD_FAINT))
1309 /* Faint occasionally */
1310 if (!creature_ptr->paralyzed && (randint0(100) < 10))
1312 msg_print(_("あまりにも空腹で気絶してしまった。", "You faint from the lack of food."));
1313 disturb(creature_ptr, TRUE, TRUE);
1315 /* Hack -- faint (bypass free action) */
1316 (void)set_paralyzed(creature_ptr, creature_ptr->paralyzed + 1 + randint0(5));
1319 /* Starve to death (slowly) */
1320 if (creature_ptr->food < PY_FOOD_STARVE)
1322 /* Calculate damage */
1323 HIT_POINT dam = (PY_FOOD_STARVE - creature_ptr->food) / 10;
1325 if (!IS_INVULN(creature_ptr)) take_hit(creature_ptr, DAMAGE_LOSELIFE, dam, _("空腹", "starvation"), -1);
1332 * @brief 10ゲームターンが進行するごとにプレイヤーのHPとMPの増減処理を行う。
1333 * / Handle timed damage and regeneration every 10 game turns
1336 static void process_world_aux_hp_and_sp(player_type *creature_ptr)
1338 feature_type *f_ptr = &f_info[creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].feat];
1339 bool cave_no_regen = FALSE;
1340 int upkeep_factor = 0;
1342 /* Default regeneration */
1343 int regen_amount = PY_REGEN_NORMAL;
1346 /*** Damage over Time ***/
1348 /* Take damage from poison */
1349 if (creature_ptr->poisoned && !IS_INVULN(creature_ptr))
1351 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, _("毒", "poison"), -1);
1354 /* Take damage from cuts */
1355 if (creature_ptr->cut && !IS_INVULN(creature_ptr))
1359 /* Mortal wound or Deep Gash */
1360 if (creature_ptr->cut > 1000)
1365 else if (creature_ptr->cut > 200)
1371 else if (creature_ptr->cut > 100)
1376 else if (creature_ptr->cut > 50)
1381 else if (creature_ptr->cut > 25)
1386 else if (creature_ptr->cut > 10)
1397 take_hit(creature_ptr, DAMAGE_NOESCAPE, dam, _("致命傷", "a fatal wound"), -1);
1400 /* (Vampires) Take damage from sunlight */
1401 if (PRACE_IS_(creature_ptr, RACE_VAMPIRE) || (creature_ptr->mimic_form == MIMIC_VAMPIRE))
1403 if (!creature_ptr->current_floor_ptr->dun_level && !creature_ptr->resist_lite && !IS_INVULN(creature_ptr) && is_daytime())
1405 if ((creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
1407 msg_print(_("日光があなたのアンデッドの肉体を焼き焦がした!", "The sun's rays scorch your undead flesh!"));
1408 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, _("日光", "sunlight"), -1);
1409 cave_no_regen = TRUE;
1413 if (creature_ptr->inventory_list[INVEN_LITE].tval && (creature_ptr->inventory_list[INVEN_LITE].name2 != EGO_LITE_DARKNESS) &&
1414 !creature_ptr->resist_lite)
1416 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
1417 GAME_TEXT o_name [MAX_NLEN];
1418 char ouch [MAX_NLEN+40];
1420 /* Get an object description */
1421 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1422 msg_format(_("%sがあなたのアンデッドの肉体を焼き焦がした!", "The %s scorches your undead flesh!"), o_name);
1424 cave_no_regen = TRUE;
1426 /* Get an object description */
1427 object_desc(o_name, o_ptr, OD_NAME_ONLY);
1428 sprintf(ouch, _("%sを装備したダメージ", "wielding %s"), o_name);
1430 if (!IS_INVULN(creature_ptr)) take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, ouch, -1);
1434 if (have_flag(f_ptr->flags, FF_LAVA) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_fire)
1438 if (have_flag(f_ptr->flags, FF_DEEP))
1440 damage = 6000 + randint0(4000);
1442 else if (!creature_ptr->levitation)
1444 damage = 3000 + randint0(2000);
1449 if(PRACE_IS_(creature_ptr, RACE_ENT)) damage += damage / 3;
1450 if(creature_ptr->resist_fire) damage = damage / 3;
1451 if(is_oppose_fire(creature_ptr)) damage = damage / 3;
1452 if(creature_ptr->levitation) damage = damage / 5;
1454 damage = damage / 100 + (randint0(100) < (damage % 100));
1456 if (creature_ptr->levitation)
1458 msg_print(_("熱で火傷した!", "The heat burns you!"));
1459 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1460 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1464 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1465 msg_format(_("%sで火傷した!", "The %s burns you!"), name);
1466 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1469 cave_no_regen = TRUE;
1473 if (have_flag(f_ptr->flags, FF_COLD_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_cold)
1477 if (have_flag(f_ptr->flags, FF_DEEP))
1479 damage = 6000 + randint0(4000);
1481 else if (!creature_ptr->levitation)
1483 damage = 3000 + randint0(2000);
1488 if (creature_ptr->resist_cold) damage = damage / 3;
1489 if (is_oppose_cold(creature_ptr)) damage = damage / 3;
1490 if (creature_ptr->levitation) damage = damage / 5;
1492 damage = damage / 100 + (randint0(100) < (damage % 100));
1494 if (creature_ptr->levitation)
1496 msg_print(_("冷気に覆われた!", "The cold engulfs you!"));
1497 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1498 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1502 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1503 msg_format(_("%sに凍えた!", "The %s frostbites you!"), name);
1504 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1507 cave_no_regen = TRUE;
1511 if (have_flag(f_ptr->flags, FF_ELEC_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_elec)
1515 if (have_flag(f_ptr->flags, FF_DEEP))
1517 damage = 6000 + randint0(4000);
1519 else if (!creature_ptr->levitation)
1521 damage = 3000 + randint0(2000);
1526 if (creature_ptr->resist_elec) damage = damage / 3;
1527 if (is_oppose_elec(creature_ptr)) damage = damage / 3;
1528 if (creature_ptr->levitation) damage = damage / 5;
1530 damage = damage / 100 + (randint0(100) < (damage % 100));
1532 if (creature_ptr->levitation)
1534 msg_print(_("電撃を受けた!", "The electric shocks you!"));
1535 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1536 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1540 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1541 msg_format(_("%sに感電した!", "The %s shocks you!"), name);
1542 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1545 cave_no_regen = TRUE;
1549 if (have_flag(f_ptr->flags, FF_ACID_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_acid)
1553 if (have_flag(f_ptr->flags, FF_DEEP))
1555 damage = 6000 + randint0(4000);
1557 else if (!creature_ptr->levitation)
1559 damage = 3000 + randint0(2000);
1564 if (creature_ptr->resist_acid) damage = damage / 3;
1565 if (is_oppose_acid(creature_ptr)) damage = damage / 3;
1566 if (creature_ptr->levitation) damage = damage / 5;
1568 damage = damage / 100 + (randint0(100) < (damage % 100));
1570 if (creature_ptr->levitation)
1572 msg_print(_("酸が飛び散った!", "The acid melt you!"));
1573 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1574 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1578 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1579 msg_format(_("%sに溶かされた!", "The %s melts you!"), name);
1580 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1583 cave_no_regen = TRUE;
1587 if (have_flag(f_ptr->flags, FF_POISON_PUDDLE) && !IS_INVULN(creature_ptr))
1591 if (have_flag(f_ptr->flags, FF_DEEP))
1593 damage = 6000 + randint0(4000);
1595 else if (!creature_ptr->levitation)
1597 damage = 3000 + randint0(2000);
1602 if (creature_ptr->resist_pois) damage = damage / 3;
1603 if (is_oppose_pois(creature_ptr)) damage = damage / 3;
1604 if (creature_ptr->levitation) damage = damage / 5;
1606 damage = damage / 100 + (randint0(100) < (damage % 100));
1608 if (creature_ptr->levitation)
1610 msg_print(_("毒気を吸い込んだ!", "The gas poisons you!"));
1611 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1612 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1613 if (creature_ptr->resist_pois) (void)set_poisoned(creature_ptr, creature_ptr->poisoned + 1);
1617 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1618 msg_format(_("%sに毒された!", "The %s poisons you!"), name);
1619 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1620 if (creature_ptr->resist_pois) (void)set_poisoned(creature_ptr, creature_ptr->poisoned + 3);
1623 cave_no_regen = TRUE;
1627 if (have_flag(f_ptr->flags, FF_WATER) && have_flag(f_ptr->flags, FF_DEEP) &&
1628 !creature_ptr->levitation && !creature_ptr->can_swim && !creature_ptr->resist_water)
1630 if (creature_ptr->total_weight > weight_limit(creature_ptr))
1632 msg_print(_("溺れている!", "You are drowning!"));
1633 take_hit(creature_ptr, DAMAGE_NOESCAPE, randint1(creature_ptr->lev), _("溺れ", "drowning"), -1);
1634 cave_no_regen = TRUE;
1638 if (creature_ptr->riding)
1641 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags2 & RF2_AURA_FIRE) && !creature_ptr->immune_fire)
1643 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1644 if (PRACE_IS_(creature_ptr, RACE_ENT)) damage += damage / 3;
1645 if (creature_ptr->resist_fire) damage = damage / 3;
1646 if (is_oppose_fire(creature_ptr)) damage = damage / 3;
1647 msg_print(_("熱い!", "It's hot!"));
1648 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("炎のオーラ", "Fire aura"), -1);
1650 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags2 & RF2_AURA_ELEC) && !creature_ptr->immune_elec)
1652 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1653 if (PRACE_IS_(creature_ptr, RACE_ANDROID)) damage += damage / 3;
1654 if (creature_ptr->resist_elec) damage = damage / 3;
1655 if (is_oppose_elec(creature_ptr)) damage = damage / 3;
1656 msg_print(_("痛い!", "It hurts!"));
1657 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("電気のオーラ", "Elec aura"), -1);
1659 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags3 & RF3_AURA_COLD) && !creature_ptr->immune_cold)
1661 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1662 if (creature_ptr->resist_cold) damage = damage / 3;
1663 if (is_oppose_cold(creature_ptr)) damage = damage / 3;
1664 msg_print(_("冷たい!", "It's cold!"));
1665 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("冷気のオーラ", "Cold aura"), -1);
1669 /* Spectres -- take damage when moving through walls */
1671 * Added: ANYBODY takes damage if inside through walls
1672 * without wraith form -- NOTE: Spectres will never be
1673 * reduced below 0 hp by being inside a stone wall; others
1676 if (!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY))
1678 if (!IS_INVULN(creature_ptr) && !creature_ptr->wraith_form && !creature_ptr->kabenuke && ((creature_ptr->chp > (creature_ptr->lev / 5)) || !creature_ptr->pass_wall))
1681 cave_no_regen = TRUE;
1683 if (creature_ptr->pass_wall)
1685 msg_print(_("体の分子が分解した気がする!", "Your molecules feel disrupted!"));
1686 dam_desc = _("密度", "density");
1690 msg_print(_("崩れた岩に押し潰された!", "You are being crushed!"));
1691 dam_desc = _("硬い岩", "solid rock");
1694 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1 + (creature_ptr->lev / 5), dam_desc, -1);
1699 /*** handle regeneration ***/
1702 if (creature_ptr->food < PY_FOOD_WEAK)
1704 /* Lower regeneration */
1705 if (creature_ptr->food < PY_FOOD_STARVE)
1709 else if (creature_ptr->food < PY_FOOD_FAINT)
1711 regen_amount = PY_REGEN_FAINT;
1715 regen_amount = PY_REGEN_WEAK;
1719 /* Are we walking the pattern? */
1720 if (pattern_effect(creature_ptr))
1722 cave_no_regen = TRUE;
1726 /* Regeneration ability */
1727 if (creature_ptr->regenerate)
1729 regen_amount = regen_amount * 2;
1731 if (creature_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1735 if (creature_ptr->cursed & TRC_SLOW_REGEN)
1742 /* Searching or Resting */
1743 if ((creature_ptr->action == ACTION_SEARCH) || (creature_ptr->action == ACTION_REST))
1745 regen_amount = regen_amount * 2;
1748 upkeep_factor = calculate_upkeep(creature_ptr);
1750 /* No regeneration while special action */
1751 if ((creature_ptr->action == ACTION_LEARN) ||
1752 (creature_ptr->action == ACTION_HAYAGAKE) ||
1753 (creature_ptr->special_defense & KATA_KOUKIJIN))
1755 upkeep_factor += 100;
1758 /* Regenerate the mana */
1759 regenmana(creature_ptr, upkeep_factor, regen_amount);
1762 /* Recharge magic eater's power */
1763 if (creature_ptr->pclass == CLASS_MAGIC_EATER)
1765 regenmagic(creature_ptr, regen_amount);
1768 if ((creature_ptr->csp == 0) && (creature_ptr->csp_frac == 0))
1770 while (upkeep_factor > 100)
1772 msg_print(_("こんなに多くのペットを制御できない!", "Too many pets to control at once!"));
1774 do_cmd_pet_dismiss(creature_ptr);
1776 upkeep_factor = calculate_upkeep(creature_ptr);
1778 msg_format(_("維持MPは %d%%", "Upkeep: %d%% mana."), upkeep_factor);
1783 /* Poisoned or cut yields no healing */
1784 if (creature_ptr->poisoned) regen_amount = 0;
1785 if (creature_ptr->cut) regen_amount = 0;
1787 /* Special floor -- Pattern, in a wall -- yields no healing */
1788 if (cave_no_regen) regen_amount = 0;
1790 regen_amount = (regen_amount * creature_ptr->mutant_regenerate_mod) / 100;
1792 /* Regenerate Hit Points if needed */
1793 if ((creature_ptr->chp < creature_ptr->mhp) && !cave_no_regen)
1795 regenhp(creature_ptr, regen_amount);
1800 * @brief 10ゲームターンが進行するごとに魔法効果の残りターンを減らしていく処理
1801 * / Handle timeout every 10 game turns
1804 static void process_world_aux_timeout(player_type *creature_ptr)
1806 const int dec_count = (easy_band ? 2 : 1);
1808 /*** Timeout Various Things ***/
1811 if (creature_ptr->tim_mimic)
1813 (void)set_mimic(creature_ptr, creature_ptr->tim_mimic - 1, creature_ptr->mimic_form, TRUE);
1816 /* Hack -- Hallucinating */
1817 if (creature_ptr->image)
1819 (void)set_image(creature_ptr, creature_ptr->image - dec_count);
1823 if (creature_ptr->blind)
1825 (void)set_blind(creature_ptr, creature_ptr->blind - dec_count);
1828 /* Times see-invisible */
1829 if (creature_ptr->tim_invis)
1831 (void)set_tim_invis(creature_ptr, creature_ptr->tim_invis - 1, TRUE);
1834 if (creature_ptr->suppress_multi_reward)
1836 creature_ptr->suppress_multi_reward = FALSE;
1840 if (creature_ptr->tim_esp)
1842 (void)set_tim_esp(creature_ptr, creature_ptr->tim_esp - 1, TRUE);
1845 /* Timed temporary elemental brands. -LM- */
1846 if (creature_ptr->ele_attack)
1848 creature_ptr->ele_attack--;
1850 /* Clear all temporary elemental brands. */
1851 if (!creature_ptr->ele_attack) set_ele_attack(creature_ptr, 0, 0);
1854 /* Timed temporary elemental immune. -LM- */
1855 if (creature_ptr->ele_immune)
1857 creature_ptr->ele_immune--;
1859 /* Clear all temporary elemental brands. */
1860 if (!creature_ptr->ele_immune) set_ele_immune(creature_ptr, 0, 0);
1863 /* Timed infra-vision */
1864 if (creature_ptr->tim_infra)
1866 (void)set_tim_infra(creature_ptr, creature_ptr->tim_infra - 1, TRUE);
1870 if (creature_ptr->tim_stealth)
1872 (void)set_tim_stealth(creature_ptr, creature_ptr->tim_stealth - 1, TRUE);
1875 /* Timed levitation */
1876 if (creature_ptr->tim_levitation)
1878 (void)set_tim_levitation(creature_ptr, creature_ptr->tim_levitation - 1, TRUE);
1881 /* Timed sh_touki */
1882 if (creature_ptr->tim_sh_touki)
1884 (void)set_tim_sh_touki(creature_ptr, creature_ptr->tim_sh_touki - 1, TRUE);
1888 if (creature_ptr->tim_sh_fire)
1890 (void)set_tim_sh_fire(creature_ptr, creature_ptr->tim_sh_fire - 1, TRUE);
1894 if (creature_ptr->tim_sh_holy)
1896 (void)set_tim_sh_holy(creature_ptr, creature_ptr->tim_sh_holy - 1, TRUE);
1900 if (creature_ptr->tim_eyeeye)
1902 (void)set_tim_eyeeye(creature_ptr, creature_ptr->tim_eyeeye - 1, TRUE);
1905 /* Timed resist-magic */
1906 if (creature_ptr->resist_magic)
1908 (void)set_resist_magic(creature_ptr, creature_ptr->resist_magic - 1, TRUE);
1911 /* Timed regeneration */
1912 if (creature_ptr->tim_regen)
1914 (void)set_tim_regen(creature_ptr, creature_ptr->tim_regen - 1, TRUE);
1917 /* Timed resist nether */
1918 if (creature_ptr->tim_res_nether)
1920 (void)set_tim_res_nether(creature_ptr, creature_ptr->tim_res_nether - 1, TRUE);
1923 /* Timed resist time */
1924 if (creature_ptr->tim_res_time)
1926 (void)set_tim_res_time(creature_ptr, creature_ptr->tim_res_time - 1, TRUE);
1930 if (creature_ptr->tim_reflect)
1932 (void)set_tim_reflect(creature_ptr, creature_ptr->tim_reflect - 1, TRUE);
1936 if (creature_ptr->multishadow)
1938 (void)set_multishadow(creature_ptr, creature_ptr->multishadow - 1, TRUE);
1941 /* Timed Robe of dust */
1942 if (creature_ptr->dustrobe)
1944 (void)set_dustrobe(creature_ptr, creature_ptr->dustrobe - 1, TRUE);
1947 /* Timed infra-vision */
1948 if (creature_ptr->kabenuke)
1950 (void)set_kabenuke(creature_ptr, creature_ptr->kabenuke - 1, TRUE);
1954 if (creature_ptr->paralyzed)
1956 (void)set_paralyzed(creature_ptr, creature_ptr->paralyzed - dec_count);
1960 if (creature_ptr->confused)
1962 (void)set_confused(creature_ptr, creature_ptr->confused - dec_count);
1966 if (creature_ptr->afraid)
1968 (void)set_afraid(creature_ptr, creature_ptr->afraid - dec_count);
1972 if (creature_ptr->fast)
1974 (void)set_fast(creature_ptr, creature_ptr->fast - 1, TRUE);
1978 if (creature_ptr->slow)
1980 (void)set_slow(creature_ptr, creature_ptr->slow - dec_count, TRUE);
1983 /* Protection from evil */
1984 if (creature_ptr->protevil)
1986 (void)set_protevil(creature_ptr, creature_ptr->protevil - 1, TRUE);
1989 /* Invulnerability */
1990 if (creature_ptr->invuln)
1992 (void)set_invuln(creature_ptr, creature_ptr->invuln - 1, TRUE);
1996 if (creature_ptr->wraith_form)
1998 (void)set_wraith_form(creature_ptr, creature_ptr->wraith_form - 1, TRUE);
2002 if (creature_ptr->hero)
2004 (void)set_hero(creature_ptr, creature_ptr->hero - 1, TRUE);
2008 if (creature_ptr->shero)
2010 (void)set_shero(creature_ptr, creature_ptr->shero - 1, TRUE);
2014 if (creature_ptr->blessed)
2016 (void)set_blessed(creature_ptr, creature_ptr->blessed - 1, TRUE);
2020 if (creature_ptr->shield)
2022 (void)set_shield(creature_ptr, creature_ptr->shield - 1, TRUE);
2026 if (creature_ptr->tsubureru)
2028 (void)set_tsubureru(creature_ptr, creature_ptr->tsubureru - 1, TRUE);
2032 if (creature_ptr->magicdef)
2034 (void)set_magicdef(creature_ptr, creature_ptr->magicdef - 1, TRUE);
2038 if (creature_ptr->tsuyoshi)
2040 (void)set_tsuyoshi(creature_ptr, creature_ptr->tsuyoshi - 1, TRUE);
2044 if (creature_ptr->oppose_acid)
2046 (void)set_oppose_acid(creature_ptr, creature_ptr->oppose_acid - 1, TRUE);
2049 /* Oppose Lightning */
2050 if (creature_ptr->oppose_elec)
2052 (void)set_oppose_elec(creature_ptr, creature_ptr->oppose_elec - 1, TRUE);
2056 if (creature_ptr->oppose_fire)
2058 (void)set_oppose_fire(creature_ptr, creature_ptr->oppose_fire - 1, TRUE);
2062 if (creature_ptr->oppose_cold)
2064 (void)set_oppose_cold(creature_ptr, creature_ptr->oppose_cold - 1, TRUE);
2068 if (creature_ptr->oppose_pois)
2070 (void)set_oppose_pois(creature_ptr, creature_ptr->oppose_pois - 1, TRUE);
2073 if (creature_ptr->ult_res)
2075 (void)set_ultimate_res(creature_ptr, creature_ptr->ult_res - 1, TRUE);
2078 /*** Poison and Stun and Cut ***/
2081 if (creature_ptr->poisoned)
2083 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
2085 /* Apply some healing */
2086 (void)set_poisoned(creature_ptr, creature_ptr->poisoned - adjust);
2090 if (creature_ptr->stun)
2092 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
2094 /* Apply some healing */
2095 (void)set_stun(creature_ptr, creature_ptr->stun - adjust);
2099 if (creature_ptr->cut)
2101 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
2103 /* Hack -- Truly "mortal" wound */
2104 if (creature_ptr->cut > 1000) adjust = 0;
2106 /* Apply some healing */
2107 (void)set_cut(creature_ptr,creature_ptr->cut - adjust);
2113 * @brief 10ゲームターンが進行する毎に光源の寿命を減らす処理
2114 * / Handle burning fuel every 10 game turns
2117 static void process_world_aux_light(player_type *creature_ptr)
2119 /* Check for light being wielded */
2120 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
2122 /* Burn some fuel in the current lite */
2123 if (o_ptr->tval == TV_LITE)
2125 /* Hack -- Use some fuel (except on artifacts) */
2126 if (!(object_is_fixed_artifact(o_ptr) || o_ptr->sval == SV_LITE_FEANOR) && (o_ptr->xtra4 > 0))
2128 /* Decrease life-span */
2129 if (o_ptr->name2 == EGO_LITE_LONG)
2131 if (current_world_ptr->game_turn % (TURNS_PER_TICK*2)) o_ptr->xtra4--;
2133 else o_ptr->xtra4--;
2135 /* Notice interesting fuel steps */
2136 notice_lite_change(creature_ptr, o_ptr);
2143 * @brief 10ゲームターンが進行するごとに突然変異の発動判定を行う処理
2144 * / Handle mutation effects once every 10 game turns
2147 static void process_world_aux_mutation(player_type *creature_ptr)
2149 /* No mutation with effects */
2150 if (!creature_ptr->muta2) return;
2152 /* No effect on monster arena */
2153 if (creature_ptr->phase_out) return;
2155 /* No effect on the global map */
2156 if (creature_ptr->wild_mode) return;
2158 if ((creature_ptr->muta2 & MUT2_BERS_RAGE) && one_in_(3000))
2160 disturb(creature_ptr, FALSE, TRUE);
2161 msg_print(_("ウガァァア!", "RAAAAGHH!"));
2162 msg_print(_("激怒の発作に襲われた!", "You feel a fit of rage coming over you!"));
2163 (void)set_shero(creature_ptr, 10 + randint1(creature_ptr->lev), FALSE);
2164 (void)set_afraid(creature_ptr, 0);
2167 if ((creature_ptr->muta2 & MUT2_COWARDICE) && (randint1(3000) == 13))
2169 if (!creature_ptr->resist_fear)
2171 disturb(creature_ptr, FALSE, TRUE);
2172 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
2173 set_afraid(creature_ptr, creature_ptr->afraid + 13 + randint1(26));
2177 if ((creature_ptr->muta2 & MUT2_RTELEPORT) && (randint1(5000) == 88))
2179 if (!creature_ptr->resist_nexus && !(creature_ptr->muta1 & MUT1_VTELEPORT) && !creature_ptr->anti_tele)
2181 disturb(creature_ptr, FALSE, TRUE);
2182 msg_print(_("あなたの位置は突然ひじょうに不確定になった...", "Your position suddenly seems very uncertain..."));
2184 teleport_player(creature_ptr, 40, TELEPORT_PASSIVE);
2188 if ((creature_ptr->muta2 & MUT2_ALCOHOL) && (randint1(6400) == 321))
2190 if (!creature_ptr->resist_conf && !creature_ptr->resist_chaos)
2192 disturb(creature_ptr, FALSE, TRUE);
2193 creature_ptr->redraw |= PR_EXTRA;
2194 msg_print(_("いひきがもーろーとひてきたきがふる...ヒック!", "You feel a SSSCHtupor cOmINg over yOu... *HIC*!"));
2197 if (!creature_ptr->resist_conf)
2199 (void)set_confused(creature_ptr, creature_ptr->confused + randint0(20) + 15);
2202 if (!creature_ptr->resist_chaos)
2207 if (one_in_(3)) lose_all_info(creature_ptr);
2208 else wiz_dark(creature_ptr);
2209 (void)teleport_player_aux(creature_ptr,100, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE);
2210 wiz_dark(creature_ptr);
2211 msg_print(_("あなたは見知らぬ場所で目が醒めた...頭が痛い。", "You wake up somewhere with a sore head..."));
2212 msg_print(_("何も覚えていない。どうやってここに来たかも分からない!", "You can't remember a thing, or how you got here!"));
2218 msg_print(_("き~れいなちょおちょらとんれいる~", "Thishcischs GooDSChtuff!"));
2219 (void)set_image(creature_ptr, creature_ptr->image + randint0(150) + 150);
2225 if ((creature_ptr->muta2 & MUT2_HALLU) && (randint1(6400) == 42))
2227 if (!creature_ptr->resist_chaos)
2229 disturb(creature_ptr, FALSE, TRUE);
2230 creature_ptr->redraw |= PR_EXTRA;
2231 (void)set_image(creature_ptr, creature_ptr->image + randint0(50) + 20);
2235 if ((creature_ptr->muta2 & MUT2_FLATULENT) && (randint1(3000) == 13))
2237 disturb(creature_ptr, FALSE, TRUE);
2238 msg_print(_("ブゥーーッ!おっと。", "BRRAAAP! Oops."));
2240 fire_ball(creature_ptr, GF_POIS, 0, creature_ptr->lev, 3);
2243 if ((creature_ptr->muta2 & MUT2_PROD_MANA) &&
2244 !creature_ptr->anti_magic && one_in_(9000))
2247 disturb(creature_ptr, FALSE, TRUE);
2248 msg_print(_("魔法のエネルギーが突然あなたの中に流れ込んできた!エネルギーを解放しなければならない!",
2249 "Magical energy flows through you! You must release it!"));
2253 (void)get_hack_dir(creature_ptr, &dire);
2254 fire_ball(creature_ptr, GF_MANA, dire, creature_ptr->lev * 2, 3);
2257 if ((creature_ptr->muta2 & MUT2_ATT_DEMON) && !creature_ptr->anti_magic && (randint1(6666) == 666))
2259 bool pet = one_in_(6);
2260 BIT_FLAGS mode = PM_ALLOW_GROUP;
2262 if (pet) mode |= PM_FORCE_PET;
2263 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2265 if (summon_specific((pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DEMON, mode))
2267 msg_print(_("あなたはデーモンを引き寄せた!", "You have attracted a demon!"));
2268 disturb(creature_ptr, FALSE, TRUE);
2272 if ((creature_ptr->muta2 & MUT2_SPEED_FLUX) && one_in_(6000))
2274 disturb(creature_ptr, FALSE, TRUE);
2277 msg_print(_("精力的でなくなった気がする。", "You feel less energetic."));
2279 if (creature_ptr->fast > 0)
2281 set_fast(creature_ptr, 0, TRUE);
2285 set_slow(creature_ptr, randint1(30) + 10, FALSE);
2290 msg_print(_("精力的になった気がする。", "You feel more energetic."));
2292 if (creature_ptr->slow > 0)
2294 set_slow(creature_ptr, 0, TRUE);
2298 set_fast(creature_ptr, randint1(30) + 10, FALSE);
2303 if ((creature_ptr->muta2 & MUT2_BANISH_ALL) && one_in_(9000))
2305 disturb(creature_ptr, FALSE, TRUE);
2306 msg_print(_("突然ほとんど孤独になった気がする。", "You suddenly feel almost lonely."));
2308 banish_monsters(creature_ptr, 100);
2309 if (!creature_ptr->current_floor_ptr->dun_level && creature_ptr->town_num)
2313 /* Pick a random shop (except home) */
2316 n = randint0(MAX_STORES);
2318 while ((n == STORE_HOME) || (n == STORE_MUSEUM));
2320 msg_print(_("店の主人が丘に向かって走っている!", "You see one of the shopkeepers running for the hills!"));
2326 if ((creature_ptr->muta2 & MUT2_EAT_LIGHT) && one_in_(3000))
2330 msg_print(_("影につつまれた。", "A shadow passes over you."));
2333 /* Absorb light from the current possition */
2334 if ((creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
2336 hp_player(creature_ptr, 10);
2339 o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
2341 /* Absorb some fuel in the current lite */
2342 if (o_ptr->tval == TV_LITE)
2344 /* Use some fuel (except on artifacts) */
2345 if (!object_is_fixed_artifact(o_ptr) && (o_ptr->xtra4 > 0))
2347 /* Heal the player a bit */
2348 hp_player(creature_ptr, o_ptr->xtra4 / 20);
2350 /* Decrease life-span of lite */
2352 msg_print(_("光源からエネルギーを吸収した!", "You absorb energy from your light!"));
2354 /* Notice interesting fuel steps */
2355 notice_lite_change(creature_ptr, o_ptr);
2360 * Unlite the area (radius 10) around player and
2361 * do 50 points damage to every affected monster
2363 unlite_area(creature_ptr, 50, 10);
2366 if ((creature_ptr->muta2 & MUT2_ATT_ANIMAL) && !creature_ptr->anti_magic && one_in_(7000))
2368 bool pet = one_in_(3);
2369 BIT_FLAGS mode = PM_ALLOW_GROUP;
2371 if (pet) mode |= PM_FORCE_PET;
2372 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2374 if (summon_specific((pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_ANIMAL, mode))
2376 msg_print(_("動物を引き寄せた!", "You have attracted an animal!"));
2377 disturb(creature_ptr, FALSE, TRUE);
2381 if ((creature_ptr->muta2 & MUT2_RAW_CHAOS) && !creature_ptr->anti_magic && one_in_(8000))
2383 disturb(creature_ptr, FALSE, TRUE);
2384 msg_print(_("周りの空間が歪んでいる気がする!", "You feel the world warping around you!"));
2387 fire_ball(creature_ptr, GF_CHAOS, 0, creature_ptr->lev, 8);
2389 if ((creature_ptr->muta2 & MUT2_NORMALITY) && one_in_(5000))
2391 if (!lose_mutation(creature_ptr, 0))
2392 msg_print(_("奇妙なくらい普通になった気がする。", "You feel oddly normal."));
2394 if ((creature_ptr->muta2 & MUT2_WRAITH) && !creature_ptr->anti_magic && one_in_(3000))
2396 disturb(creature_ptr, FALSE, TRUE);
2397 msg_print(_("非物質化した!", "You feel insubstantial!"));
2400 set_wraith_form(creature_ptr, randint1(creature_ptr->lev / 2) + (creature_ptr->lev / 2), FALSE);
2402 if ((creature_ptr->muta2 & MUT2_POLY_WOUND) && one_in_(3000))
2404 do_poly_wounds(creature_ptr);
2406 if ((creature_ptr->muta2 & MUT2_WASTING) && one_in_(3000))
2408 int which_stat = randint0(A_MAX);
2409 int sustained = FALSE;
2414 if (creature_ptr->sustain_str) sustained = TRUE;
2417 if (creature_ptr->sustain_int) sustained = TRUE;
2420 if (creature_ptr->sustain_wis) sustained = TRUE;
2423 if (creature_ptr->sustain_dex) sustained = TRUE;
2426 if (creature_ptr->sustain_con) sustained = TRUE;
2429 if (creature_ptr->sustain_chr) sustained = TRUE;
2432 msg_print(_("不正な状態!", "Invalid stat chosen!"));
2438 disturb(creature_ptr, FALSE, TRUE);
2439 msg_print(_("自分が衰弱していくのが分かる!", "You can feel yourself wasting away!"));
2441 (void)dec_stat(creature_ptr, which_stat, randint1(6) + 6, one_in_(3));
2444 if ((creature_ptr->muta2 & MUT2_ATT_DRAGON) && !creature_ptr->anti_magic && one_in_(3000))
2446 bool pet = one_in_(5);
2447 BIT_FLAGS mode = PM_ALLOW_GROUP;
2449 if (pet) mode |= PM_FORCE_PET;
2450 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2452 if (summon_specific((pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DRAGON, mode))
2454 msg_print(_("ドラゴンを引き寄せた!", "You have attracted a dragon!"));
2455 disturb(creature_ptr, FALSE, TRUE);
2458 if ((creature_ptr->muta2 & MUT2_WEIRD_MIND) && !creature_ptr->anti_magic && one_in_(3000))
2460 if (creature_ptr->tim_esp > 0)
2462 msg_print(_("精神にもやがかかった!", "Your mind feels cloudy!"));
2463 set_tim_esp(creature_ptr, 0, TRUE);
2467 msg_print(_("精神が広がった!", "Your mind expands!"));
2468 set_tim_esp(creature_ptr, creature_ptr->lev, FALSE);
2471 if ((creature_ptr->muta2 & MUT2_NAUSEA) && !creature_ptr->slow_digest && one_in_(9000))
2473 disturb(creature_ptr, FALSE, TRUE);
2474 msg_print(_("胃が痙攣し、食事を失った!", "Your stomach roils, and you lose your lunch!"));
2476 set_food(creature_ptr, PY_FOOD_WEAK);
2477 if (music_singing_any(creature_ptr)) stop_singing(creature_ptr);
2478 if (hex_spelling_any(creature_ptr)) stop_hex_spell_all(creature_ptr);
2481 if ((creature_ptr->muta2 & MUT2_WALK_SHAD) && !creature_ptr->anti_magic && one_in_(12000) && !creature_ptr->current_floor_ptr->inside_arena)
2483 reserve_alter_reality(creature_ptr);
2486 if ((creature_ptr->muta2 & MUT2_WARNING) && one_in_(1000))
2488 int danger_amount = 0;
2489 MONSTER_IDX monster;
2491 for (monster = 0; monster < creature_ptr->current_floor_ptr->m_max; monster++)
2493 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[monster];
2494 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2495 if (!monster_is_valid(m_ptr)) continue;
2497 if (r_ptr->level >= creature_ptr->lev)
2499 danger_amount += r_ptr->level - creature_ptr->lev + 1;
2503 if (danger_amount > 100)
2504 msg_print(_("非常に恐ろしい気がする!", "You feel utterly terrified!"));
2505 else if (danger_amount > 50)
2506 msg_print(_("恐ろしい気がする!", "You feel terrified!"));
2507 else if (danger_amount > 20)
2508 msg_print(_("非常に心配な気がする!", "You feel very worried!"));
2509 else if (danger_amount > 10)
2510 msg_print(_("心配な気がする!", "You feel paranoid!"));
2511 else if (danger_amount > 5)
2512 msg_print(_("ほとんど安全な気がする。", "You feel almost safe."));
2514 msg_print(_("寂しい気がする。", "You feel lonely."));
2517 if ((creature_ptr->muta2 & MUT2_INVULN) && !creature_ptr->anti_magic && one_in_(5000))
2519 disturb(creature_ptr, FALSE, TRUE);
2520 msg_print(_("無敵な気がする!", "You feel invincible!"));
2522 (void)set_invuln(creature_ptr, randint1(8) + 8, FALSE);
2525 if ((creature_ptr->muta2 & MUT2_SP_TO_HP) && one_in_(2000))
2527 MANA_POINT wounds = (MANA_POINT)(creature_ptr->mhp - creature_ptr->chp);
2531 HIT_POINT healing = creature_ptr->csp;
2532 if (healing > wounds) healing = wounds;
2534 hp_player(creature_ptr, healing);
2535 creature_ptr->csp -= healing;
2536 creature_ptr->redraw |= (PR_HP | PR_MANA);
2540 if ((creature_ptr->muta2 & MUT2_HP_TO_SP) && !creature_ptr->anti_magic && one_in_(4000))
2542 HIT_POINT wounds = (HIT_POINT)(creature_ptr->msp - creature_ptr->csp);
2546 HIT_POINT healing = creature_ptr->chp;
2547 if (healing > wounds) healing = wounds;
2549 creature_ptr->csp += healing;
2550 creature_ptr->redraw |= (PR_HP | PR_MANA);
2551 take_hit(creature_ptr, DAMAGE_LOSELIFE, healing, _("頭に昇った血", "blood rushing to the head"), -1);
2555 if ((creature_ptr->muta2 & MUT2_DISARM) && one_in_(10000))
2557 INVENTORY_IDX slot = 0;
2558 object_type *o_ptr = NULL;
2560 disturb(creature_ptr, FALSE, TRUE);
2561 msg_print(_("足がもつれて転んだ!", "You trip over your own feet!"));
2562 take_hit(creature_ptr, DAMAGE_NOESCAPE, randint1(creature_ptr->wt / 6), _("転倒", "tripping"), -1);
2565 if (has_melee_weapon(creature_ptr, INVEN_RARM))
2568 o_ptr = &creature_ptr->inventory_list[INVEN_RARM];
2570 if (has_melee_weapon(creature_ptr, INVEN_LARM) && one_in_(2))
2572 o_ptr = &creature_ptr->inventory_list[INVEN_LARM];
2576 else if (has_melee_weapon(creature_ptr, INVEN_LARM))
2578 o_ptr = &creature_ptr->inventory_list[INVEN_LARM];
2581 if (slot && !object_is_cursed(o_ptr))
2583 msg_print(_("武器を落としてしまった!", "You drop your weapon!"));
2584 drop_from_inventory(creature_ptr, slot, 1);
2591 * @brief 10ゲームターンが進行するごとに装備効果の発動判定を行う処理
2592 * / Handle curse effects once every 10 game turns
2595 static void process_world_aux_curse(player_type *creature_ptr)
2597 if ((creature_ptr->cursed & TRC_P_FLAG_MASK) && !creature_ptr->phase_out && !creature_ptr->wild_mode)
2600 * Hack: Uncursed teleporting items (e.g. Trump Weapons)
2601 * can actually be useful!
2603 if ((creature_ptr->cursed & TRC_TELEPORT_SELF) && one_in_(200))
2605 GAME_TEXT o_name[MAX_NLEN];
2607 int i, i_keep = 0, count = 0;
2609 /* Scan the equipment with random teleport ability */
2610 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
2612 BIT_FLAGS flgs[TR_FLAG_SIZE];
2613 o_ptr = &creature_ptr->inventory_list[i];
2614 if (!o_ptr->k_idx) continue;
2616 object_flags(o_ptr, flgs);
2618 if (have_flag(flgs, TR_TELEPORT))
2620 /* {.} will stop random teleportation. */
2621 if (!o_ptr->inscription || !my_strchr(quark_str(o_ptr->inscription), '.'))
2624 if (one_in_(count)) i_keep = i;
2629 o_ptr = &creature_ptr->inventory_list[i_keep];
2630 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2631 msg_format(_("%sがテレポートの能力を発動させようとしている。", "Your %s is activating teleportation."), o_name);
2632 if (get_check_strict(_("テレポートしますか?", "Teleport? "), CHECK_OKAY_CANCEL))
2634 disturb(creature_ptr, FALSE, TRUE);
2635 teleport_player(creature_ptr, 50, 0L);
2639 msg_format(_("%sに{.}(ピリオド)と銘を刻むと発動を抑制できます。",
2640 "You can inscribe {.} on your %s to disable random teleportation. "), o_name);
2641 disturb(creature_ptr, TRUE, TRUE);
2644 /* Make a chainsword noise */
2645 if ((creature_ptr->cursed & TRC_CHAINSWORD) && one_in_(CHAINSWORD_NOISE))
2648 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, noise))
2650 disturb(creature_ptr, FALSE, FALSE);
2653 if ((creature_ptr->cursed & TRC_TY_CURSE) && one_in_(TY_CURSE_CHANCE))
2656 (void)activate_ty_curse(creature_ptr, FALSE, &count);
2658 /* Handle experience draining */
2659 if (creature_ptr->prace != RACE_ANDROID && ((creature_ptr->cursed & TRC_DRAIN_EXP) && one_in_(4)))
2661 creature_ptr->exp -= (creature_ptr->lev + 1) / 2;
2662 if (creature_ptr->exp < 0) creature_ptr->exp = 0;
2663 creature_ptr->max_exp -= (creature_ptr->lev + 1) / 2;
2664 if (creature_ptr->max_exp < 0) creature_ptr->max_exp = 0;
2665 check_experience(creature_ptr);
2667 /* Add light curse (Later) */
2668 if ((creature_ptr->cursed & TRC_ADD_L_CURSE) && one_in_(2000))
2670 BIT_FLAGS new_curse;
2673 o_ptr = choose_cursed_obj_name(TRC_ADD_L_CURSE);
2675 new_curse = get_curse(0, o_ptr);
2676 if (!(o_ptr->curse_flags & new_curse))
2678 GAME_TEXT o_name[MAX_NLEN];
2680 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2682 o_ptr->curse_flags |= new_curse;
2683 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2685 o_ptr->feeling = FEEL_NONE;
2687 creature_ptr->update |= (PU_BONUS);
2690 /* Add heavy curse (Later) */
2691 if ((creature_ptr->cursed & TRC_ADD_H_CURSE) && one_in_(2000))
2693 BIT_FLAGS new_curse;
2696 o_ptr = choose_cursed_obj_name(TRC_ADD_H_CURSE);
2698 new_curse = get_curse(1, o_ptr);
2699 if (!(o_ptr->curse_flags & new_curse))
2701 GAME_TEXT o_name[MAX_NLEN];
2703 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2705 o_ptr->curse_flags |= new_curse;
2706 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2707 o_ptr->feeling = FEEL_NONE;
2709 creature_ptr->update |= (PU_BONUS);
2713 if ((creature_ptr->cursed & TRC_CALL_ANIMAL) && one_in_(2500))
2715 if (summon_specific(0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_ANIMAL, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2717 GAME_TEXT o_name[MAX_NLEN];
2719 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_ANIMAL), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2720 msg_format(_("%sが動物を引き寄せた!", "Your %s has attracted an animal!"), o_name);
2721 disturb(creature_ptr, FALSE, TRUE);
2725 if ((creature_ptr->cursed & TRC_CALL_DEMON) && one_in_(1111))
2727 if (summon_specific(0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2729 GAME_TEXT o_name[MAX_NLEN];
2731 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DEMON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2732 msg_format(_("%sが悪魔を引き寄せた!", "Your %s has attracted a demon!"), o_name);
2733 disturb(creature_ptr, FALSE, TRUE);
2737 if ((creature_ptr->cursed & TRC_CALL_DRAGON) && one_in_(800))
2739 if (summon_specific(0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DRAGON,
2740 (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2742 GAME_TEXT o_name[MAX_NLEN];
2744 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DRAGON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2745 msg_format(_("%sがドラゴンを引き寄せた!", "Your %s has attracted an dragon!"), o_name);
2746 disturb(creature_ptr, FALSE, TRUE);
2750 if ((creature_ptr->cursed & TRC_CALL_UNDEAD) && one_in_(1111))
2752 if (summon_specific(0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_UNDEAD,
2753 (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2755 GAME_TEXT o_name[MAX_NLEN];
2757 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_UNDEAD), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2758 msg_format(_("%sが死霊を引き寄せた!", "Your %s has attracted an undead!"), o_name);
2759 disturb(creature_ptr, FALSE, TRUE);
2762 if ((creature_ptr->cursed & TRC_COWARDICE) && one_in_(1500))
2764 if (!creature_ptr->resist_fear)
2766 disturb(creature_ptr, FALSE, TRUE);
2767 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
2768 set_afraid(creature_ptr, creature_ptr->afraid + 13 + randint1(26));
2771 /* Teleport player */
2772 if ((creature_ptr->cursed & TRC_TELEPORT) && one_in_(200) && !creature_ptr->anti_tele)
2774 disturb(creature_ptr, FALSE, TRUE);
2776 /* Teleport player */
2777 teleport_player(creature_ptr, 40, TELEPORT_PASSIVE);
2779 /* Handle HP draining */
2780 if ((creature_ptr->cursed & TRC_DRAIN_HP) && one_in_(666))
2782 GAME_TEXT o_name[MAX_NLEN];
2784 object_desc(o_name, choose_cursed_obj_name(TRC_DRAIN_HP), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2785 msg_format(_("%sはあなたの体力を吸収した!", "Your %s drains HP from you!"), o_name);
2786 take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev*2, 100), o_name, -1);
2788 /* Handle mana draining */
2789 if ((creature_ptr->cursed & TRC_DRAIN_MANA) && creature_ptr->csp && one_in_(666))
2791 GAME_TEXT o_name[MAX_NLEN];
2793 object_desc(o_name, choose_cursed_obj_name(TRC_DRAIN_MANA), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2794 msg_format(_("%sはあなたの魔力を吸収した!", "Your %s drains mana from you!"), o_name);
2795 creature_ptr->csp -= MIN(creature_ptr->lev, 50);
2796 if (creature_ptr->csp < 0)
2798 creature_ptr->csp = 0;
2799 creature_ptr->csp_frac = 0;
2801 creature_ptr->redraw |= PR_MANA;
2805 /* Rarely, take damage from the Jewel of Judgement */
2806 if (one_in_(999) && !creature_ptr->anti_magic)
2808 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
2810 if (o_ptr->name1 == ART_JUDGE)
2812 if (object_is_known(o_ptr))
2813 msg_print(_("『審判の宝石』はあなたの体力を吸収した!", "The Jewel of Judgement drains life from you!"));
2815 msg_print(_("なにかがあなたの体力を吸収した!", "Something drains life from you!"));
2816 take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev, 50), _("審判の宝石", "the Jewel of Judgement"), -1);
2823 * @brief 10ゲームターンが進行するごとに魔道具の自然充填を行う処理
2824 * / Handle recharging objects once every 10 game turns
2827 static void process_world_aux_recharge(player_type *creature_ptr)
2832 /* Process equipment */
2833 for (changed = FALSE, i = INVEN_RARM; i < INVEN_TOTAL; i++)
2835 /* Get the object */
2836 object_type *o_ptr = &creature_ptr->inventory_list[i];
2837 if (!o_ptr->k_idx) continue;
2839 /* Recharge activatable objects */
2840 if (o_ptr->timeout > 0)
2845 /* Notice changes */
2846 if (!o_ptr->timeout)
2848 recharged_notice(o_ptr);
2854 /* Notice changes */
2857 creature_ptr->window |= (PW_EQUIP);
2862 * Recharge rods. Rods now use timeout to control charging status,
2863 * and each charging rod in a stack decreases the stack's timeout by
2864 * one per turn. -LM-
2866 for (changed = FALSE, i = 0; i < INVEN_PACK; i++)
2868 object_type *o_ptr = &creature_ptr->inventory_list[i];
2869 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2870 if (!o_ptr->k_idx) continue;
2872 /* Examine all charging rods or stacks of charging rods. */
2873 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2875 /* Determine how many rods are charging. */
2876 TIME_EFFECT temp = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval;
2877 if (temp > o_ptr->number) temp = (TIME_EFFECT)o_ptr->number;
2879 /* Decrease timeout by that number. */
2880 o_ptr->timeout -= temp;
2882 /* Boundary control. */
2883 if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2885 /* Notice changes, provide message if object is inscribed. */
2886 if (!(o_ptr->timeout))
2888 recharged_notice(o_ptr);
2892 /* One of the stack of rod is charged */
2893 else if (o_ptr->timeout % k_ptr->pval)
2900 /* Notice changes */
2903 creature_ptr->window |= (PW_INVEN);
2907 /* Process objects on floor */
2908 for (i = 1; i < creature_ptr->current_floor_ptr->o_max; i++)
2910 object_type *o_ptr = &creature_ptr->current_floor_ptr->o_list[i];
2912 if (!OBJECT_IS_VALID(o_ptr)) continue;
2914 /* Recharge rods on the ground. No messages. */
2915 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2918 o_ptr->timeout -= (TIME_EFFECT)o_ptr->number;
2920 /* Boundary control. */
2921 if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2928 * @brief 10ゲームターンが進行するごとに帰還や現実変容などの残り時間カウントダウンと発動を処理する。
2929 * / Handle involuntary movement once every 10 game turns
2932 static void process_world_aux_movement(player_type *creature_ptr)
2934 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
2935 /* Delayed Word-of-Recall */
2936 if (creature_ptr->word_recall)
2939 * HACK: Autosave BEFORE resetting the recall counter (rr9)
2940 * The player is yanked up/down as soon as
2941 * he loads the autosaved game.
2943 if (autosave_l && (creature_ptr->word_recall == 1) && !creature_ptr->phase_out)
2944 do_cmd_save_game(creature_ptr, TRUE);
2946 /* Count down towards recall */
2947 creature_ptr->word_recall--;
2949 creature_ptr->redraw |= (PR_STATUS);
2951 /* Activate the recall */
2952 if (!creature_ptr->word_recall)
2955 disturb(creature_ptr, FALSE, TRUE);
2957 /* Determine the level */
2958 if (floor_ptr->dun_level || creature_ptr->current_floor_ptr->inside_quest || creature_ptr->enter_dungeon)
2960 msg_print(_("上に引っ張りあげられる感じがする!", "You feel yourself yanked upwards!"));
2962 if (creature_ptr->dungeon_idx) creature_ptr->recall_dungeon = creature_ptr->dungeon_idx;
2964 exe_write_diary(creature_ptr, NIKKI_RECALL, floor_ptr->dun_level, NULL);
2966 floor_ptr->dun_level = 0;
2967 creature_ptr->dungeon_idx = 0;
2969 leave_quest_check(creature_ptr);
2970 leave_tower_check(creature_ptr);
2972 creature_ptr->current_floor_ptr->inside_quest = 0;
2974 creature_ptr->leaving = TRUE;
2978 msg_print(_("下に引きずり降ろされる感じがする!", "You feel yourself yanked downwards!"));
2980 creature_ptr->dungeon_idx = creature_ptr->recall_dungeon;
2983 exe_write_diary(creature_ptr, NIKKI_RECALL, floor_ptr->dun_level, NULL);
2986 floor_ptr->dun_level = max_dlv[creature_ptr->dungeon_idx];
2987 if (floor_ptr->dun_level < 1) floor_ptr->dun_level = 1;
2989 /* Nightmare mode makes recall more dangerous */
2990 if (ironman_nightmare && !randint0(666) && (creature_ptr->dungeon_idx == DUNGEON_ANGBAND))
2992 if (floor_ptr->dun_level < 50)
2994 floor_ptr->dun_level *= 2;
2996 else if (floor_ptr->dun_level < 99)
2998 floor_ptr->dun_level = (floor_ptr->dun_level + 99) / 2;
3000 else if (floor_ptr->dun_level > 100)
3002 floor_ptr->dun_level = d_info[creature_ptr->dungeon_idx].maxdepth - 1;
3006 if (creature_ptr->wild_mode)
3008 creature_ptr->wilderness_y = creature_ptr->y;
3009 creature_ptr->wilderness_x = creature_ptr->x;
3013 /* Save player position */
3014 creature_ptr->oldpx = creature_ptr->x;
3015 creature_ptr->oldpy = creature_ptr->y;
3017 creature_ptr->wild_mode = FALSE;
3020 * Clear all saved floors
3021 * and create a first saved floor
3023 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
3024 creature_ptr->leaving = TRUE;
3026 if (creature_ptr->dungeon_idx == DUNGEON_ANGBAND)
3030 for (i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++)
3032 quest_type* const q_ptr = &quest[i];
3035 if ((q_ptr->type == QUEST_TYPE_RANDOM) &&
3036 (q_ptr->status == QUEST_STATUS_TAKEN) &&
3037 (q_ptr->level < floor_ptr->dun_level))
3039 q_ptr->status = QUEST_STATUS_FAILED;
3040 q_ptr->complev = (byte)creature_ptr->lev;
3042 q_ptr->comptime = current_world_ptr->play_time;
3043 r_info[q_ptr->r_idx].flags1 &= ~(RF1_QUESTOR);
3049 sound(SOUND_TPLEVEL);
3054 /* Delayed Alter reality */
3055 if (creature_ptr->alter_reality)
3057 if (autosave_l && (creature_ptr->alter_reality == 1) && !creature_ptr->phase_out)
3058 do_cmd_save_game(creature_ptr, TRUE);
3060 /* Count down towards alter */
3061 creature_ptr->alter_reality--;
3063 creature_ptr->redraw |= (PR_STATUS);
3065 /* Activate the alter reality */
3066 if (!creature_ptr->alter_reality)
3069 disturb(creature_ptr, FALSE, TRUE);
3071 /* Determine the level */
3072 if (!quest_number(creature_ptr, floor_ptr->dun_level) && floor_ptr->dun_level)
3074 msg_print(_("世界が変わった!", "The world changes!"));
3077 * Clear all saved floors
3078 * and create a first saved floor
3080 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
3081 creature_ptr->leaving = TRUE;
3085 msg_print(_("世界が少しの間変化したようだ。", "The world seems to change for a moment!"));
3088 sound(SOUND_TPLEVEL);
3094 * @brief 10ゲームターンが進行する毎にゲーム世界全体の処理を行う。
3095 * / Handle certain things once every 10 game turns
3098 static void process_world(player_type *player_ptr)
3102 const s32b A_DAY = TURNS_PER_TICK * TOWN_DAWN;
3103 s32b prev_turn_in_today = ((current_world_ptr->game_turn - TURNS_PER_TICK) % A_DAY + A_DAY / 4) % A_DAY;
3104 int prev_min = (1440 * prev_turn_in_today / A_DAY) % 60;
3106 extract_day_hour_min(player_ptr, &day, &hour, &min);
3108 /* Update dungeon feeling, and announce it if changed */
3109 update_dungeon_feeling(player_ptr);
3111 /* 帰還無しモード時のレベルテレポバグ対策 / Fix for level teleport bugs on ironman_downward.*/
3112 if (ironman_downward && (player_ptr->dungeon_idx != DUNGEON_ANGBAND && player_ptr->dungeon_idx != 0))
3114 player_ptr->current_floor_ptr->dun_level = 0;
3115 player_ptr->dungeon_idx = 0;
3116 prepare_change_floor_mode(player_ptr, CFM_FIRST_FLOOR | CFM_RAND_PLACE);
3117 player_ptr->current_floor_ptr->inside_arena = FALSE;
3118 player_ptr->wild_mode = FALSE;
3119 player_ptr->leaving = TRUE;
3122 /*** Check monster arena ***/
3123 if (player_ptr->phase_out && !player_ptr->leaving)
3129 /* Count all hostile monsters */
3130 for (i2 = 0; i2 < player_ptr->current_floor_ptr->width; ++i2)
3131 for (j2 = 0; j2 < player_ptr->current_floor_ptr->height; j2++)
3133 grid_type *g_ptr = &player_ptr->current_floor_ptr->grid_array[j2][i2];
3135 if ((g_ptr->m_idx > 0) && (g_ptr->m_idx != player_ptr->riding))
3138 win_m_idx = g_ptr->m_idx;
3142 if (number_mon == 0)
3144 msg_print(_("相打ちに終わりました。", "They have kill each other at the same time."));
3146 player_ptr->energy_need = 0;
3147 update_gambling_monsters(player_ptr);
3149 else if ((number_mon-1) == 0)
3151 GAME_TEXT m_name[MAX_NLEN];
3152 monster_type *wm_ptr;
3154 wm_ptr = &player_ptr->current_floor_ptr->m_list[win_m_idx];
3156 monster_desc(m_name, wm_ptr, 0);
3157 msg_format(_("%sが勝利した!", "%s is winner!"), m_name);
3160 if (win_m_idx == (sel_monster+1))
3162 msg_print(_("おめでとうございます。", "Congratulations."));
3163 msg_format(_("%d$を受け取った。", "You received %d gold."), battle_odds);
3164 player_ptr->au += battle_odds;
3168 msg_print(_("残念でした。", "You lost gold."));
3171 player_ptr->energy_need = 0;
3172 update_gambling_monsters(player_ptr);
3174 else if (current_world_ptr->game_turn - player_ptr->current_floor_ptr->generated_turn == 150 * TURNS_PER_TICK)
3176 msg_print(_("申し分けありませんが、この勝負は引き分けとさせていただきます。", "This battle have ended in a draw."));
3177 player_ptr->au += kakekin;
3179 player_ptr->energy_need = 0;
3180 update_gambling_monsters(player_ptr);
3184 /* Every 10 game turns */
3185 if (current_world_ptr->game_turn % TURNS_PER_TICK) return;
3187 /*** Attempt timed autosave ***/
3188 if (autosave_t && autosave_freq && !player_ptr->phase_out)
3190 if (!(current_world_ptr->game_turn % ((s32b)autosave_freq * TURNS_PER_TICK)))
3191 do_cmd_save_game(player_ptr, TRUE);
3194 if (player_ptr->current_floor_ptr->monster_noise && !ignore_unview)
3196 msg_print(_("何かが聞こえた。", "You hear noise."));
3199 /*** Handle the wilderness/town (sunshine) ***/
3201 /* While in town/wilderness */
3202 if (!player_ptr->current_floor_ptr->dun_level && !player_ptr->current_floor_ptr->inside_quest && !player_ptr->phase_out && !player_ptr->current_floor_ptr->inside_arena)
3204 /* Hack -- Daybreak/Nighfall in town */
3205 if (!(current_world_ptr->game_turn % ((TURNS_PER_TICK * TOWN_DAWN) / 2)))
3209 /* Check for dawn */
3210 dawn = (!(current_world_ptr->game_turn % (TURNS_PER_TICK * TOWN_DAWN)));
3212 if (dawn) day_break(player_ptr);
3213 else night_falls(player_ptr);
3218 /* While in the dungeon (vanilla_town or lite_town mode only) */
3219 else if ((vanilla_town || (lite_town && !player_ptr->current_floor_ptr->inside_quest && !player_ptr->phase_out && !player_ptr->current_floor_ptr->inside_arena)) && player_ptr->current_floor_ptr->dun_level)
3221 /*** Shuffle the Storekeepers ***/
3223 /* Chance is only once a day (while in dungeon) */
3224 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * STORE_TICKS)))
3226 /* Sometimes, shuffle the shop-keepers */
3227 if (one_in_(STORE_SHUFFLE))
3232 /* Pick a random shop (except home and museum) */
3235 n = randint0(MAX_STORES);
3237 while ((n == STORE_HOME) || (n == STORE_MUSEUM));
3239 /* Check every feature */
3240 for (i = 1; i < max_f_idx; i++)
3242 feature_type *f_ptr = &f_info[i];
3244 /* Skip empty index */
3245 if (!f_ptr->name) continue;
3247 /* Skip non-store features */
3248 if (!have_flag(f_ptr->flags, FF_STORE)) continue;
3250 /* Verify store type */
3251 if (f_ptr->subtype == n)
3253 if (cheat_xtra) msg_format(_("%sの店主をシャッフルします。", "Shuffle a Shopkeeper of %s."), f_name + f_ptr->name);
3265 /*** Process the monsters ***/
3267 /* Check for creature generation. */
3268 if (one_in_(d_info[player_ptr->dungeon_idx].max_m_alloc_chance) &&
3269 !player_ptr->current_floor_ptr->inside_arena && !player_ptr->current_floor_ptr->inside_quest && !player_ptr->phase_out)
3271 /* Make a new monster */
3272 (void)alloc_monster(MAX_SIGHT + 5, 0);
3275 /* Hack -- Check for creature regeneration */
3276 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 10)) && !player_ptr->phase_out) regenerate_monsters(player_ptr);
3277 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 3))) regenerate_captured_monsters(player_ptr);
3279 if (!player_ptr->leaving)
3283 /* Hack -- Process the counters of monsters if needed */
3284 for (i = 0; i < MAX_MTIMED; i++)
3286 if (player_ptr->current_floor_ptr->mproc_max[i] > 0) process_monsters_mtimed(i);
3293 if (min != prev_min)
3295 exe_write_diary(player_ptr, NIKKI_HIGAWARI, 0, NULL);
3296 determine_daily_bounty(player_ptr, FALSE);
3301 * Nightmare mode activates the TY_CURSE at midnight
3302 * Require exact minute -- Don't activate multiple times in a minute
3305 if (ironman_nightmare && (min != prev_min))
3308 /* Every 15 minutes after 11:00 pm */
3309 if ((hour == 23) && !(min % 15))
3311 disturb(player_ptr, FALSE, TRUE);
3316 msg_print(_("遠くで不気味な鐘の音が鳴った。", "You hear a distant bell toll ominously."));
3320 msg_print(_("遠くで鐘が二回鳴った。", "A distant bell sounds twice."));
3324 msg_print(_("遠くで鐘が三回鳴った。", "A distant bell sounds three times."));
3328 msg_print(_("遠くで鐘が四回鳴った。", "A distant bell tolls four times."));
3333 /* TY_CURSE activates at midnight! */
3337 disturb(player_ptr, TRUE, TRUE);
3338 msg_print(_("遠くで鐘が何回も鳴り、死んだような静けさの中へ消えていった。", "A distant bell tolls many times, fading into an deathly silence."));
3340 if (player_ptr->wild_mode)
3342 /* Go into large wilderness view */
3343 player_ptr->oldpy = randint1(MAX_HGT - 2);
3344 player_ptr->oldpx = randint1(MAX_WID - 2);
3345 change_wild_mode(player_ptr, TRUE);
3347 /* Give first move to monsters */
3348 take_turn(player_ptr, 100);
3352 player_ptr->invoking_midnight_curse = TRUE;
3356 process_world_aux_digestion(player_ptr);
3357 process_world_aux_hp_and_sp(player_ptr);
3358 process_world_aux_timeout(player_ptr);
3359 process_world_aux_light(player_ptr);
3360 process_world_aux_mutation(player_ptr);
3361 process_world_aux_curse(player_ptr);
3362 process_world_aux_recharge(player_ptr);
3363 sense_inventory1(player_ptr);
3364 sense_inventory2(player_ptr);
3365 process_world_aux_movement(player_ptr);
3369 * @brief ウィザードモードへの導入処理
3370 * / Verify use of "wizard" mode
3371 * @return 実際にウィザードモードへ移行したらTRUEを返す。
3373 static bool enter_wizard_mode(void)
3375 /* Ask first time */
3376 if (!current_world_ptr->noscore)
3378 /* Wizard mode is not permitted */
3379 if (!allow_debug_opts || arg_wizard)
3381 msg_print(_("ウィザードモードは許可されていません。 ", "Wizard mode is not permitted."));
3385 /* Mention effects */
3386 msg_print(_("ウィザードモードはデバッグと実験のためのモードです。 ", "Wizard mode is for debugging and experimenting."));
3387 msg_print(_("一度ウィザードモードに入るとスコアは記録されません。", "The game will not be scored if you enter wizard mode."));
3390 /* Verify request */
3391 if (!get_check(_("本当にウィザードモードに入りたいのですか? ", "Are you sure you want to enter wizard mode? ")))
3396 exe_write_diary(p_ptr, NIKKI_BUNSHOU, 0, _("ウィザードモードに突入してスコアを残せなくなった。", "give up recording score to enter wizard mode."));
3398 current_world_ptr->noscore |= 0x0002;
3409 * @brief デバッグコマンドへの導入処理
3410 * / Verify use of "debug" commands
3411 * @return 実際にデバッグコマンドへ移行したらTRUEを返す。
3413 static bool enter_debug_mode(void)
3415 /* Ask first time */
3416 if (!current_world_ptr->noscore)
3418 /* Debug mode is not permitted */
3419 if (!allow_debug_opts)
3421 msg_print(_("デバッグコマンドは許可されていません。 ", "Use of debug command is not permitted."));
3425 /* Mention effects */
3426 msg_print(_("デバッグ・コマンドはデバッグと実験のためのコマンドです。 ", "The debug commands are for debugging and experimenting."));
3427 msg_print(_("デバッグ・コマンドを使うとスコアは記録されません。", "The game will not be scored if you use debug commands."));
3431 /* Verify request */
3432 if (!get_check(_("本当にデバッグ・コマンドを使いますか? ", "Are you sure you want to use debug commands? ")))
3437 exe_write_diary(p_ptr, NIKKI_BUNSHOU, 0, _("デバッグモードに突入してスコアを残せなくなった。", "give up sending score to use debug commands."));
3439 current_world_ptr->noscore |= 0x0008;
3447 * Hack -- Declare the Debug Routines
3449 extern void do_cmd_debug(player_type *creature_ptr);
3451 #endif /* ALLOW_WIZARD */
3457 * @brief ボーグコマンドへの導入処理
3458 * / Verify use of "borg" commands
3459 * @return 実際にボーグコマンドへ移行したらTRUEを返す。
3461 static bool enter_borg_mode(void)
3463 /* Ask first time */
3464 if (!(current_world_ptr->noscore & 0x0010))
3466 /* Mention effects */
3467 msg_print(_("ボーグ・コマンドはデバッグと実験のためのコマンドです。 ", "The borg commands are for debugging and experimenting."));
3468 msg_print(_("ボーグ・コマンドを使うとスコアは記録されません。", "The game will not be scored if you use borg commands."));
3472 /* Verify request */
3473 if (!get_check(_("本当にボーグ・コマンドを使いますか? ", "Are you sure you want to use borg commands? ")))
3478 exe_write_diary(p_ptr, NIKKI_BUNSHOU, 0, _("ボーグ・コマンドを使用してスコアを残せなくなった。", "give up recording score to use borg commands."));
3480 current_world_ptr->noscore |= 0x0010;
3488 * Hack -- Declare the Ben Borg
3490 extern void do_cmd_borg(void);
3492 #endif /* ALLOW_BORG */
3496 * @brief プレイヤーから受けた入力コマンドの分岐処理。
3497 * / Parse and execute the current command Give "Warning" on illegal commands.
3498 * @todo Make some "blocks"
3501 static void process_command(player_type *creature_ptr)
3503 COMMAND_CODE old_now_message = now_message;
3505 /* Handle repeating the last command */
3511 if ((creature_ptr->pclass == CLASS_SNIPER) && (creature_ptr->concent))
3512 creature_ptr->reset_concent = TRUE;
3514 /* Parse the command */
3515 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
3516 switch (command_cmd)
3532 /*** Wizard Commands ***/
3535 if (current_world_ptr->wizard)
3537 current_world_ptr->wizard = FALSE;
3538 msg_print(_("ウィザードモード解除。", "Wizard mode off."));
3540 else if (enter_wizard_mode())
3542 current_world_ptr->wizard = TRUE;
3543 msg_print(_("ウィザードモード突入。", "Wizard mode on."));
3545 creature_ptr->update |= (PU_MONSTERS);
3546 creature_ptr->redraw |= (PR_TITLE);
3554 /* Special "debug" commands */
3557 if (enter_debug_mode())
3559 do_cmd_debug(creature_ptr);
3564 #endif /* ALLOW_WIZARD */
3569 /* Special "borg" commands */
3572 if (enter_borg_mode())
3574 if (!creature_ptr->wild_mode) do_cmd_borg();
3579 #endif /* ALLOW_BORG */
3583 /*** Inventory Commands ***/
3585 /* Wear/wield equipment */
3588 if (!creature_ptr->wild_mode) do_cmd_wield(creature_ptr);
3592 /* Take off equipment */
3595 if (!creature_ptr->wild_mode) do_cmd_takeoff(creature_ptr);
3602 if (!creature_ptr->wild_mode) do_cmd_drop(creature_ptr);
3606 /* Destroy an item */
3609 do_cmd_destroy(creature_ptr);
3613 /* Equipment list */
3616 do_cmd_equip(creature_ptr);
3620 /* Inventory list */
3623 do_cmd_inven(creature_ptr);
3628 /*** Various commands ***/
3630 /* Identify an object */
3633 do_cmd_observe(creature_ptr);
3639 toggle_inven_equip(creature_ptr);
3644 /*** Standard "Movement" Commands ***/
3649 if (!creature_ptr->wild_mode) do_cmd_alter(creature_ptr);
3656 if (!creature_ptr->wild_mode) do_cmd_tunnel(creature_ptr);
3660 /* Move (usually pick up things) */
3663 do_cmd_walk(creature_ptr, FALSE);
3667 /* Move (usually do not pick up) */
3670 do_cmd_walk(creature_ptr, TRUE);
3675 /*** Running, Resting, Searching, Staying */
3677 /* Begin Running -- Arg is Max Distance */
3680 if (!creature_ptr->wild_mode) do_cmd_run(creature_ptr);
3684 /* Stay still (usually pick things up) */
3687 do_cmd_stay(creature_ptr, always_pickup);
3691 /* Stay still (usually do not pick up) */
3694 do_cmd_stay(creature_ptr, !always_pickup);
3698 /* Rest -- Arg is time */
3701 do_cmd_rest(creature_ptr);
3705 /* Search for traps/doors */
3708 do_cmd_search(creature_ptr);
3714 if (creature_ptr->action == ACTION_SEARCH) set_action(creature_ptr, ACTION_NONE);
3715 else set_action(creature_ptr, ACTION_SEARCH);
3720 /*** Stairs and Doors and Chests and Traps ***/
3723 case SPECIAL_KEY_STORE:
3725 do_cmd_store(creature_ptr);
3729 /* Enter building -KMW- */
3730 case SPECIAL_KEY_BUILDING:
3732 do_cmd_bldg(creature_ptr);
3736 /* Enter quest level -KMW- */
3737 case SPECIAL_KEY_QUEST:
3739 do_cmd_quest(creature_ptr);
3743 /* Go up staircase */
3746 if (!creature_ptr->wild_mode && !floor_ptr->dun_level && !floor_ptr->inside_arena && !floor_ptr->inside_quest)
3748 if (vanilla_town) break;
3750 if (creature_ptr->ambush_flag)
3752 msg_print(_("襲撃から逃げるにはマップの端まで移動しなければならない。", "To flee the ambush you have to reach the edge of the map."));
3756 if (creature_ptr->food < PY_FOOD_WEAK)
3758 msg_print(_("その前に食事をとらないと。", "You must eat something here."));
3762 change_wild_mode(creature_ptr, FALSE);
3765 do_cmd_go_up(creature_ptr);
3769 /* Go down staircase */
3772 if (creature_ptr->wild_mode)
3773 change_wild_mode(creature_ptr, FALSE);
3775 do_cmd_go_down(creature_ptr);
3779 /* Open a door or chest */
3782 do_cmd_open(creature_ptr);
3789 do_cmd_close(creature_ptr);
3793 /* Jam a door with spikes */
3796 do_cmd_spike(creature_ptr);
3803 do_cmd_bash(creature_ptr);
3807 /* Disarm a trap or chest */
3810 do_cmd_disarm(creature_ptr);
3815 /*** Magic and Prayers ***/
3817 /* Gain new spells/prayers */
3820 if ((creature_ptr->pclass == CLASS_SORCERER) || (creature_ptr->pclass == CLASS_RED_MAGE))
3821 msg_print(_("呪文を学習する必要はない!", "You don't have to learn spells!"));
3822 else if (creature_ptr->pclass == CLASS_SAMURAI)
3823 do_cmd_gain_hissatsu(creature_ptr);
3824 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3825 import_magic_device(creature_ptr);
3827 do_cmd_study(creature_ptr);
3834 if ( (creature_ptr->pclass == CLASS_MINDCRAFTER) ||
3835 (creature_ptr->pclass == CLASS_BERSERKER) ||
3836 (creature_ptr->pclass == CLASS_NINJA) ||
3837 (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3838 ) do_cmd_mind_browse(creature_ptr);
3839 else if (creature_ptr->pclass == CLASS_SMITH)
3840 do_cmd_kaji(creature_ptr, TRUE);
3841 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3842 do_cmd_magic_eater(creature_ptr, TRUE, FALSE);
3843 else if (creature_ptr->pclass == CLASS_SNIPER)
3844 do_cmd_snipe_browse(creature_ptr);
3845 else do_cmd_browse(creature_ptr);
3853 if (!creature_ptr->wild_mode)
3855 if ((creature_ptr->pclass == CLASS_WARRIOR) || (creature_ptr->pclass == CLASS_ARCHER) || (creature_ptr->pclass == CLASS_CAVALRY))
3857 msg_print(_("呪文を唱えられない!", "You cannot cast spells!"));
3859 else if (floor_ptr->dun_level && (d_info[creature_ptr->dungeon_idx].flags1 & DF1_NO_MAGIC) && (creature_ptr->pclass != CLASS_BERSERKER) && (creature_ptr->pclass != CLASS_SMITH))
3861 msg_print(_("ダンジョンが魔法を吸収した!", "The dungeon absorbs all attempted magic!"));
3864 else if (creature_ptr->anti_magic && (creature_ptr->pclass != CLASS_BERSERKER) && (creature_ptr->pclass != CLASS_SMITH))
3866 concptr which_power = _("魔法", "magic");
3867 if (creature_ptr->pclass == CLASS_MINDCRAFTER)
3868 which_power = _("超能力", "psionic powers");
3869 else if (creature_ptr->pclass == CLASS_IMITATOR)
3870 which_power = _("ものまね", "imitation");
3871 else if (creature_ptr->pclass == CLASS_SAMURAI)
3872 which_power = _("必殺剣", "hissatsu");
3873 else if (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3874 which_power = _("鏡魔法", "mirror magic");
3875 else if (creature_ptr->pclass == CLASS_NINJA)
3876 which_power = _("忍術", "ninjutsu");
3877 else if (mp_ptr->spell_book == TV_LIFE_BOOK)
3878 which_power = _("祈り", "prayer");
3880 msg_format(_("反魔法バリアが%sを邪魔した!", "An anti-magic shell disrupts your %s!"), which_power);
3881 free_turn(creature_ptr);
3883 else if (creature_ptr->shero && (creature_ptr->pclass != CLASS_BERSERKER))
3885 msg_format(_("狂戦士化していて頭が回らない!", "You cannot think directly!"));
3886 free_turn(creature_ptr);
3890 if ((creature_ptr->pclass == CLASS_MINDCRAFTER) ||
3891 (creature_ptr->pclass == CLASS_BERSERKER) ||
3892 (creature_ptr->pclass == CLASS_NINJA) ||
3893 (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3895 do_cmd_mind(creature_ptr);
3896 else if (creature_ptr->pclass == CLASS_IMITATOR)
3897 do_cmd_mane(creature_ptr, FALSE);
3898 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3899 do_cmd_magic_eater(creature_ptr, FALSE, FALSE);
3900 else if (creature_ptr->pclass == CLASS_SAMURAI)
3901 do_cmd_hissatsu(creature_ptr);
3902 else if (creature_ptr->pclass == CLASS_BLUE_MAGE)
3903 do_cmd_cast_learned(creature_ptr);
3904 else if (creature_ptr->pclass == CLASS_SMITH)
3905 do_cmd_kaji(creature_ptr, FALSE);
3906 else if (creature_ptr->pclass == CLASS_SNIPER)
3907 do_cmd_snipe(creature_ptr);
3909 do_cmd_cast(creature_ptr);
3915 /* Issue a pet command */
3918 do_cmd_pet(creature_ptr);
3922 /*** Use various objects ***/
3924 /* Inscribe an object */
3927 do_cmd_inscribe(creature_ptr);
3931 /* Uninscribe an object */
3934 do_cmd_uninscribe(creature_ptr);
3938 /* Activate an artifact */
3941 do_cmd_activate(creature_ptr);
3948 do_cmd_eat_food(creature_ptr);
3952 /* Fuel your lantern/torch */
3955 do_cmd_refill(creature_ptr);
3962 do_cmd_fire(creature_ptr, SP_NONE);
3969 do_cmd_throw(creature_ptr, 1, FALSE, -1);
3976 do_cmd_aim_wand(creature_ptr);
3983 if (use_command && rogue_like_commands)
3985 do_cmd_use(creature_ptr);
3989 do_cmd_zap_rod(creature_ptr);
3994 /* Quaff a potion */
3997 do_cmd_quaff_potion(creature_ptr);
4004 do_cmd_read_scroll(creature_ptr);
4011 if (use_command && !rogue_like_commands)
4012 do_cmd_use(creature_ptr);
4014 do_cmd_use_staff(creature_ptr);
4018 /* Use racial power */
4021 do_cmd_racial_power(creature_ptr);
4026 /*** Looking at Things (nearby or on map) ***/
4028 /* Full dungeon map */
4031 do_cmd_view_map(creature_ptr);
4035 /* Locate player on map */
4038 do_cmd_locate(creature_ptr);
4045 do_cmd_look(creature_ptr);
4049 /* Target monster or location */
4052 do_cmd_target(creature_ptr);
4058 /*** Help and Such ***/
4063 do_cmd_help(creature_ptr);
4067 /* Identify symbol */
4070 do_cmd_query_symbol(creature_ptr);
4074 /* Character description */
4077 do_cmd_player_status(creature_ptr);
4082 /*** System Commands ***/
4084 /* Hack -- User interface */
4091 /* Single line from a pref file */
4094 do_cmd_pref(creature_ptr);
4100 do_cmd_reload_autopick(creature_ptr);
4106 do_cmd_edit_autopick(creature_ptr);
4110 /* Interact with macros */
4113 do_cmd_macros(creature_ptr);
4117 /* Interact with visuals */
4120 do_cmd_visuals(creature_ptr);
4121 do_cmd_redraw(creature_ptr);
4125 /* Interact with colors */
4128 do_cmd_colors(creature_ptr);
4129 do_cmd_redraw(creature_ptr);
4133 /* Interact with options */
4137 (void)combine_and_reorder_home(STORE_HOME);
4138 do_cmd_redraw(creature_ptr);
4142 /*** Misc Commands ***/
4158 /* Repeat level feeling */
4161 do_cmd_feeling(creature_ptr);
4165 /* Show previous message */
4168 do_cmd_message_one();
4172 /* Show previous messages */
4175 do_cmd_messages(old_now_message);
4179 /* Show quest status -KMW- */
4182 do_cmd_checkquest(creature_ptr);
4186 /* Redraw the screen */
4189 now_message = old_now_message;
4190 do_cmd_redraw(creature_ptr);
4194 #ifndef VERIFY_SAVEFILE
4196 /* Hack -- Save and don't quit */
4199 do_cmd_save_game(creature_ptr, FALSE);
4203 #endif /* VERIFY_SAVEFILE */
4207 do_cmd_time(creature_ptr);
4213 case SPECIAL_KEY_QUIT:
4215 do_cmd_save_and_exit(creature_ptr);
4219 /* Quit (commit suicide) */
4222 do_cmd_suicide(creature_ptr);
4228 do_cmd_diary(creature_ptr);
4232 /* Check artifacts, uniques, objects */
4235 do_cmd_knowledge(creature_ptr);
4239 /* Load "screen dump" */
4242 do_cmd_load_screen();
4246 /* Save "screen dump" */
4249 do_cmd_save_screen(creature_ptr);
4253 /* Record/stop "Movie" */
4256 prepare_movie_hooks();
4260 /* Make random artifact list */
4263 spoil_random_artifact(creature_ptr, "randifact.txt");
4270 if (!creature_ptr->wild_mode) do_cmd_travel(creature_ptr);
4271 if (creature_ptr->special_defense & KATA_MUSOU)
4273 set_action(creature_ptr, ACTION_NONE);
4279 /* Hack -- Unknown command */
4282 if (flush_failure) flush();
4286 sound(SOUND_ILLEGAL);
4287 if (!get_rnd_line(_("error_j.txt", "error.txt"), 0, error_m))
4292 prt(_(" '?' でヘルプが表示されます。", "Type '?' for help."), 0, 0);
4298 if (!creature_ptr->energy_use && !now_message)
4299 now_message = old_now_message;
4303 * @brief アイテムの所持種類数が超えた場合にアイテムを床に落とす処理 / Hack -- Pack Overflow
4306 static void pack_overflow(player_type *owner_ptr)
4308 if (owner_ptr->inventory_list[INVEN_PACK].k_idx == 0) return;
4310 GAME_TEXT o_name[MAX_NLEN];
4313 /* Is auto-destroy done? */
4314 update_creature(owner_ptr);
4315 if (!owner_ptr->inventory_list[INVEN_PACK].k_idx) return;
4317 /* Access the slot to be dropped */
4318 o_ptr = &owner_ptr->inventory_list[INVEN_PACK];
4320 disturb(owner_ptr, FALSE, TRUE);
4323 msg_print(_("ザックからアイテムがあふれた!", "Your pack overflows!"));
4324 object_desc(o_name, o_ptr, 0);
4326 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(INVEN_PACK));
4328 /* Drop it (carefully) near the player */
4329 (void)drop_near(owner_ptr, o_ptr, 0, owner_ptr->y, owner_ptr->x);
4331 vary_item(owner_ptr, INVEN_PACK, -255);
4332 handle_stuff(owner_ptr);
4336 * @brief プレイヤーの行動エネルギーが充填される(=プレイヤーのターンが回る)毎に行われる処理 / process the effects per 100 energy at player speed.
4339 static void process_upkeep_with_speed(player_type *creature_ptr)
4341 /* Give the player some energy */
4342 if (!load && creature_ptr->enchant_energy_need > 0 && !creature_ptr->leaving)
4344 creature_ptr->enchant_energy_need -= SPEED_TO_ENERGY(creature_ptr->pspeed);
4348 if (creature_ptr->enchant_energy_need > 0) return;
4350 while (creature_ptr->enchant_energy_need <= 0)
4352 /* Handle the player song */
4353 if (!load) check_music(creature_ptr);
4355 /* Hex - Handle the hex spells */
4356 if (!load) check_hex(creature_ptr);
4357 if (!load) revenge_spell(creature_ptr);
4359 /* There is some randomness of needed energy */
4360 creature_ptr->enchant_energy_need += ENERGY_NEED();
4364 static void process_fishing(player_type *creature_ptr)
4366 Term_xtra(TERM_XTRA_DELAY, 10);
4370 bool success = FALSE;
4371 get_mon_num_prep(monster_is_fishing_target, NULL);
4372 r_idx = get_mon_num(creature_ptr->current_floor_ptr->dun_level ? creature_ptr->current_floor_ptr->dun_level : wilderness[creature_ptr->wilderness_y][creature_ptr->wilderness_x].level);
4374 if (r_idx && one_in_(2))
4377 y = creature_ptr->y + ddy[creature_ptr->fishing_dir];
4378 x = creature_ptr->x + ddx[creature_ptr->fishing_dir];
4379 if (place_monster_aux(0, y, x, r_idx, PM_NO_KAGE))
4381 GAME_TEXT m_name[MAX_NLEN];
4382 monster_desc(m_name, &creature_ptr->current_floor_ptr->m_list[creature_ptr->current_floor_ptr->grid_array[y][x].m_idx], 0);
4383 msg_format(_("%sが釣れた!", "You have a good catch!"), m_name);
4389 msg_print(_("餌だけ食われてしまった!くっそ~!", "Damn! The fish stole your bait!"));
4391 disturb(creature_ptr, FALSE, TRUE);
4396 * @brief プレイヤーの行動処理 / Process the player
4399 * Notice the annoying code to handle "pack overflow", which\n
4400 * must come first just in case somebody manages to corrupt\n
4401 * the savefiles by clever use of menu commands or something.\n
4403 static void process_player(player_type *creature_ptr)
4407 /*** Apply energy ***/
4409 if (creature_ptr->hack_mutation)
4411 msg_print(_("何か変わった気がする!", "You feel different!"));
4413 (void)gain_mutation(creature_ptr, 0);
4414 creature_ptr->hack_mutation = FALSE;
4417 if (creature_ptr->invoking_midnight_curse)
4420 activate_ty_curse(creature_ptr, FALSE, &count);
4421 creature_ptr->invoking_midnight_curse = FALSE;
4424 if (creature_ptr->phase_out)
4426 for(m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
4428 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
4430 if (!monster_is_valid(m_ptr)) continue;
4432 m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
4433 update_monster(creature_ptr, m_idx, FALSE);
4436 print_time(creature_ptr);
4439 /* Give the player some energy */
4440 else if (!(load && creature_ptr->energy_need <= 0))
4442 creature_ptr->energy_need -= SPEED_TO_ENERGY(creature_ptr->pspeed);
4446 if (creature_ptr->energy_need > 0) return;
4447 if (!command_rep) print_time(creature_ptr);
4449 /*** Check for interupts ***/
4451 /* Complete resting */
4452 if (creature_ptr->resting < 0)
4455 if (creature_ptr->resting == COMMAND_ARG_REST_FULL_HEALING)
4458 if ((creature_ptr->chp == creature_ptr->mhp) &&
4459 (creature_ptr->csp >= creature_ptr->msp))
4461 set_action(creature_ptr, ACTION_NONE);
4465 /* Complete resting */
4466 else if (creature_ptr->resting == COMMAND_ARG_REST_UNTIL_DONE)
4469 if ((creature_ptr->chp == creature_ptr->mhp) &&
4470 (creature_ptr->csp >= creature_ptr->msp) &&
4471 !creature_ptr->blind && !creature_ptr->confused &&
4472 !creature_ptr->poisoned && !creature_ptr->afraid &&
4473 !creature_ptr->stun && !creature_ptr->cut &&
4474 !creature_ptr->slow && !creature_ptr->paralyzed &&
4475 !creature_ptr->image && !creature_ptr->word_recall &&
4476 !creature_ptr->alter_reality)
4478 set_action(creature_ptr, ACTION_NONE);
4483 if (creature_ptr->action == ACTION_FISH) process_fishing(creature_ptr);
4485 /* Handle "abort" */
4488 /* Check for "player abort" (semi-efficiently for resting) */
4489 if (creature_ptr->running || travel.run || command_rep || (creature_ptr->action == ACTION_REST) || (creature_ptr->action == ACTION_FISH))
4494 /* Check for a key */
4497 flush(); /* Flush input */
4499 disturb(creature_ptr, FALSE, TRUE);
4501 /* Hack -- Show a Message */
4502 msg_print(_("中断しました。", "Canceled."));
4507 if (creature_ptr->riding && !creature_ptr->confused && !creature_ptr->blind)
4509 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
4510 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4512 if (MON_CSLEEP(m_ptr))
4514 GAME_TEXT m_name[MAX_NLEN];
4517 (void)set_monster_csleep(creature_ptr->riding, 0);
4518 monster_desc(m_name, m_ptr, 0);
4519 msg_format(_("%^sを起こした。", "You have woken %s up."), m_name);
4522 if (MON_STUNNED(m_ptr))
4524 /* Hack -- Recover from stun */
4525 if (set_monster_stunned(creature_ptr->riding,
4526 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_STUNNED(m_ptr) - 1)))
4528 GAME_TEXT m_name[MAX_NLEN];
4529 monster_desc(m_name, m_ptr, 0);
4530 msg_format(_("%^sを朦朧状態から立ち直らせた。", "%^s is no longer stunned."), m_name);
4534 if (MON_CONFUSED(m_ptr))
4536 /* Hack -- Recover from confusion */
4537 if (set_monster_confused(creature_ptr->riding,
4538 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_CONFUSED(m_ptr) - 1)))
4540 GAME_TEXT m_name[MAX_NLEN];
4541 monster_desc(m_name, m_ptr, 0);
4542 msg_format(_("%^sを混乱状態から立ち直らせた。", "%^s is no longer confused."), m_name);
4546 if (MON_MONFEAR(m_ptr))
4548 /* Hack -- Recover from fear */
4549 if(set_monster_monfear(creature_ptr->riding,
4550 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_MONFEAR(m_ptr) - 1)))
4552 GAME_TEXT m_name[MAX_NLEN];
4553 monster_desc(m_name, m_ptr, 0);
4554 msg_format(_("%^sを恐怖から立ち直らせた。", "%^s is no longer afraid."), m_name);
4558 handle_stuff(creature_ptr);
4564 if (creature_ptr->lightspeed)
4566 (void)set_lightspeed(creature_ptr, creature_ptr->lightspeed - 1, TRUE);
4568 if ((creature_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
4570 if(P_PTR_KI < 40) P_PTR_KI = 0;
4571 else P_PTR_KI -= 40;
4572 creature_ptr->update |= (PU_BONUS);
4574 if (creature_ptr->action == ACTION_LEARN)
4577 u32b cost_frac = (creature_ptr->msp + 30L) * 256L;
4579 /* Convert the unit (1/2^16) to (1/2^32) */
4580 s64b_LSHIFT(cost, cost_frac, 16);
4582 if (s64b_cmp(creature_ptr->csp, creature_ptr->csp_frac, cost, cost_frac) < 0)
4585 creature_ptr->csp = 0;
4586 creature_ptr->csp_frac = 0;
4587 set_action(creature_ptr, ACTION_NONE);
4592 s64b_sub(&(creature_ptr->csp), &(creature_ptr->csp_frac), cost, cost_frac);
4594 creature_ptr->redraw |= PR_MANA;
4597 if (creature_ptr->special_defense & KATA_MASK)
4599 if (creature_ptr->special_defense & KATA_MUSOU)
4601 if (creature_ptr->csp < 3)
4603 set_action(creature_ptr, ACTION_NONE);
4607 creature_ptr->csp -= 2;
4608 creature_ptr->redraw |= (PR_MANA);
4613 /*** Handle actual user input ***/
4615 /* Repeat until out of energy */
4616 while (creature_ptr->energy_need <= 0)
4618 creature_ptr->window |= PW_PLAYER;
4619 creature_ptr->sutemi = FALSE;
4620 creature_ptr->counter = FALSE;
4621 creature_ptr->now_damaged = FALSE;
4623 handle_stuff(creature_ptr);
4625 /* Place the cursor on the player */
4626 move_cursor_relative(creature_ptr->y, creature_ptr->x);
4628 /* Refresh (optional) */
4629 if (fresh_before) Term_fresh();
4631 /* Hack -- Pack Overflow */
4632 pack_overflow(creature_ptr);
4634 /* Hack -- cancel "lurking browse mode" */
4635 if (!command_new) command_see = FALSE;
4637 /* Assume free turn */
4638 free_turn(creature_ptr);
4640 if (creature_ptr->phase_out)
4642 /* Place the cursor on the player */
4643 move_cursor_relative(creature_ptr->y, creature_ptr->x);
4645 command_cmd = SPECIAL_KEY_BUILDING;
4647 /* Process the command */
4648 process_command(creature_ptr);
4651 /* Paralyzed or Knocked Out */
4652 else if (creature_ptr->paralyzed || (creature_ptr->stun >= 100))
4654 take_turn(creature_ptr, 100);
4658 else if (creature_ptr->action == ACTION_REST)
4661 if (creature_ptr->resting > 0)
4663 /* Reduce rest count */
4664 creature_ptr->resting--;
4666 if (!creature_ptr->resting) set_action(creature_ptr, ACTION_NONE);
4667 creature_ptr->redraw |= (PR_STATE);
4670 take_turn(creature_ptr, 100);
4674 else if (creature_ptr->action == ACTION_FISH)
4676 take_turn(creature_ptr, 100);
4680 else if (creature_ptr->running)
4683 run_step(creature_ptr, 0);
4688 else if (travel.run)
4691 travel_step(creature_ptr);
4695 /* Repeated command */
4696 else if (command_rep)
4698 /* Count this execution */
4701 creature_ptr->redraw |= (PR_STATE);
4702 handle_stuff(creature_ptr);
4704 /* Hack -- Assume messages were seen */
4707 /* Clear the top line */
4710 /* Process the command */
4711 process_command(creature_ptr);
4714 /* Normal command */
4717 /* Place the cursor on the player */
4718 move_cursor_relative(creature_ptr->y, creature_ptr->x);
4721 /* Get a command (normal) */
4722 request_command(FALSE);
4725 /* Process the command */
4726 process_command(creature_ptr);
4729 /* Hack -- Pack Overflow */
4730 pack_overflow(creature_ptr);
4735 if (creature_ptr->energy_use)
4737 /* Use some energy */
4738 if (creature_ptr->timewalk || creature_ptr->energy_use > 400)
4740 /* The Randomness is irrelevant */
4741 creature_ptr->energy_need += creature_ptr->energy_use * TURNS_PER_TICK / 10;
4745 /* There is some randomness of needed energy */
4746 creature_ptr->energy_need += (s16b)((s32b)creature_ptr->energy_use * ENERGY_NEED() / 100L);
4749 /* Hack -- constant hallucination */
4750 if (creature_ptr->image) creature_ptr->redraw |= (PR_MAP);
4752 /* Shimmer multi-hued monsters */
4753 for (m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
4755 monster_type *m_ptr;
4756 monster_race *r_ptr;
4758 m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
4759 if (!monster_is_valid(m_ptr)) continue;
4761 /* Skip unseen monsters */
4762 if (!m_ptr->ml) continue;
4764 /* Access the monster race */
4765 r_ptr = &r_info[m_ptr->ap_r_idx];
4767 /* Skip non-multi-hued monsters */
4768 if (!(r_ptr->flags1 & (RF1_ATTR_MULTI | RF1_SHAPECHANGER)))
4771 /* Redraw regardless */
4772 lite_spot(m_ptr->fy, m_ptr->fx);
4776 /* Handle monster detection */
4777 if (repair_monsters)
4779 /* Reset the flag */
4780 repair_monsters = FALSE;
4782 /* Rotate detection flags */
4783 for (m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
4785 monster_type *m_ptr;
4786 m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
4787 if (!monster_is_valid(m_ptr)) continue;
4789 /* Nice monsters get mean */
4790 if (m_ptr->mflag & MFLAG_NICE)
4792 /* Nice monsters get mean */
4793 m_ptr->mflag &= ~(MFLAG_NICE);
4796 /* Handle memorized monsters */
4797 if (m_ptr->mflag2 & MFLAG2_MARK)
4799 /* Maintain detection */
4800 if (m_ptr->mflag2 & MFLAG2_SHOW)
4803 m_ptr->mflag2 &= ~(MFLAG2_SHOW);
4805 /* Still need repairs */
4806 repair_monsters = TRUE;
4809 /* Remove detection */
4813 m_ptr->mflag2 &= ~(MFLAG2_MARK);
4815 /* Assume invisible */
4817 update_monster(creature_ptr, m_idx, FALSE);
4819 if (creature_ptr->health_who == m_idx) creature_ptr->redraw |= (PR_HEALTH);
4820 if (creature_ptr->riding == m_idx) creature_ptr->redraw |= (PR_UHEALTH);
4822 /* Redraw regardless */
4823 lite_spot(m_ptr->fy, m_ptr->fx);
4828 if (creature_ptr->pclass == CLASS_IMITATOR)
4831 if (creature_ptr->mane_num > (creature_ptr->lev > 44 ? 3 : creature_ptr->lev > 29 ? 2 : 1))
4833 creature_ptr->mane_num--;
4834 for (j = 0; j < creature_ptr->mane_num; j++)
4836 creature_ptr->mane_spell[j] = creature_ptr->mane_spell[j + 1];
4837 creature_ptr->mane_dam[j] = creature_ptr->mane_dam[j + 1];
4840 creature_ptr->new_mane = FALSE;
4841 creature_ptr->redraw |= (PR_IMITATION);
4843 if (creature_ptr->action == ACTION_LEARN)
4845 creature_ptr->new_mane = FALSE;
4846 creature_ptr->redraw |= (PR_STATE);
4849 if (creature_ptr->timewalk && (creature_ptr->energy_need > - 1000))
4852 creature_ptr->redraw |= (PR_MAP);
4853 creature_ptr->update |= (PU_MONSTERS);
4854 creature_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
4856 msg_print(_("「時は動きだす…」", "You feel time flowing around you once more."));
4858 creature_ptr->timewalk = FALSE;
4859 creature_ptr->energy_need = ENERGY_NEED();
4861 handle_stuff(creature_ptr);
4865 /* Hack -- notice death */
4866 if (!creature_ptr->playing || creature_ptr->is_dead)
4868 creature_ptr->timewalk = FALSE;
4873 if (creature_ptr->energy_use && creature_ptr->reset_concent) reset_concentration(creature_ptr, TRUE);
4875 /* Handle "leaving" */
4876 if (creature_ptr->leaving) break;
4879 /* Update scent trail */
4880 update_smell(creature_ptr->current_floor_ptr, creature_ptr);
4884 * @brief 現在プレイヤーがいるダンジョンの全体処理 / Interact with the current dungeon level.
4888 * この関数から現在の階層を出る、プレイヤーがキャラが死ぬ、
4889 * ゲームを終了するかのいずれかまでループする。
4892 * This function will not exit until the level is completed,\n
4893 * the user dies, or the game is terminated.\n
4896 static void dungeon(player_type *player_ptr, bool load_game)
4900 /* Set the base level */
4901 player_ptr->current_floor_ptr->base_level = player_ptr->current_floor_ptr->dun_level;
4903 /* Reset various flags */
4904 current_world_ptr->is_loading_now = FALSE;
4907 player_ptr->leaving = FALSE;
4909 /* Reset the "command" vars */
4912 #if 0 /* Don't reset here --- It's used for Arena */
4921 /* Cancel the target */
4923 player_ptr->pet_t_m_idx = 0;
4924 player_ptr->riding_t_m_idx = 0;
4925 player_ptr->ambush_flag = FALSE;
4927 health_track(player_ptr, 0);
4929 /* Check visual effects */
4930 repair_monsters = TRUE;
4931 repair_objects = TRUE;
4934 disturb(player_ptr, TRUE, TRUE);
4936 /* Get index of current quest (if any) */
4937 quest_num = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
4939 /* Inside a quest? */
4942 /* Mark the quest monster */
4943 r_info[quest[quest_num].r_idx].flags1 |= RF1_QUESTOR;
4946 /* Track maximum player level */
4947 if (player_ptr->max_plv < player_ptr->lev)
4949 player_ptr->max_plv = player_ptr->lev;
4953 /* Track maximum dungeon level (if not in quest -KMW-) */
4954 if ((max_dlv[player_ptr->dungeon_idx] < player_ptr->current_floor_ptr->dun_level) && !player_ptr->current_floor_ptr->inside_quest)
4956 max_dlv[player_ptr->dungeon_idx] = player_ptr->current_floor_ptr->dun_level;
4957 if (record_maxdepth) exe_write_diary(player_ptr, NIKKI_MAXDEAPTH, player_ptr->current_floor_ptr->dun_level, NULL);
4960 (void)calculate_upkeep(player_ptr);
4962 /* Validate the panel */
4963 panel_bounds_center();
4965 /* Verify the panel */
4971 /* Enter "xtra" mode */
4972 current_world_ptr->character_xtra = TRUE;
4974 player_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER | PW_MONSTER | PW_OVERHEAD | PW_DUNGEON);
4975 player_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_EQUIPPY | PR_MAP);
4976 player_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS | PU_VIEW | PU_LITE | PU_MON_LITE | PU_TORCH | PU_MONSTERS | PU_DISTANCE | PU_FLOW);
4978 handle_stuff(player_ptr);
4980 /* Leave "xtra" mode */
4981 current_world_ptr->character_xtra = FALSE;
4983 player_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
4984 player_ptr->update |= (PU_COMBINE | PU_REORDER);
4985 handle_stuff(player_ptr);
4988 if (quest_num && (is_fixed_quest_idx(quest_num) &&
4989 !((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT) ||
4990 !(quest[quest_num].flags & QUEST_FLAG_PRESET)))) do_cmd_feeling(player_ptr);
4992 if (player_ptr->phase_out)
4996 player_ptr->energy_need = 0;
4997 update_gambling_monsters(player_ptr);
5001 msg_print(_("試合開始!", "Ready..Fight!"));
5006 if ((player_ptr->pclass == CLASS_BARD) && (SINGING_SONG_EFFECT(player_ptr) > MUSIC_DETECT))
5007 SINGING_SONG_EFFECT(player_ptr) = MUSIC_DETECT;
5009 /* Hack -- notice death or departure */
5010 if (!player_ptr->playing || player_ptr->is_dead) return;
5012 /* Print quest message if appropriate */
5013 if (!player_ptr->current_floor_ptr->inside_quest && (player_ptr->dungeon_idx == DUNGEON_ANGBAND))
5015 quest_discovery(random_quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level));
5016 player_ptr->current_floor_ptr->inside_quest = random_quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
5018 if ((player_ptr->current_floor_ptr->dun_level == d_info[player_ptr->dungeon_idx].maxdepth) && d_info[player_ptr->dungeon_idx].final_guardian)
5020 if (r_info[d_info[player_ptr->dungeon_idx].final_guardian].max_num)
5022 msg_format("この階には%sの主である%sが棲んでいる。",
5023 d_name+d_info[player_ptr->dungeon_idx].name,
5024 r_name+r_info[d_info[player_ptr->dungeon_idx].final_guardian].name);
5026 msg_format("%^s lives in this level as the keeper of %s.",
5027 r_name+r_info[d_info[player_ptr->dungeon_idx].final_guardian].name,
5028 d_name+d_info[player_ptr->dungeon_idx].name);
5032 if (!load_game && (player_ptr->special_defense & NINJA_S_STEALTH)) set_superstealth(player_ptr, FALSE);
5034 /*** Process this dungeon level ***/
5036 /* Reset the monster generation level */
5037 player_ptr->current_floor_ptr->monster_level = player_ptr->current_floor_ptr->base_level;
5039 /* Reset the object generation level */
5040 player_ptr->current_floor_ptr->object_level = player_ptr->current_floor_ptr->base_level;
5042 current_world_ptr->is_loading_now = TRUE;
5044 if (player_ptr->energy_need > 0 && !player_ptr->phase_out &&
5045 (player_ptr->current_floor_ptr->dun_level || player_ptr->leaving_dungeon || player_ptr->current_floor_ptr->inside_arena))
5046 player_ptr->energy_need = 0;
5048 /* Not leaving dungeon */
5049 player_ptr->leaving_dungeon = FALSE;
5051 /* Initialize monster process */
5057 /* Hack -- Compact the monster list occasionally */
5058 if ((player_ptr->current_floor_ptr->m_cnt + 32 > current_world_ptr->max_m_idx) && !player_ptr->phase_out) compact_monsters(64);
5060 /* Hack -- Compress the monster list occasionally */
5061 if ((player_ptr->current_floor_ptr->m_cnt + 32 < player_ptr->current_floor_ptr->m_max) && !player_ptr->phase_out) compact_monsters(0);
5064 /* Hack -- Compact the object list occasionally */
5065 if (player_ptr->current_floor_ptr->o_cnt + 32 > current_world_ptr->max_o_idx) compact_objects(player_ptr, 64);
5067 /* Hack -- Compress the object list occasionally */
5068 if (player_ptr->current_floor_ptr->o_cnt + 32 < player_ptr->current_floor_ptr->o_max) compact_objects(player_ptr, 0);
5070 /* Process the player */
5071 process_player(player_ptr);
5072 process_upkeep_with_speed(player_ptr);
5074 handle_stuff(player_ptr);
5076 /* Hack -- Hilite the player */
5077 move_cursor_relative(player_ptr->y, player_ptr->x);
5079 /* Optional fresh */
5080 if (fresh_after) Term_fresh();
5082 /* Hack -- Notice death or departure */
5083 if (!player_ptr->playing || player_ptr->is_dead) break;
5085 /* Process all of the monsters */
5086 process_monsters(player_ptr);
5088 handle_stuff(player_ptr);
5090 /* Hack -- Hilite the player */
5091 move_cursor_relative(player_ptr->y, player_ptr->x);
5093 /* Optional fresh */
5094 if (fresh_after) Term_fresh();
5096 /* Hack -- Notice death or departure */
5097 if (!player_ptr->playing || player_ptr->is_dead) break;
5099 /* Process the world */
5100 process_world(player_ptr);
5102 handle_stuff(player_ptr);
5104 /* Hack -- Hilite the player */
5105 move_cursor_relative(player_ptr->y, player_ptr->x);
5107 /* Optional fresh */
5108 if (fresh_after) Term_fresh();
5110 /* Hack -- Notice death or departure */
5111 if (!player_ptr->playing || player_ptr->is_dead) break;
5113 /* Count game turns */
5114 current_world_ptr->game_turn++;
5116 if (current_world_ptr->dungeon_turn < current_world_ptr->dungeon_turn_limit)
5118 if (!player_ptr->wild_mode || wild_regen) current_world_ptr->dungeon_turn++;
5119 else if (player_ptr->wild_mode && !(current_world_ptr->game_turn % ((MAX_HGT + MAX_WID) / 2))) current_world_ptr->dungeon_turn++;
5122 prevent_turn_overflow();
5124 /* Handle "leaving" */
5125 if (player_ptr->leaving) break;
5127 if (wild_regen) wild_regen--;
5130 /* Inside a quest and non-unique questor? */
5131 if (quest_num && !(r_info[quest[quest_num].r_idx].flags1 & RF1_UNIQUE))
5133 /* Un-mark the quest monster */
5134 r_info[quest[quest_num].r_idx].flags1 &= ~RF1_QUESTOR;
5137 /* Not save-and-quit and not dead? */
5138 if (player_ptr->playing && !player_ptr->is_dead)
5141 * Maintain Unique monsters and artifact, save current
5142 * floor, then prepare next floor
5144 leave_floor(player_ptr);
5146 /* Forget the flag */
5147 reinit_wilderness = FALSE;
5150 /* Write about current level on the play record once per level */
5156 * @brief 全ユーザプロファイルをロードする / Load some "user pref files"
5157 * @paaram player_ptr プレーヤーへの参照ポインタ
5160 * Modified by Arcum Dagsson to support
5161 * separate macro files for different realms.
5163 static void load_all_pref_files(player_type *player_ptr)
5167 /* Access the "user" pref file */
5168 sprintf(buf, "user.prf");
5170 /* Process that file */
5171 process_pref_file(player_ptr, buf);
5173 /* Access the "user" system pref file */
5174 sprintf(buf, "user-%s.prf", ANGBAND_SYS);
5176 /* Process that file */
5177 process_pref_file(player_ptr, buf);
5179 /* Access the "race" pref file */
5180 sprintf(buf, "%s.prf", rp_ptr->title);
5182 /* Process that file */
5183 process_pref_file(player_ptr, buf);
5185 /* Access the "class" pref file */
5186 sprintf(buf, "%s.prf", cp_ptr->title);
5188 /* Process that file */
5189 process_pref_file(player_ptr, buf);
5191 /* Access the "character" pref file */
5192 sprintf(buf, "%s.prf", player_ptr->base_name);
5194 /* Process that file */
5195 process_pref_file(player_ptr, buf);
5197 /* Access the "realm 1" pref file */
5198 if (player_ptr->realm1 != REALM_NONE)
5200 sprintf(buf, "%s.prf", realm_names[player_ptr->realm1]);
5202 /* Process that file */
5203 process_pref_file(player_ptr, buf);
5206 /* Access the "realm 2" pref file */
5207 if (player_ptr->realm2 != REALM_NONE)
5209 sprintf(buf, "%s.prf", realm_names[player_ptr->realm2]);
5211 /* Process that file */
5212 process_pref_file(player_ptr, buf);
5216 /* Load an autopick preference file */
5217 autopick_load_pref(player_ptr, FALSE);
5222 * @brief 1ゲームプレイの主要ルーチン / Actually play a game
5225 * If the "new_game" parameter is true, then, after loading the
5226 * savefile, we will commit suicide, if necessary, to allow the
5227 * player to start a new game.
5229 void play_game(player_type *player_ptr, bool new_game)
5232 bool load_game = TRUE;
5233 bool init_random_seed = FALSE;
5243 else if (chuukei_server)
5245 prepare_chuukei_hooks();
5256 player_ptr->hack_mutation = FALSE;
5258 /* Hack -- Character is "icky" */
5259 current_world_ptr->character_icky = TRUE;
5261 /* Make sure main term is active */
5262 Term_activate(angband_term[0]);
5264 /* Initialise the resize hooks */
5265 angband_term[0]->resize_hook = resize_map;
5267 for (i = 1; i < 8; i++)
5269 /* Does the term exist? */
5270 if (angband_term[i])
5272 /* Add the redraw on resize hook */
5273 angband_term[i]->resize_hook = redraw_window;
5277 /* Hack -- turn off the cursor */
5278 (void)Term_set_cursor(0);
5281 /* Attempt to load */
5282 if (!load_player(player_ptr))
5284 quit(_("セーブファイルが壊れています", "broken savefile"));
5287 /* Extract the options */
5288 extract_option_vars();
5290 /* Report waited score */
5291 if (player_ptr->wait_report_score)
5296 if (!get_check_strict(_("待機していたスコア登録を今行ないますか?", "Do you register score now? "), CHECK_NO_HISTORY))
5299 player_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
5300 update_creature(player_ptr);
5302 player_ptr->is_dead = TRUE;
5304 current_world_ptr->start_time = (u32b)time(NULL);
5306 /* No suspending now */
5307 signals_ignore_tstp();
5309 /* Hack -- Character is now "icky" */
5310 current_world_ptr->character_icky = TRUE;
5311 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
5313 /* Open the high score file, for reading/writing */
5314 highscore_fd = fd_open(buf, O_RDWR);
5316 /* 町名消失バグ対策(#38205)のためここで世界マップ情報を読み出す */
5317 process_dungeon_file(player_ptr, "w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
5319 /* Handle score, show Top scores */
5320 success = send_world_score(player_ptr, TRUE);
5322 if (!success && !get_check_strict(_("スコア登録を諦めますか?", "Do you give up score registration? "), CHECK_NO_HISTORY))
5324 prt(_("引き続き待機します。", "standing by for future registration..."), 0, 0);
5329 player_ptr->wait_report_score = FALSE;
5330 top_twenty(player_ptr);
5331 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
5333 /* Shut the high score file */
5334 (void)fd_close(highscore_fd);
5336 /* Forget the high score fd */
5339 /* Allow suspending now */
5340 signals_handle_tstp();
5345 current_world_ptr->creating_savefile = new_game;
5347 /* Nothing loaded */
5348 if (!current_world_ptr->character_loaded)
5350 /* Make new player */
5353 /* The dungeon is not ready */
5354 current_world_ptr->character_dungeon = FALSE;
5356 /* Prepare to init the RNG */
5357 init_random_seed = TRUE;
5359 /* Initialize the saved floors data */
5360 init_saved_floors(player_ptr, FALSE);
5363 /* Old game is loaded. But new game is requested. */
5366 /* Initialize the saved floors data */
5367 init_saved_floors(player_ptr, TRUE);
5370 /* Process old character */
5373 /* Process the player name */
5374 process_player_name(player_ptr, FALSE);
5378 if (init_random_seed)
5383 /* Roll new character */
5386 /* The dungeon is not ready */
5387 current_world_ptr->character_dungeon = FALSE;
5390 player_ptr->current_floor_ptr->dun_level = 0;
5391 player_ptr->current_floor_ptr->inside_quest = 0;
5392 player_ptr->current_floor_ptr->inside_arena = FALSE;
5393 player_ptr->phase_out = FALSE;
5397 /* Hack -- seed for flavors */
5398 current_world_ptr->seed_flavor = randint0(0x10000000);
5400 /* Hack -- seed for town layout */
5401 current_world_ptr->seed_town = randint0(0x10000000);
5403 /* Roll up a new character */
5404 player_birth(player_ptr);
5406 counts_write(player_ptr, 2,0);
5407 player_ptr->count = 0;
5411 determine_bounty_uniques();
5412 determine_daily_bounty(player_ptr, FALSE);
5414 /* Initialize object array */
5415 wipe_o_list(player_ptr->current_floor_ptr);
5419 write_level = FALSE;
5421 exe_write_diary(player_ptr, NIKKI_GAMESTART, 1,
5423 " ---- Restart Game ----"));
5426 * 1.0.9 以前はセーブ前に player_ptr->riding = -1 としていたので、再設定が必要だった。
5427 * もう不要だが、以前のセーブファイルとの互換のために残しておく。
5429 if (player_ptr->riding == -1)
5431 player_ptr->riding = 0;
5432 for (i = player_ptr->current_floor_ptr->m_max; i > 0; i--)
5434 if (player_bold(player_ptr, player_ptr->current_floor_ptr->m_list[i].fy, player_ptr->current_floor_ptr->m_list[i].fx))
5436 player_ptr->riding = i;
5443 current_world_ptr->creating_savefile = FALSE;
5445 player_ptr->teleport_town = FALSE;
5446 player_ptr->sutemi = FALSE;
5447 current_world_ptr->timewalk_m_idx = 0;
5448 player_ptr->now_damaged = FALSE;
5450 current_world_ptr->start_time = time(NULL) - 1;
5451 record_o_name[0] = '\0';
5453 /* Reset map panel */
5454 panel_row_min = player_ptr->current_floor_ptr->height;
5455 panel_col_min = player_ptr->current_floor_ptr->width;
5457 /* Sexy gal gets bonus to maximum weapon skill of whip */
5458 if (player_ptr->pseikaku == SEIKAKU_SEXY)
5459 s_info[player_ptr->pclass].w_max[TV_HAFTED-TV_WEAPON_BEGIN][SV_WHIP] = WEAPON_EXP_MASTER;
5461 /* Fill the arrays of floors and walls in the good proportions */
5462 set_floor_and_wall(player_ptr->dungeon_idx);
5464 /* Flavor the objects */
5467 /* Flash a message */
5468 prt(_("お待ち下さい...", "Please wait..."), 0, 0);
5470 /* Flush the message */
5474 /* Hack -- Enter wizard mode */
5477 if (enter_wizard_mode())
5479 current_world_ptr->wizard = TRUE;
5481 if (player_ptr->is_dead || !player_ptr->y || !player_ptr->x)
5483 /* Initialize the saved floors data */
5484 init_saved_floors(player_ptr, TRUE);
5487 player_ptr->current_floor_ptr->inside_quest = 0;
5489 /* Avoid crash in update_view() */
5490 player_ptr->y = player_ptr->x = 10;
5493 else if (player_ptr->is_dead)
5495 quit("Already dead.");
5499 /* Initialize the town-buildings if necessary */
5500 if (!player_ptr->current_floor_ptr->dun_level && !player_ptr->current_floor_ptr->inside_quest)
5502 process_dungeon_file(player_ptr, "w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
5503 init_flags = INIT_ONLY_BUILDINGS;
5504 process_dungeon_file(player_ptr, "t_info.txt", 0, 0, MAX_HGT, MAX_WID);
5505 select_floor_music(player_ptr);
5508 /* Generate a dungeon level if needed */
5509 if (!current_world_ptr->character_dungeon)
5511 change_floor(player_ptr);
5515 /* HACK -- Restore from panic-save */
5516 if (player_ptr->panic_save)
5518 /* No player? -- Try to regenerate floor */
5519 if (!player_ptr->y || !player_ptr->x)
5521 msg_print(_("プレイヤーの位置がおかしい。フロアを再生成します。", "What a strange player location. Regenerate the dungeon floor."));
5522 change_floor(player_ptr);
5525 /* Still no player? -- Try to locate random place */
5526 if (!player_ptr->y || !player_ptr->x) player_ptr->y = player_ptr->x = 10;
5528 /* No longer in panic */
5529 player_ptr->panic_save = 0;
5533 /* Character is now "complete" */
5534 current_world_ptr->character_generated = TRUE;
5536 /* Hack -- Character is no longer "icky" */
5537 current_world_ptr->character_icky = FALSE;
5542 sprintf(buf, _("%sに降り立った。", "You are standing in the %s."), map_name(player_ptr));
5543 exe_write_diary(player_ptr, NIKKI_BUNSHOU, 0, buf);
5547 player_ptr->playing = TRUE;
5549 /* Reset the visual mappings */
5552 /* Load the "pref" files */
5553 load_all_pref_files(player_ptr);
5555 /* Give startup outfit (after loading pref files) */
5558 player_outfit(player_ptr);
5561 /* React to changes */
5562 Term_xtra(TERM_XTRA_REACT, 0);
5564 player_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
5565 player_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
5566 handle_stuff(player_ptr);
5568 /* Set or clear "rogue_like_commands" if requested */
5569 if (arg_force_original) rogue_like_commands = FALSE;
5570 if (arg_force_roguelike) rogue_like_commands = TRUE;
5572 /* Hack -- Enforce "delayed death" */
5573 if (player_ptr->chp < 0) player_ptr->is_dead = TRUE;
5575 if (player_ptr->prace == RACE_ANDROID) calc_android_exp(player_ptr);
5577 if (new_game && ((player_ptr->pclass == CLASS_CAVALRY) || (player_ptr->pclass == CLASS_BEASTMASTER)))
5579 monster_type *m_ptr;
5580 MONRACE_IDX pet_r_idx = ((player_ptr->pclass == CLASS_CAVALRY) ? MON_HORSE : MON_YASE_HORSE);
5581 monster_race *r_ptr = &r_info[pet_r_idx];
5582 place_monster_aux(0, player_ptr->y, player_ptr->x - 1, pet_r_idx,
5583 (PM_FORCE_PET | PM_NO_KAGE));
5584 m_ptr = &player_ptr->current_floor_ptr->m_list[hack_m_idx_ii];
5585 m_ptr->mspeed = r_ptr->speed;
5586 m_ptr->maxhp = r_ptr->hdice*(r_ptr->hside+1)/2;
5587 m_ptr->max_maxhp = m_ptr->maxhp;
5588 m_ptr->hp = r_ptr->hdice*(r_ptr->hside+1)/2;
5589 m_ptr->dealt_damage = 0;
5590 m_ptr->energy_need = ENERGY_NEED() + ENERGY_NEED();
5593 (void)combine_and_reorder_home(STORE_HOME);
5594 (void)combine_and_reorder_home(STORE_MUSEUM);
5596 select_floor_music(player_ptr);
5601 /* Process the level */
5602 dungeon(player_ptr, load_game);
5604 /* Hack -- prevent "icky" message */
5605 current_world_ptr->character_xtra = TRUE;
5607 handle_stuff(player_ptr);
5609 current_world_ptr->character_xtra = FALSE;
5611 /* Cancel the target */
5614 health_track(player_ptr, 0);
5616 forget_lite(player_ptr->current_floor_ptr);
5617 forget_view(player_ptr->current_floor_ptr);
5618 clear_mon_lite(player_ptr->current_floor_ptr);
5620 /* Handle "quit and save" */
5621 if (!player_ptr->playing && !player_ptr->is_dead) break;
5623 wipe_o_list(player_ptr->current_floor_ptr);
5624 if (!player_ptr->is_dead) wipe_m_list();
5631 /* Accidental Death */
5632 if (player_ptr->playing && player_ptr->is_dead)
5634 if (player_ptr->current_floor_ptr->inside_arena)
5636 player_ptr->current_floor_ptr->inside_arena = FALSE;
5637 if (player_ptr->arena_number > MAX_ARENA_MONS)
5638 player_ptr->arena_number++;
5640 player_ptr->arena_number = -1 - player_ptr->arena_number;
5641 player_ptr->is_dead = FALSE;
5642 player_ptr->chp = 0;
5643 player_ptr->chp_frac = 0;
5644 player_ptr->exit_bldg = TRUE;
5645 reset_tim_flags(player_ptr);
5647 /* Leave through the exit */
5648 prepare_change_floor_mode(player_ptr, CFM_SAVE_FLOORS | CFM_RAND_CONNECT);
5650 /* prepare next floor */
5651 leave_floor(player_ptr);
5655 /* Mega-Hack -- Allow player to cheat death */
5656 if ((current_world_ptr->wizard || cheat_live) && !get_check(_("死にますか? ", "Die? ")))
5658 cheat_death(player_ptr);
5663 /* Handle "death" */
5664 if (player_ptr->is_dead) break;
5666 /* Make a new level */
5667 change_floor(player_ptr);
5671 close_game(player_ptr);
5678 * @brief ゲームターンからの実時間換算を行うための補正をかける
5679 * @param hoge ゲームターン
5680 * @details アンデッド種族は18:00からゲームを開始するので、この修正を予め行う。
5681 * @return 修正をかけた後のゲームターン
5683 s32b turn_real(s32b hoge)
5685 switch (p_ptr->start_race)
5691 return hoge - (TURNS_PER_TICK * TOWN_DAWN * 3 / 4);
5699 * @brief ターンのオーバーフローに対する対処
5700 * @details ターン及びターンを記録する変数をターンの限界の1日前まで巻き戻す.
5701 * @return 修正をかけた後のゲームターン
5703 void prevent_turn_overflow(void)
5705 int rollback_days, i, j;
5706 s32b rollback_turns;
5708 if (current_world_ptr->game_turn < current_world_ptr->game_turn_limit) return;
5710 rollback_days = 1 + (current_world_ptr->game_turn - current_world_ptr->game_turn_limit) / (TURNS_PER_TICK * TOWN_DAWN);
5711 rollback_turns = TURNS_PER_TICK * TOWN_DAWN * rollback_days;
5713 if (current_world_ptr->game_turn > rollback_turns) current_world_ptr->game_turn -= rollback_turns;
5714 else current_world_ptr->game_turn = 1;
5715 if (p_ptr->current_floor_ptr->generated_turn > rollback_turns) p_ptr->current_floor_ptr->generated_turn -= rollback_turns;
5716 else p_ptr->current_floor_ptr->generated_turn = 1;
5717 if (current_world_ptr->arena_start_turn > rollback_turns) current_world_ptr->arena_start_turn -= rollback_turns;
5718 else current_world_ptr->arena_start_turn = 1;
5719 if (p_ptr->feeling_turn > rollback_turns) p_ptr->feeling_turn -= rollback_turns;
5720 else p_ptr->feeling_turn = 1;
5722 for (i = 1; i < max_towns; i++)
5724 for (j = 0; j < MAX_STORES; j++)
5726 store_type *st_ptr = &town_info[i].store[j];
5728 if (st_ptr->last_visit > -10L * TURNS_PER_TICK * STORE_TICKS)
5730 st_ptr->last_visit -= rollback_turns;
5731 if (st_ptr->last_visit < -10L * TURNS_PER_TICK * STORE_TICKS) st_ptr->last_visit = -10L * TURNS_PER_TICK * STORE_TICKS;
5734 if (st_ptr->store_open)
5736 st_ptr->store_open -= rollback_turns;
5737 if (st_ptr->store_open < 1) st_ptr->store_open = 1;
5746 * Close up the current game (player may or may not be dead)
5747 * @param creature_ptr プレーヤーへの参照ポインタ
5751 * This function is called only from "main.c" and "signals.c".
5754 void close_game(player_type *player_ptr)
5757 bool do_send = TRUE;
5759 /* concptr p = "[i:キャラクタの情報, f:ファイル書き出し, t:スコア, x:*鑑定*, ESC:ゲーム終了]"; */
5760 handle_stuff(player_ptr);
5762 /* Flush the messages */
5765 /* Flush the input */
5769 /* No suspending now */
5770 signals_ignore_tstp();
5773 /* Hack -- Character is now "icky" */
5774 current_world_ptr->character_icky = TRUE;
5776 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
5778 /* Grab permissions */
5781 /* Open the high score file, for reading/writing */
5782 highscore_fd = fd_open(buf, O_RDWR);
5784 /* Drop permissions */
5788 if (player_ptr->is_dead)
5790 /* Handle retirement */
5791 if (current_world_ptr->total_winner) kingly(player_ptr);
5794 if (!cheat_save || get_check(_("死んだデータをセーブしますか? ", "Save death? ")))
5796 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
5798 else do_send = FALSE;
5801 print_tomb(player_ptr);
5805 /* Show more info */
5806 show_info(player_ptr);
5811 if ((!send_world_score(player_ptr, do_send)))
5813 if (get_check_strict(_("後でスコアを登録するために待機しますか?", "Stand by for later score registration? "),
5814 (CHECK_NO_ESCAPE | CHECK_NO_HISTORY)))
5816 player_ptr->wait_report_score = TRUE;
5817 player_ptr->is_dead = FALSE;
5818 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
5821 if (!player_ptr->wait_report_score)
5822 (void)top_twenty(player_ptr);
5824 else if (highscore_fd >= 0)
5826 display_scores_aux(0, 10, -1, NULL);
5829 /* Dump bones file */
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 "p_ptr->update" and "p_ptr->redraw" and "p_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);