1 #include "info-reader/ego-reader.h"
2 #include "info-reader/kind-info-tokens-table.h"
3 #include "main/angband-headers.h"
4 #include "object-enchant/object-ego.h"
5 #include "object-enchant/tr-types.h"
6 #include "util/bit-flags-calculator.h"
7 #include "util/string-processor.h"
8 #include "view/display-messages.h"
13 * @brief テキストトークンを走査してフラグを一つ得る(エゴ用) /
14 * Grab one flag in a ego-item_type from a textual string
15 * @param e_ptr 保管先のエゴ構造体参照ポインタ
16 * @param what 参照元の文字列ポインタ
17 * @return エラーがあった場合1、エラーがない場合0を返す
19 static bool grab_one_ego_item_flag(ego_item_type *e_ptr, concptr what)
21 for (int i = 0; i < TR_FLAG_MAX; i++) {
22 if (streq(what, k_info_flags[i])) {
23 add_flag(e_ptr->flags, i);
28 if (FlagGroup<TRG>::grab_one_flag(e_ptr->gen_flags, k_info_gen_flags, what))
31 msg_format(_("未知の名のあるアイテム・フラグ '%s'。", "Unknown ego-item flag '%s'."), what);
35 static bool grab_ego_generate_flags(ego_generate_type &xtra, concptr what)
37 for (int i = 0; i < TR_FLAG_MAX; i++) {
38 if (streq(what, k_info_flags[i])) {
39 xtra.tr_flags.push_back(static_cast<tr_type>(i));
44 auto it = k_info_gen_flags.find(what);
45 if (it != k_info_gen_flags.end()) {
46 xtra.trg_flags.push_back(it->second);
55 * @brief アイテムエゴ情報(e_info)のパース関数 /
56 * Initialize the "e_info" array, by parsing an ascii "template" file
61 errr parse_e_info(char *buf, angband_header *head)
63 static ego_item_type *e_ptr = NULL;
68 s = angband_strchr(buf + 2, ':');
77 int i = atoi(buf + 2);
80 if (i >= head->info_num)
86 e_ptr->name = std::string(s);
94 else if (buf[0] == 'E') {
98 else if (buf[0] == 'E') {
100 e_ptr->name = std::string(s);
103 else if (buf[0] == 'X') {
105 if (2 != sscanf(buf + 2, "%d:%d", &slot, &rating))
108 e_ptr->slot = (INVENTORY_IDX)slot;
109 e_ptr->rating = (PRICE)rating;
110 } else if (buf[0] == 'W') {
111 int level, rarity, pad2;
114 if (4 != sscanf(buf + 2, "%d:%d:%d:%ld", &level, &rarity, &pad2, &cost))
117 e_ptr->level = level;
118 e_ptr->rarity = (RARITY)rarity;
120 } else if (buf[0] == 'C') {
121 int th, td, ta, pval;
123 if (4 != sscanf(buf + 2, "%d:%d:%d:%d", &th, &td, &ta, &pval))
126 e_ptr->max_to_h = (HIT_PROB)th;
127 e_ptr->max_to_d = (HIT_POINT)td;
128 e_ptr->max_to_a = (ARMOUR_CLASS)ta;
129 e_ptr->max_pval = (PARAMETER_VALUE)pval;
130 } else if (buf[0] == 'U') {
132 n = grab_one_activation_flag(buf + 2);
138 } else if (buf[0] == 'F') {
139 for (s = buf + 2; *s;) {
141 for (t = s; *t && (*t != ' ') && (*t != '|'); ++t)
146 while ((*t == ' ') || (*t == '|'))
150 if (0 != grab_one_ego_item_flag(e_ptr, s))
155 } else if (buf[0] == 'G') {
156 ego_generate_type xtra;
158 s = angband_strstr(buf + 2, ":");
164 if (2 != sscanf(buf + 2, "%d/%d", &xtra.mul, &xtra.dev))
168 for (t = s; *t && (*t != ' ') && (*t != '|'); ++t)
173 while ((*t == ' ') || (*t == '|'))
177 if (grab_ego_generate_flags(xtra, s))
183 e_ptr->xtra_flags.push_back(std::move(xtra));