3 @brief Angbandゲームエンジン / Angband game engine
6 Copyright (c) 1989 James E. Wilson, Robert A. Koeneke\n
7 This software may be copied and distributed for educational, research, and\n
8 not for profit purposes provided that this copyright and statement are\n
9 included in all such copies.\n
10 2013 Deskull rearranged comment for Doxygen.
23 #include "cmd-activate.h"
26 #include "cmd-hissatsu.h"
28 #include "cmd-magiceat.h"
30 #include "cmd-quaff.h"
32 #include "cmd-smith.h"
33 #include "cmd-usestaff.h"
34 #include "cmd-zaprod.h"
35 #include "cmd-zapwand.h"
37 #include "cmd-basic.h"
43 #include "floor-events.h"
44 #include "floor-town.h"
46 #include "object-ego.h"
47 #include "object-curse.h"
48 #include "object-flavor.h"
51 #include "spells-summon.h"
52 #include "spells-object.h"
53 #include "spells-status.h"
54 #include "spells-floor.h"
55 #include "monster-spell.h"
62 #include "player-move.h"
63 #include "player-status.h"
64 #include "player-class.h"
65 #include "player-race.h"
66 #include "player-personality.h"
67 #include "player-damage.h"
68 #include "player-effects.h"
69 #include "cmd-spell.h"
70 #include "realm-hex.h"
71 #include "objectkind.h"
72 #include "object-hook.h"
74 #include "monster-process.h"
75 #include "monster-status.h"
76 #include "monsterrace-hook.h"
77 #include "floor-save.h"
79 #include "player-skill.h"
80 #include "player-inventory.h"
82 #include "view-mainwindow.h"
83 #include "dungeon-file.h"
89 #include "realm-song.h"
90 #include "targeting.h"
94 * Hack -- Link a copyright message into the executable
96 const concptr copyright[5] =
98 "Copyright (c) 1989 James E. Wilson, Robert A. Keoneke",
100 "This software may be copied and distributed for educational, research,",
101 "and not for profit purposes provided that this copyright and statement",
102 "are included in all such copies."
105 bool can_save = FALSE; /* Game can be saved */
107 COMMAND_CODE now_message;
109 bool repair_monsters; /* Hack -- optimize detect monsters */
110 bool repair_objects; /* Hack -- optimize detect objects */
112 concptr ANGBAND_SYS = "xxx"; //!< Hack -- The special Angband "System Suffix" This variable is used to choose an appropriate "pref-xxx" file
115 concptr ANGBAND_KEYBOARD = "JAPAN"; //!< Hack -- The special Angband "Keyboard Suffix" This variable is used to choose an appropriate macro-trigger definition
117 concptr ANGBAND_KEYBOARD = "0";
120 concptr ANGBAND_GRAF = "ascii"; //!< Hack -- The special Angband "Graphics Suffix" This variable is used to choose an appropriate "graf-xxx" file
122 static bool load = TRUE; /*!<ロード処理中の分岐フラグ*/
123 static int wild_regen = 20; /*!<広域マップ移動時の自然回復処理カウンタ(広域マップ1マス毎に20回処理を基本とする)*/
126 * Flags for initialization
131 * @brief 擬似鑑定を実際に行い判定を反映する
132 * @param slot 擬似鑑定を行うプレイヤーの所持リストID
133 * @param heavy 重度の擬似鑑定を行うならばTRUE
136 static void sense_inventory_aux(INVENTORY_IDX slot, bool heavy)
139 object_type *o_ptr = &p_ptr->inventory_list[slot];
140 GAME_TEXT o_name[MAX_NLEN];
142 /* We know about it already, do not tell us again */
143 if (o_ptr->ident & (IDENT_SENSE))return;
145 /* It is fully known, no information needed */
146 if (object_is_known(o_ptr)) return;
148 /* Check for a feeling */
149 feel = (heavy ? value_check_aux1(o_ptr) : value_check_aux2(o_ptr));
151 /* Skip non-feelings */
155 if ((p_ptr->muta3 & MUT3_BAD_LUCK) && !randint0(13))
166 feel = FEEL_EXCELLENT;
172 feel = randint0(3) ? FEEL_GOOD : FEEL_AVERAGE;
174 feel = FEEL_UNCURSED;
179 feel = randint0(2) ? FEEL_CURSED : FEEL_GOOD;
185 feel = randint0(3) ? FEEL_CURSED : FEEL_AVERAGE;
192 feel = FEEL_WORTHLESS;
197 feel = FEEL_TERRIBLE;
203 /* Stop everything */
204 if (disturb_minor) disturb(FALSE, FALSE);
206 /* Get an object description */
207 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
209 /* Message (equipment) */
210 if (slot >= INVEN_RARM)
213 msg_format("%s%s(%c)は%sという感じがする...",
214 describe_use(slot),o_name, index_to_label(slot),game_inscriptions[feel]);
216 msg_format("You feel the %s (%c) you are %s %s %s...",
217 o_name, index_to_label(slot), describe_use(slot),
218 ((o_ptr->number == 1) ? "is" : "are"),
219 game_inscriptions[feel]);
224 /* Message (p_ptr->inventory_list) */
228 msg_format("ザックの中の%s(%c)は%sという感じがする...",
229 o_name, index_to_label(slot),game_inscriptions[feel]);
231 msg_format("You feel the %s (%c) in your pack %s %s...",
232 o_name, index_to_label(slot),
233 ((o_ptr->number == 1) ? "is" : "are"),
234 game_inscriptions[feel]);
239 o_ptr->ident |= (IDENT_SENSE);
241 /* Set the "inscription" */
242 o_ptr->feeling = feel;
244 /* Auto-inscription/destroy */
245 autopick_alter_item(slot, destroy_feeling);
246 p_ptr->update |= (PU_COMBINE | PU_REORDER);
248 p_ptr->window |= (PW_INVEN | PW_EQUIP);
254 * @brief 1プレイヤーターン毎に武器、防具の擬似鑑定が行われるかを判定する。
257 * Sense the p_ptr->inventory_list\n
259 * Class 0 = Warrior --> fast and heavy\n
260 * Class 1 = Mage --> slow and light\n
261 * Class 2 = Priest --> fast but light\n
262 * Class 3 = Rogue --> okay and heavy\n
263 * Class 4 = Ranger --> slow but heavy (changed!)\n
264 * Class 5 = Paladin --> slow but heavy\n
266 static void sense_inventory1(void)
269 PLAYER_LEVEL plev = p_ptr->lev;
274 /*** Check for "sensing" ***/
276 /* No sensing when confused */
277 if (p_ptr->confused) return;
279 /* Analyze the class */
280 switch (p_ptr->pclass)
288 if (0 != randint0(9000L / (plev * plev + 40))) return;
299 if (0 != randint0(6000L / (plev * plev + 50))) return;
308 case CLASS_HIGH_MAGE:
310 case CLASS_MAGIC_EATER:
312 /* Very bad (light) sensing */
313 if (0 != randint0(240000L / (plev + 5))) return;
321 /* Good (light) sensing */
322 if (0 != randint0(10000L / (plev * plev + 40))) return;
331 if (0 != randint0(20000L / (plev * plev + 40))) return;
342 if (0 != randint0(95000L / (plev * plev + 40))) return;
354 if (0 != randint0(77777L / (plev * plev + 40))) return;
362 case CLASS_WARRIOR_MAGE:
366 if (0 != randint0(75000L / (plev * plev + 40))) return;
371 case CLASS_MINDCRAFTER:
373 case CLASS_BLUE_MAGE:
374 case CLASS_MIRROR_MASTER:
377 if (0 != randint0(55000L / (plev * plev + 40))) return;
382 case CLASS_CHAOS_WARRIOR:
385 if (0 != randint0(80000L / (plev * plev + 40))) return;
394 case CLASS_FORCETRAINER:
397 if (0 != randint0(20000L / (plev * plev + 40))) return;
405 if (0 != randint0(20000L / ((plev+50)*(plev+50)))) return;
413 case CLASS_BEASTMASTER:
416 if (0 != randint0(65000L / (plev * plev + 40))) return;
420 case CLASS_BERSERKER:
429 if (compare_virtue(p_ptr, V_KNOWLEDGE, 100, VIRTUE_LARGE)) heavy = TRUE;
431 /*** Sense everything ***/
433 /* Check everything */
434 for (i = 0; i < INVEN_TOTAL; i++)
438 o_ptr = &p_ptr->inventory_list[i];
440 /* Skip empty slots */
441 if (!o_ptr->k_idx) continue;
443 /* Valid "tval" codes */
470 /* Skip non-sense machines */
473 /* Occasional failure on p_ptr->inventory_list items */
474 if ((i < INVEN_RARM) && (0 != randint0(5))) continue;
477 if ((p_ptr->muta3 & MUT3_GOOD_LUCK) && !randint0(13))
482 sense_inventory_aux(i, heavy);
487 * @brief 1プレイヤーターン毎に武器、防具以外の擬似鑑定が行われるかを判定する。
490 static void sense_inventory2(void)
493 PLAYER_LEVEL plev = p_ptr->lev;
497 /*** Check for "sensing" ***/
499 /* No sensing when confused */
500 if (p_ptr->confused) return;
502 /* Analyze the class */
503 switch (p_ptr->pclass)
509 case CLASS_BERSERKER:
517 case CLASS_CHAOS_WARRIOR:
519 case CLASS_BEASTMASTER:
522 /* Very bad (light) sensing */
523 if (0 != randint0(240000L / (plev + 5))) return;
529 case CLASS_WARRIOR_MAGE:
534 if (0 != randint0(95000L / (plev * plev + 40))) return;
542 case CLASS_FORCETRAINER:
543 case CLASS_MINDCRAFTER:
546 if (0 != randint0(20000L / (plev * plev + 40))) return;
552 case CLASS_HIGH_MAGE:
554 case CLASS_MAGIC_EATER:
555 case CLASS_MIRROR_MASTER:
556 case CLASS_BLUE_MAGE:
559 if (0 != randint0(9000L / (plev * plev + 40))) return;
567 if (0 != randint0(20000L / ((plev+50)*(plev+50)))) return;
573 /*** Sense everything ***/
575 /* Check everything */
576 for (i = 0; i < INVEN_TOTAL; i++)
580 o_ptr = &p_ptr->inventory_list[i];
582 /* Skip empty slots */
583 if (!o_ptr->k_idx) continue;
585 /* Valid "tval" codes */
598 /* Skip non-sense machines */
601 /* Occasional failure on p_ptr->inventory_list items */
602 if ((i < INVEN_RARM) && (0 != randint0(5))) continue;
604 sense_inventory_aux(i, TRUE);
609 * @brief パターン終点到達時のテレポート処理を行う
612 static void pattern_teleport(void)
615 DEPTH max_level = 99;
618 if (get_check(_("他の階にテレポートしますか?", "Teleport level? ")))
623 /* Only downward in ironman mode */
624 if (ironman_downward)
625 min_level = current_floor_ptr->dun_level;
628 if (p_ptr->dungeon_idx == DUNGEON_ANGBAND)
630 if (current_floor_ptr->dun_level > 100)
631 max_level = MAX_DEPTH - 1;
632 else if (current_floor_ptr->dun_level == 100)
637 max_level = d_info[p_ptr->dungeon_idx].maxdepth;
638 min_level = d_info[p_ptr->dungeon_idx].mindepth;
642 sprintf(ppp, _("テレポート先:(%d-%d)", "Teleport to level (%d-%d): "), (int)min_level, (int)max_level);
645 sprintf(tmp_val, "%d", (int)current_floor_ptr->dun_level);
647 /* Ask for a level */
648 if (!get_string(ppp, tmp_val, 10)) return;
650 /* Extract request */
651 command_arg = (COMMAND_ARG)atoi(tmp_val);
653 else if (get_check(_("通常テレポート?", "Normal teleport? ")))
655 teleport_player(200, 0L);
662 if (command_arg < min_level) command_arg = (COMMAND_ARG)min_level;
663 if (command_arg > max_level) command_arg = (COMMAND_ARG)max_level;
666 msg_format(_("%d 階にテレポートしました。", "You teleport to dungeon level %d."), command_arg);
668 if (autosave_l) do_cmd_save_game(TRUE);
671 current_floor_ptr->dun_level = command_arg;
675 if (record_stair) exe_write_diary(p_ptr, NIKKI_PAT_TELE, 0, NULL);
677 p_ptr->inside_quest = 0;
681 * Clear all saved floors
682 * and create a first saved floor
684 prepare_change_floor_mode(CFM_FIRST_FLOOR);
685 p_ptr->leaving = TRUE;
689 * @brief 各種パターン地形上の特別な処理 / Returns TRUE if we are on the Pattern...
690 * @return 実際にパターン地形上にプレイヤーが居た場合はTRUEを返す。
692 static bool pattern_effect(void)
696 if (!pattern_tile(p_ptr->y, p_ptr->x)) return FALSE;
698 if ((PRACE_IS_(p_ptr, RACE_AMBERITE)) &&
699 (p_ptr->cut > 0) && one_in_(10))
701 wreck_the_pattern(p_ptr);
704 pattern_type = f_info[current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].feat].subtype;
706 switch (pattern_type)
708 case PATTERN_TILE_END:
709 (void)set_image(p_ptr, 0);
710 (void)restore_all_status();
711 (void)restore_level(p_ptr);
712 (void)cure_critical_wounds(1000);
714 cave_set_feat(p_ptr->y, p_ptr->x, feat_pattern_old);
715 msg_print(_("「パターン」のこの部分は他の部分より強力でないようだ。", "This section of the Pattern looks less powerful."));
718 * We could make the healing effect of the
719 * Pattern center one-time only to avoid various kinds
720 * of abuse, like luring the win monster into fighting you
721 * in the middle of the pattern...
725 case PATTERN_TILE_OLD:
729 case PATTERN_TILE_TELEPORT:
733 case PATTERN_TILE_WRECKED:
735 take_hit(p_ptr, DAMAGE_NOESCAPE, 200, _("壊れた「パターン」を歩いたダメージ", "walking the corrupted Pattern"), -1);
739 if (PRACE_IS_(p_ptr, RACE_AMBERITE) && !one_in_(2))
741 else if (!IS_INVULN())
742 take_hit(p_ptr, DAMAGE_NOESCAPE, damroll(1, 3), _("「パターン」を歩いたダメージ", "walking the Pattern"), -1);
751 * @brief プレイヤーのHP自然回復処理 / Regenerate hit points -RAK-
752 * @param percent 回復比率
755 static void regenhp(int percent)
761 if (p_ptr->special_defense & KATA_KOUKIJIN) return;
762 if (p_ptr->action == ACTION_HAYAGAKE) return;
764 /* Save the old hitpoints */
765 old_chp = p_ptr->chp;
768 * Extract the new hitpoints
770 * 'percent' is the Regen factor in unit (1/2^16)
773 new_chp_frac = (p_ptr->mhp * percent + PY_REGEN_HPBASE);
775 /* Convert the unit (1/2^16) to (1/2^32) */
776 s64b_LSHIFT(new_chp, new_chp_frac, 16);
779 s64b_add(&(p_ptr->chp), &(p_ptr->chp_frac), new_chp, new_chp_frac);
783 if (0 < s64b_cmp(p_ptr->chp, p_ptr->chp_frac, p_ptr->mhp, 0))
785 p_ptr->chp = p_ptr->mhp;
790 if (old_chp != p_ptr->chp)
792 p_ptr->redraw |= (PR_HP);
793 p_ptr->window |= (PW_PLAYER);
800 * @brief プレイヤーのMP自然回復処理(regen_magic()のサブセット) / Regenerate mana points
801 * @param upkeep_factor ペット維持によるMPコスト量
802 * @param regen_amount 回復量
805 static void regenmana(MANA_POINT upkeep_factor, MANA_POINT regen_amount)
807 MANA_POINT old_csp = p_ptr->csp;
808 s32b regen_rate = regen_amount * 100 - upkeep_factor * PY_REGEN_NORMAL;
811 * Excess mana will decay 32 times faster than normal
814 if (p_ptr->csp > p_ptr->msp)
816 /* PY_REGEN_NORMAL is the Regen factor in unit (1/2^16) */
818 u32b decay_frac = (p_ptr->msp * 32 * PY_REGEN_NORMAL + PY_REGEN_MNBASE);
820 /* Convert the unit (1/2^16) to (1/2^32) */
821 s64b_LSHIFT(decay, decay_frac, 16);
824 s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), decay, decay_frac);
827 if (p_ptr->csp < p_ptr->msp)
829 p_ptr->csp = p_ptr->msp;
834 /* Regenerating mana (unless the player has excess mana) */
835 else if (regen_rate > 0)
837 /* (percent/100) is the Regen factor in unit (1/2^16) */
838 MANA_POINT new_mana = 0;
839 u32b new_mana_frac = (p_ptr->msp * regen_rate / 100 + PY_REGEN_MNBASE);
841 /* Convert the unit (1/2^16) to (1/2^32) */
842 s64b_LSHIFT(new_mana, new_mana_frac, 16);
845 s64b_add(&(p_ptr->csp), &(p_ptr->csp_frac), new_mana, new_mana_frac);
847 /* Must set frac to zero even if equal */
848 if (p_ptr->csp >= p_ptr->msp)
850 p_ptr->csp = p_ptr->msp;
856 /* Reduce mana (even when the player has excess mana) */
859 /* PY_REGEN_NORMAL is the Regen factor in unit (1/2^16) */
860 s32b reduce_mana = 0;
861 u32b reduce_mana_frac = (p_ptr->msp * (-1) * regen_rate / 100 + PY_REGEN_MNBASE);
863 /* Convert the unit (1/2^16) to (1/2^32) */
864 s64b_LSHIFT(reduce_mana, reduce_mana_frac, 16);
867 s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), reduce_mana, reduce_mana_frac);
877 if (old_csp != p_ptr->csp)
879 p_ptr->redraw |= (PR_MANA);
880 p_ptr->window |= (PW_PLAYER);
881 p_ptr->window |= (PW_SPELL);
887 * @brief プレイヤーのMP自然回復処理 / Regenerate magic regen_amount: PY_REGEN_NORMAL * 2 (if resting) * 2 (if having regenarate)
888 * @param regen_amount 回復量
891 static void regenmagic(int regen_amount)
896 int mult = (dev + adj_mag_mana[p_ptr->stat_ind[A_INT]]); /* x1 to x2 speed bonus for recharging */
898 for (i = 0; i < EATER_EXT*2; i++)
900 if (!p_ptr->magic_num2[i]) continue;
901 if (p_ptr->magic_num1[i] == ((long)p_ptr->magic_num2[i] << 16)) continue;
903 /* Increase remaining charge number like float value */
904 new_mana = (regen_amount * mult * ((long)p_ptr->magic_num2[i] + 13)) / (dev * 8);
905 p_ptr->magic_num1[i] += new_mana;
907 /* Check maximum charge */
908 if (p_ptr->magic_num1[i] > (p_ptr->magic_num2[i] << 16))
910 p_ptr->magic_num1[i] = ((long)p_ptr->magic_num2[i] << 16);
914 for (i = EATER_EXT*2; i < EATER_EXT*3; i++)
916 if (!p_ptr->magic_num1[i]) continue;
917 if (!p_ptr->magic_num2[i]) continue;
919 /* Decrease remaining period for charging */
920 new_mana = (regen_amount * mult * ((long)p_ptr->magic_num2[i] + 10) * EATER_ROD_CHARGE)
921 / (dev * 16 * PY_REGEN_NORMAL);
922 p_ptr->magic_num1[i] -= new_mana;
924 /* Check minimum remaining period for charging */
925 if (p_ptr->magic_num1[i] < 0) p_ptr->magic_num1[i] = 0;
932 * @brief 100ゲームターン毎のモンスターのHP自然回復処理 / Regenerate the monsters (once per 100 game turns)
934 * @note Should probably be done during monster turns.
936 static void regen_monsters(void)
941 /* Regenerate everyone */
942 for (i = 1; i < current_floor_ptr->m_max; i++)
944 /* Check the i'th monster */
945 monster_type *m_ptr = ¤t_floor_ptr->m_list[i];
946 monster_race *r_ptr = &r_info[m_ptr->r_idx];
948 if (!monster_is_valid(m_ptr)) continue;
950 /* Allow regeneration (if needed) */
951 if (m_ptr->hp < m_ptr->maxhp)
953 /* Hack -- Base regeneration */
954 frac = m_ptr->maxhp / 100;
956 /* Hack -- Minimal regeneration rate */
957 if (!frac) if (one_in_(2)) frac = 1;
959 /* Hack -- Some monsters regenerate quickly */
960 if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2;
962 /* Hack -- Regenerate */
965 /* Do not over-regenerate */
966 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
968 /* Redraw (later) if needed */
969 if (p_ptr->health_who == i) p_ptr->redraw |= (PR_HEALTH);
970 if (p_ptr->riding == i) p_ptr->redraw |= (PR_UHEALTH);
977 * @brief 30ゲームターン毎のボール中モンスターのHP自然回復処理 / Regenerate the captured monsters (once per 30 game turns)
979 * @note Should probably be done during monster turns.
981 static void regen_captured_monsters(void)
986 /* Regenerate everyone */
987 for (i = 0; i < INVEN_TOTAL; i++)
990 object_type *o_ptr = &p_ptr->inventory_list[i];
992 if (!o_ptr->k_idx) continue;
993 if (o_ptr->tval != TV_CAPTURE) continue;
994 if (!o_ptr->pval) continue;
998 r_ptr = &r_info[o_ptr->pval];
1000 /* Allow regeneration (if needed) */
1001 if (o_ptr->xtra4 < o_ptr->xtra5)
1003 /* Hack -- Base regeneration */
1004 frac = o_ptr->xtra5 / 100;
1006 /* Hack -- Minimal regeneration rate */
1007 if (!frac) if (one_in_(2)) frac = 1;
1009 /* Hack -- Some monsters regenerate quickly */
1010 if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2;
1012 /* Hack -- Regenerate */
1013 o_ptr->xtra4 += (XTRA16)frac;
1015 /* Do not over-regenerate */
1016 if (o_ptr->xtra4 > o_ptr->xtra5) o_ptr->xtra4 = o_ptr->xtra5;
1023 p_ptr->update |= (PU_COMBINE);
1024 p_ptr->window |= (PW_INVEN);
1025 p_ptr->window |= (PW_EQUIP);
1031 * @brief 寿命つき光源の警告メッセージ処理
1032 * @param o_ptr 現在光源として使っているオブジェクトの構造体参照ポインタ
1035 static void notice_lite_change(object_type *o_ptr)
1037 /* Hack -- notice interesting fuel steps */
1038 if ((o_ptr->xtra4 < 100) || (!(o_ptr->xtra4 % 100)))
1040 p_ptr->window |= (PW_EQUIP);
1043 /* Hack -- Special treatment when blind */
1046 /* Hack -- save some light for later */
1047 if (o_ptr->xtra4 == 0) o_ptr->xtra4++;
1050 /* The light is now out */
1051 else if (o_ptr->xtra4 == 0)
1053 disturb(FALSE, TRUE);
1054 msg_print(_("明かりが消えてしまった!", "Your light has gone out!"));
1056 /* Recalculate torch radius */
1057 p_ptr->update |= (PU_TORCH);
1059 /* Some ego light lose its effects without fuel */
1060 p_ptr->update |= (PU_BONUS);
1063 /* The light is getting dim */
1064 else if (o_ptr->name2 == EGO_LITE_LONG)
1066 if ((o_ptr->xtra4 < 50) && (!(o_ptr->xtra4 % 5))
1067 && (current_world_ptr->game_turn % (TURNS_PER_TICK*2)))
1069 if (disturb_minor) disturb(FALSE, TRUE);
1070 msg_print(_("明かりが微かになってきている。", "Your light is growing faint."));
1074 /* The light is getting dim */
1075 else if ((o_ptr->xtra4 < 100) && (!(o_ptr->xtra4 % 10)))
1077 if (disturb_minor) disturb(FALSE, TRUE);
1078 msg_print(_("明かりが微かになってきている。", "Your light is growing faint."));
1084 * @brief !!を刻んだ魔道具の時間経過による再充填を知らせる処理 / If player has inscribed the object with "!!", let him know when it's recharged. -LM-
1085 * @param o_ptr 対象オブジェクトの構造体参照ポインタ
1088 static void recharged_notice(object_type *o_ptr)
1090 GAME_TEXT o_name[MAX_NLEN];
1094 /* No inscription */
1095 if (!o_ptr->inscription) return;
1098 s = my_strchr(quark_str(o_ptr->inscription), '!');
1100 /* Process notification request. */
1103 /* Find another '!' */
1106 /* Describe (briefly) */
1107 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1109 /* Notify the player */
1111 msg_format("%sは再充填された。", o_name);
1113 if (o_ptr->number > 1)
1114 msg_format("Your %s are recharged.", o_name);
1116 msg_format("Your %s is recharged.", o_name);
1119 disturb(FALSE, FALSE);
1125 /* Keep looking for '!'s */
1126 s = my_strchr(s + 1, '!');
1131 * @brief プレイヤーの歌に関する継続処理
1134 static void check_music(void)
1136 const magic_type *s_ptr;
1138 MANA_POINT need_mana;
1139 u32b need_mana_frac;
1141 /* Music singed by player */
1142 if (p_ptr->pclass != CLASS_BARD) return;
1143 if (!SINGING_SONG_EFFECT(p_ptr) && !INTERUPTING_SONG_EFFECT(p_ptr)) return;
1145 if (p_ptr->anti_magic)
1147 stop_singing(p_ptr);
1151 spell = SINGING_SONG_ID(p_ptr);
1152 s_ptr = &technic_info[REALM_MUSIC - MIN_TECHNIC][spell];
1154 need_mana = mod_need_mana(s_ptr->smana, spell, REALM_MUSIC);
1158 s64b_RSHIFT(need_mana, need_mana_frac, 1);
1160 if (s64b_cmp(p_ptr->csp, p_ptr->csp_frac, need_mana, need_mana_frac) < 0)
1162 stop_singing(p_ptr);
1167 s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), need_mana, need_mana_frac);
1169 p_ptr->redraw |= PR_MANA;
1170 if (INTERUPTING_SONG_EFFECT(p_ptr))
1172 SINGING_SONG_EFFECT(p_ptr) = INTERUPTING_SONG_EFFECT(p_ptr);
1173 INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;
1174 msg_print(_("歌を再開した。", "You restart singing."));
1175 p_ptr->action = ACTION_SING;
1176 p_ptr->update |= (PU_BONUS | PU_HP | PU_MONSTERS);
1177 p_ptr->redraw |= (PR_MAP | PR_STATUS | PR_STATE);
1178 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
1181 if (p_ptr->spell_exp[spell] < SPELL_EXP_BEGINNER)
1182 p_ptr->spell_exp[spell] += 5;
1183 else if(p_ptr->spell_exp[spell] < SPELL_EXP_SKILLED)
1184 { 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; }
1185 else if(p_ptr->spell_exp[spell] < SPELL_EXP_EXPERT)
1186 { 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; }
1187 else if(p_ptr->spell_exp[spell] < SPELL_EXP_MASTER)
1188 { 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; }
1190 /* Do any effects of continual song */
1191 exe_spell(REALM_MUSIC, spell, SPELL_CONT);
1195 * @brief 現在呪いを保持している装備品を一つランダムに探し出す / Choose one of items that have cursed flag
1196 * @param flag 探し出したい呪いフラグ配列
1197 * @return 該当の呪いが一つでもあった場合にランダムに選ばれた装備品のオブジェクト構造体参照ポインタを返す。\n
1200 static object_type *choose_cursed_obj_name(BIT_FLAGS flag)
1203 int choices[INVEN_TOTAL-INVEN_RARM];
1206 /* Paranoia -- Player has no warning-item */
1207 if (!(p_ptr->cursed & flag)) return NULL;
1209 /* Search Inventry */
1210 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
1212 object_type *o_ptr = &p_ptr->inventory_list[i];
1214 if (o_ptr->curse_flags & flag)
1216 choices[number] = i;
1219 else if ((flag == TRC_ADD_L_CURSE) ||
1220 (flag == TRC_ADD_H_CURSE) ||
1221 (flag == TRC_DRAIN_HP) ||
1222 (flag == TRC_DRAIN_MANA) ||
1223 (flag == TRC_CALL_ANIMAL) ||
1224 (flag == TRC_CALL_DEMON) ||
1225 (flag == TRC_CALL_DRAGON) ||
1226 (flag == TRC_CALL_UNDEAD) ||
1227 (flag == TRC_COWARDICE) ||
1228 (flag == TRC_LOW_MELEE) ||
1229 (flag == TRC_LOW_AC) ||
1230 (flag == TRC_LOW_MAGIC) ||
1231 (flag == TRC_FAST_DIGEST) ||
1232 (flag == TRC_SLOW_REGEN) )
1235 BIT_FLAGS flgs[TR_FLAG_SIZE];
1236 object_flags(o_ptr, flgs);
1239 case TRC_ADD_L_CURSE : cf = TR_ADD_L_CURSE; break;
1240 case TRC_ADD_H_CURSE : cf = TR_ADD_H_CURSE; break;
1241 case TRC_DRAIN_HP : cf = TR_DRAIN_HP; break;
1242 case TRC_DRAIN_MANA : cf = TR_DRAIN_MANA; break;
1243 case TRC_CALL_ANIMAL : cf = TR_CALL_ANIMAL; break;
1244 case TRC_CALL_DEMON : cf = TR_CALL_DEMON; break;
1245 case TRC_CALL_DRAGON : cf = TR_CALL_DRAGON; break;
1246 case TRC_CALL_UNDEAD : cf = TR_CALL_UNDEAD; break;
1247 case TRC_COWARDICE : cf = TR_COWARDICE; break;
1248 case TRC_LOW_MELEE : cf = TR_LOW_MELEE; break;
1249 case TRC_LOW_AC : cf = TR_LOW_AC; break;
1250 case TRC_LOW_MAGIC : cf = TR_LOW_MAGIC; break;
1251 case TRC_FAST_DIGEST : cf = TR_FAST_DIGEST; break;
1252 case TRC_SLOW_REGEN : cf = TR_SLOW_REGEN; break;
1255 if (have_flag(flgs, cf))
1257 choices[number] = i;
1263 /* Choice one of them */
1264 return (&p_ptr->inventory_list[choices[randint0(number)]]);
1267 static void process_world_aux_digestion(void)
1269 if (!p_ptr->phase_out)
1271 /* Digest quickly when gorged */
1272 if (p_ptr->food >= PY_FOOD_MAX)
1274 /* Digest a lot of food */
1275 (void)set_food(p_ptr, p_ptr->food - 100);
1278 /* Digest normally -- Every 50 game turns */
1279 else if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 5)))
1281 /* Basic digestion rate based on speed */
1282 int digestion = SPEED_TO_ENERGY(p_ptr->pspeed);
1284 /* Regeneration takes more food */
1285 if (p_ptr->regenerate)
1287 if (p_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1289 if (p_ptr->cursed & TRC_FAST_DIGEST)
1292 /* Slow digestion takes less food */
1293 if (p_ptr->slow_digest)
1296 /* Minimal digestion */
1297 if (digestion < 1) digestion = 1;
1298 /* Maximal digestion */
1299 if (digestion > 100) digestion = 100;
1301 /* Digest some food */
1302 (void)set_food(p_ptr, p_ptr->food - digestion);
1307 if ((p_ptr->food < PY_FOOD_FAINT))
1309 /* Faint occasionally */
1310 if (!p_ptr->paralyzed && (randint0(100) < 10))
1312 msg_print(_("あまりにも空腹で気絶してしまった。", "You faint from the lack of food."));
1313 disturb(TRUE, TRUE);
1315 /* Hack -- faint (bypass free action) */
1316 (void)set_paralyzed(p_ptr, p_ptr->paralyzed + 1 + randint0(5));
1319 /* Starve to death (slowly) */
1320 if (p_ptr->food < PY_FOOD_STARVE)
1322 /* Calculate damage */
1323 HIT_POINT dam = (PY_FOOD_STARVE - p_ptr->food) / 10;
1325 if (!IS_INVULN()) take_hit(p_ptr, DAMAGE_LOSELIFE, dam, _("空腹", "starvation"), -1);
1332 * @brief 10ゲームターンが進行するごとにプレイヤーのHPとMPの増減処理を行う。
1333 * / Handle timed damage and regeneration every 10 game turns
1336 static void process_world_aux_hp_and_sp(void)
1338 feature_type *f_ptr = &f_info[current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].feat];
1339 bool cave_no_regen = FALSE;
1340 int upkeep_factor = 0;
1342 /* Default regeneration */
1343 int regen_amount = PY_REGEN_NORMAL;
1346 /*** Damage over Time ***/
1348 /* Take damage from poison */
1349 if (p_ptr->poisoned && !IS_INVULN())
1351 take_hit(p_ptr, DAMAGE_NOESCAPE, 1, _("毒", "poison"), -1);
1354 /* Take damage from cuts */
1355 if (p_ptr->cut && !IS_INVULN())
1359 /* Mortal wound or Deep Gash */
1360 if (p_ptr->cut > 1000)
1365 else if (p_ptr->cut > 200)
1371 else if (p_ptr->cut > 100)
1376 else if (p_ptr->cut > 50)
1381 else if (p_ptr->cut > 25)
1386 else if (p_ptr->cut > 10)
1397 take_hit(p_ptr, DAMAGE_NOESCAPE, dam, _("致命傷", "a fatal wound"), -1);
1400 /* (Vampires) Take damage from sunlight */
1401 if (PRACE_IS_(p_ptr, RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE))
1403 if (!current_floor_ptr->dun_level && !p_ptr->resist_lite && !IS_INVULN() && is_daytime())
1405 if ((current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
1407 msg_print(_("日光があなたのアンデッドの肉体を焼き焦がした!", "The sun's rays scorch your undead flesh!"));
1408 take_hit(p_ptr, DAMAGE_NOESCAPE, 1, _("日光", "sunlight"), -1);
1409 cave_no_regen = TRUE;
1413 if (p_ptr->inventory_list[INVEN_LITE].tval && (p_ptr->inventory_list[INVEN_LITE].name2 != EGO_LITE_DARKNESS) &&
1414 !p_ptr->resist_lite)
1416 object_type * o_ptr = &p_ptr->inventory_list[INVEN_LITE];
1417 GAME_TEXT o_name [MAX_NLEN];
1418 char ouch [MAX_NLEN+40];
1420 /* Get an object description */
1421 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1422 msg_format(_("%sがあなたのアンデッドの肉体を焼き焦がした!", "The %s scorches your undead flesh!"), o_name);
1424 cave_no_regen = TRUE;
1426 /* Get an object description */
1427 object_desc(o_name, o_ptr, OD_NAME_ONLY);
1428 sprintf(ouch, _("%sを装備したダメージ", "wielding %s"), o_name);
1430 if (!IS_INVULN()) take_hit(p_ptr, DAMAGE_NOESCAPE, 1, ouch, -1);
1434 if (have_flag(f_ptr->flags, FF_LAVA) && !IS_INVULN() && !p_ptr->immune_fire)
1438 if (have_flag(f_ptr->flags, FF_DEEP))
1440 damage = 6000 + randint0(4000);
1442 else if (!p_ptr->levitation)
1444 damage = 3000 + randint0(2000);
1449 if(PRACE_IS_(p_ptr, RACE_ENT)) damage += damage / 3;
1450 if(p_ptr->resist_fire) damage = damage / 3;
1451 if(IS_OPPOSE_FIRE()) damage = damage / 3;
1452 if(p_ptr->levitation) damage = damage / 5;
1454 damage = damage / 100 + (randint0(100) < (damage % 100));
1456 if (p_ptr->levitation)
1458 msg_print(_("熱で火傷した!", "The heat burns you!"));
1459 take_hit(p_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1460 f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1);
1464 concptr name = f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name;
1465 msg_format(_("%sで火傷した!", "The %s burns you!"), name);
1466 take_hit(p_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1469 cave_no_regen = TRUE;
1473 if (have_flag(f_ptr->flags, FF_COLD_PUDDLE) && !IS_INVULN() && !p_ptr->immune_cold)
1477 if (have_flag(f_ptr->flags, FF_DEEP))
1479 damage = 6000 + randint0(4000);
1481 else if (!p_ptr->levitation)
1483 damage = 3000 + randint0(2000);
1488 if (p_ptr->resist_cold) damage = damage / 3;
1489 if (IS_OPPOSE_COLD()) damage = damage / 3;
1490 if (p_ptr->levitation) damage = damage / 5;
1492 damage = damage / 100 + (randint0(100) < (damage % 100));
1494 if (p_ptr->levitation)
1496 msg_print(_("冷気に覆われた!", "The cold engulfs you!"));
1497 take_hit(p_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1498 f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1);
1502 concptr name = f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name;
1503 msg_format(_("%sに凍えた!", "The %s frostbites you!"), name);
1504 take_hit(p_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1507 cave_no_regen = TRUE;
1511 if (have_flag(f_ptr->flags, FF_ELEC_PUDDLE) && !IS_INVULN() && !p_ptr->immune_elec)
1515 if (have_flag(f_ptr->flags, FF_DEEP))
1517 damage = 6000 + randint0(4000);
1519 else if (!p_ptr->levitation)
1521 damage = 3000 + randint0(2000);
1526 if (p_ptr->resist_elec) damage = damage / 3;
1527 if (IS_OPPOSE_ELEC()) damage = damage / 3;
1528 if (p_ptr->levitation) damage = damage / 5;
1530 damage = damage / 100 + (randint0(100) < (damage % 100));
1532 if (p_ptr->levitation)
1534 msg_print(_("電撃を受けた!", "The electric shocks you!"));
1535 take_hit(p_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1536 f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1);
1540 concptr name = f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name;
1541 msg_format(_("%sに感電した!", "The %s shocks you!"), name);
1542 take_hit(p_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1545 cave_no_regen = TRUE;
1549 if (have_flag(f_ptr->flags, FF_ACID_PUDDLE) && !IS_INVULN() && !p_ptr->immune_acid)
1553 if (have_flag(f_ptr->flags, FF_DEEP))
1555 damage = 6000 + randint0(4000);
1557 else if (!p_ptr->levitation)
1559 damage = 3000 + randint0(2000);
1564 if (p_ptr->resist_acid) damage = damage / 3;
1565 if (IS_OPPOSE_ACID()) damage = damage / 3;
1566 if (p_ptr->levitation) damage = damage / 5;
1568 damage = damage / 100 + (randint0(100) < (damage % 100));
1570 if (p_ptr->levitation)
1572 msg_print(_("酸が飛び散った!", "The acid melt you!"));
1573 take_hit(p_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1574 f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1);
1578 concptr name = f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name;
1579 msg_format(_("%sに溶かされた!", "The %s melts you!"), name);
1580 take_hit(p_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1583 cave_no_regen = TRUE;
1587 if (have_flag(f_ptr->flags, FF_POISON_PUDDLE) && !IS_INVULN())
1591 if (have_flag(f_ptr->flags, FF_DEEP))
1593 damage = 6000 + randint0(4000);
1595 else if (!p_ptr->levitation)
1597 damage = 3000 + randint0(2000);
1602 if (p_ptr->resist_pois) damage = damage / 3;
1603 if (IS_OPPOSE_POIS()) damage = damage / 3;
1604 if (p_ptr->levitation) damage = damage / 5;
1606 damage = damage / 100 + (randint0(100) < (damage % 100));
1608 if (p_ptr->levitation)
1610 msg_print(_("毒気を吸い込んだ!", "The gas poisons you!"));
1611 take_hit(p_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1612 f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1);
1613 if (p_ptr->resist_pois) (void)set_poisoned(p_ptr, p_ptr->poisoned + 1);
1617 concptr name = f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name;
1618 msg_format(_("%sに毒された!", "The %s poisons you!"), name);
1619 take_hit(p_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1620 if (p_ptr->resist_pois) (void)set_poisoned(p_ptr, p_ptr->poisoned + 3);
1623 cave_no_regen = TRUE;
1627 if (have_flag(f_ptr->flags, FF_WATER) && have_flag(f_ptr->flags, FF_DEEP) &&
1628 !p_ptr->levitation && !p_ptr->can_swim && !p_ptr->resist_water)
1630 if (p_ptr->total_weight > weight_limit(p_ptr))
1632 msg_print(_("溺れている!", "You are drowning!"));
1633 take_hit(p_ptr, DAMAGE_NOESCAPE, randint1(p_ptr->lev), _("溺れ", "drowning"), -1);
1634 cave_no_regen = TRUE;
1641 if ((r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].flags2 & RF2_AURA_FIRE) && !p_ptr->immune_fire)
1643 damage = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level / 2;
1644 if (PRACE_IS_(p_ptr, RACE_ENT)) damage += damage / 3;
1645 if (p_ptr->resist_fire) damage = damage / 3;
1646 if (IS_OPPOSE_FIRE()) damage = damage / 3;
1647 msg_print(_("熱い!", "It's hot!"));
1648 take_hit(p_ptr, DAMAGE_NOESCAPE, damage, _("炎のオーラ", "Fire aura"), -1);
1650 if ((r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].flags2 & RF2_AURA_ELEC) && !p_ptr->immune_elec)
1652 damage = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level / 2;
1653 if (PRACE_IS_(p_ptr, RACE_ANDROID)) damage += damage / 3;
1654 if (p_ptr->resist_elec) damage = damage / 3;
1655 if (IS_OPPOSE_ELEC()) damage = damage / 3;
1656 msg_print(_("痛い!", "It hurts!"));
1657 take_hit(p_ptr, DAMAGE_NOESCAPE, damage, _("電気のオーラ", "Elec aura"), -1);
1659 if ((r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].flags3 & RF3_AURA_COLD) && !p_ptr->immune_cold)
1661 damage = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level / 2;
1662 if (p_ptr->resist_cold) damage = damage / 3;
1663 if (IS_OPPOSE_COLD()) damage = damage / 3;
1664 msg_print(_("冷たい!", "It's cold!"));
1665 take_hit(p_ptr, DAMAGE_NOESCAPE, damage, _("冷気のオーラ", "Cold aura"), -1);
1669 /* Spectres -- take damage when moving through walls */
1671 * Added: ANYBODY takes damage if inside through walls
1672 * without wraith form -- NOTE: Spectres will never be
1673 * reduced below 0 hp by being inside a stone wall; others
1676 if (!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY))
1678 if (!IS_INVULN() && !p_ptr->wraith_form && !p_ptr->kabenuke && ((p_ptr->chp > (p_ptr->lev / 5)) || !p_ptr->pass_wall))
1681 cave_no_regen = TRUE;
1683 if (p_ptr->pass_wall)
1685 msg_print(_("体の分子が分解した気がする!", "Your molecules feel disrupted!"));
1686 dam_desc = _("密度", "density");
1690 msg_print(_("崩れた岩に押し潰された!", "You are being crushed!"));
1691 dam_desc = _("硬い岩", "solid rock");
1694 take_hit(p_ptr, DAMAGE_NOESCAPE, 1 + (p_ptr->lev / 5), dam_desc, -1);
1699 /*** handle regeneration ***/
1702 if (p_ptr->food < PY_FOOD_WEAK)
1704 /* Lower regeneration */
1705 if (p_ptr->food < PY_FOOD_STARVE)
1709 else if (p_ptr->food < PY_FOOD_FAINT)
1711 regen_amount = PY_REGEN_FAINT;
1715 regen_amount = PY_REGEN_WEAK;
1719 /* Are we walking the pattern? */
1720 if (pattern_effect())
1722 cave_no_regen = TRUE;
1726 /* Regeneration ability */
1727 if (p_ptr->regenerate)
1729 regen_amount = regen_amount * 2;
1731 if (p_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1735 if (p_ptr->cursed & TRC_SLOW_REGEN)
1742 /* Searching or Resting */
1743 if ((p_ptr->action == ACTION_SEARCH) || (p_ptr->action == ACTION_REST))
1745 regen_amount = regen_amount * 2;
1748 upkeep_factor = calculate_upkeep(p_ptr);
1750 /* No regeneration while special action */
1751 if ((p_ptr->action == ACTION_LEARN) ||
1752 (p_ptr->action == ACTION_HAYAGAKE) ||
1753 (p_ptr->special_defense & KATA_KOUKIJIN))
1755 upkeep_factor += 100;
1758 /* Regenerate the mana */
1759 regenmana(upkeep_factor, regen_amount);
1762 /* Recharge magic eater's power */
1763 if (p_ptr->pclass == CLASS_MAGIC_EATER)
1765 regenmagic(regen_amount);
1768 if ((p_ptr->csp == 0) && (p_ptr->csp_frac == 0))
1770 while (upkeep_factor > 100)
1772 msg_print(_("こんなに多くのペットを制御できない!", "Too many pets to control at once!"));
1774 do_cmd_pet_dismiss();
1776 upkeep_factor = calculate_upkeep(p_ptr);
1778 msg_format(_("維持MPは %d%%", "Upkeep: %d%% mana."), upkeep_factor);
1783 /* Poisoned or cut yields no healing */
1784 if (p_ptr->poisoned) regen_amount = 0;
1785 if (p_ptr->cut) regen_amount = 0;
1787 /* Special floor -- Pattern, in a wall -- yields no healing */
1788 if (cave_no_regen) regen_amount = 0;
1790 regen_amount = (regen_amount * p_ptr->mutant_regenerate_mod) / 100;
1792 /* Regenerate Hit Points if needed */
1793 if ((p_ptr->chp < p_ptr->mhp) && !cave_no_regen)
1795 regenhp(regen_amount);
1800 * @brief 10ゲームターンが進行するごとに魔法効果の残りターンを減らしていく処理
1801 * / Handle timeout every 10 game turns
1804 static void process_world_aux_timeout(void)
1806 const int dec_count = (easy_band ? 2 : 1);
1808 /*** Timeout Various Things ***/
1811 if (p_ptr->tim_mimic)
1813 (void)set_mimic(p_ptr, p_ptr->tim_mimic - 1, p_ptr->mimic_form, TRUE);
1816 /* Hack -- Hallucinating */
1819 (void)set_image(p_ptr, p_ptr->image - dec_count);
1825 (void)set_blind(p_ptr, p_ptr->blind - dec_count);
1828 /* Times see-invisible */
1829 if (p_ptr->tim_invis)
1831 (void)set_tim_invis(p_ptr, p_ptr->tim_invis - 1, TRUE);
1834 if (p_ptr->suppress_multi_reward)
1836 p_ptr->suppress_multi_reward = FALSE;
1842 (void)set_tim_esp(p_ptr, p_ptr->tim_esp - 1, TRUE);
1845 /* Timed temporary elemental brands. -LM- */
1846 if (p_ptr->ele_attack)
1848 p_ptr->ele_attack--;
1850 /* Clear all temporary elemental brands. */
1851 if (!p_ptr->ele_attack) set_ele_attack(p_ptr, 0, 0);
1854 /* Timed temporary elemental immune. -LM- */
1855 if (p_ptr->ele_immune)
1857 p_ptr->ele_immune--;
1859 /* Clear all temporary elemental brands. */
1860 if (!p_ptr->ele_immune) set_ele_immune(p_ptr, 0, 0);
1863 /* Timed infra-vision */
1864 if (p_ptr->tim_infra)
1866 (void)set_tim_infra(p_ptr, p_ptr->tim_infra - 1, TRUE);
1870 if (p_ptr->tim_stealth)
1872 (void)set_tim_stealth(p_ptr, p_ptr->tim_stealth - 1, TRUE);
1875 /* Timed levitation */
1876 if (p_ptr->tim_levitation)
1878 (void)set_tim_levitation(p_ptr, p_ptr->tim_levitation - 1, TRUE);
1881 /* Timed sh_touki */
1882 if (p_ptr->tim_sh_touki)
1884 (void)set_tim_sh_touki(p_ptr, p_ptr->tim_sh_touki - 1, TRUE);
1888 if (p_ptr->tim_sh_fire)
1890 (void)set_tim_sh_fire(p_ptr, p_ptr->tim_sh_fire - 1, TRUE);
1894 if (p_ptr->tim_sh_holy)
1896 (void)set_tim_sh_holy(p_ptr, p_ptr->tim_sh_holy - 1, TRUE);
1900 if (p_ptr->tim_eyeeye)
1902 (void)set_tim_eyeeye(p_ptr, p_ptr->tim_eyeeye - 1, TRUE);
1905 /* Timed resist-magic */
1906 if (p_ptr->resist_magic)
1908 (void)set_resist_magic(p_ptr, p_ptr->resist_magic - 1, TRUE);
1911 /* Timed regeneration */
1912 if (p_ptr->tim_regen)
1914 (void)set_tim_regen(p_ptr, p_ptr->tim_regen - 1, TRUE);
1917 /* Timed resist nether */
1918 if (p_ptr->tim_res_nether)
1920 (void)set_tim_res_nether(p_ptr, p_ptr->tim_res_nether - 1, TRUE);
1923 /* Timed resist time */
1924 if (p_ptr->tim_res_time)
1926 (void)set_tim_res_time(p_ptr, p_ptr->tim_res_time - 1, TRUE);
1930 if (p_ptr->tim_reflect)
1932 (void)set_tim_reflect(p_ptr, p_ptr->tim_reflect - 1, TRUE);
1936 if (p_ptr->multishadow)
1938 (void)set_multishadow(p_ptr, p_ptr->multishadow - 1, TRUE);
1941 /* Timed Robe of dust */
1942 if (p_ptr->dustrobe)
1944 (void)set_dustrobe(p_ptr, p_ptr->dustrobe - 1, TRUE);
1947 /* Timed infra-vision */
1948 if (p_ptr->kabenuke)
1950 (void)set_kabenuke(p_ptr, p_ptr->kabenuke - 1, TRUE);
1954 if (p_ptr->paralyzed)
1956 (void)set_paralyzed(p_ptr, p_ptr->paralyzed - dec_count);
1960 if (p_ptr->confused)
1962 (void)set_confused(p_ptr, p_ptr->confused - dec_count);
1968 (void)set_afraid(p_ptr, p_ptr->afraid - dec_count);
1974 (void)set_fast(p_ptr, p_ptr->fast - 1, TRUE);
1980 (void)set_slow(p_ptr, p_ptr->slow - dec_count, TRUE);
1983 /* Protection from evil */
1984 if (p_ptr->protevil)
1986 (void)set_protevil(p_ptr, p_ptr->protevil - 1, TRUE);
1989 /* Invulnerability */
1992 (void)set_invuln(p_ptr, p_ptr->invuln - 1, TRUE);
1996 if (p_ptr->wraith_form)
1998 (void)set_wraith_form(p_ptr, p_ptr->wraith_form - 1, TRUE);
2004 (void)set_hero(p_ptr, p_ptr->hero - 1, TRUE);
2010 (void)set_shero(p_ptr, p_ptr->shero - 1, TRUE);
2016 (void)set_blessed(p_ptr, p_ptr->blessed - 1, TRUE);
2022 (void)set_shield(p_ptr, p_ptr->shield - 1, TRUE);
2026 if (p_ptr->tsubureru)
2028 (void)set_tsubureru(p_ptr, p_ptr->tsubureru - 1, TRUE);
2032 if (p_ptr->magicdef)
2034 (void)set_magicdef(p_ptr, p_ptr->magicdef - 1, TRUE);
2038 if (p_ptr->tsuyoshi)
2040 (void)set_tsuyoshi(p_ptr, p_ptr->tsuyoshi - 1, TRUE);
2044 if (p_ptr->oppose_acid)
2046 (void)set_oppose_acid(p_ptr, p_ptr->oppose_acid - 1, TRUE);
2049 /* Oppose Lightning */
2050 if (p_ptr->oppose_elec)
2052 (void)set_oppose_elec(p_ptr, p_ptr->oppose_elec - 1, TRUE);
2056 if (p_ptr->oppose_fire)
2058 (void)set_oppose_fire(p_ptr, p_ptr->oppose_fire - 1, TRUE);
2062 if (p_ptr->oppose_cold)
2064 (void)set_oppose_cold(p_ptr, p_ptr->oppose_cold - 1, TRUE);
2068 if (p_ptr->oppose_pois)
2070 (void)set_oppose_pois(p_ptr, p_ptr->oppose_pois - 1, TRUE);
2075 (void)set_ultimate_res(p_ptr, p_ptr->ult_res - 1, TRUE);
2078 /*** Poison and Stun and Cut ***/
2081 if (p_ptr->poisoned)
2083 int adjust = adj_con_fix[p_ptr->stat_ind[A_CON]] + 1;
2085 /* Apply some healing */
2086 (void)set_poisoned(p_ptr, p_ptr->poisoned - adjust);
2092 int adjust = adj_con_fix[p_ptr->stat_ind[A_CON]] + 1;
2094 /* Apply some healing */
2095 (void)set_stun(p_ptr, p_ptr->stun - adjust);
2101 int adjust = adj_con_fix[p_ptr->stat_ind[A_CON]] + 1;
2103 /* Hack -- Truly "mortal" wound */
2104 if (p_ptr->cut > 1000) adjust = 0;
2106 /* Apply some healing */
2107 (void)set_cut(p_ptr,p_ptr->cut - adjust);
2113 * @brief 10ゲームターンが進行する毎に光源の寿命を減らす処理
2114 * / Handle burning fuel every 10 game turns
2117 static void process_world_aux_light(void)
2119 /* Check for light being wielded */
2120 object_type *o_ptr = &p_ptr->inventory_list[INVEN_LITE];
2122 /* Burn some fuel in the current lite */
2123 if (o_ptr->tval == TV_LITE)
2125 /* Hack -- Use some fuel (except on artifacts) */
2126 if (!(object_is_fixed_artifact(o_ptr) || o_ptr->sval == SV_LITE_FEANOR) && (o_ptr->xtra4 > 0))
2128 /* Decrease life-span */
2129 if (o_ptr->name2 == EGO_LITE_LONG)
2131 if (current_world_ptr->game_turn % (TURNS_PER_TICK*2)) o_ptr->xtra4--;
2133 else o_ptr->xtra4--;
2135 /* Notice interesting fuel steps */
2136 notice_lite_change(o_ptr);
2143 * @brief 10ゲームターンが進行するごとに突然変異の発動判定を行う処理
2144 * / Handle mutation effects once every 10 game turns
2147 static void process_world_aux_mutation(void)
2149 /* No mutation with effects */
2150 if (!p_ptr->muta2) return;
2152 /* No effect on monster arena */
2153 if (p_ptr->phase_out) return;
2155 /* No effect on the global map */
2156 if (p_ptr->wild_mode) return;
2158 if ((p_ptr->muta2 & MUT2_BERS_RAGE) && one_in_(3000))
2160 disturb(FALSE, TRUE);
2161 msg_print(_("ウガァァア!", "RAAAAGHH!"));
2162 msg_print(_("激怒の発作に襲われた!", "You feel a fit of rage coming over you!"));
2163 (void)set_shero(p_ptr, 10 + randint1(p_ptr->lev), FALSE);
2164 (void)set_afraid(p_ptr, 0);
2167 if ((p_ptr->muta2 & MUT2_COWARDICE) && (randint1(3000) == 13))
2169 if (!p_ptr->resist_fear)
2171 disturb(FALSE, TRUE);
2172 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
2173 set_afraid(p_ptr, p_ptr->afraid + 13 + randint1(26));
2177 if ((p_ptr->muta2 & MUT2_RTELEPORT) && (randint1(5000) == 88))
2179 if (!p_ptr->resist_nexus && !(p_ptr->muta1 & MUT1_VTELEPORT) && !p_ptr->anti_tele)
2181 disturb(FALSE, TRUE);
2182 msg_print(_("あなたの位置は突然ひじょうに不確定になった...", "Your position suddenly seems very uncertain..."));
2184 teleport_player(40, TELEPORT_PASSIVE);
2188 if ((p_ptr->muta2 & MUT2_ALCOHOL) && (randint1(6400) == 321))
2190 if (!p_ptr->resist_conf && !p_ptr->resist_chaos)
2192 disturb(FALSE, TRUE);
2193 p_ptr->redraw |= PR_EXTRA;
2194 msg_print(_("いひきがもーろーとひてきたきがふる...ヒック!", "You feel a SSSCHtupor cOmINg over yOu... *HIC*!"));
2197 if (!p_ptr->resist_conf)
2199 (void)set_confused(p_ptr, p_ptr->confused + randint0(20) + 15);
2202 if (!p_ptr->resist_chaos)
2207 if (one_in_(3)) lose_all_info(p_ptr);
2209 (void)teleport_player_aux(100, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE);
2211 msg_print(_("あなたは見知らぬ場所で目が醒めた...頭が痛い。", "You wake up somewhere with a sore head..."));
2212 msg_print(_("何も覚えていない。どうやってここに来たかも分からない!", "You can't remember a thing, or how you got here!"));
2218 msg_print(_("き~れいなちょおちょらとんれいる~", "Thishcischs GooDSChtuff!"));
2219 (void)set_image(p_ptr, p_ptr->image + randint0(150) + 150);
2225 if ((p_ptr->muta2 & MUT2_HALLU) && (randint1(6400) == 42))
2227 if (!p_ptr->resist_chaos)
2229 disturb(FALSE, TRUE);
2230 p_ptr->redraw |= PR_EXTRA;
2231 (void)set_image(p_ptr, p_ptr->image + randint0(50) + 20);
2235 if ((p_ptr->muta2 & MUT2_FLATULENT) && (randint1(3000) == 13))
2237 disturb(FALSE, TRUE);
2238 msg_print(_("ブゥーーッ!おっと。", "BRRAAAP! Oops."));
2240 fire_ball(GF_POIS, 0, p_ptr->lev, 3);
2243 if ((p_ptr->muta2 & MUT2_PROD_MANA) &&
2244 !p_ptr->anti_magic && one_in_(9000))
2247 disturb(FALSE, TRUE);
2248 msg_print(_("魔法のエネルギーが突然あなたの中に流れ込んできた!エネルギーを解放しなければならない!",
2249 "Magical energy flows through you! You must release it!"));
2253 (void)get_hack_dir(&dire);
2254 fire_ball(GF_MANA, dire, p_ptr->lev * 2, 3);
2257 if ((p_ptr->muta2 & MUT2_ATT_DEMON) && !p_ptr->anti_magic && (randint1(6666) == 666))
2259 bool pet = one_in_(6);
2260 BIT_FLAGS mode = PM_ALLOW_GROUP;
2262 if (pet) mode |= PM_FORCE_PET;
2263 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2265 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_DEMON, mode))
2267 msg_print(_("あなたはデーモンを引き寄せた!", "You have attracted a demon!"));
2268 disturb(FALSE, TRUE);
2272 if ((p_ptr->muta2 & MUT2_SPEED_FLUX) && one_in_(6000))
2274 disturb(FALSE, TRUE);
2277 msg_print(_("精力的でなくなった気がする。", "You feel less energetic."));
2279 if (p_ptr->fast > 0)
2281 set_fast(p_ptr, 0, TRUE);
2285 set_slow(p_ptr, randint1(30) + 10, FALSE);
2290 msg_print(_("精力的になった気がする。", "You feel more energetic."));
2292 if (p_ptr->slow > 0)
2294 set_slow(p_ptr, 0, TRUE);
2298 set_fast(p_ptr, randint1(30) + 10, FALSE);
2303 if ((p_ptr->muta2 & MUT2_BANISH_ALL) && one_in_(9000))
2305 disturb(FALSE, TRUE);
2306 msg_print(_("突然ほとんど孤独になった気がする。", "You suddenly feel almost lonely."));
2308 banish_monsters(100);
2309 if (!current_floor_ptr->dun_level && p_ptr->town_num)
2313 /* Pick a random shop (except home) */
2316 n = randint0(MAX_STORES);
2318 while ((n == STORE_HOME) || (n == STORE_MUSEUM));
2320 msg_print(_("店の主人が丘に向かって走っている!", "You see one of the shopkeepers running for the hills!"));
2326 if ((p_ptr->muta2 & MUT2_EAT_LIGHT) && one_in_(3000))
2330 msg_print(_("影につつまれた。", "A shadow passes over you."));
2333 /* Absorb light from the current possition */
2334 if ((current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
2336 hp_player(p_ptr, 10);
2339 o_ptr = &p_ptr->inventory_list[INVEN_LITE];
2341 /* Absorb some fuel in the current lite */
2342 if (o_ptr->tval == TV_LITE)
2344 /* Use some fuel (except on artifacts) */
2345 if (!object_is_fixed_artifact(o_ptr) && (o_ptr->xtra4 > 0))
2347 /* Heal the player a bit */
2348 hp_player(p_ptr, o_ptr->xtra4 / 20);
2350 /* Decrease life-span of lite */
2352 msg_print(_("光源からエネルギーを吸収した!", "You absorb energy from your light!"));
2354 /* Notice interesting fuel steps */
2355 notice_lite_change(o_ptr);
2360 * Unlite the area (radius 10) around player and
2361 * do 50 points damage to every affected monster
2363 unlite_area(50, 10);
2366 if ((p_ptr->muta2 & MUT2_ATT_ANIMAL) && !p_ptr->anti_magic && one_in_(7000))
2368 bool pet = one_in_(3);
2369 BIT_FLAGS mode = PM_ALLOW_GROUP;
2371 if (pet) mode |= PM_FORCE_PET;
2372 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2374 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_ANIMAL, mode))
2376 msg_print(_("動物を引き寄せた!", "You have attracted an animal!"));
2377 disturb(FALSE, TRUE);
2381 if ((p_ptr->muta2 & MUT2_RAW_CHAOS) && !p_ptr->anti_magic && one_in_(8000))
2383 disturb(FALSE, TRUE);
2384 msg_print(_("周りの空間が歪んでいる気がする!", "You feel the world warping around you!"));
2387 fire_ball(GF_CHAOS, 0, p_ptr->lev, 8);
2389 if ((p_ptr->muta2 & MUT2_NORMALITY) && one_in_(5000))
2391 if (!lose_mutation(p_ptr, 0))
2392 msg_print(_("奇妙なくらい普通になった気がする。", "You feel oddly normal."));
2394 if ((p_ptr->muta2 & MUT2_WRAITH) && !p_ptr->anti_magic && one_in_(3000))
2396 disturb(FALSE, TRUE);
2397 msg_print(_("非物質化した!", "You feel insubstantial!"));
2400 set_wraith_form(p_ptr, randint1(p_ptr->lev / 2) + (p_ptr->lev / 2), FALSE);
2402 if ((p_ptr->muta2 & MUT2_POLY_WOUND) && one_in_(3000))
2404 do_poly_wounds(p_ptr);
2406 if ((p_ptr->muta2 & MUT2_WASTING) && one_in_(3000))
2408 int which_stat = randint0(A_MAX);
2409 int sustained = FALSE;
2414 if (p_ptr->sustain_str) sustained = TRUE;
2417 if (p_ptr->sustain_int) sustained = TRUE;
2420 if (p_ptr->sustain_wis) sustained = TRUE;
2423 if (p_ptr->sustain_dex) sustained = TRUE;
2426 if (p_ptr->sustain_con) sustained = TRUE;
2429 if (p_ptr->sustain_chr) sustained = TRUE;
2432 msg_print(_("不正な状態!", "Invalid stat chosen!"));
2438 disturb(FALSE, TRUE);
2439 msg_print(_("自分が衰弱していくのが分かる!", "You can feel yourself wasting away!"));
2441 (void)dec_stat(p_ptr, which_stat, randint1(6) + 6, one_in_(3));
2444 if ((p_ptr->muta2 & MUT2_ATT_DRAGON) && !p_ptr->anti_magic && one_in_(3000))
2446 bool pet = one_in_(5);
2447 BIT_FLAGS mode = PM_ALLOW_GROUP;
2449 if (pet) mode |= PM_FORCE_PET;
2450 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2452 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_DRAGON, mode))
2454 msg_print(_("ドラゴンを引き寄せた!", "You have attracted a dragon!"));
2455 disturb(FALSE, TRUE);
2458 if ((p_ptr->muta2 & MUT2_WEIRD_MIND) && !p_ptr->anti_magic && one_in_(3000))
2460 if (p_ptr->tim_esp > 0)
2462 msg_print(_("精神にもやがかかった!", "Your mind feels cloudy!"));
2463 set_tim_esp(p_ptr, 0, TRUE);
2467 msg_print(_("精神が広がった!", "Your mind expands!"));
2468 set_tim_esp(p_ptr, p_ptr->lev, FALSE);
2471 if ((p_ptr->muta2 & MUT2_NAUSEA) && !p_ptr->slow_digest && one_in_(9000))
2473 disturb(FALSE, TRUE);
2474 msg_print(_("胃が痙攣し、食事を失った!", "Your stomach roils, and you lose your lunch!"));
2476 set_food(p_ptr, PY_FOOD_WEAK);
2477 if (music_singing_any(p_ptr)) stop_singing(p_ptr);
2478 if (hex_spelling_any(p_ptr)) stop_hex_spell_all();
2481 if ((p_ptr->muta2 & MUT2_WALK_SHAD) && !p_ptr->anti_magic && one_in_(12000) && !p_ptr->inside_arena)
2486 if ((p_ptr->muta2 & MUT2_WARNING) && one_in_(1000))
2488 int danger_amount = 0;
2489 MONSTER_IDX monster;
2491 for (monster = 0; monster < current_floor_ptr->m_max; monster++)
2493 monster_type *m_ptr = ¤t_floor_ptr->m_list[monster];
2494 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2495 if (!monster_is_valid(m_ptr)) continue;
2497 if (r_ptr->level >= p_ptr->lev)
2499 danger_amount += r_ptr->level - p_ptr->lev + 1;
2503 if (danger_amount > 100)
2504 msg_print(_("非常に恐ろしい気がする!", "You feel utterly terrified!"));
2505 else if (danger_amount > 50)
2506 msg_print(_("恐ろしい気がする!", "You feel terrified!"));
2507 else if (danger_amount > 20)
2508 msg_print(_("非常に心配な気がする!", "You feel very worried!"));
2509 else if (danger_amount > 10)
2510 msg_print(_("心配な気がする!", "You feel paranoid!"));
2511 else if (danger_amount > 5)
2512 msg_print(_("ほとんど安全な気がする。", "You feel almost safe."));
2514 msg_print(_("寂しい気がする。", "You feel lonely."));
2517 if ((p_ptr->muta2 & MUT2_INVULN) && !p_ptr->anti_magic && one_in_(5000))
2519 disturb(FALSE, TRUE);
2520 msg_print(_("無敵な気がする!", "You feel invincible!"));
2522 (void)set_invuln(p_ptr, randint1(8) + 8, FALSE);
2525 if ((p_ptr->muta2 & MUT2_SP_TO_HP) && one_in_(2000))
2527 MANA_POINT wounds = (MANA_POINT)(p_ptr->mhp - p_ptr->chp);
2531 HIT_POINT healing = p_ptr->csp;
2532 if (healing > wounds) healing = wounds;
2534 hp_player(p_ptr, healing);
2535 p_ptr->csp -= healing;
2536 p_ptr->redraw |= (PR_HP | PR_MANA);
2540 if ((p_ptr->muta2 & MUT2_HP_TO_SP) && !p_ptr->anti_magic && one_in_(4000))
2542 HIT_POINT wounds = (HIT_POINT)(p_ptr->msp - p_ptr->csp);
2546 HIT_POINT healing = p_ptr->chp;
2547 if (healing > wounds) healing = wounds;
2549 p_ptr->csp += healing;
2550 p_ptr->redraw |= (PR_HP | PR_MANA);
2551 take_hit(p_ptr, DAMAGE_LOSELIFE, healing, _("頭に昇った血", "blood rushing to the head"), -1);
2555 if ((p_ptr->muta2 & MUT2_DISARM) && one_in_(10000))
2557 INVENTORY_IDX slot = 0;
2558 object_type *o_ptr = NULL;
2560 disturb(FALSE, TRUE);
2561 msg_print(_("足がもつれて転んだ!", "You trip over your own feet!"));
2562 take_hit(p_ptr, DAMAGE_NOESCAPE, randint1(p_ptr->wt / 6), _("転倒", "tripping"), -1);
2565 if (has_melee_weapon(p_ptr, INVEN_RARM))
2568 o_ptr = &p_ptr->inventory_list[INVEN_RARM];
2570 if (has_melee_weapon(p_ptr, INVEN_LARM) && one_in_(2))
2572 o_ptr = &p_ptr->inventory_list[INVEN_LARM];
2576 else if (has_melee_weapon(p_ptr, INVEN_LARM))
2578 o_ptr = &p_ptr->inventory_list[INVEN_LARM];
2581 if (slot && !object_is_cursed(o_ptr))
2583 msg_print(_("武器を落としてしまった!", "You drop your weapon!"));
2584 inven_drop(slot, 1);
2591 * @brief 10ゲームターンが進行するごとに装備効果の発動判定を行う処理
2592 * / Handle curse effects once every 10 game turns
2595 static void process_world_aux_curse(void)
2597 if ((p_ptr->cursed & TRC_P_FLAG_MASK) && !p_ptr->phase_out && !p_ptr->wild_mode)
2600 * Hack: Uncursed teleporting items (e.g. Trump Weapons)
2601 * can actually be useful!
2603 if ((p_ptr->cursed & TRC_TELEPORT_SELF) && one_in_(200))
2605 GAME_TEXT o_name[MAX_NLEN];
2607 int i, i_keep = 0, count = 0;
2609 /* Scan the equipment with random teleport ability */
2610 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
2612 BIT_FLAGS flgs[TR_FLAG_SIZE];
2613 o_ptr = &p_ptr->inventory_list[i];
2614 if (!o_ptr->k_idx) continue;
2616 object_flags(o_ptr, flgs);
2618 if (have_flag(flgs, TR_TELEPORT))
2620 /* {.} will stop random teleportation. */
2621 if (!o_ptr->inscription || !my_strchr(quark_str(o_ptr->inscription), '.'))
2624 if (one_in_(count)) i_keep = i;
2629 o_ptr = &p_ptr->inventory_list[i_keep];
2630 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2631 msg_format(_("%sがテレポートの能力を発動させようとしている。", "Your %s is activating teleportation."), o_name);
2632 if (get_check_strict(_("テレポートしますか?", "Teleport? "), CHECK_OKAY_CANCEL))
2634 disturb(FALSE, TRUE);
2635 teleport_player(50, 0L);
2639 msg_format(_("%sに{.}(ピリオド)と銘を刻むと発動を抑制できます。",
2640 "You can inscribe {.} on your %s to disable random teleportation. "), o_name);
2641 disturb(TRUE, TRUE);
2644 /* Make a chainsword noise */
2645 if ((p_ptr->cursed & TRC_CHAINSWORD) && one_in_(CHAINSWORD_NOISE))
2648 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, noise))
2650 disturb(FALSE, FALSE);
2653 if ((p_ptr->cursed & TRC_TY_CURSE) && one_in_(TY_CURSE_CHANCE))
2656 (void)activate_ty_curse(FALSE, &count);
2658 /* Handle experience draining */
2659 if (p_ptr->prace != RACE_ANDROID && ((p_ptr->cursed & TRC_DRAIN_EXP) && one_in_(4)))
2661 p_ptr->exp -= (p_ptr->lev + 1) / 2;
2662 if (p_ptr->exp < 0) p_ptr->exp = 0;
2663 p_ptr->max_exp -= (p_ptr->lev + 1) / 2;
2664 if (p_ptr->max_exp < 0) p_ptr->max_exp = 0;
2665 check_experience(p_ptr);
2667 /* Add light curse (Later) */
2668 if ((p_ptr->cursed & TRC_ADD_L_CURSE) && one_in_(2000))
2670 BIT_FLAGS new_curse;
2673 o_ptr = choose_cursed_obj_name(TRC_ADD_L_CURSE);
2675 new_curse = get_curse(0, o_ptr);
2676 if (!(o_ptr->curse_flags & new_curse))
2678 GAME_TEXT o_name[MAX_NLEN];
2680 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2682 o_ptr->curse_flags |= new_curse;
2683 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2685 o_ptr->feeling = FEEL_NONE;
2687 p_ptr->update |= (PU_BONUS);
2690 /* Add heavy curse (Later) */
2691 if ((p_ptr->cursed & TRC_ADD_H_CURSE) && one_in_(2000))
2693 BIT_FLAGS new_curse;
2696 o_ptr = choose_cursed_obj_name(TRC_ADD_H_CURSE);
2698 new_curse = get_curse(1, o_ptr);
2699 if (!(o_ptr->curse_flags & new_curse))
2701 GAME_TEXT o_name[MAX_NLEN];
2703 object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2705 o_ptr->curse_flags |= new_curse;
2706 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2707 o_ptr->feeling = FEEL_NONE;
2709 p_ptr->update |= (PU_BONUS);
2713 if ((p_ptr->cursed & TRC_CALL_ANIMAL) && one_in_(2500))
2715 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)))
2717 GAME_TEXT o_name[MAX_NLEN];
2719 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_ANIMAL), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2720 msg_format(_("%sが動物を引き寄せた!", "Your %s have attracted an animal!"), o_name);
2721 disturb(FALSE, TRUE);
2725 if ((p_ptr->cursed & TRC_CALL_DEMON) && one_in_(1111))
2727 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)))
2729 GAME_TEXT o_name[MAX_NLEN];
2731 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DEMON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2732 msg_format(_("%sが悪魔を引き寄せた!", "Your %s have attracted a demon!"), o_name);
2733 disturb(FALSE, TRUE);
2737 if ((p_ptr->cursed & TRC_CALL_DRAGON) && one_in_(800))
2739 if (summon_specific(0, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_DRAGON,
2740 (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2742 GAME_TEXT o_name[MAX_NLEN];
2744 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DRAGON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2745 msg_format(_("%sがドラゴンを引き寄せた!", "Your %s have attracted an dragon!"), o_name);
2746 disturb(FALSE, TRUE);
2750 if ((p_ptr->cursed & TRC_CALL_UNDEAD) && one_in_(1111))
2752 if (summon_specific(0, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_UNDEAD,
2753 (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2755 GAME_TEXT o_name[MAX_NLEN];
2757 object_desc(o_name, choose_cursed_obj_name(TRC_CALL_UNDEAD), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2758 msg_format(_("%sが死霊を引き寄せた!", "Your %s have attracted an undead!"), o_name);
2759 disturb(FALSE, TRUE);
2762 if ((p_ptr->cursed & TRC_COWARDICE) && one_in_(1500))
2764 if (!p_ptr->resist_fear)
2766 disturb(FALSE, TRUE);
2767 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
2768 set_afraid(p_ptr, p_ptr->afraid + 13 + randint1(26));
2771 /* Teleport player */
2772 if ((p_ptr->cursed & TRC_TELEPORT) && one_in_(200) && !p_ptr->anti_tele)
2774 disturb(FALSE, TRUE);
2776 /* Teleport player */
2777 teleport_player(40, TELEPORT_PASSIVE);
2779 /* Handle HP draining */
2780 if ((p_ptr->cursed & TRC_DRAIN_HP) && one_in_(666))
2782 GAME_TEXT o_name[MAX_NLEN];
2784 object_desc(o_name, choose_cursed_obj_name(TRC_DRAIN_HP), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2785 msg_format(_("%sはあなたの体力を吸収した!", "Your %s drains HP from you!"), o_name);
2786 take_hit(p_ptr, DAMAGE_LOSELIFE, MIN(p_ptr->lev*2, 100), o_name, -1);
2788 /* Handle mana draining */
2789 if ((p_ptr->cursed & TRC_DRAIN_MANA) && p_ptr->csp && one_in_(666))
2791 GAME_TEXT o_name[MAX_NLEN];
2793 object_desc(o_name, choose_cursed_obj_name(TRC_DRAIN_MANA), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2794 msg_format(_("%sはあなたの魔力を吸収した!", "Your %s drains mana from you!"), o_name);
2795 p_ptr->csp -= MIN(p_ptr->lev, 50);
2799 p_ptr->csp_frac = 0;
2801 p_ptr->redraw |= PR_MANA;
2805 /* Rarely, take damage from the Jewel of Judgement */
2806 if (one_in_(999) && !p_ptr->anti_magic)
2808 object_type *o_ptr = &p_ptr->inventory_list[INVEN_LITE];
2810 if (o_ptr->name1 == ART_JUDGE)
2812 if (object_is_known(o_ptr))
2813 msg_print(_("『審判の宝石』はあなたの体力を吸収した!", "The Jewel of Judgement drains life from you!"));
2815 msg_print(_("なにかがあなたの体力を吸収した!", "Something drains life from you!"));
2816 take_hit(p_ptr, DAMAGE_LOSELIFE, MIN(p_ptr->lev, 50), _("審判の宝石", "the Jewel of Judgement"), -1);
2823 * @brief 10ゲームターンが進行するごとに魔道具の自然充填を行う処理
2824 * / Handle recharging objects once every 10 game turns
2827 static void process_world_aux_recharge(void)
2832 /* Process equipment */
2833 for (changed = FALSE, i = INVEN_RARM; i < INVEN_TOTAL; i++)
2835 /* Get the object */
2836 object_type *o_ptr = &p_ptr->inventory_list[i];
2837 if (!o_ptr->k_idx) continue;
2839 /* Recharge activatable objects */
2840 if (o_ptr->timeout > 0)
2845 /* Notice changes */
2846 if (!o_ptr->timeout)
2848 recharged_notice(o_ptr);
2854 /* Notice changes */
2857 p_ptr->window |= (PW_EQUIP);
2862 * Recharge rods. Rods now use timeout to control charging status,
2863 * and each charging rod in a stack decreases the stack's timeout by
2864 * one per current_world_ptr->game_turn. -LM-
2866 for (changed = FALSE, i = 0; i < INVEN_PACK; i++)
2868 object_type *o_ptr = &p_ptr->inventory_list[i];
2869 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2870 if (!o_ptr->k_idx) continue;
2872 /* Examine all charging rods or stacks of charging rods. */
2873 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2875 /* Determine how many rods are charging. */
2876 TIME_EFFECT temp = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval;
2877 if (temp > o_ptr->number) temp = (TIME_EFFECT)o_ptr->number;
2879 /* Decrease timeout by that number. */
2880 o_ptr->timeout -= temp;
2882 /* Boundary control. */
2883 if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2885 /* Notice changes, provide message if object is inscribed. */
2886 if (!(o_ptr->timeout))
2888 recharged_notice(o_ptr);
2892 /* One of the stack of rod is charged */
2893 else if (o_ptr->timeout % k_ptr->pval)
2900 /* Notice changes */
2903 p_ptr->window |= (PW_INVEN);
2907 /* Process objects on floor */
2908 for (i = 1; i < current_floor_ptr->o_max; i++)
2910 object_type *o_ptr = ¤t_floor_ptr->o_list[i];
2912 if (!OBJECT_IS_VALID(o_ptr)) continue;
2914 /* Recharge rods on the ground. No messages. */
2915 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2918 o_ptr->timeout -= (TIME_EFFECT)o_ptr->number;
2920 /* Boundary control. */
2921 if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2928 * @brief 10ゲームターンが進行するごとに帰還や現実変容などの残り時間カウントダウンと発動を処理する。
2929 * / Handle involuntary movement once every 10 game turns
2932 static void process_world_aux_movement(void)
2934 /* Delayed Word-of-Recall */
2935 if (p_ptr->word_recall)
2938 * HACK: Autosave BEFORE resetting the recall counter (rr9)
2939 * The player is yanked up/down as soon as
2940 * he loads the autosaved game.
2942 if (autosave_l && (p_ptr->word_recall == 1) && !p_ptr->phase_out)
2943 do_cmd_save_game(TRUE);
2945 /* Count down towards recall */
2946 p_ptr->word_recall--;
2948 p_ptr->redraw |= (PR_STATUS);
2950 /* Activate the recall */
2951 if (!p_ptr->word_recall)
2954 disturb(FALSE, TRUE);
2956 /* Determine the level */
2957 if (current_floor_ptr->dun_level || p_ptr->inside_quest || p_ptr->enter_dungeon)
2959 msg_print(_("上に引っ張りあげられる感じがする!", "You feel yourself yanked upwards!"));
2961 if (p_ptr->dungeon_idx) p_ptr->recall_dungeon = p_ptr->dungeon_idx;
2963 exe_write_diary(p_ptr, NIKKI_RECALL, current_floor_ptr->dun_level, NULL);
2965 current_floor_ptr->dun_level = 0;
2966 p_ptr->dungeon_idx = 0;
2968 leave_quest_check();
2969 leave_tower_check();
2971 p_ptr->inside_quest = 0;
2973 p_ptr->leaving = TRUE;
2977 msg_print(_("下に引きずり降ろされる感じがする!", "You feel yourself yanked downwards!"));
2979 p_ptr->dungeon_idx = p_ptr->recall_dungeon;
2982 exe_write_diary(p_ptr, NIKKI_RECALL, current_floor_ptr->dun_level, NULL);
2985 current_floor_ptr->dun_level = max_dlv[p_ptr->dungeon_idx];
2986 if (current_floor_ptr->dun_level < 1) current_floor_ptr->dun_level = 1;
2988 /* Nightmare mode makes recall more dangerous */
2989 if (ironman_nightmare && !randint0(666) && (p_ptr->dungeon_idx == DUNGEON_ANGBAND))
2991 if (current_floor_ptr->dun_level < 50)
2993 current_floor_ptr->dun_level *= 2;
2995 else if (current_floor_ptr->dun_level < 99)
2997 current_floor_ptr->dun_level = (current_floor_ptr->dun_level + 99) / 2;
2999 else if (current_floor_ptr->dun_level > 100)
3001 current_floor_ptr->dun_level = d_info[p_ptr->dungeon_idx].maxdepth - 1;
3005 if (p_ptr->wild_mode)
3007 p_ptr->wilderness_y = p_ptr->y;
3008 p_ptr->wilderness_x = p_ptr->x;
3012 /* Save player position */
3013 p_ptr->oldpx = p_ptr->x;
3014 p_ptr->oldpy = p_ptr->y;
3016 p_ptr->wild_mode = FALSE;
3019 * Clear all saved floors
3020 * and create a first saved floor
3022 prepare_change_floor_mode(CFM_FIRST_FLOOR);
3023 p_ptr->leaving = TRUE;
3025 if (p_ptr->dungeon_idx == DUNGEON_ANGBAND)
3029 for (i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++)
3031 quest_type* const q_ptr = &quest[i];
3034 if ((q_ptr->type == QUEST_TYPE_RANDOM) &&
3035 (q_ptr->status == QUEST_STATUS_TAKEN) &&
3036 (q_ptr->level < current_floor_ptr->dun_level))
3038 q_ptr->status = QUEST_STATUS_FAILED;
3039 q_ptr->complev = (byte)p_ptr->lev;
3041 q_ptr->comptime = current_world_ptr->play_time;
3042 r_info[q_ptr->r_idx].flags1 &= ~(RF1_QUESTOR);
3048 sound(SOUND_TPLEVEL);
3053 /* Delayed Alter reality */
3054 if (p_ptr->alter_reality)
3056 if (autosave_l && (p_ptr->alter_reality == 1) && !p_ptr->phase_out)
3057 do_cmd_save_game(TRUE);
3059 /* Count down towards alter */
3060 p_ptr->alter_reality--;
3062 p_ptr->redraw |= (PR_STATUS);
3064 /* Activate the alter reality */
3065 if (!p_ptr->alter_reality)
3068 disturb(FALSE, TRUE);
3070 /* Determine the level */
3071 if (!quest_number(current_floor_ptr->dun_level) && current_floor_ptr->dun_level)
3073 msg_print(_("世界が変わった!", "The world changes!"));
3076 * Clear all saved floors
3077 * and create a first saved floor
3079 prepare_change_floor_mode(CFM_FIRST_FLOOR);
3080 p_ptr->leaving = TRUE;
3084 msg_print(_("世界が少しの間変化したようだ。", "The world seems to change for a moment!"));
3087 sound(SOUND_TPLEVEL);
3093 * @brief 10ゲームターンが進行する毎にゲーム世界全体の処理を行う。
3094 * / Handle certain things once every 10 game turns
3097 static void process_world(void)
3101 const s32b A_DAY = TURNS_PER_TICK * TOWN_DAWN;
3102 s32b prev_turn_in_today = ((current_world_ptr->game_turn - TURNS_PER_TICK) % A_DAY + A_DAY / 4) % A_DAY;
3103 int prev_min = (1440 * prev_turn_in_today / A_DAY) % 60;
3105 extract_day_hour_min(&day, &hour, &min);
3107 /* Update dungeon feeling, and announce it if changed */
3108 update_dungeon_feeling(current_floor_ptr);
3110 /* 帰還無しモード時のレベルテレポバグ対策 / Fix for level teleport bugs on ironman_downward.*/
3111 if (ironman_downward && (p_ptr->dungeon_idx != DUNGEON_ANGBAND && p_ptr->dungeon_idx != 0))
3113 current_floor_ptr->dun_level = 0;
3114 p_ptr->dungeon_idx = 0;
3115 prepare_change_floor_mode(CFM_FIRST_FLOOR | CFM_RAND_PLACE);
3116 p_ptr->inside_arena = FALSE;
3117 p_ptr->wild_mode = FALSE;
3118 p_ptr->leaving = TRUE;
3121 /*** Check monster arena ***/
3122 if (p_ptr->phase_out && !p_ptr->leaving)
3128 /* Count all hostile monsters */
3129 for (i2 = 0; i2 < current_floor_ptr->width; ++i2)
3130 for (j2 = 0; j2 < current_floor_ptr->height; j2++)
3132 grid_type *g_ptr = ¤t_floor_ptr->grid_array[j2][i2];
3134 if ((g_ptr->m_idx > 0) && (g_ptr->m_idx != p_ptr->riding))
3137 win_m_idx = g_ptr->m_idx;
3141 if (number_mon == 0)
3143 msg_print(_("相打ちに終わりました。", "They have kill each other at the same time."));
3145 p_ptr->energy_need = 0;
3146 update_gambling_monsters();
3148 else if ((number_mon-1) == 0)
3150 GAME_TEXT m_name[MAX_NLEN];
3151 monster_type *wm_ptr;
3153 wm_ptr = ¤t_floor_ptr->m_list[win_m_idx];
3155 monster_desc(m_name, wm_ptr, 0);
3156 msg_format(_("%sが勝利した!", "%s is winner!"), m_name);
3159 if (win_m_idx == (sel_monster+1))
3161 msg_print(_("おめでとうございます。", "Congratulations."));
3162 msg_format(_("%d$を受け取った。", "You received %d gold."), battle_odds);
3163 p_ptr->au += battle_odds;
3167 msg_print(_("残念でした。", "You lost gold."));
3170 p_ptr->energy_need = 0;
3171 update_gambling_monsters();
3173 else if (current_world_ptr->game_turn - current_floor_ptr->generated_turn == 150 * TURNS_PER_TICK)
3175 msg_print(_("申し分けありませんが、この勝負は引き分けとさせていただきます。", "This battle have ended in a draw."));
3176 p_ptr->au += kakekin;
3178 p_ptr->energy_need = 0;
3179 update_gambling_monsters();
3183 /* Every 10 game turns */
3184 if (current_world_ptr->game_turn % TURNS_PER_TICK) return;
3186 /*** Attempt timed autosave ***/
3187 if (autosave_t && autosave_freq && !p_ptr->phase_out)
3189 if (!(current_world_ptr->game_turn % ((s32b)autosave_freq * TURNS_PER_TICK)))
3190 do_cmd_save_game(TRUE);
3193 if (current_floor_ptr->monster_noise && !ignore_unview)
3195 msg_print(_("何かが聞こえた。", "You hear noise."));
3198 /*** Handle the wilderness/town (sunshine) ***/
3200 /* While in town/wilderness */
3201 if (!current_floor_ptr->dun_level && !p_ptr->inside_quest && !p_ptr->phase_out && !p_ptr->inside_arena)
3203 /* Hack -- Daybreak/Nighfall in town */
3204 if (!(current_world_ptr->game_turn % ((TURNS_PER_TICK * TOWN_DAWN) / 2)))
3208 /* Check for dawn */
3209 dawn = (!(current_world_ptr->game_turn % (TURNS_PER_TICK * TOWN_DAWN)));
3211 if (dawn) day_break(current_floor_ptr);
3212 else night_falls(current_floor_ptr);
3217 /* While in the dungeon (vanilla_town or lite_town mode only) */
3218 else if ((vanilla_town || (lite_town && !p_ptr->inside_quest && !p_ptr->phase_out && !p_ptr->inside_arena)) && current_floor_ptr->dun_level)
3220 /*** Shuffle the Storekeepers ***/
3222 /* Chance is only once a day (while in dungeon) */
3223 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * STORE_TICKS)))
3225 /* Sometimes, shuffle the shop-keepers */
3226 if (one_in_(STORE_SHUFFLE))
3231 /* Pick a random shop (except home and museum) */
3234 n = randint0(MAX_STORES);
3236 while ((n == STORE_HOME) || (n == STORE_MUSEUM));
3238 /* Check every feature */
3239 for (i = 1; i < max_f_idx; i++)
3241 feature_type *f_ptr = &f_info[i];
3243 /* Skip empty index */
3244 if (!f_ptr->name) continue;
3246 /* Skip non-store features */
3247 if (!have_flag(f_ptr->flags, FF_STORE)) continue;
3249 /* Verify store type */
3250 if (f_ptr->subtype == n)
3252 if (cheat_xtra) msg_format(_("%sの店主をシャッフルします。", "Shuffle a Shopkeeper of %s."), f_name + f_ptr->name);
3265 /*** Process the monsters ***/
3267 /* Check for creature generation. */
3268 if (one_in_(d_info[p_ptr->dungeon_idx].max_m_alloc_chance) &&
3269 !p_ptr->inside_arena && !p_ptr->inside_quest && !p_ptr->phase_out)
3271 /* Make a new monster */
3272 (void)alloc_monster(MAX_SIGHT + 5, 0);
3275 /* Hack -- Check for creature regeneration */
3276 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 10)) && !p_ptr->phase_out) regen_monsters();
3277 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 3))) regen_captured_monsters();
3279 if (!p_ptr->leaving)
3283 /* Hack -- Process the counters of monsters if needed */
3284 for (i = 0; i < MAX_MTIMED; i++)
3286 if (current_floor_ptr->mproc_max[i] > 0) process_monsters_mtimed(i);
3294 if (min != prev_min)
3296 exe_write_diary(p_ptr, NIKKI_HIGAWARI, 0, NULL);
3297 determine_today_mon(FALSE);
3302 * Nightmare mode activates the TY_CURSE at midnight
3303 * Require exact minute -- Don't activate multiple times in a minute
3306 if (ironman_nightmare && (min != prev_min))
3309 /* Every 15 minutes after 11:00 pm */
3310 if ((hour == 23) && !(min % 15))
3312 disturb(FALSE, TRUE);
3317 msg_print(_("遠くで不気味な鐘の音が鳴った。", "You hear a distant bell toll ominously."));
3321 msg_print(_("遠くで鐘が二回鳴った。", "A distant bell sounds twice."));
3325 msg_print(_("遠くで鐘が三回鳴った。", "A distant bell sounds three times."));
3329 msg_print(_("遠くで鐘が四回鳴った。", "A distant bell tolls four times."));
3334 /* TY_CURSE activates at midnight! */
3338 disturb(TRUE, TRUE);
3339 msg_print(_("遠くで鐘が何回も鳴り、死んだような静けさの中へ消えていった。", "A distant bell tolls many times, fading into an deathly silence."));
3341 if (p_ptr->wild_mode)
3343 /* Go into large wilderness view */
3344 p_ptr->oldpy = randint1(MAX_HGT - 2);
3345 p_ptr->oldpx = randint1(MAX_WID - 2);
3346 change_wild_mode(TRUE);
3348 /* Give first move to monsters */
3349 take_turn(p_ptr, 100);
3353 p_ptr->invoking_midnight_curse = TRUE;
3357 process_world_aux_digestion();
3358 process_world_aux_hp_and_sp();
3359 process_world_aux_timeout();
3360 process_world_aux_light();
3361 process_world_aux_mutation();
3362 process_world_aux_curse();
3363 process_world_aux_recharge();
3366 process_world_aux_movement();
3370 * @brief ウィザードモードへの導入処理
3371 * / Verify use of "wizard" mode
3372 * @return 実際にウィザードモードへ移行したらTRUEを返す。
3374 static bool enter_wizard_mode(void)
3376 /* Ask first time */
3377 if (!p_ptr->noscore)
3379 /* Wizard mode is not permitted */
3380 if (!allow_debug_opts || arg_wizard)
3382 msg_print(_("ウィザードモードは許可されていません。 ", "Wizard mode is not permitted."));
3386 /* Mention effects */
3387 msg_print(_("ウィザードモードはデバッグと実験のためのモードです。 ", "Wizard mode is for debugging and experimenting."));
3388 msg_print(_("一度ウィザードモードに入るとスコアは記録されません。", "The game will not be scored if you enter wizard mode."));
3391 /* Verify request */
3392 if (!get_check(_("本当にウィザードモードに入りたいのですか? ", "Are you sure you want to enter wizard mode? ")))
3397 exe_write_diary(p_ptr, NIKKI_BUNSHOU, 0, _("ウィザードモードに突入してスコアを残せなくなった。", "give up recording score to enter wizard mode."));
3399 p_ptr->noscore |= 0x0002;
3410 * @brief デバッグコマンドへの導入処理
3411 * / Verify use of "debug" commands
3412 * @return 実際にデバッグコマンドへ移行したらTRUEを返す。
3414 static bool enter_debug_mode(void)
3416 /* Ask first time */
3417 if (!p_ptr->noscore)
3419 /* Debug mode is not permitted */
3420 if (!allow_debug_opts)
3422 msg_print(_("デバッグコマンドは許可されていません。 ", "Use of debug command is not permitted."));
3426 /* Mention effects */
3427 msg_print(_("デバッグ・コマンドはデバッグと実験のためのコマンドです。 ", "The debug commands are for debugging and experimenting."));
3428 msg_print(_("デバッグ・コマンドを使うとスコアは記録されません。", "The game will not be scored if you use debug commands."));
3432 /* Verify request */
3433 if (!get_check(_("本当にデバッグ・コマンドを使いますか? ", "Are you sure you want to use debug commands? ")))
3438 exe_write_diary(p_ptr, NIKKI_BUNSHOU, 0, _("デバッグモードに突入してスコアを残せなくなった。", "give up sending score to use debug commands."));
3440 p_ptr->noscore |= 0x0008;
3448 * Hack -- Declare the Debug Routines
3450 extern void do_cmd_debug(void);
3452 #endif /* ALLOW_WIZARD */
3458 * @brief ボーグコマンドへの導入処理
3459 * / Verify use of "borg" commands
3460 * @return 実際にボーグコマンドへ移行したらTRUEを返す。
3462 static bool enter_borg_mode(void)
3464 /* Ask first time */
3465 if (!(p_ptr->noscore & 0x0010))
3467 /* Mention effects */
3468 msg_print(_("ボーグ・コマンドはデバッグと実験のためのコマンドです。 ", "The borg commands are for debugging and experimenting."));
3469 msg_print(_("ボーグ・コマンドを使うとスコアは記録されません。", "The game will not be scored if you use borg commands."));
3473 /* Verify request */
3474 if (!get_check(_("本当にボーグ・コマンドを使いますか? ", "Are you sure you want to use borg commands? ")))
3479 exe_write_diary(p_ptr, NIKKI_BUNSHOU, 0, _("ボーグ・コマンドを使用してスコアを残せなくなった。", "give up recording score to use borg commands."));
3481 p_ptr->noscore |= 0x0010;
3489 * Hack -- Declare the Ben Borg
3491 extern void do_cmd_borg(void);
3493 #endif /* ALLOW_BORG */
3497 * @brief プレイヤーから受けた入力コマンドの分岐処理。
3498 * / Parse and execute the current command Give "Warning" on illegal commands.
3499 * @todo Make some "blocks"
3502 static void process_command(void)
3504 COMMAND_CODE old_now_message = now_message;
3506 /* Handle repeating the last command */
3512 if ((p_ptr->pclass == CLASS_SNIPER) && (p_ptr->concent))
3513 p_ptr->reset_concent = TRUE;
3515 /* Parse the command */
3516 switch (command_cmd)
3532 /*** Wizard Commands ***/
3535 if (current_world_ptr->wizard)
3537 current_world_ptr->wizard = FALSE;
3538 msg_print(_("ウィザードモード解除。", "Wizard mode off."));
3540 else if (enter_wizard_mode())
3542 current_world_ptr->wizard = TRUE;
3543 msg_print(_("ウィザードモード突入。", "Wizard mode on."));
3545 p_ptr->update |= (PU_MONSTERS);
3546 p_ptr->redraw |= (PR_TITLE);
3554 /* Special "debug" commands */
3557 if (enter_debug_mode())
3564 #endif /* ALLOW_WIZARD */
3569 /* Special "borg" commands */
3572 if (enter_borg_mode())
3574 if (!p_ptr->wild_mode) do_cmd_borg();
3579 #endif /* ALLOW_BORG */
3583 /*** Inventory Commands ***/
3585 /* Wear/wield equipment */
3588 if (!p_ptr->wild_mode) do_cmd_wield(p_ptr);
3592 /* Take off equipment */
3595 if (!p_ptr->wild_mode) do_cmd_takeoff(p_ptr);
3602 if (!p_ptr->wild_mode) do_cmd_drop(p_ptr);
3606 /* Destroy an item */
3609 do_cmd_destroy(p_ptr);
3613 /* Equipment list */
3616 do_cmd_equip(p_ptr);
3620 /* Inventory list */
3623 do_cmd_inven(p_ptr);
3628 /*** Various commands ***/
3630 /* Identify an object */
3633 do_cmd_observe(p_ptr);
3639 toggle_inven_equip(p_ptr);
3644 /*** Standard "Movement" Commands ***/
3649 if (!p_ptr->wild_mode) do_cmd_alter(p_ptr);
3656 if (!p_ptr->wild_mode) do_cmd_tunnel(p_ptr);
3660 /* Move (usually pick up things) */
3663 do_cmd_walk(p_ptr, FALSE);
3667 /* Move (usually do not pick up) */
3670 do_cmd_walk(p_ptr, TRUE);
3675 /*** Running, Resting, Searching, Staying */
3677 /* Begin Running -- Arg is Max Distance */
3680 if (!p_ptr->wild_mode) do_cmd_run(p_ptr);
3684 /* Stay still (usually pick things up) */
3687 do_cmd_stay(p_ptr, always_pickup);
3691 /* Stay still (usually do not pick up) */
3694 do_cmd_stay(p_ptr, !always_pickup);
3698 /* Rest -- Arg is time */
3705 /* Search for traps/doors */
3708 do_cmd_search(p_ptr);
3714 if (p_ptr->action == ACTION_SEARCH) set_action(p_ptr, ACTION_NONE);
3715 else set_action(p_ptr, ACTION_SEARCH);
3720 /*** Stairs and Doors and Chests and Traps ***/
3723 case SPECIAL_KEY_STORE:
3729 /* Enter building -KMW- */
3730 case SPECIAL_KEY_BUILDING:
3736 /* Enter quest level -KMW- */
3737 case SPECIAL_KEY_QUEST:
3743 /* Go up staircase */
3746 if (!p_ptr->wild_mode && !current_floor_ptr->dun_level && !p_ptr->inside_arena && !p_ptr->inside_quest)
3748 if (vanilla_town) break;
3750 if (p_ptr->ambush_flag)
3752 msg_print(_("襲撃から逃げるにはマップの端まで移動しなければならない。", "To flee the ambush you have to reach the edge of the map."));
3756 if (p_ptr->food < PY_FOOD_WEAK)
3758 msg_print(_("その前に食事をとらないと。", "You must eat something here."));
3762 change_wild_mode(FALSE);
3765 do_cmd_go_up(p_ptr);
3769 /* Go down staircase */
3772 if (p_ptr->wild_mode)
3773 change_wild_mode(FALSE);
3775 do_cmd_go_down(p_ptr);
3779 /* Open a door or chest */
3789 do_cmd_close(p_ptr);
3793 /* Jam a door with spikes */
3796 do_cmd_spike(p_ptr);
3807 /* Disarm a trap or chest */
3810 do_cmd_disarm(p_ptr);
3815 /*** Magic and Prayers ***/
3817 /* Gain new spells/prayers */
3820 if ((p_ptr->pclass == CLASS_SORCERER) || (p_ptr->pclass == CLASS_RED_MAGE))
3821 msg_print(_("呪文を学習する必要はない!", "You don't have to learn spells!"));
3822 else if (p_ptr->pclass == CLASS_SAMURAI)
3823 do_cmd_gain_hissatsu(p_ptr);
3824 else if (p_ptr->pclass == CLASS_MAGIC_EATER)
3825 import_magic_device();
3834 if ( (p_ptr->pclass == CLASS_MINDCRAFTER) ||
3835 (p_ptr->pclass == CLASS_BERSERKER) ||
3836 (p_ptr->pclass == CLASS_NINJA) ||
3837 (p_ptr->pclass == CLASS_MIRROR_MASTER)
3838 ) do_cmd_mind_browse();
3839 else if (p_ptr->pclass == CLASS_SMITH)
3840 do_cmd_kaji(p_ptr, TRUE);
3841 else if (p_ptr->pclass == CLASS_MAGIC_EATER)
3842 do_cmd_magic_eater(p_ptr, TRUE, FALSE);
3843 else if (p_ptr->pclass == CLASS_SNIPER)
3844 do_cmd_snipe_browse();
3845 else do_cmd_browse();
3853 if (!p_ptr->wild_mode)
3855 if ((p_ptr->pclass == CLASS_WARRIOR) || (p_ptr->pclass == CLASS_ARCHER) || (p_ptr->pclass == CLASS_CAVALRY))
3857 msg_print(_("呪文を唱えられない!", "You cannot cast spells!"));
3859 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))
3861 msg_print(_("ダンジョンが魔法を吸収した!", "The dungeon absorbs all attempted magic!"));
3864 else if (p_ptr->anti_magic && (p_ptr->pclass != CLASS_BERSERKER) && (p_ptr->pclass != CLASS_SMITH))
3866 concptr which_power = _("魔法", "magic");
3867 if (p_ptr->pclass == CLASS_MINDCRAFTER)
3868 which_power = _("超能力", "psionic powers");
3869 else if (p_ptr->pclass == CLASS_IMITATOR)
3870 which_power = _("ものまね", "imitation");
3871 else if (p_ptr->pclass == CLASS_SAMURAI)
3872 which_power = _("必殺剣", "hissatsu");
3873 else if (p_ptr->pclass == CLASS_MIRROR_MASTER)
3874 which_power = _("鏡魔法", "mirror magic");
3875 else if (p_ptr->pclass == CLASS_NINJA)
3876 which_power = _("忍術", "ninjutsu");
3877 else if (mp_ptr->spell_book == TV_LIFE_BOOK)
3878 which_power = _("祈り", "prayer");
3880 msg_format(_("反魔法バリアが%sを邪魔した!", "An anti-magic shell disrupts your %s!"), which_power);
3883 else if (p_ptr->shero && (p_ptr->pclass != CLASS_BERSERKER))
3885 msg_format(_("狂戦士化していて頭が回らない!", "You cannot think directly!"));
3890 if ((p_ptr->pclass == CLASS_MINDCRAFTER) ||
3891 (p_ptr->pclass == CLASS_BERSERKER) ||
3892 (p_ptr->pclass == CLASS_NINJA) ||
3893 (p_ptr->pclass == CLASS_MIRROR_MASTER)
3896 else if (p_ptr->pclass == CLASS_IMITATOR)
3897 do_cmd_mane(p_ptr, FALSE);
3898 else if (p_ptr->pclass == CLASS_MAGIC_EATER)
3899 do_cmd_magic_eater(p_ptr, FALSE, FALSE);
3900 else if (p_ptr->pclass == CLASS_SAMURAI)
3901 do_cmd_hissatsu(p_ptr);
3902 else if (p_ptr->pclass == CLASS_BLUE_MAGE)
3903 do_cmd_cast_learned();
3904 else if (p_ptr->pclass == CLASS_SMITH)
3905 do_cmd_kaji(p_ptr, FALSE);
3906 else if (p_ptr->pclass == CLASS_SNIPER)
3915 /* Issue a pet command */
3922 /*** Use various objects ***/
3924 /* Inscribe an object */
3927 do_cmd_inscribe(p_ptr);
3931 /* Uninscribe an object */
3934 do_cmd_uninscribe(p_ptr);
3938 /* Activate an artifact */
3941 do_cmd_activate(p_ptr);
3948 do_cmd_eat_food(p_ptr);
3952 /* Fuel your lantern/torch */
3955 do_cmd_refill(p_ptr);
3962 do_cmd_fire(p_ptr, SP_NONE);
3969 do_cmd_throw(p_ptr, 1, FALSE, -1);
3976 do_cmd_aim_wand(p_ptr);
3983 if (use_command && rogue_like_commands)
3989 do_cmd_zap_rod(p_ptr);
3994 /* Quaff a potion */
3997 do_cmd_quaff_potion(p_ptr);
4004 do_cmd_read_scroll(p_ptr);
4011 if (use_command && !rogue_like_commands)
4014 do_cmd_use_staff(p_ptr);
4018 /* Use racial power */
4021 do_cmd_racial_power(p_ptr);
4026 /*** Looking at Things (nearby or on map) ***/
4028 /* Full dungeon map */
4035 /* Locate player on map */
4038 do_cmd_locate(p_ptr);
4049 /* Target monster or location */
4058 /*** Help and Such ***/
4067 /* Identify symbol */
4070 do_cmd_query_symbol();
4074 /* Character description */
4077 do_cmd_player_status(p_ptr);
4082 /*** System Commands ***/
4084 /* Hack -- User interface */
4091 /* Single line from a pref file */
4100 do_cmd_reload_autopick();
4106 do_cmd_edit_autopick();
4110 /* Interact with macros */
4113 do_cmd_macros(p_ptr);
4117 /* Interact with visuals */
4120 do_cmd_visuals(p_ptr);
4121 do_cmd_redraw(p_ptr);
4125 /* Interact with colors */
4128 do_cmd_colors(p_ptr);
4129 do_cmd_redraw(p_ptr);
4133 /* Interact with options */
4137 (void)combine_and_reorder_home(STORE_HOME);
4138 do_cmd_redraw(p_ptr);
4142 /*** Misc Commands ***/
4158 /* Repeat level feeling */
4161 do_cmd_feeling(p_ptr);
4165 /* Show previous message */
4168 do_cmd_message_one();
4172 /* Show previous messages */
4175 do_cmd_messages(old_now_message);
4179 /* Show quest status -KMW- */
4182 do_cmd_checkquest();
4186 /* Redraw the screen */
4189 now_message = old_now_message;
4190 do_cmd_redraw(p_ptr);
4194 #ifndef VERIFY_SAVEFILE
4196 /* Hack -- Save and don't quit */
4199 do_cmd_save_game(FALSE);
4203 #endif /* VERIFY_SAVEFILE */
4213 case SPECIAL_KEY_QUIT:
4215 do_cmd_save_and_exit();
4219 /* Quit (commit suicide) */
4222 do_cmd_suicide(p_ptr);
4232 /* Check artifacts, uniques, objects */
4239 /* Load "screen dump" */
4242 do_cmd_load_screen();
4246 /* Save "screen dump" */
4249 do_cmd_save_screen();
4253 /* Record/stop "Movie" */
4256 prepare_movie_hooks();
4260 /* Make random artifact list */
4263 spoil_random_artifact("randifact.txt");
4270 if (!p_ptr->wild_mode) do_cmd_travel();
4271 if (p_ptr->special_defense & KATA_MUSOU)
4273 set_action(p_ptr, ACTION_NONE);
4279 /* Hack -- Unknown command */
4282 if (flush_failure) flush();
4286 sound(SOUND_ILLEGAL);
4287 if (!get_rnd_line(_("error_j.txt", "error.txt"), 0, error_m))
4292 prt(_(" '?' でヘルプが表示されます。", "Type '?' for help."), 0, 0);
4298 if (!p_ptr->energy_use && !now_message)
4299 now_message = old_now_message;
4303 * @brief アイテムの所持種類数が超えた場合にアイテムを床に落とす処理 / Hack -- Pack Overflow
4306 static void pack_overflow(void)
4308 if (p_ptr->inventory_list[INVEN_PACK].k_idx)
4310 GAME_TEXT o_name[MAX_NLEN];
4313 /* Is auto-destroy done? */
4314 update_creature(p_ptr);
4315 if (!p_ptr->inventory_list[INVEN_PACK].k_idx) return;
4317 /* Access the slot to be dropped */
4318 o_ptr = &p_ptr->inventory_list[INVEN_PACK];
4320 disturb(FALSE, TRUE);
4323 msg_print(_("ザックからアイテムがあふれた!", "Your pack overflows!"));
4324 object_desc(o_name, o_ptr, 0);
4326 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(INVEN_PACK));
4328 /* Drop it (carefully) near the player */
4329 (void)drop_near(o_ptr, 0, p_ptr->y, p_ptr->x);
4331 /* Modify, Describe, Optimize */
4332 inven_item_increase(INVEN_PACK, -255);
4333 inven_item_describe(INVEN_PACK);
4334 inven_item_optimize(INVEN_PACK);
4341 * @brief プレイヤーの行動エネルギーが充填される(=プレイヤーのターンが回る)毎に行われる処理 / process the effects per 100 energy at player speed.
4344 static void process_upkeep_with_speed(void)
4346 /* Give the player some energy */
4347 if (!load && p_ptr->enchant_energy_need > 0 && !p_ptr->leaving)
4349 p_ptr->enchant_energy_need -= SPEED_TO_ENERGY(p_ptr->pspeed);
4352 /* No current_world_ptr->game_turn yet */
4353 if (p_ptr->enchant_energy_need > 0) return;
4355 while (p_ptr->enchant_energy_need <= 0)
4357 /* Handle the player song */
4358 if (!load) check_music();
4360 /* Hex - Handle the hex spells */
4361 if (!load) check_hex();
4362 if (!load) revenge_spell();
4364 /* There is some randomness of needed energy */
4365 p_ptr->enchant_energy_need += ENERGY_NEED();
4369 static void process_fishing(void)
4371 Term_xtra(TERM_XTRA_DELAY, 10);
4375 bool success = FALSE;
4376 get_mon_num_prep(monster_is_fishing_target, NULL);
4377 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);
4379 if (r_idx && one_in_(2))
4382 y = p_ptr->y + ddy[p_ptr->fishing_dir];
4383 x = p_ptr->x + ddx[p_ptr->fishing_dir];
4384 if (place_monster_aux(0, y, x, r_idx, PM_NO_KAGE))
4386 GAME_TEXT m_name[MAX_NLEN];
4387 monster_desc(m_name, ¤t_floor_ptr->m_list[current_floor_ptr->grid_array[y][x].m_idx], 0);
4388 msg_format(_("%sが釣れた!", "You have a good catch!"), m_name);
4394 msg_print(_("餌だけ食われてしまった!くっそ~!", "Damn! The fish stole your bait!"));
4396 disturb(FALSE, TRUE);
4401 * @brief プレイヤーの行動処理 / Process the player
4404 * Notice the annoying code to handle "pack overflow", which\n
4405 * must come first just in case somebody manages to corrupt\n
4406 * the savefiles by clever use of menu commands or something.\n
4408 static void process_player(void)
4412 /*** Apply energy ***/
4414 if (p_ptr->hack_mutation)
4416 msg_print(_("何か変わった気がする!", "You feel different!"));
4418 (void)gain_mutation(p_ptr, 0);
4419 p_ptr->hack_mutation = FALSE;
4422 if (p_ptr->invoking_midnight_curse)
4425 activate_ty_curse(FALSE, &count);
4426 p_ptr->invoking_midnight_curse = FALSE;
4429 if (p_ptr->phase_out)
4431 for(m_idx = 1; m_idx < current_floor_ptr->m_max; m_idx++)
4433 monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx];
4435 if (!monster_is_valid(m_ptr)) continue;
4437 m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
4438 update_monster(m_idx, FALSE);
4443 /* Give the player some energy */
4444 else if (!(load && p_ptr->energy_need <= 0))
4446 p_ptr->energy_need -= SPEED_TO_ENERGY(p_ptr->pspeed);
4449 /* No current_world_ptr->game_turn yet */
4450 if (p_ptr->energy_need > 0) return;
4451 if (!command_rep) prt_time();
4453 /*** Check for interupts ***/
4455 /* Complete resting */
4456 if (p_ptr->resting < 0)
4459 if (p_ptr->resting == COMMAND_ARG_REST_FULL_HEALING)
4462 if ((p_ptr->chp == p_ptr->mhp) &&
4463 (p_ptr->csp >= p_ptr->msp))
4465 set_action(p_ptr, ACTION_NONE);
4469 /* Complete resting */
4470 else if (p_ptr->resting == COMMAND_ARG_REST_UNTIL_DONE)
4473 if ((p_ptr->chp == p_ptr->mhp) &&
4474 (p_ptr->csp >= p_ptr->msp) &&
4475 !p_ptr->blind && !p_ptr->confused &&
4476 !p_ptr->poisoned && !p_ptr->afraid &&
4477 !p_ptr->stun && !p_ptr->cut &&
4478 !p_ptr->slow && !p_ptr->paralyzed &&
4479 !p_ptr->image && !p_ptr->word_recall &&
4480 !p_ptr->alter_reality)
4482 set_action(p_ptr, ACTION_NONE);
4487 if (p_ptr->action == ACTION_FISH) process_fishing();
4489 /* Handle "abort" */
4492 /* Check for "player abort" (semi-efficiently for resting) */
4493 if (p_ptr->running || travel.run || command_rep || (p_ptr->action == ACTION_REST) || (p_ptr->action == ACTION_FISH))
4498 /* Check for a key */
4501 flush(); /* Flush input */
4503 disturb(FALSE, TRUE);
4505 /* Hack -- Show a Message */
4506 msg_print(_("中断しました。", "Canceled."));
4511 if (p_ptr->riding && !p_ptr->confused && !p_ptr->blind)
4513 monster_type *m_ptr = ¤t_floor_ptr->m_list[p_ptr->riding];
4514 monster_race *r_ptr = &r_info[m_ptr->r_idx];
4516 if (MON_CSLEEP(m_ptr))
4518 GAME_TEXT m_name[MAX_NLEN];
4521 (void)set_monster_csleep(p_ptr->riding, 0);
4522 monster_desc(m_name, m_ptr, 0);
4523 msg_format(_("%^sを起こした。", "You have waked %s up."), m_name);
4526 if (MON_STUNNED(m_ptr))
4528 /* Hack -- Recover from stun */
4529 if (set_monster_stunned(p_ptr->riding,
4530 (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_STUNNED(m_ptr) - 1)))
4532 GAME_TEXT m_name[MAX_NLEN];
4533 monster_desc(m_name, m_ptr, 0);
4534 msg_format(_("%^sを朦朧状態から立ち直らせた。", "%^s is no longer stunned."), m_name);
4538 if (MON_CONFUSED(m_ptr))
4540 /* Hack -- Recover from confusion */
4541 if (set_monster_confused(p_ptr->riding,
4542 (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_CONFUSED(m_ptr) - 1)))
4544 GAME_TEXT m_name[MAX_NLEN];
4545 monster_desc(m_name, m_ptr, 0);
4546 msg_format(_("%^sを混乱状態から立ち直らせた。", "%^s is no longer confused."), m_name);
4550 if (MON_MONFEAR(m_ptr))
4552 /* Hack -- Recover from fear */
4553 if(set_monster_monfear(p_ptr->riding,
4554 (randint0(r_ptr->level) < p_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_MONFEAR(m_ptr) - 1)))
4556 GAME_TEXT m_name[MAX_NLEN];
4557 monster_desc(m_name, m_ptr, 0);
4558 msg_format(_("%^sを恐怖から立ち直らせた。", "%^s is no longer fear."), m_name);
4568 if (p_ptr->lightspeed)
4570 (void)set_lightspeed(p_ptr, p_ptr->lightspeed - 1, TRUE);
4572 if ((p_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
4574 if(P_PTR_KI < 40) P_PTR_KI = 0;
4575 else P_PTR_KI -= 40;
4576 p_ptr->update |= (PU_BONUS);
4578 if (p_ptr->action == ACTION_LEARN)
4581 u32b cost_frac = (p_ptr->msp + 30L) * 256L;
4583 /* Convert the unit (1/2^16) to (1/2^32) */
4584 s64b_LSHIFT(cost, cost_frac, 16);
4586 if (s64b_cmp(p_ptr->csp, p_ptr->csp_frac, cost, cost_frac) < 0)
4590 p_ptr->csp_frac = 0;
4591 set_action(p_ptr, ACTION_NONE);
4596 s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), cost, cost_frac);
4598 p_ptr->redraw |= PR_MANA;
4601 if (p_ptr->special_defense & KATA_MASK)
4603 if (p_ptr->special_defense & KATA_MUSOU)
4607 set_action(p_ptr, ACTION_NONE);
4612 p_ptr->redraw |= (PR_MANA);
4617 /*** Handle actual user input ***/
4619 /* Repeat until out of energy */
4620 while (p_ptr->energy_need <= 0)
4622 p_ptr->window |= PW_PLAYER;
4623 p_ptr->sutemi = FALSE;
4624 p_ptr->counter = FALSE;
4625 p_ptr->now_damaged = FALSE;
4629 /* Place the cursor on the player */
4630 move_cursor_relative(p_ptr->y, p_ptr->x);
4632 /* Refresh (optional) */
4633 if (fresh_before) Term_fresh();
4635 /* Hack -- Pack Overflow */
4638 /* Hack -- cancel "lurking browse mode" */
4639 if (!command_new) command_see = FALSE;
4641 /* Assume free current_world_ptr->game_turn */
4644 if (p_ptr->phase_out)
4646 /* Place the cursor on the player */
4647 move_cursor_relative(p_ptr->y, p_ptr->x);
4649 command_cmd = SPECIAL_KEY_BUILDING;
4651 /* Process the command */
4655 /* Paralyzed or Knocked Out */
4656 else if (p_ptr->paralyzed || (p_ptr->stun >= 100))
4658 take_turn(p_ptr, 100);
4662 else if (p_ptr->action == ACTION_REST)
4665 if (p_ptr->resting > 0)
4667 /* Reduce rest count */
4670 if (!p_ptr->resting) set_action(p_ptr, ACTION_NONE);
4671 p_ptr->redraw |= (PR_STATE);
4674 take_turn(p_ptr, 100);
4678 else if (p_ptr->action == ACTION_FISH)
4680 take_turn(p_ptr, 100);
4684 else if (p_ptr->running)
4692 else if (travel.run)
4699 /* Repeated command */
4700 else if (command_rep)
4702 /* Count this execution */
4705 p_ptr->redraw |= (PR_STATE);
4708 /* Hack -- Assume messages were seen */
4711 /* Clear the top line */
4714 /* Process the command */
4718 /* Normal command */
4721 /* Place the cursor on the player */
4722 move_cursor_relative(p_ptr->y, p_ptr->x);
4725 /* Get a command (normal) */
4726 request_command(FALSE);
4729 /* Process the command */
4733 /* Hack -- Pack Overflow */
4739 if (p_ptr->energy_use)
4741 /* Use some energy */
4742 if (p_ptr->timewalk || p_ptr->energy_use > 400)
4744 /* The Randomness is irrelevant */
4745 p_ptr->energy_need += p_ptr->energy_use * TURNS_PER_TICK / 10;
4749 /* There is some randomness of needed energy */
4750 p_ptr->energy_need += (s16b)((s32b)p_ptr->energy_use * ENERGY_NEED() / 100L);
4753 /* Hack -- constant hallucination */
4754 if (p_ptr->image) p_ptr->redraw |= (PR_MAP);
4756 /* Shimmer multi-hued monsters */
4757 for (m_idx = 1; m_idx < current_floor_ptr->m_max; m_idx++)
4759 monster_type *m_ptr;
4760 monster_race *r_ptr;
4762 m_ptr = ¤t_floor_ptr->m_list[m_idx];
4763 if (!monster_is_valid(m_ptr)) continue;
4765 /* Skip unseen monsters */
4766 if (!m_ptr->ml) continue;
4768 /* Access the monster race */
4769 r_ptr = &r_info[m_ptr->ap_r_idx];
4771 /* Skip non-multi-hued monsters */
4772 if (!(r_ptr->flags1 & (RF1_ATTR_MULTI | RF1_SHAPECHANGER)))
4775 /* Redraw regardless */
4776 lite_spot(m_ptr->fy, m_ptr->fx);
4780 /* Handle monster detection */
4781 if (repair_monsters)
4783 /* Reset the flag */
4784 repair_monsters = FALSE;
4786 /* Rotate detection flags */
4787 for (m_idx = 1; m_idx < current_floor_ptr->m_max; m_idx++)
4789 monster_type *m_ptr;
4790 m_ptr = ¤t_floor_ptr->m_list[m_idx];
4791 if (!monster_is_valid(m_ptr)) continue;
4793 /* Nice monsters get mean */
4794 if (m_ptr->mflag & MFLAG_NICE)
4796 /* Nice monsters get mean */
4797 m_ptr->mflag &= ~(MFLAG_NICE);
4800 /* Handle memorized monsters */
4801 if (m_ptr->mflag2 & MFLAG2_MARK)
4803 /* Maintain detection */
4804 if (m_ptr->mflag2 & MFLAG2_SHOW)
4807 m_ptr->mflag2 &= ~(MFLAG2_SHOW);
4809 /* Still need repairs */
4810 repair_monsters = TRUE;
4813 /* Remove detection */
4817 m_ptr->mflag2 &= ~(MFLAG2_MARK);
4819 /* Assume invisible */
4821 update_monster(m_idx, FALSE);
4823 if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH);
4824 if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH);
4826 /* Redraw regardless */
4827 lite_spot(m_ptr->fy, m_ptr->fx);
4832 if (p_ptr->pclass == CLASS_IMITATOR)
4835 if (p_ptr->mane_num > (p_ptr->lev > 44 ? 3 : p_ptr->lev > 29 ? 2 : 1))
4838 for (j = 0; j < p_ptr->mane_num; j++)
4840 p_ptr->mane_spell[j] = p_ptr->mane_spell[j + 1];
4841 p_ptr->mane_dam[j] = p_ptr->mane_dam[j + 1];
4844 p_ptr->new_mane = FALSE;
4845 p_ptr->redraw |= (PR_IMITATION);
4847 if (p_ptr->action == ACTION_LEARN)
4849 p_ptr->new_mane = FALSE;
4850 p_ptr->redraw |= (PR_STATE);
4853 if (p_ptr->timewalk && (p_ptr->energy_need > - 1000))
4856 p_ptr->redraw |= (PR_MAP);
4857 p_ptr->update |= (PU_MONSTERS);
4858 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
4860 msg_print(_("「時は動きだす…」", "You feel time flowing around you once more."));
4862 p_ptr->timewalk = FALSE;
4863 p_ptr->energy_need = ENERGY_NEED();
4869 /* Hack -- notice death */
4870 if (!p_ptr->playing || p_ptr->is_dead)
4872 p_ptr->timewalk = FALSE;
4877 if (p_ptr->energy_use && p_ptr->reset_concent) reset_concentration(TRUE);
4879 /* Handle "leaving" */
4880 if (p_ptr->leaving) break;
4883 /* Update scent trail */
4888 * @brief 現在プレイヤーがいるダンジョンの全体処理 / Interact with the current dungeon level.
4892 * この関数から現在の階層を出る、プレイヤーがキャラが死ぬ、
4893 * ゲームを終了するかのいずれかまでループする。
4896 * This function will not exit until the level is completed,\n
4897 * the user dies, or the game is terminated.\n
4900 static void dungeon(bool load_game)
4904 /* Set the base level */
4905 current_floor_ptr->base_level = current_floor_ptr->dun_level;
4907 /* Reset various flags */
4908 current_world_ptr->is_loading_now = FALSE;
4911 p_ptr->leaving = FALSE;
4913 /* Reset the "command" vars */
4916 #if 0 /* Don't reset here --- It's used for Arena */
4925 /* Cancel the target */
4927 p_ptr->pet_t_m_idx = 0;
4928 p_ptr->riding_t_m_idx = 0;
4929 p_ptr->ambush_flag = FALSE;
4931 /* Cancel the health bar */
4934 /* Check visual effects */
4935 repair_monsters = TRUE;
4936 repair_objects = TRUE;
4939 disturb(TRUE, TRUE);
4941 /* Get index of current quest (if any) */
4942 quest_num = quest_number(current_floor_ptr->dun_level);
4944 /* Inside a quest? */
4947 /* Mark the quest monster */
4948 r_info[quest[quest_num].r_idx].flags1 |= RF1_QUESTOR;
4951 /* Track maximum player level */
4952 if (p_ptr->max_plv < p_ptr->lev)
4954 p_ptr->max_plv = p_ptr->lev;
4958 /* Track maximum dungeon level (if not in quest -KMW-) */
4959 if ((max_dlv[p_ptr->dungeon_idx] < current_floor_ptr->dun_level) && !p_ptr->inside_quest)
4961 max_dlv[p_ptr->dungeon_idx] = current_floor_ptr->dun_level;
4962 if (record_maxdepth) exe_write_diary(p_ptr, NIKKI_MAXDEAPTH, current_floor_ptr->dun_level, NULL);
4965 (void)calculate_upkeep(p_ptr);
4967 /* Validate the panel */
4968 panel_bounds_center();
4970 /* Verify the panel */
4976 /* Enter "xtra" mode */
4977 current_world_ptr->character_xtra = TRUE;
4979 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER | PW_MONSTER | PW_OVERHEAD | PW_DUNGEON);
4980 p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_EQUIPPY | PR_MAP);
4981 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);
4985 /* Leave "xtra" mode */
4986 current_world_ptr->character_xtra = FALSE;
4988 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
4989 p_ptr->update |= (PU_COMBINE | PU_REORDER);
4993 if (quest_num && (is_fixed_quest_idx(quest_num) &&
4994 !((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT) ||
4995 !(quest[quest_num].flags & QUEST_FLAG_PRESET)))) do_cmd_feeling(p_ptr);
4997 if (p_ptr->phase_out)
5001 p_ptr->energy_need = 0;
5002 update_gambling_monsters();
5006 msg_print(_("試合開始!", "Ready..Fight!"));
5011 if ((p_ptr->pclass == CLASS_BARD) && (SINGING_SONG_EFFECT(p_ptr) > MUSIC_DETECT))
5012 SINGING_SONG_EFFECT(p_ptr) = MUSIC_DETECT;
5014 /* Hack -- notice death or departure */
5015 if (!p_ptr->playing || p_ptr->is_dead) return;
5017 /* Print quest message if appropriate */
5018 if (!p_ptr->inside_quest && (p_ptr->dungeon_idx == DUNGEON_ANGBAND))
5020 quest_discovery(random_quest_number(current_floor_ptr->dun_level));
5021 p_ptr->inside_quest = random_quest_number(current_floor_ptr->dun_level);
5023 if ((current_floor_ptr->dun_level == d_info[p_ptr->dungeon_idx].maxdepth) && d_info[p_ptr->dungeon_idx].final_guardian)
5025 if (r_info[d_info[p_ptr->dungeon_idx].final_guardian].max_num)
5027 msg_format("この階には%sの主である%sが棲んでいる。",
5028 d_name+d_info[p_ptr->dungeon_idx].name,
5029 r_name+r_info[d_info[p_ptr->dungeon_idx].final_guardian].name);
5031 msg_format("%^s lives in this level as the keeper of %s.",
5032 r_name+r_info[d_info[p_ptr->dungeon_idx].final_guardian].name,
5033 d_name+d_info[p_ptr->dungeon_idx].name);
5037 if (!load_game && (p_ptr->special_defense & NINJA_S_STEALTH)) set_superstealth(p_ptr, FALSE);
5039 /*** Process this dungeon level ***/
5041 /* Reset the monster generation level */
5042 current_floor_ptr->monster_level = current_floor_ptr->base_level;
5044 /* Reset the object generation level */
5045 current_floor_ptr->object_level = current_floor_ptr->base_level;
5047 current_world_ptr->is_loading_now = TRUE;
5049 if (p_ptr->energy_need > 0 && !p_ptr->phase_out &&
5050 (current_floor_ptr->dun_level || p_ptr->leaving_dungeon || p_ptr->inside_arena))
5051 p_ptr->energy_need = 0;
5053 /* Not leaving dungeon */
5054 p_ptr->leaving_dungeon = FALSE;
5056 /* Initialize monster process */
5062 /* Hack -- Compact the monster list occasionally */
5063 if ((current_floor_ptr->m_cnt + 32 > current_floor_ptr->max_m_idx) && !p_ptr->phase_out) compact_monsters(64);
5065 /* Hack -- Compress the monster list occasionally */
5066 if ((current_floor_ptr->m_cnt + 32 < current_floor_ptr->m_max) && !p_ptr->phase_out) compact_monsters(0);
5069 /* Hack -- Compact the object list occasionally */
5070 if (current_floor_ptr->o_cnt + 32 > current_floor_ptr->max_o_idx) compact_objects(64);
5072 /* Hack -- Compress the object list occasionally */
5073 if (current_floor_ptr->o_cnt + 32 < current_floor_ptr->o_max) compact_objects(0);
5075 /* Process the player */
5077 process_upkeep_with_speed();
5081 /* Hack -- Hilite the player */
5082 move_cursor_relative(p_ptr->y, p_ptr->x);
5084 /* Optional fresh */
5085 if (fresh_after) Term_fresh();
5087 /* Hack -- Notice death or departure */
5088 if (!p_ptr->playing || p_ptr->is_dead) break;
5090 /* Process all of the monsters */
5095 /* Hack -- Hilite the player */
5096 move_cursor_relative(p_ptr->y, p_ptr->x);
5098 /* Optional fresh */
5099 if (fresh_after) Term_fresh();
5101 /* Hack -- Notice death or departure */
5102 if (!p_ptr->playing || p_ptr->is_dead) break;
5104 /* Process the world */
5109 /* Hack -- Hilite the player */
5110 move_cursor_relative(p_ptr->y, p_ptr->x);
5112 /* Optional fresh */
5113 if (fresh_after) Term_fresh();
5115 /* Hack -- Notice death or departure */
5116 if (!p_ptr->playing || p_ptr->is_dead) break;
5118 /* Count game turns */
5119 current_world_ptr->game_turn++;
5121 if (current_world_ptr->dungeon_turn < current_world_ptr->dungeon_turn_limit)
5123 if (!p_ptr->wild_mode || wild_regen) current_world_ptr->dungeon_turn++;
5124 else if (p_ptr->wild_mode && !(current_world_ptr->game_turn % ((MAX_HGT + MAX_WID) / 2))) current_world_ptr->dungeon_turn++;
5127 prevent_turn_overflow();
5129 /* Handle "leaving" */
5130 if (p_ptr->leaving) break;
5132 if (wild_regen) wild_regen--;
5135 /* Inside a quest and non-unique questor? */
5136 if (quest_num && !(r_info[quest[quest_num].r_idx].flags1 & RF1_UNIQUE))
5138 /* Un-mark the quest monster */
5139 r_info[quest[quest_num].r_idx].flags1 &= ~RF1_QUESTOR;
5142 /* Not save-and-quit and not dead? */
5143 if (p_ptr->playing && !p_ptr->is_dead)
5146 * Maintain Unique monsters and artifact, save current
5147 * floor, then prepare next floor
5149 leave_floor(p_ptr->change_floor_mode);
5151 /* Forget the flag */
5152 reinit_wilderness = FALSE;
5155 /* Write about current level on the play record once per level */
5161 * @brief 全ユーザプロファイルをロードする / Load some "user pref files"
5164 * Modified by Arcum Dagsson to support
5165 * separate macro files for different realms.
5167 static void load_all_pref_files(void)
5171 /* Access the "user" pref file */
5172 sprintf(buf, "user.prf");
5174 /* Process that file */
5175 process_pref_file(buf);
5177 /* Access the "user" system pref file */
5178 sprintf(buf, "user-%s.prf", ANGBAND_SYS);
5180 /* Process that file */
5181 process_pref_file(buf);
5183 /* Access the "race" pref file */
5184 sprintf(buf, "%s.prf", rp_ptr->title);
5186 /* Process that file */
5187 process_pref_file(buf);
5189 /* Access the "class" pref file */
5190 sprintf(buf, "%s.prf", cp_ptr->title);
5192 /* Process that file */
5193 process_pref_file(buf);
5195 /* Access the "character" pref file */
5196 sprintf(buf, "%s.prf", p_ptr->base_name);
5198 /* Process that file */
5199 process_pref_file(buf);
5201 /* Access the "realm 1" pref file */
5202 if (p_ptr->realm1 != REALM_NONE)
5204 sprintf(buf, "%s.prf", realm_names[p_ptr->realm1]);
5206 /* Process that file */
5207 process_pref_file(buf);
5210 /* Access the "realm 2" pref file */
5211 if (p_ptr->realm2 != REALM_NONE)
5213 sprintf(buf, "%s.prf", realm_names[p_ptr->realm2]);
5215 /* Process that file */
5216 process_pref_file(buf);
5220 /* Load an autopick preference file */
5221 autopick_load_pref(FALSE);
5225 * @brief 1ゲームプレイの主要ルーチン / Actually play a game
5228 * If the "new_game" parameter is true, then, after loading the
5229 * savefile, we will commit suicide, if necessary, to allow the
5230 * player to start a new game.
5232 void play_game(bool new_game)
5235 bool load_game = TRUE;
5236 bool init_random_seed = FALSE;
5246 else if (chuukei_server)
5248 prepare_chuukei_hooks();
5259 p_ptr->hack_mutation = FALSE;
5261 /* Hack -- Character is "icky" */
5262 current_world_ptr->character_icky = TRUE;
5264 /* Make sure main term is active */
5265 Term_activate(angband_term[0]);
5267 /* Initialise the resize hooks */
5268 angband_term[0]->resize_hook = resize_map;
5270 for (i = 1; i < 8; i++)
5272 /* Does the term exist? */
5273 if (angband_term[i])
5275 /* Add the redraw on resize hook */
5276 angband_term[i]->resize_hook = redraw_window;
5280 /* Hack -- current_world_ptr->game_turn off the cursor */
5281 (void)Term_set_cursor(0);
5284 /* Attempt to load */
5287 quit(_("セーブファイルが壊れています", "broken savefile"));
5290 /* Extract the options */
5291 extract_option_vars();
5293 /* Report waited score */
5294 if (p_ptr->wait_report_score)
5299 if (!get_check_strict(_("待機していたスコア登録を今行ないますか?", "Do you register score now? "), CHECK_NO_HISTORY))
5302 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
5303 update_creature(p_ptr);
5305 p_ptr->is_dead = TRUE;
5307 current_world_ptr->start_time = (u32b)time(NULL);
5309 /* No suspending now */
5310 signals_ignore_tstp();
5312 /* Hack -- Character is now "icky" */
5313 current_world_ptr->character_icky = TRUE;
5314 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
5316 /* Open the high score file, for reading/writing */
5317 highscore_fd = fd_open(buf, O_RDWR);
5319 /* 町名消失バグ対策(#38205)のためここで世界マップ情報を読み出す */
5320 process_dungeon_file("w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
5322 /* Handle score, show Top scores */
5323 success = send_world_score(TRUE);
5325 if (!success && !get_check_strict(_("スコア登録を諦めますか?", "Do you give up score registration? "), CHECK_NO_HISTORY))
5327 prt(_("引き続き待機します。", "standing by for future registration..."), 0, 0);
5332 p_ptr->wait_report_score = FALSE;
5334 if (!save_player()) msg_print(_("セーブ失敗!", "death save failed!"));
5336 /* Shut the high score file */
5337 (void)fd_close(highscore_fd);
5339 /* Forget the high score fd */
5342 /* Allow suspending now */
5343 signals_handle_tstp();
5348 current_world_ptr->creating_savefile = new_game;
5350 /* Nothing loaded */
5351 if (!current_world_ptr->character_loaded)
5353 /* Make new player */
5356 /* The dungeon is not ready */
5357 current_world_ptr->character_dungeon = FALSE;
5359 /* Prepare to init the RNG */
5360 init_random_seed = TRUE;
5362 /* Initialize the saved floors data */
5363 init_saved_floors(FALSE);
5366 /* Old game is loaded. But new game is requested. */
5369 /* Initialize the saved floors data */
5370 init_saved_floors(TRUE);
5373 /* Process old character */
5376 /* Process the player name */
5377 process_player_name(FALSE);
5381 if (init_random_seed)
5386 /* Roll new character */
5389 /* The dungeon is not ready */
5390 current_world_ptr->character_dungeon = FALSE;
5393 current_floor_ptr->dun_level = 0;
5394 p_ptr->inside_quest = 0;
5395 p_ptr->inside_arena = FALSE;
5396 p_ptr->phase_out = FALSE;
5400 /* Hack -- seed for flavors */
5401 current_world_ptr->seed_flavor = randint0(0x10000000);
5403 /* Hack -- seed for town layout */
5404 current_world_ptr->seed_town = randint0(0x10000000);
5406 /* Roll up a new character */
5407 player_birth(p_ptr);
5414 determine_bounty_uniques();
5415 determine_today_mon(FALSE);
5417 /* Initialize object array */
5422 write_level = FALSE;
5424 exe_write_diary(p_ptr, NIKKI_GAMESTART, 1,
5426 " ---- Restart Game ----"));
5429 * 1.0.9 以前はセーブ前に p_ptr->riding = -1 としていたので、再設定が必要だった。
5430 * もう不要だが、以前のセーブファイルとの互換のために残しておく。
5432 if (p_ptr->riding == -1)
5435 for (i = current_floor_ptr->m_max; i > 0; i--)
5437 if (player_bold(current_floor_ptr->m_list[i].fy, current_floor_ptr->m_list[i].fx))
5446 current_world_ptr->creating_savefile = FALSE;
5448 p_ptr->teleport_town = FALSE;
5449 p_ptr->sutemi = FALSE;
5450 current_world_ptr->timewalk_m_idx = 0;
5451 p_ptr->now_damaged = FALSE;
5453 current_world_ptr->start_time = time(NULL) - 1;
5454 record_o_name[0] = '\0';
5456 /* Reset map panel */
5457 panel_row_min = current_floor_ptr->height;
5458 panel_col_min = current_floor_ptr->width;
5460 /* Sexy gal gets bonus to maximum weapon skill of whip */
5461 if (p_ptr->pseikaku == SEIKAKU_SEXY)
5462 s_info[p_ptr->pclass].w_max[TV_HAFTED-TV_WEAPON_BEGIN][SV_WHIP] = WEAPON_EXP_MASTER;
5464 /* Fill the arrays of floors and walls in the good proportions */
5465 set_floor_and_wall(p_ptr->dungeon_idx);
5467 /* Flavor the objects */
5470 /* Flash a message */
5471 prt(_("お待ち下さい...", "Please wait..."), 0, 0);
5473 /* Flush the message */
5477 /* Hack -- Enter wizard mode */
5480 if (enter_wizard_mode())
5482 current_world_ptr->wizard = TRUE;
5484 if (p_ptr->is_dead || !p_ptr->y || !p_ptr->x)
5486 /* Initialize the saved floors data */
5487 init_saved_floors(TRUE);
5490 p_ptr->inside_quest = 0;
5492 /* Avoid crash in update_view() */
5493 p_ptr->y = p_ptr->x = 10;
5496 else if (p_ptr->is_dead)
5498 quit("Already dead.");
5502 /* Initialize the town-buildings if necessary */
5503 if (!current_floor_ptr->dun_level && !p_ptr->inside_quest)
5505 process_dungeon_file("w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
5506 init_flags = INIT_ONLY_BUILDINGS;
5507 process_dungeon_file("t_info.txt", 0, 0, MAX_HGT, MAX_WID);
5508 select_floor_music();
5511 /* Generate a dungeon level if needed */
5512 if (!current_world_ptr->character_dungeon)
5514 change_floor(p_ptr->change_floor_mode);
5518 /* HACK -- Restore from panic-save */
5519 if (p_ptr->panic_save)
5521 /* No player? -- Try to regenerate floor */
5522 if (!p_ptr->y || !p_ptr->x)
5524 msg_print(_("プレイヤーの位置がおかしい。フロアを再生成します。", "What a strange player location. Regenerate the dungeon floor."));
5525 change_floor(p_ptr->change_floor_mode);
5528 /* Still no player? -- Try to locate random place */
5529 if (!p_ptr->y || !p_ptr->x) p_ptr->y = p_ptr->x = 10;
5531 /* No longer in panic */
5532 p_ptr->panic_save = 0;
5536 /* Character is now "complete" */
5537 current_world_ptr->character_generated = TRUE;
5540 /* Hack -- Character is no longer "icky" */
5541 current_world_ptr->character_icky = FALSE;
5547 sprintf(buf, _("%sに降り立った。", "You are standing in the %s."), map_name());
5548 exe_write_diary(p_ptr, NIKKI_BUNSHOU, 0, buf);
5553 p_ptr->playing = TRUE;
5555 /* Reset the visual mappings */
5558 /* Load the "pref" files */
5559 load_all_pref_files();
5561 /* Give startup outfit (after loading pref files) */
5564 player_outfit(p_ptr);
5567 /* React to changes */
5568 Term_xtra(TERM_XTRA_REACT, 0);
5570 p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
5571 p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
5574 /* Set or clear "rogue_like_commands" if requested */
5575 if (arg_force_original) rogue_like_commands = FALSE;
5576 if (arg_force_roguelike) rogue_like_commands = TRUE;
5578 /* Hack -- Enforce "delayed death" */
5579 if (p_ptr->chp < 0) p_ptr->is_dead = TRUE;
5581 if (p_ptr->prace == RACE_ANDROID) calc_android_exp(p_ptr);
5583 if (new_game && ((p_ptr->pclass == CLASS_CAVALRY) || (p_ptr->pclass == CLASS_BEASTMASTER)))
5585 monster_type *m_ptr;
5586 MONRACE_IDX pet_r_idx = ((p_ptr->pclass == CLASS_CAVALRY) ? MON_HORSE : MON_YASE_HORSE);
5587 monster_race *r_ptr = &r_info[pet_r_idx];
5588 place_monster_aux(0, p_ptr->y, p_ptr->x - 1, pet_r_idx,
5589 (PM_FORCE_PET | PM_NO_KAGE));
5590 m_ptr = ¤t_floor_ptr->m_list[hack_m_idx_ii];
5591 m_ptr->mspeed = r_ptr->speed;
5592 m_ptr->maxhp = r_ptr->hdice*(r_ptr->hside+1)/2;
5593 m_ptr->max_maxhp = m_ptr->maxhp;
5594 m_ptr->hp = r_ptr->hdice*(r_ptr->hside+1)/2;
5595 m_ptr->dealt_damage = 0;
5596 m_ptr->energy_need = ENERGY_NEED() + ENERGY_NEED();
5599 (void)combine_and_reorder_home(STORE_HOME);
5600 (void)combine_and_reorder_home(STORE_MUSEUM);
5602 select_floor_music();
5607 /* Process the level */
5610 /* Hack -- prevent "icky" message */
5611 current_world_ptr->character_xtra = TRUE;
5615 current_world_ptr->character_xtra = FALSE;
5617 /* Cancel the target */
5620 /* Cancel the health bar */
5625 clear_mon_lite(current_floor_ptr);
5627 /* Handle "quit and save" */
5628 if (!p_ptr->playing && !p_ptr->is_dead) break;
5630 /* Erase the old current_floor_ptr->grid_array */
5632 if (!p_ptr->is_dead) wipe_m_list();
5639 /* Accidental Death */
5640 if (p_ptr->playing && p_ptr->is_dead)
5642 if (p_ptr->inside_arena)
5644 p_ptr->inside_arena = FALSE;
5645 if (p_ptr->arena_number > MAX_ARENA_MONS)
5646 p_ptr->arena_number++;
5648 p_ptr->arena_number = -1 - p_ptr->arena_number;
5649 p_ptr->is_dead = FALSE;
5651 p_ptr->chp_frac = 0;
5652 p_ptr->exit_bldg = TRUE;
5653 reset_tim_flags(p_ptr);
5655 /* Leave through the exit */
5656 prepare_change_floor_mode(CFM_SAVE_FLOORS | CFM_RAND_CONNECT);
5658 /* prepare next floor */
5659 leave_floor(p_ptr->change_floor_mode);
5663 /* Mega-Hack -- Allow player to cheat death */
5664 if ((current_world_ptr->wizard || cheat_live) && !get_check(_("死にますか? ", "Die? ")))
5671 /* Handle "death" */
5672 if (p_ptr->is_dead) break;
5674 /* Make a new level */
5675 change_floor(p_ptr->change_floor_mode);
5686 * @brief ゲームターンからの実時間換算を行うための補正をかける
5687 * @param hoge ゲームターン
5688 * @details アンデッド種族は18:00からゲームを開始するので、この修正を予め行う。
5689 * @return 修正をかけた後のゲームターン
5691 s32b turn_real(s32b hoge)
5693 switch (p_ptr->start_race)
5699 return hoge - (TURNS_PER_TICK * TOWN_DAWN * 3 / 4);
5706 * @brief ターンのオーバーフローに対する対処
5707 * @details ターン及びターンを記録する変数をターンの限界の1日前まで巻き戻す.
5708 * @return 修正をかけた後のゲームターン
5710 void prevent_turn_overflow(void)
5712 int rollback_days, i, j;
5713 s32b rollback_turns;
5715 if (current_world_ptr->game_turn < current_world_ptr->game_turn_limit) return;
5717 rollback_days = 1 + (current_world_ptr->game_turn - current_world_ptr->game_turn_limit) / (TURNS_PER_TICK * TOWN_DAWN);
5718 rollback_turns = TURNS_PER_TICK * TOWN_DAWN * rollback_days;
5720 if (current_world_ptr->game_turn > rollback_turns) current_world_ptr->game_turn -= rollback_turns;
5721 else current_world_ptr->game_turn = 1;
5722 if (current_floor_ptr->generated_turn > rollback_turns) current_floor_ptr->generated_turn -= rollback_turns;
5723 else current_floor_ptr->generated_turn = 1;
5724 if (current_world_ptr->arena_start_turn > rollback_turns) current_world_ptr->arena_start_turn -= rollback_turns;
5725 else current_world_ptr->arena_start_turn = 1;
5726 if (p_ptr->feeling_turn > rollback_turns) p_ptr->feeling_turn -= rollback_turns;
5727 else p_ptr->feeling_turn = 1;
5729 for (i = 1; i < max_towns; i++)
5731 for (j = 0; j < MAX_STORES; j++)
5733 store_type *st_ptr = &town_info[i].store[j];
5735 if (st_ptr->last_visit > -10L * TURNS_PER_TICK * STORE_TICKS)
5737 st_ptr->last_visit -= rollback_turns;
5738 if (st_ptr->last_visit < -10L * TURNS_PER_TICK * STORE_TICKS) st_ptr->last_visit = -10L * TURNS_PER_TICK * STORE_TICKS;
5741 if (st_ptr->store_open)
5743 st_ptr->store_open -= rollback_turns;
5744 if (st_ptr->store_open < 1) st_ptr->store_open = 1;
5752 * Close up the current game (player may or may not be dead)
5756 * This function is called only from "main.c" and "signals.c".
5759 void close_game(void)
5762 bool do_send = TRUE;
5764 /* concptr p = "[i:キャラクタの情報, f:ファイル書き出し, t:スコア, x:*鑑定*, ESC:ゲーム終了]"; */
5767 /* Flush the messages */
5770 /* Flush the input */
5774 /* No suspending now */
5775 signals_ignore_tstp();
5778 /* Hack -- Character is now "icky" */
5779 current_world_ptr->character_icky = TRUE;
5781 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
5783 /* Grab permissions */
5786 /* Open the high score file, for reading/writing */
5787 highscore_fd = fd_open(buf, O_RDWR);
5789 /* Drop permissions */
5795 /* Handle retirement */
5796 if (p_ptr->total_winner) kingly();
5799 if (!cheat_save || get_check(_("死んだデータをセーブしますか? ", "Save death? ")))
5801 if (!save_player()) msg_print(_("セーブ失敗!", "death save failed!"));
5803 else do_send = FALSE;
5810 /* Show more info */
5816 if ((!send_world_score(do_send)))
5818 if (get_check_strict(_("後でスコアを登録するために待機しますか?", "Stand by for later score registration? "),
5819 (CHECK_NO_ESCAPE | CHECK_NO_HISTORY)))
5821 p_ptr->wait_report_score = TRUE;
5822 p_ptr->is_dead = FALSE;
5823 if (!save_player()) msg_print(_("セーブ失敗!", "death save failed!"));
5826 if (!p_ptr->wait_report_score)
5829 else if (highscore_fd >= 0)
5831 display_scores_aux(0, 10, -1, NULL);
5834 /* Dump bones file */
5843 do_cmd_save_game(FALSE);
5845 /* Prompt for scores */
5846 prt(_("リターンキーか ESC キーを押して下さい。", "Press Return (or Escape)."), 0, 40);
5847 play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_EXIT);
5849 /* Predict score (or ESCAPE) */
5850 if (inkey() != ESCAPE) predict_score();
5854 /* Shut the high score file */
5855 (void)fd_close(highscore_fd);
5857 /* Forget the high score fd */
5860 /* Kill all temporal files */
5861 clear_saved_floor_files();
5863 /* Allow suspending now */
5864 signals_handle_tstp();
5869 * @brief 全更新処理をチェックして処理していく
5870 * Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window"
5873 void handle_stuff(void)
5875 if (p_ptr->update) update_creature(p_ptr);
5876 if (p_ptr->redraw) redraw_stuff();
5877 if (p_ptr->window) window_stuff();
5880 void update_output(void)
5882 if (p_ptr->redraw) redraw_stuff();
5883 if (p_ptr->window) window_stuff();