OSDN Git Service

[Refactor] #40014 Separated place-monster-types.h from monster.h
[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 "object-enchant/tr-types.h"
4 #include "object/object-kind.h"
5 #include "term/gameterm.h"
6
7 /*!
8  * @brief \83e\83L\83X\83g\83g\81[\83N\83\93\82ð\91\96\8d¸\82µ\82Ä\83t\83\89\83O\82ð\88ê\82Â\93¾\82é(\83x\81[\83X\83A\83C\83e\83\80\97p) /
9  * Grab one flag in an object_kind from a textual string
10  * @param k_ptr \95Û\8aÇ\90æ\82Ì\83x\81[\83X\83A\83C\83e\83\80\8d\\91¢\91Ì\8eQ\8fÆ\83|\83C\83\93\83^
11  * @param what \8eQ\8fÆ\8c³\82Ì\95\8e\9a\97ñ\83|\83C\83\93\83^
12  * @return \83G\83\89\81[\83R\81[\83h
13  */
14 static errr grab_one_kind_flag(object_kind *k_ptr, concptr what)
15 {
16     for (int i = 0; i < TR_FLAG_MAX; i++) {
17         if (streq(what, k_info_flags[i])) {
18             add_flag(k_ptr->flags, i);
19             return 0;
20         }
21     }
22
23     if (grab_one_flag(&k_ptr->gen_flags, k_info_gen_flags, what) == 0)
24         return 0;
25
26     msg_format(_("\96¢\92m\82Ì\83A\83C\83e\83\80\81E\83t\83\89\83O '%s'\81B", "Unknown object flag '%s'."), what);
27     return 1;
28 }
29
30 /*!
31  * @brief \83x\81[\83X\83A\83C\83e\83\80(k_info)\82Ì\83p\81[\83X\8aÖ\90\94 /
32  * Initialize the "k_info" array, by parsing an ascii "template" file
33  * @param buf \83e\83L\83X\83g\97ñ
34  * @param head \83w\83b\83_\8d\\91¢\91Ì
35  * @return \83G\83\89\81[\83R\81[\83h
36  */
37 errr parse_k_info(char *buf, angband_header *head)
38 {
39     static object_kind *k_ptr = NULL;
40
41     char *s, *t;
42     if (buf[0] == 'N') {
43 #ifdef JP
44         char *flavor;
45 #endif
46         s = my_strchr(buf + 2, ':');
47         if (!s)
48             return 1;
49
50         *s++ = '\0';
51         int i = atoi(buf + 2);
52
53         if (i <= error_idx)
54             return 4;
55         if (i >= head->info_num)
56             return 2;
57
58         error_idx = i;
59         k_ptr = &k_info[i];
60
61 #ifdef JP
62         if (!*s)
63             return 1;
64
65         flavor = my_strchr(s, ':');
66         if (flavor) {
67             *flavor++ = '\0';
68             if (!add_name(&k_ptr->flavor_name, head, flavor))
69                 return 7;
70         }
71
72         if (!add_name(&k_ptr->name, head, s))
73             return 7;
74 #endif
75     } else if (!k_ptr) {
76         return 3;
77     }
78 #ifdef JP
79     /* \89p\8cê\96¼\82ð\93Ç\82Þ\83\8b\81[\83`\83\93\82ð\92Ç\89Á */
80     /* 'E' \82©\82ç\8en\82Ü\82é\8ds\82Í\89p\8cê\96¼\82Æ\82µ\82Ä\82¢\82é */
81     else if (buf[0] == 'E') {
82         /* nothing to do */
83     }
84 #else
85     else if (buf[0] == 'E') {
86         char *flavor;
87         s = buf + 2;
88         flavor = my_strchr(s, ':');
89         if (flavor) {
90             *flavor++ = '\0';
91             if (!add_name(&k_ptr->flavor_name, head, flavor))
92                 return 7;
93         }
94
95         if (!add_name(&k_ptr->name, head, s))
96             return 7;
97     }
98 #endif
99     else if (buf[0] == 'D') {
100 #ifdef JP
101         if (buf[2] == '$')
102             return 0;
103         s = buf + 2;
104 #else
105         if (buf[2] != '$')
106             return 0;
107         s = buf + 3;
108 #endif
109         if (!add_text(&k_ptr->text, head, s, TRUE))
110             return 7;
111     } else if (buf[0] == 'G') {
112         char sym;
113         byte tmp;
114         if (buf[1] != ':')
115             return 1;
116         if (!buf[2])
117             return 1;
118         if (buf[3] != ':')
119             return 1;
120         if (!buf[4])
121             return 1;
122
123         sym = buf[2];
124         tmp = color_char_to_attr(buf[4]);
125         if (tmp > 127)
126             return 1;
127
128         k_ptr->d_attr = tmp;
129         k_ptr->d_char = sym;
130     } else if (buf[0] == 'I') {
131         int tval, sval, pval;
132         if (3 != sscanf(buf + 2, "%d:%d:%d", &tval, &sval, &pval))
133             return 1;
134
135         k_ptr->tval = (tval_type)tval;
136         k_ptr->sval = (OBJECT_SUBTYPE_VALUE)sval;
137         k_ptr->pval = (PARAMETER_VALUE)pval;
138     } else if (buf[0] == 'W') {
139         int level, extra, wgt;
140         long cost;
141         if (4 != sscanf(buf + 2, "%d:%d:%d:%ld", &level, &extra, &wgt, &cost))
142             return 1;
143
144         k_ptr->level = (DEPTH)level;
145         k_ptr->extra = (BIT_FLAGS8)extra;
146         k_ptr->weight = (WEIGHT)wgt;
147         k_ptr->cost = (PRICE)cost;
148     } else if (buf[0] == 'A') {
149         int i = 0;
150         for (s = buf + 1; s && (s[0] == ':') && s[1]; ++i) {
151             k_ptr->chance[i] = 1;
152             k_ptr->locale[i] = atoi(s + 1);
153             t = my_strchr(s + 1, '/');
154             s = my_strchr(s + 1, ':');
155             if (t && (!s || t < s)) {
156                 int chance = atoi(t + 1);
157                 if (chance > 0)
158                     k_ptr->chance[i] = (PROB)chance;
159             }
160         }
161     } else if (buf[0] == 'P') {
162         int ac, hd1, hd2, th, td, ta;
163         if (6 != sscanf(buf + 2, "%d:%dd%d:%d:%d:%d", &ac, &hd1, &hd2, &th, &td, &ta))
164             return 1;
165
166         k_ptr->ac = (ARMOUR_CLASS)ac;
167         k_ptr->dd = (DICE_NUMBER)hd1;
168         k_ptr->ds = (DICE_SID)hd2;
169         k_ptr->to_h = (HIT_PROB)th;
170         k_ptr->to_d = (HIT_POINT)td;
171         k_ptr->to_a = (ARMOUR_CLASS)ta;
172     } else if (buf[0] == 'U') {
173         byte n;
174         n = grab_one_activation_flag(buf + 2);
175         if (n > 0) {
176             k_ptr->act_idx = n;
177         } else {
178             return 5;
179         }
180     } else if (buf[0] == 'F') {
181         for (s = buf + 2; *s;) {
182             /* loop */
183             for (t = s; *t && (*t != ' ') && (*t != '|'); ++t)
184                 ;
185
186             if (*t) {
187                 *t++ = '\0';
188                 while (*t == ' ' || *t == '|')
189                     t++;
190             }
191
192             if (0 != grab_one_kind_flag(k_ptr, s))
193                 return 5;
194             s = t;
195         }
196     } else {
197         return 6;
198     }
199
200     return 0;
201 }