X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fdungeon.c;h=430e853e6de8ee95e44b2abdd911d56f0c8f28f7;hb=cd01ea3d5b0cc0d80ec2b7de490f9fbae23d2382;hp=40ba4dbb4829577c8e276dbd589e01109771174a;hpb=abe62e87d7a0cb6311bcdbabb7b4ebceec25191c;p=hengband%2Fhengband.git diff --git a/src/dungeon.c b/src/dungeon.c index 40ba4dbb4..430e853e6 100644 --- a/src/dungeon.c +++ b/src/dungeon.c @@ -13,10 +13,12 @@ #include "angband.h" #include "cmd-activate.h" #include "cmd-eat.h" +#include "cmd-hissatsu.h" #include "cmd-item.h" #include "cmd-magiceat.h" #include "cmd-quaff.h" #include "cmd-read.h" +#include "cmd-smith.h" #include "cmd-usestaff.h" #include "cmd-zaprod.h" #include "cmd-zapwand.h" @@ -28,15 +30,22 @@ #include "spells-summon.h" #include "spells-object.h" #include "spells-status.h" +#include "spells-floor.h" #include "monsterrace-hook.h" #include "world.h" #include "mutation.h" #include "quest.h" #include "artifact.h" #include "avatar.h" +#include "player-move.h" #include "player-status.h" #include "cmd-spell.h" #include "realm-hex.h" +#include "object-hook.h" +#include "wild.h" +#include "monster-status.h" +#include "floor-save.h" + static bool load = TRUE; /*!<ロード処理中の分岐フラグ*/ static int wild_regen = 20; /*!<広域マップ移動時の自然回復処理カウンタ(広域マップ1マス毎に20回処理を基本とする)*/ @@ -536,14 +545,14 @@ static void pattern_teleport(void) /* Only downward in ironman mode */ if (ironman_downward) - min_level = dun_level; + min_level = current_floor_ptr->dun_level; /* Maximum level */ if (p_ptr->dungeon_idx == DUNGEON_ANGBAND) { - if (dun_level > 100) + if (current_floor_ptr->dun_level > 100) max_level = MAX_DEPTH - 1; - else if (dun_level == 100) + else if (current_floor_ptr->dun_level == 100) max_level = 100; } else @@ -556,7 +565,7 @@ static void pattern_teleport(void) sprintf(ppp, _("テレポート先:(%d-%d)", "Teleport to level (%d-%d): "), (int)min_level, (int)max_level); /* Default */ - sprintf(tmp_val, "%d", (int)dun_level); + sprintf(tmp_val, "%d", (int)current_floor_ptr->dun_level); /* Ask for a level */ if (!get_string(ppp, tmp_val, 10)) return; @@ -573,11 +582,7 @@ static void pattern_teleport(void) { return; } - - /* Paranoia */ if (command_arg < min_level) command_arg = (COMMAND_ARG)min_level; - - /* Paranoia */ if (command_arg > max_level) command_arg = (COMMAND_ARG)max_level; /* Accept request */ @@ -586,7 +591,7 @@ static void pattern_teleport(void) if (autosave_l) do_cmd_save_game(TRUE); /* Change level */ - dun_level = command_arg; + current_floor_ptr->dun_level = command_arg; leave_quest_check(); @@ -600,48 +605,10 @@ static void pattern_teleport(void) * and create a first saved floor */ prepare_change_floor_mode(CFM_FIRST_FLOOR); - - /* Leaving */ p_ptr->leaving = TRUE; } /*! - * @brief 種族アンバライトが出血時パターンの上に乗った際のペナルティ処理 - * @return なし - */ -static void wreck_the_pattern(void) -{ - int to_ruin = 0; - POSITION r_y, r_x; - int pattern_type = f_info[grid_array[p_ptr->y][p_ptr->x].feat].subtype; - - if (pattern_type == PATTERN_TILE_WRECKED) - { - /* Ruined already */ - return; - } - - msg_print(_("パターンを血で汚してしまった!", "You bleed on the Pattern!")); - msg_print(_("何か恐ろしい事が起こった!", "Something terrible happens!")); - - if (!IS_INVULN()) take_hit(DAMAGE_NOESCAPE, damroll(10, 8), _("パターン損壊", "corrupting the Pattern"), -1); - to_ruin = randint1(45) + 35; - - while (to_ruin--) - { - scatter(&r_y, &r_x, p_ptr->y, p_ptr->x, 4, 0); - - if (pattern_tile(r_y, r_x) && - (f_info[grid_array[r_y][r_x].feat].subtype != PATTERN_TILE_WRECKED)) - { - cave_set_feat(r_y, r_x, feat_pattern_corrupted); - } - } - - cave_set_feat(p_ptr->y, p_ptr->x, feat_pattern_corrupted); -} - -/*! * @brief 各種パターン地形上の特別な処理 / Returns TRUE if we are on the Pattern... * @return 実際にパターン地形上にプレイヤーが居た場合はTRUEを返す。 */ @@ -657,7 +624,7 @@ static bool pattern_effect(void) wreck_the_pattern(); } - pattern_type = f_info[grid_array[p_ptr->y][p_ptr->x].feat].subtype; + pattern_type = f_info[current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].feat].subtype; switch (pattern_type) { @@ -898,12 +865,10 @@ static void regen_monsters(void) for (i = 1; i < m_max; i++) { /* Check the i'th monster */ - monster_type *m_ptr = &m_list[i]; + monster_type *m_ptr = ¤t_floor_ptr->m_list[i]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; - - /* Skip dead monsters */ - if (!m_ptr->r_idx) continue; + if (!monster_is_valid(m_ptr)) continue; /* Allow regeneration (if needed) */ if (m_ptr->hp < m_ptr->maxhp) @@ -1022,7 +987,7 @@ static void notice_lite_change(object_type *o_ptr) else if (o_ptr->name2 == EGO_LITE_LONG) { if ((o_ptr->xtra4 < 50) && (!(o_ptr->xtra4 % 5)) - && (turn % (TURNS_PER_TICK*2))) + && (current_world_ptr->game_turn % (TURNS_PER_TICK*2))) { if (disturb_minor) disturb(FALSE, TRUE); msg_print(_("明かりが微かになってきている。", "Your light is growing faint.")); @@ -1037,81 +1002,6 @@ static void notice_lite_change(object_type *o_ptr) } } -/*! - * @brief クエスト階層から離脱する際の処理 - * @return なし - */ -void leave_quest_check(void) -{ - /* Save quest number for dungeon pref file ($LEAVING_QUEST) */ - leaving_quest = p_ptr->inside_quest; - - /* Leaving an 'only once' quest marks it as failed */ - if (leaving_quest) - { - quest_type* const q_ptr = &quest[leaving_quest]; - - if(((q_ptr->flags & QUEST_FLAG_ONCE) || (q_ptr->type == QUEST_TYPE_RANDOM)) && - (q_ptr->status == QUEST_STATUS_TAKEN)) - { - q_ptr->status = QUEST_STATUS_FAILED; - q_ptr->complev = p_ptr->lev; - update_playtime(); - q_ptr->comptime = playtime; - - /* Additional settings */ - switch (q_ptr->type) - { - case QUEST_TYPE_TOWER: - quest[QUEST_TOWER1].status = QUEST_STATUS_FAILED; - quest[QUEST_TOWER1].complev = p_ptr->lev; - break; - case QUEST_TYPE_FIND_ARTIFACT: - a_info[q_ptr->k_idx].gen_flags &= ~(TRG_QUESTITEM); - break; - case QUEST_TYPE_RANDOM: - r_info[q_ptr->r_idx].flags1 &= ~(RF1_QUESTOR); - - /* Floor of random quest will be blocked */ - prepare_change_floor_mode(CFM_NO_RETURN); - break; - } - - /* Record finishing a quest */ - if (q_ptr->type == QUEST_TYPE_RANDOM) - { - if (record_rand_quest) do_cmd_write_nikki(NIKKI_RAND_QUEST_F, leaving_quest, NULL); - } - else - { - if (record_fix_quest) do_cmd_write_nikki(NIKKI_FIX_QUEST_F, leaving_quest, NULL); - } - } - } -} - -/*! - * @brief 「塔」クエストの各階層から離脱する際の処理 - * @return なし - */ -void leave_tower_check(void) -{ - leaving_quest = p_ptr->inside_quest; - /* Check for Tower Quest */ - if (leaving_quest && - (quest[leaving_quest].type == QUEST_TYPE_TOWER) && - (quest[QUEST_TOWER1].status != QUEST_STATUS_COMPLETED)) - { - if(quest[leaving_quest].type == QUEST_TYPE_TOWER) - { - quest[QUEST_TOWER1].status = QUEST_STATUS_FAILED; - quest[QUEST_TOWER1].complev = p_ptr->lev; - update_playtime(); - quest[QUEST_TOWER1].comptime = playtime; - } - } -} - /*! * @brief !!を刻んだ魔道具の時間経過による再充填を知らせる処理 / If player has inscribed the object with "!!", let him know when it's recharged. -LM- @@ -1177,7 +1067,7 @@ static void check_music(void) if (p_ptr->anti_magic) { - stop_singing(); + stop_singing(p_ptr); return; } @@ -1192,7 +1082,7 @@ static void check_music(void) if (s64b_cmp(p_ptr->csp, p_ptr->csp_frac, need_mana, need_mana_frac) < 0) { - stop_singing(); + stop_singing(p_ptr); return; } else @@ -1214,11 +1104,11 @@ static void check_music(void) if (p_ptr->spell_exp[spell] < SPELL_EXP_BEGINNER) p_ptr->spell_exp[spell] += 5; else if(p_ptr->spell_exp[spell] < SPELL_EXP_SKILLED) - { if (one_in_(2) && (dun_level > 4) && ((dun_level + 10) > p_ptr->lev)) p_ptr->spell_exp[spell] += 1; } + { if (one_in_(2) && (current_floor_ptr->dun_level > 4) && ((current_floor_ptr->dun_level + 10) > p_ptr->lev)) p_ptr->spell_exp[spell] += 1; } else if(p_ptr->spell_exp[spell] < SPELL_EXP_EXPERT) - { if (one_in_(5) && ((dun_level + 5) > p_ptr->lev) && ((dun_level + 5) > s_ptr->slevel)) p_ptr->spell_exp[spell] += 1; } + { if (one_in_(5) && ((current_floor_ptr->dun_level + 5) > p_ptr->lev) && ((current_floor_ptr->dun_level + 5) > s_ptr->slevel)) p_ptr->spell_exp[spell] += 1; } else if(p_ptr->spell_exp[spell] < SPELL_EXP_MASTER) - { if (one_in_(5) && ((dun_level + 5) > p_ptr->lev) && (dun_level > s_ptr->slevel)) p_ptr->spell_exp[spell] += 1; } + { if (one_in_(5) && ((current_floor_ptr->dun_level + 5) > p_ptr->lev) && (current_floor_ptr->dun_level > s_ptr->slevel)) p_ptr->spell_exp[spell] += 1; } /* Do any effects of continual song */ do_spell(REALM_MUSIC, spell, SPELL_CONT); @@ -1309,7 +1199,7 @@ static void process_world_aux_digestion(void) } /* Digest normally -- Every 50 game turns */ - else if (!(turn % (TURNS_PER_TICK * 5))) + else if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 5))) { /* Basic digestion rate based on speed */ int digestion = SPEED_TO_ENERGY(p_ptr->pspeed); @@ -1368,7 +1258,7 @@ static void process_world_aux_digestion(void) */ static void process_world_aux_hp_and_sp(void) { - feature_type *f_ptr = &f_info[grid_array[p_ptr->y][p_ptr->x].feat]; + feature_type *f_ptr = &f_info[current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].feat]; bool cave_no_regen = FALSE; int upkeep_factor = 0; @@ -1433,9 +1323,9 @@ static void process_world_aux_hp_and_sp(void) /* (Vampires) Take damage from sunlight */ if (prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) { - if (!dun_level && !p_ptr->resist_lite && !IS_INVULN() && is_daytime()) + if (!current_floor_ptr->dun_level && !p_ptr->resist_lite && !IS_INVULN() && is_daytime()) { - if ((grid_array[p_ptr->y][p_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW) + if ((current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW) { msg_print(_("日光があなたのアンデッドの肉体を焼き焦がした!", "The sun's rays scorch your undead flesh!")); take_hit(DAMAGE_NOESCAPE, 1, _("日光", "sunlight"), -1); @@ -1490,11 +1380,11 @@ static void process_world_aux_hp_and_sp(void) { msg_print(_("熱で火傷した!", "The heat burns you!")); take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"), - f_name + f_info[get_feat_mimic(&grid_array[p_ptr->y][p_ptr->x])].name), -1); + f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1); } else { - concptr name = f_name + f_info[get_feat_mimic(&grid_array[p_ptr->y][p_ptr->x])].name; + concptr name = f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name; msg_format(_("%sで火傷した!", "The %s burns you!"), name); take_hit(DAMAGE_NOESCAPE, damage, name, -1); } @@ -1528,11 +1418,11 @@ static void process_world_aux_hp_and_sp(void) { msg_print(_("冷気に覆われた!", "The cold engulfs you!")); take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"), - f_name + f_info[get_feat_mimic(&grid_array[p_ptr->y][p_ptr->x])].name), -1); + f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1); } else { - concptr name = f_name + f_info[get_feat_mimic(&grid_array[p_ptr->y][p_ptr->x])].name; + concptr name = f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name; msg_format(_("%sに凍えた!", "The %s frostbites you!"), name); take_hit(DAMAGE_NOESCAPE, damage, name, -1); } @@ -1566,11 +1456,11 @@ static void process_world_aux_hp_and_sp(void) { msg_print(_("電撃を受けた!", "The electric shocks you!")); take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"), - f_name + f_info[get_feat_mimic(&grid_array[p_ptr->y][p_ptr->x])].name), -1); + f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1); } else { - concptr name = f_name + f_info[get_feat_mimic(&grid_array[p_ptr->y][p_ptr->x])].name; + concptr name = f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name; msg_format(_("%sに感電した!", "The %s shocks you!"), name); take_hit(DAMAGE_NOESCAPE, damage, name, -1); } @@ -1604,11 +1494,11 @@ static void process_world_aux_hp_and_sp(void) { msg_print(_("酸が飛び散った!", "The acid melt you!")); take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"), - f_name + f_info[get_feat_mimic(&grid_array[p_ptr->y][p_ptr->x])].name), -1); + f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1); } else { - concptr name = f_name + f_info[get_feat_mimic(&grid_array[p_ptr->y][p_ptr->x])].name; + concptr name = f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name; msg_format(_("%sに溶かされた!", "The %s melts you!"), name); take_hit(DAMAGE_NOESCAPE, damage, name, -1); } @@ -1642,12 +1532,12 @@ static void process_world_aux_hp_and_sp(void) { msg_print(_("毒気を吸い込んだ!", "The gas poisons you!")); take_hit(DAMAGE_NOESCAPE, damage, format(_("%sの上に浮遊したダメージ", "flying over %s"), - f_name + f_info[get_feat_mimic(&grid_array[p_ptr->y][p_ptr->x])].name), -1); + f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name), -1); if (p_ptr->resist_pois) (void)set_poisoned(p_ptr->poisoned + 1); } else { - concptr name = f_name + f_info[get_feat_mimic(&grid_array[p_ptr->y][p_ptr->x])].name; + concptr name = f_name + f_info[get_feat_mimic(¤t_floor_ptr->grid_array[p_ptr->y][p_ptr->x])].name; msg_format(_("%sに毒された!", "The %s poisons you!"), name); take_hit(DAMAGE_NOESCAPE, damage, name, -1); if (p_ptr->resist_pois) (void)set_poisoned(p_ptr->poisoned + 3); @@ -1671,27 +1561,27 @@ static void process_world_aux_hp_and_sp(void) if (p_ptr->riding) { HIT_POINT damage; - if ((r_info[m_list[p_ptr->riding].r_idx].flags2 & RF2_AURA_FIRE) && !p_ptr->immune_fire) + if ((r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].flags2 & RF2_AURA_FIRE) && !p_ptr->immune_fire) { - damage = r_info[m_list[p_ptr->riding].r_idx].level / 2; + damage = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level / 2; if (prace_is_(RACE_ENT)) damage += damage / 3; if (p_ptr->resist_fire) damage = damage / 3; if (IS_OPPOSE_FIRE()) damage = damage / 3; msg_print(_("熱い!", "It's hot!")); take_hit(DAMAGE_NOESCAPE, damage, _("炎のオーラ", "Fire aura"), -1); } - if ((r_info[m_list[p_ptr->riding].r_idx].flags2 & RF2_AURA_ELEC) && !p_ptr->immune_elec) + if ((r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].flags2 & RF2_AURA_ELEC) && !p_ptr->immune_elec) { - damage = r_info[m_list[p_ptr->riding].r_idx].level / 2; + damage = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level / 2; if (prace_is_(RACE_ANDROID)) damage += damage / 3; if (p_ptr->resist_elec) damage = damage / 3; if (IS_OPPOSE_ELEC()) damage = damage / 3; msg_print(_("痛い!", "It hurts!")); take_hit(DAMAGE_NOESCAPE, damage, _("電気のオーラ", "Elec aura"), -1); } - if ((r_info[m_list[p_ptr->riding].r_idx].flags3 & RF3_AURA_COLD) && !p_ptr->immune_cold) + if ((r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].flags3 & RF3_AURA_COLD) && !p_ptr->immune_cold) { - damage = r_info[m_list[p_ptr->riding].r_idx].level / 2; + damage = r_info[current_floor_ptr->m_list[p_ptr->riding].r_idx].level / 2; if (p_ptr->resist_cold) damage = damage / 3; if (IS_OPPOSE_COLD()) damage = damage / 3; msg_print(_("冷たい!", "It's cold!")); @@ -1820,7 +1710,7 @@ static void process_world_aux_hp_and_sp(void) /* Special floor -- Pattern, in a wall -- yields no healing */ if (cave_no_regen) regen_amount = 0; - regen_amount = (regen_amount * mutant_regenerate_mod) / 100; + regen_amount = (regen_amount * p_ptr->mutant_regenerate_mod) / 100; /* Regenerate Hit Points if needed */ if ((p_ptr->chp < p_ptr->mhp) && !cave_no_regen) @@ -2161,7 +2051,7 @@ static void process_world_aux_light(void) /* Decrease life-span */ if (o_ptr->name2 == EGO_LITE_LONG) { - if (turn % (TURNS_PER_TICK*2)) o_ptr->xtra4--; + if (current_world_ptr->game_turn % (TURNS_PER_TICK*2)) o_ptr->xtra4--; } else o_ptr->xtra4--; @@ -2295,7 +2185,7 @@ static void process_world_aux_mutation(void) if (pet) mode |= PM_FORCE_PET; else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET); - if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, dun_level, SUMMON_DEMON, mode, '\0')) + if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_DEMON, mode, '\0')) { msg_print(_("あなたはデーモンを引き寄せた!", "You have attracted a demon!")); disturb(FALSE, TRUE); @@ -2339,7 +2229,7 @@ static void process_world_aux_mutation(void) msg_print(_("突然ほとんど孤独になった気がする。", "You suddenly feel almost lonely.")); banish_monsters(100); - if (!dun_level && p_ptr->town_num) + if (!current_floor_ptr->dun_level && p_ptr->town_num) { int n; @@ -2364,7 +2254,7 @@ static void process_world_aux_mutation(void) msg_print(NULL); /* Absorb light from the current possition */ - if ((grid_array[p_ptr->y][p_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW) + if ((current_floor_ptr->grid_array[p_ptr->y][p_ptr->x].info & (CAVE_GLOW | CAVE_MNDK)) == CAVE_GLOW) { hp_player(10); } @@ -2404,7 +2294,7 @@ static void process_world_aux_mutation(void) if (pet) mode |= PM_FORCE_PET; else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET); - if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, dun_level, SUMMON_ANIMAL, mode, '\0')) + if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_ANIMAL, mode, '\0')) { msg_print(_("動物を引き寄せた!", "You have attracted an animal!")); disturb(FALSE, TRUE); @@ -2482,7 +2372,7 @@ static void process_world_aux_mutation(void) if (pet) mode |= PM_FORCE_PET; else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET); - if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, dun_level, SUMMON_DRAGON, mode, '\0')) + if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_DRAGON, mode, '\0')) { msg_print(_("ドラゴンを引き寄せた!", "You have attracted a dragon!")); disturb(FALSE, TRUE); @@ -2507,7 +2397,7 @@ static void process_world_aux_mutation(void) msg_print(_("胃が痙攣し、食事を失った!", "Your stomach roils, and you lose your lunch!")); msg_print(NULL); set_food(PY_FOOD_WEAK); - if (music_singing_any()) stop_singing(); + if (music_singing_any()) stop_singing(p_ptr); if (hex_spelling_any()) stop_hex_spell_all(); } @@ -2523,11 +2413,9 @@ static void process_world_aux_mutation(void) for (monster = 0; monster < m_max; monster++) { - monster_type *m_ptr = &m_list[monster]; + monster_type *m_ptr = ¤t_floor_ptr->m_list[monster]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; - - /* Paranoia -- Skip dead monsters */ - if (!m_ptr->r_idx) continue; + if (!monster_is_valid(m_ptr)) continue; if (r_ptr->level >= p_ptr->lev) { @@ -2750,7 +2638,7 @@ static void process_world_aux_curse(void) /* Call animal */ if ((p_ptr->cursed & TRC_CALL_ANIMAL) && one_in_(2500)) { - if (summon_specific(0, p_ptr->y, p_ptr->x, dun_level, SUMMON_ANIMAL, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET), '\0')) + if (summon_specific(0, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_ANIMAL, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET), '\0')) { GAME_TEXT o_name[MAX_NLEN]; @@ -2762,7 +2650,7 @@ static void process_world_aux_curse(void) /* Call demon */ if ((p_ptr->cursed & TRC_CALL_DEMON) && one_in_(1111)) { - if (summon_specific(0, p_ptr->y, p_ptr->x, dun_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET), '\0')) + if (summon_specific(0, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET), '\0')) { GAME_TEXT o_name[MAX_NLEN]; @@ -2774,7 +2662,7 @@ static void process_world_aux_curse(void) /* Call dragon */ if ((p_ptr->cursed & TRC_CALL_DRAGON) && one_in_(800)) { - if (summon_specific(0, p_ptr->y, p_ptr->x, dun_level, SUMMON_DRAGON, + if (summon_specific(0, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_DRAGON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET), '\0')) { GAME_TEXT o_name[MAX_NLEN]; @@ -2787,7 +2675,7 @@ static void process_world_aux_curse(void) /* Call undead */ if ((p_ptr->cursed & TRC_CALL_UNDEAD) && one_in_(1111)) { - if (summon_specific(0, p_ptr->y, p_ptr->x, dun_level, SUMMON_UNDEAD, + if (summon_specific(0, p_ptr->y, p_ptr->x, current_floor_ptr->dun_level, SUMMON_UNDEAD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET), '\0')) { GAME_TEXT o_name[MAX_NLEN]; @@ -2901,7 +2789,7 @@ static void process_world_aux_recharge(void) /* * Recharge rods. Rods now use timeout to control charging status, * and each charging rod in a stack decreases the stack's timeout by - * one per turn. -LM- + * one per current_world_ptr->game_turn. -LM- */ for (changed = FALSE, i = 0; i < INVEN_PACK; i++) { @@ -2949,7 +2837,7 @@ static void process_world_aux_recharge(void) /* Process objects on floor */ for (i = 1; i < o_max; i++) { - object_type *o_ptr = &o_list[i]; + object_type *o_ptr = ¤t_floor_ptr->o_list[i]; /* Skip dead objects */ if (!o_ptr->k_idx) continue; @@ -2997,15 +2885,15 @@ static void process_world_aux_movement(void) disturb(FALSE, TRUE); /* Determine the level */ - if (dun_level || p_ptr->inside_quest || p_ptr->enter_dungeon) + if (current_floor_ptr->dun_level || p_ptr->inside_quest || p_ptr->enter_dungeon) { msg_print(_("上に引っ張りあげられる感じがする!", "You feel yourself yanked upwards!")); if (p_ptr->dungeon_idx) p_ptr->recall_dungeon = p_ptr->dungeon_idx; if (record_stair) - do_cmd_write_nikki(NIKKI_RECALL, dun_level, NULL); + do_cmd_write_nikki(NIKKI_RECALL, current_floor_ptr->dun_level, NULL); - dun_level = 0; + current_floor_ptr->dun_level = 0; p_ptr->dungeon_idx = 0; leave_quest_check(); @@ -3022,26 +2910,26 @@ static void process_world_aux_movement(void) p_ptr->dungeon_idx = p_ptr->recall_dungeon; if (record_stair) - do_cmd_write_nikki(NIKKI_RECALL, dun_level, NULL); + do_cmd_write_nikki(NIKKI_RECALL, current_floor_ptr->dun_level, NULL); /* New depth */ - dun_level = max_dlv[p_ptr->dungeon_idx]; - if (dun_level < 1) dun_level = 1; + current_floor_ptr->dun_level = max_dlv[p_ptr->dungeon_idx]; + if (current_floor_ptr->dun_level < 1) current_floor_ptr->dun_level = 1; /* Nightmare mode makes recall more dangerous */ if (ironman_nightmare && !randint0(666) && (p_ptr->dungeon_idx == DUNGEON_ANGBAND)) { - if (dun_level < 50) + if (current_floor_ptr->dun_level < 50) { - dun_level *= 2; + current_floor_ptr->dun_level *= 2; } - else if (dun_level < 99) + else if (current_floor_ptr->dun_level < 99) { - dun_level = (dun_level + 99) / 2; + current_floor_ptr->dun_level = (current_floor_ptr->dun_level + 99) / 2; } - else if (dun_level > 100) + else if (current_floor_ptr->dun_level > 100) { - dun_level = d_info[p_ptr->dungeon_idx].maxdepth - 1; + current_floor_ptr->dun_level = d_info[p_ptr->dungeon_idx].maxdepth - 1; } } @@ -3063,8 +2951,6 @@ static void process_world_aux_movement(void) * and create a first saved floor */ prepare_change_floor_mode(CFM_FIRST_FLOOR); - - /* Leaving */ p_ptr->leaving = TRUE; if (p_ptr->dungeon_idx == DUNGEON_ANGBAND) @@ -3078,12 +2964,12 @@ static void process_world_aux_movement(void) if ((q_ptr->type == QUEST_TYPE_RANDOM) && (q_ptr->status == QUEST_STATUS_TAKEN) && - (q_ptr->level < dun_level)) + (q_ptr->level < current_floor_ptr->dun_level)) { q_ptr->status = QUEST_STATUS_FAILED; q_ptr->complev = (byte)p_ptr->lev; update_playtime(); - q_ptr->comptime = playtime; + q_ptr->comptime = current_world_ptr->play_time; r_info[q_ptr->r_idx].flags1 &= ~(RF1_QUESTOR); } } @@ -3113,7 +2999,7 @@ static void process_world_aux_movement(void) disturb(FALSE, TRUE); /* Determine the level */ - if (!quest_number(dun_level) && dun_level) + if (!quest_number(current_floor_ptr->dun_level) && current_floor_ptr->dun_level) { msg_print(_("世界が変わった!", "The world changes!")); @@ -3122,8 +3008,6 @@ static void process_world_aux_movement(void) * and create a first saved floor */ prepare_change_floor_mode(CFM_FIRST_FLOOR); - - /* Leaving */ p_ptr->leaving = TRUE; } else @@ -3145,7 +3029,7 @@ static void process_world_aux_movement(void) */ static int get_monster_crowd_number(MONSTER_IDX m_idx) { - monster_type *m_ptr = &m_list[m_idx]; + monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx]; POSITION my = m_ptr->fy; POSITION mx = m_ptr->fx; int i; @@ -3159,7 +3043,7 @@ static int get_monster_crowd_number(MONSTER_IDX m_idx) if (!in_bounds(ay, ax)) continue; /* Count number of monsters */ - if (grid_array[ay][ax].m_idx > 0) count++; + if (current_floor_ptr->grid_array[ay][ax].m_idx > 0) count++; } return count; @@ -3184,17 +3068,15 @@ static byte get_dungeon_feeling(void) IDX i; /* Hack -- no feeling in the town */ - if (!dun_level) return 0; + if (!current_floor_ptr->dun_level) return 0; /* Examine each monster */ for (i = 1; i < m_max; i++) { - monster_type *m_ptr = &m_list[i]; + monster_type *m_ptr = ¤t_floor_ptr->m_list[i]; monster_race *r_ptr; int delta = 0; - - /* Skip dead monsters */ - if (!m_ptr->r_idx) continue; + if (!monster_is_valid(m_ptr)) continue; /* Ignore pet */ if (is_pet(m_ptr)) continue; @@ -3205,19 +3087,19 @@ static byte get_dungeon_feeling(void) if (r_ptr->flags1 & (RF1_UNIQUE)) { /* Nearly out-of-depth unique monsters */ - if (r_ptr->level + 10 > dun_level) + if (r_ptr->level + 10 > current_floor_ptr->dun_level) { /* Boost rating by twice delta-depth */ - delta += (r_ptr->level + 10 - dun_level) * 2 * base; + delta += (r_ptr->level + 10 - current_floor_ptr->dun_level) * 2 * base; } } else { /* Out-of-depth monsters */ - if (r_ptr->level > dun_level) + if (r_ptr->level > current_floor_ptr->dun_level) { /* Boost rating by delta-depth */ - delta += (r_ptr->level - dun_level) * base; + delta += (r_ptr->level - current_floor_ptr->dun_level) * base; } } @@ -3238,7 +3120,7 @@ static byte get_dungeon_feeling(void) /* Examine each unidentified object */ for (i = 1; i < o_max; i++) { - object_type *o_ptr = &o_list[i]; + object_type *o_ptr = ¤t_floor_ptr->o_list[i]; object_kind *k_ptr = &k_info[o_ptr->k_idx]; int delta = 0; @@ -3287,10 +3169,10 @@ static byte get_dungeon_feeling(void) if (o_ptr->tval == TV_AMULET && o_ptr->sval == SV_AMULET_THE_MAGI && !object_is_cursed(o_ptr)) delta += 15 * base; /* Out-of-depth objects */ - if (!object_is_cursed(o_ptr) && !object_is_broken(o_ptr) && k_ptr->level > dun_level) + if (!object_is_cursed(o_ptr) && !object_is_broken(o_ptr) && k_ptr->level > current_floor_ptr->dun_level) { /* Rating increase */ - delta += (k_ptr->level - dun_level) * base; + delta += (k_ptr->level - current_floor_ptr->dun_level) * base; } rating += RATING_BOOST(delta); @@ -3321,19 +3203,19 @@ static void update_dungeon_feeling(void) int delay; /* No feeling on the surface */ - if (!dun_level) return; + if (!current_floor_ptr->dun_level) return; /* No feeling in the arena */ if (p_ptr->inside_battle) return; /* Extract delay time */ - delay = MAX(10, 150 - p_ptr->skill_fos) * (150 - dun_level) * TURNS_PER_TICK / 100; + delay = MAX(10, 150 - p_ptr->skill_fos) * (150 - current_floor_ptr->dun_level) * TURNS_PER_TICK / 100; /* Not yet felt anything */ - if (turn < p_ptr->feeling_turn + delay && !cheat_xtra) return; + if (current_world_ptr->game_turn < p_ptr->feeling_turn + delay && !cheat_xtra) return; /* Extract quest number (if any) */ - quest_num = quest_number(dun_level); + quest_num = quest_number(current_floor_ptr->dun_level); /* No feeling in a quest */ if (quest_num && @@ -3346,7 +3228,7 @@ static void update_dungeon_feeling(void) new_feeling = get_dungeon_feeling(); /* Remember last time updated */ - p_ptr->feeling_turn = turn; + p_ptr->feeling_turn = current_world_ptr->game_turn; /* No change */ if (p_ptr->feeling == new_feeling) return; @@ -3375,7 +3257,7 @@ static void process_world(void) int day, hour, min; const s32b A_DAY = TURNS_PER_TICK * TOWN_DAWN; - s32b prev_turn_in_today = ((turn - TURNS_PER_TICK) % A_DAY + A_DAY / 4) % A_DAY; + s32b prev_turn_in_today = ((current_world_ptr->game_turn - TURNS_PER_TICK) % A_DAY + A_DAY / 4) % A_DAY; int prev_min = (1440 * prev_turn_in_today / A_DAY) % 60; extract_day_hour_min(&day, &hour, &min); @@ -3386,7 +3268,7 @@ static void process_world(void) /* 帰還無しモード時のレベルテレポバグ対策 / Fix for level teleport bugs on ironman_downward.*/ if (ironman_downward && (p_ptr->dungeon_idx != DUNGEON_ANGBAND && p_ptr->dungeon_idx != 0)) { - dun_level = 0; + current_floor_ptr->dun_level = 0; p_ptr->dungeon_idx = 0; prepare_change_floor_mode(CFM_FIRST_FLOOR | CFM_RAND_PLACE); p_ptr->inside_arena = FALSE; @@ -3402,15 +3284,15 @@ static void process_world(void) int number_mon = 0; /* Count all hostile monsters */ - for (i2 = 0; i2 < cur_wid; ++i2) - for (j2 = 0; j2 < cur_hgt; j2++) + for (i2 = 0; i2 < current_floor_ptr->width; ++i2) + for (j2 = 0; j2 < current_floor_ptr->height; j2++) { - grid_type *c_ptr = &grid_array[j2][i2]; + grid_type *g_ptr = ¤t_floor_ptr->grid_array[j2][i2]; - if ((c_ptr->m_idx > 0) && (c_ptr->m_idx != p_ptr->riding)) + if ((g_ptr->m_idx > 0) && (g_ptr->m_idx != p_ptr->riding)) { number_mon++; - win_m_idx = c_ptr->m_idx; + win_m_idx = g_ptr->m_idx; } } @@ -3426,7 +3308,7 @@ static void process_world(void) GAME_TEXT m_name[MAX_NLEN]; monster_type *wm_ptr; - wm_ptr = &m_list[win_m_idx]; + wm_ptr = ¤t_floor_ptr->m_list[win_m_idx]; monster_desc(m_name, wm_ptr, 0); msg_format(_("%sが勝利した!", "%s is winner!"), m_name); @@ -3446,7 +3328,7 @@ static void process_world(void) p_ptr->energy_need = 0; battle_monsters(); } - else if (turn - old_turn == 150 * TURNS_PER_TICK) + else if (current_world_ptr->game_turn - current_floor_ptr->generated_turn == 150 * TURNS_PER_TICK) { msg_print(_("申し分けありませんが、この勝負は引き分けとさせていただきます。", "This battle have ended in a draw.")); p_ptr->au += kakekin; @@ -3457,11 +3339,11 @@ static void process_world(void) } /* Every 10 game turns */ - if (turn % TURNS_PER_TICK) return; + if (current_world_ptr->game_turn % TURNS_PER_TICK) return; /*** Check the Time and Load ***/ - if (!(turn % (50*TURNS_PER_TICK))) + if (!(current_world_ptr->game_turn % (50*TURNS_PER_TICK))) { /* Check time and load */ if ((0 != check_time()) || (0 != check_load())) @@ -3486,8 +3368,6 @@ static void process_world(void) /* Stop playing */ p_ptr->playing = FALSE; - - /* Leaving */ p_ptr->leaving = TRUE; } } @@ -3496,7 +3376,7 @@ static void process_world(void) /*** Attempt timed autosave ***/ if (autosave_t && autosave_freq && !p_ptr->inside_battle) { - if (!(turn % ((s32b)autosave_freq * TURNS_PER_TICK))) + if (!(current_world_ptr->game_turn % ((s32b)autosave_freq * TURNS_PER_TICK))) do_cmd_save_game(TRUE); } @@ -3508,15 +3388,15 @@ static void process_world(void) /*** Handle the wilderness/town (sunshine) ***/ /* While in town/wilderness */ - if (!dun_level && !p_ptr->inside_quest && !p_ptr->inside_battle && !p_ptr->inside_arena) + if (!current_floor_ptr->dun_level && !p_ptr->inside_quest && !p_ptr->inside_battle && !p_ptr->inside_arena) { /* Hack -- Daybreak/Nighfall in town */ - if (!(turn % ((TURNS_PER_TICK * TOWN_DAWN) / 2))) + if (!(current_world_ptr->game_turn % ((TURNS_PER_TICK * TOWN_DAWN) / 2))) { bool dawn; /* Check for dawn */ - dawn = (!(turn % (TURNS_PER_TICK * TOWN_DAWN))); + dawn = (!(current_world_ptr->game_turn % (TURNS_PER_TICK * TOWN_DAWN))); if (dawn) day_break(); else night_falls(); @@ -3525,12 +3405,12 @@ static void process_world(void) } /* While in the dungeon (vanilla_town or lite_town mode only) */ - else if ((vanilla_town || (lite_town && !p_ptr->inside_quest && !p_ptr->inside_battle && !p_ptr->inside_arena)) && dun_level) + else if ((vanilla_town || (lite_town && !p_ptr->inside_quest && !p_ptr->inside_battle && !p_ptr->inside_arena)) && current_floor_ptr->dun_level) { /*** Shuffle the Storekeepers ***/ /* Chance is only once a day (while in dungeon) */ - if (!(turn % (TURNS_PER_TICK * STORE_TICKS))) + if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * STORE_TICKS))) { /* Sometimes, shuffle the shop-keepers */ if (one_in_(STORE_SHUFFLE)) @@ -3548,7 +3428,6 @@ static void process_world(void) /* Check every feature */ for (i = 1; i < max_f_idx; i++) { - /* Access the index */ feature_type *f_ptr = &f_info[i]; /* Skip empty index */ @@ -3584,8 +3463,8 @@ static void process_world(void) } /* Hack -- Check for creature regeneration */ - if (!(turn % (TURNS_PER_TICK * 10)) && !p_ptr->inside_battle) regen_monsters(); - if (!(turn % (TURNS_PER_TICK * 3))) regen_captured_monsters(); + if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 10)) && !p_ptr->inside_battle) regen_monsters(); + if (!(current_world_ptr->game_turn % (TURNS_PER_TICK * 3))) regen_captured_monsters(); if (!p_ptr->leaving) { @@ -3594,7 +3473,7 @@ static void process_world(void) /* Hack -- Process the counters of monsters if needed */ for (i = 0; i < MAX_MTIMED; i++) { - if (mproc_max[i] > 0) process_monsters_mtimed(i); + if (current_floor_ptr->mproc_max[i] > 0) process_monsters_mtimed(i); } } @@ -3620,7 +3499,6 @@ static void process_world(void) /* Every 15 minutes after 11:00 pm */ if ((hour == 23) && !(min % 15)) { - /* Disturbing */ disturb(FALSE, TRUE); switch (min / 15) @@ -3658,7 +3536,7 @@ static void process_world(void) change_wild_mode(); /* Give first move to monsters */ - take_turn(p_ptr, 100);; + take_turn(p_ptr, 100); /* HACk -- set the encouter flag for the wilderness generation */ generate_encounter = TRUE; @@ -4085,11 +3963,11 @@ static void process_command(void) /* Go up staircase */ case '<': { - if (!p_ptr->wild_mode && !dun_level && !p_ptr->inside_arena && !p_ptr->inside_quest) + if (!p_ptr->wild_mode && !current_floor_ptr->dun_level && !p_ptr->inside_arena && !p_ptr->inside_quest) { if (vanilla_town) break; - if (ambush_flag) + if (p_ptr->ambush_flag) { msg_print(_("襲撃から逃げるにはマップの端まで移動しなければならない。", "To flee the ambush you have to reach the edge of the map.")); break; @@ -4198,7 +4076,7 @@ static void process_command(void) { msg_print(_("呪文を唱えられない!", "You cannot cast spells!")); } - else if (dun_level && (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MAGIC) && (p_ptr->pclass != CLASS_BERSERKER) && (p_ptr->pclass != CLASS_SMITH)) + else if (current_floor_ptr->dun_level && (d_info[p_ptr->dungeon_idx].flags1 & DF1_NO_MAGIC) && (p_ptr->pclass != CLASS_BERSERKER) && (p_ptr->pclass != CLASS_SMITH)) { msg_print(_("ダンジョンが魔法を吸収した!", "The dungeon absorbs all attempted magic!")); msg_print(NULL); @@ -4301,7 +4179,7 @@ static void process_command(void) /* Fire an item */ case 'f': { - do_cmd_fire(); + do_cmd_fire(SP_NONE); break; } @@ -4659,7 +4537,6 @@ static void pack_overflow(void) /* Access the slot to be dropped */ o_ptr = &inventory[INVEN_PACK]; - /* Disturbing */ disturb(FALSE, TRUE); /* Warning */ @@ -4692,7 +4569,7 @@ static void process_upkeep_with_speed(void) p_ptr->enchant_energy_need -= SPEED_TO_ENERGY(p_ptr->pspeed); } - /* No turn yet */ + /* No current_world_ptr->game_turn yet */ if (p_ptr->enchant_energy_need > 0) return; while (p_ptr->enchant_energy_need <= 0) @@ -4719,7 +4596,7 @@ static void process_upkeep_with_speed(void) */ static void process_player(void) { - IDX i; + MONSTER_IDX m_idx; /*** Apply energy ***/ @@ -4727,7 +4604,7 @@ static void process_player(void) { msg_print(_("何か変わった気がする!", "You feel different!")); - (void)gain_random_mutation(0); + (void)gain_mutation(p_ptr, 0); hack_mutation = FALSE; } @@ -4740,14 +4617,14 @@ static void process_player(void) if (p_ptr->inside_battle) { - for(i = 1; i < m_max; i++) + for(m_idx = 1; m_idx < m_max; m_idx++) { - monster_type *m_ptr = &m_list[i]; + monster_type *m_ptr = ¤t_floor_ptr->m_list[m_idx]; - if (!m_ptr->r_idx) continue; + if (!monster_is_valid(m_ptr)) continue; m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW); - update_monster(i, FALSE); + update_monster(m_idx, FALSE); } prt_time(); } @@ -4758,17 +4635,17 @@ static void process_player(void) p_ptr->energy_need -= SPEED_TO_ENERGY(p_ptr->pspeed); } - /* No turn yet */ + /* No current_world_ptr->game_turn yet */ if (p_ptr->energy_need > 0) return; if (!command_rep) prt_time(); /*** Check for interupts ***/ /* Complete resting */ - if (resting < 0) + if (p_ptr->resting < 0) { /* Basic resting */ - if (resting == COMMAND_ARG_REST_FULL_HEALING) + if (p_ptr->resting == COMMAND_ARG_REST_FULL_HEALING) { /* Stop resting */ if ((p_ptr->chp == p_ptr->mhp) && @@ -4779,7 +4656,7 @@ static void process_player(void) } /* Complete resting */ - else if (resting == COMMAND_ARG_REST_UNTIL_DONE) + else if (p_ptr->resting == COMMAND_ARG_REST_UNTIL_DONE) { /* Stop resting */ if ((p_ptr->chp == p_ptr->mhp) && @@ -4804,7 +4681,7 @@ static void process_player(void) MONRACE_IDX r_idx; bool success = FALSE; get_mon_num_prep(monster_is_fishing_target,NULL); - r_idx = get_mon_num(dun_level ? dun_level : wilderness[p_ptr->wilderness_y][p_ptr->wilderness_x].level); + r_idx = get_mon_num(current_floor_ptr->dun_level ? current_floor_ptr->dun_level : wilderness[p_ptr->wilderness_y][p_ptr->wilderness_x].level); msg_print(NULL); if (r_idx && one_in_(2)) { @@ -4814,7 +4691,7 @@ static void process_player(void) if (place_monster_aux(0, y, x, r_idx, PM_NO_KAGE)) { GAME_TEXT m_name[MAX_NLEN]; - monster_desc(m_name, &m_list[grid_array[y][x].m_idx], 0); + monster_desc(m_name, ¤t_floor_ptr->m_list[current_floor_ptr->grid_array[y][x].m_idx], 0); msg_format(_("%sが釣れた!", "You have a good catch!"), m_name); success = TRUE; } @@ -4851,7 +4728,7 @@ static void process_player(void) if (p_ptr->riding && !p_ptr->confused && !p_ptr->blind) { - monster_type *m_ptr = &m_list[p_ptr->riding]; + monster_type *m_ptr = ¤t_floor_ptr->m_list[p_ptr->riding]; monster_race *r_ptr = &r_info[m_ptr->r_idx]; if (MON_CSLEEP(m_ptr)) @@ -4900,7 +4777,6 @@ static void process_player(void) } } - /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */ handle_stuff(); } @@ -4964,7 +4840,7 @@ static void process_player(void) p_ptr->window |= PW_PLAYER; p_ptr->sutemi = FALSE; p_ptr->counter = FALSE; - now_damaged = FALSE; + p_ptr->now_damaged = FALSE; handle_stuff(); @@ -4980,7 +4856,7 @@ static void process_player(void) /* Hack -- cancel "lurking browse mode" */ if (!command_new) command_see = FALSE; - /* Assume free turn */ + /* Assume free current_world_ptr->game_turn */ free_turn(p_ptr); if (p_ptr->inside_battle) @@ -4997,29 +4873,29 @@ static void process_player(void) /* Paralyzed or Knocked Out */ else if (p_ptr->paralyzed || (p_ptr->stun >= 100)) { - take_turn(p_ptr, 100);; + take_turn(p_ptr, 100); } /* Resting */ else if (p_ptr->action == ACTION_REST) { /* Timed rest */ - if (resting > 0) + if (p_ptr->resting > 0) { /* Reduce rest count */ - resting--; + p_ptr->resting--; - if (!resting) set_action(ACTION_NONE); + if (!p_ptr->resting) set_action(ACTION_NONE); p_ptr->redraw |= (PR_STATE); } - take_turn(p_ptr, 100);; + take_turn(p_ptr, 100); } /* Fishing */ else if (p_ptr->action == ACTION_FISH) { - take_turn(p_ptr, 100);; + take_turn(p_ptr, 100); } /* Running */ @@ -5072,11 +4948,9 @@ static void process_player(void) process_command(); } - /* Hack -- Pack Overflow */ pack_overflow(); - /*** Clean up ***/ /* Significant */ @@ -5105,16 +4979,13 @@ static void process_player(void) shimmer_monsters = FALSE; /* Shimmer multi-hued monsters */ - for (i = 1; i < m_max; i++) + for (m_idx = 1; m_idx < m_max; m_idx++) { monster_type *m_ptr; monster_race *r_ptr; - /* Access monster */ - m_ptr = &m_list[i]; - - /* Skip dead monsters */ - if (!m_ptr->r_idx) continue; + m_ptr = ¤t_floor_ptr->m_list[m_idx]; + if (!monster_is_valid(m_ptr)) continue; /* Skip unseen monsters */ if (!m_ptr->ml) continue; @@ -5142,15 +5013,11 @@ static void process_player(void) repair_monsters = FALSE; /* Rotate detection flags */ - for (i = 1; i < m_max; i++) + for (m_idx = 1; m_idx < m_max; m_idx++) { monster_type *m_ptr; - - /* Access monster */ - m_ptr = &m_list[i]; - - /* Skip dead monsters */ - if (!m_ptr->r_idx) continue; + m_ptr = ¤t_floor_ptr->m_list[m_idx]; + if (!monster_is_valid(m_ptr)) continue; /* Nice monsters get mean */ if (m_ptr->mflag & MFLAG_NICE) @@ -5180,10 +5047,10 @@ static void process_player(void) /* Assume invisible */ m_ptr->ml = FALSE; - update_monster(i, FALSE); + update_monster(m_idx, FALSE); - if (p_ptr->health_who == i) p_ptr->redraw |= (PR_HEALTH); - if (p_ptr->riding == i) p_ptr->redraw |= (PR_UHEALTH); + if (p_ptr->health_who == m_idx) p_ptr->redraw |= (PR_HEALTH); + if (p_ptr->riding == m_idx) p_ptr->redraw |= (PR_UHEALTH); /* Redraw regardless */ lite_spot(m_ptr->fy, m_ptr->fx); @@ -5193,13 +5060,14 @@ static void process_player(void) } if (p_ptr->pclass == CLASS_IMITATOR) { + int j; if (p_ptr->mane_num > (p_ptr->lev > 44 ? 3 : p_ptr->lev > 29 ? 2 : 1)) { p_ptr->mane_num--; - for (i = 0; i < p_ptr->mane_num; i++) + for (j = 0; j < p_ptr->mane_num; j++) { - p_ptr->mane_spell[i] = p_ptr->mane_spell[i+1]; - p_ptr->mane_dam[i] = p_ptr->mane_dam[i+1]; + p_ptr->mane_spell[j] = p_ptr->mane_spell[j + 1]; + p_ptr->mane_dam[j] = p_ptr->mane_dam[j + 1]; } } new_mane = FALSE; @@ -5216,7 +5084,6 @@ static void process_player(void) p_ptr->redraw |= (PR_MAP); p_ptr->update |= (PU_MONSTERS); - p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON); msg_print(_("「時は動きだす…」", "You feel time flowing around you once more.")); @@ -5224,7 +5091,6 @@ static void process_player(void) p_ptr->timewalk = FALSE; p_ptr->energy_need = ENERGY_NEED(); - /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */ handle_stuff(); } } @@ -5265,7 +5131,7 @@ static void dungeon(bool load_game) int quest_num = 0; /* Set the base level */ - base_level = dun_level; + current_floor_ptr->base_level = current_floor_ptr->dun_level; /* Reset various flags */ is_loading_now = FALSE; @@ -5289,7 +5155,7 @@ static void dungeon(bool load_game) target_who = 0; pet_t_m_idx = 0; riding_t_m_idx = 0; - ambush_flag = FALSE; + p_ptr->ambush_flag = FALSE; /* Cancel the health bar */ health_track(0); @@ -5304,7 +5170,7 @@ static void dungeon(bool load_game) disturb(TRUE, TRUE); /* Get index of current quest (if any) */ - quest_num = quest_number(dun_level); + quest_num = quest_number(current_floor_ptr->dun_level); /* Inside a quest? */ if (quest_num) @@ -5321,10 +5187,10 @@ static void dungeon(bool load_game) /* Track maximum dungeon level (if not in quest -KMW-) */ - if ((max_dlv[p_ptr->dungeon_idx] < dun_level) && !p_ptr->inside_quest) + if ((max_dlv[p_ptr->dungeon_idx] < current_floor_ptr->dun_level) && !p_ptr->inside_quest) { - max_dlv[p_ptr->dungeon_idx] = dun_level; - if (record_maxdepth) do_cmd_write_nikki(NIKKI_MAXDEAPTH, dun_level, NULL); + max_dlv[p_ptr->dungeon_idx] = current_floor_ptr->dun_level; + if (record_maxdepth) do_cmd_write_nikki(NIKKI_MAXDEAPTH, current_floor_ptr->dun_level, NULL); } (void)calculate_upkeep(); @@ -5342,19 +5208,9 @@ static void dungeon(bool load_game) character_xtra = TRUE; p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_SPELL | PW_PLAYER | PW_MONSTER | PW_OVERHEAD | PW_DUNGEON); + p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_EQUIPPY | PR_MAP); + p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS | PU_VIEW | PU_LITE | PU_MON_LITE | PU_TORCH | PU_MONSTERS | PU_DISTANCE | PU_FLOW); - /* Redraw dungeon */ - p_ptr->redraw |= (PR_WIPE | PR_BASIC | PR_EXTRA | PR_EQUIPPY); - - p_ptr->redraw |= (PR_MAP); - - p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS); - - /* Update lite/view */ - p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE | PU_TORCH); - p_ptr->update |= (PU_MONSTERS | PU_DISTANCE | PU_FLOW); - - /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */ handle_stuff(); /* Leave "xtra" mode */ @@ -5392,10 +5248,10 @@ static void dungeon(bool load_game) /* Print quest message if appropriate */ if (!p_ptr->inside_quest && (p_ptr->dungeon_idx == DUNGEON_ANGBAND)) { - quest_discovery(random_quest_number(dun_level)); - p_ptr->inside_quest = random_quest_number(dun_level); + quest_discovery(random_quest_number(current_floor_ptr->dun_level)); + p_ptr->inside_quest = random_quest_number(current_floor_ptr->dun_level); } - if ((dun_level == d_info[p_ptr->dungeon_idx].maxdepth) && d_info[p_ptr->dungeon_idx].final_guardian) + if ((current_floor_ptr->dun_level == d_info[p_ptr->dungeon_idx].maxdepth) && d_info[p_ptr->dungeon_idx].final_guardian) { if (r_info[d_info[p_ptr->dungeon_idx].final_guardian].max_num) #ifdef JP @@ -5414,15 +5270,15 @@ static void dungeon(bool load_game) /*** Process this dungeon level ***/ /* Reset the monster generation level */ - monster_level = base_level; + current_floor_ptr->monster_level = current_floor_ptr->base_level; /* Reset the object generation level */ - object_level = base_level; + current_floor_ptr->object_level = current_floor_ptr->base_level; is_loading_now = TRUE; if (p_ptr->energy_need > 0 && !p_ptr->inside_battle && - (dun_level || p_ptr->leaving_dungeon || p_ptr->inside_arena)) + (current_floor_ptr->dun_level || p_ptr->leaving_dungeon || p_ptr->inside_arena)) p_ptr->energy_need = 0; /* Not leaving dungeon */ @@ -5435,14 +5291,14 @@ static void dungeon(bool load_game) while (TRUE) { /* Hack -- Compact the monster list occasionally */ - if ((m_cnt + 32 > max_m_idx) && !p_ptr->inside_battle) compact_monsters(64); + if ((m_cnt + 32 > current_floor_ptr->max_m_idx) && !p_ptr->inside_battle) compact_monsters(64); /* Hack -- Compress the monster list occasionally */ if ((m_cnt + 32 < m_max) && !p_ptr->inside_battle) compact_monsters(0); /* Hack -- Compact the object list occasionally */ - if (o_cnt + 32 > max_o_idx) compact_objects(64); + if (o_cnt + 32 > current_floor_ptr->max_o_idx) compact_objects(64); /* Hack -- Compress the object list occasionally */ if (o_cnt + 32 < o_max) compact_objects(0); @@ -5451,7 +5307,6 @@ static void dungeon(bool load_game) process_player(); process_upkeep_with_speed(); - /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */ handle_stuff(); /* Hack -- Hilite the player */ @@ -5492,12 +5347,12 @@ static void dungeon(bool load_game) if (!p_ptr->playing || p_ptr->is_dead) break; /* Count game turns */ - turn++; + current_world_ptr->game_turn++; - if (dungeon_turn < dungeon_turn_limit) + if (current_world_ptr->dungeon_turn < current_world_ptr->dungeon_turn_limit) { - if (!p_ptr->wild_mode || wild_regen) dungeon_turn++; - else if (p_ptr->wild_mode && !(turn % ((MAX_HGT + MAX_WID) / 2))) dungeon_turn++; + if (!p_ptr->wild_mode || wild_regen) current_world_ptr->dungeon_turn++; + else if (p_ptr->wild_mode && !(current_world_ptr->game_turn % ((MAX_HGT + MAX_WID) / 2))) current_world_ptr->dungeon_turn++; } prevent_turn_overflow(); @@ -5647,8 +5502,8 @@ void determine_bounty_uniques(void) { while (1) { - kubi_r_idx[i] = get_mon_num(MAX_DEPTH - 1); - r_ptr = &r_info[kubi_r_idx[i]]; + current_world_ptr->bounty_r_idx[i] = get_mon_num(MAX_DEPTH - 1); + r_ptr = &r_info[current_world_ptr->bounty_r_idx[i]]; if (!(r_ptr->flags1 & RF1_UNIQUE)) continue; @@ -5656,10 +5511,10 @@ void determine_bounty_uniques(void) if (r_ptr->rarity > 100) continue; - if (no_questor_or_bounty_uniques(kubi_r_idx[i])) continue; + if (no_questor_or_bounty_uniques(current_world_ptr->bounty_r_idx[i])) continue; for (j = 0; j < i; j++) - if (kubi_r_idx[i] == kubi_r_idx[j]) break; + if (current_world_ptr->bounty_r_idx[i] == current_world_ptr->bounty_r_idx[j]) break; if (j == i) break; } @@ -5670,11 +5525,11 @@ void determine_bounty_uniques(void) { for (j = i; j < MAX_KUBI; j++) { - if (r_info[kubi_r_idx[i]].level > r_info[kubi_r_idx[j]].level) + if (r_info[current_world_ptr->bounty_r_idx[i]].level > r_info[current_world_ptr->bounty_r_idx[j]].level) { - tmp = kubi_r_idx[i]; - kubi_r_idx[i] = kubi_r_idx[j]; - kubi_r_idx[j] = tmp; + tmp = current_world_ptr->bounty_r_idx[i]; + current_world_ptr->bounty_r_idx[i] = current_world_ptr->bounty_r_idx[j]; + current_world_ptr->bounty_r_idx[j] = tmp; } } } @@ -5779,7 +5634,7 @@ void play_game(bool new_game) } } - /* Hack -- turn off the cursor */ + /* Hack -- current_world_ptr->game_turn off the cursor */ (void)Term_set_cursor(0); @@ -5821,7 +5676,7 @@ void play_game(bool new_game) highscore_fd = fd_open(buf, O_RDWR); /* 町名消失バグ対策(#38205) Init the wilderness */ - process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x); + process_dungeon_file("w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x); /* Handle score, show Top scores */ success = send_world_score(TRUE); @@ -5894,7 +5749,7 @@ void play_game(bool new_game) character_dungeon = FALSE; /* Start in town */ - dun_level = 0; + current_floor_ptr->dun_level = 0; p_ptr->inside_quest = 0; p_ptr->inside_arena = FALSE; p_ptr->inside_battle = FALSE; @@ -5938,7 +5793,7 @@ void play_game(bool new_game) p_ptr->riding = 0; for (i = m_max; i > 0; i--) { - if (player_bold(m_list[i].fy, m_list[i].fx)) + if (player_bold(current_floor_ptr->m_list[i].fy, current_floor_ptr->m_list[i].fx)) { p_ptr->riding = i; break; @@ -5951,15 +5806,15 @@ void play_game(bool new_game) p_ptr->teleport_town = FALSE; p_ptr->sutemi = FALSE; - world_monster = FALSE; - now_damaged = FALSE; + current_world_ptr->timewalk_m_idx = 0; + p_ptr->now_damaged = FALSE; now_message = 0; start_time = time(NULL) - 1; record_o_name[0] = '\0'; /* Reset map panel */ - panel_row_min = cur_hgt; - panel_col_min = cur_wid; + panel_row_min = current_floor_ptr->height; + panel_col_min = current_floor_ptr->width; /* Sexy gal gets bonus to maximum weapon skill of whip */ if (p_ptr->pseikaku == SEIKAKU_SEXY) @@ -6004,11 +5859,11 @@ void play_game(bool new_game) } /* Initialize the town-buildings if necessary */ - if (!dun_level && !p_ptr->inside_quest) + if (!current_floor_ptr->dun_level && !p_ptr->inside_quest) { /* Init the wilderness */ - process_dungeon_file("w_info.txt", 0, 0, max_wild_y, max_wild_x); + process_dungeon_file("w_info.txt", 0, 0, current_world_ptr->max_wild_y, current_world_ptr->max_wild_x); /* Init the town */ init_flags = INIT_ONLY_BUILDINGS; @@ -6099,7 +5954,7 @@ void play_game(bool new_game) monster_race *r_ptr = &r_info[pet_r_idx]; place_monster_aux(0, p_ptr->y, p_ptr->x - 1, pet_r_idx, (PM_FORCE_PET | PM_NO_KAGE)); - m_ptr = &m_list[hack_m_idx_ii]; + m_ptr = ¤t_floor_ptr->m_list[hack_m_idx_ii]; m_ptr->mspeed = r_ptr->speed; m_ptr->maxhp = r_ptr->hdice*(r_ptr->hside+1)/2; m_ptr->max_maxhp = m_ptr->maxhp; @@ -6139,7 +5994,7 @@ void play_game(bool new_game) /* Handle "quit and save" */ if (!p_ptr->playing && !p_ptr->is_dead) break; - /* Erase the old grid_array */ + /* Erase the old current_floor_ptr->grid_array */ wipe_o_list(); if (!p_ptr->is_dead) wipe_m_list(); @@ -6224,15 +6079,15 @@ void prevent_turn_overflow(void) int rollback_days, i, j; s32b rollback_turns; - if (turn < turn_limit) return; + if (current_world_ptr->game_turn < current_world_ptr->game_turn_limit) return; - rollback_days = 1 + (turn - turn_limit) / (TURNS_PER_TICK * TOWN_DAWN); + rollback_days = 1 + (current_world_ptr->game_turn - current_world_ptr->game_turn_limit) / (TURNS_PER_TICK * TOWN_DAWN); rollback_turns = TURNS_PER_TICK * TOWN_DAWN * rollback_days; - if (turn > rollback_turns) turn -= rollback_turns; - else turn = 1; /* Paranoia */ - if (old_turn > rollback_turns) old_turn -= rollback_turns; - else old_turn = 1; + if (current_world_ptr->game_turn > rollback_turns) current_world_ptr->game_turn -= rollback_turns; + else current_world_ptr->game_turn = 1; + if (current_floor_ptr->generated_turn > rollback_turns) current_floor_ptr->generated_turn -= rollback_turns; + else current_floor_ptr->generated_turn = 1; if (old_battle > rollback_turns) old_battle -= rollback_turns; else old_battle = 1; if (p_ptr->feeling_turn > rollback_turns) p_ptr->feeling_turn -= rollback_turns; @@ -6258,3 +6113,122 @@ void prevent_turn_overflow(void) } } } + +/*! + * @brief ゲーム終了処理 / + * Close up the current game (player may or may not be dead) + * @return なし + * @details + *
+ * This function is called only from "main.c" and "signals.c".
+ * 
+ */ +void close_game(void) +{ + char buf[1024]; + bool do_send = TRUE; + + /* concptr p = "[i:キャラクタの情報, f:ファイル書き出し, t:スコア, x:*鑑定*, ESC:ゲーム終了]"; */ + handle_stuff(); + + /* Flush the messages */ + msg_print(NULL); + + /* Flush the input */ + flush(); + + + /* No suspending now */ + signals_ignore_tstp(); + + + /* Hack -- Character is now "icky" */ + character_icky = TRUE; + + + /* Build the filename */ + path_build(buf, sizeof(buf), ANGBAND_DIR_APEX, "scores.raw"); + + /* Grab permissions */ + safe_setuid_grab(); + + /* Open the high score file, for reading/writing */ + highscore_fd = fd_open(buf, O_RDWR); + + /* Drop permissions */ + safe_setuid_drop(); + + /* Handle death */ + if (p_ptr->is_dead) + { + /* Handle retirement */ + if (p_ptr->total_winner) kingly(); + + /* Save memories */ + if (!cheat_save || get_check(_("死んだデータをセーブしますか? ", "Save death? "))) + { + if (!save_player()) msg_print(_("セーブ失敗!", "death save failed!")); + } + else do_send = FALSE; + + /* You are dead */ + print_tomb(); + + flush(); + + /* Show more info */ + show_info(); + Term_clear(); + + if (check_score()) + { + if ((!send_world_score(do_send))) + { + if (get_check_strict(_("後でスコアを登録するために待機しますか?", "Stand by for later score registration? "), + (CHECK_NO_ESCAPE | CHECK_NO_HISTORY))) + { + p_ptr->wait_report_score = TRUE; + p_ptr->is_dead = FALSE; + if (!save_player()) msg_print(_("セーブ失敗!", "death save failed!")); + } + } + if (!p_ptr->wait_report_score) + (void)top_twenty(); + } + else if (highscore_fd >= 0) + { + display_scores_aux(0, 10, -1, NULL); + } +#if 0 + /* Dump bones file */ + make_bones(); +#endif + } + + /* Still alive */ + else + { + /* Save the game */ + do_cmd_save_game(FALSE); + + /* Prompt for scores */ + prt(_("リターンキーか ESC キーを押して下さい。", "Press Return (or Escape)."), 0, 40); + play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_EXIT); + + /* Predict score (or ESCAPE) */ + if (inkey() != ESCAPE) predict_score(); + } + + + /* Shut the high score file */ + (void)fd_close(highscore_fd); + + /* Forget the high score fd */ + highscore_fd = -1; + + /* Kill all temporal files */ + clear_saved_floor_files(); + + /* Allow suspending now */ + signals_handle_tstp(); +}