1 #include "store/service-checker.h"
2 #include "monster-race/monster-race.h"
3 #include "monster-race/race-flags3.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-value.h"
8 #include "store/store-util.h"
9 #include "sv-definition/sv-potion-types.h"
10 #include "sv-definition/sv-rod-types.h"
11 #include "sv-definition/sv-scroll-types.h"
12 #include "sv-definition/sv-weapon-types.h"
13 #include "system/monster-race-definition.h"
14 #include "system/object-type-definition.h"
15 #include "system/player-type-definition.h"
16 #include "util/bit-flags-calculator.h"
17 #include "util/string-processor.h"
20 * @brief オブジェクトが祝福されているかの判定を返す /
21 * @param o_ptr 判定したいオブジェクト構造体の参照ポインタ
22 * @return アイテムが祝福されたアイテムならばTRUEを返す
24 static bool is_blessed_item(player_type *player_ptr, object_type *o_ptr)
26 BIT_FLAGS flgs[TR_FLAG_SIZE];
27 object_flags(player_ptr, o_ptr, flgs);
28 return has_flag(flgs, TR_BLESSED);
31 static bool check_store_general(object_type *o_ptr)
33 switch (o_ptr->tval) {
35 return (o_ptr->sval == SV_ROD_PESTICIDE);
37 return (o_ptr->sval == SV_POTION_WATER);
59 static bool check_store_armoury(object_type *o_ptr)
61 switch (o_ptr->tval) {
77 static bool check_store_weapon(object_type *o_ptr)
79 switch (o_ptr->tval) {
87 case TV_HISSATSU_BOOK:
90 return o_ptr->sval != SV_WIZSTAFF;
96 static bool check_store_temple(player_type *player_ptr, object_type *o_ptr)
98 switch (o_ptr->tval) {
100 case TV_CRUSADE_BOOK:
107 monster_race *r_ptr = &r_info[o_ptr->pval];
108 if (!(r_ptr->flags3 & RF3_EVIL))
109 if (((r_ptr->flags3 & RF3_GOOD) != 0) || ((r_ptr->flags3 & RF3_ANIMAL) != 0) || (angband_strchr("?!", r_ptr->d_char) != NULL))
115 if (is_blessed_item(player_ptr, o_ptr))
124 static bool check_store_alchemist(object_type *o_ptr)
126 switch (o_ptr->tval) {
135 static bool check_store_magic(object_type *o_ptr)
137 switch (o_ptr->tval) {
138 case TV_SORCERY_BOOK:
158 return o_ptr->sval == SV_WIZSTAFF;
164 static bool check_store_book(object_type *o_ptr)
166 switch (o_ptr->tval) {
167 case TV_SORCERY_BOOK:
176 case TV_CRUSADE_BOOK:
185 static bool switch_store_check(player_type *player_ptr, object_type *o_ptr)
187 switch (cur_store_num) {
189 return check_store_general(o_ptr);
191 return check_store_armoury(o_ptr);
193 return check_store_weapon(o_ptr);
195 return check_store_temple(player_ptr, o_ptr);
196 case STORE_ALCHEMIST:
197 return check_store_alchemist(o_ptr);
199 return check_store_magic(o_ptr);
201 return check_store_book(o_ptr);
208 * @brief オブジェクトが所定の店舗で引き取れるかどうかを返す /
209 * Determine if the current store will purchase the given item
210 * @param o_ptr 判定したいオブジェクト構造体の参照ポインタ
211 * @return アイテムが買い取れるならばTRUEを返す
213 * Note that a shop-keeper must refuse to buy "worthless" items
215 bool store_will_buy(player_type *player_ptr, object_type *o_ptr)
217 if ((cur_store_num == STORE_HOME) || (cur_store_num == STORE_MUSEUM))
220 if (!switch_store_check(player_ptr, o_ptr))
223 return object_value(player_ptr, o_ptr) > 0;
226 static int mass_lite_produce(const PRICE cost)
230 size += damroll(3, 5);
233 size += damroll(3, 5);
236 size += damroll(2, 2);
241 static int mass_scroll_produce(object_type *o_ptr, const PRICE cost)
245 size += damroll(3, 5);
248 size += damroll(1, 5);
250 if (o_ptr->sval == SV_SCROLL_STAR_IDENTIFY)
251 size += damroll(3, 5);
253 if (o_ptr->sval == SV_SCROLL_STAR_REMOVE_CURSE)
254 size += damroll(1, 4);
259 static int mass_book_produce(const PRICE cost)
263 size += damroll(2, 3);
266 size += damroll(1, 3);
271 static int mass_equipment_produce(object_type *o_ptr, const PRICE cost)
274 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
278 size += damroll(3, 5);
281 size += damroll(3, 5);
286 static int mass_arrow_produce(const PRICE cost)
290 size += damroll(5, 5);
293 size += damroll(5, 5);
296 size += damroll(5, 5);
301 static int mass_figurine_produce(const PRICE cost)
305 size += damroll(2, 2);
308 size += damroll(2, 2);
313 static int mass_magic_produce(const PRICE cost)
316 if ((cur_store_num != STORE_BLACK) || !one_in_(3))
320 size += damroll(1, 5);
321 else if (cost < 3201L)
322 size += damroll(1, 3);
327 static int switch_mass_production(object_type *o_ptr, const PRICE cost)
329 switch (o_ptr->tval) {
333 return mass_lite_produce(cost);
336 return mass_scroll_produce(o_ptr, cost);
338 case TV_SORCERY_BOOK:
346 case TV_CRUSADE_BOOK:
348 case TV_HISSATSU_BOOK:
350 return mass_book_produce(cost);
364 return mass_equipment_produce(o_ptr, cost);
369 return mass_arrow_produce(cost);
371 return mass_figurine_produce(cost);
379 return mass_magic_produce(cost);
385 static DISCOUNT_RATE decide_discount_rate(const PRICE cost)
406 * @brief 安価な消耗品の販売数を増やし、低確率で割引にする /
407 * Certain "cheap" objects should be created in "piles"
408 * @param o_ptr 店舗に並べるオブジェクト構造体の参照ポインタ
411 * Some objects can be sold at a "discount" (in small piles)
414 void mass_produce(player_type *player_ptr, object_type *o_ptr)
416 const PRICE cost = object_value(player_ptr, o_ptr);
417 int size = switch_mass_production(o_ptr, cost);
418 DISCOUNT_RATE discount = decide_discount_rate(cost);
422 o_ptr->discount = discount;
423 o_ptr->number = size - (size * discount / 100);
424 if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
425 o_ptr->pval *= (PARAMETER_VALUE)o_ptr->number;