#include "angband.h"
#include "object-hook.h"
+#include "artifact.h"
/*!
* @brief 対象のアイテムが矢やクロスボウの矢の材料になるかを返す。/
else
#endif
- if (prace_is_(RACE_SKELETON) ||
- prace_is_(RACE_GOLEM) ||
- prace_is_(RACE_ZOMBIE) ||
- prace_is_(RACE_SPECTRE))
- {
- if (o_ptr->tval == TV_STAFF || o_ptr->tval == TV_WAND)
- return TRUE;
- }
- else if (prace_is_(RACE_DEMON) ||
- (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON))
- {
- if (o_ptr->tval == TV_CORPSE &&
- o_ptr->sval == SV_CORPSE &&
- my_strchr("pht", r_info[o_ptr->pval].d_char))
- return TRUE;
- }
+ if (prace_is_(RACE_SKELETON) ||
+ prace_is_(RACE_GOLEM) ||
+ prace_is_(RACE_ZOMBIE) ||
+ prace_is_(RACE_SPECTRE))
+ {
+ if (o_ptr->tval == TV_STAFF || o_ptr->tval == TV_WAND)
+ return TRUE;
+ }
+ else if (prace_is_(RACE_DEMON) || (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON))
+ {
+ if (o_ptr->tval == TV_CORPSE &&
+ o_ptr->sval == SV_CORPSE &&
+ my_strchr("pht", r_info[o_ptr->pval].d_char))
+ return TRUE;
+ }
/* Assume not */
return (FALSE);
*/
bool item_tester_hook_activate(object_type *o_ptr)
{
- u32b flgs[TR_FLAG_SIZE];
+ BIT_FLAGS flgs[TR_FLAG_SIZE];
/* Not known */
if (!object_is_known(o_ptr)) return (FALSE);
-
- /* Extract the flags */
object_flags(o_ptr, flgs);
/* Check activation flag */
*/
bool item_tester_hook_use(object_type *o_ptr)
{
- u32b flgs[TR_FLAG_SIZE];
+ BIT_FLAGS flgs[TR_FLAG_SIZE];
/* Ammo */
if (o_ptr->tval == p_ptr->tval_ammo)
{
if (&inventory[i] == o_ptr)
{
- /* Extract the flags */
object_flags(o_ptr, flgs);
/* Check activation flag */
/* Hack -- Recharge rods */
if (o_ptr->tval == TV_ROD) return (TRUE);
- /* Nope */
+ return (FALSE);
+}
+
+/*!
+ * @brief オブジェクトがプレイヤーが使用可能な魔道書かどうかを判定する
+ * @param o_ptr 判定したいオブ会ジェクトの構造体参照ポインタ
+ * @return 学習できる魔道書ならばTRUEを返す
+ */
+bool item_tester_learn_spell(object_type *o_ptr)
+{
+ s32b choices = realm_choices2[p_ptr->pclass];
+
+ if (p_ptr->pclass == CLASS_PRIEST)
+ {
+ if (is_good_realm(p_ptr->realm1))
+ {
+ choices &= ~(CH_DEATH | CH_DAEMON);
+ }
+ else
+ {
+ choices &= ~(CH_LIFE | CH_CRUSADE);
+ }
+ }
+
+ if ((o_ptr->tval < TV_LIFE_BOOK) || (o_ptr->tval > (TV_LIFE_BOOK + MAX_REALM - 1))) return (FALSE);
+ if ((o_ptr->tval == TV_MUSIC_BOOK) && (p_ptr->pclass == CLASS_BARD)) return (TRUE);
+ else if (!is_magic(tval2realm(o_ptr->tval))) return FALSE;
+ if ((REALM1_BOOK == o_ptr->tval) || (REALM2_BOOK == o_ptr->tval)) return (TRUE);
+ if (choices & (0x0001 << (tval2realm(o_ptr->tval) - 1))) return (TRUE);
return (FALSE);
}