OSDN Git Service

Merge pull request #1054 from shimitei/feature/#1022_extend_autopick_max_line
[hengbandforosx/hengbandosx.git] / src / store / service-checker.cpp
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"
18
19 /*!
20  * @brief オブジェクトが祝福されているかの判定を返す /
21  * @param o_ptr 判定したいオブジェクト構造体の参照ポインタ
22  * @return アイテムが祝福されたアイテムならばTRUEを返す
23  */
24 static bool is_blessed_item(player_type *player_ptr, object_type *o_ptr)
25 {
26     BIT_FLAGS flgs[TR_FLAG_SIZE];
27     object_flags(player_ptr, o_ptr, flgs);
28     return has_flag(flgs, TR_BLESSED);
29 }
30
31 static bool check_store_general(object_type *o_ptr)
32 {
33     switch (o_ptr->tval) {
34     case TV_ROD:
35         return (o_ptr->sval == SV_ROD_PESTICIDE);
36     case TV_POTION:
37         return (o_ptr->sval == SV_POTION_WATER);
38     case TV_WHISTLE:
39     case TV_FOOD:
40     case TV_LITE:
41     case TV_FLASK:
42     case TV_SPIKE:
43     case TV_SHOT:
44     case TV_ARROW:
45     case TV_BOLT:
46     case TV_DIGGING:
47     case TV_CLOAK:
48     case TV_BOTTLE:
49     case TV_FIGURINE:
50     case TV_STATUE:
51     case TV_CAPTURE:
52     case TV_CARD:
53         return TRUE;
54     default:
55         return FALSE;
56     }
57 }
58
59 static bool check_store_armoury(object_type *o_ptr)
60 {
61     switch (o_ptr->tval) {
62     case TV_BOOTS:
63     case TV_GLOVES:
64     case TV_CROWN:
65     case TV_HELM:
66     case TV_SHIELD:
67     case TV_CLOAK:
68     case TV_SOFT_ARMOR:
69     case TV_HARD_ARMOR:
70     case TV_DRAG_ARMOR:
71         return TRUE;
72     default:
73         return FALSE;
74     }
75 }
76
77 static bool check_store_weapon(object_type *o_ptr)
78 {
79     switch (o_ptr->tval) {
80     case TV_SHOT:
81     case TV_BOLT:
82     case TV_ARROW:
83     case TV_BOW:
84     case TV_DIGGING:
85     case TV_POLEARM:
86     case TV_SWORD:
87     case TV_HISSATSU_BOOK:
88         return TRUE;
89     case TV_HAFTED:
90         return o_ptr->sval != SV_WIZSTAFF;
91     default:
92         return FALSE;
93     }
94 }
95
96 static bool check_store_temple(player_type *player_ptr, object_type *o_ptr)
97 {
98     switch (o_ptr->tval) {
99     case TV_LIFE_BOOK:
100     case TV_CRUSADE_BOOK:
101     case TV_SCROLL:
102     case TV_POTION:
103     case TV_HAFTED:
104         return TRUE;
105     case TV_FIGURINE:
106     case TV_STATUE: {
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))
110                 return TRUE;
111     }
112         /* Fall through */
113     case TV_POLEARM:
114     case TV_SWORD:
115         if (is_blessed_item(player_ptr, o_ptr))
116             return TRUE;
117
118         /* Fall through */
119     default:
120         return FALSE;
121     }
122 }
123
124 static bool check_store_alchemist(object_type *o_ptr)
125 {
126     switch (o_ptr->tval) {
127     case TV_SCROLL:
128     case TV_POTION:
129         return TRUE;
130     default:
131         return FALSE;
132     }
133 }
134
135 static bool check_store_magic(object_type *o_ptr)
136 {
137     switch (o_ptr->tval) {
138     case TV_SORCERY_BOOK:
139     case TV_NATURE_BOOK:
140     case TV_CHAOS_BOOK:
141     case TV_DEATH_BOOK:
142     case TV_TRUMP_BOOK:
143     case TV_ARCANE_BOOK:
144     case TV_CRAFT_BOOK:
145     case TV_DEMON_BOOK:
146     case TV_MUSIC_BOOK:
147     case TV_HEX_BOOK:
148     case TV_AMULET:
149     case TV_RING:
150     case TV_STAFF:
151     case TV_WAND:
152     case TV_ROD:
153     case TV_SCROLL:
154     case TV_POTION:
155     case TV_FIGURINE:
156         return TRUE;
157     case TV_HAFTED:
158         return o_ptr->sval == SV_WIZSTAFF;
159     default:
160         return FALSE;
161     }
162 }
163
164 static bool check_store_book(object_type *o_ptr)
165 {
166     switch (o_ptr->tval) {
167     case TV_SORCERY_BOOK:
168     case TV_NATURE_BOOK:
169     case TV_CHAOS_BOOK:
170     case TV_DEATH_BOOK:
171     case TV_LIFE_BOOK:
172     case TV_TRUMP_BOOK:
173     case TV_ARCANE_BOOK:
174     case TV_CRAFT_BOOK:
175     case TV_DEMON_BOOK:
176     case TV_CRUSADE_BOOK:
177     case TV_MUSIC_BOOK:
178     case TV_HEX_BOOK:
179         return TRUE;
180     default:
181         return FALSE;
182     }
183 }
184
185 static bool switch_store_check(player_type *player_ptr, object_type *o_ptr)
186 {
187     switch (cur_store_num) {
188     case STORE_GENERAL:
189         return check_store_general(o_ptr);
190     case STORE_ARMOURY:
191         return check_store_armoury(o_ptr);
192     case STORE_WEAPON:
193         return check_store_weapon(o_ptr);
194     case STORE_TEMPLE:
195         return check_store_temple(player_ptr, o_ptr);
196     case STORE_ALCHEMIST:
197         return check_store_alchemist(o_ptr);
198     case STORE_MAGIC:
199         return check_store_magic(o_ptr);
200     case STORE_BOOK:
201         return check_store_book(o_ptr);
202     default:
203         return TRUE;
204     }
205 }
206
207 /*!
208  * @brief オブジェクトが所定の店舗で引き取れるかどうかを返す /
209  * Determine if the current store will purchase the given item
210  * @param o_ptr 判定したいオブジェクト構造体の参照ポインタ
211  * @return アイテムが買い取れるならばTRUEを返す
212  * @note
213  * Note that a shop-keeper must refuse to buy "worthless" items
214  */
215 bool store_will_buy(player_type *player_ptr, object_type *o_ptr)
216 {
217     if ((cur_store_num == STORE_HOME) || (cur_store_num == STORE_MUSEUM))
218         return TRUE;
219
220     if (!switch_store_check(player_ptr, o_ptr))
221         return FALSE;
222
223     return object_value(player_ptr, o_ptr) > 0;
224 }
225
226 static int mass_lite_produce(const PRICE cost)
227 {
228     int size = 1;
229     if (cost <= 5L)
230         size += damroll(3, 5);
231
232     if (cost <= 20L)
233         size += damroll(3, 5);
234
235     if (cost <= 50L)
236         size += damroll(2, 2);
237
238     return size;
239 }
240
241 static int mass_scroll_produce(object_type *o_ptr, const PRICE cost)
242 {
243     int size = 1;
244     if (cost <= 60L)
245         size += damroll(3, 5);
246
247     if (cost <= 240L)
248         size += damroll(1, 5);
249
250     if (o_ptr->sval == SV_SCROLL_STAR_IDENTIFY)
251         size += damroll(3, 5);
252
253     if (o_ptr->sval == SV_SCROLL_STAR_REMOVE_CURSE)
254         size += damroll(1, 4);
255
256     return size;
257 }
258
259 static int mass_book_produce(const PRICE cost)
260 {
261     int size = 1;
262     if (cost <= 50L)
263         size += damroll(2, 3);
264
265     if (cost <= 500L)
266         size += damroll(1, 3);
267
268     return size;
269 }
270
271 static int mass_equipment_produce(object_type *o_ptr, const PRICE cost)
272 {
273     int size = 1;
274     if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
275         return size;
276
277     if (cost <= 10L)
278         size += damroll(3, 5);
279
280     if (cost <= 100L)
281         size += damroll(3, 5);
282
283     return size;
284 }
285
286 static int mass_arrow_produce(const PRICE cost)
287 {
288     int size = 1;
289     if (cost <= 5L)
290         size += damroll(5, 5);
291
292     if (cost <= 50L)
293         size += damroll(5, 5);
294
295     if (cost <= 500L)
296         size += damroll(5, 5);
297
298     return size;
299 }
300
301 static int mass_figurine_produce(const PRICE cost)
302 {
303     int size = 1;
304     if (cost <= 100L)
305         size += damroll(2, 2);
306
307     if (cost <= 1000L)
308         size += damroll(2, 2);
309
310     return size;
311 }
312
313 static int mass_magic_produce(const PRICE cost)
314 {
315     int size = 1;
316     if ((cur_store_num != STORE_BLACK) || !one_in_(3))
317         return size;
318
319     if (cost < 1601L)
320         size += damroll(1, 5);
321     else if (cost < 3201L)
322         size += damroll(1, 3);
323
324     return size;
325 }
326
327 static int switch_mass_production(object_type *o_ptr, const PRICE cost)
328 {
329     switch (o_ptr->tval) {
330     case TV_FOOD:
331     case TV_FLASK:
332     case TV_LITE:
333         return mass_lite_produce(cost);
334     case TV_POTION:
335     case TV_SCROLL:
336         return mass_scroll_produce(o_ptr, cost);
337     case TV_LIFE_BOOK:
338     case TV_SORCERY_BOOK:
339     case TV_NATURE_BOOK:
340     case TV_CHAOS_BOOK:
341     case TV_DEATH_BOOK:
342     case TV_TRUMP_BOOK:
343     case TV_ARCANE_BOOK:
344     case TV_CRAFT_BOOK:
345     case TV_DEMON_BOOK:
346     case TV_CRUSADE_BOOK:
347     case TV_MUSIC_BOOK:
348     case TV_HISSATSU_BOOK:
349     case TV_HEX_BOOK:
350         return mass_book_produce(cost);
351     case TV_SOFT_ARMOR:
352     case TV_HARD_ARMOR:
353     case TV_SHIELD:
354     case TV_GLOVES:
355     case TV_BOOTS:
356     case TV_CLOAK:
357     case TV_HELM:
358     case TV_CROWN:
359     case TV_SWORD:
360     case TV_POLEARM:
361     case TV_HAFTED:
362     case TV_DIGGING:
363     case TV_BOW:
364         return mass_equipment_produce(o_ptr, cost);
365     case TV_SPIKE:
366     case TV_SHOT:
367     case TV_ARROW:
368     case TV_BOLT:
369         return mass_arrow_produce(cost);
370     case TV_FIGURINE:
371         return mass_figurine_produce(cost);
372     case TV_CAPTURE:
373     case TV_STATUE:
374     case TV_CARD:
375         return 1;
376     case TV_ROD:
377     case TV_WAND:
378     case TV_STAFF:
379         return mass_magic_produce(cost);
380     default:
381         return 1;
382     }
383 }
384
385 static DISCOUNT_RATE decide_discount_rate(const PRICE cost)
386 {
387     if (cost < 5)
388         return 0;
389     
390     if (one_in_(25))
391         return 25;
392     
393     if (one_in_(150))
394         return 50;
395     
396     if (one_in_(300))
397         return 75;
398     
399     if (one_in_(500))
400         return 90;
401
402     return 0;
403 }
404
405 /*!
406  * @brief 安価な消耗品の販売数を増やし、低確率で割引にする /
407  * Certain "cheap" objects should be created in "piles"
408  * @param o_ptr 店舗に並べるオブジェクト構造体の参照ポインタ
409  * @details
410  * <pre>
411  * Some objects can be sold at a "discount" (in small piles)
412  * </pre>
413  */
414 void mass_produce(player_type *player_ptr, object_type *o_ptr)
415 {
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);
419     if (o_ptr->art_name)
420         discount = 0;
421
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;
426 }