OSDN Git Service

Reword English message for giant eagle teleport self effect: original had subject...
[hengband/hengband.git] / src / info-reader / kind-reader.c
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"
10
11 /*!
12  * @brief テキストトークンを走査してフラグを一つ得る(ベースアイテム用) /
13  * Grab one flag in an object_kind from a textual string
14  * @param k_ptr 保管先のベースアイテム構造体参照ポインタ
15  * @param what 参照元の文字列ポインタ
16  * @return エラーコード
17  */
18 static errr grab_one_kind_flag(object_kind *k_ptr, concptr what)
19 {
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);
23             return 0;
24         }
25     }
26
27     if (grab_one_flag(&k_ptr->gen_flags, k_info_gen_flags, what) == 0)
28         return 0;
29
30     msg_format(_("未知のアイテム・フラグ '%s'。", "Unknown object flag '%s'."), what);
31     return 1;
32 }
33
34 /*!
35  * @brief ベースアイテム(k_info)のパース関数 /
36  * Initialize the "k_info" array, by parsing an ascii "template" file
37  * @param buf テキスト列
38  * @param head ヘッダ構造体
39  * @return エラーコード
40  */
41 errr parse_k_info(char *buf, angband_header *head)
42 {
43     static object_kind *k_ptr = NULL;
44
45     char *s, *t;
46     if (buf[0] == 'N') {
47 #ifdef JP
48         char *flavor;
49 #endif
50         s = angband_strchr(buf + 2, ':');
51         if (!s)
52             return 1;
53
54         *s++ = '\0';
55         int i = atoi(buf + 2);
56
57         if (i <= error_idx)
58             return 4;
59         if (i >= head->info_num)
60             return 2;
61
62         error_idx = i;
63         k_ptr = &k_info[i];
64
65 #ifdef JP
66         if (!*s)
67             return 1;
68
69         flavor = angband_strchr(s, ':');
70         if (flavor) {
71             *flavor++ = '\0';
72             if (!add_name(&k_ptr->flavor_name, head, flavor))
73                 return 7;
74         }
75
76         if (!add_name(&k_ptr->name, head, s))
77             return 7;
78 #endif
79     } else if (!k_ptr) {
80         return 3;
81     }
82 #ifdef JP
83     /* 英語名を読むルーチンを追加 */
84     /* 'E' から始まる行は英語名としている */
85     else if (buf[0] == 'E') {
86         /* nothing to do */
87     }
88 #else
89     else if (buf[0] == 'E') {
90         char *flavor;
91         s = buf + 2;
92         flavor = angband_strchr(s, ':');
93         if (flavor) {
94             *flavor++ = '\0';
95             if (!add_name(&k_ptr->flavor_name, head, flavor))
96                 return 7;
97         }
98
99         if (!add_name(&k_ptr->name, head, s))
100             return 7;
101     }
102 #endif
103     else if (buf[0] == 'D') {
104 #ifdef JP
105         if (buf[2] == '$')
106             return 0;
107         s = buf + 2;
108 #else
109         if (buf[2] != '$')
110             return 0;
111         s = buf + 3;
112 #endif
113         if (!add_text(&k_ptr->text, head, s, TRUE))
114             return 7;
115     } else if (buf[0] == 'G') {
116         char sym;
117         byte tmp;
118         if (buf[1] != ':')
119             return 1;
120         if (!buf[2])
121             return 1;
122         if (buf[3] != ':')
123             return 1;
124         if (!buf[4])
125             return 1;
126
127         sym = buf[2];
128         tmp = color_char_to_attr(buf[4]);
129         if (tmp > 127)
130             return 1;
131
132         k_ptr->d_attr = tmp;
133         k_ptr->d_char = sym;
134     } else if (buf[0] == 'I') {
135         int tval, sval, pval;
136         if (3 != sscanf(buf + 2, "%d:%d:%d", &tval, &sval, &pval))
137             return 1;
138
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;
144         long cost;
145         if (4 != sscanf(buf + 2, "%d:%d:%d:%ld", &level, &extra, &wgt, &cost))
146             return 1;
147
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') {
153         int i = 0;
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);
161                 if (chance > 0)
162                     k_ptr->chance[i] = (PROB)chance;
163             }
164         }
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))
168             return 1;
169
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') {
177         byte n;
178         n = grab_one_activation_flag(buf + 2);
179         if (n > 0) {
180             k_ptr->act_idx = n;
181         } else {
182             return 5;
183         }
184     } else if (buf[0] == 'F') {
185         for (s = buf + 2; *s;) {
186             /* loop */
187             for (t = s; *t && (*t != ' ') && (*t != '|'); ++t)
188                 ;
189
190             if (*t) {
191                 *t++ = '\0';
192                 while (*t == ' ' || *t == '|')
193                     t++;
194             }
195
196             if (0 != grab_one_kind_flag(k_ptr, s))
197                 return 5;
198             s = t;
199         }
200     } else {
201         return 6;
202     }
203
204     return 0;
205 }