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 "system/artifact-type-definition.h"
8 #include "system/baseitem-info.h"
9 #include "system/item-entity.h"
10 #include "system/player-type-definition.h"
11 #include "util/bit-flags-calculator.h"
14 * @brief オブジェクトのフラグ類から価格を算出する /
15 * Return the value of the flags the object has...
16 * @param o_ptr フラグ価格を確認したいオブジェクトの構造体参照ポインタ
17 * @param plusses フラグに与える価格の基本重み
18 * @return オブジェクトのフラグ価格
20 PRICE flag_cost(const ItemEntity *o_ptr, int plusses)
23 auto flags = o_ptr->get_flags();
24 const auto &baseitem = o_ptr->get_baseitem();
25 flags.reset(baseitem.flags);
27 if (o_ptr->is_fixed_artifact()) {
28 const auto &artifact = o_ptr->get_fixed_artifact();
29 flags.reset(artifact.flags);
30 } else if (o_ptr->is_ego()) {
31 const auto &ego = o_ptr->get_ego();
32 flags.reset(ego.flags);
36 * Calucurate values of remaining flags
38 if (flags.has(TR_STR)) {
39 total += (1500 * plusses);
41 if (flags.has(TR_INT)) {
42 total += (1500 * plusses);
44 if (flags.has(TR_WIS)) {
45 total += (1500 * plusses);
47 if (flags.has(TR_DEX)) {
48 total += (1500 * plusses);
50 if (flags.has(TR_CON)) {
51 total += (1500 * plusses);
53 if (flags.has(TR_CHR)) {
54 total += (750 * plusses);
56 if (flags.has(TR_MAGIC_MASTERY)) {
57 total += (600 * plusses);
59 if (flags.has(TR_STEALTH)) {
60 total += (250 * plusses);
62 if (flags.has(TR_SEARCH)) {
63 total += (100 * plusses);
65 if (flags.has(TR_INFRA)) {
66 total += (150 * plusses);
68 if (flags.has(TR_TUNNEL)) {
69 total += (175 * plusses);
71 if ((flags.has(TR_SPEED)) && (plusses > 0)) {
72 total += (10000 + (2500 * plusses));
74 if ((flags.has(TR_BLOWS)) && (plusses > 0)) {
75 total += (10000 + (2500 * plusses));
80 if (flags.has(TR_CHAOTIC)) {
84 if (flags.has(TR_BRAND_MAGIC)) {
88 if (flags.has(TR_VAMPIRIC)) {
92 if (flags.has(TR_FORCE_WEAPON)) {
96 if (flags.has(TR_KILL_ANIMAL)) {
99 } else if (flags.has(TR_SLAY_ANIMAL)) {
103 if (flags.has(TR_KILL_EVIL)) {
106 } else if (flags.has(TR_SLAY_EVIL)) {
110 if (flags.has(TR_KILL_GOOD)) {
113 } else if (flags.has(TR_SLAY_GOOD)) {
117 if (flags.has(TR_KILL_HUMAN)) {
120 } else if (flags.has(TR_SLAY_HUMAN)) {
124 if (flags.has(TR_KILL_UNDEAD)) {
127 } else if (flags.has(TR_SLAY_UNDEAD)) {
131 if (flags.has(TR_KILL_DEMON)) {
134 } else if (flags.has(TR_SLAY_DEMON)) {
138 if (flags.has(TR_KILL_ORC)) {
141 } else if (flags.has(TR_SLAY_ORC)) {
145 if (flags.has(TR_KILL_TROLL)) {
148 } else if (flags.has(TR_SLAY_TROLL)) {
152 if (flags.has(TR_KILL_GIANT)) {
155 } else if (flags.has(TR_SLAY_GIANT)) {
159 if (flags.has(TR_KILL_DRAGON)) {
162 } else if (flags.has(TR_SLAY_DRAGON)) {
167 if (flags.has(TR_VORPAL)) {
171 if (flags.has(TR_IMPACT)) {
175 if (flags.has(TR_EARTHQUAKE)) {
179 if (flags.has(TR_BRAND_POIS)) {
183 if (flags.has(TR_BRAND_ACID)) {
187 if (flags.has(TR_BRAND_ELEC)) {
191 if (flags.has(TR_BRAND_FIRE)) {
195 if (flags.has(TR_BRAND_COLD)) {
199 total += (tmp_cost * count);
201 if (flags.has(TR_SUST_STR)) {
204 if (flags.has(TR_SUST_INT)) {
207 if (flags.has(TR_SUST_WIS)) {
210 if (flags.has(TR_SUST_DEX)) {
213 if (flags.has(TR_SUST_CON)) {
216 if (flags.has(TR_SUST_CHR)) {
219 if (flags.has(TR_RIDING)) {
222 if (flags.has(TR_EASY_SPELL)) {
225 if (flags.has(TR_THROW)) {
228 if (flags.has(TR_FREE_ACT)) {
231 if (flags.has(TR_HOLD_EXP)) {
237 if (flags.has(TR_IM_ACID)) {
241 if (flags.has(TR_IM_ELEC)) {
245 if (flags.has(TR_IM_FIRE)) {
249 if (flags.has(TR_IM_COLD)) {
253 if (flags.has(TR_REFLECT)) {
257 if (flags.has(TR_RES_ACID)) {
261 if (flags.has(TR_RES_ELEC)) {
265 if (flags.has(TR_RES_FIRE)) {
269 if (flags.has(TR_RES_COLD)) {
273 if (flags.has(TR_RES_POIS)) {
277 if (flags.has(TR_RES_FEAR)) {
281 if (flags.has(TR_RES_LITE)) {
285 if (flags.has(TR_RES_DARK)) {
289 if (flags.has(TR_RES_BLIND)) {
293 if (flags.has(TR_RES_CONF)) {
297 if (flags.has(TR_RES_SOUND)) {
301 if (flags.has(TR_RES_SHARDS)) {
305 if (flags.has(TR_RES_NETHER)) {
309 if (flags.has(TR_RES_NEXUS)) {
313 if (flags.has(TR_RES_CHAOS)) {
317 if (flags.has(TR_RES_DISEN)) {
321 if (flags.has(TR_RES_TIME)) {
325 if (flags.has(TR_RES_WATER)) {
329 total += (tmp_cost * count);
331 if (flags.has(TR_RES_CURSE)) {
334 if (flags.has(TR_SH_FIRE)) {
337 if (flags.has(TR_SH_ELEC)) {
340 if (flags.has(TR_SH_COLD)) {
343 if (flags.has(TR_NO_TELE)) {
346 if (flags.has(TR_NO_MAGIC)) {
349 if (flags.has(TR_TY_CURSE)) {
352 if (flags.has(TR_HIDE_TYPE)) {
355 if (flags.has(TR_SHOW_MODS)) {
358 if (flags.has(TR_LEVITATION)) {
361 if (flags.has(TR_LITE_1)) {
364 if (flags.has(TR_LITE_2)) {
367 if (flags.has(TR_LITE_3)) {
370 if (flags.has(TR_LITE_M1)) {
373 if (flags.has(TR_LITE_M2)) {
376 if (flags.has(TR_LITE_M3)) {
379 if (flags.has(TR_SEE_INVIS)) {
382 if (flags.has(TR_TELEPATHY)) {
385 if (flags.has(TR_ESP_ANIMAL)) {
388 if (flags.has(TR_ESP_UNDEAD)) {
391 if (flags.has(TR_ESP_DEMON)) {
394 if (flags.has(TR_ESP_ORC)) {
397 if (flags.has(TR_ESP_TROLL)) {
400 if (flags.has(TR_ESP_GIANT)) {
403 if (flags.has(TR_ESP_DRAGON)) {
406 if (flags.has(TR_ESP_HUMAN)) {
409 if (flags.has(TR_ESP_EVIL)) {
412 if (flags.has(TR_ESP_GOOD)) {
415 if (flags.has(TR_ESP_NONLIVING)) {
418 if (flags.has(TR_ESP_UNIQUE)) {
421 if (flags.has(TR_SLOW_DIGEST)) {
424 if (flags.has(TR_REGEN)) {
427 if (flags.has(TR_WARNING)) {
430 if (flags.has(TR_DEC_MANA)) {
433 if (flags.has(TR_XTRA_MIGHT)) {
436 if (flags.has(TR_XTRA_SHOTS)) {
439 if (flags.has(TR_IGNORE_ACID)) {
442 if (flags.has(TR_IGNORE_ELEC)) {
445 if (flags.has(TR_IGNORE_FIRE)) {
448 if (flags.has(TR_IGNORE_COLD)) {
451 if (flags.has(TR_ACTIVATE)) {
454 if (flags.has(TR_DRAIN_EXP)) {
457 if (flags.has(TR_DRAIN_HP)) {
460 if (flags.has(TR_DRAIN_MANA)) {
463 if (flags.has(TR_CALL_ANIMAL)) {
466 if (flags.has(TR_CALL_DEMON)) {
469 if (flags.has(TR_CALL_DRAGON)) {
472 if (flags.has(TR_CALL_UNDEAD)) {
475 if (flags.has(TR_COWARDICE)) {
478 if (flags.has(TR_LOW_MELEE)) {
481 if (flags.has(TR_LOW_AC)) {
484 if (flags.has(TR_HARD_SPELL)) {
487 if (flags.has(TR_FAST_DIGEST)) {
490 if (flags.has(TR_SLOW_REGEN)) {
493 if (flags.has(TR_TELEPORT)) {
494 if (o_ptr->is_cursed()) {
500 if (flags.has(TR_VUL_CURSE)) {
504 if (flags.has(TR_AGGRAVATE)) {
507 if (flags.has(TR_BLESSED)) {
510 if (o_ptr->curse_flags.has(CurseTraitType::ADD_L_CURSE)) {
513 if (o_ptr->curse_flags.has(CurseTraitType::ADD_H_CURSE)) {
516 if (o_ptr->curse_flags.has(CurseTraitType::CURSED)) {
519 if (o_ptr->curse_flags.has(CurseTraitType::HEAVY_CURSE)) {
522 if (o_ptr->curse_flags.has(CurseTraitType::PERSISTENT_CURSE)) {
525 if (o_ptr->curse_flags.has(CurseTraitType::PERMA_CURSE)) {
529 /* Also, give some extra for activatable powers... */
530 if (o_ptr->is_random_artifact() && o_ptr->art_flags.has(TR_ACTIVATE)) {
531 auto act_ptr = find_activation_info(o_ptr);
532 if (act_ptr.has_value()) {
533 total += act_ptr.value()->value;