# Road Flags: Sum of NORTH 1, SOUTH 2, EAST 4, WEST 8
+# Maximum width
+M:WX:99
+
+# Maximum height
+M:WY:66
+
?:[EQU $WILDERNESS NORMAL]
# Edge of the world
+++ /dev/null
-# File: misc.txt
-
-# Maximum x size of the wilderness
-M:WX:99
-
-# Maximum y size of the wilderness
-M:WY:66
return true;
}
-static bool parse_qtw_M(qtwg_type *qtwg_ptr, char **zz)
-{
- if (qtwg_ptr->buf[0] != 'M') {
- return false;
- }
-
- if ((tokenize(qtwg_ptr->buf + 2, 2, zz, 0) == 2) == 0) {
- return true;
- }
-
- if (zz[0][0] == 'W') {
- if (zz[0][1] == 'X') {
- w_ptr->max_wild_x = (POSITION)atoi(zz[1]);
- }
-
- if (zz[0][1] == 'Y') {
- w_ptr->max_wild_y = (POSITION)atoi(zz[1]);
- }
- }
-
- return true;
-}
-
/*!
* @brief 固定マップ (クエスト&街&広域マップ)をフロアに生成する
* Parse a sub-file of the "extra info"
return parse_line_building(qtwg_ptr->buf);
}
- if (parse_qtw_M(qtwg_ptr, zz)) {
+ // 荒野の広さを表すタグ。初期化時に読み込むのでそれ以降は無視する.
+ if (qtwg_ptr->buf[0] == 'M') {
return PARSE_ERROR_NONE;
}
constexpr auto MAX_FEAT_IN_TERRAIN = 18;
std::vector<std::vector<wilderness_type>> wilderness;
-bool generate_encounter;
+static bool generate_encounter;
struct border_type {
int16_t north[MAX_WID];
}
/*!
- * @brief ゲーム開始時の荒野初期化メインルーチン /
- * Initialize wilderness array
- * @return エラーコード
- */
-errr init_wilderness(void)
-{
- wilderness.assign(w_ptr->max_wild_y, std::vector<wilderness_type>(w_ptr->max_wild_x));
-
- generate_encounter = false;
- return 0;
-}
-
-/*!
* @brief 荒野の地勢設定を初期化する /
* Initialize wilderness array
* @param terrain 初期化したい地勢ID
MAX_FEAT_IN_TERRAIN - 8);
}
+void init_wilderness_encounter()
+{
+ generate_encounter = false;
+}
+
/*!
* @brief 荒野から広域マップへの切り替え処理 /
* Initialize arrays for wilderness terrains
void set_floor_and_wall(DUNGEON_IDX type);
void wilderness_gen(PlayerType *player_ptr);
void wilderness_gen_small(PlayerType *player_ptr);
-errr init_wilderness(void);
-void init_wilderness_terrains(void);
+void init_wilderness_terrains();
+void init_wilderness_encounter();
void seed_wilderness(void);
parse_error_type parse_line_wilderness(PlayerType *player_ptr, char *buf, int xmin, int xmax, int *y, int *x);
bool change_wild_mode(PlayerType *player_ptr, bool encount);
void (*init_note)(concptr) = (no_term ? init_note_no_term : init_note_term);
- init_note(_("[変数を初期化しています...(その他)", "[Initializing values... (misc)]"));
- if (init_misc(player_ptr)) {
- quit(_("その他の変数を初期化できません", "Cannot initialize misc. values"));
- }
-
init_note(_("[データの初期化中... (地形)]", "[Initializing arrays... (features)]"));
if (init_terrains_info()) {
quit(_("地形初期化不能", "Cannot initialize features"));
}
init_note(_("[配列を初期化しています... (荒野)]", "[Initializing arrays... (wilderness)]"));
- if (init_wilderness()) {
+ if (!init_wilderness()) {
quit(_("荒野を初期化できません", "Cannot initialize wilderness"));
}
*/
#include "main/info-initializer.h"
+#include "floor/wild.h"
#include "info-reader/artifact-reader.h"
#include "info-reader/baseitem-reader.h"
#include "info-reader/dungeon-reader.h"
#include "system/player-type-definition.h"
#include "system/terrain-type-definition.h"
#include "util/angband-files.h"
+#include "util/string-processor.h"
#include "view/display-messages.h"
#include "world/world.h"
+#include <fstream>
+#include <string>
+#include <string_view>
#include <sys/stat.h>
#ifndef WINDOWS
#include <sys/types.h>
#endif
-#include <string_view>
namespace {
return init_info("VaultDefinitions.txt", vaults_header, vaults_info, parse_vaults_info);
}
+static bool read_wilderness_definition(std::ifstream &ifs)
+{
+ std::string line;
+ while (!ifs.eof()) {
+ if (!std::getline(ifs, line)) {
+ return false;
+ }
+
+ if (line.empty() || line.starts_with('#')) {
+ continue;
+ }
+
+ auto splits = str_split(line, ':');
+ if ((splits.size() != 3) || (splits[0] != "M")) {
+ continue;
+ }
+
+ if (splits[1] == "WX") {
+ w_ptr->max_wild_x = std::stoi(splits[2]);
+ } else if (splits[1] == "WY") {
+ w_ptr->max_wild_y = std::stoi(splits[2]);
+ } else {
+ return false;
+ }
+
+ if ((w_ptr->max_wild_x > 0) && (w_ptr->max_wild_y > 0)) {
+ wilderness.assign(w_ptr->max_wild_y, std::vector<wilderness_type>(w_ptr->max_wild_x));
+ init_wilderness_encounter();
+ return true;
+ }
+ }
+
+ return false;
+}
+
/*!
- * @brief 基本情報読み込みのメインルーチン
- * @param player_ptr プレイヤーへの参照ポインタ
- * @return エラーコード
+ * @brief 荒野情報読み込み処理
+ * @return 読み込みに成功したか
*/
-errr init_misc(PlayerType *player_ptr)
+bool init_wilderness()
{
- return parse_fixed_map(player_ptr, "misc.txt", 0, 0, 0, 0);
+ char path[1024]{};
+ path_build(path, sizeof(path), ANGBAND_DIR_EDIT, WILDERNESS_DEFINITION);
+ std::ifstream ifs(path);
+ if (!ifs) {
+ return false;
+ }
+
+ return read_wilderness_definition(ifs);
}
errr init_monster_race_definitions();
errr init_terrains_info();
errr init_vaults_info();
-errr init_misc(PlayerType *player_ptr);
+bool init_wilderness();