OSDN Git Service

Merge pull request #3569 from sikabane-works/release/3.0.0.88-alpha
[hengbandforosx/hengbandosx.git] / src / load / load-zangband.cpp
1 #include "load/load-zangband.h"
2 #include "avatar/avatar.h"
3 #include "cmd-building/cmd-building.h"
4 #include "dungeon/quest.h"
5 #include "game-option/option-flags.h"
6 #include "info-reader/fixed-map-parser.h"
7 #include "load/angband-version-comparer.h"
8 #include "load/load-util.h"
9 #include "market/bounty.h"
10 #include "monster-race/monster-race.h"
11 #include "pet/pet-util.h"
12 #include "player-base/player-class.h"
13 #include "player-info/class-info.h"
14 #include "player-info/race-info.h"
15 #include "player/attack-defense-types.h"
16 #include "player/patron.h"
17 #include "player/player-personality.h"
18 #include "player/player-skill.h"
19 #include "realm/realm-types.h"
20 #include "spell/spells-status.h"
21 #include "system/dungeon-info.h"
22 #include "system/floor-type-definition.h"
23 #include "system/monster-race-info.h"
24 #include "system/player-type-definition.h"
25 #include "system/system-variables.h"
26 #include "world/world.h"
27
28 void load_zangband_options(void)
29 {
30     if (g_option_flags[5] & (0x00000001U << 4)) {
31         g_option_flags[5] &= ~(0x00000001U << 4);
32     } else {
33         g_option_flags[5] |= (0x00000001U << 4);
34     }
35
36     if (g_option_flags[2] & (0x00000001U << 5)) {
37         g_option_flags[2] &= ~(0x00000001U << 5);
38     } else {
39         g_option_flags[2] |= (0x00000001U << 5);
40     }
41
42     if (g_option_flags[4] & (0x00000001U << 5)) {
43         g_option_flags[4] &= ~(0x00000001U << 5);
44     } else {
45         g_option_flags[4] |= (0x00000001U << 5);
46     }
47
48     if (g_option_flags[5] & (0x00000001U << 0)) {
49         g_option_flags[5] &= ~(0x00000001U << 0);
50     } else {
51         g_option_flags[5] |= (0x00000001U << 0);
52     }
53
54     if (g_option_flags[5] & (0x00000001U << 12)) {
55         g_option_flags[5] &= ~(0x00000001U << 12);
56     } else {
57         g_option_flags[5] |= (0x00000001U << 12);
58     }
59
60     if (g_option_flags[1] & (0x00000001U << 0)) {
61         g_option_flags[1] &= ~(0x00000001U << 0);
62     } else {
63         g_option_flags[1] |= (0x00000001U << 0);
64     }
65
66     if (g_option_flags[1] & (0x00000001U << 18)) {
67         g_option_flags[1] &= ~(0x00000001U << 18);
68     } else {
69         g_option_flags[1] |= (0x00000001U << 18);
70     }
71
72     if (g_option_flags[1] & (0x00000001U << 19)) {
73         g_option_flags[1] &= ~(0x00000001U << 19);
74     } else {
75         g_option_flags[1] |= (0x00000001U << 19);
76     }
77
78     if (g_option_flags[5] & (0x00000001U << 3)) {
79         g_option_flags[1] &= ~(0x00000001U << 3);
80     } else {
81         g_option_flags[5] |= (0x00000001U << 3);
82     }
83 }
84
85 void set_zangband_realm(PlayerType *player_ptr)
86 {
87     if (player_ptr->realm1 == 9) {
88         player_ptr->realm1 = REALM_MUSIC;
89     }
90
91     if (player_ptr->realm2 == 9) {
92         player_ptr->realm2 = REALM_MUSIC;
93     }
94
95     if (player_ptr->realm1 == 10) {
96         player_ptr->realm1 = REALM_HISSATSU;
97     }
98
99     if (player_ptr->realm2 == 10) {
100         player_ptr->realm2 = REALM_HISSATSU;
101     }
102 }
103
104 void set_zangband_skill(PlayerType *player_ptr)
105 {
106     if (!PlayerClass(player_ptr).equals(PlayerClassType::BEASTMASTER)) {
107         player_ptr->skill_exp[PlayerSkillKindType::RIDING] /= 2;
108     }
109
110     player_ptr->skill_exp[PlayerSkillKindType::RIDING] = std::min(player_ptr->skill_exp[PlayerSkillKindType::RIDING], class_skills_info[enum2i(player_ptr->pclass)].s_max[PlayerSkillKindType::RIDING]);
111 }
112
113 void set_zangband_race(PlayerType *player_ptr)
114 {
115     player_ptr->start_race = player_ptr->prace;
116     player_ptr->old_race1 = 0L;
117     player_ptr->old_race2 = 0L;
118     player_ptr->old_realm = 0;
119 }
120
121 void set_zangband_bounty_uniques(PlayerType *player_ptr)
122 {
123     determine_bounty_uniques(player_ptr);
124     for (auto &[r_idx, is_achieved] : w_ptr->bounties) {
125         /* Is this bounty unique already dead? */
126         if (monraces_info[r_idx].max_num == 0) {
127             is_achieved = true;
128         }
129     }
130 }
131
132 void set_zangband_mimic(PlayerType *player_ptr)
133 {
134     player_ptr->tim_res_time = 0;
135     player_ptr->mimic_form = MimicKindType::NONE;
136     player_ptr->tim_mimic = 0;
137     player_ptr->tim_sh_fire = 0;
138 }
139
140 void set_zangband_holy_aura(PlayerType *player_ptr)
141 {
142     player_ptr->tim_sh_holy = 0;
143     player_ptr->tim_eyeeye = 0;
144 }
145
146 void set_zangband_reflection(PlayerType *player_ptr)
147 {
148     player_ptr->tim_reflect = 0;
149     player_ptr->multishadow = 0;
150     player_ptr->dustrobe = 0;
151 }
152
153 void rd_zangband_dungeon()
154 {
155     max_dlv[DUNGEON_ANGBAND] = rd_s16b();
156 }
157
158 void set_zangband_game_turns(PlayerType *player_ptr)
159 {
160     player_ptr->current_floor_ptr->generated_turn /= 2;
161     player_ptr->feeling_turn /= 2;
162     w_ptr->game_turn /= 2;
163     w_ptr->dungeon_turn /= 2;
164 }
165
166 void set_zangband_gambling_monsters(int i)
167 {
168     mon_odds[i] = rd_s16b();
169 }
170
171 void set_zangband_special_attack(PlayerType *player_ptr)
172 {
173     if (rd_byte() != 0) {
174         player_ptr->special_attack = ATTACK_CONFUSE;
175     }
176
177     player_ptr->ele_attack = 0;
178 }
179
180 void set_zangband_special_defense(PlayerType *player_ptr)
181 {
182     player_ptr->ele_immune = 0;
183     player_ptr->special_defense = 0;
184 }
185
186 void set_zangband_action(PlayerType *player_ptr)
187 {
188     if (rd_byte() != 0) {
189         player_ptr->action = ACTION_LEARN;
190     }
191 }
192
193 void set_zangband_visited_towns(PlayerType *player_ptr)
194 {
195     strip_bytes(4);
196     player_ptr->visit = 1L;
197 }
198
199 void set_zangband_quest(PlayerType *player_ptr, QuestType *const q_ptr, const QuestId loading_quest_index, const QuestId old_inside_quest)
200 {
201     if (q_ptr->flags & QUEST_FLAG_PRESET) {
202         q_ptr->dungeon = 0;
203         return;
204     }
205
206     init_flags = INIT_ASSIGN;
207     player_ptr->current_floor_ptr->quest_number = loading_quest_index;
208     parse_fixed_map(player_ptr, QUEST_DEFINITION_LIST, 0, 0, 0, 0);
209     player_ptr->current_floor_ptr->quest_number = old_inside_quest;
210 }
211
212 void set_zangband_class(PlayerType *player_ptr)
213 {
214     PlayerClass pc(player_ptr);
215     if (h_older_than(0, 2, 2) && pc.equals(PlayerClassType::BEASTMASTER) && !player_ptr->is_dead) {
216         player_ptr->hitdie = rp_ptr->r_mhp + cp_ptr->c_mhp + ap_ptr->a_mhp;
217         roll_hitdice(player_ptr, SPOP_NONE);
218     }
219
220     if (h_older_than(0, 3, 2) && pc.equals(PlayerClassType::ARCHER) && !player_ptr->is_dead) {
221         player_ptr->hitdie = rp_ptr->r_mhp + cp_ptr->c_mhp + ap_ptr->a_mhp;
222         roll_hitdice(player_ptr, SPOP_NONE);
223     }
224
225     if (h_older_than(0, 2, 6) && pc.equals(PlayerClassType::SORCERER) && !player_ptr->is_dead) {
226         player_ptr->hitdie = rp_ptr->r_mhp / 2 + cp_ptr->c_mhp + ap_ptr->a_mhp;
227         roll_hitdice(player_ptr, SPOP_NONE);
228     }
229
230     if (h_older_than(0, 4, 7) && pc.equals(PlayerClassType::BLUE_MAGE) && !player_ptr->is_dead) {
231         player_ptr->hitdie = rp_ptr->r_mhp + cp_ptr->c_mhp + ap_ptr->a_mhp;
232         roll_hitdice(player_ptr, SPOP_NONE);
233     }
234 }
235
236 void set_zangband_learnt_spells(PlayerType *player_ptr)
237 {
238     player_ptr->learned_spells = 0;
239     for (int i = 0; i < 64; i++) {
240         if ((i < 32) ? (player_ptr->spell_learned1 & (1UL << i)) : (player_ptr->spell_learned2 & (1UL << (i - 32)))) {
241             player_ptr->learned_spells++;
242         }
243     }
244 }
245
246 void set_zangband_pet(PlayerType *player_ptr)
247 {
248     player_ptr->pet_extra_flags = 0;
249     if (rd_byte() != 0) {
250         player_ptr->pet_extra_flags |= PF_OPEN_DOORS;
251     }
252
253     if (rd_byte() != 0) {
254         player_ptr->pet_extra_flags |= PF_PICKUP_ITEMS;
255     }
256
257     if (h_older_than(0, 0, 4)) {
258         player_ptr->pet_extra_flags |= PF_TELEPORT;
259     } else {
260         if (rd_byte() != 0) {
261             player_ptr->pet_extra_flags |= PF_TELEPORT;
262         }
263     }
264
265     if (h_older_than(0, 0, 7)) {
266         player_ptr->pet_extra_flags |= PF_ATTACK_SPELL;
267     } else {
268         if (rd_byte() != 0) {
269             player_ptr->pet_extra_flags |= PF_ATTACK_SPELL;
270         }
271     }
272
273     if (h_older_than(0, 0, 8)) {
274         player_ptr->pet_extra_flags |= PF_SUMMON_SPELL;
275     } else {
276         if (rd_byte() != 0) {
277             player_ptr->pet_extra_flags |= PF_SUMMON_SPELL;
278         }
279     }
280
281     if (h_older_than(0, 0, 8)) {
282         return;
283     }
284
285     if (rd_byte() != 0) {
286         player_ptr->pet_extra_flags |= PF_BALL_SPELL;
287     }
288 }