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)
56 static bool check_store_armoury(object_type *o_ptr)
58 switch (o_ptr->tval) {
74 static bool check_store_weapon(object_type *o_ptr)
76 switch (o_ptr->tval) {
84 case TV_HISSATSU_BOOK:
87 return o_ptr->sval != SV_WIZSTAFF;
93 static bool check_store_temple(player_type *player_ptr, object_type *o_ptr)
95 switch (o_ptr->tval) {
104 monster_race *r_ptr = &r_info[o_ptr->pval];
105 if (!(r_ptr->flags3 & RF3_EVIL))
106 if (((r_ptr->flags3 & RF3_GOOD) != 0) || ((r_ptr->flags3 & RF3_ANIMAL) != 0) || (angband_strchr("?!", r_ptr->d_char) != NULL))
112 if (is_blessed_item(player_ptr, o_ptr))
121 static bool check_store_alchemist(object_type *o_ptr)
123 switch (o_ptr->tval) {
132 static bool check_store_magic(object_type *o_ptr)
134 switch (o_ptr->tval) {
135 case TV_SORCERY_BOOK:
155 return o_ptr->sval == SV_WIZSTAFF;
161 static bool check_store_book(object_type *o_ptr)
163 switch (o_ptr->tval) {
164 case TV_SORCERY_BOOK:
173 case TV_CRUSADE_BOOK:
182 static bool switch_store_check(player_type *player_ptr, object_type *o_ptr)
184 switch (cur_store_num) {
186 return check_store_general(o_ptr);
188 return check_store_armoury(o_ptr);
190 return check_store_weapon(o_ptr);
192 return check_store_temple(player_ptr, o_ptr);
193 case STORE_ALCHEMIST:
194 return check_store_alchemist(o_ptr);
196 return check_store_magic(o_ptr);
198 return check_store_book(o_ptr);
205 * @brief オブジェクトが所定の店舗で引き取れるかどうかを返す /
206 * Determine if the current store will purchase the given item
207 * @param o_ptr 判定したいオブジェクト構造体の参照ポインタ
208 * @return アイテムが買い取れるならばTRUEを返す
210 * Note that a shop-keeper must refuse to buy "worthless" items
212 bool store_will_buy(player_type *player_ptr, object_type *o_ptr)
214 if ((cur_store_num == STORE_HOME) || (cur_store_num == STORE_MUSEUM))
217 if (!switch_store_check(player_ptr, o_ptr))
220 return object_value(player_ptr, o_ptr) > 0;
223 static int mass_lite_produce(const PRICE cost)
227 size += damroll(3, 5);
230 size += damroll(3, 5);
233 size += damroll(2, 2);
238 static int mass_scroll_produce(object_type *o_ptr, const PRICE cost)
242 size += damroll(3, 5);
245 size += damroll(1, 5);
247 if (o_ptr->sval == SV_SCROLL_STAR_IDENTIFY)
248 size += damroll(3, 5);
250 if (o_ptr->sval == SV_SCROLL_STAR_REMOVE_CURSE)
251 size += damroll(1, 4);
256 static int mass_book_produce(const PRICE cost)
260 size += damroll(2, 3);
263 size += damroll(1, 3);
268 static int mass_equipment_produce(object_type *o_ptr, const PRICE cost)
271 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
275 size += damroll(3, 5);
278 size += damroll(3, 5);
283 static int mass_arrow_produce(const PRICE cost)
287 size += damroll(5, 5);
290 size += damroll(5, 5);
293 size += damroll(5, 5);
298 static int mass_figurine_produce(const PRICE cost)
302 size += damroll(2, 2);
305 size += damroll(2, 2);
310 static int mass_magic_produce(const PRICE cost)
313 if ((cur_store_num != STORE_BLACK) || !one_in_(3))
317 size += damroll(1, 5);
318 else if (cost < 3201L)
319 size += damroll(1, 3);
324 static int switch_mass_production(object_type *o_ptr, const PRICE cost)
326 switch (o_ptr->tval) {
330 return mass_lite_produce(cost);
333 return mass_scroll_produce(o_ptr, cost);
335 case TV_SORCERY_BOOK:
343 case TV_CRUSADE_BOOK:
345 case TV_HISSATSU_BOOK:
347 return mass_book_produce(cost);
361 return mass_equipment_produce(o_ptr, cost);
366 return mass_arrow_produce(cost);
368 return mass_figurine_produce(cost);
376 return mass_magic_produce(cost);
382 static DISCOUNT_RATE decide_discount_rate(const PRICE cost)
403 * @brief 安価な消耗品の販売数を増やし、低確率で割引にする /
404 * Certain "cheap" objects should be created in "piles"
405 * @param o_ptr 店舗に並べるオブジェクト構造体の参照ポインタ
409 * Some objects can be sold at a "discount" (in small piles)
412 void mass_produce(player_type *player_ptr, object_type *o_ptr)
414 const PRICE cost = object_value(player_ptr, o_ptr);
415 int size = switch_mass_production(o_ptr, cost);
416 DISCOUNT_RATE discount = decide_discount_rate(cost);
420 o_ptr->discount = discount;
421 o_ptr->number = size - (size * discount / 100);
422 if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_WAND))
423 o_ptr->pval *= (PARAMETER_VALUE)o_ptr->number;