2 * @brief ゲームデータ初期化1 / Initialization (part 1) -BEN-
5 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke
6 * 2014 Deskull rearranged comment for Doxygen
9 #include "info-reader/fixed-map-parser.h"
10 #include "dungeon/quest.h"
11 #include "floor/fixed-map-generator.h"
12 #include "game-option/birth-options.h"
13 #include "game-option/runtime-arguments.h"
14 #include "io/files-util.h"
15 #include "main/init-error-messages-table.h"
16 #include "player/player-class.h"
17 #include "player/player-race.h"
18 #include "realm/realm-names-table.h"
19 #include "system/floor-type-definition.h"
20 #include "system/system-variables.h"
21 #include "util/angband-files.h"
22 #include "util/string-processor.h"
23 #include "view/display-messages.h"
24 #include "world/world.h"
27 static concptr variant = "ZANGBAND";
30 * @brief 固定マップ (クエスト&街&広域マップ)生成時の分岐処理
31 * Helper function for "parse_fixed_map()"
32 * @param player_ptr プレーヤーへの参照ポインタ
37 static concptr parse_fixed_map_expression(player_type *player_ptr, char **sp, char *fp)
57 t = parse_fixed_map_expression(player_ptr, &s, &f);
60 } else if (streq(t, "IOR")) {
62 while (*s && (f != b2)) {
63 t = parse_fixed_map_expression(player_ptr, &s, &f);
64 if (*t && !streq(t, "0"))
67 } else if (streq(t, "AND")) {
69 while (*s && (f != b2)) {
70 t = parse_fixed_map_expression(player_ptr, &s, &f);
71 if (*t && streq(t, "0"))
74 } else if (streq(t, "NOT")) {
76 while (*s && (f != b2)) {
77 t = parse_fixed_map_expression(player_ptr, &s, &f);
78 if (*t && streq(t, "1"))
81 } else if (streq(t, "EQU")) {
83 if (*s && (f != b2)) {
84 t = parse_fixed_map_expression(player_ptr, &s, &f);
87 while (*s && (f != b2)) {
88 p = parse_fixed_map_expression(player_ptr, &s, &f);
92 } else if (streq(t, "LEQ")) {
94 if (*s && (f != b2)) {
95 t = parse_fixed_map_expression(player_ptr, &s, &f);
98 while (*s && (f != b2)) {
100 t = parse_fixed_map_expression(player_ptr, &s, &f);
101 if (*t && atoi(p) > atoi(t))
104 } else if (streq(t, "GEQ")) {
106 if (*s && (f != b2)) {
107 t = parse_fixed_map_expression(player_ptr, &s, &f);
110 while (*s && (f != b2)) {
112 t = parse_fixed_map_expression(player_ptr, &s, &f);
113 if (*t && atoi(p) < atoi(t))
117 while (*s && (f != b2)) {
118 t = parse_fixed_map_expression(player_ptr, &s, &f);
124 if ((f = *s) != '\0')
133 while (iskanji(*s) || (isprint(*s) && !angband_strchr(" []", *s))) {
139 while (isprint(*s) && !angband_strchr(" []", *s))
142 if ((f = *s) != '\0')
152 if (streq(b + 1, "SYS")) {
154 } else if (streq(b + 1, "GRAF")) {
156 } else if (streq(b + 1, "MONOCHROME")) {
161 } else if (streq(b + 1, "RACE")) {
162 v = _(rp_ptr->E_title, rp_ptr->title);
163 } else if (streq(b + 1, "CLASS")) {
164 v = _(cp_ptr->E_title, cp_ptr->title);
165 } else if (streq(b + 1, "REALM1")) {
166 v = _(E_realm_names[player_ptr->realm1], realm_names[player_ptr->realm1]);
167 } else if (streq(b + 1, "REALM2")) {
168 v = _(E_realm_names[player_ptr->realm2], realm_names[player_ptr->realm2]);
169 } else if (streq(b + 1, "PLAYER")) {
170 static char tmp_player_name[32];
172 for (pn = player_ptr->name, tpn = tmp_player_name; *pn; pn++, tpn++) {
180 *tpn = angband_strchr(" []", *pn) ? '_' : *pn;
185 } else if (streq(b + 1, "TOWN")) {
186 sprintf(tmp, "%d", player_ptr->town_num);
188 } else if (streq(b + 1, "LEVEL")) {
189 sprintf(tmp, "%d", player_ptr->lev);
191 } else if (streq(b + 1, "QUEST_NUMBER")) {
192 sprintf(tmp, "%d", player_ptr->current_floor_ptr->inside_quest);
194 } else if (streq(b + 1, "LEAVING_QUEST")) {
195 sprintf(tmp, "%d", leaving_quest);
197 } else if (prefix(b + 1, "QUEST_TYPE")) {
198 sprintf(tmp, "%d", quest[atoi(b + 11)].type);
200 } else if (prefix(b + 1, "QUEST")) {
201 sprintf(tmp, "%d", quest[atoi(b + 6)].status);
203 } else if (prefix(b + 1, "RANDOM")) {
204 sprintf(tmp, "%d", (int)(current_world_ptr->seed_town % atoi(b + 7)));
206 } else if (streq(b + 1, "VARIANT")) {
208 } else if (streq(b + 1, "WILDERNESS")) {
210 sprintf(tmp, "NONE");
212 sprintf(tmp, "LITE");
214 sprintf(tmp, "NORMAL");
224 * @brief 固定マップ (クエスト&街&広域マップ)をq_info、t_info、w_infoから読み込んでパースする
225 * @param player_ptr プレーヤーへの参照ポインタ
233 errr parse_fixed_map(player_type *player_ptr, concptr name, int ymin, int xmin, int ymax, int xmax)
236 path_build(buf, sizeof(buf), ANGBAND_DIR_EDIT, name);
238 fp = angband_fopen(buf, "r");
243 parse_error_type err = PARSE_ERROR_NONE;
245 int x = xmin, y = ymin;
247 qtwg_type *qg_ptr = initialize_quest_generator_type(&tmp_qg, buf, ymin, xmin, ymax, xmax, &y, &x);
248 while (angband_fgets(fp, buf, sizeof(buf)) == 0) {
252 if (iswspace(buf[0]))
256 if ((buf[0] == '?') && (buf[1] == ':')) {
260 concptr v = parse_fixed_map_expression(player_ptr, &s, &f);
261 bypass = (streq(v, "0") ? TRUE : FALSE);
268 err = generate_fixed_map_floor(player_ptr, qg_ptr, parse_fixed_map);
274 concptr oops = (((err > 0) && (err < PARSE_ERROR_MAX)) ? err_str[err] : "unknown");
275 msg_format("Error %d (%s) at line %d of '%s'.", err, oops, num, name);
276 msg_format(_("'%s'を解析中。", "Parsing '%s'."), buf);