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.
14 #include "signal-handlers.h"
25 #include "io/write-diary.h"
26 #include "cmd/cmd-activate.h"
27 #include "cmd/cmd-diary.h"
28 #include "cmd/cmd-draw.h"
29 #include "cmd/cmd-dump.h"
30 #include "cmd/cmd-eat.h"
31 #include "cmd/cmd-help.h"
32 #include "cmd/cmd-hissatsu.h"
33 #include "cmd/cmd-item.h"
34 #include "cmd/cmd-magiceat.h"
35 #include "cmd/cmd-mane.h"
36 #include "cmd/cmd-macro.h"
37 #include "cmd/cmd-quaff.h"
38 #include "cmd/cmd-read.h"
39 #include "cmd/cmd-save.h"
40 #include "cmd/cmd-smith.h"
41 #include "cmd/cmd-usestaff.h"
42 #include "cmd/cmd-zaprod.h"
43 #include "cmd/cmd-zapwand.h"
44 #include "cmd/cmd-pet.h"
45 #include "cmd/cmd-basic.h"
46 #include "cmd/cmd-visuals.h"
52 #include "floor-events.h"
53 #include "floor-town.h"
55 #include "object-ego.h"
56 #include "object-curse.h"
57 #include "object-flavor.h"
60 #include "spells-summon.h"
61 #include "spells-object.h"
62 #include "spells-status.h"
63 #include "spells-floor.h"
64 #include "monster-spell.h"
68 #include "market/store-util.h"
72 #include "view/display-player.h"
73 #include "player/process-name.h"
74 #include "player-move.h"
75 #include "player-status.h"
76 #include "player-class.h"
77 #include "player-race.h"
78 #include "player-personality.h"
79 #include "player-damage.h"
80 #include "player-effects.h"
81 #include "cmd-spell.h"
82 #include "realm-hex.h"
83 #include "objectkind.h"
84 #include "object-hook.h"
86 #include "monster-process.h"
87 #include "monster-status.h"
88 #include "monsterrace-hook.h"
89 #include "floor-save.h"
91 #include "player-skill.h"
92 #include "player-inventory.h"
94 #include "view-mainwindow.h"
95 #include "dungeon-file.h"
96 #include "uid-checker.h"
97 #include "player/process-death.h"
98 #include "io/read-pref-file.h"
101 #include "autopick.h"
104 #include "realm-song.h"
105 #include "targeting.h"
109 * Hack -- Link a copyright message into the executable
111 const concptr copyright[5] =
113 "Copyright (c) 1989 James E. Wilson, Robert A. Keoneke",
115 "This software may be copied and distributed for educational, research,",
116 "and not for profit purposes provided that this copyright and statement",
117 "are included in all such copies."
120 bool can_save = FALSE;
122 COMMAND_CODE now_message;
124 bool repair_monsters;
127 concptr ANGBAND_SYS = "xxx";
130 concptr ANGBAND_KEYBOARD = "JAPAN";
132 concptr ANGBAND_KEYBOARD = "0";
135 concptr ANGBAND_GRAF = "ascii";
137 static bool load = TRUE; /*!<ロード処理中の分岐フラグ*/
138 static int wild_regen = 20; /*!<広域マップ移動時の自然回復処理カウンタ(広域マップ1マス毎に20回処理を基本とする)*/
141 * Flags for initialization
146 * @brief 擬似鑑定を実際に行い判定を反映する
147 * @param slot 擬似鑑定を行うプレイヤーの所持リストID
148 * @param creature_ptr プレーヤーへの参照ポインタ
149 * @param heavy 重度の擬似鑑定を行うならばTRUE
152 static void sense_inventory_aux(player_type *creature_ptr, INVENTORY_IDX slot, bool heavy)
155 object_type *o_ptr = &creature_ptr->inventory_list[slot];
156 GAME_TEXT o_name[MAX_NLEN];
157 if (o_ptr->ident & (IDENT_SENSE))return;
158 if (object_is_known(o_ptr)) return;
160 feel = (heavy ? value_check_aux1(o_ptr) : value_check_aux2(o_ptr));
163 if ((creature_ptr->muta3 & MUT3_BAD_LUCK) && !randint0(13))
174 feel = FEEL_EXCELLENT;
180 feel = randint0(3) ? FEEL_GOOD : FEEL_AVERAGE;
182 feel = FEEL_UNCURSED;
187 feel = randint0(2) ? FEEL_CURSED : FEEL_GOOD;
193 feel = randint0(3) ? FEEL_CURSED : FEEL_AVERAGE;
200 feel = FEEL_WORTHLESS;
205 feel = FEEL_TERRIBLE;
211 if (disturb_minor) disturb(creature_ptr, FALSE, FALSE);
213 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
214 if (slot >= INVEN_RARM)
217 msg_format("%s%s(%c)は%sという感じがする...",
218 describe_use(creature_ptr, slot), o_name, index_to_label(slot), game_inscriptions[feel]);
220 msg_format("You feel the %s (%c) you are %s %s %s...",
221 o_name, index_to_label(slot), describe_use(creature_ptr, slot),
222 ((o_ptr->number == 1) ? "is" : "are"),
223 game_inscriptions[feel]);
230 msg_format("ザックの中の%s(%c)は%sという感じがする...",
231 o_name, index_to_label(slot), game_inscriptions[feel]);
233 msg_format("You feel the %s (%c) in your pack %s %s...",
234 o_name, index_to_label(slot),
235 ((o_ptr->number == 1) ? "is" : "are"),
236 game_inscriptions[feel]);
241 o_ptr->ident |= (IDENT_SENSE);
242 o_ptr->feeling = feel;
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)
265 PLAYER_LEVEL plev = creature_ptr->lev;
268 if (creature_ptr->confused) return;
270 switch (creature_ptr->pclass)
277 if (0 != randint0(9000L / (plev * plev + 40))) return;
284 if (0 != randint0(6000L / (plev * plev + 50))) return;
290 case CLASS_HIGH_MAGE:
292 case CLASS_MAGIC_EATER:
294 if (0 != randint0(240000L / (plev + 5))) return;
301 if (0 != randint0(10000L / (plev * plev + 40))) return;
308 if (0 != randint0(20000L / (plev * plev + 40))) return;
315 if (0 != randint0(95000L / (plev * plev + 40))) return;
323 if (0 != randint0(77777L / (plev * plev + 40))) return;
328 case CLASS_WARRIOR_MAGE:
331 if (0 != randint0(75000L / (plev * plev + 40))) return;
335 case CLASS_MINDCRAFTER:
337 case CLASS_BLUE_MAGE:
338 case CLASS_MIRROR_MASTER:
340 if (0 != randint0(55000L / (plev * plev + 40))) return;
344 case CLASS_CHAOS_WARRIOR:
346 if (0 != randint0(80000L / (plev * plev + 40))) return;
352 case CLASS_FORCETRAINER:
354 if (0 != randint0(20000L / (plev * plev + 40))) return;
360 if (0 != randint0(20000L / ((plev + 50)*(plev + 50)))) return;
365 case CLASS_BEASTMASTER:
367 if (0 != randint0(65000L / (plev * plev + 40))) return;
371 case CLASS_BERSERKER:
378 if (compare_virtue(creature_ptr, V_KNOWLEDGE, 100, VIRTUE_LARGE)) heavy = TRUE;
380 for (INVENTORY_IDX i = 0; i < INVEN_TOTAL; i++)
384 o_ptr = &creature_ptr->inventory_list[i];
386 if (!o_ptr->k_idx) continue;
415 if ((i < INVEN_RARM) && (0 != randint0(5))) continue;
417 if ((creature_ptr->muta3 & MUT3_GOOD_LUCK) && !randint0(13))
422 sense_inventory_aux(creature_ptr, i, heavy);
428 * @brief 1プレイヤーターン毎に武器、防具以外の擬似鑑定が行われるかを判定する。
431 static void sense_inventory2(player_type *creature_ptr)
433 PLAYER_LEVEL plev = creature_ptr->lev;
436 if (creature_ptr->confused) return;
438 switch (creature_ptr->pclass)
444 case CLASS_BERSERKER:
451 case CLASS_CHAOS_WARRIOR:
453 case CLASS_BEASTMASTER:
456 if (0 != randint0(240000L / (plev + 5))) return;
461 case CLASS_WARRIOR_MAGE:
465 if (0 != randint0(95000L / (plev * plev + 40))) return;
472 case CLASS_FORCETRAINER:
473 case CLASS_MINDCRAFTER:
475 if (0 != randint0(20000L / (plev * plev + 40))) return;
480 case CLASS_HIGH_MAGE:
482 case CLASS_MAGIC_EATER:
483 case CLASS_MIRROR_MASTER:
484 case CLASS_BLUE_MAGE:
486 if (0 != randint0(9000L / (plev * plev + 40))) return;
492 if (0 != randint0(20000L / ((plev + 50)*(plev + 50)))) return;
498 for (INVENTORY_IDX i = 0; i < INVEN_TOTAL; i++)
501 o_ptr = &creature_ptr->inventory_list[i];
502 if (!o_ptr->k_idx) continue;
517 if ((i < INVEN_RARM) && (0 != randint0(5))) continue;
519 sense_inventory_aux(creature_ptr, i, TRUE);
525 * @brief パターン終点到達時のテレポート処理を行う
526 * @param creature_ptr プレーヤーへの参照ポインタ
529 static void pattern_teleport(player_type *creature_ptr)
532 DEPTH max_level = 99;
534 if (get_check(_("他の階にテレポートしますか?", "Teleport level? ")))
539 if (ironman_downward)
540 min_level = creature_ptr->current_floor_ptr->dun_level;
542 if (creature_ptr->dungeon_idx == DUNGEON_ANGBAND)
544 if (creature_ptr->current_floor_ptr->dun_level > 100)
545 max_level = MAX_DEPTH - 1;
546 else if (creature_ptr->current_floor_ptr->dun_level == 100)
551 max_level = d_info[creature_ptr->dungeon_idx].maxdepth;
552 min_level = d_info[creature_ptr->dungeon_idx].mindepth;
555 sprintf(ppp, _("テレポート先:(%d-%d)", "Teleport to level (%d-%d): "), (int)min_level, (int)max_level);
556 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
557 if (!get_string(ppp, tmp_val, 10)) return;
559 command_arg = (COMMAND_ARG)atoi(tmp_val);
561 else if (get_check(_("通常テレポート?", "Normal teleport? ")))
563 teleport_player(creature_ptr, 200, 0L);
571 if (command_arg < min_level) command_arg = (COMMAND_ARG)min_level;
572 if (command_arg > max_level) command_arg = (COMMAND_ARG)max_level;
574 msg_format(_("%d 階にテレポートしました。", "You teleport to dungeon level %d."), command_arg);
575 if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
577 creature_ptr->current_floor_ptr->dun_level = command_arg;
578 leave_quest_check(creature_ptr);
579 if (record_stair) exe_write_diary(creature_ptr, DIARY_PAT_TELE, 0, NULL);
581 creature_ptr->current_floor_ptr->inside_quest = 0;
582 free_turn(creature_ptr);
585 * Clear all saved floors
586 * and create a first saved floor
588 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
589 creature_ptr->leaving = TRUE;
594 * @brief 各種パターン地形上の特別な処理 / Returns TRUE if we are on the Pattern...
595 * @return 実際にパターン地形上にプレイヤーが居た場合はTRUEを返す。
597 static bool pattern_effect(player_type *creature_ptr)
599 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
600 if (!pattern_tile(floor_ptr, creature_ptr->y, creature_ptr->x)) return FALSE;
602 if ((PRACE_IS_(creature_ptr, RACE_AMBERITE)) &&
603 (creature_ptr->cut > 0) && one_in_(10))
605 wreck_the_pattern(creature_ptr);
608 int pattern_type = f_info[floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].feat].subtype;
609 switch (pattern_type)
611 case PATTERN_TILE_END:
612 (void)set_image(creature_ptr, 0);
613 (void)restore_all_status(creature_ptr);
614 (void)restore_level(creature_ptr);
615 (void)cure_critical_wounds(creature_ptr, 1000);
617 cave_set_feat(creature_ptr, creature_ptr->y, creature_ptr->x, feat_pattern_old);
618 msg_print(_("「パターン」のこの部分は他の部分より強力でないようだ。", "This section of the Pattern looks less powerful."));
621 * We could make the healing effect of the
622 * Pattern center one-time only to avoid various kinds
623 * of abuse, like luring the win monster into fighting you
624 * in the middle of the pattern...
628 case PATTERN_TILE_OLD:
632 case PATTERN_TILE_TELEPORT:
633 pattern_teleport(creature_ptr);
636 case PATTERN_TILE_WRECKED:
637 if (!IS_INVULN(creature_ptr))
638 take_hit(creature_ptr, DAMAGE_NOESCAPE, 200, _("壊れた「パターン」を歩いたダメージ", "walking the corrupted Pattern"), -1);
642 if (PRACE_IS_(creature_ptr, RACE_AMBERITE) && !one_in_(2))
644 else if (!IS_INVULN(creature_ptr))
645 take_hit(creature_ptr, DAMAGE_NOESCAPE, damroll(1, 3), _("「パターン」を歩いたダメージ", "walking the Pattern"), -1);
654 * @brief プレイヤーのHP自然回復処理 / Regenerate hit points -RAK-
655 * @param percent 回復比率
658 static void regenhp(player_type *creature_ptr, int percent)
660 if (creature_ptr->special_defense & KATA_KOUKIJIN) return;
661 if (creature_ptr->action == ACTION_HAYAGAKE) return;
663 HIT_POINT old_chp = creature_ptr->chp;
666 * Extract the new hitpoints
668 * 'percent' is the Regen factor in unit (1/2^16)
670 HIT_POINT new_chp = 0;
671 u32b new_chp_frac = (creature_ptr->mhp * percent + PY_REGEN_HPBASE);
672 s64b_LSHIFT(new_chp, new_chp_frac, 16);
673 s64b_add(&(creature_ptr->chp), &(creature_ptr->chp_frac), new_chp, new_chp_frac);
674 if (0 < s64b_cmp(creature_ptr->chp, creature_ptr->chp_frac, creature_ptr->mhp, 0))
676 creature_ptr->chp = creature_ptr->mhp;
677 creature_ptr->chp_frac = 0;
680 if (old_chp != creature_ptr->chp)
682 creature_ptr->redraw |= (PR_HP);
683 creature_ptr->window |= (PW_PLAYER);
690 * @brief プレイヤーのMP自然回復処理(regen_magic()のサブセット) / Regenerate mana points
691 * @param upkeep_factor ペット維持によるMPコスト量
692 * @param regen_amount 回復量
695 static void regenmana(player_type *creature_ptr, MANA_POINT upkeep_factor, MANA_POINT regen_amount)
697 MANA_POINT old_csp = creature_ptr->csp;
698 s32b regen_rate = regen_amount * 100 - upkeep_factor * PY_REGEN_NORMAL;
701 * Excess mana will decay 32 times faster than normal
704 if (creature_ptr->csp > creature_ptr->msp)
707 u32b decay_frac = (creature_ptr->msp * 32 * PY_REGEN_NORMAL + PY_REGEN_MNBASE);
708 s64b_LSHIFT(decay, decay_frac, 16);
709 s64b_sub(&(creature_ptr->csp), &(creature_ptr->csp_frac), decay, decay_frac);
710 if (creature_ptr->csp < creature_ptr->msp)
712 creature_ptr->csp = creature_ptr->msp;
713 creature_ptr->csp_frac = 0;
717 /* Regenerating mana (unless the player has excess mana) */
718 else if (regen_rate > 0)
720 MANA_POINT new_mana = 0;
721 u32b new_mana_frac = (creature_ptr->msp * regen_rate / 100 + PY_REGEN_MNBASE);
722 s64b_LSHIFT(new_mana, new_mana_frac, 16);
723 s64b_add(&(creature_ptr->csp), &(creature_ptr->csp_frac), new_mana, new_mana_frac);
724 if (creature_ptr->csp >= creature_ptr->msp)
726 creature_ptr->csp = creature_ptr->msp;
727 creature_ptr->csp_frac = 0;
731 /* Reduce mana (even when the player has excess mana) */
734 s32b reduce_mana = 0;
735 u32b reduce_mana_frac = (creature_ptr->msp * (-1) * regen_rate / 100 + PY_REGEN_MNBASE);
736 s64b_LSHIFT(reduce_mana, reduce_mana_frac, 16);
737 s64b_sub(&(creature_ptr->csp), &(creature_ptr->csp_frac), reduce_mana, reduce_mana_frac);
738 if (creature_ptr->csp < 0)
740 creature_ptr->csp = 0;
741 creature_ptr->csp_frac = 0;
745 if (old_csp != creature_ptr->csp)
747 creature_ptr->redraw |= (PR_MANA);
748 creature_ptr->window |= (PW_PLAYER);
749 creature_ptr->window |= (PW_SPELL);
756 * @brief プレイヤーのMP自然回復処理 / Regenerate magic regen_amount: PY_REGEN_NORMAL * 2 (if resting) * 2 (if having regenarate)
757 * @param regen_amount 回復量
760 static void regenmagic(player_type *creature_ptr, int regen_amount)
764 int mult = (dev + adj_mag_mana[creature_ptr->stat_ind[A_INT]]); /* x1 to x2 speed bonus for recharging */
766 for (int i = 0; i < EATER_EXT * 2; i++)
768 if (!creature_ptr->magic_num2[i]) continue;
769 if (creature_ptr->magic_num1[i] == ((long)creature_ptr->magic_num2[i] << 16)) continue;
771 /* Increase remaining charge number like float value */
772 new_mana = (regen_amount * mult * ((long)creature_ptr->magic_num2[i] + 13)) / (dev * 8);
773 creature_ptr->magic_num1[i] += new_mana;
775 /* Check maximum charge */
776 if (creature_ptr->magic_num1[i] > (creature_ptr->magic_num2[i] << 16))
778 creature_ptr->magic_num1[i] = ((long)creature_ptr->magic_num2[i] << 16);
784 for (int i = EATER_EXT * 2; i < EATER_EXT * 3; i++)
786 if (!creature_ptr->magic_num1[i]) continue;
787 if (!creature_ptr->magic_num2[i]) continue;
789 /* Decrease remaining period for charging */
790 new_mana = (regen_amount * mult * ((long)creature_ptr->magic_num2[i] + 10) * EATER_ROD_CHARGE)
791 / (dev * 16 * PY_REGEN_NORMAL);
792 creature_ptr->magic_num1[i] -= new_mana;
794 /* Check minimum remaining period for charging */
795 if (creature_ptr->magic_num1[i] < 0) creature_ptr->magic_num1[i] = 0;
802 * @brief 100ゲームターン毎のモンスターのHP自然回復処理 / Regenerate the monsters (once per 100 game turns)
803 * @param player_ptr プレーヤーへの参照ポインタ
805 * @note Should probably be done during monster turns.
807 static void regenerate_monsters(player_type *player_ptr)
809 for (int i = 1; i < player_ptr->current_floor_ptr->m_max; i++)
811 monster_type *m_ptr = &player_ptr->current_floor_ptr->m_list[i];
812 monster_race *r_ptr = &r_info[m_ptr->r_idx];
814 if (!monster_is_valid(m_ptr)) continue;
816 if (m_ptr->hp < m_ptr->maxhp)
818 int frac = m_ptr->maxhp / 100;
819 if (!frac) if (one_in_(2)) frac = 1;
821 if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2;
824 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
826 if (player_ptr->health_who == i) player_ptr->redraw |= (PR_HEALTH);
827 if (player_ptr->riding == i) player_ptr->redraw |= (PR_UHEALTH);
834 * @brief 30ゲームターン毎のボール中モンスターのHP自然回復処理 / Regenerate the captured monsters (once per 30 game turns)
835 * @param creature_ptr プレーヤーへの参照ポインタ
837 * @note Should probably be done during monster turns.
839 static void regenerate_captured_monsters(player_type *creature_ptr)
842 for (int i = 0; i < INVEN_TOTAL; i++)
845 object_type *o_ptr = &creature_ptr->inventory_list[i];
846 if (!o_ptr->k_idx) continue;
847 if (o_ptr->tval != TV_CAPTURE) continue;
848 if (!o_ptr->pval) continue;
851 r_ptr = &r_info[o_ptr->pval];
852 if (o_ptr->xtra4 < o_ptr->xtra5)
854 int frac = o_ptr->xtra5 / 100;
855 if (!frac) if (one_in_(2)) frac = 1;
857 if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2;
859 o_ptr->xtra4 += (XTRA16)frac;
860 if (o_ptr->xtra4 > o_ptr->xtra5) o_ptr->xtra4 = o_ptr->xtra5;
866 creature_ptr->update |= (PU_COMBINE);
867 creature_ptr->window |= (PW_INVEN);
868 creature_ptr->window |= (PW_EQUIP);
875 * @brief 寿命つき光源の警告メッセージ処理
876 * @param creature_ptr プレーヤーへの参照ポインタ
877 * @param o_ptr 現在光源として使っているオブジェクトの構造体参照ポインタ
880 static void notice_lite_change(player_type *creature_ptr, object_type *o_ptr)
882 if ((o_ptr->xtra4 < 100) || (!(o_ptr->xtra4 % 100)))
884 creature_ptr->window |= (PW_EQUIP);
887 if (creature_ptr->blind)
889 if (o_ptr->xtra4 == 0) o_ptr->xtra4++;
891 else if (o_ptr->xtra4 == 0)
893 disturb(creature_ptr, FALSE, TRUE);
894 msg_print(_("明かりが消えてしまった!", "Your light has gone out!"));
895 creature_ptr->update |= (PU_TORCH);
896 creature_ptr->update |= (PU_BONUS);
898 else if (o_ptr->name2 == EGO_LITE_LONG)
900 if ((o_ptr->xtra4 < 50) && (!(o_ptr->xtra4 % 5))
901 && (current_world_ptr->game_turn % (TURNS_PER_TICK * 2)))
903 if (disturb_minor) disturb(creature_ptr, FALSE, TRUE);
904 msg_print(_("明かりが微かになってきている。", "Your light is growing faint."));
907 else if ((o_ptr->xtra4 < 100) && (!(o_ptr->xtra4 % 10)))
909 if (disturb_minor) disturb(creature_ptr, FALSE, TRUE);
910 msg_print(_("明かりが微かになってきている。", "Your light is growing faint."));
916 * @brief !!を刻んだ魔道具の時間経過による再充填を知らせる処理 / If player has inscribed the object with "!!", let him know when it's recharged. -LM-
917 * @param o_ptr 対象オブジェクトの構造体参照ポインタ
920 static void recharged_notice(player_type *owner_ptr, object_type *o_ptr)
922 if (!o_ptr->inscription) return;
924 concptr s = my_strchr(quark_str(o_ptr->inscription), '!');
929 GAME_TEXT o_name[MAX_NLEN];
930 object_desc(owner_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
932 msg_format("%sは再充填された。", o_name);
934 if (o_ptr->number > 1)
935 msg_format("Your %s are recharged.", o_name);
937 msg_format("Your %s is recharged.", o_name);
939 disturb(owner_ptr, FALSE, FALSE);
943 s = my_strchr(s + 1, '!');
949 * @brief プレイヤーの歌に関する継続処理
952 static void check_music(player_type *caster_ptr)
954 if (caster_ptr->pclass != CLASS_BARD) return;
955 if (!SINGING_SONG_EFFECT(caster_ptr) && !INTERUPTING_SONG_EFFECT(caster_ptr)) return;
957 if (caster_ptr->anti_magic)
959 stop_singing(caster_ptr);
963 int spell = SINGING_SONG_ID(caster_ptr);
964 const magic_type *s_ptr;
965 s_ptr = &technic_info[REALM_MUSIC - MIN_TECHNIC][spell];
967 MANA_POINT need_mana = mod_need_mana(caster_ptr, s_ptr->smana, spell, REALM_MUSIC);
968 u32b need_mana_frac = 0;
970 s64b_RSHIFT(need_mana, need_mana_frac, 1);
971 if (s64b_cmp(caster_ptr->csp, caster_ptr->csp_frac, need_mana, need_mana_frac) < 0)
973 stop_singing(caster_ptr);
978 s64b_sub(&(caster_ptr->csp), &(caster_ptr->csp_frac), need_mana, need_mana_frac);
980 caster_ptr->redraw |= PR_MANA;
981 if (INTERUPTING_SONG_EFFECT(caster_ptr))
983 SINGING_SONG_EFFECT(caster_ptr) = INTERUPTING_SONG_EFFECT(caster_ptr);
984 INTERUPTING_SONG_EFFECT(caster_ptr) = MUSIC_NONE;
985 msg_print(_("歌を再開した。", "You restart singing."));
986 caster_ptr->action = ACTION_SING;
987 caster_ptr->update |= (PU_BONUS | PU_HP | PU_MONSTERS);
988 caster_ptr->redraw |= (PR_MAP | PR_STATUS | PR_STATE);
989 caster_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
993 if (caster_ptr->spell_exp[spell] < SPELL_EXP_BEGINNER)
994 caster_ptr->spell_exp[spell] += 5;
995 else if (caster_ptr->spell_exp[spell] < SPELL_EXP_SKILLED)
997 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;
999 else if (caster_ptr->spell_exp[spell] < SPELL_EXP_EXPERT)
1001 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;
1003 else if (caster_ptr->spell_exp[spell] < SPELL_EXP_MASTER)
1005 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;
1008 exe_spell(caster_ptr, REALM_MUSIC, spell, SPELL_CONT);
1013 * @brief 現在呪いを保持している装備品を一つランダムに探し出す / Choose one of items that have cursed flag
1014 * @param flag 探し出したい呪いフラグ配列
1015 * @return 該当の呪いが一つでもあった場合にランダムに選ばれた装備品のオブジェクト構造体参照ポインタを返す。\n
1018 static object_type *choose_cursed_obj_name(player_type *player_ptr, BIT_FLAGS flag)
1020 int choices[INVEN_TOTAL - INVEN_RARM];
1022 if (!(player_ptr->cursed & flag)) return NULL;
1024 for (int i = INVEN_RARM; i < INVEN_TOTAL; i++)
1026 object_type *o_ptr = &player_ptr->inventory_list[i];
1027 if (o_ptr->curse_flags & flag)
1029 choices[number] = i;
1032 else if ((flag == TRC_ADD_L_CURSE) ||
1033 (flag == TRC_ADD_H_CURSE) ||
1034 (flag == TRC_DRAIN_HP) ||
1035 (flag == TRC_DRAIN_MANA) ||
1036 (flag == TRC_CALL_ANIMAL) ||
1037 (flag == TRC_CALL_DEMON) ||
1038 (flag == TRC_CALL_DRAGON) ||
1039 (flag == TRC_CALL_UNDEAD) ||
1040 (flag == TRC_COWARDICE) ||
1041 (flag == TRC_LOW_MELEE) ||
1042 (flag == TRC_LOW_AC) ||
1043 (flag == TRC_LOW_MAGIC) ||
1044 (flag == TRC_FAST_DIGEST) ||
1045 (flag == TRC_SLOW_REGEN))
1048 BIT_FLAGS flgs[TR_FLAG_SIZE];
1049 object_flags(o_ptr, flgs);
1052 case TRC_ADD_L_CURSE: cf = TR_ADD_L_CURSE; break;
1053 case TRC_ADD_H_CURSE: cf = TR_ADD_H_CURSE; break;
1054 case TRC_DRAIN_HP: cf = TR_DRAIN_HP; break;
1055 case TRC_DRAIN_MANA: cf = TR_DRAIN_MANA; break;
1056 case TRC_CALL_ANIMAL: cf = TR_CALL_ANIMAL; break;
1057 case TRC_CALL_DEMON: cf = TR_CALL_DEMON; break;
1058 case TRC_CALL_DRAGON: cf = TR_CALL_DRAGON; break;
1059 case TRC_CALL_UNDEAD: cf = TR_CALL_UNDEAD; break;
1060 case TRC_COWARDICE: cf = TR_COWARDICE; break;
1061 case TRC_LOW_MELEE: cf = TR_LOW_MELEE; break;
1062 case TRC_LOW_AC: cf = TR_LOW_AC; break;
1063 case TRC_LOW_MAGIC: cf = TR_LOW_MAGIC; break;
1064 case TRC_FAST_DIGEST: cf = TR_FAST_DIGEST; break;
1065 case TRC_SLOW_REGEN: cf = TR_SLOW_REGEN; break;
1068 if (have_flag(flgs, cf))
1070 choices[number] = i;
1076 return &player_ptr->inventory_list[choices[randint0(number)]];
1081 * @brief 10ゲームターンが進行するごとにプレイヤーの空腹状態を飢餓方向に向かわせる
1082 * @param creature_ptr プレーヤーへの参照ポインタ
1085 static void process_world_aux_digestion(player_type *creature_ptr)
1087 if (creature_ptr->phase_out) return;
1089 if (creature_ptr->food >= PY_FOOD_MAX)
1091 (void)set_food(creature_ptr, creature_ptr->food - 100);
1093 else if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 5)))
1095 int digestion = SPEED_TO_ENERGY(creature_ptr->pspeed);
1096 if (creature_ptr->regenerate)
1098 if (creature_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1100 if (creature_ptr->cursed & TRC_FAST_DIGEST)
1103 if (creature_ptr->slow_digest)
1106 if (digestion < 1) digestion = 1;
1107 if (digestion > 100) digestion = 100;
1109 (void)set_food(creature_ptr, creature_ptr->food - digestion);
1112 if ((creature_ptr->food >= PY_FOOD_FAINT)) return;
1114 if (!creature_ptr->paralyzed && (randint0(100) < 10))
1116 msg_print(_("あまりにも空腹で気絶してしまった。", "You faint from the lack of food."));
1117 disturb(creature_ptr, TRUE, TRUE);
1118 (void)set_paralyzed(creature_ptr, creature_ptr->paralyzed + 1 + randint0(5));
1121 if (creature_ptr->food < PY_FOOD_STARVE)
1123 HIT_POINT dam = (PY_FOOD_STARVE - creature_ptr->food) / 10;
1124 if (!IS_INVULN(creature_ptr)) take_hit(creature_ptr, DAMAGE_LOSELIFE, dam, _("空腹", "starvation"), -1);
1130 * @brief 10ゲームターンが進行するごとにプレイヤーのHPとMPの増減処理を行う。
1131 * / Handle timed damage and regeneration every 10 game turns
1134 static void process_world_aux_hp_and_sp(player_type *creature_ptr)
1136 feature_type *f_ptr = &f_info[creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].feat];
1137 bool cave_no_regen = FALSE;
1138 int upkeep_factor = 0;
1139 int regen_amount = PY_REGEN_NORMAL;
1140 if (creature_ptr->poisoned && !IS_INVULN(creature_ptr))
1142 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, _("毒", "poison"), -1);
1145 if (creature_ptr->cut && !IS_INVULN(creature_ptr))
1148 if (creature_ptr->cut > 1000)
1152 else if (creature_ptr->cut > 200)
1156 else if (creature_ptr->cut > 100)
1160 else if (creature_ptr->cut > 50)
1164 else if (creature_ptr->cut > 25)
1168 else if (creature_ptr->cut > 10)
1177 take_hit(creature_ptr, DAMAGE_NOESCAPE, dam, _("致命傷", "a fatal wound"), -1);
1180 if (PRACE_IS_(creature_ptr, RACE_VAMPIRE) || (creature_ptr->mimic_form == MIMIC_VAMPIRE))
1182 if (!creature_ptr->current_floor_ptr->dun_level && !creature_ptr->resist_lite && !IS_INVULN(creature_ptr) && is_daytime())
1184 if ((creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
1186 msg_print(_("日光があなたのアンデッドの肉体を焼き焦がした!", "The sun's rays scorch your undead flesh!"));
1187 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, _("日光", "sunlight"), -1);
1188 cave_no_regen = TRUE;
1192 if (creature_ptr->inventory_list[INVEN_LITE].tval && (creature_ptr->inventory_list[INVEN_LITE].name2 != EGO_LITE_DARKNESS) &&
1193 !creature_ptr->resist_lite)
1195 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
1196 GAME_TEXT o_name[MAX_NLEN];
1197 char ouch[MAX_NLEN + 40];
1198 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1199 msg_format(_("%sがあなたのアンデッドの肉体を焼き焦がした!", "The %s scorches your undead flesh!"), o_name);
1201 cave_no_regen = TRUE;
1202 object_desc(creature_ptr, o_name, o_ptr, OD_NAME_ONLY);
1203 sprintf(ouch, _("%sを装備したダメージ", "wielding %s"), o_name);
1205 if (!IS_INVULN(creature_ptr)) take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, ouch, -1);
1209 if (have_flag(f_ptr->flags, FF_LAVA) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_fire)
1213 if (have_flag(f_ptr->flags, FF_DEEP))
1215 damage = 6000 + randint0(4000);
1217 else if (!creature_ptr->levitation)
1219 damage = 3000 + randint0(2000);
1224 if (PRACE_IS_(creature_ptr, RACE_ENT)) damage += damage / 3;
1225 if (creature_ptr->resist_fire) damage = damage / 3;
1226 if (is_oppose_fire(creature_ptr)) damage = damage / 3;
1227 if (creature_ptr->levitation) damage = damage / 5;
1229 damage = damage / 100 + (randint0(100) < (damage % 100));
1231 if (creature_ptr->levitation)
1233 msg_print(_("熱で火傷した!", "The heat burns you!"));
1234 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1235 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1239 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1240 msg_format(_("%sで火傷した!", "The %s burns you!"), name);
1241 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1244 cave_no_regen = TRUE;
1248 if (have_flag(f_ptr->flags, FF_COLD_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_cold)
1252 if (have_flag(f_ptr->flags, FF_DEEP))
1254 damage = 6000 + randint0(4000);
1256 else if (!creature_ptr->levitation)
1258 damage = 3000 + randint0(2000);
1263 if (creature_ptr->resist_cold) damage = damage / 3;
1264 if (is_oppose_cold(creature_ptr)) damage = damage / 3;
1265 if (creature_ptr->levitation) damage = damage / 5;
1267 damage = damage / 100 + (randint0(100) < (damage % 100));
1269 if (creature_ptr->levitation)
1271 msg_print(_("冷気に覆われた!", "The cold engulfs you!"));
1272 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1273 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1277 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1278 msg_format(_("%sに凍えた!", "The %s frostbites you!"), name);
1279 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1282 cave_no_regen = TRUE;
1286 if (have_flag(f_ptr->flags, FF_ELEC_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_elec)
1290 if (have_flag(f_ptr->flags, FF_DEEP))
1292 damage = 6000 + randint0(4000);
1294 else if (!creature_ptr->levitation)
1296 damage = 3000 + randint0(2000);
1301 if (creature_ptr->resist_elec) damage = damage / 3;
1302 if (is_oppose_elec(creature_ptr)) damage = damage / 3;
1303 if (creature_ptr->levitation) damage = damage / 5;
1305 damage = damage / 100 + (randint0(100) < (damage % 100));
1307 if (creature_ptr->levitation)
1309 msg_print(_("電撃を受けた!", "The electricity shocks you!"));
1310 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1311 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1315 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1316 msg_format(_("%sに感電した!", "The %s shocks you!"), name);
1317 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1320 cave_no_regen = TRUE;
1324 if (have_flag(f_ptr->flags, FF_ACID_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_acid)
1328 if (have_flag(f_ptr->flags, FF_DEEP))
1330 damage = 6000 + randint0(4000);
1332 else if (!creature_ptr->levitation)
1334 damage = 3000 + randint0(2000);
1339 if (creature_ptr->resist_acid) damage = damage / 3;
1340 if (is_oppose_acid(creature_ptr)) damage = damage / 3;
1341 if (creature_ptr->levitation) damage = damage / 5;
1343 damage = damage / 100 + (randint0(100) < (damage % 100));
1345 if (creature_ptr->levitation)
1347 msg_print(_("酸が飛び散った!", "The acid melts you!"));
1348 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1349 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1353 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1354 msg_format(_("%sに溶かされた!", "The %s melts you!"), name);
1355 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1358 cave_no_regen = TRUE;
1362 if (have_flag(f_ptr->flags, FF_POISON_PUDDLE) && !IS_INVULN(creature_ptr))
1366 if (have_flag(f_ptr->flags, FF_DEEP))
1368 damage = 6000 + randint0(4000);
1370 else if (!creature_ptr->levitation)
1372 damage = 3000 + randint0(2000);
1377 if (creature_ptr->resist_pois) damage = damage / 3;
1378 if (is_oppose_pois(creature_ptr)) damage = damage / 3;
1379 if (creature_ptr->levitation) damage = damage / 5;
1381 damage = damage / 100 + (randint0(100) < (damage % 100));
1383 if (creature_ptr->levitation)
1385 msg_print(_("毒気を吸い込んだ!", "The gas poisons you!"));
1386 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1387 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1388 if (creature_ptr->resist_pois) (void)set_poisoned(creature_ptr, creature_ptr->poisoned + 1);
1392 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1393 msg_format(_("%sに毒された!", "The %s poisons you!"), name);
1394 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1395 if (creature_ptr->resist_pois) (void)set_poisoned(creature_ptr, creature_ptr->poisoned + 3);
1398 cave_no_regen = TRUE;
1402 if (have_flag(f_ptr->flags, FF_WATER) && have_flag(f_ptr->flags, FF_DEEP) &&
1403 !creature_ptr->levitation && !creature_ptr->can_swim && !creature_ptr->resist_water)
1405 if (creature_ptr->total_weight > weight_limit(creature_ptr))
1407 msg_print(_("溺れている!", "You are drowning!"));
1408 take_hit(creature_ptr, DAMAGE_NOESCAPE, randint1(creature_ptr->lev), _("溺れ", "drowning"), -1);
1409 cave_no_regen = TRUE;
1413 if (creature_ptr->riding)
1416 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags2 & RF2_AURA_FIRE) && !creature_ptr->immune_fire)
1418 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1419 if (PRACE_IS_(creature_ptr, RACE_ENT)) damage += damage / 3;
1420 if (creature_ptr->resist_fire) damage = damage / 3;
1421 if (is_oppose_fire(creature_ptr)) damage = damage / 3;
1422 msg_print(_("熱い!", "It's hot!"));
1423 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("炎のオーラ", "Fire aura"), -1);
1425 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags2 & RF2_AURA_ELEC) && !creature_ptr->immune_elec)
1427 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1428 if (PRACE_IS_(creature_ptr, RACE_ANDROID)) damage += damage / 3;
1429 if (creature_ptr->resist_elec) damage = damage / 3;
1430 if (is_oppose_elec(creature_ptr)) damage = damage / 3;
1431 msg_print(_("痛い!", "It hurts!"));
1432 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("電気のオーラ", "Elec aura"), -1);
1434 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags3 & RF3_AURA_COLD) && !creature_ptr->immune_cold)
1436 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1437 if (creature_ptr->resist_cold) damage = damage / 3;
1438 if (is_oppose_cold(creature_ptr)) damage = damage / 3;
1439 msg_print(_("冷たい!", "It's cold!"));
1440 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("冷気のオーラ", "Cold aura"), -1);
1444 /* Spectres -- take damage when moving through walls */
1446 * Added: ANYBODY takes damage if inside through walls
1447 * without wraith form -- NOTE: Spectres will never be
1448 * reduced below 0 hp by being inside a stone wall; others
1451 if (!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY))
1453 if (!IS_INVULN(creature_ptr) && !creature_ptr->wraith_form && !creature_ptr->kabenuke && ((creature_ptr->chp > (creature_ptr->lev / 5)) || !creature_ptr->pass_wall))
1456 cave_no_regen = TRUE;
1458 if (creature_ptr->pass_wall)
1460 msg_print(_("体の分子が分解した気がする!", "Your molecules feel disrupted!"));
1461 dam_desc = _("密度", "density");
1465 msg_print(_("崩れた岩に押し潰された!", "You are being crushed!"));
1466 dam_desc = _("硬い岩", "solid rock");
1469 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1 + (creature_ptr->lev / 5), dam_desc, -1);
1473 if (creature_ptr->food < PY_FOOD_WEAK)
1475 if (creature_ptr->food < PY_FOOD_STARVE)
1479 else if (creature_ptr->food < PY_FOOD_FAINT)
1481 regen_amount = PY_REGEN_FAINT;
1485 regen_amount = PY_REGEN_WEAK;
1489 if (pattern_effect(creature_ptr))
1491 cave_no_regen = TRUE;
1495 if (creature_ptr->regenerate)
1497 regen_amount = regen_amount * 2;
1499 if (creature_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1503 if (creature_ptr->cursed & TRC_SLOW_REGEN)
1509 if ((creature_ptr->action == ACTION_SEARCH) || (creature_ptr->action == ACTION_REST))
1511 regen_amount = regen_amount * 2;
1514 upkeep_factor = calculate_upkeep(creature_ptr);
1515 if ((creature_ptr->action == ACTION_LEARN) ||
1516 (creature_ptr->action == ACTION_HAYAGAKE) ||
1517 (creature_ptr->special_defense & KATA_KOUKIJIN))
1519 upkeep_factor += 100;
1522 regenmana(creature_ptr, upkeep_factor, regen_amount);
1523 if (creature_ptr->pclass == CLASS_MAGIC_EATER)
1525 regenmagic(creature_ptr, regen_amount);
1528 if ((creature_ptr->csp == 0) && (creature_ptr->csp_frac == 0))
1530 while (upkeep_factor > 100)
1532 msg_print(_("こんなに多くのペットを制御できない!", "Too many pets to control at once!"));
1534 do_cmd_pet_dismiss(creature_ptr);
1536 upkeep_factor = calculate_upkeep(creature_ptr);
1538 msg_format(_("維持MPは %d%%", "Upkeep: %d%% mana."), upkeep_factor);
1543 if (creature_ptr->poisoned) regen_amount = 0;
1544 if (creature_ptr->cut) regen_amount = 0;
1545 if (cave_no_regen) regen_amount = 0;
1547 regen_amount = (regen_amount * creature_ptr->mutant_regenerate_mod) / 100;
1548 if ((creature_ptr->chp < creature_ptr->mhp) && !cave_no_regen)
1550 regenhp(creature_ptr, regen_amount);
1556 * @brief 10ゲームターンが進行するごとに魔法効果の残りターンを減らしていく処理
1557 * / Handle timeout every 10 game turns
1560 static void process_world_aux_timeout(player_type *creature_ptr)
1562 const int dec_count = (easy_band ? 2 : 1);
1563 if (creature_ptr->tim_mimic)
1565 (void)set_mimic(creature_ptr, creature_ptr->tim_mimic - 1, creature_ptr->mimic_form, TRUE);
1568 if (creature_ptr->image)
1570 (void)set_image(creature_ptr, creature_ptr->image - dec_count);
1573 if (creature_ptr->blind)
1575 (void)set_blind(creature_ptr, creature_ptr->blind - dec_count);
1578 if (creature_ptr->tim_invis)
1580 (void)set_tim_invis(creature_ptr, creature_ptr->tim_invis - 1, TRUE);
1583 if (creature_ptr->suppress_multi_reward)
1585 creature_ptr->suppress_multi_reward = FALSE;
1588 if (creature_ptr->tim_esp)
1590 (void)set_tim_esp(creature_ptr, creature_ptr->tim_esp - 1, TRUE);
1593 if (creature_ptr->ele_attack)
1595 creature_ptr->ele_attack--;
1596 if (!creature_ptr->ele_attack) set_ele_attack(creature_ptr, 0, 0);
1599 if (creature_ptr->ele_immune)
1601 creature_ptr->ele_immune--;
1602 if (!creature_ptr->ele_immune) set_ele_immune(creature_ptr, 0, 0);
1605 if (creature_ptr->tim_infra)
1607 (void)set_tim_infra(creature_ptr, creature_ptr->tim_infra - 1, TRUE);
1610 if (creature_ptr->tim_stealth)
1612 (void)set_tim_stealth(creature_ptr, creature_ptr->tim_stealth - 1, TRUE);
1615 if (creature_ptr->tim_levitation)
1617 (void)set_tim_levitation(creature_ptr, creature_ptr->tim_levitation - 1, TRUE);
1620 if (creature_ptr->tim_sh_touki)
1622 (void)set_tim_sh_touki(creature_ptr, creature_ptr->tim_sh_touki - 1, TRUE);
1625 if (creature_ptr->tim_sh_fire)
1627 (void)set_tim_sh_fire(creature_ptr, creature_ptr->tim_sh_fire - 1, TRUE);
1630 if (creature_ptr->tim_sh_holy)
1632 (void)set_tim_sh_holy(creature_ptr, creature_ptr->tim_sh_holy - 1, TRUE);
1635 if (creature_ptr->tim_eyeeye)
1637 (void)set_tim_eyeeye(creature_ptr, creature_ptr->tim_eyeeye - 1, TRUE);
1640 if (creature_ptr->resist_magic)
1642 (void)set_resist_magic(creature_ptr, creature_ptr->resist_magic - 1, TRUE);
1645 if (creature_ptr->tim_regen)
1647 (void)set_tim_regen(creature_ptr, creature_ptr->tim_regen - 1, TRUE);
1650 if (creature_ptr->tim_res_nether)
1652 (void)set_tim_res_nether(creature_ptr, creature_ptr->tim_res_nether - 1, TRUE);
1655 if (creature_ptr->tim_res_time)
1657 (void)set_tim_res_time(creature_ptr, creature_ptr->tim_res_time - 1, TRUE);
1660 if (creature_ptr->tim_reflect)
1662 (void)set_tim_reflect(creature_ptr, creature_ptr->tim_reflect - 1, TRUE);
1665 if (creature_ptr->multishadow)
1667 (void)set_multishadow(creature_ptr, creature_ptr->multishadow - 1, TRUE);
1670 if (creature_ptr->dustrobe)
1672 (void)set_dustrobe(creature_ptr, creature_ptr->dustrobe - 1, TRUE);
1675 if (creature_ptr->kabenuke)
1677 (void)set_kabenuke(creature_ptr, creature_ptr->kabenuke - 1, TRUE);
1680 if (creature_ptr->paralyzed)
1682 (void)set_paralyzed(creature_ptr, creature_ptr->paralyzed - dec_count);
1685 if (creature_ptr->confused)
1687 (void)set_confused(creature_ptr, creature_ptr->confused - dec_count);
1690 if (creature_ptr->afraid)
1692 (void)set_afraid(creature_ptr, creature_ptr->afraid - dec_count);
1695 if (creature_ptr->fast)
1697 (void)set_fast(creature_ptr, creature_ptr->fast - 1, TRUE);
1700 if (creature_ptr->slow)
1702 (void)set_slow(creature_ptr, creature_ptr->slow - dec_count, TRUE);
1705 if (creature_ptr->protevil)
1707 (void)set_protevil(creature_ptr, creature_ptr->protevil - 1, TRUE);
1710 if (creature_ptr->invuln)
1712 (void)set_invuln(creature_ptr, creature_ptr->invuln - 1, TRUE);
1715 if (creature_ptr->wraith_form)
1717 (void)set_wraith_form(creature_ptr, creature_ptr->wraith_form - 1, TRUE);
1720 if (creature_ptr->hero)
1722 (void)set_hero(creature_ptr, creature_ptr->hero - 1, TRUE);
1725 if (creature_ptr->shero)
1727 (void)set_shero(creature_ptr, creature_ptr->shero - 1, TRUE);
1730 if (creature_ptr->blessed)
1732 (void)set_blessed(creature_ptr, creature_ptr->blessed - 1, TRUE);
1735 if (creature_ptr->shield)
1737 (void)set_shield(creature_ptr, creature_ptr->shield - 1, TRUE);
1740 if (creature_ptr->tsubureru)
1742 (void)set_tsubureru(creature_ptr, creature_ptr->tsubureru - 1, TRUE);
1745 if (creature_ptr->magicdef)
1747 (void)set_magicdef(creature_ptr, creature_ptr->magicdef - 1, TRUE);
1750 if (creature_ptr->tsuyoshi)
1752 (void)set_tsuyoshi(creature_ptr, creature_ptr->tsuyoshi - 1, TRUE);
1755 if (creature_ptr->oppose_acid)
1757 (void)set_oppose_acid(creature_ptr, creature_ptr->oppose_acid - 1, TRUE);
1760 if (creature_ptr->oppose_elec)
1762 (void)set_oppose_elec(creature_ptr, creature_ptr->oppose_elec - 1, TRUE);
1765 if (creature_ptr->oppose_fire)
1767 (void)set_oppose_fire(creature_ptr, creature_ptr->oppose_fire - 1, TRUE);
1770 if (creature_ptr->oppose_cold)
1772 (void)set_oppose_cold(creature_ptr, creature_ptr->oppose_cold - 1, TRUE);
1775 if (creature_ptr->oppose_pois)
1777 (void)set_oppose_pois(creature_ptr, creature_ptr->oppose_pois - 1, TRUE);
1780 if (creature_ptr->ult_res)
1782 (void)set_ultimate_res(creature_ptr, creature_ptr->ult_res - 1, TRUE);
1785 if (creature_ptr->poisoned)
1787 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
1788 (void)set_poisoned(creature_ptr, creature_ptr->poisoned - adjust);
1791 if (creature_ptr->stun)
1793 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
1794 (void)set_stun(creature_ptr, creature_ptr->stun - adjust);
1797 if (creature_ptr->cut)
1799 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
1800 if (creature_ptr->cut > 1000) adjust = 0;
1801 (void)set_cut(creature_ptr, creature_ptr->cut - adjust);
1807 * @brief 10ゲームターンが進行する毎に光源の寿命を減らす処理
1808 * / Handle burning fuel every 10 game turns
1811 static void process_world_aux_light(player_type *creature_ptr)
1813 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
1814 if (o_ptr->tval == TV_LITE)
1816 if (!(object_is_fixed_artifact(o_ptr) || o_ptr->sval == SV_LITE_FEANOR) && (o_ptr->xtra4 > 0))
1818 if (o_ptr->name2 == EGO_LITE_LONG)
1820 if (current_world_ptr->game_turn % (TURNS_PER_TICK * 2)) o_ptr->xtra4--;
1822 else o_ptr->xtra4--;
1824 notice_lite_change(creature_ptr, o_ptr);
1831 * @brief 10ゲームターンが進行するごとに突然変異の発動判定を行う処理
1832 * / Handle mutation effects once every 10 game turns
1835 static void process_world_aux_mutation(player_type *creature_ptr)
1837 if (!creature_ptr->muta2) return;
1838 if (creature_ptr->phase_out) return;
1839 if (creature_ptr->wild_mode) return;
1841 if ((creature_ptr->muta2 & MUT2_BERS_RAGE) && one_in_(3000))
1843 disturb(creature_ptr, FALSE, TRUE);
1844 msg_print(_("ウガァァア!", "RAAAAGHH!"));
1845 msg_print(_("激怒の発作に襲われた!", "You feel a fit of rage coming over you!"));
1846 (void)set_shero(creature_ptr, 10 + randint1(creature_ptr->lev), FALSE);
1847 (void)set_afraid(creature_ptr, 0);
1850 if ((creature_ptr->muta2 & MUT2_COWARDICE) && (randint1(3000) == 13))
1852 if (!creature_ptr->resist_fear)
1854 disturb(creature_ptr, FALSE, TRUE);
1855 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
1856 set_afraid(creature_ptr, creature_ptr->afraid + 13 + randint1(26));
1860 if ((creature_ptr->muta2 & MUT2_RTELEPORT) && (randint1(5000) == 88))
1862 if (!creature_ptr->resist_nexus && !(creature_ptr->muta1 & MUT1_VTELEPORT) && !creature_ptr->anti_tele)
1864 disturb(creature_ptr, FALSE, TRUE);
1865 msg_print(_("あなたの位置は突然ひじょうに不確定になった...", "Your position suddenly seems very uncertain..."));
1867 teleport_player(creature_ptr, 40, TELEPORT_PASSIVE);
1871 if ((creature_ptr->muta2 & MUT2_ALCOHOL) && (randint1(6400) == 321))
1873 if (!creature_ptr->resist_conf && !creature_ptr->resist_chaos)
1875 disturb(creature_ptr, FALSE, TRUE);
1876 creature_ptr->redraw |= PR_EXTRA;
1877 msg_print(_("いひきがもーろーとひてきたきがふる...ヒック!", "You feel a SSSCHtupor cOmINg over yOu... *HIC*!"));
1880 if (!creature_ptr->resist_conf)
1882 (void)set_confused(creature_ptr, creature_ptr->confused + randint0(20) + 15);
1885 if (!creature_ptr->resist_chaos)
1890 if (one_in_(3)) lose_all_info(creature_ptr);
1891 else wiz_dark(creature_ptr);
1892 (void)teleport_player_aux(creature_ptr, 100, FALSE, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE);
1893 wiz_dark(creature_ptr);
1894 msg_print(_("あなたは見知らぬ場所で目が醒めた...頭が痛い。", "You wake up somewhere with a sore head..."));
1895 msg_print(_("何も覚えていない。どうやってここに来たかも分からない!", "You can't remember a thing or how you got here!"));
1901 msg_print(_("き~れいなちょおちょらとんれいる~", "Thishcischs GooDSChtuff!"));
1902 (void)set_image(creature_ptr, creature_ptr->image + randint0(150) + 150);
1908 if ((creature_ptr->muta2 & MUT2_HALLU) && (randint1(6400) == 42))
1910 if (!creature_ptr->resist_chaos)
1912 disturb(creature_ptr, FALSE, TRUE);
1913 creature_ptr->redraw |= PR_EXTRA;
1914 (void)set_image(creature_ptr, creature_ptr->image + randint0(50) + 20);
1918 if ((creature_ptr->muta2 & MUT2_FLATULENT) && (randint1(3000) == 13))
1920 disturb(creature_ptr, FALSE, TRUE);
1921 msg_print(_("ブゥーーッ!おっと。", "BRRAAAP! Oops."));
1923 fire_ball(creature_ptr, GF_POIS, 0, creature_ptr->lev, 3);
1926 if ((creature_ptr->muta2 & MUT2_PROD_MANA) &&
1927 !creature_ptr->anti_magic && one_in_(9000))
1930 disturb(creature_ptr, FALSE, TRUE);
1931 msg_print(_("魔法のエネルギーが突然あなたの中に流れ込んできた!エネルギーを解放しなければならない!",
1932 "Magical energy flows through you! You must release it!"));
1936 (void)get_hack_dir(creature_ptr, &dire);
1937 fire_ball(creature_ptr, GF_MANA, dire, creature_ptr->lev * 2, 3);
1940 if ((creature_ptr->muta2 & MUT2_ATT_DEMON) && !creature_ptr->anti_magic && (randint1(6666) == 666))
1942 bool pet = one_in_(6);
1943 BIT_FLAGS mode = PM_ALLOW_GROUP;
1945 if (pet) mode |= PM_FORCE_PET;
1946 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
1948 if (summon_specific(creature_ptr, (pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DEMON, mode))
1950 msg_print(_("あなたはデーモンを引き寄せた!", "You have attracted a demon!"));
1951 disturb(creature_ptr, FALSE, TRUE);
1955 if ((creature_ptr->muta2 & MUT2_SPEED_FLUX) && one_in_(6000))
1957 disturb(creature_ptr, FALSE, TRUE);
1960 msg_print(_("精力的でなくなった気がする。", "You feel less energetic."));
1962 if (creature_ptr->fast > 0)
1964 set_fast(creature_ptr, 0, TRUE);
1968 set_slow(creature_ptr, randint1(30) + 10, FALSE);
1973 msg_print(_("精力的になった気がする。", "You feel more energetic."));
1975 if (creature_ptr->slow > 0)
1977 set_slow(creature_ptr, 0, TRUE);
1981 set_fast(creature_ptr, randint1(30) + 10, FALSE);
1986 if ((creature_ptr->muta2 & MUT2_BANISH_ALL) && one_in_(9000))
1988 disturb(creature_ptr, FALSE, TRUE);
1989 msg_print(_("突然ほとんど孤独になった気がする。", "You suddenly feel almost lonely."));
1991 banish_monsters(creature_ptr, 100);
1992 if (!creature_ptr->current_floor_ptr->dun_level && creature_ptr->town_num)
1997 n = randint0(MAX_STORES);
1998 } while ((n == STORE_HOME) || (n == STORE_MUSEUM));
2000 msg_print(_("店の主人が丘に向かって走っている!", "You see one of the shopkeepers running for the hills!"));
2001 store_shuffle(creature_ptr, n);
2006 if ((creature_ptr->muta2 & MUT2_EAT_LIGHT) && one_in_(3000))
2010 msg_print(_("影につつまれた。", "A shadow passes over you."));
2013 if ((creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
2015 hp_player(creature_ptr, 10);
2018 o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
2020 if (o_ptr->tval == TV_LITE)
2022 if (!object_is_fixed_artifact(o_ptr) && (o_ptr->xtra4 > 0))
2024 hp_player(creature_ptr, o_ptr->xtra4 / 20);
2026 msg_print(_("光源からエネルギーを吸収した!", "You absorb energy from your light!"));
2027 notice_lite_change(creature_ptr, o_ptr);
2032 * Unlite the area (radius 10) around player and
2033 * do 50 points damage to every affected monster
2035 unlite_area(creature_ptr, 50, 10);
2038 if ((creature_ptr->muta2 & MUT2_ATT_ANIMAL) && !creature_ptr->anti_magic && one_in_(7000))
2040 bool pet = one_in_(3);
2041 BIT_FLAGS mode = PM_ALLOW_GROUP;
2043 if (pet) mode |= PM_FORCE_PET;
2044 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2046 if (summon_specific(creature_ptr, (pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_ANIMAL, mode))
2048 msg_print(_("動物を引き寄せた!", "You have attracted an animal!"));
2049 disturb(creature_ptr, FALSE, TRUE);
2053 if ((creature_ptr->muta2 & MUT2_RAW_CHAOS) && !creature_ptr->anti_magic && one_in_(8000))
2055 disturb(creature_ptr, FALSE, TRUE);
2056 msg_print(_("周りの空間が歪んでいる気がする!", "You feel the world warping around you!"));
2059 fire_ball(creature_ptr, GF_CHAOS, 0, creature_ptr->lev, 8);
2062 if ((creature_ptr->muta2 & MUT2_NORMALITY) && one_in_(5000))
2064 if (!lose_mutation(creature_ptr, 0))
2065 msg_print(_("奇妙なくらい普通になった気がする。", "You feel oddly normal."));
2068 if ((creature_ptr->muta2 & MUT2_WRAITH) && !creature_ptr->anti_magic && one_in_(3000))
2070 disturb(creature_ptr, FALSE, TRUE);
2071 msg_print(_("非物質化した!", "You feel insubstantial!"));
2074 set_wraith_form(creature_ptr, randint1(creature_ptr->lev / 2) + (creature_ptr->lev / 2), FALSE);
2077 if ((creature_ptr->muta2 & MUT2_POLY_WOUND) && one_in_(3000))
2079 do_poly_wounds(creature_ptr);
2082 if ((creature_ptr->muta2 & MUT2_WASTING) && one_in_(3000))
2084 int which_stat = randint0(A_MAX);
2085 int sustained = FALSE;
2090 if (creature_ptr->sustain_str) sustained = TRUE;
2093 if (creature_ptr->sustain_int) sustained = TRUE;
2096 if (creature_ptr->sustain_wis) sustained = TRUE;
2099 if (creature_ptr->sustain_dex) sustained = TRUE;
2102 if (creature_ptr->sustain_con) sustained = TRUE;
2105 if (creature_ptr->sustain_chr) sustained = TRUE;
2108 msg_print(_("不正な状態!", "Invalid stat chosen!"));
2114 disturb(creature_ptr, FALSE, TRUE);
2115 msg_print(_("自分が衰弱していくのが分かる!", "You can feel yourself wasting away!"));
2117 (void)dec_stat(creature_ptr, which_stat, randint1(6) + 6, one_in_(3));
2121 if ((creature_ptr->muta2 & MUT2_ATT_DRAGON) && !creature_ptr->anti_magic && one_in_(3000))
2123 bool pet = one_in_(5);
2124 BIT_FLAGS mode = PM_ALLOW_GROUP;
2126 if (pet) mode |= PM_FORCE_PET;
2127 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2129 if (summon_specific(creature_ptr, (pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DRAGON, mode))
2131 msg_print(_("ドラゴンを引き寄せた!", "You have attracted a dragon!"));
2132 disturb(creature_ptr, FALSE, TRUE);
2136 if ((creature_ptr->muta2 & MUT2_WEIRD_MIND) && !creature_ptr->anti_magic && one_in_(3000))
2138 if (creature_ptr->tim_esp > 0)
2140 msg_print(_("精神にもやがかかった!", "Your mind feels cloudy!"));
2141 set_tim_esp(creature_ptr, 0, TRUE);
2145 msg_print(_("精神が広がった!", "Your mind expands!"));
2146 set_tim_esp(creature_ptr, creature_ptr->lev, FALSE);
2150 if ((creature_ptr->muta2 & MUT2_NAUSEA) && !creature_ptr->slow_digest && one_in_(9000))
2152 disturb(creature_ptr, FALSE, TRUE);
2153 msg_print(_("胃が痙攣し、食事を失った!", "Your stomach roils, and you lose your lunch!"));
2155 set_food(creature_ptr, PY_FOOD_WEAK);
2156 if (music_singing_any(creature_ptr)) stop_singing(creature_ptr);
2157 if (hex_spelling_any(creature_ptr)) stop_hex_spell_all(creature_ptr);
2160 if ((creature_ptr->muta2 & MUT2_WALK_SHAD) && !creature_ptr->anti_magic && one_in_(12000) && !creature_ptr->current_floor_ptr->inside_arena)
2162 reserve_alter_reality(creature_ptr);
2165 if ((creature_ptr->muta2 & MUT2_WARNING) && one_in_(1000))
2167 int danger_amount = 0;
2168 for (MONSTER_IDX monster = 0; monster < creature_ptr->current_floor_ptr->m_max; monster++)
2170 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[monster];
2171 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2172 if (!monster_is_valid(m_ptr)) continue;
2174 if (r_ptr->level >= creature_ptr->lev)
2176 danger_amount += r_ptr->level - creature_ptr->lev + 1;
2180 if (danger_amount > 100)
2181 msg_print(_("非常に恐ろしい気がする!", "You feel utterly terrified!"));
2182 else if (danger_amount > 50)
2183 msg_print(_("恐ろしい気がする!", "You feel terrified!"));
2184 else if (danger_amount > 20)
2185 msg_print(_("非常に心配な気がする!", "You feel very worried!"));
2186 else if (danger_amount > 10)
2187 msg_print(_("心配な気がする!", "You feel paranoid!"));
2188 else if (danger_amount > 5)
2189 msg_print(_("ほとんど安全な気がする。", "You feel almost safe."));
2191 msg_print(_("寂しい気がする。", "You feel lonely."));
2194 if ((creature_ptr->muta2 & MUT2_INVULN) && !creature_ptr->anti_magic && one_in_(5000))
2196 disturb(creature_ptr, FALSE, TRUE);
2197 msg_print(_("無敵な気がする!", "You feel invincible!"));
2199 (void)set_invuln(creature_ptr, randint1(8) + 8, FALSE);
2202 if ((creature_ptr->muta2 & MUT2_SP_TO_HP) && one_in_(2000))
2204 MANA_POINT wounds = (MANA_POINT)(creature_ptr->mhp - creature_ptr->chp);
2208 HIT_POINT healing = creature_ptr->csp;
2209 if (healing > wounds) healing = wounds;
2211 hp_player(creature_ptr, healing);
2212 creature_ptr->csp -= healing;
2213 creature_ptr->redraw |= (PR_HP | PR_MANA);
2217 if ((creature_ptr->muta2 & MUT2_HP_TO_SP) && !creature_ptr->anti_magic && one_in_(4000))
2219 HIT_POINT wounds = (HIT_POINT)(creature_ptr->msp - creature_ptr->csp);
2223 HIT_POINT healing = creature_ptr->chp;
2224 if (healing > wounds) healing = wounds;
2226 creature_ptr->csp += healing;
2227 creature_ptr->redraw |= (PR_HP | PR_MANA);
2228 take_hit(creature_ptr, DAMAGE_LOSELIFE, healing, _("頭に昇った血", "blood rushing to the head"), -1);
2232 if ((creature_ptr->muta2 & MUT2_DISARM) && one_in_(10000))
2234 disturb(creature_ptr, FALSE, TRUE);
2235 msg_print(_("足がもつれて転んだ!", "You trip over your own feet!"));
2236 take_hit(creature_ptr, DAMAGE_NOESCAPE, randint1(creature_ptr->wt / 6), _("転倒", "tripping"), -1);
2237 drop_weapons(creature_ptr);
2243 * @brief 10ゲームターンが進行するごとに装備効果の発動判定を行う処理
2244 * / Handle curse effects once every 10 game turns
2247 static void process_world_aux_curse(player_type *creature_ptr)
2249 if ((creature_ptr->cursed & TRC_P_FLAG_MASK) && !creature_ptr->phase_out && !creature_ptr->wild_mode)
2252 * Hack: Uncursed teleporting items (e.g. Trump Weapons)
2253 * can actually be useful!
2255 if ((creature_ptr->cursed & TRC_TELEPORT_SELF) && one_in_(200))
2257 GAME_TEXT o_name[MAX_NLEN];
2259 int i_keep = 0, count = 0;
2260 for (int i = INVEN_RARM; i < INVEN_TOTAL; i++)
2262 BIT_FLAGS flgs[TR_FLAG_SIZE];
2263 o_ptr = &creature_ptr->inventory_list[i];
2264 if (!o_ptr->k_idx) continue;
2266 object_flags(o_ptr, flgs);
2268 if (have_flag(flgs, TR_TELEPORT))
2270 /* {.} will stop random teleportation. */
2271 if (!o_ptr->inscription || !my_strchr(quark_str(o_ptr->inscription), '.'))
2274 if (one_in_(count)) i_keep = i;
2279 o_ptr = &creature_ptr->inventory_list[i_keep];
2280 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2281 msg_format(_("%sがテレポートの能力を発動させようとしている。", "Your %s is activating teleportation."), o_name);
2282 if (get_check_strict(_("テレポートしますか?", "Teleport? "), CHECK_OKAY_CANCEL))
2284 disturb(creature_ptr, FALSE, TRUE);
2285 teleport_player(creature_ptr, 50, 0L);
2289 msg_format(_("%sに{.}(ピリオド)と銘を刻むと発動を抑制できます。",
2290 "You can inscribe {.} on your %s to disable random teleportation. "), o_name);
2291 disturb(creature_ptr, TRUE, TRUE);
2295 if ((creature_ptr->cursed & TRC_CHAINSWORD) && one_in_(CHAINSWORD_NOISE))
2298 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, noise))
2300 disturb(creature_ptr, FALSE, FALSE);
2303 if ((creature_ptr->cursed & TRC_TY_CURSE) && one_in_(TY_CURSE_CHANCE))
2306 (void)activate_ty_curse(creature_ptr, FALSE, &count);
2309 if (creature_ptr->prace != RACE_ANDROID && ((creature_ptr->cursed & TRC_DRAIN_EXP) && one_in_(4)))
2311 creature_ptr->exp -= (creature_ptr->lev + 1) / 2;
2312 if (creature_ptr->exp < 0) creature_ptr->exp = 0;
2313 creature_ptr->max_exp -= (creature_ptr->lev + 1) / 2;
2314 if (creature_ptr->max_exp < 0) creature_ptr->max_exp = 0;
2315 check_experience(creature_ptr);
2318 if ((creature_ptr->cursed & TRC_ADD_L_CURSE) && one_in_(2000))
2321 o_ptr = choose_cursed_obj_name(creature_ptr, TRC_ADD_L_CURSE);
2322 BIT_FLAGS new_curse = get_curse(0, o_ptr);
2323 if (!(o_ptr->curse_flags & new_curse))
2325 GAME_TEXT o_name[MAX_NLEN];
2326 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2327 o_ptr->curse_flags |= new_curse;
2328 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2329 o_ptr->feeling = FEEL_NONE;
2330 creature_ptr->update |= (PU_BONUS);
2334 if ((creature_ptr->cursed & TRC_ADD_H_CURSE) && one_in_(2000))
2337 o_ptr = choose_cursed_obj_name(creature_ptr, TRC_ADD_H_CURSE);
2338 BIT_FLAGS new_curse = get_curse(1, o_ptr);
2339 if (!(o_ptr->curse_flags & new_curse))
2341 GAME_TEXT o_name[MAX_NLEN];
2343 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2345 o_ptr->curse_flags |= new_curse;
2346 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2347 o_ptr->feeling = FEEL_NONE;
2349 creature_ptr->update |= (PU_BONUS);
2353 if ((creature_ptr->cursed & TRC_CALL_ANIMAL) && one_in_(2500))
2355 if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_ANIMAL, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2357 GAME_TEXT o_name[MAX_NLEN];
2358 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_ANIMAL), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2359 msg_format(_("%sが動物を引き寄せた!", "Your %s has attracted an animal!"), o_name);
2360 disturb(creature_ptr, FALSE, TRUE);
2364 if ((creature_ptr->cursed & TRC_CALL_DEMON) && one_in_(1111))
2366 if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2368 GAME_TEXT o_name[MAX_NLEN];
2369 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_DEMON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2370 msg_format(_("%sが悪魔を引き寄せた!", "Your %s has attracted a demon!"), o_name);
2371 disturb(creature_ptr, FALSE, TRUE);
2375 if ((creature_ptr->cursed & TRC_CALL_DRAGON) && one_in_(800))
2377 if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DRAGON,
2378 (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2380 GAME_TEXT o_name[MAX_NLEN];
2381 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_DRAGON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2382 msg_format(_("%sがドラゴンを引き寄せた!", "Your %s has attracted an dragon!"), o_name);
2383 disturb(creature_ptr, FALSE, TRUE);
2387 if ((creature_ptr->cursed & TRC_CALL_UNDEAD) && one_in_(1111))
2389 if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_UNDEAD,
2390 (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2392 GAME_TEXT o_name[MAX_NLEN];
2393 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_UNDEAD), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2394 msg_format(_("%sが死霊を引き寄せた!", "Your %s has attracted an undead!"), o_name);
2395 disturb(creature_ptr, FALSE, TRUE);
2399 if ((creature_ptr->cursed & TRC_COWARDICE) && one_in_(1500))
2401 if (!creature_ptr->resist_fear)
2403 disturb(creature_ptr, FALSE, TRUE);
2404 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
2405 set_afraid(creature_ptr, creature_ptr->afraid + 13 + randint1(26));
2409 if ((creature_ptr->cursed & TRC_TELEPORT) && one_in_(200) && !creature_ptr->anti_tele)
2411 disturb(creature_ptr, FALSE, TRUE);
2412 teleport_player(creature_ptr, 40, TELEPORT_PASSIVE);
2415 if ((creature_ptr->cursed & TRC_DRAIN_HP) && one_in_(666))
2417 GAME_TEXT o_name[MAX_NLEN];
2418 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_DRAIN_HP), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2419 msg_format(_("%sはあなたの体力を吸収した!", "Your %s drains HP from you!"), o_name);
2420 take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev * 2, 100), o_name, -1);
2423 if ((creature_ptr->cursed & TRC_DRAIN_MANA) && creature_ptr->csp && one_in_(666))
2425 GAME_TEXT o_name[MAX_NLEN];
2426 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_DRAIN_MANA), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2427 msg_format(_("%sはあなたの魔力を吸収した!", "Your %s drains mana from you!"), o_name);
2428 creature_ptr->csp -= MIN(creature_ptr->lev, 50);
2429 if (creature_ptr->csp < 0)
2431 creature_ptr->csp = 0;
2432 creature_ptr->csp_frac = 0;
2435 creature_ptr->redraw |= PR_MANA;
2439 if (one_in_(999) && !creature_ptr->anti_magic)
2441 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
2442 if (o_ptr->name1 == ART_JUDGE)
2444 if (object_is_known(o_ptr))
2445 msg_print(_("『審判の宝石』はあなたの体力を吸収した!", "The Jewel of Judgement drains life from you!"));
2447 msg_print(_("なにかがあなたの体力を吸収した!", "Something drains life from you!"));
2448 take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev, 50), _("審判の宝石", "the Jewel of Judgement"), -1);
2455 * @brief 10ゲームターンが進行するごとに魔道具の自然充填を行う処理
2456 * / Handle recharging objects once every 10 game turns
2459 static void process_world_aux_recharge(player_type *creature_ptr)
2464 for (changed = FALSE, i = INVEN_RARM; i < INVEN_TOTAL; i++)
2466 object_type *o_ptr = &creature_ptr->inventory_list[i];
2467 if (!o_ptr->k_idx) continue;
2469 if (o_ptr->timeout > 0)
2472 if (!o_ptr->timeout)
2474 recharged_notice(creature_ptr, o_ptr);
2482 creature_ptr->window |= (PW_EQUIP);
2487 * Recharge rods. Rods now use timeout to control charging status,
2488 * and each charging rod in a stack decreases the stack's timeout by
2489 * one per turn. -LM-
2491 for (changed = FALSE, i = 0; i < INVEN_PACK; i++)
2493 object_type *o_ptr = &creature_ptr->inventory_list[i];
2494 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2495 if (!o_ptr->k_idx) continue;
2497 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2499 TIME_EFFECT temp = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval;
2500 if (temp > o_ptr->number) temp = (TIME_EFFECT)o_ptr->number;
2502 o_ptr->timeout -= temp;
2503 if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2505 if (!(o_ptr->timeout))
2507 recharged_notice(creature_ptr, o_ptr);
2510 else if (o_ptr->timeout % k_ptr->pval)
2519 creature_ptr->window |= (PW_INVEN);
2523 for (i = 1; i < creature_ptr->current_floor_ptr->o_max; i++)
2525 object_type *o_ptr = &creature_ptr->current_floor_ptr->o_list[i];
2526 if (!OBJECT_IS_VALID(o_ptr)) continue;
2528 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2530 o_ptr->timeout -= (TIME_EFFECT)o_ptr->number;
2531 if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2538 * @brief 10ゲームターンが進行するごとに帰還や現実変容などの残り時間カウントダウンと発動を処理する。
2539 * / Handle involuntary movement once every 10 game turns
2542 static void process_world_aux_movement(player_type *creature_ptr)
2544 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
2545 if (creature_ptr->word_recall)
2548 * HACK: Autosave BEFORE resetting the recall counter (rr9)
2549 * The player is yanked up/down as soon as
2550 * he loads the autosaved game.
2552 if (autosave_l && (creature_ptr->word_recall == 1) && !creature_ptr->phase_out)
2553 do_cmd_save_game(creature_ptr, TRUE);
2555 creature_ptr->word_recall--;
2556 creature_ptr->redraw |= (PR_STATUS);
2557 if (!creature_ptr->word_recall)
2559 disturb(creature_ptr, FALSE, TRUE);
2560 if (floor_ptr->dun_level || creature_ptr->current_floor_ptr->inside_quest || creature_ptr->enter_dungeon)
2562 msg_print(_("上に引っ張りあげられる感じがする!", "You feel yourself yanked upwards!"));
2563 if (creature_ptr->dungeon_idx) creature_ptr->recall_dungeon = creature_ptr->dungeon_idx;
2565 exe_write_diary(creature_ptr, DIARY_RECALL, floor_ptr->dun_level, NULL);
2567 floor_ptr->dun_level = 0;
2568 creature_ptr->dungeon_idx = 0;
2569 leave_quest_check(creature_ptr);
2570 leave_tower_check(creature_ptr);
2571 creature_ptr->current_floor_ptr->inside_quest = 0;
2572 creature_ptr->leaving = TRUE;
2576 msg_print(_("下に引きずり降ろされる感じがする!", "You feel yourself yanked downwards!"));
2577 creature_ptr->dungeon_idx = creature_ptr->recall_dungeon;
2579 exe_write_diary(creature_ptr, DIARY_RECALL, floor_ptr->dun_level, NULL);
2581 floor_ptr->dun_level = max_dlv[creature_ptr->dungeon_idx];
2582 if (floor_ptr->dun_level < 1) floor_ptr->dun_level = 1;
2583 if (ironman_nightmare && !randint0(666) && (creature_ptr->dungeon_idx == DUNGEON_ANGBAND))
2585 if (floor_ptr->dun_level < 50)
2587 floor_ptr->dun_level *= 2;
2589 else if (floor_ptr->dun_level < 99)
2591 floor_ptr->dun_level = (floor_ptr->dun_level + 99) / 2;
2593 else if (floor_ptr->dun_level > 100)
2595 floor_ptr->dun_level = d_info[creature_ptr->dungeon_idx].maxdepth - 1;
2599 if (creature_ptr->wild_mode)
2601 creature_ptr->wilderness_y = creature_ptr->y;
2602 creature_ptr->wilderness_x = creature_ptr->x;
2606 creature_ptr->oldpx = creature_ptr->x;
2607 creature_ptr->oldpy = creature_ptr->y;
2610 creature_ptr->wild_mode = FALSE;
2613 * Clear all saved floors
2614 * and create a first saved floor
2616 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
2617 creature_ptr->leaving = TRUE;
2619 if (creature_ptr->dungeon_idx == DUNGEON_ANGBAND)
2621 for (int i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++)
2623 quest_type* const q_ptr = &quest[i];
2624 if ((q_ptr->type == QUEST_TYPE_RANDOM) &&
2625 (q_ptr->status == QUEST_STATUS_TAKEN) &&
2626 (q_ptr->level < floor_ptr->dun_level))
2628 q_ptr->status = QUEST_STATUS_FAILED;
2629 q_ptr->complev = (byte)creature_ptr->lev;
2631 q_ptr->comptime = current_world_ptr->play_time;
2632 r_info[q_ptr->r_idx].flags1 &= ~(RF1_QUESTOR);
2638 sound(SOUND_TPLEVEL);
2642 if (creature_ptr->alter_reality)
2644 if (autosave_l && (creature_ptr->alter_reality == 1) && !creature_ptr->phase_out)
2645 do_cmd_save_game(creature_ptr, TRUE);
2647 creature_ptr->alter_reality--;
2648 creature_ptr->redraw |= (PR_STATUS);
2649 if (!creature_ptr->alter_reality)
2651 disturb(creature_ptr, FALSE, TRUE);
2652 if (!quest_number(creature_ptr, floor_ptr->dun_level) && floor_ptr->dun_level)
2654 msg_print(_("世界が変わった!", "The world changes!"));
2657 * Clear all saved floors
2658 * and create a first saved floor
2660 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
2661 creature_ptr->leaving = TRUE;
2665 msg_print(_("世界が少しの間変化したようだ。", "The world seems to change for a moment!"));
2668 sound(SOUND_TPLEVEL);
2675 * @brief 10ゲームターンが進行する毎にゲーム世界全体の処理を行う。
2676 * / Handle certain things once every 10 game turns
2679 static void process_world(player_type *player_ptr)
2681 const s32b A_DAY = TURNS_PER_TICK * TOWN_DAWN;
2682 s32b prev_turn_in_today = ((current_world_ptr->game_turn - TURNS_PER_TICK) % A_DAY + A_DAY / 4) % A_DAY;
2683 int prev_min = (1440 * prev_turn_in_today / A_DAY) % 60;
2686 extract_day_hour_min(player_ptr, &day, &hour, &min);
2687 update_dungeon_feeling(player_ptr);
2689 /* 帰還無しモード時のレベルテレポバグ対策 / Fix for level teleport bugs on ironman_downward.*/
2690 floor_type *floor_ptr = player_ptr->current_floor_ptr;
2691 if (ironman_downward && (player_ptr->dungeon_idx != DUNGEON_ANGBAND && player_ptr->dungeon_idx != 0))
2693 floor_ptr->dun_level = 0;
2694 player_ptr->dungeon_idx = 0;
2695 prepare_change_floor_mode(player_ptr, CFM_FIRST_FLOOR | CFM_RAND_PLACE);
2696 floor_ptr->inside_arena = FALSE;
2697 player_ptr->wild_mode = FALSE;
2698 player_ptr->leaving = TRUE;
2701 if (player_ptr->phase_out && !player_ptr->leaving)
2705 for (int i2 = 0; i2 < floor_ptr->width; ++i2)
2707 for (int j2 = 0; j2 < floor_ptr->height; j2++)
2709 grid_type *g_ptr = &floor_ptr->grid_array[j2][i2];
2710 if ((g_ptr->m_idx > 0) && (g_ptr->m_idx != player_ptr->riding))
2713 win_m_idx = g_ptr->m_idx;
2718 if (number_mon == 0)
2720 msg_print(_("相打ちに終わりました。", "Nothing survived."));
2722 player_ptr->energy_need = 0;
2723 update_gambling_monsters(player_ptr);
2725 else if ((number_mon - 1) == 0)
2727 GAME_TEXT m_name[MAX_NLEN];
2728 monster_type *wm_ptr;
2729 wm_ptr = &floor_ptr->m_list[win_m_idx];
2730 monster_desc(player_ptr, m_name, wm_ptr, 0);
2731 msg_format(_("%sが勝利した!", "%s won!"), m_name);
2734 if (win_m_idx == (sel_monster + 1))
2736 msg_print(_("おめでとうございます。", "Congratulations."));
2737 msg_format(_("%d$を受け取った。", "You received %d gold."), battle_odds);
2738 player_ptr->au += battle_odds;
2742 msg_print(_("残念でした。", "You lost gold."));
2746 player_ptr->energy_need = 0;
2747 update_gambling_monsters(player_ptr);
2749 else if (current_world_ptr->game_turn - floor_ptr->generated_turn == 150 * TURNS_PER_TICK)
2751 msg_print(_("申し分けありませんが、この勝負は引き分けとさせていただきます。", "This battle ended in a draw."));
2752 player_ptr->au += kakekin;
2754 player_ptr->energy_need = 0;
2755 update_gambling_monsters(player_ptr);
2759 if (current_world_ptr->game_turn % TURNS_PER_TICK) return;
2761 if (autosave_t && autosave_freq && !player_ptr->phase_out)
2763 if (!(current_world_ptr->game_turn % ((s32b)autosave_freq * TURNS_PER_TICK)))
2764 do_cmd_save_game(player_ptr, TRUE);
2767 if (floor_ptr->monster_noise && !ignore_unview)
2769 msg_print(_("何かが聞こえた。", "You hear noise."));
2772 if (!floor_ptr->dun_level && !floor_ptr->inside_quest && !player_ptr->phase_out && !floor_ptr->inside_arena)
2774 if (!(current_world_ptr->game_turn % ((TURNS_PER_TICK * TOWN_DAWN) / 2)))
2776 bool dawn = (!(current_world_ptr->game_turn % (TURNS_PER_TICK * TOWN_DAWN)));
2777 if (dawn) day_break(player_ptr);
2778 else night_falls(player_ptr);
2782 else if ((vanilla_town || (lite_town && !floor_ptr->inside_quest && !player_ptr->phase_out && !floor_ptr->inside_arena)) && floor_ptr->dun_level)
2784 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * STORE_TICKS)))
2786 if (one_in_(STORE_SHUFFLE))
2791 n = randint0(MAX_STORES);
2792 } while ((n == STORE_HOME) || (n == STORE_MUSEUM));
2794 for (FEAT_IDX i = 1; i < max_f_idx; i++)
2796 feature_type *f_ptr = &f_info[i];
2797 if (!f_ptr->name) continue;
2798 if (!have_flag(f_ptr->flags, FF_STORE)) continue;
2800 if (f_ptr->subtype == n)
2803 msg_format(_("%sの店主をシャッフルします。", "Shuffle a Shopkeeper of %s."), f_name + f_ptr->name);
2805 store_shuffle(player_ptr, n);
2813 if (one_in_(d_info[player_ptr->dungeon_idx].max_m_alloc_chance) &&
2814 !floor_ptr->inside_arena && !floor_ptr->inside_quest && !player_ptr->phase_out)
2816 (void)alloc_monster(player_ptr, MAX_SIGHT + 5, 0);
2819 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 10)) && !player_ptr->phase_out)
2820 regenerate_monsters(player_ptr);
2821 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 3)))
2822 regenerate_captured_monsters(player_ptr);
2824 if (!player_ptr->leaving)
2826 for (int i = 0; i < MAX_MTIMED; i++)
2828 if (floor_ptr->mproc_max[i] > 0) process_monsters_mtimed(player_ptr, i);
2834 if (min != prev_min)
2836 exe_write_diary(player_ptr, DIARY_DIALY, 0, NULL);
2837 determine_daily_bounty(player_ptr, FALSE);
2842 * Nightmare mode activates the TY_CURSE at midnight
2843 * Require exact minute -- Don't activate multiple times in a minute
2845 if (ironman_nightmare && (min != prev_min))
2847 if ((hour == 23) && !(min % 15))
2849 disturb(player_ptr, FALSE, TRUE);
2853 msg_print(_("遠くで不気味な鐘の音が鳴った。", "You hear a distant bell toll ominously."));
2857 msg_print(_("遠くで鐘が二回鳴った。", "A distant bell sounds twice."));
2861 msg_print(_("遠くで鐘が三回鳴った。", "A distant bell sounds three times."));
2865 msg_print(_("遠くで鐘が四回鳴った。", "A distant bell tolls four times."));
2872 disturb(player_ptr, TRUE, TRUE);
2873 msg_print(_("遠くで鐘が何回も鳴り、死んだような静けさの中へ消えていった。", "A distant bell tolls many times, fading into an deathly silence."));
2874 if (player_ptr->wild_mode)
2876 player_ptr->oldpy = randint1(MAX_HGT - 2);
2877 player_ptr->oldpx = randint1(MAX_WID - 2);
2878 change_wild_mode(player_ptr, TRUE);
2879 take_turn(player_ptr, 100);
2883 player_ptr->invoking_midnight_curse = TRUE;
2887 process_world_aux_digestion(player_ptr);
2888 process_world_aux_hp_and_sp(player_ptr);
2889 process_world_aux_timeout(player_ptr);
2890 process_world_aux_light(player_ptr);
2891 process_world_aux_mutation(player_ptr);
2892 process_world_aux_curse(player_ptr);
2893 process_world_aux_recharge(player_ptr);
2894 sense_inventory1(player_ptr);
2895 sense_inventory2(player_ptr);
2896 process_world_aux_movement(player_ptr);
2901 * @brief ウィザードモードへの導入処理
2902 * / Verify use of "wizard" mode
2903 * @param player_ptr プレーヤーへの参照ポインタ
2904 * @return 実際にウィザードモードへ移行したらTRUEを返す。
2906 static bool enter_wizard_mode(player_type *player_ptr)
2908 if (!current_world_ptr->noscore)
2910 if (!allow_debug_opts || arg_wizard)
2912 msg_print(_("ウィザードモードは許可されていません。 ", "Wizard mode is not permitted."));
2916 msg_print(_("ウィザードモードはデバッグと実験のためのモードです。 ", "Wizard mode is for debugging and experimenting."));
2917 msg_print(_("一度ウィザードモードに入るとスコアは記録されません。", "The game will not be scored if you enter wizard mode."));
2919 if (!get_check(_("本当にウィザードモードに入りたいのですか? ", "Are you sure you want to enter wizard mode? ")))
2924 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, _("ウィザードモードに突入してスコアを残せなくなった。", "give up recording score to enter wizard mode."));
2925 current_world_ptr->noscore |= 0x0002;
2933 * @brief デバッグコマンドへの導入処理
2934 * / Verify use of "debug" commands
2935 * @param player_ptr プレーヤーへの参照ポインタ
2936 * @return 実際にデバッグコマンドへ移行したらTRUEを返す。
2938 static bool enter_debug_mode(player_type *player_ptr)
2940 if (!current_world_ptr->noscore)
2942 if (!allow_debug_opts)
2944 msg_print(_("デバッグコマンドは許可されていません。 ", "Use of debug command is not permitted."));
2948 msg_print(_("デバッグ・コマンドはデバッグと実験のためのコマンドです。 ", "The debug commands are for debugging and experimenting."));
2949 msg_print(_("デバッグ・コマンドを使うとスコアは記録されません。", "The game will not be scored if you use debug commands."));
2951 if (!get_check(_("本当にデバッグ・コマンドを使いますか? ", "Are you sure you want to use debug commands? ")))
2956 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, _("デバッグモードに突入してスコアを残せなくなった。", "give up sending score to use debug commands."));
2957 current_world_ptr->noscore |= 0x0008;
2964 * todo これが多重インクルード問題の原因 (の1つ)かもしれない、wizard2.cに同名の関数が存在する
2965 * Hack -- Declare the Debug Routines
2967 extern void do_cmd_debug(player_type *creature_ptr);
2970 * @brief プレイヤーから受けた入力コマンドの分岐処理。
2971 * / Parse and execute the current command Give "Warning" on illegal commands.
2972 * @todo Make some "blocks"
2975 static void process_command(player_type *creature_ptr)
2977 COMMAND_CODE old_now_message = now_message;
2980 if ((creature_ptr->pclass == CLASS_SNIPER) && (creature_ptr->concent))
2981 creature_ptr->reset_concent = TRUE;
2983 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
2984 switch (command_cmd)
2995 /* todo 嘘。returnしていない
3002 if (current_world_ptr->wizard)
3004 current_world_ptr->wizard = FALSE;
3005 msg_print(_("ウィザードモード解除。", "Wizard mode off."));
3007 else if (enter_wizard_mode(creature_ptr))
3009 current_world_ptr->wizard = TRUE;
3010 msg_print(_("ウィザードモード突入。", "Wizard mode on."));
3012 creature_ptr->update |= (PU_MONSTERS);
3013 creature_ptr->redraw |= (PR_TITLE);
3019 if (enter_debug_mode(creature_ptr))
3021 do_cmd_debug(creature_ptr);
3027 if (!creature_ptr->wild_mode) do_cmd_wield(creature_ptr);
3032 if (!creature_ptr->wild_mode) do_cmd_takeoff(creature_ptr);
3037 if (!creature_ptr->wild_mode) do_cmd_drop(creature_ptr);
3042 do_cmd_destroy(creature_ptr);
3047 do_cmd_equip(creature_ptr);
3052 do_cmd_inven(creature_ptr);
3057 do_cmd_observe(creature_ptr);
3063 toggle_inventory_equipment(creature_ptr);
3068 if (!creature_ptr->wild_mode) do_cmd_alter(creature_ptr);
3073 if (!creature_ptr->wild_mode) do_cmd_tunnel(creature_ptr);
3078 do_cmd_walk(creature_ptr, FALSE);
3083 do_cmd_walk(creature_ptr, TRUE);
3088 if (!creature_ptr->wild_mode) do_cmd_run(creature_ptr);
3093 do_cmd_stay(creature_ptr, always_pickup);
3098 do_cmd_stay(creature_ptr, !always_pickup);
3103 do_cmd_rest(creature_ptr);
3108 do_cmd_search(creature_ptr);
3113 if (creature_ptr->action == ACTION_SEARCH) set_action(creature_ptr, ACTION_NONE);
3114 else set_action(creature_ptr, ACTION_SEARCH);
3117 case SPECIAL_KEY_STORE:
3119 do_cmd_store(creature_ptr);
3122 case SPECIAL_KEY_BUILDING:
3124 do_cmd_bldg(creature_ptr);
3127 case SPECIAL_KEY_QUEST:
3129 do_cmd_quest(creature_ptr);
3134 if (!creature_ptr->wild_mode && !floor_ptr->dun_level && !floor_ptr->inside_arena && !floor_ptr->inside_quest)
3136 if (vanilla_town) break;
3138 if (creature_ptr->ambush_flag)
3140 msg_print(_("襲撃から逃げるにはマップの端まで移動しなければならない。", "To flee the ambush you have to reach the edge of the map."));
3144 if (creature_ptr->food < PY_FOOD_WEAK)
3146 msg_print(_("その前に食事をとらないと。", "You must eat something here."));
3150 change_wild_mode(creature_ptr, FALSE);
3153 do_cmd_go_up(creature_ptr);
3159 if (creature_ptr->wild_mode)
3160 change_wild_mode(creature_ptr, FALSE);
3162 do_cmd_go_down(creature_ptr);
3167 do_cmd_open(creature_ptr);
3172 do_cmd_close(creature_ptr);
3177 do_cmd_spike(creature_ptr);
3182 do_cmd_bash(creature_ptr);
3187 do_cmd_disarm(creature_ptr);
3192 if ((creature_ptr->pclass == CLASS_SORCERER) || (creature_ptr->pclass == CLASS_RED_MAGE))
3193 msg_print(_("呪文を学習する必要はない!", "You don't have to learn spells!"));
3194 else if (creature_ptr->pclass == CLASS_SAMURAI)
3195 do_cmd_gain_hissatsu(creature_ptr);
3196 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3197 import_magic_device(creature_ptr);
3199 do_cmd_study(creature_ptr);
3204 if ((creature_ptr->pclass == CLASS_MINDCRAFTER) ||
3205 (creature_ptr->pclass == CLASS_BERSERKER) ||
3206 (creature_ptr->pclass == CLASS_NINJA) ||
3207 (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3208 ) do_cmd_mind_browse(creature_ptr);
3209 else if (creature_ptr->pclass == CLASS_SMITH)
3210 do_cmd_kaji(creature_ptr, TRUE);
3211 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3212 do_cmd_magic_eater(creature_ptr, TRUE, FALSE);
3213 else if (creature_ptr->pclass == CLASS_SNIPER)
3214 do_cmd_snipe_browse(creature_ptr);
3215 else do_cmd_browse(creature_ptr);
3220 if (!creature_ptr->wild_mode)
3222 if ((creature_ptr->pclass == CLASS_WARRIOR) || (creature_ptr->pclass == CLASS_ARCHER) || (creature_ptr->pclass == CLASS_CAVALRY))
3224 msg_print(_("呪文を唱えられない!", "You cannot cast spells!"));
3226 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))
3228 msg_print(_("ダンジョンが魔法を吸収した!", "The dungeon absorbs all attempted magic!"));
3231 else if (creature_ptr->anti_magic && (creature_ptr->pclass != CLASS_BERSERKER) && (creature_ptr->pclass != CLASS_SMITH))
3233 concptr which_power = _("魔法", "magic");
3234 if (creature_ptr->pclass == CLASS_MINDCRAFTER)
3235 which_power = _("超能力", "psionic powers");
3236 else if (creature_ptr->pclass == CLASS_IMITATOR)
3237 which_power = _("ものまね", "imitation");
3238 else if (creature_ptr->pclass == CLASS_SAMURAI)
3239 which_power = _("必殺剣", "hissatsu");
3240 else if (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3241 which_power = _("鏡魔法", "mirror magic");
3242 else if (creature_ptr->pclass == CLASS_NINJA)
3243 which_power = _("忍術", "ninjutsu");
3244 else if (mp_ptr->spell_book == TV_LIFE_BOOK)
3245 which_power = _("祈り", "prayer");
3247 msg_format(_("反魔法バリアが%sを邪魔した!", "An anti-magic shell disrupts your %s!"), which_power);
3248 free_turn(creature_ptr);
3250 else if (creature_ptr->shero && (creature_ptr->pclass != CLASS_BERSERKER))
3252 msg_format(_("狂戦士化していて頭が回らない!", "You cannot think directly!"));
3253 free_turn(creature_ptr);
3257 if ((creature_ptr->pclass == CLASS_MINDCRAFTER) ||
3258 (creature_ptr->pclass == CLASS_BERSERKER) ||
3259 (creature_ptr->pclass == CLASS_NINJA) ||
3260 (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3262 do_cmd_mind(creature_ptr);
3263 else if (creature_ptr->pclass == CLASS_IMITATOR)
3264 do_cmd_mane(creature_ptr, FALSE);
3265 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3266 do_cmd_magic_eater(creature_ptr, FALSE, FALSE);
3267 else if (creature_ptr->pclass == CLASS_SAMURAI)
3268 do_cmd_hissatsu(creature_ptr);
3269 else if (creature_ptr->pclass == CLASS_BLUE_MAGE)
3270 do_cmd_cast_learned(creature_ptr);
3271 else if (creature_ptr->pclass == CLASS_SMITH)
3272 do_cmd_kaji(creature_ptr, FALSE);
3273 else if (creature_ptr->pclass == CLASS_SNIPER)
3274 do_cmd_snipe(creature_ptr);
3276 do_cmd_cast(creature_ptr);
3284 do_cmd_pet(creature_ptr);
3289 do_cmd_inscribe(creature_ptr);
3294 do_cmd_uninscribe(creature_ptr);
3299 do_cmd_activate(creature_ptr);
3304 do_cmd_eat_food(creature_ptr);
3309 do_cmd_refill(creature_ptr);
3314 do_cmd_fire(creature_ptr, SP_NONE);
3319 do_cmd_throw(creature_ptr, 1, FALSE, -1);
3324 do_cmd_aim_wand(creature_ptr);
3329 if (use_command && rogue_like_commands)
3331 do_cmd_use(creature_ptr);
3335 do_cmd_zap_rod(creature_ptr);
3341 do_cmd_quaff_potion(creature_ptr);
3346 do_cmd_read_scroll(creature_ptr);
3351 if (use_command && !rogue_like_commands)
3352 do_cmd_use(creature_ptr);
3354 do_cmd_use_staff(creature_ptr);
3359 do_cmd_racial_power(creature_ptr);
3364 do_cmd_view_map(creature_ptr);
3369 do_cmd_locate(creature_ptr);
3374 do_cmd_look(creature_ptr);
3379 do_cmd_target(creature_ptr);
3384 do_cmd_help(creature_ptr);
3389 do_cmd_query_symbol(creature_ptr);
3394 do_cmd_player_status(creature_ptr);
3404 do_cmd_pref(creature_ptr);
3409 do_cmd_reload_autopick(creature_ptr);
3414 do_cmd_edit_autopick(creature_ptr);
3419 do_cmd_macros(creature_ptr);
3424 do_cmd_visuals(creature_ptr);
3425 do_cmd_redraw(creature_ptr);
3430 do_cmd_colors(creature_ptr);
3431 do_cmd_redraw(creature_ptr);
3437 (void)combine_and_reorder_home(STORE_HOME);
3438 do_cmd_redraw(creature_ptr);
3453 do_cmd_feeling(creature_ptr);
3458 do_cmd_message_one();
3463 do_cmd_messages(old_now_message);
3468 do_cmd_checkquest(creature_ptr);
3473 now_message = old_now_message;
3474 do_cmd_redraw(creature_ptr);
3479 do_cmd_save_game(creature_ptr, FALSE);
3484 do_cmd_time(creature_ptr);
3488 case SPECIAL_KEY_QUIT:
3490 do_cmd_save_and_exit(creature_ptr);
3495 do_cmd_suicide(creature_ptr);
3500 do_cmd_diary(creature_ptr);
3505 do_cmd_knowledge(creature_ptr);
3510 do_cmd_load_screen();
3515 do_cmd_save_screen(creature_ptr);
3520 prepare_movie_hooks();
3525 spoil_random_artifact(creature_ptr, "randifact.txt");
3530 if (!creature_ptr->wild_mode) do_cmd_travel(creature_ptr);
3531 if (creature_ptr->special_defense & KATA_MUSOU)
3533 set_action(creature_ptr, ACTION_NONE);
3539 if (flush_failure) flush();
3543 sound(SOUND_ILLEGAL);
3544 if (!get_rnd_line(_("error_j.txt", "error.txt"), 0, error_m))
3549 prt(_(" '?' でヘルプが表示されます。", "Type '?' for help."), 0, 0);
3556 if (!creature_ptr->energy_use && !now_message)
3557 now_message = old_now_message;
3562 * @brief アイテムの所持種類数が超えた場合にアイテムを床に落とす処理 / Hack -- Pack Overflow
3565 static void pack_overflow(player_type *owner_ptr)
3567 if (owner_ptr->inventory_list[INVEN_PACK].k_idx == 0) return;
3569 GAME_TEXT o_name[MAX_NLEN];
3571 update_creature(owner_ptr);
3572 if (!owner_ptr->inventory_list[INVEN_PACK].k_idx) return;
3574 o_ptr = &owner_ptr->inventory_list[INVEN_PACK];
3575 disturb(owner_ptr, FALSE, TRUE);
3576 msg_print(_("ザックからアイテムがあふれた!", "Your pack overflows!"));
3578 object_desc(owner_ptr, o_name, o_ptr, 0);
3579 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(INVEN_PACK));
3580 (void)drop_near(owner_ptr, o_ptr, 0, owner_ptr->y, owner_ptr->x);
3582 vary_item(owner_ptr, INVEN_PACK, -255);
3583 handle_stuff(owner_ptr);
3588 * @brief プレイヤーの行動エネルギーが充填される(=プレイヤーのターンが回る)毎に行われる処理 / process the effects per 100 energy at player speed.
3591 static void process_upkeep_with_speed(player_type *creature_ptr)
3593 if (!load && creature_ptr->enchant_energy_need > 0 && !creature_ptr->leaving)
3595 creature_ptr->enchant_energy_need -= SPEED_TO_ENERGY(creature_ptr->pspeed);
3598 if (creature_ptr->enchant_energy_need > 0) return;
3600 while (creature_ptr->enchant_energy_need <= 0)
3602 if (!load) check_music(creature_ptr);
3603 if (!load) check_hex(creature_ptr);
3604 if (!load) revenge_spell(creature_ptr);
3606 creature_ptr->enchant_energy_need += ENERGY_NEED();
3611 static void process_fishing(player_type *creature_ptr)
3613 Term_xtra(TERM_XTRA_DELAY, 10);
3617 bool success = FALSE;
3618 get_mon_num_prep(creature_ptr, monster_is_fishing_target, NULL);
3619 r_idx = get_mon_num(creature_ptr, creature_ptr->current_floor_ptr->dun_level ? creature_ptr->current_floor_ptr->dun_level : wilderness[creature_ptr->wilderness_y][creature_ptr->wilderness_x].level, 0);
3621 if (r_idx && one_in_(2))
3624 y = creature_ptr->y + ddy[creature_ptr->fishing_dir];
3625 x = creature_ptr->x + ddx[creature_ptr->fishing_dir];
3626 if (place_monster_aux(creature_ptr, 0, y, x, r_idx, PM_NO_KAGE))
3628 GAME_TEXT m_name[MAX_NLEN];
3629 monster_desc(creature_ptr, m_name, &creature_ptr->current_floor_ptr->m_list[creature_ptr->current_floor_ptr->grid_array[y][x].m_idx], 0);
3630 msg_format(_("%sが釣れた!", "You have a good catch!"), m_name);
3637 msg_print(_("餌だけ食われてしまった!くっそ~!", "Damn! The fish stole your bait!"));
3640 disturb(creature_ptr, FALSE, TRUE);
3646 * @brief プレイヤーの行動処理 / Process the player
3649 * Notice the annoying code to handle "pack overflow", which\n
3650 * must come first just in case somebody manages to corrupt\n
3651 * the savefiles by clever use of menu commands or something.\n
3653 static void process_player(player_type *creature_ptr)
3655 if (creature_ptr->hack_mutation)
3657 msg_print(_("何か変わった気がする!", "You feel different!"));
3659 (void)gain_mutation(creature_ptr, 0);
3660 creature_ptr->hack_mutation = FALSE;
3663 if (creature_ptr->invoking_midnight_curse)
3666 activate_ty_curse(creature_ptr, FALSE, &count);
3667 creature_ptr->invoking_midnight_curse = FALSE;
3670 if (creature_ptr->phase_out)
3672 for (MONSTER_IDX m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
3674 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
3675 if (!monster_is_valid(m_ptr)) continue;
3677 m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
3678 update_monster(creature_ptr, m_idx, FALSE);
3681 print_time(creature_ptr);
3683 else if (!(load && creature_ptr->energy_need <= 0))
3685 creature_ptr->energy_need -= SPEED_TO_ENERGY(creature_ptr->pspeed);
3688 if (creature_ptr->energy_need > 0) return;
3689 if (!command_rep) print_time(creature_ptr);
3691 if (creature_ptr->resting < 0)
3693 if (creature_ptr->resting == COMMAND_ARG_REST_FULL_HEALING)
3695 if ((creature_ptr->chp == creature_ptr->mhp) &&
3696 (creature_ptr->csp >= creature_ptr->msp))
3698 set_action(creature_ptr, ACTION_NONE);
3701 else if (creature_ptr->resting == COMMAND_ARG_REST_UNTIL_DONE)
3703 if ((creature_ptr->chp == creature_ptr->mhp) &&
3704 (creature_ptr->csp >= creature_ptr->msp) &&
3705 !creature_ptr->blind && !creature_ptr->confused &&
3706 !creature_ptr->poisoned && !creature_ptr->afraid &&
3707 !creature_ptr->stun && !creature_ptr->cut &&
3708 !creature_ptr->slow && !creature_ptr->paralyzed &&
3709 !creature_ptr->image && !creature_ptr->word_recall &&
3710 !creature_ptr->alter_reality)
3712 set_action(creature_ptr, ACTION_NONE);
3717 if (creature_ptr->action == ACTION_FISH) process_fishing(creature_ptr);
3721 if (creature_ptr->running || travel.run || command_rep || (creature_ptr->action == ACTION_REST) || (creature_ptr->action == ACTION_FISH))
3727 disturb(creature_ptr, FALSE, TRUE);
3728 msg_print(_("中断しました。", "Canceled."));
3733 if (creature_ptr->riding && !creature_ptr->confused && !creature_ptr->blind)
3735 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
3736 monster_race *r_ptr = &r_info[m_ptr->r_idx];
3737 if (MON_CSLEEP(m_ptr))
3739 GAME_TEXT m_name[MAX_NLEN];
3740 (void)set_monster_csleep(creature_ptr, creature_ptr->riding, 0);
3741 monster_desc(creature_ptr, m_name, m_ptr, 0);
3742 msg_format(_("%^sを起こした。", "You have woken %s up."), m_name);
3745 if (MON_STUNNED(m_ptr))
3747 if (set_monster_stunned(creature_ptr, creature_ptr->riding,
3748 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_STUNNED(m_ptr) - 1)))
3750 GAME_TEXT m_name[MAX_NLEN];
3751 monster_desc(creature_ptr, m_name, m_ptr, 0);
3752 msg_format(_("%^sを朦朧状態から立ち直らせた。", "%^s is no longer stunned."), m_name);
3756 if (MON_CONFUSED(m_ptr))
3758 if (set_monster_confused(creature_ptr, creature_ptr->riding,
3759 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_CONFUSED(m_ptr) - 1)))
3761 GAME_TEXT m_name[MAX_NLEN];
3762 monster_desc(creature_ptr, m_name, m_ptr, 0);
3763 msg_format(_("%^sを混乱状態から立ち直らせた。", "%^s is no longer confused."), m_name);
3767 if (MON_MONFEAR(m_ptr))
3769 if (set_monster_monfear(creature_ptr, creature_ptr->riding,
3770 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_MONFEAR(m_ptr) - 1)))
3772 GAME_TEXT m_name[MAX_NLEN];
3773 monster_desc(creature_ptr, m_name, m_ptr, 0);
3774 msg_format(_("%^sを恐怖から立ち直らせた。", "%^s is no longer afraid."), m_name);
3778 handle_stuff(creature_ptr);
3782 if (creature_ptr->lightspeed)
3784 (void)set_lightspeed(creature_ptr, creature_ptr->lightspeed - 1, TRUE);
3787 if ((creature_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
3789 if (P_PTR_KI < 40) P_PTR_KI = 0;
3790 else P_PTR_KI -= 40;
3791 creature_ptr->update |= (PU_BONUS);
3794 if (creature_ptr->action == ACTION_LEARN)
3797 u32b cost_frac = (creature_ptr->msp + 30L) * 256L;
3798 s64b_LSHIFT(cost, cost_frac, 16);
3799 if (s64b_cmp(creature_ptr->csp, creature_ptr->csp_frac, cost, cost_frac) < 0)
3801 creature_ptr->csp = 0;
3802 creature_ptr->csp_frac = 0;
3803 set_action(creature_ptr, ACTION_NONE);
3807 s64b_sub(&(creature_ptr->csp), &(creature_ptr->csp_frac), cost, cost_frac);
3810 creature_ptr->redraw |= PR_MANA;
3813 if (creature_ptr->special_defense & KATA_MASK)
3815 if (creature_ptr->special_defense & KATA_MUSOU)
3817 if (creature_ptr->csp < 3)
3819 set_action(creature_ptr, ACTION_NONE);
3823 creature_ptr->csp -= 2;
3824 creature_ptr->redraw |= (PR_MANA);
3829 /*** Handle actual user input ***/
3830 while (creature_ptr->energy_need <= 0)
3832 creature_ptr->window |= PW_PLAYER;
3833 creature_ptr->sutemi = FALSE;
3834 creature_ptr->counter = FALSE;
3835 creature_ptr->now_damaged = FALSE;
3837 handle_stuff(creature_ptr);
3838 move_cursor_relative(creature_ptr->y, creature_ptr->x);
3839 if (fresh_before) Term_fresh();
3841 pack_overflow(creature_ptr);
3842 if (!command_new) command_see = FALSE;
3844 free_turn(creature_ptr);
3845 if (creature_ptr->phase_out)
3847 move_cursor_relative(creature_ptr->y, creature_ptr->x);
3848 command_cmd = SPECIAL_KEY_BUILDING;
3849 process_command(creature_ptr);
3851 else if (creature_ptr->paralyzed || (creature_ptr->stun >= 100))
3853 take_turn(creature_ptr, 100);
3855 else if (creature_ptr->action == ACTION_REST)
3857 if (creature_ptr->resting > 0)
3859 creature_ptr->resting--;
3860 if (!creature_ptr->resting) set_action(creature_ptr, ACTION_NONE);
3861 creature_ptr->redraw |= (PR_STATE);
3864 take_turn(creature_ptr, 100);
3866 else if (creature_ptr->action == ACTION_FISH)
3868 take_turn(creature_ptr, 100);
3870 else if (creature_ptr->running)
3872 run_step(creature_ptr, 0);
3874 else if (travel.run)
3876 travel_step(creature_ptr);
3878 else if (command_rep)
3881 creature_ptr->redraw |= (PR_STATE);
3882 handle_stuff(creature_ptr);
3885 process_command(creature_ptr);
3889 move_cursor_relative(creature_ptr->y, creature_ptr->x);
3891 request_command(creature_ptr, FALSE);
3893 process_command(creature_ptr);
3896 pack_overflow(creature_ptr);
3897 if (creature_ptr->energy_use)
3899 if (creature_ptr->timewalk || creature_ptr->energy_use > 400)
3901 creature_ptr->energy_need += creature_ptr->energy_use * TURNS_PER_TICK / 10;
3905 creature_ptr->energy_need += (s16b)((s32b)creature_ptr->energy_use * ENERGY_NEED() / 100L);
3908 if (creature_ptr->image) creature_ptr->redraw |= (PR_MAP);
3910 for (MONSTER_IDX m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
3912 monster_type *m_ptr;
3913 monster_race *r_ptr;
3914 m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
3915 if (!monster_is_valid(m_ptr)) continue;
3916 if (!m_ptr->ml) continue;
3918 r_ptr = &r_info[m_ptr->ap_r_idx];
3919 if (!(r_ptr->flags1 & (RF1_ATTR_MULTI | RF1_SHAPECHANGER)))
3922 lite_spot(creature_ptr, m_ptr->fy, m_ptr->fx);
3925 if (repair_monsters)
3927 repair_monsters = FALSE;
3928 for (MONSTER_IDX m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
3930 monster_type *m_ptr;
3931 m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
3932 if (!monster_is_valid(m_ptr)) continue;
3934 if (m_ptr->mflag & MFLAG_NICE)
3936 m_ptr->mflag &= ~(MFLAG_NICE);
3939 if (m_ptr->mflag2 & MFLAG2_MARK)
3941 if (m_ptr->mflag2 & MFLAG2_SHOW)
3943 m_ptr->mflag2 &= ~(MFLAG2_SHOW);
3944 repair_monsters = TRUE;
3948 m_ptr->mflag2 &= ~(MFLAG2_MARK);
3950 update_monster(creature_ptr, m_idx, FALSE);
3951 if (creature_ptr->health_who == m_idx) creature_ptr->redraw |= (PR_HEALTH);
3952 if (creature_ptr->riding == m_idx) creature_ptr->redraw |= (PR_UHEALTH);
3954 lite_spot(creature_ptr, m_ptr->fy, m_ptr->fx);
3960 if (creature_ptr->pclass == CLASS_IMITATOR)
3962 if (creature_ptr->mane_num > (creature_ptr->lev > 44 ? 3 : creature_ptr->lev > 29 ? 2 : 1))
3964 creature_ptr->mane_num--;
3965 for (int j = 0; j < creature_ptr->mane_num; j++)
3967 creature_ptr->mane_spell[j] = creature_ptr->mane_spell[j + 1];
3968 creature_ptr->mane_dam[j] = creature_ptr->mane_dam[j + 1];
3972 creature_ptr->new_mane = FALSE;
3973 creature_ptr->redraw |= (PR_IMITATION);
3976 if (creature_ptr->action == ACTION_LEARN)
3978 creature_ptr->new_mane = FALSE;
3979 creature_ptr->redraw |= (PR_STATE);
3982 if (creature_ptr->timewalk && (creature_ptr->energy_need > -1000))
3985 creature_ptr->redraw |= (PR_MAP);
3986 creature_ptr->update |= (PU_MONSTERS);
3987 creature_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
3989 msg_print(_("「時は動きだす…」", "You feel time flowing around you once more."));
3991 creature_ptr->timewalk = FALSE;
3992 creature_ptr->energy_need = ENERGY_NEED();
3994 handle_stuff(creature_ptr);
3998 if (!creature_ptr->playing || creature_ptr->is_dead)
4000 creature_ptr->timewalk = FALSE;
4004 if (creature_ptr->energy_use && creature_ptr->reset_concent)
4005 reset_concentration(creature_ptr, TRUE);
4007 if (creature_ptr->leaving) break;
4010 update_smell(creature_ptr->current_floor_ptr, creature_ptr);
4015 * @brief 現在プレイヤーがいるダンジョンの全体処理 / Interact with the current dungeon level.
4019 * この関数から現在の階層を出る、プレイヤーがキャラが死ぬ、
4020 * ゲームを終了するかのいずれかまでループする。
4023 * This function will not exit until the level is completed,\n
4024 * the user dies, or the game is terminated.\n
4027 static void dungeon(player_type *player_ptr, bool load_game)
4029 floor_type *floor_ptr = player_ptr->current_floor_ptr;
4030 floor_ptr->base_level = floor_ptr->dun_level;
4031 current_world_ptr->is_loading_now = FALSE;
4032 player_ptr->leaving = FALSE;
4040 player_ptr->pet_t_m_idx = 0;
4041 player_ptr->riding_t_m_idx = 0;
4042 player_ptr->ambush_flag = FALSE;
4043 health_track(player_ptr, 0);
4044 repair_monsters = TRUE;
4045 repair_objects = TRUE;
4047 disturb(player_ptr, TRUE, TRUE);
4048 int quest_num = quest_num = quest_number(player_ptr, floor_ptr->dun_level);
4051 r_info[quest[quest_num].r_idx].flags1 |= RF1_QUESTOR;
4054 if (player_ptr->max_plv < player_ptr->lev)
4056 player_ptr->max_plv = player_ptr->lev;
4059 if ((max_dlv[player_ptr->dungeon_idx] < floor_ptr->dun_level) && !floor_ptr->inside_quest)
4061 max_dlv[player_ptr->dungeon_idx] = floor_ptr->dun_level;
4062 if (record_maxdepth) exe_write_diary(player_ptr, DIARY_MAXDEAPTH, floor_ptr->dun_level, NULL);
4065 (void)calculate_upkeep(player_ptr);
4066 panel_bounds_center();
4067 verify_panel(player_ptr);
4070 current_world_ptr->character_xtra = TRUE;
4071 player_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER | PW_MONSTER | PW_OVERHEAD | PW_DUNGEON);
4072 player_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_EQUIPPY | PR_MAP);
4073 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);
4074 handle_stuff(player_ptr);
4076 current_world_ptr->character_xtra = FALSE;
4077 player_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
4078 player_ptr->update |= (PU_COMBINE | PU_REORDER);
4079 handle_stuff(player_ptr);
4082 if (quest_num && (is_fixed_quest_idx(quest_num) &&
4083 !((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT) ||
4084 !(quest[quest_num].flags & QUEST_FLAG_PRESET))))
4085 do_cmd_feeling(player_ptr);
4087 if (player_ptr->phase_out)
4091 player_ptr->energy_need = 0;
4092 update_gambling_monsters(player_ptr);
4096 msg_print(_("試合開始!", "Ready..Fight!"));
4101 if ((player_ptr->pclass == CLASS_BARD) && (SINGING_SONG_EFFECT(player_ptr) > MUSIC_DETECT))
4102 SINGING_SONG_EFFECT(player_ptr) = MUSIC_DETECT;
4104 if (!player_ptr->playing || player_ptr->is_dead) return;
4106 if (!floor_ptr->inside_quest && (player_ptr->dungeon_idx == DUNGEON_ANGBAND))
4108 quest_discovery(random_quest_number(player_ptr, floor_ptr->dun_level));
4109 floor_ptr->inside_quest = random_quest_number(player_ptr, floor_ptr->dun_level);
4111 if ((floor_ptr->dun_level == d_info[player_ptr->dungeon_idx].maxdepth) && d_info[player_ptr->dungeon_idx].final_guardian)
4113 if (r_info[d_info[player_ptr->dungeon_idx].final_guardian].max_num)
4115 msg_format("この階には%sの主である%sが棲んでいる。",
4116 d_name + d_info[player_ptr->dungeon_idx].name,
4117 r_name + r_info[d_info[player_ptr->dungeon_idx].final_guardian].name);
4119 msg_format("%^s lives in this level as the keeper of %s.",
4120 r_name + r_info[d_info[player_ptr->dungeon_idx].final_guardian].name,
4121 d_name + d_info[player_ptr->dungeon_idx].name);
4125 if (!load_game && (player_ptr->special_defense & NINJA_S_STEALTH)) set_superstealth(player_ptr, FALSE);
4127 floor_ptr->monster_level = floor_ptr->base_level;
4128 floor_ptr->object_level = floor_ptr->base_level;
4129 current_world_ptr->is_loading_now = TRUE;
4130 if (player_ptr->energy_need > 0 && !player_ptr->phase_out &&
4131 (floor_ptr->dun_level || player_ptr->leaving_dungeon || floor_ptr->inside_arena))
4132 player_ptr->energy_need = 0;
4134 player_ptr->leaving_dungeon = FALSE;
4135 mproc_init(floor_ptr);
4139 if ((floor_ptr->m_cnt + 32 > current_world_ptr->max_m_idx) && !player_ptr->phase_out)
4140 compact_monsters(player_ptr, 64);
4142 if ((floor_ptr->m_cnt + 32 < floor_ptr->m_max) && !player_ptr->phase_out)
4143 compact_monsters(player_ptr, 0);
4145 if (floor_ptr->o_cnt + 32 > current_world_ptr->max_o_idx)
4146 compact_objects(player_ptr, 64);
4148 if (floor_ptr->o_cnt + 32 < floor_ptr->o_max)
4149 compact_objects(player_ptr, 0);
4151 process_player(player_ptr);
4152 process_upkeep_with_speed(player_ptr);
4153 handle_stuff(player_ptr);
4155 move_cursor_relative(player_ptr->y, player_ptr->x);
4156 if (fresh_after) Term_fresh();
4158 if (!player_ptr->playing || player_ptr->is_dead) break;
4160 process_monsters(player_ptr);
4161 handle_stuff(player_ptr);
4163 move_cursor_relative(player_ptr->y, player_ptr->x);
4164 if (fresh_after) Term_fresh();
4166 if (!player_ptr->playing || player_ptr->is_dead) break;
4168 process_world(player_ptr);
4169 handle_stuff(player_ptr);
4171 move_cursor_relative(player_ptr->y, player_ptr->x);
4172 if (fresh_after) Term_fresh();
4174 if (!player_ptr->playing || player_ptr->is_dead) break;
4176 current_world_ptr->game_turn++;
4177 if (current_world_ptr->dungeon_turn < current_world_ptr->dungeon_turn_limit)
4179 if (!player_ptr->wild_mode || wild_regen) current_world_ptr->dungeon_turn++;
4180 else if (player_ptr->wild_mode && !(current_world_ptr->game_turn % ((MAX_HGT + MAX_WID) / 2))) current_world_ptr->dungeon_turn++;
4183 prevent_turn_overflow(player_ptr);
4185 if (player_ptr->leaving) break;
4187 if (wild_regen) wild_regen--;
4190 if (quest_num && !(r_info[quest[quest_num].r_idx].flags1 & RF1_UNIQUE))
4192 r_info[quest[quest_num].r_idx].flags1 &= ~RF1_QUESTOR;
4195 if (player_ptr->playing && !player_ptr->is_dead)
4198 * Maintain Unique monsters and artifact, save current
4199 * floor, then prepare next floor
4201 leave_floor(player_ptr);
4202 reinit_wilderness = FALSE;
4210 * @brief 全ユーザプロファイルをロードする / Load some "user pref files"
4211 * @paaram player_ptr プレーヤーへの参照ポインタ
4214 * Modified by Arcum Dagsson to support
4215 * separate macro files for different realms.
4217 static void load_all_pref_files(player_type *player_ptr)
4220 sprintf(buf, "user.prf");
4221 process_pref_file(player_ptr, buf);
4222 sprintf(buf, "user-%s.prf", ANGBAND_SYS);
4223 process_pref_file(player_ptr, buf);
4224 sprintf(buf, "%s.prf", rp_ptr->title);
4225 process_pref_file(player_ptr, buf);
4226 sprintf(buf, "%s.prf", cp_ptr->title);
4227 process_pref_file(player_ptr, buf);
4228 sprintf(buf, "%s.prf", player_ptr->base_name);
4229 process_pref_file(player_ptr, buf);
4230 if (player_ptr->realm1 != REALM_NONE)
4232 sprintf(buf, "%s.prf", realm_names[player_ptr->realm1]);
4233 process_pref_file(player_ptr, buf);
4236 if (player_ptr->realm2 != REALM_NONE)
4238 sprintf(buf, "%s.prf", realm_names[player_ptr->realm2]);
4239 process_pref_file(player_ptr, buf);
4242 autopick_load_pref(player_ptr, FALSE);
4247 * @brief 1ゲームプレイの主要ルーチン / Actually play a game
4250 * If the "new_game" parameter is true, then, after loading the
4251 * savefile, we will commit suicide, if necessary, to allow the
4252 * player to start a new game.
4254 void play_game(player_type *player_ptr, bool new_game)
4256 bool load_game = TRUE;
4257 bool init_random_seed = FALSE;
4267 else if (chuukei_server)
4269 prepare_chuukei_hooks();
4275 reset_visuals(player_ptr);
4280 player_ptr->hack_mutation = FALSE;
4281 current_world_ptr->character_icky = TRUE;
4282 Term_activate(angband_term[0]);
4283 angband_term[0]->resize_hook = resize_map;
4284 for (MONSTER_IDX i = 1; i < 8; i++)
4286 if (angband_term[i])
4288 angband_term[i]->resize_hook = redraw_window;
4292 (void)Term_set_cursor(0);
4293 if (!load_player(player_ptr))
4295 quit(_("セーブファイルが壊れています", "broken savefile"));
4298 extract_option_vars();
4299 if (player_ptr->wait_report_score)
4304 if (!get_check_strict(_("待機していたスコア登録を今行ないますか?", "Do you register score now? "), CHECK_NO_HISTORY))
4307 player_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
4308 update_creature(player_ptr);
4309 player_ptr->is_dead = TRUE;
4310 current_world_ptr->start_time = (u32b)time(NULL);
4311 signals_ignore_tstp();
4312 current_world_ptr->character_icky = TRUE;
4313 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
4314 highscore_fd = fd_open(buf, O_RDWR);
4316 /* 町名消失バグ対策(#38205)のためここで世界マップ情報を読み出す */
4317 process_dungeon_file(player_ptr, "w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
4318 success = send_world_score(player_ptr, TRUE, update_playtime, display_player, map_name);
4320 if (!success && !get_check_strict(_("スコア登録を諦めますか?", "Do you give up score registration? "), CHECK_NO_HISTORY))
4322 prt(_("引き続き待機します。", "standing by for future registration..."), 0, 0);
4327 player_ptr->wait_report_score = FALSE;
4328 top_twenty(player_ptr);
4329 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
4332 (void)fd_close(highscore_fd);
4334 signals_handle_tstp();
4339 current_world_ptr->creating_savefile = new_game;
4341 if (!current_world_ptr->character_loaded)
4344 current_world_ptr->character_dungeon = FALSE;
4345 init_random_seed = TRUE;
4346 init_saved_floors(player_ptr, FALSE);
4350 init_saved_floors(player_ptr, TRUE);
4355 process_player_name(player_ptr, FALSE);
4358 if (init_random_seed)
4363 floor_type *floor_ptr = player_ptr->current_floor_ptr;
4366 current_world_ptr->character_dungeon = FALSE;
4368 floor_ptr->dun_level = 0;
4369 floor_ptr->inside_quest = 0;
4370 floor_ptr->inside_arena = FALSE;
4371 player_ptr->phase_out = FALSE;
4374 current_world_ptr->seed_flavor = randint0(0x10000000);
4375 current_world_ptr->seed_town = randint0(0x10000000);
4377 player_birth(player_ptr);
4378 counts_write(player_ptr, 2, 0);
4379 player_ptr->count = 0;
4381 determine_bounty_uniques(player_ptr);
4382 determine_daily_bounty(player_ptr, FALSE);
4383 wipe_o_list(floor_ptr);
4387 write_level = FALSE;
4388 exe_write_diary(player_ptr, DIARY_GAMESTART, 1,
4390 " ---- Restart Game ----"));
4393 * todo もう2.2.Xなので互換性は打ち切ってもいいのでは?
4394 * 1.0.9 以前はセーブ前に player_ptr->riding = -1 としていたので、再設定が必要だった。
4395 * もう不要だが、以前のセーブファイルとの互換のために残しておく。
4397 if (player_ptr->riding == -1)
4399 player_ptr->riding = 0;
4400 for (MONSTER_IDX i = floor_ptr->m_max; i > 0; i--)
4402 if (player_bold(player_ptr, floor_ptr->m_list[i].fy, floor_ptr->m_list[i].fx))
4404 player_ptr->riding = i;
4411 current_world_ptr->creating_savefile = FALSE;
4413 player_ptr->teleport_town = FALSE;
4414 player_ptr->sutemi = FALSE;
4415 current_world_ptr->timewalk_m_idx = 0;
4416 player_ptr->now_damaged = FALSE;
4418 current_world_ptr->start_time = time(NULL) - 1;
4419 record_o_name[0] = '\0';
4421 panel_row_min = floor_ptr->height;
4422 panel_col_min = floor_ptr->width;
4423 if (player_ptr->pseikaku == SEIKAKU_SEXY)
4424 s_info[player_ptr->pclass].w_max[TV_HAFTED - TV_WEAPON_BEGIN][SV_WHIP] = WEAPON_EXP_MASTER;
4426 set_floor_and_wall(player_ptr->dungeon_idx);
4428 prt(_("お待ち下さい...", "Please wait..."), 0, 0);
4433 if (enter_wizard_mode(player_ptr))
4435 current_world_ptr->wizard = TRUE;
4437 if (player_ptr->is_dead || !player_ptr->y || !player_ptr->x)
4439 init_saved_floors(player_ptr, TRUE);
4440 floor_ptr->inside_quest = 0;
4441 player_ptr->y = player_ptr->x = 10;
4444 else if (player_ptr->is_dead)
4446 quit("Already dead.");
4450 if (!floor_ptr->dun_level && !floor_ptr->inside_quest)
4452 process_dungeon_file(player_ptr, "w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
4453 init_flags = INIT_ONLY_BUILDINGS;
4454 process_dungeon_file(player_ptr, "t_info.txt", 0, 0, MAX_HGT, MAX_WID);
4455 select_floor_music(player_ptr);
4458 if (!current_world_ptr->character_dungeon)
4460 change_floor(player_ptr);
4464 if (player_ptr->panic_save)
4466 if (!player_ptr->y || !player_ptr->x)
4468 msg_print(_("プレイヤーの位置がおかしい。フロアを再生成します。", "What a strange player location, regenerate the dungeon floor."));
4469 change_floor(player_ptr);
4472 if (!player_ptr->y || !player_ptr->x) player_ptr->y = player_ptr->x = 10;
4474 player_ptr->panic_save = 0;
4478 current_world_ptr->character_generated = TRUE;
4479 current_world_ptr->character_icky = FALSE;
4484 sprintf(buf, _("%sに降り立った。", "You are standing in the %s."), map_name(player_ptr));
4485 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, buf);
4488 player_ptr->playing = TRUE;
4489 reset_visuals(player_ptr);
4490 load_all_pref_files(player_ptr);
4493 player_outfit(player_ptr);
4496 Term_xtra(TERM_XTRA_REACT, 0);
4498 player_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
4499 player_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
4500 handle_stuff(player_ptr);
4502 if (arg_force_original) rogue_like_commands = FALSE;
4503 if (arg_force_roguelike) rogue_like_commands = TRUE;
4505 if (player_ptr->chp < 0) player_ptr->is_dead = TRUE;
4507 if (player_ptr->prace == RACE_ANDROID) calc_android_exp(player_ptr);
4509 if (new_game && ((player_ptr->pclass == CLASS_CAVALRY) || (player_ptr->pclass == CLASS_BEASTMASTER)))
4511 monster_type *m_ptr;
4512 MONRACE_IDX pet_r_idx = ((player_ptr->pclass == CLASS_CAVALRY) ? MON_HORSE : MON_YASE_HORSE);
4513 monster_race *r_ptr = &r_info[pet_r_idx];
4514 place_monster_aux(player_ptr, 0, player_ptr->y, player_ptr->x - 1, pet_r_idx,
4515 (PM_FORCE_PET | PM_NO_KAGE));
4516 m_ptr = &floor_ptr->m_list[hack_m_idx_ii];
4517 m_ptr->mspeed = r_ptr->speed;
4518 m_ptr->maxhp = r_ptr->hdice*(r_ptr->hside + 1) / 2;
4519 m_ptr->max_maxhp = m_ptr->maxhp;
4520 m_ptr->hp = r_ptr->hdice*(r_ptr->hside + 1) / 2;
4521 m_ptr->dealt_damage = 0;
4522 m_ptr->energy_need = ENERGY_NEED() + ENERGY_NEED();
4525 (void)combine_and_reorder_home(STORE_HOME);
4526 (void)combine_and_reorder_home(STORE_MUSEUM);
4527 select_floor_music(player_ptr);
4531 dungeon(player_ptr, load_game);
4532 current_world_ptr->character_xtra = TRUE;
4533 handle_stuff(player_ptr);
4535 current_world_ptr->character_xtra = FALSE;
4537 health_track(player_ptr, 0);
4538 forget_lite(floor_ptr);
4539 forget_view(floor_ptr);
4540 clear_mon_lite(floor_ptr);
4541 if (!player_ptr->playing && !player_ptr->is_dead) break;
4543 wipe_o_list(floor_ptr);
4544 if (!player_ptr->is_dead) wipe_monsters_list(player_ptr);
4548 if (player_ptr->playing && player_ptr->is_dead)
4550 if (floor_ptr->inside_arena)
4552 floor_ptr->inside_arena = FALSE;
4553 if (player_ptr->arena_number > MAX_ARENA_MONS)
4554 player_ptr->arena_number++;
4556 player_ptr->arena_number = -1 - player_ptr->arena_number;
4557 player_ptr->is_dead = FALSE;
4558 player_ptr->chp = 0;
4559 player_ptr->chp_frac = 0;
4560 player_ptr->exit_bldg = TRUE;
4561 reset_tim_flags(player_ptr);
4562 prepare_change_floor_mode(player_ptr, CFM_SAVE_FLOORS | CFM_RAND_CONNECT);
4563 leave_floor(player_ptr);
4567 if ((current_world_ptr->wizard || cheat_live) && !get_check(_("死にますか? ", "Die? ")))
4569 cheat_death(player_ptr);
4574 if (player_ptr->is_dead) break;
4576 change_floor(player_ptr);
4579 close_game(player_ptr);
4585 * @brief ゲームターンからの実時間換算を行うための補正をかける
4586 * @param hoge ゲームターン
4587 * @details アンデッド種族は18:00からゲームを開始するので、この修正を予め行う。
4588 * @return 修正をかけた後のゲームターン
4590 s32b turn_real(player_type *player_ptr, s32b hoge)
4592 switch (player_ptr->start_race)
4598 return hoge - (TURNS_PER_TICK * TOWN_DAWN * 3 / 4);
4606 * @brief ターンのオーバーフローに対する対処
4607 * @param player_ptr プレーヤーへの参照ポインタ
4608 * @details ターン及びターンを記録する変数をターンの限界の1日前まで巻き戻す.
4609 * @return 修正をかけた後のゲームターン
4611 void prevent_turn_overflow(player_type *player_ptr)
4613 if (current_world_ptr->game_turn < current_world_ptr->game_turn_limit) return;
4615 int rollback_days = 1 + (current_world_ptr->game_turn - current_world_ptr->game_turn_limit) / (TURNS_PER_TICK * TOWN_DAWN);
4616 s32b rollback_turns = TURNS_PER_TICK * TOWN_DAWN * rollback_days;
4618 if (current_world_ptr->game_turn > rollback_turns) current_world_ptr->game_turn -= rollback_turns;
4619 else current_world_ptr->game_turn = 1;
4620 floor_type *floor_ptr = player_ptr->current_floor_ptr;
4621 if (floor_ptr->generated_turn > rollback_turns) floor_ptr->generated_turn -= rollback_turns;
4622 else floor_ptr->generated_turn = 1;
4623 if (current_world_ptr->arena_start_turn > rollback_turns) current_world_ptr->arena_start_turn -= rollback_turns;
4624 else current_world_ptr->arena_start_turn = 1;
4625 if (player_ptr->feeling_turn > rollback_turns) player_ptr->feeling_turn -= rollback_turns;
4626 else player_ptr->feeling_turn = 1;
4628 for (int i = 1; i < max_towns; i++)
4630 for (int j = 0; j < MAX_STORES; j++)
4632 store_type *store_ptr = &town_info[i].store[j];
4634 if (store_ptr->last_visit > -10L * TURNS_PER_TICK * STORE_TICKS)
4636 store_ptr->last_visit -= rollback_turns;
4637 if (store_ptr->last_visit < -10L * TURNS_PER_TICK * STORE_TICKS) store_ptr->last_visit = -10L * TURNS_PER_TICK * STORE_TICKS;
4640 if (store_ptr->store_open)
4642 store_ptr->store_open -= rollback_turns;
4643 if (store_ptr->store_open < 1) store_ptr->store_open = 1;
4652 * Close up the current game (player may or may not be dead)
4653 * @param creature_ptr プレーヤーへの参照ポインタ
4657 * This function is called only from "main.c" and "signals.c".
4660 void close_game(player_type *player_ptr)
4663 bool do_send = TRUE;
4664 handle_stuff(player_ptr);
4669 signals_ignore_tstp();
4671 current_world_ptr->character_icky = TRUE;
4672 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
4674 highscore_fd = fd_open(buf, O_RDWR);
4677 if (player_ptr->is_dead)
4679 if (current_world_ptr->total_winner) kingly(player_ptr);
4681 if (!cheat_save || get_check(_("死んだデータをセーブしますか? ", "Save death? ")))
4683 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
4685 else do_send = FALSE;
4687 print_tomb(player_ptr);
4690 show_info(player_ptr, handle_stuff, update_playtime, display_player, map_name);
4693 if (check_score(player_ptr))
4695 if ((!send_world_score(player_ptr, do_send, update_playtime, display_player, map_name)))
4697 if (get_check_strict(_("後でスコアを登録するために待機しますか?", "Stand by for later score registration? "),
4698 (CHECK_NO_ESCAPE | CHECK_NO_HISTORY)))
4700 player_ptr->wait_report_score = TRUE;
4701 player_ptr->is_dead = FALSE;
4702 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
4705 if (!player_ptr->wait_report_score)
4706 (void)top_twenty(player_ptr);
4708 else if (highscore_fd >= 0)
4710 display_scores_aux(0, 10, -1, NULL);
4715 do_cmd_save_game(player_ptr, FALSE);
4716 prt(_("リターンキーか ESC キーを押して下さい。", "Press Return (or Escape)."), 0, 40);
4717 play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_EXIT);
4718 if (inkey() != ESCAPE) predict_score(player_ptr);
4721 (void)fd_close(highscore_fd);
4723 clear_saved_floor_files(player_ptr);
4724 signals_handle_tstp();
4729 * @brief 全更新処理をチェックして処理していく
4730 * Handle "player_ptr->update" and "player_ptr->redraw" and "player_ptr->window"
4733 void handle_stuff(player_type *player_ptr)
4735 if (player_ptr->update) update_creature(player_ptr);
4736 if (player_ptr->redraw) redraw_stuff(player_ptr);
4737 if (player_ptr->window) window_stuff(player_ptr);
4741 void update_output(player_type *player_ptr)
4743 if (player_ptr->redraw) redraw_stuff(player_ptr);
4744 if (player_ptr->window) window_stuff(player_ptr);