summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
m---------client-data0
-rw-r--r--world/map/db/item_db.txt6
-rw-r--r--world/map/npc/008-1/_import.txt1
-rw-r--r--world/map/npc/008-1/annualeaster.txt204
-rw-r--r--world/map/npc/011-1/oscar.txt2
5 files changed, 213 insertions, 0 deletions
diff --git a/client-data b/client-data
-Subproject e655116a364f646e849322c4fbc61fc77f30e4a
+Subproject 082602abeed3ac6d29e1eb549aa184d72e48832
diff --git a/world/map/db/item_db.txt b/world/map/db/item_db.txt
index 37feb868..8deda424 100644
--- a/world/map/db/item_db.txt
+++ b/world/map/db/item_db.txt
@@ -396,6 +396,12 @@
879, HeartOfIsis, Heart of Isis, 5, 70000, 35000, 40, , , , , 0, 2, 8, , 85, 0, {}, {bonus bMaxHPrate, 15; bonus bHPrecovRate, 65;}
880, LazuriteRobe, Lazurite Robe, 5, 92000, 52000, 30, , 7, , 60, 0, 2, 512, , 90, 0, {}, {set @bStat$, "Int";set @minbStatVal, 70;callfunc "RequireStat"; set @bStat$, "Vit";set @minbStatVal, 40;callfunc "RequireStat"; bonus bSpeedAddRate, -15; bonus bDef2Rate, -40; bonus bMdef, 60; bonus bVit, -1; bonus bInt, 7; bonus bLuk, -1; bonus bDex, -1; bonus bStr, -1;}
881, RaggedShorts, Ragged Shorts, 5, 60, 1, 7, , 0, , -2, 0, 2, 1, , 1, 0, {}, {}
+882, RedEggshellHat, Red Eggshell Hat, 5, 7000, 5000, 15, , 9, , 3, 0, 2, 256, , 1, 0, {}, {}
+883, BlueEggshellHat, Blue Eggshell Hat, 5, 7000, 5000, 15, , 9, , 3, 0, 2, 256, , 1, 0, {}, {}
+884, YellowEggshellHat, Yellow Eggshell Hat, 5, 7000, 5000, 15, , 9, , 3, 0, 2, 256, , 1, 0, {}, {}
+885, GreenEggshellHat, Green Eggshell Hat, 5, 7000, 5000, 15, , 9, , 3, 0, 2, 256, , 1, 0, {}, {}
+886, OrangeEggshellHat, Orange Eggshell Hat, 5, 7000, 5000, 15, , 9, , 3, 0, 2, 256, , 1, 0, {}, {}
+887, DarkEggshellHat, Dark Eggshell Hat, 5, 7000, 5000, 15, , 9, , 3, 0, 2, 256, , 1, 0, {}, {}
888, MagicGMTopHat, Magic GM Top Hat, 5, 4200, 1900, 30, , 60, , 20, 0, 2, 256, , 0, 0, {}, {set @minLvl, 60; callfunc "RestrictedItem"; bonus bMaxHP, 31000; bonus bFlee, -200; bonus bHPrecovRate, -400; bonus bCriticalDef, 250; bonus bMdef, 89;}
889, MurdererCrown, Murderer Crown, 5, 75000, 12000, 240, , 4, , 0, 0, 2, 256, , 0, 0, {}, {}
890, BeanieCopter, Beanie Copter, 5, 8000, 2000, 20, , 4, , 2, 0, 2, 256, , 0, 0, {}, {}
diff --git a/world/map/npc/008-1/_import.txt b/world/map/npc/008-1/_import.txt
index 419b018b..7361a1bf 100644
--- a/world/map/npc/008-1/_import.txt
+++ b/world/map/npc/008-1/_import.txt
@@ -8,3 +8,4 @@ npc: npc/008-1/diryn.txt
npc: npc/008-1/dock.txt
npc: npc/008-1/george.txt
npc: npc/008-1/hinnak.txt
+npc: npc/008-1/annualeaster.txt
diff --git a/world/map/npc/008-1/annualeaster.txt b/world/map/npc/008-1/annualeaster.txt
new file mode 100644
index 00000000..c857326c
--- /dev/null
+++ b/world/map/npc/008-1/annualeaster.txt
@@ -0,0 +1,204 @@
+// Annual easter event.
+
+// Annual_Quest byte 1 is used, see Oscar.txt for further information.
+
+// Author: PjotrOrial
+
+// read up on http://en.wikipedia.org/wiki/Computus
+// Easter cannot be before march 22 or after april 25, so activate
+// the event in these days.
+
+
+function|script|AnnualEasterEvent|{
+
+ // prevent players having level 19 or less to get anything:
+ if (BaseLevel < 20)
+ goto L_EndTooYoung;
+
+ // prevent clicking multiple times:
+ if (gettimetick(2) < @eastertimepenalty + $@EASTER_FOUND_WAIT_TIME)
+ goto L_End2;
+ set @eastertimepenalty, gettimetick(2);
+
+ // global counter to determine reshuffle times of the eggs.
+ set $@peopleFoundEggs[@EasterEggID], $@peopleFoundEggs[@EasterEggID]+1;
+
+ set @AnnualEasterTries, @AnnualEasterTries + 1;
+
+ // give a small reward:
+ message strcharinfo(0), "You found something!";
+ set @tmp, getarraysize($@SmallAnnualEasterItems$);
+ set @random, rand(@tmp + 2);
+ if (@random < @tmp) getitem $@SmallAnnualEasterItems$[@random], rand(1, 2);
+ if (@random == @tmp) getexp rand(200), 0;
+ if (@random == @tmp + 1) set Zeny, Zeny + rand(50);
+
+ // give out a better reward occasionally:
+ // standard case is branch taken, so only if rand yields 0, medium rewarding.
+ if (rand($@EASTER_EGG_INV_CHANCE))
+ goto NoEasterEgg;
+
+ set @random, rand(getarraysize($@MediumAnnualEasterRewards$));
+ getitem $@MediumAnnualEasterRewards$[@random], 1;
+
+NoEasterEgg:
+
+ // If you're lucky you get a bigger unique reward per year:
+ // so only pass on a small chance iff you don't have the item yet.
+ // Usually the journey ends here because @random != 0 -> end
+ callsub S_Read_Annual_Quest;
+
+ if (@AnnualEasterTries > $@EASTER_FINAL_REW_INV_CHANCE)
+ set @AnnualEasterTries, $@EASTER_FINAL_REW_INV_CHANCE;
+ set @random, rand($@EASTER_FINAL_REW_INV_CHANCE - @AnnualEasterTries + 1);
+ if (@random || @easter_year > gettime(7) - 2000)
+ goto L_End1;
+
+ // block for further items this year:
+ set @easter_year, gettime(7) - 2000 + 1;
+ callsub S_Update_Annual_Quest;
+
+ // Hand out pretty unique rewards depending on the current year:
+ // We'll be handing out 2 different items each year, whereas one of them
+ // will be very common (95 %) and the other rare (5 %) for the players.
+ // The rare item will become the common item next year.
+ set @rewardindex, gettime(7) - 2012;
+ if (rand(100) < 5)
+ set @rewardindex, @rewardindex + 1;
+
+
+ // now hand out the specific item:
+ set @rewardindex, @rewardindex % getarraysize($@FinalAnnualEasterReward$);
+ getitem $@FinalAnnualEasterReward$[@rewardindex], 1;
+ message strcharinfo(0), "This is really special. You won't find anything like this again.";
+ goto L_End1;
+
+S_Read_Annual_Quest:
+ set @easter_year, (Annual_Quest & BYTE_1_MASK) >> BYTE_1_SHIFT;
+ return;
+
+S_Update_Annual_Quest:
+ set Annual_Quest, (Annual_Quest & ~(BYTE_1_MASK) | (@easter_year << BYTE_1_SHIFT));
+ return;
+
+L_EndTooYoung:
+ message strcharinfo(0), "The nest is empty.";
+ goto L_End1;
+
+L_End2:
+ message strcharinfo(0), "Don't be greedy! You just found something a moment ago.";
+ set @eastertimepenalty, @eastertimepenalty + 5;
+ if (@eastertimepenalty > gettimetick(2))
+ set @eastertimepenalty, gettimetick(2);
+L_End1:
+ set @rewardindex, 0;
+ set @easter_year, 0;
+ set @random, 0;
+ set @tmp, 0;
+ set @EasterEggID, 0;
+ return;
+}
+
+008-1.gat,65,40,0|script|#TestEgg0|375,{
+ set @EasterEggID, 0;
+ callfunc("AnnualEasterEvent");
+}
+
+008-1.gat,65,40,0|script|#TestEgg1|375,{
+ set @EasterEggID, 1;
+ callfunc("AnnualEasterEvent");
+}
+
+008-1.gat,65,40,0|script|#TestEgg2|375,{
+ set @EasterEggID, 2;
+ callfunc("AnnualEasterEvent");
+}
+
+
+008-1.gat,59,38,0|script|#AnnualEaster|-1,{
+ end;
+
+onInit:
+ set $@EASTER_FOUND_WAIT_TIME, 15;
+ set $@EASTER_FINAL_REW_INV_CHANCE, 70;
+ set $@EASTER_EGG_INV_CHANCE, 750;
+
+ setarray $@easteregg_posx, 41, 45, 50, 57, 60, 64, 67, 65, 59, 72, 70, 82, 81, 93, 97, 101, 88, 108, 115, 122, 122, 129, 129, 130, 135, 123, 132, 132, 127, 124, 121, 107, 100, 101, 109, 104, 88, 84, 92, 59, 71, 65, 53, 55, 74, 59, 53, 46, 44, 44, 38, 43, 40, 43, 37;
+ setarray $@easteregg_posy, 87, 89, 88, 93, 98, 90, 96, 82, 81, 82, 96, 98, 92, 89, 89, 81, 82, 94, 96, 96, 90, 86, 72, 65, 60, 46, 25, 21, 20, 22, 20, 34, 24, 41, 43, 42, 48, 28, 27, 17, 23, 29, 25, 20, 39, 41, 34, 36, 18, 25, 31, 39, 64, 69, 73;
+
+ if (getarraysize($@easteregg_posy) != getarraysize($@easteregg_posx))
+ goto L_FAULTY_SETUP;
+
+ setarray $@SmallAnnualEasterItems$, "AppleCake", "CactusDrink", "CactusPotion", "Cake", "Candy", "CherryCake", "ChocolateBar", "ChocolateCake", "GreenApple", "Orange", "OrangeCake", "OrangeCupcake", "RedApple", "WhiteCake";
+
+ setarray $@MediumAnnualEasterRewards$, "RedEasterEgg", "GreenEasterEgg", "BlueEasterEgg", "YellowEasterEgg", "PinkEasterEgg", "TealEasterEgg";
+
+ // DO NOT CHANGE SIZE AFTER EASTER 2013!
+ setarray $@FinalAnnualEasterReward$, "RedEggshellHat", "BlueEggshellHat", "YellowEggshellHat", "GreenEggshellHat", "OrangeEggshellHat", "DarkEggshellHat";
+
+ callsub S_disableEggs;
+ initnpctimer;
+ end;
+
+L_FAULTY_SETUP:
+ gmcommand "@mapexit";
+ end;
+
+OnTimer1000:
+ setnpctimer 0;
+
+ // an egg can be 'found' multiple times, make this number of possible findings
+ // depend on the number of players currently on the map.
+ set $@AEASTER_mapcount, 1 + getmapusers("008-1.gat") / 3;
+
+ set $@isEaster, 0;
+ if ((gettime(6) == 3 && gettime(5) > 22) || (gettime(6) == 4 && gettime(5) < 25) || debug)
+ set $@isEaster, 1;
+
+ if (!$@wasEaster && $@isEaster)
+ callsub S_enableEggs;
+ if ($@wasEaster && !$@isEaster)
+ callsub S_disableEggs;
+
+ set $@wasEaster, $@isEaster;
+
+ if (!$@isEaster)
+ goto L_End;
+
+ set $@EggID, 0;
+ callsub S_relocateEasterEgg;
+ set $@EggID, 1;
+ callsub S_relocateEasterEgg;
+ set $@EggID, 2;
+ callsub S_relocateEasterEgg;
+ // intentional fallthrough to L_End
+
+L_End:
+ set $@AEASTER_mapcount, 0;
+ set $@EggID, 0;
+ set $@isEaster, 0;
+ end;
+
+S_enableEggs:
+ enablenpc "#TestEgg0";
+ enablenpc "#TestEgg1";
+ enablenpc "#TestEgg2";
+ return;
+
+S_disableEggs:
+ disablenpc "#TestEgg0";
+ disablenpc "#TestEgg1";
+ disablenpc "#TestEgg2";
+ return;
+
+S_relocateEasterEgg:
+ if ($@peopleFoundEggs[$@EggID] < $@AEASTER_mapcount)
+ return;
+
+ set $@peopleFoundEggs[$@EggID], 0;
+
+ set $@eastereggPos, rand(getarraysize($@easteregg_posx));
+ npcwarp $@easteregg_posx[$@eastereggPos], $@easteregg_posy[$@eastereggPos], "#TestEgg" + $@EggID;
+ return;
+
+}
diff --git a/world/map/npc/011-1/oscar.txt b/world/map/npc/011-1/oscar.txt
index 53a79f70..d85bd67b 100644
--- a/world/map/npc/011-1/oscar.txt
+++ b/world/map/npc/011-1/oscar.txt
@@ -13,6 +13,8 @@
// 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