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-scroll-types.h"
11 #include "sv-definition/sv-weapon-types.h"
12 #include "system/object-type-definition.h"
13 #include "util/bit-flags-calculator.h"
14 #include "util/string-processor.h"
17 * @brief オブジェクトが祝福されているかの判定を返す /
18 * @param o_ptr 判定したいオブジェクト構造体の参照ポインタ
19 * @return アイテムが祝福されたアイテムならばTRUEを返す
21 static bool is_blessed_item(player_type *player_ptr, object_type *o_ptr)
23 BIT_FLAGS flgs[TR_FLAG_SIZE];
24 object_flags(player_ptr, o_ptr, flgs);
25 return has_flag(flgs, TR_BLESSED);
28 static bool check_store_general(object_type *o_ptr)
30 switch (o_ptr->tval) {
32 if (o_ptr->sval != SV_POTION_WATER)
55 static bool check_store_armoury(object_type *o_ptr)
57 switch (o_ptr->tval) {
73 static bool check_store_weapon(object_type *o_ptr)
75 switch (o_ptr->tval) {
83 case TV_HISSATSU_BOOK:
86 return o_ptr->sval != SV_WIZSTAFF;
92 static bool check_store_temple(player_type *player_ptr, object_type *o_ptr)
94 switch (o_ptr->tval) {
103 monster_race *r_ptr = &r_info[o_ptr->pval];
104 if (!(r_ptr->flags3 & RF3_EVIL))
105 if (((r_ptr->flags3 & RF3_GOOD) != 0) || ((r_ptr->flags3 & RF3_ANIMAL) != 0) || (angband_strchr("?!", r_ptr->d_char) != NULL))
111 if (is_blessed_item(player_ptr, o_ptr))
120 static bool check_store_alchemist(object_type *o_ptr)
122 switch (o_ptr->tval) {
131 static bool check_store_magic(object_type *o_ptr)
133 switch (o_ptr->tval) {
134 case TV_SORCERY_BOOK:
154 return o_ptr->sval == SV_WIZSTAFF;
160 static bool check_store_book(object_type *o_ptr)
162 switch (o_ptr->tval) {
163 case TV_SORCERY_BOOK:
172 case TV_CRUSADE_BOOK:
181 static bool switch_store_check(player_type *player_ptr, object_type *o_ptr)
183 switch (cur_store_num) {
185 return check_store_general(o_ptr);
187 return check_store_armoury(o_ptr);
189 return check_store_weapon(o_ptr);
191 return check_store_temple(player_ptr, o_ptr);
192 case STORE_ALCHEMIST:
193 return check_store_alchemist(o_ptr);
195 return check_store_magic(o_ptr);
197 return check_store_book(o_ptr);
204 * @brief オブジェクトが所定の店舗で引き取れるかどうかを返す /
205 * Determine if the current store will purchase the given item
206 * @param o_ptr 判定したいオブジェクト構造体の参照ポインタ
207 * @return アイテムが買い取れるならばTRUEを返す
209 * Note that a shop-keeper must refuse to buy "worthless" items
211 bool store_will_buy(player_type *player_ptr, object_type *o_ptr)
213 if ((cur_store_num == STORE_HOME) || (cur_store_num == STORE_MUSEUM))
216 if (!switch_store_check(player_ptr, o_ptr))
219 return object_value(player_ptr, o_ptr) > 0;
222 static int mass_lite_produce(const PRICE cost)
226 size += damroll(3, 5);
229 size += damroll(3, 5);
232 size += damroll(2, 2);
237 static int mass_scroll_produce(object_type *o_ptr, const PRICE cost)
241 size += damroll(3, 5);
244 size += damroll(1, 5);
246 if (o_ptr->sval == SV_SCROLL_STAR_IDENTIFY)
247 size += damroll(3, 5);
249 if (o_ptr->sval == SV_SCROLL_STAR_REMOVE_CURSE)
250 size += damroll(1, 4);
255 static int mass_book_produce(const PRICE cost)
259 size += damroll(2, 3);
262 size += damroll(1, 3);
267 static int mass_equipment_produce(object_type *o_ptr, const PRICE cost)
270 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
274 size += damroll(3, 5);
277 size += damroll(3, 5);
282 static int mass_arrow_produce(const PRICE cost)
286 size += damroll(5, 5);
289 size += damroll(5, 5);
292 size += damroll(5, 5);
297 static int mass_figurine_produce(const PRICE cost)
301 size += damroll(2, 2);
304 size += damroll(2, 2);
309 static int mass_magic_produce(const PRICE cost)
312 if ((cur_store_num != STORE_BLACK) || !one_in_(3))
316 size += damroll(1, 5);
317 else if (cost < 3201L)
318 size += damroll(1, 3);
323 static int switch_mass_production(object_type *o_ptr, const PRICE cost)
325 switch (o_ptr->tval) {
329 return mass_lite_produce(cost);
332 return mass_scroll_produce(o_ptr, cost);
334 case TV_SORCERY_BOOK:
342 case TV_CRUSADE_BOOK:
344 case TV_HISSATSU_BOOK:
346 return mass_book_produce(cost);
360 return mass_equipment_produce(o_ptr, cost);
365 return mass_arrow_produce(cost);
367 return mass_figurine_produce(cost);
375 return mass_magic_produce(cost);
381 static DISCOUNT_RATE decide_discount_rate(const PRICE cost)
402 * @brief 安価な消耗品の販売数を増やし、低確率で割引にする /
403 * Certain "cheap" objects should be created in "piles"
404 * @param o_ptr 店舗に並べるオブジェクト構造体の参照ポインタ
408 * Some objects can be sold at a "discount" (in small piles)
411 void mass_produce(player_type *player_ptr, object_type *o_ptr)
413 const PRICE cost = object_value(player_ptr, o_ptr);
414 int size = switch_mass_production(o_ptr, cost);
415 DISCOUNT_RATE discount = decide_discount_rate(cost);
419 o_ptr->discount = discount;
420 o_ptr->number = size - (size * discount / 100);
421 if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
422 o_ptr->pval *= (PARAMETER_VALUE)o_ptr->number;