function script HalloweenQuestWaterPumpkins { if (Quest_Halloween != 5 || $@HalloweenQuest_PumpkinHunter$ != "") goto L_Return; $@HalloweenQuest_PumpkinHunter$ = strcharinfo(0); donpcevent "Oscar::OnCommandSpg"; goto L_Return; L_Return: return; } 011-1,94,38,0 script Oscar NPC142,{ // 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. @halloween_year = (Annual_Quest & BYTE_0_MASK) >> BYTE_0_SHIFT; if (@halloween_year < (gettime(7) - 2000)) goto L_AdjustYear; goto L_Init; L_AdjustYear: Quest_Halloween = 0; @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!\""; 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: @halloween_year = 0; close; L_CheckSeeds: if (countitem("PumpkinSeeds") < $@halloween_num_seeds) goto L_NotEnoughSeeds; delitem "PumpkinSeeds", $@halloween_num_seeds; 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) @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!\""; @nature_magic = getskilllv(SKILL_MAGIC_NATURE); if (@nature_magic > 1) goto L_ProposeUseKaflosh; @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; @inventorylist_count = 0; Quest_Halloween = 4; goto L_GetEmptyBottles; L_ProposeUseKaflosh: @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; 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!\""; Quest_Halloween = 5; $@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!\""; 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. @nature_magic = getskilllv(SKILL_MAGIC_NATURE); if (!(@nature_magic > 1)) goto L_HelpFillWaters; @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: Annual_Quest = (Annual_Quest & ~(BYTE_0_MASK) | (@halloween_year << BYTE_0_SHIFT)); return; OnCommandSpg: callsub S_StartPumpkinsSpawn; end; S_StartPumpkinsSpawn: $@HalloweenQuest_PumpkinsCount = $@halloween_num_pumpkins; $@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: $@halloween_num_seeds = 12; $@halloween_num_water_bottles = 15; $@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; $@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 "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 "Oh no, these pumpkins look strange and infested with bugs! Help me get rid of them " + $@HalloweenQuest_PumpkinHunter$ + "!"; $@HalloweenQuest_PumpkinsState = 1; setnpctimer 0; end; OnPD: if (strcharinfo(0) != $@HalloweenQuest_PumpkinHunter$) goto L_KillBadHunter; $@HalloweenQuest_PumpkinsCount = $@HalloweenQuest_PumpkinsCount - 1; if (@discover_poisonous_pumpkin_again == 0) message strcharinfo(0), "Oh no! These pumpkins are poisonous as well!"; @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 @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"; @halloween_rand = 0; end; OnPDP: end; L_KillBadHunter: misceffect FX_PUMPKIN_EXPLOSION, strcharinfo(0); die(); end; L_PumpkinsRuined: npctalk "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 (ispcdead()) goto L_PlayerDead; if (isin("011-1",20,5,130,110) == 0) goto L_PlayerLeft; detachrid; return; L_PlayerOff: npctalk "What? Where is " + $@HalloweenQuest_PumpkinHunter$ + "? Someone, help me!"; goto L_Fail; L_PlayerLeft: npctalk "What the!! " + $@HalloweenQuest_PumpkinHunter$ + " left me alone with all this! Someone, help me!"; goto L_Fail; L_PlayerDead: npctalk "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$))) 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; Quest_Halloween = 6; emotion EMOTE_GRIN; npctalk "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"; $@HalloweenQuest_PumpkinHunter$ = ""; $@HalloweenQuest_PumpkinsCount = 0; $@HalloweenQuest_PumpkinsState = 0; $@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; @inventorylist_count = 0; getitem "GoldenDeliciousApple", 1; @halloween_year = gettime(7) - 2000 + 1; 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; @inventorylist_count = 0; getitem "CandyPumpkin", 5; @halloween_year = gettime(7) - 2000 + 1; Quest_Halloween = 0; callsub S_Update_Annual_Quest; goto L_End; L_InventoryFull: @inventorylist_count = 0; next; mes "\"Ah, but you cannot carry anything else!"; mes "Make some room first.\""; goto L_End; }