OSDN Git Service

Fixed buffer over run of not enough array allocation for object flags by static number
[hengband/hengband.git] / src / dungeon.c
index 1301d00..9cd94fe 100644 (file)
@@ -313,6 +313,7 @@ static void sense_inventory1(void)
                }
 
                case CLASS_PALADIN:
+               case CLASS_SNIPER:
                {
                        /* Bad sensing */
                        if (0 != randint0(77777L / (plev * plev + 40))) return;
@@ -476,6 +477,7 @@ static void sense_inventory2(void)
                case CLASS_SAMURAI:
                case CLASS_CAVALRY:
                case CLASS_BERSERKER:
+               case CLASS_SNIPER:
                {
                        return;
                }
@@ -629,7 +631,7 @@ static void pattern_teleport(void)
                sprintf(tmp_val, "%d", dun_level);
 
                /* Ask for a level */
-               if (!get_string(ppp, tmp_val, 10, TRUE)) return;
+               if (!get_string(ppp, tmp_val, 10)) return;
 
                /* Extract request */
                command_arg = atoi(tmp_val);
@@ -639,9 +641,8 @@ static void pattern_teleport(void)
 #else
        else if (get_check("Normal teleport? "))
 #endif
-
        {
-               teleport_player(200, FALSE);
+               teleport_player(200, 0L);
                return;
        }
        else
@@ -689,7 +690,7 @@ static void pattern_teleport(void)
 static void wreck_the_pattern(void)
 {
        int to_ruin = 0, r_y, r_x;
-       int pattern_type = f_info[cave[py][px].feat].power;
+       int pattern_type = f_info[cave[py][px].feat].subtype;
 
        if (pattern_type == PATTERN_TILE_WRECKED)
        {
@@ -719,13 +720,13 @@ static void wreck_the_pattern(void)
                scatter(&r_y, &r_x, py, px, 4, 0);
 
                if (pattern_tile(r_y, r_x) &&
-                   (f_info[cave[r_y][r_x].feat].power != PATTERN_TILE_WRECKED))
+                   (f_info[cave[r_y][r_x].feat].subtype != PATTERN_TILE_WRECKED))
                {
-                       cave_set_feat(r_y, r_x, FEAT_PATTERN_XTRA2);
+                       cave_set_feat(r_y, r_x, feat_pattern_corrupted);
                }
        }
 
-       cave_set_feat(py, px, FEAT_PATTERN_XTRA2);
+       cave_set_feat(py, px, feat_pattern_corrupted);
 }
 
 
@@ -742,7 +743,7 @@ static bool pattern_effect(void)
                wreck_the_pattern();
        }
 
-       pattern_type = f_info[cave[py][px].feat].power;
+       pattern_type = f_info[cave[py][px].feat].subtype;
 
        switch (pattern_type)
        {
@@ -762,7 +763,7 @@ static bool pattern_effect(void)
                (void)restore_level();
                (void)hp_player(1000);
 
-               cave_set_feat(py, px, FEAT_PATTERN_OLD);
+               cave_set_feat(py, px, feat_pattern_old);
 
 #ifdef JP
                msg_print("¡Ö¥Ñ¥¿¡¼¥ó¡×¤Î¤³¤ÎÉôʬ¤Ï¾¤ÎÉôʬ¤è¤ê¶¯ÎϤǤʤ¤¤è¤¦¤À¡£");
@@ -868,9 +869,10 @@ static void regenhp(int percent)
 /*
  * Regenerate mana points
  */
-static void regenmana(int percent)
+static void regenmana(int upkeep_factor, int regen_amount)
 {
        s32b old_csp = p_ptr->csp;
+       s32b regen_rate = regen_amount * 100 - upkeep_factor * PY_REGEN_NORMAL;
 
        /*
         * Excess mana will decay 32 times faster than normal
@@ -897,11 +899,11 @@ static void regenmana(int percent)
        }
 
        /* Regenerating mana (unless the player has excess mana) */
-       else if (percent > 0)
+       else if (regen_rate > 0)
        {
                /* (percent/100) is the Regen factor in unit (1/2^16) */
                s32b new_mana = 0;
-               u32b new_mana_frac = (p_ptr->msp * percent / 100 + PY_REGEN_MNBASE);
+               u32b new_mana_frac = (p_ptr->msp * regen_rate / 100 + PY_REGEN_MNBASE);
 
                /* Convert the unit (1/2^16) to (1/2^32) */
                s64b_LSHIFT(new_mana, new_mana_frac, 16);
@@ -919,11 +921,11 @@ static void regenmana(int percent)
 
 
        /* Reduce mana (even when the player has excess mana) */
-       if (percent < 0)
+       if (regen_rate < 0)
        {
                /* PY_REGEN_NORMAL is the Regen factor in unit (1/2^16) */
                s32b reduce_mana = 0;
-               u32b reduce_mana_frac = (p_ptr->msp * PY_REGEN_NORMAL + PY_REGEN_MNBASE);
+               u32b reduce_mana_frac = (p_ptr->msp * (-1) * regen_rate / 100 + PY_REGEN_MNBASE);
 
                /* Convert the unit (1/2^16) to (1/2^32) */
                s64b_LSHIFT(reduce_mana, reduce_mana_frac, 16);
@@ -958,17 +960,22 @@ static void regenmana(int percent)
 
 /*
  * Regenerate magic
+ * regen_amount: PY_REGEN_NORMAL * 2 (if resting) * 2 (if having regenarate)
  */
-static void regenmagic(int percent)
+static void regenmagic(int regen_amount)
 {
-       s32b        new_mana;
+       s32b new_mana;
        int i;
+       int dev = 30;
+       int mult = (dev + adj_mag_mana[p_ptr->stat_ind[A_INT]]); /* x1 to x2 speed bonus for recharging */
 
        for (i = 0; i < EATER_EXT*2; i++)
        {
                if (!p_ptr->magic_num2[i]) continue;
                if (p_ptr->magic_num1[i] == ((long)p_ptr->magic_num2[i] << 16)) continue;
-               new_mana = ((long)p_ptr->magic_num2[i]+adj_mag_mana[A_INT]+13) * percent / 8;
+
+               /* Increase remaining charge number like float value */
+               new_mana = (regen_amount * mult * ((long)p_ptr->magic_num2[i] + 13)) / (dev * 8);
                p_ptr->magic_num1[i] += new_mana;
 
                /* Check maximum charge */
@@ -982,7 +989,13 @@ static void regenmagic(int percent)
        {
                if (!p_ptr->magic_num1[i]) continue;
                if (!p_ptr->magic_num2[i]) continue;
-               p_ptr->magic_num1[i] -= (long)(p_ptr->magic_num2[i] * (adj_mag_mana[A_INT] + 10)) * EATER_ROD_CHARGE/16;
+
+               /* Decrease remaining period for charging */
+               new_mana = (regen_amount * mult * ((long)p_ptr->magic_num2[i] + 10) * EATER_ROD_CHARGE) 
+                                       / (dev * 16 * PY_REGEN_NORMAL); 
+               p_ptr->magic_num1[i] -= new_mana;
+
+               /* Check minimum remaining period for charging */
                if (p_ptr->magic_num1[i] < 0) p_ptr->magic_num1[i] = 0;
                wild_regen = 20;
        }
@@ -1116,7 +1129,7 @@ static void notice_lite_change(object_type *o_ptr)
        /* The light is now out */
        else if (o_ptr->xtra4 == 0)
        {
-               disturb(0, 0);
+               disturb(0, 1);
 #ifdef JP
 msg_print("ÌÀ¤«¤ê¤¬¾Ã¤¨¤Æ¤·¤Þ¤Ã¤¿¡ª");
 #else
@@ -1136,7 +1149,7 @@ msg_print("
                if ((o_ptr->xtra4 < 50) && (!(o_ptr->xtra4 % 5))
                    && (turn % (TURNS_PER_TICK*2)))
                {
-                       if (disturb_minor) disturb(0, 0);
+                       if (disturb_minor) disturb(0, 1);
 #ifdef JP
 msg_print("ÌÀ¤«¤ê¤¬Èù¤«¤Ë¤Ê¤Ã¤Æ¤­¤Æ¤¤¤ë¡£");
 #else
@@ -1149,7 +1162,7 @@ msg_print("
        /* The light is getting dim */
        else if ((o_ptr->xtra4 < 100) && (!(o_ptr->xtra4 % 10)))
        {
-               if (disturb_minor) disturb(0, 0);
+               if (disturb_minor) disturb(0, 1);
 #ifdef JP
 msg_print("ÌÀ¤«¤ê¤¬Èù¤«¤Ë¤Ê¤Ã¤Æ¤­¤Æ¤¤¤ë¡£");
 #else
@@ -1166,23 +1179,64 @@ void leave_quest_check(void)
        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 = (byte)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 = (byte)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);
+                       }
+               }
+       }
+}
+
+void leave_tower_check(void)
+{
+       leaving_quest = p_ptr->inside_quest;
+       /* Check for Tower Quest */
        if (leaving_quest &&
-           ((quest[leaving_quest].flags & QUEST_FLAG_ONCE)  || (quest[leaving_quest].type == QUEST_TYPE_RANDOM)) &&
-           (quest[leaving_quest].status == QUEST_STATUS_TAKEN))
+               (quest[leaving_quest].type == QUEST_TYPE_TOWER) &&
+               (quest[QUEST_TOWER1].status != QUEST_STATUS_COMPLETED))
        {
-               quest[leaving_quest].status = QUEST_STATUS_FAILED;
-               quest[leaving_quest].complev = (byte)p_ptr->lev;
-               if (quest[leaving_quest].type == QUEST_TYPE_RANDOM)
+               if(quest[leaving_quest].type == QUEST_TYPE_TOWER)
                {
-                       r_info[quest[leaving_quest].r_idx].flags1 &= ~(RF1_QUESTOR);
-                       if (record_rand_quest)
-                               do_cmd_write_nikki(NIKKI_RAND_QUEST_F, leaving_quest, NULL);
-
-                       /* Floor of random quest will be blocked */
-                       prepare_change_floor_mode(CFM_NO_RETURN);
+                       quest[QUEST_TOWER1].status = QUEST_STATUS_FAILED;
+                       quest[QUEST_TOWER1].complev = (byte)p_ptr->lev;
+                       update_playtime();
+                       quest[QUEST_TOWER1].comptime = playtime;
                }
-               else if (record_fix_quest)
-                       do_cmd_write_nikki(NIKKI_FIX_QUEST_F, leaving_quest, NULL);
        }
 }
 
@@ -1278,6 +1332,9 @@ msg_format("%s
        /* "Inscribe" it */
        o_ptr->feeling = feel;
 
+       /* Player touches it */
+       o_ptr->marked |= OM_TOUCHED;
+
        /* Combine / Reorder the pack (later) */
        p_ptr->notice |= (PN_COMBINE | PN_REORDER);
 
@@ -1370,7 +1427,7 @@ static void recharged_notice(object_type *o_ptr)
 
 static void check_music(void)
 {
-       magic_type *s_ptr;
+       const magic_type *s_ptr;
        int spell;
        s32b need_mana;
        u32b need_mana_frac;
@@ -1462,6 +1519,48 @@ static object_type *choose_cursed_obj_name(u32b flag)
                        choices[number] = i;
                        number++;
                }
+               else if ((flag == TRC_ADD_L_CURSE) || 
+                                       (flag == TRC_ADD_H_CURSE) || 
+                                       (flag == TRC_DRAIN_HP) || 
+                                       (flag == TRC_DRAIN_MANA) || 
+                                       (flag == TRC_CALL_ANIMAL) || 
+                                       (flag == TRC_CALL_DEMON) || 
+                                       (flag == TRC_CALL_DRAGON) || 
+                                       (flag == TRC_CALL_UNDEAD) || 
+                                       (flag == TRC_COWARDICE) || 
+                                       (flag == TRC_LOW_MELEE) || 
+                                       (flag == TRC_LOW_AC) || 
+                                       (flag == TRC_LOW_MAGIC) || 
+                                       (flag == TRC_FAST_DIGEST) || 
+                                       (flag == TRC_SLOW_REGEN) )
+               {
+                       u32b cf;
+                       u32b flgs[TR_FLAG_SIZE];
+                       object_flags(o_ptr, flgs);
+                       switch (flag)
+                       {
+                         case TRC_ADD_L_CURSE  : cf = TR_ADD_L_CURSE; break;
+                         case TRC_ADD_H_CURSE  : cf = TR_ADD_H_CURSE; break;
+                         case TRC_DRAIN_HP             : cf = TR_DRAIN_HP; break;
+                         case TRC_DRAIN_MANA   : cf = TR_DRAIN_MANA; break;
+                         case TRC_CALL_ANIMAL  : cf = TR_CALL_ANIMAL; break;
+                         case TRC_CALL_DEMON   : cf = TR_CALL_DEMON; break;
+                         case TRC_CALL_DRAGON  : cf = TR_CALL_DRAGON; break;
+                         case TRC_CALL_UNDEAD  : cf = TR_CALL_UNDEAD; break;
+                         case TRC_COWARDICE    : cf = TR_COWARDICE; break;
+                         case TRC_LOW_MELEE    : cf = TR_LOW_MELEE; break;
+                         case TRC_LOW_AC               : cf = TR_LOW_AC; break;
+                         case TRC_LOW_MAGIC    : cf = TR_LOW_MAGIC; break;
+                         case TRC_FAST_DIGEST  : cf = TR_FAST_DIGEST; break;
+                         case TRC_SLOW_REGEN   : cf = TR_SLOW_REGEN; break;
+                         default                               : break;
+                       }
+                       if (have_flag(flgs, cf))
+                       {
+                               choices[number] = i;
+                               number++;
+                       }
+               }
        }
 
        /* Choice one of them */
@@ -1477,7 +1576,6 @@ static void process_world_aux_hp_and_sp(void)
        feature_type *f_ptr = &f_info[cave[py][px].feat];
        bool cave_no_regen = FALSE;
        int upkeep_factor = 0;
-       int upkeep_regen;
 
        /* Default regeneration */
        int regen_amount = PY_REGEN_NORMAL;
@@ -1816,8 +1914,7 @@ take_hit(DAMAGE_NOESCAPE, damage, "
        }
 
        /* Regenerate the mana */
-       upkeep_regen = (100 - upkeep_factor) * regen_amount;
-       regenmana(upkeep_regen);
+       regenmana(upkeep_factor, regen_amount);
 
 
        /* Recharge magic eater's power */
@@ -2222,7 +2319,7 @@ static void process_world_aux_mutation(void)
 
        if ((p_ptr->muta2 & MUT2_BERS_RAGE) && one_in_(3000))
        {
-               disturb(0, 0);
+               disturb(0, 1);
 #ifdef JP
                msg_print("¥¦¥¬¥¡¥¡¥¢¡ª");
                msg_print("·ãÅܤÎȯºî¤Ë½±¤ï¤ì¤¿¡ª");
@@ -2232,13 +2329,14 @@ static void process_world_aux_mutation(void)
 #endif
 
                (void)set_shero(10 + randint1(p_ptr->lev), FALSE);
+               (void)set_afraid(0);
        }
 
        if ((p_ptr->muta2 & MUT2_COWARDICE) && (randint1(3000) == 13))
        {
                if (!p_ptr->resist_fear)
                {
-                       disturb(0, 0);
+                       disturb(0, 1);
 #ifdef JP
                        msg_print("¤È¤Æ¤â°Å¤¤... ¤È¤Æ¤â¶²¤¤¡ª");
 #else
@@ -2254,7 +2352,7 @@ static void process_world_aux_mutation(void)
                if (!p_ptr->resist_nexus && !(p_ptr->muta1 & MUT1_VTELEPORT) &&
                    !p_ptr->anti_tele)
                {
-                       disturb(0, 0);
+                       disturb(0, 1);
 
                        /* Teleport player */
 #ifdef JP
@@ -2264,7 +2362,7 @@ static void process_world_aux_mutation(void)
 #endif
 
                        msg_print(NULL);
-                       teleport_player(40, TRUE);
+                       teleport_player(40, TELEPORT_PASSIVE);
                }
        }
 
@@ -2272,7 +2370,7 @@ static void process_world_aux_mutation(void)
        {
                if (!p_ptr->resist_conf && !p_ptr->resist_chaos)
                {
-                       disturb(0, 0);
+                       disturb(0, 1);
                        p_ptr->redraw |= PR_EXTRA;
 #ifdef JP
                        msg_print("¤¤¤Ò¤­¤¬¤â¡¼¤í¡¼¤È¤Ò¤Æ¤­¤¿¤­¤¬¤Õ¤ë...¥Ò¥Ã¥¯¡ª");
@@ -2294,7 +2392,7 @@ static void process_world_aux_mutation(void)
                                msg_print(NULL);
                                if (one_in_(3)) lose_all_info();
                                else wiz_dark();
-                               (void)teleport_player_aux(100, TRUE, TRUE);
+                               (void)teleport_player_aux(100, TELEPORT_NONMAGICAL | TELEPORT_PASSIVE);
                                wiz_dark();
 #ifdef JP
                                msg_print("¤¢¤Ê¤¿¤Ï¸«ÃΤé¤Ì¾ì½ê¤ÇÌܤ¬Àä᤿...Ƭ¤¬Äˤ¤¡£");
@@ -2325,7 +2423,7 @@ static void process_world_aux_mutation(void)
        {
                if (!p_ptr->resist_chaos)
                {
-                       disturb(0, 0);
+                       disturb(0, 1);
                        p_ptr->redraw |= PR_EXTRA;
                        (void)set_image(p_ptr->image + randint0(50) + 20);
                }
@@ -2333,7 +2431,7 @@ static void process_world_aux_mutation(void)
 
        if ((p_ptr->muta2 & MUT2_FLATULENT) && (randint1(3000) == 13))
        {
-               disturb(0, 0);
+               disturb(0, 1);
 
 #ifdef JP
                msg_print("¥Ö¥¥¡¼¡¼¥Ã¡ª¤ª¤Ã¤È¡£");
@@ -2349,7 +2447,7 @@ static void process_world_aux_mutation(void)
            !p_ptr->anti_magic && one_in_(9000))
        {
                int dire = 0;
-               disturb(0, 0);
+               disturb(0, 1);
 #ifdef JP
                msg_print("ËâË¡¤Î¥¨¥Í¥ë¥®¡¼¤¬ÆÍÁ³¤¢¤Ê¤¿¤ÎÃæ¤Ëή¤ì¹þ¤ó¤Ç¤­¤¿¡ª¥¨¥Í¥ë¥®¡¼¤ò²òÊü¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡ª");
 #else
@@ -2380,13 +2478,13 @@ static void process_world_aux_mutation(void)
                        msg_print("You have attracted a demon!");
 #endif
 
-                       disturb(0, 0);
+                       disturb(0, 1);
                }
        }
 
        if ((p_ptr->muta2 & MUT2_SPEED_FLUX) && one_in_(6000))
        {
-               disturb(0, 0);
+               disturb(0, 1);
                if (one_in_(2))
                {
 #ifdef JP
@@ -2425,7 +2523,7 @@ static void process_world_aux_mutation(void)
        }
        if ((p_ptr->muta2 & MUT2_BANISH_ALL) && one_in_(9000))
        {
-               disturb(0, 0);
+               disturb(0, 1);
 #ifdef JP
                msg_print("ÆÍÁ³¤Û¤È¤ó¤É¸ÉÆȤˤʤ俵¤¤¬¤¹¤ë¡£");
 #else
@@ -2523,14 +2621,14 @@ static void process_world_aux_mutation(void)
                        msg_print("You have attracted an animal!");
 #endif
 
-                       disturb(0, 0);
+                       disturb(0, 1);
                }
        }
 
        if ((p_ptr->muta2 & MUT2_RAW_CHAOS) &&
            !p_ptr->anti_magic && one_in_(8000))
        {
-               disturb(0, 0);
+               disturb(0, 1);
 #ifdef JP
                msg_print("¼þ¤ê¤Î¶õ´Ö¤¬ÏĤó¤Ç¤¤¤ëµ¤¤¬¤¹¤ë¡ª");
 #else
@@ -2552,7 +2650,7 @@ static void process_world_aux_mutation(void)
        }
        if ((p_ptr->muta2 & MUT2_WRAITH) && !p_ptr->anti_magic && one_in_(3000))
        {
-               disturb(0, 0);
+               disturb(0, 1);
 #ifdef JP
                msg_print("Èóʪ¼Á²½¤·¤¿¡ª");
 #else
@@ -2603,7 +2701,7 @@ static void process_world_aux_mutation(void)
 
                if (!sustained)
                {
-                       disturb(0, 0);
+                       disturb(0, 1);
 #ifdef JP
                        msg_print("¼«Ê¬¤¬¿ê¼å¤·¤Æ¤¤¤¯¤Î¤¬Ê¬¤«¤ë¡ª");
 #else
@@ -2631,7 +2729,7 @@ static void process_world_aux_mutation(void)
                        msg_print("You have attracted a dragon!");
 #endif
 
-                       disturb(0, 0);
+                       disturb(0, 1);
                }
        }
        if ((p_ptr->muta2 & MUT2_WEIRD_MIND) && !p_ptr->anti_magic &&
@@ -2661,7 +2759,7 @@ static void process_world_aux_mutation(void)
        if ((p_ptr->muta2 & MUT2_NAUSEA) && !p_ptr->slow_digest &&
            one_in_(9000))
        {
-               disturb(0, 0);
+               disturb(0, 1);
 #ifdef JP
                msg_print("°ß¤¬áÛÚ»¤·¡¢¿©»ö¤ò¼º¤Ã¤¿¡ª");
 #else
@@ -2671,6 +2769,7 @@ static void process_world_aux_mutation(void)
                msg_print(NULL);
                set_food(PY_FOOD_WEAK);
                if (music_singing_any()) stop_singing();
+               if (hex_spelling_any()) stop_hex_spell_all();
        }
 
        if ((p_ptr->muta2 & MUT2_WALK_SHAD) &&
@@ -2744,7 +2843,7 @@ static void process_world_aux_mutation(void)
        if ((p_ptr->muta2 & MUT2_INVULN) && !p_ptr->anti_magic &&
            one_in_(5000))
        {
-               disturb(0, 0);
+               disturb(0, 1);
 #ifdef JP
                msg_print("̵Ũ¤Êµ¤¤¬¤¹¤ë¡ª");
 #else
@@ -2805,7 +2904,7 @@ static void process_world_aux_mutation(void)
                int slot = 0;
                object_type *o_ptr = NULL;
 
-               disturb(0, 0);
+               disturb(0, 1);
 #ifdef JP
                msg_print("­¤¬¤â¤Ä¤ì¤Æž¤ó¤À¡ª");
                take_hit(DAMAGE_NOESCAPE, randint1(p_ptr->wt / 6), "žÅÝ", -1);
@@ -2835,7 +2934,7 @@ static void process_world_aux_mutation(void)
                if (slot && !object_is_cursed(o_ptr))
                {
 #ifdef JP
-                       msg_print("Éð´ï¤òÍ¤Æ¤·¤Þ¤Ã¤¿¡ª");
+                       msg_print("Éð´ï¤òÍî¤Ȥ·¤Æ¤·¤Þ¤Ã¤¿¡ª");
 #else
                        msg_print("You drop your weapon!");
 #endif
@@ -2844,7 +2943,6 @@ static void process_world_aux_mutation(void)
        }
 }
 
-
 /*
  * Handle curse effects once every 10 game turns
  */
@@ -2860,23 +2958,32 @@ static void process_world_aux_curse(void)
                {
                        char o_name[MAX_NLEN];
                        object_type *o_ptr;
-                       int i;
+                       int i, i_keep = 0, count = 0;
 
                        /* Scan the equipment with random teleport ability */
                        for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
                        {
                                u32b flgs[TR_FLAG_SIZE];
                                o_ptr = &inventory[i];
-                               
+
                                /* Skip non-objects */
                                if (!o_ptr->k_idx) continue;
-                               
+
                                /* Extract the item flags */
                                object_flags(o_ptr, flgs);
-                               
-                               if (have_flag(flgs, TR_TELEPORT)) break;
+
+                               if (have_flag(flgs, TR_TELEPORT))
+                               {
+                                       /* {.} will stop random teleportation. */
+                                       if (!o_ptr->inscription || !my_strchr(quark_str(o_ptr->inscription), '.'))
+                                       {
+                                               count++;
+                                               if (one_in_(count)) i_keep = i;
+                                       }
+                               }
                        }
 
+                       o_ptr = &inventory[i_keep];
                        object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
 
 #ifdef JP
@@ -2891,8 +2998,8 @@ static void process_world_aux_curse(void)
                        if (get_check_strict("Teleport? ", CHECK_OKAY_CANCEL))
 #endif
                        {
-                               disturb(0, 0);
-                               teleport_player(50, FALSE);
+                               disturb(0, 1);
+                               teleport_player(50, 0L);
                        }
                        else
                        {
@@ -2901,18 +3008,14 @@ static void process_world_aux_curse(void)
 #else
                                msg_format("You can inscribe {.} on your %s to disable random teleportation. ", o_name);
 #endif
-                               disturb(1, 0);
+                               disturb(1, 1);
                        }
                }
                /* Make a chainsword noise */
                if ((p_ptr->cursed & TRC_CHAINSWORD) && one_in_(CHAINSWORD_NOISE))
                {
                        char noise[1024];
-#ifdef JP
-                       if (!get_rnd_line("chainswd_j.txt", 0, noise))
-#else
-                       if (!get_rnd_line("chainswd.txt", 0, noise))
-#endif
+                       if (!get_rnd_line(_("chainswd_j.txt", "chainswd.txt"), 0, noise))
                                msg_print(noise);
                        disturb(FALSE, FALSE);
                }
@@ -2948,11 +3051,7 @@ static void process_world_aux_curse(void)
                                object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
 
                                o_ptr->curse_flags |= new_curse;
-#ifdef JP
-                               msg_format("°­°Õ¤ËËþ¤Á¤¿¹õ¤¤¥ª¡¼¥é¤¬%s¤ò¤È¤ê¤Þ¤¤¤¿...", o_name);
-#else
-                               msg_format("There is a malignant black aura surrounding your %s...", o_name);
-#endif
+                               msg_format(_("°­°Õ¤ËËþ¤Á¤¿¹õ¤¤¥ª¡¼¥é¤¬%s¤ò¤È¤ê¤Þ¤¤¤¿...", "There is a malignant black aura surrounding your %s..."), o_name);
 
                                o_ptr->feeling = FEEL_NONE;
 
@@ -2975,12 +3074,7 @@ static void process_world_aux_curse(void)
                                object_desc(o_name, o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
 
                                o_ptr->curse_flags |= new_curse;
-#ifdef JP
-                               msg_format("°­°Õ¤ËËþ¤Á¤¿¹õ¤¤¥ª¡¼¥é¤¬%s¤ò¤È¤ê¤Þ¤¤¤¿...", o_name);
-#else
-                               msg_format("There is a malignant black aura surrounding your %s...", o_name);
-#endif
-
+                               msg_format(_("°­°Õ¤ËËþ¤Á¤¿¹õ¤¤¥ª¡¼¥é¤¬%s¤ò¤È¤ê¤Þ¤¤¤¿...", "There is a malignant black aura surrounding your %s..."), o_name);
                                o_ptr->feeling = FEEL_NONE;
 
                                p_ptr->update |= (PU_BONUS);
@@ -2995,13 +3089,8 @@ static void process_world_aux_curse(void)
                                char o_name[MAX_NLEN];
 
                                object_desc(o_name, choose_cursed_obj_name(TRC_CALL_ANIMAL), (OD_OMIT_PREFIX | OD_NAME_ONLY));
-#ifdef JP
-                               msg_format("%s¤¬Æ°Êª¤ò°ú¤­´ó¤»¤¿¡ª", o_name);
-#else
-                               msg_format("Your %s have attracted an animal!", o_name);
-#endif
-
-                               disturb(0, 0);
+                               msg_format(_("%s¤¬Æ°Êª¤ò°ú¤­´ó¤»¤¿¡ª", "Your %s have attracted an animal!"), o_name);
+                               disturb(0, 1);
                        }
                }
                /* Call demon */
@@ -3012,13 +3101,8 @@ static void process_world_aux_curse(void)
                                char o_name[MAX_NLEN];
 
                                object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DEMON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
-#ifdef JP
-                               msg_format("%s¤¬°­Ëâ¤ò°ú¤­´ó¤»¤¿¡ª", o_name);
-#else
-                               msg_format("Your %s have attracted a demon!", o_name);
-#endif
-
-                               disturb(0, 0);
+                               msg_format(_("%s¤¬°­Ëâ¤ò°ú¤­´ó¤»¤¿¡ª", "Your %s have attracted a demon!"), o_name);
+                               disturb(0, 1);
                        }
                }
                /* Call dragon */
@@ -3030,36 +3114,39 @@ static void process_world_aux_curse(void)
                                char o_name[MAX_NLEN];
 
                                object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DRAGON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
-#ifdef JP
-                               msg_format("%s¤¬¥É¥é¥´¥ó¤ò°ú¤­´ó¤»¤¿¡ª", o_name);
-#else
-                               msg_format("Your %s have attracted an animal!", o_name);
-#endif
+                               msg_format(_("%s¤¬¥É¥é¥´¥ó¤ò°ú¤­´ó¤»¤¿¡ª", "Your %s have attracted an dragon!"), o_name);
+                               disturb(0, 1);
+                       }
+               }
+               /* Call undead */
+               if ((p_ptr->cursed & TRC_CALL_UNDEAD) && one_in_(1111))
+               {
+                       if (summon_specific(0, py, px, dun_level, SUMMON_UNDEAD,
+                           (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
+                       {
+                               char o_name[MAX_NLEN];
 
-                               disturb(0, 0);
+                               object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DRAGON), (OD_OMIT_PREFIX | OD_NAME_ONLY));
+                               msg_format(_("%s¤¬»àÎî¤ò°ú¤­´ó¤»¤¿¡ª", "Your %s have attracted an undead!"), o_name);
+                               disturb(0, 1);
                        }
                }
                if ((p_ptr->cursed & TRC_COWARDICE) && one_in_(1500))
                {
                        if (!p_ptr->resist_fear)
                        {
-                               disturb(0, 0);
-#ifdef JP
-                               msg_print("¤È¤Æ¤â°Å¤¤... ¤È¤Æ¤â¶²¤¤¡ª");
-#else
-                               msg_print("It's so dark... so scary!");
-#endif
-
+                               disturb(0, 1);
+                               msg_print(_("¤È¤Æ¤â°Å¤¤... ¤È¤Æ¤â¶²¤¤¡ª", "It's so dark... so scary!"));
                                set_afraid(p_ptr->afraid + 13 + randint1(26));
                        }
                }
                /* Teleport player */
                if ((p_ptr->cursed & TRC_TELEPORT) && one_in_(200) && !p_ptr->anti_tele)
                {
-                       disturb(0, 0);
+                       disturb(0, 1);
 
                        /* Teleport player */
-                       teleport_player(40, TRUE);
+                       teleport_player(40, TELEPORT_PASSIVE);
                }
                /* Handle HP draining */
                if ((p_ptr->cursed & TRC_DRAIN_HP) && one_in_(666))
@@ -3067,24 +3154,16 @@ static void process_world_aux_curse(void)
                        char o_name[MAX_NLEN];
 
                        object_desc(o_name, choose_cursed_obj_name(TRC_DRAIN_HP), (OD_OMIT_PREFIX | OD_NAME_ONLY));
-#ifdef JP
-                       msg_format("%s¤Ï¤¢¤Ê¤¿¤ÎÂÎÎϤòµÛ¼ý¤·¤¿¡ª", o_name);
-#else
-                       msg_format("Your %s drains HP from you!", o_name);
-#endif
+                       msg_format(_("%s¤Ï¤¢¤Ê¤¿¤ÎÂÎÎϤòµÛ¼ý¤·¤¿¡ª", "Your %s drains HP from you!"), o_name);
                        take_hit(DAMAGE_LOSELIFE, MIN(p_ptr->lev*2, 100), o_name, -1);
                }
                /* Handle mana draining */
-               if ((p_ptr->cursed & TRC_DRAIN_MANA) && one_in_(666))
+               if ((p_ptr->cursed & TRC_DRAIN_MANA) && p_ptr->csp && one_in_(666))
                {
                        char o_name[MAX_NLEN];
 
                        object_desc(o_name, choose_cursed_obj_name(TRC_DRAIN_MANA), (OD_OMIT_PREFIX | OD_NAME_ONLY));
-#ifdef JP
-                       msg_format("%s¤Ï¤¢¤Ê¤¿¤ÎËâÎϤòµÛ¼ý¤·¤¿¡ª", o_name);
-#else
-                       msg_format("Your %s drains mana from you!", o_name);
-#endif
+                       msg_format(_("%s¤Ï¤¢¤Ê¤¿¤ÎËâÎϤòµÛ¼ý¤·¤¿¡ª", "Your %s drains mana from you!"), o_name);
                        p_ptr->csp -= MIN(p_ptr->lev, 50);
                        if (p_ptr->csp < 0)
                        {
@@ -3256,18 +3335,15 @@ static void process_world_aux_movement(void)
                if (!p_ptr->word_recall)
                {
                        /* Disturbing! */
-                       disturb(0, 0);
+                       disturb(0, 1);
 
                        /* Determine the level */
-                       if (dun_level || p_ptr->inside_quest)
+                       if (dun_level || p_ptr->inside_quest || p_ptr->enter_dungeon)
                        {
-#ifdef JP
-msg_print("¾å¤Ë°ú¤ÃÄ¥¤ê¤¢¤²¤é¤ì¤ë´¶¤¸¤¬¤¹¤ë¡ª");
-#else
-                               msg_print("You feel yourself yanked upwards!");
-#endif
+                               msg_print(_("¾å¤Ë°ú¤ÃÄ¥¤ê¤¢¤²¤é¤ì¤ë´¶¤¸¤¬¤¹¤ë¡ª",
+                                                       "You feel yourself yanked upwards!"));
 
-                               p_ptr->recall_dungeon = dungeon_type;
+                               if (dungeon_type) p_ptr->recall_dungeon = dungeon_type;
                                if (record_stair)
                                        do_cmd_write_nikki(NIKKI_RECALL, dun_level, NULL);
 
@@ -3275,6 +3351,7 @@ msg_print("
                                dungeon_type = 0;
 
                                leave_quest_check();
+                               leave_tower_check();
 
                                p_ptr->inside_quest = 0;
 
@@ -3282,11 +3359,8 @@ msg_print("
                        }
                        else
                        {
-#ifdef JP
-msg_print("²¼¤Ë°ú¤­¤º¤ê¹ß¤í¤µ¤ì¤ë´¶¤¸¤¬¤¹¤ë¡ª");
-#else
-                               msg_print("You feel yourself yanked downwards!");
-#endif
+                               msg_print(_("²¼¤Ë°ú¤­¤º¤ê¹ß¤í¤µ¤ì¤ë´¶¤¸¤¬¤¹¤ë¡ª",
+                                                       "You feel yourself yanked downwards!"));
 
                                dungeon_type = p_ptr->recall_dungeon;
 
@@ -3342,13 +3416,18 @@ msg_print("
 
                                        for (i = MIN_RANDOM_QUEST; i < MAX_RANDOM_QUEST + 1; i++)
                                        {
-                                               if ((quest[i].type == QUEST_TYPE_RANDOM) &&
-                                                   (quest[i].status == QUEST_STATUS_TAKEN) &&
-                                                   (quest[i].level < dun_level))
+                                               quest_type* const q_ptr = &quest[i];
+
+                                               
+                                               if ((q_ptr->type == QUEST_TYPE_RANDOM) &&
+                                                   (q_ptr->status == QUEST_STATUS_TAKEN) &&
+                                                   (q_ptr->level < dun_level))
                                                {
-                                                       quest[i].status = QUEST_STATUS_FAILED;
-                                                       quest[i].complev = (byte)p_ptr->lev;
-                                                       r_info[quest[i].r_idx].flags1 &= ~(RF1_QUESTOR);
+                                                       q_ptr->status = QUEST_STATUS_FAILED;
+                                                       q_ptr->complev = (byte)p_ptr->lev;
+                                                       update_playtime();
+                                                       q_ptr->comptime = playtime;
+                                                       r_info[q_ptr->r_idx].flags1 &= ~(RF1_QUESTOR);
                                                }
                                        }
                                }
@@ -3375,7 +3454,7 @@ msg_print("
                if (!p_ptr->alter_reality)
                {
                        /* Disturbing! */
-                       disturb(0, 0);
+                       disturb(0, 1);
 
                        /* Determine the level */
                        if (!quest_number(dun_level) && dun_level)
@@ -3516,7 +3595,11 @@ static byte get_dungeon_feeling(void)
                if (!o_ptr->k_idx) continue;
 
                /* Skip known objects */
-               if (object_is_known(o_ptr)) continue;
+               if (object_is_known(o_ptr))
+               {
+                       /* Touched? */
+                       if (o_ptr->marked & OM_TOUCHED) continue;
+               }
 
                /* Skip pseudo-known objects */
                if (o_ptr->ident & IDENT_SENSE) continue;
@@ -3757,7 +3840,7 @@ static void process_world(void)
                        if (closing_flag <= 2)
                        {
                                /* Disturb */
-                               disturb(0, 0);
+                               disturb(0, 1);
 
                                /* Count warnings */
                                closing_flag++;
@@ -3954,7 +4037,7 @@ msg_print("
                                        if (!have_flag(f_ptr->flags, FF_STORE)) continue;
 
                                        /* Verify store type */
-                                       if (f_ptr->power == n)
+                                       if (f_ptr->subtype == n)
                                        {
                                                /* Message */
 #ifdef JP
@@ -4021,7 +4104,7 @@ msg_print("
                if ((hour == 23) && !(min % 15))
                {
                        /* Disturbing */
-                       disturb(0, 0);
+                       disturb(0, 1);
 
                        switch (min / 15)
                        {
@@ -4059,12 +4142,12 @@ msg_print("
                        }
                }
 
-               /* TY_CURSE activates at mignight! */
+               /* TY_CURSE activates at midnight! */
                if (!hour && !min)
                {
                        int count = 0;
 
-                       disturb(1, 0);
+                       disturb(1, 1);
 #ifdef JP
                        msg_print("±ó¤¯¤Ç¾â¤¬²¿²ó¤âÌĤꡢ»à¤ó¤À¤è¤¦¤ÊÀŤ±¤µ¤ÎÃæ¤Ø¾Ã¤¨¤Æ¤¤¤Ã¤¿¡£");
 #else
@@ -4128,7 +4211,7 @@ msg_print("
                                msg_print("You faint from the lack of food.");
 #endif
 
-                               disturb(1, 0);
+                               disturb(1, 1);
 
                                /* Hack -- faint (bypass free action) */
                                (void)set_paralyzed(p_ptr->paralyzed + 1 + randint0(5));
@@ -4369,6 +4452,10 @@ static void process_command(void)
 
        now_message = 0;
 
+       /* Sniper */
+       if ((p_ptr->pclass == CLASS_SNIPER) && (p_ptr->concent))
+               reset_concent = TRUE;
+
        /* Parse the command */
        switch (command_cmd)
        {
@@ -4748,7 +4835,9 @@ msg_print("
                        else if (p_ptr->pclass == CLASS_SMITH)
                                do_cmd_kaji(TRUE);
                        else if (p_ptr->pclass == CLASS_MAGIC_EATER)
-                               do_cmd_magic_eater(TRUE);
+                               do_cmd_magic_eater(TRUE, FALSE);
+                       else if (p_ptr->pclass == CLASS_SNIPER)
+                               do_cmd_snipe_browse();
                        else do_cmd_browse();
                        break;
                }
@@ -4848,13 +4937,15 @@ msg_print("
                                        else if (p_ptr->pclass == CLASS_IMITATOR)
                                                do_cmd_mane(FALSE);
                                        else if (p_ptr->pclass == CLASS_MAGIC_EATER)
-                                               do_cmd_magic_eater(FALSE);
+                                               do_cmd_magic_eater(FALSE, FALSE);
                                        else if (p_ptr->pclass == CLASS_SAMURAI)
                                                do_cmd_hissatsu();
                                        else if (p_ptr->pclass == CLASS_BLUE_MAGE)
                                                do_cmd_cast_learned();
                                        else if (p_ptr->pclass == CLASS_SMITH)
                                                do_cmd_kaji(FALSE);
+                                       else if (p_ptr->pclass == CLASS_SNIPER)
+                                               do_cmd_snipe();
                                        else
                                                do_cmd_cast();
                                }
@@ -5171,6 +5262,7 @@ msg_print("
                case '=':
                {
                        do_cmd_options();
+                       (void)combine_and_reorder_home(STORE_HOME);
                        do_cmd_redraw();
                        break;
                }
@@ -5286,6 +5378,13 @@ msg_print("
                        break;
                }
 
+               /* Record/stop "Movie" */
+               case ']':
+               {
+                       prepare_movie_hooks();
+                       break;
+               }
+
                /* Make random artifact list */
                case KTRL('V'):
                {
@@ -5293,6 +5392,18 @@ msg_print("
                        break;
                }
 
+#ifdef TRAVEL
+               case '`':
+               {
+                       if (!p_ptr->wild_mode) do_cmd_travel();
+                       if (p_ptr->special_defense & KATA_MUSOU)
+                       {
+                               set_action(ACTION_NONE);
+                       }
+                       break;
+               }
+#endif
+
                /* Hack -- Unknown command */
                default:
                {
@@ -5337,6 +5448,86 @@ static bool monster_tsuri(int r_idx)
 }
 
 
+/* Hack -- Pack Overflow */
+static void pack_overflow(void)
+{
+       if (inventory[INVEN_PACK].k_idx)
+       {
+               char o_name[MAX_NLEN];
+               object_type *o_ptr;
+
+               /* Is auto-destroy done? */
+               notice_stuff();
+               if (!inventory[INVEN_PACK].k_idx) return;
+
+               /* Access the slot to be dropped */
+               o_ptr = &inventory[INVEN_PACK];
+
+               /* Disturbing */
+               disturb(0, 1);
+
+               /* Warning */
+#ifdef JP
+               msg_print("¥¶¥Ã¥¯¤«¤é¥¢¥¤¥Æ¥à¤¬¤¢¤Õ¤ì¤¿¡ª");
+#else
+               msg_print("Your pack overflows!");
+#endif
+
+               /* Describe */
+               object_desc(o_name, o_ptr, 0);
+
+               /* Message */
+#ifdef JP
+               msg_format("%s(%c)¤òÍî¤È¤·¤¿¡£", o_name, index_to_label(INVEN_PACK));
+#else
+               msg_format("You drop %s (%c).", o_name, index_to_label(INVEN_PACK));
+#endif
+
+               /* Drop it (carefully) near the player */
+               (void)drop_near(o_ptr, 0, py, px);
+
+               /* Modify, Describe, Optimize */
+               inven_item_increase(INVEN_PACK, -255);
+               inven_item_describe(INVEN_PACK);
+               inven_item_optimize(INVEN_PACK);
+
+               /* Handle "p_ptr->notice" */
+               notice_stuff();
+
+               /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */
+               handle_stuff();
+       }
+}
+
+/*
+ * process the effects per 100 energy at player speed.
+ */
+static void process_upkeep_with_speed(void)
+{
+       /* Give the player some energy */
+       if (!load && p_ptr->enchant_energy_need > 0 && !p_ptr->leaving)
+       {
+               p_ptr->enchant_energy_need -= SPEED_TO_ENERGY(p_ptr->pspeed);
+       }
+       
+       /* No turn yet */
+       if (p_ptr->enchant_energy_need > 0) return;
+       
+       while (p_ptr->enchant_energy_need <= 0)
+       {
+               /* Handle the player song */
+               if (!load) check_music();
+
+               /* Hex - Handle the hex spells */
+               if (!load) check_hex();
+               if (!load) revenge_spell();
+               
+               /* There is some randomness of needed energy */
+               p_ptr->enchant_energy_need += ENERGY_NEED();
+       }
+}
+
+
 /*
  * Process the player
  *
@@ -5459,7 +5650,7 @@ msg_print("
                                msg_print("Damn!  The fish stole your bait!");
 #endif
                        }
-                       disturb(0, 0);
+                       disturb(0, 1);
                }
        }
 
@@ -5467,7 +5658,7 @@ msg_print("
        if (check_abort)
        {
                /* Check for "player abort" (semi-efficiently for resting) */
-               if (running || command_rep || (p_ptr->action == ACTION_REST) || (p_ptr->action == ACTION_FISH))
+               if (running || travel.run || command_rep || (p_ptr->action == ACTION_REST) || (p_ptr->action == ACTION_FISH))
                {
                        /* Do not wait */
                        inkey_scan = TRUE;
@@ -5479,7 +5670,7 @@ msg_print("
                                flush();
 
                                /* Disturb */
-                               disturb(0, 0);
+                               disturb(0, 1);
 
                                /* Hack -- Show a Message */
 #ifdef JP
@@ -5576,10 +5767,7 @@ msg_print("
                /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */
                handle_stuff();
        }
-
-       /* Handle the player song */
-       if (!load) check_music();
-
+       
        load = FALSE;
 
        /* Fast */
@@ -5660,53 +5848,7 @@ msg_print("
 
 
                /* Hack -- Pack Overflow */
-               if (inventory[INVEN_PACK].k_idx)
-               {
-                       int item = INVEN_PACK;
-
-                       char o_name[MAX_NLEN];
-
-                       object_type *o_ptr;
-
-                       /* Access the slot to be dropped */
-                       o_ptr = &inventory[item];
-
-                       /* Disturbing */
-                       disturb(0, 0);
-
-                       /* Warning */
-#ifdef JP
-msg_print("¥¶¥Ã¥¯¤«¤é¥¢¥¤¥Æ¥à¤¬¤¢¤Õ¤ì¤¿¡ª");
-#else
-                       msg_print("Your pack overflows!");
-#endif
-
-
-                       /* Describe */
-                       object_desc(o_name, o_ptr, 0);
-
-                       /* Message */
-#ifdef JP
-msg_format("%s(%c)¤òÍî¤È¤·¤¿¡£", o_name, index_to_label(item));
-#else
-                       msg_format("You drop %s (%c).", o_name, index_to_label(item));
-#endif
-
-
-                       /* Drop it (carefully) near the player */
-                       (void)drop_near(o_ptr, 0, py, px);
-
-                       /* Modify, Describe, Optimize */
-                       inven_item_increase(item, -255);
-                       inven_item_describe(item);
-                       inven_item_optimize(item);
-
-                       /* Handle "p_ptr->notice" */
-                       notice_stuff();
-
-                       /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */
-                       handle_stuff();
-               }
+               pack_overflow();
 
 
                /* Hack -- cancel "lurking browse mode" */
@@ -5768,6 +5910,15 @@ msg_format("%s(%c)
                        run_step(0);
                }
 
+#ifdef TRAVEL
+               /* Traveling */
+               else if (travel.run)
+               {
+                       /* Take a step */
+                       travel_step();
+               }
+#endif
+
                /* Repeated command */
                else if (command_rep)
                {
@@ -5806,6 +5957,10 @@ msg_format("%s(%c)
                }
 
 
+               /* Hack -- Pack Overflow */
+               pack_overflow();
+
+
                /*** Clean up ***/
 
                /* Significant */
@@ -5934,7 +6089,7 @@ msg_format("%s(%c)
                                        }
                                }
                                new_mane = FALSE;
-                               p_ptr->redraw |= (PR_MANE);
+                               p_ptr->redraw |= (PR_IMITATION);
                        }
                        if (p_ptr->action == ACTION_LEARN)
                        {
@@ -5974,6 +6129,9 @@ msg_format("%s(%c)
                        break;
                }
 
+               /* Sniper */
+               if (energy_use && reset_concent) reset_concentration(TRUE);
+
                /* Handle "leaving" */
                if (p_ptr->leaving) break;
        }
@@ -6031,7 +6189,7 @@ static void dungeon(bool load_game)
 
 
        /* Disturb */
-       disturb(1, 0);
+       disturb(1, 1);
 
        /* Get index of current quest (if any) */
        quest_num = quest_number(dun_level);
@@ -6057,6 +6215,8 @@ static void dungeon(bool load_game)
                if (record_maxdepth) do_cmd_write_nikki(NIKKI_MAXDEAPTH, dun_level, NULL);
        }
 
+       (void)calculate_upkeep();
+
        /* Validate the panel */
        panel_bounds_center();
 
@@ -6195,9 +6355,11 @@ msg_print("
                /* Hack -- Compress the object list occasionally */
                if (o_cnt + 32 < o_max) compact_objects(0);
 
-
+               
                /* Process the player */
                process_player();
+               
+               process_upkeep_with_speed();
 
                /* Handle "p_ptr->notice" */
                notice_stuff();
@@ -6256,8 +6418,15 @@ msg_print("
 
                /* Count game turns */
                turn++;
-               if (!p_ptr->wild_mode || wild_regen) dungeon_turn++;
-               else if (p_ptr->wild_mode && !(turn % ((MAX_HGT + MAX_WID) / 2))) dungeon_turn++;
+
+               if (dungeon_turn < 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++;
+               }
+
+               prevent_turn_overflow();
+
                if (wild_regen) wild_regen--;
        }
 
@@ -6483,6 +6652,7 @@ void play_game(bool new_game)
 {
        int i;
        bool load_game = TRUE;
+       bool init_random_seed = FALSE;
 
 #ifdef CHUUKEI
        if (chuukei_client)
@@ -6498,6 +6668,13 @@ void play_game(bool new_game)
        }
 #endif
 
+       if (browsing_movie)
+       {
+               reset_visuals();
+               browse_movie();
+               return;
+       }
+
        hack_mutation = FALSE;
 
        /* Hack -- Character is "icky" */
@@ -6611,6 +6788,8 @@ quit("
                quit(0);
        }
 
+       creating_savefile = new_game;
+
        /* Nothing loaded */
        if (!character_loaded)
        {
@@ -6621,7 +6800,7 @@ quit("
                character_dungeon = FALSE;
 
                /* Prepare to init the RNG */
-               Rand_quick = TRUE;
+               init_random_seed = TRUE;
 
                /* Initialize the saved floors data */
                init_saved_floors(FALSE);
@@ -6642,7 +6821,7 @@ quit("
        }
 
        /* Init the RNG */
-       if (Rand_quick)
+       if (init_random_seed)
        {
                u32b seed;
 
@@ -6656,10 +6835,7 @@ quit("
 
 #endif
 
-               /* Use the complex RNG */
-               Rand_quick = FALSE;
-
-               /* Seed the "complex" RNG */
+               /* Seed the RNG */
                Rand_state_init(seed);
        }
 
@@ -6725,6 +6901,8 @@ quit("
                }
        }
 
+       creating_savefile = FALSE;
+
        p_ptr->teleport_town = FALSE;
        p_ptr->sutemi = FALSE;
        world_monster = FALSE;
@@ -6899,9 +7077,13 @@ prt("
                m_ptr->maxhp = r_ptr->hdice*(r_ptr->hside+1)/2;
                m_ptr->max_maxhp = m_ptr->maxhp;
                m_ptr->hp = r_ptr->hdice*(r_ptr->hside+1)/2;
+               m_ptr->dealt_damage = 0;
                m_ptr->energy_need = ENERGY_NEED() + ENERGY_NEED();
        }
 
+       (void)combine_and_reorder_home(STORE_HOME);
+       (void)combine_and_reorder_home(STORE_MUSEUM);
+
        /* Process */
        while (TRUE)
        {
@@ -6911,9 +7093,14 @@ prt("
                /* Handle "p_ptr->notice" */
                notice_stuff();
 
+               /* Hack -- prevent "icky" message */
+               character_xtra = TRUE;
+
                /* Handle "p_ptr->update" and "p_ptr->redraw" and "p_ptr->window" */
                handle_stuff();
 
+               character_xtra = FALSE;
+
                /* Cancel the target */
                target_who = 0;
 
@@ -7063,7 +7250,7 @@ prt("
                                        p_ptr->inside_battle = FALSE;
                                        leaving_quest = 0;
                                        p_ptr->inside_quest = 0;
-                                       p_ptr->recall_dungeon = dungeon_type;
+                                       if (dungeon_type) p_ptr->recall_dungeon = dungeon_type;
                                        dungeon_type = 0;
                                        if (lite_town || vanilla_town)
                                        {
@@ -7132,3 +7319,47 @@ s32b turn_real(s32b hoge)
                return hoge;
        }
 }
+
+/*
+ * ¥¿¡¼¥ó¤Î¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤ËÂФ¹¤ëÂнè
+ * ¥¿¡¼¥óµÚ¤Ó¥¿¡¼¥ó¤òµ­Ï¿¤¹¤ëÊÑ¿ô¤ò¥¿¡¼¥ó¤Î¸Â³¦¤Î1ÆüÁ°¤Þ¤Ç´¬¤­Ì᤹.
+ */
+void prevent_turn_overflow(void)
+{
+       int rollback_days, i, j;
+       s32b rollback_turns;
+
+       if (turn < turn_limit) return;
+
+       rollback_days = 1 + (turn - 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 (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;
+       else p_ptr->feeling_turn = 1;
+
+       for (i = 1; i < max_towns; i++)
+       {
+               for (j = 0; j < MAX_STORES; j++)
+               {
+                       store_type *st_ptr = &town[i].store[j];
+
+                       if (st_ptr->last_visit > -10L * TURNS_PER_TICK * STORE_TICKS)
+                       {
+                               st_ptr->last_visit -= rollback_turns;
+                               if (st_ptr->last_visit < -10L * TURNS_PER_TICK * STORE_TICKS) st_ptr->last_visit = -10L * TURNS_PER_TICK * STORE_TICKS;
+                       }
+
+                       if (st_ptr->store_open)
+                       {
+                               st_ptr->store_open -= rollback_turns;
+                               if (st_ptr->store_open < 1) st_ptr->store_open = 1;
+                       }
+               }
+       }
+}