3 @brief Angbandゲームエンジン / Angband game engine
6 Copyright (c) 1989 James E. Wilson, Robert A. Koeneke\n
7 This software may be copied and distributed for educational, research, and\n
8 not for profit purposes provided that this copyright and statement are\n
9 included in all such copies.\n
10 2013 Deskull rearranged comment for Doxygen.
14 #include "signal-handlers.h"
25 #include "cmd/cmd-activate.h"
26 #include "cmd/cmd-dump.h"
27 #include "cmd/cmd-eat.h"
28 #include "cmd/cmd-help.h"
29 #include "cmd/cmd-hissatsu.h"
30 #include "cmd/cmd-item.h"
31 #include "cmd/cmd-magiceat.h"
32 #include "cmd/cmd-mane.h"
33 #include "cmd/cmd-quaff.h"
34 #include "cmd/cmd-read.h"
35 #include "cmd/cmd-smith.h"
36 #include "cmd/cmd-usestaff.h"
37 #include "cmd/cmd-zaprod.h"
38 #include "cmd/cmd-zapwand.h"
39 #include "cmd/cmd-pet.h"
40 #include "cmd-basic.h"
46 #include "floor-events.h"
47 #include "floor-town.h"
49 #include "object-ego.h"
50 #include "object-curse.h"
51 #include "object-flavor.h"
54 #include "spells-summon.h"
55 #include "spells-object.h"
56 #include "spells-status.h"
57 #include "spells-floor.h"
58 #include "monster-spell.h"
65 #include "view/display-player.h"
66 #include "player/process-name.h"
67 #include "player-move.h"
68 #include "player-status.h"
69 #include "player-class.h"
70 #include "player-race.h"
71 #include "player-personality.h"
72 #include "player-damage.h"
73 #include "player-effects.h"
74 #include "cmd-spell.h"
75 #include "realm-hex.h"
76 #include "objectkind.h"
77 #include "object-hook.h"
79 #include "monster-process.h"
80 #include "monster-status.h"
81 #include "monsterrace-hook.h"
82 #include "floor-save.h"
84 #include "player-skill.h"
85 #include "player-inventory.h"
87 #include "view-mainwindow.h"
88 #include "dungeon-file.h"
89 #include "uid-checker.h"
90 #include "player/process-death.h"
96 #include "realm-song.h"
97 #include "targeting.h"
101 * Hack -- Link a copyright message into the executable
103 const concptr copyright[5] =
105 "Copyright (c) 1989 James E. Wilson, Robert A. Keoneke",
107 "This software may be copied and distributed for educational, research,",
108 "and not for profit purposes provided that this copyright and statement",
109 "are included in all such copies."
112 bool can_save = FALSE;
114 COMMAND_CODE now_message;
116 bool repair_monsters;
119 concptr ANGBAND_SYS = "xxx";
122 concptr ANGBAND_KEYBOARD = "JAPAN";
124 concptr ANGBAND_KEYBOARD = "0";
127 concptr ANGBAND_GRAF = "ascii";
129 static bool load = TRUE; /*!<ロード処理中の分岐フラグ*/
130 static int wild_regen = 20; /*!<広域マップ移動時の自然回復処理カウンタ(広域マップ1マス毎に20回処理を基本とする)*/
133 * Flags for initialization
138 * @brief 擬似鑑定を実際に行い判定を反映する
139 * @param slot 擬似鑑定を行うプレイヤーの所持リストID
140 * @param creature_ptr プレーヤーへの参照ポインタ
141 * @param heavy 重度の擬似鑑定を行うならばTRUE
144 static void sense_inventory_aux(player_type *creature_ptr, INVENTORY_IDX slot, bool heavy)
147 object_type *o_ptr = &creature_ptr->inventory_list[slot];
148 GAME_TEXT o_name[MAX_NLEN];
149 if (o_ptr->ident & (IDENT_SENSE))return;
150 if (object_is_known(o_ptr)) return;
152 feel = (heavy ? value_check_aux1(o_ptr) : value_check_aux2(o_ptr));
155 if ((creature_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 if (disturb_minor) disturb(creature_ptr, FALSE, FALSE);
205 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
206 if (slot >= INVEN_RARM)
209 msg_format("%s%s(%c)は%sという感じがする...",
210 describe_use(creature_ptr, slot), o_name, index_to_label(slot), game_inscriptions[feel]);
212 msg_format("You feel the %s (%c) you are %s %s %s...",
213 o_name, index_to_label(slot), describe_use(creature_ptr, slot),
214 ((o_ptr->number == 1) ? "is" : "are"),
215 game_inscriptions[feel]);
222 msg_format("ザックの中の%s(%c)は%sという感じがする...",
223 o_name, index_to_label(slot), game_inscriptions[feel]);
225 msg_format("You feel the %s (%c) in your pack %s %s...",
226 o_name, index_to_label(slot),
227 ((o_ptr->number == 1) ? "is" : "are"),
228 game_inscriptions[feel]);
233 o_ptr->ident |= (IDENT_SENSE);
234 o_ptr->feeling = feel;
236 autopick_alter_item(creature_ptr, slot, destroy_feeling);
237 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
238 creature_ptr->window |= (PW_INVEN | PW_EQUIP);
243 * @brief 1プレイヤーターン毎に武器、防具の擬似鑑定が行われるかを判定する。
246 * Sense the inventory\n
248 * Class 0 = Warrior --> fast and heavy\n
249 * Class 1 = Mage --> slow and light\n
250 * Class 2 = Priest --> fast but light\n
251 * Class 3 = Rogue --> okay and heavy\n
252 * Class 4 = Ranger --> slow but heavy (changed!)\n
253 * Class 5 = Paladin --> slow but heavy\n
255 static void sense_inventory1(player_type *creature_ptr)
257 PLAYER_LEVEL plev = creature_ptr->lev;
260 if (creature_ptr->confused) return;
262 switch (creature_ptr->pclass)
269 if (0 != randint0(9000L / (plev * plev + 40))) return;
276 if (0 != randint0(6000L / (plev * plev + 50))) return;
282 case CLASS_HIGH_MAGE:
284 case CLASS_MAGIC_EATER:
286 if (0 != randint0(240000L / (plev + 5))) return;
293 if (0 != randint0(10000L / (plev * plev + 40))) return;
300 if (0 != randint0(20000L / (plev * plev + 40))) return;
307 if (0 != randint0(95000L / (plev * plev + 40))) return;
315 if (0 != randint0(77777L / (plev * plev + 40))) return;
320 case CLASS_WARRIOR_MAGE:
323 if (0 != randint0(75000L / (plev * plev + 40))) return;
327 case CLASS_MINDCRAFTER:
329 case CLASS_BLUE_MAGE:
330 case CLASS_MIRROR_MASTER:
332 if (0 != randint0(55000L / (plev * plev + 40))) return;
336 case CLASS_CHAOS_WARRIOR:
338 if (0 != randint0(80000L / (plev * plev + 40))) return;
344 case CLASS_FORCETRAINER:
346 if (0 != randint0(20000L / (plev * plev + 40))) return;
352 if (0 != randint0(20000L / ((plev + 50)*(plev + 50)))) return;
357 case CLASS_BEASTMASTER:
359 if (0 != randint0(65000L / (plev * plev + 40))) return;
363 case CLASS_BERSERKER:
370 if (compare_virtue(creature_ptr, V_KNOWLEDGE, 100, VIRTUE_LARGE)) heavy = TRUE;
372 for (INVENTORY_IDX i = 0; i < INVEN_TOTAL; i++)
376 o_ptr = &creature_ptr->inventory_list[i];
378 if (!o_ptr->k_idx) continue;
407 if ((i < INVEN_RARM) && (0 != randint0(5))) continue;
409 if ((creature_ptr->muta3 & MUT3_GOOD_LUCK) && !randint0(13))
414 sense_inventory_aux(creature_ptr, i, heavy);
420 * @brief 1プレイヤーターン毎に武器、防具以外の擬似鑑定が行われるかを判定する。
423 static void sense_inventory2(player_type *creature_ptr)
425 PLAYER_LEVEL plev = creature_ptr->lev;
428 if (creature_ptr->confused) return;
430 switch (creature_ptr->pclass)
436 case CLASS_BERSERKER:
443 case CLASS_CHAOS_WARRIOR:
445 case CLASS_BEASTMASTER:
448 if (0 != randint0(240000L / (plev + 5))) return;
453 case CLASS_WARRIOR_MAGE:
457 if (0 != randint0(95000L / (plev * plev + 40))) return;
464 case CLASS_FORCETRAINER:
465 case CLASS_MINDCRAFTER:
467 if (0 != randint0(20000L / (plev * plev + 40))) return;
472 case CLASS_HIGH_MAGE:
474 case CLASS_MAGIC_EATER:
475 case CLASS_MIRROR_MASTER:
476 case CLASS_BLUE_MAGE:
478 if (0 != randint0(9000L / (plev * plev + 40))) return;
484 if (0 != randint0(20000L / ((plev + 50)*(plev + 50)))) return;
490 for (INVENTORY_IDX i = 0; i < INVEN_TOTAL; i++)
493 o_ptr = &creature_ptr->inventory_list[i];
494 if (!o_ptr->k_idx) continue;
509 if ((i < INVEN_RARM) && (0 != randint0(5))) continue;
511 sense_inventory_aux(creature_ptr, i, TRUE);
517 * @brief パターン終点到達時のテレポート処理を行う
518 * @param creature_ptr プレーヤーへの参照ポインタ
521 static void pattern_teleport(player_type *creature_ptr)
524 DEPTH max_level = 99;
526 if (get_check(_("他の階にテレポートしますか?", "Teleport level? ")))
531 if (ironman_downward)
532 min_level = creature_ptr->current_floor_ptr->dun_level;
534 if (creature_ptr->dungeon_idx == DUNGEON_ANGBAND)
536 if (creature_ptr->current_floor_ptr->dun_level > 100)
537 max_level = MAX_DEPTH - 1;
538 else if (creature_ptr->current_floor_ptr->dun_level == 100)
543 max_level = d_info[creature_ptr->dungeon_idx].maxdepth;
544 min_level = d_info[creature_ptr->dungeon_idx].mindepth;
547 sprintf(ppp, _("テレポート先:(%d-%d)", "Teleport to level (%d-%d): "), (int)min_level, (int)max_level);
548 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
549 if (!get_string(ppp, tmp_val, 10)) return;
551 command_arg = (COMMAND_ARG)atoi(tmp_val);
553 else if (get_check(_("通常テレポート?", "Normal teleport? ")))
555 teleport_player(creature_ptr, 200, 0L);
563 if (command_arg < min_level) command_arg = (COMMAND_ARG)min_level;
564 if (command_arg > max_level) command_arg = (COMMAND_ARG)max_level;
566 msg_format(_("%d 階にテレポートしました。", "You teleport to dungeon level %d."), command_arg);
567 if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
569 creature_ptr->current_floor_ptr->dun_level = command_arg;
570 leave_quest_check(creature_ptr);
571 if (record_stair) exe_write_diary(creature_ptr, DIARY_PAT_TELE, 0, NULL);
573 creature_ptr->current_floor_ptr->inside_quest = 0;
574 free_turn(creature_ptr);
577 * Clear all saved floors
578 * and create a first saved floor
580 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
581 creature_ptr->leaving = TRUE;
586 * @brief 各種パターン地形上の特別な処理 / Returns TRUE if we are on the Pattern...
587 * @return 実際にパターン地形上にプレイヤーが居た場合はTRUEを返す。
589 static bool pattern_effect(player_type *creature_ptr)
591 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
592 if (!pattern_tile(floor_ptr, creature_ptr->y, creature_ptr->x)) return FALSE;
594 if ((PRACE_IS_(creature_ptr, RACE_AMBERITE)) &&
595 (creature_ptr->cut > 0) && one_in_(10))
597 wreck_the_pattern(creature_ptr);
600 int pattern_type = f_info[floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].feat].subtype;
601 switch (pattern_type)
603 case PATTERN_TILE_END:
604 (void)set_image(creature_ptr, 0);
605 (void)restore_all_status(creature_ptr);
606 (void)restore_level(creature_ptr);
607 (void)cure_critical_wounds(creature_ptr, 1000);
609 cave_set_feat(creature_ptr, creature_ptr->y, creature_ptr->x, feat_pattern_old);
610 msg_print(_("「パターン」のこの部分は他の部分より強力でないようだ。", "This section of the Pattern looks less powerful."));
613 * We could make the healing effect of the
614 * Pattern center one-time only to avoid various kinds
615 * of abuse, like luring the win monster into fighting you
616 * in the middle of the pattern...
620 case PATTERN_TILE_OLD:
624 case PATTERN_TILE_TELEPORT:
625 pattern_teleport(creature_ptr);
628 case PATTERN_TILE_WRECKED:
629 if (!IS_INVULN(creature_ptr))
630 take_hit(creature_ptr, DAMAGE_NOESCAPE, 200, _("壊れた「パターン」を歩いたダメージ", "walking the corrupted Pattern"), -1);
634 if (PRACE_IS_(creature_ptr, RACE_AMBERITE) && !one_in_(2))
636 else if (!IS_INVULN(creature_ptr))
637 take_hit(creature_ptr, DAMAGE_NOESCAPE, damroll(1, 3), _("「パターン」を歩いたダメージ", "walking the Pattern"), -1);
646 * @brief プレイヤーのHP自然回復処理 / Regenerate hit points -RAK-
647 * @param percent 回復比率
650 static void regenhp(player_type *creature_ptr, int percent)
652 if (creature_ptr->special_defense & KATA_KOUKIJIN) return;
653 if (creature_ptr->action == ACTION_HAYAGAKE) return;
655 HIT_POINT old_chp = creature_ptr->chp;
658 * Extract the new hitpoints
660 * 'percent' is the Regen factor in unit (1/2^16)
662 HIT_POINT new_chp = 0;
663 u32b new_chp_frac = (creature_ptr->mhp * percent + PY_REGEN_HPBASE);
664 s64b_LSHIFT(new_chp, new_chp_frac, 16);
665 s64b_add(&(creature_ptr->chp), &(creature_ptr->chp_frac), new_chp, new_chp_frac);
666 if (0 < s64b_cmp(creature_ptr->chp, creature_ptr->chp_frac, creature_ptr->mhp, 0))
668 creature_ptr->chp = creature_ptr->mhp;
669 creature_ptr->chp_frac = 0;
672 if (old_chp != creature_ptr->chp)
674 creature_ptr->redraw |= (PR_HP);
675 creature_ptr->window |= (PW_PLAYER);
682 * @brief プレイヤーのMP自然回復処理(regen_magic()のサブセット) / Regenerate mana points
683 * @param upkeep_factor ペット維持によるMPコスト量
684 * @param regen_amount 回復量
687 static void regenmana(player_type *creature_ptr, MANA_POINT upkeep_factor, MANA_POINT regen_amount)
689 MANA_POINT old_csp = creature_ptr->csp;
690 s32b regen_rate = regen_amount * 100 - upkeep_factor * PY_REGEN_NORMAL;
693 * Excess mana will decay 32 times faster than normal
696 if (creature_ptr->csp > creature_ptr->msp)
699 u32b decay_frac = (creature_ptr->msp * 32 * PY_REGEN_NORMAL + PY_REGEN_MNBASE);
700 s64b_LSHIFT(decay, decay_frac, 16);
701 s64b_sub(&(creature_ptr->csp), &(creature_ptr->csp_frac), decay, decay_frac);
702 if (creature_ptr->csp < creature_ptr->msp)
704 creature_ptr->csp = creature_ptr->msp;
705 creature_ptr->csp_frac = 0;
709 /* Regenerating mana (unless the player has excess mana) */
710 else if (regen_rate > 0)
712 MANA_POINT new_mana = 0;
713 u32b new_mana_frac = (creature_ptr->msp * regen_rate / 100 + PY_REGEN_MNBASE);
714 s64b_LSHIFT(new_mana, new_mana_frac, 16);
715 s64b_add(&(creature_ptr->csp), &(creature_ptr->csp_frac), new_mana, new_mana_frac);
716 if (creature_ptr->csp >= creature_ptr->msp)
718 creature_ptr->csp = creature_ptr->msp;
719 creature_ptr->csp_frac = 0;
723 /* Reduce mana (even when the player has excess mana) */
726 s32b reduce_mana = 0;
727 u32b reduce_mana_frac = (creature_ptr->msp * (-1) * regen_rate / 100 + PY_REGEN_MNBASE);
728 s64b_LSHIFT(reduce_mana, reduce_mana_frac, 16);
729 s64b_sub(&(creature_ptr->csp), &(creature_ptr->csp_frac), reduce_mana, reduce_mana_frac);
730 if (creature_ptr->csp < 0)
732 creature_ptr->csp = 0;
733 creature_ptr->csp_frac = 0;
737 if (old_csp != creature_ptr->csp)
739 creature_ptr->redraw |= (PR_MANA);
740 creature_ptr->window |= (PW_PLAYER);
741 creature_ptr->window |= (PW_SPELL);
748 * @brief プレイヤーのMP自然回復処理 / Regenerate magic regen_amount: PY_REGEN_NORMAL * 2 (if resting) * 2 (if having regenarate)
749 * @param regen_amount 回復量
752 static void regenmagic(player_type *creature_ptr, int regen_amount)
756 int mult = (dev + adj_mag_mana[creature_ptr->stat_ind[A_INT]]); /* x1 to x2 speed bonus for recharging */
758 for (int i = 0; i < EATER_EXT * 2; i++)
760 if (!creature_ptr->magic_num2[i]) continue;
761 if (creature_ptr->magic_num1[i] == ((long)creature_ptr->magic_num2[i] << 16)) continue;
763 /* Increase remaining charge number like float value */
764 new_mana = (regen_amount * mult * ((long)creature_ptr->magic_num2[i] + 13)) / (dev * 8);
765 creature_ptr->magic_num1[i] += new_mana;
767 /* Check maximum charge */
768 if (creature_ptr->magic_num1[i] > (creature_ptr->magic_num2[i] << 16))
770 creature_ptr->magic_num1[i] = ((long)creature_ptr->magic_num2[i] << 16);
776 for (int i = EATER_EXT * 2; i < EATER_EXT * 3; i++)
778 if (!creature_ptr->magic_num1[i]) continue;
779 if (!creature_ptr->magic_num2[i]) continue;
781 /* Decrease remaining period for charging */
782 new_mana = (regen_amount * mult * ((long)creature_ptr->magic_num2[i] + 10) * EATER_ROD_CHARGE)
783 / (dev * 16 * PY_REGEN_NORMAL);
784 creature_ptr->magic_num1[i] -= new_mana;
786 /* Check minimum remaining period for charging */
787 if (creature_ptr->magic_num1[i] < 0) creature_ptr->magic_num1[i] = 0;
794 * @brief 100ゲームターン毎のモンスターのHP自然回復処理 / Regenerate the monsters (once per 100 game turns)
795 * @param player_ptr プレーヤーへの参照ポインタ
797 * @note Should probably be done during monster turns.
799 static void regenerate_monsters(player_type *player_ptr)
801 for (int i = 1; i < player_ptr->current_floor_ptr->m_max; i++)
803 monster_type *m_ptr = &player_ptr->current_floor_ptr->m_list[i];
804 monster_race *r_ptr = &r_info[m_ptr->r_idx];
806 if (!monster_is_valid(m_ptr)) continue;
808 if (m_ptr->hp < m_ptr->maxhp)
810 int frac = m_ptr->maxhp / 100;
811 if (!frac) if (one_in_(2)) frac = 1;
813 if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2;
816 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
818 if (player_ptr->health_who == i) player_ptr->redraw |= (PR_HEALTH);
819 if (player_ptr->riding == i) player_ptr->redraw |= (PR_UHEALTH);
826 * @brief 30ゲームターン毎のボール中モンスターのHP自然回復処理 / Regenerate the captured monsters (once per 30 game turns)
827 * @param creature_ptr プレーヤーへの参照ポインタ
829 * @note Should probably be done during monster turns.
831 static void regenerate_captured_monsters(player_type *creature_ptr)
834 for (int i = 0; i < INVEN_TOTAL; i++)
837 object_type *o_ptr = &creature_ptr->inventory_list[i];
838 if (!o_ptr->k_idx) continue;
839 if (o_ptr->tval != TV_CAPTURE) continue;
840 if (!o_ptr->pval) continue;
843 r_ptr = &r_info[o_ptr->pval];
844 if (o_ptr->xtra4 < o_ptr->xtra5)
846 int frac = o_ptr->xtra5 / 100;
847 if (!frac) if (one_in_(2)) frac = 1;
849 if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2;
851 o_ptr->xtra4 += (XTRA16)frac;
852 if (o_ptr->xtra4 > o_ptr->xtra5) o_ptr->xtra4 = o_ptr->xtra5;
858 creature_ptr->update |= (PU_COMBINE);
859 creature_ptr->window |= (PW_INVEN);
860 creature_ptr->window |= (PW_EQUIP);
867 * @brief 寿命つき光源の警告メッセージ処理
868 * @param creature_ptr プレーヤーへの参照ポインタ
869 * @param o_ptr 現在光源として使っているオブジェクトの構造体参照ポインタ
872 static void notice_lite_change(player_type *creature_ptr, object_type *o_ptr)
874 if ((o_ptr->xtra4 < 100) || (!(o_ptr->xtra4 % 100)))
876 creature_ptr->window |= (PW_EQUIP);
879 if (creature_ptr->blind)
881 if (o_ptr->xtra4 == 0) o_ptr->xtra4++;
883 else if (o_ptr->xtra4 == 0)
885 disturb(creature_ptr, FALSE, TRUE);
886 msg_print(_("明かりが消えてしまった!", "Your light has gone out!"));
887 creature_ptr->update |= (PU_TORCH);
888 creature_ptr->update |= (PU_BONUS);
890 else if (o_ptr->name2 == EGO_LITE_LONG)
892 if ((o_ptr->xtra4 < 50) && (!(o_ptr->xtra4 % 5))
893 && (current_world_ptr->game_turn % (TURNS_PER_TICK * 2)))
895 if (disturb_minor) disturb(creature_ptr, FALSE, TRUE);
896 msg_print(_("明かりが微かになってきている。", "Your light is growing faint."));
899 else if ((o_ptr->xtra4 < 100) && (!(o_ptr->xtra4 % 10)))
901 if (disturb_minor) disturb(creature_ptr, FALSE, TRUE);
902 msg_print(_("明かりが微かになってきている。", "Your light is growing faint."));
908 * @brief !!を刻んだ魔道具の時間経過による再充填を知らせる処理 / If player has inscribed the object with "!!", let him know when it's recharged. -LM-
909 * @param o_ptr 対象オブジェクトの構造体参照ポインタ
912 static void recharged_notice(player_type *owner_ptr, object_type *o_ptr)
914 if (!o_ptr->inscription) return;
916 concptr s = my_strchr(quark_str(o_ptr->inscription), '!');
921 GAME_TEXT o_name[MAX_NLEN];
922 object_desc(owner_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
924 msg_format("%sは再充填された。", o_name);
926 if (o_ptr->number > 1)
927 msg_format("Your %s are recharged.", o_name);
929 msg_format("Your %s is recharged.", o_name);
931 disturb(owner_ptr, FALSE, FALSE);
935 s = my_strchr(s + 1, '!');
941 * @brief プレイヤーの歌に関する継続処理
944 static void check_music(player_type *caster_ptr)
946 if (caster_ptr->pclass != CLASS_BARD) return;
947 if (!SINGING_SONG_EFFECT(caster_ptr) && !INTERUPTING_SONG_EFFECT(caster_ptr)) return;
949 if (caster_ptr->anti_magic)
951 stop_singing(caster_ptr);
955 int spell = SINGING_SONG_ID(caster_ptr);
956 const magic_type *s_ptr;
957 s_ptr = &technic_info[REALM_MUSIC - MIN_TECHNIC][spell];
959 MANA_POINT need_mana = mod_need_mana(caster_ptr, s_ptr->smana, spell, REALM_MUSIC);
960 u32b need_mana_frac = 0;
962 s64b_RSHIFT(need_mana, need_mana_frac, 1);
963 if (s64b_cmp(caster_ptr->csp, caster_ptr->csp_frac, need_mana, need_mana_frac) < 0)
965 stop_singing(caster_ptr);
970 s64b_sub(&(caster_ptr->csp), &(caster_ptr->csp_frac), need_mana, need_mana_frac);
972 caster_ptr->redraw |= PR_MANA;
973 if (INTERUPTING_SONG_EFFECT(caster_ptr))
975 SINGING_SONG_EFFECT(caster_ptr) = INTERUPTING_SONG_EFFECT(caster_ptr);
976 INTERUPTING_SONG_EFFECT(caster_ptr) = MUSIC_NONE;
977 msg_print(_("歌を再開した。", "You restart singing."));
978 caster_ptr->action = ACTION_SING;
979 caster_ptr->update |= (PU_BONUS | PU_HP | PU_MONSTERS);
980 caster_ptr->redraw |= (PR_MAP | PR_STATUS | PR_STATE);
981 caster_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
985 if (caster_ptr->spell_exp[spell] < SPELL_EXP_BEGINNER)
986 caster_ptr->spell_exp[spell] += 5;
987 else if (caster_ptr->spell_exp[spell] < SPELL_EXP_SKILLED)
989 if (one_in_(2) && (caster_ptr->current_floor_ptr->dun_level > 4) && ((caster_ptr->current_floor_ptr->dun_level + 10) > caster_ptr->lev)) caster_ptr->spell_exp[spell] += 1;
991 else if (caster_ptr->spell_exp[spell] < SPELL_EXP_EXPERT)
993 if (one_in_(5) && ((caster_ptr->current_floor_ptr->dun_level + 5) > caster_ptr->lev) && ((caster_ptr->current_floor_ptr->dun_level + 5) > s_ptr->slevel)) caster_ptr->spell_exp[spell] += 1;
995 else if (caster_ptr->spell_exp[spell] < SPELL_EXP_MASTER)
997 if (one_in_(5) && ((caster_ptr->current_floor_ptr->dun_level + 5) > caster_ptr->lev) && (caster_ptr->current_floor_ptr->dun_level > s_ptr->slevel)) caster_ptr->spell_exp[spell] += 1;
1000 exe_spell(caster_ptr, REALM_MUSIC, spell, SPELL_CONT);
1005 * @brief 現在呪いを保持している装備品を一つランダムに探し出す / Choose one of items that have cursed flag
1006 * @param flag 探し出したい呪いフラグ配列
1007 * @return 該当の呪いが一つでもあった場合にランダムに選ばれた装備品のオブジェクト構造体参照ポインタを返す。\n
1010 static object_type *choose_cursed_obj_name(player_type *player_ptr, BIT_FLAGS flag)
1012 int choices[INVEN_TOTAL - INVEN_RARM];
1014 if (!(player_ptr->cursed & flag)) return NULL;
1016 for (int i = INVEN_RARM; i < INVEN_TOTAL; i++)
1018 object_type *o_ptr = &player_ptr->inventory_list[i];
1019 if (o_ptr->curse_flags & flag)
1021 choices[number] = i;
1024 else if ((flag == TRC_ADD_L_CURSE) ||
1025 (flag == TRC_ADD_H_CURSE) ||
1026 (flag == TRC_DRAIN_HP) ||
1027 (flag == TRC_DRAIN_MANA) ||
1028 (flag == TRC_CALL_ANIMAL) ||
1029 (flag == TRC_CALL_DEMON) ||
1030 (flag == TRC_CALL_DRAGON) ||
1031 (flag == TRC_CALL_UNDEAD) ||
1032 (flag == TRC_COWARDICE) ||
1033 (flag == TRC_LOW_MELEE) ||
1034 (flag == TRC_LOW_AC) ||
1035 (flag == TRC_LOW_MAGIC) ||
1036 (flag == TRC_FAST_DIGEST) ||
1037 (flag == TRC_SLOW_REGEN))
1040 BIT_FLAGS flgs[TR_FLAG_SIZE];
1041 object_flags(o_ptr, flgs);
1044 case TRC_ADD_L_CURSE: cf = TR_ADD_L_CURSE; break;
1045 case TRC_ADD_H_CURSE: cf = TR_ADD_H_CURSE; break;
1046 case TRC_DRAIN_HP: cf = TR_DRAIN_HP; break;
1047 case TRC_DRAIN_MANA: cf = TR_DRAIN_MANA; break;
1048 case TRC_CALL_ANIMAL: cf = TR_CALL_ANIMAL; break;
1049 case TRC_CALL_DEMON: cf = TR_CALL_DEMON; break;
1050 case TRC_CALL_DRAGON: cf = TR_CALL_DRAGON; break;
1051 case TRC_CALL_UNDEAD: cf = TR_CALL_UNDEAD; break;
1052 case TRC_COWARDICE: cf = TR_COWARDICE; break;
1053 case TRC_LOW_MELEE: cf = TR_LOW_MELEE; break;
1054 case TRC_LOW_AC: cf = TR_LOW_AC; break;
1055 case TRC_LOW_MAGIC: cf = TR_LOW_MAGIC; break;
1056 case TRC_FAST_DIGEST: cf = TR_FAST_DIGEST; break;
1057 case TRC_SLOW_REGEN: cf = TR_SLOW_REGEN; break;
1060 if (have_flag(flgs, cf))
1062 choices[number] = i;
1068 return &player_ptr->inventory_list[choices[randint0(number)]];
1072 static void process_world_aux_digestion(player_type *creature_ptr)
1074 if (!creature_ptr->phase_out)
1076 if (creature_ptr->food >= PY_FOOD_MAX)
1078 (void)set_food(creature_ptr, creature_ptr->food - 100);
1080 else if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 5)))
1082 int digestion = SPEED_TO_ENERGY(creature_ptr->pspeed);
1083 if (creature_ptr->regenerate)
1085 if (creature_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1087 if (creature_ptr->cursed & TRC_FAST_DIGEST)
1090 if (creature_ptr->slow_digest)
1093 if (digestion < 1) digestion = 1;
1094 if (digestion > 100) digestion = 100;
1096 (void)set_food(creature_ptr, creature_ptr->food - digestion);
1099 if ((creature_ptr->food < PY_FOOD_FAINT))
1101 if (!creature_ptr->paralyzed && (randint0(100) < 10))
1103 msg_print(_("あまりにも空腹で気絶してしまった。", "You faint from the lack of food."));
1104 disturb(creature_ptr, TRUE, TRUE);
1105 (void)set_paralyzed(creature_ptr, creature_ptr->paralyzed + 1 + randint0(5));
1108 if (creature_ptr->food < PY_FOOD_STARVE)
1110 HIT_POINT dam = (PY_FOOD_STARVE - creature_ptr->food) / 10;
1111 if (!IS_INVULN(creature_ptr)) take_hit(creature_ptr, DAMAGE_LOSELIFE, dam, _("空腹", "starvation"), -1);
1119 * @brief 10ゲームターンが進行するごとにプレイヤーのHPとMPの増減処理を行う。
1120 * / Handle timed damage and regeneration every 10 game turns
1123 static void process_world_aux_hp_and_sp(player_type *creature_ptr)
1125 feature_type *f_ptr = &f_info[creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].feat];
1126 bool cave_no_regen = FALSE;
1127 int upkeep_factor = 0;
1128 int regen_amount = PY_REGEN_NORMAL;
1129 if (creature_ptr->poisoned && !IS_INVULN(creature_ptr))
1131 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, _("毒", "poison"), -1);
1134 if (creature_ptr->cut && !IS_INVULN(creature_ptr))
1137 if (creature_ptr->cut > 1000)
1141 else if (creature_ptr->cut > 200)
1145 else if (creature_ptr->cut > 100)
1149 else if (creature_ptr->cut > 50)
1153 else if (creature_ptr->cut > 25)
1157 else if (creature_ptr->cut > 10)
1166 take_hit(creature_ptr, DAMAGE_NOESCAPE, dam, _("致命傷", "a fatal wound"), -1);
1169 if (PRACE_IS_(creature_ptr, RACE_VAMPIRE) || (creature_ptr->mimic_form == MIMIC_VAMPIRE))
1171 if (!creature_ptr->current_floor_ptr->dun_level && !creature_ptr->resist_lite && !IS_INVULN(creature_ptr) && is_daytime())
1173 if ((creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
1175 msg_print(_("日光があなたのアンデッドの肉体を焼き焦がした!", "The sun's rays scorch your undead flesh!"));
1176 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, _("日光", "sunlight"), -1);
1177 cave_no_regen = TRUE;
1181 if (creature_ptr->inventory_list[INVEN_LITE].tval && (creature_ptr->inventory_list[INVEN_LITE].name2 != EGO_LITE_DARKNESS) &&
1182 !creature_ptr->resist_lite)
1184 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
1185 GAME_TEXT o_name[MAX_NLEN];
1186 char ouch[MAX_NLEN + 40];
1187 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1188 msg_format(_("%sがあなたのアンデッドの肉体を焼き焦がした!", "The %s scorches your undead flesh!"), o_name);
1190 cave_no_regen = TRUE;
1191 object_desc(creature_ptr, o_name, o_ptr, OD_NAME_ONLY);
1192 sprintf(ouch, _("%sを装備したダメージ", "wielding %s"), o_name);
1194 if (!IS_INVULN(creature_ptr)) take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, ouch, -1);
1198 if (have_flag(f_ptr->flags, FF_LAVA) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_fire)
1202 if (have_flag(f_ptr->flags, FF_DEEP))
1204 damage = 6000 + randint0(4000);
1206 else if (!creature_ptr->levitation)
1208 damage = 3000 + randint0(2000);
1213 if (PRACE_IS_(creature_ptr, RACE_ENT)) damage += damage / 3;
1214 if (creature_ptr->resist_fire) damage = damage / 3;
1215 if (is_oppose_fire(creature_ptr)) damage = damage / 3;
1216 if (creature_ptr->levitation) damage = damage / 5;
1218 damage = damage / 100 + (randint0(100) < (damage % 100));
1220 if (creature_ptr->levitation)
1222 msg_print(_("熱で火傷した!", "The heat burns you!"));
1223 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1224 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1228 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1229 msg_format(_("%sで火傷した!", "The %s burns you!"), name);
1230 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1233 cave_no_regen = TRUE;
1237 if (have_flag(f_ptr->flags, FF_COLD_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_cold)
1241 if (have_flag(f_ptr->flags, FF_DEEP))
1243 damage = 6000 + randint0(4000);
1245 else if (!creature_ptr->levitation)
1247 damage = 3000 + randint0(2000);
1252 if (creature_ptr->resist_cold) damage = damage / 3;
1253 if (is_oppose_cold(creature_ptr)) damage = damage / 3;
1254 if (creature_ptr->levitation) damage = damage / 5;
1256 damage = damage / 100 + (randint0(100) < (damage % 100));
1258 if (creature_ptr->levitation)
1260 msg_print(_("冷気に覆われた!", "The cold engulfs you!"));
1261 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1262 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1266 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1267 msg_format(_("%sに凍えた!", "The %s frostbites you!"), name);
1268 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1271 cave_no_regen = TRUE;
1275 if (have_flag(f_ptr->flags, FF_ELEC_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_elec)
1279 if (have_flag(f_ptr->flags, FF_DEEP))
1281 damage = 6000 + randint0(4000);
1283 else if (!creature_ptr->levitation)
1285 damage = 3000 + randint0(2000);
1290 if (creature_ptr->resist_elec) damage = damage / 3;
1291 if (is_oppose_elec(creature_ptr)) damage = damage / 3;
1292 if (creature_ptr->levitation) damage = damage / 5;
1294 damage = damage / 100 + (randint0(100) < (damage % 100));
1296 if (creature_ptr->levitation)
1298 msg_print(_("電撃を受けた!", "The electricity shocks you!"));
1299 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1300 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1304 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1305 msg_format(_("%sに感電した!", "The %s shocks you!"), name);
1306 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1309 cave_no_regen = TRUE;
1313 if (have_flag(f_ptr->flags, FF_ACID_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_acid)
1317 if (have_flag(f_ptr->flags, FF_DEEP))
1319 damage = 6000 + randint0(4000);
1321 else if (!creature_ptr->levitation)
1323 damage = 3000 + randint0(2000);
1328 if (creature_ptr->resist_acid) damage = damage / 3;
1329 if (is_oppose_acid(creature_ptr)) damage = damage / 3;
1330 if (creature_ptr->levitation) damage = damage / 5;
1332 damage = damage / 100 + (randint0(100) < (damage % 100));
1334 if (creature_ptr->levitation)
1336 msg_print(_("酸が飛び散った!", "The acid melts you!"));
1337 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1338 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1342 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1343 msg_format(_("%sに溶かされた!", "The %s melts you!"), name);
1344 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1347 cave_no_regen = TRUE;
1351 if (have_flag(f_ptr->flags, FF_POISON_PUDDLE) && !IS_INVULN(creature_ptr))
1355 if (have_flag(f_ptr->flags, FF_DEEP))
1357 damage = 6000 + randint0(4000);
1359 else if (!creature_ptr->levitation)
1361 damage = 3000 + randint0(2000);
1366 if (creature_ptr->resist_pois) damage = damage / 3;
1367 if (is_oppose_pois(creature_ptr)) damage = damage / 3;
1368 if (creature_ptr->levitation) damage = damage / 5;
1370 damage = damage / 100 + (randint0(100) < (damage % 100));
1372 if (creature_ptr->levitation)
1374 msg_print(_("毒気を吸い込んだ!", "The gas poisons you!"));
1375 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1376 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1377 if (creature_ptr->resist_pois) (void)set_poisoned(creature_ptr, creature_ptr->poisoned + 1);
1381 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1382 msg_format(_("%sに毒された!", "The %s poisons you!"), name);
1383 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1384 if (creature_ptr->resist_pois) (void)set_poisoned(creature_ptr, creature_ptr->poisoned + 3);
1387 cave_no_regen = TRUE;
1391 if (have_flag(f_ptr->flags, FF_WATER) && have_flag(f_ptr->flags, FF_DEEP) &&
1392 !creature_ptr->levitation && !creature_ptr->can_swim && !creature_ptr->resist_water)
1394 if (creature_ptr->total_weight > weight_limit(creature_ptr))
1396 msg_print(_("溺れている!", "You are drowning!"));
1397 take_hit(creature_ptr, DAMAGE_NOESCAPE, randint1(creature_ptr->lev), _("溺れ", "drowning"), -1);
1398 cave_no_regen = TRUE;
1402 if (creature_ptr->riding)
1405 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags2 & RF2_AURA_FIRE) && !creature_ptr->immune_fire)
1407 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1408 if (PRACE_IS_(creature_ptr, RACE_ENT)) damage += damage / 3;
1409 if (creature_ptr->resist_fire) damage = damage / 3;
1410 if (is_oppose_fire(creature_ptr)) damage = damage / 3;
1411 msg_print(_("熱い!", "It's hot!"));
1412 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("炎のオーラ", "Fire aura"), -1);
1414 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags2 & RF2_AURA_ELEC) && !creature_ptr->immune_elec)
1416 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1417 if (PRACE_IS_(creature_ptr, RACE_ANDROID)) damage += damage / 3;
1418 if (creature_ptr->resist_elec) damage = damage / 3;
1419 if (is_oppose_elec(creature_ptr)) damage = damage / 3;
1420 msg_print(_("痛い!", "It hurts!"));
1421 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("電気のオーラ", "Elec aura"), -1);
1423 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags3 & RF3_AURA_COLD) && !creature_ptr->immune_cold)
1425 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1426 if (creature_ptr->resist_cold) damage = damage / 3;
1427 if (is_oppose_cold(creature_ptr)) damage = damage / 3;
1428 msg_print(_("冷たい!", "It's cold!"));
1429 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("冷気のオーラ", "Cold aura"), -1);
1433 /* Spectres -- take damage when moving through walls */
1435 * Added: ANYBODY takes damage if inside through walls
1436 * without wraith form -- NOTE: Spectres will never be
1437 * reduced below 0 hp by being inside a stone wall; others
1440 if (!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY))
1442 if (!IS_INVULN(creature_ptr) && !creature_ptr->wraith_form && !creature_ptr->kabenuke && ((creature_ptr->chp > (creature_ptr->lev / 5)) || !creature_ptr->pass_wall))
1445 cave_no_regen = TRUE;
1447 if (creature_ptr->pass_wall)
1449 msg_print(_("体の分子が分解した気がする!", "Your molecules feel disrupted!"));
1450 dam_desc = _("密度", "density");
1454 msg_print(_("崩れた岩に押し潰された!", "You are being crushed!"));
1455 dam_desc = _("硬い岩", "solid rock");
1458 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1 + (creature_ptr->lev / 5), dam_desc, -1);
1462 if (creature_ptr->food < PY_FOOD_WEAK)
1464 if (creature_ptr->food < PY_FOOD_STARVE)
1468 else if (creature_ptr->food < PY_FOOD_FAINT)
1470 regen_amount = PY_REGEN_FAINT;
1474 regen_amount = PY_REGEN_WEAK;
1478 if (pattern_effect(creature_ptr))
1480 cave_no_regen = TRUE;
1484 if (creature_ptr->regenerate)
1486 regen_amount = regen_amount * 2;
1488 if (creature_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1492 if (creature_ptr->cursed & TRC_SLOW_REGEN)
1498 if ((creature_ptr->action == ACTION_SEARCH) || (creature_ptr->action == ACTION_REST))
1500 regen_amount = regen_amount * 2;
1503 upkeep_factor = calculate_upkeep(creature_ptr);
1504 if ((creature_ptr->action == ACTION_LEARN) ||
1505 (creature_ptr->action == ACTION_HAYAGAKE) ||
1506 (creature_ptr->special_defense & KATA_KOUKIJIN))
1508 upkeep_factor += 100;
1511 regenmana(creature_ptr, upkeep_factor, regen_amount);
1512 if (creature_ptr->pclass == CLASS_MAGIC_EATER)
1514 regenmagic(creature_ptr, regen_amount);
1517 if ((creature_ptr->csp == 0) && (creature_ptr->csp_frac == 0))
1519 while (upkeep_factor > 100)
1521 msg_print(_("こんなに多くのペットを制御できない!", "Too many pets to control at once!"));
1523 do_cmd_pet_dismiss(creature_ptr);
1525 upkeep_factor = calculate_upkeep(creature_ptr);
1527 msg_format(_("維持MPは %d%%", "Upkeep: %d%% mana."), upkeep_factor);
1532 if (creature_ptr->poisoned) regen_amount = 0;
1533 if (creature_ptr->cut) regen_amount = 0;
1534 if (cave_no_regen) regen_amount = 0;
1536 regen_amount = (regen_amount * creature_ptr->mutant_regenerate_mod) / 100;
1537 if ((creature_ptr->chp < creature_ptr->mhp) && !cave_no_regen)
1539 regenhp(creature_ptr, regen_amount);
1545 * @brief 10ゲームターンが進行するごとに魔法効果の残りターンを減らしていく処理
1546 * / Handle timeout every 10 game turns
1549 static void process_world_aux_timeout(player_type *creature_ptr)
1551 const int dec_count = (easy_band ? 2 : 1);
1552 if (creature_ptr->tim_mimic)
1554 (void)set_mimic(creature_ptr, creature_ptr->tim_mimic - 1, creature_ptr->mimic_form, TRUE);
1557 if (creature_ptr->image)
1559 (void)set_image(creature_ptr, creature_ptr->image - dec_count);
1562 if (creature_ptr->blind)
1564 (void)set_blind(creature_ptr, creature_ptr->blind - dec_count);
1567 if (creature_ptr->tim_invis)
1569 (void)set_tim_invis(creature_ptr, creature_ptr->tim_invis - 1, TRUE);
1572 if (creature_ptr->suppress_multi_reward)
1574 creature_ptr->suppress_multi_reward = FALSE;
1577 if (creature_ptr->tim_esp)
1579 (void)set_tim_esp(creature_ptr, creature_ptr->tim_esp - 1, TRUE);
1582 if (creature_ptr->ele_attack)
1584 creature_ptr->ele_attack--;
1585 if (!creature_ptr->ele_attack) set_ele_attack(creature_ptr, 0, 0);
1588 if (creature_ptr->ele_immune)
1590 creature_ptr->ele_immune--;
1591 if (!creature_ptr->ele_immune) set_ele_immune(creature_ptr, 0, 0);
1594 if (creature_ptr->tim_infra)
1596 (void)set_tim_infra(creature_ptr, creature_ptr->tim_infra - 1, TRUE);
1599 if (creature_ptr->tim_stealth)
1601 (void)set_tim_stealth(creature_ptr, creature_ptr->tim_stealth - 1, TRUE);
1604 if (creature_ptr->tim_levitation)
1606 (void)set_tim_levitation(creature_ptr, creature_ptr->tim_levitation - 1, TRUE);
1609 if (creature_ptr->tim_sh_touki)
1611 (void)set_tim_sh_touki(creature_ptr, creature_ptr->tim_sh_touki - 1, TRUE);
1614 if (creature_ptr->tim_sh_fire)
1616 (void)set_tim_sh_fire(creature_ptr, creature_ptr->tim_sh_fire - 1, TRUE);
1619 if (creature_ptr->tim_sh_holy)
1621 (void)set_tim_sh_holy(creature_ptr, creature_ptr->tim_sh_holy - 1, TRUE);
1624 if (creature_ptr->tim_eyeeye)
1626 (void)set_tim_eyeeye(creature_ptr, creature_ptr->tim_eyeeye - 1, TRUE);
1629 if (creature_ptr->resist_magic)
1631 (void)set_resist_magic(creature_ptr, creature_ptr->resist_magic - 1, TRUE);
1634 if (creature_ptr->tim_regen)
1636 (void)set_tim_regen(creature_ptr, creature_ptr->tim_regen - 1, TRUE);
1639 if (creature_ptr->tim_res_nether)
1641 (void)set_tim_res_nether(creature_ptr, creature_ptr->tim_res_nether - 1, TRUE);
1644 if (creature_ptr->tim_res_time)
1646 (void)set_tim_res_time(creature_ptr, creature_ptr->tim_res_time - 1, TRUE);
1649 if (creature_ptr->tim_reflect)
1651 (void)set_tim_reflect(creature_ptr, creature_ptr->tim_reflect - 1, TRUE);
1654 if (creature_ptr->multishadow)
1656 (void)set_multishadow(creature_ptr, creature_ptr->multishadow - 1, TRUE);
1659 if (creature_ptr->dustrobe)
1661 (void)set_dustrobe(creature_ptr, creature_ptr->dustrobe - 1, TRUE);
1664 if (creature_ptr->kabenuke)
1666 (void)set_kabenuke(creature_ptr, creature_ptr->kabenuke - 1, TRUE);
1669 if (creature_ptr->paralyzed)
1671 (void)set_paralyzed(creature_ptr, creature_ptr->paralyzed - dec_count);
1674 if (creature_ptr->confused)
1676 (void)set_confused(creature_ptr, creature_ptr->confused - dec_count);
1679 if (creature_ptr->afraid)
1681 (void)set_afraid(creature_ptr, creature_ptr->afraid - dec_count);
1684 if (creature_ptr->fast)
1686 (void)set_fast(creature_ptr, creature_ptr->fast - 1, TRUE);
1689 if (creature_ptr->slow)
1691 (void)set_slow(creature_ptr, creature_ptr->slow - dec_count, TRUE);
1694 if (creature_ptr->protevil)
1696 (void)set_protevil(creature_ptr, creature_ptr->protevil - 1, TRUE);
1699 if (creature_ptr->invuln)
1701 (void)set_invuln(creature_ptr, creature_ptr->invuln - 1, TRUE);
1704 if (creature_ptr->wraith_form)
1706 (void)set_wraith_form(creature_ptr, creature_ptr->wraith_form - 1, TRUE);
1709 if (creature_ptr->hero)
1711 (void)set_hero(creature_ptr, creature_ptr->hero - 1, TRUE);
1714 if (creature_ptr->shero)
1716 (void)set_shero(creature_ptr, creature_ptr->shero - 1, TRUE);
1719 if (creature_ptr->blessed)
1721 (void)set_blessed(creature_ptr, creature_ptr->blessed - 1, TRUE);
1724 if (creature_ptr->shield)
1726 (void)set_shield(creature_ptr, creature_ptr->shield - 1, TRUE);
1729 if (creature_ptr->tsubureru)
1731 (void)set_tsubureru(creature_ptr, creature_ptr->tsubureru - 1, TRUE);
1734 if (creature_ptr->magicdef)
1736 (void)set_magicdef(creature_ptr, creature_ptr->magicdef - 1, TRUE);
1739 if (creature_ptr->tsuyoshi)
1741 (void)set_tsuyoshi(creature_ptr, creature_ptr->tsuyoshi - 1, TRUE);
1744 if (creature_ptr->oppose_acid)
1746 (void)set_oppose_acid(creature_ptr, creature_ptr->oppose_acid - 1, TRUE);
1749 if (creature_ptr->oppose_elec)
1751 (void)set_oppose_elec(creature_ptr, creature_ptr->oppose_elec - 1, TRUE);
1754 if (creature_ptr->oppose_fire)
1756 (void)set_oppose_fire(creature_ptr, creature_ptr->oppose_fire - 1, TRUE);
1759 if (creature_ptr->oppose_cold)
1761 (void)set_oppose_cold(creature_ptr, creature_ptr->oppose_cold - 1, TRUE);
1764 if (creature_ptr->oppose_pois)
1766 (void)set_oppose_pois(creature_ptr, creature_ptr->oppose_pois - 1, TRUE);
1769 if (creature_ptr->ult_res)
1771 (void)set_ultimate_res(creature_ptr, creature_ptr->ult_res - 1, TRUE);
1774 if (creature_ptr->poisoned)
1776 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
1777 (void)set_poisoned(creature_ptr, creature_ptr->poisoned - adjust);
1780 if (creature_ptr->stun)
1782 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
1783 (void)set_stun(creature_ptr, creature_ptr->stun - adjust);
1786 if (creature_ptr->cut)
1788 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
1789 if (creature_ptr->cut > 1000) adjust = 0;
1790 (void)set_cut(creature_ptr, creature_ptr->cut - adjust);
1796 * @brief 10ゲームターンが進行する毎に光源の寿命を減らす処理
1797 * / Handle burning fuel every 10 game turns
1800 static void process_world_aux_light(player_type *creature_ptr)
1802 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
1803 if (o_ptr->tval == TV_LITE)
1805 if (!(object_is_fixed_artifact(o_ptr) || o_ptr->sval == SV_LITE_FEANOR) && (o_ptr->xtra4 > 0))
1807 if (o_ptr->name2 == EGO_LITE_LONG)
1809 if (current_world_ptr->game_turn % (TURNS_PER_TICK * 2)) o_ptr->xtra4--;
1811 else o_ptr->xtra4--;
1813 notice_lite_change(creature_ptr, o_ptr);
1820 * @brief 10ゲームターンが進行するごとに突然変異の発動判定を行う処理
1821 * / Handle mutation effects once every 10 game turns
1824 static void process_world_aux_mutation(player_type *creature_ptr)
1826 if (!creature_ptr->muta2) return;
1827 if (creature_ptr->phase_out) return;
1828 if (creature_ptr->wild_mode) return;
1830 if ((creature_ptr->muta2 & MUT2_BERS_RAGE) && one_in_(3000))
1832 disturb(creature_ptr, FALSE, TRUE);
1833 msg_print(_("ウガァァア!", "RAAAAGHH!"));
1834 msg_print(_("激怒の発作に襲われた!", "You feel a fit of rage coming over you!"));
1835 (void)set_shero(creature_ptr, 10 + randint1(creature_ptr->lev), FALSE);
1836 (void)set_afraid(creature_ptr, 0);
1839 if ((creature_ptr->muta2 & MUT2_COWARDICE) && (randint1(3000) == 13))
1841 if (!creature_ptr->resist_fear)
1843 disturb(creature_ptr, FALSE, TRUE);
1844 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
1845 set_afraid(creature_ptr, creature_ptr->afraid + 13 + randint1(26));
1849 if ((creature_ptr->muta2 & MUT2_RTELEPORT) && (randint1(5000) == 88))
1851 if (!creature_ptr->resist_nexus && !(creature_ptr->muta1 & MUT1_VTELEPORT) && !creature_ptr->anti_tele)
1853 disturb(creature_ptr, FALSE, TRUE);
1854 msg_print(_("あなたの位置は突然ひじょうに不確定になった...", "Your position suddenly seems very uncertain..."));
1856 teleport_player(creature_ptr, 40, TELEPORT_PASSIVE);
1860 if ((creature_ptr->muta2 & MUT2_ALCOHOL) && (randint1(6400) == 321))
1862 if (!creature_ptr->resist_conf && !creature_ptr->resist_chaos)
1864 disturb(creature_ptr, FALSE, TRUE);
1865 creature_ptr->redraw |= PR_EXTRA;
1866 msg_print(_("いひきがもーろーとひてきたきがふる...ヒック!", "You feel a SSSCHtupor cOmINg over yOu... *HIC*!"));
1869 if (!creature_ptr->resist_conf)
1871 (void)set_confused(creature_ptr, creature_ptr->confused + randint0(20) + 15);
1874 if (!creature_ptr->resist_chaos)
1879 if (one_in_(3)) lose_all_info(creature_ptr);
1880 else wiz_dark(creature_ptr);
1881 (void)teleport_player_aux(creature_ptr, 100, FALSE, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE);
1882 wiz_dark(creature_ptr);
1883 msg_print(_("あなたは見知らぬ場所で目が醒めた...頭が痛い。", "You wake up somewhere with a sore head..."));
1884 msg_print(_("何も覚えていない。どうやってここに来たかも分からない!", "You can't remember a thing or how you got here!"));
1890 msg_print(_("き~れいなちょおちょらとんれいる~", "Thishcischs GooDSChtuff!"));
1891 (void)set_image(creature_ptr, creature_ptr->image + randint0(150) + 150);
1897 if ((creature_ptr->muta2 & MUT2_HALLU) && (randint1(6400) == 42))
1899 if (!creature_ptr->resist_chaos)
1901 disturb(creature_ptr, FALSE, TRUE);
1902 creature_ptr->redraw |= PR_EXTRA;
1903 (void)set_image(creature_ptr, creature_ptr->image + randint0(50) + 20);
1907 if ((creature_ptr->muta2 & MUT2_FLATULENT) && (randint1(3000) == 13))
1909 disturb(creature_ptr, FALSE, TRUE);
1910 msg_print(_("ブゥーーッ!おっと。", "BRRAAAP! Oops."));
1912 fire_ball(creature_ptr, GF_POIS, 0, creature_ptr->lev, 3);
1915 if ((creature_ptr->muta2 & MUT2_PROD_MANA) &&
1916 !creature_ptr->anti_magic && one_in_(9000))
1919 disturb(creature_ptr, FALSE, TRUE);
1920 msg_print(_("魔法のエネルギーが突然あなたの中に流れ込んできた!エネルギーを解放しなければならない!",
1921 "Magical energy flows through you! You must release it!"));
1925 (void)get_hack_dir(creature_ptr, &dire);
1926 fire_ball(creature_ptr, GF_MANA, dire, creature_ptr->lev * 2, 3);
1929 if ((creature_ptr->muta2 & MUT2_ATT_DEMON) && !creature_ptr->anti_magic && (randint1(6666) == 666))
1931 bool pet = one_in_(6);
1932 BIT_FLAGS mode = PM_ALLOW_GROUP;
1934 if (pet) mode |= PM_FORCE_PET;
1935 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
1937 if (summon_specific(creature_ptr, (pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DEMON, mode))
1939 msg_print(_("あなたはデーモンを引き寄せた!", "You have attracted a demon!"));
1940 disturb(creature_ptr, FALSE, TRUE);
1944 if ((creature_ptr->muta2 & MUT2_SPEED_FLUX) && one_in_(6000))
1946 disturb(creature_ptr, FALSE, TRUE);
1949 msg_print(_("精力的でなくなった気がする。", "You feel less energetic."));
1951 if (creature_ptr->fast > 0)
1953 set_fast(creature_ptr, 0, TRUE);
1957 set_slow(creature_ptr, randint1(30) + 10, FALSE);
1962 msg_print(_("精力的になった気がする。", "You feel more energetic."));
1964 if (creature_ptr->slow > 0)
1966 set_slow(creature_ptr, 0, TRUE);
1970 set_fast(creature_ptr, randint1(30) + 10, FALSE);
1975 if ((creature_ptr->muta2 & MUT2_BANISH_ALL) && one_in_(9000))
1977 disturb(creature_ptr, FALSE, TRUE);
1978 msg_print(_("突然ほとんど孤独になった気がする。", "You suddenly feel almost lonely."));
1980 banish_monsters(creature_ptr, 100);
1981 if (!creature_ptr->current_floor_ptr->dun_level && creature_ptr->town_num)
1986 n = randint0(MAX_STORES);
1987 } while ((n == STORE_HOME) || (n == STORE_MUSEUM));
1989 msg_print(_("店の主人が丘に向かって走っている!", "You see one of the shopkeepers running for the hills!"));
1990 store_shuffle(creature_ptr, n);
1995 if ((creature_ptr->muta2 & MUT2_EAT_LIGHT) && one_in_(3000))
1999 msg_print(_("影につつまれた。", "A shadow passes over you."));
2002 if ((creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
2004 hp_player(creature_ptr, 10);
2007 o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
2009 if (o_ptr->tval == TV_LITE)
2011 if (!object_is_fixed_artifact(o_ptr) && (o_ptr->xtra4 > 0))
2013 hp_player(creature_ptr, o_ptr->xtra4 / 20);
2015 msg_print(_("光源からエネルギーを吸収した!", "You absorb energy from your light!"));
2016 notice_lite_change(creature_ptr, o_ptr);
2021 * Unlite the area (radius 10) around player and
2022 * do 50 points damage to every affected monster
2024 unlite_area(creature_ptr, 50, 10);
2027 if ((creature_ptr->muta2 & MUT2_ATT_ANIMAL) && !creature_ptr->anti_magic && one_in_(7000))
2029 bool pet = one_in_(3);
2030 BIT_FLAGS mode = PM_ALLOW_GROUP;
2032 if (pet) mode |= PM_FORCE_PET;
2033 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2035 if (summon_specific(creature_ptr, (pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_ANIMAL, mode))
2037 msg_print(_("動物を引き寄せた!", "You have attracted an animal!"));
2038 disturb(creature_ptr, FALSE, TRUE);
2042 if ((creature_ptr->muta2 & MUT2_RAW_CHAOS) && !creature_ptr->anti_magic && one_in_(8000))
2044 disturb(creature_ptr, FALSE, TRUE);
2045 msg_print(_("周りの空間が歪んでいる気がする!", "You feel the world warping around you!"));
2048 fire_ball(creature_ptr, GF_CHAOS, 0, creature_ptr->lev, 8);
2051 if ((creature_ptr->muta2 & MUT2_NORMALITY) && one_in_(5000))
2053 if (!lose_mutation(creature_ptr, 0))
2054 msg_print(_("奇妙なくらい普通になった気がする。", "You feel oddly normal."));
2057 if ((creature_ptr->muta2 & MUT2_WRAITH) && !creature_ptr->anti_magic && one_in_(3000))
2059 disturb(creature_ptr, FALSE, TRUE);
2060 msg_print(_("非物質化した!", "You feel insubstantial!"));
2063 set_wraith_form(creature_ptr, randint1(creature_ptr->lev / 2) + (creature_ptr->lev / 2), FALSE);
2066 if ((creature_ptr->muta2 & MUT2_POLY_WOUND) && one_in_(3000))
2068 do_poly_wounds(creature_ptr);
2071 if ((creature_ptr->muta2 & MUT2_WASTING) && one_in_(3000))
2073 int which_stat = randint0(A_MAX);
2074 int sustained = FALSE;
2079 if (creature_ptr->sustain_str) sustained = TRUE;
2082 if (creature_ptr->sustain_int) sustained = TRUE;
2085 if (creature_ptr->sustain_wis) sustained = TRUE;
2088 if (creature_ptr->sustain_dex) sustained = TRUE;
2091 if (creature_ptr->sustain_con) sustained = TRUE;
2094 if (creature_ptr->sustain_chr) sustained = TRUE;
2097 msg_print(_("不正な状態!", "Invalid stat chosen!"));
2103 disturb(creature_ptr, FALSE, TRUE);
2104 msg_print(_("自分が衰弱していくのが分かる!", "You can feel yourself wasting away!"));
2106 (void)dec_stat(creature_ptr, which_stat, randint1(6) + 6, one_in_(3));
2110 if ((creature_ptr->muta2 & MUT2_ATT_DRAGON) && !creature_ptr->anti_magic && one_in_(3000))
2112 bool pet = one_in_(5);
2113 BIT_FLAGS mode = PM_ALLOW_GROUP;
2115 if (pet) mode |= PM_FORCE_PET;
2116 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2118 if (summon_specific(creature_ptr, (pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DRAGON, mode))
2120 msg_print(_("ドラゴンを引き寄せた!", "You have attracted a dragon!"));
2121 disturb(creature_ptr, FALSE, TRUE);
2125 if ((creature_ptr->muta2 & MUT2_WEIRD_MIND) && !creature_ptr->anti_magic && one_in_(3000))
2127 if (creature_ptr->tim_esp > 0)
2129 msg_print(_("精神にもやがかかった!", "Your mind feels cloudy!"));
2130 set_tim_esp(creature_ptr, 0, TRUE);
2134 msg_print(_("精神が広がった!", "Your mind expands!"));
2135 set_tim_esp(creature_ptr, creature_ptr->lev, FALSE);
2139 if ((creature_ptr->muta2 & MUT2_NAUSEA) && !creature_ptr->slow_digest && one_in_(9000))
2141 disturb(creature_ptr, FALSE, TRUE);
2142 msg_print(_("胃が痙攣し、食事を失った!", "Your stomach roils, and you lose your lunch!"));
2144 set_food(creature_ptr, PY_FOOD_WEAK);
2145 if (music_singing_any(creature_ptr)) stop_singing(creature_ptr);
2146 if (hex_spelling_any(creature_ptr)) stop_hex_spell_all(creature_ptr);
2149 if ((creature_ptr->muta2 & MUT2_WALK_SHAD) && !creature_ptr->anti_magic && one_in_(12000) && !creature_ptr->current_floor_ptr->inside_arena)
2151 reserve_alter_reality(creature_ptr);
2154 if ((creature_ptr->muta2 & MUT2_WARNING) && one_in_(1000))
2156 int danger_amount = 0;
2157 for (MONSTER_IDX monster = 0; monster < creature_ptr->current_floor_ptr->m_max; monster++)
2159 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[monster];
2160 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2161 if (!monster_is_valid(m_ptr)) continue;
2163 if (r_ptr->level >= creature_ptr->lev)
2165 danger_amount += r_ptr->level - creature_ptr->lev + 1;
2169 if (danger_amount > 100)
2170 msg_print(_("非常に恐ろしい気がする!", "You feel utterly terrified!"));
2171 else if (danger_amount > 50)
2172 msg_print(_("恐ろしい気がする!", "You feel terrified!"));
2173 else if (danger_amount > 20)
2174 msg_print(_("非常に心配な気がする!", "You feel very worried!"));
2175 else if (danger_amount > 10)
2176 msg_print(_("心配な気がする!", "You feel paranoid!"));
2177 else if (danger_amount > 5)
2178 msg_print(_("ほとんど安全な気がする。", "You feel almost safe."));
2180 msg_print(_("寂しい気がする。", "You feel lonely."));
2183 if ((creature_ptr->muta2 & MUT2_INVULN) && !creature_ptr->anti_magic && one_in_(5000))
2185 disturb(creature_ptr, FALSE, TRUE);
2186 msg_print(_("無敵な気がする!", "You feel invincible!"));
2188 (void)set_invuln(creature_ptr, randint1(8) + 8, FALSE);
2191 if ((creature_ptr->muta2 & MUT2_SP_TO_HP) && one_in_(2000))
2193 MANA_POINT wounds = (MANA_POINT)(creature_ptr->mhp - creature_ptr->chp);
2197 HIT_POINT healing = creature_ptr->csp;
2198 if (healing > wounds) healing = wounds;
2200 hp_player(creature_ptr, healing);
2201 creature_ptr->csp -= healing;
2202 creature_ptr->redraw |= (PR_HP | PR_MANA);
2206 if ((creature_ptr->muta2 & MUT2_HP_TO_SP) && !creature_ptr->anti_magic && one_in_(4000))
2208 HIT_POINT wounds = (HIT_POINT)(creature_ptr->msp - creature_ptr->csp);
2212 HIT_POINT healing = creature_ptr->chp;
2213 if (healing > wounds) healing = wounds;
2215 creature_ptr->csp += healing;
2216 creature_ptr->redraw |= (PR_HP | PR_MANA);
2217 take_hit(creature_ptr, DAMAGE_LOSELIFE, healing, _("頭に昇った血", "blood rushing to the head"), -1);
2221 if ((creature_ptr->muta2 & MUT2_DISARM) && one_in_(10000))
2223 INVENTORY_IDX slot = 0;
2224 object_type *o_ptr = NULL;
2226 disturb(creature_ptr, FALSE, TRUE);
2227 msg_print(_("足がもつれて転んだ!", "You trip over your own feet!"));
2228 take_hit(creature_ptr, DAMAGE_NOESCAPE, randint1(creature_ptr->wt / 6), _("転倒", "tripping"), -1);
2231 if (has_melee_weapon(creature_ptr, INVEN_RARM))
2234 o_ptr = &creature_ptr->inventory_list[INVEN_RARM];
2236 if (has_melee_weapon(creature_ptr, INVEN_LARM) && one_in_(2))
2238 o_ptr = &creature_ptr->inventory_list[INVEN_LARM];
2242 else if (has_melee_weapon(creature_ptr, INVEN_LARM))
2244 o_ptr = &creature_ptr->inventory_list[INVEN_LARM];
2247 if (slot && !object_is_cursed(o_ptr))
2249 msg_print(_("武器を落としてしまった!", "You drop your weapon!"));
2250 drop_from_inventory(creature_ptr, slot, 1);
2257 * @brief 10ゲームターンが進行するごとに装備効果の発動判定を行う処理
2258 * / Handle curse effects once every 10 game turns
2261 static void process_world_aux_curse(player_type *creature_ptr)
2263 if ((creature_ptr->cursed & TRC_P_FLAG_MASK) && !creature_ptr->phase_out && !creature_ptr->wild_mode)
2266 * Hack: Uncursed teleporting items (e.g. Trump Weapons)
2267 * can actually be useful!
2269 if ((creature_ptr->cursed & TRC_TELEPORT_SELF) && one_in_(200))
2271 GAME_TEXT o_name[MAX_NLEN];
2273 int i_keep = 0, count = 0;
2274 for (int i = INVEN_RARM; i < INVEN_TOTAL; i++)
2276 BIT_FLAGS flgs[TR_FLAG_SIZE];
2277 o_ptr = &creature_ptr->inventory_list[i];
2278 if (!o_ptr->k_idx) continue;
2280 object_flags(o_ptr, flgs);
2282 if (have_flag(flgs, TR_TELEPORT))
2284 /* {.} will stop random teleportation. */
2285 if (!o_ptr->inscription || !my_strchr(quark_str(o_ptr->inscription), '.'))
2288 if (one_in_(count)) i_keep = i;
2293 o_ptr = &creature_ptr->inventory_list[i_keep];
2294 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2295 msg_format(_("%sがテレポートの能力を発動させようとしている。", "Your %s is activating teleportation."), o_name);
2296 if (get_check_strict(_("テレポートしますか?", "Teleport? "), CHECK_OKAY_CANCEL))
2298 disturb(creature_ptr, FALSE, TRUE);
2299 teleport_player(creature_ptr, 50, 0L);
2303 msg_format(_("%sに{.}(ピリオド)と銘を刻むと発動を抑制できます。",
2304 "You can inscribe {.} on your %s to disable random teleportation. "), o_name);
2305 disturb(creature_ptr, TRUE, TRUE);
2309 if ((creature_ptr->cursed & TRC_CHAINSWORD) && one_in_(CHAINSWORD_NOISE))
2312 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, noise))
2314 disturb(creature_ptr, FALSE, FALSE);
2317 if ((creature_ptr->cursed & TRC_TY_CURSE) && one_in_(TY_CURSE_CHANCE))
2320 (void)activate_ty_curse(creature_ptr, FALSE, &count);
2323 if (creature_ptr->prace != RACE_ANDROID && ((creature_ptr->cursed & TRC_DRAIN_EXP) && one_in_(4)))
2325 creature_ptr->exp -= (creature_ptr->lev + 1) / 2;
2326 if (creature_ptr->exp < 0) creature_ptr->exp = 0;
2327 creature_ptr->max_exp -= (creature_ptr->lev + 1) / 2;
2328 if (creature_ptr->max_exp < 0) creature_ptr->max_exp = 0;
2329 check_experience(creature_ptr);
2332 if ((creature_ptr->cursed & TRC_ADD_L_CURSE) && one_in_(2000))
2335 o_ptr = choose_cursed_obj_name(creature_ptr, TRC_ADD_L_CURSE);
2336 BIT_FLAGS new_curse = get_curse(0, o_ptr);
2337 if (!(o_ptr->curse_flags & new_curse))
2339 GAME_TEXT o_name[MAX_NLEN];
2340 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2341 o_ptr->curse_flags |= new_curse;
2342 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2343 o_ptr->feeling = FEEL_NONE;
2344 creature_ptr->update |= (PU_BONUS);
2348 if ((creature_ptr->cursed & TRC_ADD_H_CURSE) && one_in_(2000))
2351 o_ptr = choose_cursed_obj_name(creature_ptr, TRC_ADD_H_CURSE);
2352 BIT_FLAGS new_curse = get_curse(1, o_ptr);
2353 if (!(o_ptr->curse_flags & new_curse))
2355 GAME_TEXT o_name[MAX_NLEN];
2357 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2359 o_ptr->curse_flags |= new_curse;
2360 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2361 o_ptr->feeling = FEEL_NONE;
2363 creature_ptr->update |= (PU_BONUS);
2367 if ((creature_ptr->cursed & TRC_CALL_ANIMAL) && one_in_(2500))
2369 if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_ANIMAL, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2371 GAME_TEXT o_name[MAX_NLEN];
2372 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_ANIMAL), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2373 msg_format(_("%sが動物を引き寄せた!", "Your %s has attracted an animal!"), o_name);
2374 disturb(creature_ptr, FALSE, TRUE);
2378 if ((creature_ptr->cursed & TRC_CALL_DEMON) && one_in_(1111))
2380 if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2382 GAME_TEXT o_name[MAX_NLEN];
2383 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_DEMON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2384 msg_format(_("%sが悪魔を引き寄せた!", "Your %s has attracted a demon!"), o_name);
2385 disturb(creature_ptr, FALSE, TRUE);
2389 if ((creature_ptr->cursed & TRC_CALL_DRAGON) && one_in_(800))
2391 if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DRAGON,
2392 (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2394 GAME_TEXT o_name[MAX_NLEN];
2395 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_DRAGON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2396 msg_format(_("%sがドラゴンを引き寄せた!", "Your %s has attracted an dragon!"), o_name);
2397 disturb(creature_ptr, FALSE, TRUE);
2401 if ((creature_ptr->cursed & TRC_CALL_UNDEAD) && one_in_(1111))
2403 if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_UNDEAD,
2404 (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2406 GAME_TEXT o_name[MAX_NLEN];
2407 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_UNDEAD), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2408 msg_format(_("%sが死霊を引き寄せた!", "Your %s has attracted an undead!"), o_name);
2409 disturb(creature_ptr, FALSE, TRUE);
2413 if ((creature_ptr->cursed & TRC_COWARDICE) && one_in_(1500))
2415 if (!creature_ptr->resist_fear)
2417 disturb(creature_ptr, FALSE, TRUE);
2418 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
2419 set_afraid(creature_ptr, creature_ptr->afraid + 13 + randint1(26));
2423 if ((creature_ptr->cursed & TRC_TELEPORT) && one_in_(200) && !creature_ptr->anti_tele)
2425 disturb(creature_ptr, FALSE, TRUE);
2426 teleport_player(creature_ptr, 40, TELEPORT_PASSIVE);
2429 if ((creature_ptr->cursed & TRC_DRAIN_HP) && one_in_(666))
2431 GAME_TEXT o_name[MAX_NLEN];
2432 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_DRAIN_HP), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2433 msg_format(_("%sはあなたの体力を吸収した!", "Your %s drains HP from you!"), o_name);
2434 take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev * 2, 100), o_name, -1);
2437 if ((creature_ptr->cursed & TRC_DRAIN_MANA) && creature_ptr->csp && one_in_(666))
2439 GAME_TEXT o_name[MAX_NLEN];
2440 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_DRAIN_MANA), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2441 msg_format(_("%sはあなたの魔力を吸収した!", "Your %s drains mana from you!"), o_name);
2442 creature_ptr->csp -= MIN(creature_ptr->lev, 50);
2443 if (creature_ptr->csp < 0)
2445 creature_ptr->csp = 0;
2446 creature_ptr->csp_frac = 0;
2449 creature_ptr->redraw |= PR_MANA;
2453 if (one_in_(999) && !creature_ptr->anti_magic)
2455 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
2456 if (o_ptr->name1 == ART_JUDGE)
2458 if (object_is_known(o_ptr))
2459 msg_print(_("『審判の宝石』はあなたの体力を吸収した!", "The Jewel of Judgement drains life from you!"));
2461 msg_print(_("なにかがあなたの体力を吸収した!", "Something drains life from you!"));
2462 take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev, 50), _("審判の宝石", "the Jewel of Judgement"), -1);
2469 * @brief 10ゲームターンが進行するごとに魔道具の自然充填を行う処理
2470 * / Handle recharging objects once every 10 game turns
2473 static void process_world_aux_recharge(player_type *creature_ptr)
2478 for (changed = FALSE, i = INVEN_RARM; i < INVEN_TOTAL; i++)
2480 object_type *o_ptr = &creature_ptr->inventory_list[i];
2481 if (!o_ptr->k_idx) continue;
2483 if (o_ptr->timeout > 0)
2486 if (!o_ptr->timeout)
2488 recharged_notice(creature_ptr, o_ptr);
2496 creature_ptr->window |= (PW_EQUIP);
2501 * Recharge rods. Rods now use timeout to control charging status,
2502 * and each charging rod in a stack decreases the stack's timeout by
2503 * one per turn. -LM-
2505 for (changed = FALSE, i = 0; i < INVEN_PACK; i++)
2507 object_type *o_ptr = &creature_ptr->inventory_list[i];
2508 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2509 if (!o_ptr->k_idx) continue;
2511 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2513 TIME_EFFECT temp = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval;
2514 if (temp > o_ptr->number) temp = (TIME_EFFECT)o_ptr->number;
2516 o_ptr->timeout -= temp;
2517 if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2519 if (!(o_ptr->timeout))
2521 recharged_notice(creature_ptr, o_ptr);
2524 else if (o_ptr->timeout % k_ptr->pval)
2533 creature_ptr->window |= (PW_INVEN);
2537 for (i = 1; i < creature_ptr->current_floor_ptr->o_max; i++)
2539 object_type *o_ptr = &creature_ptr->current_floor_ptr->o_list[i];
2540 if (!OBJECT_IS_VALID(o_ptr)) continue;
2542 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2544 o_ptr->timeout -= (TIME_EFFECT)o_ptr->number;
2545 if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2552 * @brief 10ゲームターンが進行するごとに帰還や現実変容などの残り時間カウントダウンと発動を処理する。
2553 * / Handle involuntary movement once every 10 game turns
2556 static void process_world_aux_movement(player_type *creature_ptr)
2558 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
2559 if (creature_ptr->word_recall)
2562 * HACK: Autosave BEFORE resetting the recall counter (rr9)
2563 * The player is yanked up/down as soon as
2564 * he loads the autosaved game.
2566 if (autosave_l && (creature_ptr->word_recall == 1) && !creature_ptr->phase_out)
2567 do_cmd_save_game(creature_ptr, TRUE);
2569 creature_ptr->word_recall--;
2570 creature_ptr->redraw |= (PR_STATUS);
2571 if (!creature_ptr->word_recall)
2573 disturb(creature_ptr, FALSE, TRUE);
2574 if (floor_ptr->dun_level || creature_ptr->current_floor_ptr->inside_quest || creature_ptr->enter_dungeon)
2576 msg_print(_("上に引っ張りあげられる感じがする!", "You feel yourself yanked upwards!"));
2577 if (creature_ptr->dungeon_idx) creature_ptr->recall_dungeon = creature_ptr->dungeon_idx;
2579 exe_write_diary(creature_ptr, DIARY_RECALL, floor_ptr->dun_level, NULL);
2581 floor_ptr->dun_level = 0;
2582 creature_ptr->dungeon_idx = 0;
2583 leave_quest_check(creature_ptr);
2584 leave_tower_check(creature_ptr);
2585 creature_ptr->current_floor_ptr->inside_quest = 0;
2586 creature_ptr->leaving = TRUE;
2590 msg_print(_("下に引きずり降ろされる感じがする!", "You feel yourself yanked downwards!"));
2591 creature_ptr->dungeon_idx = creature_ptr->recall_dungeon;
2593 exe_write_diary(creature_ptr, DIARY_RECALL, floor_ptr->dun_level, NULL);
2595 floor_ptr->dun_level = max_dlv[creature_ptr->dungeon_idx];
2596 if (floor_ptr->dun_level < 1) floor_ptr->dun_level = 1;
2597 if (ironman_nightmare && !randint0(666) && (creature_ptr->dungeon_idx == DUNGEON_ANGBAND))
2599 if (floor_ptr->dun_level < 50)
2601 floor_ptr->dun_level *= 2;
2603 else if (floor_ptr->dun_level < 99)
2605 floor_ptr->dun_level = (floor_ptr->dun_level + 99) / 2;
2607 else if (floor_ptr->dun_level > 100)
2609 floor_ptr->dun_level = d_info[creature_ptr->dungeon_idx].maxdepth - 1;
2613 if (creature_ptr->wild_mode)
2615 creature_ptr->wilderness_y = creature_ptr->y;
2616 creature_ptr->wilderness_x = creature_ptr->x;
2620 creature_ptr->oldpx = creature_ptr->x;
2621 creature_ptr->oldpy = creature_ptr->y;
2624 creature_ptr->wild_mode = FALSE;
2627 * Clear all saved floors
2628 * and create a first saved floor
2630 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
2631 creature_ptr->leaving = TRUE;
2633 if (creature_ptr->dungeon_idx == DUNGEON_ANGBAND)
2635 for (int i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++)
2637 quest_type* const q_ptr = &quest[i];
2638 if ((q_ptr->type == QUEST_TYPE_RANDOM) &&
2639 (q_ptr->status == QUEST_STATUS_TAKEN) &&
2640 (q_ptr->level < floor_ptr->dun_level))
2642 q_ptr->status = QUEST_STATUS_FAILED;
2643 q_ptr->complev = (byte)creature_ptr->lev;
2645 q_ptr->comptime = current_world_ptr->play_time;
2646 r_info[q_ptr->r_idx].flags1 &= ~(RF1_QUESTOR);
2652 sound(SOUND_TPLEVEL);
2656 if (creature_ptr->alter_reality)
2658 if (autosave_l && (creature_ptr->alter_reality == 1) && !creature_ptr->phase_out)
2659 do_cmd_save_game(creature_ptr, TRUE);
2661 creature_ptr->alter_reality--;
2662 creature_ptr->redraw |= (PR_STATUS);
2663 if (!creature_ptr->alter_reality)
2665 disturb(creature_ptr, FALSE, TRUE);
2666 if (!quest_number(creature_ptr, floor_ptr->dun_level) && floor_ptr->dun_level)
2668 msg_print(_("世界が変わった!", "The world changes!"));
2671 * Clear all saved floors
2672 * and create a first saved floor
2674 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
2675 creature_ptr->leaving = TRUE;
2679 msg_print(_("世界が少しの間変化したようだ。", "The world seems to change for a moment!"));
2682 sound(SOUND_TPLEVEL);
2689 * @brief 10ゲームターンが進行する毎にゲーム世界全体の処理を行う。
2690 * / Handle certain things once every 10 game turns
2693 static void process_world(player_type *player_ptr)
2695 const s32b A_DAY = TURNS_PER_TICK * TOWN_DAWN;
2696 s32b prev_turn_in_today = ((current_world_ptr->game_turn - TURNS_PER_TICK) % A_DAY + A_DAY / 4) % A_DAY;
2697 int prev_min = (1440 * prev_turn_in_today / A_DAY) % 60;
2700 extract_day_hour_min(player_ptr, &day, &hour, &min);
2701 update_dungeon_feeling(player_ptr);
2703 /* 帰還無しモード時のレベルテレポバグ対策 / Fix for level teleport bugs on ironman_downward.*/
2704 floor_type *floor_ptr = player_ptr->current_floor_ptr;
2705 if (ironman_downward && (player_ptr->dungeon_idx != DUNGEON_ANGBAND && player_ptr->dungeon_idx != 0))
2707 floor_ptr->dun_level = 0;
2708 player_ptr->dungeon_idx = 0;
2709 prepare_change_floor_mode(player_ptr, CFM_FIRST_FLOOR | CFM_RAND_PLACE);
2710 floor_ptr->inside_arena = FALSE;
2711 player_ptr->wild_mode = FALSE;
2712 player_ptr->leaving = TRUE;
2715 if (player_ptr->phase_out && !player_ptr->leaving)
2719 for (int i2 = 0; i2 < floor_ptr->width; ++i2)
2721 for (int j2 = 0; j2 < floor_ptr->height; j2++)
2723 grid_type *g_ptr = &floor_ptr->grid_array[j2][i2];
2724 if ((g_ptr->m_idx > 0) && (g_ptr->m_idx != player_ptr->riding))
2727 win_m_idx = g_ptr->m_idx;
2732 if (number_mon == 0)
2734 msg_print(_("相打ちに終わりました。", "Nothing survived."));
2736 player_ptr->energy_need = 0;
2737 update_gambling_monsters(player_ptr);
2739 else if ((number_mon - 1) == 0)
2741 GAME_TEXT m_name[MAX_NLEN];
2742 monster_type *wm_ptr;
2743 wm_ptr = &floor_ptr->m_list[win_m_idx];
2744 monster_desc(player_ptr, m_name, wm_ptr, 0);
2745 msg_format(_("%sが勝利した!", "%s won!"), m_name);
2748 if (win_m_idx == (sel_monster + 1))
2750 msg_print(_("おめでとうございます。", "Congratulations."));
2751 msg_format(_("%d$を受け取った。", "You received %d gold."), battle_odds);
2752 player_ptr->au += battle_odds;
2756 msg_print(_("残念でした。", "You lost gold."));
2760 player_ptr->energy_need = 0;
2761 update_gambling_monsters(player_ptr);
2763 else if (current_world_ptr->game_turn - floor_ptr->generated_turn == 150 * TURNS_PER_TICK)
2765 msg_print(_("申し分けありませんが、この勝負は引き分けとさせていただきます。", "This battle ended in a draw."));
2766 player_ptr->au += kakekin;
2768 player_ptr->energy_need = 0;
2769 update_gambling_monsters(player_ptr);
2773 if (current_world_ptr->game_turn % TURNS_PER_TICK) return;
2775 if (autosave_t && autosave_freq && !player_ptr->phase_out)
2777 if (!(current_world_ptr->game_turn % ((s32b)autosave_freq * TURNS_PER_TICK)))
2778 do_cmd_save_game(player_ptr, TRUE);
2781 if (floor_ptr->monster_noise && !ignore_unview)
2783 msg_print(_("何かが聞こえた。", "You hear noise."));
2786 if (!floor_ptr->dun_level && !floor_ptr->inside_quest && !player_ptr->phase_out && !floor_ptr->inside_arena)
2788 if (!(current_world_ptr->game_turn % ((TURNS_PER_TICK * TOWN_DAWN) / 2)))
2790 bool dawn = (!(current_world_ptr->game_turn % (TURNS_PER_TICK * TOWN_DAWN)));
2791 if (dawn) day_break(player_ptr);
2792 else night_falls(player_ptr);
2796 else if ((vanilla_town || (lite_town && !floor_ptr->inside_quest && !player_ptr->phase_out && !floor_ptr->inside_arena)) && floor_ptr->dun_level)
2798 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * STORE_TICKS)))
2800 if (one_in_(STORE_SHUFFLE))
2805 n = randint0(MAX_STORES);
2806 } while ((n == STORE_HOME) || (n == STORE_MUSEUM));
2808 for (FEAT_IDX i = 1; i < max_f_idx; i++)
2810 feature_type *f_ptr = &f_info[i];
2811 if (!f_ptr->name) continue;
2812 if (!have_flag(f_ptr->flags, FF_STORE)) continue;
2814 if (f_ptr->subtype == n)
2817 msg_format(_("%sの店主をシャッフルします。", "Shuffle a Shopkeeper of %s."), f_name + f_ptr->name);
2819 store_shuffle(player_ptr, n);
2827 if (one_in_(d_info[player_ptr->dungeon_idx].max_m_alloc_chance) &&
2828 !floor_ptr->inside_arena && !floor_ptr->inside_quest && !player_ptr->phase_out)
2830 (void)alloc_monster(player_ptr, MAX_SIGHT + 5, 0);
2833 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 10)) && !player_ptr->phase_out)
2834 regenerate_monsters(player_ptr);
2835 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 3)))
2836 regenerate_captured_monsters(player_ptr);
2838 if (!player_ptr->leaving)
2840 for (int i = 0; i < MAX_MTIMED; i++)
2842 if (floor_ptr->mproc_max[i] > 0) process_monsters_mtimed(player_ptr, i);
2848 if (min != prev_min)
2850 exe_write_diary(player_ptr, DIARY_DIALY, 0, NULL);
2851 determine_daily_bounty(player_ptr, FALSE);
2856 * Nightmare mode activates the TY_CURSE at midnight
2857 * Require exact minute -- Don't activate multiple times in a minute
2859 if (ironman_nightmare && (min != prev_min))
2861 if ((hour == 23) && !(min % 15))
2863 disturb(player_ptr, FALSE, TRUE);
2867 msg_print(_("遠くで不気味な鐘の音が鳴った。", "You hear a distant bell toll ominously."));
2871 msg_print(_("遠くで鐘が二回鳴った。", "A distant bell sounds twice."));
2875 msg_print(_("遠くで鐘が三回鳴った。", "A distant bell sounds three times."));
2879 msg_print(_("遠くで鐘が四回鳴った。", "A distant bell tolls four times."));
2886 disturb(player_ptr, TRUE, TRUE);
2887 msg_print(_("遠くで鐘が何回も鳴り、死んだような静けさの中へ消えていった。", "A distant bell tolls many times, fading into an deathly silence."));
2888 if (player_ptr->wild_mode)
2890 player_ptr->oldpy = randint1(MAX_HGT - 2);
2891 player_ptr->oldpx = randint1(MAX_WID - 2);
2892 change_wild_mode(player_ptr, TRUE);
2893 take_turn(player_ptr, 100);
2897 player_ptr->invoking_midnight_curse = TRUE;
2901 process_world_aux_digestion(player_ptr);
2902 process_world_aux_hp_and_sp(player_ptr);
2903 process_world_aux_timeout(player_ptr);
2904 process_world_aux_light(player_ptr);
2905 process_world_aux_mutation(player_ptr);
2906 process_world_aux_curse(player_ptr);
2907 process_world_aux_recharge(player_ptr);
2908 sense_inventory1(player_ptr);
2909 sense_inventory2(player_ptr);
2910 process_world_aux_movement(player_ptr);
2915 * @brief ウィザードモードへの導入処理
2916 * / Verify use of "wizard" mode
2917 * @param player_ptr プレーヤーへの参照ポインタ
2918 * @return 実際にウィザードモードへ移行したらTRUEを返す。
2920 static bool enter_wizard_mode(player_type *player_ptr)
2922 if (!current_world_ptr->noscore)
2924 if (!allow_debug_opts || arg_wizard)
2926 msg_print(_("ウィザードモードは許可されていません。 ", "Wizard mode is not permitted."));
2930 msg_print(_("ウィザードモードはデバッグと実験のためのモードです。 ", "Wizard mode is for debugging and experimenting."));
2931 msg_print(_("一度ウィザードモードに入るとスコアは記録されません。", "The game will not be scored if you enter wizard mode."));
2933 if (!get_check(_("本当にウィザードモードに入りたいのですか? ", "Are you sure you want to enter wizard mode? ")))
2938 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, _("ウィザードモードに突入してスコアを残せなくなった。", "give up recording score to enter wizard mode."));
2939 current_world_ptr->noscore |= 0x0002;
2947 * @brief デバッグコマンドへの導入処理
2948 * / Verify use of "debug" commands
2949 * @param player_ptr プレーヤーへの参照ポインタ
2950 * @return 実際にデバッグコマンドへ移行したらTRUEを返す。
2952 static bool enter_debug_mode(player_type *player_ptr)
2954 if (!current_world_ptr->noscore)
2956 if (!allow_debug_opts)
2958 msg_print(_("デバッグコマンドは許可されていません。 ", "Use of debug command is not permitted."));
2962 msg_print(_("デバッグ・コマンドはデバッグと実験のためのコマンドです。 ", "The debug commands are for debugging and experimenting."));
2963 msg_print(_("デバッグ・コマンドを使うとスコアは記録されません。", "The game will not be scored if you use debug commands."));
2965 if (!get_check(_("本当にデバッグ・コマンドを使いますか? ", "Are you sure you want to use debug commands? ")))
2970 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, _("デバッグモードに突入してスコアを残せなくなった。", "give up sending score to use debug commands."));
2971 current_world_ptr->noscore |= 0x0008;
2978 * todo これが多重インクルード問題の原因 (の1つ)かもしれない、wizard2.cに同名の関数が存在する
2979 * Hack -- Declare the Debug Routines
2981 extern void do_cmd_debug(player_type *creature_ptr);
2984 * @brief プレイヤーから受けた入力コマンドの分岐処理。
2985 * / Parse and execute the current command Give "Warning" on illegal commands.
2986 * @todo Make some "blocks"
2989 static void process_command(player_type *creature_ptr)
2991 COMMAND_CODE old_now_message = now_message;
2994 if ((creature_ptr->pclass == CLASS_SNIPER) && (creature_ptr->concent))
2995 creature_ptr->reset_concent = TRUE;
2997 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
2998 switch (command_cmd)
3009 /* todo 嘘。returnしていない
3016 if (current_world_ptr->wizard)
3018 current_world_ptr->wizard = FALSE;
3019 msg_print(_("ウィザードモード解除。", "Wizard mode off."));
3021 else if (enter_wizard_mode(creature_ptr))
3023 current_world_ptr->wizard = TRUE;
3024 msg_print(_("ウィザードモード突入。", "Wizard mode on."));
3026 creature_ptr->update |= (PU_MONSTERS);
3027 creature_ptr->redraw |= (PR_TITLE);
3033 if (enter_debug_mode(creature_ptr))
3035 do_cmd_debug(creature_ptr);
3041 if (!creature_ptr->wild_mode) do_cmd_wield(creature_ptr);
3046 if (!creature_ptr->wild_mode) do_cmd_takeoff(creature_ptr);
3051 if (!creature_ptr->wild_mode) do_cmd_drop(creature_ptr);
3056 do_cmd_destroy(creature_ptr);
3061 do_cmd_equip(creature_ptr);
3066 do_cmd_inven(creature_ptr);
3071 do_cmd_observe(creature_ptr);
3077 toggle_inventory_equipment(creature_ptr);
3082 if (!creature_ptr->wild_mode) do_cmd_alter(creature_ptr);
3087 if (!creature_ptr->wild_mode) do_cmd_tunnel(creature_ptr);
3092 do_cmd_walk(creature_ptr, FALSE);
3097 do_cmd_walk(creature_ptr, TRUE);
3102 if (!creature_ptr->wild_mode) do_cmd_run(creature_ptr);
3107 do_cmd_stay(creature_ptr, always_pickup);
3112 do_cmd_stay(creature_ptr, !always_pickup);
3117 do_cmd_rest(creature_ptr);
3122 do_cmd_search(creature_ptr);
3127 if (creature_ptr->action == ACTION_SEARCH) set_action(creature_ptr, ACTION_NONE);
3128 else set_action(creature_ptr, ACTION_SEARCH);
3131 case SPECIAL_KEY_STORE:
3133 do_cmd_store(creature_ptr);
3136 case SPECIAL_KEY_BUILDING:
3138 do_cmd_bldg(creature_ptr);
3141 case SPECIAL_KEY_QUEST:
3143 do_cmd_quest(creature_ptr);
3148 if (!creature_ptr->wild_mode && !floor_ptr->dun_level && !floor_ptr->inside_arena && !floor_ptr->inside_quest)
3150 if (vanilla_town) break;
3152 if (creature_ptr->ambush_flag)
3154 msg_print(_("襲撃から逃げるにはマップの端まで移動しなければならない。", "To flee the ambush you have to reach the edge of the map."));
3158 if (creature_ptr->food < PY_FOOD_WEAK)
3160 msg_print(_("その前に食事をとらないと。", "You must eat something here."));
3164 change_wild_mode(creature_ptr, FALSE);
3167 do_cmd_go_up(creature_ptr);
3173 if (creature_ptr->wild_mode)
3174 change_wild_mode(creature_ptr, FALSE);
3176 do_cmd_go_down(creature_ptr);
3181 do_cmd_open(creature_ptr);
3186 do_cmd_close(creature_ptr);
3191 do_cmd_spike(creature_ptr);
3196 do_cmd_bash(creature_ptr);
3201 do_cmd_disarm(creature_ptr);
3206 if ((creature_ptr->pclass == CLASS_SORCERER) || (creature_ptr->pclass == CLASS_RED_MAGE))
3207 msg_print(_("呪文を学習する必要はない!", "You don't have to learn spells!"));
3208 else if (creature_ptr->pclass == CLASS_SAMURAI)
3209 do_cmd_gain_hissatsu(creature_ptr);
3210 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3211 import_magic_device(creature_ptr);
3213 do_cmd_study(creature_ptr);
3218 if ((creature_ptr->pclass == CLASS_MINDCRAFTER) ||
3219 (creature_ptr->pclass == CLASS_BERSERKER) ||
3220 (creature_ptr->pclass == CLASS_NINJA) ||
3221 (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3222 ) do_cmd_mind_browse(creature_ptr);
3223 else if (creature_ptr->pclass == CLASS_SMITH)
3224 do_cmd_kaji(creature_ptr, TRUE);
3225 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3226 do_cmd_magic_eater(creature_ptr, TRUE, FALSE);
3227 else if (creature_ptr->pclass == CLASS_SNIPER)
3228 do_cmd_snipe_browse(creature_ptr);
3229 else do_cmd_browse(creature_ptr);
3234 if (!creature_ptr->wild_mode)
3236 if ((creature_ptr->pclass == CLASS_WARRIOR) || (creature_ptr->pclass == CLASS_ARCHER) || (creature_ptr->pclass == CLASS_CAVALRY))
3238 msg_print(_("呪文を唱えられない!", "You cannot cast spells!"));
3240 else if (floor_ptr->dun_level && (d_info[creature_ptr->dungeon_idx].flags1 & DF1_NO_MAGIC) && (creature_ptr->pclass != CLASS_BERSERKER) && (creature_ptr->pclass != CLASS_SMITH))
3242 msg_print(_("ダンジョンが魔法を吸収した!", "The dungeon absorbs all attempted magic!"));
3245 else if (creature_ptr->anti_magic && (creature_ptr->pclass != CLASS_BERSERKER) && (creature_ptr->pclass != CLASS_SMITH))
3247 concptr which_power = _("魔法", "magic");
3248 if (creature_ptr->pclass == CLASS_MINDCRAFTER)
3249 which_power = _("超能力", "psionic powers");
3250 else if (creature_ptr->pclass == CLASS_IMITATOR)
3251 which_power = _("ものまね", "imitation");
3252 else if (creature_ptr->pclass == CLASS_SAMURAI)
3253 which_power = _("必殺剣", "hissatsu");
3254 else if (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3255 which_power = _("鏡魔法", "mirror magic");
3256 else if (creature_ptr->pclass == CLASS_NINJA)
3257 which_power = _("忍術", "ninjutsu");
3258 else if (mp_ptr->spell_book == TV_LIFE_BOOK)
3259 which_power = _("祈り", "prayer");
3261 msg_format(_("反魔法バリアが%sを邪魔した!", "An anti-magic shell disrupts your %s!"), which_power);
3262 free_turn(creature_ptr);
3264 else if (creature_ptr->shero && (creature_ptr->pclass != CLASS_BERSERKER))
3266 msg_format(_("狂戦士化していて頭が回らない!", "You cannot think directly!"));
3267 free_turn(creature_ptr);
3271 if ((creature_ptr->pclass == CLASS_MINDCRAFTER) ||
3272 (creature_ptr->pclass == CLASS_BERSERKER) ||
3273 (creature_ptr->pclass == CLASS_NINJA) ||
3274 (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3276 do_cmd_mind(creature_ptr);
3277 else if (creature_ptr->pclass == CLASS_IMITATOR)
3278 do_cmd_mane(creature_ptr, FALSE);
3279 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3280 do_cmd_magic_eater(creature_ptr, FALSE, FALSE);
3281 else if (creature_ptr->pclass == CLASS_SAMURAI)
3282 do_cmd_hissatsu(creature_ptr);
3283 else if (creature_ptr->pclass == CLASS_BLUE_MAGE)
3284 do_cmd_cast_learned(creature_ptr);
3285 else if (creature_ptr->pclass == CLASS_SMITH)
3286 do_cmd_kaji(creature_ptr, FALSE);
3287 else if (creature_ptr->pclass == CLASS_SNIPER)
3288 do_cmd_snipe(creature_ptr);
3290 do_cmd_cast(creature_ptr);
3298 do_cmd_pet(creature_ptr);
3303 do_cmd_inscribe(creature_ptr);
3308 do_cmd_uninscribe(creature_ptr);
3313 do_cmd_activate(creature_ptr);
3318 do_cmd_eat_food(creature_ptr);
3323 do_cmd_refill(creature_ptr);
3328 do_cmd_fire(creature_ptr, SP_NONE);
3333 do_cmd_throw(creature_ptr, 1, FALSE, -1);
3338 do_cmd_aim_wand(creature_ptr);
3343 if (use_command && rogue_like_commands)
3345 do_cmd_use(creature_ptr);
3349 do_cmd_zap_rod(creature_ptr);
3355 do_cmd_quaff_potion(creature_ptr);
3360 do_cmd_read_scroll(creature_ptr);
3365 if (use_command && !rogue_like_commands)
3366 do_cmd_use(creature_ptr);
3368 do_cmd_use_staff(creature_ptr);
3373 do_cmd_racial_power(creature_ptr);
3378 do_cmd_view_map(creature_ptr);
3383 do_cmd_locate(creature_ptr);
3388 do_cmd_look(creature_ptr);
3393 do_cmd_target(creature_ptr);
3398 do_cmd_help(creature_ptr);
3403 do_cmd_query_symbol(creature_ptr);
3408 do_cmd_player_status(creature_ptr);
3418 do_cmd_pref(creature_ptr);
3423 do_cmd_reload_autopick(creature_ptr);
3428 do_cmd_edit_autopick(creature_ptr);
3433 do_cmd_macros(creature_ptr);
3438 do_cmd_visuals(creature_ptr);
3439 do_cmd_redraw(creature_ptr);
3444 do_cmd_colors(creature_ptr);
3445 do_cmd_redraw(creature_ptr);
3451 (void)combine_and_reorder_home(STORE_HOME);
3452 do_cmd_redraw(creature_ptr);
3467 do_cmd_feeling(creature_ptr);
3472 do_cmd_message_one();
3477 do_cmd_messages(old_now_message);
3482 do_cmd_checkquest(creature_ptr);
3487 now_message = old_now_message;
3488 do_cmd_redraw(creature_ptr);
3493 do_cmd_save_game(creature_ptr, FALSE);
3498 do_cmd_time(creature_ptr);
3502 case SPECIAL_KEY_QUIT:
3504 do_cmd_save_and_exit(creature_ptr);
3509 do_cmd_suicide(creature_ptr);
3514 do_cmd_diary(creature_ptr);
3519 do_cmd_knowledge(creature_ptr);
3524 do_cmd_load_screen();
3529 do_cmd_save_screen(creature_ptr);
3534 prepare_movie_hooks();
3539 spoil_random_artifact(creature_ptr, "randifact.txt");
3544 if (!creature_ptr->wild_mode) do_cmd_travel(creature_ptr);
3545 if (creature_ptr->special_defense & KATA_MUSOU)
3547 set_action(creature_ptr, ACTION_NONE);
3553 if (flush_failure) flush();
3557 sound(SOUND_ILLEGAL);
3558 if (!get_rnd_line(_("error_j.txt", "error.txt"), 0, error_m))
3563 prt(_(" '?' でヘルプが表示されます。", "Type '?' for help."), 0, 0);
3570 if (!creature_ptr->energy_use && !now_message)
3571 now_message = old_now_message;
3576 * @brief アイテムの所持種類数が超えた場合にアイテムを床に落とす処理 / Hack -- Pack Overflow
3579 static void pack_overflow(player_type *owner_ptr)
3581 if (owner_ptr->inventory_list[INVEN_PACK].k_idx == 0) return;
3583 GAME_TEXT o_name[MAX_NLEN];
3585 update_creature(owner_ptr);
3586 if (!owner_ptr->inventory_list[INVEN_PACK].k_idx) return;
3588 o_ptr = &owner_ptr->inventory_list[INVEN_PACK];
3589 disturb(owner_ptr, FALSE, TRUE);
3590 msg_print(_("ザックからアイテムがあふれた!", "Your pack overflows!"));
3592 object_desc(owner_ptr, o_name, o_ptr, 0);
3593 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(INVEN_PACK));
3594 (void)drop_near(owner_ptr, o_ptr, 0, owner_ptr->y, owner_ptr->x);
3596 vary_item(owner_ptr, INVEN_PACK, -255);
3597 handle_stuff(owner_ptr);
3602 * @brief プレイヤーの行動エネルギーが充填される(=プレイヤーのターンが回る)毎に行われる処理 / process the effects per 100 energy at player speed.
3605 static void process_upkeep_with_speed(player_type *creature_ptr)
3607 if (!load && creature_ptr->enchant_energy_need > 0 && !creature_ptr->leaving)
3609 creature_ptr->enchant_energy_need -= SPEED_TO_ENERGY(creature_ptr->pspeed);
3612 if (creature_ptr->enchant_energy_need > 0) return;
3614 while (creature_ptr->enchant_energy_need <= 0)
3616 if (!load) check_music(creature_ptr);
3617 if (!load) check_hex(creature_ptr);
3618 if (!load) revenge_spell(creature_ptr);
3620 creature_ptr->enchant_energy_need += ENERGY_NEED();
3625 static void process_fishing(player_type *creature_ptr)
3627 Term_xtra(TERM_XTRA_DELAY, 10);
3631 bool success = FALSE;
3632 get_mon_num_prep(creature_ptr, monster_is_fishing_target, NULL);
3633 r_idx = get_mon_num(creature_ptr, creature_ptr->current_floor_ptr->dun_level ? creature_ptr->current_floor_ptr->dun_level : wilderness[creature_ptr->wilderness_y][creature_ptr->wilderness_x].level);
3635 if (r_idx && one_in_(2))
3638 y = creature_ptr->y + ddy[creature_ptr->fishing_dir];
3639 x = creature_ptr->x + ddx[creature_ptr->fishing_dir];
3640 if (place_monster_aux(creature_ptr, 0, y, x, r_idx, PM_NO_KAGE))
3642 GAME_TEXT m_name[MAX_NLEN];
3643 monster_desc(creature_ptr, m_name, &creature_ptr->current_floor_ptr->m_list[creature_ptr->current_floor_ptr->grid_array[y][x].m_idx], 0);
3644 msg_format(_("%sが釣れた!", "You have a good catch!"), m_name);
3651 msg_print(_("餌だけ食われてしまった!くっそ~!", "Damn! The fish stole your bait!"));
3654 disturb(creature_ptr, FALSE, TRUE);
3660 * @brief プレイヤーの行動処理 / Process the player
3663 * Notice the annoying code to handle "pack overflow", which\n
3664 * must come first just in case somebody manages to corrupt\n
3665 * the savefiles by clever use of menu commands or something.\n
3667 static void process_player(player_type *creature_ptr)
3669 if (creature_ptr->hack_mutation)
3671 msg_print(_("何か変わった気がする!", "You feel different!"));
3673 (void)gain_mutation(creature_ptr, 0);
3674 creature_ptr->hack_mutation = FALSE;
3677 if (creature_ptr->invoking_midnight_curse)
3680 activate_ty_curse(creature_ptr, FALSE, &count);
3681 creature_ptr->invoking_midnight_curse = FALSE;
3684 if (creature_ptr->phase_out)
3686 for (MONSTER_IDX m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
3688 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
3689 if (!monster_is_valid(m_ptr)) continue;
3691 m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
3692 update_monster(creature_ptr, m_idx, FALSE);
3695 print_time(creature_ptr);
3697 else if (!(load && creature_ptr->energy_need <= 0))
3699 creature_ptr->energy_need -= SPEED_TO_ENERGY(creature_ptr->pspeed);
3702 if (creature_ptr->energy_need > 0) return;
3703 if (!command_rep) print_time(creature_ptr);
3705 if (creature_ptr->resting < 0)
3707 if (creature_ptr->resting == COMMAND_ARG_REST_FULL_HEALING)
3709 if ((creature_ptr->chp == creature_ptr->mhp) &&
3710 (creature_ptr->csp >= creature_ptr->msp))
3712 set_action(creature_ptr, ACTION_NONE);
3715 else if (creature_ptr->resting == COMMAND_ARG_REST_UNTIL_DONE)
3717 if ((creature_ptr->chp == creature_ptr->mhp) &&
3718 (creature_ptr->csp >= creature_ptr->msp) &&
3719 !creature_ptr->blind && !creature_ptr->confused &&
3720 !creature_ptr->poisoned && !creature_ptr->afraid &&
3721 !creature_ptr->stun && !creature_ptr->cut &&
3722 !creature_ptr->slow && !creature_ptr->paralyzed &&
3723 !creature_ptr->image && !creature_ptr->word_recall &&
3724 !creature_ptr->alter_reality)
3726 set_action(creature_ptr, ACTION_NONE);
3731 if (creature_ptr->action == ACTION_FISH) process_fishing(creature_ptr);
3735 if (creature_ptr->running || travel.run || command_rep || (creature_ptr->action == ACTION_REST) || (creature_ptr->action == ACTION_FISH))
3741 disturb(creature_ptr, FALSE, TRUE);
3742 msg_print(_("中断しました。", "Canceled."));
3747 if (creature_ptr->riding && !creature_ptr->confused && !creature_ptr->blind)
3749 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
3750 monster_race *r_ptr = &r_info[m_ptr->r_idx];
3751 if (MON_CSLEEP(m_ptr))
3753 GAME_TEXT m_name[MAX_NLEN];
3754 (void)set_monster_csleep(creature_ptr, creature_ptr->riding, 0);
3755 monster_desc(creature_ptr, m_name, m_ptr, 0);
3756 msg_format(_("%^sを起こした。", "You have woken %s up."), m_name);
3759 if (MON_STUNNED(m_ptr))
3761 if (set_monster_stunned(creature_ptr, creature_ptr->riding,
3762 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_STUNNED(m_ptr) - 1)))
3764 GAME_TEXT m_name[MAX_NLEN];
3765 monster_desc(creature_ptr, m_name, m_ptr, 0);
3766 msg_format(_("%^sを朦朧状態から立ち直らせた。", "%^s is no longer stunned."), m_name);
3770 if (MON_CONFUSED(m_ptr))
3772 if (set_monster_confused(creature_ptr, creature_ptr->riding,
3773 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_CONFUSED(m_ptr) - 1)))
3775 GAME_TEXT m_name[MAX_NLEN];
3776 monster_desc(creature_ptr, m_name, m_ptr, 0);
3777 msg_format(_("%^sを混乱状態から立ち直らせた。", "%^s is no longer confused."), m_name);
3781 if (MON_MONFEAR(m_ptr))
3783 if (set_monster_monfear(creature_ptr, creature_ptr->riding,
3784 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_MONFEAR(m_ptr) - 1)))
3786 GAME_TEXT m_name[MAX_NLEN];
3787 monster_desc(creature_ptr, m_name, m_ptr, 0);
3788 msg_format(_("%^sを恐怖から立ち直らせた。", "%^s is no longer afraid."), m_name);
3792 handle_stuff(creature_ptr);
3796 if (creature_ptr->lightspeed)
3798 (void)set_lightspeed(creature_ptr, creature_ptr->lightspeed - 1, TRUE);
3801 if ((creature_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
3803 if (P_PTR_KI < 40) P_PTR_KI = 0;
3804 else P_PTR_KI -= 40;
3805 creature_ptr->update |= (PU_BONUS);
3808 if (creature_ptr->action == ACTION_LEARN)
3811 u32b cost_frac = (creature_ptr->msp + 30L) * 256L;
3812 s64b_LSHIFT(cost, cost_frac, 16);
3813 if (s64b_cmp(creature_ptr->csp, creature_ptr->csp_frac, cost, cost_frac) < 0)
3815 creature_ptr->csp = 0;
3816 creature_ptr->csp_frac = 0;
3817 set_action(creature_ptr, ACTION_NONE);
3821 s64b_sub(&(creature_ptr->csp), &(creature_ptr->csp_frac), cost, cost_frac);
3824 creature_ptr->redraw |= PR_MANA;
3827 if (creature_ptr->special_defense & KATA_MASK)
3829 if (creature_ptr->special_defense & KATA_MUSOU)
3831 if (creature_ptr->csp < 3)
3833 set_action(creature_ptr, ACTION_NONE);
3837 creature_ptr->csp -= 2;
3838 creature_ptr->redraw |= (PR_MANA);
3843 /*** Handle actual user input ***/
3844 while (creature_ptr->energy_need <= 0)
3846 creature_ptr->window |= PW_PLAYER;
3847 creature_ptr->sutemi = FALSE;
3848 creature_ptr->counter = FALSE;
3849 creature_ptr->now_damaged = FALSE;
3851 handle_stuff(creature_ptr);
3852 move_cursor_relative(creature_ptr->y, creature_ptr->x);
3853 if (fresh_before) Term_fresh();
3855 pack_overflow(creature_ptr);
3856 if (!command_new) command_see = FALSE;
3858 free_turn(creature_ptr);
3859 if (creature_ptr->phase_out)
3861 move_cursor_relative(creature_ptr->y, creature_ptr->x);
3862 command_cmd = SPECIAL_KEY_BUILDING;
3863 process_command(creature_ptr);
3865 else if (creature_ptr->paralyzed || (creature_ptr->stun >= 100))
3867 take_turn(creature_ptr, 100);
3869 else if (creature_ptr->action == ACTION_REST)
3871 if (creature_ptr->resting > 0)
3873 creature_ptr->resting--;
3874 if (!creature_ptr->resting) set_action(creature_ptr, ACTION_NONE);
3875 creature_ptr->redraw |= (PR_STATE);
3878 take_turn(creature_ptr, 100);
3880 else if (creature_ptr->action == ACTION_FISH)
3882 take_turn(creature_ptr, 100);
3884 else if (creature_ptr->running)
3886 run_step(creature_ptr, 0);
3888 else if (travel.run)
3890 travel_step(creature_ptr);
3892 else if (command_rep)
3895 creature_ptr->redraw |= (PR_STATE);
3896 handle_stuff(creature_ptr);
3899 process_command(creature_ptr);
3903 move_cursor_relative(creature_ptr->y, creature_ptr->x);
3905 request_command(creature_ptr, FALSE);
3907 process_command(creature_ptr);
3910 pack_overflow(creature_ptr);
3911 if (creature_ptr->energy_use)
3913 if (creature_ptr->timewalk || creature_ptr->energy_use > 400)
3915 creature_ptr->energy_need += creature_ptr->energy_use * TURNS_PER_TICK / 10;
3919 creature_ptr->energy_need += (s16b)((s32b)creature_ptr->energy_use * ENERGY_NEED() / 100L);
3922 if (creature_ptr->image) creature_ptr->redraw |= (PR_MAP);
3924 for (MONSTER_IDX m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
3926 monster_type *m_ptr;
3927 monster_race *r_ptr;
3928 m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
3929 if (!monster_is_valid(m_ptr)) continue;
3930 if (!m_ptr->ml) continue;
3932 r_ptr = &r_info[m_ptr->ap_r_idx];
3933 if (!(r_ptr->flags1 & (RF1_ATTR_MULTI | RF1_SHAPECHANGER)))
3936 lite_spot(creature_ptr, m_ptr->fy, m_ptr->fx);
3939 if (repair_monsters)
3941 repair_monsters = FALSE;
3942 for (MONSTER_IDX m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
3944 monster_type *m_ptr;
3945 m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
3946 if (!monster_is_valid(m_ptr)) continue;
3948 if (m_ptr->mflag & MFLAG_NICE)
3950 m_ptr->mflag &= ~(MFLAG_NICE);
3953 if (m_ptr->mflag2 & MFLAG2_MARK)
3955 if (m_ptr->mflag2 & MFLAG2_SHOW)
3957 m_ptr->mflag2 &= ~(MFLAG2_SHOW);
3958 repair_monsters = TRUE;
3962 m_ptr->mflag2 &= ~(MFLAG2_MARK);
3964 update_monster(creature_ptr, m_idx, FALSE);
3965 if (creature_ptr->health_who == m_idx) creature_ptr->redraw |= (PR_HEALTH);
3966 if (creature_ptr->riding == m_idx) creature_ptr->redraw |= (PR_UHEALTH);
3968 lite_spot(creature_ptr, m_ptr->fy, m_ptr->fx);
3974 if (creature_ptr->pclass == CLASS_IMITATOR)
3976 if (creature_ptr->mane_num > (creature_ptr->lev > 44 ? 3 : creature_ptr->lev > 29 ? 2 : 1))
3978 creature_ptr->mane_num--;
3979 for (int j = 0; j < creature_ptr->mane_num; j++)
3981 creature_ptr->mane_spell[j] = creature_ptr->mane_spell[j + 1];
3982 creature_ptr->mane_dam[j] = creature_ptr->mane_dam[j + 1];
3986 creature_ptr->new_mane = FALSE;
3987 creature_ptr->redraw |= (PR_IMITATION);
3990 if (creature_ptr->action == ACTION_LEARN)
3992 creature_ptr->new_mane = FALSE;
3993 creature_ptr->redraw |= (PR_STATE);
3996 if (creature_ptr->timewalk && (creature_ptr->energy_need > -1000))
3999 creature_ptr->redraw |= (PR_MAP);
4000 creature_ptr->update |= (PU_MONSTERS);
4001 creature_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
4003 msg_print(_("「時は動きだす…」", "You feel time flowing around you once more."));
4005 creature_ptr->timewalk = FALSE;
4006 creature_ptr->energy_need = ENERGY_NEED();
4008 handle_stuff(creature_ptr);
4012 if (!creature_ptr->playing || creature_ptr->is_dead)
4014 creature_ptr->timewalk = FALSE;
4018 if (creature_ptr->energy_use && creature_ptr->reset_concent)
4019 reset_concentration(creature_ptr, TRUE);
4021 if (creature_ptr->leaving) break;
4024 update_smell(creature_ptr->current_floor_ptr, creature_ptr);
4029 * @brief 現在プレイヤーがいるダンジョンの全体処理 / Interact with the current dungeon level.
4033 * この関数から現在の階層を出る、プレイヤーがキャラが死ぬ、
4034 * ゲームを終了するかのいずれかまでループする。
4037 * This function will not exit until the level is completed,\n
4038 * the user dies, or the game is terminated.\n
4041 static void dungeon(player_type *player_ptr, bool load_game)
4043 floor_type *floor_ptr = player_ptr->current_floor_ptr;
4044 floor_ptr->base_level = floor_ptr->dun_level;
4045 current_world_ptr->is_loading_now = FALSE;
4046 player_ptr->leaving = FALSE;
4054 player_ptr->pet_t_m_idx = 0;
4055 player_ptr->riding_t_m_idx = 0;
4056 player_ptr->ambush_flag = FALSE;
4057 health_track(player_ptr, 0);
4058 repair_monsters = TRUE;
4059 repair_objects = TRUE;
4061 disturb(player_ptr, TRUE, TRUE);
4062 int quest_num = quest_num = quest_number(player_ptr, floor_ptr->dun_level);
4065 r_info[quest[quest_num].r_idx].flags1 |= RF1_QUESTOR;
4068 if (player_ptr->max_plv < player_ptr->lev)
4070 player_ptr->max_plv = player_ptr->lev;
4073 if ((max_dlv[player_ptr->dungeon_idx] < floor_ptr->dun_level) && !floor_ptr->inside_quest)
4075 max_dlv[player_ptr->dungeon_idx] = floor_ptr->dun_level;
4076 if (record_maxdepth) exe_write_diary(player_ptr, DIARY_MAXDEAPTH, floor_ptr->dun_level, NULL);
4079 (void)calculate_upkeep(player_ptr);
4080 panel_bounds_center();
4081 verify_panel(player_ptr);
4084 current_world_ptr->character_xtra = TRUE;
4085 player_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER | PW_MONSTER | PW_OVERHEAD | PW_DUNGEON);
4086 player_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_EQUIPPY | PR_MAP);
4087 player_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS | PU_VIEW | PU_LITE | PU_MON_LITE | PU_TORCH | PU_MONSTERS | PU_DISTANCE | PU_FLOW);
4088 handle_stuff(player_ptr);
4090 current_world_ptr->character_xtra = FALSE;
4091 player_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
4092 player_ptr->update |= (PU_COMBINE | PU_REORDER);
4093 handle_stuff(player_ptr);
4096 if (quest_num && (is_fixed_quest_idx(quest_num) &&
4097 !((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT) ||
4098 !(quest[quest_num].flags & QUEST_FLAG_PRESET))))
4099 do_cmd_feeling(player_ptr);
4101 if (player_ptr->phase_out)
4105 player_ptr->energy_need = 0;
4106 update_gambling_monsters(player_ptr);
4110 msg_print(_("試合開始!", "Ready..Fight!"));
4115 if ((player_ptr->pclass == CLASS_BARD) && (SINGING_SONG_EFFECT(player_ptr) > MUSIC_DETECT))
4116 SINGING_SONG_EFFECT(player_ptr) = MUSIC_DETECT;
4118 if (!player_ptr->playing || player_ptr->is_dead) return;
4120 if (!floor_ptr->inside_quest && (player_ptr->dungeon_idx == DUNGEON_ANGBAND))
4122 quest_discovery(random_quest_number(player_ptr, floor_ptr->dun_level));
4123 floor_ptr->inside_quest = random_quest_number(player_ptr, floor_ptr->dun_level);
4125 if ((floor_ptr->dun_level == d_info[player_ptr->dungeon_idx].maxdepth) && d_info[player_ptr->dungeon_idx].final_guardian)
4127 if (r_info[d_info[player_ptr->dungeon_idx].final_guardian].max_num)
4129 msg_format("この階には%sの主である%sが棲んでいる。",
4130 d_name + d_info[player_ptr->dungeon_idx].name,
4131 r_name + r_info[d_info[player_ptr->dungeon_idx].final_guardian].name);
4133 msg_format("%^s lives in this level as the keeper of %s.",
4134 r_name + r_info[d_info[player_ptr->dungeon_idx].final_guardian].name,
4135 d_name + d_info[player_ptr->dungeon_idx].name);
4139 if (!load_game && (player_ptr->special_defense & NINJA_S_STEALTH)) set_superstealth(player_ptr, FALSE);
4141 floor_ptr->monster_level = floor_ptr->base_level;
4142 floor_ptr->object_level = floor_ptr->base_level;
4143 current_world_ptr->is_loading_now = TRUE;
4144 if (player_ptr->energy_need > 0 && !player_ptr->phase_out &&
4145 (floor_ptr->dun_level || player_ptr->leaving_dungeon || floor_ptr->inside_arena))
4146 player_ptr->energy_need = 0;
4148 player_ptr->leaving_dungeon = FALSE;
4149 mproc_init(floor_ptr);
4153 if ((floor_ptr->m_cnt + 32 > current_world_ptr->max_m_idx) && !player_ptr->phase_out)
4154 compact_monsters(player_ptr, 64);
4156 if ((floor_ptr->m_cnt + 32 < floor_ptr->m_max) && !player_ptr->phase_out)
4157 compact_monsters(player_ptr, 0);
4159 if (floor_ptr->o_cnt + 32 > current_world_ptr->max_o_idx)
4160 compact_objects(player_ptr, 64);
4162 if (floor_ptr->o_cnt + 32 < floor_ptr->o_max)
4163 compact_objects(player_ptr, 0);
4165 process_player(player_ptr);
4166 process_upkeep_with_speed(player_ptr);
4167 handle_stuff(player_ptr);
4169 move_cursor_relative(player_ptr->y, player_ptr->x);
4170 if (fresh_after) Term_fresh();
4172 if (!player_ptr->playing || player_ptr->is_dead) break;
4174 process_monsters(player_ptr);
4175 handle_stuff(player_ptr);
4177 move_cursor_relative(player_ptr->y, player_ptr->x);
4178 if (fresh_after) Term_fresh();
4180 if (!player_ptr->playing || player_ptr->is_dead) break;
4182 process_world(player_ptr);
4183 handle_stuff(player_ptr);
4185 move_cursor_relative(player_ptr->y, player_ptr->x);
4186 if (fresh_after) Term_fresh();
4188 if (!player_ptr->playing || player_ptr->is_dead) break;
4190 current_world_ptr->game_turn++;
4191 if (current_world_ptr->dungeon_turn < current_world_ptr->dungeon_turn_limit)
4193 if (!player_ptr->wild_mode || wild_regen) current_world_ptr->dungeon_turn++;
4194 else if (player_ptr->wild_mode && !(current_world_ptr->game_turn % ((MAX_HGT + MAX_WID) / 2))) current_world_ptr->dungeon_turn++;
4197 prevent_turn_overflow(player_ptr);
4199 if (player_ptr->leaving) break;
4201 if (wild_regen) wild_regen--;
4204 if (quest_num && !(r_info[quest[quest_num].r_idx].flags1 & RF1_UNIQUE))
4206 r_info[quest[quest_num].r_idx].flags1 &= ~RF1_QUESTOR;
4209 if (player_ptr->playing && !player_ptr->is_dead)
4212 * Maintain Unique monsters and artifact, save current
4213 * floor, then prepare next floor
4215 leave_floor(player_ptr);
4216 reinit_wilderness = FALSE;
4224 * @brief 全ユーザプロファイルをロードする / Load some "user pref files"
4225 * @paaram player_ptr プレーヤーへの参照ポインタ
4228 * Modified by Arcum Dagsson to support
4229 * separate macro files for different realms.
4231 static void load_all_pref_files(player_type *player_ptr)
4234 sprintf(buf, "user.prf");
4235 process_pref_file(player_ptr, buf);
4236 sprintf(buf, "user-%s.prf", ANGBAND_SYS);
4237 process_pref_file(player_ptr, buf);
4238 sprintf(buf, "%s.prf", rp_ptr->title);
4239 process_pref_file(player_ptr, buf);
4240 sprintf(buf, "%s.prf", cp_ptr->title);
4241 process_pref_file(player_ptr, buf);
4242 sprintf(buf, "%s.prf", player_ptr->base_name);
4243 process_pref_file(player_ptr, buf);
4244 if (player_ptr->realm1 != REALM_NONE)
4246 sprintf(buf, "%s.prf", realm_names[player_ptr->realm1]);
4247 process_pref_file(player_ptr, buf);
4250 if (player_ptr->realm2 != REALM_NONE)
4252 sprintf(buf, "%s.prf", realm_names[player_ptr->realm2]);
4253 process_pref_file(player_ptr, buf);
4256 autopick_load_pref(player_ptr, FALSE);
4261 * @brief 1ゲームプレイの主要ルーチン / Actually play a game
4264 * If the "new_game" parameter is true, then, after loading the
4265 * savefile, we will commit suicide, if necessary, to allow the
4266 * player to start a new game.
4268 void play_game(player_type *player_ptr, bool new_game)
4270 bool load_game = TRUE;
4271 bool init_random_seed = FALSE;
4281 else if (chuukei_server)
4283 prepare_chuukei_hooks();
4289 reset_visuals(player_ptr);
4294 player_ptr->hack_mutation = FALSE;
4295 current_world_ptr->character_icky = TRUE;
4296 Term_activate(angband_term[0]);
4297 angband_term[0]->resize_hook = resize_map;
4298 for (MONSTER_IDX i = 1; i < 8; i++)
4300 if (angband_term[i])
4302 angband_term[i]->resize_hook = redraw_window;
4306 (void)Term_set_cursor(0);
4307 if (!load_player(player_ptr))
4309 quit(_("セーブファイルが壊れています", "broken savefile"));
4312 extract_option_vars();
4313 if (player_ptr->wait_report_score)
4318 if (!get_check_strict(_("待機していたスコア登録を今行ないますか?", "Do you register score now? "), CHECK_NO_HISTORY))
4321 player_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
4322 update_creature(player_ptr);
4323 player_ptr->is_dead = TRUE;
4324 current_world_ptr->start_time = (u32b)time(NULL);
4325 signals_ignore_tstp();
4326 current_world_ptr->character_icky = TRUE;
4327 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
4328 highscore_fd = fd_open(buf, O_RDWR);
4330 /* 町名消失バグ対策(#38205)のためここで世界マップ情報を読み出す */
4331 process_dungeon_file(player_ptr, "w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
4332 success = send_world_score(player_ptr, TRUE, update_playtime, display_player, map_name);
4334 if (!success && !get_check_strict(_("スコア登録を諦めますか?", "Do you give up score registration? "), CHECK_NO_HISTORY))
4336 prt(_("引き続き待機します。", "standing by for future registration..."), 0, 0);
4341 player_ptr->wait_report_score = FALSE;
4342 top_twenty(player_ptr);
4343 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
4346 (void)fd_close(highscore_fd);
4348 signals_handle_tstp();
4353 current_world_ptr->creating_savefile = new_game;
4355 if (!current_world_ptr->character_loaded)
4358 current_world_ptr->character_dungeon = FALSE;
4359 init_random_seed = TRUE;
4360 init_saved_floors(player_ptr, FALSE);
4364 init_saved_floors(player_ptr, TRUE);
4369 process_player_name(player_ptr, FALSE);
4372 if (init_random_seed)
4377 floor_type *floor_ptr = player_ptr->current_floor_ptr;
4380 current_world_ptr->character_dungeon = FALSE;
4382 floor_ptr->dun_level = 0;
4383 floor_ptr->inside_quest = 0;
4384 floor_ptr->inside_arena = FALSE;
4385 player_ptr->phase_out = FALSE;
4388 current_world_ptr->seed_flavor = randint0(0x10000000);
4389 current_world_ptr->seed_town = randint0(0x10000000);
4391 player_birth(player_ptr);
4392 counts_write(player_ptr, 2, 0);
4393 player_ptr->count = 0;
4395 determine_bounty_uniques(player_ptr);
4396 determine_daily_bounty(player_ptr, FALSE);
4397 wipe_o_list(floor_ptr);
4401 write_level = FALSE;
4402 exe_write_diary(player_ptr, DIARY_GAMESTART, 1,
4404 " ---- Restart Game ----"));
4407 * todo もう2.2.Xなので互換性は打ち切ってもいいのでは?
4408 * 1.0.9 以前はセーブ前に player_ptr->riding = -1 としていたので、再設定が必要だった。
4409 * もう不要だが、以前のセーブファイルとの互換のために残しておく。
4411 if (player_ptr->riding == -1)
4413 player_ptr->riding = 0;
4414 for (MONSTER_IDX i = floor_ptr->m_max; i > 0; i--)
4416 if (player_bold(player_ptr, floor_ptr->m_list[i].fy, floor_ptr->m_list[i].fx))
4418 player_ptr->riding = i;
4425 current_world_ptr->creating_savefile = FALSE;
4427 player_ptr->teleport_town = FALSE;
4428 player_ptr->sutemi = FALSE;
4429 current_world_ptr->timewalk_m_idx = 0;
4430 player_ptr->now_damaged = FALSE;
4432 current_world_ptr->start_time = time(NULL) - 1;
4433 record_o_name[0] = '\0';
4435 panel_row_min = floor_ptr->height;
4436 panel_col_min = floor_ptr->width;
4437 if (player_ptr->pseikaku == SEIKAKU_SEXY)
4438 s_info[player_ptr->pclass].w_max[TV_HAFTED - TV_WEAPON_BEGIN][SV_WHIP] = WEAPON_EXP_MASTER;
4440 set_floor_and_wall(player_ptr->dungeon_idx);
4442 prt(_("お待ち下さい...", "Please wait..."), 0, 0);
4447 if (enter_wizard_mode(player_ptr))
4449 current_world_ptr->wizard = TRUE;
4451 if (player_ptr->is_dead || !player_ptr->y || !player_ptr->x)
4453 init_saved_floors(player_ptr, TRUE);
4454 floor_ptr->inside_quest = 0;
4455 player_ptr->y = player_ptr->x = 10;
4458 else if (player_ptr->is_dead)
4460 quit("Already dead.");
4464 if (!floor_ptr->dun_level && !floor_ptr->inside_quest)
4466 process_dungeon_file(player_ptr, "w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
4467 init_flags = INIT_ONLY_BUILDINGS;
4468 process_dungeon_file(player_ptr, "t_info.txt", 0, 0, MAX_HGT, MAX_WID);
4469 select_floor_music(player_ptr);
4472 if (!current_world_ptr->character_dungeon)
4474 change_floor(player_ptr);
4478 if (player_ptr->panic_save)
4480 if (!player_ptr->y || !player_ptr->x)
4482 msg_print(_("プレイヤーの位置がおかしい。フロアを再生成します。", "What a strange player location, regenerate the dungeon floor."));
4483 change_floor(player_ptr);
4486 if (!player_ptr->y || !player_ptr->x) player_ptr->y = player_ptr->x = 10;
4488 player_ptr->panic_save = 0;
4492 current_world_ptr->character_generated = TRUE;
4493 current_world_ptr->character_icky = FALSE;
4498 sprintf(buf, _("%sに降り立った。", "You are standing in the %s."), map_name(player_ptr));
4499 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, buf);
4502 player_ptr->playing = TRUE;
4503 reset_visuals(player_ptr);
4504 load_all_pref_files(player_ptr);
4507 player_outfit(player_ptr);
4510 Term_xtra(TERM_XTRA_REACT, 0);
4512 player_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
4513 player_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
4514 handle_stuff(player_ptr);
4516 if (arg_force_original) rogue_like_commands = FALSE;
4517 if (arg_force_roguelike) rogue_like_commands = TRUE;
4519 if (player_ptr->chp < 0) player_ptr->is_dead = TRUE;
4521 if (player_ptr->prace == RACE_ANDROID) calc_android_exp(player_ptr);
4523 if (new_game && ((player_ptr->pclass == CLASS_CAVALRY) || (player_ptr->pclass == CLASS_BEASTMASTER)))
4525 monster_type *m_ptr;
4526 MONRACE_IDX pet_r_idx = ((player_ptr->pclass == CLASS_CAVALRY) ? MON_HORSE : MON_YASE_HORSE);
4527 monster_race *r_ptr = &r_info[pet_r_idx];
4528 place_monster_aux(player_ptr, 0, player_ptr->y, player_ptr->x - 1, pet_r_idx,
4529 (PM_FORCE_PET | PM_NO_KAGE));
4530 m_ptr = &floor_ptr->m_list[hack_m_idx_ii];
4531 m_ptr->mspeed = r_ptr->speed;
4532 m_ptr->maxhp = r_ptr->hdice*(r_ptr->hside + 1) / 2;
4533 m_ptr->max_maxhp = m_ptr->maxhp;
4534 m_ptr->hp = r_ptr->hdice*(r_ptr->hside + 1) / 2;
4535 m_ptr->dealt_damage = 0;
4536 m_ptr->energy_need = ENERGY_NEED() + ENERGY_NEED();
4539 (void)combine_and_reorder_home(STORE_HOME);
4540 (void)combine_and_reorder_home(STORE_MUSEUM);
4541 select_floor_music(player_ptr);
4545 dungeon(player_ptr, load_game);
4546 current_world_ptr->character_xtra = TRUE;
4547 handle_stuff(player_ptr);
4549 current_world_ptr->character_xtra = FALSE;
4551 health_track(player_ptr, 0);
4552 forget_lite(floor_ptr);
4553 forget_view(floor_ptr);
4554 clear_mon_lite(floor_ptr);
4555 if (!player_ptr->playing && !player_ptr->is_dead) break;
4557 wipe_o_list(floor_ptr);
4558 if (!player_ptr->is_dead) wipe_monsters_list(player_ptr);
4562 if (player_ptr->playing && player_ptr->is_dead)
4564 if (floor_ptr->inside_arena)
4566 floor_ptr->inside_arena = FALSE;
4567 if (player_ptr->arena_number > MAX_ARENA_MONS)
4568 player_ptr->arena_number++;
4570 player_ptr->arena_number = -1 - player_ptr->arena_number;
4571 player_ptr->is_dead = FALSE;
4572 player_ptr->chp = 0;
4573 player_ptr->chp_frac = 0;
4574 player_ptr->exit_bldg = TRUE;
4575 reset_tim_flags(player_ptr);
4576 prepare_change_floor_mode(player_ptr, CFM_SAVE_FLOORS | CFM_RAND_CONNECT);
4577 leave_floor(player_ptr);
4581 if ((current_world_ptr->wizard || cheat_live) && !get_check(_("死にますか? ", "Die? ")))
4583 cheat_death(player_ptr);
4588 if (player_ptr->is_dead) break;
4590 change_floor(player_ptr);
4593 close_game(player_ptr);
4599 * @brief ゲームターンからの実時間換算を行うための補正をかける
4600 * @param hoge ゲームターン
4601 * @details アンデッド種族は18:00からゲームを開始するので、この修正を予め行う。
4602 * @return 修正をかけた後のゲームターン
4604 s32b turn_real(player_type *player_ptr, s32b hoge)
4606 switch (player_ptr->start_race)
4612 return hoge - (TURNS_PER_TICK * TOWN_DAWN * 3 / 4);
4620 * @brief ターンのオーバーフローに対する対処
4621 * @param player_ptr プレーヤーへの参照ポインタ
4622 * @details ターン及びターンを記録する変数をターンの限界の1日前まで巻き戻す.
4623 * @return 修正をかけた後のゲームターン
4625 void prevent_turn_overflow(player_type *player_ptr)
4627 if (current_world_ptr->game_turn < current_world_ptr->game_turn_limit) return;
4629 int rollback_days = 1 + (current_world_ptr->game_turn - current_world_ptr->game_turn_limit) / (TURNS_PER_TICK * TOWN_DAWN);
4630 s32b rollback_turns = TURNS_PER_TICK * TOWN_DAWN * rollback_days;
4632 if (current_world_ptr->game_turn > rollback_turns) current_world_ptr->game_turn -= rollback_turns;
4633 else current_world_ptr->game_turn = 1;
4634 floor_type *floor_ptr = player_ptr->current_floor_ptr;
4635 if (floor_ptr->generated_turn > rollback_turns) floor_ptr->generated_turn -= rollback_turns;
4636 else floor_ptr->generated_turn = 1;
4637 if (current_world_ptr->arena_start_turn > rollback_turns) current_world_ptr->arena_start_turn -= rollback_turns;
4638 else current_world_ptr->arena_start_turn = 1;
4639 if (player_ptr->feeling_turn > rollback_turns) player_ptr->feeling_turn -= rollback_turns;
4640 else player_ptr->feeling_turn = 1;
4642 for (int i = 1; i < max_towns; i++)
4644 for (int j = 0; j < MAX_STORES; j++)
4646 store_type *st_ptr = &town_info[i].store[j];
4648 if (st_ptr->last_visit > -10L * TURNS_PER_TICK * STORE_TICKS)
4650 st_ptr->last_visit -= rollback_turns;
4651 if (st_ptr->last_visit < -10L * TURNS_PER_TICK * STORE_TICKS) st_ptr->last_visit = -10L * TURNS_PER_TICK * STORE_TICKS;
4654 if (st_ptr->store_open)
4656 st_ptr->store_open -= rollback_turns;
4657 if (st_ptr->store_open < 1) st_ptr->store_open = 1;
4666 * Close up the current game (player may or may not be dead)
4667 * @param creature_ptr プレーヤーへの参照ポインタ
4671 * This function is called only from "main.c" and "signals.c".
4674 void close_game(player_type *player_ptr)
4677 bool do_send = TRUE;
4678 handle_stuff(player_ptr);
4683 signals_ignore_tstp();
4685 current_world_ptr->character_icky = TRUE;
4686 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
4688 highscore_fd = fd_open(buf, O_RDWR);
4691 if (player_ptr->is_dead)
4693 if (current_world_ptr->total_winner) kingly(player_ptr);
4695 if (!cheat_save || get_check(_("死んだデータをセーブしますか? ", "Save death? ")))
4697 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
4699 else do_send = FALSE;
4701 print_tomb(player_ptr);
4704 show_info(player_ptr, handle_stuff, update_playtime, display_player, map_name);
4707 if (check_score(player_ptr))
4709 if ((!send_world_score(player_ptr, do_send, update_playtime, display_player, map_name)))
4711 if (get_check_strict(_("後でスコアを登録するために待機しますか?", "Stand by for later score registration? "),
4712 (CHECK_NO_ESCAPE | CHECK_NO_HISTORY)))
4714 player_ptr->wait_report_score = TRUE;
4715 player_ptr->is_dead = FALSE;
4716 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
4719 if (!player_ptr->wait_report_score)
4720 (void)top_twenty(player_ptr);
4722 else if (highscore_fd >= 0)
4724 display_scores_aux(0, 10, -1, NULL);
4729 do_cmd_save_game(player_ptr, FALSE);
4730 prt(_("リターンキーか ESC キーを押して下さい。", "Press Return (or Escape)."), 0, 40);
4731 play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_EXIT);
4732 if (inkey() != ESCAPE) predict_score(player_ptr);
4735 (void)fd_close(highscore_fd);
4737 clear_saved_floor_files(player_ptr);
4738 signals_handle_tstp();
4743 * @brief 全更新処理をチェックして処理していく
4744 * Handle "player_ptr->update" and "player_ptr->redraw" and "player_ptr->window"
4747 void handle_stuff(player_type *player_ptr)
4749 if (player_ptr->update) update_creature(player_ptr);
4750 if (player_ptr->redraw) redraw_stuff(player_ptr);
4751 if (player_ptr->window) window_stuff(player_ptr);
4755 void update_output(player_type *player_ptr)
4757 if (player_ptr->redraw) redraw_stuff(player_ptr);
4758 if (player_ptr->window) window_stuff(player_ptr);