OSDN Git Service

Merge pull request #765 from sikabane-works/release/3.0.0Alpha17
[hengbandforosx/hengbandosx.git] / src / load / lore-loader.cpp
1 #include "load/lore-loader.h"
2 #include "game-option/runtime-arguments.h"
3 #include "monster-race/monster-race.h"
4 #include "load/load-util.h"
5 #include "load/load-v1-5-0.h"
6 #include "load/angband-version-comparer.h"
7
8 /*!
9  * @brief モンスターの思い出を読み込む / Read the monster lore
10  * @param r_ptr 読み込み先モンスター種族情報へのポインタ
11  * @param r_idx 読み込み先モンスターID(種族特定用)
12  * @return なし
13  */
14 void rd_lore(monster_race *r_ptr, MONRACE_IDX r_idx)
15 {
16     s16b tmp16s;
17     rd_s16b(&tmp16s);
18     r_ptr->r_sights = (MONSTER_NUMBER)tmp16s;
19
20     rd_s16b(&tmp16s);
21     r_ptr->r_deaths = (MONSTER_NUMBER)tmp16s;
22
23     rd_s16b(&tmp16s);
24     r_ptr->r_pkills = (MONSTER_NUMBER)tmp16s;
25
26     if (h_older_than(1, 7, 0, 5)) {
27         r_ptr->r_akills = r_ptr->r_pkills;
28     } else {
29         rd_s16b(&tmp16s);
30         r_ptr->r_akills = (MONSTER_NUMBER)tmp16s;
31     }
32
33     rd_s16b(&tmp16s);
34     r_ptr->r_tkills = (MONSTER_NUMBER)tmp16s;
35
36     rd_byte(&r_ptr->r_wake);
37     rd_byte(&r_ptr->r_ignore);
38     rd_byte(&r_ptr->r_xtra1);
39     rd_byte(&r_ptr->r_xtra2);
40
41     byte tmp8u;
42     rd_byte(&tmp8u);
43     r_ptr->r_drop_gold = (ITEM_NUMBER)tmp8u;
44     rd_byte(&tmp8u);
45     r_ptr->r_drop_item = (ITEM_NUMBER)tmp8u;
46
47     rd_byte(&tmp8u);
48     rd_byte(&r_ptr->r_cast_spell);
49
50     rd_byte(&r_ptr->r_blows[0]);
51     rd_byte(&r_ptr->r_blows[1]);
52     rd_byte(&r_ptr->r_blows[2]);
53     rd_byte(&r_ptr->r_blows[3]);
54
55     rd_u32b(&r_ptr->r_flags1);
56     rd_u32b(&r_ptr->r_flags2);
57     rd_u32b(&r_ptr->r_flags3);
58     if (loading_savefile_version_is_older_than(3)) {
59         u32b f4, f5, f6;
60         rd_u32b(&f4);
61         rd_u32b(&f5);
62         rd_u32b(&f6);
63         if (h_older_than(1, 5, 0, 3))
64             set_old_lore(r_ptr, f4, r_idx);
65         else
66             rd_u32b(&r_ptr->r_flagsr);
67
68         auto migrate = [r_ptr](u32b f, int start_idx) {
69             std::bitset<32> flag_bits(f);
70             for (size_t i = 0; i < flag_bits.size(); i++) {
71                 auto ability = static_cast<RF_ABILITY>(start_idx + i);
72                 r_ptr->r_ability_flags[ability] = flag_bits[i];
73             }
74         };
75         migrate(f4, 0);
76         migrate(f5, 32);
77         migrate(f6, 64);
78     } else {
79         rd_u32b(&r_ptr->r_flagsr);
80         rd_FlagGroup(r_ptr->r_ability_flags, rd_byte);
81     }
82
83     rd_byte(&tmp8u);
84     r_ptr->max_num = (MONSTER_NUMBER)tmp8u;
85
86     rd_s16b(&r_ptr->floor_id);
87     rd_byte(&tmp8u);
88
89     r_ptr->r_flags1 &= r_ptr->flags1;
90     r_ptr->r_flags2 &= r_ptr->flags2;
91     r_ptr->r_flags3 &= r_ptr->flags3;
92     r_ptr->r_flagsr &= r_ptr->flagsr;
93     r_ptr->r_ability_flags &= r_ptr->ability_flags;
94 }
95
96 errr load_lore(void)
97 {
98     u16b loading_max_r_idx;
99     rd_u16b(&loading_max_r_idx);
100
101     monster_race *r_ptr;
102     monster_race dummy;
103     for (int i = 0; i < loading_max_r_idx; i++) {
104         if (i < max_r_idx)
105             r_ptr = &r_info[i];
106         else
107             r_ptr = &dummy;
108
109         rd_lore(r_ptr, (MONRACE_IDX)i);
110     }
111
112     if (arg_fiddle)
113         load_note(_("モンスターの思い出をロードしました", "Loaded Monster Memory"));
114
115     return 0;
116 }