OSDN Git Service

512753032f398b2718e4d865d5e40a8ccf7925eb
[hengbandforosx/hengbandosx.git] / src / load / quest-loader.cpp
1 #include "load/quest-loader.h"
2 #include "dungeon/quest.h"
3 #include "floor/floor-town.h"
4 #include "load/angband-version-comparer.h"
5 #include "load/load-util.h"
6 #include "load/load-zangband.h"
7 #include "monster-race/monster-race.h"
8 #include "monster-race/race-flags1.h"
9 #include "monster-race/race-flags7.h"
10 #include "object-enchant/trg-types.h"
11 #include "system/artifact-type-definition.h"
12 #include "system/floor-type-definition.h"
13 #include "system/monster-race-definition.h"
14 #include "system/player-type-definition.h"
15
16 /*!
17  * @brief ランダムクエスト情報の読み込み
18  * @param なし
19  * @details MAX_TRIES: ランダムクエストのモンスターを確定するために試行する回数 /
20  * Maximum number of tries for selection of a proper quest monster
21  */
22 void rd_unique_info(void)
23 {
24     const int MAX_TRIES = 100;
25     for (auto &r_ref : r_info) {
26         r_ref.max_num = MAX_TRIES;
27         if (r_ref.flags1 & RF1_UNIQUE)
28             r_ref.max_num = 1;
29         else if (r_ref.flags7 & RF7_NAZGUL)
30             r_ref.max_num = MAX_NAZGUL_NUM;
31     }
32 }
33
34 errr load_town(void)
35 {
36     uint16_t max_towns_load;
37     rd_u16b(&max_towns_load);
38     if (max_towns_load <= max_towns)
39         return 0;
40
41     load_note(format(_("町が多すぎる(%u)!", "Too many (%u) towns!"), max_towns_load));
42     return 23;
43 }
44
45 errr load_quest_info(uint16_t *max_quests_load, byte *max_rquests_load)
46 {
47     rd_u16b(max_quests_load);
48     if (h_older_than(1, 0, 7))
49         *max_rquests_load = 10;
50     else
51         rd_byte(max_rquests_load);
52
53     if (*max_quests_load <= max_q_idx)
54         return 0;
55
56     load_note(format(_("クエストが多すぎる(%u)!", "Too many (%u) quests!"), *max_quests_load));
57     return 23;
58 }
59
60 static bool check_quest_index(int loading_quest_index)
61 {
62     if (loading_quest_index < max_q_idx)
63         return false;
64
65     strip_bytes(2);
66     strip_bytes(2);
67     return true;
68 }
69
70 static void load_quest_completion(quest_type *q_ptr)
71 {
72     rd_s16b(&q_ptr->status);
73     int16_t tmp16s;
74     rd_s16b(&tmp16s);
75     q_ptr->level = tmp16s;
76
77     if (h_older_than(1, 0, 6))
78         q_ptr->complev = 0;
79     else {
80         byte tmp8u;
81         rd_byte(&tmp8u);
82         q_ptr->complev = tmp8u;
83     }
84
85     if (h_older_than(2, 1, 2, 2))
86         q_ptr->comptime = 0;
87     else
88         rd_u32b(&q_ptr->comptime);
89 }
90
91 static void load_quest_details(player_type *player_ptr, quest_type *q_ptr, int loading_quest_index)
92 {
93     int16_t tmp16s;
94     rd_s16b(&tmp16s);
95     q_ptr->cur_num = (MONSTER_NUMBER)tmp16s;
96     rd_s16b(&tmp16s);
97     q_ptr->max_num = (MONSTER_NUMBER)tmp16s;
98     rd_s16b(&q_ptr->type);
99
100     rd_s16b(&q_ptr->r_idx);
101     if ((q_ptr->type == QUEST_TYPE_RANDOM) && (!q_ptr->r_idx))
102         determine_random_questor(player_ptr, &quest[loading_quest_index]);
103
104     rd_s16b(&q_ptr->k_idx);
105     if (q_ptr->k_idx)
106         a_info[q_ptr->k_idx].gen_flags.set(TRG::QUESTITEM);
107
108     byte tmp8u;
109     rd_byte(&tmp8u);
110     q_ptr->flags = tmp8u;
111 }
112
113 void analyze_quests(player_type *player_ptr, const uint16_t max_quests_load, const byte max_rquests_load)
114 {
115     QUEST_IDX old_inside_quest = player_ptr->current_floor_ptr->inside_quest;
116     for (int i = 0; i < max_quests_load; i++) {
117         if (check_quest_index(i))
118             continue;
119
120         quest_type *const q_ptr = &quest[i];
121         load_quest_completion(q_ptr);
122         bool is_quest_running = (q_ptr->status == QUEST_STATUS_TAKEN);
123         is_quest_running |= (!h_older_than(0, 3, 14) && (q_ptr->status == QUEST_STATUS_COMPLETED));
124         is_quest_running |= (!h_older_than(1, 0, 7) && (i >= MIN_RANDOM_QUEST) && (i <= (MIN_RANDOM_QUEST + max_rquests_load)));
125         if (!is_quest_running)
126             continue;
127
128         load_quest_details(player_ptr, q_ptr, i);
129         if (h_older_than(0, 3, 11))
130             set_zangband_quest(player_ptr, q_ptr, i, old_inside_quest);
131         else {
132             byte tmp8u;
133             rd_byte(&tmp8u);
134             q_ptr->dungeon = tmp8u;
135         }
136
137         if (q_ptr->status == QUEST_STATUS_TAKEN || q_ptr->status == QUEST_STATUS_UNTAKEN)
138             if (r_info[q_ptr->r_idx].flags1 & RF1_UNIQUE)
139                 r_info[q_ptr->r_idx].flags1 |= RF1_QUESTOR;
140     }
141 }