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"
13 * @brief オブジェクトをプレイヤーが魔道具として発動できるかを判定する /
14 * Hook to determine if an object is activatable
15 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
16 * @return 魔道具として発動可能ならばTRUEを返す
18 bool item_tester_hook_activate(player_type *player_ptr, object_type *o_ptr)
23 BIT_FLAGS flags[TR_FLAG_SIZE];
24 if (!object_is_known(o_ptr))
27 object_flags(player_ptr, o_ptr, flags);
28 if (has_flag(flags, TR_ACTIVATE))
35 * @brief オブジェクトをプレイヤーが簡易使用コマンドで利用できるかを判定する /
36 * Hook to determine if an object is useable
37 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
38 * @return 利用可能ならばTRUEを返す
40 bool item_tester_hook_use(player_type *player_ptr, object_type *o_ptr)
45 BIT_FLAGS flags[TR_FLAG_SIZE];
46 if (o_ptr->tval == player_ptr->tval_ammo)
49 switch (o_ptr->tval) {
63 if (!object_is_known(o_ptr))
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 (has_flag(flags, TR_ACTIVATE))
79 * @brief 魔力充填が可能なアイテムかどうか判定する /
80 * Hook for "get_item()". Determine if something is rechargable.
81 * @param o_ptr 判定するアイテムの情報参照ポインタ
82 * @return 魔力充填が可能ならばTRUEを返す
84 bool item_tester_hook_recharge(player_type *player_ptr, object_type *o_ptr)
89 return (o_ptr->tval == TV_STAFF) || (o_ptr->tval == TV_WAND) || (o_ptr->tval == TV_ROD);
93 * @brief オブジェクトがプレイヤーが使用可能な魔道書かどうかを判定する
94 * @param o_ptr 判定したいオブ会ジェクトの構造体参照ポインタ
95 * @return 学習できる魔道書ならばTRUEを返す
97 bool item_tester_learn_spell(player_type *player_ptr, object_type *o_ptr)
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);
104 choices &= ~(CH_LIFE | CH_CRUSADE);
108 if ((o_ptr->tval < TV_LIFE_BOOK) || (o_ptr->tval > (TV_LIFE_BOOK + MAX_REALM - 1)))
111 if ((o_ptr->tval == TV_MUSIC_BOOK) && (player_ptr->pclass == CLASS_BARD))
113 else if (!is_magic(tval2realm(o_ptr->tval)))
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)));
120 * @brief オブジェクトが高位の魔法書かどうかを判定する
121 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
122 * @return オブジェクトが高位の魔法書ならばTRUEを返す
124 bool item_tester_high_level_book(object_type *o_ptr)
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)) {