3 #include "object-hook.h"
7 * @brief 対象のアイテムが矢やクロスボウの矢の材料になるかを返す。/
8 * Hook to determine if an object is contertible in an arrow/bolt
9 * @param o_ptr オブジェクトの構造体の参照ポインタ。
10 * @return 材料にできるならTRUEを返す
12 bool item_tester_hook_convertible(object_type *o_ptr)
14 if ((o_ptr->tval == TV_JUNK) || (o_ptr->tval == TV_SKELETON)) return TRUE;
16 if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON)) return TRUE;
22 * @brief 武器匠の「武器」鑑定対象になるかを判定する。/ Hook to specify "weapon"
23 * @param o_ptr オブジェクトの構造体の参照ポインタ。
24 * @return 対象になるならTRUEを返す。
26 bool item_tester_hook_orthodox_melee_weapons(object_type *o_ptr)
38 if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
46 * @brief オブジェクトが右手か左手に装備できる武器かどうかの判定
47 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
48 * @return 右手か左手の武器として装備できるならばTRUEを返す。
50 bool item_tester_hook_melee_weapon(object_type *o_ptr)
52 /* Check for a usable slot */
53 if ((o_ptr->tval >= TV_DIGGING) && (o_ptr->tval <= TV_SWORD)) return (TRUE);
55 /* Assume not wearable */
61 * @brief 武器匠の「矢弾」鑑定対象になるかを判定する。/ Hook to specify "weapon"
62 * @param o_ptr オブジェクトの構造体の参照ポインタ。
63 * @return 対象になるならTRUEを返す。
65 bool item_tester_hook_ammo(object_type *o_ptr)
81 * @brief 修復対象となる壊れた武器かを判定する。 / Hook to specify "broken weapon"
82 * @param o_ptr オブジェクトの構造体の参照ポインタ。
83 * @return 修復対象になるならTRUEを返す。
85 bool item_tester_hook_broken_weapon(object_type *o_ptr)
87 if (o_ptr->tval != TV_SWORD) return FALSE;
91 case SV_BROKEN_DAGGER:
100 * @brief オブジェクトが投射可能な武器かどうかを返す。
101 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
102 * @return 投射可能な武器ならばTRUE
104 bool item_tester_hook_boomerang(object_type *o_ptr)
106 if ((o_ptr->tval == TV_DIGGING) || (o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM) || (o_ptr->tval == TV_HAFTED)) return (TRUE);
113 * @brief オブジェクトをプレイヤーが食べることができるかを判定する /
114 * Hook to determine if an object is eatable
115 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
116 * @return 食べることが可能ならばTRUEを返す
118 bool item_tester_hook_eatable(object_type *o_ptr)
120 if (o_ptr->tval == TV_FOOD) return TRUE;
123 if (prace_is_(RACE_SKELETON))
125 if (o_ptr->tval == TV_SKELETON ||
126 (o_ptr->tval == TV_CORPSE && o_ptr->sval == SV_SKELETON))
132 if (prace_is_(RACE_SKELETON) ||
133 prace_is_(RACE_GOLEM) ||
134 prace_is_(RACE_ZOMBIE) ||
135 prace_is_(RACE_SPECTRE))
137 if (o_ptr->tval == TV_STAFF || o_ptr->tval == TV_WAND)
140 else if (prace_is_(RACE_DEMON) || (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON))
142 if (o_ptr->tval == TV_CORPSE &&
143 o_ptr->sval == SV_CORPSE &&
144 my_strchr("pht", r_info[o_ptr->pval].d_char))
153 * @brief オブジェクトがどちらの手にも装備できる武器かどうかの判定
154 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
155 * @return 左右両方の手で装備できるならばTRUEを返す。
157 bool item_tester_hook_mochikae(object_type *o_ptr)
159 /* Check for a usable slot */
160 if (((o_ptr->tval >= TV_DIGGING) && (o_ptr->tval <= TV_SWORD)) ||
161 (o_ptr->tval == TV_SHIELD) || (o_ptr->tval == TV_CAPTURE) ||
162 (o_ptr->tval == TV_CARD)) return (TRUE);
164 /* Assume not wearable */
169 * @brief オブジェクトをプレイヤーが魔道具として発動できるかを判定する /
170 * Hook to determine if an object is activatable
171 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
172 * @return 魔道具として発動可能ならばTRUEを返す
174 bool item_tester_hook_activate(object_type *o_ptr)
176 BIT_FLAGS flgs[TR_FLAG_SIZE];
179 if (!object_is_known(o_ptr)) return (FALSE);
180 object_flags(o_ptr, flgs);
182 /* Check activation flag */
183 if (have_flag(flgs, TR_ACTIVATE)) return (TRUE);
190 * @brief オブジェクトを防具として装備できるかの判定 / The "wearable" tester
191 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
192 * @return オブジェクトが防具として装備できるならTRUEを返す。
194 bool item_tester_hook_wear(object_type *o_ptr)
196 if ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ABUNAI_MIZUGI))
197 if (p_ptr->psex == SEX_MALE) return FALSE;
199 /* Check for a usable slot */
200 if (wield_slot(o_ptr) >= INVEN_RARM) return (TRUE);
202 /* Assume not wearable */
208 * @brief オブジェクトをプレイヤーが簡易使用コマンドで利用できるかを判定する /
209 * Hook to determine if an object is useable
210 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
211 * @return 利用可能ならばTRUEを返す
213 bool item_tester_hook_use(object_type *o_ptr)
215 BIT_FLAGS flgs[TR_FLAG_SIZE];
218 if (o_ptr->tval == p_ptr->tval_ammo)
240 if (!object_is_known(o_ptr)) return (FALSE);
242 /* HACK - only items from the equipment can be activated */
243 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
245 if (&inventory[i] == o_ptr)
247 object_flags(o_ptr, flgs);
249 /* Check activation flag */
250 if (have_flag(flgs, TR_ACTIVATE)) return (TRUE);
262 * @brief オブジェクトをプレイヤーが飲むことができるかを判定する /
263 * Hook to determine if an object can be quaffed
264 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
265 * @return 飲むことが可能ならばTRUEを返す
267 bool item_tester_hook_quaff(object_type *o_ptr)
269 if (o_ptr->tval == TV_POTION) return TRUE;
271 if (prace_is_(RACE_ANDROID))
273 if (o_ptr->tval == TV_FLASK && o_ptr->sval == SV_FLASK_OIL)
281 * @brief オブジェクトをプレイヤーが読むことができるかを判定する /
282 * Hook to determine if an object is readable
283 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
284 * @return 読むことが可能ならばTRUEを返す
286 bool item_tester_hook_readable(object_type *o_ptr)
288 if ((o_ptr->tval == TV_SCROLL) || (o_ptr->tval == TV_PARCHMENT) || (o_ptr->name1 == ART_GHB) || (o_ptr->name1 == ART_POWER)) return (TRUE);
296 * @brief エッセンスの付加可能な武器や矢弾かを返す
297 * @param o_ptr チェックしたいオブジェクトの構造体参照ポインタ
298 * @return エッセンスの付加可能な武器か矢弾ならばTRUEを返す。
300 bool item_tester_hook_melee_ammo(object_type *o_ptr)
315 if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
323 * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
324 * @param o_ptr オブジェクト構造体の参照ポインタ
325 * @return 呪縛可能な武器ならばTRUEを返す
327 bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
344 * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
345 * @param o_ptr オブジェクト構造体の参照ポインタ
346 * @return 使える装備ならばTRUEを返す
348 bool item_tester_hook_cursed(object_type *o_ptr)
350 return (bool)(object_is_cursed(o_ptr));
355 * @brief アイテムが並の価値のアイテムかどうか判定する /
356 * Check if an object is nameless weapon or armour
357 * @param o_ptr 判定するアイテムの情報参照ポインタ
358 * @return 並ならばTRUEを返す
360 bool item_tester_hook_nameless_weapon_armour(object_type *o_ptr)
362 /* Require weapon or armour */
363 if (!object_is_weapon_armour_ammo(o_ptr)) return FALSE;
365 /* Require nameless object if the object is well known */
366 if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
374 * @brief アイテムが鑑定済みかを判定する /
375 * @param o_ptr 判定するアイテムの情報参照ポインタ
376 * @return 実際に鑑定済みならばTRUEを返す
378 bool item_tester_hook_identify(object_type *o_ptr)
380 return (bool)!object_is_known(o_ptr);
384 * @brief アイテムが鑑定済みの武器防具かを判定する /
385 * @param o_ptr 判定するアイテムの情報参照ポインタ
386 * @return 実際に鑑定済みならばTRUEを返す
388 bool item_tester_hook_identify_weapon_armour(object_type *o_ptr)
390 if (object_is_known(o_ptr))
392 return object_is_weapon_armour_ammo(o_ptr);
396 * @brief アイテムが*鑑定*済みかを判定する /
397 * @param o_ptr 判定するアイテムの情報参照ポインタ
398 * @return 実際に鑑定済みならばTRUEを返す
400 bool item_tester_hook_identify_fully(object_type *o_ptr)
402 return (bool)(!object_is_known(o_ptr) || !(o_ptr->ident & IDENT_MENTAL));
406 * @brief アイテムが*鑑定*済みの武器防具かを判定する /
407 * @param o_ptr 判定するアイテムの情報参照ポインタ
408 * @return 実際に鑑定済みならばTRUEを返す
410 bool item_tester_hook_identify_fully_weapon_armour(object_type *o_ptr)
412 if (!item_tester_hook_identify_fully(o_ptr))
414 return object_is_weapon_armour_ammo(o_ptr);
419 * @brief 魔力充填が可能なアイテムかどうか判定する /
420 * Hook for "get_item()". Determine if something is rechargable.
421 * @param o_ptr 判定するアイテムの情報参照ポインタ
422 * @return 魔力充填が可能ならばTRUEを返す
424 bool item_tester_hook_recharge(object_type *o_ptr)
426 /* Recharge staffs */
427 if (o_ptr->tval == TV_STAFF) return (TRUE);
430 if (o_ptr->tval == TV_WAND) return (TRUE);
432 /* Hack -- Recharge rods */
433 if (o_ptr->tval == TV_ROD) return (TRUE);
439 * @brief オブジェクトがプレイヤーが使用可能な魔道書かどうかを判定する
440 * @param o_ptr 判定したいオブ会ジェクトの構造体参照ポインタ
441 * @return 学習できる魔道書ならばTRUEを返す
443 bool item_tester_learn_spell(object_type *o_ptr)
445 s32b choices = realm_choices2[p_ptr->pclass];
447 if (p_ptr->pclass == CLASS_PRIEST)
449 if (is_good_realm(p_ptr->realm1))
451 choices &= ~(CH_DEATH | CH_DAEMON);
455 choices &= ~(CH_LIFE | CH_CRUSADE);
459 if ((o_ptr->tval < TV_LIFE_BOOK) || (o_ptr->tval > (TV_LIFE_BOOK + MAX_REALM - 1))) return (FALSE);
460 if ((o_ptr->tval == TV_MUSIC_BOOK) && (p_ptr->pclass == CLASS_BARD)) return (TRUE);
461 else if (!is_magic(tval2realm(o_ptr->tval))) return FALSE;
462 if ((REALM1_BOOK == o_ptr->tval) || (REALM2_BOOK == o_ptr->tval)) return (TRUE);
463 if (choices & (0x0001 << (tval2realm(o_ptr->tval) - 1))) return (TRUE);
468 * @brief オブジェクトが高位の魔法書かどうかを判定する
469 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
470 * @return オブジェクトが高位の魔法書ならばTRUEを返す
472 bool item_tester_high_level_book(object_type *o_ptr)
474 if ((o_ptr->tval == TV_LIFE_BOOK) ||
475 (o_ptr->tval == TV_SORCERY_BOOK) ||
476 (o_ptr->tval == TV_NATURE_BOOK) ||
477 (o_ptr->tval == TV_CHAOS_BOOK) ||
478 (o_ptr->tval == TV_DEATH_BOOK) ||
479 (o_ptr->tval == TV_TRUMP_BOOK) ||
480 (o_ptr->tval == TV_CRAFT_BOOK) ||
481 (o_ptr->tval == TV_DAEMON_BOOK) ||
482 (o_ptr->tval == TV_CRUSADE_BOOK) ||
483 (o_ptr->tval == TV_MUSIC_BOOK) ||
484 (o_ptr->tval == TV_HEX_BOOK))
496 * @brief オブジェクトがランタンの燃料になるかどうかを判定する
497 * An "item_tester_hook" for refilling lanterns
498 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
499 * @return オブジェクトがランタンの燃料になるならばTRUEを返す
501 bool item_tester_refill_lantern(object_type *o_ptr)
503 /* Flasks of oil are okay */
504 if (o_ptr->tval == TV_FLASK) return (TRUE);
506 /* Laterns are okay */
507 if ((o_ptr->tval == TV_LITE) &&
508 (o_ptr->sval == SV_LITE_LANTERN)) return (TRUE);
510 /* Assume not okay */