<ClCompile Include="..\..\src\load\store-loader.c" />\r
<ClCompile Include="..\..\src\load\world-loader.c" />\r
<ClCompile Include="..\..\src\save\item-writer.c" />\r
+ <ClCompile Include="..\..\src\save\monster-writer.c" />\r
<ClCompile Include="..\..\src\save\save-util.c" />\r
<ClCompile Include="..\..\src\specific-object\death-crimson.c" />\r
<ClCompile Include="..\..\src\spell-kind\blood-curse.c" />\r
<ClInclude Include="..\..\src\load\store-loader.h" />\r
<ClInclude Include="..\..\src\load\world-loader.h" />\r
<ClInclude Include="..\..\src\save\item-writer.h" />\r
+ <ClInclude Include="..\..\src\save\monster-writer.h" />\r
<ClInclude Include="..\..\src\save\save-util.h" />\r
<ClInclude Include="..\..\src\specific-object\death-crimson.h" />\r
<ClInclude Include="..\..\src\spell-kind\blood-curse.h" />\r
<ClCompile Include="..\..\src\save\item-writer.c">
<Filter>save</Filter>
</ClCompile>
+ <ClCompile Include="..\..\src\save\monster-writer.c">
+ <Filter>save</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\src\combat\shoot.h">
<ClInclude Include="..\..\src\save\item-writer.h">
<Filter>save</Filter>
</ClInclude>
+ <ClInclude Include="..\..\src\save\monster-writer.h">
+ <Filter>save</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\..\src\wall.bmp" />
room/pit-nest-kinds-table.c room/pit-nest-kinds-table.h \
\
save/item-writer.c save/item-writer.h \
+ save/monster-writer.c save/monster-writer.h \
save/save.c save/save.h \
save/save-util.c save/save-util.h \
\
--- /dev/null
+#include "save/monster-writer.h"
+#include "load/savedata-flag-types.h"
+#include "monster-race/monster-race.h"
+#include "monster/monster-info.h"
+#include "monster/monster-status.h"
+#include "save/save-util.h"
+#include "system/monster-type-definition.h"
+#include "util/quarks.h"
+
+/*!
+ * @brief モンスター情報を書き込む / Write a "monster" record
+ * @param m_ptr モンスター情報保存元ポインタ
+ * @return なし
+ */
+void wr_monster(monster_type *m_ptr)
+{
+ BIT_FLAGS flags = 0x00000000;
+ if (!is_original_ap(m_ptr))
+ flags |= SAVE_MON_AP_R_IDX;
+
+ if (m_ptr->sub_align)
+ flags |= SAVE_MON_SUB_ALIGN;
+
+ if (monster_csleep_remaining(m_ptr))
+ flags |= SAVE_MON_CSLEEP;
+
+ if (monster_fast_remaining(m_ptr))
+ flags |= SAVE_MON_FAST;
+
+ if (monster_slow_remaining(m_ptr))
+ flags |= SAVE_MON_SLOW;
+
+ if (monster_stunned_remaining(m_ptr))
+ flags |= SAVE_MON_STUNNED;
+
+ if (monster_confused_remaining(m_ptr))
+ flags |= SAVE_MON_CONFUSED;
+
+ if (monster_fear_remaining(m_ptr))
+ flags |= SAVE_MON_MONFEAR;
+
+ if (m_ptr->target_y)
+ flags |= SAVE_MON_TARGET_Y;
+
+ if (m_ptr->target_x)
+ flags |= SAVE_MON_TARGET_X;
+
+ if (monster_invulner_remaining(m_ptr))
+ flags |= SAVE_MON_INVULNER;
+
+ if (m_ptr->smart)
+ flags |= SAVE_MON_SMART;
+
+ if (m_ptr->exp)
+ flags |= SAVE_MON_EXP;
+
+ if (m_ptr->mflag2)
+ flags |= SAVE_MON_MFLAG2;
+
+ if (m_ptr->nickname)
+ flags |= SAVE_MON_NICKNAME;
+
+ if (m_ptr->parent_m_idx)
+ flags |= SAVE_MON_PARENT;
+
+ /*** Monster save flags ***/
+ wr_u32b(flags);
+
+ /*** Write only un-obvious elements ***/
+ wr_s16b(m_ptr->r_idx);
+ wr_byte((byte)m_ptr->fy);
+ wr_byte((byte)m_ptr->fx);
+ wr_s16b((s16b)m_ptr->hp);
+ 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);
+
+ if (flags & SAVE_MON_SUB_ALIGN)
+ wr_byte(m_ptr->sub_align);
+ if (flags & SAVE_MON_CSLEEP)
+ wr_s16b(m_ptr->mtimed[MTIMED_CSLEEP]);
+
+ 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];
+ wr_byte(tmp8u);
+ }
+
+ if (flags & SAVE_MON_SLOW) {
+ tmp8u = (byte)m_ptr->mtimed[MTIMED_SLOW];
+ wr_byte(tmp8u);
+ }
+
+ if (flags & SAVE_MON_STUNNED) {
+ tmp8u = (byte)m_ptr->mtimed[MTIMED_STUNNED];
+ wr_byte(tmp8u);
+ }
+
+ if (flags & SAVE_MON_CONFUSED) {
+ tmp8u = (byte)m_ptr->mtimed[MTIMED_CONFUSED];
+ wr_byte(tmp8u);
+ }
+
+ if (flags & SAVE_MON_MONFEAR) {
+ tmp8u = (byte)m_ptr->mtimed[MTIMED_MONFEAR];
+ wr_byte(tmp8u);
+ }
+
+ if (flags & SAVE_MON_TARGET_Y)
+ wr_s16b((s16b)m_ptr->target_y);
+
+ if (flags & SAVE_MON_TARGET_X)
+ wr_s16b((s16b)m_ptr->target_x);
+
+ if (flags & SAVE_MON_INVULNER) {
+ tmp8u = (byte)m_ptr->mtimed[MTIMED_INVULNER];
+ wr_byte(tmp8u);
+ }
+
+ if (flags & SAVE_MON_SMART)
+ wr_u32b(m_ptr->smart);
+
+ if (flags & SAVE_MON_EXP)
+ wr_u32b(m_ptr->exp);
+
+ if (flags & SAVE_MON_MFLAG2)
+ wr_byte(m_ptr->mflag2);
+
+ if (flags & SAVE_MON_NICKNAME)
+ wr_string(quark_str(m_ptr->nickname));
+
+ if (flags & SAVE_MON_PARENT)
+ wr_s16b(m_ptr->parent_m_idx);
+}
+
+/*!
+ * @brief モンスターの思い出を書き込む / Write a "lore" record
+ * @param r_idx モンスター種族ID
+ * @return なし
+ */
+void wr_lore(MONRACE_IDX r_idx)
+{
+ 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);
+ wr_s16b((s16b)r_ptr->r_akills);
+ wr_s16b((s16b)r_ptr->r_tkills);
+
+ wr_byte(r_ptr->r_wake);
+ wr_byte(r_ptr->r_ignore);
+
+ wr_byte(r_ptr->r_xtra1);
+ wr_byte(r_ptr->r_xtra2);
+
+ wr_byte((byte)r_ptr->r_drop_gold);
+ wr_byte((byte)r_ptr->r_drop_item);
+
+ wr_byte(0); /* unused now */
+ wr_byte(r_ptr->r_cast_spell);
+
+ wr_byte(r_ptr->r_blows[0]);
+ wr_byte(r_ptr->r_blows[1]);
+ wr_byte(r_ptr->r_blows[2]);
+ wr_byte(r_ptr->r_blows[3]);
+
+ wr_u32b(r_ptr->r_flags1);
+ wr_u32b(r_ptr->r_flags2);
+ wr_u32b(r_ptr->r_flags3);
+ wr_u32b(r_ptr->r_flags4);
+ wr_u32b(r_ptr->r_flags5);
+ wr_u32b(r_ptr->r_flags6);
+ wr_u32b(r_ptr->r_flagsr);
+
+ wr_byte((byte)r_ptr->max_num);
+ wr_s16b(r_ptr->floor_id);
+ wr_byte(0);
+}
--- /dev/null
+#pragma once
+
+#include "system/angband.h"
+
+typedef struct monster_type monster_type;
+void wr_monster(monster_type *m_ptr);
+void wr_lore(MONRACE_IDX r_idx);
#include "monster/monster-status.h"
#include "object/object-kind.h"
#include "save/item-writer.h"
+#include "save/monster-writer.h"
#include "save/save-util.h"
#include "store/store-util.h"
#include "store/store.h"
#include "world/world.h"
/*!
- * @brief モンスター情報を書き込む / Write a "monster" record
- * @param m_ptr モンスター情報保存元ポインタ
- * @return なし
- */
-static void wr_monster(monster_type *m_ptr)
-{
- BIT_FLAGS flags = 0x00000000;
- if (!is_original_ap(m_ptr))
- flags |= SAVE_MON_AP_R_IDX;
- if (m_ptr->sub_align)
- flags |= SAVE_MON_SUB_ALIGN;
- if (monster_csleep_remaining(m_ptr))
- flags |= SAVE_MON_CSLEEP;
- if (monster_fast_remaining(m_ptr))
- flags |= SAVE_MON_FAST;
- if (monster_slow_remaining(m_ptr))
- flags |= SAVE_MON_SLOW;
- if (monster_stunned_remaining(m_ptr))
- flags |= SAVE_MON_STUNNED;
- if (monster_confused_remaining(m_ptr))
- flags |= SAVE_MON_CONFUSED;
- if (monster_fear_remaining(m_ptr))
- flags |= SAVE_MON_MONFEAR;
- if (m_ptr->target_y)
- flags |= SAVE_MON_TARGET_Y;
- if (m_ptr->target_x)
- flags |= SAVE_MON_TARGET_X;
- if (monster_invulner_remaining(m_ptr))
- flags |= SAVE_MON_INVULNER;
- if (m_ptr->smart)
- flags |= SAVE_MON_SMART;
- if (m_ptr->exp)
- flags |= SAVE_MON_EXP;
- if (m_ptr->mflag2)
- flags |= SAVE_MON_MFLAG2;
- if (m_ptr->nickname)
- flags |= SAVE_MON_NICKNAME;
- if (m_ptr->parent_m_idx)
- flags |= SAVE_MON_PARENT;
-
- /*** Monster save flags ***/
- wr_u32b(flags);
-
- /*** Write only un-obvious elements ***/
- wr_s16b(m_ptr->r_idx);
- wr_byte((byte)m_ptr->fy);
- wr_byte((byte)m_ptr->fx);
- wr_s16b((s16b)m_ptr->hp);
- 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);
-
- if (flags & SAVE_MON_SUB_ALIGN)
- wr_byte(m_ptr->sub_align);
- if (flags & SAVE_MON_CSLEEP)
- wr_s16b(m_ptr->mtimed[MTIMED_CSLEEP]);
-
- 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];
- wr_byte(tmp8u);
- }
- if (flags & SAVE_MON_SLOW) {
- tmp8u = (byte)m_ptr->mtimed[MTIMED_SLOW];
- wr_byte(tmp8u);
- }
- if (flags & SAVE_MON_STUNNED) {
- tmp8u = (byte)m_ptr->mtimed[MTIMED_STUNNED];
- wr_byte(tmp8u);
- }
- if (flags & SAVE_MON_CONFUSED) {
- tmp8u = (byte)m_ptr->mtimed[MTIMED_CONFUSED];
- wr_byte(tmp8u);
- }
- if (flags & SAVE_MON_MONFEAR) {
- tmp8u = (byte)m_ptr->mtimed[MTIMED_MONFEAR];
- wr_byte(tmp8u);
- }
- if (flags & SAVE_MON_TARGET_Y)
- wr_s16b((s16b)m_ptr->target_y);
- if (flags & SAVE_MON_TARGET_X)
- wr_s16b((s16b)m_ptr->target_x);
- if (flags & SAVE_MON_INVULNER) {
- tmp8u = (byte)m_ptr->mtimed[MTIMED_INVULNER];
- wr_byte(tmp8u);
- }
- if (flags & SAVE_MON_SMART)
- wr_u32b(m_ptr->smart);
- if (flags & SAVE_MON_EXP)
- wr_u32b(m_ptr->exp);
- if (flags & SAVE_MON_MFLAG2)
- wr_byte(m_ptr->mflag2);
- if (flags & SAVE_MON_NICKNAME)
- wr_string(quark_str(m_ptr->nickname));
- if (flags & SAVE_MON_PARENT)
- wr_s16b(m_ptr->parent_m_idx);
-}
-
-/*!
- * @brief モンスターの思い出を書き込む / Write a "lore" record
- * @param r_idx モンスター種族ID
- * @return なし
- */
-static void wr_lore(MONRACE_IDX 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);
- wr_s16b((s16b)r_ptr->r_akills);
- wr_s16b((s16b)r_ptr->r_tkills);
-
- /* Count wakes and ignores */
- wr_byte(r_ptr->r_wake);
- wr_byte(r_ptr->r_ignore);
-
- /* Extra stuff */
- wr_byte(r_ptr->r_xtra1);
- wr_byte(r_ptr->r_xtra2);
-
- /* Count drops */
- wr_byte((byte)r_ptr->r_drop_gold);
- wr_byte((byte)r_ptr->r_drop_item);
-
- /* Count spells */
- wr_byte(0); /* unused now */
- wr_byte(r_ptr->r_cast_spell);
-
- /* Count blows of each type */
- wr_byte(r_ptr->r_blows[0]);
- wr_byte(r_ptr->r_blows[1]);
- wr_byte(r_ptr->r_blows[2]);
- wr_byte(r_ptr->r_blows[3]);
-
- /* Memorize flags */
- wr_u32b(r_ptr->r_flags1);
- wr_u32b(r_ptr->r_flags2);
- wr_u32b(r_ptr->r_flags3);
- wr_u32b(r_ptr->r_flags4);
- wr_u32b(r_ptr->r_flags5);
- wr_u32b(r_ptr->r_flags6);
- wr_u32b(r_ptr->r_flagsr);
-
- /* Monster limit per level */
- wr_byte((byte)r_ptr->max_num);
-
- /* Location in saved floor */
- wr_s16b(r_ptr->floor_id);
-
- wr_byte(0);
-}
-
-/*!
* @brief その他のゲーム情報を書き込む(実質はアイテムの鑑定情報のみ) / Write an "xtra" record
* @param k_idx ベースアイテムのID
* @return なし