summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/melee2.cc3
-rw-r--r--src/q_hobbit.cc29
-rw-r--r--src/q_shroom.cc81
-rw-r--r--src/types.h6
4 files changed, 55 insertions, 64 deletions
diff --git a/src/melee2.cc b/src/melee2.cc
index f35e1e80..d4f2e9ff 100644
--- a/src/melee2.cc
+++ b/src/melee2.cc
@@ -6423,7 +6423,8 @@ static void process_monster(int m_idx, bool_ is_frien)
/* Try for the unique's lines in "monspeak.txt" first. */
/* 0 is SUCCESS, of course.... */
- if (!process_hooks(HOOK_MON_SPEAK, "(d,s)", m_idx, m_name))
+ struct hook_mon_speak_in in = { m_idx, m_name };
+ if (!process_hooks_new(HOOK_MON_SPEAK, &in, NULL))
{
if (get_xtra_line("monspeak.txt", m_ptr, monmessage) != 0)
{
diff --git a/src/q_hobbit.cc b/src/q_hobbit.cc
index 8e787777..34b78808 100644
--- a/src/q_hobbit.cc
+++ b/src/q_hobbit.cc
@@ -95,19 +95,16 @@ static bool_ quest_hobbit_give_hook(void *, void *in_, void *)
return TRUE;
}
-static bool_ quest_hobbit_speak_hook(const char *fmt)
+static bool_ quest_hobbit_speak_hook(void *, void *in_, void *)
{
- s32b m_idx = get_next_arg(fmt);
+ struct hook_mon_speak_in *in = static_cast<struct hook_mon_speak_in *>(in_);
+ s32b m_idx = in->m_idx;
if (m_list[m_idx].r_idx != test_monster_name("Melinda Proudfoot")) return (FALSE);
if (cquest.status < QUEST_STATUS_COMPLETED)
{
- cptr m_name;
-
- m_name = get_next_arg_str(fmt);
-
- msg_format("%^s begs for your help.", m_name);
+ msg_format("%^s begs for your help.", in->m_name);
}
return (TRUE);
}
@@ -151,7 +148,7 @@ static bool_ quest_hobbit_chat_hook(const char *fmt)
cquest.status = QUEST_STATUS_FINISHED;
- del_hook(HOOK_MON_SPEAK, quest_hobbit_speak_hook);
+ del_hook_new(HOOK_MON_SPEAK, quest_hobbit_speak_hook);
process_hooks_restart = TRUE;
delete_monster_idx(m_idx);
@@ -189,17 +186,17 @@ bool_ quest_hobbit_init_hook(int q_idx)
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
- 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");
+ 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_new(HOOK_MON_SPEAK, quest_hobbit_speak_hook, "hobbit_speak", NULL);
}
if (cquest.status == QUEST_STATUS_UNTAKEN)
{
- add_hook(HOOK_MON_SPEAK, quest_hobbit_speak_hook, "hobbit_speak");
- 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_new(HOOK_MON_SPEAK, quest_hobbit_speak_hook, "hobbit_speak", NULL);
+ 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_CHAR_DUMP, quest_hobbit_dump_hook, "hobbit_dump");
return (FALSE);
diff --git a/src/q_shroom.cc b/src/q_shroom.cc
index e9a5d83c..ed439fd3 100644
--- a/src/q_shroom.cc
+++ b/src/q_shroom.cc
@@ -4,7 +4,7 @@
#define cquest (quest[QUEST_SHROOM])
-static bool_ quest_shroom_speak_hook(const char *fmt);
+static bool_ quest_shroom_speak_hook(void *, void *in_, void *);
static bool_ quest_shroom_town_gen_hook(const char *fmt)
{
@@ -129,7 +129,7 @@ static bool_ quest_shroom_give_hook(void *, void *in_, void *)
delete_monster_idx(m_idx);
del_hook_new(HOOK_GIVE, quest_shroom_give_hook);
- del_hook (HOOK_CHAT, quest_shroom_speak_hook);
+ del_hook_new(HOOK_CHAT, quest_shroom_speak_hook);
del_hook (HOOK_WILD_GEN, quest_shroom_town_gen_hook);
process_hooks_restart = TRUE;
return TRUE;
@@ -189,40 +189,43 @@ static bool_ quest_shroom_give_hook(void *, void *in_, void *)
return TRUE;
}
-static bool_ quest_shroom_speak_hook(const char *fmt)
+static void check_dogs_alive(s32b m_idx)
{
- s32b m_idx = get_next_arg(fmt);
+ if ((r_info[test_monster_name("Grip, Farmer Maggot's dog")].max_num == 0) ||
+ (r_info[test_monster_name("Wolf, Farmer Maggot's dog")].max_num == 0) ||
+ (r_info[test_monster_name("Fang, Farmer Maggot's dog")].max_num == 0))
+ {
+ cquest.status = QUEST_STATUS_FAILED_DONE;
+ msg_print("My puppy! My poor, defenceless puppy...");
+ msg_print("YOU MURDERER! Out of my sight!");
+ delete_monster_idx(m_idx);
+
+ del_hook_new(HOOK_GIVE, quest_shroom_give_hook);
+ del_hook_new(HOOK_CHAT, quest_shroom_speak_hook);
+ del_hook (HOOK_WILD_GEN, quest_shroom_town_gen_hook);
+ process_hooks_restart = TRUE;
+ }
+ else
+ {
+ msg_format("You still have %d mushrooms to bring back!", cquest.data[1] - cquest.data[0]);
+ }
+}
+
+static bool_ quest_shroom_speak_hook(void *, void *in_, void *)
+{
+ struct hook_mon_speak_in *in = static_cast<struct hook_mon_speak_in *>(in_);
+ s32b m_idx = in->m_idx;
if (m_list[m_idx].r_idx != test_monster_name("Farmer Maggot")) return (FALSE);
if (cquest.status == QUEST_STATUS_UNTAKEN)
{
- cptr m_name;
-
- m_name = get_next_arg_str(fmt);
-
- msg_format("%^s asks your help.", m_name);
+ msg_format("%^s asks your help.", in->m_name);
process_hooks_new(HOOK_MON_ASK_HELP, NULL, NULL);
}
else
{
- /* If one is dead .. its bad */
- if ((r_info[test_monster_name("Grip, Farmer Maggot's dog")].max_num == 0) ||
- (r_info[test_monster_name("Wolf, Farmer Maggot's dog")].max_num == 0) ||
- (r_info[test_monster_name("Fang, Farmer Maggot's dog")].max_num == 0))
- {
- cquest.status = QUEST_STATUS_FAILED_DONE;
- msg_print("My puppy! My poor, defenceless puppy...");
- msg_print("YOU MURDERER! Out of my sight!");
- delete_monster_idx(m_idx);
-
- 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;
- }
- msg_format("You still have %d mushrooms to bring back!", cquest.data[1] - cquest.data[0]);
+ check_dogs_alive(m_idx);
}
return (TRUE);
}
@@ -251,23 +254,7 @@ static bool_ quest_shroom_chat_hook(const char *fmt)
}
else
{
- /* If one is dead .. its bad */
- if ((r_info[test_monster_name("Grip, Farmer Maggot's dog")].max_num == 0) ||
- (r_info[test_monster_name("Wolf, Farmer Maggot's dog")].max_num == 0) ||
- (r_info[test_monster_name("Fang, Farmer Maggot's dog")].max_num == 0))
- {
- cquest.status = QUEST_STATUS_FAILED_DONE;
- msg_print("My puppy! My poor, defenceless puppy...");
- msg_print("YOU MURDERER! Out of my sight!");
- delete_monster_idx(m_idx);
-
- 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;
- }
- msg_format("You still have %d mushrooms to bring back!", cquest.data[1] - cquest.data[0]);
+ check_dogs_alive(m_idx);
}
return TRUE;
@@ -292,13 +279,13 @@ bool_ quest_shroom_init_hook(int q_idx)
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");
+ add_hook_new(HOOK_MON_SPEAK, quest_shroom_speak_hook, "shroom_speak", NULL);
}
if (cquest.status == QUEST_STATUS_UNTAKEN)
{
- add_hook(HOOK_MON_SPEAK, quest_shroom_speak_hook, "shroom_speak");
- 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_new(HOOK_MON_SPEAK, quest_shroom_speak_hook, "shroom_speak", NULL);
+ add_hook (HOOK_WILD_GEN, quest_shroom_town_gen_hook, "shroom_town_gen");
+ add_hook (HOOK_CHAT, quest_shroom_chat_hook, "shroom_chat");
}
return (FALSE);
}
diff --git a/src/types.h b/src/types.h
index f5ce1d97..6ac84fc2 100644
--- a/src/types.h
+++ b/src/types.h
@@ -2216,6 +2216,12 @@ struct hook_give_in {
int item;
};
+typedef struct hook_mon_speak_in hook_mon_speak_in;
+struct hook_mon_speak_in {
+ s32b m_idx;
+ cptr m_name;
+};
+
typedef struct hook_eat_in hook_eat_in;
struct hook_eat_in {
object_type *o_ptr;