//############################################################################
//# #
//# Halloween seasonal #
//# #
//############################################################################
// Annual_Quest variable:
// This variable contains 4 bytes that are used to check if a player
// completed or not an annual quest. The first byte will be used by this
// after-Halloween event.
// Each byte contains the value "year minus 2000" where year is the next year
// when the player can start over the annual quest.
// Be sure to not have a quest whose duration overlaps on two years,
// or this will cause problems.
// The second byte contains easter information, see annualeaster.txt for more information.
// Halloween quest states:
// 0: nothing started
// 1: the player knows the story and is asked to go find pumpkin seeds in the forest
// 2: the player gathered enough seeds
// 3: the player gave the pumpkin seeds and can now help the farmer to grow them
// the player can chose that the pumpkins patches will be watered by kaflosh (requires Nature Magic lvl 2), -> jumps to 5
// 4: the player is asked to go refill water bottles
// 5: various possible states here: the water bottles are refilled and the pumpkin spawns will start right away.
// the player will start by kafloshing ($@HalloweenQuest_PumpkinHunter$ == "")
// 5 + $@HalloweenQuest_PumpkinHunter$ != "":* the player watered the patches (by kaflosh, or the farmer did). Pumpkins spawn.
// 6: the player saved the farmer from the pumpkin invasion (all pumpkins / mobs killed)
// 10: the player failed to save the farmer from the pumpkin invasion (player left the map, died -- logging off is allowed however)
function|script|HalloweenQuestWaterPumpkins
{
if (Quest_Halloween != 5 || $@HalloweenQuest_PumpkinHunter$ != "")
goto L_Return;
set $@HalloweenQuest_PumpkinHunter$, strcharinfo(0);
donpcevent "Oscar::OnCommandSpg";
goto L_Return;
L_Return:
return;
}
011-1,94,38,0|script|Oscar|142
{
// Check we are at the good time of the year
if (!(gettime(6) == 11 && (gettime(5) >= 4 && gettime(5) <= 30))) goto L_NoEvent;
// Check halloween quest has been done or not.
set @halloween_year, (Annual_Quest & BYTE_0_MASK) >> BYTE_0_SHIFT;
if (@halloween_year < (gettime(7) - 2000)) goto L_AdjustYear;
goto L_Init;
L_AdjustYear:
set Quest_Halloween, 0;
set @halloween_year, gettime(7) - 2000;
callsub S_Update_Annual_Quest;
goto L_Init;
L_NoEvent:
mes "[Oscar]";
mes "\"Welcome here!";
mes "I'm the owner of this farm. I'm growing fruits around here as you can see.\"";
next;
mes "\"Some of my fruits are for sale in my shop right here.";
mes "Don't hesitate to drop by. They are cheap!\"";
close;
L_Init:
if (@halloween_year == (gettime(7) - 2000) + 1) goto L_QuestAlreadyDone;
if (Quest_Halloween == 0) goto L_Introduce;
if (Quest_Halloween == 1 || Quest_Halloween == 2) goto L_CheckSeeds;
if (Quest_Halloween == 3) goto L_HelpGrowSeeds;
if (Quest_Halloween == 4) goto L_HelpFillWaters;
if (Quest_Halloween == 5 && $@HalloweenQuest_PumpkinHunter$ == "") goto L_HelpWaterPatches;
if (Quest_Halloween == 5 && $@HalloweenQuest_PumpkinHunter$ == strcharinfo(0)) goto L_HelpCleanPumpkins;
if (Quest_Halloween == 5 && $@HalloweenQuest_PumpkinHunter$ != "") goto L_WateringBusy;
if (Quest_Halloween == 6) goto L_GetReward;
if (Quest_Halloween == 10) goto L_GetSlap;
goto L_End;
L_Introduce:
mes "[Oscar]";
mes "\"Heya!\"";
next;
mes "\"I just came back from a long trip... Really tiring, but so interesting.\"";
menu
"Oh? Where did you go?", L_Next,
"Well... I believe.", L_End;
L_Next:
mes "[Oscar]";
mes "\"Well, I travelled to the economic center of this continent.";
mes "It's north-east of here. Quite far I must say.\"";
next;
mes "\"But it was worth it really.";
mes "I went there to see ways to improve my little plantation here.";
mes "Oh well, sell some of my fruits too, see some of my fellow farmers. Classic business.\"";
next;
mes "\"Until a few days ago, they were holding a large party to celebrate Halloween.";
mes "Very nice really... And in particular, I saw these strange veggies they call pumpkins.\"";
next;
mes "\"They taste really good you see, but ahah, they weren't really for eating at that moment!";
mes "Anyway, I wondered if I could grow some here. Until now I only grow apples and oranges.\"";
menu
"That's an interesting idea!", L_Next1,
"Really, I hate pumpkins.", L_End;
L_Next1:
mes "[Oscar]";
mes "\"However, I couldn't get any seeds, but I heard rumors in that city, saying we could find pumpkins in the forests north-east of here.";
mes "Most likely there are pumpkin seeds laying around them.\"";
next;
mes "\"They also mentioned something strange about them, but hey, who cares! Just rumors!\"";
next;
if (BaseLevel < 45)
goto L_TooYoung;
mes "\"Do you think you can get some for me?\"";
menu
"Sure. Leave it to me!", L_Next2,
"Well, I don't have time for that right now.", L_End;
L_Next2:
mes "[Oscar]";
mes "\"Thanks so much " + strcharinfo(0) + "!";
mes "I can't wait to try them!\"";
set Quest_Halloween, 1;
goto L_End;
L_TooYoung:
mes "\"Ahm... That may be a little dangerous for you though. I don't want to send a kid in the deep forest.\"";
goto L_End;
L_End:
set @halloween_year, 0;
close;
L_CheckSeeds:
if (countitem("PumpkinSeeds") < $@halloween_num_seeds)
goto L_NotEnoughSeeds;
delitem "PumpkinSeeds", $@halloween_num_seeds;
set Quest_Halloween, 3;
mes "[Oscar]";
mes "\"Yes you found them! I can start to make them grow now!";
mes "Thank you so much " + strcharinfo(0) + "!\"";
goto L_End;
L_NotEnoughSeeds:
mes "[Oscar]";
mes "\"Oh, it looks like you didn't find enough seeds yet...\"";
goto L_End;
L_HelpGrowSeeds:
// Wait 20 seconds before triggering the next step.
if (@halloween_seeds_timer == 0)
set @halloween_seeds_timer, gettimetick(2);
if ((gettimetick(2) - @halloween_seeds_timer) < 5)
goto L_WaitGrowSeeds;
mes "[Oscar]";
mes "\"Oh, you are back!\"";
next;
mes "You notice Oscar looks quite disappointed.";
next;
mes "[Oscar]";
mes "\"You see I could use some more help from you.";
mes "My supplies of water are quite low because of the long trip I made.";
mes "And I've been watering the pumpkin patches, but unfortunately I'm already out of water before I can see anything growing.\"";
next;
mes "\"If you could help me fill these " + $@halloween_num_water_bottles + " bottles with water, that would be very kind of you!\"";
set @nature_magic, getskilllv(SKILL_MAGIC_NATURE);
if (@nature_magic > 1)
goto L_ProposeUseKaflosh;
set @nature_magic, 0;
menu
"Yeah sure!", L_Next3,
"That sounds boring to do. No thanks.", L_End;
L_Next3:
getinventorylist;
if (@inventorylist_count == 100 && countitem("EmptyBottle") == 0)
goto L_InventoryFull;
set @inventorylist_count, 0;
set Quest_Halloween, 4;
goto L_GetEmptyBottles;
L_ProposeUseKaflosh:
set @nature_magic, 0;
menu
"Yeah sure!", L_Next4,
"Maybe I can help you water them with magic!", L_WaterWithKaflosh,
"That sounds boring to do. No thanks.", L_End;
L_Next4:
getinventorylist;
if (@inventorylist_count == 100 && countitem("EmptyBottle") == 0)
goto L_InventoryFull;
set Quest_Halloween, 4;
goto L_GetEmptyBottles;
L_GetEmptyBottles:
mes "[Oscar]";
mes "\"Ok, here are the " + $@halloween_num_water_bottles + " empty bottles.\"";
next;
mes "\"Oh and while you fill these bottles, why not bring some friends here as well?";
mes "Let's not be reckless. Maybe these rumors about the pumpkins are true.";
mes "Oh, unless you consider yourself strong enough to take care of this alone!\"";
getitem "EmptyBottle", $@halloween_num_water_bottles;
goto L_End;
L_WaitGrowSeeds:
mes "[Oscar]";
mes "\"Thanks again " + strcharinfo(0) + "!";
mes "I'm planting these seeds right now.\"";
next;
mes "\"Stay around if you want to see what it looks like!";
mes "Amazing I tell you, amazing!\"";
goto L_End;
L_HelpFillWaters:
mes "[Oscar]";
mes "\"Hey, you again!\"";
next;
if ($@HalloweenQuest_PumpkinHunter$ != "")
goto L_WateringBusy;
mes "\"So do you have the " + $@halloween_num_water_bottles + " bottles filled with fresh water?\"";
menu
"Yes! Fresh and clear water.", L_Next5,
"Oh, not yet. I'm on my way.", L_End;
L_Next5:
if (countitem("BottleOfWater") < $@halloween_num_water_bottles)
goto L_NotEnoughWaters;
// make an additional check here, since the player had a dialog pause in the above menu.
if ($@HalloweenQuest_PumpkinHunter$ != "")
goto L_WateringBusy;
delitem "BottleOfWater", $@halloween_num_water_bottles;
mes "[Oscar]";
mes "\"Many thanks! I wonder what I would have done without you!";
mes "I'll water the patches right away. Watch this!\"";
set Quest_Halloween, 5;
set $@HalloweenQuest_PumpkinHunter$, strcharinfo(0);
callsub S_StartPumpkinsSpawn;
goto L_End;
L_WaterWithKaflosh:
getinventorylist;
if (@inventorylist_count == 100 && countitem("BottleOfWater") == 0)
goto L_InventoryFull;
mes "[Oscar]";
mes "\"Oh, I see!";
next;
mes "\"So, I'm waiting you show me your skills!";
mes "Water the pumpkin patches right here with your awesome magic!\"";
next;
mes "\"Here is one bottle of water to do it.\"";
next;
mes "\"By the way, I told you about the rumors concerning these pumpkins.";
mes "Why not bring some friends here? Oh, unless you consider yourself strong enough!\"";
set Quest_Halloween, 5;
getitem "BottleOfWater", 1;
goto L_End;
L_HelpWaterPatches:
// We check again here that the player has magic skills
// This case happens when the player has logged off
// during the infestation phase.
set @nature_magic, getskilllv(SKILL_MAGIC_NATURE);
if (!(@nature_magic > 1))
goto L_HelpFillWaters;
set @nature_magic, 0;
mes "[Oscar]";
mes "\"Come on, water the pumpkin patches right here with your awesome magic!";
mes "For sure you will be more efficient than me!\"";
goto L_End;
L_WateringBusy:
mes "[Oscar]";
mes "\"Sorry. I'm really busy at the moment.";
mes "May you come back later? Thank you, thank you...";
mes "Sorry I have to take care of this now!\"";
goto L_End;
L_HelpCleanPumpkins:
mes "[Oscar]";
mes "\"Help me clean all these pumpkins! It's a disaster!\"";
goto L_End;
L_NotEnoughWaters:
mes "[Oscar]";
mes "\"That's not enough bottles to water all these pumpkin patches.";
mes "Please bring me more.\"";
goto L_End;
S_Update_Annual_Quest:
set Annual_Quest, (Annual_Quest & ~(BYTE_0_MASK) | (@halloween_year << BYTE_0_SHIFT));
return;
OnCommandSpg:
callsub S_StartPumpkinsSpawn;
end;
S_StartPumpkinsSpawn:
set $@HalloweenQuest_PumpkinsCount, $@halloween_num_pumpkins;
set $@HalloweenQuest_PumpkinsState, 0;
initnpctimer;
return;
L_QuestAlreadyDone:
mes "[Oscar]";
mes "\"I'm relieved all this mess is sorted out now.";
mes "That was interesting, but really, fruits are more quiet!\"";
goto L_End;
OnInit:
set $@halloween_num_seeds, 12;
set $@halloween_num_water_bottles, 15;
set $@halloween_num_pumpkins, $@halloween_num_seeds * 4;
end;
OnTimer1000:
goto L_TimerFunction;
OnTimer2000:
goto L_TimerFunction;
OnTimer3000:
goto L_TimerFunction;
L_TimerFunction:
if ($@HalloweenQuest_PumpkinsState != 1)
end;
callsub S_CheckPlayer;
set $@HalloweenQuest_PumpkinsTimer, $@HalloweenQuest_PumpkinsTimer + 1;
if (mobcount("011-1", "Oscar::OnPD") < 0 &&
mobcount("011-1", "Oscar::OnPDP") < 0 &&
$@HalloweenQuest_PumpkinsCount <= 0)
goto L_AllPumpkinsDead;
// A quick "cheer up"
if ($@HalloweenQuest_PumpkinsTimer == 300)
npctalk strnpcinfo(0), "Hurry up " + $@HalloweenQuest_PumpkinHunter$ + "! My farm is being ruined!";
// 7 mins max
if ($@HalloweenQuest_PumpkinsTimer > 420)
goto L_PumpkinsRuined;
if (getnpctimer(0) >= 2900)
goto L_TrySpawnPumpkin;
end;
L_TrySpawnPumpkin:
if ($@HalloweenQuest_PumpkinsCount > 0)
areamonster "011-1", 97, 40, 101, 44, "", 1063, 1, "Oscar::OnPD";
setnpctimer 0;
end;
OnTimer2500:
if ($@HalloweenQuest_PumpkinsState != 0)
end;
areamonster "011-1", 97, 40, 101, 44, "", 1063, 2, "Oscar::OnPD";
end;
OnTimer6000:
if ($@HalloweenQuest_PumpkinsState != 0)
end;
emotion EMOTE_AFRAID;
npctalk strnpcinfo(0), "Oh no, these pumpkins look strange and infested with bugs! Help me get rid of them " + $@HalloweenQuest_PumpkinHunter$ + "!";
set $@HalloweenQuest_PumpkinsState, 1;
setnpctimer 0;
end;
OnPD:
if (strcharinfo(0) != $@HalloweenQuest_PumpkinHunter$)
goto L_KillBadHunter;
set $@HalloweenQuest_PumpkinsCount, $@HalloweenQuest_PumpkinsCount - 1;
if (@discover_poisonous_pumpkin_again == 0)
message strcharinfo(0), "Oh no! These pumpkins are poisonous as well!";
set @discover_poisonous_pumpkin_again, 1;
// Small damages
misceffect FX_PUMPKIN_EXPLOSION, strcharinfo(0);
heal -10, 0;
sc_start sc_poison, 1, 3;
// Spawn mobs or get items
set @halloween_rand, rand(0,100);
// Seeds reward
if (@halloween_rand < 10)
getitem "PumpkinSeeds", 1;
// Pumpkin helmet reward
if (@halloween_rand >= 10 && @halloween_rand < 17)
getitem "PumpkinHelmet", 1;
// huntsman spider x1
if (@halloween_rand < (15*BaseLevel)/100)
areamonster "011-1", 97, 40, 101, 44, "", 1083, 1, "Oscar::OnPDP";
// Or spider x1
if (@halloween_rand >= (15*BaseLevel)/100 && @halloween_rand < (75*BaseLevel)/100)
areamonster "011-1", 97, 40, 101, 44, "", 1012, 1, "Oscar::OnPDP";
// Or archant x2
if (@halloween_rand >= (75*BaseLevel)/100)
areamonster "011-1", 97, 40, 101, 44, "", 1060, 2, "Oscar::OnPDP";
set @halloween_rand, 0;
end;
OnPDP:
end;
L_KillBadHunter:
misceffect FX_PUMPKIN_EXPLOSION, strcharinfo(0);
heal -Hp, 0;
end;
L_PumpkinsRuined:
npctalk strnpcinfo(0), "No! " + $@HalloweenQuest_PumpkinHunter$ + " how could you let that happen? All my farm is a mess now! All my trees are infested with bugs!";
goto L_Fail;
L_AllPumpkinsDead:
goto L_Success;
S_CheckPlayer:
if (attachrid(getcharid(3, $@HalloweenQuest_PumpkinHunter$)) == 0)
goto L_PlayerOff;
if (isdead())
goto L_PlayerDead;
if (isin("011-1",20,5,130,110) == 0)
goto L_PlayerLeft;
detachrid;
return;
L_PlayerOff:
npctalk strnpcinfo(0), "What? Where is " + $@HalloweenQuest_PumpkinHunter$ + "? Someone, help me!";
goto L_Fail;
L_PlayerLeft:
npctalk strnpcinfo(0), "What the!! " + $@HalloweenQuest_PumpkinHunter$ + " left me alone with all this! Someone, help me!";
goto L_Fail;
L_PlayerDead:
npctalk strnpcinfo(0), "Oh no I can't believe it! " + $@HalloweenQuest_PumpkinHunter$ + " just died! Someone, help me!";
goto L_Fail;
L_Fail:
// If the player is logged off, since we check every second that the player
// is online, we can consider it's an accident, so we will allow to redo the quest
// Otherwise, it's a "valid" fail.
if (attachrid(getcharid(3, $@HalloweenQuest_PumpkinHunter$)))
set Quest_Halloween, 10;
goto L_Clean;
L_Success:
// Make this check again or the server will crash.
if (attachrid(getcharid(3, $@HalloweenQuest_PumpkinHunter$)) == 0)
goto L_PlayerOff;
set Quest_Halloween, 6;
emotion EMOTE_GRIN;
npctalk strnpcinfo(0), "Hurray, " + $@HalloweenQuest_PumpkinHunter$ + " you did it! Thank you thank you! Come here!";
goto L_Clean;
L_Clean:
killmonster "011-1", "Oscar::OnPD";
killmonster "011-1", "Oscar::OnPDP";
set $@HalloweenQuest_PumpkinHunter$, "";
set $@HalloweenQuest_PumpkinsCount, 0;
set $@HalloweenQuest_PumpkinsState, 0;
set $@HalloweenQuest_PumpkinsTimer, 0;
stopnpctimer;
detachrid;
end;
L_GetReward:
mes "[Oscar]";
mes "\"" + strcharinfo(0) + ", you were wonderful!";
mes "My farm is safe thanks to you!\"";
next;
mes "\"Look, when I went to this city a few days ago, I could find this magnificient fruit.";
mes "I believe not many exist in the world, but hey, this one is for you!\"";
getinventorylist;
if (@inventorylist_count == 100 && countitem("GoldenDeliciousApple") == 0)
goto L_InventoryFull;
set @inventorylist_count, 0;
getitem "GoldenDeliciousApple", 1;
set @halloween_year, gettime(7) - 2000 + 1;
set Quest_Halloween, 0;
callsub S_Update_Annual_Quest;
goto L_End;
L_GetSlap:
mes "[Oscar]";
mes "\"Ah! There you are "+strcharinfo(0)+"!";
next;
mes "\"As you can see, my farm is safe now.";
mes "I can't really say it's thanks to you though!\"";
next;
mes "\"Well, I won't be a bad guy.";
mes "Take this for your trouble and farewell!\"";
getinventorylist;
if (@inventorylist_count == 100 && countitem("CandyPumpkin") == 0)
goto L_InventoryFull;
set @inventorylist_count, 0;
getitem "CandyPumpkin", 5;
set @halloween_year, gettime(7) - 2000 + 1;
set Quest_Halloween, 0;
callsub S_Update_Annual_Quest;
goto L_End;
L_InventoryFull:
set @inventorylist_count, 0;
next;
mes "\"Ah, but you cannot carry anything else!";
mes "Make some room first.\"";
goto L_End;
}