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 "io/signal-handlers.h"
16 #include "main/music-definitions-table.h"
17 #include "main/sound-definitions-table.h"
26 #include "market/building.h"
27 #include "io/write-diary.h"
28 #include "cmd/cmd-activate.h"
29 #include "cmd/cmd-diary.h"
30 #include "cmd/cmd-draw.h"
31 #include "cmd/cmd-dump.h"
32 #include "cmd/cmd-process-screen.h"
33 #include "cmd/cmd-eat.h"
34 #include "cmd/cmd-help.h"
35 #include "cmd/cmd-hissatsu.h"
36 #include "cmd/cmd-item.h"
37 #include "cmd/cmd-knowledge.h"
38 #include "cmd/cmd-magiceat.h"
39 #include "cmd/cmd-mane.h"
40 #include "cmd/cmd-macro.h"
41 #include "cmd/cmd-quaff.h"
42 #include "cmd/cmd-read.h"
43 #include "cmd/cmd-save.h"
44 #include "cmd/cmd-smith.h"
45 #include "cmd/cmd-usestaff.h"
46 #include "cmd/cmd-zaprod.h"
47 #include "cmd/cmd-zapwand.h"
48 #include "cmd/cmd-pet.h"
49 #include "cmd/cmd-basic.h"
50 #include "cmd/cmd-visuals.h"
56 #include "floor-events.h"
57 #include "floor-town.h"
59 #include "object-ego.h"
60 #include "object-curse.h"
61 #include "object-flavor.h"
62 #include "knowledge/knowledge-autopick.h"
63 #include "knowledge/knowledge-quests.h"
64 #include "market/store.h"
66 #include "spells-summon.h"
67 #include "spells-object.h"
68 #include "spells-status.h"
69 #include "spells-floor.h"
70 #include "monster-spell.h"
74 #include "market/arena-info-table.h"
75 #include "market/store-util.h"
79 #include "view/display-player.h"
80 #include "player/process-name.h"
81 #include "player-move.h"
82 #include "player-status.h"
83 #include "player-class.h"
84 #include "player-race.h"
85 #include "player-personality.h"
86 #include "player-damage.h"
87 #include "player-effects.h"
88 #include "cmd-spell.h"
89 #include "realm-hex.h"
90 #include "object/object-kind.h"
91 #include "object-hook.h"
93 #include "monster-process.h"
94 #include "monster-status.h"
95 #include "monsterrace-hook.h"
96 #include "floor-save.h"
98 #include "player-skill.h"
99 #include "player-inventory.h"
101 #include "view-mainwindow.h"
102 #include "dungeon-file.h"
103 #include "io/uid-checker.h"
104 #include "player/process-death.h"
105 #include "io/read-pref-file.h"
108 #include "autopick/autopick.h"
111 #include "realm-song.h"
112 #include "targeting.h"
116 * Hack -- Link a copyright message into the executable
118 const concptr copyright[5] =
120 "Copyright (c) 1989 James E. Wilson, Robert A. Keoneke",
122 "This software may be copied and distributed for educational, research,",
123 "and not for profit purposes provided that this copyright and statement",
124 "are included in all such copies."
127 bool can_save = FALSE;
129 COMMAND_CODE now_message;
131 bool repair_monsters;
134 concptr ANGBAND_SYS = "xxx";
137 concptr ANGBAND_KEYBOARD = "JAPAN";
139 concptr ANGBAND_KEYBOARD = "0";
142 concptr ANGBAND_GRAF = "ascii";
144 static bool load = TRUE; /*!<ロード処理中の分岐フラグ*/
145 static int wild_regen = 20; /*!<広域マップ移動時の自然回復処理カウンタ(広域マップ1マス毎に20回処理を基本とする)*/
148 * Flags for initialization
153 * @brief 擬似鑑定を実際に行い判定を反映する
154 * @param slot 擬似鑑定を行うプレイヤーの所持リストID
155 * @param creature_ptr プレーヤーへの参照ポインタ
156 * @param heavy 重度の擬似鑑定を行うならばTRUE
159 static void sense_inventory_aux(player_type *creature_ptr, INVENTORY_IDX slot, bool heavy)
162 object_type *o_ptr = &creature_ptr->inventory_list[slot];
163 GAME_TEXT o_name[MAX_NLEN];
164 if (o_ptr->ident & (IDENT_SENSE))return;
165 if (object_is_known(o_ptr)) return;
167 feel = (heavy ? value_check_aux1(o_ptr) : value_check_aux2(o_ptr));
170 if ((creature_ptr->muta3 & MUT3_BAD_LUCK) && !randint0(13))
181 feel = FEEL_EXCELLENT;
187 feel = randint0(3) ? FEEL_GOOD : FEEL_AVERAGE;
189 feel = FEEL_UNCURSED;
194 feel = randint0(2) ? FEEL_CURSED : FEEL_GOOD;
200 feel = randint0(3) ? FEEL_CURSED : FEEL_AVERAGE;
207 feel = FEEL_WORTHLESS;
212 feel = FEEL_TERRIBLE;
218 if (disturb_minor) disturb(creature_ptr, FALSE, FALSE);
220 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
221 if (slot >= INVEN_RARM)
224 msg_format("%s%s(%c)は%sという感じがする...",
225 describe_use(creature_ptr, slot), o_name, index_to_label(slot), game_inscriptions[feel]);
227 msg_format("You feel the %s (%c) you are %s %s %s...",
228 o_name, index_to_label(slot), describe_use(creature_ptr, slot),
229 ((o_ptr->number == 1) ? "is" : "are"),
230 game_inscriptions[feel]);
237 msg_format("ザックの中の%s(%c)は%sという感じがする...",
238 o_name, index_to_label(slot), game_inscriptions[feel]);
240 msg_format("You feel the %s (%c) in your pack %s %s...",
241 o_name, index_to_label(slot),
242 ((o_ptr->number == 1) ? "is" : "are"),
243 game_inscriptions[feel]);
248 o_ptr->ident |= (IDENT_SENSE);
249 o_ptr->feeling = feel;
251 autopick_alter_item(creature_ptr, slot, destroy_feeling);
252 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
253 creature_ptr->window |= (PW_INVEN | PW_EQUIP);
258 * @brief 1プレイヤーターン毎に武器、防具の擬似鑑定が行われるかを判定する。
261 * Sense the inventory\n
263 * Class 0 = Warrior --> fast and heavy\n
264 * Class 1 = Mage --> slow and light\n
265 * Class 2 = Priest --> fast but light\n
266 * Class 3 = Rogue --> okay and heavy\n
267 * Class 4 = Ranger --> slow but heavy (changed!)\n
268 * Class 5 = Paladin --> slow but heavy\n
270 static void sense_inventory1(player_type *creature_ptr)
272 PLAYER_LEVEL plev = creature_ptr->lev;
275 if (creature_ptr->confused) return;
277 switch (creature_ptr->pclass)
284 if (0 != randint0(9000L / (plev * plev + 40))) return;
291 if (0 != randint0(6000L / (plev * plev + 50))) return;
297 case CLASS_HIGH_MAGE:
299 case CLASS_MAGIC_EATER:
301 if (0 != randint0(240000L / (plev + 5))) return;
308 if (0 != randint0(10000L / (plev * plev + 40))) return;
315 if (0 != randint0(20000L / (plev * plev + 40))) return;
322 if (0 != randint0(95000L / (plev * plev + 40))) return;
330 if (0 != randint0(77777L / (plev * plev + 40))) return;
335 case CLASS_WARRIOR_MAGE:
338 if (0 != randint0(75000L / (plev * plev + 40))) return;
342 case CLASS_MINDCRAFTER:
344 case CLASS_BLUE_MAGE:
345 case CLASS_MIRROR_MASTER:
347 if (0 != randint0(55000L / (plev * plev + 40))) return;
351 case CLASS_CHAOS_WARRIOR:
353 if (0 != randint0(80000L / (plev * plev + 40))) return;
359 case CLASS_FORCETRAINER:
361 if (0 != randint0(20000L / (plev * plev + 40))) return;
367 if (0 != randint0(20000L / ((plev + 50)*(plev + 50)))) return;
372 case CLASS_BEASTMASTER:
374 if (0 != randint0(65000L / (plev * plev + 40))) return;
378 case CLASS_BERSERKER:
385 if (compare_virtue(creature_ptr, V_KNOWLEDGE, 100, VIRTUE_LARGE)) heavy = TRUE;
387 for (INVENTORY_IDX i = 0; i < INVEN_TOTAL; i++)
391 o_ptr = &creature_ptr->inventory_list[i];
393 if (!o_ptr->k_idx) continue;
422 if ((i < INVEN_RARM) && (0 != randint0(5))) continue;
424 if ((creature_ptr->muta3 & MUT3_GOOD_LUCK) && !randint0(13))
429 sense_inventory_aux(creature_ptr, i, heavy);
435 * @brief 1プレイヤーターン毎に武器、防具以外の擬似鑑定が行われるかを判定する。
438 static void sense_inventory2(player_type *creature_ptr)
440 PLAYER_LEVEL plev = creature_ptr->lev;
443 if (creature_ptr->confused) return;
445 switch (creature_ptr->pclass)
451 case CLASS_BERSERKER:
458 case CLASS_CHAOS_WARRIOR:
460 case CLASS_BEASTMASTER:
463 if (0 != randint0(240000L / (plev + 5))) return;
468 case CLASS_WARRIOR_MAGE:
472 if (0 != randint0(95000L / (plev * plev + 40))) return;
479 case CLASS_FORCETRAINER:
480 case CLASS_MINDCRAFTER:
482 if (0 != randint0(20000L / (plev * plev + 40))) return;
487 case CLASS_HIGH_MAGE:
489 case CLASS_MAGIC_EATER:
490 case CLASS_MIRROR_MASTER:
491 case CLASS_BLUE_MAGE:
493 if (0 != randint0(9000L / (plev * plev + 40))) return;
499 if (0 != randint0(20000L / ((plev + 50)*(plev + 50)))) return;
505 for (INVENTORY_IDX i = 0; i < INVEN_TOTAL; i++)
508 o_ptr = &creature_ptr->inventory_list[i];
509 if (!o_ptr->k_idx) continue;
524 if ((i < INVEN_RARM) && (0 != randint0(5))) continue;
526 sense_inventory_aux(creature_ptr, i, TRUE);
532 * @brief パターン終点到達時のテレポート処理を行う
533 * @param creature_ptr プレーヤーへの参照ポインタ
536 static void pattern_teleport(player_type *creature_ptr)
539 DEPTH max_level = 99;
541 if (get_check(_("他の階にテレポートしますか?", "Teleport level? ")))
546 if (ironman_downward)
547 min_level = creature_ptr->current_floor_ptr->dun_level;
549 if (creature_ptr->dungeon_idx == DUNGEON_ANGBAND)
551 if (creature_ptr->current_floor_ptr->dun_level > 100)
552 max_level = MAX_DEPTH - 1;
553 else if (creature_ptr->current_floor_ptr->dun_level == 100)
558 max_level = d_info[creature_ptr->dungeon_idx].maxdepth;
559 min_level = d_info[creature_ptr->dungeon_idx].mindepth;
562 sprintf(ppp, _("テレポート先:(%d-%d)", "Teleport to level (%d-%d): "), (int)min_level, (int)max_level);
563 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
564 if (!get_string(ppp, tmp_val, 10)) return;
566 command_arg = (COMMAND_ARG)atoi(tmp_val);
568 else if (get_check(_("通常テレポート?", "Normal teleport? ")))
570 teleport_player(creature_ptr, 200, 0L);
578 if (command_arg < min_level) command_arg = (COMMAND_ARG)min_level;
579 if (command_arg > max_level) command_arg = (COMMAND_ARG)max_level;
581 msg_format(_("%d 階にテレポートしました。", "You teleport to dungeon level %d."), command_arg);
582 if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
584 creature_ptr->current_floor_ptr->dun_level = command_arg;
585 leave_quest_check(creature_ptr);
586 if (record_stair) exe_write_diary(creature_ptr, DIARY_PAT_TELE, 0, NULL);
588 creature_ptr->current_floor_ptr->inside_quest = 0;
589 free_turn(creature_ptr);
592 * Clear all saved floors
593 * and create a first saved floor
595 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
596 creature_ptr->leaving = TRUE;
601 * @brief 各種パターン地形上の特別な処理 / Returns TRUE if we are on the Pattern...
602 * @return 実際にパターン地形上にプレイヤーが居た場合はTRUEを返す。
604 static bool pattern_effect(player_type *creature_ptr)
606 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
607 if (!pattern_tile(floor_ptr, creature_ptr->y, creature_ptr->x)) return FALSE;
609 if ((PRACE_IS_(creature_ptr, RACE_AMBERITE)) &&
610 (creature_ptr->cut > 0) && one_in_(10))
612 wreck_the_pattern(creature_ptr);
615 int pattern_type = f_info[floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].feat].subtype;
616 switch (pattern_type)
618 case PATTERN_TILE_END:
619 (void)set_image(creature_ptr, 0);
620 (void)restore_all_status(creature_ptr);
621 (void)restore_level(creature_ptr);
622 (void)cure_critical_wounds(creature_ptr, 1000);
624 cave_set_feat(creature_ptr, creature_ptr->y, creature_ptr->x, feat_pattern_old);
625 msg_print(_("「パターン」のこの部分は他の部分より強力でないようだ。", "This section of the Pattern looks less powerful."));
628 * We could make the healing effect of the
629 * Pattern center one-time only to avoid various kinds
630 * of abuse, like luring the win monster into fighting you
631 * in the middle of the pattern...
635 case PATTERN_TILE_OLD:
639 case PATTERN_TILE_TELEPORT:
640 pattern_teleport(creature_ptr);
643 case PATTERN_TILE_WRECKED:
644 if (!IS_INVULN(creature_ptr))
645 take_hit(creature_ptr, DAMAGE_NOESCAPE, 200, _("壊れた「パターン」を歩いたダメージ", "walking the corrupted Pattern"), -1);
649 if (PRACE_IS_(creature_ptr, RACE_AMBERITE) && !one_in_(2))
651 else if (!IS_INVULN(creature_ptr))
652 take_hit(creature_ptr, DAMAGE_NOESCAPE, damroll(1, 3), _("「パターン」を歩いたダメージ", "walking the Pattern"), -1);
661 * @brief プレイヤーのHP自然回復処理 / Regenerate hit points -RAK-
662 * @param percent 回復比率
665 static void regenhp(player_type *creature_ptr, int percent)
667 if (creature_ptr->special_defense & KATA_KOUKIJIN) return;
668 if (creature_ptr->action == ACTION_HAYAGAKE) return;
670 HIT_POINT old_chp = creature_ptr->chp;
673 * Extract the new hitpoints
675 * 'percent' is the Regen factor in unit (1/2^16)
677 HIT_POINT new_chp = 0;
678 u32b new_chp_frac = (creature_ptr->mhp * percent + PY_REGEN_HPBASE);
679 s64b_LSHIFT(new_chp, new_chp_frac, 16);
680 s64b_add(&(creature_ptr->chp), &(creature_ptr->chp_frac), new_chp, new_chp_frac);
681 if (0 < s64b_cmp(creature_ptr->chp, creature_ptr->chp_frac, creature_ptr->mhp, 0))
683 creature_ptr->chp = creature_ptr->mhp;
684 creature_ptr->chp_frac = 0;
687 if (old_chp != creature_ptr->chp)
689 creature_ptr->redraw |= (PR_HP);
690 creature_ptr->window |= (PW_PLAYER);
697 * @brief プレイヤーのMP自然回復処理(regen_magic()のサブセット) / Regenerate mana points
698 * @param upkeep_factor ペット維持によるMPコスト量
699 * @param regen_amount 回復量
702 static void regenmana(player_type *creature_ptr, MANA_POINT upkeep_factor, MANA_POINT regen_amount)
704 MANA_POINT old_csp = creature_ptr->csp;
705 s32b regen_rate = regen_amount * 100 - upkeep_factor * PY_REGEN_NORMAL;
708 * Excess mana will decay 32 times faster than normal
711 if (creature_ptr->csp > creature_ptr->msp)
714 u32b decay_frac = (creature_ptr->msp * 32 * PY_REGEN_NORMAL + PY_REGEN_MNBASE);
715 s64b_LSHIFT(decay, decay_frac, 16);
716 s64b_sub(&(creature_ptr->csp), &(creature_ptr->csp_frac), decay, decay_frac);
717 if (creature_ptr->csp < creature_ptr->msp)
719 creature_ptr->csp = creature_ptr->msp;
720 creature_ptr->csp_frac = 0;
724 /* Regenerating mana (unless the player has excess mana) */
725 else if (regen_rate > 0)
727 MANA_POINT new_mana = 0;
728 u32b new_mana_frac = (creature_ptr->msp * regen_rate / 100 + PY_REGEN_MNBASE);
729 s64b_LSHIFT(new_mana, new_mana_frac, 16);
730 s64b_add(&(creature_ptr->csp), &(creature_ptr->csp_frac), new_mana, new_mana_frac);
731 if (creature_ptr->csp >= creature_ptr->msp)
733 creature_ptr->csp = creature_ptr->msp;
734 creature_ptr->csp_frac = 0;
738 /* Reduce mana (even when the player has excess mana) */
741 s32b reduce_mana = 0;
742 u32b reduce_mana_frac = (creature_ptr->msp * (-1) * regen_rate / 100 + PY_REGEN_MNBASE);
743 s64b_LSHIFT(reduce_mana, reduce_mana_frac, 16);
744 s64b_sub(&(creature_ptr->csp), &(creature_ptr->csp_frac), reduce_mana, reduce_mana_frac);
745 if (creature_ptr->csp < 0)
747 creature_ptr->csp = 0;
748 creature_ptr->csp_frac = 0;
752 if (old_csp != creature_ptr->csp)
754 creature_ptr->redraw |= (PR_MANA);
755 creature_ptr->window |= (PW_PLAYER);
756 creature_ptr->window |= (PW_SPELL);
763 * @brief プレイヤーのMP自然回復処理 / Regenerate magic regen_amount: PY_REGEN_NORMAL * 2 (if resting) * 2 (if having regenarate)
764 * @param regen_amount 回復量
767 static void regenmagic(player_type *creature_ptr, int regen_amount)
771 int mult = (dev + adj_mag_mana[creature_ptr->stat_ind[A_INT]]); /* x1 to x2 speed bonus for recharging */
773 for (int i = 0; i < EATER_EXT * 2; i++)
775 if (!creature_ptr->magic_num2[i]) continue;
776 if (creature_ptr->magic_num1[i] == ((long)creature_ptr->magic_num2[i] << 16)) continue;
778 /* Increase remaining charge number like float value */
779 new_mana = (regen_amount * mult * ((long)creature_ptr->magic_num2[i] + 13)) / (dev * 8);
780 creature_ptr->magic_num1[i] += new_mana;
782 /* Check maximum charge */
783 if (creature_ptr->magic_num1[i] > (creature_ptr->magic_num2[i] << 16))
785 creature_ptr->magic_num1[i] = ((long)creature_ptr->magic_num2[i] << 16);
791 for (int i = EATER_EXT * 2; i < EATER_EXT * 3; i++)
793 if (!creature_ptr->magic_num1[i]) continue;
794 if (!creature_ptr->magic_num2[i]) continue;
796 /* Decrease remaining period for charging */
797 new_mana = (regen_amount * mult * ((long)creature_ptr->magic_num2[i] + 10) * EATER_ROD_CHARGE)
798 / (dev * 16 * PY_REGEN_NORMAL);
799 creature_ptr->magic_num1[i] -= new_mana;
801 /* Check minimum remaining period for charging */
802 if (creature_ptr->magic_num1[i] < 0) creature_ptr->magic_num1[i] = 0;
809 * @brief 100ゲームターン毎のモンスターのHP自然回復処理 / Regenerate the monsters (once per 100 game turns)
810 * @param player_ptr プレーヤーへの参照ポインタ
812 * @note Should probably be done during monster turns.
814 static void regenerate_monsters(player_type *player_ptr)
816 for (int i = 1; i < player_ptr->current_floor_ptr->m_max; i++)
818 monster_type *m_ptr = &player_ptr->current_floor_ptr->m_list[i];
819 monster_race *r_ptr = &r_info[m_ptr->r_idx];
821 if (!monster_is_valid(m_ptr)) continue;
823 if (m_ptr->hp < m_ptr->maxhp)
825 int frac = m_ptr->maxhp / 100;
826 if (!frac) if (one_in_(2)) frac = 1;
828 if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2;
831 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
833 if (player_ptr->health_who == i) player_ptr->redraw |= (PR_HEALTH);
834 if (player_ptr->riding == i) player_ptr->redraw |= (PR_UHEALTH);
841 * @brief 30ゲームターン毎のボール中モンスターのHP自然回復処理 / Regenerate the captured monsters (once per 30 game turns)
842 * @param creature_ptr プレーヤーへの参照ポインタ
844 * @note Should probably be done during monster turns.
846 static void regenerate_captured_monsters(player_type *creature_ptr)
849 for (int i = 0; i < INVEN_TOTAL; i++)
852 object_type *o_ptr = &creature_ptr->inventory_list[i];
853 if (!o_ptr->k_idx) continue;
854 if (o_ptr->tval != TV_CAPTURE) continue;
855 if (!o_ptr->pval) continue;
858 r_ptr = &r_info[o_ptr->pval];
859 if (o_ptr->xtra4 < o_ptr->xtra5)
861 int frac = o_ptr->xtra5 / 100;
862 if (!frac) if (one_in_(2)) frac = 1;
864 if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2;
866 o_ptr->xtra4 += (XTRA16)frac;
867 if (o_ptr->xtra4 > o_ptr->xtra5) o_ptr->xtra4 = o_ptr->xtra5;
873 creature_ptr->update |= (PU_COMBINE);
874 creature_ptr->window |= (PW_INVEN);
875 creature_ptr->window |= (PW_EQUIP);
882 * @brief 寿命つき光源の警告メッセージ処理
883 * @param creature_ptr プレーヤーへの参照ポインタ
884 * @param o_ptr 現在光源として使っているオブジェクトの構造体参照ポインタ
887 static void notice_lite_change(player_type *creature_ptr, object_type *o_ptr)
889 if ((o_ptr->xtra4 < 100) || (!(o_ptr->xtra4 % 100)))
891 creature_ptr->window |= (PW_EQUIP);
894 if (creature_ptr->blind)
896 if (o_ptr->xtra4 == 0) o_ptr->xtra4++;
898 else if (o_ptr->xtra4 == 0)
900 disturb(creature_ptr, FALSE, TRUE);
901 msg_print(_("明かりが消えてしまった!", "Your light has gone out!"));
902 creature_ptr->update |= (PU_TORCH);
903 creature_ptr->update |= (PU_BONUS);
905 else if (o_ptr->name2 == EGO_LITE_LONG)
907 if ((o_ptr->xtra4 < 50) && (!(o_ptr->xtra4 % 5))
908 && (current_world_ptr->game_turn % (TURNS_PER_TICK * 2)))
910 if (disturb_minor) disturb(creature_ptr, FALSE, TRUE);
911 msg_print(_("明かりが微かになってきている。", "Your light is growing faint."));
914 else if ((o_ptr->xtra4 < 100) && (!(o_ptr->xtra4 % 10)))
916 if (disturb_minor) disturb(creature_ptr, FALSE, TRUE);
917 msg_print(_("明かりが微かになってきている。", "Your light is growing faint."));
923 * @brief !!を刻んだ魔道具の時間経過による再充填を知らせる処理 / If player has inscribed the object with "!!", let him know when it's recharged. -LM-
924 * @param o_ptr 対象オブジェクトの構造体参照ポインタ
927 static void recharged_notice(player_type *owner_ptr, object_type *o_ptr)
929 if (!o_ptr->inscription) return;
931 concptr s = my_strchr(quark_str(o_ptr->inscription), '!');
936 GAME_TEXT o_name[MAX_NLEN];
937 object_desc(owner_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
939 msg_format("%sは再充填された。", o_name);
941 if (o_ptr->number > 1)
942 msg_format("Your %s are recharged.", o_name);
944 msg_format("Your %s is recharged.", o_name);
946 disturb(owner_ptr, FALSE, FALSE);
950 s = my_strchr(s + 1, '!');
956 * @brief プレイヤーの歌に関する継続処理
959 static void check_music(player_type *caster_ptr)
961 if (caster_ptr->pclass != CLASS_BARD) return;
962 if (!SINGING_SONG_EFFECT(caster_ptr) && !INTERUPTING_SONG_EFFECT(caster_ptr)) return;
964 if (caster_ptr->anti_magic)
966 stop_singing(caster_ptr);
970 int spell = SINGING_SONG_ID(caster_ptr);
971 const magic_type *s_ptr;
972 s_ptr = &technic_info[REALM_MUSIC - MIN_TECHNIC][spell];
974 MANA_POINT need_mana = mod_need_mana(caster_ptr, s_ptr->smana, spell, REALM_MUSIC);
975 u32b need_mana_frac = 0;
977 s64b_RSHIFT(need_mana, need_mana_frac, 1);
978 if (s64b_cmp(caster_ptr->csp, caster_ptr->csp_frac, need_mana, need_mana_frac) < 0)
980 stop_singing(caster_ptr);
985 s64b_sub(&(caster_ptr->csp), &(caster_ptr->csp_frac), need_mana, need_mana_frac);
987 caster_ptr->redraw |= PR_MANA;
988 if (INTERUPTING_SONG_EFFECT(caster_ptr))
990 SINGING_SONG_EFFECT(caster_ptr) = INTERUPTING_SONG_EFFECT(caster_ptr);
991 INTERUPTING_SONG_EFFECT(caster_ptr) = MUSIC_NONE;
992 msg_print(_("歌を再開した。", "You restart singing."));
993 caster_ptr->action = ACTION_SING;
994 caster_ptr->update |= (PU_BONUS | PU_HP | PU_MONSTERS);
995 caster_ptr->redraw |= (PR_MAP | PR_STATUS | PR_STATE);
996 caster_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
1000 if (caster_ptr->spell_exp[spell] < SPELL_EXP_BEGINNER)
1001 caster_ptr->spell_exp[spell] += 5;
1002 else if (caster_ptr->spell_exp[spell] < SPELL_EXP_SKILLED)
1004 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;
1006 else if (caster_ptr->spell_exp[spell] < SPELL_EXP_EXPERT)
1008 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;
1010 else if (caster_ptr->spell_exp[spell] < SPELL_EXP_MASTER)
1012 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;
1015 exe_spell(caster_ptr, REALM_MUSIC, spell, SPELL_CONT);
1020 * @brief 現在呪いを保持している装備品を一つランダムに探し出す / Choose one of items that have cursed flag
1021 * @param flag 探し出したい呪いフラグ配列
1022 * @return 該当の呪いが一つでもあった場合にランダムに選ばれた装備品のオブジェクト構造体参照ポインタを返す。\n
1025 static object_type *choose_cursed_obj_name(player_type *player_ptr, BIT_FLAGS flag)
1027 int choices[INVEN_TOTAL - INVEN_RARM];
1029 if (!(player_ptr->cursed & flag)) return NULL;
1031 for (int i = INVEN_RARM; i < INVEN_TOTAL; i++)
1033 object_type *o_ptr = &player_ptr->inventory_list[i];
1034 if (o_ptr->curse_flags & flag)
1036 choices[number] = i;
1039 else if ((flag == TRC_ADD_L_CURSE) ||
1040 (flag == TRC_ADD_H_CURSE) ||
1041 (flag == TRC_DRAIN_HP) ||
1042 (flag == TRC_DRAIN_MANA) ||
1043 (flag == TRC_CALL_ANIMAL) ||
1044 (flag == TRC_CALL_DEMON) ||
1045 (flag == TRC_CALL_DRAGON) ||
1046 (flag == TRC_CALL_UNDEAD) ||
1047 (flag == TRC_COWARDICE) ||
1048 (flag == TRC_LOW_MELEE) ||
1049 (flag == TRC_LOW_AC) ||
1050 (flag == TRC_LOW_MAGIC) ||
1051 (flag == TRC_FAST_DIGEST) ||
1052 (flag == TRC_SLOW_REGEN))
1055 BIT_FLAGS flgs[TR_FLAG_SIZE];
1056 object_flags(o_ptr, flgs);
1059 case TRC_ADD_L_CURSE: cf = TR_ADD_L_CURSE; break;
1060 case TRC_ADD_H_CURSE: cf = TR_ADD_H_CURSE; break;
1061 case TRC_DRAIN_HP: cf = TR_DRAIN_HP; break;
1062 case TRC_DRAIN_MANA: cf = TR_DRAIN_MANA; break;
1063 case TRC_CALL_ANIMAL: cf = TR_CALL_ANIMAL; break;
1064 case TRC_CALL_DEMON: cf = TR_CALL_DEMON; break;
1065 case TRC_CALL_DRAGON: cf = TR_CALL_DRAGON; break;
1066 case TRC_CALL_UNDEAD: cf = TR_CALL_UNDEAD; break;
1067 case TRC_COWARDICE: cf = TR_COWARDICE; break;
1068 case TRC_LOW_MELEE: cf = TR_LOW_MELEE; break;
1069 case TRC_LOW_AC: cf = TR_LOW_AC; break;
1070 case TRC_LOW_MAGIC: cf = TR_LOW_MAGIC; break;
1071 case TRC_FAST_DIGEST: cf = TR_FAST_DIGEST; break;
1072 case TRC_SLOW_REGEN: cf = TR_SLOW_REGEN; break;
1075 if (have_flag(flgs, cf))
1077 choices[number] = i;
1083 return &player_ptr->inventory_list[choices[randint0(number)]];
1088 * @brief 10ゲームターンが進行するごとにプレイヤーの空腹状態を飢餓方向に向かわせる
1089 * @param creature_ptr プレーヤーへの参照ポインタ
1092 static void process_world_aux_digestion(player_type *creature_ptr)
1094 if (creature_ptr->phase_out) return;
1096 if (creature_ptr->food >= PY_FOOD_MAX)
1098 (void)set_food(creature_ptr, creature_ptr->food - 100);
1100 else if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 5)))
1102 int digestion = SPEED_TO_ENERGY(creature_ptr->pspeed);
1103 if (creature_ptr->regenerate)
1105 if (creature_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1107 if (creature_ptr->cursed & TRC_FAST_DIGEST)
1110 if (creature_ptr->slow_digest)
1113 if (digestion < 1) digestion = 1;
1114 if (digestion > 100) digestion = 100;
1116 (void)set_food(creature_ptr, creature_ptr->food - digestion);
1119 if ((creature_ptr->food >= PY_FOOD_FAINT)) return;
1121 if (!creature_ptr->paralyzed && (randint0(100) < 10))
1123 msg_print(_("あまりにも空腹で気絶してしまった。", "You faint from the lack of food."));
1124 disturb(creature_ptr, TRUE, TRUE);
1125 (void)set_paralyzed(creature_ptr, creature_ptr->paralyzed + 1 + randint0(5));
1128 if (creature_ptr->food < PY_FOOD_STARVE)
1130 HIT_POINT dam = (PY_FOOD_STARVE - creature_ptr->food) / 10;
1131 if (!IS_INVULN(creature_ptr)) take_hit(creature_ptr, DAMAGE_LOSELIFE, dam, _("空腹", "starvation"), -1);
1137 * @brief 10ゲームターンが進行するごとにプレイヤーのHPとMPの増減処理を行う。
1138 * / Handle timed damage and regeneration every 10 game turns
1141 static void process_world_aux_hp_and_sp(player_type *creature_ptr)
1143 feature_type *f_ptr = &f_info[creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].feat];
1144 bool cave_no_regen = FALSE;
1145 int upkeep_factor = 0;
1146 int regen_amount = PY_REGEN_NORMAL;
1147 if (creature_ptr->poisoned && !IS_INVULN(creature_ptr))
1149 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, _("毒", "poison"), -1);
1152 if (creature_ptr->cut && !IS_INVULN(creature_ptr))
1155 if (creature_ptr->cut > 1000)
1159 else if (creature_ptr->cut > 200)
1163 else if (creature_ptr->cut > 100)
1167 else if (creature_ptr->cut > 50)
1171 else if (creature_ptr->cut > 25)
1175 else if (creature_ptr->cut > 10)
1184 take_hit(creature_ptr, DAMAGE_NOESCAPE, dam, _("致命傷", "a fatal wound"), -1);
1187 if (PRACE_IS_(creature_ptr, RACE_VAMPIRE) || (creature_ptr->mimic_form == MIMIC_VAMPIRE))
1189 if (!creature_ptr->current_floor_ptr->dun_level && !creature_ptr->resist_lite && !IS_INVULN(creature_ptr) && is_daytime())
1191 if ((creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
1193 msg_print(_("日光があなたのアンデッドの肉体を焼き焦がした!", "The sun's rays scorch your undead flesh!"));
1194 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, _("日光", "sunlight"), -1);
1195 cave_no_regen = TRUE;
1199 if (creature_ptr->inventory_list[INVEN_LITE].tval && (creature_ptr->inventory_list[INVEN_LITE].name2 != EGO_LITE_DARKNESS) &&
1200 !creature_ptr->resist_lite)
1202 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
1203 GAME_TEXT o_name[MAX_NLEN];
1204 char ouch[MAX_NLEN + 40];
1205 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1206 msg_format(_("%sがあなたのアンデッドの肉体を焼き焦がした!", "The %s scorches your undead flesh!"), o_name);
1208 cave_no_regen = TRUE;
1209 object_desc(creature_ptr, o_name, o_ptr, OD_NAME_ONLY);
1210 sprintf(ouch, _("%sを装備したダメージ", "wielding %s"), o_name);
1212 if (!IS_INVULN(creature_ptr)) take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, ouch, -1);
1216 if (have_flag(f_ptr->flags, FF_LAVA) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_fire)
1220 if (have_flag(f_ptr->flags, FF_DEEP))
1222 damage = 6000 + randint0(4000);
1224 else if (!creature_ptr->levitation)
1226 damage = 3000 + randint0(2000);
1231 if (PRACE_IS_(creature_ptr, RACE_ENT)) damage += damage / 3;
1232 if (creature_ptr->resist_fire) damage = damage / 3;
1233 if (is_oppose_fire(creature_ptr)) damage = damage / 3;
1234 if (creature_ptr->levitation) damage = damage / 5;
1236 damage = damage / 100 + (randint0(100) < (damage % 100));
1238 if (creature_ptr->levitation)
1240 msg_print(_("熱で火傷した!", "The heat burns you!"));
1241 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1242 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1246 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1247 msg_format(_("%sで火傷した!", "The %s burns you!"), name);
1248 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1251 cave_no_regen = TRUE;
1255 if (have_flag(f_ptr->flags, FF_COLD_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_cold)
1259 if (have_flag(f_ptr->flags, FF_DEEP))
1261 damage = 6000 + randint0(4000);
1263 else if (!creature_ptr->levitation)
1265 damage = 3000 + randint0(2000);
1270 if (creature_ptr->resist_cold) damage = damage / 3;
1271 if (is_oppose_cold(creature_ptr)) damage = damage / 3;
1272 if (creature_ptr->levitation) damage = damage / 5;
1274 damage = damage / 100 + (randint0(100) < (damage % 100));
1276 if (creature_ptr->levitation)
1278 msg_print(_("冷気に覆われた!", "The cold engulfs you!"));
1279 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1280 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1284 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1285 msg_format(_("%sに凍えた!", "The %s frostbites you!"), name);
1286 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1289 cave_no_regen = TRUE;
1293 if (have_flag(f_ptr->flags, FF_ELEC_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_elec)
1297 if (have_flag(f_ptr->flags, FF_DEEP))
1299 damage = 6000 + randint0(4000);
1301 else if (!creature_ptr->levitation)
1303 damage = 3000 + randint0(2000);
1308 if (creature_ptr->resist_elec) damage = damage / 3;
1309 if (is_oppose_elec(creature_ptr)) damage = damage / 3;
1310 if (creature_ptr->levitation) damage = damage / 5;
1312 damage = damage / 100 + (randint0(100) < (damage % 100));
1314 if (creature_ptr->levitation)
1316 msg_print(_("電撃を受けた!", "The electricity shocks you!"));
1317 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1318 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1322 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1323 msg_format(_("%sに感電した!", "The %s shocks you!"), name);
1324 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1327 cave_no_regen = TRUE;
1331 if (have_flag(f_ptr->flags, FF_ACID_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_acid)
1335 if (have_flag(f_ptr->flags, FF_DEEP))
1337 damage = 6000 + randint0(4000);
1339 else if (!creature_ptr->levitation)
1341 damage = 3000 + randint0(2000);
1346 if (creature_ptr->resist_acid) damage = damage / 3;
1347 if (is_oppose_acid(creature_ptr)) damage = damage / 3;
1348 if (creature_ptr->levitation) damage = damage / 5;
1350 damage = damage / 100 + (randint0(100) < (damage % 100));
1352 if (creature_ptr->levitation)
1354 msg_print(_("酸が飛び散った!", "The acid melts you!"));
1355 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1356 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1360 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1361 msg_format(_("%sに溶かされた!", "The %s melts you!"), name);
1362 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1365 cave_no_regen = TRUE;
1369 if (have_flag(f_ptr->flags, FF_POISON_PUDDLE) && !IS_INVULN(creature_ptr))
1373 if (have_flag(f_ptr->flags, FF_DEEP))
1375 damage = 6000 + randint0(4000);
1377 else if (!creature_ptr->levitation)
1379 damage = 3000 + randint0(2000);
1384 if (creature_ptr->resist_pois) damage = damage / 3;
1385 if (is_oppose_pois(creature_ptr)) damage = damage / 3;
1386 if (creature_ptr->levitation) damage = damage / 5;
1388 damage = damage / 100 + (randint0(100) < (damage % 100));
1390 if (creature_ptr->levitation)
1392 msg_print(_("毒気を吸い込んだ!", "The gas poisons you!"));
1393 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1394 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1395 if (creature_ptr->resist_pois) (void)set_poisoned(creature_ptr, creature_ptr->poisoned + 1);
1399 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1400 msg_format(_("%sに毒された!", "The %s poisons you!"), name);
1401 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1402 if (creature_ptr->resist_pois) (void)set_poisoned(creature_ptr, creature_ptr->poisoned + 3);
1405 cave_no_regen = TRUE;
1409 if (have_flag(f_ptr->flags, FF_WATER) && have_flag(f_ptr->flags, FF_DEEP) &&
1410 !creature_ptr->levitation && !creature_ptr->can_swim && !creature_ptr->resist_water)
1412 if (creature_ptr->total_weight > weight_limit(creature_ptr))
1414 msg_print(_("溺れている!", "You are drowning!"));
1415 take_hit(creature_ptr, DAMAGE_NOESCAPE, randint1(creature_ptr->lev), _("溺れ", "drowning"), -1);
1416 cave_no_regen = TRUE;
1420 if (creature_ptr->riding)
1423 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags2 & RF2_AURA_FIRE) && !creature_ptr->immune_fire)
1425 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1426 if (PRACE_IS_(creature_ptr, RACE_ENT)) damage += damage / 3;
1427 if (creature_ptr->resist_fire) damage = damage / 3;
1428 if (is_oppose_fire(creature_ptr)) damage = damage / 3;
1429 msg_print(_("熱い!", "It's hot!"));
1430 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("炎のオーラ", "Fire aura"), -1);
1432 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags2 & RF2_AURA_ELEC) && !creature_ptr->immune_elec)
1434 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1435 if (PRACE_IS_(creature_ptr, RACE_ANDROID)) damage += damage / 3;
1436 if (creature_ptr->resist_elec) damage = damage / 3;
1437 if (is_oppose_elec(creature_ptr)) damage = damage / 3;
1438 msg_print(_("痛い!", "It hurts!"));
1439 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("電気のオーラ", "Elec aura"), -1);
1441 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags3 & RF3_AURA_COLD) && !creature_ptr->immune_cold)
1443 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1444 if (creature_ptr->resist_cold) damage = damage / 3;
1445 if (is_oppose_cold(creature_ptr)) damage = damage / 3;
1446 msg_print(_("冷たい!", "It's cold!"));
1447 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("冷気のオーラ", "Cold aura"), -1);
1451 /* Spectres -- take damage when moving through walls */
1453 * Added: ANYBODY takes damage if inside through walls
1454 * without wraith form -- NOTE: Spectres will never be
1455 * reduced below 0 hp by being inside a stone wall; others
1458 if (!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY))
1460 if (!IS_INVULN(creature_ptr) && !creature_ptr->wraith_form && !creature_ptr->kabenuke && ((creature_ptr->chp > (creature_ptr->lev / 5)) || !creature_ptr->pass_wall))
1463 cave_no_regen = TRUE;
1465 if (creature_ptr->pass_wall)
1467 msg_print(_("体の分子が分解した気がする!", "Your molecules feel disrupted!"));
1468 dam_desc = _("密度", "density");
1472 msg_print(_("崩れた岩に押し潰された!", "You are being crushed!"));
1473 dam_desc = _("硬い岩", "solid rock");
1476 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1 + (creature_ptr->lev / 5), dam_desc, -1);
1480 if (creature_ptr->food < PY_FOOD_WEAK)
1482 if (creature_ptr->food < PY_FOOD_STARVE)
1486 else if (creature_ptr->food < PY_FOOD_FAINT)
1488 regen_amount = PY_REGEN_FAINT;
1492 regen_amount = PY_REGEN_WEAK;
1496 if (pattern_effect(creature_ptr))
1498 cave_no_regen = TRUE;
1502 if (creature_ptr->regenerate)
1504 regen_amount = regen_amount * 2;
1506 if (creature_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1510 if (creature_ptr->cursed & TRC_SLOW_REGEN)
1516 if ((creature_ptr->action == ACTION_SEARCH) || (creature_ptr->action == ACTION_REST))
1518 regen_amount = regen_amount * 2;
1521 upkeep_factor = calculate_upkeep(creature_ptr);
1522 if ((creature_ptr->action == ACTION_LEARN) ||
1523 (creature_ptr->action == ACTION_HAYAGAKE) ||
1524 (creature_ptr->special_defense & KATA_KOUKIJIN))
1526 upkeep_factor += 100;
1529 regenmana(creature_ptr, upkeep_factor, regen_amount);
1530 if (creature_ptr->pclass == CLASS_MAGIC_EATER)
1532 regenmagic(creature_ptr, regen_amount);
1535 if ((creature_ptr->csp == 0) && (creature_ptr->csp_frac == 0))
1537 while (upkeep_factor > 100)
1539 msg_print(_("こんなに多くのペットを制御できない!", "Too many pets to control at once!"));
1541 do_cmd_pet_dismiss(creature_ptr);
1543 upkeep_factor = calculate_upkeep(creature_ptr);
1545 msg_format(_("維持MPは %d%%", "Upkeep: %d%% mana."), upkeep_factor);
1550 if (creature_ptr->poisoned) regen_amount = 0;
1551 if (creature_ptr->cut) regen_amount = 0;
1552 if (cave_no_regen) regen_amount = 0;
1554 regen_amount = (regen_amount * creature_ptr->mutant_regenerate_mod) / 100;
1555 if ((creature_ptr->chp < creature_ptr->mhp) && !cave_no_regen)
1557 regenhp(creature_ptr, regen_amount);
1563 * @brief 10ゲームターンが進行するごとに魔法効果の残りターンを減らしていく処理
1564 * / Handle timeout every 10 game turns
1567 static void process_world_aux_timeout(player_type *creature_ptr)
1569 const int dec_count = (easy_band ? 2 : 1);
1570 if (creature_ptr->tim_mimic)
1572 (void)set_mimic(creature_ptr, creature_ptr->tim_mimic - 1, creature_ptr->mimic_form, TRUE);
1575 if (creature_ptr->image)
1577 (void)set_image(creature_ptr, creature_ptr->image - dec_count);
1580 if (creature_ptr->blind)
1582 (void)set_blind(creature_ptr, creature_ptr->blind - dec_count);
1585 if (creature_ptr->tim_invis)
1587 (void)set_tim_invis(creature_ptr, creature_ptr->tim_invis - 1, TRUE);
1590 if (creature_ptr->suppress_multi_reward)
1592 creature_ptr->suppress_multi_reward = FALSE;
1595 if (creature_ptr->tim_esp)
1597 (void)set_tim_esp(creature_ptr, creature_ptr->tim_esp - 1, TRUE);
1600 if (creature_ptr->ele_attack)
1602 creature_ptr->ele_attack--;
1603 if (!creature_ptr->ele_attack) set_ele_attack(creature_ptr, 0, 0);
1606 if (creature_ptr->ele_immune)
1608 creature_ptr->ele_immune--;
1609 if (!creature_ptr->ele_immune) set_ele_immune(creature_ptr, 0, 0);
1612 if (creature_ptr->tim_infra)
1614 (void)set_tim_infra(creature_ptr, creature_ptr->tim_infra - 1, TRUE);
1617 if (creature_ptr->tim_stealth)
1619 (void)set_tim_stealth(creature_ptr, creature_ptr->tim_stealth - 1, TRUE);
1622 if (creature_ptr->tim_levitation)
1624 (void)set_tim_levitation(creature_ptr, creature_ptr->tim_levitation - 1, TRUE);
1627 if (creature_ptr->tim_sh_touki)
1629 (void)set_tim_sh_touki(creature_ptr, creature_ptr->tim_sh_touki - 1, TRUE);
1632 if (creature_ptr->tim_sh_fire)
1634 (void)set_tim_sh_fire(creature_ptr, creature_ptr->tim_sh_fire - 1, TRUE);
1637 if (creature_ptr->tim_sh_holy)
1639 (void)set_tim_sh_holy(creature_ptr, creature_ptr->tim_sh_holy - 1, TRUE);
1642 if (creature_ptr->tim_eyeeye)
1644 (void)set_tim_eyeeye(creature_ptr, creature_ptr->tim_eyeeye - 1, TRUE);
1647 if (creature_ptr->resist_magic)
1649 (void)set_resist_magic(creature_ptr, creature_ptr->resist_magic - 1, TRUE);
1652 if (creature_ptr->tim_regen)
1654 (void)set_tim_regen(creature_ptr, creature_ptr->tim_regen - 1, TRUE);
1657 if (creature_ptr->tim_res_nether)
1659 (void)set_tim_res_nether(creature_ptr, creature_ptr->tim_res_nether - 1, TRUE);
1662 if (creature_ptr->tim_res_time)
1664 (void)set_tim_res_time(creature_ptr, creature_ptr->tim_res_time - 1, TRUE);
1667 if (creature_ptr->tim_reflect)
1669 (void)set_tim_reflect(creature_ptr, creature_ptr->tim_reflect - 1, TRUE);
1672 if (creature_ptr->multishadow)
1674 (void)set_multishadow(creature_ptr, creature_ptr->multishadow - 1, TRUE);
1677 if (creature_ptr->dustrobe)
1679 (void)set_dustrobe(creature_ptr, creature_ptr->dustrobe - 1, TRUE);
1682 if (creature_ptr->kabenuke)
1684 (void)set_kabenuke(creature_ptr, creature_ptr->kabenuke - 1, TRUE);
1687 if (creature_ptr->paralyzed)
1689 (void)set_paralyzed(creature_ptr, creature_ptr->paralyzed - dec_count);
1692 if (creature_ptr->confused)
1694 (void)set_confused(creature_ptr, creature_ptr->confused - dec_count);
1697 if (creature_ptr->afraid)
1699 (void)set_afraid(creature_ptr, creature_ptr->afraid - dec_count);
1702 if (creature_ptr->fast)
1704 (void)set_fast(creature_ptr, creature_ptr->fast - 1, TRUE);
1707 if (creature_ptr->slow)
1709 (void)set_slow(creature_ptr, creature_ptr->slow - dec_count, TRUE);
1712 if (creature_ptr->protevil)
1714 (void)set_protevil(creature_ptr, creature_ptr->protevil - 1, TRUE);
1717 if (creature_ptr->invuln)
1719 (void)set_invuln(creature_ptr, creature_ptr->invuln - 1, TRUE);
1722 if (creature_ptr->wraith_form)
1724 (void)set_wraith_form(creature_ptr, creature_ptr->wraith_form - 1, TRUE);
1727 if (creature_ptr->hero)
1729 (void)set_hero(creature_ptr, creature_ptr->hero - 1, TRUE);
1732 if (creature_ptr->shero)
1734 (void)set_shero(creature_ptr, creature_ptr->shero - 1, TRUE);
1737 if (creature_ptr->blessed)
1739 (void)set_blessed(creature_ptr, creature_ptr->blessed - 1, TRUE);
1742 if (creature_ptr->shield)
1744 (void)set_shield(creature_ptr, creature_ptr->shield - 1, TRUE);
1747 if (creature_ptr->tsubureru)
1749 (void)set_tsubureru(creature_ptr, creature_ptr->tsubureru - 1, TRUE);
1752 if (creature_ptr->magicdef)
1754 (void)set_magicdef(creature_ptr, creature_ptr->magicdef - 1, TRUE);
1757 if (creature_ptr->tsuyoshi)
1759 (void)set_tsuyoshi(creature_ptr, creature_ptr->tsuyoshi - 1, TRUE);
1762 if (creature_ptr->oppose_acid)
1764 (void)set_oppose_acid(creature_ptr, creature_ptr->oppose_acid - 1, TRUE);
1767 if (creature_ptr->oppose_elec)
1769 (void)set_oppose_elec(creature_ptr, creature_ptr->oppose_elec - 1, TRUE);
1772 if (creature_ptr->oppose_fire)
1774 (void)set_oppose_fire(creature_ptr, creature_ptr->oppose_fire - 1, TRUE);
1777 if (creature_ptr->oppose_cold)
1779 (void)set_oppose_cold(creature_ptr, creature_ptr->oppose_cold - 1, TRUE);
1782 if (creature_ptr->oppose_pois)
1784 (void)set_oppose_pois(creature_ptr, creature_ptr->oppose_pois - 1, TRUE);
1787 if (creature_ptr->ult_res)
1789 (void)set_ultimate_res(creature_ptr, creature_ptr->ult_res - 1, TRUE);
1792 if (creature_ptr->poisoned)
1794 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
1795 (void)set_poisoned(creature_ptr, creature_ptr->poisoned - adjust);
1798 if (creature_ptr->stun)
1800 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
1801 (void)set_stun(creature_ptr, creature_ptr->stun - adjust);
1804 if (creature_ptr->cut)
1806 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
1807 if (creature_ptr->cut > 1000) adjust = 0;
1808 (void)set_cut(creature_ptr, creature_ptr->cut - adjust);
1814 * @brief 10ゲームターンが進行する毎に光源の寿命を減らす処理
1815 * / Handle burning fuel every 10 game turns
1818 static void process_world_aux_light(player_type *creature_ptr)
1820 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
1821 if (o_ptr->tval == TV_LITE)
1823 if (!(object_is_fixed_artifact(o_ptr) || o_ptr->sval == SV_LITE_FEANOR) && (o_ptr->xtra4 > 0))
1825 if (o_ptr->name2 == EGO_LITE_LONG)
1827 if (current_world_ptr->game_turn % (TURNS_PER_TICK * 2)) o_ptr->xtra4--;
1829 else o_ptr->xtra4--;
1831 notice_lite_change(creature_ptr, o_ptr);
1838 * @brief 10ゲームターンが進行するごとに突然変異の発動判定を行う処理
1839 * / Handle mutation effects once every 10 game turns
1842 static void process_world_aux_mutation(player_type *creature_ptr)
1844 if (!creature_ptr->muta2) return;
1845 if (creature_ptr->phase_out) return;
1846 if (creature_ptr->wild_mode) return;
1848 if ((creature_ptr->muta2 & MUT2_BERS_RAGE) && one_in_(3000))
1850 disturb(creature_ptr, FALSE, TRUE);
1851 msg_print(_("ウガァァア!", "RAAAAGHH!"));
1852 msg_print(_("激怒の発作に襲われた!", "You feel a fit of rage coming over you!"));
1853 (void)set_shero(creature_ptr, 10 + randint1(creature_ptr->lev), FALSE);
1854 (void)set_afraid(creature_ptr, 0);
1857 if ((creature_ptr->muta2 & MUT2_COWARDICE) && (randint1(3000) == 13))
1859 if (!creature_ptr->resist_fear)
1861 disturb(creature_ptr, FALSE, TRUE);
1862 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
1863 set_afraid(creature_ptr, creature_ptr->afraid + 13 + randint1(26));
1867 if ((creature_ptr->muta2 & MUT2_RTELEPORT) && (randint1(5000) == 88))
1869 if (!creature_ptr->resist_nexus && !(creature_ptr->muta1 & MUT1_VTELEPORT) && !creature_ptr->anti_tele)
1871 disturb(creature_ptr, FALSE, TRUE);
1872 msg_print(_("あなたの位置は突然ひじょうに不確定になった...", "Your position suddenly seems very uncertain..."));
1874 teleport_player(creature_ptr, 40, TELEPORT_PASSIVE);
1878 if ((creature_ptr->muta2 & MUT2_ALCOHOL) && (randint1(6400) == 321))
1880 if (!creature_ptr->resist_conf && !creature_ptr->resist_chaos)
1882 disturb(creature_ptr, FALSE, TRUE);
1883 creature_ptr->redraw |= PR_EXTRA;
1884 msg_print(_("いひきがもーろーとひてきたきがふる...ヒック!", "You feel a SSSCHtupor cOmINg over yOu... *HIC*!"));
1887 if (!creature_ptr->resist_conf)
1889 (void)set_confused(creature_ptr, creature_ptr->confused + randint0(20) + 15);
1892 if (!creature_ptr->resist_chaos)
1897 if (one_in_(3)) lose_all_info(creature_ptr);
1898 else wiz_dark(creature_ptr);
1899 (void)teleport_player_aux(creature_ptr, 100, FALSE, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE);
1900 wiz_dark(creature_ptr);
1901 msg_print(_("あなたは見知らぬ場所で目が醒めた...頭が痛い。", "You wake up somewhere with a sore head..."));
1902 msg_print(_("何も覚えていない。どうやってここに来たかも分からない!", "You can't remember a thing or how you got here!"));
1908 msg_print(_("き~れいなちょおちょらとんれいる~", "Thishcischs GooDSChtuff!"));
1909 (void)set_image(creature_ptr, creature_ptr->image + randint0(150) + 150);
1915 if ((creature_ptr->muta2 & MUT2_HALLU) && (randint1(6400) == 42))
1917 if (!creature_ptr->resist_chaos)
1919 disturb(creature_ptr, FALSE, TRUE);
1920 creature_ptr->redraw |= PR_EXTRA;
1921 (void)set_image(creature_ptr, creature_ptr->image + randint0(50) + 20);
1925 if ((creature_ptr->muta2 & MUT2_FLATULENT) && (randint1(3000) == 13))
1927 disturb(creature_ptr, FALSE, TRUE);
1928 msg_print(_("ブゥーーッ!おっと。", "BRRAAAP! Oops."));
1930 fire_ball(creature_ptr, GF_POIS, 0, creature_ptr->lev, 3);
1933 if ((creature_ptr->muta2 & MUT2_PROD_MANA) &&
1934 !creature_ptr->anti_magic && one_in_(9000))
1937 disturb(creature_ptr, FALSE, TRUE);
1938 msg_print(_("魔法のエネルギーが突然あなたの中に流れ込んできた!エネルギーを解放しなければならない!",
1939 "Magical energy flows through you! You must release it!"));
1943 (void)get_hack_dir(creature_ptr, &dire);
1944 fire_ball(creature_ptr, GF_MANA, dire, creature_ptr->lev * 2, 3);
1947 if ((creature_ptr->muta2 & MUT2_ATT_DEMON) && !creature_ptr->anti_magic && (randint1(6666) == 666))
1949 bool pet = one_in_(6);
1950 BIT_FLAGS mode = PM_ALLOW_GROUP;
1952 if (pet) mode |= PM_FORCE_PET;
1953 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
1955 if (summon_specific(creature_ptr, (pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DEMON, mode))
1957 msg_print(_("あなたはデーモンを引き寄せた!", "You have attracted a demon!"));
1958 disturb(creature_ptr, FALSE, TRUE);
1962 if ((creature_ptr->muta2 & MUT2_SPEED_FLUX) && one_in_(6000))
1964 disturb(creature_ptr, FALSE, TRUE);
1967 msg_print(_("精力的でなくなった気がする。", "You feel less energetic."));
1969 if (creature_ptr->fast > 0)
1971 set_fast(creature_ptr, 0, TRUE);
1975 set_slow(creature_ptr, randint1(30) + 10, FALSE);
1980 msg_print(_("精力的になった気がする。", "You feel more energetic."));
1982 if (creature_ptr->slow > 0)
1984 set_slow(creature_ptr, 0, TRUE);
1988 set_fast(creature_ptr, randint1(30) + 10, FALSE);
1993 if ((creature_ptr->muta2 & MUT2_BANISH_ALL) && one_in_(9000))
1995 disturb(creature_ptr, FALSE, TRUE);
1996 msg_print(_("突然ほとんど孤独になった気がする。", "You suddenly feel almost lonely."));
1998 banish_monsters(creature_ptr, 100);
1999 if (!creature_ptr->current_floor_ptr->dun_level && creature_ptr->town_num)
2004 n = randint0(MAX_STORES);
2005 } while ((n == STORE_HOME) || (n == STORE_MUSEUM));
2007 msg_print(_("店の主人が丘に向かって走っている!", "You see one of the shopkeepers running for the hills!"));
2008 store_shuffle(creature_ptr, n);
2013 if ((creature_ptr->muta2 & MUT2_EAT_LIGHT) && one_in_(3000))
2017 msg_print(_("影につつまれた。", "A shadow passes over you."));
2020 if ((creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
2022 hp_player(creature_ptr, 10);
2025 o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
2027 if (o_ptr->tval == TV_LITE)
2029 if (!object_is_fixed_artifact(o_ptr) && (o_ptr->xtra4 > 0))
2031 hp_player(creature_ptr, o_ptr->xtra4 / 20);
2033 msg_print(_("光源からエネルギーを吸収した!", "You absorb energy from your light!"));
2034 notice_lite_change(creature_ptr, o_ptr);
2039 * Unlite the area (radius 10) around player and
2040 * do 50 points damage to every affected monster
2042 unlite_area(creature_ptr, 50, 10);
2045 if ((creature_ptr->muta2 & MUT2_ATT_ANIMAL) && !creature_ptr->anti_magic && one_in_(7000))
2047 bool pet = one_in_(3);
2048 BIT_FLAGS mode = PM_ALLOW_GROUP;
2050 if (pet) mode |= PM_FORCE_PET;
2051 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2053 if (summon_specific(creature_ptr, (pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_ANIMAL, mode))
2055 msg_print(_("動物を引き寄せた!", "You have attracted an animal!"));
2056 disturb(creature_ptr, FALSE, TRUE);
2060 if ((creature_ptr->muta2 & MUT2_RAW_CHAOS) && !creature_ptr->anti_magic && one_in_(8000))
2062 disturb(creature_ptr, FALSE, TRUE);
2063 msg_print(_("周りの空間が歪んでいる気がする!", "You feel the world warping around you!"));
2066 fire_ball(creature_ptr, GF_CHAOS, 0, creature_ptr->lev, 8);
2069 if ((creature_ptr->muta2 & MUT2_NORMALITY) && one_in_(5000))
2071 if (!lose_mutation(creature_ptr, 0))
2072 msg_print(_("奇妙なくらい普通になった気がする。", "You feel oddly normal."));
2075 if ((creature_ptr->muta2 & MUT2_WRAITH) && !creature_ptr->anti_magic && one_in_(3000))
2077 disturb(creature_ptr, FALSE, TRUE);
2078 msg_print(_("非物質化した!", "You feel insubstantial!"));
2081 set_wraith_form(creature_ptr, randint1(creature_ptr->lev / 2) + (creature_ptr->lev / 2), FALSE);
2084 if ((creature_ptr->muta2 & MUT2_POLY_WOUND) && one_in_(3000))
2086 do_poly_wounds(creature_ptr);
2089 if ((creature_ptr->muta2 & MUT2_WASTING) && one_in_(3000))
2091 int which_stat = randint0(A_MAX);
2092 int sustained = FALSE;
2097 if (creature_ptr->sustain_str) sustained = TRUE;
2100 if (creature_ptr->sustain_int) sustained = TRUE;
2103 if (creature_ptr->sustain_wis) sustained = TRUE;
2106 if (creature_ptr->sustain_dex) sustained = TRUE;
2109 if (creature_ptr->sustain_con) sustained = TRUE;
2112 if (creature_ptr->sustain_chr) sustained = TRUE;
2115 msg_print(_("不正な状態!", "Invalid stat chosen!"));
2121 disturb(creature_ptr, FALSE, TRUE);
2122 msg_print(_("自分が衰弱していくのが分かる!", "You can feel yourself wasting away!"));
2124 (void)dec_stat(creature_ptr, which_stat, randint1(6) + 6, one_in_(3));
2128 if ((creature_ptr->muta2 & MUT2_ATT_DRAGON) && !creature_ptr->anti_magic && one_in_(3000))
2130 bool pet = one_in_(5);
2131 BIT_FLAGS mode = PM_ALLOW_GROUP;
2133 if (pet) mode |= PM_FORCE_PET;
2134 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2136 if (summon_specific(creature_ptr, (pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DRAGON, mode))
2138 msg_print(_("ドラゴンを引き寄せた!", "You have attracted a dragon!"));
2139 disturb(creature_ptr, FALSE, TRUE);
2143 if ((creature_ptr->muta2 & MUT2_WEIRD_MIND) && !creature_ptr->anti_magic && one_in_(3000))
2145 if (creature_ptr->tim_esp > 0)
2147 msg_print(_("精神にもやがかかった!", "Your mind feels cloudy!"));
2148 set_tim_esp(creature_ptr, 0, TRUE);
2152 msg_print(_("精神が広がった!", "Your mind expands!"));
2153 set_tim_esp(creature_ptr, creature_ptr->lev, FALSE);
2157 if ((creature_ptr->muta2 & MUT2_NAUSEA) && !creature_ptr->slow_digest && one_in_(9000))
2159 disturb(creature_ptr, FALSE, TRUE);
2160 msg_print(_("胃が痙攣し、食事を失った!", "Your stomach roils, and you lose your lunch!"));
2162 set_food(creature_ptr, PY_FOOD_WEAK);
2163 if (music_singing_any(creature_ptr)) stop_singing(creature_ptr);
2164 if (hex_spelling_any(creature_ptr)) stop_hex_spell_all(creature_ptr);
2167 if ((creature_ptr->muta2 & MUT2_WALK_SHAD) && !creature_ptr->anti_magic && one_in_(12000) && !creature_ptr->current_floor_ptr->inside_arena)
2169 reserve_alter_reality(creature_ptr);
2172 if ((creature_ptr->muta2 & MUT2_WARNING) && one_in_(1000))
2174 int danger_amount = 0;
2175 for (MONSTER_IDX monster = 0; monster < creature_ptr->current_floor_ptr->m_max; monster++)
2177 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[monster];
2178 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2179 if (!monster_is_valid(m_ptr)) continue;
2181 if (r_ptr->level >= creature_ptr->lev)
2183 danger_amount += r_ptr->level - creature_ptr->lev + 1;
2187 if (danger_amount > 100)
2188 msg_print(_("非常に恐ろしい気がする!", "You feel utterly terrified!"));
2189 else if (danger_amount > 50)
2190 msg_print(_("恐ろしい気がする!", "You feel terrified!"));
2191 else if (danger_amount > 20)
2192 msg_print(_("非常に心配な気がする!", "You feel very worried!"));
2193 else if (danger_amount > 10)
2194 msg_print(_("心配な気がする!", "You feel paranoid!"));
2195 else if (danger_amount > 5)
2196 msg_print(_("ほとんど安全な気がする。", "You feel almost safe."));
2198 msg_print(_("寂しい気がする。", "You feel lonely."));
2201 if ((creature_ptr->muta2 & MUT2_INVULN) && !creature_ptr->anti_magic && one_in_(5000))
2203 disturb(creature_ptr, FALSE, TRUE);
2204 msg_print(_("無敵な気がする!", "You feel invincible!"));
2206 (void)set_invuln(creature_ptr, randint1(8) + 8, FALSE);
2209 if ((creature_ptr->muta2 & MUT2_SP_TO_HP) && one_in_(2000))
2211 MANA_POINT wounds = (MANA_POINT)(creature_ptr->mhp - creature_ptr->chp);
2215 HIT_POINT healing = creature_ptr->csp;
2216 if (healing > wounds) healing = wounds;
2218 hp_player(creature_ptr, healing);
2219 creature_ptr->csp -= healing;
2220 creature_ptr->redraw |= (PR_HP | PR_MANA);
2224 if ((creature_ptr->muta2 & MUT2_HP_TO_SP) && !creature_ptr->anti_magic && one_in_(4000))
2226 HIT_POINT wounds = (HIT_POINT)(creature_ptr->msp - creature_ptr->csp);
2230 HIT_POINT healing = creature_ptr->chp;
2231 if (healing > wounds) healing = wounds;
2233 creature_ptr->csp += healing;
2234 creature_ptr->redraw |= (PR_HP | PR_MANA);
2235 take_hit(creature_ptr, DAMAGE_LOSELIFE, healing, _("頭に昇った血", "blood rushing to the head"), -1);
2239 if ((creature_ptr->muta2 & MUT2_DISARM) && one_in_(10000))
2241 disturb(creature_ptr, FALSE, TRUE);
2242 msg_print(_("足がもつれて転んだ!", "You trip over your own feet!"));
2243 take_hit(creature_ptr, DAMAGE_NOESCAPE, randint1(creature_ptr->wt / 6), _("転倒", "tripping"), -1);
2244 drop_weapons(creature_ptr);
2250 * @brief 10ゲームターンが進行するごとに装備効果の発動判定を行う処理
2251 * / Handle curse effects once every 10 game turns
2254 static void process_world_aux_curse(player_type *creature_ptr)
2256 if ((creature_ptr->cursed & TRC_P_FLAG_MASK) && !creature_ptr->phase_out && !creature_ptr->wild_mode)
2259 * Hack: Uncursed teleporting items (e.g. Trump Weapons)
2260 * can actually be useful!
2262 if ((creature_ptr->cursed & TRC_TELEPORT_SELF) && one_in_(200))
2264 GAME_TEXT o_name[MAX_NLEN];
2266 int i_keep = 0, count = 0;
2267 for (int i = INVEN_RARM; i < INVEN_TOTAL; i++)
2269 BIT_FLAGS flgs[TR_FLAG_SIZE];
2270 o_ptr = &creature_ptr->inventory_list[i];
2271 if (!o_ptr->k_idx) continue;
2273 object_flags(o_ptr, flgs);
2275 if (have_flag(flgs, TR_TELEPORT))
2277 /* {.} will stop random teleportation. */
2278 if (!o_ptr->inscription || !my_strchr(quark_str(o_ptr->inscription), '.'))
2281 if (one_in_(count)) i_keep = i;
2286 o_ptr = &creature_ptr->inventory_list[i_keep];
2287 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2288 msg_format(_("%sがテレポートの能力を発動させようとしている。", "Your %s is activating teleportation."), o_name);
2289 if (get_check_strict(_("テレポートしますか?", "Teleport? "), CHECK_OKAY_CANCEL))
2291 disturb(creature_ptr, FALSE, TRUE);
2292 teleport_player(creature_ptr, 50, 0L);
2296 msg_format(_("%sに{.}(ピリオド)と銘を刻むと発動を抑制できます。",
2297 "You can inscribe {.} on your %s to disable random teleportation. "), o_name);
2298 disturb(creature_ptr, TRUE, TRUE);
2302 if ((creature_ptr->cursed & TRC_CHAINSWORD) && one_in_(CHAINSWORD_NOISE))
2305 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, noise))
2307 disturb(creature_ptr, FALSE, FALSE);
2310 if ((creature_ptr->cursed & TRC_TY_CURSE) && one_in_(TY_CURSE_CHANCE))
2313 (void)activate_ty_curse(creature_ptr, FALSE, &count);
2316 if (creature_ptr->prace != RACE_ANDROID && ((creature_ptr->cursed & TRC_DRAIN_EXP) && one_in_(4)))
2318 creature_ptr->exp -= (creature_ptr->lev + 1) / 2;
2319 if (creature_ptr->exp < 0) creature_ptr->exp = 0;
2320 creature_ptr->max_exp -= (creature_ptr->lev + 1) / 2;
2321 if (creature_ptr->max_exp < 0) creature_ptr->max_exp = 0;
2322 check_experience(creature_ptr);
2325 if ((creature_ptr->cursed & TRC_ADD_L_CURSE) && one_in_(2000))
2328 o_ptr = choose_cursed_obj_name(creature_ptr, TRC_ADD_L_CURSE);
2329 BIT_FLAGS new_curse = get_curse(0, o_ptr);
2330 if (!(o_ptr->curse_flags & new_curse))
2332 GAME_TEXT o_name[MAX_NLEN];
2333 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2334 o_ptr->curse_flags |= new_curse;
2335 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2336 o_ptr->feeling = FEEL_NONE;
2337 creature_ptr->update |= (PU_BONUS);
2341 if ((creature_ptr->cursed & TRC_ADD_H_CURSE) && one_in_(2000))
2344 o_ptr = choose_cursed_obj_name(creature_ptr, TRC_ADD_H_CURSE);
2345 BIT_FLAGS new_curse = get_curse(1, o_ptr);
2346 if (!(o_ptr->curse_flags & new_curse))
2348 GAME_TEXT o_name[MAX_NLEN];
2350 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2352 o_ptr->curse_flags |= new_curse;
2353 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2354 o_ptr->feeling = FEEL_NONE;
2356 creature_ptr->update |= (PU_BONUS);
2360 if ((creature_ptr->cursed & TRC_CALL_ANIMAL) && one_in_(2500))
2362 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)))
2364 GAME_TEXT o_name[MAX_NLEN];
2365 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_ANIMAL), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2366 msg_format(_("%sが動物を引き寄せた!", "Your %s has attracted an animal!"), o_name);
2367 disturb(creature_ptr, FALSE, TRUE);
2371 if ((creature_ptr->cursed & TRC_CALL_DEMON) && one_in_(1111))
2373 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)))
2375 GAME_TEXT o_name[MAX_NLEN];
2376 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_DEMON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2377 msg_format(_("%sが悪魔を引き寄せた!", "Your %s has attracted a demon!"), o_name);
2378 disturb(creature_ptr, FALSE, TRUE);
2382 if ((creature_ptr->cursed & TRC_CALL_DRAGON) && one_in_(800))
2384 if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DRAGON,
2385 (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2387 GAME_TEXT o_name[MAX_NLEN];
2388 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_DRAGON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2389 msg_format(_("%sがドラゴンを引き寄せた!", "Your %s has attracted an dragon!"), o_name);
2390 disturb(creature_ptr, FALSE, TRUE);
2394 if ((creature_ptr->cursed & TRC_CALL_UNDEAD) && one_in_(1111))
2396 if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_UNDEAD,
2397 (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2399 GAME_TEXT o_name[MAX_NLEN];
2400 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_UNDEAD), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2401 msg_format(_("%sが死霊を引き寄せた!", "Your %s has attracted an undead!"), o_name);
2402 disturb(creature_ptr, FALSE, TRUE);
2406 if ((creature_ptr->cursed & TRC_COWARDICE) && one_in_(1500))
2408 if (!creature_ptr->resist_fear)
2410 disturb(creature_ptr, FALSE, TRUE);
2411 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
2412 set_afraid(creature_ptr, creature_ptr->afraid + 13 + randint1(26));
2416 if ((creature_ptr->cursed & TRC_TELEPORT) && one_in_(200) && !creature_ptr->anti_tele)
2418 disturb(creature_ptr, FALSE, TRUE);
2419 teleport_player(creature_ptr, 40, TELEPORT_PASSIVE);
2422 if ((creature_ptr->cursed & TRC_DRAIN_HP) && one_in_(666))
2424 GAME_TEXT o_name[MAX_NLEN];
2425 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_DRAIN_HP), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2426 msg_format(_("%sはあなたの体力を吸収した!", "Your %s drains HP from you!"), o_name);
2427 take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev * 2, 100), o_name, -1);
2430 if ((creature_ptr->cursed & TRC_DRAIN_MANA) && creature_ptr->csp && one_in_(666))
2432 GAME_TEXT o_name[MAX_NLEN];
2433 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_DRAIN_MANA), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2434 msg_format(_("%sはあなたの魔力を吸収した!", "Your %s drains mana from you!"), o_name);
2435 creature_ptr->csp -= MIN(creature_ptr->lev, 50);
2436 if (creature_ptr->csp < 0)
2438 creature_ptr->csp = 0;
2439 creature_ptr->csp_frac = 0;
2442 creature_ptr->redraw |= PR_MANA;
2446 if (one_in_(999) && !creature_ptr->anti_magic)
2448 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
2449 if (o_ptr->name1 == ART_JUDGE)
2451 if (object_is_known(o_ptr))
2452 msg_print(_("『審判の宝石』はあなたの体力を吸収した!", "The Jewel of Judgement drains life from you!"));
2454 msg_print(_("なにかがあなたの体力を吸収した!", "Something drains life from you!"));
2455 take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev, 50), _("審判の宝石", "the Jewel of Judgement"), -1);
2462 * @brief 10ゲームターンが進行するごとに魔道具の自然充填を行う処理
2463 * / Handle recharging objects once every 10 game turns
2466 static void process_world_aux_recharge(player_type *creature_ptr)
2471 for (changed = FALSE, i = INVEN_RARM; i < INVEN_TOTAL; i++)
2473 object_type *o_ptr = &creature_ptr->inventory_list[i];
2474 if (!o_ptr->k_idx) continue;
2476 if (o_ptr->timeout > 0)
2479 if (!o_ptr->timeout)
2481 recharged_notice(creature_ptr, o_ptr);
2489 creature_ptr->window |= (PW_EQUIP);
2494 * Recharge rods. Rods now use timeout to control charging status,
2495 * and each charging rod in a stack decreases the stack's timeout by
2496 * one per turn. -LM-
2498 for (changed = FALSE, i = 0; i < INVEN_PACK; i++)
2500 object_type *o_ptr = &creature_ptr->inventory_list[i];
2501 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2502 if (!o_ptr->k_idx) continue;
2504 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2506 TIME_EFFECT temp = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval;
2507 if (temp > o_ptr->number) temp = (TIME_EFFECT)o_ptr->number;
2509 o_ptr->timeout -= temp;
2510 if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2512 if (!(o_ptr->timeout))
2514 recharged_notice(creature_ptr, o_ptr);
2517 else if (o_ptr->timeout % k_ptr->pval)
2526 creature_ptr->window |= (PW_INVEN);
2530 for (i = 1; i < creature_ptr->current_floor_ptr->o_max; i++)
2532 object_type *o_ptr = &creature_ptr->current_floor_ptr->o_list[i];
2533 if (!OBJECT_IS_VALID(o_ptr)) continue;
2535 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2537 o_ptr->timeout -= (TIME_EFFECT)o_ptr->number;
2538 if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2545 * @brief 10ゲームターンが進行するごとに帰還や現実変容などの残り時間カウントダウンと発動を処理する。
2546 * / Handle involuntary movement once every 10 game turns
2549 static void process_world_aux_movement(player_type *creature_ptr)
2551 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
2552 if (creature_ptr->word_recall)
2555 * HACK: Autosave BEFORE resetting the recall counter (rr9)
2556 * The player is yanked up/down as soon as
2557 * he loads the autosaved game.
2559 if (autosave_l && (creature_ptr->word_recall == 1) && !creature_ptr->phase_out)
2560 do_cmd_save_game(creature_ptr, TRUE);
2562 creature_ptr->word_recall--;
2563 creature_ptr->redraw |= (PR_STATUS);
2564 if (!creature_ptr->word_recall)
2566 disturb(creature_ptr, FALSE, TRUE);
2567 if (floor_ptr->dun_level || creature_ptr->current_floor_ptr->inside_quest || creature_ptr->enter_dungeon)
2569 msg_print(_("上に引っ張りあげられる感じがする!", "You feel yourself yanked upwards!"));
2570 if (creature_ptr->dungeon_idx) creature_ptr->recall_dungeon = creature_ptr->dungeon_idx;
2572 exe_write_diary(creature_ptr, DIARY_RECALL, floor_ptr->dun_level, NULL);
2574 floor_ptr->dun_level = 0;
2575 creature_ptr->dungeon_idx = 0;
2576 leave_quest_check(creature_ptr);
2577 leave_tower_check(creature_ptr);
2578 creature_ptr->current_floor_ptr->inside_quest = 0;
2579 creature_ptr->leaving = TRUE;
2583 msg_print(_("下に引きずり降ろされる感じがする!", "You feel yourself yanked downwards!"));
2584 creature_ptr->dungeon_idx = creature_ptr->recall_dungeon;
2586 exe_write_diary(creature_ptr, DIARY_RECALL, floor_ptr->dun_level, NULL);
2588 floor_ptr->dun_level = max_dlv[creature_ptr->dungeon_idx];
2589 if (floor_ptr->dun_level < 1) floor_ptr->dun_level = 1;
2590 if (ironman_nightmare && !randint0(666) && (creature_ptr->dungeon_idx == DUNGEON_ANGBAND))
2592 if (floor_ptr->dun_level < 50)
2594 floor_ptr->dun_level *= 2;
2596 else if (floor_ptr->dun_level < 99)
2598 floor_ptr->dun_level = (floor_ptr->dun_level + 99) / 2;
2600 else if (floor_ptr->dun_level > 100)
2602 floor_ptr->dun_level = d_info[creature_ptr->dungeon_idx].maxdepth - 1;
2606 if (creature_ptr->wild_mode)
2608 creature_ptr->wilderness_y = creature_ptr->y;
2609 creature_ptr->wilderness_x = creature_ptr->x;
2613 creature_ptr->oldpx = creature_ptr->x;
2614 creature_ptr->oldpy = creature_ptr->y;
2617 creature_ptr->wild_mode = FALSE;
2620 * Clear all saved floors
2621 * and create a first saved floor
2623 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
2624 creature_ptr->leaving = TRUE;
2626 if (creature_ptr->dungeon_idx == DUNGEON_ANGBAND)
2628 for (int i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++)
2630 quest_type* const q_ptr = &quest[i];
2631 if ((q_ptr->type == QUEST_TYPE_RANDOM) &&
2632 (q_ptr->status == QUEST_STATUS_TAKEN) &&
2633 (q_ptr->level < floor_ptr->dun_level))
2635 q_ptr->status = QUEST_STATUS_FAILED;
2636 q_ptr->complev = (byte)creature_ptr->lev;
2638 q_ptr->comptime = current_world_ptr->play_time;
2639 r_info[q_ptr->r_idx].flags1 &= ~(RF1_QUESTOR);
2645 sound(SOUND_TPLEVEL);
2649 if (creature_ptr->alter_reality)
2651 if (autosave_l && (creature_ptr->alter_reality == 1) && !creature_ptr->phase_out)
2652 do_cmd_save_game(creature_ptr, TRUE);
2654 creature_ptr->alter_reality--;
2655 creature_ptr->redraw |= (PR_STATUS);
2656 if (!creature_ptr->alter_reality)
2658 disturb(creature_ptr, FALSE, TRUE);
2659 if (!quest_number(creature_ptr, floor_ptr->dun_level) && floor_ptr->dun_level)
2661 msg_print(_("世界が変わった!", "The world changes!"));
2664 * Clear all saved floors
2665 * and create a first saved floor
2667 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
2668 creature_ptr->leaving = TRUE;
2672 msg_print(_("世界が少しの間変化したようだ。", "The world seems to change for a moment!"));
2675 sound(SOUND_TPLEVEL);
2682 * @brief 10ゲームターンが進行する毎にゲーム世界全体の処理を行う。
2683 * / Handle certain things once every 10 game turns
2686 static void process_world(player_type *player_ptr)
2688 const s32b A_DAY = TURNS_PER_TICK * TOWN_DAWN;
2689 s32b prev_turn_in_today = ((current_world_ptr->game_turn - TURNS_PER_TICK) % A_DAY + A_DAY / 4) % A_DAY;
2690 int prev_min = (1440 * prev_turn_in_today / A_DAY) % 60;
2693 extract_day_hour_min(player_ptr, &day, &hour, &min);
2694 update_dungeon_feeling(player_ptr);
2696 /* 帰還無しモード時のレベルテレポバグ対策 / Fix for level teleport bugs on ironman_downward.*/
2697 floor_type *floor_ptr = player_ptr->current_floor_ptr;
2698 if (ironman_downward && (player_ptr->dungeon_idx != DUNGEON_ANGBAND && player_ptr->dungeon_idx != 0))
2700 floor_ptr->dun_level = 0;
2701 player_ptr->dungeon_idx = 0;
2702 prepare_change_floor_mode(player_ptr, CFM_FIRST_FLOOR | CFM_RAND_PLACE);
2703 floor_ptr->inside_arena = FALSE;
2704 player_ptr->wild_mode = FALSE;
2705 player_ptr->leaving = TRUE;
2708 if (player_ptr->phase_out && !player_ptr->leaving)
2712 for (int i2 = 0; i2 < floor_ptr->width; ++i2)
2714 for (int j2 = 0; j2 < floor_ptr->height; j2++)
2716 grid_type *g_ptr = &floor_ptr->grid_array[j2][i2];
2717 if ((g_ptr->m_idx > 0) && (g_ptr->m_idx != player_ptr->riding))
2720 win_m_idx = g_ptr->m_idx;
2725 if (number_mon == 0)
2727 msg_print(_("相打ちに終わりました。", "Nothing survived."));
2729 player_ptr->energy_need = 0;
2730 update_gambling_monsters(player_ptr);
2732 else if ((number_mon - 1) == 0)
2734 GAME_TEXT m_name[MAX_NLEN];
2735 monster_type *wm_ptr;
2736 wm_ptr = &floor_ptr->m_list[win_m_idx];
2737 monster_desc(player_ptr, m_name, wm_ptr, 0);
2738 msg_format(_("%sが勝利した!", "%s won!"), m_name);
2741 if (win_m_idx == (sel_monster + 1))
2743 msg_print(_("おめでとうございます。", "Congratulations."));
2744 msg_format(_("%d$を受け取った。", "You received %d gold."), battle_odds);
2745 player_ptr->au += battle_odds;
2749 msg_print(_("残念でした。", "You lost gold."));
2753 player_ptr->energy_need = 0;
2754 update_gambling_monsters(player_ptr);
2756 else if (current_world_ptr->game_turn - floor_ptr->generated_turn == 150 * TURNS_PER_TICK)
2758 msg_print(_("申し分けありませんが、この勝負は引き分けとさせていただきます。", "This battle ended in a draw."));
2759 player_ptr->au += kakekin;
2761 player_ptr->energy_need = 0;
2762 update_gambling_monsters(player_ptr);
2766 if (current_world_ptr->game_turn % TURNS_PER_TICK) return;
2768 if (autosave_t && autosave_freq && !player_ptr->phase_out)
2770 if (!(current_world_ptr->game_turn % ((s32b)autosave_freq * TURNS_PER_TICK)))
2771 do_cmd_save_game(player_ptr, TRUE);
2774 if (floor_ptr->monster_noise && !ignore_unview)
2776 msg_print(_("何かが聞こえた。", "You hear noise."));
2779 if (!floor_ptr->dun_level && !floor_ptr->inside_quest && !player_ptr->phase_out && !floor_ptr->inside_arena)
2781 if (!(current_world_ptr->game_turn % ((TURNS_PER_TICK * TOWN_DAWN) / 2)))
2783 bool dawn = (!(current_world_ptr->game_turn % (TURNS_PER_TICK * TOWN_DAWN)));
2784 if (dawn) day_break(player_ptr);
2785 else night_falls(player_ptr);
2789 else if ((vanilla_town || (lite_town && !floor_ptr->inside_quest && !player_ptr->phase_out && !floor_ptr->inside_arena)) && floor_ptr->dun_level)
2791 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * STORE_TICKS)))
2793 if (one_in_(STORE_SHUFFLE))
2798 n = randint0(MAX_STORES);
2799 } while ((n == STORE_HOME) || (n == STORE_MUSEUM));
2801 for (FEAT_IDX i = 1; i < max_f_idx; i++)
2803 feature_type *f_ptr = &f_info[i];
2804 if (!f_ptr->name) continue;
2805 if (!have_flag(f_ptr->flags, FF_STORE)) continue;
2807 if (f_ptr->subtype == n)
2810 msg_format(_("%sの店主をシャッフルします。", "Shuffle a Shopkeeper of %s."), f_name + f_ptr->name);
2812 store_shuffle(player_ptr, n);
2820 if (one_in_(d_info[player_ptr->dungeon_idx].max_m_alloc_chance) &&
2821 !floor_ptr->inside_arena && !floor_ptr->inside_quest && !player_ptr->phase_out)
2823 (void)alloc_monster(player_ptr, MAX_SIGHT + 5, 0);
2826 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 10)) && !player_ptr->phase_out)
2827 regenerate_monsters(player_ptr);
2828 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 3)))
2829 regenerate_captured_monsters(player_ptr);
2831 if (!player_ptr->leaving)
2833 for (int i = 0; i < MAX_MTIMED; i++)
2835 if (floor_ptr->mproc_max[i] > 0) process_monsters_mtimed(player_ptr, i);
2841 if (min != prev_min)
2843 exe_write_diary(player_ptr, DIARY_DIALY, 0, NULL);
2844 determine_daily_bounty(player_ptr, FALSE);
2849 * Nightmare mode activates the TY_CURSE at midnight
2850 * Require exact minute -- Don't activate multiple times in a minute
2852 if (ironman_nightmare && (min != prev_min))
2854 if ((hour == 23) && !(min % 15))
2856 disturb(player_ptr, FALSE, TRUE);
2860 msg_print(_("遠くで不気味な鐘の音が鳴った。", "You hear a distant bell toll ominously."));
2864 msg_print(_("遠くで鐘が二回鳴った。", "A distant bell sounds twice."));
2868 msg_print(_("遠くで鐘が三回鳴った。", "A distant bell sounds three times."));
2872 msg_print(_("遠くで鐘が四回鳴った。", "A distant bell tolls four times."));
2879 disturb(player_ptr, TRUE, TRUE);
2880 msg_print(_("遠くで鐘が何回も鳴り、死んだような静けさの中へ消えていった。", "A distant bell tolls many times, fading into an deathly silence."));
2881 if (player_ptr->wild_mode)
2883 player_ptr->oldpy = randint1(MAX_HGT - 2);
2884 player_ptr->oldpx = randint1(MAX_WID - 2);
2885 change_wild_mode(player_ptr, TRUE);
2886 take_turn(player_ptr, 100);
2890 player_ptr->invoking_midnight_curse = TRUE;
2894 process_world_aux_digestion(player_ptr);
2895 process_world_aux_hp_and_sp(player_ptr);
2896 process_world_aux_timeout(player_ptr);
2897 process_world_aux_light(player_ptr);
2898 process_world_aux_mutation(player_ptr);
2899 process_world_aux_curse(player_ptr);
2900 process_world_aux_recharge(player_ptr);
2901 sense_inventory1(player_ptr);
2902 sense_inventory2(player_ptr);
2903 process_world_aux_movement(player_ptr);
2908 * @brief ウィザードモードへの導入処理
2909 * / Verify use of "wizard" mode
2910 * @param player_ptr プレーヤーへの参照ポインタ
2911 * @return 実際にウィザードモードへ移行したらTRUEを返す。
2913 static bool enter_wizard_mode(player_type *player_ptr)
2915 if (!current_world_ptr->noscore)
2917 if (!allow_debug_opts || arg_wizard)
2919 msg_print(_("ウィザードモードは許可されていません。 ", "Wizard mode is not permitted."));
2923 msg_print(_("ウィザードモードはデバッグと実験のためのモードです。 ", "Wizard mode is for debugging and experimenting."));
2924 msg_print(_("一度ウィザードモードに入るとスコアは記録されません。", "The game will not be scored if you enter wizard mode."));
2926 if (!get_check(_("本当にウィザードモードに入りたいのですか? ", "Are you sure you want to enter wizard mode? ")))
2931 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, _("ウィザードモードに突入してスコアを残せなくなった。", "gave up recording score to enter wizard mode."));
2932 current_world_ptr->noscore |= 0x0002;
2940 * @brief デバッグコマンドへの導入処理
2941 * / Verify use of "debug" commands
2942 * @param player_ptr プレーヤーへの参照ポインタ
2943 * @return 実際にデバッグコマンドへ移行したらTRUEを返す。
2945 static bool enter_debug_mode(player_type *player_ptr)
2947 if (!current_world_ptr->noscore)
2949 if (!allow_debug_opts)
2951 msg_print(_("デバッグコマンドは許可されていません。 ", "Use of debug command is not permitted."));
2955 msg_print(_("デバッグ・コマンドはデバッグと実験のためのコマンドです。 ", "The debug commands are for debugging and experimenting."));
2956 msg_print(_("デバッグ・コマンドを使うとスコアは記録されません。", "The game will not be scored if you use debug commands."));
2958 if (!get_check(_("本当にデバッグ・コマンドを使いますか? ", "Are you sure you want to use debug commands? ")))
2963 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, _("デバッグモードに突入してスコアを残せなくなった。", "gave up sending score to use debug commands."));
2964 current_world_ptr->noscore |= 0x0008;
2971 * todo これが多重インクルード問題の原因 (の1つ)かもしれない、wizard2.cに同名の関数が存在する
2972 * Hack -- Declare the Debug Routines
2974 extern void do_cmd_debug(player_type *creature_ptr);
2977 * @brief プレイヤーから受けた入力コマンドの分岐処理。
2978 * / Parse and execute the current command Give "Warning" on illegal commands.
2979 * @todo Make some "blocks"
2982 static void process_command(player_type *creature_ptr)
2984 COMMAND_CODE old_now_message = now_message;
2987 if ((creature_ptr->pclass == CLASS_SNIPER) && (creature_ptr->concent))
2988 creature_ptr->reset_concent = TRUE;
2990 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
2991 switch (command_cmd)
3002 /* todo 嘘。returnしていない
3009 if (current_world_ptr->wizard)
3011 current_world_ptr->wizard = FALSE;
3012 msg_print(_("ウィザードモード解除。", "Wizard mode off."));
3014 else if (enter_wizard_mode(creature_ptr))
3016 current_world_ptr->wizard = TRUE;
3017 msg_print(_("ウィザードモード突入。", "Wizard mode on."));
3019 creature_ptr->update |= (PU_MONSTERS);
3020 creature_ptr->redraw |= (PR_TITLE);
3026 if (enter_debug_mode(creature_ptr))
3028 do_cmd_debug(creature_ptr);
3034 if (!creature_ptr->wild_mode) do_cmd_wield(creature_ptr);
3039 if (!creature_ptr->wild_mode) do_cmd_takeoff(creature_ptr);
3044 if (!creature_ptr->wild_mode) do_cmd_drop(creature_ptr);
3049 do_cmd_destroy(creature_ptr);
3054 do_cmd_equip(creature_ptr);
3059 do_cmd_inven(creature_ptr);
3064 do_cmd_observe(creature_ptr);
3070 toggle_inventory_equipment(creature_ptr);
3075 if (!creature_ptr->wild_mode) do_cmd_alter(creature_ptr);
3080 if (!creature_ptr->wild_mode) do_cmd_tunnel(creature_ptr);
3085 do_cmd_walk(creature_ptr, FALSE);
3090 do_cmd_walk(creature_ptr, TRUE);
3095 if (!creature_ptr->wild_mode) do_cmd_run(creature_ptr);
3100 do_cmd_stay(creature_ptr, always_pickup);
3105 do_cmd_stay(creature_ptr, !always_pickup);
3110 do_cmd_rest(creature_ptr);
3115 do_cmd_search(creature_ptr);
3120 if (creature_ptr->action == ACTION_SEARCH) set_action(creature_ptr, ACTION_NONE);
3121 else set_action(creature_ptr, ACTION_SEARCH);
3124 case SPECIAL_KEY_STORE:
3126 do_cmd_store(creature_ptr);
3129 case SPECIAL_KEY_BUILDING:
3131 do_cmd_bldg(creature_ptr);
3134 case SPECIAL_KEY_QUEST:
3136 do_cmd_quest(creature_ptr);
3141 if (!creature_ptr->wild_mode && !floor_ptr->dun_level && !floor_ptr->inside_arena && !floor_ptr->inside_quest)
3143 if (vanilla_town) break;
3145 if (creature_ptr->ambush_flag)
3147 msg_print(_("襲撃から逃げるにはマップの端まで移動しなければならない。", "To flee the ambush you have to reach the edge of the map."));
3151 if (creature_ptr->food < PY_FOOD_WEAK)
3153 msg_print(_("その前に食事をとらないと。", "You must eat something here."));
3157 change_wild_mode(creature_ptr, FALSE);
3160 do_cmd_go_up(creature_ptr);
3166 if (creature_ptr->wild_mode)
3167 change_wild_mode(creature_ptr, FALSE);
3169 do_cmd_go_down(creature_ptr);
3174 do_cmd_open(creature_ptr);
3179 do_cmd_close(creature_ptr);
3184 do_cmd_spike(creature_ptr);
3189 do_cmd_bash(creature_ptr);
3194 do_cmd_disarm(creature_ptr);
3199 if ((creature_ptr->pclass == CLASS_SORCERER) || (creature_ptr->pclass == CLASS_RED_MAGE))
3200 msg_print(_("呪文を学習する必要はない!", "You don't have to learn spells!"));
3201 else if (creature_ptr->pclass == CLASS_SAMURAI)
3202 do_cmd_gain_hissatsu(creature_ptr);
3203 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3204 import_magic_device(creature_ptr);
3206 do_cmd_study(creature_ptr);
3211 if ((creature_ptr->pclass == CLASS_MINDCRAFTER) ||
3212 (creature_ptr->pclass == CLASS_BERSERKER) ||
3213 (creature_ptr->pclass == CLASS_NINJA) ||
3214 (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3215 ) do_cmd_mind_browse(creature_ptr);
3216 else if (creature_ptr->pclass == CLASS_SMITH)
3217 do_cmd_kaji(creature_ptr, TRUE);
3218 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3219 do_cmd_magic_eater(creature_ptr, TRUE, FALSE);
3220 else if (creature_ptr->pclass == CLASS_SNIPER)
3221 do_cmd_snipe_browse(creature_ptr);
3222 else do_cmd_browse(creature_ptr);
3227 if (!creature_ptr->wild_mode)
3229 if ((creature_ptr->pclass == CLASS_WARRIOR) || (creature_ptr->pclass == CLASS_ARCHER) || (creature_ptr->pclass == CLASS_CAVALRY))
3231 msg_print(_("呪文を唱えられない!", "You cannot cast spells!"));
3233 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))
3235 msg_print(_("ダンジョンが魔法を吸収した!", "The dungeon absorbs all attempted magic!"));
3238 else if (creature_ptr->anti_magic && (creature_ptr->pclass != CLASS_BERSERKER) && (creature_ptr->pclass != CLASS_SMITH))
3240 concptr which_power = _("魔法", "magic");
3241 if (creature_ptr->pclass == CLASS_MINDCRAFTER)
3242 which_power = _("超能力", "psionic powers");
3243 else if (creature_ptr->pclass == CLASS_IMITATOR)
3244 which_power = _("ものまね", "imitation");
3245 else if (creature_ptr->pclass == CLASS_SAMURAI)
3246 which_power = _("必殺剣", "hissatsu");
3247 else if (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3248 which_power = _("鏡魔法", "mirror magic");
3249 else if (creature_ptr->pclass == CLASS_NINJA)
3250 which_power = _("忍術", "ninjutsu");
3251 else if (mp_ptr->spell_book == TV_LIFE_BOOK)
3252 which_power = _("祈り", "prayer");
3254 msg_format(_("反魔法バリアが%sを邪魔した!", "An anti-magic shell disrupts your %s!"), which_power);
3255 free_turn(creature_ptr);
3257 else if (creature_ptr->shero && (creature_ptr->pclass != CLASS_BERSERKER))
3259 msg_format(_("狂戦士化していて頭が回らない!", "You cannot think directly!"));
3260 free_turn(creature_ptr);
3264 if ((creature_ptr->pclass == CLASS_MINDCRAFTER) ||
3265 (creature_ptr->pclass == CLASS_BERSERKER) ||
3266 (creature_ptr->pclass == CLASS_NINJA) ||
3267 (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3269 do_cmd_mind(creature_ptr);
3270 else if (creature_ptr->pclass == CLASS_IMITATOR)
3271 do_cmd_mane(creature_ptr, FALSE);
3272 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3273 do_cmd_magic_eater(creature_ptr, FALSE, FALSE);
3274 else if (creature_ptr->pclass == CLASS_SAMURAI)
3275 do_cmd_hissatsu(creature_ptr);
3276 else if (creature_ptr->pclass == CLASS_BLUE_MAGE)
3277 do_cmd_cast_learned(creature_ptr);
3278 else if (creature_ptr->pclass == CLASS_SMITH)
3279 do_cmd_kaji(creature_ptr, FALSE);
3280 else if (creature_ptr->pclass == CLASS_SNIPER)
3281 do_cmd_snipe(creature_ptr);
3283 do_cmd_cast(creature_ptr);
3291 do_cmd_pet(creature_ptr);
3296 do_cmd_inscribe(creature_ptr);
3301 do_cmd_uninscribe(creature_ptr);
3306 do_cmd_activate(creature_ptr);
3311 do_cmd_eat_food(creature_ptr);
3316 do_cmd_refill(creature_ptr);
3321 do_cmd_fire(creature_ptr, SP_NONE);
3326 do_cmd_throw(creature_ptr, 1, FALSE, -1);
3331 do_cmd_aim_wand(creature_ptr);
3336 if (use_command && rogue_like_commands)
3338 do_cmd_use(creature_ptr);
3342 do_cmd_zap_rod(creature_ptr);
3348 do_cmd_quaff_potion(creature_ptr);
3353 do_cmd_read_scroll(creature_ptr);
3358 if (use_command && !rogue_like_commands)
3359 do_cmd_use(creature_ptr);
3361 do_cmd_use_staff(creature_ptr);
3366 do_cmd_racial_power(creature_ptr);
3371 do_cmd_view_map(creature_ptr);
3376 do_cmd_locate(creature_ptr);
3381 do_cmd_look(creature_ptr);
3386 do_cmd_target(creature_ptr);
3391 do_cmd_help(creature_ptr);
3396 do_cmd_query_symbol(creature_ptr);
3401 do_cmd_player_status(creature_ptr);
3411 do_cmd_pref(creature_ptr);
3416 do_cmd_reload_autopick(creature_ptr);
3421 do_cmd_edit_autopick(creature_ptr);
3426 do_cmd_macros(creature_ptr);
3431 do_cmd_visuals(creature_ptr);
3432 do_cmd_redraw(creature_ptr);
3437 do_cmd_colors(creature_ptr);
3438 do_cmd_redraw(creature_ptr);
3444 (void)combine_and_reorder_home(STORE_HOME);
3445 do_cmd_redraw(creature_ptr);
3460 do_cmd_feeling(creature_ptr);
3465 do_cmd_message_one();
3470 do_cmd_messages(old_now_message);
3475 do_cmd_checkquest(creature_ptr);
3480 now_message = old_now_message;
3481 do_cmd_redraw(creature_ptr);
3486 do_cmd_save_game(creature_ptr, FALSE);
3491 do_cmd_time(creature_ptr);
3495 case SPECIAL_KEY_QUIT:
3497 do_cmd_save_and_exit(creature_ptr);
3502 do_cmd_suicide(creature_ptr);
3507 do_cmd_diary(creature_ptr);
3512 do_cmd_knowledge(creature_ptr);
3517 do_cmd_load_screen();
3522 do_cmd_save_screen(creature_ptr, handle_stuff);
3527 prepare_movie_hooks();
3532 spoil_random_artifact(creature_ptr, "randifact.txt");
3537 if (!creature_ptr->wild_mode) do_cmd_travel(creature_ptr);
3538 if (creature_ptr->special_defense & KATA_MUSOU)
3540 set_action(creature_ptr, ACTION_NONE);
3546 if (flush_failure) flush();
3550 sound(SOUND_ILLEGAL);
3551 if (!get_rnd_line(_("error_j.txt", "error.txt"), 0, error_m))
3556 prt(_(" '?' でヘルプが表示されます。", "Type '?' for help."), 0, 0);
3563 if (!creature_ptr->energy_use && !now_message)
3564 now_message = old_now_message;
3569 * @brief アイテムの所持種類数が超えた場合にアイテムを床に落とす処理 / Hack -- Pack Overflow
3572 static void pack_overflow(player_type *owner_ptr)
3574 if (owner_ptr->inventory_list[INVEN_PACK].k_idx == 0) return;
3576 GAME_TEXT o_name[MAX_NLEN];
3578 update_creature(owner_ptr);
3579 if (!owner_ptr->inventory_list[INVEN_PACK].k_idx) return;
3581 o_ptr = &owner_ptr->inventory_list[INVEN_PACK];
3582 disturb(owner_ptr, FALSE, TRUE);
3583 msg_print(_("ザックからアイテムがあふれた!", "Your pack overflows!"));
3585 object_desc(owner_ptr, o_name, o_ptr, 0);
3586 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(INVEN_PACK));
3587 (void)drop_near(owner_ptr, o_ptr, 0, owner_ptr->y, owner_ptr->x);
3589 vary_item(owner_ptr, INVEN_PACK, -255);
3590 handle_stuff(owner_ptr);
3595 * @brief プレイヤーの行動エネルギーが充填される(=プレイヤーのターンが回る)毎に行われる処理 / process the effects per 100 energy at player speed.
3598 static void process_upkeep_with_speed(player_type *creature_ptr)
3600 if (!load && creature_ptr->enchant_energy_need > 0 && !creature_ptr->leaving)
3602 creature_ptr->enchant_energy_need -= SPEED_TO_ENERGY(creature_ptr->pspeed);
3605 if (creature_ptr->enchant_energy_need > 0) return;
3607 while (creature_ptr->enchant_energy_need <= 0)
3609 if (!load) check_music(creature_ptr);
3610 if (!load) check_hex(creature_ptr);
3611 if (!load) revenge_spell(creature_ptr);
3613 creature_ptr->enchant_energy_need += ENERGY_NEED();
3618 static void process_fishing(player_type *creature_ptr)
3620 Term_xtra(TERM_XTRA_DELAY, 10);
3624 bool success = FALSE;
3625 get_mon_num_prep(creature_ptr, monster_is_fishing_target, NULL);
3626 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);
3628 if (r_idx && one_in_(2))
3631 y = creature_ptr->y + ddy[creature_ptr->fishing_dir];
3632 x = creature_ptr->x + ddx[creature_ptr->fishing_dir];
3633 if (place_monster_aux(creature_ptr, 0, y, x, r_idx, PM_NO_KAGE))
3635 GAME_TEXT m_name[MAX_NLEN];
3636 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);
3637 msg_format(_("%sが釣れた!", "You have a good catch!"), m_name);
3644 msg_print(_("餌だけ食われてしまった!くっそ~!", "Damn! The fish stole your bait!"));
3647 disturb(creature_ptr, FALSE, TRUE);
3653 * @brief プレイヤーの行動処理 / Process the player
3656 * Notice the annoying code to handle "pack overflow", which\n
3657 * must come first just in case somebody manages to corrupt\n
3658 * the savefiles by clever use of menu commands or something.\n
3660 static void process_player(player_type *creature_ptr)
3662 if (creature_ptr->hack_mutation)
3664 msg_print(_("何か変わった気がする!", "You feel different!"));
3666 (void)gain_mutation(creature_ptr, 0);
3667 creature_ptr->hack_mutation = FALSE;
3670 if (creature_ptr->invoking_midnight_curse)
3673 activate_ty_curse(creature_ptr, FALSE, &count);
3674 creature_ptr->invoking_midnight_curse = FALSE;
3677 if (creature_ptr->phase_out)
3679 for (MONSTER_IDX m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
3681 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
3682 if (!monster_is_valid(m_ptr)) continue;
3684 m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
3685 update_monster(creature_ptr, m_idx, FALSE);
3688 print_time(creature_ptr);
3690 else if (!(load && creature_ptr->energy_need <= 0))
3692 creature_ptr->energy_need -= SPEED_TO_ENERGY(creature_ptr->pspeed);
3695 if (creature_ptr->energy_need > 0) return;
3696 if (!command_rep) print_time(creature_ptr);
3698 if (creature_ptr->resting < 0)
3700 if (creature_ptr->resting == COMMAND_ARG_REST_FULL_HEALING)
3702 if ((creature_ptr->chp == creature_ptr->mhp) &&
3703 (creature_ptr->csp >= creature_ptr->msp))
3705 set_action(creature_ptr, ACTION_NONE);
3708 else if (creature_ptr->resting == COMMAND_ARG_REST_UNTIL_DONE)
3710 if ((creature_ptr->chp == creature_ptr->mhp) &&
3711 (creature_ptr->csp >= creature_ptr->msp) &&
3712 !creature_ptr->blind && !creature_ptr->confused &&
3713 !creature_ptr->poisoned && !creature_ptr->afraid &&
3714 !creature_ptr->stun && !creature_ptr->cut &&
3715 !creature_ptr->slow && !creature_ptr->paralyzed &&
3716 !creature_ptr->image && !creature_ptr->word_recall &&
3717 !creature_ptr->alter_reality)
3719 set_action(creature_ptr, ACTION_NONE);
3724 if (creature_ptr->action == ACTION_FISH) process_fishing(creature_ptr);
3728 if (creature_ptr->running || travel.run || command_rep || (creature_ptr->action == ACTION_REST) || (creature_ptr->action == ACTION_FISH))
3734 disturb(creature_ptr, FALSE, TRUE);
3735 msg_print(_("中断しました。", "Canceled."));
3740 if (creature_ptr->riding && !creature_ptr->confused && !creature_ptr->blind)
3742 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
3743 monster_race *r_ptr = &r_info[m_ptr->r_idx];
3744 if (MON_CSLEEP(m_ptr))
3746 GAME_TEXT m_name[MAX_NLEN];
3747 (void)set_monster_csleep(creature_ptr, creature_ptr->riding, 0);
3748 monster_desc(creature_ptr, m_name, m_ptr, 0);
3749 msg_format(_("%^sを起こした。", "You have woken %s up."), m_name);
3752 if (MON_STUNNED(m_ptr))
3754 if (set_monster_stunned(creature_ptr, creature_ptr->riding,
3755 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_STUNNED(m_ptr) - 1)))
3757 GAME_TEXT m_name[MAX_NLEN];
3758 monster_desc(creature_ptr, m_name, m_ptr, 0);
3759 msg_format(_("%^sを朦朧状態から立ち直らせた。", "%^s is no longer stunned."), m_name);
3763 if (MON_CONFUSED(m_ptr))
3765 if (set_monster_confused(creature_ptr, creature_ptr->riding,
3766 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_CONFUSED(m_ptr) - 1)))
3768 GAME_TEXT m_name[MAX_NLEN];
3769 monster_desc(creature_ptr, m_name, m_ptr, 0);
3770 msg_format(_("%^sを混乱状態から立ち直らせた。", "%^s is no longer confused."), m_name);
3774 if (MON_MONFEAR(m_ptr))
3776 if (set_monster_monfear(creature_ptr, creature_ptr->riding,
3777 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_MONFEAR(m_ptr) - 1)))
3779 GAME_TEXT m_name[MAX_NLEN];
3780 monster_desc(creature_ptr, m_name, m_ptr, 0);
3781 msg_format(_("%^sを恐怖から立ち直らせた。", "%^s is no longer afraid."), m_name);
3785 handle_stuff(creature_ptr);
3789 if (creature_ptr->lightspeed)
3791 (void)set_lightspeed(creature_ptr, creature_ptr->lightspeed - 1, TRUE);
3794 if ((creature_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
3796 if (P_PTR_KI < 40) P_PTR_KI = 0;
3797 else P_PTR_KI -= 40;
3798 creature_ptr->update |= (PU_BONUS);
3801 if (creature_ptr->action == ACTION_LEARN)
3804 u32b cost_frac = (creature_ptr->msp + 30L) * 256L;
3805 s64b_LSHIFT(cost, cost_frac, 16);
3806 if (s64b_cmp(creature_ptr->csp, creature_ptr->csp_frac, cost, cost_frac) < 0)
3808 creature_ptr->csp = 0;
3809 creature_ptr->csp_frac = 0;
3810 set_action(creature_ptr, ACTION_NONE);
3814 s64b_sub(&(creature_ptr->csp), &(creature_ptr->csp_frac), cost, cost_frac);
3817 creature_ptr->redraw |= PR_MANA;
3820 if (creature_ptr->special_defense & KATA_MASK)
3822 if (creature_ptr->special_defense & KATA_MUSOU)
3824 if (creature_ptr->csp < 3)
3826 set_action(creature_ptr, ACTION_NONE);
3830 creature_ptr->csp -= 2;
3831 creature_ptr->redraw |= (PR_MANA);
3836 /*** Handle actual user input ***/
3837 while (creature_ptr->energy_need <= 0)
3839 creature_ptr->window |= PW_PLAYER;
3840 creature_ptr->sutemi = FALSE;
3841 creature_ptr->counter = FALSE;
3842 creature_ptr->now_damaged = FALSE;
3844 handle_stuff(creature_ptr);
3845 move_cursor_relative(creature_ptr->y, creature_ptr->x);
3846 if (fresh_before) Term_fresh();
3848 pack_overflow(creature_ptr);
3849 if (!command_new) command_see = FALSE;
3851 free_turn(creature_ptr);
3852 if (creature_ptr->phase_out)
3854 move_cursor_relative(creature_ptr->y, creature_ptr->x);
3855 command_cmd = SPECIAL_KEY_BUILDING;
3856 process_command(creature_ptr);
3858 else if (creature_ptr->paralyzed || (creature_ptr->stun >= 100))
3860 take_turn(creature_ptr, 100);
3862 else if (creature_ptr->action == ACTION_REST)
3864 if (creature_ptr->resting > 0)
3866 creature_ptr->resting--;
3867 if (!creature_ptr->resting) set_action(creature_ptr, ACTION_NONE);
3868 creature_ptr->redraw |= (PR_STATE);
3871 take_turn(creature_ptr, 100);
3873 else if (creature_ptr->action == ACTION_FISH)
3875 take_turn(creature_ptr, 100);
3877 else if (creature_ptr->running)
3879 run_step(creature_ptr, 0);
3881 else if (travel.run)
3883 travel_step(creature_ptr);
3885 else if (command_rep)
3888 creature_ptr->redraw |= (PR_STATE);
3889 handle_stuff(creature_ptr);
3892 process_command(creature_ptr);
3896 move_cursor_relative(creature_ptr->y, creature_ptr->x);
3898 request_command(creature_ptr, FALSE);
3900 process_command(creature_ptr);
3903 pack_overflow(creature_ptr);
3904 if (creature_ptr->energy_use)
3906 if (creature_ptr->timewalk || creature_ptr->energy_use > 400)
3908 creature_ptr->energy_need += creature_ptr->energy_use * TURNS_PER_TICK / 10;
3912 creature_ptr->energy_need += (s16b)((s32b)creature_ptr->energy_use * ENERGY_NEED() / 100L);
3915 if (creature_ptr->image) creature_ptr->redraw |= (PR_MAP);
3917 for (MONSTER_IDX m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
3919 monster_type *m_ptr;
3920 monster_race *r_ptr;
3921 m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
3922 if (!monster_is_valid(m_ptr)) continue;
3923 if (!m_ptr->ml) continue;
3925 r_ptr = &r_info[m_ptr->ap_r_idx];
3926 if (!(r_ptr->flags1 & (RF1_ATTR_MULTI | RF1_SHAPECHANGER)))
3929 lite_spot(creature_ptr, m_ptr->fy, m_ptr->fx);
3932 if (repair_monsters)
3934 repair_monsters = FALSE;
3935 for (MONSTER_IDX m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
3937 monster_type *m_ptr;
3938 m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
3939 if (!monster_is_valid(m_ptr)) continue;
3941 if (m_ptr->mflag & MFLAG_NICE)
3943 m_ptr->mflag &= ~(MFLAG_NICE);
3946 if (m_ptr->mflag2 & MFLAG2_MARK)
3948 if (m_ptr->mflag2 & MFLAG2_SHOW)
3950 m_ptr->mflag2 &= ~(MFLAG2_SHOW);
3951 repair_monsters = TRUE;
3955 m_ptr->mflag2 &= ~(MFLAG2_MARK);
3957 update_monster(creature_ptr, m_idx, FALSE);
3958 if (creature_ptr->health_who == m_idx) creature_ptr->redraw |= (PR_HEALTH);
3959 if (creature_ptr->riding == m_idx) creature_ptr->redraw |= (PR_UHEALTH);
3961 lite_spot(creature_ptr, m_ptr->fy, m_ptr->fx);
3967 if (creature_ptr->pclass == CLASS_IMITATOR)
3969 if (creature_ptr->mane_num > (creature_ptr->lev > 44 ? 3 : creature_ptr->lev > 29 ? 2 : 1))
3971 creature_ptr->mane_num--;
3972 for (int j = 0; j < creature_ptr->mane_num; j++)
3974 creature_ptr->mane_spell[j] = creature_ptr->mane_spell[j + 1];
3975 creature_ptr->mane_dam[j] = creature_ptr->mane_dam[j + 1];
3979 creature_ptr->new_mane = FALSE;
3980 creature_ptr->redraw |= (PR_IMITATION);
3983 if (creature_ptr->action == ACTION_LEARN)
3985 creature_ptr->new_mane = FALSE;
3986 creature_ptr->redraw |= (PR_STATE);
3989 if (creature_ptr->timewalk && (creature_ptr->energy_need > -1000))
3992 creature_ptr->redraw |= (PR_MAP);
3993 creature_ptr->update |= (PU_MONSTERS);
3994 creature_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
3996 msg_print(_("「時は動きだす…」", "You feel time flowing around you once more."));
3998 creature_ptr->timewalk = FALSE;
3999 creature_ptr->energy_need = ENERGY_NEED();
4001 handle_stuff(creature_ptr);
4005 if (!creature_ptr->playing || creature_ptr->is_dead)
4007 creature_ptr->timewalk = FALSE;
4011 if (creature_ptr->energy_use && creature_ptr->reset_concent)
4012 reset_concentration(creature_ptr, TRUE);
4014 if (creature_ptr->leaving) break;
4017 update_smell(creature_ptr->current_floor_ptr, creature_ptr);
4022 * @brief 現在プレイヤーがいるダンジョンの全体処理 / Interact with the current dungeon level.
4026 * この関数から現在の階層を出る、プレイヤーがキャラが死ぬ、
4027 * ゲームを終了するかのいずれかまでループする。
4030 * This function will not exit until the level is completed,\n
4031 * the user dies, or the game is terminated.\n
4034 static void dungeon(player_type *player_ptr, bool load_game)
4036 floor_type *floor_ptr = player_ptr->current_floor_ptr;
4037 floor_ptr->base_level = floor_ptr->dun_level;
4038 current_world_ptr->is_loading_now = FALSE;
4039 player_ptr->leaving = FALSE;
4047 player_ptr->pet_t_m_idx = 0;
4048 player_ptr->riding_t_m_idx = 0;
4049 player_ptr->ambush_flag = FALSE;
4050 health_track(player_ptr, 0);
4051 repair_monsters = TRUE;
4052 repair_objects = TRUE;
4054 disturb(player_ptr, TRUE, TRUE);
4055 int quest_num = quest_num = quest_number(player_ptr, floor_ptr->dun_level);
4058 r_info[quest[quest_num].r_idx].flags1 |= RF1_QUESTOR;
4061 if (player_ptr->max_plv < player_ptr->lev)
4063 player_ptr->max_plv = player_ptr->lev;
4066 if ((max_dlv[player_ptr->dungeon_idx] < floor_ptr->dun_level) && !floor_ptr->inside_quest)
4068 max_dlv[player_ptr->dungeon_idx] = floor_ptr->dun_level;
4069 if (record_maxdepth) exe_write_diary(player_ptr, DIARY_MAXDEAPTH, floor_ptr->dun_level, NULL);
4072 (void)calculate_upkeep(player_ptr);
4073 panel_bounds_center();
4074 verify_panel(player_ptr);
4077 current_world_ptr->character_xtra = TRUE;
4078 player_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER | PW_MONSTER | PW_OVERHEAD | PW_DUNGEON);
4079 player_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_EQUIPPY | PR_MAP);
4080 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);
4081 handle_stuff(player_ptr);
4083 current_world_ptr->character_xtra = FALSE;
4084 player_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
4085 player_ptr->update |= (PU_COMBINE | PU_REORDER);
4086 handle_stuff(player_ptr);
4089 if (quest_num && (is_fixed_quest_idx(quest_num) &&
4090 !((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT) ||
4091 !(quest[quest_num].flags & QUEST_FLAG_PRESET))))
4092 do_cmd_feeling(player_ptr);
4094 if (player_ptr->phase_out)
4098 player_ptr->energy_need = 0;
4099 update_gambling_monsters(player_ptr);
4103 msg_print(_("試合開始!", "Ready..Fight!"));
4108 if ((player_ptr->pclass == CLASS_BARD) && (SINGING_SONG_EFFECT(player_ptr) > MUSIC_DETECT))
4109 SINGING_SONG_EFFECT(player_ptr) = MUSIC_DETECT;
4111 if (!player_ptr->playing || player_ptr->is_dead) return;
4113 if (!floor_ptr->inside_quest && (player_ptr->dungeon_idx == DUNGEON_ANGBAND))
4115 quest_discovery(random_quest_number(player_ptr, floor_ptr->dun_level));
4116 floor_ptr->inside_quest = random_quest_number(player_ptr, floor_ptr->dun_level);
4118 if ((floor_ptr->dun_level == d_info[player_ptr->dungeon_idx].maxdepth) && d_info[player_ptr->dungeon_idx].final_guardian)
4120 if (r_info[d_info[player_ptr->dungeon_idx].final_guardian].max_num)
4122 msg_format("この階には%sの主である%sが棲んでいる。",
4123 d_name + d_info[player_ptr->dungeon_idx].name,
4124 r_name + r_info[d_info[player_ptr->dungeon_idx].final_guardian].name);
4126 msg_format("%^s lives in this level as the keeper of %s.",
4127 r_name + r_info[d_info[player_ptr->dungeon_idx].final_guardian].name,
4128 d_name + d_info[player_ptr->dungeon_idx].name);
4132 if (!load_game && (player_ptr->special_defense & NINJA_S_STEALTH)) set_superstealth(player_ptr, FALSE);
4134 floor_ptr->monster_level = floor_ptr->base_level;
4135 floor_ptr->object_level = floor_ptr->base_level;
4136 current_world_ptr->is_loading_now = TRUE;
4137 if (player_ptr->energy_need > 0 && !player_ptr->phase_out &&
4138 (floor_ptr->dun_level || player_ptr->leaving_dungeon || floor_ptr->inside_arena))
4139 player_ptr->energy_need = 0;
4141 player_ptr->leaving_dungeon = FALSE;
4142 mproc_init(floor_ptr);
4146 if ((floor_ptr->m_cnt + 32 > current_world_ptr->max_m_idx) && !player_ptr->phase_out)
4147 compact_monsters(player_ptr, 64);
4149 if ((floor_ptr->m_cnt + 32 < floor_ptr->m_max) && !player_ptr->phase_out)
4150 compact_monsters(player_ptr, 0);
4152 if (floor_ptr->o_cnt + 32 > current_world_ptr->max_o_idx)
4153 compact_objects(player_ptr, 64);
4155 if (floor_ptr->o_cnt + 32 < floor_ptr->o_max)
4156 compact_objects(player_ptr, 0);
4158 process_player(player_ptr);
4159 process_upkeep_with_speed(player_ptr);
4160 handle_stuff(player_ptr);
4162 move_cursor_relative(player_ptr->y, player_ptr->x);
4163 if (fresh_after) Term_fresh();
4165 if (!player_ptr->playing || player_ptr->is_dead) break;
4167 process_monsters(player_ptr);
4168 handle_stuff(player_ptr);
4170 move_cursor_relative(player_ptr->y, player_ptr->x);
4171 if (fresh_after) Term_fresh();
4173 if (!player_ptr->playing || player_ptr->is_dead) break;
4175 process_world(player_ptr);
4176 handle_stuff(player_ptr);
4178 move_cursor_relative(player_ptr->y, player_ptr->x);
4179 if (fresh_after) Term_fresh();
4181 if (!player_ptr->playing || player_ptr->is_dead) break;
4183 current_world_ptr->game_turn++;
4184 if (current_world_ptr->dungeon_turn < current_world_ptr->dungeon_turn_limit)
4186 if (!player_ptr->wild_mode || wild_regen) current_world_ptr->dungeon_turn++;
4187 else if (player_ptr->wild_mode && !(current_world_ptr->game_turn % ((MAX_HGT + MAX_WID) / 2))) current_world_ptr->dungeon_turn++;
4190 prevent_turn_overflow(player_ptr);
4192 if (player_ptr->leaving) break;
4194 if (wild_regen) wild_regen--;
4197 if (quest_num && !(r_info[quest[quest_num].r_idx].flags1 & RF1_UNIQUE))
4199 r_info[quest[quest_num].r_idx].flags1 &= ~RF1_QUESTOR;
4202 if (player_ptr->playing && !player_ptr->is_dead)
4205 * Maintain Unique monsters and artifact, save current
4206 * floor, then prepare next floor
4208 leave_floor(player_ptr);
4209 reinit_wilderness = FALSE;
4217 * @brief 全ユーザプロファイルをロードする / Load some "user pref files"
4218 * @paaram player_ptr プレーヤーへの参照ポインタ
4221 * Modified by Arcum Dagsson to support
4222 * separate macro files for different realms.
4224 static void load_all_pref_files(player_type *player_ptr)
4227 sprintf(buf, "user.prf");
4228 process_pref_file(player_ptr, buf);
4229 sprintf(buf, "user-%s.prf", ANGBAND_SYS);
4230 process_pref_file(player_ptr, buf);
4231 sprintf(buf, "%s.prf", rp_ptr->title);
4232 process_pref_file(player_ptr, buf);
4233 sprintf(buf, "%s.prf", cp_ptr->title);
4234 process_pref_file(player_ptr, buf);
4235 sprintf(buf, "%s.prf", player_ptr->base_name);
4236 process_pref_file(player_ptr, buf);
4237 if (player_ptr->realm1 != REALM_NONE)
4239 sprintf(buf, "%s.prf", realm_names[player_ptr->realm1]);
4240 process_pref_file(player_ptr, buf);
4243 if (player_ptr->realm2 != REALM_NONE)
4245 sprintf(buf, "%s.prf", realm_names[player_ptr->realm2]);
4246 process_pref_file(player_ptr, buf);
4249 autopick_load_pref(player_ptr, FALSE);
4254 * @brief 1ゲームプレイの主要ルーチン / Actually play a game
4257 * If the "new_game" parameter is true, then, after loading the
4258 * savefile, we will commit suicide, if necessary, to allow the
4259 * player to start a new game.
4261 void play_game(player_type *player_ptr, bool new_game)
4263 bool load_game = TRUE;
4264 bool init_random_seed = FALSE;
4274 else if (chuukei_server)
4276 prepare_chuukei_hooks();
4282 reset_visuals(player_ptr);
4287 player_ptr->hack_mutation = FALSE;
4288 current_world_ptr->character_icky = TRUE;
4289 Term_activate(angband_term[0]);
4290 angband_term[0]->resize_hook = resize_map;
4291 for (MONSTER_IDX i = 1; i < 8; i++)
4293 if (angband_term[i])
4295 angband_term[i]->resize_hook = redraw_window;
4299 (void)Term_set_cursor(0);
4300 if (!load_player(player_ptr))
4302 quit(_("セーブファイルが壊れています", "broken savefile"));
4305 extract_option_vars();
4306 if (player_ptr->wait_report_score)
4311 if (!get_check_strict(_("待機していたスコア登録を今行ないますか?", "Do you register score now? "), CHECK_NO_HISTORY))
4314 player_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
4315 update_creature(player_ptr);
4316 player_ptr->is_dead = TRUE;
4317 current_world_ptr->start_time = (u32b)time(NULL);
4318 signals_ignore_tstp();
4319 current_world_ptr->character_icky = TRUE;
4320 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
4321 highscore_fd = fd_open(buf, O_RDWR);
4323 /* 町名消失バグ対策(#38205)のためここで世界マップ情報を読み出す */
4324 process_dungeon_file(player_ptr, "w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
4325 success = send_world_score(player_ptr, TRUE, update_playtime, display_player, map_name);
4327 if (!success && !get_check_strict(_("スコア登録を諦めますか?", "Do you give up score registration? "), CHECK_NO_HISTORY))
4329 prt(_("引き続き待機します。", "standing by for future registration..."), 0, 0);
4334 player_ptr->wait_report_score = FALSE;
4335 top_twenty(player_ptr);
4336 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
4339 (void)fd_close(highscore_fd);
4341 signals_handle_tstp();
4346 current_world_ptr->creating_savefile = new_game;
4348 if (!current_world_ptr->character_loaded)
4351 current_world_ptr->character_dungeon = FALSE;
4352 init_random_seed = TRUE;
4353 init_saved_floors(player_ptr, FALSE);
4357 init_saved_floors(player_ptr, TRUE);
4362 process_player_name(player_ptr, FALSE);
4365 if (init_random_seed)
4370 floor_type *floor_ptr = player_ptr->current_floor_ptr;
4373 current_world_ptr->character_dungeon = FALSE;
4375 floor_ptr->dun_level = 0;
4376 floor_ptr->inside_quest = 0;
4377 floor_ptr->inside_arena = FALSE;
4378 player_ptr->phase_out = FALSE;
4381 current_world_ptr->seed_flavor = randint0(0x10000000);
4382 current_world_ptr->seed_town = randint0(0x10000000);
4384 player_birth(player_ptr);
4385 counts_write(player_ptr, 2, 0);
4386 player_ptr->count = 0;
4388 determine_bounty_uniques(player_ptr);
4389 determine_daily_bounty(player_ptr, FALSE);
4390 wipe_o_list(floor_ptr);
4394 write_level = FALSE;
4395 exe_write_diary(player_ptr, DIARY_GAMESTART, 1,
4397 " --- Restarted Game ---"));
4400 * todo もう2.2.Xなので互換性は打ち切ってもいいのでは?
4401 * 1.0.9 以前はセーブ前に player_ptr->riding = -1 としていたので、再設定が必要だった。
4402 * もう不要だが、以前のセーブファイルとの互換のために残しておく。
4404 if (player_ptr->riding == -1)
4406 player_ptr->riding = 0;
4407 for (MONSTER_IDX i = floor_ptr->m_max; i > 0; i--)
4409 if (player_bold(player_ptr, floor_ptr->m_list[i].fy, floor_ptr->m_list[i].fx))
4411 player_ptr->riding = i;
4418 current_world_ptr->creating_savefile = FALSE;
4420 player_ptr->teleport_town = FALSE;
4421 player_ptr->sutemi = FALSE;
4422 current_world_ptr->timewalk_m_idx = 0;
4423 player_ptr->now_damaged = FALSE;
4425 current_world_ptr->start_time = time(NULL) - 1;
4426 record_o_name[0] = '\0';
4428 panel_row_min = floor_ptr->height;
4429 panel_col_min = floor_ptr->width;
4430 if (player_ptr->pseikaku == SEIKAKU_SEXY)
4431 s_info[player_ptr->pclass].w_max[TV_HAFTED - TV_WEAPON_BEGIN][SV_WHIP] = WEAPON_EXP_MASTER;
4433 set_floor_and_wall(player_ptr->dungeon_idx);
4435 prt(_("お待ち下さい...", "Please wait..."), 0, 0);
4440 if (enter_wizard_mode(player_ptr))
4442 current_world_ptr->wizard = TRUE;
4444 if (player_ptr->is_dead || !player_ptr->y || !player_ptr->x)
4446 init_saved_floors(player_ptr, TRUE);
4447 floor_ptr->inside_quest = 0;
4448 player_ptr->y = player_ptr->x = 10;
4451 else if (player_ptr->is_dead)
4453 quit("Already dead.");
4457 if (!floor_ptr->dun_level && !floor_ptr->inside_quest)
4459 process_dungeon_file(player_ptr, "w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
4460 init_flags = INIT_ONLY_BUILDINGS;
4461 process_dungeon_file(player_ptr, "t_info.txt", 0, 0, MAX_HGT, MAX_WID);
4462 select_floor_music(player_ptr);
4465 if (!current_world_ptr->character_dungeon)
4467 change_floor(player_ptr);
4471 if (player_ptr->panic_save)
4473 if (!player_ptr->y || !player_ptr->x)
4475 msg_print(_("プレイヤーの位置がおかしい。フロアを再生成します。", "What a strange player location, regenerate the dungeon floor."));
4476 change_floor(player_ptr);
4479 if (!player_ptr->y || !player_ptr->x) player_ptr->y = player_ptr->x = 10;
4481 player_ptr->panic_save = 0;
4485 current_world_ptr->character_generated = TRUE;
4486 current_world_ptr->character_icky = FALSE;
4491 sprintf(buf, _("%sに降り立った。", "arrived in %s."), map_name(player_ptr));
4492 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, buf);
4495 player_ptr->playing = TRUE;
4496 reset_visuals(player_ptr);
4497 load_all_pref_files(player_ptr);
4500 player_outfit(player_ptr);
4503 Term_xtra(TERM_XTRA_REACT, 0);
4505 player_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
4506 player_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
4507 handle_stuff(player_ptr);
4509 if (arg_force_original) rogue_like_commands = FALSE;
4510 if (arg_force_roguelike) rogue_like_commands = TRUE;
4512 if (player_ptr->chp < 0) player_ptr->is_dead = TRUE;
4514 if (player_ptr->prace == RACE_ANDROID) calc_android_exp(player_ptr);
4516 if (new_game && ((player_ptr->pclass == CLASS_CAVALRY) || (player_ptr->pclass == CLASS_BEASTMASTER)))
4518 monster_type *m_ptr;
4519 MONRACE_IDX pet_r_idx = ((player_ptr->pclass == CLASS_CAVALRY) ? MON_HORSE : MON_YASE_HORSE);
4520 monster_race *r_ptr = &r_info[pet_r_idx];
4521 place_monster_aux(player_ptr, 0, player_ptr->y, player_ptr->x - 1, pet_r_idx,
4522 (PM_FORCE_PET | PM_NO_KAGE));
4523 m_ptr = &floor_ptr->m_list[hack_m_idx_ii];
4524 m_ptr->mspeed = r_ptr->speed;
4525 m_ptr->maxhp = r_ptr->hdice*(r_ptr->hside + 1) / 2;
4526 m_ptr->max_maxhp = m_ptr->maxhp;
4527 m_ptr->hp = r_ptr->hdice*(r_ptr->hside + 1) / 2;
4528 m_ptr->dealt_damage = 0;
4529 m_ptr->energy_need = ENERGY_NEED() + ENERGY_NEED();
4532 (void)combine_and_reorder_home(STORE_HOME);
4533 (void)combine_and_reorder_home(STORE_MUSEUM);
4534 select_floor_music(player_ptr);
4538 dungeon(player_ptr, load_game);
4539 current_world_ptr->character_xtra = TRUE;
4540 handle_stuff(player_ptr);
4542 current_world_ptr->character_xtra = FALSE;
4544 health_track(player_ptr, 0);
4545 forget_lite(floor_ptr);
4546 forget_view(floor_ptr);
4547 clear_mon_lite(floor_ptr);
4548 if (!player_ptr->playing && !player_ptr->is_dead) break;
4550 wipe_o_list(floor_ptr);
4551 if (!player_ptr->is_dead) wipe_monsters_list(player_ptr);
4555 if (player_ptr->playing && player_ptr->is_dead)
4557 if (floor_ptr->inside_arena)
4559 floor_ptr->inside_arena = FALSE;
4560 if (player_ptr->arena_number > MAX_ARENA_MONS)
4561 player_ptr->arena_number++;
4563 player_ptr->arena_number = -1 - player_ptr->arena_number;
4564 player_ptr->is_dead = FALSE;
4565 player_ptr->chp = 0;
4566 player_ptr->chp_frac = 0;
4567 player_ptr->exit_bldg = TRUE;
4568 reset_tim_flags(player_ptr);
4569 prepare_change_floor_mode(player_ptr, CFM_SAVE_FLOORS | CFM_RAND_CONNECT);
4570 leave_floor(player_ptr);
4574 if ((current_world_ptr->wizard || cheat_live) && !get_check(_("死にますか? ", "Die? ")))
4576 cheat_death(player_ptr);
4581 if (player_ptr->is_dead) break;
4583 change_floor(player_ptr);
4586 close_game(player_ptr);
4592 * @brief ゲームターンからの実時間換算を行うための補正をかける
4593 * @param hoge ゲームターン
4594 * @details アンデッド種族は18:00からゲームを開始するので、この修正を予め行う。
4595 * @return 修正をかけた後のゲームターン
4597 s32b turn_real(player_type *player_ptr, s32b hoge)
4599 switch (player_ptr->start_race)
4605 return hoge - (TURNS_PER_TICK * TOWN_DAWN * 3 / 4);
4613 * @brief ターンのオーバーフローに対する対処
4614 * @param player_ptr プレーヤーへの参照ポインタ
4615 * @details ターン及びターンを記録する変数をターンの限界の1日前まで巻き戻す.
4616 * @return 修正をかけた後のゲームターン
4618 void prevent_turn_overflow(player_type *player_ptr)
4620 if (current_world_ptr->game_turn < current_world_ptr->game_turn_limit) return;
4622 int rollback_days = 1 + (current_world_ptr->game_turn - current_world_ptr->game_turn_limit) / (TURNS_PER_TICK * TOWN_DAWN);
4623 s32b rollback_turns = TURNS_PER_TICK * TOWN_DAWN * rollback_days;
4625 if (current_world_ptr->game_turn > rollback_turns) current_world_ptr->game_turn -= rollback_turns;
4626 else current_world_ptr->game_turn = 1;
4627 floor_type *floor_ptr = player_ptr->current_floor_ptr;
4628 if (floor_ptr->generated_turn > rollback_turns) floor_ptr->generated_turn -= rollback_turns;
4629 else floor_ptr->generated_turn = 1;
4630 if (current_world_ptr->arena_start_turn > rollback_turns) current_world_ptr->arena_start_turn -= rollback_turns;
4631 else current_world_ptr->arena_start_turn = 1;
4632 if (player_ptr->feeling_turn > rollback_turns) player_ptr->feeling_turn -= rollback_turns;
4633 else player_ptr->feeling_turn = 1;
4635 for (int i = 1; i < max_towns; i++)
4637 for (int j = 0; j < MAX_STORES; j++)
4639 store_type *store_ptr = &town_info[i].store[j];
4641 if (store_ptr->last_visit > -10L * TURNS_PER_TICK * STORE_TICKS)
4643 store_ptr->last_visit -= rollback_turns;
4644 if (store_ptr->last_visit < -10L * TURNS_PER_TICK * STORE_TICKS) store_ptr->last_visit = -10L * TURNS_PER_TICK * STORE_TICKS;
4647 if (store_ptr->store_open)
4649 store_ptr->store_open -= rollback_turns;
4650 if (store_ptr->store_open < 1) store_ptr->store_open = 1;
4659 * Close up the current game (player may or may not be dead)
4660 * @param creature_ptr プレーヤーへの参照ポインタ
4664 * This function is called only from "main.c" and "signals.c".
4667 void close_game(player_type *player_ptr)
4670 bool do_send = TRUE;
4671 handle_stuff(player_ptr);
4676 signals_ignore_tstp();
4678 current_world_ptr->character_icky = TRUE;
4679 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
4681 highscore_fd = fd_open(buf, O_RDWR);
4684 if (player_ptr->is_dead)
4686 if (current_world_ptr->total_winner) kingly(player_ptr);
4688 if (!cheat_save || get_check(_("死んだデータをセーブしますか? ", "Save death? ")))
4690 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
4692 else do_send = FALSE;
4694 print_tomb(player_ptr);
4697 show_info(player_ptr, handle_stuff, update_playtime, display_player, map_name);
4700 if (check_score(player_ptr))
4702 if ((!send_world_score(player_ptr, do_send, update_playtime, display_player, map_name)))
4704 if (get_check_strict(_("後でスコアを登録するために待機しますか?", "Stand by for later score registration? "),
4705 (CHECK_NO_ESCAPE | CHECK_NO_HISTORY)))
4707 player_ptr->wait_report_score = TRUE;
4708 player_ptr->is_dead = FALSE;
4709 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
4712 if (!player_ptr->wait_report_score)
4713 (void)top_twenty(player_ptr);
4715 else if (highscore_fd >= 0)
4717 display_scores_aux(0, 10, -1, NULL);
4722 do_cmd_save_game(player_ptr, FALSE);
4723 prt(_("リターンキーか ESC キーを押して下さい。", "Press Return (or Escape)."), 0, 40);
4724 play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_EXIT);
4725 if (inkey() != ESCAPE) predict_score(player_ptr);
4728 (void)fd_close(highscore_fd);
4730 clear_saved_floor_files(player_ptr);
4731 signals_handle_tstp();
4736 * @brief 全更新処理をチェックして処理していく
4737 * Handle "player_ptr->update" and "player_ptr->redraw" and "player_ptr->window"
4740 void handle_stuff(player_type *player_ptr)
4742 if (player_ptr->update) update_creature(player_ptr);
4743 if (player_ptr->redraw) redraw_stuff(player_ptr);
4744 if (player_ptr->window) window_stuff(player_ptr);
4748 void update_output(player_type *player_ptr)
4750 if (player_ptr->redraw) redraw_stuff(player_ptr);
4751 if (player_ptr->window) window_stuff(player_ptr);