OSDN Git Service

[Refactor] #1172 Changed '(TRUE)', 'TRUE;' and 'FALSE;' to '(true)', 'true;' and...
[hengbandforosx/hengbandosx.git] / src / object-hook / hook-expendable.cpp
1 #include "object-hook/hook-expendable.h"
2 #include "artifact/fixed-art-types.h"
3 #include "core/player-update-types.h"
4 #include "core/window-redrawer.h"
5 #include "monster-race/monster-race.h"
6 #include "object-enchant/item-feeling.h"
7 #include "object-enchant/special-object-flags.h"
8 #include "object-hook/hook-checker.h"
9 #include "object-hook/hook-enchant.h"
10 #include "object/object-kind.h"
11 #include "perception/object-perception.h"
12 #include "player/mimic-info-table.h"
13 #include "sv-definition/sv-lite-types.h"
14 #include "sv-definition/sv-other-types.h"
15 #include "system/monster-race-definition.h"
16 #include "system/object-type-definition.h"
17 #include "system/player-type-definition.h"
18 #include "util/string-processor.h"
19
20 /*!
21  * @brief オブジェクトをプレイヤーが食べることができるかを判定する /
22  * Hook to determine if an object is eatable
23  * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
24  * @return 食べることが可能ならばTRUEを返す
25  */
26 bool item_tester_hook_eatable(player_type *player_ptr, object_type *o_ptr)
27 {
28     if (o_ptr->tval == TV_FOOD)
29         return true;
30
31     auto food_type = player_race_food(player_ptr);
32     if (food_type == PlayerRaceFood::MANA) {
33         if (o_ptr->tval == TV_STAFF || o_ptr->tval == TV_WAND)
34             return true;
35     } else if (food_type == PlayerRaceFood::CORPSE) {
36         if (o_ptr->tval == TV_CORPSE && o_ptr->sval == SV_CORPSE && angband_strchr("pht", r_info[o_ptr->pval].d_char))
37             return true;
38     }
39
40     return false;
41 }
42
43 /*!
44  * @brief オブジェクトをプレイヤーが飲むことができるかを判定する /
45  * Hook to determine if an object can be quaffed
46  * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
47  * @return 飲むことが可能ならばTRUEを返す
48  */
49 bool item_tester_hook_quaff(player_type *player_ptr, object_type *o_ptr)
50 {
51     if (o_ptr->tval == TV_POTION)
52         return true;
53
54     if (player_race_food(player_ptr) == PlayerRaceFood::OIL && o_ptr->tval == TV_FLASK && o_ptr->sval == SV_FLASK_OIL)
55         return true;
56
57     return false;
58 }
59
60 /*!
61  * @brief オブジェクトをプレイヤーが読むことができるかを判定する /
62  * Hook to determine if an object is readable
63  * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
64  * @return 読むことが可能ならばTRUEを返す
65  */
66 bool item_tester_hook_readable(player_type *player_ptr, object_type *o_ptr)
67 {
68     /* Unused */
69     (void)player_ptr;
70
71     if ((o_ptr->tval == TV_SCROLL) || (o_ptr->tval == TV_PARCHMENT) || (o_ptr->name1 == ART_GHB) || (o_ptr->name1 == ART_POWER))
72         return true;
73
74     return false;
75 }
76
77 /*!
78  * @brief オブジェクトがランタンの燃料になるかどうかを判定する
79  * An "item_tester_hook" for refilling lanterns
80  * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
81  * @return オブジェクトがランタンの燃料になるならばTRUEを返す
82  */
83 bool item_tester_refill_lantern(player_type *player_ptr, object_type *o_ptr)
84 {
85     /* Unused */
86     (void)player_ptr;
87
88     if ((o_ptr->tval == TV_FLASK) || ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_LANTERN)))
89         return true;
90
91     return false;
92 }
93
94 /*!
95  * @brief オブジェクトが松明に束ねられるかどうかを判定する
96  * An "item_tester_hook" for refilling torches
97  * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
98  * @return オブジェクトが松明に束ねられるならばTRUEを返す
99  */
100 bool object_can_refill_torch(player_type *player_ptr, object_type *o_ptr)
101 {
102     /* Unused */
103     (void)player_ptr;
104
105     if ((o_ptr->tval == TV_LITE) && (o_ptr->sval == SV_LITE_TORCH))
106         return true;
107
108     return false;
109 }
110
111 /*!
112  * @brief 破壊可能なアイテムかを返す /
113  * Determines whether an object can be destroyed, and makes fake inscription.
114  * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ
115  * @return オブジェクトが破壊可能ならばTRUEを返す
116  */
117 bool can_player_destroy_object(player_type *player_ptr, object_type *o_ptr)
118 {
119     /* Artifacts cannot be destroyed */
120     if (!object_is_artifact(o_ptr))
121         return true;
122
123     if (!object_is_known(o_ptr)) {
124         byte feel = FEEL_SPECIAL;
125         if (object_is_cursed(o_ptr) || object_is_broken(o_ptr))
126             feel = FEEL_TERRIBLE;
127
128         o_ptr->feeling = feel;
129         o_ptr->ident |= IDENT_SENSE;
130         player_ptr->update |= (PU_COMBINE);
131         player_ptr->window_flags |= (PW_INVEN | PW_EQUIP);
132         return false;
133     }
134
135     return false;
136 }
137
138 /*!
139  * @brief オブジェクトが薬であるかを返す
140  * @param o_ptr 対象のオブジェクト構造体ポインタ
141  * @return オブジェクトが薬ならばTRUEを返す
142  */
143 bool object_is_potion(object_type *o_ptr) { return (k_info[o_ptr->k_idx].tval == TV_POTION); }