function script TrickOrTreat {
callfunc "HalloweenCheckOld";
if ($@halloween_time)
goto L_Halloween;
goto L_QuickReturn;
L_Halloween:
if ((gettimetick(2)-TUT_var < $@halloween_min_age) || (BaseLevel < $@halloween_min_level)) //player must be created at least 1 weeks ago
goto L_QuickReturn;
menu
"Trick or Treat", L_HWQuest,
"[Go to normal NPC dialog]", L_QuickReturn;
L_HWQuest:
@Mask = getequipid(equip_head);
goto L_Begin;
L_Begin:
@karma = (HALLOWEENTIME & 65535);
if (@Mask > 0)
goto L_WearingMask;
goto L_NoMask;
L_WearingMask:
// set the scare factor of the equipped mask
@Mask_index = 0;
@scare_factor = 1;
goto L_MaskLoop;
L_MaskLoop:
if ($@halloween_mask_IDs[@Mask_index] == @Mask)
goto L_FoundMask;
@Mask_index = @Mask_index + 1;
if ($@halloween_mask_IDs[@Mask_index])
goto L_MaskLoop;
// not a mask in the list
@Mask = 0;
goto L_MaskDone;
L_FoundMask:
@scare_factor = $@halloween_scare_factors[@Mask_index];
if (@Mask != 616)
goto L_MaskDone;
mes "\"Aaargh... Gross! This is sick! I can't even look at your face...\"";
goto L_MaskDone;
L_MaskDone:
@Mask_index = 0;
// check if the mask is in the memory
@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
goto L_MaskMemoryCheck;
L_MaskMemoryCheck:
@tmp = $@halloween_maskmemory[8 * @halloween_npc_id + @loop];
if (!@tmp)
goto L_MaskMemoryNo;
if (@tmp == @Mask)
goto L_MaskMemoryYes;
@loop = @loop + 1;
if (@loop != $@halloween_memory_count)
goto L_MaskMemoryCheck;
goto L_MaskMemoryNo;
L_MaskMemoryYes:
// not necessarily true
mes "\"I remember you, " + getitemlink(getequipid(equip_head)) + " person. No more treats for you!\"";
goto L_close;
L_MaskMemoryNo:
// player will probably get treats
@loop = 0;
@sweets_types = 0;
goto L_Count_Sweets;
L_Count_Sweets:
if ($@halloween_sweets[@loop] == 0)
goto L_Check_Inventory;
if (countitem($@halloween_sweets[@loop]))
@sweets_types = @sweets_types + 1;
@loop = @loop + 1;
goto L_Count_Sweets;
L_Check_Inventory:
getinventorylist;
if (@inventorylist_count + (@loop - @halloween_invy) > 100)
goto L_Full_Inventory;
if (@Mask)
goto L_Check_Karma;
// check if the player's face is remembered
if (HALLOWEENTIME & (1 << (31 - @halloween_npc_id)))
goto L_Remember_Face;
goto L_Tricking_Trick_or_Treat;
L_Check_Karma:
// NPC Cheater detection starts after max NPCs hit
if (rand($@halloween_num_npcs, 65535) <= @karma)
goto L_Cheater;
// NPC Cheater detection engages at 48 Trick or Treats
if (@karma >= 48)
goto L_Cheater;
if (HALLOWEENTIME & $@halloween_got_big_reward)
goto L_Tricking_Trick_or_Treat;
// assert: @karma < $@halloween_num_npcs
if (rand($@halloween_num_npcs - @karma))
goto L_Tricking_Trick_or_Treat;
mes "\"All this candy isn't healthy, here take this to have a break from it.\"";
getitem $@halloween_big_reward[rand(getarraysize($@halloween_big_reward))], 1;
HALLOWEENTIME = HALLOWEENTIME | $@halloween_got_big_reward;
// you get the big reward first, then the main treats
// otherwise it would be too complicated, and/or possibly unfair
goto L_Tricking_Trick_or_Treat;
L_Cheater:
mes "\"I recognize you despite your mask, you have been taking sweets you do not deserve.\"";
if (@karma != 65535)
HALLOWEENTIME = HALLOWEENTIME + 1;
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 $@halloween_npc_names$[@halloween_npc_id];
mes $@halloween_greetings$[@halloween_npc_id];
next;
// TODO: should we randomize these? (in a subsequent commit)
menu
$@halloween_trick_notscary$[@halloween_npc_id], L_Tricking_Notscary,
$@halloween_trick_scary$[@halloween_npc_id], L_Tricking_Scary,
$@halloween_trick_veryscary$[@halloween_npc_id], L_Tricking_Veryscary;
L_Tricking_Notscary:
mes $@halloween_npc_names$[@halloween_npc_id];
mes $@halloween_react_notscary$[@halloween_npc_id];
goto L_Tricking_Reward;
L_Tricking_Scary:
mes $@halloween_npc_names$[@halloween_npc_id];
mes $@halloween_react_scary$[@halloween_npc_id];
@scare_factor = @scare_factor * 2;
goto L_Tricking_Reward;
L_Tricking_Veryscary:
mes $@halloween_npc_names$[@halloween_npc_id];
mes $@halloween_react_veryscary$[@halloween_npc_id];
@scare_factor = @scare_factor * 3;
goto L_Tricking_Reward;
L_Tricking_Reward:
next;
if (@karma >= 16)
@scare_factor = rand(@scare_factor / 2, @scare_factor);
if (@karma >= 24)
@scare_factor = rand(@scare_factor / 3, @scare_factor);
if (@scare_factor < 1)
@scare_factor = 1;
goto L_Tricking_Reward_Loop;
L_Tricking_Reward_Loop:
@random = rand($@halloween_sweets_num);
setarray @getitem_ids, $@halloween_sweets[@random];
setarray @getitem_counts, 1;
callfunc "CheckInventory";
if (@check_fail)
@scare_factor = 0;
if (!@scare_factor)
goto L_Tricking_End;
// NOTE: it gives out one piece at a time, but can loop several times
getitem $@halloween_sweets[@random], 1;
@scare_factor = @scare_factor - 1;
goto L_Tricking_Reward_Loop;
L_SetRememberFace:
HALLOWEENTIME = HALLOWEENTIME | (1 << (31 - @halloween_npc_id));
goto L_close;
L_Tricking_End:
mes $@halloween_npc_names$[@halloween_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
@loop = 7;
goto L_SetRememberMask;
L_SetRememberMask:
$@halloween_maskmemory[8 * @halloween_npc_id + @loop] = $@halloween_maskmemory[8 * @halloween_npc_id + @loop - 1];
@loop = @loop - 1;
if (@loop)
goto L_SetRememberMask;
$@halloween_maskmemory[8 * @halloween_npc_id] = @Mask;
HALLOWEENTIME = HALLOWEENTIME + 1;
goto L_close;
L_Full_Inventory:
mes $@halloween_npc_names$[@halloween_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_NoMask:
mes $@halloween_npc_names$[@halloween_npc_id];
mes "\"Hey " + strcharinfo(0) + ", are you trying to scare me with your face? Interesting! hahaha...\"";
goto L_close;
L_close:
@tmp = 0;
@Mask = 0;
@karma = 0;
@loop = 0;
@menu = 0;
@halloween_npc_id = 0;
return;
L_QuickReturn:
@halloween_npc_id = 0;
return;
}
function script TrickOrTreatTally {
@npc_loop = 0;
@npc_tally = 0;
goto L_LoopCheck;
L_LoopCheck:
if (HALLOWEENTIME & (1 << (31 - @npc_loop)))
@npc_tally = (@npc_tally + 1);
goto L_IncLoop;
L_IncLoop:
@npc_loop = (@npc_loop + 1);
if (@npc_loop >= 15)
goto L_Return;
goto L_LoopCheck;
L_Return:
return;
}
function script HalloweenCheckOld {
if(HALLOWEENYEAR == $HALLOWEEN_TIME_KEY[5])
goto L_Return;
goto L_OldMatch;
L_OldMatch:
HALLOWEENTIME = 0;
HALLOWEENYEAR = $HALLOWEEN_TIME_KEY[5];
goto L_Return;
L_Return:
return;
}
function script HalloweenTree {
mes "[Confused Tree]";
if ((HALLOWEENTIME & 65535) > ($@halloween_num_npcs * 3))
mes "\"Whoa slow down greedy, leave some candy for the reset of us!\"";
if ((HALLOWEENTIME & 65535) > $@halloween_num_npcs)
mes "\"I see you have ben enjoying trick or treating, I hope you don't get a stomach ache.\"";
if ((HALLOWEENTIME & 65535) <= $@halloween_num_npcs)
mes "\"I love halloween, wearing masks and going trick or treating is so much fun.\"";
goto L_StartMenu;
L_StartMenu:
menu
"Whats Halloween?", L_Explain,
"Me too!", L_CheckDressed,
"Meh, I like Christmas Better.", L_XmasBetter;
L_Explain:
mes "\"I've convinced some people throughout the world to help with trick or treating.\"";
next;
@npc_check_loop = 0;
goto L_NpcCheckLoop;
L_NpcCheckLoop:
mes $@halloween_npc_names$[@npc_check_loop];
next;
goto L_NpcCheckInc;
L_NpcCheckInc:
@npc_check_loop = (@npc_check_loop + 1);
if (@npc_check_loop >= getarraysize($@halloween_npc_names$))
goto L_ContinueExplain;
goto L_NpcCheckLoop;
L_ContinueExplain:
mes "\"Find each person and put on a mask then try to scare them.\"";
next;
mes "\"The scarier you are, the more treats you will be awarded.\"";
next;
mes "\"If you are really scary you could get a rare reward.\"";
next;
goto L_StartMenu;
L_CheckDressed:
@head = getequipid(equip_head);
@chest = getequipid(equip_torso);
@leg = getequipid(equip_legs);
@random_mes$ = "\" I like your costume.\"";
if ((@head <= 0) && (@chest <= 0) && (@leg <= 0))
@random_mes$ = "\"Birthday Suit, always a classic.\"";
if ((@head == 615) && (@chest == 870))
@random_mes$ = "\"How embrassing... we are wearing the same costume.\"";
if ((@head == 617) || (@head == 622) || (@head == 621))
@random_mes$ = "\"Yar, matey I see that.\"";
if ((@head == 633) || (@head == 1205) || (@chest == 1183) || (@chest == 1184) || (@chest == 1185) || (@chest == 1186) || (@chest == 1187))
@random_mes$ = "\"Your sense of humor offends me, it's way to early for that.\"";
mes @random_mes$;
goto L_Return;
L_XmasBetter:
mes "\"Bah, Humbug, Show your Halloween spirit! OOooooOooo\"";
misceffect 302, strcharinfo(0);
goto L_Return;
L_Return:
return;
}