OSDN Git Service

[Refactor] #38995 world_type 構造体に dungeon_turn を取り込む。 / Move dungeon_turn to world_t...
[hengband/hengband.git] / src / load.c
index 33a9ec0..a87acef 100644 (file)
  * the existing "number of turns to protect for", and where each hit
  * by a monster will reduce the shield by that amount.
  *
- * XXX XXX XXX
+ * 
  */
 
 #include "angband.h"
+#include "generate.h"
+#include "trap.h"
+#include "mutation.h"
+#include "quest.h"
+#include "store.h"
+#include "artifact.h"
+#include "avatar.h"
+#include "spells-status.h"
+#include "object-hook.h"
 
 
 /*
@@ -142,9 +151,9 @@ static bool z_older_than(byte x, byte y, byte z)
  * @details
  * Avoid the top two lines, to avoid interference with "msg_print()".
  */
-static void note(cptr msg)
+static void note(concptr msg)
 {
-       static int y = 2;
+       static TERM_LEN y = 2;
 
        /* Draw the message */
        prt(msg, y, 0);
@@ -345,15 +354,16 @@ static void rd_item_old(object_type *o_ptr)
        /* Kind */
        rd_s16b(&o_ptr->k_idx);
 
-       /* Location */
        rd_byte(&tmp8u);
        o_ptr->iy = (POSITION)tmp8u;
        rd_byte(&tmp8u);
        o_ptr->ix = (POSITION)tmp8u;
 
        /* Type/Subtype */
-       rd_byte(&o_ptr->tval);
-       rd_byte(&o_ptr->sval);
+       rd_byte(&tmp8u);
+       o_ptr->tval = tmp8u;
+       rd_byte(&tmp8u);
+       o_ptr->sval = tmp8u;
 
        if (z_older_than(10, 4, 4))
        {
@@ -366,11 +376,18 @@ static void rd_item_old(object_type *o_ptr)
        rd_s16b(&o_ptr->pval);
 
        rd_byte(&o_ptr->discount);
-       rd_byte(&o_ptr->number);
-       rd_s16b(&o_ptr->weight);
+       rd_byte(&tmp8u);
+       o_ptr->number = (ITEM_NUMBER)tmp8u;
+
+       rd_s16b(&tmp16s);
+       o_ptr->weight = tmp16s;
+
+       rd_byte(&tmp8u);
+       o_ptr->name1 = tmp8u;
+
+       rd_byte(&tmp8u);
+       o_ptr->name2 = tmp8u;
 
-       rd_byte(&o_ptr->name1);
-       rd_byte(&o_ptr->name2);
        rd_s16b(&o_ptr->timeout);
 
        rd_s16b(&o_ptr->to_h);
@@ -381,8 +398,10 @@ static void rd_item_old(object_type *o_ptr)
 
        rd_s16b(&o_ptr->ac);
 
-       rd_byte(&o_ptr->dd);
-       rd_byte(&o_ptr->ds);
+       rd_byte(&tmp8u);
+       o_ptr->dd = tmp8u;
+       rd_byte(&tmp8u);
+       o_ptr->ds = tmp8u;
 
        rd_byte(&o_ptr->ident);
 
@@ -597,7 +616,7 @@ static void rd_item_old(object_type *o_ptr)
 static void rd_item(object_type *o_ptr)
 {
        object_kind *k_ptr;
-       u32b flags;
+       BIT_FLAGS flags;
        char buf[128];
        byte_hack tmp8u;
        s16b tmp16s;
@@ -615,7 +634,6 @@ static void rd_item(object_type *o_ptr)
        /* Kind */
        rd_s16b(&o_ptr->k_idx);
 
-       /* Location */
        rd_byte(&tmp8u);
        o_ptr->iy = (POSITION)tmp8u;
        rd_byte(&tmp8u);
@@ -632,14 +650,26 @@ static void rd_item(object_type *o_ptr)
 
        if (flags & SAVE_ITEM_DISCOUNT) rd_byte(&o_ptr->discount);
        else o_ptr->discount = 0;
-       if (flags & SAVE_ITEM_NUMBER) rd_byte(&o_ptr->number);
+       if (flags & SAVE_ITEM_NUMBER) {
+               rd_byte(&tmp8u);
+               o_ptr->number = tmp8u;
+       }       
        else o_ptr->number = 1;
 
-       rd_s16b(&o_ptr->weight);
+       rd_s16b(&tmp16s);
+       o_ptr->weight = tmp16s;
 
-       if (flags & SAVE_ITEM_NAME1) rd_byte(&o_ptr->name1);
+       if (flags & SAVE_ITEM_NAME1)
+       {
+               rd_byte(&tmp8u);
+               o_ptr->name1 = tmp8u;
+       }
        else o_ptr->name1 = 0;
-       if (flags & SAVE_ITEM_NAME2) rd_byte(&o_ptr->name2);
+       if (flags & SAVE_ITEM_NAME2)
+       {
+               rd_byte(&tmp8u);
+               o_ptr->name2 = tmp8u;
+       }
        else o_ptr->name2 = 0;
        if (flags & SAVE_ITEM_TIMEOUT) rd_s16b(&o_ptr->timeout);
        else o_ptr->timeout = 0;
@@ -658,9 +688,17 @@ static void rd_item(object_type *o_ptr)
        if (flags & SAVE_ITEM_AC) rd_s16b(&o_ptr->ac);
        else o_ptr->ac = 0;
 
-       if (flags & SAVE_ITEM_DD) rd_byte(&o_ptr->dd);
+       if (flags & SAVE_ITEM_DD)
+       {
+                rd_byte(&tmp8u);
+                o_ptr->dd = tmp8u;
+       }
        else o_ptr->dd = 0;
-       if (flags & SAVE_ITEM_DS) rd_byte(&o_ptr->ds);
+       if (flags & SAVE_ITEM_DS)
+       {
+               rd_byte(&tmp8u);
+               o_ptr->ds = tmp8u;
+       }
        else o_ptr->ds = 0;
 
        if (flags & SAVE_ITEM_IDENT) rd_byte(&o_ptr->ident);
@@ -721,7 +759,7 @@ static void rd_item(object_type *o_ptr)
        
        if(h_older_than(2,1,2,4))
        {
-               u32b flgs[TR_FLAG_SIZE];
+               BIT_FLAGS flgs[TR_FLAG_SIZE];
                object_flags(o_ptr, flgs);
                
                if ((o_ptr->name2 == EGO_DARK) || (o_ptr->name2 == EGO_ANCIENT_CURSE) || (o_ptr->name1 == ART_NIGHT))
@@ -788,6 +826,7 @@ static void rd_monster_old(monster_type *m_ptr)
 {
        byte tmp8u;
        s16b tmp16s;
+       u32b tmp32u;
        char buf[128];
 
        /* Read the monster race */
@@ -835,11 +874,14 @@ static void rd_monster_old(monster_type *m_ptr)
        }
        else
        {
-               rd_u32b(&m_ptr->dealt_damage); 
+               rd_s32b(&m_ptr->dealt_damage); 
        }
        
        rd_s16b(&m_ptr->mtimed[MTIMED_CSLEEP]);
-       rd_byte(&m_ptr->mspeed);
+
+       rd_byte(&tmp8u);
+       m_ptr->mspeed = tmp8u;
+
        if (z_older_than(10, 4, 2))
        {
                rd_byte(&tmp8u);
@@ -894,10 +936,12 @@ static void rd_monster_old(monster_type *m_ptr)
        else
                m_ptr->smart = 0;
 
-       if (z_older_than(10, 4, 5))
+       if (z_older_than(10, 4, 5)) {
                m_ptr->exp = 0;
-       else
-               rd_u32b(&m_ptr->exp);
+       } else {
+               rd_u32b(&tmp32u);
+               m_ptr->exp = tmp32u;
+       }
 
        if (z_older_than(10, 2, 2))
        {
@@ -939,10 +983,11 @@ static void rd_monster_old(monster_type *m_ptr)
  */
 static void rd_monster(monster_type *m_ptr)
 {
-       u32b flags;
+       BIT_FLAGS flags;
        char buf[128];
        byte tmp8u;
        s16b tmp16s;
+       u32b tmp32u;
 
        if (h_older_than(1, 5, 0, 0))
        {
@@ -977,7 +1022,7 @@ static void rd_monster(monster_type *m_ptr)
        }
        else
        {
-               rd_u32b(&m_ptr->dealt_damage); 
+               rd_s32b(&m_ptr->dealt_damage); 
        }
 
        /* Monster race index of its appearance */
@@ -990,7 +1035,8 @@ static void rd_monster(monster_type *m_ptr)
        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_byte(&tmp8u);
+       m_ptr->mspeed = tmp8u;
 
        rd_s16b(&m_ptr->energy_need);
 
@@ -1048,7 +1094,11 @@ static void rd_monster(monster_type *m_ptr)
        if (flags & SAVE_MON_SMART) rd_u32b(&m_ptr->smart);
        else m_ptr->smart = 0;
 
-       if (flags & SAVE_MON_EXP) rd_u32b(&m_ptr->exp);
+       if (flags & SAVE_MON_EXP)
+       {
+               rd_u32b(&tmp32u);
+               m_ptr->exp = (EXP)tmp32u;
+       }
        else m_ptr->exp = 0;
 
        m_ptr->mflag = 0; /* Not saved */
@@ -1117,25 +1167,31 @@ static void rd_monster(monster_type *m_ptr)
  * @param r_idx 読み込み先モンスターID
  * @return なし
  */
-static void rd_lore(int r_idx)
+static void rd_lore(MONRACE_IDX r_idx)
 {
        byte tmp8u;
+       s16b tmp16s;
 
        monster_race *r_ptr = &r_info[r_idx];
 
        /* Count sights/deaths/kills */
-       rd_s16b(&r_ptr->r_sights);
-       rd_s16b(&r_ptr->r_deaths);
-       rd_s16b(&r_ptr->r_pkills);
+       rd_s16b(&tmp16s);
+       r_ptr->r_sights = (MONSTER_NUMBER)tmp16s;
+       rd_s16b(&tmp16s);
+       r_ptr->r_deaths = (MONSTER_NUMBER)tmp16s;
+       rd_s16b(&tmp16s);
+       r_ptr->r_pkills = (MONSTER_NUMBER)tmp16s;
        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(&tmp16s);
+               r_ptr->r_akills = (MONSTER_NUMBER)tmp16s; 
        }
-       rd_s16b(&r_ptr->r_tkills);
+       rd_s16b(&tmp16s);
+       r_ptr->r_tkills = (MONSTER_NUMBER)tmp16s;
 
        /* Count wakes and ignores */
        rd_byte(&r_ptr->r_wake);
@@ -1146,8 +1202,10 @@ static void rd_lore(int r_idx)
        rd_byte(&r_ptr->r_xtra2);
 
        /* Count drops */
-       rd_byte(&r_ptr->r_drop_gold);
-       rd_byte(&r_ptr->r_drop_item);
+       rd_byte(&tmp8u);
+       r_ptr->r_drop_gold = (ITEM_NUMBER)tmp8u;
+       rd_byte(&tmp8u);
+       r_ptr->r_drop_item = (ITEM_NUMBER)tmp8u;
 
        /* Count spells */
        rd_byte(&tmp8u);
@@ -1208,7 +1266,8 @@ static void rd_lore(int r_idx)
        }
 
        /* Read the "Racial" monster limit per level */
-       rd_byte(&r_ptr->max_num);
+       rd_byte(&tmp8u);
+       r_ptr->max_num = (MONSTER_NUMBER)tmp8u;
 
        /* Location in saved floor */
        rd_s16b(&r_ptr->floor_id);
@@ -1316,12 +1375,12 @@ static errr rd_store(int town_number, int store_number)
 
        if (z_older_than(10, 3, 3) && (store_number == STORE_HOME))
        {
-               st_ptr = &town[1].store[store_number];
+               st_ptr = &town_info[1].store[store_number];
                if (st_ptr->stock_num) sort = TRUE;
        }
        else
        {
-               st_ptr = &town[town_number].store[store_number];
+               st_ptr = &town_info[town_number].store[store_number];
        }
 
        /* Read the basic info */
@@ -1351,11 +1410,7 @@ static errr rd_store(int town_number, int store_number)
        {
                object_type forge;
                object_type *q_ptr;
-
-               /* Get local object */
                q_ptr = &forge;
-
-               /* Wipe the object */
                object_wipe(q_ptr);
 
                /* Read the item */
@@ -1425,21 +1480,15 @@ static void rd_randomizer(void)
 static void rd_options(void)
 {
        int i, n;
-
        byte b;
-
        u16b c;
 
-       u32b flag[8];
-       u32b mask[8];
-
-
-       /*** Oops ***/
+       BIT_FLAGS flag[8];
+       BIT_FLAGS mask[8];
 
        /* Ignore old options */
        strip_bytes(16);
 
-
        /*** Special info */
 
        /* Read "delay_factor" */
@@ -1461,7 +1510,6 @@ static void rd_options(void)
                mana_warn = b;
        }
 
-
        /*** Cheating options ***/
 
        rd_u16b(&c);
@@ -1477,6 +1525,7 @@ static void rd_options(void)
        cheat_save = (c & 0x4000) ? TRUE : FALSE;
        cheat_diary_output = (c & 0x8000) ? TRUE : FALSE;
        cheat_turn = (c & 0x0080) ? TRUE : FALSE;
+       cheat_sight = (c & 0x0040) ? TRUE : FALSE;
 
        rd_byte((byte *)&autosave_l);
        rd_byte((byte *)&autosave_t);
@@ -1592,7 +1641,7 @@ static void rd_options(void)
  * @brief ダミー情報スキップ / Hack -- strip the "ghost" info
  * @return なし
  * @details
- * XXX XXX XXX This is such a nasty hack it hurts.
+ * This is such a nasty hack it hurts.
  */
 static void rd_ghost(void)
 {
@@ -1613,6 +1662,7 @@ static void rd_ghost(void)
 static void load_quick_start(void)
 {
        byte tmp8u;
+       s16b tmp16s;
        int i;
 
        if (z_older_than(11, 0, 13))
@@ -1622,11 +1672,16 @@ static void load_quick_start(void)
        }
 
        rd_byte(&previous_char.psex);
-       rd_byte(&previous_char.prace);
-       rd_byte(&previous_char.pclass);
-       rd_byte(&previous_char.pseikaku);
-       rd_byte(&previous_char.realm1);
-       rd_byte(&previous_char.realm2);
+       rd_byte(&tmp8u);
+       previous_char.prace = (RACE_IDX)tmp8u;
+       rd_byte(&tmp8u);
+       previous_char.pclass = (CLASS_IDX)tmp8u;
+       rd_byte(&tmp8u);
+       previous_char.pseikaku = (CHARACTER_IDX)tmp8u;
+       rd_byte(&tmp8u);
+       previous_char.realm1 = (REALM_IDX)tmp8u;
+       rd_byte(&tmp8u);
+       previous_char.realm2 = (REALM_IDX)tmp8u;
 
        rd_s16b(&previous_char.age);
        rd_s16b(&previous_char.ht);
@@ -1634,10 +1689,14 @@ static void load_quick_start(void)
        rd_s16b(&previous_char.sc);
        rd_s32b(&previous_char.au);
 
-       for (i = 0; i < 6; i++) rd_s16b(&previous_char.stat_max[i]);
-       for (i = 0; i < 6; i++) rd_s16b(&previous_char.stat_max_max[i]);
+       for (i = 0; i < A_MAX; i++) rd_s16b(&previous_char.stat_max[i]);
+       for (i = 0; i < A_MAX; i++) rd_s16b(&previous_char.stat_max_max[i]);
 
-       for (i = 0; i < PY_MAX_LEVEL; i++) rd_s16b(&previous_char.player_hp[i]);
+       for (i = 0; i < PY_MAX_LEVEL; i++)
+       {
+               rd_s16b(&tmp16s);
+               previous_char.player_hp[i] = (HIT_POINT)tmp16s;
+       }
 
        rd_s16b(&previous_char.chaos_patron);
 
@@ -1662,6 +1721,7 @@ static void rd_extra(void)
 
        byte tmp8u;
        s16b tmp16s;
+       s32b tmp32s;
        u16b tmp16u;
 
        rd_string(p_ptr->name, sizeof(p_ptr->name));
@@ -1685,13 +1745,18 @@ static void rd_extra(void)
        }
 
        /* Class/Race/Seikaku/Gender/Spells */
-       rd_byte(&p_ptr->prace);
-       rd_byte(&p_ptr->pclass);
-       rd_byte(&p_ptr->pseikaku);
+       rd_byte(&tmp8u);
+       p_ptr->prace = (RACE_IDX)tmp8u;
+       rd_byte(&tmp8u);
+       p_ptr->pclass = (CLASS_IDX)tmp8u;
+       rd_byte(&tmp8u);
+       p_ptr->pseikaku = (CHARACTER_IDX)tmp8u;
        rd_byte(&p_ptr->psex);
-       rd_byte(&p_ptr->realm1);
-       rd_byte(&p_ptr->realm2);
-       rd_byte(&tmp8u); /* oops */
+       rd_byte(&tmp8u);
+       p_ptr->realm1 = (REALM_IDX)tmp8u;
+       rd_byte(&tmp8u);
+       p_ptr->realm2 = (REALM_IDX)tmp8u;
+       rd_byte(&tmp8u);
 
        if (z_older_than(10, 4, 4))
        {
@@ -1712,12 +1777,11 @@ static void rd_extra(void)
        rd_s16b(&p_ptr->wt);
 
        /* Read the stat info */
-       for (i = 0; i < 6; i++) rd_s16b(&p_ptr->stat_max[i]);
-       for (i = 0; i < 6; i++) rd_s16b(&p_ptr->stat_max_max[i]);
-       for (i = 0; i < 6; i++) rd_s16b(&p_ptr->stat_cur[i]);
-
-       strip_bytes(24); /* oops */
+       for (i = 0; i < A_MAX; i++) rd_s16b(&p_ptr->stat_max[i]);
+       for (i = 0; i < A_MAX; i++) rd_s16b(&p_ptr->stat_max_max[i]);
+       for (i = 0; i < A_MAX; i++) rd_s16b(&p_ptr->stat_cur[i]);
 
+       strip_bytes(24);
        rd_s32b(&p_ptr->au);
 
        rd_s32b(&p_ptr->max_exp);
@@ -1783,9 +1847,12 @@ static void rd_extra(void)
        }
        else
        {
-               rd_byte(&p_ptr->start_race);
-               rd_s32b(&p_ptr->old_race1);
-               rd_s32b(&p_ptr->old_race2);
+               rd_byte(&tmp8u);
+               p_ptr->start_race = (RACE_IDX)tmp8u;
+               rd_s32b(&tmp32s);
+               p_ptr->old_race1 = (BIT_FLAGS)tmp32s;
+               rd_s32b(&tmp32s);
+               p_ptr->old_race2 = (BIT_FLAGS)tmp32s;
                rd_s16b(&p_ptr->old_realm);
        }
 
@@ -1817,8 +1884,10 @@ static void rd_extra(void)
        {
                for (i = 0; i < MAX_MANE; i++)
                {
-                       rd_s16b(&p_ptr->mane_spell[i]);
-                       rd_s16b(&p_ptr->mane_dam[i]);
+                       rd_s16b(&tmp16s);
+                       p_ptr->mane_spell[i] = (SPELL_IDX)tmp16s;
+                       rd_s16b(&tmp16s);
+                       p_ptr->mane_dam[i] = (SPELL_IDX)tmp16s;
                }
                rd_s16b(&p_ptr->mane_num);
        }
@@ -1885,7 +1954,7 @@ static void rd_extra(void)
        rd_s16b(&tmp16s);
        p_ptr->oldpy = (POSITION)tmp16s;
 
-       if (z_older_than(10, 3, 13) && !dun_level && !p_ptr->inside_arena) {p_ptr->oldpy = 33;p_ptr->oldpx = 131;}
+       if (z_older_than(10, 3, 13) && !current_floor_ptr->dun_level && !p_ptr->inside_arena) {p_ptr->oldpy = 33;p_ptr->oldpx = 131;}
 
        /* Was p_ptr->rewards[MAX_BACT] */
        rd_s16b(&tmp16s);
@@ -1934,7 +2003,8 @@ static void rd_extra(void)
        rd_s16b(&p_ptr->max_plv);
        if (z_older_than(10, 3, 8))
        {
-               rd_s16b(&max_dlv[DUNGEON_ANGBAND]);
+               rd_s16b(&tmp16s);
+               max_dlv[DUNGEON_ANGBAND] = tmp16s;
        }
        else
        {
@@ -1944,12 +2014,13 @@ static void rd_extra(void)
 
                for(i = 0; i < max; i++)
                {
-                       rd_s16b(&max_dlv[i]);
+                       rd_s16b(&tmp16s);
+                       max_dlv[i] = tmp16s;
                        if (max_dlv[i] > d_info[i].maxdepth) max_dlv[i] = d_info[i].maxdepth;
                }
        }
 
-       /* Repair maximum player level XXX XXX XXX */
+       /* Repair maximum player level */
        if (p_ptr->max_plv < p_ptr->lev) p_ptr->max_plv = p_ptr->lev;
 
        /* More info */
@@ -2072,7 +2143,8 @@ static void rd_extra(void)
                else
                {
                        rd_s16b(&p_ptr->tim_res_time);
-                       rd_byte(&p_ptr->mimic_form);
+                       rd_byte(&tmp8u);
+                       p_ptr->mimic_form = (IDX)tmp8u;
                        rd_s16b(&p_ptr->tim_mimic);
                        rd_s16b(&p_ptr->tim_sh_fire);
                }
@@ -2142,8 +2214,9 @@ static void rd_extra(void)
        rd_byte(&tmp8u);
        p_ptr->autopick_autoregister = tmp8u ? TRUE : FALSE;
 
-       rd_byte(&tmp8u); /* oops */
-       rd_byte(&p_ptr->action);
+       rd_byte(&tmp8u);
+       rd_byte(&tmp8u);
+       p_ptr->action = (ACTION_IDX)tmp8u;
        if (!z_older_than(10, 4, 3))
        {
                rd_byte(&tmp8u);
@@ -2183,10 +2256,10 @@ static void rd_extra(void)
        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;
+               current_world_ptr->game_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;
+               current_world_ptr->game_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;
@@ -2204,26 +2277,26 @@ static void rd_extra(void)
                rd_s32b(&p_ptr->feeling_turn);
        }
 
-       /* Current turn */
-       rd_s32b(&turn);
+       /* Current current_world_ptr->game_turn */
+       rd_s32b(&current_world_ptr->game_turn);
 
        if (z_older_than(10, 3, 12))
        {
-               dungeon_turn = turn;
+               current_world_ptr->dungeon_turn = current_world_ptr->game_turn;
        }
-       else rd_s32b(&dungeon_turn);
+       else rd_s32b(&current_world_ptr->dungeon_turn);
 
        if (z_older_than(11, 0, 13))
        {
                old_turn /= 2;
                p_ptr->feeling_turn /= 2;
-               turn /= 2;
-               dungeon_turn /= 2;
+               current_world_ptr->game_turn /= 2;
+               current_world_ptr->dungeon_turn /= 2;
        }
 
        if (z_older_than(10, 3, 13))
        {
-               old_battle = turn;
+               old_battle = current_world_ptr->game_turn;
        }
        else rd_s32b(&old_battle);
 
@@ -2289,13 +2362,13 @@ static void rd_extra(void)
        }
        else if (z_older_than(10, 3, 10))
        {
-               s32b tmp32s;
                rd_s32b(&tmp32s);
                p_ptr->visit = 1L;
        }
        else
        {
-               rd_s32b(&p_ptr->visit);
+               rd_s32b(&tmp32s);
+               p_ptr->visit = (BIT_FLAGS)tmp32s;
        }
        if (!z_older_than(11, 0, 5))
        {
@@ -2340,11 +2413,7 @@ static errr rd_inventory(void)
 
                /* Nope, we reached the end */
                if (n == 0xFFFF) break;
-
-               /* Get local object */
                q_ptr = &forge;
-
-               /* Wipe the object */
                object_wipe(q_ptr);
 
                /* Read the item */
@@ -2356,10 +2425,7 @@ 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);
 
                        /* Add the weight */
@@ -2372,7 +2438,6 @@ static errr rd_inventory(void)
                /* Warning -- backpack is full */
                else if (inven_cnt == INVEN_PACK)
                {
-                       /* Oops */
                        note(_("持ち物の中のアイテムが多すぎる!", "Too many items in the inventory!"));
 
                        /* Fail */
@@ -2385,10 +2450,7 @@ static errr rd_inventory(void)
                        /* Get a slot */
                        n = slot++;
 
-                       /* Player touches it */
                        q_ptr->marked |= OM_TOUCHED;
-
-                       /* Copy object */
                        object_copy(&inventory[n], q_ptr);
 
                        /* Add the weight */
@@ -2412,6 +2474,7 @@ static void rd_messages(void)
 {
        int i;
        char buf[128];
+       int message_max;
 
 
        if (h_older_than(2, 2, 0, 75))
@@ -2419,9 +2482,10 @@ static void rd_messages(void)
                u16b num;
                /* Total */
                rd_u16b(&num);
+               message_max = (int)num;
 
                /* Read the messages */
-               for (i = 0; i < num; i++)
+               for (i = 0; i < message_max; i++)
                {
                        /* Read the message */
                        rd_string(buf, sizeof(buf));
@@ -2435,9 +2499,10 @@ static void rd_messages(void)
                u32b num;
                /* Total */
                rd_u32b(&num);
+               message_max = (int)num;
 
                /* Read the messages */
-               for (i = 0; i < num; i++)
+               for (i = 0; i < message_max; i++)
                {
                        /* Read the message */
                        rd_string(buf, sizeof(buf));
@@ -2485,33 +2550,38 @@ static errr rd_dungeon_old(void)
        byte tmp8u;
        s16b tmp16s;
        u16b limit;
-       cave_type *c_ptr;
+       grid_type *g_ptr;
 
 
        /*** Basic info ***/
 
        /* Header info */
        rd_s16b(&tmp16s);
-       dun_level = (DEPTH)tmp16s;
-       if (z_older_than(10, 3, 8)) dungeon_type = DUNGEON_ANGBAND;
-       else rd_byte(&dungeon_type);
+       current_floor_ptr->dun_level = (DEPTH)tmp16s;
+       if (z_older_than(10, 3, 8)) p_ptr->dungeon_idx = DUNGEON_ANGBAND;
+       else
+       { 
+               rd_byte(&tmp8u);
+               p_ptr->dungeon_idx = (IDX)tmp8u;
+       }
 
        /* Set the base level for old versions */
-       base_level = dun_level;
+       current_floor_ptr->base_level = current_floor_ptr->dun_level;
 
        rd_s16b(&tmp16s);
-       base_level = (DEPTH)tmp16s;
+       current_floor_ptr->base_level = (DEPTH)tmp16s;
 
-       rd_s16b(&num_repro);
        rd_s16b(&tmp16s);
-       p_ptr->y = (int)tmp16s;
+       current_floor_ptr->num_repro = (MONSTER_NUMBER)tmp16s;
+       rd_s16b(&tmp16s);
+       p_ptr->y = (POSITION)tmp16s;
        rd_s16b(&tmp16s);
-       p_ptr->x = (int)tmp16s;
-       if (z_older_than(10, 3, 13) && !dun_level && !p_ptr->inside_arena) {p_ptr->y = 33;p_ptr->x = 131;}
+       p_ptr->x = (POSITION)tmp16s;
+       if (z_older_than(10, 3, 13) && !current_floor_ptr->dun_level && !p_ptr->inside_arena) {p_ptr->y = 33;p_ptr->x = 131;}
        rd_s16b(&tmp16s);
-       cur_hgt = (POSITION)tmp16s;
+       current_floor_ptr->height = (POSITION)tmp16s;
        rd_s16b(&tmp16s);
-       cur_wid = (POSITION)tmp16s;
+       current_floor_ptr->width = (POSITION)tmp16s;
        rd_s16b(&tmp16s); /* max_panel_rows */
        rd_s16b(&tmp16s); /* max_panel_cols */
 
@@ -2520,8 +2590,8 @@ static errr rd_dungeon_old(void)
 #endif
 
        /* Maximal size */
-       ymax = cur_hgt;
-       xmax = cur_wid;
+       ymax = current_floor_ptr->height;
+       xmax = current_floor_ptr->width;
 
 
        /*** Run length decoding ***/
@@ -2549,11 +2619,11 @@ static errr rd_dungeon_old(void)
                /* Apply the RLE info */
                for (i = count; i > 0; i--)
                {
-                       /* Access the cave */
-                       c_ptr = &cave[y][x];
+                       /* Access the current_floor_ptr->grid_array */
+                       g_ptr = &current_floor_ptr->grid_array[y][x];
 
                        /* Extract "info" */
-                       c_ptr->info = info;
+                       g_ptr->info = info;
 
                        /* Advance/Wrap */
                        if (++x >= xmax)
@@ -2580,11 +2650,11 @@ static errr rd_dungeon_old(void)
                /* Apply the RLE info */
                for (i = count; i > 0; i--)
                {
-                       /* Access the cave */
-                       c_ptr = &cave[y][x];
+                       /* Access the current_floor_ptr->grid_array */
+                       g_ptr = &current_floor_ptr->grid_array[y][x];
 
                        /* Extract "feat" */
-                       c_ptr->feat = (s16b)tmp8u;
+                       g_ptr->feat = (s16b)tmp8u;
 
                        /* Advance/Wrap */
                        if (++x >= xmax)
@@ -2610,11 +2680,11 @@ static errr rd_dungeon_old(void)
                /* Apply the RLE info */
                for (i = count; i > 0; i--)
                {
-                       /* Access the cave */
-                       c_ptr = &cave[y][x];
+                       /* Access the current_floor_ptr->grid_array */
+                       g_ptr = &current_floor_ptr->grid_array[y][x];
 
                        /* Extract "mimic" */
-                       c_ptr->mimic = (s16b)tmp8u;
+                       g_ptr->mimic = (s16b)tmp8u;
 
                        /* Advance/Wrap */
                        if (++x >= xmax)
@@ -2640,11 +2710,11 @@ static errr rd_dungeon_old(void)
                /* Apply the RLE info */
                for (i = count; i > 0; i--)
                {
-                       /* Access the cave */
-                       c_ptr = &cave[y][x];
+                       /* Access the current_floor_ptr->grid_array */
+                       g_ptr = &current_floor_ptr->grid_array[y][x];
 
                        /* Extract "feat" */
-                       c_ptr->special = tmp16s;
+                       g_ptr->special = tmp16s;
 
                        /* Advance/Wrap */
                        if (++x >= xmax)
@@ -2658,13 +2728,13 @@ static errr rd_dungeon_old(void)
                }
        }
 
-       /* Convert cave data */
+       /* Convert current_floor_ptr->grid_array data */
        if (z_older_than(11, 0, 99))
        {
                for (y = 0; y < ymax; y++) for (x = 0; x < xmax; x++)
                {
                        /* Wipe old unused flags */
-                       cave[y][x].info &= ~(CAVE_MASK);
+                       current_floor_ptr->grid_array[y][x].info &= ~(CAVE_MASK);
                }
        }
 
@@ -2672,21 +2742,21 @@ static errr rd_dungeon_old(void)
        {
                for (y = 0; y < ymax; y++) for (x = 0; x < xmax; x++)
                {
-                       /* Access the cave */
-                       c_ptr = &cave[y][x];
+                       /* Access the current_floor_ptr->grid_array */
+                       g_ptr = &current_floor_ptr->grid_array[y][x];
 
                        /* Very old */
-                       if (c_ptr->feat == OLD_FEAT_INVIS)
+                       if (g_ptr->feat == OLD_FEAT_INVIS)
                        {
-                               c_ptr->feat = feat_floor;
-                               c_ptr->info |= CAVE_TRAP;
+                               g_ptr->feat = feat_floor;
+                               g_ptr->info |= CAVE_TRAP;
                        }
 
                        /* Older than 1.1.1 */
-                       if (c_ptr->feat == OLD_FEAT_MIRROR)
+                       if (g_ptr->feat == OLD_FEAT_MIRROR)
                        {
-                               c_ptr->feat = feat_floor;
-                               c_ptr->info |= CAVE_OBJECT;
+                               g_ptr->feat = feat_floor;
+                               g_ptr->info |= CAVE_OBJECT;
                        }
                }
        }
@@ -2695,37 +2765,37 @@ static errr rd_dungeon_old(void)
        {
                for (y = 0; y < ymax; y++) for (x = 0; x < xmax; x++)
                {
-                       /* Access the cave */
-                       c_ptr = &cave[y][x];
+                       /* Access the current_floor_ptr->grid_array */
+                       g_ptr = &current_floor_ptr->grid_array[y][x];
 
                        /* Old CAVE_IN_MIRROR flag */
-                       if (c_ptr->info & CAVE_OBJECT)
+                       if (g_ptr->info & CAVE_OBJECT)
                        {
-                               c_ptr->mimic = feat_mirror;
+                               g_ptr->mimic = feat_mirror;
                        }
 
                        /* Runes will be mimics and flags */
-                       else if ((c_ptr->feat == OLD_FEAT_MINOR_GLYPH) ||
-                                (c_ptr->feat == OLD_FEAT_GLYPH))
+                       else if ((g_ptr->feat == OLD_FEAT_MINOR_GLYPH) ||
+                                (g_ptr->feat == OLD_FEAT_GLYPH))
                        {
-                               c_ptr->info |= CAVE_OBJECT;
-                               c_ptr->mimic = c_ptr->feat;
-                               c_ptr->feat = feat_floor;
+                               g_ptr->info |= CAVE_OBJECT;
+                               g_ptr->mimic = g_ptr->feat;
+                               g_ptr->feat = feat_floor;
                        }
 
                        /* Hidden traps will be trap terrains mimicing floor */
-                       else if (c_ptr->info & CAVE_TRAP)
+                       else if (g_ptr->info & CAVE_TRAP)
                        {
-                               c_ptr->info &= ~CAVE_TRAP;
-                               c_ptr->mimic = c_ptr->feat;
-                               c_ptr->feat = choose_random_trap();
+                               g_ptr->info &= ~CAVE_TRAP;
+                               g_ptr->mimic = g_ptr->feat;
+                               g_ptr->feat = choose_random_trap();
                        }
 
                        /* Another hidden trap */
-                       else if (c_ptr->feat == OLD_FEAT_INVIS)
+                       else if (g_ptr->feat == OLD_FEAT_INVIS)
                        {
-                               c_ptr->mimic = feat_floor;
-                               c_ptr->feat = feat_trap_open;
+                               g_ptr->mimic = feat_floor;
+                               g_ptr->feat = feat_trap_open;
                        }
                }
        }
@@ -2735,26 +2805,26 @@ static errr rd_dungeon_old(void)
        {
                for (y = 0; y < ymax; y++) for (x = 0; x < xmax; x++)
                {
-                       /* Access the cave */
-                       c_ptr = &cave[y][x];
+                       /* Access the current_floor_ptr->grid_array */
+                       g_ptr = &current_floor_ptr->grid_array[y][x];
 
-                       if ((c_ptr->special == OLD_QUEST_WATER_CAVE) && !dun_level)
+                       if ((g_ptr->special == OLD_QUEST_WATER_CAVE) && !current_floor_ptr->dun_level)
                        {
-                               if (c_ptr->feat == OLD_FEAT_QUEST_ENTER)
+                               if (g_ptr->feat == OLD_FEAT_QUEST_ENTER)
                                {
-                                       c_ptr->feat = feat_tree;
-                                       c_ptr->special = 0;
+                                       g_ptr->feat = feat_tree;
+                                       g_ptr->special = 0;
                                }
-                               else if (c_ptr->feat == OLD_FEAT_BLDG_1)
+                               else if (g_ptr->feat == OLD_FEAT_BLDG_1)
                                {
-                                       c_ptr->special = lite_town ? QUEST_OLD_CASTLE : QUEST_ROYAL_CRYPT;
+                                       g_ptr->special = lite_town ? QUEST_OLD_CASTLE : QUEST_ROYAL_CRYPT;
                                }
                        }
-                       else if ((c_ptr->feat == OLD_FEAT_QUEST_EXIT) &&
+                       else if ((g_ptr->feat == OLD_FEAT_QUEST_EXIT) &&
                                 (p_ptr->inside_quest == OLD_QUEST_WATER_CAVE))
                        {
-                               c_ptr->feat = feat_up_stair;
-                               c_ptr->special = 0;
+                               g_ptr->feat = feat_up_stair;
+                               g_ptr->special = 0;
                        }
                }
        }
@@ -2765,7 +2835,7 @@ static errr rd_dungeon_old(void)
        rd_u16b(&limit);
 
        /* Verify maximum */
-       if (limit > max_o_idx)
+       if (limit > current_floor_ptr->max_o_idx)
        {
                note(format(_("アイテムの配列が大きすぎる(%d)!", "Too many (%d) object entries!"), limit));
                return (151);
@@ -2774,7 +2844,7 @@ static errr rd_dungeon_old(void)
        /* Read the dungeon items */
        for (i = 1; i < limit; i++)
        {
-               IDX o_idx;
+               OBJECT_IDX o_idx;
 
                object_type *o_ptr;
 
@@ -2782,7 +2852,6 @@ static errr rd_dungeon_old(void)
                /* Get a new record */
                o_idx = o_pop();
 
-               /* Oops */
                if (i != o_idx)
                {
                        note(format(_("アイテム配置エラー (%d <> %d)", "Object allocation error (%d <> %d)"), i, o_idx));
@@ -2791,13 +2860,13 @@ static errr rd_dungeon_old(void)
 
 
                /* Acquire place */
-               o_ptr = &o_list[o_idx];
+               o_ptr = &current_floor_ptr->o_list[o_idx];
 
                /* Read the item */
                rd_item(o_ptr);
 
 
-               /* XXX XXX XXX XXX XXX */
+               /* XXX XXX */
 
                /* Monster */
                if (o_ptr->held_m_idx)
@@ -2805,7 +2874,7 @@ static errr rd_dungeon_old(void)
                        monster_type *m_ptr;
 
                        /* Monster */
-                       m_ptr = &m_list[o_ptr->held_m_idx];
+                       m_ptr = &current_floor_ptr->m_list[o_ptr->held_m_idx];
 
                        /* Build a stack */
                        o_ptr->next_o_idx = m_ptr->hold_o_idx;
@@ -2818,13 +2887,13 @@ static errr rd_dungeon_old(void)
                else
                {
                        /* Access the item location */
-                       c_ptr = &cave[o_ptr->iy][o_ptr->ix];
+                       g_ptr = &current_floor_ptr->grid_array[o_ptr->iy][o_ptr->ix];
 
                        /* Build a stack */
-                       o_ptr->next_o_idx = c_ptr->o_idx;
+                       o_ptr->next_o_idx = g_ptr->o_idx;
 
                        /* Place the object */
-                       c_ptr->o_idx = o_idx;
+                       g_ptr->o_idx = o_idx;
                }
        }
 
@@ -2835,7 +2904,7 @@ static errr rd_dungeon_old(void)
        rd_u16b(&limit);
 
        /* Hack -- verify */
-       if (limit > max_m_idx)
+       if (limit > current_floor_ptr->max_m_idx)
        {
                note(format(_("モンスターの配列が大きすぎる(%d)!", "Too many (%d) monster entries!"), limit));
                return (161);
@@ -2844,13 +2913,12 @@ static errr rd_dungeon_old(void)
        /* Read the monsters */
        for (i = 1; i < limit; i++)
        {
-               int m_idx;
+               MONSTER_IDX m_idx;
                monster_type *m_ptr;
 
                /* Get a new record */
                m_idx = m_pop();
 
-               /* Oops */
                if (i != m_idx)
                {
                        note(format(_("モンスター配置エラー (%d <> %d)", "Monster allocation error (%d <> %d)"), i, m_idx));
@@ -2859,17 +2927,17 @@ static errr rd_dungeon_old(void)
 
 
                /* Acquire monster */
-               m_ptr = &m_list[m_idx];
+               m_ptr = &current_floor_ptr->m_list[m_idx];
 
                /* Read the monster */
                rd_monster(m_ptr);
 
 
                /* Access grid */
-               c_ptr = &cave[m_ptr->fy][m_ptr->fx];
+               g_ptr = &current_floor_ptr->grid_array[m_ptr->fy][m_ptr->fx];
 
                /* Mark the location */
-               c_ptr->m_idx = m_idx;
+               g_ptr->m_idx = m_idx;
 
                /* Count */
                real_r_ptr(m_ptr)->cur_num++;
@@ -2878,7 +2946,7 @@ static errr rd_dungeon_old(void)
        /*** Success ***/
 
        /* The dungeon is ready */
-       if (z_older_than(10, 3, 13) && !dun_level && !p_ptr->inside_arena)
+       if (z_older_than(10, 3, 13) && !current_floor_ptr->dun_level && !p_ptr->inside_arena)
                character_dungeon = FALSE;
        else
                character_dungeon = TRUE;
@@ -2890,15 +2958,22 @@ static errr rd_dungeon_old(void)
 
 /*!
  * @brief 保存されたフロアを読み込む / Read the saved floor
- * @return なし
+ * @return info読み込みエラーコード
  * @details
+ * この関数は、セーブデータの互換性を保つために多くのデータ改変処理を備えている。
+ * 現在確認している処理は以下の通り、
+ * <ul>
+ * <li>1.7.0.2で8bitだったgrid_typeのfeat,mimicのID値を16bitに拡張する処理。</li>
+ * <li>1.7.0.8までに廃止、IDなどを差し替えたクエスト番号を置換する処理。</li>
+ * </ul>
  * The monsters/objects must be loaded in the same order
  * that they were stored, since the actual indexes matter.
  */
 static errr rd_saved_floor(saved_floor_type *sf_ptr)
 {
-       int ymax, xmax;
-       int i, y, x;
+       POSITION ymax, xmax;
+       POSITION y, x;
+       int i;
        byte count;
        byte tmp8u;
        s16b tmp16s;
@@ -2910,7 +2985,7 @@ static errr rd_saved_floor(saved_floor_type *sf_ptr)
        cave_template_type *templates;
 
 
-       /*** Wipe all cave ***/
+       /*** Wipe all current_floor_ptr->grid_array ***/
        clear_cave();
 
 
@@ -2923,8 +2998,8 @@ static errr rd_saved_floor(saved_floor_type *sf_ptr)
                /*** Not a saved floor ***/
 
                rd_s16b(&tmp16s);
-               dun_level = (DEPTH)tmp16s;
-               base_level = dun_level;
+               current_floor_ptr->dun_level = (DEPTH)tmp16s;
+               current_floor_ptr->base_level = current_floor_ptr->dun_level;
        }
        else
        {
@@ -2938,7 +3013,7 @@ static errr rd_saved_floor(saved_floor_type *sf_ptr)
 
                rd_s16b(&tmp16s);
                if (tmp16s != sf_ptr->dun_level) return 171;
-               dun_level = sf_ptr->dun_level;
+               current_floor_ptr->dun_level = sf_ptr->dun_level;
 
                rd_s32b(&tmp32s);
                if (tmp32s != sf_ptr->last_visit) return 171;
@@ -2954,25 +3029,26 @@ static errr rd_saved_floor(saved_floor_type *sf_ptr)
        }
 
        rd_s16b(&tmp16s);
-       base_level = (DEPTH)tmp16s;
-       rd_s16b(&num_repro);
+       current_floor_ptr->base_level = (DEPTH)tmp16s;
+       rd_s16b(&tmp16s);
+       current_floor_ptr->num_repro = (MONSTER_NUMBER)tmp16s;
 
        rd_u16b(&tmp16u);
-       p_ptr->y = (int)tmp16u;
+       p_ptr->y = (POSITION)tmp16u;
 
        rd_u16b(&tmp16u);
-       p_ptr->x = (int)tmp16u;
+       p_ptr->x = (POSITION)tmp16u;
 
        rd_s16b(&tmp16s);
-       cur_hgt = (POSITION)tmp16s;
+       current_floor_ptr->height = (POSITION)tmp16s;
        rd_s16b(&tmp16s);
-       cur_wid = (POSITION)tmp16s;
+       current_floor_ptr->width = (POSITION)tmp16s;
 
        rd_byte(&p_ptr->feeling);
 
 
 
-       /*** Read template for cave_type ***/
+       /*** Read template for grid_type ***/
 
        /* Read the template count */
        rd_u16b(&limit);
@@ -2986,7 +3062,8 @@ static errr rd_saved_floor(saved_floor_type *sf_ptr)
                cave_template_type *ct_ptr = &templates[i];
 
                /* Read it */
-               rd_u16b(&ct_ptr->info);
+               rd_u16b(&tmp16u);
+               ct_ptr->info = (BIT_FLAGS)tmp16u;
                if (h_older_than(1, 7, 0, 2))
                {
                        rd_byte(&tmp8u);
@@ -3003,8 +3080,8 @@ static errr rd_saved_floor(saved_floor_type *sf_ptr)
        }
 
        /* Maximal size */
-       ymax = cur_hgt;
-       xmax = cur_wid;
+       ymax = current_floor_ptr->height;
+       xmax = current_floor_ptr->width;
 
 
        /*** Run length decoding ***/
@@ -3027,14 +3104,14 @@ static errr rd_saved_floor(saved_floor_type *sf_ptr)
                /* Apply the RLE info */
                for (i = count; i > 0; i--)
                {
-                       /* Access the cave */
-                       cave_type *c_ptr = &cave[y][x];
+                       /* Access the current_floor_ptr->grid_array */
+                       grid_type *g_ptr = &current_floor_ptr->grid_array[y][x];
 
-                       /* Extract cave data */
-                       c_ptr->info = templates[id].info;
-                       c_ptr->feat = templates[id].feat;
-                       c_ptr->mimic = templates[id].mimic;
-                       c_ptr->special = templates[id].special;
+                       /* Extract current_floor_ptr->grid_array data */
+                       g_ptr->info = templates[id].info;
+                       g_ptr->feat = templates[id].feat;
+                       g_ptr->mimic = templates[id].mimic;
+                       g_ptr->special = templates[id].special;
 
                        /* Advance/Wrap */
                        if (++x >= xmax)
@@ -3053,26 +3130,26 @@ static errr rd_saved_floor(saved_floor_type *sf_ptr)
        {
                for (y = 0; y < ymax; y++) for (x = 0; x < xmax; x++)
                {
-                       /* Access the cave */
-                       cave_type *c_ptr = &cave[y][x];
+                       /* Access the current_floor_ptr->grid_array */
+                       grid_type *g_ptr = &current_floor_ptr->grid_array[y][x];
 
-                       if ((c_ptr->special == OLD_QUEST_WATER_CAVE) && !dun_level)
+                       if ((g_ptr->special == OLD_QUEST_WATER_CAVE) && !current_floor_ptr->dun_level)
                        {
-                               if (c_ptr->feat == OLD_FEAT_QUEST_ENTER)
+                               if (g_ptr->feat == OLD_FEAT_QUEST_ENTER)
                                {
-                                       c_ptr->feat = feat_tree;
-                                       c_ptr->special = 0;
+                                       g_ptr->feat = feat_tree;
+                                       g_ptr->special = 0;
                                }
-                               else if (c_ptr->feat == OLD_FEAT_BLDG_1)
+                               else if (g_ptr->feat == OLD_FEAT_BLDG_1)
                                {
-                                       c_ptr->special = lite_town ? QUEST_OLD_CASTLE : QUEST_ROYAL_CRYPT;
+                                       g_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))
+                       else if ((g_ptr->feat == OLD_FEAT_QUEST_EXIT) &&
+                               (p_ptr->inside_quest == OLD_QUEST_WATER_CAVE))
                        {
-                               c_ptr->feat = feat_up_stair;
-                               c_ptr->special = 0;
+                               g_ptr->feat = feat_up_stair;
+                               g_ptr->special = 0;
                        }
                }
        }
@@ -3087,24 +3164,23 @@ static errr rd_saved_floor(saved_floor_type *sf_ptr)
        rd_u16b(&limit);
 
        /* Verify maximum */
-       if (limit > max_o_idx) return 151;
+       if (limit > current_floor_ptr->max_o_idx) return 151;
 
 
        /* Read the dungeon items */
        for (i = 1; i < limit; i++)
        {
-               int o_idx;
+               OBJECT_IDX o_idx;
                object_type *o_ptr;
 
 
                /* Get a new record */
                o_idx = o_pop();
 
-               /* Oops */
                if (i != o_idx) return 152;
 
                /* Acquire place */
-               o_ptr = &o_list[o_idx];
+               o_ptr = &current_floor_ptr->o_list[o_idx];
 
                /* Read the item */
                rd_item(o_ptr);
@@ -3116,7 +3192,7 @@ static errr rd_saved_floor(saved_floor_type *sf_ptr)
                        monster_type *m_ptr;
 
                        /* Monster */
-                       m_ptr = &m_list[o_ptr->held_m_idx];
+                       m_ptr = &current_floor_ptr->m_list[o_ptr->held_m_idx];
 
                        /* Build a stack */
                        o_ptr->next_o_idx = m_ptr->hold_o_idx;
@@ -3129,13 +3205,13 @@ static errr rd_saved_floor(saved_floor_type *sf_ptr)
                else
                {
                        /* Access the item location */
-                       cave_type *c_ptr = &cave[o_ptr->iy][o_ptr->ix];
+                       grid_type *g_ptr = &current_floor_ptr->grid_array[o_ptr->iy][o_ptr->ix];
 
                        /* Build a stack */
-                       o_ptr->next_o_idx = c_ptr->o_idx;
+                       o_ptr->next_o_idx = g_ptr->o_idx;
 
                        /* Place the object */
-                       c_ptr->o_idx = o_idx;
+                       g_ptr->o_idx = o_idx;
                }
        }
 
@@ -3146,34 +3222,33 @@ static errr rd_saved_floor(saved_floor_type *sf_ptr)
        rd_u16b(&limit);
 
        /* Hack -- verify */
-       if (limit > max_m_idx) return 161;
+       if (limit > current_floor_ptr->max_m_idx) return 161;
 
        /* Read the monsters */
        for (i = 1; i < limit; i++)
        {
-               cave_type *c_ptr;
-               int m_idx;
+               grid_type *g_ptr;
+               MONSTER_IDX m_idx;
                monster_type *m_ptr;
 
                /* Get a new record */
                m_idx = m_pop();
 
-               /* Oops */
                if (i != m_idx) return 162;
 
 
                /* Acquire monster */
-               m_ptr = &m_list[m_idx];
+               m_ptr = &current_floor_ptr->m_list[m_idx];
 
                /* Read the monster */
                rd_monster(m_ptr);
 
 
                /* Access grid */
-               c_ptr = &cave[m_ptr->fy][m_ptr->fx];
+               g_ptr = &current_floor_ptr->grid_array[m_ptr->fy][m_ptr->fx];
 
                /* Mark the location */
-               c_ptr->m_idx = m_idx;
+               g_ptr->m_idx = m_idx;
 
                /* Count */
                real_r_ptr(m_ptr)->cur_num++;
@@ -3194,6 +3269,8 @@ static errr rd_saved_floor(saved_floor_type *sf_ptr)
 static errr rd_dungeon(void)
 {
        errr err = 0;
+       s16b tmp16s;
+       byte_hack tmp8u;
        byte num;
        int i;
 
@@ -3206,10 +3283,10 @@ static errr rd_dungeon(void)
                err = rd_dungeon_old();
 
                /* Prepare floor_id of current floor */
-               if (dungeon_type)
+               if (p_ptr->dungeon_idx)
                {
                        p_ptr->floor_id = get_new_floor_id();
-                       get_sf_ptr(p_ptr->floor_id)->dun_level = dun_level;
+                       get_sf_ptr(p_ptr->floor_id)->dun_level = current_floor_ptr->dun_level;
                }
 
                return err;
@@ -3222,8 +3299,8 @@ static errr rd_dungeon(void)
        rd_s16b(&max_floor_id);
 
        /* Current dungeon type */
-       rd_byte(&dungeon_type);
-
+       rd_byte(&tmp8u);
+       p_ptr->dungeon_idx = (DUNGEON_IDX)tmp8u;
 
        /* Number of the saved_floors array elements */
        rd_byte(&num);
@@ -3245,8 +3322,12 @@ static errr rd_dungeon(void)
                        saved_floor_type *sf_ptr = &saved_floors[i];
 
                        rd_s16b(&sf_ptr->floor_id);
-                       rd_byte(&sf_ptr->savefile_id);
-                       rd_s16b(&sf_ptr->dun_level);
+                       rd_byte(&tmp8u);
+                       sf_ptr->savefile_id = (s16b)tmp8u;
+
+                       rd_s16b(&tmp16s);
+                       sf_ptr->dun_level = (DEPTH)tmp16s;
+
                        rd_s32b(&sf_ptr->last_visit);
                        rd_u32b(&sf_ptr->visit_mark);
                        rd_s16b(&sf_ptr->upper_floor_id);
@@ -3258,7 +3339,6 @@ static errr rd_dungeon(void)
                for (i = 0; i < num; i++)
                {
                        saved_floor_type *sf_ptr = &saved_floors[i];
-                       byte tmp8u;
 
                        /* Unused element */
                        if (!sf_ptr->floor_id) continue;
@@ -3342,6 +3422,7 @@ static errr rd_savefile_new_aux(void)
 
        byte tmp8u;
        u16b tmp16u;
+       s16b tmp16s;
        u32b tmp32u;
 
 #ifdef VERIFY_CHECKSUMS
@@ -3439,7 +3520,7 @@ static errr rd_savefile_new_aux(void)
        for (i = 0; i < tmp16u; i++)
        {
                /* Read the lore */
-               rd_lore(i);
+               rd_lore((MONRACE_IDX)i);
        }
 
        if (arg_fiddle) note(_("モンスターの思い出をロードしました", "Loaded Monster Memory"));
@@ -3496,7 +3577,7 @@ static errr rd_savefile_new_aux(void)
                }
 
                /* Incompatible save files */
-               if (max_quests_load > max_quests)
+               if (max_quests_load > max_q_idx)
                {
                        note(format(_("クエストが多すぎる(%u)!", "Too many (%u) quests!"), max_quests_load));
                        return (23);
@@ -3504,12 +3585,13 @@ static errr rd_savefile_new_aux(void)
 
                for (i = 0; i < max_quests_load; i++)
                {
-                       if (i < max_quests)
+                       if (i < max_q_idx)
                        {
                                quest_type* const q_ptr = &quest[i];
                                
                                rd_s16b(&q_ptr->status);
-                               rd_s16b(&q_ptr->level);
+                               rd_s16b(&tmp16s);
+                               q_ptr->level = tmp16s;
 
                                if (z_older_than(11, 0, 6))
                                {
@@ -3517,7 +3599,8 @@ static errr rd_savefile_new_aux(void)
                                }
                                else
                                {
-                                       rd_byte(&q_ptr->complev);
+                                       rd_byte(&tmp8u);
+                                       q_ptr->complev = tmp8u;
                                }
                                if(h_older_than(2, 1, 2, 2))
                                {
@@ -3533,8 +3616,10 @@ static errr rd_savefile_new_aux(void)
                                    (!z_older_than(10, 3, 14) && (q_ptr->status == QUEST_STATUS_COMPLETED)) ||
                                    (!z_older_than(11, 0, 7) && (i >= MIN_RANDOM_QUEST) && (i <= (MIN_RANDOM_QUEST + max_rquests_load))))
                                {
-                                       rd_s16b(&q_ptr->cur_num);
-                                       rd_s16b(&q_ptr->max_num);
+                                       rd_s16b(&tmp16s);
+                                       q_ptr->cur_num = (MONSTER_NUMBER)tmp16s;
+                                       rd_s16b(&tmp16s);
+                                       q_ptr->max_num = (MONSTER_NUMBER)tmp16s;
                                        rd_s16b(&q_ptr->type);
 
                                        /* Load quest monster index */
@@ -3551,7 +3636,8 @@ static errr rd_savefile_new_aux(void)
                                        if (q_ptr->k_idx)
                                                a_info[q_ptr->k_idx].gen_flags |= TRG_QUESTITEM;
 
-                                       rd_byte(&q_ptr->flags);
+                                       rd_byte(&tmp8u);
+                                       q_ptr->flags = tmp8u;
 
                                        if (z_older_than(10, 3, 11))
                                        {
@@ -3562,7 +3648,7 @@ static errr rd_savefile_new_aux(void)
                                                else
                                                {
                                                        init_flags = INIT_ASSIGN;
-                                                       p_ptr->inside_quest = i;
+                                                       p_ptr->inside_quest = (QUEST_IDX)i;
 
                                                        process_dungeon_file("q_info.txt", 0, 0, 0, 0);
                                                        p_ptr->inside_quest = old_inside_quest;
@@ -3570,7 +3656,8 @@ static errr rd_savefile_new_aux(void)
                                        }
                                        else
                                        {
-                                               rd_byte(&q_ptr->dungeon);
+                                               rd_byte(&tmp8u);
+                                               q_ptr->dungeon = tmp8u;
                                        }
                                        /* Mark uniques */
                                        if (q_ptr->status == QUEST_STATUS_TAKEN || q_ptr->status == QUEST_STATUS_UNTAKEN)
@@ -3620,7 +3707,7 @@ static errr rd_savefile_new_aux(void)
                rd_s32b(&wild_y_size);
 
                /* Incompatible save files */
-               if ((wild_x_size > max_wild_x) || (wild_y_size > max_wild_y))
+               if ((wild_x_size > current_world_ptr->max_wild_x) || (wild_y_size > current_world_ptr->max_wild_y))
                {
                        note(format(_("荒野が大きすぎる(%u/%u)!", "Wilderness is too big (%u/%u)!"), wild_x_size, wild_y_size));
                        return (23);
@@ -3673,7 +3760,7 @@ static errr rd_savefile_new_aux(void)
 
        /* Read the extra stuff */
        rd_extra();
-       if (p_ptr->energy_need < -999) world_player = TRUE;
+       if (p_ptr->energy_need < -999) p_ptr->timewalk = TRUE;
 
        if (arg_fiddle) note(_("特別情報をロードしました", "Loaded extra information"));
 
@@ -3691,7 +3778,8 @@ static errr rd_savefile_new_aux(void)
        /* Read the player_hp array */
        for (i = 0; i < tmp16u; i++)
        {
-               rd_s16b(&p_ptr->player_hp[i]);
+               rd_s16b(&tmp16s);
+               p_ptr->player_hp[i] = (HIT_POINT)tmp16s;
        }
 
        /* Important -- Initialize the sex */
@@ -3705,22 +3793,22 @@ static errr rd_savefile_new_aux(void)
        if(z_older_than(10, 2, 2) && (p_ptr->pclass == CLASS_BEASTMASTER) && !p_ptr->is_dead)
        {
                p_ptr->hitdie = rp_ptr->r_mhp + cp_ptr->c_mhp + ap_ptr->a_mhp;
-               do_cmd_rerate(FALSE);
+               roll_hitdice(p_ptr, 0L);
        }
        if(z_older_than(10, 3, 2) && (p_ptr->pclass == CLASS_ARCHER) && !p_ptr->is_dead)
        {
                p_ptr->hitdie = rp_ptr->r_mhp + cp_ptr->c_mhp + ap_ptr->a_mhp;
-               do_cmd_rerate(FALSE);
+               roll_hitdice(p_ptr, 0L);
        }
        if(z_older_than(10, 2, 6) && (p_ptr->pclass == CLASS_SORCERER) && !p_ptr->is_dead)
        {
                p_ptr->hitdie = rp_ptr->r_mhp/2 + cp_ptr->c_mhp + ap_ptr->a_mhp;
-               do_cmd_rerate(FALSE);
+               roll_hitdice(p_ptr, 0L);
        }
        if(z_older_than(10, 4, 7) && (p_ptr->pclass == CLASS_BLUE_MAGE) && !p_ptr->is_dead)
        {
                p_ptr->hitdie = rp_ptr->r_mhp + cp_ptr->c_mhp + ap_ptr->a_mhp;
-               do_cmd_rerate(FALSE);
+               roll_hitdice(p_ptr, 0L);
        }
 
        /* Important -- Initialize the magic */
@@ -3760,7 +3848,8 @@ static errr rd_savefile_new_aux(void)
 
        for (i = 0; i < 64; i++)
        {
-               rd_byte(&p_ptr->spell_order[i]);
+               rd_byte(&tmp8u);
+               p_ptr->spell_order[i] = (SPELL_IDX)tmp8u;
        }
 
 
@@ -3828,7 +3917,7 @@ static errr rd_savefile_new_aux(void)
 
        if (!z_older_than(11, 0, 9))
        {
-               char buf[SCREEN_BUF_SIZE];
+               char buf[SCREEN_BUF_MAX_SIZE];
                rd_string(buf, sizeof(buf));
                if (buf[0]) screen_dump = string_make(buf);
        }
@@ -3870,8 +3959,8 @@ static errr rd_savefile_new_aux(void)
        {
                if (p_ptr->inside_quest == OLD_QUEST_WATER_CAVE)
                {
-                       dungeon_type = lite_town ? DUNGEON_ANGBAND : DUNGEON_GALGALS;
-                       dun_level = 1;
+                       p_ptr->dungeon_idx = lite_town ? DUNGEON_ANGBAND : DUNGEON_GALGALS;
+                       current_floor_ptr->dun_level = 1;
                        p_ptr->inside_quest = 0;
                }
        }
@@ -3938,11 +4027,7 @@ errr rd_savefile_new(void)
 
        /* Check for errors */
        if (ferror(fff)) err = -1;
-
-       /* Close the file */
        my_fclose(fff);
-
-       /* Result */
        return (err);
 }
 
@@ -4016,7 +4101,7 @@ static bool load_floor_aux(saved_floor_type *sf_ptr)
  * @param mode オプション
  * @return 成功したらtrue
  */
-bool load_floor(saved_floor_type *sf_ptr, u32b mode)
+bool load_floor(saved_floor_type *sf_ptr, BIT_FLAGS mode)
 {
        FILE *old_fff = NULL;
        byte old_xor_byte = 0;
@@ -4088,8 +4173,6 @@ bool load_floor(saved_floor_type *sf_ptr, u32b mode)
 
                /* Check for errors */
                if (ferror(fff)) ok = FALSE;
-
-               /* Close the file */
                my_fclose(fff);
 
                /* Grab permissions */
@@ -4118,7 +4201,5 @@ bool load_floor(saved_floor_type *sf_ptr, u32b mode)
 
        /* Restore old knowledge */
        kanji_code = old_kanji_code;
-
-       /* Result */
        return ok;
 }