1 #include "info-reader/kind-reader.h"
2 #include "info-reader/kind-info-tokens-table.h"
3 #include "main/angband-headers.h"
4 #include "object-enchant/tr-types.h"
5 #include "object/object-kind.h"
6 #include "term/gameterm.h"
7 #include "util/bit-flags-calculator.h"
8 #include "util/string-processor.h"
9 #include "view/display-messages.h"
12 * @brief テキストトークンを走査してフラグを一つ得る(ベースアイテム用) /
13 * Grab one flag in an object_kind from a textual string
14 * @param k_ptr 保管先のベースアイテム構造体参照ポインタ
15 * @param what 参照元の文字列ポインタ
18 static errr grab_one_kind_flag(object_kind *k_ptr, concptr what)
20 for (int i = 0; i < TR_FLAG_MAX; i++) {
21 if (streq(what, k_info_flags[i])) {
22 add_flag(k_ptr->flags, i);
27 if (grab_one_flag(&k_ptr->gen_flags, k_info_gen_flags, what) == 0)
30 msg_format(_("未知のアイテム・フラグ '%s'。", "Unknown object flag '%s'."), what);
35 * @brief ベースアイテム(k_info)のパース関数 /
36 * Initialize the "k_info" array, by parsing an ascii "template" file
41 errr parse_k_info(char *buf, angband_header *head)
43 static object_kind *k_ptr = NULL;
50 s = angband_strchr(buf + 2, ':');
55 int i = atoi(buf + 2);
59 if (i >= head->info_num)
69 flavor = angband_strchr(s, ':');
72 if (!add_name(&k_ptr->flavor_name, head, flavor))
76 if (!add_name(&k_ptr->name, head, s))
84 /* 'E' から始まる行は英語名としている */
85 else if (buf[0] == 'E') {
89 else if (buf[0] == 'E') {
92 flavor = angband_strchr(s, ':');
95 if (!add_name(&k_ptr->flavor_name, head, flavor))
99 if (!add_name(&k_ptr->name, head, s))
103 else if (buf[0] == 'D') {
113 if (!add_text(&k_ptr->text, head, s, TRUE))
115 } else if (buf[0] == 'G') {
128 tmp = color_char_to_attr(buf[4]);
134 } else if (buf[0] == 'I') {
135 int tval, sval, pval;
136 if (3 != sscanf(buf + 2, "%d:%d:%d", &tval, &sval, &pval))
139 k_ptr->tval = (tval_type)tval;
140 k_ptr->sval = (OBJECT_SUBTYPE_VALUE)sval;
141 k_ptr->pval = (PARAMETER_VALUE)pval;
142 } else if (buf[0] == 'W') {
143 int level, extra, wgt;
145 if (4 != sscanf(buf + 2, "%d:%d:%d:%ld", &level, &extra, &wgt, &cost))
148 k_ptr->level = (DEPTH)level;
149 k_ptr->extra = (BIT_FLAGS8)extra;
150 k_ptr->weight = (WEIGHT)wgt;
151 k_ptr->cost = (PRICE)cost;
152 } else if (buf[0] == 'A') {
154 for (s = buf + 1; s && (s[0] == ':') && s[1]; ++i) {
155 k_ptr->chance[i] = 1;
156 k_ptr->locale[i] = atoi(s + 1);
157 t = angband_strchr(s + 1, '/');
158 s = angband_strchr(s + 1, ':');
159 if (t && (!s || t < s)) {
160 int chance = atoi(t + 1);
162 k_ptr->chance[i] = (PROB)chance;
165 } else if (buf[0] == 'P') {
166 int ac, hd1, hd2, th, td, ta;
167 if (6 != sscanf(buf + 2, "%d:%dd%d:%d:%d:%d", &ac, &hd1, &hd2, &th, &td, &ta))
170 k_ptr->ac = (ARMOUR_CLASS)ac;
171 k_ptr->dd = (DICE_NUMBER)hd1;
172 k_ptr->ds = (DICE_SID)hd2;
173 k_ptr->to_h = (HIT_PROB)th;
174 k_ptr->to_d = (HIT_POINT)td;
175 k_ptr->to_a = (ARMOUR_CLASS)ta;
176 } else if (buf[0] == 'U') {
178 n = grab_one_activation_flag(buf + 2);
184 } else if (buf[0] == 'F') {
185 for (s = buf + 2; *s;) {
187 for (t = s; *t && (*t != ' ') && (*t != '|'); ++t)
192 while (*t == ' ' || *t == '|')
196 if (0 != grab_one_kind_flag(k_ptr, s))