summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cmd2.cc9
-rw-r--r--src/hooks.cc28
-rw-r--r--src/hooks.h1
-rw-r--r--src/q_hobbit.cc21
-rw-r--r--src/q_shroom.cc38
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)
{