1 #include "object/object-value-calc.h"
2 #include "artifact/artifact-info.h"
3 #include "object-enchant/activation-info-table.h"
4 #include "object-enchant/object-ego.h"
5 #include "object-enchant/tr-types.h"
6 #include "object-enchant/trc-types.h"
7 #include "object/object-flags.h"
8 #include "object/object-kind.h"
9 #include "system/artifact-type-definition.h"
10 #include "system/object-type-definition.h"
11 #include "system/player-type-definition.h"
12 #include "util/bit-flags-calculator.h"
15 * @brief オブジェクトのフラグ類から価格を算出する /
16 * Return the value of the flags the object has...
17 * @param o_ptr フラグ価格を確認したいオブジェクトの構造体参照ポインタ
18 * @param plusses フラグに与える価格の基本重み
19 * @return オブジェクトのフラグ価格
21 PRICE flag_cost(const ObjectType *o_ptr, int plusses)
24 auto *k_ptr = &k_info[o_ptr->k_idx];
25 auto flgs = object_flags(o_ptr);
28 * Exclude fixed flags of the base item.
29 * pval bonuses of base item will be treated later.
31 flgs.reset(k_ptr->flags);
33 if (o_ptr->is_fixed_artifact()) {
34 auto *a_ptr = &a_info[enum2i(o_ptr->fixed_artifact_idx)];
35 flgs.reset(a_ptr->flags);
36 } else if (o_ptr->is_ego()) {
37 auto *e_ptr = &e_info[o_ptr->ego_idx];
38 flgs.reset(e_ptr->flags);
42 * Calucurate values of remaining flags
44 if (flgs.has(TR_STR)) {
45 total += (1500 * plusses);
47 if (flgs.has(TR_INT)) {
48 total += (1500 * plusses);
50 if (flgs.has(TR_WIS)) {
51 total += (1500 * plusses);
53 if (flgs.has(TR_DEX)) {
54 total += (1500 * plusses);
56 if (flgs.has(TR_CON)) {
57 total += (1500 * plusses);
59 if (flgs.has(TR_CHR)) {
60 total += (750 * plusses);
62 if (flgs.has(TR_MAGIC_MASTERY)) {
63 total += (600 * plusses);
65 if (flgs.has(TR_STEALTH)) {
66 total += (250 * plusses);
68 if (flgs.has(TR_SEARCH)) {
69 total += (100 * plusses);
71 if (flgs.has(TR_INFRA)) {
72 total += (150 * plusses);
74 if (flgs.has(TR_TUNNEL)) {
75 total += (175 * plusses);
77 if ((flgs.has(TR_SPEED)) && (plusses > 0)) {
78 total += (10000 + (2500 * plusses));
80 if ((flgs.has(TR_BLOWS)) && (plusses > 0)) {
81 total += (10000 + (2500 * plusses));
86 if (flgs.has(TR_CHAOTIC)) {
90 if (flgs.has(TR_BRAND_MAGIC)) {
94 if (flgs.has(TR_VAMPIRIC)) {
98 if (flgs.has(TR_FORCE_WEAPON)) {
102 if (flgs.has(TR_KILL_ANIMAL)) {
105 } else if (flgs.has(TR_SLAY_ANIMAL)) {
109 if (flgs.has(TR_KILL_EVIL)) {
112 } else if (flgs.has(TR_SLAY_EVIL)) {
116 if (flgs.has(TR_KILL_GOOD)) {
119 } else if (flgs.has(TR_SLAY_GOOD)) {
123 if (flgs.has(TR_KILL_HUMAN)) {
126 } else if (flgs.has(TR_SLAY_HUMAN)) {
130 if (flgs.has(TR_KILL_UNDEAD)) {
133 } else if (flgs.has(TR_SLAY_UNDEAD)) {
137 if (flgs.has(TR_KILL_DEMON)) {
140 } else if (flgs.has(TR_SLAY_DEMON)) {
144 if (flgs.has(TR_KILL_ORC)) {
147 } else if (flgs.has(TR_SLAY_ORC)) {
151 if (flgs.has(TR_KILL_TROLL)) {
154 } else if (flgs.has(TR_SLAY_TROLL)) {
158 if (flgs.has(TR_KILL_GIANT)) {
161 } else if (flgs.has(TR_SLAY_GIANT)) {
165 if (flgs.has(TR_KILL_DRAGON)) {
168 } else if (flgs.has(TR_SLAY_DRAGON)) {
173 if (flgs.has(TR_VORPAL)) {
177 if (flgs.has(TR_IMPACT)) {
181 if (flgs.has(TR_EARTHQUAKE)) {
185 if (flgs.has(TR_BRAND_POIS)) {
189 if (flgs.has(TR_BRAND_ACID)) {
193 if (flgs.has(TR_BRAND_ELEC)) {
197 if (flgs.has(TR_BRAND_FIRE)) {
201 if (flgs.has(TR_BRAND_COLD)) {
205 total += (tmp_cost * count);
207 if (flgs.has(TR_SUST_STR)) {
210 if (flgs.has(TR_SUST_INT)) {
213 if (flgs.has(TR_SUST_WIS)) {
216 if (flgs.has(TR_SUST_DEX)) {
219 if (flgs.has(TR_SUST_CON)) {
222 if (flgs.has(TR_SUST_CHR)) {
225 if (flgs.has(TR_RIDING)) {
228 if (flgs.has(TR_EASY_SPELL)) {
231 if (flgs.has(TR_THROW)) {
234 if (flgs.has(TR_FREE_ACT)) {
237 if (flgs.has(TR_HOLD_EXP)) {
243 if (flgs.has(TR_IM_ACID)) {
247 if (flgs.has(TR_IM_ELEC)) {
251 if (flgs.has(TR_IM_FIRE)) {
255 if (flgs.has(TR_IM_COLD)) {
259 if (flgs.has(TR_REFLECT)) {
263 if (flgs.has(TR_RES_ACID)) {
267 if (flgs.has(TR_RES_ELEC)) {
271 if (flgs.has(TR_RES_FIRE)) {
275 if (flgs.has(TR_RES_COLD)) {
279 if (flgs.has(TR_RES_POIS)) {
283 if (flgs.has(TR_RES_FEAR)) {
287 if (flgs.has(TR_RES_LITE)) {
291 if (flgs.has(TR_RES_DARK)) {
295 if (flgs.has(TR_RES_BLIND)) {
299 if (flgs.has(TR_RES_CONF)) {
303 if (flgs.has(TR_RES_SOUND)) {
307 if (flgs.has(TR_RES_SHARDS)) {
311 if (flgs.has(TR_RES_NETHER)) {
315 if (flgs.has(TR_RES_NEXUS)) {
319 if (flgs.has(TR_RES_CHAOS)) {
323 if (flgs.has(TR_RES_DISEN)) {
327 if (flgs.has(TR_RES_TIME)) {
331 if (flgs.has(TR_RES_WATER)) {
335 total += (tmp_cost * count);
337 if (flgs.has(TR_RES_CURSE)) {
340 if (flgs.has(TR_SH_FIRE)) {
343 if (flgs.has(TR_SH_ELEC)) {
346 if (flgs.has(TR_SH_COLD)) {
349 if (flgs.has(TR_NO_TELE)) {
352 if (flgs.has(TR_NO_MAGIC)) {
355 if (flgs.has(TR_TY_CURSE)) {
358 if (flgs.has(TR_HIDE_TYPE)) {
361 if (flgs.has(TR_SHOW_MODS)) {
364 if (flgs.has(TR_LEVITATION)) {
367 if (flgs.has(TR_LITE_1)) {
370 if (flgs.has(TR_LITE_2)) {
373 if (flgs.has(TR_LITE_3)) {
376 if (flgs.has(TR_LITE_M1)) {
379 if (flgs.has(TR_LITE_M2)) {
382 if (flgs.has(TR_LITE_M3)) {
385 if (flgs.has(TR_SEE_INVIS)) {
388 if (flgs.has(TR_TELEPATHY)) {
391 if (flgs.has(TR_ESP_ANIMAL)) {
394 if (flgs.has(TR_ESP_UNDEAD)) {
397 if (flgs.has(TR_ESP_DEMON)) {
400 if (flgs.has(TR_ESP_ORC)) {
403 if (flgs.has(TR_ESP_TROLL)) {
406 if (flgs.has(TR_ESP_GIANT)) {
409 if (flgs.has(TR_ESP_DRAGON)) {
412 if (flgs.has(TR_ESP_HUMAN)) {
415 if (flgs.has(TR_ESP_EVIL)) {
418 if (flgs.has(TR_ESP_GOOD)) {
421 if (flgs.has(TR_ESP_NONLIVING)) {
424 if (flgs.has(TR_ESP_UNIQUE)) {
427 if (flgs.has(TR_SLOW_DIGEST)) {
430 if (flgs.has(TR_REGEN)) {
433 if (flgs.has(TR_WARNING)) {
436 if (flgs.has(TR_DEC_MANA)) {
439 if (flgs.has(TR_XTRA_MIGHT)) {
442 if (flgs.has(TR_XTRA_SHOTS)) {
445 if (flgs.has(TR_IGNORE_ACID)) {
448 if (flgs.has(TR_IGNORE_ELEC)) {
451 if (flgs.has(TR_IGNORE_FIRE)) {
454 if (flgs.has(TR_IGNORE_COLD)) {
457 if (flgs.has(TR_ACTIVATE)) {
460 if (flgs.has(TR_DRAIN_EXP)) {
463 if (flgs.has(TR_DRAIN_HP)) {
466 if (flgs.has(TR_DRAIN_MANA)) {
469 if (flgs.has(TR_CALL_ANIMAL)) {
472 if (flgs.has(TR_CALL_DEMON)) {
475 if (flgs.has(TR_CALL_DRAGON)) {
478 if (flgs.has(TR_CALL_UNDEAD)) {
481 if (flgs.has(TR_COWARDICE)) {
484 if (flgs.has(TR_LOW_MELEE)) {
487 if (flgs.has(TR_LOW_AC)) {
490 if (flgs.has(TR_HARD_SPELL)) {
493 if (flgs.has(TR_FAST_DIGEST)) {
496 if (flgs.has(TR_SLOW_REGEN)) {
499 if (flgs.has(TR_TELEPORT)) {
500 if (o_ptr->is_cursed()) {
506 if (flgs.has(TR_VUL_CURSE)) {
510 if (flgs.has(TR_AGGRAVATE)) {
513 if (flgs.has(TR_BLESSED)) {
516 if (o_ptr->curse_flags.has(CurseTraitType::ADD_L_CURSE)) {
519 if (o_ptr->curse_flags.has(CurseTraitType::ADD_H_CURSE)) {
522 if (o_ptr->curse_flags.has(CurseTraitType::CURSED)) {
525 if (o_ptr->curse_flags.has(CurseTraitType::HEAVY_CURSE)) {
528 if (o_ptr->curse_flags.has(CurseTraitType::PERSISTENT_CURSE)) {
531 if (o_ptr->curse_flags.has(CurseTraitType::PERMA_CURSE)) {
535 /* Also, give some extra for activatable powers... */
536 if (o_ptr->art_name && (o_ptr->art_flags.has(TR_ACTIVATE))) {
537 auto act_ptr = find_activation_info(o_ptr);
538 if (act_ptr.has_value()) {
539 total += act_ptr.value()->value;