1 #include "flavor/flavor-util.h"
2 #include "flavor/flag-inscriptions-table.h"
3 #include "object-enchant/tr-flags.h"
4 #include "object-enchant/tr-types.h"
5 #include "object/tval-types.h"
6 #include "sv-definition/sv-food-types.h"
7 #include "system/artifact-type-definition.h"
8 #include "system/item-entity.h"
9 #include "util/string-processor.h"
12 static bool has_lite_flag(const TrFlags &flags)
14 return flags.has(TR_LITE_1) || flags.has(TR_LITE_2) || flags.has(TR_LITE_3);
17 static bool has_dark_flag(const TrFlags &flags)
19 return flags.has(TR_LITE_M1) || flags.has(TR_LITE_M2) || flags.has(TR_LITE_M3);
23 * @brief get_inscriptionのサブセットとしてアイテムの特性フラグを表す文字列を返す
24 * @param fi_vec 参照する特性表示記号テーブル
25 * @param flags 対応するアイテムの特性フラグ
26 * @param is_kanji trueならば漢字記述/falseならば英語記述
27 * @return アイテムの特性フラグを表す文字列
29 static std::string inscribe_flags_aux(const std::vector<flag_insc_table> &fi_vec, const TrFlags &flags, [[maybe_unused]] bool is_kanji)
33 for (const auto &fi : fi_vec) {
34 if (flags.has(fi.flag) && (!fi.except_flag || flags.has_not(*fi.except_flag))) {
35 const auto flag_str = _(is_kanji ? fi.japanese : fi.english, fi.english);
44 * @brief オブジェクトの特性表示記号テーブル1つに従いオブジェクトの特性フラグ配列に1つでも該当の特性があるかを返す / Special variation of has_flag for
46 * @param fi_vec 参照する特性表示記号テーブル
47 * @param flags 対応するオブジェクトのフラグ文字列
48 * @return 1つでも該当の特性があったらTRUEを返す。
50 static bool has_flag_of(const std::vector<flag_insc_table> &fi_vec, const TrFlags &flags)
52 for (const auto &fi : fi_vec) {
53 if (flags.has(fi.flag) && (!fi.except_flag || flags.has_not(*fi.except_flag))) {
62 * @brief アイテムの特性短縮表記をまとめて提示する。
63 * @param item 特性短縮表記を得たいアイテムの参照
64 * @param is_kanji trueならば漢字表記 / falseなら英語表記
65 * @param all falseならばベースアイテム上で明らかなフラグは省略する
68 std::string get_ability_abbreviation(const ItemEntity &item, bool is_kanji, bool all)
70 auto flags = item.get_flags();
72 const auto &baseitem = item.get_baseitem();
73 flags.reset(baseitem.flags);
75 if (item.is_fixed_artifact()) {
76 const auto &artifact = item.get_fixed_artifact();
77 flags.reset(artifact.flags);
81 const auto &ego = item.get_ego();
82 flags.reset(ego.flags);
86 if (has_dark_flag(flags)) {
87 if (flags.has(TR_LITE_1)) {
88 flags.reset(TR_LITE_1);
91 if (flags.has(TR_LITE_2)) {
92 flags.reset(TR_LITE_2);
95 if (flags.has(TR_LITE_3)) {
96 flags.reset(TR_LITE_3);
98 } else if (has_lite_flag(flags)) {
100 if (flags.has(TR_LITE_2)) {
101 flags.reset(TR_LITE_2);
104 if (flags.has(TR_LITE_3)) {
105 flags.reset(TR_LITE_3);
109 std::stringstream ss;
110 auto prev_tellp = ss.tellp();
112 if (has_flag_of(flag_insc_plus, flags) && is_kanji) {
116 ss << inscribe_flags_aux(flag_insc_plus, flags, is_kanji);
118 if (has_flag_of(flag_insc_immune, flags)) {
119 if (!is_kanji && (ss.tellp() != prev_tellp)) {
121 prev_tellp = ss.tellp();
127 ss << inscribe_flags_aux(flag_insc_immune, flags, is_kanji);
129 if (has_flag_of(flag_insc_vuln, flags)) {
130 if (!is_kanji && (ss.tellp() != prev_tellp)) {
132 prev_tellp = ss.tellp();
138 ss << inscribe_flags_aux(flag_insc_vuln, flags, is_kanji);
140 if (has_flag_of(flag_insc_resistance, flags)) {
143 } else if (ss.tellp() != prev_tellp) {
145 prev_tellp = ss.tellp();
149 ss << inscribe_flags_aux(flag_insc_resistance, flags, is_kanji);
151 if (has_flag_of(flag_insc_misc, flags) && (ss.tellp() != prev_tellp)) {
153 prev_tellp = ss.tellp();
156 ss << inscribe_flags_aux(flag_insc_misc, flags, is_kanji);
158 if (has_flag_of(flag_insc_aura, flags)) {
162 ss << inscribe_flags_aux(flag_insc_aura, flags, is_kanji);
164 if (has_flag_of(flag_insc_brand, flags)) {
168 ss << inscribe_flags_aux(flag_insc_brand, flags, is_kanji);
170 if (has_flag_of(flag_insc_kill, flags)) {
174 ss << inscribe_flags_aux(flag_insc_kill, flags, is_kanji);
176 if (has_flag_of(flag_insc_slay, flags)) {
180 ss << inscribe_flags_aux(flag_insc_slay, flags, is_kanji);
183 if (has_flag_of(flag_insc_esp1, flags) || has_flag_of(flag_insc_esp2, flags)) {
187 ss << inscribe_flags_aux(flag_insc_esp1, flags, is_kanji)
188 << inscribe_flags_aux(flag_insc_esp2, flags, is_kanji);
190 if (has_flag_of(flag_insc_esp1, flags)) {
194 ss << inscribe_flags_aux(flag_insc_esp1, flags, is_kanji);
196 if (has_flag_of(flag_insc_esp2, flags)) {
200 ss << inscribe_flags_aux(flag_insc_esp2, flags, is_kanji);
203 if (has_flag_of(flag_insc_sust, flags)) {
207 ss << inscribe_flags_aux(flag_insc_sust, flags, is_kanji);
213 * @brief オブジェクト名の特性短縮表記+刻み内容を提示する。 / Get object inscription with auto inscription of object flags.
214 * @param buff 特性短縮表記を格納する文字列ポインタ
215 * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ
217 std::string get_inscription(const ItemEntity &item)
219 if (!item.is_inscribed()) {
223 std::stringstream ss;
225 if (!item.is_fully_known()) {
226 for (std::string_view sv = *item.inscription; !sv.empty(); sv.remove_prefix(1)) {
227 if (sv.front() == '#') {
230 if (ss.tellp() > MAX_INSCRIPTION - 1) {
234 if (iskanji(sv.front())) {
245 for (std::string_view sv = *item.inscription; !sv.empty(); sv.remove_prefix(1)) {
246 switch (sv.front()) {
250 const auto start_pos = ss.tellp();
251 if (start_pos >= MAX_NLEN) {
255 auto is_kanji = false;
257 if ((sv.size() > 1) && ('%' == sv[1])) {
265 if (sv.substr(1, 3) == "all") {
270 ss << get_ability_abbreviation(item, is_kanji, all);
271 if (ss.tellp() == start_pos) {
287 * @brief アイテムにふさわしい助数詞をつけて数を記述する
288 * @param item 数を記述したいアイテムの参照
291 std::string describe_count_with_counter_suffix(const ItemEntity &item)
293 std::stringstream ss;
296 switch (item.bi_key.tval()) {
297 case ItemKindType::BOLT:
298 case ItemKindType::ARROW:
299 case ItemKindType::POLEARM:
300 case ItemKindType::STAFF:
301 case ItemKindType::WAND:
302 case ItemKindType::ROD:
303 case ItemKindType::DIGGING:
306 case ItemKindType::SCROLL:
309 case ItemKindType::POTION:
312 case ItemKindType::LIFE_BOOK:
313 case ItemKindType::SORCERY_BOOK:
314 case ItemKindType::NATURE_BOOK:
315 case ItemKindType::CHAOS_BOOK:
316 case ItemKindType::DEATH_BOOK:
317 case ItemKindType::TRUMP_BOOK:
318 case ItemKindType::ARCANE_BOOK:
319 case ItemKindType::CRAFT_BOOK:
320 case ItemKindType::DEMON_BOOK:
321 case ItemKindType::CRUSADE_BOOK:
322 case ItemKindType::MUSIC_BOOK:
323 case ItemKindType::HISSATSU_BOOK:
324 case ItemKindType::HEX_BOOK:
327 case ItemKindType::SOFT_ARMOR:
328 case ItemKindType::HARD_ARMOR:
329 case ItemKindType::DRAG_ARMOR:
330 case ItemKindType::CLOAK:
333 case ItemKindType::SWORD:
334 case ItemKindType::HAFTED:
335 case ItemKindType::BOW:
338 case ItemKindType::BOOTS:
342 case ItemKindType::CARD:
346 case ItemKindType::FOOD:
347 if (item.bi_key.sval() == SV_FOOD_JERKY) {
353 if (item.number < 10) {