// 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|, { if ((gettimetick(2)-TUT_var < 5*7*86400) || (BaseLevel < 40)) //player must be created at least 5 weeks ago goto L_EndTooYoung; if (@eastertimepenalty == 0) goto L_WarmUp; // 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); misceffect FX_GETITEM, strcharinfo(0); // 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; misceffect FX_GETITEM, strcharinfo(0); 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; misceffect FX_GETITEM, strcharinfo(0); 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_WarmUp: set @eastertimepenalty, gettimetick(2); getitem "GreenApple", 1; misceffect FX_GETITEM, strcharinfo(0); message strcharinfo(0), "Hmmm eggs! Maybe you can find something nice there!"; 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; if (debug >= 2) end; 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) goto L_do_update_enable; if ($@wasEaster && !$@isEaster) goto L_do_update_disable; goto L_done_update; L_do_update_enable: callsub S_enableEggs; goto L_done_update; L_do_update_disable: callsub S_disableEggs; goto L_done_update; L_done_update: 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) goto L_Return; set $@peopleFoundEggs[$@EggID], 0; set $@eastereggPos, rand(getarraysize($@easteregg_posx)); npcwarp $@easteregg_posx[$@eastereggPos], $@easteregg_posy[$@eastereggPos], "#TestEgg" + $@EggID; L_Return: return; }