OSDN Git Service

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