008-1,0,0,0 script Easter Eggs NPC32767,{
if (strnpcinfo(2) == "") end;
if (get(.disabled, "Easter Eggs") || $@isEaster < 1) goto L_Destroy;
@npc_distance = 1;
callfunc "PCtoNPCRange";
if(@npc_check) end;
if ((gettimetick(2)-TUT_var < 5*7*86400) || (BaseLevel < 40)) //player must be created at least 5 weeks ago
goto L_EndTooYoung;
@easter_year = (Annual_Quest & BYTE_1_MASK) >> BYTE_1_SHIFT;
if (#EASTERTIMEPENALTY == 0)
goto L_WarmUp;
// prevent clicking multiple times:
if (gettimetick(2) < #EASTERTIMEPENALTY + get(.wait_time, "Easter Eggs"))
goto L_End2;
if (@easter_year > gettime(7) - 2000)
goto L_End3;
#EASTERTIMEPENALTY = gettimetick(2);
set .found, .found + 1; // this egg has been found X times
set @AnnualEasterTries, @AnnualEasterTries + 1; // you tried X times since login
message strcharinfo(0), "Eggs : You found something!";
.@size = get(.small_rewards, "Easter Eggs");
.@random = rand(.@size+2);
if (.@random < .@size)
getitem get(.small_rewards$[.@random], "Easter Eggs"), rand(1, 2);
elif (.@random == .@size)
getexp rand(200), 0;
else
Zeny = Zeny + rand(50);
if (rand(get(.chance, "Easter Eggs")))
goto L_NoEasterEgg;
.@random = rand(get(.medium_rewards$, "Easter Eggs"));
getitem get(.medium_rewards$[.@random], "Easter Eggs"), 1;
misceffect FX_GETITEM, strcharinfo(0);
goto L_NoEasterEgg;
L_NoEasterEgg:
.@fchance = get(.final_rew_chance, "Easter Eggs");
if (@AnnualEasterTries > .@fchance)
@AnnualEasterTries = .@fchance;
.@random = rand(.@fchance - @AnnualEasterTries + 1);
if (.@random || @easter_year > gettime(7) - 2000)
goto L_Reward_End;
// block for further items this year:
@easter_year = gettime(7) - 2000 + 1;
Annual_Quest = (Annual_Quest & ~(BYTE_1_MASK) | (@easter_year << BYTE_1_SHIFT));
// 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.
.@rewardindex = gettime(7) - 2012;
if (rand(100) < 5)
.@rewardindex = .@rewardindex + 1;
// now hand out the specific item:
.@rewardindex = .@rewardindex % get(.big_rewards, "Easter Eggs");
getitem get(.big_rewards$[.@rewardindex], "Easter Eggs"), 1;
misceffect FX_GETITEM, strcharinfo(0);
message strcharinfo(0), "Eggs : This is really special. You won't find anything like this again.";
goto L_Reward_End;
L_Reward_End:
if (.found >= get(.mapcount, "Easter Eggs"))
goto L_Destroy;
end;
L_Destroy:
set .eggs, get(.eggs, "Easter Eggs") - 1, "Easter Eggs"; // tell the puppeteer we lost an egg
destroy;
L_EndTooYoung:
message strcharinfo(0), "Eggs : The nest is empty.";
end;
L_WarmUp:
#EASTERTIMEPENALTY = gettimetick(2);
getitem "MoubooFigurine", 1;
misceffect FX_GETITEM, strcharinfo(0);
message strcharinfo(0), "Eggs : Hmmm eggs! Maybe you can find something nice there!";
end;
L_End3:
message strcharinfo(0), "Eggs : Don't be greedy! You already found something nice.";
end;
L_End2:
message strcharinfo(0), "Eggs : Don't be greedy! You just found something a moment ago.";
#EASTERTIMEPENALTY = #EASTERTIMEPENALTY + 5;
if (#EASTERTIMEPENALTY > gettimetick(2))
#EASTERTIMEPENALTY = gettimetick(2);
end;
OnTimer5000:
if (get(.disabled, "Easter Eggs") || $@isEaster < 1)
goto L_Destroy;
initnpctimer;
end;
OnSpawn:
.@e = rand(2,.loc[1]);
.@x = .loc[.@e];
.@y = .loc[(.@e-1)+.loc[1]];
set .eID, .eID + 1; // give the egg an id
.@name$ = "#--Ee"+chr(3)+.eID;
if (.eID == 2147483647)
set .eID, 0; // start over if id = 0x7FFFFFFF
if (puppet(strnpcinfo(3), .@x, .@y, .@name$, 375) < 1) goto L_RetrySpawn; // spawn the egg
initnpctimer .@name$; // init puppeteer check timer
end;
L_RetrySpawn:
addnpctimer 0, strnpcinfo(0) + "::OnSpawn"; // schedule a spawn
end;
S_Spawn:
if (.eggs >= .max_eggs)
goto S_Return;
.eggs = .eggs + 1;
addnpctimer 125 + rand(250), strnpcinfo(0) + "::OnSpawn"; // schedule a spawn
if (.eggs < .min_eggs)
goto S_Spawn;
return;
S_Return:
return;
OnHeartbeat:
if (.max_eggs < 1 || .disabled || $@isEaster < 1) end;
.mapcount = 1 + getmapusers(strnpcinfo(3)) / 3;
callsub S_Spawn;
addnpctimer 1000, strnpcinfo(0) + "::OnHeartbeat"; // heartbeat
end;
OnCheckEaster:
if ((gettime(6) == 3 && gettime(5) >= 22) || (gettime(6) == 4 && gettime(5) <= 25))
$@isEaster = 1;
else
$@isEaster = 0;
if ($@isEaster && .eggs < 1)
donpcevent "Easter Eggs::OnStart";
end;
OnStart:
if (.disabled || $@isEaster < 1) end;
set .min_eggs, 1; // min number of eggs
set .max_eggs, 3; // max number of eggs
set .eggs, 0; // virtual amount of eggs
set .eID, 0; // last egg id
.wait_time = 15;
.final_rew_chance = 70;
.chance = 750;
setarray .loc[0], 0, 1,1, // first row: x, second row: y
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,
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;
set .loc[0], (getarraysize(.loc) - 1); // loc 0 and 1 are special (stores array size, and half index)
.loc[1] = ((.loc[0]+1)/2);
setarray .small_rewards$[0], 0, "AppleCake", "CactusDrink", "CactusPotion", "Cake", "Candy", "CherryCake", "ChocolateBar", "ChocolateCake", "GreenApple", "Orange", "OrangeCake", "OrangeCupcake", "RedApple", "WhiteCake";
.small_rewards = getarraysize(.small_rewards$);
setarray .medium_rewards$[0], 0, "RedEasterEgg", "GreenEasterEgg", "BlueEasterEgg", "YellowEasterEgg", "PinkEasterEgg", "TealEasterEgg";
setarray .big_rewards$[0], 0, "RedEggshellHat", "BlueEggshellHat", "YellowEggshellHat", "GreenEggshellHat", "OrangeEggshellHat", "DarkEggshellHat";
.big_rewards = getarraysize(.big_rewards$);
donpcevent strnpcinfo(0) + "::OnHeartbeat"; // first heartbeat
end;
}
function script Easter Debug {
goto L_Menu;
L_Menu:
clear;
mes "Please choose an option.";
if (get(.disabled, "Easter Eggs"))
menu
"Do Nothing.", L_Return,
"Enable eggs.", L_Enable;
menu
"Do Nothing.", L_Return,
"Disable eggs.", L_Disable;
L_Enable:
.disabled = 0, "Easter Eggs";
clear;
mes "Easter Eggs enabled.";
next;
goto L_Menu;
L_Disable:
set .disabled, 1, "Easter Eggs"; // TODO: (tmwa) automatically destroy puppets when using @disablenpc & also discard timers
clear;
mes "Easter Eggs disabled.";
next;
goto L_Menu;
L_Return:
return;
}