1 #include "info-reader/artifact-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 "system/artifact-type-definition.h"
6 #include "util/bit-flags-calculator.h"
7 #include "util/string-processor.h"
8 #include "view/display-messages.h"
12 * @brief テキストトークンを走査してフラグを一つ得る(アーティファクト用) /
13 * Grab one activation index flag
14 * @param a_ptr 保管先のアーティファクト構造体参照ポインタ
15 * @param what 参照元の文字列ポインタ
16 * @return エラーがあった場合1、エラーがない場合0を返す
18 static errr grab_one_artifact_flag(artifact_type *a_ptr, concptr what)
20 for (int i = 0; i < TR_FLAG_MAX; i++) {
21 if (streq(what, k_info_flags[i])) {
22 add_flag(a_ptr->flags, i);
27 if (FlagGroup<TRG>::grab_one_flag(a_ptr->gen_flags, k_info_gen_flags, what))
30 msg_format(_("未知の伝説のアイテム・フラグ '%s'。", "Unknown artifact flag '%s'."), what);
35 * @brief 固定アーティファクト情報(a_info)のパース関数 /
36 * Initialize the "a_info" array, by parsing an ascii "template" file
41 errr parse_a_info(char *buf, angband_header *head)
43 static artifact_type *a_ptr = NULL;
46 s = angband_strchr(buf + 2, ':');
55 int i = atoi(buf + 2);
58 if (i >= head->info_num)
63 add_flag(a_ptr->flags, TR_IGNORE_ACID);
64 add_flag(a_ptr->flags, TR_IGNORE_ELEC);
65 add_flag(a_ptr->flags, TR_IGNORE_FIRE);
66 add_flag(a_ptr->flags, TR_IGNORE_COLD);
68 a_ptr->name = std::string(s);
75 /* 'E' から始まる行は英語名としている */
76 else if (buf[0] == 'E') {
80 else if (buf[0] == 'E') {
82 a_ptr->name = std::string(s);
85 else if (buf[0] == 'D') {
95 a_ptr->text.append(s);
96 } else if (buf[0] == 'I') {
98 if (3 != sscanf(buf + 2, "%d:%d:%d", &tval, &sval, &pval))
101 a_ptr->tval = (tval_type)tval;
102 a_ptr->sval = (OBJECT_SUBTYPE_VALUE)sval;
103 a_ptr->pval = (PARAMETER_VALUE)pval;
104 } else if (buf[0] == 'W') {
105 int level, rarity, wgt;
107 if (4 != sscanf(buf + 2, "%d:%d:%d:%ld", &level, &rarity, &wgt, &cost))
110 a_ptr->level = (DEPTH)level;
111 a_ptr->rarity = (RARITY)rarity;
112 a_ptr->weight = (WEIGHT)wgt;
113 a_ptr->cost = (PRICE)cost;
114 } else if (buf[0] == 'P') {
115 int ac, hd1, hd2, th, td, ta;
116 if (6 != sscanf(buf + 2, "%d:%dd%d:%d:%d:%d", &ac, &hd1, &hd2, &th, &td, &ta))
119 a_ptr->ac = (ARMOUR_CLASS)ac;
120 a_ptr->dd = (DICE_NUMBER)hd1;
121 a_ptr->ds = (DICE_SID)hd2;
122 a_ptr->to_h = (HIT_PROB)th;
123 a_ptr->to_d = (HIT_POINT)td;
124 a_ptr->to_a = (ARMOUR_CLASS)ta;
125 } else if (buf[0] == 'U') {
127 n = grab_one_activation_flag(buf + 2);
133 } else if (buf[0] == 'F') {
134 for (s = buf + 2; *s;) {
136 for (t = s; *t && (*t != ' ') && (*t != '|'); ++t)
141 while ((*t == ' ') || (*t == '|'))
145 if (0 != grab_one_artifact_flag(a_ptr, s))