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.
22 #include "cmd-activate.h"
25 #include "cmd-hissatsu.h"
27 #include "cmd-magiceat.h"
29 #include "cmd-quaff.h"
31 #include "cmd-smith.h"
32 #include "cmd-usestaff.h"
33 #include "cmd-zaprod.h"
34 #include "cmd-zapwand.h"
36 #include "cmd-basic.h"
42 #include "floor-events.h"
43 #include "floor-town.h"
45 #include "object-curse.h"
46 #include "object-flavor.h"
49 #include "spells-summon.h"
50 #include "spells-object.h"
51 #include "spells-status.h"
52 #include "spells-floor.h"
53 #include "monster-spell.h"
60 #include "player-move.h"
61 #include "player-status.h"
62 #include "player-class.h"
63 #include "player-race.h"
64 #include "cmd-spell.h"
65 #include "realm-hex.h"
66 #include "objectkind.h"
67 #include "object-hook.h"
69 #include "monster-process.h"
70 #include "monster-status.h"
71 #include "monsterrace-hook.h"
72 #include "floor-save.h"
74 #include "player-skill.h"
76 #include "view-mainwindow.h"
77 #include "dungeon-file.h"
79 #include "player-effects.h"
84 #include "targeting.h"
88 * Hack -- Link a copyright message into the executable
90 const concptr copyright[5] =
92 "Copyright (c) 1989 James E. Wilson, Robert A. Keoneke",
94 "This software may be copied and distributed for educational, research,",
95 "and not for profit purposes provided that this copyright and statement",
96 "are included in all such copies."
99 bool can_save = FALSE; /* Game can be saved */
101 COMMAND_CODE now_message;
103 concptr ANGBAND_SYS = "xxx"; //!< Hack -- The special Angband "System Suffix" This variable is used to choose an appropriate "pref-xxx" file
106 concptr ANGBAND_KEYBOARD = "JAPAN"; //!< Hack -- The special Angband "Keyboard Suffix" This variable is used to choose an appropriate macro-trigger definition
108 concptr ANGBAND_KEYBOARD = "0";
111 concptr ANGBAND_GRAF = "ascii"; //!< Hack -- The special Angband "Graphics Suffix" This variable is used to choose an appropriate "graf-xxx" file
113 static bool load = TRUE; /*!<ロード処理中の分岐フラグ*/
114 static int wild_regen = 20; /*!<広域マップ移動時の自然回復処理カウンタ(広域マップ1マス毎に20回処理を基本とする)*/
117 * Flags for initialization
122 * @brief 擬似鑑定を実際に行い判定を反映する
123 * @param slot 擬似鑑定を行うプレイヤーの所持リストID
124 * @param heavy 重度の擬似鑑定を行うならばTRUE
127 static void sense_inventory_aux(INVENTORY_IDX slot, bool heavy)
130 object_type *o_ptr = &p_ptr->inventory_list[slot];
131 GAME_TEXT o_name[MAX_NLEN];
133 /* We know about it already, do not tell us again */
134 if (o_ptr->ident & (IDENT_SENSE))return;
136 /* It is fully known, no information needed */
137 if (object_is_known(o_ptr)) return;
139 /* Check for a feeling */
140 feel = (heavy ? value_check_aux1(o_ptr) : value_check_aux2(o_ptr));
142 /* Skip non-feelings */
146 if ((p_ptr->muta3 & MUT3_BAD_LUCK) && !randint0(13))
157 feel = FEEL_EXCELLENT;
163 feel = randint0(3) ? FEEL_GOOD : FEEL_AVERAGE;
165 feel = FEEL_UNCURSED;
170 feel = randint0(2) ? FEEL_CURSED : FEEL_GOOD;
176 feel = randint0(3) ? FEEL_CURSED : FEEL_AVERAGE;
183 feel = FEEL_WORTHLESS;
188 feel = FEEL_TERRIBLE;
194 /* Stop everything */
195 if (disturb_minor) disturb(FALSE, FALSE);
197 /* Get an object description */
198 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
200 /* Message (equipment) */
201 if (slot >= INVEN_RARM)
204 msg_format("%s%s(%c)は%sという感じがする...",
205 describe_use(slot),o_name, index_to_label(slot),game_inscriptions[feel]);
207 msg_format("You feel the %s (%c) you are %s %s %s...",
208 o_name, index_to_label(slot), describe_use(slot),
209 ((o_ptr->number == 1) ? "is" : "are"),
210 game_inscriptions[feel]);
215 /* Message (p_ptr->inventory_list) */
219 msg_format("ザックの中の%s(%c)は%sという感じがする...",
220 o_name, index_to_label(slot),game_inscriptions[feel]);
222 msg_format("You feel the %s (%c) in your pack %s %s...",
223 o_name, index_to_label(slot),
224 ((o_ptr->number == 1) ? "is" : "are"),
225 game_inscriptions[feel]);
230 o_ptr->ident |= (IDENT_SENSE);
232 /* Set the "inscription" */
233 o_ptr->feeling = feel;
235 /* Auto-inscription/destroy */
236 autopick_alter_item(slot, destroy_feeling);
237 p_ptr->update |= (PU_COMBINE | PU_REORDER);
239 p_ptr->window |= (PW_INVEN | PW_EQUIP);
245 * @brief 1プレイヤーターン毎に武器、防具の擬似鑑定が行われるかを判定する。
248 * Sense the p_ptr->inventory_list\n
250 * Class 0 = Warrior --> fast and heavy\n
251 * Class 1 = Mage --> slow and light\n
252 * Class 2 = Priest --> fast but light\n
253 * Class 3 = Rogue --> okay and heavy\n
254 * Class 4 = Ranger --> slow but heavy (changed!)\n
255 * Class 5 = Paladin --> slow but heavy\n
257 static void sense_inventory1(void)
260 PLAYER_LEVEL plev = p_ptr->lev;
265 /*** Check for "sensing" ***/
267 /* No sensing when confused */
268 if (p_ptr->confused) return;
270 /* Analyze the class */
271 switch (p_ptr->pclass)
279 if (0 != randint0(9000L / (plev * plev + 40))) return;
290 if (0 != randint0(6000L / (plev * plev + 50))) return;
299 case CLASS_HIGH_MAGE:
301 case CLASS_MAGIC_EATER:
303 /* Very bad (light) sensing */
304 if (0 != randint0(240000L / (plev + 5))) return;
312 /* Good (light) sensing */
313 if (0 != randint0(10000L / (plev * plev + 40))) return;
322 if (0 != randint0(20000L / (plev * plev + 40))) return;
333 if (0 != randint0(95000L / (plev * plev + 40))) return;
345 if (0 != randint0(77777L / (plev * plev + 40))) return;
353 case CLASS_WARRIOR_MAGE:
357 if (0 != randint0(75000L / (plev * plev + 40))) return;
362 case CLASS_MINDCRAFTER:
364 case CLASS_BLUE_MAGE:
365 case CLASS_MIRROR_MASTER:
368 if (0 != randint0(55000L / (plev * plev + 40))) return;
373 case CLASS_CHAOS_WARRIOR:
376 if (0 != randint0(80000L / (plev * plev + 40))) return;
385 case CLASS_FORCETRAINER:
388 if (0 != randint0(20000L / (plev * plev + 40))) return;
396 if (0 != randint0(20000L / ((plev+50)*(plev+50)))) return;
404 case CLASS_BEASTMASTER:
407 if (0 != randint0(65000L / (plev * plev + 40))) return;
411 case CLASS_BERSERKER:
420 if (compare_virtue(V_KNOWLEDGE, 100, VIRTUE_LARGE)) heavy = TRUE;
422 /*** Sense everything ***/
424 /* Check everything */
425 for (i = 0; i < INVEN_TOTAL; i++)
429 o_ptr = &p_ptr->inventory_list[i];
431 /* Skip empty slots */
432 if (!o_ptr->k_idx) continue;
434 /* Valid "tval" codes */
461 /* Skip non-sense machines */
464 /* Occasional failure on p_ptr->inventory_list items */
465 if ((i < INVEN_RARM) && (0 != randint0(5))) continue;
468 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && !randint0(13))
473 sense_inventory_aux(i, heavy);
478 * @brief 1プレイヤーターン毎に武器、防具以外の擬似鑑定が行われるかを判定する。
481 static void sense_inventory2(void)
484 PLAYER_LEVEL plev = p_ptr->lev;
488 /*** Check for "sensing" ***/
490 /* No sensing when confused */
491 if (p_ptr->confused) return;
493 /* Analyze the class */
494 switch (p_ptr->pclass)
500 case CLASS_BERSERKER:
508 case CLASS_CHAOS_WARRIOR:
510 case CLASS_BEASTMASTER:
513 /* Very bad (light) sensing */
514 if (0 != randint0(240000L / (plev + 5))) return;
520 case CLASS_WARRIOR_MAGE:
525 if (0 != randint0(95000L / (plev * plev + 40))) return;
533 case CLASS_FORCETRAINER:
534 case CLASS_MINDCRAFTER:
537 if (0 != randint0(20000L / (plev * plev + 40))) return;
543 case CLASS_HIGH_MAGE:
545 case CLASS_MAGIC_EATER:
546 case CLASS_MIRROR_MASTER:
547 case CLASS_BLUE_MAGE:
550 if (0 != randint0(9000L / (plev * plev + 40))) return;
558 if (0 != randint0(20000L / ((plev+50)*(plev+50)))) return;
564 /*** Sense everything ***/
566 /* Check everything */
567 for (i = 0; i < INVEN_TOTAL; i++)
571 o_ptr = &p_ptr->inventory_list[i];
573 /* Skip empty slots */
574 if (!o_ptr->k_idx) continue;
576 /* Valid "tval" codes */
589 /* Skip non-sense machines */
592 /* Occasional failure on p_ptr->inventory_list items */
593 if ((i < INVEN_RARM) && (0 != randint0(5))) continue;
595 sense_inventory_aux(i, TRUE);
600 * @brief パターン終点到達時のテレポート処理を行う
603 static void pattern_teleport(void)
606 DEPTH max_level = 99;
609 if (get_check(_("他の階にテレポートしますか?", "Teleport level? ")))
614 /* Only downward in ironman mode */
615 if (ironman_downward)
616 min_level = current_floor_ptr->dun_level;
619 if (p_ptr->dungeon_idx == DUNGEON_ANGBAND)
621 if (current_floor_ptr->dun_level > 100)
622 max_level = MAX_DEPTH - 1;
623 else if (current_floor_ptr->dun_level == 100)
628 max_level = d_info[p_ptr->dungeon_idx].maxdepth;
629 min_level = d_info[p_ptr->dungeon_idx].mindepth;
633 sprintf(ppp, _("テレポート先:(%d-%d)", "Teleport to level (%d-%d): "), (int)min_level, (int)max_level);
636 sprintf(tmp_val, "%d", (int)current_floor_ptr->dun_level);
638 /* Ask for a level */
639 if (!get_string(ppp, tmp_val, 10)) return;
641 /* Extract request */
642 command_arg = (COMMAND_ARG)atoi(tmp_val);
644 else if (get_check(_("通常テレポート?", "Normal teleport? ")))
646 teleport_player(200, 0L);
653 if (command_arg < min_level) command_arg = (COMMAND_ARG)min_level;
654 if (command_arg > max_level) command_arg = (COMMAND_ARG)max_level;
657 msg_format(_("%d 階にテレポートしました。", "You teleport to dungeon level %d."), command_arg);
659 if (autosave_l) do_cmd_save_game(TRUE);
662 current_floor_ptr->dun_level = command_arg;
666 if (record_stair) do_cmd_write_nikki(NIKKI_PAT_TELE, 0, NULL);
668 p_ptr->inside_quest = 0;
672 * Clear all saved floors
673 * and create a first saved floor
675 prepare_change_floor_mode(CFM_FIRST_FLOOR);
676 p_ptr->leaving = TRUE;
680 * @brief 各種パターン地形上の特別な処理 / Returns TRUE if we are on the Pattern...
681 * @return 実際にパターン地形上にプレイヤーが居た場合はTRUEを返す。
683 static bool pattern_effect(void)
687 if (!pattern_tile(p_ptr->y, p_ptr->x)) return FALSE;
689 if ((prace_is_(RACE_AMBERITE)) &&
690 (p_ptr->cut > 0) && one_in_(10))
695 pattern_type = f_info[current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].feat].subtype;
697 switch (pattern_type)
699 case PATTERN_TILE_END:
701 (void)restore_all_status();
702 (void)restore_level();
703 (void)cure_critical_wounds(1000);
705 cave_set_feat(p_ptr->y, p_ptr->x, feat_pattern_old);
706 msg_print(_("「パターン」のこの部分は他の部分より強力でないようだ。", "This section of the Pattern looks less powerful."));
709 * We could make the healing effect of the
710 * Pattern center one-time only to avoid various kinds
711 * of abuse, like luring the win monster into fighting you
712 * in the middle of the pattern...
716 case PATTERN_TILE_OLD:
720 case PATTERN_TILE_TELEPORT:
724 case PATTERN_TILE_WRECKED:
726 take_hit(DAMAGE_NOESCAPE, 200, _("壊れた「パターン」を歩いたダメージ", "walking the corrupted Pattern"), -1);
730 if (prace_is_(RACE_AMBERITE) && !one_in_(2))
732 else if (!IS_INVULN())
733 take_hit(DAMAGE_NOESCAPE, damroll(1, 3), _("「パターン」を歩いたダメージ", "walking the Pattern"), -1);
742 * @brief プレイヤーのHP自然回復処理 / Regenerate hit points -RAK-
743 * @param percent 回復比率
746 static void regenhp(int percent)
752 if (p_ptr->special_defense & KATA_KOUKIJIN) return;
753 if (p_ptr->action == ACTION_HAYAGAKE) return;
755 /* Save the old hitpoints */
756 old_chp = p_ptr->chp;
759 * Extract the new hitpoints
761 * 'percent' is the Regen factor in unit (1/2^16)
764 new_chp_frac = (p_ptr->mhp * percent + PY_REGEN_HPBASE);
766 /* Convert the unit (1/2^16) to (1/2^32) */
767 s64b_LSHIFT(new_chp, new_chp_frac, 16);
770 s64b_add(&(p_ptr->chp), &(p_ptr->chp_frac), new_chp, new_chp_frac);
774 if (0 < s64b_cmp(p_ptr->chp, p_ptr->chp_frac, p_ptr->mhp, 0))
776 p_ptr->chp = p_ptr->mhp;
781 if (old_chp != p_ptr->chp)
783 p_ptr->redraw |= (PR_HP);
784 p_ptr->window |= (PW_PLAYER);
791 * @brief プレイヤーのMP自然回復処理(regen_magic()のサブセット) / Regenerate mana points
792 * @param upkeep_factor ペット維持によるMPコスト量
793 * @param regen_amount 回復量
796 static void regenmana(MANA_POINT upkeep_factor, MANA_POINT regen_amount)
798 MANA_POINT old_csp = p_ptr->csp;
799 s32b regen_rate = regen_amount * 100 - upkeep_factor * PY_REGEN_NORMAL;
802 * Excess mana will decay 32 times faster than normal
805 if (p_ptr->csp > p_ptr->msp)
807 /* PY_REGEN_NORMAL is the Regen factor in unit (1/2^16) */
809 u32b decay_frac = (p_ptr->msp * 32 * PY_REGEN_NORMAL + PY_REGEN_MNBASE);
811 /* Convert the unit (1/2^16) to (1/2^32) */
812 s64b_LSHIFT(decay, decay_frac, 16);
815 s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), decay, decay_frac);
818 if (p_ptr->csp < p_ptr->msp)
820 p_ptr->csp = p_ptr->msp;
825 /* Regenerating mana (unless the player has excess mana) */
826 else if (regen_rate > 0)
828 /* (percent/100) is the Regen factor in unit (1/2^16) */
829 MANA_POINT new_mana = 0;
830 u32b new_mana_frac = (p_ptr->msp * regen_rate / 100 + PY_REGEN_MNBASE);
832 /* Convert the unit (1/2^16) to (1/2^32) */
833 s64b_LSHIFT(new_mana, new_mana_frac, 16);
836 s64b_add(&(p_ptr->csp), &(p_ptr->csp_frac), new_mana, new_mana_frac);
838 /* Must set frac to zero even if equal */
839 if (p_ptr->csp >= p_ptr->msp)
841 p_ptr->csp = p_ptr->msp;
847 /* Reduce mana (even when the player has excess mana) */
850 /* PY_REGEN_NORMAL is the Regen factor in unit (1/2^16) */
851 s32b reduce_mana = 0;
852 u32b reduce_mana_frac = (p_ptr->msp * (-1) * regen_rate / 100 + PY_REGEN_MNBASE);
854 /* Convert the unit (1/2^16) to (1/2^32) */
855 s64b_LSHIFT(reduce_mana, reduce_mana_frac, 16);
858 s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), reduce_mana, reduce_mana_frac);
868 if (old_csp != p_ptr->csp)
870 p_ptr->redraw |= (PR_MANA);
871 p_ptr->window |= (PW_PLAYER);
872 p_ptr->window |= (PW_SPELL);
878 * @brief プレイヤーのMP自然回復処理 / Regenerate magic regen_amount: PY_REGEN_NORMAL * 2 (if resting) * 2 (if having regenarate)
879 * @param regen_amount 回復量
882 static void regenmagic(int regen_amount)
887 int mult = (dev + adj_mag_mana[p_ptr->stat_ind[A_INT]]); /* x1 to x2 speed bonus for recharging */
889 for (i = 0; i < EATER_EXT*2; i++)
891 if (!p_ptr->magic_num2[i]) continue;
892 if (p_ptr->magic_num1[i] == ((long)p_ptr->magic_num2[i] << 16)) continue;
894 /* Increase remaining charge number like float value */
895 new_mana = (regen_amount * mult * ((long)p_ptr->magic_num2[i] + 13)) / (dev * 8);
896 p_ptr->magic_num1[i] += new_mana;
898 /* Check maximum charge */
899 if (p_ptr->magic_num1[i] > (p_ptr->magic_num2[i] << 16))
901 p_ptr->magic_num1[i] = ((long)p_ptr->magic_num2[i] << 16);
905 for (i = EATER_EXT*2; i < EATER_EXT*3; i++)
907 if (!p_ptr->magic_num1[i]) continue;
908 if (!p_ptr->magic_num2[i]) continue;
910 /* Decrease remaining period for charging */
911 new_mana = (regen_amount * mult * ((long)p_ptr->magic_num2[i] + 10) * EATER_ROD_CHARGE)
912 / (dev * 16 * PY_REGEN_NORMAL);
913 p_ptr->magic_num1[i] -= new_mana;
915 /* Check minimum remaining period for charging */
916 if (p_ptr->magic_num1[i] < 0) p_ptr->magic_num1[i] = 0;
923 * @brief 100ゲームターン毎のモンスターのHP自然回復処理 / Regenerate the monsters (once per 100 game turns)
925 * @note Should probably be done during monster turns.
927 static void regen_monsters(void)
932 /* Regenerate everyone */
933 for (i = 1; i < current_floor_ptr->m_max; i++)
935 /* Check the i'th monster */
936 monster_type *m_ptr = ¤t_floor_ptr->m_list[i];
937 monster_race *r_ptr = &r_info[m_ptr->r_idx];
939 if (!monster_is_valid(m_ptr)) continue;
941 /* Allow regeneration (if needed) */
942 if (m_ptr->hp < m_ptr->maxhp)
944 /* Hack -- Base regeneration */
945 frac = m_ptr->maxhp / 100;
947 /* Hack -- Minimal regeneration rate */
948 if (!frac) if (one_in_(2)) frac = 1;
950 /* Hack -- Some monsters regenerate quickly */
951 if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2;
953 /* Hack -- Regenerate */
956 /* Do not over-regenerate */
957 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
959 /* Redraw (later) if needed */
960 if (p_ptr->health_who == i) p_ptr->redraw |= (PR_HEALTH);
961 if (p_ptr->riding == i) p_ptr->redraw |= (PR_UHEALTH);
968 * @brief 30ゲームターン毎のボール中モンスターのHP自然回復処理 / Regenerate the captured monsters (once per 30 game turns)
970 * @note Should probably be done during monster turns.
972 static void regen_captured_monsters(void)
977 /* Regenerate everyone */
978 for (i = 0; i < INVEN_TOTAL; i++)
981 object_type *o_ptr = &p_ptr->inventory_list[i];
983 if (!o_ptr->k_idx) continue;
984 if (o_ptr->tval != TV_CAPTURE) continue;
985 if (!o_ptr->pval) continue;
989 r_ptr = &r_info[o_ptr->pval];
991 /* Allow regeneration (if needed) */
992 if (o_ptr->xtra4 < o_ptr->xtra5)
994 /* Hack -- Base regeneration */
995 frac = o_ptr->xtra5 / 100;
997 /* Hack -- Minimal regeneration rate */
998 if (!frac) if (one_in_(2)) frac = 1;
1000 /* Hack -- Some monsters regenerate quickly */
1001 if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2;
1003 /* Hack -- Regenerate */
1004 o_ptr->xtra4 += (XTRA16)frac;
1006 /* Do not over-regenerate */
1007 if (o_ptr->xtra4 > o_ptr->xtra5) o_ptr->xtra4 = o_ptr->xtra5;
1014 p_ptr->update |= (PU_COMBINE);
1015 p_ptr->window |= (PW_INVEN);
1016 p_ptr->window |= (PW_EQUIP);
1022 * @brief 寿命つき光源の警告メッセージ処理
1023 * @param o_ptr 現在光源として使っているオブジェクトの構造体参照ポインタ
1026 static void notice_lite_change(object_type *o_ptr)
1028 /* Hack -- notice interesting fuel steps */
1029 if ((o_ptr->xtra4 < 100) || (!(o_ptr->xtra4 % 100)))
1031 p_ptr->window |= (PW_EQUIP);
1034 /* Hack -- Special treatment when blind */
1037 /* Hack -- save some light for later */
1038 if (o_ptr->xtra4 == 0) o_ptr->xtra4++;
1041 /* The light is now out */
1042 else if (o_ptr->xtra4 == 0)
1044 disturb(FALSE, TRUE);
1045 msg_print(_("明かりが消えてしまった!", "Your light has gone out!"));
1047 /* Recalculate torch radius */
1048 p_ptr->update |= (PU_TORCH);
1050 /* Some ego light lose its effects without fuel */
1051 p_ptr->update |= (PU_BONUS);
1054 /* The light is getting dim */
1055 else if (o_ptr->name2 == EGO_LITE_LONG)
1057 if ((o_ptr->xtra4 < 50) && (!(o_ptr->xtra4 % 5))
1058 && (current_world_ptr->game_turn % (TURNS_PER_TICK*2)))
1060 if (disturb_minor) disturb(FALSE, TRUE);
1061 msg_print(_("明かりが微かになってきている。", "Your light is growing faint."));
1065 /* The light is getting dim */
1066 else if ((o_ptr->xtra4 < 100) && (!(o_ptr->xtra4 % 10)))
1068 if (disturb_minor) disturb(FALSE, TRUE);
1069 msg_print(_("明かりが微かになってきている。", "Your light is growing faint."));
1075 * @brief !!を刻んだ魔道具の時間経過による再充填を知らせる処理 / If player has inscribed the object with "!!", let him know when it's recharged. -LM-
1076 * @param o_ptr 対象オブジェクトの構造体参照ポインタ
1079 static void recharged_notice(object_type *o_ptr)
1081 GAME_TEXT o_name[MAX_NLEN];
1085 /* No inscription */
1086 if (!o_ptr->inscription) return;
1089 s = my_strchr(quark_str(o_ptr->inscription), '!');
1091 /* Process notification request. */
1094 /* Find another '!' */
1097 /* Describe (briefly) */
1098 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1100 /* Notify the player */
1102 msg_format("%sは再充填された。", o_name);
1104 if (o_ptr->number > 1)
1105 msg_format("Your %s are recharged.", o_name);
1107 msg_format("Your %s is recharged.", o_name);
1110 disturb(FALSE, FALSE);
1116 /* Keep looking for '!'s */
1117 s = my_strchr(s + 1, '!');
1122 * @brief プレイヤーの歌に関する継続処理
1125 static void check_music(void)
1127 const magic_type *s_ptr;
1129 MANA_POINT need_mana;
1130 u32b need_mana_frac;
1132 /* Music singed by player */
1133 if (p_ptr->pclass != CLASS_BARD) return;
1134 if (!SINGING_SONG_EFFECT(p_ptr) && !INTERUPTING_SONG_EFFECT(p_ptr)) return;
1136 if (p_ptr->anti_magic)
1138 stop_singing(p_ptr);
1142 spell = SINGING_SONG_ID(p_ptr);
1143 s_ptr = &technic_info[REALM_MUSIC - MIN_TECHNIC][spell];
1145 need_mana = mod_need_mana(s_ptr->smana, spell, REALM_MUSIC);
1149 s64b_RSHIFT(need_mana, need_mana_frac, 1);
1151 if (s64b_cmp(p_ptr->csp, p_ptr->csp_frac, need_mana, need_mana_frac) < 0)
1153 stop_singing(p_ptr);
1158 s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), need_mana, need_mana_frac);
1160 p_ptr->redraw |= PR_MANA;
1161 if (INTERUPTING_SONG_EFFECT(p_ptr))
1163 SINGING_SONG_EFFECT(p_ptr) = INTERUPTING_SONG_EFFECT(p_ptr);
1164 INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
1165 msg_print(_("歌を再開した。", "You restart singing."));
1166 p_ptr->action = ACTION_SING;
1167 p_ptr->update |= (PU_BONUS | PU_HP | PU_MONSTERS);
1168 p_ptr->redraw |= (PR_MAP | PR_STATUS | PR_STATE);
1169 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
1172 if (p_ptr->spell_exp[spell] < SPELL_EXP_BEGINNER)
1173 p_ptr->spell_exp[spell] += 5;
1174 else if(p_ptr->spell_exp[spell] < SPELL_EXP_SKILLED)
1175 { if (one_in_(2) && (current_floor_ptr->dun_level > 4) && ((current_floor_ptr->dun_level + 10) > p_ptr->lev)) p_ptr->spell_exp[spell] += 1; }
1176 else if(p_ptr->spell_exp[spell] < SPELL_EXP_EXPERT)
1177 { if (one_in_(5) && ((current_floor_ptr->dun_level + 5) > p_ptr->lev) && ((current_floor_ptr->dun_level + 5) > s_ptr->slevel)) p_ptr->spell_exp[spell] += 1; }
1178 else if(p_ptr->spell_exp[spell] < SPELL_EXP_MASTER)
1179 { if (one_in_(5) && ((current_floor_ptr->dun_level + 5) > p_ptr->lev) && (current_floor_ptr->dun_level > s_ptr->slevel)) p_ptr->spell_exp[spell] += 1; }
1181 /* Do any effects of continual song */
1182 do_spell(REALM_MUSIC, spell, SPELL_CONT);
1186 * @brief 現在呪いを保持している装備品を一つランダムに探し出す / Choose one of items that have cursed flag
1187 * @param flag 探し出したい呪いフラグ配列
1188 * @return 該当の呪いが一つでもあった場合にランダムに選ばれた装備品のオブジェクト構造体参照ポインタを返す。\n
1191 static object_type *choose_cursed_obj_name(BIT_FLAGS flag)
1194 int choices[INVEN_TOTAL-INVEN_RARM];
1197 /* Paranoia -- Player has no warning-item */
1198 if (!(p_ptr->cursed & flag)) return NULL;
1200 /* Search Inventry */
1201 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
1203 object_type *o_ptr = &p_ptr->inventory_list[i];
1205 if (o_ptr->curse_flags & flag)
1207 choices[number] = i;
1210 else if ((flag == TRC_ADD_L_CURSE) ||
1211 (flag == TRC_ADD_H_CURSE) ||
1212 (flag == TRC_DRAIN_HP) ||
1213 (flag == TRC_DRAIN_MANA) ||
1214 (flag == TRC_CALL_ANIMAL) ||
1215 (flag == TRC_CALL_DEMON) ||
1216 (flag == TRC_CALL_DRAGON) ||
1217 (flag == TRC_CALL_UNDEAD) ||
1218 (flag == TRC_COWARDICE) ||
1219 (flag == TRC_LOW_MELEE) ||
1220 (flag == TRC_LOW_AC) ||
1221 (flag == TRC_LOW_MAGIC) ||
1222 (flag == TRC_FAST_DIGEST) ||
1223 (flag == TRC_SLOW_REGEN) )
1226 BIT_FLAGS flgs[TR_FLAG_SIZE];
1227 object_flags(o_ptr, flgs);
1230 case TRC_ADD_L_CURSE : cf = TR_ADD_L_CURSE; break;
1231 case TRC_ADD_H_CURSE : cf = TR_ADD_H_CURSE; break;
1232 case TRC_DRAIN_HP : cf = TR_DRAIN_HP; break;
1233 case TRC_DRAIN_MANA : cf = TR_DRAIN_MANA; break;
1234 case TRC_CALL_ANIMAL : cf = TR_CALL_ANIMAL; break;
1235 case TRC_CALL_DEMON : cf = TR_CALL_DEMON; break;
1236 case TRC_CALL_DRAGON : cf = TR_CALL_DRAGON; break;
1237 case TRC_CALL_UNDEAD : cf = TR_CALL_UNDEAD; break;
1238 case TRC_COWARDICE : cf = TR_COWARDICE; break;
1239 case TRC_LOW_MELEE : cf = TR_LOW_MELEE; break;
1240 case TRC_LOW_AC : cf = TR_LOW_AC; break;
1241 case TRC_LOW_MAGIC : cf = TR_LOW_MAGIC; break;
1242 case TRC_FAST_DIGEST : cf = TR_FAST_DIGEST; break;
1243 case TRC_SLOW_REGEN : cf = TR_SLOW_REGEN; break;
1246 if (have_flag(flgs, cf))
1248 choices[number] = i;
1254 /* Choice one of them */
1255 return (&p_ptr->inventory_list[choices[randint0(number)]]);
1258 static void process_world_aux_digestion(void)
1260 if (!p_ptr->inside_battle)
1262 /* Digest quickly when gorged */
1263 if (p_ptr->food >= PY_FOOD_MAX)
1265 /* Digest a lot of food */
1266 (void)set_food(p_ptr->food - 100);
1269 /* Digest normally -- Every 50 game turns */
1270 else if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 5)))
1272 /* Basic digestion rate based on speed */
1273 int digestion = SPEED_TO_ENERGY(p_ptr->pspeed);
1275 /* Regeneration takes more food */
1276 if (p_ptr->regenerate)
1278 if (p_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1280 if (p_ptr->cursed & TRC_FAST_DIGEST)
1283 /* Slow digestion takes less food */
1284 if (p_ptr->slow_digest)
1287 /* Minimal digestion */
1288 if (digestion < 1) digestion = 1;
1289 /* Maximal digestion */
1290 if (digestion > 100) digestion = 100;
1292 /* Digest some food */
1293 (void)set_food(p_ptr->food - digestion);
1298 if ((p_ptr->food < PY_FOOD_FAINT))
1300 /* Faint occasionally */
1301 if (!p_ptr->paralyzed && (randint0(100) < 10))
1303 msg_print(_("あまりにも空腹で気絶してしまった。", "You faint from the lack of food."));
1304 disturb(TRUE, TRUE);
1306 /* Hack -- faint (bypass free action) */
1307 (void)set_paralyzed(p_ptr->paralyzed + 1 + randint0(5));
1310 /* Starve to death (slowly) */
1311 if (p_ptr->food < PY_FOOD_STARVE)
1313 /* Calculate damage */
1314 HIT_POINT dam = (PY_FOOD_STARVE - p_ptr->food) / 10;
1316 if (!IS_INVULN()) take_hit(DAMAGE_LOSELIFE, dam, _("空腹", "starvation"), -1);
1323 * @brief 10ゲームターンが進行するごとにプレイヤーのHPとMPの増減処理を行う。
1324 * / Handle timed damage and regeneration every 10 game turns
1327 static void process_world_aux_hp_and_sp(void)
1329 feature_type *f_ptr = &f_info[current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].feat];
1330 bool cave_no_regen = FALSE;
1331 int upkeep_factor = 0;
1333 /* Default regeneration */
1334 int regen_amount = PY_REGEN_NORMAL;
1337 /*** Damage over Time ***/
1339 /* Take damage from poison */
1340 if (p_ptr->poisoned && !IS_INVULN())
1342 take_hit(DAMAGE_NOESCAPE, 1, _("毒", "poison"), -1);
1345 /* Take damage from cuts */
1346 if (p_ptr->cut && !IS_INVULN())
1350 /* Mortal wound or Deep Gash */
1351 if (p_ptr->cut > 1000)
1356 else if (p_ptr->cut > 200)
1362 else if (p_ptr->cut > 100)
1367 else if (p_ptr->cut > 50)
1372 else if (p_ptr->cut > 25)
1377 else if (p_ptr->cut > 10)
1388 take_hit(DAMAGE_NOESCAPE, dam, _("致命傷", "a fatal wound"), -1);
1391 /* (Vampires) Take damage from sunlight */
1392 if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE))
1394 if (!current_floor_ptr->dun_level && !p_ptr->resist_lite && !IS_INVULN() && is_daytime())
1396 if ((current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
1398 msg_print(_("日光があなたのアンデッドの肉体を焼き焦がした!", "The sun's rays scorch your undead flesh!"));
1399 take_hit(DAMAGE_NOESCAPE, 1, _("日光", "sunlight"), -1);
1400 cave_no_regen = TRUE;
1404 if (p_ptr->inventory_list[INVEN_LITE].tval && (p_ptr->inventory_list[INVEN_LITE].name2 != EGO_LITE_DARKNESS) &&
1405 !p_ptr->resist_lite)
1407 object_type * o_ptr = &p_ptr->inventory_list[INVEN_LITE];
1408 GAME_TEXT o_name [MAX_NLEN];
1409 char ouch [MAX_NLEN+40];
1411 /* Get an object description */
1412 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1413 msg_format(_("%sがあなたのアンデッドの肉体を焼き焦がした!", "The %s scorches your undead flesh!"), o_name);
1415 cave_no_regen = TRUE;
1417 /* Get an object description */
1418 object_desc(o_name, o_ptr, OD_NAME_ONLY);
1419 sprintf(ouch, _("%sを装備したダメージ", "wielding %s"), o_name);
1421 if (!IS_INVULN()) take_hit(DAMAGE_NOESCAPE, 1, ouch, -1);
1425 if (have_flag(f_ptr->flags, FF_LAVA) && !IS_INVULN() && !p_ptr->immune_fire)
1429 if (have_flag(f_ptr->flags, FF_DEEP))
1431 damage = 6000 + randint0(4000);
1433 else if (!p_ptr->levitation)
1435 damage = 3000 + randint0(2000);
1440 if(prace_is_(RACE_ENT)) damage += damage / 3;
1441 if(p_ptr->resist_fire) damage = damage / 3;
1442 if(IS_OPPOSE_FIRE()) damage = damage / 3;
1443 if(p_ptr->levitation) damage = damage / 5;
1445 damage = damage / 100 + (randint0(100) < (damage % 100));
1447 if (p_ptr->levitation)
1449 msg_print(_("熱で火傷した!", "The heat burns you!"));
1450 take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1451 f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1);
1455 concptr name = f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name;
1456 msg_format(_("%sで火傷した!", "The %s burns you!"), name);
1457 take_hit(DAMAGE_NOESCAPE, damage, name, -1);
1460 cave_no_regen = TRUE;
1464 if (have_flag(f_ptr->flags, FF_COLD_PUDDLE) && !IS_INVULN() && !p_ptr->immune_cold)
1468 if (have_flag(f_ptr->flags, FF_DEEP))
1470 damage = 6000 + randint0(4000);
1472 else if (!p_ptr->levitation)
1474 damage = 3000 + randint0(2000);
1479 if (p_ptr->resist_cold) damage = damage / 3;
1480 if (IS_OPPOSE_COLD()) damage = damage / 3;
1481 if (p_ptr->levitation) damage = damage / 5;
1483 damage = damage / 100 + (randint0(100) < (damage % 100));
1485 if (p_ptr->levitation)
1487 msg_print(_("冷気に覆われた!", "The cold engulfs you!"));
1488 take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1489 f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1);
1493 concptr name = f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name;
1494 msg_format(_("%sに凍えた!", "The %s frostbites you!"), name);
1495 take_hit(DAMAGE_NOESCAPE, damage, name, -1);
1498 cave_no_regen = TRUE;
1502 if (have_flag(f_ptr->flags, FF_ELEC_PUDDLE) && !IS_INVULN() && !p_ptr->immune_elec)
1506 if (have_flag(f_ptr->flags, FF_DEEP))
1508 damage = 6000 + randint0(4000);
1510 else if (!p_ptr->levitation)
1512 damage = 3000 + randint0(2000);
1517 if (p_ptr->resist_elec) damage = damage / 3;
1518 if (IS_OPPOSE_ELEC()) damage = damage / 3;
1519 if (p_ptr->levitation) damage = damage / 5;
1521 damage = damage / 100 + (randint0(100) < (damage % 100));
1523 if (p_ptr->levitation)
1525 msg_print(_("電撃を受けた!", "The electric shocks you!"));
1526 take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1527 f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1);
1531 concptr name = f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name;
1532 msg_format(_("%sに感電した!", "The %s shocks you!"), name);
1533 take_hit(DAMAGE_NOESCAPE, damage, name, -1);
1536 cave_no_regen = TRUE;
1540 if (have_flag(f_ptr->flags, FF_ACID_PUDDLE) && !IS_INVULN() && !p_ptr->immune_acid)
1544 if (have_flag(f_ptr->flags, FF_DEEP))
1546 damage = 6000 + randint0(4000);
1548 else if (!p_ptr->levitation)
1550 damage = 3000 + randint0(2000);
1555 if (p_ptr->resist_acid) damage = damage / 3;
1556 if (IS_OPPOSE_ACID()) damage = damage / 3;
1557 if (p_ptr->levitation) damage = damage / 5;
1559 damage = damage / 100 + (randint0(100) < (damage % 100));
1561 if (p_ptr->levitation)
1563 msg_print(_("酸が飛び散った!", "The acid melt you!"));
1564 take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1565 f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1);
1569 concptr name = f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name;
1570 msg_format(_("%sに溶かされた!", "The %s melts you!"), name);
1571 take_hit(DAMAGE_NOESCAPE, damage, name, -1);
1574 cave_no_regen = TRUE;
1578 if (have_flag(f_ptr->flags, FF_POISON_PUDDLE) && !IS_INVULN())
1582 if (have_flag(f_ptr->flags, FF_DEEP))
1584 damage = 6000 + randint0(4000);
1586 else if (!p_ptr->levitation)
1588 damage = 3000 + randint0(2000);
1593 if (p_ptr->resist_pois) damage = damage / 3;
1594 if (IS_OPPOSE_POIS()) damage = damage / 3;
1595 if (p_ptr->levitation) damage = damage / 5;
1597 damage = damage / 100 + (randint0(100) < (damage % 100));
1599 if (p_ptr->levitation)
1601 msg_print(_("毒気を吸い込んだ!", "The gas poisons you!"));
1602 take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1603 f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1);
1604 if (p_ptr->resist_pois) (void)set_poisoned(p_ptr->poisoned + 1);
1608 concptr name = f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name;
1609 msg_format(_("%sに毒された!", "The %s poisons you!"), name);
1610 take_hit(DAMAGE_NOESCAPE, damage, name, -1);
1611 if (p_ptr->resist_pois) (void)set_poisoned(p_ptr->poisoned + 3);
1614 cave_no_regen = TRUE;
1618 if (have_flag(f_ptr->flags, FF_WATER) && have_flag(f_ptr->flags, FF_DEEP) &&
1619 !p_ptr->levitation && !p_ptr->can_swim && !p_ptr->resist_water)
1621 if (p_ptr->total_weight > weight_limit())
1623 msg_print(_("溺れている!", "You are drowning!"));
1624 take_hit(DAMAGE_NOESCAPE, randint1(p_ptr->lev), _("溺れ", "drowning"), -1);
1625 cave_no_regen = TRUE;
1632 if ((r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].flags2 & RF2_AURA_FIRE) && !p_ptr->immune_fire)
1634 damage = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level / 2;
1635 if (prace_is_(RACE_ENT)) damage += damage / 3;
1636 if (p_ptr->resist_fire) damage = damage / 3;
1637 if (IS_OPPOSE_FIRE()) damage = damage / 3;
1638 msg_print(_("熱い!", "It's hot!"));
1639 take_hit(DAMAGE_NOESCAPE, damage, _("炎のオーラ", "Fire aura"), -1);
1641 if ((r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].flags2 & RF2_AURA_ELEC) && !p_ptr->immune_elec)
1643 damage = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level / 2;
1644 if (prace_is_(RACE_ANDROID)) damage += damage / 3;
1645 if (p_ptr->resist_elec) damage = damage / 3;
1646 if (IS_OPPOSE_ELEC()) damage = damage / 3;
1647 msg_print(_("痛い!", "It hurts!"));
1648 take_hit(DAMAGE_NOESCAPE, damage, _("電気のオーラ", "Elec aura"), -1);
1650 if ((r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].flags3 & RF3_AURA_COLD) && !p_ptr->immune_cold)
1652 damage = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level / 2;
1653 if (p_ptr->resist_cold) damage = damage / 3;
1654 if (IS_OPPOSE_COLD()) damage = damage / 3;
1655 msg_print(_("冷たい!", "It's cold!"));
1656 take_hit(DAMAGE_NOESCAPE, damage, _("冷気のオーラ", "Cold aura"), -1);
1660 /* Spectres -- take damage when moving through walls */
1662 * Added: ANYBODY takes damage if inside through walls
1663 * without wraith form -- NOTE: Spectres will never be
1664 * reduced below 0 hp by being inside a stone wall; others
1667 if (!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY))
1669 if (!IS_INVULN() && !p_ptr->wraith_form && !p_ptr->kabenuke && ((p_ptr->chp > (p_ptr->lev / 5)) || !p_ptr->pass_wall))
1672 cave_no_regen = TRUE;
1674 if (p_ptr->pass_wall)
1676 msg_print(_("体の分子が分解した気がする!", "Your molecules feel disrupted!"));
1677 dam_desc = _("密度", "density");
1681 msg_print(_("崩れた岩に押し潰された!", "You are being crushed!"));
1682 dam_desc = _("硬い岩", "solid rock");
1685 take_hit(DAMAGE_NOESCAPE, 1 + (p_ptr->lev / 5), dam_desc, -1);
1690 /*** handle regeneration ***/
1693 if (p_ptr->food < PY_FOOD_WEAK)
1695 /* Lower regeneration */
1696 if (p_ptr->food < PY_FOOD_STARVE)
1700 else if (p_ptr->food < PY_FOOD_FAINT)
1702 regen_amount = PY_REGEN_FAINT;
1706 regen_amount = PY_REGEN_WEAK;
1710 /* Are we walking the pattern? */
1711 if (pattern_effect())
1713 cave_no_regen = TRUE;
1717 /* Regeneration ability */
1718 if (p_ptr->regenerate)
1720 regen_amount = regen_amount * 2;
1722 if (p_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1726 if (p_ptr->cursed & TRC_SLOW_REGEN)
1733 /* Searching or Resting */
1734 if ((p_ptr->action == ACTION_SEARCH) || (p_ptr->action == ACTION_REST))
1736 regen_amount = regen_amount * 2;
1739 upkeep_factor = calculate_upkeep();
1741 /* No regeneration while special action */
1742 if ((p_ptr->action == ACTION_LEARN) ||
1743 (p_ptr->action == ACTION_HAYAGAKE) ||
1744 (p_ptr->special_defense & KATA_KOUKIJIN))
1746 upkeep_factor += 100;
1749 /* Regenerate the mana */
1750 regenmana(upkeep_factor, regen_amount);
1753 /* Recharge magic eater's power */
1754 if (p_ptr->pclass == CLASS_MAGIC_EATER)
1756 regenmagic(regen_amount);
1759 if ((p_ptr->csp == 0) && (p_ptr->csp_frac == 0))
1761 while (upkeep_factor > 100)
1763 msg_print(_("こんなに多くのペットを制御できない!", "Too many pets to control at once!"));
1765 do_cmd_pet_dismiss();
1767 upkeep_factor = calculate_upkeep();
1769 msg_format(_("維持MPは %d%%", "Upkeep: %d%% mana."), upkeep_factor);
1774 /* Poisoned or cut yields no healing */
1775 if (p_ptr->poisoned) regen_amount = 0;
1776 if (p_ptr->cut) regen_amount = 0;
1778 /* Special floor -- Pattern, in a wall -- yields no healing */
1779 if (cave_no_regen) regen_amount = 0;
1781 regen_amount = (regen_amount * p_ptr->mutant_regenerate_mod) / 100;
1783 /* Regenerate Hit Points if needed */
1784 if ((p_ptr->chp < p_ptr->mhp) && !cave_no_regen)
1786 regenhp(regen_amount);
1791 * @brief 10ゲームターンが進行するごとに魔法効果の残りターンを減らしていく処理
1792 * / Handle timeout every 10 game turns
1795 static void process_world_aux_timeout(void)
1797 const int dec_count = (easy_band ? 2 : 1);
1799 /*** Timeout Various Things ***/
1802 if (p_ptr->tim_mimic)
1804 (void)set_mimic(p_ptr->tim_mimic - 1, p_ptr->mimic_form, TRUE);
1807 /* Hack -- Hallucinating */
1810 (void)set_image(p_ptr->image - dec_count);
1816 (void)set_blind(p_ptr->blind - dec_count);
1819 /* Times see-invisible */
1820 if (p_ptr->tim_invis)
1822 (void)set_tim_invis(p_ptr->tim_invis - 1, TRUE);
1825 if (p_ptr->suppress_multi_reward)
1827 p_ptr->suppress_multi_reward = FALSE;
1833 (void)set_tim_esp(p_ptr->tim_esp - 1, TRUE);
1836 /* Timed temporary elemental brands. -LM- */
1837 if (p_ptr->ele_attack)
1839 p_ptr->ele_attack--;
1841 /* Clear all temporary elemental brands. */
1842 if (!p_ptr->ele_attack) set_ele_attack(0, 0);
1845 /* Timed temporary elemental immune. -LM- */
1846 if (p_ptr->ele_immune)
1848 p_ptr->ele_immune--;
1850 /* Clear all temporary elemental brands. */
1851 if (!p_ptr->ele_immune) set_ele_immune(0, 0);
1854 /* Timed infra-vision */
1855 if (p_ptr->tim_infra)
1857 (void)set_tim_infra(p_ptr->tim_infra - 1, TRUE);
1861 if (p_ptr->tim_stealth)
1863 (void)set_tim_stealth(p_ptr->tim_stealth - 1, TRUE);
1866 /* Timed levitation */
1867 if (p_ptr->tim_levitation)
1869 (void)set_tim_levitation(p_ptr->tim_levitation - 1, TRUE);
1872 /* Timed sh_touki */
1873 if (p_ptr->tim_sh_touki)
1875 (void)set_tim_sh_touki(p_ptr->tim_sh_touki - 1, TRUE);
1879 if (p_ptr->tim_sh_fire)
1881 (void)set_tim_sh_fire(p_ptr->tim_sh_fire - 1, TRUE);
1885 if (p_ptr->tim_sh_holy)
1887 (void)set_tim_sh_holy(p_ptr->tim_sh_holy - 1, TRUE);
1891 if (p_ptr->tim_eyeeye)
1893 (void)set_tim_eyeeye(p_ptr->tim_eyeeye - 1, TRUE);
1896 /* Timed resist-magic */
1897 if (p_ptr->resist_magic)
1899 (void)set_resist_magic(p_ptr->resist_magic - 1, TRUE);
1902 /* Timed regeneration */
1903 if (p_ptr->tim_regen)
1905 (void)set_tim_regen(p_ptr->tim_regen - 1, TRUE);
1908 /* Timed resist nether */
1909 if (p_ptr->tim_res_nether)
1911 (void)set_tim_res_nether(p_ptr->tim_res_nether - 1, TRUE);
1914 /* Timed resist time */
1915 if (p_ptr->tim_res_time)
1917 (void)set_tim_res_time(p_ptr->tim_res_time - 1, TRUE);
1921 if (p_ptr->tim_reflect)
1923 (void)set_tim_reflect(p_ptr->tim_reflect - 1, TRUE);
1927 if (p_ptr->multishadow)
1929 (void)set_multishadow(p_ptr->multishadow - 1, TRUE);
1932 /* Timed Robe of dust */
1933 if (p_ptr->dustrobe)
1935 (void)set_dustrobe(p_ptr->dustrobe - 1, TRUE);
1938 /* Timed infra-vision */
1939 if (p_ptr->kabenuke)
1941 (void)set_kabenuke(p_ptr->kabenuke - 1, TRUE);
1945 if (p_ptr->paralyzed)
1947 (void)set_paralyzed(p_ptr->paralyzed - dec_count);
1951 if (p_ptr->confused)
1953 (void)set_confused(p_ptr->confused - dec_count);
1959 (void)set_afraid(p_ptr->afraid - dec_count);
1965 (void)set_fast(p_ptr->fast - 1, TRUE);
1971 (void)set_slow(p_ptr->slow - dec_count, TRUE);
1974 /* Protection from evil */
1975 if (p_ptr->protevil)
1977 (void)set_protevil(p_ptr->protevil - 1, TRUE);
1980 /* Invulnerability */
1983 (void)set_invuln(p_ptr->invuln - 1, TRUE);
1987 if (p_ptr->wraith_form)
1989 (void)set_wraith_form(p_ptr->wraith_form - 1, TRUE);
1995 (void)set_hero(p_ptr->hero - 1, TRUE);
2001 (void)set_shero(p_ptr->shero - 1, TRUE);
2007 (void)set_blessed(p_ptr->blessed - 1, TRUE);
2013 (void)set_shield(p_ptr->shield - 1, TRUE);
2017 if (p_ptr->tsubureru)
2019 (void)set_tsubureru(p_ptr->tsubureru - 1, TRUE);
2023 if (p_ptr->magicdef)
2025 (void)set_magicdef(p_ptr->magicdef - 1, TRUE);
2029 if (p_ptr->tsuyoshi)
2031 (void)set_tsuyoshi(p_ptr->tsuyoshi - 1, TRUE);
2035 if (p_ptr->oppose_acid)
2037 (void)set_oppose_acid(p_ptr->oppose_acid - 1, TRUE);
2040 /* Oppose Lightning */
2041 if (p_ptr->oppose_elec)
2043 (void)set_oppose_elec(p_ptr->oppose_elec - 1, TRUE);
2047 if (p_ptr->oppose_fire)
2049 (void)set_oppose_fire(p_ptr->oppose_fire - 1, TRUE);
2053 if (p_ptr->oppose_cold)
2055 (void)set_oppose_cold(p_ptr->oppose_cold - 1, TRUE);
2059 if (p_ptr->oppose_pois)
2061 (void)set_oppose_pois(p_ptr->oppose_pois - 1, TRUE);
2066 (void)set_ultimate_res(p_ptr->ult_res - 1, TRUE);
2069 /*** Poison and Stun and Cut ***/
2072 if (p_ptr->poisoned)
2074 int adjust = adj_con_fix[p_ptr->stat_ind[A_CON]] + 1;
2076 /* Apply some healing */
2077 (void)set_poisoned(p_ptr->poisoned - adjust);
2083 int adjust = adj_con_fix[p_ptr->stat_ind[A_CON]] + 1;
2085 /* Apply some healing */
2086 (void)set_stun(p_ptr->stun - adjust);
2092 int adjust = adj_con_fix[p_ptr->stat_ind[A_CON]] + 1;
2094 /* Hack -- Truly "mortal" wound */
2095 if (p_ptr->cut > 1000) adjust = 0;
2097 /* Apply some healing */
2098 (void)set_cut(p_ptr->cut - adjust);
2104 * @brief 10ゲームターンが進行する毎に光源の寿命を減らす処理
2105 * / Handle burning fuel every 10 game turns
2108 static void process_world_aux_light(void)
2110 /* Check for light being wielded */
2111 object_type *o_ptr = &p_ptr->inventory_list[INVEN_LITE];
2113 /* Burn some fuel in the current lite */
2114 if (o_ptr->tval == TV_LITE)
2116 /* Hack -- Use some fuel (except on artifacts) */
2117 if (!(object_is_fixed_artifact(o_ptr) || o_ptr->sval == SV_LITE_FEANOR) && (o_ptr->xtra4 > 0))
2119 /* Decrease life-span */
2120 if (o_ptr->name2 == EGO_LITE_LONG)
2122 if (current_world_ptr->game_turn % (TURNS_PER_TICK*2)) o_ptr->xtra4--;
2124 else o_ptr->xtra4--;
2126 /* Notice interesting fuel steps */
2127 notice_lite_change(o_ptr);
2134 * @brief 10ゲームターンが進行するごとに突然変異の発動判定を行う処理
2135 * / Handle mutation effects once every 10 game turns
2138 static void process_world_aux_mutation(void)
2140 /* No mutation with effects */
2141 if (!p_ptr->muta2) return;
2143 /* No effect on monster arena */
2144 if (p_ptr->inside_battle) return;
2146 /* No effect on the global map */
2147 if (p_ptr->wild_mode) return;
2149 if ((p_ptr->muta2 & MUT2_BERS_RAGE) && one_in_(3000))
2151 disturb(FALSE, TRUE);
2152 msg_print(_("ウガァァア!", "RAAAAGHH!"));
2153 msg_print(_("激怒の発作に襲われた!", "You feel a fit of rage coming over you!"));
2154 (void)set_shero(10 + randint1(p_ptr->lev), FALSE);
2155 (void)set_afraid(0);
2158 if ((p_ptr->muta2 & MUT2_COWARDICE) && (randint1(3000) == 13))
2160 if (!p_ptr->resist_fear)
2162 disturb(FALSE, TRUE);
2163 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
2164 set_afraid(p_ptr->afraid + 13 + randint1(26));
2168 if ((p_ptr->muta2 & MUT2_RTELEPORT) && (randint1(5000) == 88))
2170 if (!p_ptr->resist_nexus && !(p_ptr->muta1 & MUT1_VTELEPORT) && !p_ptr->anti_tele)
2172 disturb(FALSE, TRUE);
2173 msg_print(_("あなたの位置は突然ひじょうに不確定になった...", "Your position suddenly seems very uncertain..."));
2175 teleport_player(40, TELEPORT_PASSIVE);
2179 if ((p_ptr->muta2 & MUT2_ALCOHOL) && (randint1(6400) == 321))
2181 if (!p_ptr->resist_conf && !p_ptr->resist_chaos)
2183 disturb(FALSE, TRUE);
2184 p_ptr->redraw |= PR_EXTRA;
2185 msg_print(_("いひきがもーろーとひてきたきがふる...ヒック!", "You feel a SSSCHtupor cOmINg over yOu... *HIC*!"));
2188 if (!p_ptr->resist_conf)
2190 (void)set_confused(p_ptr->confused + randint0(20) + 15);
2193 if (!p_ptr->resist_chaos)
2198 if (one_in_(3)) lose_all_info();
2200 (void)teleport_player_aux(100, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE);
2202 msg_print(_("あなたは見知らぬ場所で目が醒めた...頭が痛い。", "You wake up somewhere with a sore head..."));
2203 msg_print(_("何も覚えていない。どうやってここに来たかも分からない!", "You can't remember a thing, or how you got here!"));
2209 msg_print(_("き~れいなちょおちょらとんれいる~", "Thishcischs GooDSChtuff!"));
2210 (void)set_image(p_ptr->image + randint0(150) + 150);
2216 if ((p_ptr->muta2 & MUT2_HALLU) && (randint1(6400) == 42))
2218 if (!p_ptr->resist_chaos)
2220 disturb(FALSE, TRUE);
2221 p_ptr->redraw |= PR_EXTRA;
2222 (void)set_image(p_ptr->image + randint0(50) + 20);
2226 if ((p_ptr->muta2 & MUT2_FLATULENT) && (randint1(3000) == 13))
2228 disturb(FALSE, TRUE);
2229 msg_print(_("ブゥーーッ!おっと。", "BRRAAAP! Oops."));
2231 fire_ball(GF_POIS, 0, p_ptr->lev, 3);
2234 if ((p_ptr->muta2 & MUT2_PROD_MANA) &&
2235 !p_ptr->anti_magic && one_in_(9000))
2238 disturb(FALSE, TRUE);
2239 msg_print(_("魔法のエネルギーが突然あなたの中に流れ込んできた!エネルギーを解放しなければならない!",
2240 "Magical energy flows through you! You must release it!"));
2244 (void)get_hack_dir(&dire);
2245 fire_ball(GF_MANA, dire, p_ptr->lev * 2, 3);
2248 if ((p_ptr->muta2 & MUT2_ATT_DEMON) && !p_ptr->anti_magic && (randint1(6666) == 666))
2250 bool pet = one_in_(6);
2251 BIT_FLAGS mode = PM_ALLOW_GROUP;
2253 if (pet) mode |= PM_FORCE_PET;
2254 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2256 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_DEMON, mode))
2258 msg_print(_("あなたはデーモンを引き寄せた!", "You have attracted a demon!"));
2259 disturb(FALSE, TRUE);
2263 if ((p_ptr->muta2 & MUT2_SPEED_FLUX) && one_in_(6000))
2265 disturb(FALSE, TRUE);
2268 msg_print(_("精力的でなくなった気がする。", "You feel less energetic."));
2270 if (p_ptr->fast > 0)
2276 set_slow(randint1(30) + 10, FALSE);
2281 msg_print(_("精力的になった気がする。", "You feel more energetic."));
2283 if (p_ptr->slow > 0)
2289 set_fast(randint1(30) + 10, FALSE);
2294 if ((p_ptr->muta2 & MUT2_BANISH_ALL) && one_in_(9000))
2296 disturb(FALSE, TRUE);
2297 msg_print(_("突然ほとんど孤独になった気がする。", "You suddenly feel almost lonely."));
2299 banish_monsters(100);
2300 if (!current_floor_ptr->dun_level && p_ptr->town_num)
2304 /* Pick a random shop (except home) */
2307 n = randint0(MAX_STORES);
2309 while ((n == STORE_HOME) || (n == STORE_MUSEUM));
2311 msg_print(_("店の主人が丘に向かって走っている!", "You see one of the shopkeepers running for the hills!"));
2317 if ((p_ptr->muta2 & MUT2_EAT_LIGHT) && one_in_(3000))
2321 msg_print(_("影につつまれた。", "A shadow passes over you."));
2324 /* Absorb light from the current possition */
2325 if ((current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
2330 o_ptr = &p_ptr->inventory_list[INVEN_LITE];
2332 /* Absorb some fuel in the current lite */
2333 if (o_ptr->tval == TV_LITE)
2335 /* Use some fuel (except on artifacts) */
2336 if (!object_is_fixed_artifact(o_ptr) && (o_ptr->xtra4 > 0))
2338 /* Heal the player a bit */
2339 hp_player(o_ptr->xtra4 / 20);
2341 /* Decrease life-span of lite */
2343 msg_print(_("光源からエネルギーを吸収した!", "You absorb energy from your light!"));
2345 /* Notice interesting fuel steps */
2346 notice_lite_change(o_ptr);
2351 * Unlite the area (radius 10) around player and
2352 * do 50 points damage to every affected monster
2354 unlite_area(50, 10);
2357 if ((p_ptr->muta2 & MUT2_ATT_ANIMAL) && !p_ptr->anti_magic && one_in_(7000))
2359 bool pet = one_in_(3);
2360 BIT_FLAGS mode = PM_ALLOW_GROUP;
2362 if (pet) mode |= PM_FORCE_PET;
2363 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2365 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_ANIMAL, mode))
2367 msg_print(_("動物を引き寄せた!", "You have attracted an animal!"));
2368 disturb(FALSE, TRUE);
2372 if ((p_ptr->muta2 & MUT2_RAW_CHAOS) && !p_ptr->anti_magic && one_in_(8000))
2374 disturb(FALSE, TRUE);
2375 msg_print(_("周りの空間が歪んでいる気がする!", "You feel the world warping around you!"));
2378 fire_ball(GF_CHAOS, 0, p_ptr->lev, 8);
2380 if ((p_ptr->muta2 & MUT2_NORMALITY) && one_in_(5000))
2382 if (!lose_mutation(0))
2383 msg_print(_("奇妙なくらい普通になった気がする。", "You feel oddly normal."));
2385 if ((p_ptr->muta2 & MUT2_WRAITH) && !p_ptr->anti_magic && one_in_(3000))
2387 disturb(FALSE, TRUE);
2388 msg_print(_("非物質化した!", "You feel insubstantial!"));
2391 set_wraith_form(randint1(p_ptr->lev / 2) + (p_ptr->lev / 2), FALSE);
2393 if ((p_ptr->muta2 & MUT2_POLY_WOUND) && one_in_(3000))
2397 if ((p_ptr->muta2 & MUT2_WASTING) && one_in_(3000))
2399 int which_stat = randint0(A_MAX);
2400 int sustained = FALSE;
2405 if (p_ptr->sustain_str) sustained = TRUE;
2408 if (p_ptr->sustain_int) sustained = TRUE;
2411 if (p_ptr->sustain_wis) sustained = TRUE;
2414 if (p_ptr->sustain_dex) sustained = TRUE;
2417 if (p_ptr->sustain_con) sustained = TRUE;
2420 if (p_ptr->sustain_chr) sustained = TRUE;
2423 msg_print(_("不正な状態!", "Invalid stat chosen!"));
2429 disturb(FALSE, TRUE);
2430 msg_print(_("自分が衰弱していくのが分かる!", "You can feel yourself wasting away!"));
2432 (void)dec_stat(which_stat, randint1(6) + 6, one_in_(3));
2435 if ((p_ptr->muta2 & MUT2_ATT_DRAGON) && !p_ptr->anti_magic && one_in_(3000))
2437 bool pet = one_in_(5);
2438 BIT_FLAGS mode = PM_ALLOW_GROUP;
2440 if (pet) mode |= PM_FORCE_PET;
2441 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2443 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_DRAGON, mode))
2445 msg_print(_("ドラゴンを引き寄せた!", "You have attracted a dragon!"));
2446 disturb(FALSE, TRUE);
2449 if ((p_ptr->muta2 & MUT2_WEIRD_MIND) && !p_ptr->anti_magic && one_in_(3000))
2451 if (p_ptr->tim_esp > 0)
2453 msg_print(_("精神にもやがかかった!", "Your mind feels cloudy!"));
2454 set_tim_esp(0, TRUE);
2458 msg_print(_("精神が広がった!", "Your mind expands!"));
2459 set_tim_esp(p_ptr->lev, FALSE);
2462 if ((p_ptr->muta2 & MUT2_NAUSEA) && !p_ptr->slow_digest && one_in_(9000))
2464 disturb(FALSE, TRUE);
2465 msg_print(_("胃が痙攣し、食事を失った!", "Your stomach roils, and you lose your lunch!"));
2467 set_food(PY_FOOD_WEAK);
2468 if (music_singing_any()) stop_singing(p_ptr);
2469 if (hex_spelling_any()) stop_hex_spell_all();
2472 if ((p_ptr->muta2 & MUT2_WALK_SHAD) && !p_ptr->anti_magic && one_in_(12000) && !p_ptr->inside_arena)
2477 if ((p_ptr->muta2 & MUT2_WARNING) && one_in_(1000))
2479 int danger_amount = 0;
2480 MONSTER_IDX monster;
2482 for (monster = 0; monster < current_floor_ptr->m_max; monster++)
2484 monster_type *m_ptr = ¤t_floor_ptr->m_list[monster];
2485 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2486 if (!monster_is_valid(m_ptr)) continue;
2488 if (r_ptr->level >= p_ptr->lev)
2490 danger_amount += r_ptr->level - p_ptr->lev + 1;
2494 if (danger_amount > 100)
2495 msg_print(_("非常に恐ろしい気がする!", "You feel utterly terrified!"));
2496 else if (danger_amount > 50)
2497 msg_print(_("恐ろしい気がする!", "You feel terrified!"));
2498 else if (danger_amount > 20)
2499 msg_print(_("非常に心配な気がする!", "You feel very worried!"));
2500 else if (danger_amount > 10)
2501 msg_print(_("心配な気がする!", "You feel paranoid!"));
2502 else if (danger_amount > 5)
2503 msg_print(_("ほとんど安全な気がする。", "You feel almost safe."));
2505 msg_print(_("寂しい気がする。", "You feel lonely."));
2508 if ((p_ptr->muta2 & MUT2_INVULN) && !p_ptr->anti_magic && one_in_(5000))
2510 disturb(FALSE, TRUE);
2511 msg_print(_("無敵な気がする!", "You feel invincible!"));
2513 (void)set_invuln(randint1(8) + 8, FALSE);
2516 if ((p_ptr->muta2 & MUT2_SP_TO_HP) && one_in_(2000))
2518 MANA_POINT wounds = (MANA_POINT)(p_ptr->mhp - p_ptr->chp);
2522 HIT_POINT healing = p_ptr->csp;
2523 if (healing > wounds) healing = wounds;
2526 p_ptr->csp -= healing;
2527 p_ptr->redraw |= (PR_HP | PR_MANA);
2531 if ((p_ptr->muta2 & MUT2_HP_TO_SP) && !p_ptr->anti_magic && one_in_(4000))
2533 HIT_POINT wounds = (HIT_POINT)(p_ptr->msp - p_ptr->csp);
2537 HIT_POINT healing = p_ptr->chp;
2538 if (healing > wounds) healing = wounds;
2540 p_ptr->csp += healing;
2541 p_ptr->redraw |= (PR_HP | PR_MANA);
2542 take_hit(DAMAGE_LOSELIFE, healing, _("頭に昇った血", "blood rushing to the head"), -1);
2546 if ((p_ptr->muta2 & MUT2_DISARM) && one_in_(10000))
2548 INVENTORY_IDX slot = 0;
2549 object_type *o_ptr = NULL;
2551 disturb(FALSE, TRUE);
2552 msg_print(_("足がもつれて転んだ!", "You trip over your own feet!"));
2553 take_hit(DAMAGE_NOESCAPE, randint1(p_ptr->wt / 6), _("転倒", "tripping"), -1);
2556 if (has_melee_weapon(INVEN_RARM))
2559 o_ptr = &p_ptr->inventory_list[INVEN_RARM];
2561 if (has_melee_weapon(INVEN_LARM) && one_in_(2))
2563 o_ptr = &p_ptr->inventory_list[INVEN_LARM];
2567 else if (has_melee_weapon(INVEN_LARM))
2569 o_ptr = &p_ptr->inventory_list[INVEN_LARM];
2572 if (slot && !object_is_cursed(o_ptr))
2574 msg_print(_("武器を落としてしまった!", "You drop your weapon!"));
2575 inven_drop(slot, 1);
2582 * @brief 10ゲームターンが進行するごとに装備効果の発動判定を行う処理
2583 * / Handle curse effects once every 10 game turns
2586 static void process_world_aux_curse(void)
2588 if ((p_ptr->cursed & TRC_P_FLAG_MASK) && !p_ptr->inside_battle && !p_ptr->wild_mode)
2591 * Hack: Uncursed teleporting items (e.g. Trump Weapons)
2592 * can actually be useful!
2594 if ((p_ptr->cursed & TRC_TELEPORT_SELF) && one_in_(200))
2596 GAME_TEXT o_name[MAX_NLEN];
2598 int i, i_keep = 0, count = 0;
2600 /* Scan the equipment with random teleport ability */
2601 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
2603 BIT_FLAGS flgs[TR_FLAG_SIZE];
2604 o_ptr = &p_ptr->inventory_list[i];
2605 if (!o_ptr->k_idx) continue;
2607 object_flags(o_ptr, flgs);
2609 if (have_flag(flgs, TR_TELEPORT))
2611 /* {.} will stop random teleportation. */
2612 if (!o_ptr->inscription || !my_strchr(quark_str(o_ptr->inscription), '.'))
2615 if (one_in_(count)) i_keep = i;
2620 o_ptr = &p_ptr->inventory_list[i_keep];
2621 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2622 msg_format(_("%sがテレポートの能力を発動させようとしている。", "Your %s is activating teleportation."), o_name);
2623 if (get_check_strict(_("テレポートしますか?", "Teleport? "), CHECK_OKAY_CANCEL))
2625 disturb(FALSE, TRUE);
2626 teleport_player(50, 0L);
2630 msg_format(_("%sに{.}(ピリオド)と銘を刻むと発動を抑制できます。",
2631 "You can inscribe {.} on your %s to disable random teleportation. "), o_name);
2632 disturb(TRUE, TRUE);
2635 /* Make a chainsword noise */
2636 if ((p_ptr->cursed & TRC_CHAINSWORD) && one_in_(CHAINSWORD_NOISE))
2639 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, noise))
2641 disturb(FALSE, FALSE);
2644 if ((p_ptr->cursed & TRC_TY_CURSE) && one_in_(TY_CURSE_CHANCE))
2647 (void)activate_ty_curse(FALSE, &count);
2649 /* Handle experience draining */
2650 if (p_ptr->prace != RACE_ANDROID && ((p_ptr->cursed & TRC_DRAIN_EXP) && one_in_(4)))
2652 p_ptr->exp -= (p_ptr->lev + 1) / 2;
2653 if (p_ptr->exp < 0) p_ptr->exp = 0;
2654 p_ptr->max_exp -= (p_ptr->lev + 1) / 2;
2655 if (p_ptr->max_exp < 0) p_ptr->max_exp = 0;
2658 /* Add light curse (Later) */
2659 if ((p_ptr->cursed & TRC_ADD_L_CURSE) && one_in_(2000))
2661 BIT_FLAGS new_curse;
2664 o_ptr = choose_cursed_obj_name(TRC_ADD_L_CURSE);
2666 new_curse = get_curse(0, o_ptr);
2667 if (!(o_ptr->curse_flags & new_curse))
2669 GAME_TEXT o_name[MAX_NLEN];
2671 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2673 o_ptr->curse_flags |= new_curse;
2674 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2676 o_ptr->feeling = FEEL_NONE;
2678 p_ptr->update |= (PU_BONUS);
2681 /* Add heavy curse (Later) */
2682 if ((p_ptr->cursed & TRC_ADD_H_CURSE) && one_in_(2000))
2684 BIT_FLAGS new_curse;
2687 o_ptr = choose_cursed_obj_name(TRC_ADD_H_CURSE);
2689 new_curse = get_curse(1, o_ptr);
2690 if (!(o_ptr->curse_flags & new_curse))
2692 GAME_TEXT o_name[MAX_NLEN];
2694 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2696 o_ptr->curse_flags |= new_curse;
2697 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2698 o_ptr->feeling = FEEL_NONE;
2700 p_ptr->update |= (PU_BONUS);
2704 if ((p_ptr->cursed & TRC_CALL_ANIMAL) && one_in_(2500))
2706 if (summon_specific(0, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_ANIMAL, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2708 GAME_TEXT o_name[MAX_NLEN];
2710 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_ANIMAL), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2711 msg_format(_("%sが動物を引き寄せた!", "Your %s have attracted an animal!"), o_name);
2712 disturb(FALSE, TRUE);
2716 if ((p_ptr->cursed & TRC_CALL_DEMON) && one_in_(1111))
2718 if (summon_specific(0, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2720 GAME_TEXT o_name[MAX_NLEN];
2722 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DEMON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2723 msg_format(_("%sが悪魔を引き寄せた!", "Your %s have attracted a demon!"), o_name);
2724 disturb(FALSE, TRUE);
2728 if ((p_ptr->cursed & TRC_CALL_DRAGON) && one_in_(800))
2730 if (summon_specific(0, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_DRAGON,
2731 (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2733 GAME_TEXT o_name[MAX_NLEN];
2735 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DRAGON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2736 msg_format(_("%sがドラゴンを引き寄せた!", "Your %s have attracted an dragon!"), o_name);
2737 disturb(FALSE, TRUE);
2741 if ((p_ptr->cursed & TRC_CALL_UNDEAD) && one_in_(1111))
2743 if (summon_specific(0, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_UNDEAD,
2744 (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2746 GAME_TEXT o_name[MAX_NLEN];
2748 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_UNDEAD), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2749 msg_format(_("%sが死霊を引き寄せた!", "Your %s have attracted an undead!"), o_name);
2750 disturb(FALSE, TRUE);
2753 if ((p_ptr->cursed & TRC_COWARDICE) && one_in_(1500))
2755 if (!p_ptr->resist_fear)
2757 disturb(FALSE, TRUE);
2758 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
2759 set_afraid(p_ptr->afraid + 13 + randint1(26));
2762 /* Teleport player */
2763 if ((p_ptr->cursed & TRC_TELEPORT) && one_in_(200) && !p_ptr->anti_tele)
2765 disturb(FALSE, TRUE);
2767 /* Teleport player */
2768 teleport_player(40, TELEPORT_PASSIVE);
2770 /* Handle HP draining */
2771 if ((p_ptr->cursed & TRC_DRAIN_HP) && one_in_(666))
2773 GAME_TEXT o_name[MAX_NLEN];
2775 object_desc(o_name, choose_cursed_obj_name(TRC_DRAIN_HP), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2776 msg_format(_("%sはあなたの体力を吸収した!", "Your %s drains HP from you!"), o_name);
2777 take_hit(DAMAGE_LOSELIFE, MIN(p_ptr->lev*2, 100), o_name, -1);
2779 /* Handle mana draining */
2780 if ((p_ptr->cursed & TRC_DRAIN_MANA) && p_ptr->csp && one_in_(666))
2782 GAME_TEXT o_name[MAX_NLEN];
2784 object_desc(o_name, choose_cursed_obj_name(TRC_DRAIN_MANA), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2785 msg_format(_("%sはあなたの魔力を吸収した!", "Your %s drains mana from you!"), o_name);
2786 p_ptr->csp -= MIN(p_ptr->lev, 50);
2790 p_ptr->csp_frac = 0;
2792 p_ptr->redraw |= PR_MANA;
2796 /* Rarely, take damage from the Jewel of Judgement */
2797 if (one_in_(999) && !p_ptr->anti_magic)
2799 object_type *o_ptr = &p_ptr->inventory_list[INVEN_LITE];
2801 if (o_ptr->name1 == ART_JUDGE)
2803 if (object_is_known(o_ptr))
2804 msg_print(_("『審判の宝石』はあなたの体力を吸収した!", "The Jewel of Judgement drains life from you!"));
2806 msg_print(_("なにかがあなたの体力を吸収した!", "Something drains life from you!"));
2807 take_hit(DAMAGE_LOSELIFE, MIN(p_ptr->lev, 50), _("審判の宝石", "the Jewel of Judgement"), -1);
2814 * @brief 10ゲームターンが進行するごとに魔道具の自然充填を行う処理
2815 * / Handle recharging objects once every 10 game turns
2818 static void process_world_aux_recharge(void)
2823 /* Process equipment */
2824 for (changed = FALSE, i = INVEN_RARM; i < INVEN_TOTAL; i++)
2826 /* Get the object */
2827 object_type *o_ptr = &p_ptr->inventory_list[i];
2828 if (!o_ptr->k_idx) continue;
2830 /* Recharge activatable objects */
2831 if (o_ptr->timeout > 0)
2836 /* Notice changes */
2837 if (!o_ptr->timeout)
2839 recharged_notice(o_ptr);
2845 /* Notice changes */
2848 p_ptr->window |= (PW_EQUIP);
2853 * Recharge rods. Rods now use timeout to control charging status,
2854 * and each charging rod in a stack decreases the stack's timeout by
2855 * one per current_world_ptr->game_turn. -LM-
2857 for (changed = FALSE, i = 0; i < INVEN_PACK; i++)
2859 object_type *o_ptr = &p_ptr->inventory_list[i];
2860 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2861 if (!o_ptr->k_idx) continue;
2863 /* Examine all charging rods or stacks of charging rods. */
2864 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2866 /* Determine how many rods are charging. */
2867 TIME_EFFECT temp = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval;
2868 if (temp > o_ptr->number) temp = (TIME_EFFECT)o_ptr->number;
2870 /* Decrease timeout by that number. */
2871 o_ptr->timeout -= temp;
2873 /* Boundary control. */
2874 if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2876 /* Notice changes, provide message if object is inscribed. */
2877 if (!(o_ptr->timeout))
2879 recharged_notice(o_ptr);
2883 /* One of the stack of rod is charged */
2884 else if (o_ptr->timeout % k_ptr->pval)
2891 /* Notice changes */
2894 p_ptr->window |= (PW_INVEN);
2898 /* Process objects on floor */
2899 for (i = 1; i < current_floor_ptr->o_max; i++)
2901 object_type *o_ptr = ¤t_floor_ptr->o_list[i];
2903 /* Skip dead objects */
2904 if (!o_ptr->k_idx) continue;
2906 /* Recharge rods on the ground. No messages. */
2907 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2910 o_ptr->timeout -= (TIME_EFFECT)o_ptr->number;
2912 /* Boundary control. */
2913 if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2920 * @brief 10ゲームターンが進行するごとに帰還や現実変容などの残り時間カウントダウンと発動を処理する。
2921 * / Handle involuntary movement once every 10 game turns
2924 static void process_world_aux_movement(void)
2926 /* Delayed Word-of-Recall */
2927 if (p_ptr->word_recall)
2930 * HACK: Autosave BEFORE resetting the recall counter (rr9)
2931 * The player is yanked up/down as soon as
2932 * he loads the autosaved game.
2934 if (autosave_l && (p_ptr->word_recall == 1) && !p_ptr->inside_battle)
2935 do_cmd_save_game(TRUE);
2937 /* Count down towards recall */
2938 p_ptr->word_recall--;
2940 p_ptr->redraw |= (PR_STATUS);
2942 /* Activate the recall */
2943 if (!p_ptr->word_recall)
2946 disturb(FALSE, TRUE);
2948 /* Determine the level */
2949 if (current_floor_ptr->dun_level || p_ptr->inside_quest || p_ptr->enter_dungeon)
2951 msg_print(_("上に引っ張りあげられる感じがする!", "You feel yourself yanked upwards!"));
2953 if (p_ptr->dungeon_idx) p_ptr->recall_dungeon = p_ptr->dungeon_idx;
2955 do_cmd_write_nikki(NIKKI_RECALL, current_floor_ptr->dun_level, NULL);
2957 current_floor_ptr->dun_level = 0;
2958 p_ptr->dungeon_idx = 0;
2960 leave_quest_check();
2961 leave_tower_check();
2963 p_ptr->inside_quest = 0;
2965 p_ptr->leaving = TRUE;
2969 msg_print(_("下に引きずり降ろされる感じがする!", "You feel yourself yanked downwards!"));
2971 p_ptr->dungeon_idx = p_ptr->recall_dungeon;
2974 do_cmd_write_nikki(NIKKI_RECALL, current_floor_ptr->dun_level, NULL);
2977 current_floor_ptr->dun_level = max_dlv[p_ptr->dungeon_idx];
2978 if (current_floor_ptr->dun_level < 1) current_floor_ptr->dun_level = 1;
2980 /* Nightmare mode makes recall more dangerous */
2981 if (ironman_nightmare && !randint0(666) && (p_ptr->dungeon_idx == DUNGEON_ANGBAND))
2983 if (current_floor_ptr->dun_level < 50)
2985 current_floor_ptr->dun_level *= 2;
2987 else if (current_floor_ptr->dun_level < 99)
2989 current_floor_ptr->dun_level = (current_floor_ptr->dun_level + 99) / 2;
2991 else if (current_floor_ptr->dun_level > 100)
2993 current_floor_ptr->dun_level = d_info[p_ptr->dungeon_idx].maxdepth - 1;
2997 if (p_ptr->wild_mode)
2999 p_ptr->wilderness_y = p_ptr->y;
3000 p_ptr->wilderness_x = p_ptr->x;
3004 /* Save player position */
3005 p_ptr->oldpx = p_ptr->x;
3006 p_ptr->oldpy = p_ptr->y;
3008 p_ptr->wild_mode = FALSE;
3011 * Clear all saved floors
3012 * and create a first saved floor
3014 prepare_change_floor_mode(CFM_FIRST_FLOOR);
3015 p_ptr->leaving = TRUE;
3017 if (p_ptr->dungeon_idx == DUNGEON_ANGBAND)
3021 for (i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++)
3023 quest_type* const q_ptr = &quest[i];
3026 if ((q_ptr->type == QUEST_TYPE_RANDOM) &&
3027 (q_ptr->status == QUEST_STATUS_TAKEN) &&
3028 (q_ptr->level < current_floor_ptr->dun_level))
3030 q_ptr->status = QUEST_STATUS_FAILED;
3031 q_ptr->complev = (byte)p_ptr->lev;
3033 q_ptr->comptime = current_world_ptr->play_time;
3034 r_info[q_ptr->r_idx].flags1 &= ~(RF1_QUESTOR);
3040 sound(SOUND_TPLEVEL);
3045 /* Delayed Alter reality */
3046 if (p_ptr->alter_reality)
3048 if (autosave_l && (p_ptr->alter_reality == 1) && !p_ptr->inside_battle)
3049 do_cmd_save_game(TRUE);
3051 /* Count down towards alter */
3052 p_ptr->alter_reality--;
3054 p_ptr->redraw |= (PR_STATUS);
3056 /* Activate the alter reality */
3057 if (!p_ptr->alter_reality)
3060 disturb(FALSE, TRUE);
3062 /* Determine the level */
3063 if (!quest_number(current_floor_ptr->dun_level) && current_floor_ptr->dun_level)
3065 msg_print(_("世界が変わった!", "The world changes!"));
3068 * Clear all saved floors
3069 * and create a first saved floor
3071 prepare_change_floor_mode(CFM_FIRST_FLOOR);
3072 p_ptr->leaving = TRUE;
3076 msg_print(_("世界が少しの間変化したようだ。", "The world seems to change for a moment!"));
3079 sound(SOUND_TPLEVEL);
3085 * @brief 10ゲームターンが進行する毎にゲーム世界全体の処理を行う。
3086 * / Handle certain things once every 10 game turns
3089 static void process_world(void)
3093 const s32b A_DAY = TURNS_PER_TICK * TOWN_DAWN;
3094 s32b prev_turn_in_today = ((current_world_ptr->game_turn - TURNS_PER_TICK) % A_DAY + A_DAY / 4) % A_DAY;
3095 int prev_min = (1440 * prev_turn_in_today / A_DAY) % 60;
3097 extract_day_hour_min(&day, &hour, &min);
3099 /* Update dungeon feeling, and announce it if changed */
3100 update_dungeon_feeling();
3102 /* 帰還無しモード時のレベルテレポバグ対策 / Fix for level teleport bugs on ironman_downward.*/
3103 if (ironman_downward && (p_ptr->dungeon_idx != DUNGEON_ANGBAND && p_ptr->dungeon_idx != 0))
3105 current_floor_ptr->dun_level = 0;
3106 p_ptr->dungeon_idx = 0;
3107 prepare_change_floor_mode(CFM_FIRST_FLOOR | CFM_RAND_PLACE);
3108 p_ptr->inside_arena = FALSE;
3109 p_ptr->wild_mode = FALSE;
3110 p_ptr->leaving = TRUE;
3113 /*** Check monster arena ***/
3114 if (p_ptr->inside_battle && !p_ptr->leaving)
3120 /* Count all hostile monsters */
3121 for (i2 = 0; i2 < current_floor_ptr->width; ++i2)
3122 for (j2 = 0; j2 < current_floor_ptr->height; j2++)
3124 grid_type *g_ptr = ¤t_floor_ptr->grid_array[j2][i2];
3126 if ((g_ptr->m_idx > 0) && (g_ptr->m_idx != p_ptr->riding))
3129 win_m_idx = g_ptr->m_idx;
3133 if (number_mon == 0)
3135 msg_print(_("相打ちに終わりました。", "They have kill each other at the same time."));
3137 p_ptr->energy_need = 0;
3138 update_gambling_monsters();
3140 else if ((number_mon-1) == 0)
3142 GAME_TEXT m_name[MAX_NLEN];
3143 monster_type *wm_ptr;
3145 wm_ptr = ¤t_floor_ptr->m_list[win_m_idx];
3147 monster_desc(m_name, wm_ptr, 0);
3148 msg_format(_("%sが勝利した!", "%s is winner!"), m_name);
3151 if (win_m_idx == (sel_monster+1))
3153 msg_print(_("おめでとうございます。", "Congratulations."));
3154 msg_format(_("%d$を受け取った。", "You received %d gold."), battle_odds);
3155 p_ptr->au += battle_odds;
3159 msg_print(_("残念でした。", "You lost gold."));
3162 p_ptr->energy_need = 0;
3163 update_gambling_monsters();
3165 else if (current_world_ptr->game_turn - current_floor_ptr->generated_turn == 150 * TURNS_PER_TICK)
3167 msg_print(_("申し分けありませんが、この勝負は引き分けとさせていただきます。", "This battle have ended in a draw."));
3168 p_ptr->au += kakekin;
3170 p_ptr->energy_need = 0;
3171 update_gambling_monsters();
3175 /* Every 10 game turns */
3176 if (current_world_ptr->game_turn % TURNS_PER_TICK) return;
3178 /*** Attempt timed autosave ***/
3179 if (autosave_t && autosave_freq && !p_ptr->inside_battle)
3181 if (!(current_world_ptr->game_turn % ((s32b)autosave_freq * TURNS_PER_TICK)))
3182 do_cmd_save_game(TRUE);
3185 if (current_floor_ptr->monster_noise && !ignore_unview)
3187 msg_print(_("何かが聞こえた。", "You hear noise."));
3190 /*** Handle the wilderness/town (sunshine) ***/
3192 /* While in town/wilderness */
3193 if (!current_floor_ptr->dun_level && !p_ptr->inside_quest && !p_ptr->inside_battle && !p_ptr->inside_arena)
3195 /* Hack -- Daybreak/Nighfall in town */
3196 if (!(current_world_ptr->game_turn % ((TURNS_PER_TICK * TOWN_DAWN) / 2)))
3200 /* Check for dawn */
3201 dawn = (!(current_world_ptr->game_turn % (TURNS_PER_TICK * TOWN_DAWN)));
3203 if (dawn) day_break();
3209 /* While in the dungeon (vanilla_town or lite_town mode only) */
3210 else if ((vanilla_town || (lite_town && !p_ptr->inside_quest && !p_ptr->inside_battle && !p_ptr->inside_arena)) && current_floor_ptr->dun_level)
3212 /*** Shuffle the Storekeepers ***/
3214 /* Chance is only once a day (while in dungeon) */
3215 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * STORE_TICKS)))
3217 /* Sometimes, shuffle the shop-keepers */
3218 if (one_in_(STORE_SHUFFLE))
3223 /* Pick a random shop (except home and museum) */
3226 n = randint0(MAX_STORES);
3228 while ((n == STORE_HOME) || (n == STORE_MUSEUM));
3230 /* Check every feature */
3231 for (i = 1; i < max_f_idx; i++)
3233 feature_type *f_ptr = &f_info[i];
3235 /* Skip empty index */
3236 if (!f_ptr->name) continue;
3238 /* Skip non-store features */
3239 if (!have_flag(f_ptr->flags, FF_STORE)) continue;
3241 /* Verify store type */
3242 if (f_ptr->subtype == n)
3244 if (cheat_xtra) msg_format(_("%sの店主をシャッフルします。", "Shuffle a Shopkeeper of %s."), f_name + f_ptr->name);
3257 /*** Process the monsters ***/
3259 /* Check for creature generation. */
3260 if (one_in_(d_info[p_ptr->dungeon_idx].max_m_alloc_chance) &&
3261 !p_ptr->inside_arena && !p_ptr->inside_quest && !p_ptr->inside_battle)
3263 /* Make a new monster */
3264 (void)alloc_monster(MAX_SIGHT + 5, 0);
3267 /* Hack -- Check for creature regeneration */
3268 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 10)) && !p_ptr->inside_battle) regen_monsters();
3269 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 3))) regen_captured_monsters();
3271 if (!p_ptr->leaving)
3275 /* Hack -- Process the counters of monsters if needed */
3276 for (i = 0; i < MAX_MTIMED; i++)
3278 if (current_floor_ptr->mproc_max[i] > 0) process_monsters_mtimed(i);
3286 if (min != prev_min)
3288 do_cmd_write_nikki(NIKKI_HIGAWARI, 0, NULL);
3289 determine_today_mon(FALSE);
3294 * Nightmare mode activates the TY_CURSE at midnight
3295 * Require exact minute -- Don't activate multiple times in a minute
3298 if (ironman_nightmare && (min != prev_min))
3301 /* Every 15 minutes after 11:00 pm */
3302 if ((hour == 23) && !(min % 15))
3304 disturb(FALSE, TRUE);
3309 msg_print(_("遠くで不気味な鐘の音が鳴った。", "You hear a distant bell toll ominously."));
3313 msg_print(_("遠くで鐘が二回鳴った。", "A distant bell sounds twice."));
3317 msg_print(_("遠くで鐘が三回鳴った。", "A distant bell sounds three times."));
3321 msg_print(_("遠くで鐘が四回鳴った。", "A distant bell tolls four times."));
3326 /* TY_CURSE activates at midnight! */
3330 disturb(TRUE, TRUE);
3331 msg_print(_("遠くで鐘が何回も鳴り、死んだような静けさの中へ消えていった。", "A distant bell tolls many times, fading into an deathly silence."));
3333 if (p_ptr->wild_mode)
3335 /* Go into large wilderness view */
3336 p_ptr->oldpy = randint1(MAX_HGT - 2);
3337 p_ptr->oldpx = randint1(MAX_WID - 2);
3338 change_wild_mode(TRUE);
3340 /* Give first move to monsters */
3341 take_turn(p_ptr, 100);
3345 p_ptr->invoking_midnight_curse = TRUE;
3351 /* Check the Food */
3352 process_world_aux_digestion();
3354 /* Process timed damage and regeneration */
3355 process_world_aux_hp_and_sp();
3357 /* Process timeout */
3358 process_world_aux_timeout();
3361 process_world_aux_light();
3363 /* Process mutation effects */
3364 process_world_aux_mutation();
3366 /* Process curse effects */
3367 process_world_aux_curse();
3369 /* Process recharging */
3370 process_world_aux_recharge();
3372 /* Feel the p_ptr->inventory_list */
3376 /* Involuntary Movement */
3377 process_world_aux_movement();
3381 * @brief ウィザードモードへの導入処理
3382 * / Verify use of "wizard" mode
3383 * @return 実際にウィザードモードへ移行したらTRUEを返す。
3385 static bool enter_wizard_mode(void)
3387 /* Ask first time */
3388 if (!p_ptr->noscore)
3390 /* Wizard mode is not permitted */
3391 if (!allow_debug_opts || arg_wizard)
3393 msg_print(_("ウィザードモードは許可されていません。 ", "Wizard mode is not permitted."));
3397 /* Mention effects */
3398 msg_print(_("ウィザードモードはデバッグと実験のためのモードです。 ", "Wizard mode is for debugging and experimenting."));
3399 msg_print(_("一度ウィザードモードに入るとスコアは記録されません。", "The game will not be scored if you enter wizard mode."));
3402 /* Verify request */
3403 if (!get_check(_("本当にウィザードモードに入りたいのですか? ", "Are you sure you want to enter wizard mode? ")))
3408 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("ウィザードモードに突入してスコアを残せなくなった。", "give up recording score to enter wizard mode."));
3410 p_ptr->noscore |= 0x0002;
3421 * @brief デバッグコマンドへの導入処理
3422 * / Verify use of "debug" commands
3423 * @return 実際にデバッグコマンドへ移行したらTRUEを返す。
3425 static bool enter_debug_mode(void)
3427 /* Ask first time */
3428 if (!p_ptr->noscore)
3430 /* Debug mode is not permitted */
3431 if (!allow_debug_opts)
3433 msg_print(_("デバッグコマンドは許可されていません。 ", "Use of debug command is not permitted."));
3437 /* Mention effects */
3438 msg_print(_("デバッグ・コマンドはデバッグと実験のためのコマンドです。 ", "The debug commands are for debugging and experimenting."));
3439 msg_print(_("デバッグ・コマンドを使うとスコアは記録されません。", "The game will not be scored if you use debug commands."));
3443 /* Verify request */
3444 if (!get_check(_("本当にデバッグ・コマンドを使いますか? ", "Are you sure you want to use debug commands? ")))
3449 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("デバッグモードに突入してスコアを残せなくなった。", "give up sending score to use debug commands."));
3451 p_ptr->noscore |= 0x0008;
3459 * Hack -- Declare the Debug Routines
3461 extern void do_cmd_debug(void);
3463 #endif /* ALLOW_WIZARD */
3469 * @brief ボーグコマンドへの導入処理
3470 * / Verify use of "borg" commands
3471 * @return 実際にボーグコマンドへ移行したらTRUEを返す。
3473 static bool enter_borg_mode(void)
3475 /* Ask first time */
3476 if (!(p_ptr->noscore & 0x0010))
3478 /* Mention effects */
3479 msg_print(_("ボーグ・コマンドはデバッグと実験のためのコマンドです。 ", "The borg commands are for debugging and experimenting."));
3480 msg_print(_("ボーグ・コマンドを使うとスコアは記録されません。", "The game will not be scored if you use borg commands."));
3484 /* Verify request */
3485 if (!get_check(_("本当にボーグ・コマンドを使いますか? ", "Are you sure you want to use borg commands? ")))
3490 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, _("ボーグ・コマンドを使用してスコアを残せなくなった。", "give up recording score to use borg commands."));
3492 p_ptr->noscore |= 0x0010;
3500 * Hack -- Declare the Ben Borg
3502 extern void do_cmd_borg(void);
3504 #endif /* ALLOW_BORG */
3508 * @brief プレイヤーから受けた入力コマンドの分岐処理。
3509 * / Parse and execute the current command Give "Warning" on illegal commands.
3510 * @todo Make some "blocks"
3513 static void process_command(void)
3515 COMMAND_CODE old_now_message = now_message;
3517 /* Handle repeating the last command */
3523 if ((p_ptr->pclass == CLASS_SNIPER) && (p_ptr->concent))
3524 reset_concent = TRUE;
3526 /* Parse the command */
3527 switch (command_cmd)
3543 /*** Wizard Commands ***/
3545 /* Toggle Wizard Mode */
3550 p_ptr->wizard = FALSE;
3551 msg_print(_("ウィザードモード解除。", "Wizard mode off."));
3553 else if (enter_wizard_mode())
3555 p_ptr->wizard = TRUE;
3556 msg_print(_("ウィザードモード突入。", "Wizard mode on."));
3558 p_ptr->update |= (PU_MONSTERS);
3560 /* Redraw "title" */
3561 p_ptr->redraw |= (PR_TITLE);
3569 /* Special "debug" commands */
3572 /* Enter debug mode */
3573 if (enter_debug_mode())
3580 #endif /* ALLOW_WIZARD */
3585 /* Special "borg" commands */
3588 /* Enter borg mode */
3589 if (enter_borg_mode())
3591 if (!p_ptr->wild_mode) do_cmd_borg();
3597 #endif /* ALLOW_BORG */
3601 /*** Inventory Commands ***/
3603 /* Wear/wield equipment */
3606 if (!p_ptr->wild_mode) do_cmd_wield();
3610 /* Take off equipment */
3613 if (!p_ptr->wild_mode) do_cmd_takeoff();
3620 if (!p_ptr->wild_mode) do_cmd_drop();
3624 /* Destroy an item */
3631 /* Equipment list */
3638 /* Inventory list */
3646 /*** Various commands ***/
3648 /* Identify an object */
3655 /* Hack -- toggle windows */
3658 toggle_inven_equip();
3663 /*** Standard "Movement" Commands ***/
3668 if (!p_ptr->wild_mode) do_cmd_alter();
3675 if (!p_ptr->wild_mode) do_cmd_tunnel();
3679 /* Move (usually pick up things) */
3686 /* Move (usually do not pick up) */
3694 /*** Running, Resting, Searching, Staying */
3696 /* Begin Running -- Arg is Max Distance */
3699 if (!p_ptr->wild_mode) do_cmd_run();
3703 /* Stay still (usually pick things up) */
3706 do_cmd_stay(always_pickup);
3710 /* Stay still (usually do not pick up) */
3713 do_cmd_stay(!always_pickup);
3717 /* Rest -- Arg is time */
3724 /* Search for traps/doors */
3731 /* Toggle search mode */
3734 if (p_ptr->action == ACTION_SEARCH) set_action(ACTION_NONE);
3735 else set_action(ACTION_SEARCH);
3740 /*** Stairs and Doors and Chests and Traps ***/
3743 case SPECIAL_KEY_STORE:
3749 /* Enter building -KMW- */
3750 case SPECIAL_KEY_BUILDING:
3756 /* Enter quest level -KMW- */
3757 case SPECIAL_KEY_QUEST:
3763 /* Go up staircase */
3766 if (!p_ptr->wild_mode && !current_floor_ptr->dun_level && !p_ptr->inside_arena && !p_ptr->inside_quest)
3768 if (vanilla_town) break;
3770 if (p_ptr->ambush_flag)
3772 msg_print(_("襲撃から逃げるにはマップの端まで移動しなければならない。", "To flee the ambush you have to reach the edge of the map."));
3776 if (p_ptr->food < PY_FOOD_WEAK)
3778 msg_print(_("その前に食事をとらないと。", "You must eat something here."));
3782 change_wild_mode(FALSE);
3789 /* Go down staircase */
3792 if (p_ptr->wild_mode)
3793 change_wild_mode(FALSE);
3799 /* Open a door or chest */
3813 /* Jam a door with spikes */
3827 /* Disarm a trap or chest */
3835 /*** Magic and Prayers ***/
3837 /* Gain new spells/prayers */
3840 if ((p_ptr->pclass == CLASS_SORCERER) || (p_ptr->pclass == CLASS_RED_MAGE))
3841 msg_print(_("呪文を学習する必要はない!", "You don't have to learn spells!"));
3842 else if (p_ptr->pclass == CLASS_SAMURAI)
3843 do_cmd_gain_hissatsu();
3844 else if (p_ptr->pclass == CLASS_MAGIC_EATER)
3845 import_magic_device();
3854 if ( (p_ptr->pclass == CLASS_MINDCRAFTER) ||
3855 (p_ptr->pclass == CLASS_BERSERKER) ||
3856 (p_ptr->pclass == CLASS_NINJA) ||
3857 (p_ptr->pclass == CLASS_MIRROR_MASTER)
3858 ) do_cmd_mind_browse();
3859 else if (p_ptr->pclass == CLASS_SMITH)
3861 else if (p_ptr->pclass == CLASS_MAGIC_EATER)
3862 do_cmd_magic_eater(TRUE, FALSE);
3863 else if (p_ptr->pclass == CLASS_SNIPER)
3864 do_cmd_snipe_browse();
3865 else do_cmd_browse();
3873 if (!p_ptr->wild_mode)
3875 if ((p_ptr->pclass == CLASS_WARRIOR) || (p_ptr->pclass == CLASS_ARCHER) || (p_ptr->pclass == CLASS_CAVALRY))
3877 msg_print(_("呪文を唱えられない!", "You cannot cast spells!"));
3879 else if (current_floor_ptr->dun_level && (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MAGIC) && (p_ptr->pclass != CLASS_BERSERKER) && (p_ptr->pclass != CLASS_SMITH))
3881 msg_print(_("ダンジョンが魔法を吸収した!", "The dungeon absorbs all attempted magic!"));
3884 else if (p_ptr->anti_magic && (p_ptr->pclass != CLASS_BERSERKER) && (p_ptr->pclass != CLASS_SMITH))
3886 concptr which_power = _("魔法", "magic");
3887 if (p_ptr->pclass == CLASS_MINDCRAFTER)
3888 which_power = _("超能力", "psionic powers");
3889 else if (p_ptr->pclass == CLASS_IMITATOR)
3890 which_power = _("ものまね", "imitation");
3891 else if (p_ptr->pclass == CLASS_SAMURAI)
3892 which_power = _("必殺剣", "hissatsu");
3893 else if (p_ptr->pclass == CLASS_MIRROR_MASTER)
3894 which_power = _("鏡魔法", "mirror magic");
3895 else if (p_ptr->pclass == CLASS_NINJA)
3896 which_power = _("忍術", "ninjutsu");
3897 else if (mp_ptr->spell_book == TV_LIFE_BOOK)
3898 which_power = _("祈り", "prayer");
3900 msg_format(_("反魔法バリアが%sを邪魔した!", "An anti-magic shell disrupts your %s!"), which_power);
3903 else if (p_ptr->shero && (p_ptr->pclass != CLASS_BERSERKER))
3905 msg_format(_("狂戦士化していて頭が回らない!", "You cannot think directly!"));
3910 if ((p_ptr->pclass == CLASS_MINDCRAFTER) ||
3911 (p_ptr->pclass == CLASS_BERSERKER) ||
3912 (p_ptr->pclass == CLASS_NINJA) ||
3913 (p_ptr->pclass == CLASS_MIRROR_MASTER)
3916 else if (p_ptr->pclass == CLASS_IMITATOR)
3918 else if (p_ptr->pclass == CLASS_MAGIC_EATER)
3919 do_cmd_magic_eater(FALSE, FALSE);
3920 else if (p_ptr->pclass == CLASS_SAMURAI)
3922 else if (p_ptr->pclass == CLASS_BLUE_MAGE)
3923 do_cmd_cast_learned();
3924 else if (p_ptr->pclass == CLASS_SMITH)
3926 else if (p_ptr->pclass == CLASS_SNIPER)
3935 /* Issue a pet command */
3942 /*** Use various objects ***/
3944 /* Inscribe an object */
3951 /* Uninscribe an object */
3954 do_cmd_uninscribe();
3958 /* Activate an artifact */
3972 /* Fuel your lantern/torch */
3982 do_cmd_fire(SP_NONE);
3989 do_cmd_throw(1, FALSE, -1);
4003 if (use_command && rogue_like_commands)
4014 /* Quaff a potion */
4017 do_cmd_quaff_potion();
4024 do_cmd_read_scroll();
4031 if (use_command && !rogue_like_commands)
4038 /* Use racial power */
4041 do_cmd_racial_power();
4046 /*** Looking at Things (nearby or on map) ***/
4048 /* Full dungeon map */
4055 /* Locate player on map */
4069 /* Target monster or location */
4078 /*** Help and Such ***/
4087 /* Identify symbol */
4090 do_cmd_query_symbol();
4094 /* Character description */
4097 do_cmd_change_name();
4102 /*** System Commands ***/
4104 /* Hack -- User interface */
4111 /* Single line from a pref file */
4120 do_cmd_reload_autopick();
4126 do_cmd_edit_autopick();
4130 /* Interact with macros */
4137 /* Interact with visuals */
4145 /* Interact with colors */
4153 /* Interact with options */
4157 (void)combine_and_reorder_home(STORE_HOME);
4162 /*** Misc Commands ***/
4178 /* Repeat level feeling */
4185 /* Show previous message */
4188 do_cmd_message_one();
4192 /* Show previous messages */
4195 do_cmd_messages(old_now_message);
4199 /* Show quest status -KMW- */
4202 do_cmd_checkquest();
4206 /* Redraw the screen */
4209 now_message = old_now_message;
4214 #ifndef VERIFY_SAVEFILE
4216 /* Hack -- Save and don't quit */
4219 do_cmd_save_game(FALSE);
4223 #endif /* VERIFY_SAVEFILE */
4233 case SPECIAL_KEY_QUIT:
4235 do_cmd_save_and_exit();
4239 /* Quit (commit suicide) */
4252 /* Check artifacts, uniques, objects */
4259 /* Load "screen dump" */
4262 do_cmd_load_screen();
4266 /* Save "screen dump" */
4269 do_cmd_save_screen();
4273 /* Record/stop "Movie" */
4276 prepare_movie_hooks();
4280 /* Make random artifact list */
4283 spoil_random_artifact("randifact.txt");
4290 if (!p_ptr->wild_mode) do_cmd_travel();
4291 if (p_ptr->special_defense & KATA_MUSOU)
4293 set_action(ACTION_NONE);
4299 /* Hack -- Unknown command */
4302 if (flush_failure) flush();
4306 sound(SOUND_ILLEGAL);
4307 if (!get_rnd_line(_("error_j.txt", "error.txt"), 0, error_m))
4312 prt(_(" '?' でヘルプが表示されます。", "Type '?' for help."), 0, 0);
4318 if (!p_ptr->energy_use && !now_message)
4319 now_message = old_now_message;
4323 * @brief アイテムの所持種類数が超えた場合にアイテムを床に落とす処理 / Hack -- Pack Overflow
4326 static void pack_overflow(void)
4328 if (p_ptr->inventory_list[INVEN_PACK].k_idx)
4330 GAME_TEXT o_name[MAX_NLEN];
4333 /* Is auto-destroy done? */
4334 update_creature(p_ptr);
4335 if (!p_ptr->inventory_list[INVEN_PACK].k_idx) return;
4337 /* Access the slot to be dropped */
4338 o_ptr = &p_ptr->inventory_list[INVEN_PACK];
4340 disturb(FALSE, TRUE);
4343 msg_print(_("ザックからアイテムがあふれた!", "Your pack overflows!"));
4344 object_desc(o_name, o_ptr, 0);
4346 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(INVEN_PACK));
4348 /* Drop it (carefully) near the player */
4349 (void)drop_near(o_ptr, 0, p_ptr->y, p_ptr->x);
4351 /* Modify, Describe, Optimize */
4352 inven_item_increase(INVEN_PACK, -255);
4353 inven_item_describe(INVEN_PACK);
4354 inven_item_optimize(INVEN_PACK);
4361 * @brief プレイヤーの行動エネルギーが充填される(=プレイヤーのターンが回る)毎に行われる処理 / process the effects per 100 energy at player speed.
4364 static void process_upkeep_with_speed(void)
4366 /* Give the player some energy */
4367 if (!load && p_ptr->enchant_energy_need > 0 && !p_ptr->leaving)
4369 p_ptr->enchant_energy_need -= SPEED_TO_ENERGY(p_ptr->pspeed);
4372 /* No current_world_ptr->game_turn yet */
4373 if (p_ptr->enchant_energy_need > 0) return;
4375 while (p_ptr->enchant_energy_need <= 0)
4377 /* Handle the player song */
4378 if (!load) check_music();
4380 /* Hex - Handle the hex spells */
4381 if (!load) check_hex();
4382 if (!load) revenge_spell();
4384 /* There is some randomness of needed energy */
4385 p_ptr->enchant_energy_need += ENERGY_NEED();
4389 static void process_fishing(void)
4391 Term_xtra(TERM_XTRA_DELAY, 10);
4395 bool success = FALSE;
4396 get_mon_num_prep(monster_is_fishing_target, NULL);
4397 r_idx = get_mon_num(current_floor_ptr->dun_level ? current_floor_ptr->dun_level : wilderness[p_ptr->wilderness_y][p_ptr->wilderness_x].level);
4399 if (r_idx && one_in_(2))
4402 y = p_ptr->y + ddy[p_ptr->fishing_dir];
4403 x = p_ptr->x + ddx[p_ptr->fishing_dir];
4404 if (place_monster_aux(0, y, x, r_idx, PM_NO_KAGE))
4406 GAME_TEXT m_name[MAX_NLEN];
4407 monster_desc(m_name, ¤t_floor_ptr->m_list[current_floor_ptr->grid_array[y][x].m_idx], 0);
4408 msg_format(_("%sが釣れた!", "You have a good catch!"), m_name);
4414 msg_print(_("餌だけ食われてしまった!くっそ~!", "Damn! The fish stole your bait!"));
4416 disturb(FALSE, TRUE);
4421 * @brief プレイヤーの行動処理 / Process the player
4424 * Notice the annoying code to handle "pack overflow", which\n
4425 * must come first just in case somebody manages to corrupt\n
4426 * the savefiles by clever use of menu commands or something.\n
4428 static void process_player(void)
4432 /*** Apply energy ***/
4434 if (p_ptr->hack_mutation)
4436 msg_print(_("何か変わった気がする!", "You feel different!"));
4438 (void)gain_mutation(p_ptr, 0);
4439 p_ptr->hack_mutation = FALSE;
4442 if (p_ptr->invoking_midnight_curse)
4445 activate_ty_curse(FALSE, &count);
4446 p_ptr->invoking_midnight_curse = FALSE;
4449 if (p_ptr->inside_battle)
4451 for(m_idx = 1; m_idx < current_floor_ptr->m_max; m_idx++)
4453 monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx];
4455 if (!monster_is_valid(m_ptr)) continue;
4457 m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
4458 update_monster(m_idx, FALSE);
4463 /* Give the player some energy */
4464 else if (!(load && p_ptr->energy_need <= 0))
4466 p_ptr->energy_need -= SPEED_TO_ENERGY(p_ptr->pspeed);
4469 /* No current_world_ptr->game_turn yet */
4470 if (p_ptr->energy_need > 0) return;
4471 if (!command_rep) prt_time();
4473 /*** Check for interupts ***/
4475 /* Complete resting */
4476 if (p_ptr->resting < 0)
4479 if (p_ptr->resting == COMMAND_ARG_REST_FULL_HEALING)
4482 if ((p_ptr->chp == p_ptr->mhp) &&
4483 (p_ptr->csp >= p_ptr->msp))
4485 set_action(ACTION_NONE);
4489 /* Complete resting */
4490 else if (p_ptr->resting == COMMAND_ARG_REST_UNTIL_DONE)
4493 if ((p_ptr->chp == p_ptr->mhp) &&
4494 (p_ptr->csp >= p_ptr->msp) &&
4495 !p_ptr->blind && !p_ptr->confused &&
4496 !p_ptr->poisoned && !p_ptr->afraid &&
4497 !p_ptr->stun && !p_ptr->cut &&
4498 !p_ptr->slow && !p_ptr->paralyzed &&
4499 !p_ptr->image && !p_ptr->word_recall &&
4500 !p_ptr->alter_reality)
4502 set_action(ACTION_NONE);
4507 if (p_ptr->action == ACTION_FISH) process_fishing();
4509 /* Handle "abort" */
4512 /* Check for "player abort" (semi-efficiently for resting) */
4513 if (p_ptr->running || travel.run || command_rep || (p_ptr->action == ACTION_REST) || (p_ptr->action == ACTION_FISH))
4518 /* Check for a key */
4521 flush(); /* Flush input */
4523 disturb(FALSE, TRUE);
4525 /* Hack -- Show a Message */
4526 msg_print(_("中断しました。", "Canceled."));
4531 if (p_ptr->riding && !p_ptr->confused && !p_ptr->blind)
4533 monster_type *m_ptr = ¤t_floor_ptr->m_list[p_ptr->riding];
4534 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4536 if (MON_CSLEEP(m_ptr))
4538 GAME_TEXT m_name[MAX_NLEN];
4541 (void)set_monster_csleep(p_ptr->riding, 0);
4542 monster_desc(m_name, m_ptr, 0);
4543 msg_format(_("%^sを起こした。", "You have waked %s up."), m_name);
4546 if (MON_STUNNED(m_ptr))
4548 /* Hack -- Recover from stun */
4549 if (set_monster_stunned(p_ptr->riding,
4550 (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_STUNNED(m_ptr) - 1)))
4552 GAME_TEXT m_name[MAX_NLEN];
4553 monster_desc(m_name, m_ptr, 0);
4554 msg_format(_("%^sを朦朧状態から立ち直らせた。", "%^s is no longer stunned."), m_name);
4558 if (MON_CONFUSED(m_ptr))
4560 /* Hack -- Recover from confusion */
4561 if (set_monster_confused(p_ptr->riding,
4562 (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_CONFUSED(m_ptr) - 1)))
4564 GAME_TEXT m_name[MAX_NLEN];
4565 monster_desc(m_name, m_ptr, 0);
4566 msg_format(_("%^sを混乱状態から立ち直らせた。", "%^s is no longer confused."), m_name);
4570 if (MON_MONFEAR(m_ptr))
4572 /* Hack -- Recover from fear */
4573 if(set_monster_monfear(p_ptr->riding,
4574 (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_MONFEAR(m_ptr) - 1)))
4576 GAME_TEXT m_name[MAX_NLEN];
4577 monster_desc(m_name, m_ptr, 0);
4578 msg_format(_("%^sを恐怖から立ち直らせた。", "%^s is no longer fear."), m_name);
4588 if (p_ptr->lightspeed)
4590 (void)set_lightspeed(p_ptr->lightspeed - 1, TRUE);
4592 if ((p_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
4594 if(P_PTR_KI < 40) P_PTR_KI = 0;
4595 else P_PTR_KI -= 40;
4596 p_ptr->update |= (PU_BONUS);
4598 if (p_ptr->action == ACTION_LEARN)
4601 u32b cost_frac = (p_ptr->msp + 30L) * 256L;
4603 /* Convert the unit (1/2^16) to (1/2^32) */
4604 s64b_LSHIFT(cost, cost_frac, 16);
4606 if (s64b_cmp(p_ptr->csp, p_ptr->csp_frac, cost, cost_frac) < 0)
4610 p_ptr->csp_frac = 0;
4611 set_action(ACTION_NONE);
4616 s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), cost, cost_frac);
4618 p_ptr->redraw |= PR_MANA;
4621 if (p_ptr->special_defense & KATA_MASK)
4623 if (p_ptr->special_defense & KATA_MUSOU)
4627 set_action(ACTION_NONE);
4632 p_ptr->redraw |= (PR_MANA);
4637 /*** Handle actual user input ***/
4639 /* Repeat until out of energy */
4640 while (p_ptr->energy_need <= 0)
4642 p_ptr->window |= PW_PLAYER;
4643 p_ptr->sutemi = FALSE;
4644 p_ptr->counter = FALSE;
4645 p_ptr->now_damaged = FALSE;
4649 /* Place the cursor on the player */
4650 move_cursor_relative(p_ptr->y, p_ptr->x);
4652 /* Refresh (optional) */
4653 if (fresh_before) Term_fresh();
4655 /* Hack -- Pack Overflow */
4658 /* Hack -- cancel "lurking browse mode" */
4659 if (!command_new) command_see = FALSE;
4661 /* Assume free current_world_ptr->game_turn */
4664 if (p_ptr->inside_battle)
4666 /* Place the cursor on the player */
4667 move_cursor_relative(p_ptr->y, p_ptr->x);
4669 command_cmd = SPECIAL_KEY_BUILDING;
4671 /* Process the command */
4675 /* Paralyzed or Knocked Out */
4676 else if (p_ptr->paralyzed || (p_ptr->stun >= 100))
4678 take_turn(p_ptr, 100);
4682 else if (p_ptr->action == ACTION_REST)
4685 if (p_ptr->resting > 0)
4687 /* Reduce rest count */
4690 if (!p_ptr->resting) set_action(ACTION_NONE);
4691 p_ptr->redraw |= (PR_STATE);
4694 take_turn(p_ptr, 100);
4698 else if (p_ptr->action == ACTION_FISH)
4700 take_turn(p_ptr, 100);
4704 else if (p_ptr->running)
4712 else if (travel.run)
4719 /* Repeated command */
4720 else if (command_rep)
4722 /* Count this execution */
4725 p_ptr->redraw |= (PR_STATE);
4728 /* Hack -- Assume messages were seen */
4731 /* Clear the top line */
4734 /* Process the command */
4738 /* Normal command */
4741 /* Place the cursor on the player */
4742 move_cursor_relative(p_ptr->y, p_ptr->x);
4745 /* Get a command (normal) */
4746 request_command(FALSE);
4749 /* Process the command */
4753 /* Hack -- Pack Overflow */
4759 if (p_ptr->energy_use)
4761 /* Use some energy */
4762 if (p_ptr->timewalk || p_ptr->energy_use > 400)
4764 /* The Randomness is irrelevant */
4765 p_ptr->energy_need += p_ptr->energy_use * TURNS_PER_TICK / 10;
4769 /* There is some randomness of needed energy */
4770 p_ptr->energy_need += (s16b)((s32b)p_ptr->energy_use * ENERGY_NEED() / 100L);
4773 /* Hack -- constant hallucination */
4774 if (p_ptr->image) p_ptr->redraw |= (PR_MAP);
4776 /* Shimmer multi-hued monsters */
4777 for (m_idx = 1; m_idx < current_floor_ptr->m_max; m_idx++)
4779 monster_type *m_ptr;
4780 monster_race *r_ptr;
4782 m_ptr = ¤t_floor_ptr->m_list[m_idx];
4783 if (!monster_is_valid(m_ptr)) continue;
4785 /* Skip unseen monsters */
4786 if (!m_ptr->ml) continue;
4788 /* Access the monster race */
4789 r_ptr = &r_info[m_ptr->ap_r_idx];
4791 /* Skip non-multi-hued monsters */
4792 if (!(r_ptr->flags1 & (RF1_ATTR_MULTI | RF1_SHAPECHANGER)))
4795 /* Redraw regardless */
4796 lite_spot(m_ptr->fy, m_ptr->fx);
4800 /* Handle monster detection */
4801 if (repair_monsters)
4803 /* Reset the flag */
4804 repair_monsters = FALSE;
4806 /* Rotate detection flags */
4807 for (m_idx = 1; m_idx < current_floor_ptr->m_max; m_idx++)
4809 monster_type *m_ptr;
4810 m_ptr = ¤t_floor_ptr->m_list[m_idx];
4811 if (!monster_is_valid(m_ptr)) continue;
4813 /* Nice monsters get mean */
4814 if (m_ptr->mflag & MFLAG_NICE)
4816 /* Nice monsters get mean */
4817 m_ptr->mflag &= ~(MFLAG_NICE);
4820 /* Handle memorized monsters */
4821 if (m_ptr->mflag2 & MFLAG2_MARK)
4823 /* Maintain detection */
4824 if (m_ptr->mflag2 & MFLAG2_SHOW)
4827 m_ptr->mflag2 &= ~(MFLAG2_SHOW);
4829 /* Still need repairs */
4830 repair_monsters = TRUE;
4833 /* Remove detection */
4837 m_ptr->mflag2 &= ~(MFLAG2_MARK);
4839 /* Assume invisible */
4841 update_monster(m_idx, FALSE);
4843 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
4844 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
4846 /* Redraw regardless */
4847 lite_spot(m_ptr->fy, m_ptr->fx);
4852 if (p_ptr->pclass == CLASS_IMITATOR)
4855 if (p_ptr->mane_num > (p_ptr->lev > 44 ? 3 : p_ptr->lev > 29 ? 2 : 1))
4858 for (j = 0; j < p_ptr->mane_num; j++)
4860 p_ptr->mane_spell[j] = p_ptr->mane_spell[j + 1];
4861 p_ptr->mane_dam[j] = p_ptr->mane_dam[j + 1];
4865 p_ptr->redraw |= (PR_IMITATION);
4867 if (p_ptr->action == ACTION_LEARN)
4870 p_ptr->redraw |= (PR_STATE);
4873 if (p_ptr->timewalk && (p_ptr->energy_need > - 1000))
4876 p_ptr->redraw |= (PR_MAP);
4877 p_ptr->update |= (PU_MONSTERS);
4878 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
4880 msg_print(_("「時は動きだす…」", "You feel time flowing around you once more."));
4882 p_ptr->timewalk = FALSE;
4883 p_ptr->energy_need = ENERGY_NEED();
4889 /* Hack -- notice death */
4890 if (!p_ptr->playing || p_ptr->is_dead)
4892 p_ptr->timewalk = FALSE;
4897 if (p_ptr->energy_use && reset_concent) reset_concentration(TRUE);
4899 /* Handle "leaving" */
4900 if (p_ptr->leaving) break;
4903 /* Update scent trail */
4908 * @brief 現在プレイヤーがいるダンジョンの全体処理 / Interact with the current dungeon level.
4912 * この関数から現在の階層を出る、プレイヤーがキャラが死ぬ、
4913 * ゲームを終了するかのいずれかまでループする。
4916 * This function will not exit until the level is completed,\n
4917 * the user dies, or the game is terminated.\n
4920 static void dungeon(bool load_game)
4924 /* Set the base level */
4925 current_floor_ptr->base_level = current_floor_ptr->dun_level;
4927 /* Reset various flags */
4928 current_world_ptr->is_loading_now = FALSE;
4931 p_ptr->leaving = FALSE;
4933 /* Reset the "command" vars */
4936 #if 0 /* Don't reset here --- It's used for Arena */
4945 /* Cancel the target */
4949 p_ptr->ambush_flag = FALSE;
4951 /* Cancel the health bar */
4954 /* Check visual effects */
4955 repair_monsters = TRUE;
4956 repair_objects = TRUE;
4959 disturb(TRUE, TRUE);
4961 /* Get index of current quest (if any) */
4962 quest_num = quest_number(current_floor_ptr->dun_level);
4964 /* Inside a quest? */
4967 /* Mark the quest monster */
4968 r_info[quest[quest_num].r_idx].flags1 |= RF1_QUESTOR;
4971 /* Track maximum player level */
4972 if (p_ptr->max_plv < p_ptr->lev)
4974 p_ptr->max_plv = p_ptr->lev;
4978 /* Track maximum dungeon level (if not in quest -KMW-) */
4979 if ((max_dlv[p_ptr->dungeon_idx] < current_floor_ptr->dun_level) && !p_ptr->inside_quest)
4981 max_dlv[p_ptr->dungeon_idx] = current_floor_ptr->dun_level;
4982 if (record_maxdepth) do_cmd_write_nikki(NIKKI_MAXDEAPTH, current_floor_ptr->dun_level, NULL);
4985 (void)calculate_upkeep();
4987 /* Validate the panel */
4988 panel_bounds_center();
4990 /* Verify the panel */
4996 /* Enter "xtra" mode */
4997 current_world_ptr->character_xtra = TRUE;
4999 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER | PW_MONSTER | PW_OVERHEAD | PW_DUNGEON);
5000 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_EQUIPPY | PR_MAP);
5001 p_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);
5005 /* Leave "xtra" mode */
5006 current_world_ptr->character_xtra = FALSE;
5008 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
5009 p_ptr->update |= (PU_COMBINE | PU_REORDER);
5013 if (quest_num && (is_fixed_quest_idx(quest_num) &&
5014 !((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT) ||
5015 !(quest[quest_num].flags & QUEST_FLAG_PRESET)))) do_cmd_feeling();
5017 if (p_ptr->inside_battle)
5021 p_ptr->energy_need = 0;
5022 update_gambling_monsters();
5026 msg_print(_("試合開始!", "Ready..Fight!"));
5031 if ((p_ptr->pclass == CLASS_BARD) && (SINGING_SONG_EFFECT(p_ptr) > MUSIC_DETECT))
5032 SINGING_SONG_EFFECT(p_ptr) = MUSIC_DETECT;
5034 /* Hack -- notice death or departure */
5035 if (!p_ptr->playing || p_ptr->is_dead) return;
5037 /* Print quest message if appropriate */
5038 if (!p_ptr->inside_quest && (p_ptr->dungeon_idx == DUNGEON_ANGBAND))
5040 quest_discovery(random_quest_number(current_floor_ptr->dun_level));
5041 p_ptr->inside_quest = random_quest_number(current_floor_ptr->dun_level);
5043 if ((current_floor_ptr->dun_level == d_info[p_ptr->dungeon_idx].maxdepth) && d_info[p_ptr->dungeon_idx].final_guardian)
5045 if (r_info[d_info[p_ptr->dungeon_idx].final_guardian].max_num)
5047 msg_format("この階には%sの主である%sが棲んでいる。",
5048 d_name+d_info[p_ptr->dungeon_idx].name,
5049 r_name+r_info[d_info[p_ptr->dungeon_idx].final_guardian].name);
5051 msg_format("%^s lives in this level as the keeper of %s.",
5052 r_name+r_info[d_info[p_ptr->dungeon_idx].final_guardian].name,
5053 d_name+d_info[p_ptr->dungeon_idx].name);
5057 if (!load_game && (p_ptr->special_defense & NINJA_S_STEALTH)) set_superstealth(FALSE);
5059 /*** Process this dungeon level ***/
5061 /* Reset the monster generation level */
5062 current_floor_ptr->monster_level = current_floor_ptr->base_level;
5064 /* Reset the object generation level */
5065 current_floor_ptr->object_level = current_floor_ptr->base_level;
5067 current_world_ptr->is_loading_now = TRUE;
5069 if (p_ptr->energy_need > 0 && !p_ptr->inside_battle &&
5070 (current_floor_ptr->dun_level || p_ptr->leaving_dungeon || p_ptr->inside_arena))
5071 p_ptr->energy_need = 0;
5073 /* Not leaving dungeon */
5074 p_ptr->leaving_dungeon = FALSE;
5076 /* Initialize monster process */
5082 /* Hack -- Compact the monster list occasionally */
5083 if ((current_floor_ptr->m_cnt + 32 > current_floor_ptr->max_m_idx) && !p_ptr->inside_battle) compact_monsters(64);
5085 /* Hack -- Compress the monster list occasionally */
5086 if ((current_floor_ptr->m_cnt + 32 < current_floor_ptr->m_max) && !p_ptr->inside_battle) compact_monsters(0);
5089 /* Hack -- Compact the object list occasionally */
5090 if (current_floor_ptr->o_cnt + 32 > current_floor_ptr->max_o_idx) compact_objects(64);
5092 /* Hack -- Compress the object list occasionally */
5093 if (current_floor_ptr->o_cnt + 32 < current_floor_ptr->o_max) compact_objects(0);
5095 /* Process the player */
5097 process_upkeep_with_speed();
5101 /* Hack -- Hilite the player */
5102 move_cursor_relative(p_ptr->y, p_ptr->x);
5104 /* Optional fresh */
5105 if (fresh_after) Term_fresh();
5107 /* Hack -- Notice death or departure */
5108 if (!p_ptr->playing || p_ptr->is_dead) break;
5110 /* Process all of the monsters */
5115 /* Hack -- Hilite the player */
5116 move_cursor_relative(p_ptr->y, p_ptr->x);
5118 /* Optional fresh */
5119 if (fresh_after) Term_fresh();
5121 /* Hack -- Notice death or departure */
5122 if (!p_ptr->playing || p_ptr->is_dead) break;
5124 /* Process the world */
5129 /* Hack -- Hilite the player */
5130 move_cursor_relative(p_ptr->y, p_ptr->x);
5132 /* Optional fresh */
5133 if (fresh_after) Term_fresh();
5135 /* Hack -- Notice death or departure */
5136 if (!p_ptr->playing || p_ptr->is_dead) break;
5138 /* Count game turns */
5139 current_world_ptr->game_turn++;
5141 if (current_world_ptr->dungeon_turn < current_world_ptr->dungeon_turn_limit)
5143 if (!p_ptr->wild_mode || wild_regen) current_world_ptr->dungeon_turn++;
5144 else if (p_ptr->wild_mode && !(current_world_ptr->game_turn % ((MAX_HGT + MAX_WID) / 2))) current_world_ptr->dungeon_turn++;
5147 prevent_turn_overflow();
5149 /* Handle "leaving" */
5150 if (p_ptr->leaving) break;
5152 if (wild_regen) wild_regen--;
5155 /* Inside a quest and non-unique questor? */
5156 if (quest_num && !(r_info[quest[quest_num].r_idx].flags1 & RF1_UNIQUE))
5158 /* Un-mark the quest monster */
5159 r_info[quest[quest_num].r_idx].flags1 &= ~RF1_QUESTOR;
5162 /* Not save-and-quit and not dead? */
5163 if (p_ptr->playing && !p_ptr->is_dead)
5166 * Maintain Unique monsters and artifact, save current
5167 * floor, then prepare next floor
5171 /* Forget the flag */
5172 reinit_wilderness = FALSE;
5175 /* Write about current level on the play record once per level */
5181 * @brief 全ユーザプロファイルをロードする / Load some "user pref files"
5184 * Modified by Arcum Dagsson to support
5185 * separate macro files for different realms.
5187 static void load_all_pref_files(void)
5191 /* Access the "user" pref file */
5192 sprintf(buf, "user.prf");
5194 /* Process that file */
5195 process_pref_file(buf);
5197 /* Access the "user" system pref file */
5198 sprintf(buf, "user-%s.prf", ANGBAND_SYS);
5200 /* Process that file */
5201 process_pref_file(buf);
5203 /* Access the "race" pref file */
5204 sprintf(buf, "%s.prf", rp_ptr->title);
5206 /* Process that file */
5207 process_pref_file(buf);
5209 /* Access the "class" pref file */
5210 sprintf(buf, "%s.prf", cp_ptr->title);
5212 /* Process that file */
5213 process_pref_file(buf);
5215 /* Access the "character" pref file */
5216 sprintf(buf, "%s.prf", p_ptr->base_name);
5218 /* Process that file */
5219 process_pref_file(buf);
5221 /* Access the "realm 1" pref file */
5222 if (p_ptr->realm1 != REALM_NONE)
5224 sprintf(buf, "%s.prf", realm_names[p_ptr->realm1]);
5226 /* Process that file */
5227 process_pref_file(buf);
5230 /* Access the "realm 2" pref file */
5231 if (p_ptr->realm2 != REALM_NONE)
5233 sprintf(buf, "%s.prf", realm_names[p_ptr->realm2]);
5235 /* Process that file */
5236 process_pref_file(buf);
5240 /* Load an autopick preference file */
5241 autopick_load_pref(FALSE);
5245 * @brief 1ゲームプレイの主要ルーチン / Actually play a game
5248 * If the "new_game" parameter is true, then, after loading the
5249 * savefile, we will commit suicide, if necessary, to allow the
5250 * player to start a new game.
5252 void play_game(bool new_game)
5255 bool load_game = TRUE;
5256 bool init_random_seed = FALSE;
5266 else if (chuukei_server)
5268 prepare_chuukei_hooks();
5279 p_ptr->hack_mutation = FALSE;
5281 /* Hack -- Character is "icky" */
5282 current_world_ptr->character_icky = TRUE;
5284 /* Make sure main term is active */
5285 Term_activate(angband_term[0]);
5287 /* Initialise the resize hooks */
5288 angband_term[0]->resize_hook = resize_map;
5290 for (i = 1; i < 8; i++)
5292 /* Does the term exist? */
5293 if (angband_term[i])
5295 /* Add the redraw on resize hook */
5296 angband_term[i]->resize_hook = redraw_window;
5300 /* Hack -- current_world_ptr->game_turn off the cursor */
5301 (void)Term_set_cursor(0);
5304 /* Attempt to load */
5307 quit(_("セーブファイルが壊れています", "broken savefile"));
5310 /* Extract the options */
5311 extract_option_vars();
5313 /* Report waited score */
5314 if (p_ptr->wait_report_score)
5319 if (!get_check_strict(_("待機していたスコア登録を今行ないますか?", "Do you register score now? "), CHECK_NO_HISTORY))
5322 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
5323 update_creature(p_ptr);
5325 p_ptr->is_dead = TRUE;
5327 start_time = (u32b)time(NULL);
5329 /* No suspending now */
5330 signals_ignore_tstp();
5332 /* Hack -- Character is now "icky" */
5333 current_world_ptr->character_icky = TRUE;
5335 /* Build the filename */
5336 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
5338 /* Open the high score file, for reading/writing */
5339 highscore_fd = fd_open(buf, O_RDWR);
5341 /* 町名消失バグ対策(#38205) Init the wilderness */
5342 process_dungeon_file("w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
5344 /* Handle score, show Top scores */
5345 success = send_world_score(TRUE);
5347 if (!success && !get_check_strict(_("スコア登録を諦めますか?", "Do you give up score registration? "), CHECK_NO_HISTORY))
5349 prt(_("引き続き待機します。", "standing by for future registration..."), 0, 0);
5354 p_ptr->wait_report_score = FALSE;
5356 if (!save_player()) msg_print(_("セーブ失敗!", "death save failed!"));
5358 /* Shut the high score file */
5359 (void)fd_close(highscore_fd);
5361 /* Forget the high score fd */
5364 /* Allow suspending now */
5365 signals_handle_tstp();
5370 current_world_ptr->creating_savefile = new_game;
5372 /* Nothing loaded */
5373 if (!current_world_ptr->character_loaded)
5375 /* Make new player */
5378 /* The dungeon is not ready */
5379 current_world_ptr->character_dungeon = FALSE;
5381 /* Prepare to init the RNG */
5382 init_random_seed = TRUE;
5384 /* Initialize the saved floors data */
5385 init_saved_floors(FALSE);
5388 /* Old game is loaded. But new game is requested. */
5391 /* Initialize the saved floors data */
5392 init_saved_floors(TRUE);
5395 /* Process old character */
5398 /* Process the player name */
5399 process_player_name(FALSE);
5403 if (init_random_seed)
5408 /* Roll new character */
5411 /* The dungeon is not ready */
5412 current_world_ptr->character_dungeon = FALSE;
5415 current_floor_ptr->dun_level = 0;
5416 p_ptr->inside_quest = 0;
5417 p_ptr->inside_arena = FALSE;
5418 p_ptr->inside_battle = FALSE;
5422 /* Hack -- seed for flavors */
5423 current_world_ptr->seed_flavor = randint0(0x10000000);
5425 /* Hack -- seed for town layout */
5426 current_world_ptr->seed_town = randint0(0x10000000);
5428 /* Roll up a new character */
5436 determine_bounty_uniques();
5437 determine_today_mon(FALSE);
5439 /* Initialize object array */
5444 write_level = FALSE;
5446 do_cmd_write_nikki(NIKKI_GAMESTART, 1,
5448 " ---- Restart Game ----"));
5451 * 1.0.9 以前はセーブ前に p_ptr->riding = -1 としていたので、再設定が必要だった。
5452 * もう不要だが、以前のセーブファイルとの互換のために残しておく。
5454 if (p_ptr->riding == -1)
5457 for (i = current_floor_ptr->m_max; i > 0; i--)
5459 if (player_bold(current_floor_ptr->m_list[i].fy, current_floor_ptr->m_list[i].fx))
5468 current_world_ptr->creating_savefile = FALSE;
5470 p_ptr->teleport_town = FALSE;
5471 p_ptr->sutemi = FALSE;
5472 current_world_ptr->timewalk_m_idx = 0;
5473 p_ptr->now_damaged = FALSE;
5475 start_time = time(NULL) - 1;
5476 record_o_name[0] = '\0';
5478 /* Reset map panel */
5479 panel_row_min = current_floor_ptr->height;
5480 panel_col_min = current_floor_ptr->width;
5482 /* Sexy gal gets bonus to maximum weapon skill of whip */
5483 if (p_ptr->pseikaku == SEIKAKU_SEXY)
5484 s_info[p_ptr->pclass].w_max[TV_HAFTED-TV_WEAPON_BEGIN][SV_WHIP] = WEAPON_EXP_MASTER;
5486 /* Fill the arrays of floors and walls in the good proportions */
5487 set_floor_and_wall(p_ptr->dungeon_idx);
5489 /* Flavor the objects */
5492 /* Flash a message */
5493 prt(_("お待ち下さい...", "Please wait..."), 0, 0);
5495 /* Flush the message */
5499 /* Hack -- Enter wizard mode */
5502 if (enter_wizard_mode())
5504 p_ptr->wizard = TRUE;
5506 if (p_ptr->is_dead || !p_ptr->y || !p_ptr->x)
5508 /* Initialize the saved floors data */
5509 init_saved_floors(TRUE);
5512 p_ptr->inside_quest = 0;
5514 /* Avoid crash in update_view() */
5515 p_ptr->y = p_ptr->x = 10;
5518 else if (p_ptr->is_dead)
5520 quit("Already dead.");
5524 /* Initialize the town-buildings if necessary */
5525 if (!current_floor_ptr->dun_level && !p_ptr->inside_quest)
5527 /* Init the wilderness */
5529 process_dungeon_file("w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
5532 init_flags = INIT_ONLY_BUILDINGS;
5534 process_dungeon_file("t_info.txt", 0, 0, MAX_HGT, MAX_WID);
5536 select_floor_music();
5540 /* Generate a dungeon level if needed */
5541 if (!current_world_ptr->character_dungeon)
5548 /* HACK -- Restore from panic-save */
5549 if (p_ptr->panic_save)
5551 /* No player? -- Try to regenerate floor */
5552 if (!p_ptr->y || !p_ptr->x)
5554 msg_print(_("プレイヤーの位置がおかしい。フロアを再生成します。", "What a strange player location. Regenerate the dungeon floor."));
5558 /* Still no player? -- Try to locate random place */
5559 if (!p_ptr->y || !p_ptr->x) p_ptr->y = p_ptr->x = 10;
5561 /* No longer in panic */
5562 p_ptr->panic_save = 0;
5566 /* Character is now "complete" */
5567 current_world_ptr->character_generated = TRUE;
5570 /* Hack -- Character is no longer "icky" */
5571 current_world_ptr->character_icky = FALSE;
5577 sprintf(buf, _("%sに降り立った。", "You are standing in the %s."), map_name());
5578 do_cmd_write_nikki(NIKKI_BUNSHOU, 0, buf);
5583 p_ptr->playing = TRUE;
5585 /* Reset the visual mappings */
5588 /* Load the "pref" files */
5589 load_all_pref_files();
5591 /* Give startup outfit (after loading pref files) */
5597 /* React to changes */
5598 Term_xtra(TERM_XTRA_REACT, 0);
5600 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
5601 p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
5604 /* Set or clear "rogue_like_commands" if requested */
5605 if (arg_force_original) rogue_like_commands = FALSE;
5606 if (arg_force_roguelike) rogue_like_commands = TRUE;
5608 /* Hack -- Enforce "delayed death" */
5609 if (p_ptr->chp < 0) p_ptr->is_dead = TRUE;
5611 if (p_ptr->prace == RACE_ANDROID) calc_android_exp();
5613 if (new_game && ((p_ptr->pclass == CLASS_CAVALRY) || (p_ptr->pclass == CLASS_BEASTMASTER)))
5615 monster_type *m_ptr;
5616 IDX pet_r_idx = ((p_ptr->pclass == CLASS_CAVALRY) ? MON_HORSE : MON_YASE_HORSE);
5617 monster_race *r_ptr = &r_info[pet_r_idx];
5618 place_monster_aux(0, p_ptr->y, p_ptr->x - 1, pet_r_idx,
5619 (PM_FORCE_PET | PM_NO_KAGE));
5620 m_ptr = ¤t_floor_ptr->m_list[hack_m_idx_ii];
5621 m_ptr->mspeed = r_ptr->speed;
5622 m_ptr->maxhp = r_ptr->hdice*(r_ptr->hside+1)/2;
5623 m_ptr->max_maxhp = m_ptr->maxhp;
5624 m_ptr->hp = r_ptr->hdice*(r_ptr->hside+1)/2;
5625 m_ptr->dealt_damage = 0;
5626 m_ptr->energy_need = ENERGY_NEED() + ENERGY_NEED();
5629 (void)combine_and_reorder_home(STORE_HOME);
5630 (void)combine_and_reorder_home(STORE_MUSEUM);
5632 select_floor_music();
5637 /* Process the level */
5640 /* Hack -- prevent "icky" message */
5641 current_world_ptr->character_xtra = TRUE;
5645 current_world_ptr->character_xtra = FALSE;
5647 /* Cancel the target */
5650 /* Cancel the health bar */
5657 /* Handle "quit and save" */
5658 if (!p_ptr->playing && !p_ptr->is_dead) break;
5660 /* Erase the old current_floor_ptr->grid_array */
5662 if (!p_ptr->is_dead) wipe_m_list();
5669 /* Accidental Death */
5670 if (p_ptr->playing && p_ptr->is_dead)
5672 if (p_ptr->inside_arena)
5674 p_ptr->inside_arena = FALSE;
5675 if (p_ptr->arena_number > MAX_ARENA_MONS)
5676 p_ptr->arena_number++;
5678 p_ptr->arena_number = -1 - p_ptr->arena_number;
5679 p_ptr->is_dead = FALSE;
5681 p_ptr->chp_frac = 0;
5682 p_ptr->exit_bldg = TRUE;
5685 /* Leave through the exit */
5686 prepare_change_floor_mode(CFM_SAVE_FLOORS | CFM_RAND_CONNECT);
5688 /* prepare next floor */
5693 /* Mega-Hack -- Allow player to cheat death */
5694 if ((p_ptr->wizard || cheat_live) && !get_check(_("死にますか? ", "Die? ")))
5701 /* Handle "death" */
5702 if (p_ptr->is_dead) break;
5704 /* Make a new level */
5716 * @brief ゲームターンからの実時間換算を行うための補正をかける
5717 * @param hoge ゲームターン
5718 * @details アンデッド種族は18:00からゲームを開始するので、この修正を予め行う。
5719 * @return 修正をかけた後のゲームターン
5721 s32b turn_real(s32b hoge)
5723 switch (p_ptr->start_race)
5729 return hoge - (TURNS_PER_TICK * TOWN_DAWN * 3 / 4);
5736 * @brief ターンのオーバーフローに対する対処
5737 * @details ターン及びターンを記録する変数をターンの限界の1日前まで巻き戻す.
5738 * @return 修正をかけた後のゲームターン
5740 void prevent_turn_overflow(void)
5742 int rollback_days, i, j;
5743 s32b rollback_turns;
5745 if (current_world_ptr->game_turn < current_world_ptr->game_turn_limit) return;
5747 rollback_days = 1 + (current_world_ptr->game_turn - current_world_ptr->game_turn_limit) / (TURNS_PER_TICK * TOWN_DAWN);
5748 rollback_turns = TURNS_PER_TICK * TOWN_DAWN * rollback_days;
5750 if (current_world_ptr->game_turn > rollback_turns) current_world_ptr->game_turn -= rollback_turns;
5751 else current_world_ptr->game_turn = 1;
5752 if (current_floor_ptr->generated_turn > rollback_turns) current_floor_ptr->generated_turn -= rollback_turns;
5753 else current_floor_ptr->generated_turn = 1;
5754 if (current_world_ptr->arena_start_turn > rollback_turns) current_world_ptr->arena_start_turn -= rollback_turns;
5755 else current_world_ptr->arena_start_turn = 1;
5756 if (p_ptr->feeling_turn > rollback_turns) p_ptr->feeling_turn -= rollback_turns;
5757 else p_ptr->feeling_turn = 1;
5759 for (i = 1; i < max_towns; i++)
5761 for (j = 0; j < MAX_STORES; j++)
5763 store_type *st_ptr = &town_info[i].store[j];
5765 if (st_ptr->last_visit > -10L * TURNS_PER_TICK * STORE_TICKS)
5767 st_ptr->last_visit -= rollback_turns;
5768 if (st_ptr->last_visit < -10L * TURNS_PER_TICK * STORE_TICKS) st_ptr->last_visit = -10L * TURNS_PER_TICK * STORE_TICKS;
5771 if (st_ptr->store_open)
5773 st_ptr->store_open -= rollback_turns;
5774 if (st_ptr->store_open < 1) st_ptr->store_open = 1;
5782 * Close up the current game (player may or may not be dead)
5786 * This function is called only from "main.c" and "signals.c".
5789 void close_game(void)
5792 bool do_send = TRUE;
5794 /* concptr p = "[i:キャラクタの情報, f:ファイル書き出し, t:スコア, x:*鑑定*, ESC:ゲーム終了]"; */
5797 /* Flush the messages */
5800 /* Flush the input */
5804 /* No suspending now */
5805 signals_ignore_tstp();
5808 /* Hack -- Character is now "icky" */
5809 current_world_ptr->character_icky = TRUE;
5812 /* Build the filename */
5813 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
5815 /* Grab permissions */
5818 /* Open the high score file, for reading/writing */
5819 highscore_fd = fd_open(buf, O_RDWR);
5821 /* Drop permissions */
5827 /* Handle retirement */
5828 if (p_ptr->total_winner) kingly();
5831 if (!cheat_save || get_check(_("死んだデータをセーブしますか? ", "Save death? ")))
5833 if (!save_player()) msg_print(_("セーブ失敗!", "death save failed!"));
5835 else do_send = FALSE;
5842 /* Show more info */
5848 if ((!send_world_score(do_send)))
5850 if (get_check_strict(_("後でスコアを登録するために待機しますか?", "Stand by for later score registration? "),
5851 (CHECK_NO_ESCAPE | CHECK_NO_HISTORY)))
5853 p_ptr->wait_report_score = TRUE;
5854 p_ptr->is_dead = FALSE;
5855 if (!save_player()) msg_print(_("セーブ失敗!", "death save failed!"));
5858 if (!p_ptr->wait_report_score)
5861 else if (highscore_fd >= 0)
5863 display_scores_aux(0, 10, -1, NULL);
5866 /* Dump bones file */
5875 do_cmd_save_game(FALSE);
5877 /* Prompt for scores */
5878 prt(_("リターンキーか ESC キーを押して下さい。", "Press Return (or Escape)."), 0, 40);
5879 play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_EXIT);
5881 /* Predict score (or ESCAPE) */
5882 if (inkey() != ESCAPE) predict_score();
5886 /* Shut the high score file */
5887 (void)fd_close(highscore_fd);
5889 /* Forget the high score fd */
5892 /* Kill all temporal files */
5893 clear_saved_floor_files();
5895 /* Allow suspending now */
5896 signals_handle_tstp();