From 8765033307d4fc7b55ca88dbf03d5d80b08ef5fd Mon Sep 17 00:00:00 2001 From: Hourier Date: Mon, 6 Jul 2020 21:34:32 +0900 Subject: [PATCH] [Refactor] #40534 Separated flavor-util.c/h from object-flavor.c/h --- Hengband/Hengband/Hengband.vcxproj | 2 + Hengband/Hengband/Hengband.vcxproj.filters | 6 + src/Makefile.am | 1 + src/flavor/flavor-util.c | 442 +++++++++++++++++++++++++++ src/flavor/flavor-util.h | 14 + src/object/object-flavor.c | 462 +---------------------------- src/object/object-flavor.h | 1 - src/player/player-move.c | 3 +- 8 files changed, 470 insertions(+), 461 deletions(-) create mode 100644 src/flavor/flavor-util.c create mode 100644 src/flavor/flavor-util.h diff --git a/Hengband/Hengband/Hengband.vcxproj b/Hengband/Hengband/Hengband.vcxproj index f8750c6de..454ee8f46 100644 --- a/Hengband/Hengband/Hengband.vcxproj +++ b/Hengband/Hengband/Hengband.vcxproj @@ -177,6 +177,7 @@ + @@ -645,6 +646,7 @@ + diff --git a/Hengband/Hengband/Hengband.vcxproj.filters b/Hengband/Hengband/Hengband.vcxproj.filters index d309613ab..7739f94e0 100644 --- a/Hengband/Hengband/Hengband.vcxproj.filters +++ b/Hengband/Hengband/Hengband.vcxproj.filters @@ -1661,6 +1661,9 @@ flavor + + flavor + @@ -3637,6 +3640,9 @@ flavor + + flavor + diff --git a/src/Makefile.am b/src/Makefile.am index 8506b6940..fecaf53c1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -153,6 +153,7 @@ hengband_SOURCES = \ effect/effect-characteristics.h \ \ flavor/flag-inscriptions-table.c flavor/flag-inscriptions-table.h \ + flavor/flavor-util.c flavor/flavor-util.h \ flavor/object-flavor-types.h \ \ floor/fixed-map-generator.c floor/fixed-map-generator.h \ diff --git a/src/flavor/flavor-util.c b/src/flavor/flavor-util.c new file mode 100644 index 000000000..ccfcac6d0 --- /dev/null +++ b/src/flavor/flavor-util.c @@ -0,0 +1,442 @@ +#include "flavor/flavor-util.h" +#include "flavor/flag-inscriptions-table.h" +#include "object-enchant/artifact.h" +#include "object-enchant/object-ego.h" +#include "object-enchant/tr-types.h" +#include "object-hook/hook-enchant.h" +#include "object/object-flags.h" +#include "object/object-flavor.h" // todo has_dark_flag(). +#include "object/object-kind.h" +#include "perception/object-perception.h" +#include "sv-definition/sv-food-types.h" +#include "system/object-type-definition.h" +#include "util/bit-flags-calculator.h" +#include "util/quarks.h" + +/*! + * @brief 対象文字配列に一文字だけをコピーする。 + * @param t 保管先文字列ポインタ + * @param c 保管したい1文字 + * @return なし + * @details + * Print a char "c" into a string "t", as if by sprintf(t, "%c", c),\n + * and return a pointer to the terminator (t + 1).\n + */ +char *object_desc_chr(char *t, char c) +{ + *t++ = c; + *t = '\0'; + return t; +} + +/*! + * @brief 対象文字配列に文字列をコピーする。 + * @param t 保管先文字列ポインタ + * @param s コピーしたい文字列ポインタ + * @return 保管先の末尾アドレス + * @details + * Print a string "s" into a string "t", as if by strcpy(t, s), + * and return a pointer to the terminator. + */ +char *object_desc_str(char *t, concptr s) +{ + while (*s) + *t++ = *s++; + + *t = '\0'; + return t; +} + +/*! + * @brief 対象文字配列に符号なし整数値をコピーする。 + * @param t 保管先文字列ポインタ + * @param n コピーしたい数値 + * @return なし + * @details + * Print an unsigned number "n" into a string "t", as if by + * sprintf(t, "%u", n), and return a pointer to the terminator. + */ +char *object_desc_num(char *t, uint n) +{ + /* loop */ + uint p; + for (p = 1; n >= p * 10; p = p * 10) + ; + + while (p >= 1) { + *t++ = '0' + n / p; + n = n % p; + p = p / 10; + } + + *t = '\0'; + return t; +} + +/*! + * @brief 対象文字配列に符号あり整数値をコピーする。 + * @param t 保管先文字列ポインタ + * @param v コピーしたい数値 + * @return なし + * @details + * Print an signed number "v" into a string "t", as if by + * sprintf(t, "%+d", n), and return a pointer to the terminator. + * Note that we always print a sign, either "+" or "-". + */ +char *object_desc_int(char *t, int v) +{ + uint p, n; + if (v < 0) { + n = 0 - v; + *t++ = '-'; + } else { + n = v; + *t++ = '+'; + } + + /* loop */ + for (p = 1; n >= p * 10; p = p * 10) + ; + + while (p >= 1) { + *t++ = '0' + n / p; + n = n % p; + p = p / 10; + } + + *t = '\0'; + return t; +} + +/*! + * @brief オブジェクトフラグを追加する + * @param str フレーバー表現 (アンチテレポの"[" 等) + * @param ptr 特性短縮表記を格納する文字列ポインタ + * @return なし + */ +static void add_inscription(char *ptr, concptr str) { ptr = object_desc_str(ptr, str); } + +/*! + * @brief get_inscriptionのサブセットとしてオブジェクトの特性フラグを返す / Helper function for get_inscription() + * @param fi_ptr 参照する特性表示記号テーブル + * @param flgs 対応するオブジェクトのフラグ文字列 + * @param kanji TRUEならば漢字記述/FALSEならば英語記述 + * @param ptr フラグ群を保管する文字列参照ポインタ + * @return フラグ群を保管する文字列参照ポインタ(ptrと同じ) + * @details + * Print an signed number "v" into a string "t", as if by + * sprintf(t, "%+d", n), and return a pointer to the terminator. + * Note that we always print a sign, either "+" or "-". + */ +static char *inscribe_flags_aux(flag_insc_table *fi_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE], bool kanji, char *ptr) +{ +#ifdef JP +#else + (void)kanji; +#endif + + while (fi_ptr->english) { + if (have_flag(flgs, fi_ptr->flag) && (fi_ptr->except_flag == -1 || !have_flag(flgs, fi_ptr->except_flag))) + add_inscription(ptr, _(kanji ? fi_ptr->japanese : fi_ptr->english, fi_ptr->english)); + + fi_ptr++; + } + + return ptr; +} + +/*! + * @brief オブジェクトの特性表示記号テーブル1つに従いオブジェクトの特性フラグ配列に1つでも該当の特性があるかを返す / Special variation of have_flag for + * auto-inscription + * @param fi_ptr 参照する特性表示記号テーブル + * @param flgs 対応するオブジェクトのフラグ文字列 + * @return 1つでも該当の特性があったらTRUEを返す。 + */ +static bool have_flag_of(flag_insc_table *fi_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE]) +{ + while (fi_ptr->english) { + if (have_flag(flgs, fi_ptr->flag) && (fi_ptr->except_flag == -1 || !have_flag(flgs, fi_ptr->except_flag))) + return TRUE; + + fi_ptr++; + } + + return FALSE; +} + +/*! + * @brief オブジェクト名の特性短縮表記をまとめて提示する。 + * @param ptr 特性短縮表記を格納する文字列ポインタ + * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ + * @param kanji TRUEならば漢字表記 / FALSEなら英語表記 + * @param all TRUEならばベースアイテム上で明らかなフラグは省略する + * @return ptrと同じアドレス + */ +char *get_ability_abbreviation(player_type *player_ptr, char *ptr, object_type *o_ptr, bool kanji, bool all) +{ + char *prev_ptr = ptr; + BIT_FLAGS flgs[TR_FLAG_SIZE]; + object_flags(player_ptr, o_ptr, flgs); + if (!all) { + object_kind *k_ptr = &k_info[o_ptr->k_idx]; + for (int j = 0; j < TR_FLAG_SIZE; j++) + flgs[j] &= ~k_ptr->flags[j]; + + if (object_is_fixed_artifact(o_ptr)) { + artifact_type *a_ptr = &a_info[o_ptr->name1]; + for (int j = 0; j < TR_FLAG_SIZE; j++) + flgs[j] &= ~a_ptr->flags[j]; + } + + if (object_is_ego(o_ptr)) { + ego_item_type *e_ptr = &e_info[o_ptr->name2]; + for (int j = 0; j < TR_FLAG_SIZE; j++) + flgs[j] &= ~e_ptr->flags[j]; + } + } + + if (has_dark_flag(flgs)) { + if (have_flag(flgs, TR_LITE_1)) + remove_flag(flgs, TR_LITE_1); + + if (have_flag(flgs, TR_LITE_2)) + remove_flag(flgs, TR_LITE_2); + + if (have_flag(flgs, TR_LITE_3)) + remove_flag(flgs, TR_LITE_3); + } else if (has_lite_flag(flgs)) { + add_flag(flgs, TR_LITE_1); + if (have_flag(flgs, TR_LITE_2)) + remove_flag(flgs, TR_LITE_2); + + if (have_flag(flgs, TR_LITE_3)) + remove_flag(flgs, TR_LITE_3); + } + + if (have_flag_of(flag_insc_plus, flgs) && kanji) + add_inscription(ptr, "+"); + + ptr = inscribe_flags_aux(flag_insc_plus, flgs, kanji, ptr); + + if (have_flag_of(flag_insc_immune, flgs)) { + if (!kanji && ptr != prev_ptr) { + add_inscription(ptr, ";"); + prev_ptr = ptr; + } + + add_inscription(ptr, "*"); + } + + ptr = inscribe_flags_aux(flag_insc_immune, flgs, kanji, ptr); + + if (have_flag_of(flag_insc_resistance, flgs)) { + if (kanji) + add_inscription(ptr, "r"); + else if (ptr != prev_ptr) { + add_inscription(ptr, ";"); + prev_ptr = ptr; + } + } + + ptr = inscribe_flags_aux(flag_insc_resistance, flgs, kanji, ptr); + + if (have_flag_of(flag_insc_misc, flgs) && (ptr != prev_ptr)) { + add_inscription(ptr, ";"); + prev_ptr = ptr; + } + + ptr = inscribe_flags_aux(flag_insc_misc, flgs, kanji, ptr); + + if (have_flag_of(flag_insc_aura, flgs)) + add_inscription(ptr, "["); + + ptr = inscribe_flags_aux(flag_insc_aura, flgs, kanji, ptr); + + if (have_flag_of(flag_insc_brand, flgs)) + add_inscription(ptr, "|"); + + ptr = inscribe_flags_aux(flag_insc_brand, flgs, kanji, ptr); + + if (have_flag_of(flag_insc_kill, flgs)) + add_inscription(ptr, "/X"); + + ptr = inscribe_flags_aux(flag_insc_kill, flgs, kanji, ptr); + + if (have_flag_of(flag_insc_slay, flgs)) + add_inscription(ptr, "/"); + + ptr = inscribe_flags_aux(flag_insc_slay, flgs, kanji, ptr); + + if (kanji) { + if (have_flag_of(flag_insc_esp1, flgs) || have_flag_of(flag_insc_esp2, flgs)) + add_inscription(ptr, "~"); + + ptr = inscribe_flags_aux(flag_insc_esp1, flgs, kanji, ptr); + ptr = inscribe_flags_aux(flag_insc_esp2, flgs, kanji, ptr); + } else { + if (have_flag_of(flag_insc_esp1, flgs)) + add_inscription(ptr, "~"); + + ptr = inscribe_flags_aux(flag_insc_esp1, flgs, kanji, ptr); + + if (have_flag_of(flag_insc_esp2, flgs)) + add_inscription(ptr, "~"); + + ptr = inscribe_flags_aux(flag_insc_esp2, flgs, kanji, ptr); + } + + if (have_flag_of(flag_insc_sust, flgs)) + add_inscription(ptr, "("); + + ptr = inscribe_flags_aux(flag_insc_sust, flgs, kanji, ptr); + *ptr = '\0'; + return ptr; +} + +/*! + * @brief オブジェクト名の特性短縮表記+刻み内容を提示する。 / Get object inscription with auto inscription of object flags. + * @param buff 特性短縮表記を格納する文字列ポインタ + * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ + * @return なし + */ +void get_inscription(player_type *player_ptr, char *buff, object_type *o_ptr) +{ + concptr insc = quark_str(o_ptr->inscription); + char *ptr = buff; + if (!object_is_fully_known(o_ptr)) { + while (*insc) { + if (*insc == '#') + break; +#ifdef JP + if (iskanji(*insc)) + *buff++ = *insc++; +#endif + *buff++ = *insc++; + } + + *buff = '\0'; + return; + } + + *buff = '\0'; + for (; *insc; insc++) { + if (*insc == '#') + break; + else if ('%' == *insc) { + bool kanji = FALSE; + bool all; + concptr start = ptr; + if (ptr >= buff + MAX_NLEN) + continue; + +#ifdef JP + if ('%' == insc[1]) { + insc++; + kanji = FALSE; + } else + kanji = TRUE; +#endif + + if ('a' == insc[1] && 'l' == insc[2] && 'l' == insc[3]) { + all = TRUE; + insc += 3; + } else + all = FALSE; + + ptr = get_ability_abbreviation(player_ptr, ptr, o_ptr, kanji, all); + if (ptr == start) + add_inscription(ptr, " "); + } else + *ptr++ = *insc; + } + + *ptr = '\0'; +} + +#ifdef JP +/*! + * @brief 日本語の個数表示ルーチン + * @param t 保管先文字列ポインタ + * @param o_ptr 記述したいオブジェクトの構造体参照ポインタ + * @return なし + * @details + * cmd1.c で流用するために object_desc_japanese から移動した。 + */ +char *object_desc_count_japanese(char *t, object_type *o_ptr) +{ + t = object_desc_num(t, o_ptr->number); + switch (o_ptr->tval) { + case TV_BOLT: + case TV_ARROW: + case TV_POLEARM: + case TV_STAFF: + case TV_WAND: + case TV_ROD: + case TV_DIGGING: { + t = object_desc_str(t, "本"); + break; + } + case TV_SCROLL: { + t = object_desc_str(t, "巻"); + break; + } + case TV_POTION: { + t = object_desc_str(t, "服"); + break; + } + case TV_LIFE_BOOK: + case TV_SORCERY_BOOK: + case TV_NATURE_BOOK: + case TV_CHAOS_BOOK: + case TV_DEATH_BOOK: + case TV_TRUMP_BOOK: + case TV_ARCANE_BOOK: + case TV_CRAFT_BOOK: + case TV_DAEMON_BOOK: + case TV_CRUSADE_BOOK: + case TV_MUSIC_BOOK: + case TV_HISSATSU_BOOK: + case TV_HEX_BOOK: { + t = object_desc_str(t, "冊"); + break; + } + case TV_SOFT_ARMOR: + case TV_HARD_ARMOR: + case TV_DRAG_ARMOR: + case TV_CLOAK: { + t = object_desc_str(t, "着"); + break; + } + case TV_SWORD: + case TV_HAFTED: + case TV_BOW: { + t = object_desc_str(t, "振"); + break; + } + case TV_BOOTS: { + t = object_desc_str(t, "足"); + break; + } + case TV_CARD: { + t = object_desc_str(t, "枚"); + break; + } + case TV_FOOD: { + if (o_ptr->sval == SV_FOOD_JERKY) { + t = object_desc_str(t, "切れ"); + break; + } + } + /* Fall through */ + default: { + if (o_ptr->number < 10) { + t = object_desc_str(t, "つ"); + } else { + t = object_desc_str(t, "個"); + } + break; + } + } + return t; +} +#endif diff --git a/src/flavor/flavor-util.h b/src/flavor/flavor-util.h new file mode 100644 index 000000000..a014bb9e9 --- /dev/null +++ b/src/flavor/flavor-util.h @@ -0,0 +1,14 @@ +#pragma once + +#include "system/angband.h" + +char *object_desc_chr(char *t, char c); +char *object_desc_str(char *t, concptr s); +char *object_desc_num(char *t, uint n); +char *object_desc_int(char *t, int v); +char *get_ability_abbreviation(player_type *player_ptr, char *ptr, object_type *o_ptr, bool kanji, bool all); +void get_inscription(player_type *player_ptr, char *buff, object_type *o_ptr); + +#ifdef JP +char *object_desc_count_japanese(char *t, object_type *o_ptr); +#endif diff --git a/src/object/object-flavor.c b/src/object/object-flavor.c index c200a96d8..a8fd48108 100644 --- a/src/object/object-flavor.c +++ b/src/object/object-flavor.c @@ -12,6 +12,7 @@ #include "object/object-flavor.h" #include "cmd-item/cmd-smith.h" #include "flavor/flag-inscriptions-table.h" +#include "flavor/flavor-util.h" #include "flavor/object-flavor-types.h" #include "game-option/text-display-options.h" #include "grid/trap.h" @@ -222,37 +223,8 @@ static void shuffle_flavors(tval_type tval) /*! * @brief ゲーム開始時に行われるベースアイテムの初期化ルーチン / Prepare the "variable" part of the "k_info" array. + * @param なし * @return なし - * @details - * Prepare the "variable" part of the "k_info" array.\n - *\n - * The "color"/"metal"/"type" of an item is its "flavor".\n - * For the most part, flavors are assigned randomly each game.\n - *\n - * Initialize descriptions for the "colored" objects, including:\n - * Rings, Amulets, Staffs, Wands, Rods, Food, Potions, Scrolls.\n - *\n - * The first 4 entries for potions are fixed (Water, Apple Juice,\n - * Slime Mold Juice, Unused Potion).\n - *\n - * Scroll titles are always between 6 and 14 letters long. This is\n - * ensured because every title is composed of whole words, where every\n - * word is from 1 to 8 letters long (one or two syllables of 1 to 4\n - * letters each), and that no scroll is finished until it attempts to\n - * grow beyond 15 letters. The first time this can happen is when the\n - * current title has 6 letters and the new word has 8 letters, which\n - * would result in a 6 letter scroll title.\n - *\n - * Duplicate titles are avoided by requiring that no two scrolls share\n - * the same first four letters (not the most efficient method, and not\n - * the least efficient method, but it will always work).\n - *\n - * Hack -- make sure everything stays the same for each saved game\n - * This is accomplished by the use of a saved "random seed", as in\n - * "town_gen()". Since no other functions are called while the special\n - * seed is in effect, so this function is pretty "safe".\n - *\n - * Note that the "hacked seed" may provide an RNG with alternating parity!\n */ void flavor_init(void) { @@ -289,434 +261,6 @@ void flavor_init(void) } /*! - * @brief 対象文字配列に一文字だけをコピーする。 - * @param t 保管先文字列ポインタ - * @param c 保管したい1文字 - * @return なし - * @details - * Print a char "c" into a string "t", as if by sprintf(t, "%c", c),\n - * and return a pointer to the terminator (t + 1).\n - */ -static char *object_desc_chr(char *t, char c) -{ - *t++ = c; - *t = '\0'; - return t; -} - -/*! - * @brief 対象文字配列に文字列をコピーする。 - * @param t 保管先文字列ポインタ - * @param s コピーしたい文字列ポインタ - * @return 保管先の末尾アドレス - * @details - * Print a string "s" into a string "t", as if by strcpy(t, s), - * and return a pointer to the terminator. - */ -static char *object_desc_str(char *t, concptr s) -{ - while (*s) - *t++ = *s++; - - *t = '\0'; - return t; -} - -/*! - * @brief 対象文字配列に符号なし整数値をコピーする。 - * @param t 保管先文字列ポインタ - * @param n コピーしたい数値 - * @return なし - * @details - * Print an unsigned number "n" into a string "t", as if by - * sprintf(t, "%u", n), and return a pointer to the terminator. - */ -static char *object_desc_num(char *t, uint n) -{ - /* loop */ - uint p; - for (p = 1; n >= p * 10; p = p * 10) - ; - - while (p >= 1) { - *t++ = '0' + n / p; - n = n % p; - p = p / 10; - } - - *t = '\0'; - return t; -} - -#ifdef JP -/*! - * @brief 日本語の個数表示ルーチン - * @param t 保管先文字列ポインタ - * @param o_ptr 記述したいオブジェクトの構造体参照ポインタ - * @return なし - * @details - * cmd1.c で流用するために object_desc_japanese から移動した。 - */ -char *object_desc_kosuu(char *t, object_type *o_ptr) -{ - t = object_desc_num(t, o_ptr->number); - switch (o_ptr->tval) { - case TV_BOLT: - case TV_ARROW: - case TV_POLEARM: - case TV_STAFF: - case TV_WAND: - case TV_ROD: - case TV_DIGGING: { - t = object_desc_str(t, "本"); - break; - } - case TV_SCROLL: { - t = object_desc_str(t, "巻"); - break; - } - case TV_POTION: { - t = object_desc_str(t, "服"); - break; - } - case TV_LIFE_BOOK: - case TV_SORCERY_BOOK: - case TV_NATURE_BOOK: - case TV_CHAOS_BOOK: - case TV_DEATH_BOOK: - case TV_TRUMP_BOOK: - case TV_ARCANE_BOOK: - case TV_CRAFT_BOOK: - case TV_DAEMON_BOOK: - case TV_CRUSADE_BOOK: - case TV_MUSIC_BOOK: - case TV_HISSATSU_BOOK: - case TV_HEX_BOOK: { - t = object_desc_str(t, "冊"); - break; - } - case TV_SOFT_ARMOR: - case TV_HARD_ARMOR: - case TV_DRAG_ARMOR: - case TV_CLOAK: { - t = object_desc_str(t, "着"); - break; - } - case TV_SWORD: - case TV_HAFTED: - case TV_BOW: { - t = object_desc_str(t, "振"); - break; - } - case TV_BOOTS: { - t = object_desc_str(t, "足"); - break; - } - case TV_CARD: { - t = object_desc_str(t, "枚"); - break; - } - case TV_FOOD: { - if (o_ptr->sval == SV_FOOD_JERKY) { - t = object_desc_str(t, "切れ"); - break; - } - } - /* Fall through */ - default: { - if (o_ptr->number < 10) { - t = object_desc_str(t, "つ"); - } else { - t = object_desc_str(t, "個"); - } - break; - } - } - return t; -} -#endif - -/*! - * @brief 対象文字配列に符号あり整数値をコピーする。 - * @param t 保管先文字列ポインタ - * @param v コピーしたい数値 - * @return なし - * @details - * Print an signed number "v" into a string "t", as if by - * sprintf(t, "%+d", n), and return a pointer to the terminator. - * Note that we always print a sign, either "+" or "-". - */ -static char *object_desc_int(char *t, int v) -{ - uint p, n; - if (v < 0) { - n = 0 - v; - *t++ = '-'; - } else { - n = v; - *t++ = '+'; - } - - /* loop */ - for (p = 1; n >= p * 10; p = p * 10) - ; - - while (p >= 1) { - *t++ = '0' + n / p; - n = n % p; - p = p / 10; - } - - *t = '\0'; - return t; -} - -/*! - * @brief オブジェクトフラグを追加する - * @param str フレーバー表現 (アンチテレポの"[" 等) - * @param ptr 特性短縮表記を格納する文字列ポインタ - * @return なし - */ -static void add_inscription(char *ptr, concptr str) { ptr = object_desc_str(ptr, str); } - -/*! - * @brief get_inscriptionのサブセットとしてオブジェクトの特性フラグを返す / Helper function for get_inscription() - * @param fi_ptr 参照する特性表示記号テーブル - * @param flgs 対応するオブジェクトのフラグ文字列 - * @param kanji TRUEならば漢字記述/FALSEならば英語記述 - * @param ptr フラグ群を保管する文字列参照ポインタ - * @return フラグ群を保管する文字列参照ポインタ(ptrと同じ) - * @details - * Print an signed number "v" into a string "t", as if by - * sprintf(t, "%+d", n), and return a pointer to the terminator. - * Note that we always print a sign, either "+" or "-". - */ -static char *inscribe_flags_aux(flag_insc_table *fi_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE], bool kanji, char *ptr) -{ -#ifdef JP -#else - (void)kanji; -#endif - - while (fi_ptr->english) { - if (have_flag(flgs, fi_ptr->flag) && (fi_ptr->except_flag == -1 || !have_flag(flgs, fi_ptr->except_flag))) - add_inscription(ptr, _(kanji ? fi_ptr->japanese : fi_ptr->english, fi_ptr->english)); - - fi_ptr++; - } - - return ptr; -} - -/*! - * @brief オブジェクトの特性表示記号テーブル1つに従いオブジェクトの特性フラグ配列に1つでも該当の特性があるかを返す / Special variation of have_flag for - * auto-inscription - * @param fi_ptr 参照する特性表示記号テーブル - * @param flgs 対応するオブジェクトのフラグ文字列 - * @return 1つでも該当の特性があったらTRUEを返す。 - */ -static bool have_flag_of(flag_insc_table *fi_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE]) -{ - while (fi_ptr->english) { - if (have_flag(flgs, fi_ptr->flag) && (fi_ptr->except_flag == -1 || !have_flag(flgs, fi_ptr->except_flag))) - return TRUE; - - fi_ptr++; - } - - return FALSE; -} - -/*! - * @brief オブジェクト名の特性短縮表記をまとめて提示する。 - * @param ptr 特性短縮表記を格納する文字列ポインタ - * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ - * @param kanji TRUEならば漢字表記 / FALSEなら英語表記 - * @param all TRUEならばベースアイテム上で明らかなフラグは省略する - * @return ptrと同じアドレス - */ -static char *get_ability_abbreviation(player_type *player_ptr, char *ptr, object_type *o_ptr, bool kanji, bool all) -{ - char *prev_ptr = ptr; - BIT_FLAGS flgs[TR_FLAG_SIZE]; - object_flags(player_ptr, o_ptr, flgs); - if (!all) { - object_kind *k_ptr = &k_info[o_ptr->k_idx]; - for (int j = 0; j < TR_FLAG_SIZE; j++) - flgs[j] &= ~k_ptr->flags[j]; - - if (object_is_fixed_artifact(o_ptr)) { - artifact_type *a_ptr = &a_info[o_ptr->name1]; - for (int j = 0; j < TR_FLAG_SIZE; j++) - flgs[j] &= ~a_ptr->flags[j]; - } - - if (object_is_ego(o_ptr)) { - ego_item_type *e_ptr = &e_info[o_ptr->name2]; - for (int j = 0; j < TR_FLAG_SIZE; j++) - flgs[j] &= ~e_ptr->flags[j]; - } - } - - if (has_dark_flag(flgs)) { - if (have_flag(flgs, TR_LITE_1)) - remove_flag(flgs, TR_LITE_1); - - if (have_flag(flgs, TR_LITE_2)) - remove_flag(flgs, TR_LITE_2); - - if (have_flag(flgs, TR_LITE_3)) - remove_flag(flgs, TR_LITE_3); - } else if (has_lite_flag(flgs)) { - add_flag(flgs, TR_LITE_1); - if (have_flag(flgs, TR_LITE_2)) - remove_flag(flgs, TR_LITE_2); - - if (have_flag(flgs, TR_LITE_3)) - remove_flag(flgs, TR_LITE_3); - } - - if (have_flag_of(flag_insc_plus, flgs) && kanji) - add_inscription(ptr, "+"); - - ptr = inscribe_flags_aux(flag_insc_plus, flgs, kanji, ptr); - - if (have_flag_of(flag_insc_immune, flgs)) { - if (!kanji && ptr != prev_ptr) { - add_inscription(ptr, ";"); - prev_ptr = ptr; - } - - add_inscription(ptr, "*"); - } - - ptr = inscribe_flags_aux(flag_insc_immune, flgs, kanji, ptr); - - if (have_flag_of(flag_insc_resistance, flgs)) { - if (kanji) - add_inscription(ptr, "r"); - else if (ptr != prev_ptr) { - add_inscription(ptr, ";"); - prev_ptr = ptr; - } - } - - ptr = inscribe_flags_aux(flag_insc_resistance, flgs, kanji, ptr); - - if (have_flag_of(flag_insc_misc, flgs) && (ptr != prev_ptr)) { - add_inscription(ptr, ";"); - prev_ptr = ptr; - } - - ptr = inscribe_flags_aux(flag_insc_misc, flgs, kanji, ptr); - - if (have_flag_of(flag_insc_aura, flgs)) - add_inscription(ptr, "["); - - ptr = inscribe_flags_aux(flag_insc_aura, flgs, kanji, ptr); - - if (have_flag_of(flag_insc_brand, flgs)) - add_inscription(ptr, "|"); - - ptr = inscribe_flags_aux(flag_insc_brand, flgs, kanji, ptr); - - if (have_flag_of(flag_insc_kill, flgs)) - add_inscription(ptr, "/X"); - - ptr = inscribe_flags_aux(flag_insc_kill, flgs, kanji, ptr); - - if (have_flag_of(flag_insc_slay, flgs)) - add_inscription(ptr, "/"); - - ptr = inscribe_flags_aux(flag_insc_slay, flgs, kanji, ptr); - - if (kanji) { - if (have_flag_of(flag_insc_esp1, flgs) || have_flag_of(flag_insc_esp2, flgs)) - add_inscription(ptr, "~"); - - ptr = inscribe_flags_aux(flag_insc_esp1, flgs, kanji, ptr); - ptr = inscribe_flags_aux(flag_insc_esp2, flgs, kanji, ptr); - } else { - if (have_flag_of(flag_insc_esp1, flgs)) - add_inscription(ptr, "~"); - - ptr = inscribe_flags_aux(flag_insc_esp1, flgs, kanji, ptr); - - if (have_flag_of(flag_insc_esp2, flgs)) - add_inscription(ptr, "~"); - - ptr = inscribe_flags_aux(flag_insc_esp2, flgs, kanji, ptr); - } - - if (have_flag_of(flag_insc_sust, flgs)) - add_inscription(ptr, "("); - - ptr = inscribe_flags_aux(flag_insc_sust, flgs, kanji, ptr); - *ptr = '\0'; - return ptr; -} - -/*! - * @brief オブジェクト名の特性短縮表記+刻み内容を提示する。 / Get object inscription with auto inscription of object flags. - * @param buff 特性短縮表記を格納する文字列ポインタ - * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ - * @return なし - */ -static void get_inscription(player_type *player_ptr, char *buff, object_type *o_ptr) -{ - concptr insc = quark_str(o_ptr->inscription); - char *ptr = buff; - if (!object_is_fully_known(o_ptr)) { - while (*insc) { - if (*insc == '#') - break; -#ifdef JP - if (iskanji(*insc)) - *buff++ = *insc++; -#endif - *buff++ = *insc++; - } - - *buff = '\0'; - return; - } - - *buff = '\0'; - for (; *insc; insc++) { - if (*insc == '#') - break; - else if ('%' == *insc) { - bool kanji = FALSE; - bool all; - concptr start = ptr; - if (ptr >= buff + MAX_NLEN) - continue; - -#ifdef JP - if ('%' == insc[1]) { - insc++; - kanji = FALSE; - } else - kanji = TRUE; -#endif - - if ('a' == insc[1] && 'l' == insc[2] && 'l' == insc[3]) { - all = TRUE; - insc += 3; - } else - all = FALSE; - - ptr = get_ability_abbreviation(player_ptr, ptr, o_ptr, kanji, all); - if (ptr == start) - add_inscription(ptr, " "); - } else - *ptr++ = *insc; - } - - *ptr = '\0'; -} - -/*! * @brief オブジェクトの各表記を返すメイン関数 / Creates a description of the item "o_ptr", and stores it in "out_val". * @param player_ptr プレーヤーへの参照ポインタ * @param buf 表記を返すための文字列参照ポインタ @@ -1146,7 +690,7 @@ void object_desc(player_type *player_ptr, char *buf, object_type *o_ptr, BIT_FLA if (mode & OD_OMIT_PREFIX) { /* Nothing */ } else if (o_ptr->number > 1) { - t = object_desc_kosuu(t, o_ptr); + t = object_desc_count_japanese(t, o_ptr); t = object_desc_str(t, "の "); } diff --git a/src/object/object-flavor.h b/src/object/object-flavor.h index f3ed4953a..8356e899c 100644 --- a/src/object/object-flavor.h +++ b/src/object/object-flavor.h @@ -7,7 +7,6 @@ void get_table_name(char *out_string); void get_table_sindarin_aux(char *out_string); void get_table_sindarin(char *out_string); void flavor_init(void); -char *object_desc_kosuu(char *t, object_type *o_ptr); void object_desc(player_type *player_ptr, char *buf, object_type *o_ptr, BIT_FLAGS mode); void strip_name(char *buf, KIND_OBJECT_IDX k_idx); bool has_lite_flag(BIT_FLAGS *flags); diff --git a/src/player/player-move.c b/src/player/player-move.c index fd7e28496..c2cd1eb00 100644 --- a/src/player/player-move.c +++ b/src/player/player-move.c @@ -153,6 +153,7 @@ #include "dungeon/dungeon.h" #include "dungeon/quest.h" #include "effect/effect-characteristics.h" +#include "flavor/flavor-util.h" #include "flavor/object-flavor-types.h" #include "floor/floor-object.h" #include "game-option/auto-destruction-options.h" @@ -310,7 +311,7 @@ void py_pickup_aux(player_type *owner_ptr, OBJECT_IDX o_idx) #ifdef JP object_desc(owner_ptr, old_name, o_ptr, OD_NAME_ONLY); - object_desc_kosuu(kazu_str, o_ptr); + object_desc_count_japanese(kazu_str, o_ptr); hirottakazu = o_ptr->number; #endif -- 2.11.0