diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cmd2.cc | 9 | ||||
-rw-r--r-- | src/hooks.cc | 28 | ||||
-rw-r--r-- | src/hooks.h | 1 | ||||
-rw-r--r-- | src/q_hobbit.cc | 21 | ||||
-rw-r--r-- | src/q_shroom.cc | 38 |
5 files changed, 61 insertions, 36 deletions
diff --git a/src/cmd2.cc b/src/cmd2.cc index 261207d4..e0a1bb08 100644 --- a/src/cmd2.cc +++ b/src/cmd2.cc @@ -5115,13 +5115,10 @@ void do_cmd_give() if (!get_item(&item, q, s, USE_INVEN)) return; /* Process hooks if there are any */ - if (!process_hooks(HOOK_GIVE, "(d,d)", c_ptr->m_idx, item)) + hook_give_in in = { c_ptr->m_idx, item }; + if (!process_hooks_new(HOOK_GIVE, &in, NULL)) { - hook_give_in in = { c_ptr->m_idx, item }; - if (!process_hooks_new(HOOK_GIVE, &in, NULL)) - { - msg_print("The monster does not want your item."); - } + msg_print("The monster does not want your item."); } /* Take a turn, even if the offer is declined */ diff --git a/src/hooks.cc b/src/hooks.cc index 0d89586a..e1dff3ce 100644 --- a/src/hooks.cc +++ b/src/hooks.cc @@ -100,6 +100,34 @@ void del_hook(int h_idx, hook_type hook) } } +void del_hook_new(int h_idx, bool_ (*hook_f)(void *, void *, void *)) +{ + hooks_chain *c = hooks_heads[h_idx], *p = NULL; + + /* Find it */ + while ((c != NULL) && (c->hook_f != hook_f)) + { + p = c; + c = c->next; + } + + /* Remove it */ + if (c != NULL) + { + if (p == NULL) + { + hooks_heads[h_idx] = c->next; + delete c; + } + else + { + p->next = c->next; + delete c; + } + } +}; + + /* get the next argument */ static hook_return param_pile[MAX_ARGS]; static int get_next_arg_pos = 0; diff --git a/src/hooks.h b/src/hooks.h index 8ea87bc3..47d7b964 100644 --- a/src/hooks.h +++ b/src/hooks.h @@ -12,6 +12,7 @@ extern void init_hooks(void); extern hooks_chain* add_hook(int h_idx, hook_type hook, cptr name); extern void add_hook_new(int h_idx, bool_ (*hook_f)(void *, void *, void *), cptr name, void *data); extern void del_hook(int h_idx, hook_type hook); +extern void del_hook_new(int h_idx, bool_ (*hook_f)(void *, void *, void *)); extern s32b get_next_arg(const char *fmt); extern char* get_next_arg_str(const char *fmt); extern object_type *get_next_arg_obj(); diff --git a/src/q_hobbit.cc b/src/q_hobbit.cc index a6a1f140..8e787777 100644 --- a/src/q_hobbit.cc +++ b/src/q_hobbit.cc @@ -65,14 +65,13 @@ static bool_ quest_hobbit_gen_hook(const char *fmt) return FALSE; } -static bool_ quest_hobbit_give_hook(const char *fmt) +static bool_ quest_hobbit_give_hook(void *, void *in_, void *) { + struct hook_give_in *in = static_cast<struct hook_give_in *>(in_); object_type *o_ptr; monster_type *m_ptr; - s32b m_idx, item; - - m_idx = get_next_arg(fmt); - item = get_next_arg(fmt); + s32b m_idx = in->m_idx; + s32b item = in->item; o_ptr = &p_ptr->inventory[item]; m_ptr = &m_list[m_idx]; @@ -90,7 +89,7 @@ static bool_ quest_hobbit_give_hook(const char *fmt) cquest.status = QUEST_STATUS_COMPLETED; - del_hook(HOOK_GIVE, quest_hobbit_give_hook); + del_hook_new(HOOK_GIVE, quest_hobbit_give_hook); process_hooks_restart = TRUE; return TRUE; @@ -190,11 +189,11 @@ bool_ quest_hobbit_init_hook(int q_idx) if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { - add_hook(HOOK_GIVE, quest_hobbit_give_hook, "hobbit_give"); - add_hook(HOOK_GEN_LEVEL, quest_hobbit_gen_hook, "hobbit_gen"); - add_hook(HOOK_WILD_GEN, quest_hobbit_town_gen_hook, "hobbit_town_gen"); - add_hook(HOOK_CHAT, quest_hobbit_chat_hook, "hobbit_chat"); - add_hook(HOOK_MON_SPEAK, quest_hobbit_speak_hook, "hobbit_speak"); + add_hook_new(HOOK_GIVE, quest_hobbit_give_hook, "hobbit_give", NULL); + add_hook (HOOK_GEN_LEVEL, quest_hobbit_gen_hook, "hobbit_gen"); + add_hook (HOOK_WILD_GEN, quest_hobbit_town_gen_hook, "hobbit_town_gen"); + add_hook (HOOK_CHAT, quest_hobbit_chat_hook, "hobbit_chat"); + add_hook (HOOK_MON_SPEAK, quest_hobbit_speak_hook, "hobbit_speak"); } if (cquest.status == QUEST_STATUS_UNTAKEN) { diff --git a/src/q_shroom.cc b/src/q_shroom.cc index d402c818..e9a5d83c 100644 --- a/src/q_shroom.cc +++ b/src/q_shroom.cc @@ -104,14 +104,14 @@ static bool_ quest_shroom_death_hook(const char *fmt) return FALSE; } -static bool_ quest_shroom_give_hook(const char *fmt) +static bool_ quest_shroom_give_hook(void *, void *in_, void *) { + struct hook_give_in *in = static_cast<struct hook_give_in *>(in_); object_type *o_ptr; monster_type *m_ptr; - s32b m_idx, item; - m_idx = get_next_arg(fmt); - item = get_next_arg(fmt); + s32b m_idx = in->m_idx; + s32b item = in->item; o_ptr = &p_ptr->inventory[item]; m_ptr = &m_list[m_idx]; @@ -128,9 +128,9 @@ static bool_ quest_shroom_give_hook(const char *fmt) msg_print("YOU MURDERER! Out of my sight!"); delete_monster_idx(m_idx); - del_hook(HOOK_GIVE, quest_shroom_give_hook); - del_hook(HOOK_CHAT, quest_shroom_speak_hook); - del_hook(HOOK_WILD_GEN, quest_shroom_town_gen_hook); + del_hook_new(HOOK_GIVE, quest_shroom_give_hook); + del_hook (HOOK_CHAT, quest_shroom_speak_hook); + del_hook (HOOK_WILD_GEN, quest_shroom_town_gen_hook); process_hooks_restart = TRUE; return TRUE; } @@ -180,7 +180,7 @@ static bool_ quest_shroom_give_hook(const char *fmt) cquest.status = QUEST_STATUS_FINISHED; - del_hook(HOOK_GIVE, quest_shroom_give_hook); + del_hook_new(HOOK_GIVE, quest_shroom_give_hook); process_hooks_restart = TRUE; } else @@ -216,9 +216,9 @@ static bool_ quest_shroom_speak_hook(const char *fmt) msg_print("YOU MURDERER! Out of my sight!"); delete_monster_idx(m_idx); - del_hook(HOOK_GIVE, quest_shroom_give_hook); - del_hook(HOOK_CHAT, quest_shroom_speak_hook); - del_hook(HOOK_WILD_GEN, quest_shroom_town_gen_hook); + del_hook_new(HOOK_GIVE, quest_shroom_give_hook); + del_hook (HOOK_CHAT, quest_shroom_speak_hook); + del_hook (HOOK_WILD_GEN, quest_shroom_town_gen_hook); process_hooks_restart = TRUE; return TRUE; } @@ -261,9 +261,9 @@ static bool_ quest_shroom_chat_hook(const char *fmt) msg_print("YOU MURDERER! Out of my sight!"); delete_monster_idx(m_idx); - del_hook(HOOK_GIVE, quest_shroom_give_hook); - del_hook(HOOK_CHAT, quest_shroom_speak_hook); - del_hook(HOOK_WILD_GEN, quest_shroom_town_gen_hook); + del_hook_new(HOOK_GIVE, quest_shroom_give_hook); + del_hook (HOOK_CHAT, quest_shroom_speak_hook); + del_hook (HOOK_WILD_GEN, quest_shroom_town_gen_hook); process_hooks_restart = TRUE; return TRUE; } @@ -288,11 +288,11 @@ bool_ quest_shroom_init_hook(int q_idx) if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED)) { - add_hook(HOOK_MONSTER_DEATH, quest_shroom_death_hook, "shroom_death"); - add_hook(HOOK_GIVE, quest_shroom_give_hook, "shroom_give"); - add_hook(HOOK_WILD_GEN, quest_shroom_town_gen_hook, "shroom_town_gen"); - add_hook(HOOK_CHAT, quest_shroom_chat_hook, "shroom_chat"); - add_hook(HOOK_MON_SPEAK, quest_shroom_speak_hook, "shroom_speak"); + add_hook (HOOK_MONSTER_DEATH, quest_shroom_death_hook, "shroom_death"); + add_hook_new(HOOK_GIVE, quest_shroom_give_hook, "shroom_give", NULL); + add_hook (HOOK_WILD_GEN, quest_shroom_town_gen_hook, "shroom_town_gen"); + add_hook (HOOK_CHAT, quest_shroom_chat_hook, "shroom_chat"); + add_hook (HOOK_MON_SPEAK, quest_shroom_speak_hook, "shroom_speak"); } if (cquest.status == QUEST_STATUS_UNTAKEN) { |