OSDN Git Service

Merge branch 'master' of git.osdn.net:/gitroot/hengband/hengband
[hengband/hengband.git] / src / object-hook / hook-magic.c
1 #include "object-hook/hook-magic.h"
2 #include "inventory/inventory-slot-types.h"
3 #include "object-enchant/tr-types.h"
4 #include "object/object-flags.h"
5 #include "perception/object-perception.h"
6 #include "player/player-class.h"
7 #include "player/player-realm.h"
8 #include "realm/realm-names-table.h"
9 #include "system/object-type-definition.h"
10 #include "util/bit-flags-calculator.h"
11
12 /*!
13  * @brief オブジェクトをプレイヤーが魔道具として発動できるかを判定する /
14  * Hook to determine if an object is activatable
15  * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
16  * @return 魔道具として発動可能ならばTRUEを返す
17  */
18 bool item_tester_hook_activate(player_type *player_ptr, object_type *o_ptr)
19 {
20     /* Unused */
21     (void)player_ptr;
22
23     BIT_FLAGS flags[TR_FLAG_SIZE];
24     if (!object_is_known(o_ptr))
25         return FALSE;
26
27     object_flags(player_ptr, o_ptr, flags);
28     if (have_flag(flags, TR_ACTIVATE))
29         return TRUE;
30
31     return FALSE;
32 }
33
34 /*!
35  * @brief オブジェクトをプレイヤーが簡易使用コマンドで利用できるかを判定する /
36  * Hook to determine if an object is useable
37  * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
38  * @return 利用可能ならばTRUEを返す
39  */
40 bool item_tester_hook_use(player_type *player_ptr, object_type *o_ptr)
41 {
42     /* Unused */
43     (void)player_ptr;
44
45     BIT_FLAGS flags[TR_FLAG_SIZE];
46     if (o_ptr->tval == player_ptr->tval_ammo)
47         return TRUE;
48
49     switch (o_ptr->tval) {
50     case TV_SPIKE:
51     case TV_STAFF:
52     case TV_WAND:
53     case TV_ROD:
54     case TV_SCROLL:
55     case TV_POTION:
56     case TV_FOOD: {
57         return TRUE;
58     }
59
60     default: {
61         int i;
62
63         if (!object_is_known(o_ptr))
64             return FALSE;
65         for (i = INVEN_RARM; i < INVEN_TOTAL; i++) {
66             if (&player_ptr->inventory_list[i] == o_ptr) {
67                 object_flags(player_ptr, o_ptr, flags);
68                 if (have_flag(flags, TR_ACTIVATE))
69                     return TRUE;
70             }
71         }
72     }
73     }
74
75     return FALSE;
76 }
77
78 /*!
79  * @brief 魔力充填が可能なアイテムかどうか判定する /
80  * Hook for "get_item()".  Determine if something is rechargable.
81  * @param o_ptr 判定するアイテムの情報参照ポインタ
82  * @return 魔力充填が可能ならばTRUEを返す
83  */
84 bool item_tester_hook_recharge(player_type *player_ptr, object_type *o_ptr)
85 {
86     /* Unused */
87     (void)player_ptr;
88
89     return (o_ptr->tval == TV_STAFF) || (o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD);
90 }
91
92 /*!
93  * @brief オブジェクトがプレイヤーが使用可能な魔道書かどうかを判定する
94  * @param o_ptr 判定したいオブ会ジェクトの構造体参照ポインタ
95  * @return 学習できる魔道書ならばTRUEを返す
96  */
97 bool item_tester_learn_spell(player_type *player_ptr, object_type *o_ptr)
98 {
99     s32b choices = realm_choices2[player_ptr->pclass];
100     if (player_ptr->pclass == CLASS_PRIEST) {
101         if (is_good_realm(player_ptr->realm1)) {
102             choices &= ~(CH_DEATH | CH_DAEMON);
103         } else {
104             choices &= ~(CH_LIFE | CH_CRUSADE);
105         }
106     }
107
108     if ((o_ptr->tval < TV_LIFE_BOOK) || (o_ptr->tval > (TV_LIFE_BOOK + MAX_REALM - 1)))
109         return FALSE;
110
111     if ((o_ptr->tval == TV_MUSIC_BOOK) && (player_ptr->pclass == CLASS_BARD))
112         return TRUE;
113     else if (!is_magic(tval2realm(o_ptr->tval)))
114         return FALSE;
115
116     return (get_realm1_book(player_ptr) == o_ptr->tval) || (get_realm2_book(player_ptr) == o_ptr->tval) || (choices & (0x0001 << (tval2realm(o_ptr->tval) - 1)));
117 }
118
119 /*!
120  * @brief オブジェクトが高位の魔法書かどうかを判定する
121  * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
122  * @return オブジェクトが高位の魔法書ならばTRUEを返す
123  */
124 bool item_tester_high_level_book(object_type *o_ptr)
125 {
126     if ((o_ptr->tval == TV_LIFE_BOOK) || (o_ptr->tval == TV_SORCERY_BOOK) || (o_ptr->tval == TV_NATURE_BOOK) || (o_ptr->tval == TV_CHAOS_BOOK)
127         || (o_ptr->tval == TV_DEATH_BOOK) || (o_ptr->tval == TV_TRUMP_BOOK) || (o_ptr->tval == TV_CRAFT_BOOK) || (o_ptr->tval == TV_DEMON_BOOK)
128         || (o_ptr->tval == TV_CRUSADE_BOOK) || (o_ptr->tval == TV_MUSIC_BOOK) || (o_ptr->tval == TV_HEX_BOOK)) {
129         if (o_ptr->sval > 1)
130             return TRUE;
131         else
132             return FALSE;
133     }
134
135     return FALSE;
136 }