OSDN Git Service

Merge pull request #3532 from sikabane-works/release/3.0.0.87-alpha
[hengbandforosx/hengbandosx.git] / src / info-reader / vault-reader.cpp
1 #include "info-reader/vault-reader.h"
2 #include "info-reader/info-reader-util.h"
3 #include "info-reader/parse-error-types.h"
4 #include "main/angband-headers.h"
5 #include "room/rooms-vault.h"
6 #include "util/string-processor.h"
7
8 /*!
9  * @brief Vault定義 (VaultDefinitions)のパース関数
10  * @param buf テキスト列
11  * @param head ヘッダ構造体
12  * @return エラーコード
13  */
14 errr parse_vaults_info(std::string_view buf, angband_header *)
15 {
16     static vault_type *v_ptr = nullptr;
17     const auto &tokens = str_split(buf, ':', false, 5);
18
19     if (tokens[0] == "N") {
20         // N:index:name
21         if (tokens.size() < 3) {
22             return PARSE_ERROR_TOO_FEW_ARGUMENTS;
23         }
24         if (tokens[1].size() == 0 || tokens[2].size() == 0) {
25             return PARSE_ERROR_GENERIC;
26         }
27
28         auto i = std::stoi(tokens[1]);
29         if (i < error_idx) {
30             return PARSE_ERROR_NON_SEQUENTIAL_RECORDS;
31         }
32         if (i >= static_cast<int>(vaults_info.size())) {
33             vaults_info.resize(i + 1);
34         }
35
36         error_idx = i;
37         v_ptr = &vaults_info[i];
38         v_ptr->idx = static_cast<int16_t>(i);
39         v_ptr->name = std::string(tokens[2]);
40     } else if (!v_ptr) {
41         return PARSE_ERROR_MISSING_RECORD_HEADER;
42     } else if (tokens[0] == "D") {
43         // D:MapText
44         if (tokens.size() < 2 || tokens[1].size() == 0) {
45             return PARSE_ERROR_TOO_FEW_ARGUMENTS;
46         }
47
48         v_ptr->text.append(buf.substr(2));
49     } else if (tokens[0] == "X") {
50         // X:type:rate:height:width
51         if (tokens.size() < 5) {
52             return PARSE_ERROR_TOO_FEW_ARGUMENTS;
53         }
54
55         info_set_value(v_ptr->typ, tokens[1]);
56         info_set_value(v_ptr->rat, tokens[2]);
57         info_set_value(v_ptr->hgt, tokens[3]);
58         info_set_value(v_ptr->wid, tokens[4]);
59     } else {
60         return PARSE_ERROR_UNDEFINED_DIRECTIVE;
61     }
62
63     return PARSE_ERROR_NONE;
64 }