OSDN Git Service

Merge remote-tracking branch 'remotes/origin/feature/Fix-saved-floor-exceed' into...
[hengband/hengband.git] / src / load / monster-loader.c
1 #include "load/monster-loader.h"
2 #include "load/angband-version-comparer.h"
3 #include "load/load-v1-5-0.h"
4 #include "load/load-util.h"
5 #include "load/savedata-flag-types.h"
6 #include "util/quarks.h"
7
8 /*!
9  * @brief モンスターを読み込む(現版) / Read a monster (New method)
10  * @param player_ptr プレーヤーへの参照ポインタ
11  * @param m_ptr モンスター保存先ポインタ
12  * @return なし
13  */
14 void rd_monster(player_type *player_ptr, monster_type *m_ptr)
15 {
16     if (h_older_than(1, 5, 0, 0)) {
17         rd_monster_old(player_ptr, m_ptr);
18         return;
19     }
20
21     BIT_FLAGS flags;
22     rd_u32b(&flags);
23     rd_s16b(&m_ptr->r_idx);
24     byte tmp8u;
25     rd_byte(&tmp8u);
26     m_ptr->fy = (POSITION)tmp8u;
27     rd_byte(&tmp8u);
28     m_ptr->fx = (POSITION)tmp8u;
29
30     s16b tmp16s;
31     rd_s16b(&tmp16s);
32     m_ptr->hp = (HIT_POINT)tmp16s;
33     rd_s16b(&tmp16s);
34     m_ptr->maxhp = (HIT_POINT)tmp16s;
35     rd_s16b(&tmp16s);
36     m_ptr->max_maxhp = (HIT_POINT)tmp16s;
37
38     if (h_older_than(2, 1, 2, 1)) {
39         m_ptr->dealt_damage = 0;
40     } else {
41         rd_s32b(&m_ptr->dealt_damage);
42     }
43
44     if (flags & SAVE_MON_AP_R_IDX)
45         rd_s16b(&m_ptr->ap_r_idx);
46     else
47         m_ptr->ap_r_idx = m_ptr->r_idx;
48
49     if (flags & SAVE_MON_SUB_ALIGN)
50         rd_byte(&m_ptr->sub_align);
51     else
52         m_ptr->sub_align = 0;
53
54     if (flags & SAVE_MON_CSLEEP)
55         rd_s16b(&m_ptr->mtimed[MTIMED_CSLEEP]);
56     else
57         m_ptr->mtimed[MTIMED_CSLEEP] = 0;
58
59     rd_byte(&tmp8u);
60     m_ptr->mspeed = tmp8u;
61
62     rd_s16b(&m_ptr->energy_need);
63
64     if (flags & SAVE_MON_FAST) {
65         rd_byte(&tmp8u);
66         m_ptr->mtimed[MTIMED_FAST] = (s16b)tmp8u;
67     } else
68         m_ptr->mtimed[MTIMED_FAST] = 0;
69
70     if (flags & SAVE_MON_SLOW) {
71         rd_byte(&tmp8u);
72         m_ptr->mtimed[MTIMED_SLOW] = (s16b)tmp8u;
73     } else
74         m_ptr->mtimed[MTIMED_SLOW] = 0;
75
76     if (flags & SAVE_MON_STUNNED) {
77         rd_byte(&tmp8u);
78         m_ptr->mtimed[MTIMED_STUNNED] = (s16b)tmp8u;
79     } else
80         m_ptr->mtimed[MTIMED_STUNNED] = 0;
81
82     if (flags & SAVE_MON_CONFUSED) {
83         rd_byte(&tmp8u);
84         m_ptr->mtimed[MTIMED_CONFUSED] = (s16b)tmp8u;
85     } else
86         m_ptr->mtimed[MTIMED_CONFUSED] = 0;
87
88     if (flags & SAVE_MON_MONFEAR) {
89         rd_byte(&tmp8u);
90         m_ptr->mtimed[MTIMED_MONFEAR] = (s16b)tmp8u;
91     } else
92         m_ptr->mtimed[MTIMED_MONFEAR] = 0;
93
94     if (flags & SAVE_MON_TARGET_Y) {
95         rd_s16b(&tmp16s);
96         m_ptr->target_y = (POSITION)tmp16s;
97     } else
98         m_ptr->target_y = 0;
99
100     if (flags & SAVE_MON_TARGET_X) {
101         rd_s16b(&tmp16s);
102         m_ptr->target_x = (POSITION)tmp16s;
103     } else
104         m_ptr->target_x = 0;
105
106     if (flags & SAVE_MON_INVULNER) {
107         rd_byte(&tmp8u);
108         m_ptr->mtimed[MTIMED_INVULNER] = (s16b)tmp8u;
109     } else
110         m_ptr->mtimed[MTIMED_INVULNER] = 0;
111
112     if (flags & SAVE_MON_SMART)
113         rd_u32b(&m_ptr->smart);
114     else
115         m_ptr->smart = 0;
116
117     if (flags & SAVE_MON_EXP) {
118         u32b tmp32u;
119         rd_u32b(&tmp32u);
120         m_ptr->exp = (EXP)tmp32u;
121     } else
122         m_ptr->exp = 0;
123
124     m_ptr->mflag = 0; /* Not saved */
125
126     if (flags & SAVE_MON_MFLAG2)
127         rd_byte(&m_ptr->mflag2);
128     else
129         m_ptr->mflag2 = 0;
130
131     if (flags & SAVE_MON_NICKNAME) {
132         char buf[128];
133         rd_string(buf, sizeof(buf));
134         m_ptr->nickname = quark_add(buf);
135     } else
136         m_ptr->nickname = 0;
137
138     if (flags & SAVE_MON_PARENT)
139         rd_s16b(&m_ptr->parent_m_idx);
140     else
141         m_ptr->parent_m_idx = 0;
142 }