diff options
author | Bardur Arantsson <bardur@scientician.net> | 2013-03-26 17:10:10 +0100 |
---|---|---|
committer | Bardur Arantsson <bardur@scientician.net> | 2013-09-27 14:46:42 +0200 |
commit | cbef37bd5bfb938a2303ee3887520c08be85d8e8 (patch) | |
tree | b604e49323e46af4ea582f9a9e1977b3daa90611 /src/q_shroom.cc | |
parent | b9f824effb037a53556e02955cace6c09ff646c3 (diff) |
Switch almost everything over to C++
Diffstat (limited to 'src/q_shroom.cc')
-rw-r--r-- | src/q_shroom.cc | 304 |
1 files changed, 304 insertions, 0 deletions
diff --git a/src/q_shroom.cc b/src/q_shroom.cc new file mode 100644 index 00000000..d402c818 --- /dev/null +++ b/src/q_shroom.cc @@ -0,0 +1,304 @@ +#include "q_shroom.h" +#include "messages.h" +#include "hooks.h" + +#define cquest (quest[QUEST_SHROOM]) + +static bool_ quest_shroom_speak_hook(const char *fmt); + +static bool_ quest_shroom_town_gen_hook(const char *fmt) +{ + int m_idx, x = 1, y = 1, tries = 10000; + s32b small; + + small = get_next_arg(fmt); + + /* Generate the shrooms field */ + if ((!small) && (p_ptr->wilderness_y == 21) && (p_ptr->wilderness_x == 33)) + { + /* Create the field */ + for (x = (cur_wid / 2) - 7; x <= (cur_wid / 2) + 7; x++) + for (y = (cur_hgt / 2) - 5; y <= (cur_hgt / 2) + 5; y++) + cave_set_feat(y, x, 181); + + /* Throw in some 'shrooms */ + for (x = 0; x < (cquest.data[1] - cquest.data[0]); x++) + { + object_type forge, *q_ptr = &forge; + + object_prep(q_ptr, lookup_kind(TV_FOOD, rand_range(1, 18))); + q_ptr->number = 1; + /* Mark them */ + q_ptr->pval2 = 1; + drop_near(q_ptr, -1, rand_range((cur_hgt / 2) - 5, (cur_hgt / 2) + 5), rand_range((cur_wid / 2) - 7, (cur_wid / 2) + 7)); + } + + /* Throw in some dogs ;) */ + y = rand_range((cur_hgt / 2) - 5, (cur_hgt / 2) + 5); + x = rand_range((cur_wid / 2) - 7, (cur_wid / 2) + 7); + m_allow_special[test_monster_name("Grip, Farmer Maggot's dog")] = TRUE; + m_idx = place_monster_one(y, x, test_monster_name("Grip, Farmer Maggot's dog"), 0, FALSE, MSTATUS_ENEMY); + if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST; + m_allow_special[test_monster_name("Grip, Farmer Maggot's dog")] = FALSE; + + y = rand_range((cur_hgt / 2) - 5, (cur_hgt / 2) + 5); + x = rand_range((cur_wid / 2) - 7, (cur_wid / 2) + 7); + m_allow_special[test_monster_name("Wolf, Farmer Maggot's dog")] = TRUE; + m_idx = place_monster_one(y, x, test_monster_name("Wolf, Farmer Maggot's dog"), 0, FALSE, MSTATUS_ENEMY); + if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST; + m_allow_special[test_monster_name("Wolf, Farmer Maggot's dog")] = FALSE; + + y = rand_range((cur_hgt / 2) - 5, (cur_hgt / 2) + 5); + x = rand_range((cur_wid / 2) - 7, (cur_wid / 2) + 7); + m_allow_special[test_monster_name("Fang, Farmer Maggot's dog")] = TRUE; + m_idx = place_monster_one(y, x, test_monster_name("Fang, Farmer Maggot's dog"), 0, FALSE, MSTATUS_ENEMY); + if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST; + m_allow_special[test_monster_name("Fang, Farmer Maggot's dog")] = FALSE; + + msg_print("You hear frenzied barking."); + } + + /* Generate maggot in town, in daylight */ + if ((bst(HOUR, turn) < 6) || (bst(HOUR, turn) >= 18) || (cquest.status > QUEST_STATUS_COMPLETED) || (small) || (p_ptr->town_num != 1)) return (FALSE); + + /* Find a good position */ + while (tries) + { + /* Get a random spot */ + y = randint(20) + (cur_hgt / 2) - 10; + x = randint(20) + (cur_wid / 2) - 10; + + /* Is it a good spot ? */ + /* Not in player los, and avoid shop grids */ + if (!los(p_ptr->py, p_ptr->px, y, x) && cave_empty_bold(y, x) && + cave_plain_floor_bold(y, x)) break; + + /* One less try */ + tries--; + } + + /* Place Farmer Maggot */ + m_allow_special[test_monster_name("Farmer Maggot")] = TRUE; + place_monster_one(y, x, test_monster_name("Farmer Maggot"), 0, FALSE, MSTATUS_ENEMY); + m_allow_special[test_monster_name("Farmer Maggot")] = FALSE; + + return FALSE; +} + +static bool_ quest_shroom_death_hook(const char *fmt) +{ + s32b r_idx, m_idx; + + m_idx = get_next_arg(fmt); + r_idx = m_list[m_idx].r_idx; + + if (cquest.status > QUEST_STATUS_COMPLETED) return FALSE; + + if ((r_idx == test_monster_name("Wolf, Farmer Maggot's dog")) || + (r_idx == test_monster_name("Grip, Farmer Maggot's dog")) || + (r_idx == test_monster_name("Fang, Farmer Maggot's dog"))) + { + msg_print("The dog yells a last time and drops dead on the grass."); + } + + return FALSE; +} + +static bool_ quest_shroom_give_hook(const char *fmt) +{ + object_type *o_ptr; + monster_type *m_ptr; + s32b m_idx, item; + + m_idx = get_next_arg(fmt); + item = get_next_arg(fmt); + + o_ptr = &p_ptr->inventory[item]; + m_ptr = &m_list[m_idx]; + + if (m_ptr->r_idx != test_monster_name("Farmer Maggot")) return (FALSE); + + /* 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(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; + } + + if ((o_ptr->tval != TV_FOOD) || (o_ptr->pval2 != 1)) return (FALSE); + + /* Take a mushroom */ + inc_stack_size_ex(item, -1, OPTIMIZE, NO_DESCRIBE); + cquest.data[0]++; + + if (cquest.data[0] == cquest.data[1]) + { + object_type forge, *q_ptr; + + msg_print("Oh thank you!"); + msg_print("Take my sling and those mushrooms, may they help you!"); + msg_print("Farmer Maggot heads back to his house."); + + /* Mushrooms */ + q_ptr = &forge; + object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_CURE_SERIOUS)); + q_ptr->found = OBJ_FOUND_REWARD; + q_ptr->number = rand_range(15, 20); + object_aware(q_ptr); + object_known(q_ptr); + q_ptr->discount = 100; + q_ptr->ident |= IDENT_STOREB; + if (inven_carry_okay(q_ptr)) + inven_carry(q_ptr, FALSE); + else + drop_near(q_ptr, 0, p_ptr->py, p_ptr->px); + + /* The sling of farmer maggot */ + q_ptr = &forge; + object_prep(q_ptr, lookup_kind(TV_BOW, SV_SLING)); + q_ptr->found = OBJ_FOUND_REWARD; + q_ptr->number = 1; + q_ptr->name1 = 149; + apply_magic(q_ptr, -1, TRUE, TRUE, TRUE); + object_aware(q_ptr); + object_known(q_ptr); + q_ptr->discount = 100; + q_ptr->ident |= IDENT_STOREB; + (void)inven_carry(q_ptr, FALSE); + + delete_monster_idx(m_idx); + + cquest.status = QUEST_STATUS_FINISHED; + + del_hook(HOOK_GIVE, quest_shroom_give_hook); + process_hooks_restart = TRUE; + } + else + msg_format("Oh thank you, but you still have %d mushrooms to bring back!", cquest.data[1] - cquest.data[0]); + + return TRUE; +} + +static bool_ quest_shroom_speak_hook(const char *fmt) +{ + s32b m_idx = get_next_arg(fmt); + + 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); + 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(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]); + } + return (TRUE); +} + +static bool_ quest_shroom_chat_hook(const char *fmt) +{ + monster_type *m_ptr; + s32b m_idx; + + m_idx = get_next_arg(fmt); + + m_ptr = &m_list[m_idx]; + + if (m_ptr->r_idx != test_monster_name("Farmer Maggot")) return (FALSE); + + if (cquest.status == QUEST_STATUS_UNTAKEN) + { + msg_print("My mushrooms, my mushrooms!"); + msg_print("The rain, a dark horrible rain, began so I had to return to my home."); + msg_print("But when I came back my dogs were all mad and didn't let me near the field."); + msg_print("Could you please bring me back all the mushrooms that have grown in my field"); + msg_print("to the west of Bree? Please try to not harm my dogs. They are so lovely..."); + + cquest.status = QUEST_STATUS_TAKEN; + quest[QUEST_SHROOM].init(QUEST_SHROOM); + } + 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(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]); + } + + return TRUE; +} + +bool_ quest_shroom_init_hook(int q_idx) +{ + /* Get a number of 'shrooms */ + if (!cquest.data[1]) + { + cquest.data[0] = 0; + cquest.data[1] = rand_range(7, 14); + if (wizard) + { + message_add(format("Shrooms number %d", cquest.data[1]), TERM_BLUE); + } + } + + 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"); + } + 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"); + } + return (FALSE); +} |