diff options
-rw-r--r-- | src/melee2.cc | 3 | ||||
-rw-r--r-- | src/q_hobbit.cc | 29 | ||||
-rw-r--r-- | src/q_shroom.cc | 81 | ||||
-rw-r--r-- | src/types.h | 6 |
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; |