<ClCompile Include="..\..\src\store\pricing.c" />\r
<ClCompile Include="..\..\src\store\purchase-order.c" />\r
<ClCompile Include="..\..\src\store\sell-order.c" />\r
+ <ClCompile Include="..\..\src\store\service-checker.c" />\r
<ClCompile Include="..\..\src\view\display-inventory.c" />\r
<ClCompile Include="..\..\src\view\display-map.c" />\r
<ClCompile Include="..\..\src\window\display-sub-window-items.c" />\r
<ClInclude Include="..\..\src\store\pricing.h" />\r
<ClInclude Include="..\..\src\store\purchase-order.h" />\r
<ClInclude Include="..\..\src\store\sell-order.h" />\r
+ <ClInclude Include="..\..\src\store\service-checker.h" />\r
<ClInclude Include="..\..\src\system\alloc-entries.h" />\r
<ClInclude Include="..\..\src\term\screen-processor.h" />\r
<ClInclude Include="..\..\src\util\bit-flags-calculator.h" />\r
<ClCompile Include="..\..\src\store\pricing.c">
<Filter>store</Filter>
</ClCompile>
+ <ClCompile Include="..\..\src\store\service-checker.c">
+ <Filter>store</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\src\combat\shoot.h">
<ClInclude Include="..\..\src\store\pricing.h">
<Filter>store</Filter>
</ClInclude>
+ <ClInclude Include="..\..\src\store\service-checker.h">
+ <Filter>store</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\..\src\wall.bmp" />
store/rumor.c store/rumor.h \
store/say-comments.c store/say-comments.h \
store/sell-order.c store/sell-order.h \
+ store/service-checker.c store/service-checker.h \
store/store-util.c store/store-util.h \
store/store-owners.c store/store-owners.h \
store/store-owner-comments.c store/store-owner-comments.h \
#include "player/player-class.h"
#include "store/store-util.h"
#include "store/store.h"
+#include "system/object-type-definition.h"
#include "term/gameterm.h"
#include "term/screen-processor.h"
#include "util/buffer-shaper.h"
#include "store/museum.h"
-#include "store/store.h"
-#include "store/store-util.h"
-#include "view/display-messages.h"
-#include "flavor/flavor-describer.h"
#include "core/asking-player.h"
+#include "flavor/flavor-describer.h"
#include "store/home.h"
+#include "store/store-util.h"
+#include "store/store.h"
+#include "system/object-type-definition.h"
+#include "view/display-messages.h"
#include "view/display-store.h"
/*!
#include "store/owner-insults.h"
#include "store/pricing.h"
#include "store/say-comments.h"
+#include "store/service-checker.h"
#include "store/store-util.h"
#include "store/store.h"
+#include "system/object-type-definition.h"
#include "term/screen-processor.h"
#include "view/display-messages.h"
#include "view/display-store.h"
--- /dev/null
+#include "store/service-checker.h"
+#include "monster-race/monster-race.h"
+#include "monster-race/race-flags3.h"
+#include "object-enchant/tr-types.h"
+#include "object/object-flags.h"
+#include "object/object-value.h"
+#include "store/store-util.h"
+#include "sv-definition/sv-potion-types.h"
+#include "sv-definition/sv-weapon-types.h"
+#include "system/object-type-definition.h"
+#include "util/bit-flags-calculator.h"
+#include "util/string-processor.h"
+
+/*!
+ * @brief オブジェクトが祝福されているかの判定を返す /
+ * @param o_ptr 判定したいオブジェクト構造体の参照ポインタ
+ * @return アイテムが祝福されたアイテムならばTRUEを返す
+ */
+static bool is_blessed_item(player_type *player_ptr, object_type *o_ptr)
+{
+ BIT_FLAGS flgs[TR_FLAG_SIZE];
+ object_flags(player_ptr, o_ptr, flgs);
+ return have_flag(flgs, TR_BLESSED);
+}
+
+/*!
+ * @brief オブジェクトが所定の店舗で引き取れるかどうかを返す /
+ * Determine if the current store will purchase the given item
+ * @param o_ptr 判定したいオブジェクト構造体の参照ポインタ
+ * @return アイテムが買い取れるならばTRUEを返す
+ * @note
+ * Note that a shop-keeper must refuse to buy "worthless" items
+ */
+bool store_will_buy(player_type *player_ptr, object_type *o_ptr)
+{
+ /* Unused */
+ (void)player_ptr;
+ if ((cur_store_num == STORE_HOME) || (cur_store_num == STORE_MUSEUM))
+ return TRUE;
+
+ switch (cur_store_num) {
+ case STORE_GENERAL: {
+ switch (o_ptr->tval) {
+ case TV_POTION:
+ if (o_ptr->sval != SV_POTION_WATER)
+ return FALSE;
+
+ case TV_WHISTLE:
+ case TV_FOOD:
+ case TV_LITE:
+ case TV_FLASK:
+ case TV_SPIKE:
+ case TV_SHOT:
+ case TV_ARROW:
+ case TV_BOLT:
+ case TV_DIGGING:
+ case TV_CLOAK:
+ case TV_BOTTLE:
+ case TV_FIGURINE:
+ case TV_STATUE:
+ case TV_CAPTURE:
+ case TV_CARD:
+ break;
+ default:
+ return FALSE;
+ }
+
+ break;
+ }
+ case STORE_ARMOURY: {
+ switch (o_ptr->tval) {
+ case TV_BOOTS:
+ case TV_GLOVES:
+ case TV_CROWN:
+ case TV_HELM:
+ case TV_SHIELD:
+ case TV_CLOAK:
+ case TV_SOFT_ARMOR:
+ case TV_HARD_ARMOR:
+ case TV_DRAG_ARMOR:
+ break;
+ default:
+ return FALSE;
+ }
+
+ break;
+ }
+ case STORE_WEAPON: {
+ switch (o_ptr->tval) {
+ case TV_SHOT:
+ case TV_BOLT:
+ case TV_ARROW:
+ case TV_BOW:
+ case TV_DIGGING:
+ case TV_POLEARM:
+ case TV_SWORD:
+ case TV_HISSATSU_BOOK:
+ break;
+ case TV_HAFTED:
+ if (o_ptr->sval == SV_WIZSTAFF)
+ return FALSE;
+
+ break;
+ default:
+ return FALSE;
+ }
+
+ break;
+ }
+ case STORE_TEMPLE: {
+ switch (o_ptr->tval) {
+ case TV_LIFE_BOOK:
+ case TV_CRUSADE_BOOK:
+ case TV_SCROLL:
+ case TV_POTION:
+ case TV_HAFTED:
+ break;
+ case TV_FIGURINE:
+ case TV_STATUE: {
+ monster_race *r_ptr = &r_info[o_ptr->pval];
+ if (!(r_ptr->flags3 & RF3_EVIL))
+ if (((r_ptr->flags3 & RF3_GOOD) != 0) || ((r_ptr->flags3 & RF3_ANIMAL) != 0) || (angband_strchr("?!", r_ptr->d_char) != '\0'))
+ break;
+ }
+ /* Fall through */
+ case TV_POLEARM:
+ case TV_SWORD: {
+ if (is_blessed_item(player_ptr, o_ptr))
+ break;
+ }
+ /* Fall through */
+ default:
+ return FALSE;
+ }
+
+ break;
+ }
+ case STORE_ALCHEMIST: {
+ switch (o_ptr->tval) {
+ case TV_SCROLL:
+ case TV_POTION:
+ break;
+ default:
+ return FALSE;
+ }
+
+ break;
+ }
+ case STORE_MAGIC: {
+ switch (o_ptr->tval) {
+ case TV_SORCERY_BOOK:
+ case TV_NATURE_BOOK:
+ case TV_CHAOS_BOOK:
+ case TV_DEATH_BOOK:
+ case TV_TRUMP_BOOK:
+ case TV_ARCANE_BOOK:
+ case TV_CRAFT_BOOK:
+ case TV_DEMON_BOOK:
+ case TV_MUSIC_BOOK:
+ case TV_HEX_BOOK:
+ case TV_AMULET:
+ case TV_RING:
+ case TV_STAFF:
+ case TV_WAND:
+ case TV_ROD:
+ case TV_SCROLL:
+ case TV_POTION:
+ case TV_FIGURINE:
+ break;
+ case TV_HAFTED: {
+ if (o_ptr->sval == SV_WIZSTAFF)
+ break;
+ else
+ return FALSE;
+ }
+ default:
+ return FALSE;
+ }
+
+ break;
+ }
+ case STORE_BOOK: {
+ switch (o_ptr->tval) {
+ case TV_SORCERY_BOOK:
+ case TV_NATURE_BOOK:
+ case TV_CHAOS_BOOK:
+ case TV_DEATH_BOOK:
+ case TV_LIFE_BOOK:
+ case TV_TRUMP_BOOK:
+ case TV_ARCANE_BOOK:
+ case TV_CRAFT_BOOK:
+ case TV_DEMON_BOOK:
+ case TV_CRUSADE_BOOK:
+ case TV_MUSIC_BOOK:
+ case TV_HEX_BOOK:
+ break;
+ default:
+ return FALSE;
+ }
+
+ break;
+ }
+ }
+
+ return !object_value(player_ptr, o_ptr) <= 0;
+}
--- /dev/null
+#pragma once
+
+#include "system/angband.h"
+
+typedef struct object_type object_type;
+bool store_will_buy(player_type *player_ptr, object_type *o_ptr);
*/
#include "store/store-util.h"
-#include "monster-race/monster-race.h"
-#include "monster-race/race-flags3.h"
#include "object-enchant/apply-magic.h"
#include "object-enchant/item-apply-magic.h"
#include "object-enchant/item-feeling.h"
#include "object-enchant/special-object-flags.h"
-#include "object-enchant/tr-types.h"
#include "object-hook/hook-enchant.h"
-#include "object/object-flags.h"
#include "object/object-generator.h"
#include "object/object-kind.h"
#include "object/object-value.h"
#include "perception/object-perception.h"
#include "sv-definition/sv-lite-types.h"
-#include "sv-definition/sv-potion-types.h"
#include "sv-definition/sv-scroll-types.h"
-#include "sv-definition/sv-weapon-types.h"
-#include "util/bit-flags-calculator.h"
-#include "util/string-processor.h"
#include "world/world-object.h"
int cur_store_num = 0;
* Should we check for "permission" to have the given item?
* </pre>
*/
-void store_create(player_type *player_ptr, bool (*black_market_crap)(player_type *, object_type *))
+void store_create(player_type *player_ptr, bool (*black_market_crap)(player_type *, object_type *), bool (*store_will_buy)(player_type *, object_type *))
{
if (st_ptr->stock_num >= st_ptr->stock_size)
return;
q_ptr = &forge;
object_prep(player_ptr, q_ptr, i);
apply_magic(player_ptr, q_ptr, level, AM_NO_FIXED_ART);
- if (!store_will_buy(player_ptr, q_ptr))
+ if (!(*store_will_buy)(player_ptr, q_ptr))
continue;
if (q_ptr->tval == TV_LITE) {
}
/*!
- * @brief オブジェクトが祝福されているかの判定を返す /
- * @param o_ptr 判定したいオブジェクト構造体の参照ポインタ
- * @return アイテムが祝福されたアイテムならばTRUEを返す
- */
-static bool is_blessed_item(player_type *player_ptr, object_type *o_ptr)
-{
- BIT_FLAGS flgs[TR_FLAG_SIZE];
- object_flags(player_ptr, o_ptr, flgs);
- return have_flag(flgs, TR_BLESSED);
-}
-
-/*!
- * @brief オブジェクトが所定の店舗で引き取れるかどうかを返す /
- * Determine if the current store will purchase the given item
- * @param o_ptr 判定したいオブジェクト構造体の参照ポインタ
- * @return アイテムが買い取れるならばTRUEを返す
- * @note
- * Note that a shop-keeper must refuse to buy "worthless" items
- */
-bool store_will_buy(player_type *player_ptr, object_type *o_ptr)
-{
- /* Unused */
- (void)player_ptr;
- if ((cur_store_num == STORE_HOME) || (cur_store_num == STORE_MUSEUM))
- return TRUE;
-
- switch (cur_store_num) {
- case STORE_GENERAL: {
- switch (o_ptr->tval) {
- case TV_POTION:
- if (o_ptr->sval != SV_POTION_WATER)
- return FALSE;
-
- case TV_WHISTLE:
- case TV_FOOD:
- case TV_LITE:
- case TV_FLASK:
- case TV_SPIKE:
- case TV_SHOT:
- case TV_ARROW:
- case TV_BOLT:
- case TV_DIGGING:
- case TV_CLOAK:
- case TV_BOTTLE:
- case TV_FIGURINE:
- case TV_STATUE:
- case TV_CAPTURE:
- case TV_CARD:
- break;
- default:
- return FALSE;
- }
-
- break;
- }
- case STORE_ARMOURY: {
- switch (o_ptr->tval) {
- case TV_BOOTS:
- case TV_GLOVES:
- case TV_CROWN:
- case TV_HELM:
- case TV_SHIELD:
- case TV_CLOAK:
- case TV_SOFT_ARMOR:
- case TV_HARD_ARMOR:
- case TV_DRAG_ARMOR:
- break;
- default:
- return FALSE;
- }
-
- break;
- }
- case STORE_WEAPON: {
- switch (o_ptr->tval) {
- case TV_SHOT:
- case TV_BOLT:
- case TV_ARROW:
- case TV_BOW:
- case TV_DIGGING:
- case TV_POLEARM:
- case TV_SWORD:
- case TV_HISSATSU_BOOK:
- break;
- case TV_HAFTED:
- if (o_ptr->sval == SV_WIZSTAFF)
- return FALSE;
-
- break;
- default:
- return FALSE;
- }
-
- break;
- }
- case STORE_TEMPLE: {
- switch (o_ptr->tval) {
- case TV_LIFE_BOOK:
- case TV_CRUSADE_BOOK:
- case TV_SCROLL:
- case TV_POTION:
- case TV_HAFTED:
- break;
- case TV_FIGURINE:
- case TV_STATUE: {
- monster_race *r_ptr = &r_info[o_ptr->pval];
- if (!(r_ptr->flags3 & RF3_EVIL))
- if (((r_ptr->flags3 & RF3_GOOD) != 0) || ((r_ptr->flags3 & RF3_ANIMAL) != 0) || (angband_strchr("?!", r_ptr->d_char) != '\0'))
- break;
- }
- /* Fall through */
- case TV_POLEARM:
- case TV_SWORD: {
- if (is_blessed_item(player_ptr, o_ptr))
- break;
- }
- /* Fall through */
- default:
- return FALSE;
- }
-
- break;
- }
- case STORE_ALCHEMIST: {
- switch (o_ptr->tval) {
- case TV_SCROLL:
- case TV_POTION:
- break;
- default:
- return FALSE;
- }
-
- break;
- }
- case STORE_MAGIC: {
- switch (o_ptr->tval) {
- case TV_SORCERY_BOOK:
- case TV_NATURE_BOOK:
- case TV_CHAOS_BOOK:
- case TV_DEATH_BOOK:
- case TV_TRUMP_BOOK:
- case TV_ARCANE_BOOK:
- case TV_CRAFT_BOOK:
- case TV_DEMON_BOOK:
- case TV_MUSIC_BOOK:
- case TV_HEX_BOOK:
- case TV_AMULET:
- case TV_RING:
- case TV_STAFF:
- case TV_WAND:
- case TV_ROD:
- case TV_SCROLL:
- case TV_POTION:
- case TV_FIGURINE:
- break;
- case TV_HAFTED: {
- if (o_ptr->sval == SV_WIZSTAFF)
- break;
- else
- return FALSE;
- }
- default:
- return FALSE;
- }
-
- break;
- }
- case STORE_BOOK: {
- switch (o_ptr->tval) {
- case TV_SORCERY_BOOK:
- case TV_NATURE_BOOK:
- case TV_CHAOS_BOOK:
- case TV_DEATH_BOOK:
- case TV_LIFE_BOOK:
- case TV_TRUMP_BOOK:
- case TV_ARCANE_BOOK:
- case TV_CRAFT_BOOK:
- case TV_DEMON_BOOK:
- case TV_CRUSADE_BOOK:
- case TV_MUSIC_BOOK:
- case TV_HEX_BOOK:
- break;
- default:
- return FALSE;
- }
-
- break;
- }
- }
-
- return !object_value(player_ptr, o_ptr) <= 0;
-}
-
-/*!
* @brief 店舗に並べた品を同一品であるかどうか判定する /
* Determine if a store item can "absorb" another item
* @param o_ptr 判定するオブジェクト構造体の参照ポインタ1
#pragma once
#include "system/angband.h"
-#include "system/object-type-definition.h"
#define STORE_OBJ_LEVEL 5 /* Magic Level for normal stores */
#define STORE_BOOK 8 /*!< 店舗の種類: 書店 */
#define STORE_MUSEUM 9 /*!< 店舗の種類: 博物館 */
-typedef struct store_type
-{
+typedef struct object_type object_type;
+typedef struct store_type {
byte type; /* Store type */
-
byte owner; /* Owner index */
byte extra; /* Unused for now */
-
s16b insult_cur; /* Insult counter */
-
s16b good_buy; /* Number of "good" buys */
s16b bad_buy; /* Number of "bad" buys */
-
s32b store_open; /* Closed until this turn */
-
s32b last_visit; /* Last visited on this turn */
-
s16b table_num; /* Table -- Number of entries */
s16b table_size; /* Table -- Total Size of Array */
s16b *table; /* Table -- Legal item kinds */
-
s16b stock_num; /* Stock -- Number of entries */
s16b stock_size; /* Stock -- Total Size of Array */
object_type *stock; /* Stock -- Actual stock items */
extern store_type *st_ptr;
void store_delete(void);
-void store_create(player_type *player_ptr, bool(*black_market_crap)(player_type*, object_type*));
+void store_create(player_type *player_ptr, bool (*black_market_crap)(player_type *, object_type *), bool (*store_will_buy)(player_type *, object_type *));
void store_item_increase(INVENTORY_IDX item, int num);
void store_item_optimize(INVENTORY_IDX item);
-bool store_will_buy(player_type *player_ptr, object_type *o_ptr);
int store_carry(player_type *player_ptr, object_type *o_ptr);
bool store_object_similar(object_type *o_ptr, object_type *j_ptr);
#include "perception/identification.h"
#include "perception/object-perception.h"
#include "store/black-market.h"
+#include "store/service-checker.h"
#include "store/store-util.h"
#include "term/screen-processor.h"
#include "util/int-char-converter.h"
j = st_ptr->stock_size - 1;
while (st_ptr->stock_num < j)
- store_create(player_ptr, black_market_crap);
+ store_create(player_ptr, black_market_crap, store_will_buy);
}
/*!