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(floor_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)
934 * @note Should probably be done during monster turns.
936 static void regen_monsters(void)
941 /* Regenerate everyone */
942 for (i = 1; i < p_ptr->current_floor_ptr->m_max; i++)
944 /* Check the i'th monster */
945 monster_type *m_ptr = &p_ptr->current_floor_ptr->m_list[i];
946 monster_race *r_ptr = &r_info[m_ptr->r_idx];
948 if (!monster_is_valid(m_ptr)) continue;
950 /* Allow regeneration (if needed) */
951 if (m_ptr->hp < m_ptr->maxhp)
953 /* Hack -- Base regeneration */
954 frac = m_ptr->maxhp / 100;
956 /* Hack -- Minimal regeneration rate */
957 if (!frac) if (one_in_(2)) frac = 1;
959 /* Hack -- Some monsters regenerate quickly */
960 if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2;
962 /* Hack -- Regenerate */
965 /* Do not over-regenerate */
966 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
968 /* Redraw (later) if needed */
969 if (p_ptr->health_who == i) p_ptr->redraw |= (PR_HEALTH);
970 if (p_ptr->riding == i) p_ptr->redraw |= (PR_UHEALTH);
977 * @brief 30ゲームターン毎のボール中モンスターのHP自然回復処理 / Regenerate the captured monsters (once per 30 game turns)
979 * @note Should probably be done during monster turns.
981 static void regen_captured_monsters(void)
986 /* Regenerate everyone */
987 for (i = 0; i < INVEN_TOTAL; i++)
990 object_type *o_ptr = &p_ptr->inventory_list[i];
992 if (!o_ptr->k_idx) continue;
993 if (o_ptr->tval != TV_CAPTURE) continue;
994 if (!o_ptr->pval) continue;
998 r_ptr = &r_info[o_ptr->pval];
1000 /* Allow regeneration (if needed) */
1001 if (o_ptr->xtra4 < o_ptr->xtra5)
1003 /* Hack -- Base regeneration */
1004 frac = o_ptr->xtra5 / 100;
1006 /* Hack -- Minimal regeneration rate */
1007 if (!frac) if (one_in_(2)) frac = 1;
1009 /* Hack -- Some monsters regenerate quickly */
1010 if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2;
1012 /* Hack -- Regenerate */
1013 o_ptr->xtra4 += (XTRA16)frac;
1015 /* Do not over-regenerate */
1016 if (o_ptr->xtra4 > o_ptr->xtra5) o_ptr->xtra4 = o_ptr->xtra5;
1023 p_ptr->update |= (PU_COMBINE);
1024 p_ptr->window |= (PW_INVEN);
1025 p_ptr->window |= (PW_EQUIP);
1031 * @brief 寿命つき光源の警告メッセージ処理
1032 * @param o_ptr 現在光源として使っているオブジェクトの構造体参照ポインタ
1035 static void notice_lite_change(player_type *creature_ptr, object_type *o_ptr)
1037 /* Hack -- notice interesting fuel steps */
1038 if ((o_ptr->xtra4 < 100) || (!(o_ptr->xtra4 % 100)))
1040 creature_ptr->window |= (PW_EQUIP);
1043 /* Hack -- Special treatment when blind */
1044 if (creature_ptr->blind)
1046 /* Hack -- save some light for later */
1047 if (o_ptr->xtra4 == 0) o_ptr->xtra4++;
1050 /* The light is now out */
1051 else if (o_ptr->xtra4 == 0)
1053 disturb(creature_ptr, FALSE, TRUE);
1054 msg_print(_("明かりが消えてしまった!", "Your light has gone out!"));
1056 /* Recalculate torch radius */
1057 creature_ptr->update |= (PU_TORCH);
1059 /* Some ego light lose its effects without fuel */
1060 creature_ptr->update |= (PU_BONUS);
1063 /* The light is getting dim */
1064 else if (o_ptr->name2 == EGO_LITE_LONG)
1066 if ((o_ptr->xtra4 < 50) && (!(o_ptr->xtra4 % 5))
1067 && (current_world_ptr->game_turn % (TURNS_PER_TICK*2)))
1069 if (disturb_minor) disturb(creature_ptr, FALSE, TRUE);
1070 msg_print(_("明かりが微かになってきている。", "Your light is growing faint."));
1074 /* The light is getting dim */
1075 else if ((o_ptr->xtra4 < 100) && (!(o_ptr->xtra4 % 10)))
1077 if (disturb_minor) disturb(creature_ptr, FALSE, TRUE);
1078 msg_print(_("明かりが微かになってきている。", "Your light is growing faint."));
1084 * @brief !!を刻んだ魔道具の時間経過による再充填を知らせる処理 / If player has inscribed the object with "!!", let him know when it's recharged. -LM-
1085 * @param o_ptr 対象オブジェクトの構造体参照ポインタ
1088 static void recharged_notice(object_type *o_ptr)
1090 GAME_TEXT o_name[MAX_NLEN];
1094 /* No inscription */
1095 if (!o_ptr->inscription) return;
1098 s = my_strchr(quark_str(o_ptr->inscription), '!');
1100 /* Process notification request. */
1103 /* Find another '!' */
1106 /* Describe (briefly) */
1107 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1109 /* Notify the player */
1111 msg_format("%sは再充填された。", o_name);
1113 if (o_ptr->number > 1)
1114 msg_format("Your %s are recharged.", o_name);
1116 msg_format("Your %s is recharged.", o_name);
1119 disturb(p_ptr, FALSE, FALSE);
1125 /* Keep looking for '!'s */
1126 s = my_strchr(s + 1, '!');
1131 * @brief プレイヤーの歌に関する継続処理
1134 static void check_music(player_type *caster_ptr)
1136 const magic_type *s_ptr;
1138 MANA_POINT need_mana;
1139 u32b need_mana_frac;
1141 /* Music singed by player */
1142 if (caster_ptr->pclass != CLASS_BARD) return;
1143 if (!SINGING_SONG_EFFECT(caster_ptr) && !INTERUPTING_SONG_EFFECT(caster_ptr)) return;
1145 if (caster_ptr->anti_magic)
1147 stop_singing(caster_ptr);
1151 spell = SINGING_SONG_ID(caster_ptr);
1152 s_ptr = &technic_info[REALM_MUSIC - MIN_TECHNIC][spell];
1154 need_mana = mod_need_mana(caster_ptr, s_ptr->smana, spell, REALM_MUSIC);
1158 s64b_RSHIFT(need_mana, need_mana_frac, 1);
1160 if (s64b_cmp(caster_ptr->csp, caster_ptr->csp_frac, need_mana, need_mana_frac) < 0)
1162 stop_singing(caster_ptr);
1167 s64b_sub(&(caster_ptr->csp), &(caster_ptr->csp_frac), need_mana, need_mana_frac);
1169 caster_ptr->redraw |= PR_MANA;
1170 if (INTERUPTING_SONG_EFFECT(caster_ptr))
1172 SINGING_SONG_EFFECT(caster_ptr) = INTERUPTING_SONG_EFFECT(caster_ptr);
1173 INTERUPTING_SONG_EFFECT(caster_ptr) = MUSIC_NONE;
1174 msg_print(_("歌を再開した。", "You restart singing."));
1175 caster_ptr->action = ACTION_SING;
1176 caster_ptr->update |= (PU_BONUS | PU_HP | PU_MONSTERS);
1177 caster_ptr->redraw |= (PR_MAP | PR_STATUS | PR_STATE);
1178 caster_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
1181 if (caster_ptr->spell_exp[spell] < SPELL_EXP_BEGINNER)
1182 caster_ptr->spell_exp[spell] += 5;
1183 else if(caster_ptr->spell_exp[spell] < SPELL_EXP_SKILLED)
1184 { if (one_in_(2) && (caster_ptr->current_floor_ptr->dun_level > 4) && ((caster_ptr->current_floor_ptr->dun_level + 10) > caster_ptr->lev)) caster_ptr->spell_exp[spell] += 1; }
1185 else if(caster_ptr->spell_exp[spell] < SPELL_EXP_EXPERT)
1186 { 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; }
1187 else if(caster_ptr->spell_exp[spell] < SPELL_EXP_MASTER)
1188 { 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; }
1190 /* Do any effects of continual song */
1191 exe_spell(caster_ptr, REALM_MUSIC, spell, SPELL_CONT);
1195 * @brief 現在呪いを保持している装備品を一つランダムに探し出す / Choose one of items that have cursed flag
1196 * @param flag 探し出したい呪いフラグ配列
1197 * @return 該当の呪いが一つでもあった場合にランダムに選ばれた装備品のオブジェクト構造体参照ポインタを返す。\n
1200 static object_type *choose_cursed_obj_name(BIT_FLAGS flag)
1203 int choices[INVEN_TOTAL-INVEN_RARM];
1206 /* Paranoia -- Player has no warning-item */
1207 if (!(p_ptr->cursed & flag)) return NULL;
1209 /* Search Inventry */
1210 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
1212 object_type *o_ptr = &p_ptr->inventory_list[i];
1214 if (o_ptr->curse_flags & flag)
1216 choices[number] = i;
1219 else if ((flag == TRC_ADD_L_CURSE) ||
1220 (flag == TRC_ADD_H_CURSE) ||
1221 (flag == TRC_DRAIN_HP) ||
1222 (flag == TRC_DRAIN_MANA) ||
1223 (flag == TRC_CALL_ANIMAL) ||
1224 (flag == TRC_CALL_DEMON) ||
1225 (flag == TRC_CALL_DRAGON) ||
1226 (flag == TRC_CALL_UNDEAD) ||
1227 (flag == TRC_COWARDICE) ||
1228 (flag == TRC_LOW_MELEE) ||
1229 (flag == TRC_LOW_AC) ||
1230 (flag == TRC_LOW_MAGIC) ||
1231 (flag == TRC_FAST_DIGEST) ||
1232 (flag == TRC_SLOW_REGEN) )
1235 BIT_FLAGS flgs[TR_FLAG_SIZE];
1236 object_flags(o_ptr, flgs);
1239 case TRC_ADD_L_CURSE : cf = TR_ADD_L_CURSE; break;
1240 case TRC_ADD_H_CURSE : cf = TR_ADD_H_CURSE; break;
1241 case TRC_DRAIN_HP : cf = TR_DRAIN_HP; break;
1242 case TRC_DRAIN_MANA : cf = TR_DRAIN_MANA; break;
1243 case TRC_CALL_ANIMAL : cf = TR_CALL_ANIMAL; break;
1244 case TRC_CALL_DEMON : cf = TR_CALL_DEMON; break;
1245 case TRC_CALL_DRAGON : cf = TR_CALL_DRAGON; break;
1246 case TRC_CALL_UNDEAD : cf = TR_CALL_UNDEAD; break;
1247 case TRC_COWARDICE : cf = TR_COWARDICE; break;
1248 case TRC_LOW_MELEE : cf = TR_LOW_MELEE; break;
1249 case TRC_LOW_AC : cf = TR_LOW_AC; break;
1250 case TRC_LOW_MAGIC : cf = TR_LOW_MAGIC; break;
1251 case TRC_FAST_DIGEST : cf = TR_FAST_DIGEST; break;
1252 case TRC_SLOW_REGEN : cf = TR_SLOW_REGEN; break;
1255 if (have_flag(flgs, cf))
1257 choices[number] = i;
1263 /* Choice one of them */
1264 return (&p_ptr->inventory_list[choices[randint0(number)]]);
1268 static void process_world_aux_digestion(player_type *creature_ptr)
1270 if (!creature_ptr->phase_out)
1272 /* Digest quickly when gorged */
1273 if (creature_ptr->food >= PY_FOOD_MAX)
1275 /* Digest a lot of food */
1276 (void)set_food(creature_ptr, creature_ptr->food - 100);
1279 /* Digest normally -- Every 50 game turns */
1280 else if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 5)))
1282 /* Basic digestion rate based on speed */
1283 int digestion = SPEED_TO_ENERGY(creature_ptr->pspeed);
1285 /* Regeneration takes more food */
1286 if (creature_ptr->regenerate)
1288 if (creature_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1290 if (creature_ptr->cursed & TRC_FAST_DIGEST)
1293 /* Slow digestion takes less food */
1294 if (creature_ptr->slow_digest)
1297 /* Minimal digestion */
1298 if (digestion < 1) digestion = 1;
1299 /* Maximal digestion */
1300 if (digestion > 100) digestion = 100;
1302 /* Digest some food */
1303 (void)set_food(creature_ptr, creature_ptr->food - digestion);
1308 if ((creature_ptr->food < PY_FOOD_FAINT))
1310 /* Faint occasionally */
1311 if (!creature_ptr->paralyzed && (randint0(100) < 10))
1313 msg_print(_("あまりにも空腹で気絶してしまった。", "You faint from the lack of food."));
1314 disturb(creature_ptr, TRUE, TRUE);
1316 /* Hack -- faint (bypass free action) */
1317 (void)set_paralyzed(creature_ptr, creature_ptr->paralyzed + 1 + randint0(5));
1320 /* Starve to death (slowly) */
1321 if (creature_ptr->food < PY_FOOD_STARVE)
1323 /* Calculate damage */
1324 HIT_POINT dam = (PY_FOOD_STARVE - creature_ptr->food) / 10;
1326 if (!IS_INVULN(creature_ptr)) take_hit(creature_ptr, DAMAGE_LOSELIFE, dam, _("空腹", "starvation"), -1);
1333 * @brief 10ゲームターンが進行するごとにプレイヤーのHPとMPの増減処理を行う。
1334 * / Handle timed damage and regeneration every 10 game turns
1337 static void process_world_aux_hp_and_sp(player_type *creature_ptr)
1339 feature_type *f_ptr = &f_info[creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].feat];
1340 bool cave_no_regen = FALSE;
1341 int upkeep_factor = 0;
1343 /* Default regeneration */
1344 int regen_amount = PY_REGEN_NORMAL;
1347 /*** Damage over Time ***/
1349 /* Take damage from poison */
1350 if (creature_ptr->poisoned && !IS_INVULN(creature_ptr))
1352 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, _("毒", "poison"), -1);
1355 /* Take damage from cuts */
1356 if (creature_ptr->cut && !IS_INVULN(creature_ptr))
1360 /* Mortal wound or Deep Gash */
1361 if (creature_ptr->cut > 1000)
1366 else if (creature_ptr->cut > 200)
1372 else if (creature_ptr->cut > 100)
1377 else if (creature_ptr->cut > 50)
1382 else if (creature_ptr->cut > 25)
1387 else if (creature_ptr->cut > 10)
1398 take_hit(creature_ptr, DAMAGE_NOESCAPE, dam, _("致命傷", "a fatal wound"), -1);
1401 /* (Vampires) Take damage from sunlight */
1402 if (PRACE_IS_(creature_ptr, RACE_VAMPIRE) || (creature_ptr->mimic_form == MIMIC_VAMPIRE))
1404 if (!creature_ptr->current_floor_ptr->dun_level && !creature_ptr->resist_lite && !IS_INVULN(creature_ptr) && is_daytime())
1406 if ((creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
1408 msg_print(_("日光があなたのアンデッドの肉体を焼き焦がした!", "The sun's rays scorch your undead flesh!"));
1409 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, _("日光", "sunlight"), -1);
1410 cave_no_regen = TRUE;
1414 if (creature_ptr->inventory_list[INVEN_LITE].tval && (creature_ptr->inventory_list[INVEN_LITE].name2 != EGO_LITE_DARKNESS) &&
1415 !creature_ptr->resist_lite)
1417 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
1418 GAME_TEXT o_name [MAX_NLEN];
1419 char ouch [MAX_NLEN+40];
1421 /* Get an object description */
1422 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1423 msg_format(_("%sがあなたのアンデッドの肉体を焼き焦がした!", "The %s scorches your undead flesh!"), o_name);
1425 cave_no_regen = TRUE;
1427 /* Get an object description */
1428 object_desc(o_name, o_ptr, OD_NAME_ONLY);
1429 sprintf(ouch, _("%sを装備したダメージ", "wielding %s"), o_name);
1431 if (!IS_INVULN(creature_ptr)) take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, ouch, -1);
1435 if (have_flag(f_ptr->flags, FF_LAVA) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_fire)
1439 if (have_flag(f_ptr->flags, FF_DEEP))
1441 damage = 6000 + randint0(4000);
1443 else if (!creature_ptr->levitation)
1445 damage = 3000 + randint0(2000);
1450 if(PRACE_IS_(creature_ptr, RACE_ENT)) damage += damage / 3;
1451 if(creature_ptr->resist_fire) damage = damage / 3;
1452 if(is_oppose_fire(creature_ptr)) damage = damage / 3;
1453 if(creature_ptr->levitation) damage = damage / 5;
1455 damage = damage / 100 + (randint0(100) < (damage % 100));
1457 if (creature_ptr->levitation)
1459 msg_print(_("熱で火傷した!", "The heat burns you!"));
1460 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1461 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1465 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1466 msg_format(_("%sで火傷した!", "The %s burns you!"), name);
1467 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1470 cave_no_regen = TRUE;
1474 if (have_flag(f_ptr->flags, FF_COLD_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_cold)
1478 if (have_flag(f_ptr->flags, FF_DEEP))
1480 damage = 6000 + randint0(4000);
1482 else if (!creature_ptr->levitation)
1484 damage = 3000 + randint0(2000);
1489 if (creature_ptr->resist_cold) damage = damage / 3;
1490 if (is_oppose_cold(creature_ptr)) damage = damage / 3;
1491 if (creature_ptr->levitation) damage = damage / 5;
1493 damage = damage / 100 + (randint0(100) < (damage % 100));
1495 if (creature_ptr->levitation)
1497 msg_print(_("冷気に覆われた!", "The cold engulfs you!"));
1498 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1499 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1503 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1504 msg_format(_("%sに凍えた!", "The %s frostbites you!"), name);
1505 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1508 cave_no_regen = TRUE;
1512 if (have_flag(f_ptr->flags, FF_ELEC_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_elec)
1516 if (have_flag(f_ptr->flags, FF_DEEP))
1518 damage = 6000 + randint0(4000);
1520 else if (!creature_ptr->levitation)
1522 damage = 3000 + randint0(2000);
1527 if (creature_ptr->resist_elec) damage = damage / 3;
1528 if (is_oppose_elec(creature_ptr)) damage = damage / 3;
1529 if (creature_ptr->levitation) damage = damage / 5;
1531 damage = damage / 100 + (randint0(100) < (damage % 100));
1533 if (creature_ptr->levitation)
1535 msg_print(_("電撃を受けた!", "The electric shocks you!"));
1536 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1537 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1541 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1542 msg_format(_("%sに感電した!", "The %s shocks you!"), name);
1543 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1546 cave_no_regen = TRUE;
1550 if (have_flag(f_ptr->flags, FF_ACID_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_acid)
1554 if (have_flag(f_ptr->flags, FF_DEEP))
1556 damage = 6000 + randint0(4000);
1558 else if (!creature_ptr->levitation)
1560 damage = 3000 + randint0(2000);
1565 if (creature_ptr->resist_acid) damage = damage / 3;
1566 if (is_oppose_acid(creature_ptr)) damage = damage / 3;
1567 if (creature_ptr->levitation) damage = damage / 5;
1569 damage = damage / 100 + (randint0(100) < (damage % 100));
1571 if (creature_ptr->levitation)
1573 msg_print(_("酸が飛び散った!", "The acid melt you!"));
1574 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1575 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1579 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1580 msg_format(_("%sに溶かされた!", "The %s melts you!"), name);
1581 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1584 cave_no_regen = TRUE;
1588 if (have_flag(f_ptr->flags, FF_POISON_PUDDLE) && !IS_INVULN(creature_ptr))
1592 if (have_flag(f_ptr->flags, FF_DEEP))
1594 damage = 6000 + randint0(4000);
1596 else if (!creature_ptr->levitation)
1598 damage = 3000 + randint0(2000);
1603 if (creature_ptr->resist_pois) damage = damage / 3;
1604 if (is_oppose_pois(creature_ptr)) damage = damage / 3;
1605 if (creature_ptr->levitation) damage = damage / 5;
1607 damage = damage / 100 + (randint0(100) < (damage % 100));
1609 if (creature_ptr->levitation)
1611 msg_print(_("毒気を吸い込んだ!", "The gas poisons you!"));
1612 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1613 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1614 if (creature_ptr->resist_pois) (void)set_poisoned(creature_ptr, creature_ptr->poisoned + 1);
1618 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1619 msg_format(_("%sに毒された!", "The %s poisons you!"), name);
1620 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1621 if (creature_ptr->resist_pois) (void)set_poisoned(creature_ptr, creature_ptr->poisoned + 3);
1624 cave_no_regen = TRUE;
1628 if (have_flag(f_ptr->flags, FF_WATER) && have_flag(f_ptr->flags, FF_DEEP) &&
1629 !creature_ptr->levitation && !creature_ptr->can_swim && !creature_ptr->resist_water)
1631 if (creature_ptr->total_weight > weight_limit(creature_ptr))
1633 msg_print(_("溺れている!", "You are drowning!"));
1634 take_hit(creature_ptr, DAMAGE_NOESCAPE, randint1(creature_ptr->lev), _("溺れ", "drowning"), -1);
1635 cave_no_regen = TRUE;
1639 if (creature_ptr->riding)
1642 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags2 & RF2_AURA_FIRE) && !creature_ptr->immune_fire)
1644 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1645 if (PRACE_IS_(creature_ptr, RACE_ENT)) damage += damage / 3;
1646 if (creature_ptr->resist_fire) damage = damage / 3;
1647 if (is_oppose_fire(creature_ptr)) damage = damage / 3;
1648 msg_print(_("熱い!", "It's hot!"));
1649 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("炎のオーラ", "Fire aura"), -1);
1651 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags2 & RF2_AURA_ELEC) && !creature_ptr->immune_elec)
1653 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1654 if (PRACE_IS_(creature_ptr, RACE_ANDROID)) damage += damage / 3;
1655 if (creature_ptr->resist_elec) damage = damage / 3;
1656 if (is_oppose_elec(creature_ptr)) damage = damage / 3;
1657 msg_print(_("痛い!", "It hurts!"));
1658 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("電気のオーラ", "Elec aura"), -1);
1660 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags3 & RF3_AURA_COLD) && !creature_ptr->immune_cold)
1662 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1663 if (creature_ptr->resist_cold) damage = damage / 3;
1664 if (is_oppose_cold(creature_ptr)) damage = damage / 3;
1665 msg_print(_("冷たい!", "It's cold!"));
1666 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("冷気のオーラ", "Cold aura"), -1);
1670 /* Spectres -- take damage when moving through walls */
1672 * Added: ANYBODY takes damage if inside through walls
1673 * without wraith form -- NOTE: Spectres will never be
1674 * reduced below 0 hp by being inside a stone wall; others
1677 if (!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY))
1679 if (!IS_INVULN(creature_ptr) && !creature_ptr->wraith_form && !creature_ptr->kabenuke && ((creature_ptr->chp > (creature_ptr->lev / 5)) || !creature_ptr->pass_wall))
1682 cave_no_regen = TRUE;
1684 if (creature_ptr->pass_wall)
1686 msg_print(_("体の分子が分解した気がする!", "Your molecules feel disrupted!"));
1687 dam_desc = _("密度", "density");
1691 msg_print(_("崩れた岩に押し潰された!", "You are being crushed!"));
1692 dam_desc = _("硬い岩", "solid rock");
1695 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1 + (creature_ptr->lev / 5), dam_desc, -1);
1700 /*** handle regeneration ***/
1703 if (creature_ptr->food < PY_FOOD_WEAK)
1705 /* Lower regeneration */
1706 if (creature_ptr->food < PY_FOOD_STARVE)
1710 else if (creature_ptr->food < PY_FOOD_FAINT)
1712 regen_amount = PY_REGEN_FAINT;
1716 regen_amount = PY_REGEN_WEAK;
1720 /* Are we walking the pattern? */
1721 if (pattern_effect(creature_ptr))
1723 cave_no_regen = TRUE;
1727 /* Regeneration ability */
1728 if (creature_ptr->regenerate)
1730 regen_amount = regen_amount * 2;
1732 if (creature_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1736 if (creature_ptr->cursed & TRC_SLOW_REGEN)
1743 /* Searching or Resting */
1744 if ((creature_ptr->action == ACTION_SEARCH) || (creature_ptr->action == ACTION_REST))
1746 regen_amount = regen_amount * 2;
1749 upkeep_factor = calculate_upkeep(creature_ptr);
1751 /* No regeneration while special action */
1752 if ((creature_ptr->action == ACTION_LEARN) ||
1753 (creature_ptr->action == ACTION_HAYAGAKE) ||
1754 (creature_ptr->special_defense & KATA_KOUKIJIN))
1756 upkeep_factor += 100;
1759 /* Regenerate the mana */
1760 regenmana(creature_ptr, upkeep_factor, regen_amount);
1763 /* Recharge magic eater's power */
1764 if (creature_ptr->pclass == CLASS_MAGIC_EATER)
1766 regenmagic(creature_ptr, regen_amount);
1769 if ((creature_ptr->csp == 0) && (creature_ptr->csp_frac == 0))
1771 while (upkeep_factor > 100)
1773 msg_print(_("こんなに多くのペットを制御できない!", "Too many pets to control at once!"));
1775 do_cmd_pet_dismiss(creature_ptr);
1777 upkeep_factor = calculate_upkeep(creature_ptr);
1779 msg_format(_("維持MPは %d%%", "Upkeep: %d%% mana."), upkeep_factor);
1784 /* Poisoned or cut yields no healing */
1785 if (creature_ptr->poisoned) regen_amount = 0;
1786 if (creature_ptr->cut) regen_amount = 0;
1788 /* Special floor -- Pattern, in a wall -- yields no healing */
1789 if (cave_no_regen) regen_amount = 0;
1791 regen_amount = (regen_amount * creature_ptr->mutant_regenerate_mod) / 100;
1793 /* Regenerate Hit Points if needed */
1794 if ((creature_ptr->chp < creature_ptr->mhp) && !cave_no_regen)
1796 regenhp(creature_ptr, regen_amount);
1801 * @brief 10ゲームターンが進行するごとに魔法効果の残りターンを減らしていく処理
1802 * / Handle timeout every 10 game turns
1805 static void process_world_aux_timeout(player_type *creature_ptr)
1807 const int dec_count = (easy_band ? 2 : 1);
1809 /*** Timeout Various Things ***/
1812 if (creature_ptr->tim_mimic)
1814 (void)set_mimic(creature_ptr, creature_ptr->tim_mimic - 1, creature_ptr->mimic_form, TRUE);
1817 /* Hack -- Hallucinating */
1818 if (creature_ptr->image)
1820 (void)set_image(creature_ptr, creature_ptr->image - dec_count);
1824 if (creature_ptr->blind)
1826 (void)set_blind(creature_ptr, creature_ptr->blind - dec_count);
1829 /* Times see-invisible */
1830 if (creature_ptr->tim_invis)
1832 (void)set_tim_invis(creature_ptr, creature_ptr->tim_invis - 1, TRUE);
1835 if (creature_ptr->suppress_multi_reward)
1837 creature_ptr->suppress_multi_reward = FALSE;
1841 if (creature_ptr->tim_esp)
1843 (void)set_tim_esp(creature_ptr, creature_ptr->tim_esp - 1, TRUE);
1846 /* Timed temporary elemental brands. -LM- */
1847 if (creature_ptr->ele_attack)
1849 creature_ptr->ele_attack--;
1851 /* Clear all temporary elemental brands. */
1852 if (!creature_ptr->ele_attack) set_ele_attack(creature_ptr, 0, 0);
1855 /* Timed temporary elemental immune. -LM- */
1856 if (creature_ptr->ele_immune)
1858 creature_ptr->ele_immune--;
1860 /* Clear all temporary elemental brands. */
1861 if (!creature_ptr->ele_immune) set_ele_immune(creature_ptr, 0, 0);
1864 /* Timed infra-vision */
1865 if (creature_ptr->tim_infra)
1867 (void)set_tim_infra(creature_ptr, creature_ptr->tim_infra - 1, TRUE);
1871 if (creature_ptr->tim_stealth)
1873 (void)set_tim_stealth(creature_ptr, creature_ptr->tim_stealth - 1, TRUE);
1876 /* Timed levitation */
1877 if (creature_ptr->tim_levitation)
1879 (void)set_tim_levitation(creature_ptr, creature_ptr->tim_levitation - 1, TRUE);
1882 /* Timed sh_touki */
1883 if (creature_ptr->tim_sh_touki)
1885 (void)set_tim_sh_touki(creature_ptr, creature_ptr->tim_sh_touki - 1, TRUE);
1889 if (creature_ptr->tim_sh_fire)
1891 (void)set_tim_sh_fire(creature_ptr, creature_ptr->tim_sh_fire - 1, TRUE);
1895 if (creature_ptr->tim_sh_holy)
1897 (void)set_tim_sh_holy(creature_ptr, creature_ptr->tim_sh_holy - 1, TRUE);
1901 if (creature_ptr->tim_eyeeye)
1903 (void)set_tim_eyeeye(creature_ptr, creature_ptr->tim_eyeeye - 1, TRUE);
1906 /* Timed resist-magic */
1907 if (creature_ptr->resist_magic)
1909 (void)set_resist_magic(creature_ptr, creature_ptr->resist_magic - 1, TRUE);
1912 /* Timed regeneration */
1913 if (creature_ptr->tim_regen)
1915 (void)set_tim_regen(creature_ptr, creature_ptr->tim_regen - 1, TRUE);
1918 /* Timed resist nether */
1919 if (creature_ptr->tim_res_nether)
1921 (void)set_tim_res_nether(creature_ptr, creature_ptr->tim_res_nether - 1, TRUE);
1924 /* Timed resist time */
1925 if (creature_ptr->tim_res_time)
1927 (void)set_tim_res_time(creature_ptr, creature_ptr->tim_res_time - 1, TRUE);
1931 if (creature_ptr->tim_reflect)
1933 (void)set_tim_reflect(creature_ptr, creature_ptr->tim_reflect - 1, TRUE);
1937 if (creature_ptr->multishadow)
1939 (void)set_multishadow(creature_ptr, creature_ptr->multishadow - 1, TRUE);
1942 /* Timed Robe of dust */
1943 if (creature_ptr->dustrobe)
1945 (void)set_dustrobe(creature_ptr, creature_ptr->dustrobe - 1, TRUE);
1948 /* Timed infra-vision */
1949 if (creature_ptr->kabenuke)
1951 (void)set_kabenuke(creature_ptr, creature_ptr->kabenuke - 1, TRUE);
1955 if (creature_ptr->paralyzed)
1957 (void)set_paralyzed(creature_ptr, creature_ptr->paralyzed - dec_count);
1961 if (creature_ptr->confused)
1963 (void)set_confused(creature_ptr, creature_ptr->confused - dec_count);
1967 if (creature_ptr->afraid)
1969 (void)set_afraid(creature_ptr, creature_ptr->afraid - dec_count);
1973 if (creature_ptr->fast)
1975 (void)set_fast(creature_ptr, creature_ptr->fast - 1, TRUE);
1979 if (creature_ptr->slow)
1981 (void)set_slow(creature_ptr, creature_ptr->slow - dec_count, TRUE);
1984 /* Protection from evil */
1985 if (creature_ptr->protevil)
1987 (void)set_protevil(creature_ptr, creature_ptr->protevil - 1, TRUE);
1990 /* Invulnerability */
1991 if (creature_ptr->invuln)
1993 (void)set_invuln(creature_ptr, creature_ptr->invuln - 1, TRUE);
1997 if (creature_ptr->wraith_form)
1999 (void)set_wraith_form(creature_ptr, creature_ptr->wraith_form - 1, TRUE);
2003 if (creature_ptr->hero)
2005 (void)set_hero(creature_ptr, creature_ptr->hero - 1, TRUE);
2009 if (creature_ptr->shero)
2011 (void)set_shero(creature_ptr, creature_ptr->shero - 1, TRUE);
2015 if (creature_ptr->blessed)
2017 (void)set_blessed(creature_ptr, creature_ptr->blessed - 1, TRUE);
2021 if (creature_ptr->shield)
2023 (void)set_shield(creature_ptr, creature_ptr->shield - 1, TRUE);
2027 if (creature_ptr->tsubureru)
2029 (void)set_tsubureru(creature_ptr, creature_ptr->tsubureru - 1, TRUE);
2033 if (creature_ptr->magicdef)
2035 (void)set_magicdef(creature_ptr, creature_ptr->magicdef - 1, TRUE);
2039 if (creature_ptr->tsuyoshi)
2041 (void)set_tsuyoshi(creature_ptr, creature_ptr->tsuyoshi - 1, TRUE);
2045 if (creature_ptr->oppose_acid)
2047 (void)set_oppose_acid(creature_ptr, creature_ptr->oppose_acid - 1, TRUE);
2050 /* Oppose Lightning */
2051 if (creature_ptr->oppose_elec)
2053 (void)set_oppose_elec(creature_ptr, creature_ptr->oppose_elec - 1, TRUE);
2057 if (creature_ptr->oppose_fire)
2059 (void)set_oppose_fire(creature_ptr, creature_ptr->oppose_fire - 1, TRUE);
2063 if (creature_ptr->oppose_cold)
2065 (void)set_oppose_cold(creature_ptr, creature_ptr->oppose_cold - 1, TRUE);
2069 if (creature_ptr->oppose_pois)
2071 (void)set_oppose_pois(creature_ptr, creature_ptr->oppose_pois - 1, TRUE);
2074 if (creature_ptr->ult_res)
2076 (void)set_ultimate_res(creature_ptr, creature_ptr->ult_res - 1, TRUE);
2079 /*** Poison and Stun and Cut ***/
2082 if (creature_ptr->poisoned)
2084 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
2086 /* Apply some healing */
2087 (void)set_poisoned(creature_ptr, creature_ptr->poisoned - adjust);
2091 if (creature_ptr->stun)
2093 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
2095 /* Apply some healing */
2096 (void)set_stun(creature_ptr, creature_ptr->stun - adjust);
2100 if (creature_ptr->cut)
2102 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
2104 /* Hack -- Truly "mortal" wound */
2105 if (creature_ptr->cut > 1000) adjust = 0;
2107 /* Apply some healing */
2108 (void)set_cut(creature_ptr,creature_ptr->cut - adjust);
2114 * @brief 10ゲームターンが進行する毎に光源の寿命を減らす処理
2115 * / Handle burning fuel every 10 game turns
2118 static void process_world_aux_light(player_type *creature_ptr)
2120 /* Check for light being wielded */
2121 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
2123 /* Burn some fuel in the current lite */
2124 if (o_ptr->tval == TV_LITE)
2126 /* Hack -- Use some fuel (except on artifacts) */
2127 if (!(object_is_fixed_artifact(o_ptr) || o_ptr->sval == SV_LITE_FEANOR) && (o_ptr->xtra4 > 0))
2129 /* Decrease life-span */
2130 if (o_ptr->name2 == EGO_LITE_LONG)
2132 if (current_world_ptr->game_turn % (TURNS_PER_TICK*2)) o_ptr->xtra4--;
2134 else o_ptr->xtra4--;
2136 /* Notice interesting fuel steps */
2137 notice_lite_change(creature_ptr, o_ptr);
2144 * @brief 10ゲームターンが進行するごとに突然変異の発動判定を行う処理
2145 * / Handle mutation effects once every 10 game turns
2148 static void process_world_aux_mutation(player_type *creature_ptr)
2150 /* No mutation with effects */
2151 if (!creature_ptr->muta2) return;
2153 /* No effect on monster arena */
2154 if (creature_ptr->phase_out) return;
2156 /* No effect on the global map */
2157 if (creature_ptr->wild_mode) return;
2159 if ((creature_ptr->muta2 & MUT2_BERS_RAGE) && one_in_(3000))
2161 disturb(creature_ptr, FALSE, TRUE);
2162 msg_print(_("ウガァァア!", "RAAAAGHH!"));
2163 msg_print(_("激怒の発作に襲われた!", "You feel a fit of rage coming over you!"));
2164 (void)set_shero(creature_ptr, 10 + randint1(creature_ptr->lev), FALSE);
2165 (void)set_afraid(creature_ptr, 0);
2168 if ((creature_ptr->muta2 & MUT2_COWARDICE) && (randint1(3000) == 13))
2170 if (!creature_ptr->resist_fear)
2172 disturb(creature_ptr, FALSE, TRUE);
2173 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
2174 set_afraid(creature_ptr, creature_ptr->afraid + 13 + randint1(26));
2178 if ((creature_ptr->muta2 & MUT2_RTELEPORT) && (randint1(5000) == 88))
2180 if (!creature_ptr->resist_nexus && !(creature_ptr->muta1 & MUT1_VTELEPORT) && !creature_ptr->anti_tele)
2182 disturb(creature_ptr, FALSE, TRUE);
2183 msg_print(_("あなたの位置は突然ひじょうに不確定になった...", "Your position suddenly seems very uncertain..."));
2185 teleport_player(creature_ptr, 40, TELEPORT_PASSIVE);
2189 if ((creature_ptr->muta2 & MUT2_ALCOHOL) && (randint1(6400) == 321))
2191 if (!creature_ptr->resist_conf && !creature_ptr->resist_chaos)
2193 disturb(creature_ptr, FALSE, TRUE);
2194 creature_ptr->redraw |= PR_EXTRA;
2195 msg_print(_("いひきがもーろーとひてきたきがふる...ヒック!", "You feel a SSSCHtupor cOmINg over yOu... *HIC*!"));
2198 if (!creature_ptr->resist_conf)
2200 (void)set_confused(creature_ptr, creature_ptr->confused + randint0(20) + 15);
2203 if (!creature_ptr->resist_chaos)
2208 if (one_in_(3)) lose_all_info(creature_ptr);
2209 else wiz_dark(creature_ptr);
2210 (void)teleport_player_aux(creature_ptr,100, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE);
2211 wiz_dark(creature_ptr);
2212 msg_print(_("あなたは見知らぬ場所で目が醒めた...頭が痛い。", "You wake up somewhere with a sore head..."));
2213 msg_print(_("何も覚えていない。どうやってここに来たかも分からない!", "You can't remember a thing, or how you got here!"));
2219 msg_print(_("き~れいなちょおちょらとんれいる~", "Thishcischs GooDSChtuff!"));
2220 (void)set_image(creature_ptr, creature_ptr->image + randint0(150) + 150);
2226 if ((creature_ptr->muta2 & MUT2_HALLU) && (randint1(6400) == 42))
2228 if (!creature_ptr->resist_chaos)
2230 disturb(creature_ptr, FALSE, TRUE);
2231 creature_ptr->redraw |= PR_EXTRA;
2232 (void)set_image(creature_ptr, creature_ptr->image + randint0(50) + 20);
2236 if ((creature_ptr->muta2 & MUT2_FLATULENT) && (randint1(3000) == 13))
2238 disturb(creature_ptr, FALSE, TRUE);
2239 msg_print(_("ブゥーーッ!おっと。", "BRRAAAP! Oops."));
2241 fire_ball(creature_ptr, GF_POIS, 0, creature_ptr->lev, 3);
2244 if ((creature_ptr->muta2 & MUT2_PROD_MANA) &&
2245 !creature_ptr->anti_magic && one_in_(9000))
2248 disturb(creature_ptr, FALSE, TRUE);
2249 msg_print(_("魔法のエネルギーが突然あなたの中に流れ込んできた!エネルギーを解放しなければならない!",
2250 "Magical energy flows through you! You must release it!"));
2254 (void)get_hack_dir(creature_ptr, &dire);
2255 fire_ball(creature_ptr, GF_MANA, dire, creature_ptr->lev * 2, 3);
2258 if ((creature_ptr->muta2 & MUT2_ATT_DEMON) && !creature_ptr->anti_magic && (randint1(6666) == 666))
2260 bool pet = one_in_(6);
2261 BIT_FLAGS mode = PM_ALLOW_GROUP;
2263 if (pet) mode |= PM_FORCE_PET;
2264 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2266 if (summon_specific((pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DEMON, mode))
2268 msg_print(_("あなたはデーモンを引き寄せた!", "You have attracted a demon!"));
2269 disturb(creature_ptr, FALSE, TRUE);
2273 if ((creature_ptr->muta2 & MUT2_SPEED_FLUX) && one_in_(6000))
2275 disturb(creature_ptr, FALSE, TRUE);
2278 msg_print(_("精力的でなくなった気がする。", "You feel less energetic."));
2280 if (creature_ptr->fast > 0)
2282 set_fast(creature_ptr, 0, TRUE);
2286 set_slow(creature_ptr, randint1(30) + 10, FALSE);
2291 msg_print(_("精力的になった気がする。", "You feel more energetic."));
2293 if (creature_ptr->slow > 0)
2295 set_slow(creature_ptr, 0, TRUE);
2299 set_fast(creature_ptr, randint1(30) + 10, FALSE);
2304 if ((creature_ptr->muta2 & MUT2_BANISH_ALL) && one_in_(9000))
2306 disturb(creature_ptr, FALSE, TRUE);
2307 msg_print(_("突然ほとんど孤独になった気がする。", "You suddenly feel almost lonely."));
2309 banish_monsters(creature_ptr, 100);
2310 if (!creature_ptr->current_floor_ptr->dun_level && creature_ptr->town_num)
2314 /* Pick a random shop (except home) */
2317 n = randint0(MAX_STORES);
2319 while ((n == STORE_HOME) || (n == STORE_MUSEUM));
2321 msg_print(_("店の主人が丘に向かって走っている!", "You see one of the shopkeepers running for the hills!"));
2327 if ((creature_ptr->muta2 & MUT2_EAT_LIGHT) && one_in_(3000))
2331 msg_print(_("影につつまれた。", "A shadow passes over you."));
2334 /* Absorb light from the current possition */
2335 if ((creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
2337 hp_player(creature_ptr, 10);
2340 o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
2342 /* Absorb some fuel in the current lite */
2343 if (o_ptr->tval == TV_LITE)
2345 /* Use some fuel (except on artifacts) */
2346 if (!object_is_fixed_artifact(o_ptr) && (o_ptr->xtra4 > 0))
2348 /* Heal the player a bit */
2349 hp_player(creature_ptr, o_ptr->xtra4 / 20);
2351 /* Decrease life-span of lite */
2353 msg_print(_("光源からエネルギーを吸収した!", "You absorb energy from your light!"));
2355 /* Notice interesting fuel steps */
2356 notice_lite_change(creature_ptr, o_ptr);
2361 * Unlite the area (radius 10) around player and
2362 * do 50 points damage to every affected monster
2364 unlite_area(creature_ptr, 50, 10);
2367 if ((creature_ptr->muta2 & MUT2_ATT_ANIMAL) && !creature_ptr->anti_magic && one_in_(7000))
2369 bool pet = one_in_(3);
2370 BIT_FLAGS mode = PM_ALLOW_GROUP;
2372 if (pet) mode |= PM_FORCE_PET;
2373 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2375 if (summon_specific((pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_ANIMAL, mode))
2377 msg_print(_("動物を引き寄せた!", "You have attracted an animal!"));
2378 disturb(creature_ptr, FALSE, TRUE);
2382 if ((creature_ptr->muta2 & MUT2_RAW_CHAOS) && !creature_ptr->anti_magic && one_in_(8000))
2384 disturb(creature_ptr, FALSE, TRUE);
2385 msg_print(_("周りの空間が歪んでいる気がする!", "You feel the world warping around you!"));
2388 fire_ball(creature_ptr, GF_CHAOS, 0, creature_ptr->lev, 8);
2390 if ((creature_ptr->muta2 & MUT2_NORMALITY) && one_in_(5000))
2392 if (!lose_mutation(creature_ptr, 0))
2393 msg_print(_("奇妙なくらい普通になった気がする。", "You feel oddly normal."));
2395 if ((creature_ptr->muta2 & MUT2_WRAITH) && !creature_ptr->anti_magic && one_in_(3000))
2397 disturb(creature_ptr, FALSE, TRUE);
2398 msg_print(_("非物質化した!", "You feel insubstantial!"));
2401 set_wraith_form(creature_ptr, randint1(creature_ptr->lev / 2) + (creature_ptr->lev / 2), FALSE);
2403 if ((creature_ptr->muta2 & MUT2_POLY_WOUND) && one_in_(3000))
2405 do_poly_wounds(creature_ptr);
2407 if ((creature_ptr->muta2 & MUT2_WASTING) && one_in_(3000))
2409 int which_stat = randint0(A_MAX);
2410 int sustained = FALSE;
2415 if (creature_ptr->sustain_str) sustained = TRUE;
2418 if (creature_ptr->sustain_int) sustained = TRUE;
2421 if (creature_ptr->sustain_wis) sustained = TRUE;
2424 if (creature_ptr->sustain_dex) sustained = TRUE;
2427 if (creature_ptr->sustain_con) sustained = TRUE;
2430 if (creature_ptr->sustain_chr) sustained = TRUE;
2433 msg_print(_("不正な状態!", "Invalid stat chosen!"));
2439 disturb(creature_ptr, FALSE, TRUE);
2440 msg_print(_("自分が衰弱していくのが分かる!", "You can feel yourself wasting away!"));
2442 (void)dec_stat(creature_ptr, which_stat, randint1(6) + 6, one_in_(3));
2445 if ((creature_ptr->muta2 & MUT2_ATT_DRAGON) && !creature_ptr->anti_magic && one_in_(3000))
2447 bool pet = one_in_(5);
2448 BIT_FLAGS mode = PM_ALLOW_GROUP;
2450 if (pet) mode |= PM_FORCE_PET;
2451 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2453 if (summon_specific((pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DRAGON, mode))
2455 msg_print(_("ドラゴンを引き寄せた!", "You have attracted a dragon!"));
2456 disturb(creature_ptr, FALSE, TRUE);
2459 if ((creature_ptr->muta2 & MUT2_WEIRD_MIND) && !creature_ptr->anti_magic && one_in_(3000))
2461 if (creature_ptr->tim_esp > 0)
2463 msg_print(_("精神にもやがかかった!", "Your mind feels cloudy!"));
2464 set_tim_esp(creature_ptr, 0, TRUE);
2468 msg_print(_("精神が広がった!", "Your mind expands!"));
2469 set_tim_esp(creature_ptr, creature_ptr->lev, FALSE);
2472 if ((creature_ptr->muta2 & MUT2_NAUSEA) && !creature_ptr->slow_digest && one_in_(9000))
2474 disturb(creature_ptr, FALSE, TRUE);
2475 msg_print(_("胃が痙攣し、食事を失った!", "Your stomach roils, and you lose your lunch!"));
2477 set_food(creature_ptr, PY_FOOD_WEAK);
2478 if (music_singing_any(creature_ptr)) stop_singing(creature_ptr);
2479 if (hex_spelling_any(creature_ptr)) stop_hex_spell_all(creature_ptr);
2482 if ((creature_ptr->muta2 & MUT2_WALK_SHAD) && !creature_ptr->anti_magic && one_in_(12000) && !creature_ptr->current_floor_ptr->inside_arena)
2484 reserve_alter_reality(creature_ptr);
2487 if ((creature_ptr->muta2 & MUT2_WARNING) && one_in_(1000))
2489 int danger_amount = 0;
2490 MONSTER_IDX monster;
2492 for (monster = 0; monster < creature_ptr->current_floor_ptr->m_max; monster++)
2494 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[monster];
2495 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2496 if (!monster_is_valid(m_ptr)) continue;
2498 if (r_ptr->level >= creature_ptr->lev)
2500 danger_amount += r_ptr->level - creature_ptr->lev + 1;
2504 if (danger_amount > 100)
2505 msg_print(_("非常に恐ろしい気がする!", "You feel utterly terrified!"));
2506 else if (danger_amount > 50)
2507 msg_print(_("恐ろしい気がする!", "You feel terrified!"));
2508 else if (danger_amount > 20)
2509 msg_print(_("非常に心配な気がする!", "You feel very worried!"));
2510 else if (danger_amount > 10)
2511 msg_print(_("心配な気がする!", "You feel paranoid!"));
2512 else if (danger_amount > 5)
2513 msg_print(_("ほとんど安全な気がする。", "You feel almost safe."));
2515 msg_print(_("寂しい気がする。", "You feel lonely."));
2518 if ((creature_ptr->muta2 & MUT2_INVULN) && !creature_ptr->anti_magic && one_in_(5000))
2520 disturb(creature_ptr, FALSE, TRUE);
2521 msg_print(_("無敵な気がする!", "You feel invincible!"));
2523 (void)set_invuln(creature_ptr, randint1(8) + 8, FALSE);
2526 if ((creature_ptr->muta2 & MUT2_SP_TO_HP) && one_in_(2000))
2528 MANA_POINT wounds = (MANA_POINT)(creature_ptr->mhp - creature_ptr->chp);
2532 HIT_POINT healing = creature_ptr->csp;
2533 if (healing > wounds) healing = wounds;
2535 hp_player(creature_ptr, healing);
2536 creature_ptr->csp -= healing;
2537 creature_ptr->redraw |= (PR_HP | PR_MANA);
2541 if ((creature_ptr->muta2 & MUT2_HP_TO_SP) && !creature_ptr->anti_magic && one_in_(4000))
2543 HIT_POINT wounds = (HIT_POINT)(creature_ptr->msp - creature_ptr->csp);
2547 HIT_POINT healing = creature_ptr->chp;
2548 if (healing > wounds) healing = wounds;
2550 creature_ptr->csp += healing;
2551 creature_ptr->redraw |= (PR_HP | PR_MANA);
2552 take_hit(creature_ptr, DAMAGE_LOSELIFE, healing, _("頭に昇った血", "blood rushing to the head"), -1);
2556 if ((creature_ptr->muta2 & MUT2_DISARM) && one_in_(10000))
2558 INVENTORY_IDX slot = 0;
2559 object_type *o_ptr = NULL;
2561 disturb(creature_ptr, FALSE, TRUE);
2562 msg_print(_("足がもつれて転んだ!", "You trip over your own feet!"));
2563 take_hit(creature_ptr, DAMAGE_NOESCAPE, randint1(creature_ptr->wt / 6), _("転倒", "tripping"), -1);
2566 if (has_melee_weapon(creature_ptr, INVEN_RARM))
2569 o_ptr = &creature_ptr->inventory_list[INVEN_RARM];
2571 if (has_melee_weapon(creature_ptr, INVEN_LARM) && one_in_(2))
2573 o_ptr = &creature_ptr->inventory_list[INVEN_LARM];
2577 else if (has_melee_weapon(creature_ptr, INVEN_LARM))
2579 o_ptr = &creature_ptr->inventory_list[INVEN_LARM];
2582 if (slot && !object_is_cursed(o_ptr))
2584 msg_print(_("武器を落としてしまった!", "You drop your weapon!"));
2585 drop_from_inventory(creature_ptr, slot, 1);
2592 * @brief 10ゲームターンが進行するごとに装備効果の発動判定を行う処理
2593 * / Handle curse effects once every 10 game turns
2596 static void process_world_aux_curse(player_type *creature_ptr)
2598 if ((creature_ptr->cursed & TRC_P_FLAG_MASK) && !creature_ptr->phase_out && !creature_ptr->wild_mode)
2601 * Hack: Uncursed teleporting items (e.g. Trump Weapons)
2602 * can actually be useful!
2604 if ((creature_ptr->cursed & TRC_TELEPORT_SELF) && one_in_(200))
2606 GAME_TEXT o_name[MAX_NLEN];
2608 int i, i_keep = 0, count = 0;
2610 /* Scan the equipment with random teleport ability */
2611 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
2613 BIT_FLAGS flgs[TR_FLAG_SIZE];
2614 o_ptr = &creature_ptr->inventory_list[i];
2615 if (!o_ptr->k_idx) continue;
2617 object_flags(o_ptr, flgs);
2619 if (have_flag(flgs, TR_TELEPORT))
2621 /* {.} will stop random teleportation. */
2622 if (!o_ptr->inscription || !my_strchr(quark_str(o_ptr->inscription), '.'))
2625 if (one_in_(count)) i_keep = i;
2630 o_ptr = &creature_ptr->inventory_list[i_keep];
2631 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2632 msg_format(_("%sがテレポートの能力を発動させようとしている。", "Your %s is activating teleportation."), o_name);
2633 if (get_check_strict(_("テレポートしますか?", "Teleport? "), CHECK_OKAY_CANCEL))
2635 disturb(creature_ptr, FALSE, TRUE);
2636 teleport_player(creature_ptr, 50, 0L);
2640 msg_format(_("%sに{.}(ピリオド)と銘を刻むと発動を抑制できます。",
2641 "You can inscribe {.} on your %s to disable random teleportation. "), o_name);
2642 disturb(creature_ptr, TRUE, TRUE);
2645 /* Make a chainsword noise */
2646 if ((creature_ptr->cursed & TRC_CHAINSWORD) && one_in_(CHAINSWORD_NOISE))
2649 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, noise))
2651 disturb(creature_ptr, FALSE, FALSE);
2654 if ((creature_ptr->cursed & TRC_TY_CURSE) && one_in_(TY_CURSE_CHANCE))
2657 (void)activate_ty_curse(creature_ptr, FALSE, &count);
2659 /* Handle experience draining */
2660 if (creature_ptr->prace != RACE_ANDROID && ((creature_ptr->cursed & TRC_DRAIN_EXP) && one_in_(4)))
2662 creature_ptr->exp -= (creature_ptr->lev + 1) / 2;
2663 if (creature_ptr->exp < 0) creature_ptr->exp = 0;
2664 creature_ptr->max_exp -= (creature_ptr->lev + 1) / 2;
2665 if (creature_ptr->max_exp < 0) creature_ptr->max_exp = 0;
2666 check_experience(creature_ptr);
2668 /* Add light curse (Later) */
2669 if ((creature_ptr->cursed & TRC_ADD_L_CURSE) && one_in_(2000))
2671 BIT_FLAGS new_curse;
2674 o_ptr = choose_cursed_obj_name(TRC_ADD_L_CURSE);
2676 new_curse = get_curse(0, o_ptr);
2677 if (!(o_ptr->curse_flags & new_curse))
2679 GAME_TEXT o_name[MAX_NLEN];
2681 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2683 o_ptr->curse_flags |= new_curse;
2684 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2686 o_ptr->feeling = FEEL_NONE;
2688 creature_ptr->update |= (PU_BONUS);
2691 /* Add heavy curse (Later) */
2692 if ((creature_ptr->cursed & TRC_ADD_H_CURSE) && one_in_(2000))
2694 BIT_FLAGS new_curse;
2697 o_ptr = choose_cursed_obj_name(TRC_ADD_H_CURSE);
2699 new_curse = get_curse(1, o_ptr);
2700 if (!(o_ptr->curse_flags & new_curse))
2702 GAME_TEXT o_name[MAX_NLEN];
2704 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2706 o_ptr->curse_flags |= new_curse;
2707 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2708 o_ptr->feeling = FEEL_NONE;
2710 creature_ptr->update |= (PU_BONUS);
2714 if ((creature_ptr->cursed & TRC_CALL_ANIMAL) && one_in_(2500))
2716 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)))
2718 GAME_TEXT o_name[MAX_NLEN];
2720 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_ANIMAL), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2721 msg_format(_("%sが動物を引き寄せた!", "Your %s has attracted an animal!"), o_name);
2722 disturb(creature_ptr, FALSE, TRUE);
2726 if ((creature_ptr->cursed & TRC_CALL_DEMON) && one_in_(1111))
2728 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)))
2730 GAME_TEXT o_name[MAX_NLEN];
2732 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DEMON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2733 msg_format(_("%sが悪魔を引き寄せた!", "Your %s has attracted a demon!"), o_name);
2734 disturb(creature_ptr, FALSE, TRUE);
2738 if ((creature_ptr->cursed & TRC_CALL_DRAGON) && one_in_(800))
2740 if (summon_specific(0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DRAGON,
2741 (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2743 GAME_TEXT o_name[MAX_NLEN];
2745 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DRAGON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2746 msg_format(_("%sがドラゴンを引き寄せた!", "Your %s has attracted an dragon!"), o_name);
2747 disturb(creature_ptr, FALSE, TRUE);
2751 if ((creature_ptr->cursed & TRC_CALL_UNDEAD) && one_in_(1111))
2753 if (summon_specific(0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_UNDEAD,
2754 (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2756 GAME_TEXT o_name[MAX_NLEN];
2758 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_UNDEAD), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2759 msg_format(_("%sが死霊を引き寄せた!", "Your %s has attracted an undead!"), o_name);
2760 disturb(creature_ptr, FALSE, TRUE);
2763 if ((creature_ptr->cursed & TRC_COWARDICE) && one_in_(1500))
2765 if (!creature_ptr->resist_fear)
2767 disturb(creature_ptr, FALSE, TRUE);
2768 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
2769 set_afraid(creature_ptr, creature_ptr->afraid + 13 + randint1(26));
2772 /* Teleport player */
2773 if ((creature_ptr->cursed & TRC_TELEPORT) && one_in_(200) && !creature_ptr->anti_tele)
2775 disturb(creature_ptr, FALSE, TRUE);
2777 /* Teleport player */
2778 teleport_player(creature_ptr, 40, TELEPORT_PASSIVE);
2780 /* Handle HP draining */
2781 if ((creature_ptr->cursed & TRC_DRAIN_HP) && one_in_(666))
2783 GAME_TEXT o_name[MAX_NLEN];
2785 object_desc(o_name, choose_cursed_obj_name(TRC_DRAIN_HP), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2786 msg_format(_("%sはあなたの体力を吸収した!", "Your %s drains HP from you!"), o_name);
2787 take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev*2, 100), o_name, -1);
2789 /* Handle mana draining */
2790 if ((creature_ptr->cursed & TRC_DRAIN_MANA) && creature_ptr->csp && one_in_(666))
2792 GAME_TEXT o_name[MAX_NLEN];
2794 object_desc(o_name, choose_cursed_obj_name(TRC_DRAIN_MANA), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2795 msg_format(_("%sはあなたの魔力を吸収した!", "Your %s drains mana from you!"), o_name);
2796 creature_ptr->csp -= MIN(creature_ptr->lev, 50);
2797 if (creature_ptr->csp < 0)
2799 creature_ptr->csp = 0;
2800 creature_ptr->csp_frac = 0;
2802 creature_ptr->redraw |= PR_MANA;
2806 /* Rarely, take damage from the Jewel of Judgement */
2807 if (one_in_(999) && !creature_ptr->anti_magic)
2809 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
2811 if (o_ptr->name1 == ART_JUDGE)
2813 if (object_is_known(o_ptr))
2814 msg_print(_("『審判の宝石』はあなたの体力を吸収した!", "The Jewel of Judgement drains life from you!"));
2816 msg_print(_("なにかがあなたの体力を吸収した!", "Something drains life from you!"));
2817 take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev, 50), _("審判の宝石", "the Jewel of Judgement"), -1);
2824 * @brief 10ゲームターンが進行するごとに魔道具の自然充填を行う処理
2825 * / Handle recharging objects once every 10 game turns
2828 static void process_world_aux_recharge(player_type *creature_ptr)
2833 /* Process equipment */
2834 for (changed = FALSE, i = INVEN_RARM; i < INVEN_TOTAL; i++)
2836 /* Get the object */
2837 object_type *o_ptr = &creature_ptr->inventory_list[i];
2838 if (!o_ptr->k_idx) continue;
2840 /* Recharge activatable objects */
2841 if (o_ptr->timeout > 0)
2846 /* Notice changes */
2847 if (!o_ptr->timeout)
2849 recharged_notice(o_ptr);
2855 /* Notice changes */
2858 creature_ptr->window |= (PW_EQUIP);
2863 * Recharge rods. Rods now use timeout to control charging status,
2864 * and each charging rod in a stack decreases the stack's timeout by
2865 * one per turn. -LM-
2867 for (changed = FALSE, i = 0; i < INVEN_PACK; i++)
2869 object_type *o_ptr = &creature_ptr->inventory_list[i];
2870 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2871 if (!o_ptr->k_idx) continue;
2873 /* Examine all charging rods or stacks of charging rods. */
2874 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2876 /* Determine how many rods are charging. */
2877 TIME_EFFECT temp = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval;
2878 if (temp > o_ptr->number) temp = (TIME_EFFECT)o_ptr->number;
2880 /* Decrease timeout by that number. */
2881 o_ptr->timeout -= temp;
2883 /* Boundary control. */
2884 if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2886 /* Notice changes, provide message if object is inscribed. */
2887 if (!(o_ptr->timeout))
2889 recharged_notice(o_ptr);
2893 /* One of the stack of rod is charged */
2894 else if (o_ptr->timeout % k_ptr->pval)
2901 /* Notice changes */
2904 creature_ptr->window |= (PW_INVEN);
2908 /* Process objects on floor */
2909 for (i = 1; i < creature_ptr->current_floor_ptr->o_max; i++)
2911 object_type *o_ptr = &creature_ptr->current_floor_ptr->o_list[i];
2913 if (!OBJECT_IS_VALID(o_ptr)) continue;
2915 /* Recharge rods on the ground. No messages. */
2916 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2919 o_ptr->timeout -= (TIME_EFFECT)o_ptr->number;
2921 /* Boundary control. */
2922 if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2929 * @brief 10ゲームターンが進行するごとに帰還や現実変容などの残り時間カウントダウンと発動を処理する。
2930 * / Handle involuntary movement once every 10 game turns
2933 static void process_world_aux_movement(player_type *creature_ptr)
2935 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
2936 /* Delayed Word-of-Recall */
2937 if (creature_ptr->word_recall)
2940 * HACK: Autosave BEFORE resetting the recall counter (rr9)
2941 * The player is yanked up/down as soon as
2942 * he loads the autosaved game.
2944 if (autosave_l && (creature_ptr->word_recall == 1) && !creature_ptr->phase_out)
2945 do_cmd_save_game(creature_ptr, TRUE);
2947 /* Count down towards recall */
2948 creature_ptr->word_recall--;
2950 creature_ptr->redraw |= (PR_STATUS);
2952 /* Activate the recall */
2953 if (!creature_ptr->word_recall)
2956 disturb(creature_ptr, FALSE, TRUE);
2958 /* Determine the level */
2959 if (floor_ptr->dun_level || creature_ptr->current_floor_ptr->inside_quest || creature_ptr->enter_dungeon)
2961 msg_print(_("上に引っ張りあげられる感じがする!", "You feel yourself yanked upwards!"));
2963 if (creature_ptr->dungeon_idx) creature_ptr->recall_dungeon = creature_ptr->dungeon_idx;
2965 exe_write_diary(creature_ptr, NIKKI_RECALL, floor_ptr->dun_level, NULL);
2967 floor_ptr->dun_level = 0;
2968 creature_ptr->dungeon_idx = 0;
2970 leave_quest_check(creature_ptr);
2971 leave_tower_check(creature_ptr);
2973 creature_ptr->current_floor_ptr->inside_quest = 0;
2975 creature_ptr->leaving = TRUE;
2979 msg_print(_("下に引きずり降ろされる感じがする!", "You feel yourself yanked downwards!"));
2981 creature_ptr->dungeon_idx = creature_ptr->recall_dungeon;
2984 exe_write_diary(creature_ptr, NIKKI_RECALL, floor_ptr->dun_level, NULL);
2987 floor_ptr->dun_level = max_dlv[creature_ptr->dungeon_idx];
2988 if (floor_ptr->dun_level < 1) floor_ptr->dun_level = 1;
2990 /* Nightmare mode makes recall more dangerous */
2991 if (ironman_nightmare && !randint0(666) && (creature_ptr->dungeon_idx == DUNGEON_ANGBAND))
2993 if (floor_ptr->dun_level < 50)
2995 floor_ptr->dun_level *= 2;
2997 else if (floor_ptr->dun_level < 99)
2999 floor_ptr->dun_level = (floor_ptr->dun_level + 99) / 2;
3001 else if (floor_ptr->dun_level > 100)
3003 floor_ptr->dun_level = d_info[creature_ptr->dungeon_idx].maxdepth - 1;
3007 if (creature_ptr->wild_mode)
3009 creature_ptr->wilderness_y = creature_ptr->y;
3010 creature_ptr->wilderness_x = creature_ptr->x;
3014 /* Save player position */
3015 creature_ptr->oldpx = creature_ptr->x;
3016 creature_ptr->oldpy = creature_ptr->y;
3018 creature_ptr->wild_mode = FALSE;
3021 * Clear all saved floors
3022 * and create a first saved floor
3024 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
3025 creature_ptr->leaving = TRUE;
3027 if (creature_ptr->dungeon_idx == DUNGEON_ANGBAND)
3031 for (i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++)
3033 quest_type* const q_ptr = &quest[i];
3036 if ((q_ptr->type == QUEST_TYPE_RANDOM) &&
3037 (q_ptr->status == QUEST_STATUS_TAKEN) &&
3038 (q_ptr->level < floor_ptr->dun_level))
3040 q_ptr->status = QUEST_STATUS_FAILED;
3041 q_ptr->complev = (byte)creature_ptr->lev;
3043 q_ptr->comptime = current_world_ptr->play_time;
3044 r_info[q_ptr->r_idx].flags1 &= ~(RF1_QUESTOR);
3050 sound(SOUND_TPLEVEL);
3055 /* Delayed Alter reality */
3056 if (creature_ptr->alter_reality)
3058 if (autosave_l && (creature_ptr->alter_reality == 1) && !creature_ptr->phase_out)
3059 do_cmd_save_game(creature_ptr, TRUE);
3061 /* Count down towards alter */
3062 creature_ptr->alter_reality--;
3064 creature_ptr->redraw |= (PR_STATUS);
3066 /* Activate the alter reality */
3067 if (!creature_ptr->alter_reality)
3070 disturb(creature_ptr, FALSE, TRUE);
3072 /* Determine the level */
3073 if (!quest_number(creature_ptr, floor_ptr->dun_level) && floor_ptr->dun_level)
3075 msg_print(_("世界が変わった!", "The world changes!"));
3078 * Clear all saved floors
3079 * and create a first saved floor
3081 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
3082 creature_ptr->leaving = TRUE;
3086 msg_print(_("世界が少しの間変化したようだ。", "The world seems to change for a moment!"));
3089 sound(SOUND_TPLEVEL);
3095 * @brief 10ゲームターンが進行する毎にゲーム世界全体の処理を行う。
3096 * / Handle certain things once every 10 game turns
3099 static void process_world(player_type *player_ptr)
3103 const s32b A_DAY = TURNS_PER_TICK * TOWN_DAWN;
3104 s32b prev_turn_in_today = ((current_world_ptr->game_turn - TURNS_PER_TICK) % A_DAY + A_DAY / 4) % A_DAY;
3105 int prev_min = (1440 * prev_turn_in_today / A_DAY) % 60;
3107 extract_day_hour_min(&day, &hour, &min);
3109 /* Update dungeon feeling, and announce it if changed */
3110 update_dungeon_feeling(player_ptr, player_ptr->current_floor_ptr);
3112 /* 帰還無しモード時のレベルテレポバグ対策 / Fix for level teleport bugs on ironman_downward.*/
3113 if (ironman_downward && (player_ptr->dungeon_idx != DUNGEON_ANGBAND && player_ptr->dungeon_idx != 0))
3115 player_ptr->current_floor_ptr->dun_level = 0;
3116 player_ptr->dungeon_idx = 0;
3117 prepare_change_floor_mode(player_ptr, CFM_FIRST_FLOOR | CFM_RAND_PLACE);
3118 player_ptr->current_floor_ptr->inside_arena = FALSE;
3119 player_ptr->wild_mode = FALSE;
3120 player_ptr->leaving = TRUE;
3123 /*** Check monster arena ***/
3124 if (player_ptr->phase_out && !player_ptr->leaving)
3130 /* Count all hostile monsters */
3131 for (i2 = 0; i2 < player_ptr->current_floor_ptr->width; ++i2)
3132 for (j2 = 0; j2 < player_ptr->current_floor_ptr->height; j2++)
3134 grid_type *g_ptr = &player_ptr->current_floor_ptr->grid_array[j2][i2];
3136 if ((g_ptr->m_idx > 0) && (g_ptr->m_idx != player_ptr->riding))
3139 win_m_idx = g_ptr->m_idx;
3143 if (number_mon == 0)
3145 msg_print(_("相打ちに終わりました。", "They have kill each other at the same time."));
3147 player_ptr->energy_need = 0;
3148 update_gambling_monsters(player_ptr);
3150 else if ((number_mon-1) == 0)
3152 GAME_TEXT m_name[MAX_NLEN];
3153 monster_type *wm_ptr;
3155 wm_ptr = &player_ptr->current_floor_ptr->m_list[win_m_idx];
3157 monster_desc(m_name, wm_ptr, 0);
3158 msg_format(_("%sが勝利した!", "%s is winner!"), m_name);
3161 if (win_m_idx == (sel_monster+1))
3163 msg_print(_("おめでとうございます。", "Congratulations."));
3164 msg_format(_("%d$を受け取った。", "You received %d gold."), battle_odds);
3165 player_ptr->au += battle_odds;
3169 msg_print(_("残念でした。", "You lost gold."));
3172 player_ptr->energy_need = 0;
3173 update_gambling_monsters(player_ptr);
3175 else if (current_world_ptr->game_turn - player_ptr->current_floor_ptr->generated_turn == 150 * TURNS_PER_TICK)
3177 msg_print(_("申し分けありませんが、この勝負は引き分けとさせていただきます。", "This battle have ended in a draw."));
3178 player_ptr->au += kakekin;
3180 player_ptr->energy_need = 0;
3181 update_gambling_monsters(player_ptr);
3185 /* Every 10 game turns */
3186 if (current_world_ptr->game_turn % TURNS_PER_TICK) return;
3188 /*** Attempt timed autosave ***/
3189 if (autosave_t && autosave_freq && !player_ptr->phase_out)
3191 if (!(current_world_ptr->game_turn % ((s32b)autosave_freq * TURNS_PER_TICK)))
3192 do_cmd_save_game(player_ptr, TRUE);
3195 if (player_ptr->current_floor_ptr->monster_noise && !ignore_unview)
3197 msg_print(_("何かが聞こえた。", "You hear noise."));
3200 /*** Handle the wilderness/town (sunshine) ***/
3202 /* While in town/wilderness */
3203 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)
3205 /* Hack -- Daybreak/Nighfall in town */
3206 if (!(current_world_ptr->game_turn % ((TURNS_PER_TICK * TOWN_DAWN) / 2)))
3210 /* Check for dawn */
3211 dawn = (!(current_world_ptr->game_turn % (TURNS_PER_TICK * TOWN_DAWN)));
3213 if (dawn) day_break(player_ptr->current_floor_ptr);
3214 else night_falls(player_ptr->current_floor_ptr);
3219 /* While in the dungeon (vanilla_town or lite_town mode only) */
3220 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)
3222 /*** Shuffle the Storekeepers ***/
3224 /* Chance is only once a day (while in dungeon) */
3225 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * STORE_TICKS)))
3227 /* Sometimes, shuffle the shop-keepers */
3228 if (one_in_(STORE_SHUFFLE))
3233 /* Pick a random shop (except home and museum) */
3236 n = randint0(MAX_STORES);
3238 while ((n == STORE_HOME) || (n == STORE_MUSEUM));
3240 /* Check every feature */
3241 for (i = 1; i < max_f_idx; i++)
3243 feature_type *f_ptr = &f_info[i];
3245 /* Skip empty index */
3246 if (!f_ptr->name) continue;
3248 /* Skip non-store features */
3249 if (!have_flag(f_ptr->flags, FF_STORE)) continue;
3251 /* Verify store type */
3252 if (f_ptr->subtype == n)
3254 if (cheat_xtra) msg_format(_("%sの店主をシャッフルします。", "Shuffle a Shopkeeper of %s."), f_name + f_ptr->name);
3267 /*** Process the monsters ***/
3269 /* Check for creature generation. */
3270 if (one_in_(d_info[player_ptr->dungeon_idx].max_m_alloc_chance) &&
3271 !player_ptr->current_floor_ptr->inside_arena && !player_ptr->current_floor_ptr->inside_quest && !player_ptr->phase_out)
3273 /* Make a new monster */
3274 (void)alloc_monster(MAX_SIGHT + 5, 0);
3277 /* Hack -- Check for creature regeneration */
3278 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 10)) && !player_ptr->phase_out) regen_monsters();
3279 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 3))) regen_captured_monsters();
3281 if (!player_ptr->leaving)
3285 /* Hack -- Process the counters of monsters if needed */
3286 for (i = 0; i < MAX_MTIMED; i++)
3288 if (player_ptr->current_floor_ptr->mproc_max[i] > 0) process_monsters_mtimed(i);
3296 if (min != prev_min)
3298 exe_write_diary(player_ptr, NIKKI_HIGAWARI, 0, NULL);
3299 determine_daily_bounty(player_ptr, FALSE);
3304 * Nightmare mode activates the TY_CURSE at midnight
3305 * Require exact minute -- Don't activate multiple times in a minute
3308 if (ironman_nightmare && (min != prev_min))
3311 /* Every 15 minutes after 11:00 pm */
3312 if ((hour == 23) && !(min % 15))
3314 disturb(player_ptr, FALSE, TRUE);
3319 msg_print(_("遠くで不気味な鐘の音が鳴った。", "You hear a distant bell toll ominously."));
3323 msg_print(_("遠くで鐘が二回鳴った。", "A distant bell sounds twice."));
3327 msg_print(_("遠くで鐘が三回鳴った。", "A distant bell sounds three times."));
3331 msg_print(_("遠くで鐘が四回鳴った。", "A distant bell tolls four times."));
3336 /* TY_CURSE activates at midnight! */
3340 disturb(player_ptr, TRUE, TRUE);
3341 msg_print(_("遠くで鐘が何回も鳴り、死んだような静けさの中へ消えていった。", "A distant bell tolls many times, fading into an deathly silence."));
3343 if (player_ptr->wild_mode)
3345 /* Go into large wilderness view */
3346 player_ptr->oldpy = randint1(MAX_HGT - 2);
3347 player_ptr->oldpx = randint1(MAX_WID - 2);
3348 change_wild_mode(player_ptr, TRUE);
3350 /* Give first move to monsters */
3351 take_turn(player_ptr, 100);
3355 player_ptr->invoking_midnight_curse = TRUE;
3359 process_world_aux_digestion(player_ptr);
3360 process_world_aux_hp_and_sp(player_ptr);
3361 process_world_aux_timeout(player_ptr);
3362 process_world_aux_light(player_ptr);
3363 process_world_aux_mutation(player_ptr);
3364 process_world_aux_curse(player_ptr);
3365 process_world_aux_recharge(player_ptr);
3366 sense_inventory1(player_ptr);
3367 sense_inventory2(player_ptr);
3368 process_world_aux_movement(player_ptr);
3372 * @brief ウィザードモードへの導入処理
3373 * / Verify use of "wizard" mode
3374 * @return 実際にウィザードモードへ移行したらTRUEを返す。
3376 static bool enter_wizard_mode(void)
3378 /* Ask first time */
3379 if (!current_world_ptr->noscore)
3381 /* Wizard mode is not permitted */
3382 if (!allow_debug_opts || arg_wizard)
3384 msg_print(_("ウィザードモードは許可されていません。 ", "Wizard mode is not permitted."));
3388 /* Mention effects */
3389 msg_print(_("ウィザードモードはデバッグと実験のためのモードです。 ", "Wizard mode is for debugging and experimenting."));
3390 msg_print(_("一度ウィザードモードに入るとスコアは記録されません。", "The game will not be scored if you enter wizard mode."));
3393 /* Verify request */
3394 if (!get_check(_("本当にウィザードモードに入りたいのですか? ", "Are you sure you want to enter wizard mode? ")))
3399 exe_write_diary(p_ptr, NIKKI_BUNSHOU, 0, _("ウィザードモードに突入してスコアを残せなくなった。", "give up recording score to enter wizard mode."));
3401 current_world_ptr->noscore |= 0x0002;
3412 * @brief デバッグコマンドへの導入処理
3413 * / Verify use of "debug" commands
3414 * @return 実際にデバッグコマンドへ移行したらTRUEを返す。
3416 static bool enter_debug_mode(void)
3418 /* Ask first time */
3419 if (!current_world_ptr->noscore)
3421 /* Debug mode is not permitted */
3422 if (!allow_debug_opts)
3424 msg_print(_("デバッグコマンドは許可されていません。 ", "Use of debug command is not permitted."));
3428 /* Mention effects */
3429 msg_print(_("デバッグ・コマンドはデバッグと実験のためのコマンドです。 ", "The debug commands are for debugging and experimenting."));
3430 msg_print(_("デバッグ・コマンドを使うとスコアは記録されません。", "The game will not be scored if you use debug commands."));
3434 /* Verify request */
3435 if (!get_check(_("本当にデバッグ・コマンドを使いますか? ", "Are you sure you want to use debug commands? ")))
3440 exe_write_diary(p_ptr, NIKKI_BUNSHOU, 0, _("デバッグモードに突入してスコアを残せなくなった。", "give up sending score to use debug commands."));
3442 current_world_ptr->noscore |= 0x0008;
3450 * Hack -- Declare the Debug Routines
3452 extern void do_cmd_debug(player_type *creature_ptr);
3454 #endif /* ALLOW_WIZARD */
3460 * @brief ボーグコマンドへの導入処理
3461 * / Verify use of "borg" commands
3462 * @return 実際にボーグコマンドへ移行したらTRUEを返す。
3464 static bool enter_borg_mode(void)
3466 /* Ask first time */
3467 if (!(current_world_ptr->noscore & 0x0010))
3469 /* Mention effects */
3470 msg_print(_("ボーグ・コマンドはデバッグと実験のためのコマンドです。 ", "The borg commands are for debugging and experimenting."));
3471 msg_print(_("ボーグ・コマンドを使うとスコアは記録されません。", "The game will not be scored if you use borg commands."));
3475 /* Verify request */
3476 if (!get_check(_("本当にボーグ・コマンドを使いますか? ", "Are you sure you want to use borg commands? ")))
3481 exe_write_diary(p_ptr, NIKKI_BUNSHOU, 0, _("ボーグ・コマンドを使用してスコアを残せなくなった。", "give up recording score to use borg commands."));
3483 current_world_ptr->noscore |= 0x0010;
3491 * Hack -- Declare the Ben Borg
3493 extern void do_cmd_borg(void);
3495 #endif /* ALLOW_BORG */
3499 * @brief プレイヤーから受けた入力コマンドの分岐処理。
3500 * / Parse and execute the current command Give "Warning" on illegal commands.
3501 * @todo Make some "blocks"
3504 static void process_command(player_type *creature_ptr)
3506 COMMAND_CODE old_now_message = now_message;
3508 /* Handle repeating the last command */
3514 if ((creature_ptr->pclass == CLASS_SNIPER) && (creature_ptr->concent))
3515 creature_ptr->reset_concent = TRUE;
3517 /* Parse the command */
3518 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
3519 switch (command_cmd)
3535 /*** Wizard Commands ***/
3538 if (current_world_ptr->wizard)
3540 current_world_ptr->wizard = FALSE;
3541 msg_print(_("ウィザードモード解除。", "Wizard mode off."));
3543 else if (enter_wizard_mode())
3545 current_world_ptr->wizard = TRUE;
3546 msg_print(_("ウィザードモード突入。", "Wizard mode on."));
3548 creature_ptr->update |= (PU_MONSTERS);
3549 creature_ptr->redraw |= (PR_TITLE);
3557 /* Special "debug" commands */
3560 if (enter_debug_mode())
3562 do_cmd_debug(creature_ptr);
3567 #endif /* ALLOW_WIZARD */
3572 /* Special "borg" commands */
3575 if (enter_borg_mode())
3577 if (!creature_ptr->wild_mode) do_cmd_borg();
3582 #endif /* ALLOW_BORG */
3586 /*** Inventory Commands ***/
3588 /* Wear/wield equipment */
3591 if (!creature_ptr->wild_mode) do_cmd_wield(creature_ptr);
3595 /* Take off equipment */
3598 if (!creature_ptr->wild_mode) do_cmd_takeoff(creature_ptr);
3605 if (!creature_ptr->wild_mode) do_cmd_drop(creature_ptr);
3609 /* Destroy an item */
3612 do_cmd_destroy(creature_ptr);
3616 /* Equipment list */
3619 do_cmd_equip(creature_ptr);
3623 /* Inventory list */
3626 do_cmd_inven(creature_ptr);
3631 /*** Various commands ***/
3633 /* Identify an object */
3636 do_cmd_observe(creature_ptr);
3642 toggle_inven_equip(creature_ptr);
3647 /*** Standard "Movement" Commands ***/
3652 if (!creature_ptr->wild_mode) do_cmd_alter(creature_ptr);
3659 if (!creature_ptr->wild_mode) do_cmd_tunnel(creature_ptr);
3663 /* Move (usually pick up things) */
3666 do_cmd_walk(creature_ptr, FALSE);
3670 /* Move (usually do not pick up) */
3673 do_cmd_walk(creature_ptr, TRUE);
3678 /*** Running, Resting, Searching, Staying */
3680 /* Begin Running -- Arg is Max Distance */
3683 if (!creature_ptr->wild_mode) do_cmd_run(creature_ptr);
3687 /* Stay still (usually pick things up) */
3690 do_cmd_stay(creature_ptr, always_pickup);
3694 /* Stay still (usually do not pick up) */
3697 do_cmd_stay(creature_ptr, !always_pickup);
3701 /* Rest -- Arg is time */
3704 do_cmd_rest(creature_ptr);
3708 /* Search for traps/doors */
3711 do_cmd_search(creature_ptr);
3717 if (creature_ptr->action == ACTION_SEARCH) set_action(creature_ptr, ACTION_NONE);
3718 else set_action(creature_ptr, ACTION_SEARCH);
3723 /*** Stairs and Doors and Chests and Traps ***/
3726 case SPECIAL_KEY_STORE:
3728 do_cmd_store(creature_ptr);
3732 /* Enter building -KMW- */
3733 case SPECIAL_KEY_BUILDING:
3735 do_cmd_bldg(creature_ptr);
3739 /* Enter quest level -KMW- */
3740 case SPECIAL_KEY_QUEST:
3742 do_cmd_quest(creature_ptr);
3746 /* Go up staircase */
3749 if (!creature_ptr->wild_mode && !floor_ptr->dun_level && !floor_ptr->inside_arena && !floor_ptr->inside_quest)
3751 if (vanilla_town) break;
3753 if (creature_ptr->ambush_flag)
3755 msg_print(_("襲撃から逃げるにはマップの端まで移動しなければならない。", "To flee the ambush you have to reach the edge of the map."));
3759 if (creature_ptr->food < PY_FOOD_WEAK)
3761 msg_print(_("その前に食事をとらないと。", "You must eat something here."));
3765 change_wild_mode(creature_ptr, FALSE);
3768 do_cmd_go_up(creature_ptr);
3772 /* Go down staircase */
3775 if (creature_ptr->wild_mode)
3776 change_wild_mode(creature_ptr, FALSE);
3778 do_cmd_go_down(creature_ptr);
3782 /* Open a door or chest */
3785 do_cmd_open(creature_ptr);
3792 do_cmd_close(creature_ptr);
3796 /* Jam a door with spikes */
3799 do_cmd_spike(creature_ptr);
3806 do_cmd_bash(creature_ptr);
3810 /* Disarm a trap or chest */
3813 do_cmd_disarm(creature_ptr);
3818 /*** Magic and Prayers ***/
3820 /* Gain new spells/prayers */
3823 if ((creature_ptr->pclass == CLASS_SORCERER) || (creature_ptr->pclass == CLASS_RED_MAGE))
3824 msg_print(_("呪文を学習する必要はない!", "You don't have to learn spells!"));
3825 else if (creature_ptr->pclass == CLASS_SAMURAI)
3826 do_cmd_gain_hissatsu(creature_ptr);
3827 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3828 import_magic_device(creature_ptr);
3830 do_cmd_study(creature_ptr);
3837 if ( (creature_ptr->pclass == CLASS_MINDCRAFTER) ||
3838 (creature_ptr->pclass == CLASS_BERSERKER) ||
3839 (creature_ptr->pclass == CLASS_NINJA) ||
3840 (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3841 ) do_cmd_mind_browse(creature_ptr);
3842 else if (creature_ptr->pclass == CLASS_SMITH)
3843 do_cmd_kaji(creature_ptr, TRUE);
3844 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3845 do_cmd_magic_eater(creature_ptr, TRUE, FALSE);
3846 else if (creature_ptr->pclass == CLASS_SNIPER)
3847 do_cmd_snipe_browse(creature_ptr);
3848 else do_cmd_browse(creature_ptr);
3856 if (!creature_ptr->wild_mode)
3858 if ((creature_ptr->pclass == CLASS_WARRIOR) || (creature_ptr->pclass == CLASS_ARCHER) || (creature_ptr->pclass == CLASS_CAVALRY))
3860 msg_print(_("呪文を唱えられない!", "You cannot cast spells!"));
3862 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))
3864 msg_print(_("ダンジョンが魔法を吸収した!", "The dungeon absorbs all attempted magic!"));
3867 else if (creature_ptr->anti_magic && (creature_ptr->pclass != CLASS_BERSERKER) && (creature_ptr->pclass != CLASS_SMITH))
3869 concptr which_power = _("魔法", "magic");
3870 if (creature_ptr->pclass == CLASS_MINDCRAFTER)
3871 which_power = _("超能力", "psionic powers");
3872 else if (creature_ptr->pclass == CLASS_IMITATOR)
3873 which_power = _("ものまね", "imitation");
3874 else if (creature_ptr->pclass == CLASS_SAMURAI)
3875 which_power = _("必殺剣", "hissatsu");
3876 else if (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3877 which_power = _("鏡魔法", "mirror magic");
3878 else if (creature_ptr->pclass == CLASS_NINJA)
3879 which_power = _("忍術", "ninjutsu");
3880 else if (mp_ptr->spell_book == TV_LIFE_BOOK)
3881 which_power = _("祈り", "prayer");
3883 msg_format(_("反魔法バリアが%sを邪魔した!", "An anti-magic shell disrupts your %s!"), which_power);
3884 free_turn(creature_ptr);
3886 else if (creature_ptr->shero && (creature_ptr->pclass != CLASS_BERSERKER))
3888 msg_format(_("狂戦士化していて頭が回らない!", "You cannot think directly!"));
3889 free_turn(creature_ptr);
3893 if ((creature_ptr->pclass == CLASS_MINDCRAFTER) ||
3894 (creature_ptr->pclass == CLASS_BERSERKER) ||
3895 (creature_ptr->pclass == CLASS_NINJA) ||
3896 (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3898 do_cmd_mind(creature_ptr);
3899 else if (creature_ptr->pclass == CLASS_IMITATOR)
3900 do_cmd_mane(creature_ptr, FALSE);
3901 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3902 do_cmd_magic_eater(creature_ptr, FALSE, FALSE);
3903 else if (creature_ptr->pclass == CLASS_SAMURAI)
3904 do_cmd_hissatsu(creature_ptr);
3905 else if (creature_ptr->pclass == CLASS_BLUE_MAGE)
3906 do_cmd_cast_learned(creature_ptr);
3907 else if (creature_ptr->pclass == CLASS_SMITH)
3908 do_cmd_kaji(creature_ptr, FALSE);
3909 else if (creature_ptr->pclass == CLASS_SNIPER)
3910 do_cmd_snipe(creature_ptr);
3912 do_cmd_cast(creature_ptr);
3918 /* Issue a pet command */
3921 do_cmd_pet(creature_ptr);
3925 /*** Use various objects ***/
3927 /* Inscribe an object */
3930 do_cmd_inscribe(creature_ptr);
3934 /* Uninscribe an object */
3937 do_cmd_uninscribe(creature_ptr);
3941 /* Activate an artifact */
3944 do_cmd_activate(creature_ptr);
3951 do_cmd_eat_food(creature_ptr);
3955 /* Fuel your lantern/torch */
3958 do_cmd_refill(creature_ptr);
3965 do_cmd_fire(creature_ptr, SP_NONE);
3972 do_cmd_throw(creature_ptr, 1, FALSE, -1);
3979 do_cmd_aim_wand(creature_ptr);
3986 if (use_command && rogue_like_commands)
3988 do_cmd_use(creature_ptr);
3992 do_cmd_zap_rod(creature_ptr);
3997 /* Quaff a potion */
4000 do_cmd_quaff_potion(creature_ptr);
4007 do_cmd_read_scroll(creature_ptr);
4014 if (use_command && !rogue_like_commands)
4015 do_cmd_use(creature_ptr);
4017 do_cmd_use_staff(creature_ptr);
4021 /* Use racial power */
4024 do_cmd_racial_power(creature_ptr);
4029 /*** Looking at Things (nearby or on map) ***/
4031 /* Full dungeon map */
4038 /* Locate player on map */
4041 do_cmd_locate(creature_ptr);
4048 do_cmd_look(creature_ptr);
4052 /* Target monster or location */
4055 do_cmd_target(creature_ptr);
4061 /*** Help and Such ***/
4066 do_cmd_help(creature_ptr);
4070 /* Identify symbol */
4073 do_cmd_query_symbol(creature_ptr);
4077 /* Character description */
4080 do_cmd_player_status(creature_ptr);
4085 /*** System Commands ***/
4087 /* Hack -- User interface */
4094 /* Single line from a pref file */
4097 do_cmd_pref(creature_ptr);
4103 do_cmd_reload_autopick(creature_ptr);
4109 do_cmd_edit_autopick(creature_ptr);
4113 /* Interact with macros */
4116 do_cmd_macros(creature_ptr);
4120 /* Interact with visuals */
4123 do_cmd_visuals(creature_ptr);
4124 do_cmd_redraw(creature_ptr);
4128 /* Interact with colors */
4131 do_cmd_colors(creature_ptr);
4132 do_cmd_redraw(creature_ptr);
4136 /* Interact with options */
4140 (void)combine_and_reorder_home(STORE_HOME);
4141 do_cmd_redraw(creature_ptr);
4145 /*** Misc Commands ***/
4161 /* Repeat level feeling */
4164 do_cmd_feeling(creature_ptr);
4168 /* Show previous message */
4171 do_cmd_message_one();
4175 /* Show previous messages */
4178 do_cmd_messages(old_now_message);
4182 /* Show quest status -KMW- */
4185 do_cmd_checkquest(creature_ptr);
4189 /* Redraw the screen */
4192 now_message = old_now_message;
4193 do_cmd_redraw(creature_ptr);
4197 #ifndef VERIFY_SAVEFILE
4199 /* Hack -- Save and don't quit */
4202 do_cmd_save_game(creature_ptr, FALSE);
4206 #endif /* VERIFY_SAVEFILE */
4210 do_cmd_time(creature_ptr);
4216 case SPECIAL_KEY_QUIT:
4218 do_cmd_save_and_exit(creature_ptr);
4222 /* Quit (commit suicide) */
4225 do_cmd_suicide(creature_ptr);
4231 do_cmd_diary(creature_ptr);
4235 /* Check artifacts, uniques, objects */
4238 do_cmd_knowledge(creature_ptr);
4242 /* Load "screen dump" */
4245 do_cmd_load_screen();
4249 /* Save "screen dump" */
4252 do_cmd_save_screen(creature_ptr);
4256 /* Record/stop "Movie" */
4259 prepare_movie_hooks();
4263 /* Make random artifact list */
4266 spoil_random_artifact(creature_ptr, "randifact.txt");
4273 if (!creature_ptr->wild_mode) do_cmd_travel(creature_ptr);
4274 if (creature_ptr->special_defense & KATA_MUSOU)
4276 set_action(creature_ptr, ACTION_NONE);
4282 /* Hack -- Unknown command */
4285 if (flush_failure) flush();
4289 sound(SOUND_ILLEGAL);
4290 if (!get_rnd_line(_("error_j.txt", "error.txt"), 0, error_m))
4295 prt(_(" '?' でヘルプが表示されます。", "Type '?' for help."), 0, 0);
4301 if (!creature_ptr->energy_use && !now_message)
4302 now_message = old_now_message;
4306 * @brief アイテムの所持種類数が超えた場合にアイテムを床に落とす処理 / Hack -- Pack Overflow
4309 static void pack_overflow(player_type *owner_ptr)
4311 if (owner_ptr->inventory_list[INVEN_PACK].k_idx == 0) return;
4313 GAME_TEXT o_name[MAX_NLEN];
4316 /* Is auto-destroy done? */
4317 update_creature(owner_ptr);
4318 if (!owner_ptr->inventory_list[INVEN_PACK].k_idx) return;
4320 /* Access the slot to be dropped */
4321 o_ptr = &owner_ptr->inventory_list[INVEN_PACK];
4323 disturb(owner_ptr, FALSE, TRUE);
4326 msg_print(_("ザックからアイテムがあふれた!", "Your pack overflows!"));
4327 object_desc(o_name, o_ptr, 0);
4329 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(INVEN_PACK));
4331 /* Drop it (carefully) near the player */
4332 (void)drop_near(owner_ptr, o_ptr, 0, owner_ptr->y, owner_ptr->x);
4334 vary_item(owner_ptr, INVEN_PACK, -255);
4335 handle_stuff(owner_ptr);
4339 * @brief プレイヤーの行動エネルギーが充填される(=プレイヤーのターンが回る)毎に行われる処理 / process the effects per 100 energy at player speed.
4342 static void process_upkeep_with_speed(player_type *creature_ptr)
4344 /* Give the player some energy */
4345 if (!load && creature_ptr->enchant_energy_need > 0 && !creature_ptr->leaving)
4347 creature_ptr->enchant_energy_need -= SPEED_TO_ENERGY(creature_ptr->pspeed);
4351 if (creature_ptr->enchant_energy_need > 0) return;
4353 while (creature_ptr->enchant_energy_need <= 0)
4355 /* Handle the player song */
4356 if (!load) check_music(creature_ptr);
4358 /* Hex - Handle the hex spells */
4359 if (!load) check_hex(creature_ptr);
4360 if (!load) revenge_spell(creature_ptr);
4362 /* There is some randomness of needed energy */
4363 creature_ptr->enchant_energy_need += ENERGY_NEED();
4367 static void process_fishing(player_type *creature_ptr)
4369 Term_xtra(TERM_XTRA_DELAY, 10);
4373 bool success = FALSE;
4374 get_mon_num_prep(monster_is_fishing_target, NULL);
4375 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);
4377 if (r_idx && one_in_(2))
4380 y = creature_ptr->y + ddy[creature_ptr->fishing_dir];
4381 x = creature_ptr->x + ddx[creature_ptr->fishing_dir];
4382 if (place_monster_aux(0, y, x, r_idx, PM_NO_KAGE))
4384 GAME_TEXT m_name[MAX_NLEN];
4385 monster_desc(m_name, &creature_ptr->current_floor_ptr->m_list[creature_ptr->current_floor_ptr->grid_array[y][x].m_idx], 0);
4386 msg_format(_("%sが釣れた!", "You have a good catch!"), m_name);
4392 msg_print(_("餌だけ食われてしまった!くっそ~!", "Damn! The fish stole your bait!"));
4394 disturb(creature_ptr, FALSE, TRUE);
4399 * @brief プレイヤーの行動処理 / Process the player
4402 * Notice the annoying code to handle "pack overflow", which\n
4403 * must come first just in case somebody manages to corrupt\n
4404 * the savefiles by clever use of menu commands or something.\n
4406 static void process_player(player_type *creature_ptr)
4410 /*** Apply energy ***/
4412 if (creature_ptr->hack_mutation)
4414 msg_print(_("何か変わった気がする!", "You feel different!"));
4416 (void)gain_mutation(creature_ptr, 0);
4417 creature_ptr->hack_mutation = FALSE;
4420 if (creature_ptr->invoking_midnight_curse)
4423 activate_ty_curse(creature_ptr, FALSE, &count);
4424 creature_ptr->invoking_midnight_curse = FALSE;
4427 if (creature_ptr->phase_out)
4429 for(m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
4431 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
4433 if (!monster_is_valid(m_ptr)) continue;
4435 m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
4436 update_monster(creature_ptr, m_idx, FALSE);
4441 /* Give the player some energy */
4442 else if (!(load && creature_ptr->energy_need <= 0))
4444 creature_ptr->energy_need -= SPEED_TO_ENERGY(creature_ptr->pspeed);
4448 if (creature_ptr->energy_need > 0) return;
4449 if (!command_rep) prt_time();
4451 /*** Check for interupts ***/
4453 /* Complete resting */
4454 if (creature_ptr->resting < 0)
4457 if (creature_ptr->resting == COMMAND_ARG_REST_FULL_HEALING)
4460 if ((creature_ptr->chp == creature_ptr->mhp) &&
4461 (creature_ptr->csp >= creature_ptr->msp))
4463 set_action(creature_ptr, ACTION_NONE);
4467 /* Complete resting */
4468 else if (creature_ptr->resting == COMMAND_ARG_REST_UNTIL_DONE)
4471 if ((creature_ptr->chp == creature_ptr->mhp) &&
4472 (creature_ptr->csp >= creature_ptr->msp) &&
4473 !creature_ptr->blind && !creature_ptr->confused &&
4474 !creature_ptr->poisoned && !creature_ptr->afraid &&
4475 !creature_ptr->stun && !creature_ptr->cut &&
4476 !creature_ptr->slow && !creature_ptr->paralyzed &&
4477 !creature_ptr->image && !creature_ptr->word_recall &&
4478 !creature_ptr->alter_reality)
4480 set_action(creature_ptr, ACTION_NONE);
4485 if (creature_ptr->action == ACTION_FISH) process_fishing(creature_ptr);
4487 /* Handle "abort" */
4490 /* Check for "player abort" (semi-efficiently for resting) */
4491 if (creature_ptr->running || travel.run || command_rep || (creature_ptr->action == ACTION_REST) || (creature_ptr->action == ACTION_FISH))
4496 /* Check for a key */
4499 flush(); /* Flush input */
4501 disturb(creature_ptr, FALSE, TRUE);
4503 /* Hack -- Show a Message */
4504 msg_print(_("中断しました。", "Canceled."));
4509 if (creature_ptr->riding && !creature_ptr->confused && !creature_ptr->blind)
4511 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
4512 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4514 if (MON_CSLEEP(m_ptr))
4516 GAME_TEXT m_name[MAX_NLEN];
4519 (void)set_monster_csleep(creature_ptr->riding, 0);
4520 monster_desc(m_name, m_ptr, 0);
4521 msg_format(_("%^sを起こした。", "You have woken %s up."), m_name);
4524 if (MON_STUNNED(m_ptr))
4526 /* Hack -- Recover from stun */
4527 if (set_monster_stunned(creature_ptr->riding,
4528 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_STUNNED(m_ptr) - 1)))
4530 GAME_TEXT m_name[MAX_NLEN];
4531 monster_desc(m_name, m_ptr, 0);
4532 msg_format(_("%^sを朦朧状態から立ち直らせた。", "%^s is no longer stunned."), m_name);
4536 if (MON_CONFUSED(m_ptr))
4538 /* Hack -- Recover from confusion */
4539 if (set_monster_confused(creature_ptr->riding,
4540 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_CONFUSED(m_ptr) - 1)))
4542 GAME_TEXT m_name[MAX_NLEN];
4543 monster_desc(m_name, m_ptr, 0);
4544 msg_format(_("%^sを混乱状態から立ち直らせた。", "%^s is no longer confused."), m_name);
4548 if (MON_MONFEAR(m_ptr))
4550 /* Hack -- Recover from fear */
4551 if(set_monster_monfear(creature_ptr->riding,
4552 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_MONFEAR(m_ptr) - 1)))
4554 GAME_TEXT m_name[MAX_NLEN];
4555 monster_desc(m_name, m_ptr, 0);
4556 msg_format(_("%^sを恐怖から立ち直らせた。", "%^s is no longer afraid."), m_name);
4560 handle_stuff(creature_ptr);
4566 if (creature_ptr->lightspeed)
4568 (void)set_lightspeed(creature_ptr, creature_ptr->lightspeed - 1, TRUE);
4570 if ((creature_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
4572 if(P_PTR_KI < 40) P_PTR_KI = 0;
4573 else P_PTR_KI -= 40;
4574 creature_ptr->update |= (PU_BONUS);
4576 if (creature_ptr->action == ACTION_LEARN)
4579 u32b cost_frac = (creature_ptr->msp + 30L) * 256L;
4581 /* Convert the unit (1/2^16) to (1/2^32) */
4582 s64b_LSHIFT(cost, cost_frac, 16);
4584 if (s64b_cmp(creature_ptr->csp, creature_ptr->csp_frac, cost, cost_frac) < 0)
4587 creature_ptr->csp = 0;
4588 creature_ptr->csp_frac = 0;
4589 set_action(creature_ptr, ACTION_NONE);
4594 s64b_sub(&(creature_ptr->csp), &(creature_ptr->csp_frac), cost, cost_frac);
4596 creature_ptr->redraw |= PR_MANA;
4599 if (creature_ptr->special_defense & KATA_MASK)
4601 if (creature_ptr->special_defense & KATA_MUSOU)
4603 if (creature_ptr->csp < 3)
4605 set_action(creature_ptr, ACTION_NONE);
4609 creature_ptr->csp -= 2;
4610 creature_ptr->redraw |= (PR_MANA);
4615 /*** Handle actual user input ***/
4617 /* Repeat until out of energy */
4618 while (creature_ptr->energy_need <= 0)
4620 creature_ptr->window |= PW_PLAYER;
4621 creature_ptr->sutemi = FALSE;
4622 creature_ptr->counter = FALSE;
4623 creature_ptr->now_damaged = FALSE;
4625 handle_stuff(creature_ptr);
4627 /* Place the cursor on the player */
4628 move_cursor_relative(creature_ptr->y, creature_ptr->x);
4630 /* Refresh (optional) */
4631 if (fresh_before) Term_fresh();
4633 /* Hack -- Pack Overflow */
4634 pack_overflow(creature_ptr);
4636 /* Hack -- cancel "lurking browse mode" */
4637 if (!command_new) command_see = FALSE;
4639 /* Assume free turn */
4640 free_turn(creature_ptr);
4642 if (creature_ptr->phase_out)
4644 /* Place the cursor on the player */
4645 move_cursor_relative(creature_ptr->y, creature_ptr->x);
4647 command_cmd = SPECIAL_KEY_BUILDING;
4649 /* Process the command */
4650 process_command(creature_ptr);
4653 /* Paralyzed or Knocked Out */
4654 else if (creature_ptr->paralyzed || (creature_ptr->stun >= 100))
4656 take_turn(creature_ptr, 100);
4660 else if (creature_ptr->action == ACTION_REST)
4663 if (creature_ptr->resting > 0)
4665 /* Reduce rest count */
4666 creature_ptr->resting--;
4668 if (!creature_ptr->resting) set_action(creature_ptr, ACTION_NONE);
4669 creature_ptr->redraw |= (PR_STATE);
4672 take_turn(creature_ptr, 100);
4676 else if (creature_ptr->action == ACTION_FISH)
4678 take_turn(creature_ptr, 100);
4682 else if (creature_ptr->running)
4685 run_step(creature_ptr, 0);
4690 else if (travel.run)
4693 travel_step(creature_ptr);
4697 /* Repeated command */
4698 else if (command_rep)
4700 /* Count this execution */
4703 creature_ptr->redraw |= (PR_STATE);
4704 handle_stuff(creature_ptr);
4706 /* Hack -- Assume messages were seen */
4709 /* Clear the top line */
4712 /* Process the command */
4713 process_command(creature_ptr);
4716 /* Normal command */
4719 /* Place the cursor on the player */
4720 move_cursor_relative(creature_ptr->y, creature_ptr->x);
4723 /* Get a command (normal) */
4724 request_command(FALSE);
4727 /* Process the command */
4728 process_command(creature_ptr);
4731 /* Hack -- Pack Overflow */
4732 pack_overflow(creature_ptr);
4737 if (creature_ptr->energy_use)
4739 /* Use some energy */
4740 if (creature_ptr->timewalk || creature_ptr->energy_use > 400)
4742 /* The Randomness is irrelevant */
4743 creature_ptr->energy_need += creature_ptr->energy_use * TURNS_PER_TICK / 10;
4747 /* There is some randomness of needed energy */
4748 creature_ptr->energy_need += (s16b)((s32b)creature_ptr->energy_use * ENERGY_NEED() / 100L);
4751 /* Hack -- constant hallucination */
4752 if (creature_ptr->image) creature_ptr->redraw |= (PR_MAP);
4754 /* Shimmer multi-hued monsters */
4755 for (m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
4757 monster_type *m_ptr;
4758 monster_race *r_ptr;
4760 m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
4761 if (!monster_is_valid(m_ptr)) continue;
4763 /* Skip unseen monsters */
4764 if (!m_ptr->ml) continue;
4766 /* Access the monster race */
4767 r_ptr = &r_info[m_ptr->ap_r_idx];
4769 /* Skip non-multi-hued monsters */
4770 if (!(r_ptr->flags1 & (RF1_ATTR_MULTI | RF1_SHAPECHANGER)))
4773 /* Redraw regardless */
4774 lite_spot(m_ptr->fy, m_ptr->fx);
4778 /* Handle monster detection */
4779 if (repair_monsters)
4781 /* Reset the flag */
4782 repair_monsters = FALSE;
4784 /* Rotate detection flags */
4785 for (m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
4787 monster_type *m_ptr;
4788 m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
4789 if (!monster_is_valid(m_ptr)) continue;
4791 /* Nice monsters get mean */
4792 if (m_ptr->mflag & MFLAG_NICE)
4794 /* Nice monsters get mean */
4795 m_ptr->mflag &= ~(MFLAG_NICE);
4798 /* Handle memorized monsters */
4799 if (m_ptr->mflag2 & MFLAG2_MARK)
4801 /* Maintain detection */
4802 if (m_ptr->mflag2 & MFLAG2_SHOW)
4805 m_ptr->mflag2 &= ~(MFLAG2_SHOW);
4807 /* Still need repairs */
4808 repair_monsters = TRUE;
4811 /* Remove detection */
4815 m_ptr->mflag2 &= ~(MFLAG2_MARK);
4817 /* Assume invisible */
4819 update_monster(creature_ptr, m_idx, FALSE);
4821 if (creature_ptr->health_who == m_idx) creature_ptr->redraw |= (PR_HEALTH);
4822 if (creature_ptr->riding == m_idx) creature_ptr->redraw |= (PR_UHEALTH);
4824 /* Redraw regardless */
4825 lite_spot(m_ptr->fy, m_ptr->fx);
4830 if (creature_ptr->pclass == CLASS_IMITATOR)
4833 if (creature_ptr->mane_num > (creature_ptr->lev > 44 ? 3 : creature_ptr->lev > 29 ? 2 : 1))
4835 creature_ptr->mane_num--;
4836 for (j = 0; j < creature_ptr->mane_num; j++)
4838 creature_ptr->mane_spell[j] = creature_ptr->mane_spell[j + 1];
4839 creature_ptr->mane_dam[j] = creature_ptr->mane_dam[j + 1];
4842 creature_ptr->new_mane = FALSE;
4843 creature_ptr->redraw |= (PR_IMITATION);
4845 if (creature_ptr->action == ACTION_LEARN)
4847 creature_ptr->new_mane = FALSE;
4848 creature_ptr->redraw |= (PR_STATE);
4851 if (creature_ptr->timewalk && (creature_ptr->energy_need > - 1000))
4854 creature_ptr->redraw |= (PR_MAP);
4855 creature_ptr->update |= (PU_MONSTERS);
4856 creature_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
4858 msg_print(_("「時は動きだす…」", "You feel time flowing around you once more."));
4860 creature_ptr->timewalk = FALSE;
4861 creature_ptr->energy_need = ENERGY_NEED();
4863 handle_stuff(creature_ptr);
4867 /* Hack -- notice death */
4868 if (!creature_ptr->playing || creature_ptr->is_dead)
4870 creature_ptr->timewalk = FALSE;
4875 if (creature_ptr->energy_use && creature_ptr->reset_concent) reset_concentration(creature_ptr, TRUE);
4877 /* Handle "leaving" */
4878 if (creature_ptr->leaving) break;
4881 /* Update scent trail */
4882 update_smell(creature_ptr->current_floor_ptr, creature_ptr);
4886 * @brief 現在プレイヤーがいるダンジョンの全体処理 / Interact with the current dungeon level.
4890 * この関数から現在の階層を出る、プレイヤーがキャラが死ぬ、
4891 * ゲームを終了するかのいずれかまでループする。
4894 * This function will not exit until the level is completed,\n
4895 * the user dies, or the game is terminated.\n
4898 static void dungeon(player_type *player_ptr, bool load_game)
4902 /* Set the base level */
4903 player_ptr->current_floor_ptr->base_level = player_ptr->current_floor_ptr->dun_level;
4905 /* Reset various flags */
4906 current_world_ptr->is_loading_now = FALSE;
4909 player_ptr->leaving = FALSE;
4911 /* Reset the "command" vars */
4914 #if 0 /* Don't reset here --- It's used for Arena */
4923 /* Cancel the target */
4925 player_ptr->pet_t_m_idx = 0;
4926 player_ptr->riding_t_m_idx = 0;
4927 player_ptr->ambush_flag = FALSE;
4929 /* Cancel the health bar */
4932 /* Check visual effects */
4933 repair_monsters = TRUE;
4934 repair_objects = TRUE;
4937 disturb(player_ptr, TRUE, TRUE);
4939 /* Get index of current quest (if any) */
4940 quest_num = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
4942 /* Inside a quest? */
4945 /* Mark the quest monster */
4946 r_info[quest[quest_num].r_idx].flags1 |= RF1_QUESTOR;
4949 /* Track maximum player level */
4950 if (player_ptr->max_plv < player_ptr->lev)
4952 player_ptr->max_plv = player_ptr->lev;
4956 /* Track maximum dungeon level (if not in quest -KMW-) */
4957 if ((max_dlv[player_ptr->dungeon_idx] < player_ptr->current_floor_ptr->dun_level) && !player_ptr->current_floor_ptr->inside_quest)
4959 max_dlv[player_ptr->dungeon_idx] = player_ptr->current_floor_ptr->dun_level;
4960 if (record_maxdepth) exe_write_diary(player_ptr, NIKKI_MAXDEAPTH, player_ptr->current_floor_ptr->dun_level, NULL);
4963 (void)calculate_upkeep(player_ptr);
4965 /* Validate the panel */
4966 panel_bounds_center();
4968 /* Verify the panel */
4974 /* Enter "xtra" mode */
4975 current_world_ptr->character_xtra = TRUE;
4977 player_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER | PW_MONSTER | PW_OVERHEAD | PW_DUNGEON);
4978 player_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_EQUIPPY | PR_MAP);
4979 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);
4981 handle_stuff(player_ptr);
4983 /* Leave "xtra" mode */
4984 current_world_ptr->character_xtra = FALSE;
4986 player_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
4987 player_ptr->update |= (PU_COMBINE | PU_REORDER);
4988 handle_stuff(player_ptr);
4991 if (quest_num && (is_fixed_quest_idx(quest_num) &&
4992 !((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT) ||
4993 !(quest[quest_num].flags & QUEST_FLAG_PRESET)))) do_cmd_feeling(player_ptr);
4995 if (player_ptr->phase_out)
4999 player_ptr->energy_need = 0;
5000 update_gambling_monsters(player_ptr);
5004 msg_print(_("試合開始!", "Ready..Fight!"));
5009 if ((player_ptr->pclass == CLASS_BARD) && (SINGING_SONG_EFFECT(player_ptr) > MUSIC_DETECT))
5010 SINGING_SONG_EFFECT(player_ptr) = MUSIC_DETECT;
5012 /* Hack -- notice death or departure */
5013 if (!player_ptr->playing || player_ptr->is_dead) return;
5015 /* Print quest message if appropriate */
5016 if (!player_ptr->current_floor_ptr->inside_quest && (player_ptr->dungeon_idx == DUNGEON_ANGBAND))
5018 quest_discovery(random_quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level));
5019 player_ptr->current_floor_ptr->inside_quest = random_quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
5021 if ((player_ptr->current_floor_ptr->dun_level == d_info[player_ptr->dungeon_idx].maxdepth) && d_info[player_ptr->dungeon_idx].final_guardian)
5023 if (r_info[d_info[player_ptr->dungeon_idx].final_guardian].max_num)
5025 msg_format("この階には%sの主である%sが棲んでいる。",
5026 d_name+d_info[player_ptr->dungeon_idx].name,
5027 r_name+r_info[d_info[player_ptr->dungeon_idx].final_guardian].name);
5029 msg_format("%^s lives in this level as the keeper of %s.",
5030 r_name+r_info[d_info[player_ptr->dungeon_idx].final_guardian].name,
5031 d_name+d_info[player_ptr->dungeon_idx].name);
5035 if (!load_game && (player_ptr->special_defense & NINJA_S_STEALTH)) set_superstealth(player_ptr, FALSE);
5037 /*** Process this dungeon level ***/
5039 /* Reset the monster generation level */
5040 player_ptr->current_floor_ptr->monster_level = player_ptr->current_floor_ptr->base_level;
5042 /* Reset the object generation level */
5043 player_ptr->current_floor_ptr->object_level = player_ptr->current_floor_ptr->base_level;
5045 current_world_ptr->is_loading_now = TRUE;
5047 if (player_ptr->energy_need > 0 && !player_ptr->phase_out &&
5048 (player_ptr->current_floor_ptr->dun_level || player_ptr->leaving_dungeon || player_ptr->current_floor_ptr->inside_arena))
5049 player_ptr->energy_need = 0;
5051 /* Not leaving dungeon */
5052 player_ptr->leaving_dungeon = FALSE;
5054 /* Initialize monster process */
5060 /* Hack -- Compact the monster list occasionally */
5061 if ((player_ptr->current_floor_ptr->m_cnt + 32 > current_world_ptr->max_m_idx) && !player_ptr->phase_out) compact_monsters(64);
5063 /* Hack -- Compress the monster list occasionally */
5064 if ((player_ptr->current_floor_ptr->m_cnt + 32 < player_ptr->current_floor_ptr->m_max) && !player_ptr->phase_out) compact_monsters(0);
5067 /* Hack -- Compact the object list occasionally */
5068 if (player_ptr->current_floor_ptr->o_cnt + 32 > current_world_ptr->max_o_idx) compact_objects(player_ptr->current_floor_ptr, 64);
5070 /* Hack -- Compress the object list occasionally */
5071 if (player_ptr->current_floor_ptr->o_cnt + 32 < player_ptr->current_floor_ptr->o_max) compact_objects(player_ptr->current_floor_ptr, 0);
5073 /* Process the player */
5074 process_player(player_ptr);
5075 process_upkeep_with_speed(player_ptr);
5077 handle_stuff(player_ptr);
5079 /* Hack -- Hilite the player */
5080 move_cursor_relative(player_ptr->y, player_ptr->x);
5082 /* Optional fresh */
5083 if (fresh_after) Term_fresh();
5085 /* Hack -- Notice death or departure */
5086 if (!player_ptr->playing || player_ptr->is_dead) break;
5088 /* Process all of the monsters */
5089 process_monsters(player_ptr);
5091 handle_stuff(player_ptr);
5093 /* Hack -- Hilite the player */
5094 move_cursor_relative(player_ptr->y, player_ptr->x);
5096 /* Optional fresh */
5097 if (fresh_after) Term_fresh();
5099 /* Hack -- Notice death or departure */
5100 if (!player_ptr->playing || player_ptr->is_dead) break;
5102 /* Process the world */
5103 process_world(player_ptr);
5105 handle_stuff(player_ptr);
5107 /* Hack -- Hilite the player */
5108 move_cursor_relative(player_ptr->y, player_ptr->x);
5110 /* Optional fresh */
5111 if (fresh_after) Term_fresh();
5113 /* Hack -- Notice death or departure */
5114 if (!player_ptr->playing || player_ptr->is_dead) break;
5116 /* Count game turns */
5117 current_world_ptr->game_turn++;
5119 if (current_world_ptr->dungeon_turn < current_world_ptr->dungeon_turn_limit)
5121 if (!player_ptr->wild_mode || wild_regen) current_world_ptr->dungeon_turn++;
5122 else if (player_ptr->wild_mode && !(current_world_ptr->game_turn % ((MAX_HGT + MAX_WID) / 2))) current_world_ptr->dungeon_turn++;
5125 prevent_turn_overflow();
5127 /* Handle "leaving" */
5128 if (player_ptr->leaving) break;
5130 if (wild_regen) wild_regen--;
5133 /* Inside a quest and non-unique questor? */
5134 if (quest_num && !(r_info[quest[quest_num].r_idx].flags1 & RF1_UNIQUE))
5136 /* Un-mark the quest monster */
5137 r_info[quest[quest_num].r_idx].flags1 &= ~RF1_QUESTOR;
5140 /* Not save-and-quit and not dead? */
5141 if (player_ptr->playing && !player_ptr->is_dead)
5144 * Maintain Unique monsters and artifact, save current
5145 * floor, then prepare next floor
5147 leave_floor(player_ptr);
5149 /* Forget the flag */
5150 reinit_wilderness = FALSE;
5153 /* Write about current level on the play record once per level */
5159 * @brief 全ユーザプロファイルをロードする / Load some "user pref files"
5160 * @paaram player_ptr プレーヤーへの参照ポインタ
5163 * Modified by Arcum Dagsson to support
5164 * separate macro files for different realms.
5166 static void load_all_pref_files(player_type *player_ptr)
5170 /* Access the "user" pref file */
5171 sprintf(buf, "user.prf");
5173 /* Process that file */
5174 process_pref_file(player_ptr, buf);
5176 /* Access the "user" system pref file */
5177 sprintf(buf, "user-%s.prf", ANGBAND_SYS);
5179 /* Process that file */
5180 process_pref_file(player_ptr, buf);
5182 /* Access the "race" pref file */
5183 sprintf(buf, "%s.prf", rp_ptr->title);
5185 /* Process that file */
5186 process_pref_file(player_ptr, buf);
5188 /* Access the "class" pref file */
5189 sprintf(buf, "%s.prf", cp_ptr->title);
5191 /* Process that file */
5192 process_pref_file(player_ptr, buf);
5194 /* Access the "character" pref file */
5195 sprintf(buf, "%s.prf", p_ptr->base_name);
5197 /* Process that file */
5198 process_pref_file(player_ptr, buf);
5200 /* Access the "realm 1" pref file */
5201 if (p_ptr->realm1 != REALM_NONE)
5203 sprintf(buf, "%s.prf", realm_names[p_ptr->realm1]);
5205 /* Process that file */
5206 process_pref_file(player_ptr, buf);
5209 /* Access the "realm 2" pref file */
5210 if (p_ptr->realm2 != REALM_NONE)
5212 sprintf(buf, "%s.prf", realm_names[p_ptr->realm2]);
5214 /* Process that file */
5215 process_pref_file(player_ptr, buf);
5219 /* Load an autopick preference file */
5220 autopick_load_pref(player_ptr, FALSE);
5225 * @brief 1ゲームプレイの主要ルーチン / Actually play a game
5228 * If the "new_game" parameter is true, then, after loading the
5229 * savefile, we will commit suicide, if necessary, to allow the
5230 * player to start a new game.
5232 void play_game(player_type *player_ptr, bool new_game)
5235 bool load_game = TRUE;
5236 bool init_random_seed = FALSE;
5246 else if (chuukei_server)
5248 prepare_chuukei_hooks();
5259 player_ptr->hack_mutation = FALSE;
5261 /* Hack -- Character is "icky" */
5262 current_world_ptr->character_icky = TRUE;
5264 /* Make sure main term is active */
5265 Term_activate(angband_term[0]);
5267 /* Initialise the resize hooks */
5268 angband_term[0]->resize_hook = resize_map;
5270 for (i = 1; i < 8; i++)
5272 /* Does the term exist? */
5273 if (angband_term[i])
5275 /* Add the redraw on resize hook */
5276 angband_term[i]->resize_hook = redraw_window;
5280 /* Hack -- turn off the cursor */
5281 (void)Term_set_cursor(0);
5284 /* Attempt to load */
5285 if (!load_player(player_ptr))
5287 quit(_("セーブファイルが壊れています", "broken savefile"));
5290 /* Extract the options */
5291 extract_option_vars();
5293 /* Report waited score */
5294 if (player_ptr->wait_report_score)
5299 if (!get_check_strict(_("待機していたスコア登録を今行ないますか?", "Do you register score now? "), CHECK_NO_HISTORY))
5302 player_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
5303 update_creature(player_ptr);
5305 player_ptr->is_dead = TRUE;
5307 current_world_ptr->start_time = (u32b)time(NULL);
5309 /* No suspending now */
5310 signals_ignore_tstp();
5312 /* Hack -- Character is now "icky" */
5313 current_world_ptr->character_icky = TRUE;
5314 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
5316 /* Open the high score file, for reading/writing */
5317 highscore_fd = fd_open(buf, O_RDWR);
5319 /* 町名消失バグ対策(#38205)のためここで世界マップ情報を読み出す */
5320 process_dungeon_file(player_ptr, "w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
5322 /* Handle score, show Top scores */
5323 success = send_world_score(player_ptr, TRUE);
5325 if (!success && !get_check_strict(_("スコア登録を諦めますか?", "Do you give up score registration? "), CHECK_NO_HISTORY))
5327 prt(_("引き続き待機します。", "standing by for future registration..."), 0, 0);
5332 player_ptr->wait_report_score = FALSE;
5333 top_twenty(player_ptr);
5334 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
5336 /* Shut the high score file */
5337 (void)fd_close(highscore_fd);
5339 /* Forget the high score fd */
5342 /* Allow suspending now */
5343 signals_handle_tstp();
5348 current_world_ptr->creating_savefile = new_game;
5350 /* Nothing loaded */
5351 if (!current_world_ptr->character_loaded)
5353 /* Make new player */
5356 /* The dungeon is not ready */
5357 current_world_ptr->character_dungeon = FALSE;
5359 /* Prepare to init the RNG */
5360 init_random_seed = TRUE;
5362 /* Initialize the saved floors data */
5363 init_saved_floors(player_ptr, FALSE);
5366 /* Old game is loaded. But new game is requested. */
5369 /* Initialize the saved floors data */
5370 init_saved_floors(player_ptr, TRUE);
5373 /* Process old character */
5376 /* Process the player name */
5377 process_player_name(player_ptr, FALSE);
5381 if (init_random_seed)
5386 /* Roll new character */
5389 /* The dungeon is not ready */
5390 current_world_ptr->character_dungeon = FALSE;
5393 player_ptr->current_floor_ptr->dun_level = 0;
5394 player_ptr->current_floor_ptr->inside_quest = 0;
5395 player_ptr->current_floor_ptr->inside_arena = FALSE;
5396 player_ptr->phase_out = FALSE;
5400 /* Hack -- seed for flavors */
5401 current_world_ptr->seed_flavor = randint0(0x10000000);
5403 /* Hack -- seed for town layout */
5404 current_world_ptr->seed_town = randint0(0x10000000);
5406 /* Roll up a new character */
5407 player_birth(player_ptr);
5409 counts_write(player_ptr, 2,0);
5410 player_ptr->count = 0;
5414 determine_bounty_uniques();
5415 determine_daily_bounty(player_ptr, FALSE);
5417 /* Initialize object array */
5418 wipe_o_list(player_ptr->current_floor_ptr);
5422 write_level = FALSE;
5424 exe_write_diary(player_ptr, NIKKI_GAMESTART, 1,
5426 " ---- Restart Game ----"));
5429 * 1.0.9 以前はセーブ前に player_ptr->riding = -1 としていたので、再設定が必要だった。
5430 * もう不要だが、以前のセーブファイルとの互換のために残しておく。
5432 if (player_ptr->riding == -1)
5434 player_ptr->riding = 0;
5435 for (i = player_ptr->current_floor_ptr->m_max; i > 0; i--)
5437 if (player_bold(player_ptr, player_ptr->current_floor_ptr->m_list[i].fy, player_ptr->current_floor_ptr->m_list[i].fx))
5439 player_ptr->riding = i;
5446 current_world_ptr->creating_savefile = FALSE;
5448 player_ptr->teleport_town = FALSE;
5449 player_ptr->sutemi = FALSE;
5450 current_world_ptr->timewalk_m_idx = 0;
5451 player_ptr->now_damaged = FALSE;
5453 current_world_ptr->start_time = time(NULL) - 1;
5454 record_o_name[0] = '\0';
5456 /* Reset map panel */
5457 panel_row_min = player_ptr->current_floor_ptr->height;
5458 panel_col_min = player_ptr->current_floor_ptr->width;
5460 /* Sexy gal gets bonus to maximum weapon skill of whip */
5461 if (player_ptr->pseikaku == SEIKAKU_SEXY)
5462 s_info[player_ptr->pclass].w_max[TV_HAFTED-TV_WEAPON_BEGIN][SV_WHIP] = WEAPON_EXP_MASTER;
5464 /* Fill the arrays of floors and walls in the good proportions */
5465 set_floor_and_wall(player_ptr->dungeon_idx);
5467 /* Flavor the objects */
5470 /* Flash a message */
5471 prt(_("お待ち下さい...", "Please wait..."), 0, 0);
5473 /* Flush the message */
5477 /* Hack -- Enter wizard mode */
5480 if (enter_wizard_mode())
5482 current_world_ptr->wizard = TRUE;
5484 if (player_ptr->is_dead || !player_ptr->y || !player_ptr->x)
5486 /* Initialize the saved floors data */
5487 init_saved_floors(player_ptr, TRUE);
5490 player_ptr->current_floor_ptr->inside_quest = 0;
5492 /* Avoid crash in update_view() */
5493 player_ptr->y = player_ptr->x = 10;
5496 else if (player_ptr->is_dead)
5498 quit("Already dead.");
5502 /* Initialize the town-buildings if necessary */
5503 if (!player_ptr->current_floor_ptr->dun_level && !player_ptr->current_floor_ptr->inside_quest)
5505 process_dungeon_file(player_ptr, "w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
5506 init_flags = INIT_ONLY_BUILDINGS;
5507 process_dungeon_file(player_ptr, "t_info.txt", 0, 0, MAX_HGT, MAX_WID);
5508 select_floor_music(player_ptr);
5511 /* Generate a dungeon level if needed */
5512 if (!current_world_ptr->character_dungeon)
5514 change_floor(player_ptr);
5518 /* HACK -- Restore from panic-save */
5519 if (player_ptr->panic_save)
5521 /* No player? -- Try to regenerate floor */
5522 if (!player_ptr->y || !player_ptr->x)
5524 msg_print(_("プレイヤーの位置がおかしい。フロアを再生成します。", "What a strange player location. Regenerate the dungeon floor."));
5525 change_floor(player_ptr);
5528 /* Still no player? -- Try to locate random place */
5529 if (!player_ptr->y || !player_ptr->x) player_ptr->y = player_ptr->x = 10;
5531 /* No longer in panic */
5532 player_ptr->panic_save = 0;
5536 /* Character is now "complete" */
5537 current_world_ptr->character_generated = TRUE;
5540 /* Hack -- Character is no longer "icky" */
5541 current_world_ptr->character_icky = FALSE;
5547 sprintf(buf, _("%sに降り立った。", "You are standing in the %s."), map_name());
5548 exe_write_diary(player_ptr, NIKKI_BUNSHOU, 0, buf);
5553 player_ptr->playing = TRUE;
5555 /* Reset the visual mappings */
5558 /* Load the "pref" files */
5559 load_all_pref_files(player_ptr);
5561 /* Give startup outfit (after loading pref files) */
5564 player_outfit(player_ptr);
5567 /* React to changes */
5568 Term_xtra(TERM_XTRA_REACT, 0);
5570 player_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
5571 player_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
5572 handle_stuff(player_ptr);
5574 /* Set or clear "rogue_like_commands" if requested */
5575 if (arg_force_original) rogue_like_commands = FALSE;
5576 if (arg_force_roguelike) rogue_like_commands = TRUE;
5578 /* Hack -- Enforce "delayed death" */
5579 if (player_ptr->chp < 0) player_ptr->is_dead = TRUE;
5581 if (player_ptr->prace == RACE_ANDROID) calc_android_exp(player_ptr);
5583 if (new_game && ((player_ptr->pclass == CLASS_CAVALRY) || (player_ptr->pclass == CLASS_BEASTMASTER)))
5585 monster_type *m_ptr;
5586 MONRACE_IDX pet_r_idx = ((player_ptr->pclass == CLASS_CAVALRY) ? MON_HORSE : MON_YASE_HORSE);
5587 monster_race *r_ptr = &r_info[pet_r_idx];
5588 place_monster_aux(0, player_ptr->y, player_ptr->x - 1, pet_r_idx,
5589 (PM_FORCE_PET | PM_NO_KAGE));
5590 m_ptr = &player_ptr->current_floor_ptr->m_list[hack_m_idx_ii];
5591 m_ptr->mspeed = r_ptr->speed;
5592 m_ptr->maxhp = r_ptr->hdice*(r_ptr->hside+1)/2;
5593 m_ptr->max_maxhp = m_ptr->maxhp;
5594 m_ptr->hp = r_ptr->hdice*(r_ptr->hside+1)/2;
5595 m_ptr->dealt_damage = 0;
5596 m_ptr->energy_need = ENERGY_NEED() + ENERGY_NEED();
5599 (void)combine_and_reorder_home(STORE_HOME);
5600 (void)combine_and_reorder_home(STORE_MUSEUM);
5602 select_floor_music(player_ptr);
5607 /* Process the level */
5608 dungeon(player_ptr, load_game);
5610 /* Hack -- prevent "icky" message */
5611 current_world_ptr->character_xtra = TRUE;
5613 handle_stuff(player_ptr);
5615 current_world_ptr->character_xtra = FALSE;
5617 /* Cancel the target */
5620 /* Cancel the health bar */
5623 forget_lite(player_ptr->current_floor_ptr);
5624 forget_view(player_ptr->current_floor_ptr);
5625 clear_mon_lite(player_ptr->current_floor_ptr);
5627 /* Handle "quit and save" */
5628 if (!player_ptr->playing && !player_ptr->is_dead) break;
5630 wipe_o_list(player_ptr->current_floor_ptr);
5631 if (!player_ptr->is_dead) wipe_m_list();
5638 /* Accidental Death */
5639 if (player_ptr->playing && player_ptr->is_dead)
5641 if (player_ptr->current_floor_ptr->inside_arena)
5643 player_ptr->current_floor_ptr->inside_arena = FALSE;
5644 if (player_ptr->arena_number > MAX_ARENA_MONS)
5645 player_ptr->arena_number++;
5647 player_ptr->arena_number = -1 - player_ptr->arena_number;
5648 player_ptr->is_dead = FALSE;
5649 player_ptr->chp = 0;
5650 player_ptr->chp_frac = 0;
5651 player_ptr->exit_bldg = TRUE;
5652 reset_tim_flags(player_ptr);
5654 /* Leave through the exit */
5655 prepare_change_floor_mode(player_ptr, CFM_SAVE_FLOORS | CFM_RAND_CONNECT);
5657 /* prepare next floor */
5658 leave_floor(player_ptr);
5662 /* Mega-Hack -- Allow player to cheat death */
5663 if ((current_world_ptr->wizard || cheat_live) && !get_check(_("死にますか? ", "Die? ")))
5665 cheat_death(player_ptr);
5670 /* Handle "death" */
5671 if (player_ptr->is_dead) break;
5673 /* Make a new level */
5674 change_floor(player_ptr);
5678 close_game(player_ptr);
5685 * @brief ゲームターンからの実時間換算を行うための補正をかける
5686 * @param hoge ゲームターン
5687 * @details アンデッド種族は18:00からゲームを開始するので、この修正を予め行う。
5688 * @return 修正をかけた後のゲームターン
5690 s32b turn_real(s32b hoge)
5692 switch (p_ptr->start_race)
5698 return hoge - (TURNS_PER_TICK * TOWN_DAWN * 3 / 4);
5706 * @brief ターンのオーバーフローに対する対処
5707 * @details ターン及びターンを記録する変数をターンの限界の1日前まで巻き戻す.
5708 * @return 修正をかけた後のゲームターン
5710 void prevent_turn_overflow(void)
5712 int rollback_days, i, j;
5713 s32b rollback_turns;
5715 if (current_world_ptr->game_turn < current_world_ptr->game_turn_limit) return;
5717 rollback_days = 1 + (current_world_ptr->game_turn - current_world_ptr->game_turn_limit) / (TURNS_PER_TICK * TOWN_DAWN);
5718 rollback_turns = TURNS_PER_TICK * TOWN_DAWN * rollback_days;
5720 if (current_world_ptr->game_turn > rollback_turns) current_world_ptr->game_turn -= rollback_turns;
5721 else current_world_ptr->game_turn = 1;
5722 if (p_ptr->current_floor_ptr->generated_turn > rollback_turns) p_ptr->current_floor_ptr->generated_turn -= rollback_turns;
5723 else p_ptr->current_floor_ptr->generated_turn = 1;
5724 if (current_world_ptr->arena_start_turn > rollback_turns) current_world_ptr->arena_start_turn -= rollback_turns;
5725 else current_world_ptr->arena_start_turn = 1;
5726 if (p_ptr->feeling_turn > rollback_turns) p_ptr->feeling_turn -= rollback_turns;
5727 else p_ptr->feeling_turn = 1;
5729 for (i = 1; i < max_towns; i++)
5731 for (j = 0; j < MAX_STORES; j++)
5733 store_type *st_ptr = &town_info[i].store[j];
5735 if (st_ptr->last_visit > -10L * TURNS_PER_TICK * STORE_TICKS)
5737 st_ptr->last_visit -= rollback_turns;
5738 if (st_ptr->last_visit < -10L * TURNS_PER_TICK * STORE_TICKS) st_ptr->last_visit = -10L * TURNS_PER_TICK * STORE_TICKS;
5741 if (st_ptr->store_open)
5743 st_ptr->store_open -= rollback_turns;
5744 if (st_ptr->store_open < 1) st_ptr->store_open = 1;
5753 * Close up the current game (player may or may not be dead)
5754 * @param creature_ptr プレーヤーへの参照ポインタ
5758 * This function is called only from "main.c" and "signals.c".
5761 void close_game(player_type *player_ptr)
5764 bool do_send = TRUE;
5766 /* concptr p = "[i:キャラクタの情報, f:ファイル書き出し, t:スコア, x:*鑑定*, ESC:ゲーム終了]"; */
5767 handle_stuff(player_ptr);
5769 /* Flush the messages */
5772 /* Flush the input */
5776 /* No suspending now */
5777 signals_ignore_tstp();
5780 /* Hack -- Character is now "icky" */
5781 current_world_ptr->character_icky = TRUE;
5783 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
5785 /* Grab permissions */
5788 /* Open the high score file, for reading/writing */
5789 highscore_fd = fd_open(buf, O_RDWR);
5791 /* Drop permissions */
5795 if (player_ptr->is_dead)
5797 /* Handle retirement */
5798 if (current_world_ptr->total_winner) kingly(player_ptr);
5801 if (!cheat_save || get_check(_("死んだデータをセーブしますか? ", "Save death? ")))
5803 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
5805 else do_send = FALSE;
5808 print_tomb(player_ptr);
5812 /* Show more info */
5813 show_info(player_ptr);
5818 if ((!send_world_score(player_ptr, do_send)))
5820 if (get_check_strict(_("後でスコアを登録するために待機しますか?", "Stand by for later score registration? "),
5821 (CHECK_NO_ESCAPE | CHECK_NO_HISTORY)))
5823 player_ptr->wait_report_score = TRUE;
5824 player_ptr->is_dead = FALSE;
5825 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
5828 if (!player_ptr->wait_report_score)
5829 (void)top_twenty(player_ptr);
5831 else if (highscore_fd >= 0)
5833 display_scores_aux(0, 10, -1, NULL);
5836 /* Dump bones file */
5845 do_cmd_save_game(player_ptr, FALSE);
5847 /* Prompt for scores */
5848 prt(_("リターンキーか ESC キーを押して下さい。", "Press Return (or Escape)."), 0, 40);
5849 play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_EXIT);
5851 /* Predict score (or ESCAPE) */
5852 if (inkey() != ESCAPE) predict_score(player_ptr);
5856 /* Shut the high score file */
5857 (void)fd_close(highscore_fd);
5859 /* Forget the high score fd */
5862 /* Kill all temporary files */
5863 clear_saved_floor_files(player_ptr);
5865 /* Allow suspending now */
5866 signals_handle_tstp();
5871 * @brief 全更新処理をチェックして処理していく
5872 * Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window"
5875 void handle_stuff(player_type *player_ptr)
5877 if (player_ptr->update) update_creature(player_ptr);
5878 if (player_ptr->redraw) redraw_stuff(player_ptr);
5879 if (player_ptr->window) window_stuff(player_ptr);
5883 void update_output(player_type *player_ptr)
5885 if (player_ptr->redraw) redraw_stuff(player_ptr);
5886 if (player_ptr->window) window_stuff(player_ptr);