1 #include "io/pref-file-expressor.h"
2 #include "game-option/runtime-arguments.h"
3 #include "player-info/class-info.h"
4 #include "player-info/race-info.h"
5 #include "realm/realm-names-table.h"
6 #include "system/player-type-definition.h"
7 #include "system/system-variables.h"
8 #include "util/string-processor.h"
11 * @brief process_pref_fileのサブルーチンとして条件分岐処理の解釈と結果を返す
12 * Helper function for "process_pref_file()"
13 * @param player_ptr プレイヤーへの参照ポインタ
14 * @param sp テキスト文字列の参照ポインタ
15 * @param fp 再帰中のポインタ参照
18 * かなり長いが、エンバグすると非常に危険な関数なので一旦放置する
21 * v: output buffer array
27 concptr process_pref_file_expr(PlayerType *player_ptr, char **sp, char *fp)
31 while (iswspace(*s)) {
52 t = process_pref_file_expr(player_ptr, &s, &f);
55 } else if (streq(t, "IOR")) {
57 while (*s && (f != b2)) {
58 t = process_pref_file_expr(player_ptr, &s, &f);
59 if (*t && !streq(t, "0")) {
63 } else if (streq(t, "AND")) {
65 while (*s && (f != b2)) {
66 t = process_pref_file_expr(player_ptr, &s, &f);
67 if (*t && streq(t, "0")) {
71 } else if (streq(t, "NOT")) {
73 while (*s && (f != b2)) {
74 t = process_pref_file_expr(player_ptr, &s, &f);
75 if (*t && streq(t, "1")) {
79 } else if (streq(t, "EQU")) {
81 if (*s && (f != b2)) {
82 t = process_pref_file_expr(player_ptr, &s, &f);
84 while (*s && (f != b2)) {
85 p = process_pref_file_expr(player_ptr, &s, &f);
90 } else if (streq(t, "LEQ")) {
92 if (*s && (f != b2)) {
93 t = process_pref_file_expr(player_ptr, &s, &f);
95 while (*s && (f != b2)) {
97 t = process_pref_file_expr(player_ptr, &s, &f);
98 if (*t && atoi(p) > atoi(t)) {
102 } else if (streq(t, "GEQ")) {
104 if (*s && (f != b2)) {
105 t = process_pref_file_expr(player_ptr, &s, &f);
107 while (*s && (f != b2)) {
109 t = process_pref_file_expr(player_ptr, &s, &f);
110 if (*t && atoi(p) < atoi(t)) {
115 while (*s && (f != b2)) {
116 t = process_pref_file_expr(player_ptr, &s, &f);
124 if ((f = *s) != '\0') {
133 /* Accept all printables except spaces and brackets */
135 while (iskanji(*s) || (isprint(*s) && !angband_strchr(" []", *s))) {
142 while (isprint(*s) && !angband_strchr(" []", *s)) {
147 if ((f = *s) != '\0') {
158 if (streq(b + 1, "SYS")) {
160 } else if (streq(b + 1, "KEYBOARD")) {
161 v = ANGBAND_KEYBOARD;
162 } else if (streq(b + 1, "GRAF")) {
164 } else if (streq(b + 1, "MONOCHROME")) {
165 if (arg_monochrome) {
170 } else if (streq(b + 1, "RACE")) {
176 } else if (streq(b + 1, "CLASS")) {
182 } else if (streq(b + 1, "PLAYER")) {
183 static char tmp_player_name[32];
185 for (pn = player_ptr->name, tpn = tmp_player_name; *pn; pn++, tpn++) {
193 *tpn = angband_strchr(" []", *pn) ? '_' : *pn;
198 } else if (streq(b + 1, "REALM1")) {
200 v = E_realm_names[player_ptr->realm1];
202 v = realm_names[player_ptr->realm1];
204 } else if (streq(b + 1, "REALM2")) {
206 v = E_realm_names[player_ptr->realm2];
208 v = realm_names[player_ptr->realm2];
210 } else if (streq(b + 1, "LEVEL")) {
211 sprintf(tmp, "%02d", player_ptr->lev);
213 } else if (streq(b + 1, "AUTOREGISTER")) {
214 if (player_ptr->autopick_autoregister) {
219 } else if (streq(b + 1, "MONEY")) {
220 sprintf(tmp, "%09ld", (long int)player_ptr->au);