From 235709d0d10c632bef619df6f8d6ea27f5c190ac Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Mon, 26 Sep 2011 22:07:59 -0700 Subject: Halloween 2011 Trick-or-Treating --- world/map/npc/halloween/2011/trick_or_treat.txt | 223 ++++++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 world/map/npc/halloween/2011/trick_or_treat.txt (limited to 'world/map/npc/halloween/2011/trick_or_treat.txt') diff --git a/world/map/npc/halloween/2011/trick_or_treat.txt b/world/map/npc/halloween/2011/trick_or_treat.txt new file mode 100644 index 00000000..3f3aa890 --- /dev/null +++ b/world/map/npc/halloween/2011/trick_or_treat.txt @@ -0,0 +1,223 @@ +// Halloween 2011 +// Authors: alastrim, enchilado, o11c +// This is a function that implements the whole quest (or at least stage 1) +// Note: this function doesn't usually return + +// In the appropriate NPCs, do something like: +//+ set @hw2011_npc_id, $@hw2011_npc_vincent; +//+ if (gettime(7) == $@hw2011_year && gettime(6) == 10 && gettime(5) >= $@hw2011_start_day) +//+ callfunc "TrickOrTreat2011"; + +// Variables: +// $@hw2011_maskmemory = Sliced Array containing the record of the last masks used to trick or treat each NPC. +// @hw2011_npc_id = NPC id, this variable is set when calling this function by an NPC +// hw2011 = Permanent variable used to control your progress in the quest. +// The high bits are used to keep track of the NPCs you already tricked while showing your face. +// The low bits are used to keep track of how many times you've gotten treats. +// Currently, the vague plan is 16 for each, but we may need to use this variable for the second part of the quest. + +function|script|TrickOrTreat2011|{ + if (BaseLevel < $@hw2011_min_level) + goto L_QuickReturn; + menu + "Trick or Treat", -, + "[Go to normal NPC dialog]", L_QuickReturn; + + set @mask, getequipid(equip_head); + if (@mask == 647) + menu + "Reset my quest state", L_ResetMe, + "Reset this NPC's mask memory", L_ResetMask, + "Just do the quest", -; +L_Begin: + // must be early to handle all the one-off mes;s in the init stuff + mes $@hw2011_npc_names$[@hw2011_npc_id]; + + if (@mask == -1) + goto L_NoMask; + + // set the scare factor of the equipped mask + set @mask_index, 0; + set @scare_factor, 1; +L_MaskLoop: + if ($@hw2011_mask_IDs[@mask_index] == @mask) + goto L_FoundMask; + set @mask_index, @mask_index + 1; + if ($@hw2011_mask_IDs[@mask_index]) + goto L_MaskLoop; + // not a mask in the list + set @mask, 0; + goto L_MaskDone; + +L_FoundMask: + set @scare_factor, $@hw2011_scare_factors[@mask_index]; + if (@mask != 616) + goto L_MaskDone; + mes "\"Aaargh... Gross! This is sick! I can't even look at your face...\""; + // I would have done this instead of having the dialog explain + //set @mask, 0; +L_MaskDone: + set @mask_index, 0; + + // check if the mask is in the memory + set @loop, 0; + // Note: we don't handle remembered faces until they get their candy + if (!@mask) + goto L_MaskMemoryNo; + // check if the mask is remembered +L_MaskMemoryCheck: + set @tmp, $@hw2011_maskmemory[8 * @hw2011_npc_id + @loop]; + if (!@tmp) + goto L_MaskMemoryNo; + if (@tmp == @mask) + goto L_MaskMemoryYes; + set @loop, @loop + 1; + if (@loop != $@hw2011_memory_count) + goto L_MaskMemoryCheck; + goto L_MaskMemoryNo; + +L_MaskMemoryYes: + // not necessarily true + mes "\"I remember you, " + getequipname(equip_head) + " person. No more treats for you!\""; + goto L_Close; + +L_MaskMemoryNo: + // player will probably get treats + set @loop, 0; + set @sweets_types, 0; +L_Count_Sweets: + if (!$@hw2011_sweets$[@loop]) + goto L_Check_Inventory; + if (countitem($@hw2011_sweets$[@loop])) + set @sweets_types, @sweets_types + 1; + set @loop, @loop + 1; + goto L_Count_Sweets; + +L_Check_Inventory: + getinventorylist; + if (@inventorylist_count + (@loop - @hw2011_invy) > 100) + goto L_Full_Inventory; + + if (@mask) + goto L_Check_Karma; + // check if the player's face is remembered + if (hw2011 & (0x1 << (31 - @hw2011_npc_id))) + goto L_Remember_Face; + goto L_Tricking_Trick_or_Treat; + +L_Check_Karma: + // Please don't change this, you'll break stuff. + if (rand($@hw2011_num_npcs, 0xffff) <= (hw2011 & 0xffff)) + goto L_Cheater; + goto L_Tricking_Trick_or_Treat; + +L_Cheater: + mes "I recognize you despite your mask, you have been taking sweets you do not deserve."; + goto L_Close; + +L_Remember_Face: + // mes "You've been here before; I remember your face"; + mes "\"I remember your face, " + strcharinfo(0) + ". No more treats for you!\""; + goto L_Close; + + +L_Tricking_Trick_or_Treat: + // moved above +// mes $@hw2011_npc_names$[@hw2011_npc_id]; + mes $@hw2011_greetings$[@hw2011_npc_id]; + next; + // TODO: should we randomize these? (in a subsequent commit) + menu + $@hw2011_trick_notscary$[@hw2011_npc_id], L_Tricking_Notscary, + $@hw2011_trick_scary$[@hw2011_npc_id], L_Tricking_Scary, + $@hw2011_trick_veryscary$[@hw2011_npc_id], L_Tricking_Veryscary; + +L_Tricking_Notscary: + mes $@hw2011_npc_names$[@hw2011_npc_id]; + mes $@hw2011_react_notscary$[@hw2011_npc_id]; + goto L_Tricking_Reward; + +L_Tricking_Scary: + mes $@hw2011_npc_names$[@hw2011_npc_id]; + mes $@hw2011_react_scary$[@hw2011_npc_id]; + set @scare_factor, @scare_factor * 2; + goto L_Tricking_Reward; + +L_Tricking_Veryscary: + mes $@hw2011_npc_names$[@hw2011_npc_id]; + mes $@hw2011_react_veryscary$[@hw2011_npc_id]; + set @scare_factor, @scare_factor * 3; + goto L_Tricking_Reward; + +L_Tricking_Reward: + if (!@scare_factor) + goto L_Tricking_End; + // NOTE: it gives out one piece at a time, but can loop several times + getitem $@hw2011_sweets$[rand(21)], 1; + + set @scare_factor, @scare_factor - 1; + goto L_Tricking_Reward; +L_SetRememberFace: + set hw2011, hw2011 | (0x1 << (31 - @hw2011_npc_id)); + goto L_Close; + +L_Tricking_End: + mes $@hw2011_npc_names$[@hw2011_npc_id]; + mes "\"That should be enough sweets for you. Thanks for participating!\""; + if (!@mask) + goto L_SetRememberFace; + + // add the player's mask to the list + set @loop, 7; +L_SetRememberMask: + set $@hw2011_maskmemory[8 * @hw2011_npc_id + @loop], $@hw2011_maskmemory[8 * @hw2011_npc_id + @loop - 1]; + set @loop, @loop - 1; + if (@loop) + goto L_SetRememberMask; + set $@hw2011_maskmemory[8 * @hw2011_npc_id], @mask; + set hw2011, hw2011 + 1; + goto L_Close; + +L_Full_Inventory: + mes $@hw2011_npc_names$[@hw2011_npc_id]; + mes "\"You are trying to collect candy but you have no space to carry all the kinds of stuff that I have to offer! Please, save room for more stuff and come back.\""; + goto L_Close; + +L_ScaryFace: + mes "\"Eeeeeeeeeeeeeeeeeeeeeeeeeeekkkkkkkkkkkkkkkkk!!!\""; + mes "\"Oh, that's your face ...\""; + next; + set @mask, 0; + set @scarefactor, 5; + goto L_MaskDone; + +L_NoMask: + // TODO: are there any other players to make fun of? + if (getcharid(3) == 2160466 || getcharid(3) == 2177906 || getcharid(3) == 2157647) + goto L_ScaryFace; + mes $@hw2011_npc_names$[@hw2011_npc_id]; + mes "\"Hey " + strcharinfo(0) + ", are you trying to scare me with your face? Interesting! hahaha...\""; + goto L_Close; + +L_Close: + set @tmp, 0; + set @mask, 0; + + set @loop, 0; + set @menu, 0; + set @hw2011_npc_id, 0; + close; + +L_QuickReturn: + set @hw2011_npc_id, 0; + return; + +L_ResetMe: + set hw2011, 0; + goto L_Close; + +L_ResetMask: + // the rest will be implicitly cleared + set $@hw2011_maskmemory[8 * @hw2011_npc_id], 0; + goto L_Close; +} -- cgit v1.2.3-70-g09d2