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-activate.h"
28 #include "cmd-hissatsu.h"
30 #include "cmd-magiceat.h"
32 #include "cmd-quaff.h"
34 #include "cmd-smith.h"
35 #include "cmd-usestaff.h"
36 #include "cmd-zaprod.h"
37 #include "cmd-zapwand.h"
39 #include "cmd-basic.h"
45 #include "floor-events.h"
46 #include "floor-town.h"
48 #include "object-ego.h"
49 #include "object-curse.h"
50 #include "object-flavor.h"
53 #include "spells-summon.h"
54 #include "spells-object.h"
55 #include "spells-status.h"
56 #include "spells-floor.h"
57 #include "monster-spell.h"
64 #include "player-move.h"
65 #include "player-status.h"
66 #include "player-class.h"
67 #include "player-race.h"
68 #include "player-personality.h"
69 #include "player-damage.h"
70 #include "player-effects.h"
71 #include "cmd-spell.h"
72 #include "realm-hex.h"
73 #include "objectkind.h"
74 #include "object-hook.h"
76 #include "monster-process.h"
77 #include "monster-status.h"
78 #include "monsterrace-hook.h"
79 #include "floor-save.h"
81 #include "player-skill.h"
82 #include "player-inventory.h"
84 #include "view-mainwindow.h"
85 #include "dungeon-file.h"
91 #include "realm-song.h"
92 #include "targeting.h"
96 * Hack -- Link a copyright message into the executable
98 const concptr copyright[5] =
100 "Copyright (c) 1989 James E. Wilson, Robert A. Keoneke",
102 "This software may be copied and distributed for educational, research,",
103 "and not for profit purposes provided that this copyright and statement",
104 "are included in all such copies."
107 bool can_save = FALSE;
109 COMMAND_CODE now_message;
111 bool repair_monsters;
114 concptr ANGBAND_SYS = "xxx";
117 concptr ANGBAND_KEYBOARD = "JAPAN";
119 concptr ANGBAND_KEYBOARD = "0";
122 concptr ANGBAND_GRAF = "ascii";
124 static bool load = TRUE; /*!<ロード処理中の分岐フラグ*/
125 static int wild_regen = 20; /*!<広域マップ移動時の自然回復処理カウンタ(広域マップ1マス毎に20回処理を基本とする)*/
128 * Flags for initialization
133 * @brief 擬似鑑定を実際に行い判定を反映する
134 * @param slot 擬似鑑定を行うプレイヤーの所持リストID
135 * @param creature_ptr プレーヤーへの参照ポインタ
136 * @param heavy 重度の擬似鑑定を行うならばTRUE
139 static void sense_inventory_aux(player_type *creature_ptr, INVENTORY_IDX slot, bool heavy)
142 object_type *o_ptr = &creature_ptr->inventory_list[slot];
143 GAME_TEXT o_name[MAX_NLEN];
144 if (o_ptr->ident & (IDENT_SENSE))return;
145 if (object_is_known(o_ptr)) return;
147 feel = (heavy ? value_check_aux1(o_ptr) : value_check_aux2(o_ptr));
150 if ((creature_ptr->muta3 & MUT3_BAD_LUCK) && !randint0(13))
161 feel = FEEL_EXCELLENT;
167 feel = randint0(3) ? FEEL_GOOD : FEEL_AVERAGE;
169 feel = FEEL_UNCURSED;
174 feel = randint0(2) ? FEEL_CURSED : FEEL_GOOD;
180 feel = randint0(3) ? FEEL_CURSED : FEEL_AVERAGE;
187 feel = FEEL_WORTHLESS;
192 feel = FEEL_TERRIBLE;
198 if (disturb_minor) disturb(creature_ptr, FALSE, FALSE);
200 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
201 if (slot >= INVEN_RARM)
204 msg_format("%s%s(%c)は%sという感じがする...",
205 describe_use(creature_ptr, slot), o_name, index_to_label(slot), game_inscriptions[feel]);
207 msg_format("You feel the %s (%c) you are %s %s %s...",
208 o_name, index_to_label(slot), describe_use(creature_ptr, slot),
209 ((o_ptr->number == 1) ? "is" : "are"),
210 game_inscriptions[feel]);
217 msg_format("ザックの中の%s(%c)は%sという感じがする...",
218 o_name, index_to_label(slot), game_inscriptions[feel]);
220 msg_format("You feel the %s (%c) in your pack %s %s...",
221 o_name, index_to_label(slot),
222 ((o_ptr->number == 1) ? "is" : "are"),
223 game_inscriptions[feel]);
228 o_ptr->ident |= (IDENT_SENSE);
229 o_ptr->feeling = feel;
231 autopick_alter_item(creature_ptr, slot, destroy_feeling);
232 creature_ptr->update |= (PU_COMBINE | PU_REORDER);
233 creature_ptr->window |= (PW_INVEN | PW_EQUIP);
238 * @brief 1プレイヤーターン毎に武器、防具の擬似鑑定が行われるかを判定する。
241 * Sense the inventory\n
243 * Class 0 = Warrior --> fast and heavy\n
244 * Class 1 = Mage --> slow and light\n
245 * Class 2 = Priest --> fast but light\n
246 * Class 3 = Rogue --> okay and heavy\n
247 * Class 4 = Ranger --> slow but heavy (changed!)\n
248 * Class 5 = Paladin --> slow but heavy\n
250 static void sense_inventory1(player_type *creature_ptr)
252 PLAYER_LEVEL plev = creature_ptr->lev;
255 if (creature_ptr->confused) return;
257 switch (creature_ptr->pclass)
264 if (0 != randint0(9000L / (plev * plev + 40))) return;
271 if (0 != randint0(6000L / (plev * plev + 50))) return;
277 case CLASS_HIGH_MAGE:
279 case CLASS_MAGIC_EATER:
281 if (0 != randint0(240000L / (plev + 5))) return;
288 if (0 != randint0(10000L / (plev * plev + 40))) return;
295 if (0 != randint0(20000L / (plev * plev + 40))) return;
302 if (0 != randint0(95000L / (plev * plev + 40))) return;
310 if (0 != randint0(77777L / (plev * plev + 40))) return;
315 case CLASS_WARRIOR_MAGE:
318 if (0 != randint0(75000L / (plev * plev + 40))) return;
322 case CLASS_MINDCRAFTER:
324 case CLASS_BLUE_MAGE:
325 case CLASS_MIRROR_MASTER:
327 if (0 != randint0(55000L / (plev * plev + 40))) return;
331 case CLASS_CHAOS_WARRIOR:
333 if (0 != randint0(80000L / (plev * plev + 40))) return;
339 case CLASS_FORCETRAINER:
341 if (0 != randint0(20000L / (plev * plev + 40))) return;
347 if (0 != randint0(20000L / ((plev + 50)*(plev + 50)))) return;
352 case CLASS_BEASTMASTER:
354 if (0 != randint0(65000L / (plev * plev + 40))) return;
358 case CLASS_BERSERKER:
365 if (compare_virtue(creature_ptr, V_KNOWLEDGE, 100, VIRTUE_LARGE)) heavy = TRUE;
367 for (INVENTORY_IDX i = 0; i < INVEN_TOTAL; i++)
371 o_ptr = &creature_ptr->inventory_list[i];
373 if (!o_ptr->k_idx) continue;
402 if ((i < INVEN_RARM) && (0 != randint0(5))) continue;
404 if ((creature_ptr->muta3 & MUT3_GOOD_LUCK) && !randint0(13))
409 sense_inventory_aux(creature_ptr, i, heavy);
415 * @brief 1プレイヤーターン毎に武器、防具以外の擬似鑑定が行われるかを判定する。
418 static void sense_inventory2(player_type *creature_ptr)
420 PLAYER_LEVEL plev = creature_ptr->lev;
423 if (creature_ptr->confused) return;
425 switch (creature_ptr->pclass)
431 case CLASS_BERSERKER:
438 case CLASS_CHAOS_WARRIOR:
440 case CLASS_BEASTMASTER:
443 if (0 != randint0(240000L / (plev + 5))) return;
448 case CLASS_WARRIOR_MAGE:
452 if (0 != randint0(95000L / (plev * plev + 40))) return;
459 case CLASS_FORCETRAINER:
460 case CLASS_MINDCRAFTER:
462 if (0 != randint0(20000L / (plev * plev + 40))) return;
467 case CLASS_HIGH_MAGE:
469 case CLASS_MAGIC_EATER:
470 case CLASS_MIRROR_MASTER:
471 case CLASS_BLUE_MAGE:
473 if (0 != randint0(9000L / (plev * plev + 40))) return;
479 if (0 != randint0(20000L / ((plev + 50)*(plev + 50)))) return;
485 for (INVENTORY_IDX i = 0; i < INVEN_TOTAL; i++)
488 o_ptr = &creature_ptr->inventory_list[i];
489 if (!o_ptr->k_idx) continue;
504 if ((i < INVEN_RARM) && (0 != randint0(5))) continue;
506 sense_inventory_aux(creature_ptr, i, TRUE);
512 * @brief パターン終点到達時のテレポート処理を行う
513 * @param creature_ptr プレーヤーへの参照ポインタ
516 static void pattern_teleport(player_type *creature_ptr)
519 DEPTH max_level = 99;
521 if (get_check(_("他の階にテレポートしますか?", "Teleport level? ")))
526 if (ironman_downward)
527 min_level = creature_ptr->current_floor_ptr->dun_level;
529 if (creature_ptr->dungeon_idx == DUNGEON_ANGBAND)
531 if (creature_ptr->current_floor_ptr->dun_level > 100)
532 max_level = MAX_DEPTH - 1;
533 else if (creature_ptr->current_floor_ptr->dun_level == 100)
538 max_level = d_info[creature_ptr->dungeon_idx].maxdepth;
539 min_level = d_info[creature_ptr->dungeon_idx].mindepth;
542 sprintf(ppp, _("テレポート先:(%d-%d)", "Teleport to level (%d-%d): "), (int)min_level, (int)max_level);
543 sprintf(tmp_val, "%d", (int)creature_ptr->current_floor_ptr->dun_level);
544 if (!get_string(ppp, tmp_val, 10)) return;
546 command_arg = (COMMAND_ARG)atoi(tmp_val);
548 else if (get_check(_("通常テレポート?", "Normal teleport? ")))
550 teleport_player(creature_ptr, 200, 0L);
558 if (command_arg < min_level) command_arg = (COMMAND_ARG)min_level;
559 if (command_arg > max_level) command_arg = (COMMAND_ARG)max_level;
561 msg_format(_("%d 階にテレポートしました。", "You teleport to dungeon level %d."), command_arg);
562 if (autosave_l) do_cmd_save_game(creature_ptr, TRUE);
564 creature_ptr->current_floor_ptr->dun_level = command_arg;
565 leave_quest_check(creature_ptr);
566 if (record_stair) exe_write_diary(creature_ptr, DIARY_PAT_TELE, 0, NULL);
568 creature_ptr->current_floor_ptr->inside_quest = 0;
569 free_turn(creature_ptr);
572 * Clear all saved floors
573 * and create a first saved floor
575 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
576 creature_ptr->leaving = TRUE;
581 * @brief 各種パターン地形上の特別な処理 / Returns TRUE if we are on the Pattern...
582 * @return 実際にパターン地形上にプレイヤーが居た場合はTRUEを返す。
584 static bool pattern_effect(player_type *creature_ptr)
586 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
587 if (!pattern_tile(floor_ptr, creature_ptr->y, creature_ptr->x)) return FALSE;
589 if ((PRACE_IS_(creature_ptr, RACE_AMBERITE)) &&
590 (creature_ptr->cut > 0) && one_in_(10))
592 wreck_the_pattern(creature_ptr);
595 int pattern_type = f_info[floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].feat].subtype;
596 switch (pattern_type)
598 case PATTERN_TILE_END:
599 (void)set_image(creature_ptr, 0);
600 (void)restore_all_status(creature_ptr);
601 (void)restore_level(creature_ptr);
602 (void)cure_critical_wounds(creature_ptr, 1000);
604 cave_set_feat(creature_ptr, creature_ptr->y, creature_ptr->x, feat_pattern_old);
605 msg_print(_("「パターン」のこの部分は他の部分より強力でないようだ。", "This section of the Pattern looks less powerful."));
608 * We could make the healing effect of the
609 * Pattern center one-time only to avoid various kinds
610 * of abuse, like luring the win monster into fighting you
611 * in the middle of the pattern...
615 case PATTERN_TILE_OLD:
619 case PATTERN_TILE_TELEPORT:
620 pattern_teleport(creature_ptr);
623 case PATTERN_TILE_WRECKED:
624 if (!IS_INVULN(creature_ptr))
625 take_hit(creature_ptr, DAMAGE_NOESCAPE, 200, _("壊れた「パターン」を歩いたダメージ", "walking the corrupted Pattern"), -1);
629 if (PRACE_IS_(creature_ptr, RACE_AMBERITE) && !one_in_(2))
631 else if (!IS_INVULN(creature_ptr))
632 take_hit(creature_ptr, DAMAGE_NOESCAPE, damroll(1, 3), _("「パターン」を歩いたダメージ", "walking the Pattern"), -1);
641 * @brief プレイヤーのHP自然回復処理 / Regenerate hit points -RAK-
642 * @param percent 回復比率
645 static void regenhp(player_type *creature_ptr, int percent)
647 if (creature_ptr->special_defense & KATA_KOUKIJIN) return;
648 if (creature_ptr->action == ACTION_HAYAGAKE) return;
650 HIT_POINT old_chp = creature_ptr->chp;
653 * Extract the new hitpoints
655 * 'percent' is the Regen factor in unit (1/2^16)
657 HIT_POINT new_chp = 0;
658 u32b new_chp_frac = (creature_ptr->mhp * percent + PY_REGEN_HPBASE);
659 s64b_LSHIFT(new_chp, new_chp_frac, 16);
660 s64b_add(&(creature_ptr->chp), &(creature_ptr->chp_frac), new_chp, new_chp_frac);
661 if (0 < s64b_cmp(creature_ptr->chp, creature_ptr->chp_frac, creature_ptr->mhp, 0))
663 creature_ptr->chp = creature_ptr->mhp;
664 creature_ptr->chp_frac = 0;
667 if (old_chp != creature_ptr->chp)
669 creature_ptr->redraw |= (PR_HP);
670 creature_ptr->window |= (PW_PLAYER);
677 * @brief プレイヤーのMP自然回復処理(regen_magic()のサブセット) / Regenerate mana points
678 * @param upkeep_factor ペット維持によるMPコスト量
679 * @param regen_amount 回復量
682 static void regenmana(player_type *creature_ptr, MANA_POINT upkeep_factor, MANA_POINT regen_amount)
684 MANA_POINT old_csp = creature_ptr->csp;
685 s32b regen_rate = regen_amount * 100 - upkeep_factor * PY_REGEN_NORMAL;
688 * Excess mana will decay 32 times faster than normal
691 if (creature_ptr->csp > creature_ptr->msp)
694 u32b decay_frac = (creature_ptr->msp * 32 * PY_REGEN_NORMAL + PY_REGEN_MNBASE);
695 s64b_LSHIFT(decay, decay_frac, 16);
696 s64b_sub(&(creature_ptr->csp), &(creature_ptr->csp_frac), decay, decay_frac);
697 if (creature_ptr->csp < creature_ptr->msp)
699 creature_ptr->csp = creature_ptr->msp;
700 creature_ptr->csp_frac = 0;
704 /* Regenerating mana (unless the player has excess mana) */
705 else if (regen_rate > 0)
707 MANA_POINT new_mana = 0;
708 u32b new_mana_frac = (creature_ptr->msp * regen_rate / 100 + PY_REGEN_MNBASE);
709 s64b_LSHIFT(new_mana, new_mana_frac, 16);
710 s64b_add(&(creature_ptr->csp), &(creature_ptr->csp_frac), new_mana, new_mana_frac);
711 if (creature_ptr->csp >= creature_ptr->msp)
713 creature_ptr->csp = creature_ptr->msp;
714 creature_ptr->csp_frac = 0;
718 /* Reduce mana (even when the player has excess mana) */
721 s32b reduce_mana = 0;
722 u32b reduce_mana_frac = (creature_ptr->msp * (-1) * regen_rate / 100 + PY_REGEN_MNBASE);
723 s64b_LSHIFT(reduce_mana, reduce_mana_frac, 16);
724 s64b_sub(&(creature_ptr->csp), &(creature_ptr->csp_frac), reduce_mana, reduce_mana_frac);
725 if (creature_ptr->csp < 0)
727 creature_ptr->csp = 0;
728 creature_ptr->csp_frac = 0;
732 if (old_csp != creature_ptr->csp)
734 creature_ptr->redraw |= (PR_MANA);
735 creature_ptr->window |= (PW_PLAYER);
736 creature_ptr->window |= (PW_SPELL);
743 * @brief プレイヤーのMP自然回復処理 / Regenerate magic regen_amount: PY_REGEN_NORMAL * 2 (if resting) * 2 (if having regenarate)
744 * @param regen_amount 回復量
747 static void regenmagic(player_type *creature_ptr, int regen_amount)
751 int mult = (dev + adj_mag_mana[creature_ptr->stat_ind[A_INT]]); /* x1 to x2 speed bonus for recharging */
753 for (int i = 0; i < EATER_EXT * 2; i++)
755 if (!creature_ptr->magic_num2[i]) continue;
756 if (creature_ptr->magic_num1[i] == ((long)creature_ptr->magic_num2[i] << 16)) continue;
758 /* Increase remaining charge number like float value */
759 new_mana = (regen_amount * mult * ((long)creature_ptr->magic_num2[i] + 13)) / (dev * 8);
760 creature_ptr->magic_num1[i] += new_mana;
762 /* Check maximum charge */
763 if (creature_ptr->magic_num1[i] > (creature_ptr->magic_num2[i] << 16))
765 creature_ptr->magic_num1[i] = ((long)creature_ptr->magic_num2[i] << 16);
771 for (int i = EATER_EXT * 2; i < EATER_EXT * 3; i++)
773 if (!creature_ptr->magic_num1[i]) continue;
774 if (!creature_ptr->magic_num2[i]) continue;
776 /* Decrease remaining period for charging */
777 new_mana = (regen_amount * mult * ((long)creature_ptr->magic_num2[i] + 10) * EATER_ROD_CHARGE)
778 / (dev * 16 * PY_REGEN_NORMAL);
779 creature_ptr->magic_num1[i] -= new_mana;
781 /* Check minimum remaining period for charging */
782 if (creature_ptr->magic_num1[i] < 0) creature_ptr->magic_num1[i] = 0;
789 * @brief 100ゲームターン毎のモンスターのHP自然回復処理 / Regenerate the monsters (once per 100 game turns)
790 * @param player_ptr プレーヤーへの参照ポインタ
792 * @note Should probably be done during monster turns.
794 static void regenerate_monsters(player_type *player_ptr)
796 for (int i = 1; i < player_ptr->current_floor_ptr->m_max; i++)
798 monster_type *m_ptr = &player_ptr->current_floor_ptr->m_list[i];
799 monster_race *r_ptr = &r_info[m_ptr->r_idx];
801 if (!monster_is_valid(m_ptr)) continue;
803 if (m_ptr->hp < m_ptr->maxhp)
805 int frac = m_ptr->maxhp / 100;
806 if (!frac) if (one_in_(2)) frac = 1;
808 if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2;
811 if (m_ptr->hp > m_ptr->maxhp) m_ptr->hp = m_ptr->maxhp;
813 if (player_ptr->health_who == i) player_ptr->redraw |= (PR_HEALTH);
814 if (player_ptr->riding == i) player_ptr->redraw |= (PR_UHEALTH);
821 * @brief 30ゲームターン毎のボール中モンスターのHP自然回復処理 / Regenerate the captured monsters (once per 30 game turns)
822 * @param creature_ptr プレーヤーへの参照ポインタ
824 * @note Should probably be done during monster turns.
826 static void regenerate_captured_monsters(player_type *creature_ptr)
829 for (int i = 0; i < INVEN_TOTAL; i++)
832 object_type *o_ptr = &creature_ptr->inventory_list[i];
833 if (!o_ptr->k_idx) continue;
834 if (o_ptr->tval != TV_CAPTURE) continue;
835 if (!o_ptr->pval) continue;
838 r_ptr = &r_info[o_ptr->pval];
839 if (o_ptr->xtra4 < o_ptr->xtra5)
841 int frac = o_ptr->xtra5 / 100;
842 if (!frac) if (one_in_(2)) frac = 1;
844 if (r_ptr->flags2 & RF2_REGENERATE) frac *= 2;
846 o_ptr->xtra4 += (XTRA16)frac;
847 if (o_ptr->xtra4 > o_ptr->xtra5) o_ptr->xtra4 = o_ptr->xtra5;
853 creature_ptr->update |= (PU_COMBINE);
854 creature_ptr->window |= (PW_INVEN);
855 creature_ptr->window |= (PW_EQUIP);
862 * @brief 寿命つき光源の警告メッセージ処理
863 * @param creature_ptr プレーヤーへの参照ポインタ
864 * @param o_ptr 現在光源として使っているオブジェクトの構造体参照ポインタ
867 static void notice_lite_change(player_type *creature_ptr, object_type *o_ptr)
869 if ((o_ptr->xtra4 < 100) || (!(o_ptr->xtra4 % 100)))
871 creature_ptr->window |= (PW_EQUIP);
874 if (creature_ptr->blind)
876 if (o_ptr->xtra4 == 0) o_ptr->xtra4++;
878 else if (o_ptr->xtra4 == 0)
880 disturb(creature_ptr, FALSE, TRUE);
881 msg_print(_("明かりが消えてしまった!", "Your light has gone out!"));
882 creature_ptr->update |= (PU_TORCH);
883 creature_ptr->update |= (PU_BONUS);
885 else if (o_ptr->name2 == EGO_LITE_LONG)
887 if ((o_ptr->xtra4 < 50) && (!(o_ptr->xtra4 % 5))
888 && (current_world_ptr->game_turn % (TURNS_PER_TICK * 2)))
890 if (disturb_minor) disturb(creature_ptr, FALSE, TRUE);
891 msg_print(_("明かりが微かになってきている。", "Your light is growing faint."));
894 else if ((o_ptr->xtra4 < 100) && (!(o_ptr->xtra4 % 10)))
896 if (disturb_minor) disturb(creature_ptr, FALSE, TRUE);
897 msg_print(_("明かりが微かになってきている。", "Your light is growing faint."));
903 * @brief !!を刻んだ魔道具の時間経過による再充填を知らせる処理 / If player has inscribed the object with "!!", let him know when it's recharged. -LM-
904 * @param o_ptr 対象オブジェクトの構造体参照ポインタ
907 static void recharged_notice(player_type *owner_ptr, object_type *o_ptr)
909 if (!o_ptr->inscription) return;
911 concptr s = my_strchr(quark_str(o_ptr->inscription), '!');
916 GAME_TEXT o_name[MAX_NLEN];
917 object_desc(owner_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
919 msg_format("%sは再充填された。", o_name);
921 if (o_ptr->number > 1)
922 msg_format("Your %s are recharged.", o_name);
924 msg_format("Your %s is recharged.", o_name);
926 disturb(owner_ptr, FALSE, FALSE);
930 s = my_strchr(s + 1, '!');
936 * @brief プレイヤーの歌に関する継続処理
939 static void check_music(player_type *caster_ptr)
941 if (caster_ptr->pclass != CLASS_BARD) return;
942 if (!SINGING_SONG_EFFECT(caster_ptr) && !INTERUPTING_SONG_EFFECT(caster_ptr)) return;
944 if (caster_ptr->anti_magic)
946 stop_singing(caster_ptr);
950 int spell = SINGING_SONG_ID(caster_ptr);
951 const magic_type *s_ptr;
952 s_ptr = &technic_info[REALM_MUSIC - MIN_TECHNIC][spell];
954 MANA_POINT need_mana = mod_need_mana(caster_ptr, s_ptr->smana, spell, REALM_MUSIC);
955 u32b need_mana_frac = 0;
957 s64b_RSHIFT(need_mana, need_mana_frac, 1);
958 if (s64b_cmp(caster_ptr->csp, caster_ptr->csp_frac, need_mana, need_mana_frac) < 0)
960 stop_singing(caster_ptr);
965 s64b_sub(&(caster_ptr->csp), &(caster_ptr->csp_frac), need_mana, need_mana_frac);
967 caster_ptr->redraw |= PR_MANA;
968 if (INTERUPTING_SONG_EFFECT(caster_ptr))
970 SINGING_SONG_EFFECT(caster_ptr) = INTERUPTING_SONG_EFFECT(caster_ptr);
971 INTERUPTING_SONG_EFFECT(caster_ptr) = MUSIC_NONE;
972 msg_print(_("歌を再開した。", "You restart singing."));
973 caster_ptr->action = ACTION_SING;
974 caster_ptr->update |= (PU_BONUS | PU_HP | PU_MONSTERS);
975 caster_ptr->redraw |= (PR_MAP | PR_STATUS | PR_STATE);
976 caster_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
980 if (caster_ptr->spell_exp[spell] < SPELL_EXP_BEGINNER)
981 caster_ptr->spell_exp[spell] += 5;
982 else if (caster_ptr->spell_exp[spell] < SPELL_EXP_SKILLED)
984 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;
986 else if (caster_ptr->spell_exp[spell] < SPELL_EXP_EXPERT)
988 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;
990 else if (caster_ptr->spell_exp[spell] < SPELL_EXP_MASTER)
992 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;
995 exe_spell(caster_ptr, REALM_MUSIC, spell, SPELL_CONT);
1000 * @brief 現在呪いを保持している装備品を一つランダムに探し出す / Choose one of items that have cursed flag
1001 * @param flag 探し出したい呪いフラグ配列
1002 * @return 該当の呪いが一つでもあった場合にランダムに選ばれた装備品のオブジェクト構造体参照ポインタを返す。\n
1005 static object_type *choose_cursed_obj_name(player_type *player_ptr, BIT_FLAGS flag)
1007 int choices[INVEN_TOTAL - INVEN_RARM];
1009 if (!(player_ptr->cursed & flag)) return NULL;
1011 for (int i = INVEN_RARM; i < INVEN_TOTAL; i++)
1013 object_type *o_ptr = &player_ptr->inventory_list[i];
1014 if (o_ptr->curse_flags & flag)
1016 choices[number] = i;
1019 else if ((flag == TRC_ADD_L_CURSE) ||
1020 (flag == TRC_ADD_H_CURSE) ||
1021 (flag == TRC_DRAIN_HP) ||
1022 (flag == TRC_DRAIN_MANA) ||
1023 (flag == TRC_CALL_ANIMAL) ||
1024 (flag == TRC_CALL_DEMON) ||
1025 (flag == TRC_CALL_DRAGON) ||
1026 (flag == TRC_CALL_UNDEAD) ||
1027 (flag == TRC_COWARDICE) ||
1028 (flag == TRC_LOW_MELEE) ||
1029 (flag == TRC_LOW_AC) ||
1030 (flag == TRC_LOW_MAGIC) ||
1031 (flag == TRC_FAST_DIGEST) ||
1032 (flag == TRC_SLOW_REGEN))
1035 BIT_FLAGS flgs[TR_FLAG_SIZE];
1036 object_flags(o_ptr, flgs);
1039 case TRC_ADD_L_CURSE: cf = TR_ADD_L_CURSE; break;
1040 case TRC_ADD_H_CURSE: cf = TR_ADD_H_CURSE; break;
1041 case TRC_DRAIN_HP: cf = TR_DRAIN_HP; break;
1042 case TRC_DRAIN_MANA: cf = TR_DRAIN_MANA; break;
1043 case TRC_CALL_ANIMAL: cf = TR_CALL_ANIMAL; break;
1044 case TRC_CALL_DEMON: cf = TR_CALL_DEMON; break;
1045 case TRC_CALL_DRAGON: cf = TR_CALL_DRAGON; break;
1046 case TRC_CALL_UNDEAD: cf = TR_CALL_UNDEAD; break;
1047 case TRC_COWARDICE: cf = TR_COWARDICE; break;
1048 case TRC_LOW_MELEE: cf = TR_LOW_MELEE; break;
1049 case TRC_LOW_AC: cf = TR_LOW_AC; break;
1050 case TRC_LOW_MAGIC: cf = TR_LOW_MAGIC; break;
1051 case TRC_FAST_DIGEST: cf = TR_FAST_DIGEST; break;
1052 case TRC_SLOW_REGEN: cf = TR_SLOW_REGEN; break;
1055 if (have_flag(flgs, cf))
1057 choices[number] = i;
1063 return &player_ptr->inventory_list[choices[randint0(number)]];
1067 static void process_world_aux_digestion(player_type *creature_ptr)
1069 if (!creature_ptr->phase_out)
1071 if (creature_ptr->food >= PY_FOOD_MAX)
1073 (void)set_food(creature_ptr, creature_ptr->food - 100);
1075 else if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 5)))
1077 int digestion = SPEED_TO_ENERGY(creature_ptr->pspeed);
1078 if (creature_ptr->regenerate)
1080 if (creature_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1082 if (creature_ptr->cursed & TRC_FAST_DIGEST)
1085 if (creature_ptr->slow_digest)
1088 if (digestion < 1) digestion = 1;
1089 if (digestion > 100) digestion = 100;
1091 (void)set_food(creature_ptr, creature_ptr->food - digestion);
1094 if ((creature_ptr->food < PY_FOOD_FAINT))
1096 if (!creature_ptr->paralyzed && (randint0(100) < 10))
1098 msg_print(_("あまりにも空腹で気絶してしまった。", "You faint from the lack of food."));
1099 disturb(creature_ptr, TRUE, TRUE);
1100 (void)set_paralyzed(creature_ptr, creature_ptr->paralyzed + 1 + randint0(5));
1103 if (creature_ptr->food < PY_FOOD_STARVE)
1105 HIT_POINT dam = (PY_FOOD_STARVE - creature_ptr->food) / 10;
1106 if (!IS_INVULN(creature_ptr)) take_hit(creature_ptr, DAMAGE_LOSELIFE, dam, _("空腹", "starvation"), -1);
1114 * @brief 10ゲームターンが進行するごとにプレイヤーのHPとMPの増減処理を行う。
1115 * / Handle timed damage and regeneration every 10 game turns
1118 static void process_world_aux_hp_and_sp(player_type *creature_ptr)
1120 feature_type *f_ptr = &f_info[creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].feat];
1121 bool cave_no_regen = FALSE;
1122 int upkeep_factor = 0;
1123 int regen_amount = PY_REGEN_NORMAL;
1124 if (creature_ptr->poisoned && !IS_INVULN(creature_ptr))
1126 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, _("毒", "poison"), -1);
1129 if (creature_ptr->cut && !IS_INVULN(creature_ptr))
1132 if (creature_ptr->cut > 1000)
1136 else if (creature_ptr->cut > 200)
1140 else if (creature_ptr->cut > 100)
1144 else if (creature_ptr->cut > 50)
1148 else if (creature_ptr->cut > 25)
1152 else if (creature_ptr->cut > 10)
1161 take_hit(creature_ptr, DAMAGE_NOESCAPE, dam, _("致命傷", "a fatal wound"), -1);
1164 if (PRACE_IS_(creature_ptr, RACE_VAMPIRE) || (creature_ptr->mimic_form == MIMIC_VAMPIRE))
1166 if (!creature_ptr->current_floor_ptr->dun_level && !creature_ptr->resist_lite && !IS_INVULN(creature_ptr) && is_daytime())
1168 if ((creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
1170 msg_print(_("日光があなたのアンデッドの肉体を焼き焦がした!", "The sun's rays scorch your undead flesh!"));
1171 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, _("日光", "sunlight"), -1);
1172 cave_no_regen = TRUE;
1176 if (creature_ptr->inventory_list[INVEN_LITE].tval && (creature_ptr->inventory_list[INVEN_LITE].name2 != EGO_LITE_DARKNESS) &&
1177 !creature_ptr->resist_lite)
1179 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
1180 GAME_TEXT o_name[MAX_NLEN];
1181 char ouch[MAX_NLEN + 40];
1182 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
1183 msg_format(_("%sがあなたのアンデッドの肉体を焼き焦がした!", "The %s scorches your undead flesh!"), o_name);
1185 cave_no_regen = TRUE;
1186 object_desc(creature_ptr, o_name, o_ptr, OD_NAME_ONLY);
1187 sprintf(ouch, _("%sを装備したダメージ", "wielding %s"), o_name);
1189 if (!IS_INVULN(creature_ptr)) take_hit(creature_ptr, DAMAGE_NOESCAPE, 1, ouch, -1);
1193 if (have_flag(f_ptr->flags, FF_LAVA) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_fire)
1197 if (have_flag(f_ptr->flags, FF_DEEP))
1199 damage = 6000 + randint0(4000);
1201 else if (!creature_ptr->levitation)
1203 damage = 3000 + randint0(2000);
1208 if (PRACE_IS_(creature_ptr, RACE_ENT)) damage += damage / 3;
1209 if (creature_ptr->resist_fire) damage = damage / 3;
1210 if (is_oppose_fire(creature_ptr)) damage = damage / 3;
1211 if (creature_ptr->levitation) damage = damage / 5;
1213 damage = damage / 100 + (randint0(100) < (damage % 100));
1215 if (creature_ptr->levitation)
1217 msg_print(_("熱で火傷した!", "The heat burns you!"));
1218 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1219 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1223 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1224 msg_format(_("%sで火傷した!", "The %s burns you!"), name);
1225 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1228 cave_no_regen = TRUE;
1232 if (have_flag(f_ptr->flags, FF_COLD_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_cold)
1236 if (have_flag(f_ptr->flags, FF_DEEP))
1238 damage = 6000 + randint0(4000);
1240 else if (!creature_ptr->levitation)
1242 damage = 3000 + randint0(2000);
1247 if (creature_ptr->resist_cold) damage = damage / 3;
1248 if (is_oppose_cold(creature_ptr)) damage = damage / 3;
1249 if (creature_ptr->levitation) damage = damage / 5;
1251 damage = damage / 100 + (randint0(100) < (damage % 100));
1253 if (creature_ptr->levitation)
1255 msg_print(_("冷気に覆われた!", "The cold engulfs you!"));
1256 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1257 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1261 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1262 msg_format(_("%sに凍えた!", "The %s frostbites you!"), name);
1263 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1266 cave_no_regen = TRUE;
1270 if (have_flag(f_ptr->flags, FF_ELEC_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_elec)
1274 if (have_flag(f_ptr->flags, FF_DEEP))
1276 damage = 6000 + randint0(4000);
1278 else if (!creature_ptr->levitation)
1280 damage = 3000 + randint0(2000);
1285 if (creature_ptr->resist_elec) damage = damage / 3;
1286 if (is_oppose_elec(creature_ptr)) damage = damage / 3;
1287 if (creature_ptr->levitation) damage = damage / 5;
1289 damage = damage / 100 + (randint0(100) < (damage % 100));
1291 if (creature_ptr->levitation)
1293 msg_print(_("電撃を受けた!", "The electricity shocks you!"));
1294 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1295 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1299 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1300 msg_format(_("%sに感電した!", "The %s shocks you!"), name);
1301 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1304 cave_no_regen = TRUE;
1308 if (have_flag(f_ptr->flags, FF_ACID_PUDDLE) && !IS_INVULN(creature_ptr) && !creature_ptr->immune_acid)
1312 if (have_flag(f_ptr->flags, FF_DEEP))
1314 damage = 6000 + randint0(4000);
1316 else if (!creature_ptr->levitation)
1318 damage = 3000 + randint0(2000);
1323 if (creature_ptr->resist_acid) damage = damage / 3;
1324 if (is_oppose_acid(creature_ptr)) damage = damage / 3;
1325 if (creature_ptr->levitation) damage = damage / 5;
1327 damage = damage / 100 + (randint0(100) < (damage % 100));
1329 if (creature_ptr->levitation)
1331 msg_print(_("酸が飛び散った!", "The acid melts you!"));
1332 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1333 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1337 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1338 msg_format(_("%sに溶かされた!", "The %s melts you!"), name);
1339 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1342 cave_no_regen = TRUE;
1346 if (have_flag(f_ptr->flags, FF_POISON_PUDDLE) && !IS_INVULN(creature_ptr))
1350 if (have_flag(f_ptr->flags, FF_DEEP))
1352 damage = 6000 + randint0(4000);
1354 else if (!creature_ptr->levitation)
1356 damage = 3000 + randint0(2000);
1361 if (creature_ptr->resist_pois) damage = damage / 3;
1362 if (is_oppose_pois(creature_ptr)) damage = damage / 3;
1363 if (creature_ptr->levitation) damage = damage / 5;
1365 damage = damage / 100 + (randint0(100) < (damage % 100));
1367 if (creature_ptr->levitation)
1369 msg_print(_("毒気を吸い込んだ!", "The gas poisons you!"));
1370 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"),
1371 f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name), -1);
1372 if (creature_ptr->resist_pois) (void)set_poisoned(creature_ptr, creature_ptr->poisoned + 1);
1376 concptr name = f_name + f_info[get_feat_mimic(&creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x])].name;
1377 msg_format(_("%sに毒された!", "The %s poisons you!"), name);
1378 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, name, -1);
1379 if (creature_ptr->resist_pois) (void)set_poisoned(creature_ptr, creature_ptr->poisoned + 3);
1382 cave_no_regen = TRUE;
1386 if (have_flag(f_ptr->flags, FF_WATER) && have_flag(f_ptr->flags, FF_DEEP) &&
1387 !creature_ptr->levitation && !creature_ptr->can_swim && !creature_ptr->resist_water)
1389 if (creature_ptr->total_weight > weight_limit(creature_ptr))
1391 msg_print(_("溺れている!", "You are drowning!"));
1392 take_hit(creature_ptr, DAMAGE_NOESCAPE, randint1(creature_ptr->lev), _("溺れ", "drowning"), -1);
1393 cave_no_regen = TRUE;
1397 if (creature_ptr->riding)
1400 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags2 & RF2_AURA_FIRE) && !creature_ptr->immune_fire)
1402 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1403 if (PRACE_IS_(creature_ptr, RACE_ENT)) damage += damage / 3;
1404 if (creature_ptr->resist_fire) damage = damage / 3;
1405 if (is_oppose_fire(creature_ptr)) damage = damage / 3;
1406 msg_print(_("熱い!", "It's hot!"));
1407 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("炎のオーラ", "Fire aura"), -1);
1409 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags2 & RF2_AURA_ELEC) && !creature_ptr->immune_elec)
1411 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1412 if (PRACE_IS_(creature_ptr, RACE_ANDROID)) damage += damage / 3;
1413 if (creature_ptr->resist_elec) damage = damage / 3;
1414 if (is_oppose_elec(creature_ptr)) damage = damage / 3;
1415 msg_print(_("痛い!", "It hurts!"));
1416 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("電気のオーラ", "Elec aura"), -1);
1418 if ((r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].flags3 & RF3_AURA_COLD) && !creature_ptr->immune_cold)
1420 damage = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level / 2;
1421 if (creature_ptr->resist_cold) damage = damage / 3;
1422 if (is_oppose_cold(creature_ptr)) damage = damage / 3;
1423 msg_print(_("冷たい!", "It's cold!"));
1424 take_hit(creature_ptr, DAMAGE_NOESCAPE, damage, _("冷気のオーラ", "Cold aura"), -1);
1428 /* Spectres -- take damage when moving through walls */
1430 * Added: ANYBODY takes damage if inside through walls
1431 * without wraith form -- NOTE: Spectres will never be
1432 * reduced below 0 hp by being inside a stone wall; others
1435 if (!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY))
1437 if (!IS_INVULN(creature_ptr) && !creature_ptr->wraith_form && !creature_ptr->kabenuke && ((creature_ptr->chp > (creature_ptr->lev / 5)) || !creature_ptr->pass_wall))
1440 cave_no_regen = TRUE;
1442 if (creature_ptr->pass_wall)
1444 msg_print(_("体の分子が分解した気がする!", "Your molecules feel disrupted!"));
1445 dam_desc = _("密度", "density");
1449 msg_print(_("崩れた岩に押し潰された!", "You are being crushed!"));
1450 dam_desc = _("硬い岩", "solid rock");
1453 take_hit(creature_ptr, DAMAGE_NOESCAPE, 1 + (creature_ptr->lev / 5), dam_desc, -1);
1457 if (creature_ptr->food < PY_FOOD_WEAK)
1459 if (creature_ptr->food < PY_FOOD_STARVE)
1463 else if (creature_ptr->food < PY_FOOD_FAINT)
1465 regen_amount = PY_REGEN_FAINT;
1469 regen_amount = PY_REGEN_WEAK;
1473 if (pattern_effect(creature_ptr))
1475 cave_no_regen = TRUE;
1479 if (creature_ptr->regenerate)
1481 regen_amount = regen_amount * 2;
1483 if (creature_ptr->special_defense & (KAMAE_MASK | KATA_MASK))
1487 if (creature_ptr->cursed & TRC_SLOW_REGEN)
1493 if ((creature_ptr->action == ACTION_SEARCH) || (creature_ptr->action == ACTION_REST))
1495 regen_amount = regen_amount * 2;
1498 upkeep_factor = calculate_upkeep(creature_ptr);
1499 if ((creature_ptr->action == ACTION_LEARN) ||
1500 (creature_ptr->action == ACTION_HAYAGAKE) ||
1501 (creature_ptr->special_defense & KATA_KOUKIJIN))
1503 upkeep_factor += 100;
1506 regenmana(creature_ptr, upkeep_factor, regen_amount);
1507 if (creature_ptr->pclass == CLASS_MAGIC_EATER)
1509 regenmagic(creature_ptr, regen_amount);
1512 if ((creature_ptr->csp == 0) && (creature_ptr->csp_frac == 0))
1514 while (upkeep_factor > 100)
1516 msg_print(_("こんなに多くのペットを制御できない!", "Too many pets to control at once!"));
1518 do_cmd_pet_dismiss(creature_ptr);
1520 upkeep_factor = calculate_upkeep(creature_ptr);
1522 msg_format(_("維持MPは %d%%", "Upkeep: %d%% mana."), upkeep_factor);
1527 if (creature_ptr->poisoned) regen_amount = 0;
1528 if (creature_ptr->cut) regen_amount = 0;
1529 if (cave_no_regen) regen_amount = 0;
1531 regen_amount = (regen_amount * creature_ptr->mutant_regenerate_mod) / 100;
1532 if ((creature_ptr->chp < creature_ptr->mhp) && !cave_no_regen)
1534 regenhp(creature_ptr, regen_amount);
1540 * @brief 10ゲームターンが進行するごとに魔法効果の残りターンを減らしていく処理
1541 * / Handle timeout every 10 game turns
1544 static void process_world_aux_timeout(player_type *creature_ptr)
1546 const int dec_count = (easy_band ? 2 : 1);
1547 if (creature_ptr->tim_mimic)
1549 (void)set_mimic(creature_ptr, creature_ptr->tim_mimic - 1, creature_ptr->mimic_form, TRUE);
1552 if (creature_ptr->image)
1554 (void)set_image(creature_ptr, creature_ptr->image - dec_count);
1557 if (creature_ptr->blind)
1559 (void)set_blind(creature_ptr, creature_ptr->blind - dec_count);
1562 if (creature_ptr->tim_invis)
1564 (void)set_tim_invis(creature_ptr, creature_ptr->tim_invis - 1, TRUE);
1567 if (creature_ptr->suppress_multi_reward)
1569 creature_ptr->suppress_multi_reward = FALSE;
1572 if (creature_ptr->tim_esp)
1574 (void)set_tim_esp(creature_ptr, creature_ptr->tim_esp - 1, TRUE);
1577 if (creature_ptr->ele_attack)
1579 creature_ptr->ele_attack--;
1580 if (!creature_ptr->ele_attack) set_ele_attack(creature_ptr, 0, 0);
1583 if (creature_ptr->ele_immune)
1585 creature_ptr->ele_immune--;
1586 if (!creature_ptr->ele_immune) set_ele_immune(creature_ptr, 0, 0);
1589 if (creature_ptr->tim_infra)
1591 (void)set_tim_infra(creature_ptr, creature_ptr->tim_infra - 1, TRUE);
1594 if (creature_ptr->tim_stealth)
1596 (void)set_tim_stealth(creature_ptr, creature_ptr->tim_stealth - 1, TRUE);
1599 if (creature_ptr->tim_levitation)
1601 (void)set_tim_levitation(creature_ptr, creature_ptr->tim_levitation - 1, TRUE);
1604 if (creature_ptr->tim_sh_touki)
1606 (void)set_tim_sh_touki(creature_ptr, creature_ptr->tim_sh_touki - 1, TRUE);
1609 if (creature_ptr->tim_sh_fire)
1611 (void)set_tim_sh_fire(creature_ptr, creature_ptr->tim_sh_fire - 1, TRUE);
1614 if (creature_ptr->tim_sh_holy)
1616 (void)set_tim_sh_holy(creature_ptr, creature_ptr->tim_sh_holy - 1, TRUE);
1619 if (creature_ptr->tim_eyeeye)
1621 (void)set_tim_eyeeye(creature_ptr, creature_ptr->tim_eyeeye - 1, TRUE);
1624 if (creature_ptr->resist_magic)
1626 (void)set_resist_magic(creature_ptr, creature_ptr->resist_magic - 1, TRUE);
1629 if (creature_ptr->tim_regen)
1631 (void)set_tim_regen(creature_ptr, creature_ptr->tim_regen - 1, TRUE);
1634 if (creature_ptr->tim_res_nether)
1636 (void)set_tim_res_nether(creature_ptr, creature_ptr->tim_res_nether - 1, TRUE);
1639 if (creature_ptr->tim_res_time)
1641 (void)set_tim_res_time(creature_ptr, creature_ptr->tim_res_time - 1, TRUE);
1644 if (creature_ptr->tim_reflect)
1646 (void)set_tim_reflect(creature_ptr, creature_ptr->tim_reflect - 1, TRUE);
1649 if (creature_ptr->multishadow)
1651 (void)set_multishadow(creature_ptr, creature_ptr->multishadow - 1, TRUE);
1654 if (creature_ptr->dustrobe)
1656 (void)set_dustrobe(creature_ptr, creature_ptr->dustrobe - 1, TRUE);
1659 if (creature_ptr->kabenuke)
1661 (void)set_kabenuke(creature_ptr, creature_ptr->kabenuke - 1, TRUE);
1664 if (creature_ptr->paralyzed)
1666 (void)set_paralyzed(creature_ptr, creature_ptr->paralyzed - dec_count);
1669 if (creature_ptr->confused)
1671 (void)set_confused(creature_ptr, creature_ptr->confused - dec_count);
1674 if (creature_ptr->afraid)
1676 (void)set_afraid(creature_ptr, creature_ptr->afraid - dec_count);
1679 if (creature_ptr->fast)
1681 (void)set_fast(creature_ptr, creature_ptr->fast - 1, TRUE);
1684 if (creature_ptr->slow)
1686 (void)set_slow(creature_ptr, creature_ptr->slow - dec_count, TRUE);
1689 if (creature_ptr->protevil)
1691 (void)set_protevil(creature_ptr, creature_ptr->protevil - 1, TRUE);
1694 if (creature_ptr->invuln)
1696 (void)set_invuln(creature_ptr, creature_ptr->invuln - 1, TRUE);
1699 if (creature_ptr->wraith_form)
1701 (void)set_wraith_form(creature_ptr, creature_ptr->wraith_form - 1, TRUE);
1704 if (creature_ptr->hero)
1706 (void)set_hero(creature_ptr, creature_ptr->hero - 1, TRUE);
1709 if (creature_ptr->shero)
1711 (void)set_shero(creature_ptr, creature_ptr->shero - 1, TRUE);
1714 if (creature_ptr->blessed)
1716 (void)set_blessed(creature_ptr, creature_ptr->blessed - 1, TRUE);
1719 if (creature_ptr->shield)
1721 (void)set_shield(creature_ptr, creature_ptr->shield - 1, TRUE);
1724 if (creature_ptr->tsubureru)
1726 (void)set_tsubureru(creature_ptr, creature_ptr->tsubureru - 1, TRUE);
1729 if (creature_ptr->magicdef)
1731 (void)set_magicdef(creature_ptr, creature_ptr->magicdef - 1, TRUE);
1734 if (creature_ptr->tsuyoshi)
1736 (void)set_tsuyoshi(creature_ptr, creature_ptr->tsuyoshi - 1, TRUE);
1739 if (creature_ptr->oppose_acid)
1741 (void)set_oppose_acid(creature_ptr, creature_ptr->oppose_acid - 1, TRUE);
1744 if (creature_ptr->oppose_elec)
1746 (void)set_oppose_elec(creature_ptr, creature_ptr->oppose_elec - 1, TRUE);
1749 if (creature_ptr->oppose_fire)
1751 (void)set_oppose_fire(creature_ptr, creature_ptr->oppose_fire - 1, TRUE);
1754 if (creature_ptr->oppose_cold)
1756 (void)set_oppose_cold(creature_ptr, creature_ptr->oppose_cold - 1, TRUE);
1759 if (creature_ptr->oppose_pois)
1761 (void)set_oppose_pois(creature_ptr, creature_ptr->oppose_pois - 1, TRUE);
1764 if (creature_ptr->ult_res)
1766 (void)set_ultimate_res(creature_ptr, creature_ptr->ult_res - 1, TRUE);
1769 if (creature_ptr->poisoned)
1771 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
1772 (void)set_poisoned(creature_ptr, creature_ptr->poisoned - adjust);
1775 if (creature_ptr->stun)
1777 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
1778 (void)set_stun(creature_ptr, creature_ptr->stun - adjust);
1781 if (creature_ptr->cut)
1783 int adjust = adj_con_fix[creature_ptr->stat_ind[A_CON]] + 1;
1784 if (creature_ptr->cut > 1000) adjust = 0;
1785 (void)set_cut(creature_ptr, creature_ptr->cut - adjust);
1791 * @brief 10ゲームターンが進行する毎に光源の寿命を減らす処理
1792 * / Handle burning fuel every 10 game turns
1795 static void process_world_aux_light(player_type *creature_ptr)
1797 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
1798 if (o_ptr->tval == TV_LITE)
1800 if (!(object_is_fixed_artifact(o_ptr) || o_ptr->sval == SV_LITE_FEANOR) && (o_ptr->xtra4 > 0))
1802 if (o_ptr->name2 == EGO_LITE_LONG)
1804 if (current_world_ptr->game_turn % (TURNS_PER_TICK * 2)) o_ptr->xtra4--;
1806 else o_ptr->xtra4--;
1808 notice_lite_change(creature_ptr, o_ptr);
1815 * @brief 10ゲームターンが進行するごとに突然変異の発動判定を行う処理
1816 * / Handle mutation effects once every 10 game turns
1819 static void process_world_aux_mutation(player_type *creature_ptr)
1821 if (!creature_ptr->muta2) return;
1822 if (creature_ptr->phase_out) return;
1823 if (creature_ptr->wild_mode) return;
1825 if ((creature_ptr->muta2 & MUT2_BERS_RAGE) && one_in_(3000))
1827 disturb(creature_ptr, FALSE, TRUE);
1828 msg_print(_("ウガァァア!", "RAAAAGHH!"));
1829 msg_print(_("激怒の発作に襲われた!", "You feel a fit of rage coming over you!"));
1830 (void)set_shero(creature_ptr, 10 + randint1(creature_ptr->lev), FALSE);
1831 (void)set_afraid(creature_ptr, 0);
1834 if ((creature_ptr->muta2 & MUT2_COWARDICE) && (randint1(3000) == 13))
1836 if (!creature_ptr->resist_fear)
1838 disturb(creature_ptr, FALSE, TRUE);
1839 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
1840 set_afraid(creature_ptr, creature_ptr->afraid + 13 + randint1(26));
1844 if ((creature_ptr->muta2 & MUT2_RTELEPORT) && (randint1(5000) == 88))
1846 if (!creature_ptr->resist_nexus && !(creature_ptr->muta1 & MUT1_VTELEPORT) && !creature_ptr->anti_tele)
1848 disturb(creature_ptr, FALSE, TRUE);
1849 msg_print(_("あなたの位置は突然ひじょうに不確定になった...", "Your position suddenly seems very uncertain..."));
1851 teleport_player(creature_ptr, 40, TELEPORT_PASSIVE);
1855 if ((creature_ptr->muta2 & MUT2_ALCOHOL) && (randint1(6400) == 321))
1857 if (!creature_ptr->resist_conf && !creature_ptr->resist_chaos)
1859 disturb(creature_ptr, FALSE, TRUE);
1860 creature_ptr->redraw |= PR_EXTRA;
1861 msg_print(_("いひきがもーろーとひてきたきがふる...ヒック!", "You feel a SSSCHtupor cOmINg over yOu... *HIC*!"));
1864 if (!creature_ptr->resist_conf)
1866 (void)set_confused(creature_ptr, creature_ptr->confused + randint0(20) + 15);
1869 if (!creature_ptr->resist_chaos)
1874 if (one_in_(3)) lose_all_info(creature_ptr);
1875 else wiz_dark(creature_ptr);
1876 (void)teleport_player_aux(creature_ptr, 100, FALSE, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE);
1877 wiz_dark(creature_ptr);
1878 msg_print(_("あなたは見知らぬ場所で目が醒めた...頭が痛い。", "You wake up somewhere with a sore head..."));
1879 msg_print(_("何も覚えていない。どうやってここに来たかも分からない!", "You can't remember a thing or how you got here!"));
1885 msg_print(_("き~れいなちょおちょらとんれいる~", "Thishcischs GooDSChtuff!"));
1886 (void)set_image(creature_ptr, creature_ptr->image + randint0(150) + 150);
1892 if ((creature_ptr->muta2 & MUT2_HALLU) && (randint1(6400) == 42))
1894 if (!creature_ptr->resist_chaos)
1896 disturb(creature_ptr, FALSE, TRUE);
1897 creature_ptr->redraw |= PR_EXTRA;
1898 (void)set_image(creature_ptr, creature_ptr->image + randint0(50) + 20);
1902 if ((creature_ptr->muta2 & MUT2_FLATULENT) && (randint1(3000) == 13))
1904 disturb(creature_ptr, FALSE, TRUE);
1905 msg_print(_("ブゥーーッ!おっと。", "BRRAAAP! Oops."));
1907 fire_ball(creature_ptr, GF_POIS, 0, creature_ptr->lev, 3);
1910 if ((creature_ptr->muta2 & MUT2_PROD_MANA) &&
1911 !creature_ptr->anti_magic && one_in_(9000))
1914 disturb(creature_ptr, FALSE, TRUE);
1915 msg_print(_("魔法のエネルギーが突然あなたの中に流れ込んできた!エネルギーを解放しなければならない!",
1916 "Magical energy flows through you! You must release it!"));
1920 (void)get_hack_dir(creature_ptr, &dire);
1921 fire_ball(creature_ptr, GF_MANA, dire, creature_ptr->lev * 2, 3);
1924 if ((creature_ptr->muta2 & MUT2_ATT_DEMON) && !creature_ptr->anti_magic && (randint1(6666) == 666))
1926 bool pet = one_in_(6);
1927 BIT_FLAGS mode = PM_ALLOW_GROUP;
1929 if (pet) mode |= PM_FORCE_PET;
1930 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
1932 if (summon_specific(creature_ptr, (pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DEMON, mode))
1934 msg_print(_("あなたはデーモンを引き寄せた!", "You have attracted a demon!"));
1935 disturb(creature_ptr, FALSE, TRUE);
1939 if ((creature_ptr->muta2 & MUT2_SPEED_FLUX) && one_in_(6000))
1941 disturb(creature_ptr, FALSE, TRUE);
1944 msg_print(_("精力的でなくなった気がする。", "You feel less energetic."));
1946 if (creature_ptr->fast > 0)
1948 set_fast(creature_ptr, 0, TRUE);
1952 set_slow(creature_ptr, randint1(30) + 10, FALSE);
1957 msg_print(_("精力的になった気がする。", "You feel more energetic."));
1959 if (creature_ptr->slow > 0)
1961 set_slow(creature_ptr, 0, TRUE);
1965 set_fast(creature_ptr, randint1(30) + 10, FALSE);
1970 if ((creature_ptr->muta2 & MUT2_BANISH_ALL) && one_in_(9000))
1972 disturb(creature_ptr, FALSE, TRUE);
1973 msg_print(_("突然ほとんど孤独になった気がする。", "You suddenly feel almost lonely."));
1975 banish_monsters(creature_ptr, 100);
1976 if (!creature_ptr->current_floor_ptr->dun_level && creature_ptr->town_num)
1981 n = randint0(MAX_STORES);
1982 } while ((n == STORE_HOME) || (n == STORE_MUSEUM));
1984 msg_print(_("店の主人が丘に向かって走っている!", "You see one of the shopkeepers running for the hills!"));
1985 store_shuffle(creature_ptr, n);
1990 if ((creature_ptr->muta2 & MUT2_EAT_LIGHT) && one_in_(3000))
1994 msg_print(_("影につつまれた。", "A shadow passes over you."));
1997 if ((creature_ptr->current_floor_ptr->grid_array[creature_ptr->y][creature_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW)
1999 hp_player(creature_ptr, 10);
2002 o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
2004 if (o_ptr->tval == TV_LITE)
2006 if (!object_is_fixed_artifact(o_ptr) && (o_ptr->xtra4 > 0))
2008 hp_player(creature_ptr, o_ptr->xtra4 / 20);
2010 msg_print(_("光源からエネルギーを吸収した!", "You absorb energy from your light!"));
2011 notice_lite_change(creature_ptr, o_ptr);
2016 * Unlite the area (radius 10) around player and
2017 * do 50 points damage to every affected monster
2019 unlite_area(creature_ptr, 50, 10);
2022 if ((creature_ptr->muta2 & MUT2_ATT_ANIMAL) && !creature_ptr->anti_magic && one_in_(7000))
2024 bool pet = one_in_(3);
2025 BIT_FLAGS mode = PM_ALLOW_GROUP;
2027 if (pet) mode |= PM_FORCE_PET;
2028 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2030 if (summon_specific(creature_ptr, (pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_ANIMAL, mode))
2032 msg_print(_("動物を引き寄せた!", "You have attracted an animal!"));
2033 disturb(creature_ptr, FALSE, TRUE);
2037 if ((creature_ptr->muta2 & MUT2_RAW_CHAOS) && !creature_ptr->anti_magic && one_in_(8000))
2039 disturb(creature_ptr, FALSE, TRUE);
2040 msg_print(_("周りの空間が歪んでいる気がする!", "You feel the world warping around you!"));
2043 fire_ball(creature_ptr, GF_CHAOS, 0, creature_ptr->lev, 8);
2046 if ((creature_ptr->muta2 & MUT2_NORMALITY) && one_in_(5000))
2048 if (!lose_mutation(creature_ptr, 0))
2049 msg_print(_("奇妙なくらい普通になった気がする。", "You feel oddly normal."));
2052 if ((creature_ptr->muta2 & MUT2_WRAITH) && !creature_ptr->anti_magic && one_in_(3000))
2054 disturb(creature_ptr, FALSE, TRUE);
2055 msg_print(_("非物質化した!", "You feel insubstantial!"));
2058 set_wraith_form(creature_ptr, randint1(creature_ptr->lev / 2) + (creature_ptr->lev / 2), FALSE);
2061 if ((creature_ptr->muta2 & MUT2_POLY_WOUND) && one_in_(3000))
2063 do_poly_wounds(creature_ptr);
2066 if ((creature_ptr->muta2 & MUT2_WASTING) && one_in_(3000))
2068 int which_stat = randint0(A_MAX);
2069 int sustained = FALSE;
2074 if (creature_ptr->sustain_str) sustained = TRUE;
2077 if (creature_ptr->sustain_int) sustained = TRUE;
2080 if (creature_ptr->sustain_wis) sustained = TRUE;
2083 if (creature_ptr->sustain_dex) sustained = TRUE;
2086 if (creature_ptr->sustain_con) sustained = TRUE;
2089 if (creature_ptr->sustain_chr) sustained = TRUE;
2092 msg_print(_("不正な状態!", "Invalid stat chosen!"));
2098 disturb(creature_ptr, FALSE, TRUE);
2099 msg_print(_("自分が衰弱していくのが分かる!", "You can feel yourself wasting away!"));
2101 (void)dec_stat(creature_ptr, which_stat, randint1(6) + 6, one_in_(3));
2105 if ((creature_ptr->muta2 & MUT2_ATT_DRAGON) && !creature_ptr->anti_magic && one_in_(3000))
2107 bool pet = one_in_(5);
2108 BIT_FLAGS mode = PM_ALLOW_GROUP;
2110 if (pet) mode |= PM_FORCE_PET;
2111 else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
2113 if (summon_specific(creature_ptr, (pet ? -1 : 0), creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DRAGON, mode))
2115 msg_print(_("ドラゴンを引き寄せた!", "You have attracted a dragon!"));
2116 disturb(creature_ptr, FALSE, TRUE);
2120 if ((creature_ptr->muta2 & MUT2_WEIRD_MIND) && !creature_ptr->anti_magic && one_in_(3000))
2122 if (creature_ptr->tim_esp > 0)
2124 msg_print(_("精神にもやがかかった!", "Your mind feels cloudy!"));
2125 set_tim_esp(creature_ptr, 0, TRUE);
2129 msg_print(_("精神が広がった!", "Your mind expands!"));
2130 set_tim_esp(creature_ptr, creature_ptr->lev, FALSE);
2134 if ((creature_ptr->muta2 & MUT2_NAUSEA) && !creature_ptr->slow_digest && one_in_(9000))
2136 disturb(creature_ptr, FALSE, TRUE);
2137 msg_print(_("胃が痙攣し、食事を失った!", "Your stomach roils, and you lose your lunch!"));
2139 set_food(creature_ptr, PY_FOOD_WEAK);
2140 if (music_singing_any(creature_ptr)) stop_singing(creature_ptr);
2141 if (hex_spelling_any(creature_ptr)) stop_hex_spell_all(creature_ptr);
2144 if ((creature_ptr->muta2 & MUT2_WALK_SHAD) && !creature_ptr->anti_magic && one_in_(12000) && !creature_ptr->current_floor_ptr->inside_arena)
2146 reserve_alter_reality(creature_ptr);
2149 if ((creature_ptr->muta2 & MUT2_WARNING) && one_in_(1000))
2151 int danger_amount = 0;
2152 for (MONSTER_IDX monster = 0; monster < creature_ptr->current_floor_ptr->m_max; monster++)
2154 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[monster];
2155 monster_race *r_ptr = &r_info[m_ptr->r_idx];
2156 if (!monster_is_valid(m_ptr)) continue;
2158 if (r_ptr->level >= creature_ptr->lev)
2160 danger_amount += r_ptr->level - creature_ptr->lev + 1;
2164 if (danger_amount > 100)
2165 msg_print(_("非常に恐ろしい気がする!", "You feel utterly terrified!"));
2166 else if (danger_amount > 50)
2167 msg_print(_("恐ろしい気がする!", "You feel terrified!"));
2168 else if (danger_amount > 20)
2169 msg_print(_("非常に心配な気がする!", "You feel very worried!"));
2170 else if (danger_amount > 10)
2171 msg_print(_("心配な気がする!", "You feel paranoid!"));
2172 else if (danger_amount > 5)
2173 msg_print(_("ほとんど安全な気がする。", "You feel almost safe."));
2175 msg_print(_("寂しい気がする。", "You feel lonely."));
2178 if ((creature_ptr->muta2 & MUT2_INVULN) && !creature_ptr->anti_magic && one_in_(5000))
2180 disturb(creature_ptr, FALSE, TRUE);
2181 msg_print(_("無敵な気がする!", "You feel invincible!"));
2183 (void)set_invuln(creature_ptr, randint1(8) + 8, FALSE);
2186 if ((creature_ptr->muta2 & MUT2_SP_TO_HP) && one_in_(2000))
2188 MANA_POINT wounds = (MANA_POINT)(creature_ptr->mhp - creature_ptr->chp);
2192 HIT_POINT healing = creature_ptr->csp;
2193 if (healing > wounds) healing = wounds;
2195 hp_player(creature_ptr, healing);
2196 creature_ptr->csp -= healing;
2197 creature_ptr->redraw |= (PR_HP | PR_MANA);
2201 if ((creature_ptr->muta2 & MUT2_HP_TO_SP) && !creature_ptr->anti_magic && one_in_(4000))
2203 HIT_POINT wounds = (HIT_POINT)(creature_ptr->msp - creature_ptr->csp);
2207 HIT_POINT healing = creature_ptr->chp;
2208 if (healing > wounds) healing = wounds;
2210 creature_ptr->csp += healing;
2211 creature_ptr->redraw |= (PR_HP | PR_MANA);
2212 take_hit(creature_ptr, DAMAGE_LOSELIFE, healing, _("頭に昇った血", "blood rushing to the head"), -1);
2216 if ((creature_ptr->muta2 & MUT2_DISARM) && one_in_(10000))
2218 INVENTORY_IDX slot = 0;
2219 object_type *o_ptr = NULL;
2221 disturb(creature_ptr, FALSE, TRUE);
2222 msg_print(_("足がもつれて転んだ!", "You trip over your own feet!"));
2223 take_hit(creature_ptr, DAMAGE_NOESCAPE, randint1(creature_ptr->wt / 6), _("転倒", "tripping"), -1);
2226 if (has_melee_weapon(creature_ptr, INVEN_RARM))
2229 o_ptr = &creature_ptr->inventory_list[INVEN_RARM];
2231 if (has_melee_weapon(creature_ptr, INVEN_LARM) && one_in_(2))
2233 o_ptr = &creature_ptr->inventory_list[INVEN_LARM];
2237 else if (has_melee_weapon(creature_ptr, INVEN_LARM))
2239 o_ptr = &creature_ptr->inventory_list[INVEN_LARM];
2242 if (slot && !object_is_cursed(o_ptr))
2244 msg_print(_("武器を落としてしまった!", "You drop your weapon!"));
2245 drop_from_inventory(creature_ptr, slot, 1);
2252 * @brief 10ゲームターンが進行するごとに装備効果の発動判定を行う処理
2253 * / Handle curse effects once every 10 game turns
2256 static void process_world_aux_curse(player_type *creature_ptr)
2258 if ((creature_ptr->cursed & TRC_P_FLAG_MASK) && !creature_ptr->phase_out && !creature_ptr->wild_mode)
2261 * Hack: Uncursed teleporting items (e.g. Trump Weapons)
2262 * can actually be useful!
2264 if ((creature_ptr->cursed & TRC_TELEPORT_SELF) && one_in_(200))
2266 GAME_TEXT o_name[MAX_NLEN];
2268 int i_keep = 0, count = 0;
2269 for (int i = INVEN_RARM; i < INVEN_TOTAL; i++)
2271 BIT_FLAGS flgs[TR_FLAG_SIZE];
2272 o_ptr = &creature_ptr->inventory_list[i];
2273 if (!o_ptr->k_idx) continue;
2275 object_flags(o_ptr, flgs);
2277 if (have_flag(flgs, TR_TELEPORT))
2279 /* {.} will stop random teleportation. */
2280 if (!o_ptr->inscription || !my_strchr(quark_str(o_ptr->inscription), '.'))
2283 if (one_in_(count)) i_keep = i;
2288 o_ptr = &creature_ptr->inventory_list[i_keep];
2289 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2290 msg_format(_("%sがテレポートの能力を発動させようとしている。", "Your %s is activating teleportation."), o_name);
2291 if (get_check_strict(_("テレポートしますか?", "Teleport? "), CHECK_OKAY_CANCEL))
2293 disturb(creature_ptr, FALSE, TRUE);
2294 teleport_player(creature_ptr, 50, 0L);
2298 msg_format(_("%sに{.}(ピリオド)と銘を刻むと発動を抑制できます。",
2299 "You can inscribe {.} on your %s to disable random teleportation. "), o_name);
2300 disturb(creature_ptr, TRUE, TRUE);
2304 if ((creature_ptr->cursed & TRC_CHAINSWORD) && one_in_(CHAINSWORD_NOISE))
2307 if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, noise))
2309 disturb(creature_ptr, FALSE, FALSE);
2312 if ((creature_ptr->cursed & TRC_TY_CURSE) && one_in_(TY_CURSE_CHANCE))
2315 (void)activate_ty_curse(creature_ptr, FALSE, &count);
2318 if (creature_ptr->prace != RACE_ANDROID && ((creature_ptr->cursed & TRC_DRAIN_EXP) && one_in_(4)))
2320 creature_ptr->exp -= (creature_ptr->lev + 1) / 2;
2321 if (creature_ptr->exp < 0) creature_ptr->exp = 0;
2322 creature_ptr->max_exp -= (creature_ptr->lev + 1) / 2;
2323 if (creature_ptr->max_exp < 0) creature_ptr->max_exp = 0;
2324 check_experience(creature_ptr);
2327 if ((creature_ptr->cursed & TRC_ADD_L_CURSE) && one_in_(2000))
2330 o_ptr = choose_cursed_obj_name(creature_ptr, TRC_ADD_L_CURSE);
2331 BIT_FLAGS new_curse = get_curse(0, o_ptr);
2332 if (!(o_ptr->curse_flags & new_curse))
2334 GAME_TEXT o_name[MAX_NLEN];
2335 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2336 o_ptr->curse_flags |= new_curse;
2337 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2338 o_ptr->feeling = FEEL_NONE;
2339 creature_ptr->update |= (PU_BONUS);
2343 if ((creature_ptr->cursed & TRC_ADD_H_CURSE) && one_in_(2000))
2346 o_ptr = choose_cursed_obj_name(creature_ptr, TRC_ADD_H_CURSE);
2347 BIT_FLAGS new_curse = get_curse(1, o_ptr);
2348 if (!(o_ptr->curse_flags & new_curse))
2350 GAME_TEXT o_name[MAX_NLEN];
2352 object_desc(creature_ptr, o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
2354 o_ptr->curse_flags |= new_curse;
2355 msg_format(_("悪意に満ちた黒いオーラが%sをとりまいた...", "There is a malignant black aura surrounding your %s..."), o_name);
2356 o_ptr->feeling = FEEL_NONE;
2358 creature_ptr->update |= (PU_BONUS);
2362 if ((creature_ptr->cursed & TRC_CALL_ANIMAL) && one_in_(2500))
2364 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)))
2366 GAME_TEXT o_name[MAX_NLEN];
2367 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_ANIMAL), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2368 msg_format(_("%sが動物を引き寄せた!", "Your %s has attracted an animal!"), o_name);
2369 disturb(creature_ptr, FALSE, TRUE);
2373 if ((creature_ptr->cursed & TRC_CALL_DEMON) && one_in_(1111))
2375 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)))
2377 GAME_TEXT o_name[MAX_NLEN];
2378 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_DEMON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2379 msg_format(_("%sが悪魔を引き寄せた!", "Your %s has attracted a demon!"), o_name);
2380 disturb(creature_ptr, FALSE, TRUE);
2384 if ((creature_ptr->cursed & TRC_CALL_DRAGON) && one_in_(800))
2386 if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_DRAGON,
2387 (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2389 GAME_TEXT o_name[MAX_NLEN];
2390 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_DRAGON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2391 msg_format(_("%sがドラゴンを引き寄せた!", "Your %s has attracted an dragon!"), o_name);
2392 disturb(creature_ptr, FALSE, TRUE);
2396 if ((creature_ptr->cursed & TRC_CALL_UNDEAD) && one_in_(1111))
2398 if (summon_specific(creature_ptr, 0, creature_ptr->y, creature_ptr->x, creature_ptr->current_floor_ptr->dun_level, SUMMON_UNDEAD,
2399 (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
2401 GAME_TEXT o_name[MAX_NLEN];
2402 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_CALL_UNDEAD), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2403 msg_format(_("%sが死霊を引き寄せた!", "Your %s has attracted an undead!"), o_name);
2404 disturb(creature_ptr, FALSE, TRUE);
2408 if ((creature_ptr->cursed & TRC_COWARDICE) && one_in_(1500))
2410 if (!creature_ptr->resist_fear)
2412 disturb(creature_ptr, FALSE, TRUE);
2413 msg_print(_("とても暗い... とても恐い!", "It's so dark... so scary!"));
2414 set_afraid(creature_ptr, creature_ptr->afraid + 13 + randint1(26));
2418 if ((creature_ptr->cursed & TRC_TELEPORT) && one_in_(200) && !creature_ptr->anti_tele)
2420 disturb(creature_ptr, FALSE, TRUE);
2421 teleport_player(creature_ptr, 40, TELEPORT_PASSIVE);
2424 if ((creature_ptr->cursed & TRC_DRAIN_HP) && one_in_(666))
2426 GAME_TEXT o_name[MAX_NLEN];
2427 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_DRAIN_HP), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2428 msg_format(_("%sはあなたの体力を吸収した!", "Your %s drains HP from you!"), o_name);
2429 take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev * 2, 100), o_name, -1);
2432 if ((creature_ptr->cursed & TRC_DRAIN_MANA) && creature_ptr->csp && one_in_(666))
2434 GAME_TEXT o_name[MAX_NLEN];
2435 object_desc(creature_ptr, o_name, choose_cursed_obj_name(creature_ptr, TRC_DRAIN_MANA), (OD_OMIT_PREFIX | OD_NAME_ONLY));
2436 msg_format(_("%sはあなたの魔力を吸収した!", "Your %s drains mana from you!"), o_name);
2437 creature_ptr->csp -= MIN(creature_ptr->lev, 50);
2438 if (creature_ptr->csp < 0)
2440 creature_ptr->csp = 0;
2441 creature_ptr->csp_frac = 0;
2444 creature_ptr->redraw |= PR_MANA;
2448 if (one_in_(999) && !creature_ptr->anti_magic)
2450 object_type *o_ptr = &creature_ptr->inventory_list[INVEN_LITE];
2451 if (o_ptr->name1 == ART_JUDGE)
2453 if (object_is_known(o_ptr))
2454 msg_print(_("『審判の宝石』はあなたの体力を吸収した!", "The Jewel of Judgement drains life from you!"));
2456 msg_print(_("なにかがあなたの体力を吸収した!", "Something drains life from you!"));
2457 take_hit(creature_ptr, DAMAGE_LOSELIFE, MIN(creature_ptr->lev, 50), _("審判の宝石", "the Jewel of Judgement"), -1);
2464 * @brief 10ゲームターンが進行するごとに魔道具の自然充填を行う処理
2465 * / Handle recharging objects once every 10 game turns
2468 static void process_world_aux_recharge(player_type *creature_ptr)
2473 for (changed = FALSE, i = INVEN_RARM; i < INVEN_TOTAL; i++)
2475 object_type *o_ptr = &creature_ptr->inventory_list[i];
2476 if (!o_ptr->k_idx) continue;
2478 if (o_ptr->timeout > 0)
2481 if (!o_ptr->timeout)
2483 recharged_notice(creature_ptr, o_ptr);
2491 creature_ptr->window |= (PW_EQUIP);
2496 * Recharge rods. Rods now use timeout to control charging status,
2497 * and each charging rod in a stack decreases the stack's timeout by
2498 * one per turn. -LM-
2500 for (changed = FALSE, i = 0; i < INVEN_PACK; i++)
2502 object_type *o_ptr = &creature_ptr->inventory_list[i];
2503 object_kind *k_ptr = &k_info[o_ptr->k_idx];
2504 if (!o_ptr->k_idx) continue;
2506 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2508 TIME_EFFECT temp = (o_ptr->timeout + (k_ptr->pval - 1)) / k_ptr->pval;
2509 if (temp > o_ptr->number) temp = (TIME_EFFECT)o_ptr->number;
2511 o_ptr->timeout -= temp;
2512 if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2514 if (!(o_ptr->timeout))
2516 recharged_notice(creature_ptr, o_ptr);
2519 else if (o_ptr->timeout % k_ptr->pval)
2528 creature_ptr->window |= (PW_INVEN);
2532 for (i = 1; i < creature_ptr->current_floor_ptr->o_max; i++)
2534 object_type *o_ptr = &creature_ptr->current_floor_ptr->o_list[i];
2535 if (!OBJECT_IS_VALID(o_ptr)) continue;
2537 if ((o_ptr->tval == TV_ROD) && (o_ptr->timeout))
2539 o_ptr->timeout -= (TIME_EFFECT)o_ptr->number;
2540 if (o_ptr->timeout < 0) o_ptr->timeout = 0;
2547 * @brief 10ゲームターンが進行するごとに帰還や現実変容などの残り時間カウントダウンと発動を処理する。
2548 * / Handle involuntary movement once every 10 game turns
2551 static void process_world_aux_movement(player_type *creature_ptr)
2553 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
2554 if (creature_ptr->word_recall)
2557 * HACK: Autosave BEFORE resetting the recall counter (rr9)
2558 * The player is yanked up/down as soon as
2559 * he loads the autosaved game.
2561 if (autosave_l && (creature_ptr->word_recall == 1) && !creature_ptr->phase_out)
2562 do_cmd_save_game(creature_ptr, TRUE);
2564 creature_ptr->word_recall--;
2565 creature_ptr->redraw |= (PR_STATUS);
2566 if (!creature_ptr->word_recall)
2568 disturb(creature_ptr, FALSE, TRUE);
2569 if (floor_ptr->dun_level || creature_ptr->current_floor_ptr->inside_quest || creature_ptr->enter_dungeon)
2571 msg_print(_("上に引っ張りあげられる感じがする!", "You feel yourself yanked upwards!"));
2572 if (creature_ptr->dungeon_idx) creature_ptr->recall_dungeon = creature_ptr->dungeon_idx;
2574 exe_write_diary(creature_ptr, DIARY_RECALL, floor_ptr->dun_level, NULL);
2576 floor_ptr->dun_level = 0;
2577 creature_ptr->dungeon_idx = 0;
2578 leave_quest_check(creature_ptr);
2579 leave_tower_check(creature_ptr);
2580 creature_ptr->current_floor_ptr->inside_quest = 0;
2581 creature_ptr->leaving = TRUE;
2585 msg_print(_("下に引きずり降ろされる感じがする!", "You feel yourself yanked downwards!"));
2586 creature_ptr->dungeon_idx = creature_ptr->recall_dungeon;
2588 exe_write_diary(creature_ptr, DIARY_RECALL, floor_ptr->dun_level, NULL);
2590 floor_ptr->dun_level = max_dlv[creature_ptr->dungeon_idx];
2591 if (floor_ptr->dun_level < 1) floor_ptr->dun_level = 1;
2592 if (ironman_nightmare && !randint0(666) && (creature_ptr->dungeon_idx == DUNGEON_ANGBAND))
2594 if (floor_ptr->dun_level < 50)
2596 floor_ptr->dun_level *= 2;
2598 else if (floor_ptr->dun_level < 99)
2600 floor_ptr->dun_level = (floor_ptr->dun_level + 99) / 2;
2602 else if (floor_ptr->dun_level > 100)
2604 floor_ptr->dun_level = d_info[creature_ptr->dungeon_idx].maxdepth - 1;
2608 if (creature_ptr->wild_mode)
2610 creature_ptr->wilderness_y = creature_ptr->y;
2611 creature_ptr->wilderness_x = creature_ptr->x;
2615 creature_ptr->oldpx = creature_ptr->x;
2616 creature_ptr->oldpy = creature_ptr->y;
2619 creature_ptr->wild_mode = FALSE;
2622 * Clear all saved floors
2623 * and create a first saved floor
2625 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
2626 creature_ptr->leaving = TRUE;
2628 if (creature_ptr->dungeon_idx == DUNGEON_ANGBAND)
2630 for (int i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++)
2632 quest_type* const q_ptr = &quest[i];
2633 if ((q_ptr->type == QUEST_TYPE_RANDOM) &&
2634 (q_ptr->status == QUEST_STATUS_TAKEN) &&
2635 (q_ptr->level < floor_ptr->dun_level))
2637 q_ptr->status = QUEST_STATUS_FAILED;
2638 q_ptr->complev = (byte)creature_ptr->lev;
2640 q_ptr->comptime = current_world_ptr->play_time;
2641 r_info[q_ptr->r_idx].flags1 &= ~(RF1_QUESTOR);
2647 sound(SOUND_TPLEVEL);
2651 if (creature_ptr->alter_reality)
2653 if (autosave_l && (creature_ptr->alter_reality == 1) && !creature_ptr->phase_out)
2654 do_cmd_save_game(creature_ptr, TRUE);
2656 creature_ptr->alter_reality--;
2657 creature_ptr->redraw |= (PR_STATUS);
2658 if (!creature_ptr->alter_reality)
2660 disturb(creature_ptr, FALSE, TRUE);
2661 if (!quest_number(creature_ptr, floor_ptr->dun_level) && floor_ptr->dun_level)
2663 msg_print(_("世界が変わった!", "The world changes!"));
2666 * Clear all saved floors
2667 * and create a first saved floor
2669 prepare_change_floor_mode(creature_ptr, CFM_FIRST_FLOOR);
2670 creature_ptr->leaving = TRUE;
2674 msg_print(_("世界が少しの間変化したようだ。", "The world seems to change for a moment!"));
2677 sound(SOUND_TPLEVEL);
2684 * @brief 10ゲームターンが進行する毎にゲーム世界全体の処理を行う。
2685 * / Handle certain things once every 10 game turns
2688 static void process_world(player_type *player_ptr)
2690 const s32b A_DAY = TURNS_PER_TICK * TOWN_DAWN;
2691 s32b prev_turn_in_today = ((current_world_ptr->game_turn - TURNS_PER_TICK) % A_DAY + A_DAY / 4) % A_DAY;
2692 int prev_min = (1440 * prev_turn_in_today / A_DAY) % 60;
2695 extract_day_hour_min(player_ptr, &day, &hour, &min);
2696 update_dungeon_feeling(player_ptr);
2698 /* 帰還無しモード時のレベルテレポバグ対策 / Fix for level teleport bugs on ironman_downward.*/
2699 floor_type *floor_ptr = player_ptr->current_floor_ptr;
2700 if (ironman_downward && (player_ptr->dungeon_idx != DUNGEON_ANGBAND && player_ptr->dungeon_idx != 0))
2702 floor_ptr->dun_level = 0;
2703 player_ptr->dungeon_idx = 0;
2704 prepare_change_floor_mode(player_ptr, CFM_FIRST_FLOOR | CFM_RAND_PLACE);
2705 floor_ptr->inside_arena = FALSE;
2706 player_ptr->wild_mode = FALSE;
2707 player_ptr->leaving = TRUE;
2710 if (player_ptr->phase_out && !player_ptr->leaving)
2714 for (int i2 = 0; i2 < floor_ptr->width; ++i2)
2716 for (int j2 = 0; j2 < floor_ptr->height; j2++)
2718 grid_type *g_ptr = &floor_ptr->grid_array[j2][i2];
2719 if ((g_ptr->m_idx > 0) && (g_ptr->m_idx != player_ptr->riding))
2722 win_m_idx = g_ptr->m_idx;
2727 if (number_mon == 0)
2729 msg_print(_("相打ちに終わりました。", "Nothing survived."));
2731 player_ptr->energy_need = 0;
2732 update_gambling_monsters(player_ptr);
2734 else if ((number_mon - 1) == 0)
2736 GAME_TEXT m_name[MAX_NLEN];
2737 monster_type *wm_ptr;
2738 wm_ptr = &floor_ptr->m_list[win_m_idx];
2739 monster_desc(player_ptr, m_name, wm_ptr, 0);
2740 msg_format(_("%sが勝利した!", "%s won!"), m_name);
2743 if (win_m_idx == (sel_monster + 1))
2745 msg_print(_("おめでとうございます。", "Congratulations."));
2746 msg_format(_("%d$を受け取った。", "You received %d gold."), battle_odds);
2747 player_ptr->au += battle_odds;
2751 msg_print(_("残念でした。", "You lost gold."));
2755 player_ptr->energy_need = 0;
2756 update_gambling_monsters(player_ptr);
2758 else if (current_world_ptr->game_turn - floor_ptr->generated_turn == 150 * TURNS_PER_TICK)
2760 msg_print(_("申し分けありませんが、この勝負は引き分けとさせていただきます。", "This battle ended in a draw."));
2761 player_ptr->au += kakekin;
2763 player_ptr->energy_need = 0;
2764 update_gambling_monsters(player_ptr);
2768 if (current_world_ptr->game_turn % TURNS_PER_TICK) return;
2770 if (autosave_t && autosave_freq && !player_ptr->phase_out)
2772 if (!(current_world_ptr->game_turn % ((s32b)autosave_freq * TURNS_PER_TICK)))
2773 do_cmd_save_game(player_ptr, TRUE);
2776 if (floor_ptr->monster_noise && !ignore_unview)
2778 msg_print(_("何かが聞こえた。", "You hear noise."));
2781 if (!floor_ptr->dun_level && !floor_ptr->inside_quest && !player_ptr->phase_out && !floor_ptr->inside_arena)
2783 if (!(current_world_ptr->game_turn % ((TURNS_PER_TICK * TOWN_DAWN) / 2)))
2785 bool dawn = (!(current_world_ptr->game_turn % (TURNS_PER_TICK * TOWN_DAWN)));
2786 if (dawn) day_break(player_ptr);
2787 else night_falls(player_ptr);
2791 else if ((vanilla_town || (lite_town && !floor_ptr->inside_quest && !player_ptr->phase_out && !floor_ptr->inside_arena)) && floor_ptr->dun_level)
2793 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * STORE_TICKS)))
2795 if (one_in_(STORE_SHUFFLE))
2800 n = randint0(MAX_STORES);
2801 } while ((n == STORE_HOME) || (n == STORE_MUSEUM));
2803 for (FEAT_IDX i = 1; i < max_f_idx; i++)
2805 feature_type *f_ptr = &f_info[i];
2806 if (!f_ptr->name) continue;
2807 if (!have_flag(f_ptr->flags, FF_STORE)) continue;
2809 if (f_ptr->subtype == n)
2812 msg_format(_("%sの店主をシャッフルします。", "Shuffle a Shopkeeper of %s."), f_name + f_ptr->name);
2814 store_shuffle(player_ptr, n);
2822 if (one_in_(d_info[player_ptr->dungeon_idx].max_m_alloc_chance) &&
2823 !floor_ptr->inside_arena && !floor_ptr->inside_quest && !player_ptr->phase_out)
2825 (void)alloc_monster(player_ptr, MAX_SIGHT + 5, 0);
2828 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 10)) && !player_ptr->phase_out)
2829 regenerate_monsters(player_ptr);
2830 if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 3)))
2831 regenerate_captured_monsters(player_ptr);
2833 if (!player_ptr->leaving)
2835 for (int i = 0; i < MAX_MTIMED; i++)
2837 if (floor_ptr->mproc_max[i] > 0) process_monsters_mtimed(player_ptr, i);
2843 if (min != prev_min)
2845 exe_write_diary(player_ptr, DIARY_DIALY, 0, NULL);
2846 determine_daily_bounty(player_ptr, FALSE);
2851 * Nightmare mode activates the TY_CURSE at midnight
2852 * Require exact minute -- Don't activate multiple times in a minute
2854 if (ironman_nightmare && (min != prev_min))
2856 if ((hour == 23) && !(min % 15))
2858 disturb(player_ptr, FALSE, TRUE);
2862 msg_print(_("遠くで不気味な鐘の音が鳴った。", "You hear a distant bell toll ominously."));
2866 msg_print(_("遠くで鐘が二回鳴った。", "A distant bell sounds twice."));
2870 msg_print(_("遠くで鐘が三回鳴った。", "A distant bell sounds three times."));
2874 msg_print(_("遠くで鐘が四回鳴った。", "A distant bell tolls four times."));
2881 disturb(player_ptr, TRUE, TRUE);
2882 msg_print(_("遠くで鐘が何回も鳴り、死んだような静けさの中へ消えていった。", "A distant bell tolls many times, fading into an deathly silence."));
2883 if (player_ptr->wild_mode)
2885 player_ptr->oldpy = randint1(MAX_HGT - 2);
2886 player_ptr->oldpx = randint1(MAX_WID - 2);
2887 change_wild_mode(player_ptr, TRUE);
2888 take_turn(player_ptr, 100);
2892 player_ptr->invoking_midnight_curse = TRUE;
2896 process_world_aux_digestion(player_ptr);
2897 process_world_aux_hp_and_sp(player_ptr);
2898 process_world_aux_timeout(player_ptr);
2899 process_world_aux_light(player_ptr);
2900 process_world_aux_mutation(player_ptr);
2901 process_world_aux_curse(player_ptr);
2902 process_world_aux_recharge(player_ptr);
2903 sense_inventory1(player_ptr);
2904 sense_inventory2(player_ptr);
2905 process_world_aux_movement(player_ptr);
2910 * @brief ウィザードモードへの導入処理
2911 * / Verify use of "wizard" mode
2912 * @param player_ptr プレーヤーへの参照ポインタ
2913 * @return 実際にウィザードモードへ移行したらTRUEを返す。
2915 static bool enter_wizard_mode(player_type *player_ptr)
2917 if (!current_world_ptr->noscore)
2919 if (!allow_debug_opts || arg_wizard)
2921 msg_print(_("ウィザードモードは許可されていません。 ", "Wizard mode is not permitted."));
2925 msg_print(_("ウィザードモードはデバッグと実験のためのモードです。 ", "Wizard mode is for debugging and experimenting."));
2926 msg_print(_("一度ウィザードモードに入るとスコアは記録されません。", "The game will not be scored if you enter wizard mode."));
2928 if (!get_check(_("本当にウィザードモードに入りたいのですか? ", "Are you sure you want to enter wizard mode? ")))
2933 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, _("ウィザードモードに突入してスコアを残せなくなった。", "give up recording score to enter wizard mode."));
2934 current_world_ptr->noscore |= 0x0002;
2942 * @brief デバッグコマンドへの導入処理
2943 * / Verify use of "debug" commands
2944 * @param player_ptr プレーヤーへの参照ポインタ
2945 * @return 実際にデバッグコマンドへ移行したらTRUEを返す。
2947 static bool enter_debug_mode(player_type *player_ptr)
2949 if (!current_world_ptr->noscore)
2951 if (!allow_debug_opts)
2953 msg_print(_("デバッグコマンドは許可されていません。 ", "Use of debug command is not permitted."));
2957 msg_print(_("デバッグ・コマンドはデバッグと実験のためのコマンドです。 ", "The debug commands are for debugging and experimenting."));
2958 msg_print(_("デバッグ・コマンドを使うとスコアは記録されません。", "The game will not be scored if you use debug commands."));
2960 if (!get_check(_("本当にデバッグ・コマンドを使いますか? ", "Are you sure you want to use debug commands? ")))
2965 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, _("デバッグモードに突入してスコアを残せなくなった。", "give up sending score to use debug commands."));
2966 current_world_ptr->noscore |= 0x0008;
2973 * todo これが多重インクルード問題の原因 (の1つ)かもしれない、wizard2.cに同名の関数が存在する
2974 * Hack -- Declare the Debug Routines
2976 extern void do_cmd_debug(player_type *creature_ptr);
2979 * @brief プレイヤーから受けた入力コマンドの分岐処理。
2980 * / Parse and execute the current command Give "Warning" on illegal commands.
2981 * @todo Make some "blocks"
2984 static void process_command(player_type *creature_ptr)
2986 COMMAND_CODE old_now_message = now_message;
2989 if ((creature_ptr->pclass == CLASS_SNIPER) && (creature_ptr->concent))
2990 creature_ptr->reset_concent = TRUE;
2992 floor_type *floor_ptr = creature_ptr->current_floor_ptr;
2993 switch (command_cmd)
3004 /* todo 嘘。returnしていない
3011 if (current_world_ptr->wizard)
3013 current_world_ptr->wizard = FALSE;
3014 msg_print(_("ウィザードモード解除。", "Wizard mode off."));
3016 else if (enter_wizard_mode(creature_ptr))
3018 current_world_ptr->wizard = TRUE;
3019 msg_print(_("ウィザードモード突入。", "Wizard mode on."));
3021 creature_ptr->update |= (PU_MONSTERS);
3022 creature_ptr->redraw |= (PR_TITLE);
3028 if (enter_debug_mode(creature_ptr))
3030 do_cmd_debug(creature_ptr);
3036 if (!creature_ptr->wild_mode) do_cmd_wield(creature_ptr);
3041 if (!creature_ptr->wild_mode) do_cmd_takeoff(creature_ptr);
3046 if (!creature_ptr->wild_mode) do_cmd_drop(creature_ptr);
3051 do_cmd_destroy(creature_ptr);
3056 do_cmd_equip(creature_ptr);
3061 do_cmd_inven(creature_ptr);
3066 do_cmd_observe(creature_ptr);
3072 toggle_inventory_equipment(creature_ptr);
3077 if (!creature_ptr->wild_mode) do_cmd_alter(creature_ptr);
3082 if (!creature_ptr->wild_mode) do_cmd_tunnel(creature_ptr);
3087 do_cmd_walk(creature_ptr, FALSE);
3092 do_cmd_walk(creature_ptr, TRUE);
3097 if (!creature_ptr->wild_mode) do_cmd_run(creature_ptr);
3102 do_cmd_stay(creature_ptr, always_pickup);
3107 do_cmd_stay(creature_ptr, !always_pickup);
3112 do_cmd_rest(creature_ptr);
3117 do_cmd_search(creature_ptr);
3122 if (creature_ptr->action == ACTION_SEARCH) set_action(creature_ptr, ACTION_NONE);
3123 else set_action(creature_ptr, ACTION_SEARCH);
3126 case SPECIAL_KEY_STORE:
3128 do_cmd_store(creature_ptr);
3131 case SPECIAL_KEY_BUILDING:
3133 do_cmd_bldg(creature_ptr);
3136 case SPECIAL_KEY_QUEST:
3138 do_cmd_quest(creature_ptr);
3143 if (!creature_ptr->wild_mode && !floor_ptr->dun_level && !floor_ptr->inside_arena && !floor_ptr->inside_quest)
3145 if (vanilla_town) break;
3147 if (creature_ptr->ambush_flag)
3149 msg_print(_("襲撃から逃げるにはマップの端まで移動しなければならない。", "To flee the ambush you have to reach the edge of the map."));
3153 if (creature_ptr->food < PY_FOOD_WEAK)
3155 msg_print(_("その前に食事をとらないと。", "You must eat something here."));
3159 change_wild_mode(creature_ptr, FALSE);
3162 do_cmd_go_up(creature_ptr);
3168 if (creature_ptr->wild_mode)
3169 change_wild_mode(creature_ptr, FALSE);
3171 do_cmd_go_down(creature_ptr);
3176 do_cmd_open(creature_ptr);
3181 do_cmd_close(creature_ptr);
3186 do_cmd_spike(creature_ptr);
3191 do_cmd_bash(creature_ptr);
3196 do_cmd_disarm(creature_ptr);
3201 if ((creature_ptr->pclass == CLASS_SORCERER) || (creature_ptr->pclass == CLASS_RED_MAGE))
3202 msg_print(_("呪文を学習する必要はない!", "You don't have to learn spells!"));
3203 else if (creature_ptr->pclass == CLASS_SAMURAI)
3204 do_cmd_gain_hissatsu(creature_ptr);
3205 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3206 import_magic_device(creature_ptr);
3208 do_cmd_study(creature_ptr);
3213 if ((creature_ptr->pclass == CLASS_MINDCRAFTER) ||
3214 (creature_ptr->pclass == CLASS_BERSERKER) ||
3215 (creature_ptr->pclass == CLASS_NINJA) ||
3216 (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3217 ) do_cmd_mind_browse(creature_ptr);
3218 else if (creature_ptr->pclass == CLASS_SMITH)
3219 do_cmd_kaji(creature_ptr, TRUE);
3220 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3221 do_cmd_magic_eater(creature_ptr, TRUE, FALSE);
3222 else if (creature_ptr->pclass == CLASS_SNIPER)
3223 do_cmd_snipe_browse(creature_ptr);
3224 else do_cmd_browse(creature_ptr);
3229 if (!creature_ptr->wild_mode)
3231 if ((creature_ptr->pclass == CLASS_WARRIOR) || (creature_ptr->pclass == CLASS_ARCHER) || (creature_ptr->pclass == CLASS_CAVALRY))
3233 msg_print(_("呪文を唱えられない!", "You cannot cast spells!"));
3235 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))
3237 msg_print(_("ダンジョンが魔法を吸収した!", "The dungeon absorbs all attempted magic!"));
3240 else if (creature_ptr->anti_magic && (creature_ptr->pclass != CLASS_BERSERKER) && (creature_ptr->pclass != CLASS_SMITH))
3242 concptr which_power = _("魔法", "magic");
3243 if (creature_ptr->pclass == CLASS_MINDCRAFTER)
3244 which_power = _("超能力", "psionic powers");
3245 else if (creature_ptr->pclass == CLASS_IMITATOR)
3246 which_power = _("ものまね", "imitation");
3247 else if (creature_ptr->pclass == CLASS_SAMURAI)
3248 which_power = _("必殺剣", "hissatsu");
3249 else if (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3250 which_power = _("鏡魔法", "mirror magic");
3251 else if (creature_ptr->pclass == CLASS_NINJA)
3252 which_power = _("忍術", "ninjutsu");
3253 else if (mp_ptr->spell_book == TV_LIFE_BOOK)
3254 which_power = _("祈り", "prayer");
3256 msg_format(_("反魔法バリアが%sを邪魔した!", "An anti-magic shell disrupts your %s!"), which_power);
3257 free_turn(creature_ptr);
3259 else if (creature_ptr->shero && (creature_ptr->pclass != CLASS_BERSERKER))
3261 msg_format(_("狂戦士化していて頭が回らない!", "You cannot think directly!"));
3262 free_turn(creature_ptr);
3266 if ((creature_ptr->pclass == CLASS_MINDCRAFTER) ||
3267 (creature_ptr->pclass == CLASS_BERSERKER) ||
3268 (creature_ptr->pclass == CLASS_NINJA) ||
3269 (creature_ptr->pclass == CLASS_MIRROR_MASTER)
3271 do_cmd_mind(creature_ptr);
3272 else if (creature_ptr->pclass == CLASS_IMITATOR)
3273 do_cmd_mane(creature_ptr, FALSE);
3274 else if (creature_ptr->pclass == CLASS_MAGIC_EATER)
3275 do_cmd_magic_eater(creature_ptr, FALSE, FALSE);
3276 else if (creature_ptr->pclass == CLASS_SAMURAI)
3277 do_cmd_hissatsu(creature_ptr);
3278 else if (creature_ptr->pclass == CLASS_BLUE_MAGE)
3279 do_cmd_cast_learned(creature_ptr);
3280 else if (creature_ptr->pclass == CLASS_SMITH)
3281 do_cmd_kaji(creature_ptr, FALSE);
3282 else if (creature_ptr->pclass == CLASS_SNIPER)
3283 do_cmd_snipe(creature_ptr);
3285 do_cmd_cast(creature_ptr);
3293 do_cmd_pet(creature_ptr);
3298 do_cmd_inscribe(creature_ptr);
3303 do_cmd_uninscribe(creature_ptr);
3308 do_cmd_activate(creature_ptr);
3313 do_cmd_eat_food(creature_ptr);
3318 do_cmd_refill(creature_ptr);
3323 do_cmd_fire(creature_ptr, SP_NONE);
3328 do_cmd_throw(creature_ptr, 1, FALSE, -1);
3333 do_cmd_aim_wand(creature_ptr);
3338 if (use_command && rogue_like_commands)
3340 do_cmd_use(creature_ptr);
3344 do_cmd_zap_rod(creature_ptr);
3350 do_cmd_quaff_potion(creature_ptr);
3355 do_cmd_read_scroll(creature_ptr);
3360 if (use_command && !rogue_like_commands)
3361 do_cmd_use(creature_ptr);
3363 do_cmd_use_staff(creature_ptr);
3368 do_cmd_racial_power(creature_ptr);
3373 do_cmd_view_map(creature_ptr);
3378 do_cmd_locate(creature_ptr);
3383 do_cmd_look(creature_ptr);
3388 do_cmd_target(creature_ptr);
3393 do_cmd_help(creature_ptr);
3398 do_cmd_query_symbol(creature_ptr);
3403 do_cmd_player_status(creature_ptr);
3413 do_cmd_pref(creature_ptr);
3418 do_cmd_reload_autopick(creature_ptr);
3423 do_cmd_edit_autopick(creature_ptr);
3428 do_cmd_macros(creature_ptr);
3433 do_cmd_visuals(creature_ptr);
3434 do_cmd_redraw(creature_ptr);
3439 do_cmd_colors(creature_ptr);
3440 do_cmd_redraw(creature_ptr);
3446 (void)combine_and_reorder_home(STORE_HOME);
3447 do_cmd_redraw(creature_ptr);
3462 do_cmd_feeling(creature_ptr);
3467 do_cmd_message_one();
3472 do_cmd_messages(old_now_message);
3477 do_cmd_checkquest(creature_ptr);
3482 now_message = old_now_message;
3483 do_cmd_redraw(creature_ptr);
3488 do_cmd_save_game(creature_ptr, FALSE);
3493 do_cmd_time(creature_ptr);
3497 case SPECIAL_KEY_QUIT:
3499 do_cmd_save_and_exit(creature_ptr);
3504 do_cmd_suicide(creature_ptr);
3509 do_cmd_diary(creature_ptr);
3514 do_cmd_knowledge(creature_ptr);
3519 do_cmd_load_screen();
3524 do_cmd_save_screen(creature_ptr);
3529 prepare_movie_hooks();
3534 spoil_random_artifact(creature_ptr, "randifact.txt");
3539 if (!creature_ptr->wild_mode) do_cmd_travel(creature_ptr);
3540 if (creature_ptr->special_defense & KATA_MUSOU)
3542 set_action(creature_ptr, ACTION_NONE);
3548 if (flush_failure) flush();
3552 sound(SOUND_ILLEGAL);
3553 if (!get_rnd_line(_("error_j.txt", "error.txt"), 0, error_m))
3558 prt(_(" '?' でヘルプが表示されます。", "Type '?' for help."), 0, 0);
3565 if (!creature_ptr->energy_use && !now_message)
3566 now_message = old_now_message;
3571 * @brief アイテムの所持種類数が超えた場合にアイテムを床に落とす処理 / Hack -- Pack Overflow
3574 static void pack_overflow(player_type *owner_ptr)
3576 if (owner_ptr->inventory_list[INVEN_PACK].k_idx == 0) return;
3578 GAME_TEXT o_name[MAX_NLEN];
3580 update_creature(owner_ptr);
3581 if (!owner_ptr->inventory_list[INVEN_PACK].k_idx) return;
3583 o_ptr = &owner_ptr->inventory_list[INVEN_PACK];
3584 disturb(owner_ptr, FALSE, TRUE);
3585 msg_print(_("ザックからアイテムがあふれた!", "Your pack overflows!"));
3587 object_desc(owner_ptr, o_name, o_ptr, 0);
3588 msg_format(_("%s(%c)を落とした。", "You drop %s (%c)."), o_name, index_to_label(INVEN_PACK));
3589 (void)drop_near(owner_ptr, o_ptr, 0, owner_ptr->y, owner_ptr->x);
3591 vary_item(owner_ptr, INVEN_PACK, -255);
3592 handle_stuff(owner_ptr);
3597 * @brief プレイヤーの行動エネルギーが充填される(=プレイヤーのターンが回る)毎に行われる処理 / process the effects per 100 energy at player speed.
3600 static void process_upkeep_with_speed(player_type *creature_ptr)
3602 if (!load && creature_ptr->enchant_energy_need > 0 && !creature_ptr->leaving)
3604 creature_ptr->enchant_energy_need -= SPEED_TO_ENERGY(creature_ptr->pspeed);
3607 if (creature_ptr->enchant_energy_need > 0) return;
3609 while (creature_ptr->enchant_energy_need <= 0)
3611 if (!load) check_music(creature_ptr);
3612 if (!load) check_hex(creature_ptr);
3613 if (!load) revenge_spell(creature_ptr);
3615 creature_ptr->enchant_energy_need += ENERGY_NEED();
3620 static void process_fishing(player_type *creature_ptr)
3622 Term_xtra(TERM_XTRA_DELAY, 10);
3626 bool success = FALSE;
3627 get_mon_num_prep(creature_ptr, monster_is_fishing_target, NULL);
3628 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);
3630 if (r_idx && one_in_(2))
3633 y = creature_ptr->y + ddy[creature_ptr->fishing_dir];
3634 x = creature_ptr->x + ddx[creature_ptr->fishing_dir];
3635 if (place_monster_aux(creature_ptr, 0, y, x, r_idx, PM_NO_KAGE))
3637 GAME_TEXT m_name[MAX_NLEN];
3638 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);
3639 msg_format(_("%sが釣れた!", "You have a good catch!"), m_name);
3646 msg_print(_("餌だけ食われてしまった!くっそ~!", "Damn! The fish stole your bait!"));
3649 disturb(creature_ptr, FALSE, TRUE);
3655 * @brief プレイヤーの行動処理 / Process the player
3658 * Notice the annoying code to handle "pack overflow", which\n
3659 * must come first just in case somebody manages to corrupt\n
3660 * the savefiles by clever use of menu commands or something.\n
3662 static void process_player(player_type *creature_ptr)
3664 if (creature_ptr->hack_mutation)
3666 msg_print(_("何か変わった気がする!", "You feel different!"));
3668 (void)gain_mutation(creature_ptr, 0);
3669 creature_ptr->hack_mutation = FALSE;
3672 if (creature_ptr->invoking_midnight_curse)
3675 activate_ty_curse(creature_ptr, FALSE, &count);
3676 creature_ptr->invoking_midnight_curse = FALSE;
3679 if (creature_ptr->phase_out)
3681 for (MONSTER_IDX m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
3683 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
3684 if (!monster_is_valid(m_ptr)) continue;
3686 m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
3687 update_monster(creature_ptr, m_idx, FALSE);
3690 print_time(creature_ptr);
3692 else if (!(load && creature_ptr->energy_need <= 0))
3694 creature_ptr->energy_need -= SPEED_TO_ENERGY(creature_ptr->pspeed);
3697 if (creature_ptr->energy_need > 0) return;
3698 if (!command_rep) print_time(creature_ptr);
3700 if (creature_ptr->resting < 0)
3702 if (creature_ptr->resting == COMMAND_ARG_REST_FULL_HEALING)
3704 if ((creature_ptr->chp == creature_ptr->mhp) &&
3705 (creature_ptr->csp >= creature_ptr->msp))
3707 set_action(creature_ptr, ACTION_NONE);
3710 else if (creature_ptr->resting == COMMAND_ARG_REST_UNTIL_DONE)
3712 if ((creature_ptr->chp == creature_ptr->mhp) &&
3713 (creature_ptr->csp >= creature_ptr->msp) &&
3714 !creature_ptr->blind && !creature_ptr->confused &&
3715 !creature_ptr->poisoned && !creature_ptr->afraid &&
3716 !creature_ptr->stun && !creature_ptr->cut &&
3717 !creature_ptr->slow && !creature_ptr->paralyzed &&
3718 !creature_ptr->image && !creature_ptr->word_recall &&
3719 !creature_ptr->alter_reality)
3721 set_action(creature_ptr, ACTION_NONE);
3726 if (creature_ptr->action == ACTION_FISH) process_fishing(creature_ptr);
3730 if (creature_ptr->running || travel.run || command_rep || (creature_ptr->action == ACTION_REST) || (creature_ptr->action == ACTION_FISH))
3736 disturb(creature_ptr, FALSE, TRUE);
3737 msg_print(_("中断しました。", "Canceled."));
3742 if (creature_ptr->riding && !creature_ptr->confused && !creature_ptr->blind)
3744 monster_type *m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
3745 monster_race *r_ptr = &r_info[m_ptr->r_idx];
3746 if (MON_CSLEEP(m_ptr))
3748 GAME_TEXT m_name[MAX_NLEN];
3749 (void)set_monster_csleep(creature_ptr, creature_ptr->riding, 0);
3750 monster_desc(creature_ptr, m_name, m_ptr, 0);
3751 msg_format(_("%^sを起こした。", "You have woken %s up."), m_name);
3754 if (MON_STUNNED(m_ptr))
3756 if (set_monster_stunned(creature_ptr, creature_ptr->riding,
3757 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_STUNNED(m_ptr) - 1)))
3759 GAME_TEXT m_name[MAX_NLEN];
3760 monster_desc(creature_ptr, m_name, m_ptr, 0);
3761 msg_format(_("%^sを朦朧状態から立ち直らせた。", "%^s is no longer stunned."), m_name);
3765 if (MON_CONFUSED(m_ptr))
3767 if (set_monster_confused(creature_ptr, creature_ptr->riding,
3768 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_CONFUSED(m_ptr) - 1)))
3770 GAME_TEXT m_name[MAX_NLEN];
3771 monster_desc(creature_ptr, m_name, m_ptr, 0);
3772 msg_format(_("%^sを混乱状態から立ち直らせた。", "%^s is no longer confused."), m_name);
3776 if (MON_MONFEAR(m_ptr))
3778 if (set_monster_monfear(creature_ptr, creature_ptr->riding,
3779 (randint0(r_ptr->level) < creature_ptr->skill_exp[GINOU_RIDING]) ? 0 : (MON_MONFEAR(m_ptr) - 1)))
3781 GAME_TEXT m_name[MAX_NLEN];
3782 monster_desc(creature_ptr, m_name, m_ptr, 0);
3783 msg_format(_("%^sを恐怖から立ち直らせた。", "%^s is no longer afraid."), m_name);
3787 handle_stuff(creature_ptr);
3791 if (creature_ptr->lightspeed)
3793 (void)set_lightspeed(creature_ptr, creature_ptr->lightspeed - 1, TRUE);
3796 if ((creature_ptr->pclass == CLASS_FORCETRAINER) && P_PTR_KI)
3798 if (P_PTR_KI < 40) P_PTR_KI = 0;
3799 else P_PTR_KI -= 40;
3800 creature_ptr->update |= (PU_BONUS);
3803 if (creature_ptr->action == ACTION_LEARN)
3806 u32b cost_frac = (creature_ptr->msp + 30L) * 256L;
3807 s64b_LSHIFT(cost, cost_frac, 16);
3808 if (s64b_cmp(creature_ptr->csp, creature_ptr->csp_frac, cost, cost_frac) < 0)
3810 creature_ptr->csp = 0;
3811 creature_ptr->csp_frac = 0;
3812 set_action(creature_ptr, ACTION_NONE);
3816 s64b_sub(&(creature_ptr->csp), &(creature_ptr->csp_frac), cost, cost_frac);
3819 creature_ptr->redraw |= PR_MANA;
3822 if (creature_ptr->special_defense & KATA_MASK)
3824 if (creature_ptr->special_defense & KATA_MUSOU)
3826 if (creature_ptr->csp < 3)
3828 set_action(creature_ptr, ACTION_NONE);
3832 creature_ptr->csp -= 2;
3833 creature_ptr->redraw |= (PR_MANA);
3838 /*** Handle actual user input ***/
3839 while (creature_ptr->energy_need <= 0)
3841 creature_ptr->window |= PW_PLAYER;
3842 creature_ptr->sutemi = FALSE;
3843 creature_ptr->counter = FALSE;
3844 creature_ptr->now_damaged = FALSE;
3846 handle_stuff(creature_ptr);
3847 move_cursor_relative(creature_ptr->y, creature_ptr->x);
3848 if (fresh_before) Term_fresh();
3850 pack_overflow(creature_ptr);
3851 if (!command_new) command_see = FALSE;
3853 free_turn(creature_ptr);
3854 if (creature_ptr->phase_out)
3856 move_cursor_relative(creature_ptr->y, creature_ptr->x);
3857 command_cmd = SPECIAL_KEY_BUILDING;
3858 process_command(creature_ptr);
3860 else if (creature_ptr->paralyzed || (creature_ptr->stun >= 100))
3862 take_turn(creature_ptr, 100);
3864 else if (creature_ptr->action == ACTION_REST)
3866 if (creature_ptr->resting > 0)
3868 creature_ptr->resting--;
3869 if (!creature_ptr->resting) set_action(creature_ptr, ACTION_NONE);
3870 creature_ptr->redraw |= (PR_STATE);
3873 take_turn(creature_ptr, 100);
3875 else if (creature_ptr->action == ACTION_FISH)
3877 take_turn(creature_ptr, 100);
3879 else if (creature_ptr->running)
3881 run_step(creature_ptr, 0);
3883 else if (travel.run)
3885 travel_step(creature_ptr);
3887 else if (command_rep)
3890 creature_ptr->redraw |= (PR_STATE);
3891 handle_stuff(creature_ptr);
3894 process_command(creature_ptr);
3898 move_cursor_relative(creature_ptr->y, creature_ptr->x);
3900 request_command(creature_ptr, FALSE);
3902 process_command(creature_ptr);
3905 pack_overflow(creature_ptr);
3906 if (creature_ptr->energy_use)
3908 if (creature_ptr->timewalk || creature_ptr->energy_use > 400)
3910 creature_ptr->energy_need += creature_ptr->energy_use * TURNS_PER_TICK / 10;
3914 creature_ptr->energy_need += (s16b)((s32b)creature_ptr->energy_use * ENERGY_NEED() / 100L);
3917 if (creature_ptr->image) creature_ptr->redraw |= (PR_MAP);
3919 for (MONSTER_IDX m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
3921 monster_type *m_ptr;
3922 monster_race *r_ptr;
3923 m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
3924 if (!monster_is_valid(m_ptr)) continue;
3925 if (!m_ptr->ml) continue;
3927 r_ptr = &r_info[m_ptr->ap_r_idx];
3928 if (!(r_ptr->flags1 & (RF1_ATTR_MULTI | RF1_SHAPECHANGER)))
3931 lite_spot(creature_ptr, m_ptr->fy, m_ptr->fx);
3934 if (repair_monsters)
3936 repair_monsters = FALSE;
3937 for (MONSTER_IDX m_idx = 1; m_idx < creature_ptr->current_floor_ptr->m_max; m_idx++)
3939 monster_type *m_ptr;
3940 m_ptr = &creature_ptr->current_floor_ptr->m_list[m_idx];
3941 if (!monster_is_valid(m_ptr)) continue;
3943 if (m_ptr->mflag & MFLAG_NICE)
3945 m_ptr->mflag &= ~(MFLAG_NICE);
3948 if (m_ptr->mflag2 & MFLAG2_MARK)
3950 if (m_ptr->mflag2 & MFLAG2_SHOW)
3952 m_ptr->mflag2 &= ~(MFLAG2_SHOW);
3953 repair_monsters = TRUE;
3957 m_ptr->mflag2 &= ~(MFLAG2_MARK);
3959 update_monster(creature_ptr, m_idx, FALSE);
3960 if (creature_ptr->health_who == m_idx) creature_ptr->redraw |= (PR_HEALTH);
3961 if (creature_ptr->riding == m_idx) creature_ptr->redraw |= (PR_UHEALTH);
3963 lite_spot(creature_ptr, m_ptr->fy, m_ptr->fx);
3969 if (creature_ptr->pclass == CLASS_IMITATOR)
3971 if (creature_ptr->mane_num > (creature_ptr->lev > 44 ? 3 : creature_ptr->lev > 29 ? 2 : 1))
3973 creature_ptr->mane_num--;
3974 for (int j = 0; j < creature_ptr->mane_num; j++)
3976 creature_ptr->mane_spell[j] = creature_ptr->mane_spell[j + 1];
3977 creature_ptr->mane_dam[j] = creature_ptr->mane_dam[j + 1];
3981 creature_ptr->new_mane = FALSE;
3982 creature_ptr->redraw |= (PR_IMITATION);
3985 if (creature_ptr->action == ACTION_LEARN)
3987 creature_ptr->new_mane = FALSE;
3988 creature_ptr->redraw |= (PR_STATE);
3991 if (creature_ptr->timewalk && (creature_ptr->energy_need > -1000))
3994 creature_ptr->redraw |= (PR_MAP);
3995 creature_ptr->update |= (PU_MONSTERS);
3996 creature_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
3998 msg_print(_("「時は動きだす…」", "You feel time flowing around you once more."));
4000 creature_ptr->timewalk = FALSE;
4001 creature_ptr->energy_need = ENERGY_NEED();
4003 handle_stuff(creature_ptr);
4007 if (!creature_ptr->playing || creature_ptr->is_dead)
4009 creature_ptr->timewalk = FALSE;
4013 if (creature_ptr->energy_use && creature_ptr->reset_concent)
4014 reset_concentration(creature_ptr, TRUE);
4016 if (creature_ptr->leaving) break;
4019 update_smell(creature_ptr->current_floor_ptr, creature_ptr);
4024 * @brief 現在プレイヤーがいるダンジョンの全体処理 / Interact with the current dungeon level.
4028 * この関数から現在の階層を出る、プレイヤーがキャラが死ぬ、
4029 * ゲームを終了するかのいずれかまでループする。
4032 * This function will not exit until the level is completed,\n
4033 * the user dies, or the game is terminated.\n
4036 static void dungeon(player_type *player_ptr, bool load_game)
4038 floor_type *floor_ptr = player_ptr->current_floor_ptr;
4039 floor_ptr->base_level = floor_ptr->dun_level;
4040 current_world_ptr->is_loading_now = FALSE;
4041 player_ptr->leaving = FALSE;
4049 player_ptr->pet_t_m_idx = 0;
4050 player_ptr->riding_t_m_idx = 0;
4051 player_ptr->ambush_flag = FALSE;
4052 health_track(player_ptr, 0);
4053 repair_monsters = TRUE;
4054 repair_objects = TRUE;
4056 disturb(player_ptr, TRUE, TRUE);
4057 int quest_num = quest_num = quest_number(player_ptr, floor_ptr->dun_level);
4060 r_info[quest[quest_num].r_idx].flags1 |= RF1_QUESTOR;
4063 if (player_ptr->max_plv < player_ptr->lev)
4065 player_ptr->max_plv = player_ptr->lev;
4068 if ((max_dlv[player_ptr->dungeon_idx] < floor_ptr->dun_level) && !floor_ptr->inside_quest)
4070 max_dlv[player_ptr->dungeon_idx] = floor_ptr->dun_level;
4071 if (record_maxdepth) exe_write_diary(player_ptr, DIARY_MAXDEAPTH, floor_ptr->dun_level, NULL);
4074 (void)calculate_upkeep(player_ptr);
4075 panel_bounds_center();
4076 verify_panel(player_ptr);
4079 current_world_ptr->character_xtra = TRUE;
4080 player_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER | PW_MONSTER | PW_OVERHEAD | PW_DUNGEON);
4081 player_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_EQUIPPY | PR_MAP);
4082 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);
4083 handle_stuff(player_ptr);
4085 current_world_ptr->character_xtra = FALSE;
4086 player_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
4087 player_ptr->update |= (PU_COMBINE | PU_REORDER);
4088 handle_stuff(player_ptr);
4091 if (quest_num && (is_fixed_quest_idx(quest_num) &&
4092 !((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT) ||
4093 !(quest[quest_num].flags & QUEST_FLAG_PRESET))))
4094 do_cmd_feeling(player_ptr);
4096 if (player_ptr->phase_out)
4100 player_ptr->energy_need = 0;
4101 update_gambling_monsters(player_ptr);
4105 msg_print(_("試合開始!", "Ready..Fight!"));
4110 if ((player_ptr->pclass == CLASS_BARD) && (SINGING_SONG_EFFECT(player_ptr) > MUSIC_DETECT))
4111 SINGING_SONG_EFFECT(player_ptr) = MUSIC_DETECT;
4113 if (!player_ptr->playing || player_ptr->is_dead) return;
4115 if (!floor_ptr->inside_quest && (player_ptr->dungeon_idx == DUNGEON_ANGBAND))
4117 quest_discovery(random_quest_number(player_ptr, floor_ptr->dun_level));
4118 floor_ptr->inside_quest = random_quest_number(player_ptr, floor_ptr->dun_level);
4120 if ((floor_ptr->dun_level == d_info[player_ptr->dungeon_idx].maxdepth) && d_info[player_ptr->dungeon_idx].final_guardian)
4122 if (r_info[d_info[player_ptr->dungeon_idx].final_guardian].max_num)
4124 msg_format("この階には%sの主である%sが棲んでいる。",
4125 d_name + d_info[player_ptr->dungeon_idx].name,
4126 r_name + r_info[d_info[player_ptr->dungeon_idx].final_guardian].name);
4128 msg_format("%^s lives in this level as the keeper of %s.",
4129 r_name + r_info[d_info[player_ptr->dungeon_idx].final_guardian].name,
4130 d_name + d_info[player_ptr->dungeon_idx].name);
4134 if (!load_game && (player_ptr->special_defense & NINJA_S_STEALTH)) set_superstealth(player_ptr, FALSE);
4136 floor_ptr->monster_level = floor_ptr->base_level;
4137 floor_ptr->object_level = floor_ptr->base_level;
4138 current_world_ptr->is_loading_now = TRUE;
4139 if (player_ptr->energy_need > 0 && !player_ptr->phase_out &&
4140 (floor_ptr->dun_level || player_ptr->leaving_dungeon || floor_ptr->inside_arena))
4141 player_ptr->energy_need = 0;
4143 player_ptr->leaving_dungeon = FALSE;
4144 mproc_init(floor_ptr);
4148 if ((floor_ptr->m_cnt + 32 > current_world_ptr->max_m_idx) && !player_ptr->phase_out)
4149 compact_monsters(player_ptr, 64);
4151 if ((floor_ptr->m_cnt + 32 < floor_ptr->m_max) && !player_ptr->phase_out)
4152 compact_monsters(player_ptr, 0);
4154 if (floor_ptr->o_cnt + 32 > current_world_ptr->max_o_idx)
4155 compact_objects(player_ptr, 64);
4157 if (floor_ptr->o_cnt + 32 < floor_ptr->o_max)
4158 compact_objects(player_ptr, 0);
4160 process_player(player_ptr);
4161 process_upkeep_with_speed(player_ptr);
4162 handle_stuff(player_ptr);
4164 move_cursor_relative(player_ptr->y, player_ptr->x);
4165 if (fresh_after) Term_fresh();
4167 if (!player_ptr->playing || player_ptr->is_dead) break;
4169 process_monsters(player_ptr);
4170 handle_stuff(player_ptr);
4172 move_cursor_relative(player_ptr->y, player_ptr->x);
4173 if (fresh_after) Term_fresh();
4175 if (!player_ptr->playing || player_ptr->is_dead) break;
4177 process_world(player_ptr);
4178 handle_stuff(player_ptr);
4180 move_cursor_relative(player_ptr->y, player_ptr->x);
4181 if (fresh_after) Term_fresh();
4183 if (!player_ptr->playing || player_ptr->is_dead) break;
4185 current_world_ptr->game_turn++;
4186 if (current_world_ptr->dungeon_turn < current_world_ptr->dungeon_turn_limit)
4188 if (!player_ptr->wild_mode || wild_regen) current_world_ptr->dungeon_turn++;
4189 else if (player_ptr->wild_mode && !(current_world_ptr->game_turn % ((MAX_HGT + MAX_WID) / 2))) current_world_ptr->dungeon_turn++;
4192 prevent_turn_overflow(player_ptr);
4194 if (player_ptr->leaving) break;
4196 if (wild_regen) wild_regen--;
4199 if (quest_num && !(r_info[quest[quest_num].r_idx].flags1 & RF1_UNIQUE))
4201 r_info[quest[quest_num].r_idx].flags1 &= ~RF1_QUESTOR;
4204 if (player_ptr->playing && !player_ptr->is_dead)
4207 * Maintain Unique monsters and artifact, save current
4208 * floor, then prepare next floor
4210 leave_floor(player_ptr);
4211 reinit_wilderness = FALSE;
4219 * @brief 全ユーザプロファイルをロードする / Load some "user pref files"
4220 * @paaram player_ptr プレーヤーへの参照ポインタ
4223 * Modified by Arcum Dagsson to support
4224 * separate macro files for different realms.
4226 static void load_all_pref_files(player_type *player_ptr)
4229 sprintf(buf, "user.prf");
4230 process_pref_file(player_ptr, buf);
4231 sprintf(buf, "user-%s.prf", ANGBAND_SYS);
4232 process_pref_file(player_ptr, buf);
4233 sprintf(buf, "%s.prf", rp_ptr->title);
4234 process_pref_file(player_ptr, buf);
4235 sprintf(buf, "%s.prf", cp_ptr->title);
4236 process_pref_file(player_ptr, buf);
4237 sprintf(buf, "%s.prf", player_ptr->base_name);
4238 process_pref_file(player_ptr, buf);
4239 if (player_ptr->realm1 != REALM_NONE)
4241 sprintf(buf, "%s.prf", realm_names[player_ptr->realm1]);
4242 process_pref_file(player_ptr, buf);
4245 if (player_ptr->realm2 != REALM_NONE)
4247 sprintf(buf, "%s.prf", realm_names[player_ptr->realm2]);
4248 process_pref_file(player_ptr, buf);
4251 autopick_load_pref(player_ptr, FALSE);
4256 * @brief 1ゲームプレイの主要ルーチン / Actually play a game
4259 * If the "new_game" parameter is true, then, after loading the
4260 * savefile, we will commit suicide, if necessary, to allow the
4261 * player to start a new game.
4263 void play_game(player_type *player_ptr, bool new_game)
4265 bool load_game = TRUE;
4266 bool init_random_seed = FALSE;
4276 else if (chuukei_server)
4278 prepare_chuukei_hooks();
4284 reset_visuals(player_ptr);
4289 player_ptr->hack_mutation = FALSE;
4290 current_world_ptr->character_icky = TRUE;
4291 Term_activate(angband_term[0]);
4292 angband_term[0]->resize_hook = resize_map;
4293 for (MONSTER_IDX i = 1; i < 8; i++)
4295 if (angband_term[i])
4297 angband_term[i]->resize_hook = redraw_window;
4301 (void)Term_set_cursor(0);
4302 if (!load_player(player_ptr))
4304 quit(_("セーブファイルが壊れています", "broken savefile"));
4307 extract_option_vars();
4308 if (player_ptr->wait_report_score)
4313 if (!get_check_strict(_("待機していたスコア登録を今行ないますか?", "Do you register score now? "), CHECK_NO_HISTORY))
4316 player_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
4317 update_creature(player_ptr);
4318 player_ptr->is_dead = TRUE;
4319 current_world_ptr->start_time = (u32b)time(NULL);
4320 signals_ignore_tstp();
4321 current_world_ptr->character_icky = TRUE;
4322 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
4323 highscore_fd = fd_open(buf, O_RDWR);
4325 /* 町名消失バグ対策(#38205)のためここで世界マップ情報を読み出す */
4326 process_dungeon_file(player_ptr, "w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
4327 success = send_world_score(player_ptr, TRUE);
4329 if (!success && !get_check_strict(_("スコア登録を諦めますか?", "Do you give up score registration? "), CHECK_NO_HISTORY))
4331 prt(_("引き続き待機します。", "standing by for future registration..."), 0, 0);
4336 player_ptr->wait_report_score = FALSE;
4337 top_twenty(player_ptr);
4338 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
4341 (void)fd_close(highscore_fd);
4343 signals_handle_tstp();
4348 current_world_ptr->creating_savefile = new_game;
4350 if (!current_world_ptr->character_loaded)
4353 current_world_ptr->character_dungeon = FALSE;
4354 init_random_seed = TRUE;
4355 init_saved_floors(player_ptr, FALSE);
4359 init_saved_floors(player_ptr, TRUE);
4364 process_player_name(player_ptr, FALSE);
4367 if (init_random_seed)
4372 floor_type *floor_ptr = player_ptr->current_floor_ptr;
4375 current_world_ptr->character_dungeon = FALSE;
4377 floor_ptr->dun_level = 0;
4378 floor_ptr->inside_quest = 0;
4379 floor_ptr->inside_arena = FALSE;
4380 player_ptr->phase_out = FALSE;
4383 current_world_ptr->seed_flavor = randint0(0x10000000);
4384 current_world_ptr->seed_town = randint0(0x10000000);
4386 player_birth(player_ptr);
4387 counts_write(player_ptr, 2, 0);
4388 player_ptr->count = 0;
4390 determine_bounty_uniques(player_ptr);
4391 determine_daily_bounty(player_ptr, FALSE);
4392 wipe_o_list(floor_ptr);
4396 write_level = FALSE;
4397 exe_write_diary(player_ptr, DIARY_GAMESTART, 1,
4399 " ---- Restart Game ----"));
4402 * todo もう2.2.Xなので互換性は打ち切ってもいいのでは?
4403 * 1.0.9 以前はセーブ前に player_ptr->riding = -1 としていたので、再設定が必要だった。
4404 * もう不要だが、以前のセーブファイルとの互換のために残しておく。
4406 if (player_ptr->riding == -1)
4408 player_ptr->riding = 0;
4409 for (MONSTER_IDX i = floor_ptr->m_max; i > 0; i--)
4411 if (player_bold(player_ptr, floor_ptr->m_list[i].fy, floor_ptr->m_list[i].fx))
4413 player_ptr->riding = i;
4420 current_world_ptr->creating_savefile = FALSE;
4422 player_ptr->teleport_town = FALSE;
4423 player_ptr->sutemi = FALSE;
4424 current_world_ptr->timewalk_m_idx = 0;
4425 player_ptr->now_damaged = FALSE;
4427 current_world_ptr->start_time = time(NULL) - 1;
4428 record_o_name[0] = '\0';
4430 panel_row_min = floor_ptr->height;
4431 panel_col_min = floor_ptr->width;
4432 if (player_ptr->pseikaku == SEIKAKU_SEXY)
4433 s_info[player_ptr->pclass].w_max[TV_HAFTED - TV_WEAPON_BEGIN][SV_WHIP] = WEAPON_EXP_MASTER;
4435 set_floor_and_wall(player_ptr->dungeon_idx);
4437 prt(_("お待ち下さい...", "Please wait..."), 0, 0);
4442 if (enter_wizard_mode(player_ptr))
4444 current_world_ptr->wizard = TRUE;
4446 if (player_ptr->is_dead || !player_ptr->y || !player_ptr->x)
4448 init_saved_floors(player_ptr, TRUE);
4449 floor_ptr->inside_quest = 0;
4450 player_ptr->y = player_ptr->x = 10;
4453 else if (player_ptr->is_dead)
4455 quit("Already dead.");
4459 if (!floor_ptr->dun_level && !floor_ptr->inside_quest)
4461 process_dungeon_file(player_ptr, "w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x);
4462 init_flags = INIT_ONLY_BUILDINGS;
4463 process_dungeon_file(player_ptr, "t_info.txt", 0, 0, MAX_HGT, MAX_WID);
4464 select_floor_music(player_ptr);
4467 if (!current_world_ptr->character_dungeon)
4469 change_floor(player_ptr);
4473 if (player_ptr->panic_save)
4475 if (!player_ptr->y || !player_ptr->x)
4477 msg_print(_("プレイヤーの位置がおかしい。フロアを再生成します。", "What a strange player location, regenerate the dungeon floor."));
4478 change_floor(player_ptr);
4481 if (!player_ptr->y || !player_ptr->x) player_ptr->y = player_ptr->x = 10;
4483 player_ptr->panic_save = 0;
4487 current_world_ptr->character_generated = TRUE;
4488 current_world_ptr->character_icky = FALSE;
4493 sprintf(buf, _("%sに降り立った。", "You are standing in the %s."), map_name(player_ptr));
4494 exe_write_diary(player_ptr, DIARY_DESCRIPTION, 0, buf);
4497 player_ptr->playing = TRUE;
4498 reset_visuals(player_ptr);
4499 load_all_pref_files(player_ptr);
4502 player_outfit(player_ptr);
4505 Term_xtra(TERM_XTRA_REACT, 0);
4507 player_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER);
4508 player_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_DUNGEON | PW_MONSTER | PW_OBJECT);
4509 handle_stuff(player_ptr);
4511 if (arg_force_original) rogue_like_commands = FALSE;
4512 if (arg_force_roguelike) rogue_like_commands = TRUE;
4514 if (player_ptr->chp < 0) player_ptr->is_dead = TRUE;
4516 if (player_ptr->prace == RACE_ANDROID) calc_android_exp(player_ptr);
4518 if (new_game && ((player_ptr->pclass == CLASS_CAVALRY) || (player_ptr->pclass == CLASS_BEASTMASTER)))
4520 monster_type *m_ptr;
4521 MONRACE_IDX pet_r_idx = ((player_ptr->pclass == CLASS_CAVALRY) ? MON_HORSE : MON_YASE_HORSE);
4522 monster_race *r_ptr = &r_info[pet_r_idx];
4523 place_monster_aux(player_ptr, 0, player_ptr->y, player_ptr->x - 1, pet_r_idx,
4524 (PM_FORCE_PET | PM_NO_KAGE));
4525 m_ptr = &floor_ptr->m_list[hack_m_idx_ii];
4526 m_ptr->mspeed = r_ptr->speed;
4527 m_ptr->maxhp = r_ptr->hdice*(r_ptr->hside + 1) / 2;
4528 m_ptr->max_maxhp = m_ptr->maxhp;
4529 m_ptr->hp = r_ptr->hdice*(r_ptr->hside + 1) / 2;
4530 m_ptr->dealt_damage = 0;
4531 m_ptr->energy_need = ENERGY_NEED() + ENERGY_NEED();
4534 (void)combine_and_reorder_home(STORE_HOME);
4535 (void)combine_and_reorder_home(STORE_MUSEUM);
4536 select_floor_music(player_ptr);
4540 dungeon(player_ptr, load_game);
4541 current_world_ptr->character_xtra = TRUE;
4542 handle_stuff(player_ptr);
4544 current_world_ptr->character_xtra = FALSE;
4546 health_track(player_ptr, 0);
4547 forget_lite(floor_ptr);
4548 forget_view(floor_ptr);
4549 clear_mon_lite(floor_ptr);
4550 if (!player_ptr->playing && !player_ptr->is_dead) break;
4552 wipe_o_list(floor_ptr);
4553 if (!player_ptr->is_dead) wipe_monsters_list(player_ptr);
4557 if (player_ptr->playing && player_ptr->is_dead)
4559 if (floor_ptr->inside_arena)
4561 floor_ptr->inside_arena = FALSE;
4562 if (player_ptr->arena_number > MAX_ARENA_MONS)
4563 player_ptr->arena_number++;
4565 player_ptr->arena_number = -1 - player_ptr->arena_number;
4566 player_ptr->is_dead = FALSE;
4567 player_ptr->chp = 0;
4568 player_ptr->chp_frac = 0;
4569 player_ptr->exit_bldg = TRUE;
4570 reset_tim_flags(player_ptr);
4571 prepare_change_floor_mode(player_ptr, CFM_SAVE_FLOORS | CFM_RAND_CONNECT);
4572 leave_floor(player_ptr);
4576 if ((current_world_ptr->wizard || cheat_live) && !get_check(_("死にますか? ", "Die? ")))
4578 cheat_death(player_ptr);
4583 if (player_ptr->is_dead) break;
4585 change_floor(player_ptr);
4588 close_game(player_ptr);
4594 * @brief ゲームターンからの実時間換算を行うための補正をかける
4595 * @param hoge ゲームターン
4596 * @details アンデッド種族は18:00からゲームを開始するので、この修正を予め行う。
4597 * @return 修正をかけた後のゲームターン
4599 s32b turn_real(player_type *player_ptr, s32b hoge)
4601 switch (player_ptr->start_race)
4607 return hoge - (TURNS_PER_TICK * TOWN_DAWN * 3 / 4);
4615 * @brief ターンのオーバーフローに対する対処
4616 * @param player_ptr プレーヤーへの参照ポインタ
4617 * @details ターン及びターンを記録する変数をターンの限界の1日前まで巻き戻す.
4618 * @return 修正をかけた後のゲームターン
4620 void prevent_turn_overflow(player_type *player_ptr)
4622 if (current_world_ptr->game_turn < current_world_ptr->game_turn_limit) return;
4624 int rollback_days = 1 + (current_world_ptr->game_turn - current_world_ptr->game_turn_limit) / (TURNS_PER_TICK * TOWN_DAWN);
4625 s32b rollback_turns = TURNS_PER_TICK * TOWN_DAWN * rollback_days;
4627 if (current_world_ptr->game_turn > rollback_turns) current_world_ptr->game_turn -= rollback_turns;
4628 else current_world_ptr->game_turn = 1;
4629 floor_type *floor_ptr = player_ptr->current_floor_ptr;
4630 if (floor_ptr->generated_turn > rollback_turns) floor_ptr->generated_turn -= rollback_turns;
4631 else floor_ptr->generated_turn = 1;
4632 if (current_world_ptr->arena_start_turn > rollback_turns) current_world_ptr->arena_start_turn -= rollback_turns;
4633 else current_world_ptr->arena_start_turn = 1;
4634 if (player_ptr->feeling_turn > rollback_turns) player_ptr->feeling_turn -= rollback_turns;
4635 else player_ptr->feeling_turn = 1;
4637 for (int i = 1; i < max_towns; i++)
4639 for (int j = 0; j < MAX_STORES; j++)
4641 store_type *st_ptr = &town_info[i].store[j];
4643 if (st_ptr->last_visit > -10L * TURNS_PER_TICK * STORE_TICKS)
4645 st_ptr->last_visit -= rollback_turns;
4646 if (st_ptr->last_visit < -10L * TURNS_PER_TICK * STORE_TICKS) st_ptr->last_visit = -10L * TURNS_PER_TICK * STORE_TICKS;
4649 if (st_ptr->store_open)
4651 st_ptr->store_open -= rollback_turns;
4652 if (st_ptr->store_open < 1) st_ptr->store_open = 1;
4661 * Close up the current game (player may or may not be dead)
4662 * @param creature_ptr プレーヤーへの参照ポインタ
4666 * This function is called only from "main.c" and "signals.c".
4669 void close_game(player_type *player_ptr)
4672 bool do_send = TRUE;
4673 handle_stuff(player_ptr);
4678 signals_ignore_tstp();
4680 current_world_ptr->character_icky = TRUE;
4681 path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw");
4683 highscore_fd = fd_open(buf, O_RDWR);
4686 if (player_ptr->is_dead)
4688 if (current_world_ptr->total_winner) kingly(player_ptr);
4690 if (!cheat_save || get_check(_("死んだデータをセーブしますか? ", "Save death? ")))
4692 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
4694 else do_send = FALSE;
4696 print_tomb(player_ptr);
4699 show_info(player_ptr);
4702 if (check_score(player_ptr))
4704 if ((!send_world_score(player_ptr, do_send)))
4706 if (get_check_strict(_("後でスコアを登録するために待機しますか?", "Stand by for later score registration? "),
4707 (CHECK_NO_ESCAPE | CHECK_NO_HISTORY)))
4709 player_ptr->wait_report_score = TRUE;
4710 player_ptr->is_dead = FALSE;
4711 if (!save_player(player_ptr)) msg_print(_("セーブ失敗!", "death save failed!"));
4714 if (!player_ptr->wait_report_score)
4715 (void)top_twenty(player_ptr);
4717 else if (highscore_fd >= 0)
4719 display_scores_aux(0, 10, -1, NULL);
4724 do_cmd_save_game(player_ptr, FALSE);
4725 prt(_("リターンキーか ESC キーを押して下さい。", "Press Return (or Escape)."), 0, 40);
4726 play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_EXIT);
4727 if (inkey() != ESCAPE) predict_score(player_ptr);
4730 (void)fd_close(highscore_fd);
4732 clear_saved_floor_files(player_ptr);
4733 signals_handle_tstp();
4738 * @brief 全更新処理をチェックして処理していく
4739 * Handle "player_ptr->update" and "player_ptr->redraw" and "player_ptr->window"
4742 void handle_stuff(player_type *player_ptr)
4744 if (player_ptr->update) update_creature(player_ptr);
4745 if (player_ptr->redraw) redraw_stuff(player_ptr);
4746 if (player_ptr->window) window_stuff(player_ptr);
4750 void update_output(player_type *player_ptr)
4752 if (player_ptr->redraw) redraw_stuff(player_ptr);
4753 if (player_ptr->window) window_stuff(player_ptr);