diff options
Diffstat (limited to 'npc/008-1/annualeaster.txt')
-rwxr-xr-x | npc/008-1/annualeaster.txt | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/npc/008-1/annualeaster.txt b/npc/008-1/annualeaster.txt new file mode 100755 index 00000000..358769a7 --- /dev/null +++ b/npc/008-1/annualeaster.txt @@ -0,0 +1,212 @@ + + + + +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; +} |