OSDN Git Service

Fix Savedate error.
[hengband/hengband.git] / src / load.c
index b8ce001..55c6e21 100644 (file)
@@ -363,13 +363,13 @@ static void rd_item_old(object_type *o_ptr)
                        o_ptr->curse_flags |= TRC_CURSED;
                        if (o_ptr->art_flags[2] & 0x40000000L) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
                        if (o_ptr->art_flags[2] & 0x80000000L) o_ptr->curse_flags |= TRC_PERMA_CURSE;
-                       if (o_ptr->name1)
+                       if (object_is_fixed_artifact(o_ptr))
                        {
                                artifact_type *a_ptr = &a_info[o_ptr->name1];
                                if (a_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
                                if (a_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
                        }
-                       else if (o_ptr->name2)
+                       else if (object_is_ego(o_ptr))
                        {
                                ego_item_type *e_ptr = &e_info[o_ptr->name2];
                                if (e_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
@@ -427,7 +427,7 @@ static void rd_item_old(object_type *o_ptr)
                {
                        switch (o_ptr->xtra2 % 8)
                        {
-                       case 0: add_flag(o_ptr->art_flags, TR_FEATHER);     break;
+                       case 0: add_flag(o_ptr->art_flags, TR_LEVITATION);     break;
                        case 1: add_flag(o_ptr->art_flags, TR_LITE);        break;
                        case 2: add_flag(o_ptr->art_flags, TR_SEE_INVIS);   break;
                        case 3: add_flag(o_ptr->art_flags, TR_WARNING);     break;
@@ -469,7 +469,7 @@ static void rd_item_old(object_type *o_ptr)
                rd_byte(&o_ptr->xtra3);
                if (h_older_than(1, 3, 0, 1))
                {
-                       if (item_tester_hook_smith(o_ptr) && o_ptr->xtra3 >= 1+96)
+                       if (object_is_smith(o_ptr) && o_ptr->xtra3 >= 1+96)
                                o_ptr->xtra3 += -96 + MIN_SPECIAL_ESSENCE;
                }
 
@@ -517,7 +517,7 @@ static void rd_item_old(object_type *o_ptr)
        }
 
        /* Paranoia */
-       if (o_ptr->name1)
+       if (object_is_fixed_artifact(o_ptr))
        {
                artifact_type *a_ptr;
 
@@ -529,7 +529,7 @@ static void rd_item_old(object_type *o_ptr)
        }
 
        /* Paranoia */
-       if (o_ptr->name2)
+       if (object_is_ego(o_ptr))
        {
                ego_item_type *e_ptr;
 
@@ -650,16 +650,14 @@ static void rd_item(object_type *o_ptr)
        if (flags & SAVE_ITEM_INSCRIPTION)
        {
                rd_string(buf, sizeof(buf));
-               if (buf[0]) o_ptr->inscription = quark_add(buf);
-               else o_ptr->inscription = 0;
+               o_ptr->inscription = quark_add(buf);
        }
        else o_ptr->inscription = 0;
 
        if (flags & SAVE_ITEM_ART_NAME)
        {
                rd_string(buf, sizeof(buf));
-               if (buf[0]) o_ptr->art_name = quark_add(buf);
-               else o_ptr->art_name = 0;
+               o_ptr->art_name = quark_add(buf);
        }
        else o_ptr->art_name = 0;
 }
@@ -705,7 +703,7 @@ static void rd_monster_old(monster_type *m_ptr)
        {
                rd_s16b(&m_ptr->max_maxhp);
        }
-       rd_s16b(&m_ptr->csleep);
+       rd_s16b(&m_ptr->mtimed[MTIMED_CSLEEP]);
        rd_byte(&m_ptr->mspeed);
        if (z_older_than(10, 4, 2))
        {
@@ -719,17 +717,22 @@ static void rd_monster_old(monster_type *m_ptr)
 
        if (z_older_than(10,0,7))
        {
-               m_ptr->fast = 0;
-               m_ptr->slow = 0;
+               m_ptr->mtimed[MTIMED_FAST] = 0;
+               m_ptr->mtimed[MTIMED_SLOW] = 0;
        }
        else
        {
-               rd_byte(&m_ptr->fast);
-               rd_byte(&m_ptr->slow);
+               rd_byte(&tmp8u);
+               m_ptr->mtimed[MTIMED_FAST] = (s16b)tmp8u;
+               rd_byte(&tmp8u);
+               m_ptr->mtimed[MTIMED_SLOW] = (s16b)tmp8u;
        }
-       rd_byte(&m_ptr->stunned);
-       rd_byte(&m_ptr->confused);
-       rd_byte(&m_ptr->monfear);
+       rd_byte(&tmp8u);
+       m_ptr->mtimed[MTIMED_STUNNED] = (s16b)tmp8u;
+       rd_byte(&tmp8u);
+       m_ptr->mtimed[MTIMED_CONFUSED] = (s16b)tmp8u;
+       rd_byte(&tmp8u);
+       m_ptr->mtimed[MTIMED_MONFEAR] = (s16b)tmp8u;
 
        if (z_older_than(10,0,10))
        {
@@ -747,7 +750,8 @@ static void rd_monster_old(monster_type *m_ptr)
                rd_s16b(&m_ptr->target_x);
        }
 
-       rd_byte(&m_ptr->invulner);
+       rd_byte(&tmp8u);
+       m_ptr->mtimed[MTIMED_INVULNER] = (s16b)tmp8u;
 
        if (!(z_major == 2 && z_minor == 0 && z_patch == 6))
                rd_u32b(&m_ptr->smart);
@@ -799,6 +803,7 @@ static void rd_monster(monster_type *m_ptr)
 {
        u32b flags;
        char buf[128];
+       byte tmp8u;
 
        if (h_older_than(1, 5, 0, 0))
        {
@@ -828,31 +833,55 @@ static void rd_monster(monster_type *m_ptr)
        if (flags & SAVE_MON_SUB_ALIGN) rd_byte(&m_ptr->sub_align);
        else m_ptr->sub_align = 0;
 
-       if (flags & SAVE_MON_CSLEEP) rd_s16b(&m_ptr->csleep);
-       else m_ptr->csleep = 0;
+       if (flags & SAVE_MON_CSLEEP) rd_s16b(&m_ptr->mtimed[MTIMED_CSLEEP]);
+       else m_ptr->mtimed[MTIMED_CSLEEP] = 0;
 
        rd_byte(&m_ptr->mspeed);
 
        rd_s16b(&m_ptr->energy_need);
 
-       if (flags & SAVE_MON_FAST) rd_byte(&m_ptr->fast);
-       else m_ptr->fast = 0;
-       if (flags & SAVE_MON_SLOW) rd_byte(&m_ptr->slow);
-       else m_ptr->slow = 0;
-       if (flags & SAVE_MON_STUNNED) rd_byte(&m_ptr->stunned);
-       else m_ptr->stunned = 0;
-       if (flags & SAVE_MON_CONFUSED) rd_byte(&m_ptr->confused);
-       else m_ptr->confused = 0;
-       if (flags & SAVE_MON_MONFEAR) rd_byte(&m_ptr->monfear);
-       else m_ptr->monfear = 0;
+       if (flags & SAVE_MON_FAST)
+       {
+               rd_byte(&tmp8u);
+               m_ptr->mtimed[MTIMED_FAST] = (s16b)tmp8u;
+       }
+       else m_ptr->mtimed[MTIMED_FAST] = 0;
+       if (flags & SAVE_MON_SLOW)
+       {
+               rd_byte(&tmp8u);
+               m_ptr->mtimed[MTIMED_SLOW] = (s16b)tmp8u;
+       }
+       else m_ptr->mtimed[MTIMED_SLOW] = 0;
+       if (flags & SAVE_MON_STUNNED)
+       {
+               rd_byte(&tmp8u);
+               m_ptr->mtimed[MTIMED_STUNNED] = (s16b)tmp8u;
+       }
+       else m_ptr->mtimed[MTIMED_STUNNED] = 0;
+       if (flags & SAVE_MON_CONFUSED)
+       {
+               rd_byte(&tmp8u);
+               m_ptr->mtimed[MTIMED_CONFUSED] = (s16b)tmp8u;
+       }
+       else m_ptr->mtimed[MTIMED_CONFUSED] = 0;
+       if (flags & SAVE_MON_MONFEAR)
+       {
+               rd_byte(&tmp8u);
+               m_ptr->mtimed[MTIMED_MONFEAR] = (s16b)tmp8u;
+       }
+       else m_ptr->mtimed[MTIMED_MONFEAR] = 0;
 
        if (flags & SAVE_MON_TARGET_Y) rd_s16b(&m_ptr->target_y);
        else m_ptr->target_y = 0;
        if (flags & SAVE_MON_TARGET_X) rd_s16b(&m_ptr->target_x);
        else m_ptr->target_x = 0;
 
-       if (flags & SAVE_MON_INVULNER) rd_byte(&m_ptr->invulner);
-       else m_ptr->invulner = 0;
+       if (flags & SAVE_MON_INVULNER)
+       {
+               rd_byte(&tmp8u);
+               m_ptr->mtimed[MTIMED_INVULNER] = (s16b)tmp8u;
+       }
+       else m_ptr->mtimed[MTIMED_INVULNER] = 0;
 
        if (flags & SAVE_MON_SMART) rd_u32b(&m_ptr->smart);
        else m_ptr->smart = 0;
@@ -868,8 +897,7 @@ static void rd_monster(monster_type *m_ptr)
        if (flags & SAVE_MON_NICKNAME) 
        {
                rd_string(buf, sizeof(buf));
-               if (buf[0]) m_ptr->nickname = quark_add(buf);
-               else m_ptr->nickname = 0;
+               m_ptr->nickname = quark_add(buf);
        }
        else m_ptr->nickname = 0;
 
@@ -934,6 +962,14 @@ static void rd_lore(int r_idx)
        rd_s16b(&r_ptr->r_sights);
        rd_s16b(&r_ptr->r_deaths);
        rd_s16b(&r_ptr->r_pkills);
+       if (h_older_than(1, 7, 0, 5))
+       {
+               r_ptr->r_akills = r_ptr->r_pkills;
+       }
+       else
+       {
+               rd_s16b(&r_ptr->r_akills);
+       }
        rd_s16b(&r_ptr->r_tkills);
 
        /* Count wakes and ignores */
@@ -1041,7 +1077,7 @@ static void rd_lore(int r_idx)
 static void home_carry(store_type *st_ptr, object_type *o_ptr)
 {
        int                             slot;
-       s32b                       value, j_value;
+       s32b                       value;
        int     i;
        object_type *j_ptr;
 
@@ -1074,45 +1110,7 @@ static void home_carry(store_type *st_ptr, object_type *o_ptr)
        /* Check existing slots to see if we must "slide" */
        for (slot = 0; slot < st_ptr->stock_num; slot++)
        {
-               /* Get that item */
-               j_ptr = &st_ptr->stock[slot];
-
-               /* Hack -- readable books always come first */
-               if ((o_ptr->tval == mp_ptr->spell_book) &&
-                       (j_ptr->tval != mp_ptr->spell_book)) break;
-               if ((j_ptr->tval == mp_ptr->spell_book) &&
-                       (o_ptr->tval != mp_ptr->spell_book)) continue;
-
-               /* Objects sort by decreasing type */
-               if (o_ptr->tval > j_ptr->tval) break;
-               if (o_ptr->tval < j_ptr->tval) continue;
-
-               /* Can happen in the home */
-               if (!object_aware_p(o_ptr)) continue;
-               if (!object_aware_p(j_ptr)) break;
-
-               /* Objects sort by increasing sval */
-               if (o_ptr->sval < j_ptr->sval) break;
-               if (o_ptr->sval > j_ptr->sval) continue;
-
-               /* Objects in the home can be unknown */
-               if (!object_known_p(o_ptr)) continue;
-               if (!object_known_p(j_ptr)) break;
-
-               /*
-                * Hack:  otherwise identical rods sort by
-                * increasing recharge time --dsb
-                */
-               if (o_ptr->tval == TV_ROD)
-               {
-                       if (o_ptr->pval < j_ptr->pval) break;
-                       if (o_ptr->pval > j_ptr->pval) continue;
-               }
-
-               /* Objects sort by decreasing value */
-               j_value = object_value(j_ptr);
-               if (value > j_value) break;
-               if (value < j_value) continue;
+               if (object_sort_comp(o_ptr, value, &st_ptr->stock[slot])) break;
        }
 
        /* Slide the others up */
@@ -1496,6 +1494,7 @@ static void rd_extra(void)
 
        byte tmp8u;
        s16b tmp16s;
+       u16b tmp16u;
 
        rd_string(player_name, sizeof(player_name));
 
@@ -1556,7 +1555,16 @@ static void rd_extra(void)
        if (h_older_than(1, 5, 4, 1)) p_ptr->max_max_exp = p_ptr->max_exp;
        else rd_s32b(&p_ptr->max_max_exp);
        rd_s32b(&p_ptr->exp);
-       rd_u16b(&p_ptr->exp_frac);
+
+       if (h_older_than(1, 7, 0, 3))
+       {
+               rd_u16b(&tmp16u);
+               p_ptr->exp_frac = (u32b)tmp16u;
+       }
+       else
+       {
+               rd_u32b(&p_ptr->exp_frac);
+       }
 
        rd_s16b(&p_ptr->lev);
 
@@ -1595,7 +1603,7 @@ static void rd_extra(void)
                        }
                }
        }
-       if ((p_ptr->pclass == CLASS_BARD) && p_ptr->magic_num1[0]) p_ptr->action = ACTION_SING;
+       if (music_singing_any()) p_ptr->action = ACTION_SING;
 
        if (z_older_than(11, 0, 7))
        {
@@ -1715,13 +1723,41 @@ static void rd_extra(void)
                rd_s16b(&tmp16s2);
        }
 
-       rd_s16b(&p_ptr->mhp);
-       rd_s16b(&p_ptr->chp);
-       rd_u16b(&p_ptr->chp_frac);
+       if (h_older_than(1, 7, 0, 3))
+       {
+               rd_s16b(&tmp16s);
+               p_ptr->mhp = tmp16s;
+
+               rd_s16b(&tmp16s);
+               p_ptr->chp = tmp16s;
+
+               rd_u16b(&tmp16u);
+               p_ptr->chp_frac = (u32b)tmp16u;
+       }
+       else
+       {
+               rd_s32b(&p_ptr->mhp);
+               rd_s32b(&p_ptr->chp);
+               rd_u32b(&p_ptr->chp_frac);
+       }
+
+       if (h_older_than(1, 7, 0, 3))
+       {
+               rd_s16b(&tmp16s);
+               p_ptr->msp = tmp16s;
+
+               rd_s16b(&tmp16s);
+               p_ptr->csp = tmp16s;
 
-       rd_s16b(&p_ptr->msp);
-       rd_s16b(&p_ptr->csp);
-       rd_u16b(&p_ptr->csp_frac);
+               rd_u16b(&tmp16u);
+               p_ptr->csp_frac = (u32b)tmp16u;
+       }
+       else
+       {
+               rd_s32b(&p_ptr->msp);
+               rd_s32b(&p_ptr->csp);
+               rd_u32b(&p_ptr->csp_frac);
+       }
 
        rd_s16b(&p_ptr->max_plv);
        if (z_older_than(10, 3, 8))
@@ -1747,7 +1783,7 @@ static void rd_extra(void)
        /* More info */
        strip_bytes(8);
        rd_s16b(&p_ptr->sc);
-       strip_bytes(2);
+       rd_s16b(&p_ptr->concent);
 
        /* Read the flags */
        strip_bytes(2); /* Old "rest" */
@@ -1760,6 +1796,10 @@ static void rd_extra(void)
        rd_s16b(&p_ptr->energy_need);
        if (z_older_than(11, 0, 13))
                p_ptr->energy_need = 100 - p_ptr->energy_need;
+       if (z_older_than(12, 1, 3))
+               p_ptr->enchant_energy_need = 0;
+       else
+               rd_s16b(&p_ptr->enchant_energy_need);
 
        rd_s16b(&p_ptr->fast);
        rd_s16b(&p_ptr->slow);
@@ -1812,7 +1852,7 @@ static void rd_extra(void)
                p_ptr->tim_regen = 0;
                p_ptr->kabenuke = 0;
                p_ptr->tim_stealth = 0;
-               p_ptr->tim_ffall = 0;
+               p_ptr->tim_levitation = 0;
                p_ptr->tim_sh_touki = 0;
                p_ptr->lightspeed = 0;
                p_ptr->tsubureru = 0;
@@ -1841,7 +1881,7 @@ static void rd_extra(void)
                rd_s16b(&p_ptr->tim_regen);
                rd_s16b(&p_ptr->kabenuke);
                rd_s16b(&p_ptr->tim_stealth);
-               rd_s16b(&p_ptr->tim_ffall);
+               rd_s16b(&p_ptr->tim_levitation);
                rd_s16b(&p_ptr->tim_sh_touki);
                rd_s16b(&p_ptr->lightspeed);
                rd_s16b(&p_ptr->tsubureru);
@@ -1963,12 +2003,35 @@ static void rd_extra(void)
        p_ptr->is_dead = tmp8u;
 
        /* Read "feeling" */
-       rd_byte(&tmp8u);
-       feeling = tmp8u;
+       rd_byte(&p_ptr->feeling);
+
+       switch (p_ptr->start_race)
+       {
+       case RACE_VAMPIRE:
+       case RACE_SKELETON:
+       case RACE_ZOMBIE:
+       case RACE_SPECTRE:
+               turn_limit = TURNS_PER_TICK * TOWN_DAWN * MAX_DAYS + TURNS_PER_TICK * TOWN_DAWN * 3 / 4;
+               break;
+       default:
+               turn_limit = TURNS_PER_TICK * TOWN_DAWN * (MAX_DAYS - 1) + TURNS_PER_TICK * TOWN_DAWN * 3 / 4;
+               break;
+       }
+       dungeon_turn_limit = TURNS_PER_TICK * TOWN_DAWN * (MAX_DAYS - 1) + TURNS_PER_TICK * TOWN_DAWN * 3 / 4;
 
-       /* Turn of last "feeling" */
+       /* Turn when level began */
        rd_s32b(&old_turn);
 
+       if (h_older_than(1, 7, 0, 4))
+       {
+               p_ptr->feeling_turn = old_turn;
+       }
+       else
+       {
+               /* Turn of last "feeling" */
+               rd_s32b(&p_ptr->feeling_turn);
+       }
+
        /* Current turn */
        rd_s32b(&turn);
 
@@ -1981,6 +2044,7 @@ static void rd_extra(void)
        if (z_older_than(11, 0, 13))
        {
                old_turn /= 2;
+               p_ptr->feeling_turn /= 2;
                turn /= 2;
                dungeon_turn /= 2;
        }
@@ -2121,6 +2185,9 @@ static errr rd_inventory(void)
                /* Wield equipment */
                if (n >= INVEN_RARM)
                {
+                       /* Player touches it */
+                       q_ptr->marked |= OM_TOUCHED;
+
                        /* Copy object */
                        object_copy(&inventory[n], q_ptr);
 
@@ -2152,6 +2219,9 @@ note("
                        /* Get a slot */
                        n = slot++;
 
+                       /* Player touches it */
+                       q_ptr->marked |= OM_TOUCHED;
+
                        /* Copy object */
                        object_copy(&inventory[n], q_ptr);
 
@@ -2198,6 +2268,22 @@ static void rd_messages(void)
 /* Old hidden trap flag */
 #define CAVE_TRAP       0x8000
 
+/*** Terrain Feature Indexes (see "lib/edit/f_info.txt") ***/
+#define OLD_FEAT_INVIS              0x02
+#define OLD_FEAT_GLYPH              0x03
+#define OLD_FEAT_QUEST_ENTER        0x08
+#define OLD_FEAT_QUEST_EXIT         0x09
+#define OLD_FEAT_MINOR_GLYPH        0x40
+#define OLD_FEAT_BLDG_1             0x81
+#define OLD_FEAT_MIRROR             0xc3
+
+/* Old quests */
+#define OLD_QUEST_WATER_CAVE 18
+
+/* Quest constants */
+#define QUEST_OLD_CASTLE  27
+#define QUEST_ROYAL_CRYPT 28
+
 /*
  * Read the dungeon (old method)
  *
@@ -2399,16 +2485,16 @@ static errr rd_dungeon_old(void)
                        c_ptr = &cave[y][x];
 
                        /* Very old */
-                       if (c_ptr->feat == FEAT_INVIS)
+                       if (c_ptr->feat == OLD_FEAT_INVIS)
                        {
-                               c_ptr->feat = FEAT_FLOOR;
+                               c_ptr->feat = feat_floor;
                                c_ptr->info |= CAVE_TRAP;
                        }
 
                        /* Older than 1.1.1 */
-                       if (c_ptr->feat == FEAT_MIRROR)
+                       if (c_ptr->feat == OLD_FEAT_MIRROR)
                        {
-                               c_ptr->feat = FEAT_FLOOR;
+                               c_ptr->feat = feat_floor;
                                c_ptr->info |= CAVE_OBJECT;
                        }
                }
@@ -2424,16 +2510,16 @@ static errr rd_dungeon_old(void)
                        /* Old CAVE_IN_MIRROR flag */
                        if (c_ptr->info & CAVE_OBJECT)
                        {
-                               c_ptr->mimic = FEAT_MIRROR;
+                               c_ptr->mimic = feat_mirror;
                        }
 
                        /* Runes will be mimics and flags */
-                       else if (c_ptr->feat == FEAT_MINOR_GLYPH ||
-                                c_ptr->feat == FEAT_GLYPH)
+                       else if ((c_ptr->feat == OLD_FEAT_MINOR_GLYPH) ||
+                                (c_ptr->feat == OLD_FEAT_GLYPH))
                        {
                                c_ptr->info |= CAVE_OBJECT;
                                c_ptr->mimic = c_ptr->feat;
-                               c_ptr->feat = FEAT_FLOOR;
+                               c_ptr->feat = feat_floor;
                        }
 
                        /* Hidden traps will be trap terrains mimicing floor */
@@ -2445,17 +2531,39 @@ static errr rd_dungeon_old(void)
                        }
 
                        /* Another hidden trap */
-                       else if (c_ptr->feat == FEAT_INVIS)
+                       else if (c_ptr->feat == OLD_FEAT_INVIS)
                        {
-                               c_ptr->mimic = FEAT_FLOOR;
-                               c_ptr->feat = FEAT_TRAP_OPEN;
+                               c_ptr->mimic = feat_floor;
+                               c_ptr->feat = feat_trap_open;
                        }
+               }
+       }
+
+       /* Quest 18 was removed */
+       if (h_older_than(1, 7, 0, 6) && !vanilla_town)
+       {
+               for (y = 0; y < ymax; y++) for (x = 0; x < xmax; x++)
+               {
+                       /* Access the cave */
+                       c_ptr = &cave[y][x];
 
-                       /* Hidden doors will be closed doors mimicing wall */
-                       else if (c_ptr->feat == FEAT_SECRET)
+                       if ((c_ptr->special == OLD_QUEST_WATER_CAVE) && !dun_level)
                        {
-                               place_closed_door(y, x);
-                               c_ptr->mimic = FEAT_WALL;
+                               if (c_ptr->feat == OLD_FEAT_QUEST_ENTER)
+                               {
+                                       c_ptr->feat = feat_tree;
+                                       c_ptr->special = 0;
+                               }
+                               else if (c_ptr->feat == OLD_FEAT_BLDG_1)
+                               {
+                                       c_ptr->special = lite_town ? QUEST_OLD_CASTLE : QUEST_ROYAL_CRYPT;
+                               }
+                       }
+                       else if ((c_ptr->feat == OLD_FEAT_QUEST_EXIT) &&
+                                (p_ptr->inside_quest == OLD_QUEST_WATER_CAVE))
+                       {
+                               c_ptr->feat = feat_up_stair;
+                               c_ptr->special = 0;
                        }
                }
        }
@@ -2685,7 +2793,7 @@ static errr rd_saved_floor(saved_floor_type *sf_ptr)
        rd_s16b(&cur_hgt);
        rd_s16b(&cur_wid);
 
-       rd_byte(&feeling);
+       rd_byte(&p_ptr->feeling);
 
 
 
@@ -2765,6 +2873,35 @@ static errr rd_saved_floor(saved_floor_type *sf_ptr)
                }
        }
 
+       /* Quest 18 was removed */
+       if (h_older_than(1, 7, 0, 6) && !vanilla_town)
+       {
+               for (y = 0; y < ymax; y++) for (x = 0; x < xmax; x++)
+               {
+                       /* Access the cave */
+                       cave_type *c_ptr = &cave[y][x];
+
+                       if ((c_ptr->special == OLD_QUEST_WATER_CAVE) && !dun_level)
+                       {
+                               if (c_ptr->feat == OLD_FEAT_QUEST_ENTER)
+                               {
+                                       c_ptr->feat = feat_tree;
+                                       c_ptr->special = 0;
+                               }
+                               else if (c_ptr->feat == OLD_FEAT_BLDG_1)
+                               {
+                                       c_ptr->special = lite_town ? QUEST_OLD_CASTLE : QUEST_ROYAL_CRYPT;
+                               }
+                       }
+                       else if ((c_ptr->feat == OLD_FEAT_QUEST_EXIT) &&
+                                (p_ptr->inside_quest == OLD_QUEST_WATER_CAVE))
+                       {
+                               c_ptr->feat = feat_up_stair;
+                               c_ptr->special = 0;
+                       }
+               }
+       }
+
        /* Free the "template" array */
        C_FREE(template, limit, cave_template_type);
 
@@ -3294,7 +3431,9 @@ note(format("
                                }
 
                                /* Load quest status if quest is running */
-                               if (quest[i].status == QUEST_STATUS_TAKEN || (!z_older_than(10, 3, 14) && (quest[i].status == QUEST_STATUS_COMPLETED)) || (!z_older_than(11, 0, 7) && (i >= MIN_RANDOM_QUEST) && (i <= (MIN_RANDOM_QUEST+max_rquests_load))))
+                               if ((quest[i].status == QUEST_STATUS_TAKEN) ||
+                                   (!z_older_than(10, 3, 14) && (quest[i].status == QUEST_STATUS_COMPLETED)) ||
+                                   (!z_older_than(11, 0, 7) && (i >= MIN_RANDOM_QUEST) && (i <= (MIN_RANDOM_QUEST + max_rquests_load))))
                                {
                                        rd_s16b(&quest[i].cur_num);
                                        rd_s16b(&quest[i].max_num);
@@ -3357,6 +3496,13 @@ note(format("
                        }
                }
 
+               /* Quest 18 was removed */
+               if (h_older_than(1, 7, 0, 6))
+               {
+                       WIPE(&quest[OLD_QUEST_WATER_CAVE], quest_type);
+                       quest[OLD_QUEST_WATER_CAVE].status = QUEST_STATUS_UNTAKEN;
+               }
+
                /* Position in the wilderness */
                rd_s32b(&p_ptr->wilderness_x);
                rd_s32b(&p_ptr->wilderness_y);
@@ -3664,6 +3810,17 @@ note("
                }
        }
 
+       /* Quest 18 was removed */
+       if (h_older_than(1, 7, 0, 6))
+       {
+               if (p_ptr->inside_quest == OLD_QUEST_WATER_CAVE)
+               {
+                       dungeon_type = lite_town ? DUNGEON_ANGBAND : DUNGEON_GALGALS;
+                       dun_level = 1;
+                       p_ptr->inside_quest = 0;
+               }
+       }
+
 
 #ifdef VERIFY_CHECKSUMS