OSDN Git Service

f1c1b2ac99d96e8b075b76e54bb2d169d9cc6429
[hengband/hengband.git] / src / info-reader / ego-reader.c
1 #include "info-reader/ego-reader.h"
2 #include "info-reader/kind-info-tokens-table.h"
3 #include "object-enchant/object-ego.h"
4 #include "object-enchant/tr-types.h"
5 #include "util/bit-flags-calculator.h"
6 #include "view/display-messages.h"
7
8 /*!
9  * @brief テキストトークンを走査してフラグを一つ得る(エゴ用) /
10  * Grab one flag in a ego-item_type from a textual string
11  * @param e_ptr 保管先のエゴ構造体参照ポインタ
12  * @param what 参照元の文字列ポインタ
13  * @return エラーがあった場合1、エラーがない場合0を返す
14  */
15 static bool grab_one_ego_item_flag(ego_item_type *e_ptr, concptr what)
16 {
17     for (int i = 0; i < TR_FLAG_MAX; i++) {
18         if (streq(what, k_info_flags[i])) {
19             add_flag(e_ptr->flags, i);
20             return 0;
21         }
22     }
23
24     if (grab_one_flag(&e_ptr->gen_flags, k_info_gen_flags, what) == 0)
25         return 0;
26
27     msg_format(_("未知の名のあるアイテム・フラグ '%s'。", "Unknown ego-item flag '%s'."), what);
28     return 1;
29 }
30
31 /*!
32  * @brief アイテムエゴ情報(e_info)のパース関数 /
33  * Initialize the "e_info" array, by parsing an ascii "template" file
34  * @param buf テキスト列
35  * @param head ヘッダ構造体
36  * @return エラーコード
37  */
38 errr parse_e_info(char *buf, angband_header *head)
39 {
40     static ego_item_type *e_ptr = NULL;
41     error_idx = -1;
42     error_line = -1;
43     char *s, *t;
44     if (buf[0] == 'N') {
45         s = angband_strchr(buf + 2, ':');
46         if (!s)
47             return 1;
48
49         *s++ = '\0';
50 #ifdef JP
51         if (!*s)
52             return 1;
53 #endif
54         int i = atoi(buf + 2);
55         if (i < error_idx)
56             return 4;
57         if (i >= head->info_num)
58             return 2;
59
60         error_idx = i;
61         e_ptr = &e_info[i];
62 #ifdef JP
63         if (!add_name(&e_ptr->name, head, s))
64             return 7;
65 #endif
66     } else if (!e_ptr) {
67         return 3;
68     }
69 #ifdef JP
70     /* 英語名を読むルーチンを追加 */
71     /* 'E' から始まる行は英語名 */
72     else if (buf[0] == 'E') {
73         /* nothing to do */
74     }
75 #else
76     else if (buf[0] == 'E') {
77         s = buf + 2;
78         if (!add_name(&e_ptr->name, head, s))
79             return 7;
80     }
81 #endif
82     else if (buf[0] == 'X') {
83         int slot, rating;
84         if (2 != sscanf(buf + 2, "%d:%d", &slot, &rating))
85             return 1;
86
87         e_ptr->slot = (INVENTORY_IDX)slot;
88         e_ptr->rating = (PRICE)rating;
89     } else if (buf[0] == 'W') {
90         int level, rarity, pad2;
91         long cost;
92
93         if (4 != sscanf(buf + 2, "%d:%d:%d:%ld", &level, &rarity, &pad2, &cost))
94             return 1;
95
96         e_ptr->level = level;
97         e_ptr->rarity = (RARITY)rarity;
98         e_ptr->cost = cost;
99     } else if (buf[0] == 'C') {
100         int th, td, ta, pval;
101
102         if (4 != sscanf(buf + 2, "%d:%d:%d:%d", &th, &td, &ta, &pval))
103             return 1;
104
105         e_ptr->max_to_h = (HIT_PROB)th;
106         e_ptr->max_to_d = (HIT_POINT)td;
107         e_ptr->max_to_a = (ARMOUR_CLASS)ta;
108         e_ptr->max_pval = (PARAMETER_VALUE)pval;
109     } else if (buf[0] == 'U') {
110         byte n;
111         n = grab_one_activation_flag(buf + 2);
112         if (n > 0) {
113             e_ptr->act_idx = n;
114         } else {
115             return 5;
116         }
117     } else if (buf[0] == 'F') {
118         for (s = buf + 2; *s;) {
119             /* loop */
120             for (t = s; *t && (*t != ' ') && (*t != '|'); ++t)
121                 ;
122
123             if (*t) {
124                 *t++ = '\0';
125                 while ((*t == ' ') || (*t == '|'))
126                     t++;
127             }
128
129             if (0 != grab_one_ego_item_flag(e_ptr, s))
130                 return 5;
131
132             s = t;
133         }
134     } else {
135         return 6;
136     }
137
138     return 0;
139 }