summaryrefslogtreecommitdiff
path: root/npc/011-1/oscar.txt
diff options
context:
space:
mode:
Diffstat (limited to 'npc/011-1/oscar.txt')
-rwxr-xr-xnpc/011-1/oscar.txt486
1 files changed, 486 insertions, 0 deletions
diff --git a/npc/011-1/oscar.txt b/npc/011-1/oscar.txt
new file mode 100755
index 00000000..133ebcaf
--- /dev/null
+++ b/npc/011-1/oscar.txt
@@ -0,0 +1,486 @@
+
+
+
+
+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 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$ + "!";
+ $@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);
+ 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 (ispcdead())
+ 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$)))
+ 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 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";
+ $@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;
+}