1 #include "flavor/flavor-util.h"
2 #include "flavor/flag-inscriptions-table.h"
3 #include "object-enchant/object-ego.h"
4 #include "object-enchant/tr-types.h"
5 #include "object-hook/hook-enchant.h"
6 #include "object/object-flags.h"
7 #include "object/object-kind.h"
8 #include "perception/object-perception.h"
9 #include "sv-definition/sv-food-types.h"
10 #include "system/artifact-type-definition.h"
11 #include "system/object-type-definition.h"
12 #include "util/bit-flags-calculator.h"
13 #include "util/quarks.h"
15 flavor_type *initialize_flavor_type(flavor_type *flavor_ptr, char *buf, object_type *o_ptr, BIT_FLAGS mode)
17 flavor_ptr->buf = buf;
18 flavor_ptr->o_ptr = o_ptr;
19 flavor_ptr->mode = mode;
20 flavor_ptr->kindname = k_name + k_info[o_ptr->k_idx].name;
21 flavor_ptr->basenm = flavor_ptr->kindname;
22 flavor_ptr->modstr = "";
23 flavor_ptr->aware = FALSE;
24 flavor_ptr->known = FALSE;
25 flavor_ptr->flavor = TRUE;
26 flavor_ptr->show_weapon = FALSE;
27 flavor_ptr->show_armour = FALSE;
34 flavor_ptr->k_ptr = &k_info[o_ptr->k_idx];
35 flavor_ptr->flavor_k_ptr = &k_info[flavor_ptr->k_ptr->flavor];
40 * @brief 対象文字配列に一文字だけをコピーする。
45 * Print a char "c" into a string "t", as if by sprintf(t, "%c", c),\n
46 * and return a pointer to the terminator (t + 1).\n
48 char *object_desc_chr(char *t, char c)
56 * @brief 対象文字配列に文字列をコピーする。
58 * @param s コピーしたい文字列ポインタ
61 * Print a string "s" into a string "t", as if by strcpy(t, s),
62 * and return a pointer to the terminator.
64 char *object_desc_str(char *t, concptr s)
74 * @brief 対象文字配列に符号なし整数値をコピーする。
79 * Print an unsigned number "n" into a string "t", as if by
80 * sprintf(t, "%u", n), and return a pointer to the terminator.
82 char *object_desc_num(char *t, uint n)
86 for (p = 1; n >= p * 10; p = p * 10)
100 * @brief 対象文字配列に符号あり整数値をコピーする。
101 * @param t 保管先文字列ポインタ
105 * Print an signed number "v" into a string "t", as if by
106 * sprintf(t, "%+d", n), and return a pointer to the terminator.
107 * Note that we always print a sign, either "+" or "-".
109 char *object_desc_int(char *t, int v)
121 for (p = 1; n >= p * 10; p = p * 10)
135 * @brief オブジェクトフラグを追加する
136 * @param short_flavor フラグの短縮表現 (反魔法/アンチテレポの"["、耐性の"r"、耐混乱の"乱" 等)
137 * @param ptr 特性短縮表記を格納する文字列ポインタ
140 static void add_inscription(char **short_flavor, concptr str) { *short_flavor = object_desc_str(*short_flavor, str); }
143 * @brief get_inscriptionのサブセットとしてオブジェクトの特性フラグを返す / Helper function for get_inscription()
144 * @param fi_ptr 参照する特性表示記号テーブル
145 * @param flgs 対応するオブジェクトのフラグ文字列
146 * @param kanji TRUEならば漢字記述/FALSEならば英語記述
147 * @param ptr フラグ群を保管する文字列参照ポインタ
148 * @return フラグ群を保管する文字列参照ポインタ(ptrと同じ)
150 * Print an signed number "v" into a string "t", as if by
151 * sprintf(t, "%+d", n), and return a pointer to the terminator.
152 * Note that we always print a sign, either "+" or "-".
154 static char *inscribe_flags_aux(flag_insc_table *fi_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE], bool kanji, char *ptr)
161 while (fi_ptr->english) {
162 if (have_flag(flgs, fi_ptr->flag) && (fi_ptr->except_flag == -1 || !have_flag(flgs, fi_ptr->except_flag)))
163 add_inscription(&ptr, _(kanji ? fi_ptr->japanese : fi_ptr->english, fi_ptr->english));
172 * @brief オブジェクトの特性表示記号テーブル1つに従いオブジェクトの特性フラグ配列に1つでも該当の特性があるかを返す / Special variation of have_flag for
174 * @param fi_ptr 参照する特性表示記号テーブル
175 * @param flgs 対応するオブジェクトのフラグ文字列
176 * @return 1つでも該当の特性があったらTRUEを返す。
178 static bool have_flag_of(flag_insc_table *fi_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE])
180 while (fi_ptr->english) {
181 if (have_flag(flgs, fi_ptr->flag) && (fi_ptr->except_flag == -1 || !have_flag(flgs, fi_ptr->except_flag)))
191 * @brief オブジェクト名の特性短縮表記をまとめて提示する。
192 * @param short_flavor 特性短縮表記を格納する文字列ポインタ
193 * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ
194 * @param kanji TRUEならば漢字表記 / FALSEなら英語表記
195 * @param all TRUEならばベースアイテム上で明らかなフラグは省略する
198 char *get_ability_abbreviation(player_type *player_ptr, char *short_flavor, object_type *o_ptr, bool kanji, bool all)
200 char *prev_ptr = short_flavor;
201 BIT_FLAGS flgs[TR_FLAG_SIZE];
202 object_flags(player_ptr, o_ptr, flgs);
204 object_kind *k_ptr = &k_info[o_ptr->k_idx];
205 for (int j = 0; j < TR_FLAG_SIZE; j++)
206 flgs[j] &= ~k_ptr->flags[j];
208 if (object_is_fixed_artifact(o_ptr)) {
209 artifact_type *a_ptr = &a_info[o_ptr->name1];
210 for (int j = 0; j < TR_FLAG_SIZE; j++)
211 flgs[j] &= ~a_ptr->flags[j];
214 if (object_is_ego(o_ptr)) {
215 ego_item_type *e_ptr = &e_info[o_ptr->name2];
216 for (int j = 0; j < TR_FLAG_SIZE; j++)
217 flgs[j] &= ~e_ptr->flags[j];
221 if (has_dark_flag(flgs)) {
222 if (have_flag(flgs, TR_LITE_1))
223 remove_flag(flgs, TR_LITE_1);
225 if (have_flag(flgs, TR_LITE_2))
226 remove_flag(flgs, TR_LITE_2);
228 if (have_flag(flgs, TR_LITE_3))
229 remove_flag(flgs, TR_LITE_3);
230 } else if (has_lite_flag(flgs)) {
231 add_flag(flgs, TR_LITE_1);
232 if (have_flag(flgs, TR_LITE_2))
233 remove_flag(flgs, TR_LITE_2);
235 if (have_flag(flgs, TR_LITE_3))
236 remove_flag(flgs, TR_LITE_3);
239 if (have_flag_of(flag_insc_plus, flgs) && kanji)
240 add_inscription(&short_flavor, "+");
242 short_flavor = inscribe_flags_aux(flag_insc_plus, flgs, kanji, short_flavor);
244 if (have_flag_of(flag_insc_immune, flgs)) {
245 if (!kanji && short_flavor != prev_ptr) {
246 add_inscription(&short_flavor, ";");
247 prev_ptr = short_flavor;
250 add_inscription(&short_flavor, "*");
253 short_flavor = inscribe_flags_aux(flag_insc_immune, flgs, kanji, short_flavor);
255 if (have_flag_of(flag_insc_resistance, flgs)) {
257 add_inscription(&short_flavor, "r");
258 else if (short_flavor != prev_ptr) {
259 add_inscription(&short_flavor, ";");
260 prev_ptr = short_flavor;
264 short_flavor = inscribe_flags_aux(flag_insc_resistance, flgs, kanji, short_flavor);
266 if (have_flag_of(flag_insc_misc, flgs) && (short_flavor != prev_ptr)) {
267 add_inscription(&short_flavor, ";");
268 prev_ptr = short_flavor;
271 short_flavor = inscribe_flags_aux(flag_insc_misc, flgs, kanji, short_flavor);
273 if (have_flag_of(flag_insc_aura, flgs))
274 add_inscription(&short_flavor, "[");
276 short_flavor = inscribe_flags_aux(flag_insc_aura, flgs, kanji, short_flavor);
278 if (have_flag_of(flag_insc_brand, flgs))
279 add_inscription(&short_flavor, "|");
281 short_flavor = inscribe_flags_aux(flag_insc_brand, flgs, kanji, short_flavor);
283 if (have_flag_of(flag_insc_kill, flgs))
284 add_inscription(&short_flavor, "/X");
286 short_flavor = inscribe_flags_aux(flag_insc_kill, flgs, kanji, short_flavor);
288 if (have_flag_of(flag_insc_slay, flgs))
289 add_inscription(&short_flavor, "/");
291 short_flavor = inscribe_flags_aux(flag_insc_slay, flgs, kanji, short_flavor);
294 if (have_flag_of(flag_insc_esp1, flgs) || have_flag_of(flag_insc_esp2, flgs))
295 add_inscription(&short_flavor, "~");
297 short_flavor = inscribe_flags_aux(flag_insc_esp1, flgs, kanji, short_flavor);
298 short_flavor = inscribe_flags_aux(flag_insc_esp2, flgs, kanji, short_flavor);
300 if (have_flag_of(flag_insc_esp1, flgs))
301 add_inscription(&short_flavor, "~");
303 short_flavor = inscribe_flags_aux(flag_insc_esp1, flgs, kanji, short_flavor);
305 if (have_flag_of(flag_insc_esp2, flgs))
306 add_inscription(&short_flavor, "~");
308 short_flavor = inscribe_flags_aux(flag_insc_esp2, flgs, kanji, short_flavor);
311 if (have_flag_of(flag_insc_sust, flgs))
312 add_inscription(&short_flavor, "(");
314 short_flavor = inscribe_flags_aux(flag_insc_sust, flgs, kanji, short_flavor);
315 *short_flavor = '\0';
320 * @brief オブジェクト名の特性短縮表記+刻み内容を提示する。 / Get object inscription with auto inscription of object flags.
321 * @param buff 特性短縮表記を格納する文字列ポインタ
322 * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ
325 void get_inscription(player_type *player_ptr, char *buff, object_type *o_ptr)
327 concptr insc = quark_str(o_ptr->inscription);
329 if (!object_is_fully_known(o_ptr)) {
345 for (; *insc; insc++) {
348 else if ('%' == *insc) {
352 if (ptr >= buff + MAX_NLEN)
356 if ('%' == insc[1]) {
363 if ('a' == insc[1] && 'l' == insc[2] && 'l' == insc[3]) {
369 ptr = get_ability_abbreviation(player_ptr, ptr, o_ptr, kanji, all);
371 add_inscription(&ptr, " ");
381 * @brief 日本語の個数表示ルーチン
382 * @param t 保管先文字列ポインタ
383 * @param o_ptr 記述したいオブジェクトの構造体参照ポインタ
386 * cmd1.c で流用するために object_desc_japanese から移動した。
388 char *object_desc_count_japanese(char *t, object_type *o_ptr)
390 t = object_desc_num(t, o_ptr->number);
391 switch (o_ptr->tval) {
399 t = object_desc_str(t, "本");
403 t = object_desc_str(t, "巻");
407 t = object_desc_str(t, "服");
411 case TV_SORCERY_BOOK:
419 case TV_CRUSADE_BOOK:
421 case TV_HISSATSU_BOOK:
423 t = object_desc_str(t, "冊");
430 t = object_desc_str(t, "着");
436 t = object_desc_str(t, "振");
440 t = object_desc_str(t, "足");
444 t = object_desc_str(t, "枚");
448 if (o_ptr->sval == SV_FOOD_JERKY) {
449 t = object_desc_str(t, "切れ");
455 if (o_ptr->number < 10) {
456 t = object_desc_str(t, "つ");
458 t = object_desc_str(t, "個");
467 bool has_lite_flag(BIT_FLAGS *flags) { return have_flag(flags, TR_LITE_1) || have_flag(flags, TR_LITE_2) || have_flag(flags, TR_LITE_3); }
469 bool has_dark_flag(BIT_FLAGS *flags) { return have_flag(flags, TR_LITE_M1) || have_flag(flags, TR_LITE_M2) || have_flag(flags, TR_LITE_M3); }