OSDN Git Service

[Refactor] #38997 compact_monsters() にplayer_type * 引数追加 / Added player_type * argume...
[hengband/hengband.git] / src / save.c
index 0389198..e983cce 100644 (file)
  */
 
 #include "angband.h"
+#include "util.h"
+#include "save.h"
+#include "load.h"
+#include "report.h"
+
+#include "core.h"
+#include "artifact.h"
 #include "sort.h"
+#include "dungeon.h"
 #include "quest.h"
 #include "store.h"
 #include "wild.h"
-
-
-
-/*
- * Some "local" parameters, used to help write savefiles
- */
+#include "floor.h"
+#include "floor-events.h"
+#include "floor-save.h"
+#include "floor-town.h"
+#include "files.h"
+#include "world.h"
+#include "objectkind.h"
+#include "monsterrace.h"
+#include "birth.h"
+#include "bldg.h"
+#include "view-mainwindow.h"
+
+ /*
+  * Some "local" parameters, used to help write savefiles
+  */
 
 static FILE *fff;           /* Current save "file" */
 static byte xor_byte;       /* Simple encryption */
 static u32b v_stamp = 0L;   /* A simple "checksum" on the actual values */
 static u32b x_stamp = 0L;   /* A simple "checksum" on the encoded bytes */
 
-
-
 /*!
  * @brief 1バイトをファイルに書き込む / These functions place information into a savefile a byte at a time
  * @param v 書き込むバイト値
@@ -46,6 +61,7 @@ static void sf_put(byte v)
        x_stamp += xor_byte;
 }
 
+
 /*!
  * @brief 1バイトをファイルに書き込む(sf_put()の糖衣)
  * @param v 書き込むバイト
@@ -56,6 +72,7 @@ static void wr_byte(byte v)
        sf_put(v);
 }
 
+
 /*!
  * @brief 符号なし16ビットをファイルに書き込む
  * @param v 書き込む符号なし16bit値
@@ -67,6 +84,7 @@ static void wr_u16b(u16b v)
        sf_put((byte)((v >> 8) & 0xFF));
 }
 
+
 /*!
  * @brief 符号あり16ビットをファイルに書き込む
  * @param v 書き込む符号あり16bit値
@@ -77,6 +95,7 @@ static void wr_s16b(s16b v)
        wr_u16b((u16b)v);
 }
 
+
 /*!
  * @brief 符号なし32ビットをファイルに書き込む
  * @param v 書き込む符号なし32bit値
@@ -90,6 +109,7 @@ static void wr_u32b(u32b v)
        sf_put((byte)((v >> 24) & 0xFF));
 }
 
+
 /*!
  * @brief 符号あり32ビットをファイルに書き込む
  * @param v 書き込む符号あり32bit値
@@ -100,6 +120,7 @@ static void wr_s32b(s32b v)
        wr_u32b((u32b)v);
 }
 
+
 /*!
  * @brief 文字列をファイルに書き込む
  * @param str 書き込む文字列
@@ -121,11 +142,11 @@ static void wr_string(concptr str)
  */
 
 
-/*!
- * @brief アイテムオブジェクトを書き込む / Write an "item" record
- * @param o_ptr アイテムオブジェクト保存元ポインタ
- * @return なし
- */
+ /*!
 * @brief アイテムオブジェクトを書き込む / Write an "item" record
 * @param o_ptr アイテムオブジェクト保存元ポインタ
 * @return なし
 */
 static void wr_item(object_type *o_ptr)
 {
        BIT_FLAGS flags = 0x00000000;
@@ -225,8 +246,6 @@ static void wr_item(object_type *o_ptr)
 static void wr_monster(monster_type *m_ptr)
 {
        BIT_FLAGS flags = 0x00000000;
-       byte tmp8u;
-
        if (!is_original_ap(m_ptr)) flags |= SAVE_MON_AP_R_IDX;
        if (m_ptr->sub_align) flags |= SAVE_MON_SUB_ALIGN;
        if (MON_CSLEEP(m_ptr)) flags |= SAVE_MON_CSLEEP;
@@ -255,7 +274,6 @@ static void wr_monster(monster_type *m_ptr)
        wr_s16b((s16b)m_ptr->maxhp);
        wr_s16b((s16b)m_ptr->max_maxhp);
        wr_u32b(m_ptr->dealt_damage);
-       
 
        /* Monster race index of its appearance */
        if (flags & SAVE_MON_AP_R_IDX) wr_s16b(m_ptr->ap_r_idx);
@@ -266,6 +284,7 @@ static void wr_monster(monster_type *m_ptr)
        wr_byte((byte)m_ptr->mspeed);
        wr_s16b(m_ptr->energy_need);
 
+       byte tmp8u;
        if (flags & SAVE_MON_FAST)
        {
                tmp8u = (byte)m_ptr->mtimed[MTIMED_FAST];
@@ -313,9 +332,8 @@ static void wr_monster(monster_type *m_ptr)
  */
 static void wr_lore(MONRACE_IDX r_idx)
 {
-       monster_race *r_ptr = &r_info[r_idx];
-
        /* Count sights/deaths/kills */
+       monster_race *r_ptr = &r_info[r_idx];
        wr_s16b((s16b)r_ptr->r_sights);
        wr_s16b((s16b)r_ptr->r_deaths);
        wr_s16b((s16b)r_ptr->r_pkills);
@@ -359,10 +377,10 @@ static void wr_lore(MONRACE_IDX r_idx)
        /* Location in saved floor */
        wr_s16b(r_ptr->floor_id);
 
-       /* Later (?) */
        wr_byte(0);
 }
 
+
 /*!
  * @brief その他のゲーム情報を書き込む(実質はアイテムの鑑定情報のみ) / Write an "xtra" record
  * @param k_idx ベースアイテムのID
@@ -388,8 +406,6 @@ static void wr_xtra(KIND_OBJECT_IDX k_idx)
  */
 static void wr_store(store_type *st_ptr)
 {
-       int j;
-
        /* Save the "open" counter */
        wr_u32b(st_ptr->store_open);
 
@@ -409,7 +425,7 @@ static void wr_store(store_type *st_ptr)
        wr_s32b(st_ptr->last_visit);
 
        /* Save the stock */
-       for (j = 0; j < st_ptr->stock_num; j++)
+       for (int j = 0; j < st_ptr->stock_num; j++)
        {
                /* Save each item in stock */
                wr_item(&st_ptr->stock[j]);
@@ -419,20 +435,19 @@ static void wr_store(store_type *st_ptr)
 
 /*!
  * @brief セーブデータに乱数情報を書き込む / Write RNG state
- * @return 常に0(成功を返す) 
+ * @return 常に0(成功を返す)
  */
 static errr wr_randomizer(void)
 {
-       int i;
        wr_u16b(0);
        wr_u16b(Rand_place);
 
-       for (i = 0; i < RAND_DEG; i++)
+       for (int i = 0; i < RAND_DEG; i++)
        {
                wr_u32b(Rand_state[i]);
        }
 
-       return (0);
+       return 0;
 }
 
 
@@ -442,18 +457,9 @@ static errr wr_randomizer(void)
  */
 static void wr_options(void)
 {
-       int i;
-
-       u16b c;
-
-
-       /*** Oops ***/
-
-       for (i = 0; i < 4; i++) wr_u32b(0L);
-
-
-       /*** Special Options ***/
+       for (int i = 0; i < 4; i++) wr_u32b(0L);
 
+       /*** Special options ***/
        /* Write "delay_factor" */
        wr_byte(delay_factor);
 
@@ -465,9 +471,8 @@ static void wr_options(void)
 
        /*** Cheating options ***/
 
-       c = 0;
-
-       if (p_ptr->wizard) c |= 0x0002;
+       u16b c = 0;
+       if (current_world_ptr->wizard) c |= 0x0002;
 
        if (cheat_sight) c |= 0x0040;
        if (cheat_turn) c |= 0x0080;
@@ -489,49 +494,38 @@ static void wr_options(void)
        wr_s16b(autosave_freq);
 
        /*** Extract options ***/
-
        /* Analyze the options */
-       for (i = 0; option_info[i].o_desc; i++)
+       for (int i = 0; option_info[i].o_desc; i++)
        {
                int os = option_info[i].o_set;
                int ob = option_info[i].o_bit;
 
                /* Process real entries */
-               if (option_info[i].o_var)
-               {
-                       /* Set */
-                       if (*option_info[i].o_var)
-                       {
-                               /* Set */
-                               option_flag[os] |= (1L << ob);
-                       }
+               if (!option_info[i].o_var) continue;
 
-                       /* Clear */
-                       else
-                       {
-                               /* Clear */
-                               option_flag[os] &= ~(1L << ob);
-                       }
+               if (*option_info[i].o_var)
+               {
+                       option_flag[os] |= (1L << ob);
+               }
+               else
+               {
+                       option_flag[os] &= ~(1L << ob);
                }
        }
 
-
        /*** Normal options ***/
-
        /* Dump the flags */
-       for (i = 0; i < 8; i++) wr_u32b(option_flag[i]);
+       for (int i = 0; i < 8; i++) wr_u32b(option_flag[i]);
 
        /* Dump the masks */
-       for (i = 0; i < 8; i++) wr_u32b(option_mask[i]);
-
+       for (int i = 0; i < 8; i++) wr_u32b(option_mask[i]);
 
        /*** Window options ***/
-
        /* Dump the flags */
-       for (i = 0; i < 8; i++) wr_u32b(window_flag[i]);
+       for (int i = 0; i < 8; i++) wr_u32b(window_flag[i]);
 
        /* Dump the masks */
-       for (i = 0; i < 8; i++) wr_u32b(window_mask[i]);
+       for (int i = 0; i < 8; i++) wr_u32b(window_mask[i]);
 }
 
 
@@ -541,13 +535,10 @@ static void wr_options(void)
  */
 static void wr_ghost(void)
 {
-       int i;
-
-       /* Name */
        wr_string(_("不正なゴースト", "Broken Ghost"));
 
        /* Hack -- stupid data */
-       for (i = 0; i < 60; i++) wr_byte(0);
+       for (int i = 0; i < 60; i++) wr_byte(0);
 }
 
 
@@ -557,8 +548,6 @@ static void wr_ghost(void)
  */
 static void save_quick_start(void)
 {
-       int i;
-
        wr_byte(previous_char.psex);
        wr_byte((byte_hack)previous_char.prace);
        wr_byte((byte_hack)previous_char.pclass);
@@ -572,22 +561,22 @@ static void save_quick_start(void)
        wr_s16b(previous_char.sc);
        wr_s32b(previous_char.au);
 
-       for (i = 0; i < A_MAX; i++) wr_s16b(previous_char.stat_max[i]);
-       for (i = 0; i < A_MAX; i++) wr_s16b(previous_char.stat_max_max[i]);
+       for (int i = 0; i < A_MAX; i++) wr_s16b(previous_char.stat_max[i]);
+       for (int i = 0; i < A_MAX; i++) wr_s16b(previous_char.stat_max_max[i]);
 
-       for (i = 0; i < PY_MAX_LEVEL; i++) wr_s16b((s16b)previous_char.player_hp[i]);
+       for (int i = 0; i < PY_MAX_LEVEL; i++) wr_s16b((s16b)previous_char.player_hp[i]);
 
        wr_s16b(previous_char.chaos_patron);
 
-       for (i = 0; i < 8; i++) wr_s16b(previous_char.vir_types[i]);
+       for (int i = 0; i < 8; i++) wr_s16b(previous_char.vir_types[i]);
 
-       for (i = 0; i < 4; i++) wr_string(previous_char.history[i]);
+       for (int i = 0; i < 4; i++) wr_string(previous_char.history[i]);
 
        /* UNUSED : Was number of random quests */
        wr_byte(0);
 
        /* No quick start after using debug mode or cheat options */
-       if (p_ptr->noscore) previous_char.quick_ok = FALSE;
+       if (current_world_ptr->noscore) previous_char.quick_ok = FALSE;
 
        wr_byte((byte)previous_char.quick_ok);
 }
@@ -597,112 +586,113 @@ static void save_quick_start(void)
  * @brief その他の情報を書き込む / Write some "extra" info
  * @return なし
  */
-static void wr_extra(void)
+static void wr_extra(player_type *creature_ptr)
 {
-       int i,j;
-       byte tmp8u;
-
-       wr_string(p_ptr->name);
-       wr_string(p_ptr->died_from);
-       wr_string(p_ptr->last_message ? p_ptr->last_message : "");
+       wr_string(creature_ptr->name);
+       wr_string(creature_ptr->died_from);
+       wr_string(creature_ptr->last_message ? creature_ptr->last_message : "");
 
        save_quick_start();
 
-       for (i = 0; i < 4; i++)
+       for (int i = 0; i < 4; i++)
        {
-               wr_string(p_ptr->history[i]);
+               wr_string(creature_ptr->history[i]);
        }
 
        /* Race/Class/Gender/Spells */
-       wr_byte((byte_hack)p_ptr->prace);
-       wr_byte((byte_hack)p_ptr->pclass);
-       wr_byte((byte_hack)p_ptr->pseikaku);
-       wr_byte((byte_hack)p_ptr->psex);
-       wr_byte((byte_hack)p_ptr->realm1);
-       wr_byte((byte_hack)p_ptr->realm2);
+       wr_byte((byte_hack)creature_ptr->prace);
+       wr_byte((byte_hack)creature_ptr->pclass);
+       wr_byte((byte_hack)creature_ptr->pseikaku);
+       wr_byte((byte_hack)creature_ptr->psex);
+       wr_byte((byte_hack)creature_ptr->realm1);
+       wr_byte((byte_hack)creature_ptr->realm2);
        wr_byte(0);
 
-       wr_byte((byte)p_ptr->hitdie);
-       wr_u16b(p_ptr->expfact);
+       wr_byte((byte)creature_ptr->hitdie);
+       wr_u16b(creature_ptr->expfact);
 
-       wr_s16b(p_ptr->age);
-       wr_s16b(p_ptr->ht);
-       wr_s16b(p_ptr->wt);
+       wr_s16b(creature_ptr->age);
+       wr_s16b(creature_ptr->ht);
+       wr_s16b(creature_ptr->wt);
 
        /* Dump the stats (maximum and current) */
-       for (i = 0; i < A_MAX; ++i) wr_s16b(p_ptr->stat_max[i]);
-       for (i = 0; i < A_MAX; ++i) wr_s16b(p_ptr->stat_max_max[i]);
-       for (i = 0; i < A_MAX; ++i) wr_s16b(p_ptr->stat_cur[i]);
+       for (int i = 0; i < A_MAX; ++i) wr_s16b(creature_ptr->stat_max[i]);
+       for (int i = 0; i < A_MAX; ++i) wr_s16b(creature_ptr->stat_max_max[i]);
+       for (int i = 0; i < A_MAX; ++i) wr_s16b(creature_ptr->stat_cur[i]);
 
        /* Ignore the transient stats */
-       for (i = 0; i < 12; ++i) wr_s16b(0);
+       for (int i = 0; i < 12; ++i) wr_s16b(0);
+
+       wr_u32b(creature_ptr->au);
 
-       wr_u32b(p_ptr->au);
+       wr_u32b(creature_ptr->max_exp);
+       wr_u32b(creature_ptr->max_max_exp);
+       wr_u32b(creature_ptr->exp);
+       wr_u32b(creature_ptr->exp_frac);
+       wr_s16b(creature_ptr->lev);
 
-       wr_u32b(p_ptr->max_exp);
-       wr_u32b(p_ptr->max_max_exp);
-       wr_u32b(p_ptr->exp);
-       wr_u32b(p_ptr->exp_frac);
-       wr_s16b(p_ptr->lev);
+       for (int i = 0; i < 64; i++) wr_s16b(creature_ptr->spell_exp[i]);
+       for (int i = 0; i < 5; i++)
+               for (int j = 0; j < 64; j++)
+                       wr_s16b(creature_ptr->weapon_exp[i][j]);
 
-       for (i = 0; i < 64; i++) wr_s16b(p_ptr->spell_exp[i]);
-       for (i = 0; i < 5; i++) for (j = 0; j < 64; j++) wr_s16b(p_ptr->weapon_exp[i][j]);
-       for (i = 0; i < GINOU_MAX; i++) wr_s16b(p_ptr->skill_exp[i]);
-       for (i = 0; i < 108; i++) wr_s32b(p_ptr->magic_num1[i]);
-       for (i = 0; i < 108; i++) wr_byte(p_ptr->magic_num2[i]);
+       for (int i = 0; i < GINOU_MAX; i++) wr_s16b(creature_ptr->skill_exp[i]);
+       for (int i = 0; i < 108; i++) wr_s32b(creature_ptr->magic_num1[i]);
+       for (int i = 0; i < 108; i++) wr_byte(creature_ptr->magic_num2[i]);
 
-       wr_byte((byte_hack)p_ptr->start_race);
-       wr_s32b(p_ptr->old_race1);
-       wr_s32b(p_ptr->old_race2);
-       wr_s16b(p_ptr->old_realm);
+       wr_byte((byte_hack)creature_ptr->start_race);
+       wr_s32b(creature_ptr->old_race1);
+       wr_s32b(creature_ptr->old_race2);
+       wr_s16b(creature_ptr->old_realm);
 
-       for (i = 0; i < MAX_MANE; i++)
+       for (int i = 0; i < MAX_MANE; i++)
        {
-               wr_s16b((s16b)p_ptr->mane_spell[i]);
-               wr_s16b((s16b)p_ptr->mane_dam[i]);
+               wr_s16b((s16b)creature_ptr->mane_spell[i]);
+               wr_s16b((s16b)creature_ptr->mane_dam[i]);
        }
-       wr_s16b(p_ptr->mane_num);
 
-       for (i = 0; i < MAX_KUBI; i++)
+       wr_s16b(creature_ptr->mane_num);
+
+       for (int i = 0; i < MAX_BOUNTY; i++)
        {
                wr_s16b(current_world_ptr->bounty_r_idx[i]);
        }
 
-       for (i = 0; i < 4; i++)
+       for (int i = 0; i < 4; i++)
        {
                wr_s16b(battle_mon[i]);
                wr_u32b(mon_odds[i]);
        }
 
-       wr_s16b(p_ptr->town_num); /* -KMW- */
+       wr_s16b(creature_ptr->town_num); /* -KMW- */
 
        /* Write arena and rewards information -KMW- */
-       wr_s16b(p_ptr->arena_number);
-       wr_s16b(p_ptr->inside_arena);
-       wr_s16b(p_ptr->inside_quest);
-       wr_s16b(p_ptr->inside_battle);
-       wr_byte(p_ptr->exit_bldg);
+       wr_s16b(creature_ptr->arena_number);
+       wr_s16b(creature_ptr->current_floor_ptr->inside_arena);
+       wr_s16b(creature_ptr->current_floor_ptr->inside_quest);
+       wr_s16b(creature_ptr->phase_out);
+       wr_byte(creature_ptr->exit_bldg);
        wr_byte(0); /* Unused */
 
-       wr_s16b((s16b)p_ptr->oldpx);
-       wr_s16b((s16b)p_ptr->oldpy);
+       wr_s16b((s16b)creature_ptr->oldpx);
+       wr_s16b((s16b)creature_ptr->oldpy);
 
-       /* Was number of p_ptr->rewards[] */
+       /* Was number of creature_ptr->rewards[] */
        wr_s16b(0);
 
-       wr_s32b(p_ptr->mhp);
-       wr_s32b(p_ptr->chp);
-       wr_u32b(p_ptr->chp_frac);
+       wr_s32b(creature_ptr->mhp);
+       wr_s32b(creature_ptr->chp);
+       wr_u32b(creature_ptr->chp_frac);
 
-       wr_s32b(p_ptr->msp);
-       wr_s32b(p_ptr->csp);
-       wr_u32b(p_ptr->csp_frac);
+       wr_s32b(creature_ptr->msp);
+       wr_s32b(creature_ptr->csp);
+       wr_u32b(creature_ptr->csp_frac);
 
        /* Max Player and Dungeon Levels */
-       wr_s16b(p_ptr->max_plv);
-       tmp8u = (byte)max_d_idx;
+       wr_s16b(creature_ptr->max_plv);
+       byte tmp8u = (byte)current_world_ptr->max_d_idx;
        wr_byte(tmp8u);
-       for (i = 0; i < tmp8u; i++)
+       for (int i = 0; i < tmp8u; i++)
                wr_s16b((s16b)max_dlv[i]);
 
        /* More info */
@@ -710,190 +700,139 @@ static void wr_extra(void)
        wr_s16b(0);
        wr_s16b(0);
        wr_s16b(0);
-       wr_s16b(p_ptr->sc);
-       wr_s16b(p_ptr->concent);
+       wr_s16b(creature_ptr->sc);
+       wr_s16b(creature_ptr->concent);
 
        wr_s16b(0);             /* old "rest" */
-       wr_s16b(p_ptr->blind);
-       wr_s16b(p_ptr->paralyzed);
-       wr_s16b(p_ptr->confused);
-       wr_s16b(p_ptr->food);
+       wr_s16b(creature_ptr->blind);
+       wr_s16b(creature_ptr->paralyzed);
+       wr_s16b(creature_ptr->confused);
+       wr_s16b(creature_ptr->food);
        wr_s16b(0);     /* old "food_digested" */
        wr_s16b(0);     /* old "protection" */
-       wr_s16b(p_ptr->energy_need);
-       wr_s16b(p_ptr->enchant_energy_need);
-       wr_s16b(p_ptr->fast);
-       wr_s16b(p_ptr->slow);
-       wr_s16b(p_ptr->afraid);
-       wr_s16b(p_ptr->cut);
-       wr_s16b(p_ptr->stun);
-       wr_s16b(p_ptr->poisoned);
-       wr_s16b(p_ptr->image);
-       wr_s16b(p_ptr->protevil);
-       wr_s16b(p_ptr->invuln);
-       wr_s16b(p_ptr->ult_res);
-       wr_s16b(p_ptr->hero);
-       wr_s16b(p_ptr->shero);
-       wr_s16b(p_ptr->shield);
-       wr_s16b(p_ptr->blessed);
-       wr_s16b(p_ptr->tim_invis);
-       wr_s16b(p_ptr->word_recall);
-       wr_s16b(p_ptr->recall_dungeon);
-       wr_s16b(p_ptr->alter_reality);
-       wr_s16b(p_ptr->see_infra);
-       wr_s16b(p_ptr->tim_infra);
-       wr_s16b(p_ptr->oppose_fire);
-       wr_s16b(p_ptr->oppose_cold);
-       wr_s16b(p_ptr->oppose_acid);
-       wr_s16b(p_ptr->oppose_elec);
-       wr_s16b(p_ptr->oppose_pois);
-       wr_s16b(p_ptr->tsuyoshi);
-       wr_s16b(p_ptr->tim_esp);
-       wr_s16b(p_ptr->wraith_form);
-       wr_s16b(p_ptr->resist_magic);
-       wr_s16b(p_ptr->tim_regen);
-       wr_s16b(p_ptr->kabenuke);
-       wr_s16b(p_ptr->tim_stealth);
-       wr_s16b(p_ptr->tim_levitation);
-       wr_s16b(p_ptr->tim_sh_touki);
-       wr_s16b(p_ptr->lightspeed);
-       wr_s16b(p_ptr->tsubureru);
-       wr_s16b(p_ptr->magicdef);
-       wr_s16b(p_ptr->tim_res_nether);
-       wr_s16b(p_ptr->tim_res_time);
-       wr_byte((byte)p_ptr->mimic_form);
-       wr_s16b(p_ptr->tim_mimic);
-       wr_s16b(p_ptr->tim_sh_fire);
-       wr_s16b(p_ptr->tim_sh_holy);
-       wr_s16b(p_ptr->tim_eyeeye);
+       wr_s16b(creature_ptr->energy_need);
+       wr_s16b(creature_ptr->enchant_energy_need);
+       wr_s16b(creature_ptr->fast);
+       wr_s16b(creature_ptr->slow);
+       wr_s16b(creature_ptr->afraid);
+       wr_s16b(creature_ptr->cut);
+       wr_s16b(creature_ptr->stun);
+       wr_s16b(creature_ptr->poisoned);
+       wr_s16b(creature_ptr->image);
+       wr_s16b(creature_ptr->protevil);
+       wr_s16b(creature_ptr->invuln);
+       wr_s16b(creature_ptr->ult_res);
+       wr_s16b(creature_ptr->hero);
+       wr_s16b(creature_ptr->shero);
+       wr_s16b(creature_ptr->shield);
+       wr_s16b(creature_ptr->blessed);
+       wr_s16b(creature_ptr->tim_invis);
+       wr_s16b(creature_ptr->word_recall);
+       wr_s16b(creature_ptr->recall_dungeon);
+       wr_s16b(creature_ptr->alter_reality);
+       wr_s16b(creature_ptr->see_infra);
+       wr_s16b(creature_ptr->tim_infra);
+       wr_s16b(creature_ptr->oppose_fire);
+       wr_s16b(creature_ptr->oppose_cold);
+       wr_s16b(creature_ptr->oppose_acid);
+       wr_s16b(creature_ptr->oppose_elec);
+       wr_s16b(creature_ptr->oppose_pois);
+       wr_s16b(creature_ptr->tsuyoshi);
+       wr_s16b(creature_ptr->tim_esp);
+       wr_s16b(creature_ptr->wraith_form);
+       wr_s16b(creature_ptr->resist_magic);
+       wr_s16b(creature_ptr->tim_regen);
+       wr_s16b(creature_ptr->kabenuke);
+       wr_s16b(creature_ptr->tim_stealth);
+       wr_s16b(creature_ptr->tim_levitation);
+       wr_s16b(creature_ptr->tim_sh_touki);
+       wr_s16b(creature_ptr->lightspeed);
+       wr_s16b(creature_ptr->tsubureru);
+       wr_s16b(creature_ptr->magicdef);
+       wr_s16b(creature_ptr->tim_res_nether);
+       wr_s16b(creature_ptr->tim_res_time);
+       wr_byte((byte)creature_ptr->mimic_form);
+       wr_s16b(creature_ptr->tim_mimic);
+       wr_s16b(creature_ptr->tim_sh_fire);
+       wr_s16b(creature_ptr->tim_sh_holy);
+       wr_s16b(creature_ptr->tim_eyeeye);
 
        /* by henkma */
-       wr_s16b(p_ptr->tim_reflect);
-       wr_s16b(p_ptr->multishadow);
-       wr_s16b(p_ptr->dustrobe);
-
-       wr_s16b(p_ptr->chaos_patron);
-       wr_u32b(p_ptr->muta1);
-       wr_u32b(p_ptr->muta2);
-       wr_u32b(p_ptr->muta3);
-
-       for (i = 0; i<8; i++)
-               wr_s16b(p_ptr->virtues[i]);
-       for (i = 0; i<8; i++)
-               wr_s16b(p_ptr->vir_types[i]);
-
-       wr_s16b(p_ptr->ele_attack);
-       wr_u32b(p_ptr->special_attack);
-       wr_s16b(p_ptr->ele_immune);
-       wr_u32b(p_ptr->special_defense);
-       wr_byte(p_ptr->knowledge);
-       wr_byte(p_ptr->autopick_autoregister);
+       wr_s16b(creature_ptr->tim_reflect);
+       wr_s16b(creature_ptr->multishadow);
+       wr_s16b(creature_ptr->dustrobe);
+
+       wr_s16b(creature_ptr->chaos_patron);
+       wr_u32b(creature_ptr->muta1);
+       wr_u32b(creature_ptr->muta2);
+       wr_u32b(creature_ptr->muta3);
+
+       for (int i = 0; i < 8; i++)
+               wr_s16b(creature_ptr->virtues[i]);
+       for (int i = 0; i < 8; i++)
+               wr_s16b(creature_ptr->vir_types[i]);
+
+       wr_s16b(creature_ptr->ele_attack);
+       wr_u32b(creature_ptr->special_attack);
+       wr_s16b(creature_ptr->ele_immune);
+       wr_u32b(creature_ptr->special_defense);
+       wr_byte(creature_ptr->knowledge);
+       wr_byte(creature_ptr->autopick_autoregister);
        wr_byte(0);
-       wr_byte((byte_hack)p_ptr->action);
+       wr_byte((byte_hack)creature_ptr->action);
        wr_byte(0);
        wr_byte(preserve_mode);
-       wr_byte(p_ptr->wait_report_score);
+       wr_byte(creature_ptr->wait_report_score);
 
        /* Future use */
-       for (i = 0; i < 12; i++) wr_u32b(0L);
+       for (int i = 0; i < 12; i++) wr_u32b(0L);
 
        /* Ignore some flags */
        wr_u32b(0L);
        wr_u32b(0L);
        wr_u32b(0L);
 
-
        /* Write the "object seeds" */
-       wr_u32b(seed_flavor);
-       wr_u32b(seed_town);
-
+       wr_u32b(current_world_ptr->seed_flavor);
+       wr_u32b(current_world_ptr->seed_town);
 
        /* Special stuff */
-       wr_u16b(p_ptr->panic_save);
-       wr_u16b(p_ptr->total_winner);
-       wr_u16b(p_ptr->noscore);
-
+       wr_u16b(creature_ptr->panic_save);
+       wr_u16b(current_world_ptr->total_winner);
+       wr_u16b(current_world_ptr->noscore);
 
        /* Write death */
-       wr_byte(p_ptr->is_dead);
+       wr_byte(creature_ptr->is_dead);
 
        /* Write feeling */
-       wr_byte(p_ptr->feeling);
+       wr_byte(creature_ptr->feeling);
 
        /* Turn when level began */
-       wr_s32b(current_floor_ptr->generated_turn);
+       wr_s32b(creature_ptr->current_floor_ptr->generated_turn);
 
        /* Turn of last "feeling" */
-       wr_s32b(p_ptr->feeling_turn);
+       wr_s32b(creature_ptr->feeling_turn);
 
-       /* Current current_world_ptr->game_turn */
+       /* Current turn */
        wr_s32b(current_world_ptr->game_turn);
 
        wr_s32b(current_world_ptr->dungeon_turn);
 
-       wr_s32b(old_battle);
+       wr_s32b(current_world_ptr->arena_start_turn);
 
        wr_s16b(today_mon);
-       wr_s16b(p_ptr->today_mon);
-       wr_s16b(p_ptr->riding);
+       wr_s16b(creature_ptr->today_mon);
+       wr_s16b(creature_ptr->riding);
 
        /* Current floor_id */
-       wr_s16b(p_ptr->floor_id);
+       wr_s16b(creature_ptr->floor_id);
 
        /* Save temporary preserved pets (obsolated) */
        wr_s16b(0);
 
        wr_u32b(current_world_ptr->play_time);
-
-       wr_s32b(p_ptr->visit);
-
-       wr_u32b(p_ptr->count);
-}
-
-
-/*!
- * @brief フロア保存時のcurrent_floor_ptr->grid_array情報テンプレートをソートするための比較処理
- * @param u current_floor_ptr->grid_arrayテンプレートの参照ポインタ
- * @param v 未使用
- * @param a スワップするモンスター種族のID1
- * @param b スワップするモンスター種族のID2
- * @return aの方が大きければtrue
- */
-static bool ang_sort_comp_cave_temp(vptr u, vptr v, int a, int b)
-{
-       cave_template_type *who = (cave_template_type *)(u);
-
-       u16b o1 = who[a].occurrence;
-       u16b o2 = who[b].occurrence;
-
-       /* Unused */
-       (void)v;
-
-       return o2 <= o1;
-}
-
-
-/*!
- * @brief フロア保存時のcurrent_floor_ptr->grid_array情報テンプレートをソートするためのスワップ処理 / Sorting hook -- Swap function
- * @param u current_floor_ptr->grid_arrayテンプレートの参照ポインタ
- * @param v 未使用
- * @param a スワップするモンスター種族のID1
- * @param b スワップするモンスター種族のID2
- * @return なし
- */
-static void ang_sort_swap_cave_temp(vptr u, vptr v, int a, int b)
-{
-       cave_template_type *who = (cave_template_type *)(u);
-
-       cave_template_type holder;
-
-       /* Unused */
-       (void)v;
-
-       /* Swap */
-       holder = who[a];
-       who[a] = who[b];
-       who[b] = holder;
+       wr_s32b(creature_ptr->visit);
+       wr_u32b(creature_ptr->count);
 }
 
 
@@ -902,30 +841,16 @@ static void ang_sort_swap_cave_temp(vptr u, vptr v, int a, int b)
  * @param sf_ptr 保存したいフロアの参照ポインタ
  * @return なし
  */
-static void wr_saved_floor(saved_floor_type *sf_ptr)
+static void wr_saved_floor(player_type *player_ptr, saved_floor_type *sf_ptr)
 {
-       cave_template_type *templates;
-       u16b max_num_temp;
-       u16b num_temp = 0;
-       int dummy_why;
-
-       int i, y, x;
-
-       u16b tmp16u;
-
-       byte count;
-       u16b prev_u16b;
-
-
        /*** Basic info ***/
-
        /* Dungeon floor specific info follows */
-
+       floor_type *floor_ptr = player_ptr->current_floor_ptr;
        if (!sf_ptr)
        {
                /*** Not a saved floor ***/
 
-               wr_s16b((s16b)current_floor_ptr->dun_level);
+               wr_s16b((s16b)floor_ptr->dun_level);
        }
        else
        {
@@ -940,15 +865,13 @@ static void wr_saved_floor(saved_floor_type *sf_ptr)
                wr_s16b(sf_ptr->lower_floor_id);
        }
 
-       wr_u16b((u16b)current_floor_ptr->base_level);
-       wr_u16b((s16b)current_floor_ptr->num_repro);
-       wr_u16b((u16b)p_ptr->y);
-       wr_u16b((u16b)p_ptr->x);
-       wr_u16b((u16b)current_floor_ptr->height);
-       wr_u16b((u16b)current_floor_ptr->width);
-       wr_byte(p_ptr->feeling);
-
-
+       wr_u16b((u16b)floor_ptr->base_level);
+       wr_u16b((s16b)player_ptr->current_floor_ptr->num_repro);
+       wr_u16b((u16b)player_ptr->y);
+       wr_u16b((u16b)player_ptr->x);
+       wr_u16b((u16b)floor_ptr->height);
+       wr_u16b((u16b)floor_ptr->width);
+       wr_byte(player_ptr->feeling);
 
        /*********** Make template for grid_type **********/
 
@@ -963,25 +886,28 @@ static void wr_saved_floor(saved_floor_type *sf_ptr)
         *     515 will be "0xff" "0xff" "0x03"
         */
 
-       /* Fake max number */
-       max_num_temp = 255;
+        /* Fake max number */
+       u16b max_num_temp = 255;
 
        /* Allocate the "template" array */
-       C_MAKE(templates, max_num_temp, cave_template_type);
+       grid_template_type *templates;
+       C_MAKE(templates, max_num_temp, grid_template_type);
 
        /* Extract template array */
-       for (y = 0; y < current_floor_ptr->height; y++)
+       u16b num_temp = 0;
+       for (int y = 0; y < floor_ptr->height; y++)
        {
-               for (x = 0; x < current_floor_ptr->width; x++)
+               for (int x = 0; x < floor_ptr->width; x++)
                {
-                       grid_type *g_ptr = &current_floor_ptr->grid_array[y][x];
+                       grid_type *g_ptr = &floor_ptr->grid_array[y][x];
 
+                       int i;
                        for (i = 0; i < num_temp; i++)
                        {
                                if (templates[i].info == g_ptr->info &&
-                                   templates[i].feat == g_ptr->feat &&
-                                   templates[i].mimic == g_ptr->mimic &&
-                                   templates[i].special == g_ptr->special)
+                                       templates[i].feat == g_ptr->feat &&
+                                       templates[i].mimic == g_ptr->mimic &&
+                                       templates[i].special == g_ptr->special)
                                {
                                        /* Same terrain is exist */
                                        templates[i].occurrence++;
@@ -995,12 +921,12 @@ static void wr_saved_floor(saved_floor_type *sf_ptr)
                        /* If the max_num_temp is too small, increase it. */
                        if (num_temp >= max_num_temp)
                        {
-                               cave_template_type *old_template = templates;
+                               grid_template_type *old_template = templates;
 
                                /* Re-allocate the "template" array */
-                               C_MAKE(templates, max_num_temp + 255, cave_template_type);
-                               (void)C_COPY(templates, old_template, max_num_temp, cave_template_type);
-                               C_KILL(old_template, max_num_temp, cave_template_type);
+                               C_MAKE(templates, max_num_temp + 255, grid_template_type);
+                               (void)C_COPY(templates, old_template, max_num_temp, grid_template_type);
+                               C_KILL(old_template, max_num_temp, grid_template_type);
                                max_num_temp += 255;
                        }
 
@@ -1016,13 +942,9 @@ static void wr_saved_floor(saved_floor_type *sf_ptr)
                }
        }
 
-       /* Select the sort method */
-       ang_sort_comp = ang_sort_comp_cave_temp;
-       ang_sort_swap = ang_sort_swap_cave_temp;
-
        /* Sort by occurrence */
-       ang_sort(templates, &dummy_why, num_temp);
-
+       int dummy_why;
+       ang_sort(templates, &dummy_why, num_temp, ang_sort_comp_cave_temp, ang_sort_swap_cave_temp);
 
        /*** Dump templates ***/
 
@@ -1030,71 +952,62 @@ static void wr_saved_floor(saved_floor_type *sf_ptr)
        wr_u16b(num_temp);
 
        /* Dump the templates */
-       for (i = 0; i < num_temp; i++)
+       for (int i = 0; i < num_temp; i++)
        {
-               cave_template_type *ct_ptr = &templates[i];
-
-               /* Dump it */
+               grid_template_type *ct_ptr = &templates[i];
                wr_u16b((u16b)ct_ptr->info);
                wr_s16b(ct_ptr->feat);
                wr_s16b(ct_ptr->mimic);
                wr_s16b(ct_ptr->special);
        }
 
-
-
-       /*** "Run-Length-Encoding" of current_floor_ptr->grid_array ***/
-
+       /*** "Run-Length-Encoding" of floor ***/
        /* Note that this will induce two wasted bytes */
-       count = 0;
-       prev_u16b = 0;
+       byte count = 0;
+       u16b prev_u16b = 0;
 
-       /* Dump the current_floor_ptr->grid_array */
-       for (y = 0; y < current_floor_ptr->height; y++)
+       for (int y = 0; y < floor_ptr->height; y++)
        {
-               for (x = 0; x < current_floor_ptr->width; x++)
+               for (int x = 0; x < floor_ptr->width; x++)
                {
-                       grid_type *g_ptr = &current_floor_ptr->grid_array[y][x];
-
+                       grid_type *g_ptr = &floor_ptr->grid_array[y][x];
+                       int i;
                        for (i = 0; i < num_temp; i++)
                        {
                                if (templates[i].info == g_ptr->info &&
-                                   templates[i].feat == g_ptr->feat &&
-                                   templates[i].mimic == g_ptr->mimic &&
-                                   templates[i].special == g_ptr->special)
+                                       templates[i].feat == g_ptr->feat &&
+                                       templates[i].mimic == g_ptr->mimic &&
+                                       templates[i].special == g_ptr->special)
                                        break;
                        }
 
                        /* Extract an ID */
-                       tmp16u = (u16b)i;
+                       u16b tmp16u = (u16b)i;
 
                        /* If the run is broken, or too full, flush it */
-                       if ((tmp16u != prev_u16b) || (count == MAX_UCHAR))
+                       if ((tmp16u == prev_u16b) && (count != MAX_UCHAR))
                        {
-                               wr_byte((byte)count);
-
-                               while (prev_u16b >= MAX_UCHAR)
-                               {
-                                       /* Mark as actual data is larger than 254 */
-                                       wr_byte(MAX_UCHAR);
-                                       prev_u16b -= MAX_UCHAR;
-                               }
-
-                               wr_byte((byte)prev_u16b);
-                               prev_u16b = tmp16u;
-                               count = 1;
+                               count++;
+                               continue;
                        }
 
-                       /* Continue the run */
-                       else
+                       wr_byte((byte)count);
+
+                       while (prev_u16b >= MAX_UCHAR)
                        {
-                               count++;
+                               /* Mark as actual data is larger than 254 */
+                               wr_byte(MAX_UCHAR);
+                               prev_u16b -= MAX_UCHAR;
                        }
+
+                       wr_byte((byte)prev_u16b);
+                       prev_u16b = tmp16u;
+                       count = 1;
                }
        }
 
        /* Flush the data (if any) */
-       if (count)
+       if (count > 0)
        {
                wr_byte((byte)count);
 
@@ -1104,40 +1017,34 @@ static void wr_saved_floor(saved_floor_type *sf_ptr)
                        wr_byte(MAX_UCHAR);
                        prev_u16b -= MAX_UCHAR;
                }
+
                wr_byte((byte)prev_u16b);
        }
 
-
        /* Free the "template" array */
-       C_KILL(templates, max_num_temp, cave_template_type);
-
+       C_KILL(templates, max_num_temp, grid_template_type);
 
        /*** Dump objects ***/
 
        /* Total objects */
-       wr_u16b(o_max);
+       wr_u16b(floor_ptr->o_max);
 
        /* Dump the objects */
-       for (i = 1; i < o_max; i++)
+       for (int i = 1; i < floor_ptr->o_max; i++)
        {
-               object_type *o_ptr = &current_floor_ptr->o_list[i];
-
-               /* Dump it */
+               object_type *o_ptr = &floor_ptr->o_list[i];
                wr_item(o_ptr);
        }
 
-
        /*** Dump the monsters ***/
 
        /* Total monsters */
-       wr_u16b(m_max);
+       wr_u16b(floor_ptr->m_max);
 
        /* Dump the monsters */
-       for (i = 1; i < m_max; i++)
+       for (int i = 1; i < floor_ptr->m_max; i++)
        {
-               monster_type *m_ptr = &current_floor_ptr->m_list[i];
-
-               /* Dump it */
+               monster_type *m_ptr = &floor_ptr->m_list[i];
                wr_monster(m_ptr);
        }
 }
@@ -1146,20 +1053,18 @@ static void wr_saved_floor(saved_floor_type *sf_ptr)
 /*!
  * @brief 現在フロアの書き込み /
  * Write the current dungeon (new method)
- * @return なし
+ * @player_ptr プレーヤーへの参照ポインタ
+ * @return 保存に成功したらTRUE
  */
-static bool wr_dungeon(void)
+static bool wr_dungeon(player_type *player_ptr)
 {
-       saved_floor_type *cur_sf_ptr;
-       int i;
-
-       forget_lite();
-       forget_view();
-       clear_mon_lite();
+       forget_lite(player_ptr->current_floor_ptr);
+       forget_view(player_ptr->current_floor_ptr);
+       clear_mon_lite(player_ptr->current_floor_ptr);
 
        /* Update lite/view */
-       p_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
-       p_ptr->update |= (PU_MONSTERS | PU_DISTANCE | PU_FLOW);
+       player_ptr->update |= (PU_VIEW | PU_LITE | PU_MON_LITE);
+       player_ptr->update |= (PU_MONSTERS | PU_DISTANCE | PU_FLOW);
 
        /*** Meta info ***/
 
@@ -1167,17 +1072,17 @@ static bool wr_dungeon(void)
        wr_s16b(max_floor_id);
 
        /* Current dungeon type */
-       wr_byte((byte_hack)p_ptr->dungeon_idx);
+       wr_byte((byte_hack)player_ptr->dungeon_idx);
 
 
        /*** No saved floor (On the surface etc.) ***/
-       if (!p_ptr->floor_id)
+       if (!player_ptr->floor_id)
        {
                /* No array elements */
                wr_byte(0);
 
                /* Write the current floor data */
-               wr_saved_floor(NULL);
+               wr_saved_floor(player_ptr, NULL);
 
                /* Success */
                return TRUE;
@@ -1190,7 +1095,7 @@ static bool wr_dungeon(void)
        wr_byte(MAX_SAVED_FLOORS);
 
        /* Write the saved_floors array */
-       for (i = 0; i < MAX_SAVED_FLOORS; i++)
+       for (int i = 0; i < MAX_SAVED_FLOORS; i++)
        {
                saved_floor_type *sf_ptr = &saved_floors[i];
 
@@ -1204,39 +1109,28 @@ static bool wr_dungeon(void)
        }
 
        /* Extract pointer to current floor */
-       cur_sf_ptr = get_sf_ptr(p_ptr->floor_id);
+       saved_floor_type *cur_sf_ptr;
+       cur_sf_ptr = get_sf_ptr(player_ptr->floor_id);
 
-       /* Save current floor to temporal file */
-       if (!save_floor(cur_sf_ptr, (SLF_SECOND))) return FALSE;
+       /* Save current floor to temporary file */
+       if (!save_floor(player_ptr, cur_sf_ptr, (SLF_SECOND))) return FALSE;
 
-       /* Move data in temporal files to the savefile */
-       for (i = 0; i < MAX_SAVED_FLOORS; i++)
+       /* Move data in temporary files to the savefile */
+       for (int i = 0; i < MAX_SAVED_FLOORS; i++)
        {
                saved_floor_type *sf_ptr = &saved_floors[i];
-
-               /* Unused element */
                if (!sf_ptr->floor_id) continue;
-
-               /* Load temporal saved floor file */
-               if (load_floor(sf_ptr, (SLF_SECOND | SLF_NO_KILL)))
+               if (!load_floor(player_ptr, sf_ptr, (SLF_SECOND | SLF_NO_KILL)))
                {
-                       /* Mark success */
-                       wr_byte(0);
-
-                       /* Write saved floor data to the save file */
-                       wr_saved_floor(sf_ptr);
-               }
-               else
-               {
-                       /* Mark failure */
                        wr_byte(1);
+                       continue;
                }
-       }
 
-       /* Restore current floor */
-       if (!load_floor(cur_sf_ptr, (SLF_SECOND))) return FALSE;
+               wr_byte(0);
+               wr_saved_floor(player_ptr, sf_ptr);
+       }
 
-       /* Success */
+       if (!load_floor(player_ptr, cur_sf_ptr, (SLF_SECOND))) return FALSE;
        return TRUE;
 }
 
@@ -1244,42 +1138,30 @@ static bool wr_dungeon(void)
 /*!
  * @brief セーブデータの書き込み /
  * Actually write a save-file
+ * @param player_ptr プレーヤーへの参照ポインタ
  * @return 成功すればtrue
  */
-static bool wr_savefile_new(void)
+static bool wr_savefile_new(player_type *player_ptr)
 {
-       int        i, j;
-
-       u32b              now;
-
-       byte            tmp8u;
-       u16b            tmp16u;
-       u32b            tmp32u;
-
-       MONRACE_IDX r_idx;
-       KIND_OBJECT_IDX k_idx;
-
        /* Compact the objects */
-       compact_objects(0);
+       compact_objects(player_ptr, 0);
+
        /* Compact the monsters */
-       compact_monsters(0);
+       compact_monsters(player_ptr, 0);
 
        /* Guess at the current time */
-       now = (u32b)time((time_t *)0);
-
+       u32b now = (u32b)time((time_t *)0);
 
        /* Note the operating system */
-       sf_system = 0L;
+       current_world_ptr->sf_system = 0L;
 
        /* Note when the file was saved */
-       sf_when = now;
+       current_world_ptr->sf_when = now;
 
        /* Note the number of saves */
-       sf_saves++;
-
+       current_world_ptr->sf_saves++;
 
        /*** Actually write the file ***/
-
        /* Dump the file header */
        xor_byte = 0;
        wr_byte(FAKE_VER_MAJOR);
@@ -1290,10 +1172,9 @@ static bool wr_savefile_new(void)
        xor_byte = 0;
 
        /* Initial value of xor_byte */
-       tmp8u = (byte)Rand_external(256);
+       byte tmp8u = (byte)Rand_external(256);
        wr_byte(tmp8u);
 
-
        /* Reset the checksum */
        v_stamp = 0L;
        x_stamp = 0L;
@@ -1305,20 +1186,17 @@ static bool wr_savefile_new(void)
        wr_byte(H_VER_MAJOR);
 
        /* Operating system */
-       wr_u32b(sf_system);
-
+       wr_u32b(current_world_ptr->sf_system);
 
        /* Time file last saved */
-       wr_u32b(sf_when);
+       wr_u32b(current_world_ptr->sf_when);
 
        /* Number of past lives */
-       wr_u16b(sf_lives);
+       wr_u16b(current_world_ptr->sf_lives);
 
        /* Number of times saved */
-       wr_u16b(sf_saves);
-
+       wr_u16b(current_world_ptr->sf_saves);
 
-       /* Space */
        wr_u32b(0L);
        wr_u16b(0);
        wr_byte(0);
@@ -1340,31 +1218,35 @@ static bool wr_savefile_new(void)
        /* Write the RNG state */
        wr_randomizer();
 
-
        /* Write the boolean "options" */
        wr_options();
 
-
        /* Dump the number of "messages" */
-       tmp32u = message_num();
+       u32b tmp32u = message_num();
        if (compress_savefile && (tmp32u > 40)) tmp32u = 40;
        wr_u32b(tmp32u);
 
        /* Dump the messages (oldest first!) */
-       for (i = tmp32u - 1; i >= 0; i--)
+       for (int i = tmp32u - 1; i >= 0; i--)
        {
                wr_string(message_str((s16b)i));
        }
 
        /* Dump the monster lore */
-       tmp16u = max_r_idx;
+       u16b tmp16u = max_r_idx;
        wr_u16b(tmp16u);
-       for (r_idx = 0; r_idx < tmp16u; r_idx++) wr_lore(r_idx);
+       for (MONRACE_IDX r_idx = 0; r_idx < tmp16u; r_idx++)
+       {
+               wr_lore(r_idx);
+       }
 
        /* Dump the object memory */
        tmp16u = max_k_idx;
        wr_u16b(tmp16u);
-       for (k_idx = 0; k_idx < tmp16u; k_idx++) wr_xtra(k_idx);
+       for (KIND_OBJECT_IDX k_idx = 0; k_idx < tmp16u; k_idx++)
+       {
+               wr_xtra(k_idx);
+       }
 
        /* Dump the towns */
        tmp16u = max_towns;
@@ -1375,10 +1257,10 @@ static bool wr_savefile_new(void)
        wr_u16b(tmp16u);
 
        /* Dump the quests */
-       tmp8u = MAX_RANDOM_QUEST-MIN_RANDOM_QUEST;
+       tmp8u = MAX_RANDOM_QUEST - MIN_RANDOM_QUEST;
        wr_byte(tmp8u);
 
-       for (i = 0; i < max_q_idx; i++)
+       for (int i = 0; i < max_q_idx; i++)
        {
                quest_type* const q_ptr = &quest[i];
 
@@ -1392,33 +1274,34 @@ static bool wr_savefile_new(void)
                wr_byte((byte_hack)q_ptr->complev);
                wr_u32b(q_ptr->comptime);
 
-               /* Save quest status if quest is running */
-               if (q_ptr->status == QUEST_STATUS_TAKEN || q_ptr->status == QUEST_STATUS_COMPLETED || !is_fixed_quest_idx(i))
-               {
-                       wr_s16b((s16b)q_ptr->cur_num);
-                       wr_s16b((s16b)q_ptr->max_num);
-                       wr_s16b(q_ptr->type);
-                       wr_s16b(q_ptr->r_idx);
-                       wr_s16b(q_ptr->k_idx);
-                       wr_byte((byte_hack)q_ptr->flags);
-                       wr_byte((byte_hack)q_ptr->dungeon);
-               }
+               bool is_quest_running = q_ptr->status == QUEST_STATUS_TAKEN;
+               is_quest_running |= q_ptr->status == QUEST_STATUS_COMPLETED;
+               is_quest_running |= !is_fixed_quest_idx(i);
+               if (!is_quest_running) continue;
+
+               wr_s16b((s16b)q_ptr->cur_num);
+               wr_s16b((s16b)q_ptr->max_num);
+               wr_s16b(q_ptr->type);
+               wr_s16b(q_ptr->r_idx);
+               wr_s16b(q_ptr->k_idx);
+               wr_byte((byte_hack)q_ptr->flags);
+               wr_byte((byte_hack)q_ptr->dungeon);
        }
 
        /* Dump the position in the wilderness */
-       wr_s32b(p_ptr->wilderness_x);
-       wr_s32b(p_ptr->wilderness_y);
+       wr_s32b(player_ptr->wilderness_x);
+       wr_s32b(player_ptr->wilderness_y);
 
-       wr_byte(p_ptr->wild_mode);
-       wr_byte(p_ptr->ambush_flag);
+       wr_byte(player_ptr->wild_mode);
+       wr_byte(player_ptr->ambush_flag);
 
        wr_s32b(current_world_ptr->max_wild_x);
        wr_s32b(current_world_ptr->max_wild_y);
 
        /* Dump the wilderness seeds */
-       for (i = 0; i < current_world_ptr->max_wild_x; i++)
+       for (int i = 0; i < current_world_ptr->max_wild_x; i++)
        {
-               for (j = 0; j < current_world_ptr->max_wild_y; j++)
+               for (int j = 0; j < current_world_ptr->max_wild_y; j++)
                {
                        wr_u32b(wilderness[j][i].seed);
                }
@@ -1427,51 +1310,44 @@ static bool wr_savefile_new(void)
        /* Hack -- Dump the artifacts */
        tmp16u = max_a_idx;
        wr_u16b(tmp16u);
-       for (i = 0; i < tmp16u; i++)
+       for (int i = 0; i < tmp16u; i++)
        {
                artifact_type *a_ptr = &a_info[i];
                wr_byte(a_ptr->cur_num);
                wr_s16b(a_ptr->floor_id);
        }
 
-
-
        /* Write the "extra" information */
-       wr_extra();
+       wr_extra(player_ptr);
 
        /* Dump the "player hp" entries */
        tmp16u = PY_MAX_LEVEL;
        wr_u16b(tmp16u);
-       for (i = 0; i < tmp16u; i++)
+       for (int i = 0; i < tmp16u; i++)
        {
-               wr_s16b((s16b)p_ptr->player_hp[i]);
+               wr_s16b((s16b)player_ptr->player_hp[i]);
        }
 
-
        /* Write spell data */
-       wr_u32b(p_ptr->spell_learned1);
-       wr_u32b(p_ptr->spell_learned2);
-       wr_u32b(p_ptr->spell_worked1);
-       wr_u32b(p_ptr->spell_worked2);
-       wr_u32b(p_ptr->spell_forgotten1);
-       wr_u32b(p_ptr->spell_forgotten2);
+       wr_u32b(player_ptr->spell_learned1);
+       wr_u32b(player_ptr->spell_learned2);
+       wr_u32b(player_ptr->spell_worked1);
+       wr_u32b(player_ptr->spell_worked2);
+       wr_u32b(player_ptr->spell_forgotten1);
+       wr_u32b(player_ptr->spell_forgotten2);
 
-       wr_s16b(p_ptr->learned_spells);
-       wr_s16b(p_ptr->add_spells);
+       wr_s16b(player_ptr->learned_spells);
+       wr_s16b(player_ptr->add_spells);
 
        /* Dump the ordered spells */
-       for (i = 0; i < 64; i++)
+       for (int i = 0; i < 64; i++)
        {
-               wr_byte((byte_hack)p_ptr->spell_order[i]);
+               wr_byte((byte_hack)player_ptr->spell_order[i]);
        }
 
-
-       /* Write the inventory */
-       for (i = 0; i < INVEN_TOTAL; i++)
+       for (int i = 0; i < INVEN_TOTAL; i++)
        {
-               object_type *o_ptr = &inventory[i];
-
-               /* Skip non-objects */
+               object_type *o_ptr = &player_ptr->inventory_list[i];
                if (!o_ptr->k_idx) continue;
 
                /* Dump index */
@@ -1493,20 +1369,20 @@ static bool wr_savefile_new(void)
        wr_u16b(tmp16u);
 
        /* Dump the stores of all towns */
-       for (i = 1; i < max_towns; i++)
+       for (int i = 1; i < max_towns; i++)
        {
-               for (j = 0; j < MAX_STORES; j++)
+               for (int j = 0; j < MAX_STORES; j++)
                {
                        wr_store(&town_info[i].store[j]);
                }
        }
 
        /* Write the pet command settings */
-       wr_s16b(p_ptr->pet_follow_distance);
-       wr_s16b(p_ptr->pet_extra_flags);
+       wr_s16b(player_ptr->pet_follow_distance);
+       wr_s16b(player_ptr->pet_extra_flags);
 
        /* Write screen dump for sending score */
-       if (screen_dump && (p_ptr->wait_report_score || !p_ptr->is_dead))
+       if (screen_dump && (player_ptr->wait_report_score || !player_ptr->is_dead))
        {
                wr_string(screen_dump);
        }
@@ -1516,10 +1392,10 @@ static bool wr_savefile_new(void)
        }
 
        /* Player is not dead, write the dungeon */
-       if (!p_ptr->is_dead)
+       if (!player_ptr->is_dead)
        {
                /* Dump the dungeon */
-               if (!wr_dungeon()) return FALSE;
+               if (!wr_dungeon(player_ptr)) return FALSE;
 
                /* Dump the ghost */
                wr_ghost();
@@ -1528,18 +1404,13 @@ static bool wr_savefile_new(void)
                wr_s32b(0);
        }
 
-
        /* Write the "value check-sum" */
        wr_u32b(v_stamp);
 
        /* Write the "encoded checksum" */
        wr_u32b(x_stamp);
 
-
-       /* Error in save */
        if (ferror(fff) || (fflush(fff) == EOF)) return FALSE;
-
-       /* Successful save */
        return TRUE;
 }
 
@@ -1547,32 +1418,27 @@ static bool wr_savefile_new(void)
 /*!
  * @brief セーブデータ書き込みのサブルーチン /
  * Medium level player saver
+ * @param player_ptr プレーヤーへの参照ポインタ
  * @return 成功すればtrue
  * @details
  * Angband 2.8.0 will use "fd" instead of "fff" if possible
  */
-static bool save_player_aux(char *name)
+static bool save_player_aux(player_type *player_ptr, char *name)
 {
-       bool ok = FALSE;
-       int fd = -1;
-       int mode = 0644;
-
-       /* No file yet */
-       fff = NULL;
-
-       /* File type is "SAVE" */
        FILE_TYPE(FILE_TYPE_SAVE);
 
        /* Grab permissions */
        safe_setuid_grab();
 
        /* Create the savefile */
-       fd = fd_make(name, mode);
+       int file_permission = 0644;
+       int fd = fd_make(name, file_permission);
 
        /* Drop permissions */
        safe_setuid_drop();
 
-       /* File is okay */
+       bool is_save_successful = FALSE;
+       fff = NULL;
        if (fd >= 0)
        {
                /* Close the "fd" */
@@ -1591,49 +1457,38 @@ static bool save_player_aux(char *name)
                if (fff)
                {
                        /* Write the savefile */
-                       if (wr_savefile_new()) ok = TRUE;
+                       if (wr_savefile_new(player_ptr)) is_save_successful = TRUE;
 
                        /* Attempt to close it */
-                       if (my_fclose(fff)) ok = FALSE;
+                       if (my_fclose(fff)) is_save_successful = FALSE;
                }
 
                /* Grab permissions */
                safe_setuid_grab();
 
                /* Remove "broken" files */
-               if (!ok) (void)fd_kill(name);
+               if (!is_save_successful) (void)fd_kill(name);
 
                /* Drop permissions */
                safe_setuid_drop();
        }
 
+       if (!is_save_successful) return FALSE;
 
-       /* Failure */
-       if (!ok) return (FALSE);
-
-       counts_write(0, current_world_ptr->play_time);
-
-       /* Successful save */
-       character_saved = TRUE;
-
-       /* Success */
-       return (TRUE);
+       counts_write(player_ptr, 0, current_world_ptr->play_time);
+       current_world_ptr->character_saved = TRUE;
+       return TRUE;
 }
 
 
-
 /*!
  * @brief セーブデータ書き込みのメインルーチン /
  * Attempt to save the player in a savefile
+ * @param player_ptr プレーヤーへの参照ポインタ
  * @return 成功すればtrue
  */
-bool save_player(void)
+bool save_player(player_type *player_ptr)
 {
-       bool result = FALSE;
-
-       char safe[1024];
-
-
 #ifdef SET_UID
 
 # ifdef SECURE
@@ -1645,24 +1500,22 @@ bool save_player(void)
 
 #endif
 
-
-       /* New savefile */
+       char safe[1024];
        strcpy(safe, savefile);
        strcat(safe, ".new");
 
        /* Grab permissions */
        safe_setuid_grab();
 
-       /* Remove it */
        fd_kill(safe);
 
        /* Drop permissions */
        safe_setuid_drop();
-
        update_playtime();
 
        /* Attempt to save the player */
-       if (save_player_aux(safe))
+       bool result = FALSE;
+       if (save_player_aux(player_ptr, safe))
        {
                char temp[1024];
 
@@ -1689,7 +1542,7 @@ bool save_player(void)
                safe_setuid_drop();
 
                /* Hack -- Pretend the character was loaded */
-               character_loaded = TRUE;
+               current_world_ptr->character_loaded = TRUE;
 
 #ifdef VERIFY_SAVEFILE
 
@@ -1710,7 +1563,7 @@ bool save_player(void)
 
                /* Success */
                result = TRUE;
-       }
+}
 
 
 #ifdef SET_UID
@@ -1725,13 +1578,14 @@ bool save_player(void)
 #endif
 
        /* Return the result */
-       return (result);
+       return result;
 }
 
 
 /*!
  * @brief セーブデータ読み込みのメインルーチン /
  * Attempt to Load a "savefile"
+ * @param creature_ptr プレーヤーへの参照ポインタ
  * @return 成功すればtrue
  * @details
  * <pre>
@@ -1750,36 +1604,26 @@ bool save_player(void)
  * allowed to save his game when he quits.
  *
  * We return "TRUE" if the savefile was usable, and we set the global
- * flag "character_loaded" if a real, living, character was loaded.
+ * flag "current_world_ptr->character_loaded" if a real, living, character was loaded.
  *
  * Note that we always try to load the "current" savefile, even if
  * there is no such file, so we must check for "empty" savefile names.
  * </pre>
  */
-bool load_player(void)
+bool load_player(player_type *player_ptr)
 {
-       int             fd = -1;
-
-       errr    err = 0;
-
-       byte    vvv[4];
-
 #ifdef VERIFY_TIMESTAMP
        struct stat     statbuf;
 #endif
 
        concptr    what = "generic";
 
-
-       /* Paranoia */
        current_world_ptr->game_turn = 0;
-
-       /* Paranoia */
-       p_ptr->is_dead = FALSE;
+       player_ptr->is_dead = FALSE;
 
 
        /* Allow empty savefile name */
-       if (!savefile[0]) return (TRUE);
+       if (!savefile[0]) return TRUE;
 
 
 #if !defined(MACINTOSH) && !defined(WINDOWS)
@@ -1795,12 +1639,12 @@ bool load_player(void)
                msg_print(NULL);
 
                /* Allow this */
-               return (TRUE);
+               return TRUE;
        }
 
 #endif
 
-
+       errr err = 0;
 #ifdef VERIFY_SAVEFILE
 
        /* Verify savefile usage */
@@ -1825,7 +1669,7 @@ bool load_player(void)
                        msg_print(_("セーブファイルは現在使用中です。", "Savefile is currently in use."));
                        msg_print(NULL);
 
-                       return (FALSE);
+                       return FALSE;
                }
 
                /* Create a lock file */
@@ -1840,7 +1684,8 @@ bool load_player(void)
 
 #endif
 
-
+       int fd = -1;
+       byte vvv[4];
        if (!err)
        {
                /* Open the savefile */
@@ -1856,7 +1701,6 @@ bool load_player(void)
        /* Process file */
        if (!err)
        {
-
 #ifdef VERIFY_TIMESTAMP
                /* Get the timestamp */
                (void)fstat(fd, &statbuf);
@@ -1873,26 +1717,24 @@ bool load_player(void)
        /* Process file */
        if (!err)
        {
-
                /* Extract version */
-               z_major = vvv[0];
-               z_minor = vvv[1];
-               z_patch = vvv[2];
-               sf_extra = vvv[3];
+               current_world_ptr->z_major = vvv[0];
+               current_world_ptr->z_minor = vvv[1];
+               current_world_ptr->z_patch = vvv[2];
+               current_world_ptr->sf_extra = vvv[3];
 
                Term_clear();
 
                /* Attempt to load */
-               err = rd_savefile_new();
+               err = rd_savefile_new(player_ptr);
 
                /* Message (below) */
                if (err) what = _("セーブファイルを解析出来ません。", "Cannot parse savefile");
        }
 
-       /* Paranoia */
        if (!err)
        {
-               /* Invalid current_world_ptr->game_turn */
+               /* Invalid turn */
                if (!current_world_ptr->game_turn) err = -1;
 
                /* Message (below) */
@@ -1904,8 +1746,8 @@ bool load_player(void)
        if (!err && !arg_wizard)
        {
                /* Hack -- Verify the timestamp */
-               if (sf_when > (statbuf.st_ctime + 100) ||
-                   sf_when < (statbuf.st_ctime - 100))
+               if (current_world_ptr->sf_when > (statbuf.st_ctime + 100) ||
+                       current_world_ptr->sf_when < (statbuf.st_ctime - 100))
                {
                        what = _("無効なタイム・スタンプです", "Invalid timestamp");
 
@@ -1914,63 +1756,61 @@ bool load_player(void)
        }
 #endif
 
-
        if (!err)
        {
                /* Give a conversion warning */
-               if ((FAKE_VER_MAJOR != z_major) ||
-                   (FAKE_VER_MINOR != z_minor) ||
-                   (FAKE_VER_PATCH != z_patch))
+               if ((FAKE_VER_MAJOR != current_world_ptr->z_major) ||
+                       (FAKE_VER_MINOR != current_world_ptr->z_minor) ||
+                       (FAKE_VER_PATCH != current_world_ptr->z_patch))
                {
-                       if (z_major == 2 && z_minor == 0 && z_patch == 6)
+                       if (current_world_ptr->z_major == 2 && current_world_ptr->z_minor == 0 && current_world_ptr->z_patch == 6)
                        {
                                msg_print(_("バージョン 2.0.* 用のセーブファイルを変換しました。", "Converted a 2.0.* savefile."));
                        }
                        else
                        {
                                msg_format(_("バージョン %d.%d.%d 用のセーブ・ファイルを変換しました。", "Converted a %d.%d.%d savefile."),
-                                   (z_major > 9) ? z_major-10 : z_major , z_minor, z_patch);
+                                       (current_world_ptr->z_major > 9) ? current_world_ptr->z_major - 10 : current_world_ptr->z_major, current_world_ptr->z_minor, current_world_ptr->z_patch);
                        }
                        msg_print(NULL);
                }
 
                /* Player is dead */
-               if (p_ptr->is_dead)
+               if (player_ptr->is_dead)
                {
                        /* Cheat death */
                        if (arg_wizard)
                        {
                                /* A character was loaded */
-                               character_loaded = TRUE;
-                               return (TRUE);
+                               current_world_ptr->character_loaded = TRUE;
+                               return TRUE;
                        }
 
                        /* Player is no longer "dead" */
-                       p_ptr->is_dead = FALSE;
+                       player_ptr->is_dead = FALSE;
 
                        /* Count lives */
-                       sf_lives++;
+                       current_world_ptr->sf_lives++;
 
-                       return (TRUE);
+                       return TRUE;
                }
 
                /* A character was loaded */
-               character_loaded = TRUE;
+               current_world_ptr->character_loaded = TRUE;
 
                {
-                       u32b tmp = counts_read(2);
-                       if (tmp > p_ptr->count)
-                               p_ptr->count = tmp;
-                       if (counts_read(0) > current_world_ptr->play_time || counts_read(1) == current_world_ptr->play_time)
-                               counts_write(2, ++p_ptr->count);
-                       counts_write(1, current_world_ptr->play_time);
+                       u32b tmp = counts_read(player_ptr, 2);
+                       if (tmp > player_ptr->count)
+                               player_ptr->count = tmp;
+                       if (counts_read(player_ptr, 0) > current_world_ptr->play_time || counts_read(player_ptr, 1) == current_world_ptr->play_time)
+                               counts_write(player_ptr, 2, ++player_ptr->count);
+                       counts_write(player_ptr, 1, current_world_ptr->play_time);
                }
 
                /* Success */
-               return (TRUE);
+               return TRUE;
        }
 
-
 #ifdef VERIFY_SAVEFILE
 
        /* Verify savefile usage */
@@ -1989,13 +1829,12 @@ bool load_player(void)
 #endif
 
        msg_format(_("エラー(%s)がバージョン%d.%d.%d 用セーブファイル読み込み中に発生。", "Error (%s) reading %d.%d.%d savefile."),
-               what, (z_major>9) ? z_major - 10 : z_major, z_minor, z_patch);
-
+               what, (current_world_ptr->z_major > 9) ? current_world_ptr->z_major - 10 : current_world_ptr->z_major, current_world_ptr->z_minor, current_world_ptr->z_patch);
        msg_print(NULL);
-
-       return (FALSE);
+       return FALSE;
 }
 
+
 /*!
  * @brief ファイルロック処理
  * @return なし
@@ -2039,28 +1878,24 @@ void remove_loc(void)
 
 
 /*!
- * @brief ゲームプレイ中のフロア一時保存出力処理サブルーチン / Actually write a temporal saved floor file
+ * @brief ゲームプレイ中のフロア一時保存出力処理サブルーチン / Actually write a temporary saved floor file
+ * @param player_ptr プレーヤーへの参照ポインタ
  * @param sf_ptr 保存フロア参照ポインタ
  * @return なし
  */
-static bool save_floor_aux(saved_floor_type *sf_ptr)
+static bool save_floor_aux(player_type *player_ptr, saved_floor_type *sf_ptr)
 {
-       byte tmp8u;
-
        /* Compact the objects */
-       compact_objects(0);
+       compact_objects(player_ptr, 0);
        /* Compact the monsters */
-       compact_monsters(0);
-
+       compact_monsters(player_ptr, 0);
 
        /*** Actually write the file ***/
-
        /* Initial value of xor_byte */
-       tmp8u = (byte)randint0(256);
+       byte tmp8u = (byte)randint0(256);
        xor_byte = 0;
        wr_byte(tmp8u);
 
-
        /* Reset the checksum */
        v_stamp = 0L;
        x_stamp = 0L;
@@ -2069,8 +1904,7 @@ static bool save_floor_aux(saved_floor_type *sf_ptr)
        wr_u32b(saved_floor_file_sign);
 
        /* Dump the dungeon floor */
-       wr_saved_floor(sf_ptr);
-
+       wr_saved_floor(player_ptr, sf_ptr);
 
        /* Write the "value check-sum" */
        wr_u32b(v_stamp);
@@ -2078,22 +1912,19 @@ static bool save_floor_aux(saved_floor_type *sf_ptr)
        /* Write the "encoded checksum" */
        wr_u32b(x_stamp);
 
-
-       /* Error in save */
        if (ferror(fff) || (fflush(fff) == EOF)) return FALSE;
-
-       /* Successful save */
        return TRUE;
 }
 
 
 /*!
- * @brief ゲームプレイ中のフロア一時保存出力処理メインルーチン / Attempt to save the temporally saved-floor data
+ * @brief ゲームプレイ中のフロア一時保存出力処理メインルーチン / Attempt to save the temporarily saved-floor data
+ * @param player_ptr プレーヤーへの参照ポインタ
  * @param sf_ptr 保存フロア参照ポインタ
  * @param mode 保存オプション
  * @return なし
  */
-bool save_floor(saved_floor_type *sf_ptr, BIT_FLAGS mode)
+bool save_floor(player_type *player_ptr, saved_floor_type *sf_ptr, BIT_FLAGS mode)
 {
        FILE *old_fff = NULL;
        byte old_xor_byte = 0;
@@ -2101,9 +1932,6 @@ bool save_floor(saved_floor_type *sf_ptr, BIT_FLAGS mode)
        u32b old_x_stamp = 0;
 
        char floor_savefile[1024];
-       int fd = -1;
-       bool ok = FALSE;
-
        if (!(mode & SLF_SECOND))
        {
 #ifdef SET_UID
@@ -2136,7 +1964,6 @@ bool save_floor(saved_floor_type *sf_ptr, BIT_FLAGS mode)
        /* Drop permissions */
        safe_setuid_drop();
 
-
        /* Attempt to save the player */
 
        /* No file yet */
@@ -2149,12 +1976,12 @@ bool save_floor(saved_floor_type *sf_ptr, BIT_FLAGS mode)
        safe_setuid_grab();
 
        /* Create the savefile */
-       fd = fd_make(floor_savefile, 0644);
+       int fd = fd_make(floor_savefile, 0644);
 
        /* Drop permissions */
        safe_setuid_drop();
 
-       /* File is okay */
+       bool is_save_successful = FALSE;
        if (fd >= 0)
        {
                /* Close the "fd" */
@@ -2173,14 +2000,14 @@ bool save_floor(saved_floor_type *sf_ptr, BIT_FLAGS mode)
                if (fff)
                {
                        /* Write the savefile */
-                       if (save_floor_aux(sf_ptr)) ok = TRUE;
+                       if (save_floor_aux(player_ptr, sf_ptr)) is_save_successful = TRUE;
 
                        /* Attempt to close it */
-                       if (my_fclose(fff)) ok = FALSE;
+                       if (my_fclose(fff)) is_save_successful = FALSE;
                }
 
                /* Remove "broken" files */
-               if (!ok)
+               if (!is_save_successful)
                {
                        /* Grab permissions */
                        safe_setuid_grab();
@@ -2212,6 +2039,5 @@ bool save_floor(saved_floor_type *sf_ptr, BIT_FLAGS mode)
                x_stamp = old_x_stamp;
        }
 
-       /* Return the result */
-       return ok;
+       return is_save_successful;
 }