From 0fdad2ff79af943da650df133a0a966d5ef7b602 Mon Sep 17 00:00:00 2001 From: Hourier Date: Fri, 17 Jul 2020 23:25:23 +0900 Subject: [PATCH] [Refactor] #40233 Separated service-checker.c/h from store-util.c/h --- Hengband/Hengband/Hengband.vcxproj | 2 + Hengband/Hengband/Hengband.vcxproj.filters | 6 + src/Makefile.am | 1 + src/player/process-death.c | 1 + src/store/museum.c | 9 +- src/store/sell-order.c | 2 + src/store/service-checker.c | 206 +++++++++++++++++++++++++++++ src/store/service-checker.h | 6 + src/store/store-util.c | 206 +---------------------------- src/store/store-util.h | 15 +-- src/store/store.c | 3 +- 11 files changed, 236 insertions(+), 221 deletions(-) create mode 100644 src/store/service-checker.c create mode 100644 src/store/service-checker.h diff --git a/Hengband/Hengband/Hengband.vcxproj b/Hengband/Hengband/Hengband.vcxproj index 00b096935..8156be33a 100644 --- a/Hengband/Hengband/Hengband.vcxproj +++ b/Hengband/Hengband/Hengband.vcxproj @@ -316,6 +316,7 @@ + @@ -841,6 +842,7 @@ + diff --git a/Hengband/Hengband/Hengband.vcxproj.filters b/Hengband/Hengband/Hengband.vcxproj.filters index 850a8412f..a6c440540 100644 --- a/Hengband/Hengband/Hengband.vcxproj.filters +++ b/Hengband/Hengband/Hengband.vcxproj.filters @@ -1778,6 +1778,9 @@ store + + store + @@ -3874,6 +3877,9 @@ store + + store + diff --git a/src/Makefile.am b/src/Makefile.am index 4bcbacb80..c5302f042 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -656,6 +656,7 @@ hengband_SOURCES = \ 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 \ diff --git a/src/player/process-death.c b/src/player/process-death.c index 06e298d37..6131e121d 100644 --- a/src/player/process-death.c +++ b/src/player/process-death.c @@ -20,6 +20,7 @@ #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" diff --git a/src/store/museum.c b/src/store/museum.c index 3f56aa11c..ce3a5ad44 100644 --- a/src/store/museum.c +++ b/src/store/museum.c @@ -1,10 +1,11 @@ #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" /*! diff --git a/src/store/sell-order.c b/src/store/sell-order.c index 8866490a3..caff4038a 100644 --- a/src/store/sell-order.c +++ b/src/store/sell-order.c @@ -29,8 +29,10 @@ #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" diff --git a/src/store/service-checker.c b/src/store/service-checker.c new file mode 100644 index 000000000..b5a64de8a --- /dev/null +++ b/src/store/service-checker.c @@ -0,0 +1,206 @@ +#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; +} diff --git a/src/store/service-checker.h b/src/store/service-checker.h new file mode 100644 index 000000000..ee7356f51 --- /dev/null +++ b/src/store/service-checker.h @@ -0,0 +1,6 @@ +#pragma once + +#include "system/angband.h" + +typedef struct object_type object_type; +bool store_will_buy(player_type *player_ptr, object_type *o_ptr); diff --git a/src/store/store-util.c b/src/store/store-util.c index e84e51046..fdfa2b2fb 100644 --- a/src/store/store-util.c +++ b/src/store/store-util.c @@ -5,25 +5,17 @@ */ #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; @@ -274,7 +266,7 @@ static void mass_produce(player_type *player_ptr, object_type *o_ptr) * Should we check for "permission" to have the given item? * */ -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; @@ -297,7 +289,7 @@ void store_create(player_type *player_ptr, bool (*black_market_crap)(player_type 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) { @@ -328,200 +320,6 @@ void store_create(player_type *player_ptr, bool (*black_market_crap)(player_type } /*! - * @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 diff --git a/src/store/store-util.h b/src/store/store-util.h index e7ff7a7bd..5c2d03666 100644 --- a/src/store/store-util.h +++ b/src/store/store-util.h @@ -1,7 +1,6 @@ #pragma once #include "system/angband.h" -#include "system/object-type-definition.h" #define STORE_OBJ_LEVEL 5 /* Magic Level for normal stores */ @@ -16,26 +15,19 @@ #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 */ @@ -45,9 +37,8 @@ extern int cur_store_num; 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); diff --git a/src/store/store.c b/src/store/store.c index e605bc1a9..43cebcad9 100644 --- a/src/store/store.c +++ b/src/store/store.c @@ -24,6 +24,7 @@ #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" @@ -316,7 +317,7 @@ void store_maintenance(player_type *player_ptr, int town_num, int store_num) 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); } /*! -- 2.11.0