OSDN Git Service

Merge pull request #646 from sikabane-works/release/3.0.0Alpha14
[hengbandforosx/hengbandosx.git] / src / main / game-data-initializer.cpp
1 #include "main/game-data-initializer.h"
2 #include "cmd-io/macro-util.h"
3 #include "dungeon/dungeon.h"
4 #include "dungeon/quest.h"
5 #include "floor/floor-util.h"
6 #include "game-option/option-flags.h"
7 #include "game-option/option-types-table.h"
8 #include "grid/grid.h"
9 #include "monster-race/monster-race.h"
10 #include "object/object-kind.h"
11 #include "system/alloc-entries.h"
12 #include "system/floor-type-definition.h"
13 #include "system/object-type-definition.h"
14 #include "term/gameterm.h"
15 #include "util/angband-files.h"
16 #include "util/quarks.h"
17 #include "util/tag-sorter.h"
18 #include "view/display-messages.h"
19 #include "world/world.h"
20
21 /*!
22  * @brief マクロ登録の最大数 / Maximum number of macros (see "io.c")
23  * @note Default: assume at most 256 macros are used
24  */
25 static const int MACRO_MAX = 256;
26
27 /*!
28  * @brief クエスト情報初期化のメインルーチン /
29  * Initialize quest array
30  * @return エラーコード
31  */
32 errr init_quests(void)
33 {
34     C_MAKE(quest, max_q_idx, quest_type);
35     for (int i = 0; i < max_q_idx; i++)
36         quest[i].status = QUEST_STATUS_UNTAKEN;
37
38     return 0;
39 }
40
41 /*!
42  * @brief その他の初期情報更新 /
43  * Initialize some other arrays
44  * @return エラーコード
45  */
46 errr init_other(player_type *player_ptr)
47 {
48     player_ptr->current_floor_ptr = &floor_info; // TODO:本当はこんなところで初期化したくない
49     floor_type *floor_ptr = player_ptr->current_floor_ptr;
50     C_MAKE(floor_ptr->o_list, current_world_ptr->max_o_idx, object_type);
51     C_MAKE(floor_ptr->m_list, current_world_ptr->max_m_idx, monster_type);
52     for (int i = 0; i < MAX_MTIMED; i++)
53         C_MAKE(floor_ptr->mproc_list[i], current_world_ptr->max_m_idx, s16b);
54
55     C_MAKE(max_dlv, current_world_ptr->max_d_idx, DEPTH);
56     for (int i = 0; i < MAX_HGT; i++)
57         C_MAKE(floor_ptr->grid_array[i], MAX_WID, grid_type);
58
59     C_MAKE(macro__pat, MACRO_MAX, concptr);
60     C_MAKE(macro__act, MACRO_MAX, concptr);
61     C_MAKE(macro__cmd, MACRO_MAX, bool);
62     C_MAKE(macro__buf, FILE_READ_BUFF_SIZE, char);
63     quark_init();
64
65     C_MAKE(message__ptr, MESSAGE_MAX, u32b);
66     C_MAKE(message__buf, MESSAGE_BUF, char);
67     message__tail = MESSAGE_BUF;
68
69     for (int i = 0; option_info[i].o_desc; i++) {
70         int os = option_info[i].o_set;
71         int ob = option_info[i].o_bit;
72         if (!option_info[i].o_var)
73             continue;
74
75         option_mask[os] |= (1UL << ob);
76         if (option_info[i].o_norm)
77             option_flag[os] |= (1UL << ob);
78         else
79             option_flag[os] &= ~(1UL << ob);
80     }
81
82     for (int n = 0; n < 8; n++)
83         for (int i = 0; i < 32; i++)
84             if (window_flag_desc[i])
85                 window_mask[n] |= (1UL << i);
86
87     /*
88      *  Set the "default" window flags
89      *  Window 1 : Display messages
90      *  Window 2 : Display inven/equip
91      */
92     window_flag[1] = 1UL << A_MAX;
93     window_flag[2] = 1UL << 0;
94     (void)format("%s (%s).", "Mr.Hoge", MAINTAINER);
95     return 0;
96 }
97
98 /*!
99  * @brief オブジェクト配列を初期化する /
100  * Initialize some other arrays
101  * @return エラーコード
102  */
103 errr init_object_alloc(void)
104 {
105     s16b aux[MAX_DEPTH];
106     (void)C_WIPE(aux, MAX_DEPTH, s16b);
107
108     s16b num[MAX_DEPTH];
109     (void)C_WIPE(num, MAX_DEPTH, s16b);
110
111     if (alloc_kind_table)
112         C_KILL(alloc_kind_table, alloc_kind_size, alloc_entry);
113
114     alloc_kind_size = 0;
115     for (int i = 1; i < max_k_idx; i++) {
116         object_kind *k_ptr;
117         k_ptr = &k_info[i];
118         for (int j = 0; j < 4; j++) {
119             if (k_ptr->chance[j]) {
120                 alloc_kind_size++;
121                 num[k_ptr->locale[j]]++;
122             }
123         }
124     }
125
126     for (int i = 1; i < MAX_DEPTH; i++)
127         num[i] += num[i - 1];
128
129     if (!num[0])
130         quit(_("町のアイテムがない!", "No town objects!"));
131
132     C_MAKE(alloc_kind_table, alloc_kind_size, alloc_entry);
133     alloc_entry *table;
134     table = alloc_kind_table;
135     for (int i = 1; i < max_k_idx; i++) {
136         object_kind *k_ptr;
137         k_ptr = &k_info[i];
138         for (int j = 0; j < 4; j++) {
139             if (k_ptr->chance[j] == 0)
140                 continue;
141
142             int x = k_ptr->locale[j];
143             int p = (100 / k_ptr->chance[j]);
144             int y = (x > 0) ? num[x - 1] : 0;
145             int z = y + aux[x];
146             table[z].index = (KIND_OBJECT_IDX)i;
147             table[z].level = (DEPTH)x;
148             table[z].prob1 = (PROB)p;
149             table[z].prob2 = (PROB)p;
150             aux[x]++;
151         }
152     }
153
154     return 0;
155 }
156
157 /*!
158  * @brief モンスター配列と生成テーブルを初期化する /
159  * Initialize some other arrays
160  * @return エラーコード
161  */
162 errr init_alloc(void)
163 {
164     monster_race *r_ptr;
165     tag_type *elements;
166     C_MAKE(elements, max_r_idx, tag_type);
167     for (int i = 1; i < max_r_idx; i++) {
168         elements[i].tag = r_info[i].level;
169         elements[i].index = i;
170     }
171
172     tag_sort(elements, max_r_idx);
173     alloc_race_size = max_r_idx;
174     C_MAKE(alloc_race_table, alloc_race_size, alloc_entry);
175     for (int i = 1; i < max_r_idx; i++) {
176         r_ptr = &r_info[elements[i].index];
177         if (r_ptr->rarity == 0)
178             continue;
179
180         int x = r_ptr->level;
181         int p = (100 / r_ptr->rarity);
182         alloc_race_table[i].index = (KIND_OBJECT_IDX)elements[i].index;
183         alloc_race_table[i].level = (DEPTH)x;
184         alloc_race_table[i].prob1 = (PROB)p;
185         alloc_race_table[i].prob2 = (PROB)p;
186     }
187
188     C_KILL(elements, max_r_idx, tag_type);
189     (void)init_object_alloc();
190     return 0;
191 }