// TMW2 scripts.
// Authors:
// Jesusalva
// Description:
// Controls world events so Saulc and I can take vacations.
// The event specifics are more often scattered accross seasons.txt, command/event.txt
// 003-1/events.txt, soulmenhir.txt and, of course, the event maps (if any).
// Schedule, if needed to change, can be found in the OnInit loop.
// An event, obviously, cannot last more than 7... 15 days at WORST.
// Therefore, month checks aren't included in day checks.
- script sPatrick NPC_HIDDEN,{
OnInit:
setarray .maps$,
"005-1",
"013-1",
"014-1",
"014-2",
"014-3",
"014-4",
"014-5",
"017-1",
"018-2",
"018-4",
"018-5",
"soren";
end;
OnMyMobDeath:
end;
OnClock0000:
OnClock6000:
OnClock1200:
OnClock1500:
OnClock1800:
OnClock2100:
.@d=gettime(GETTIME_DAYOFMONTH);
// Patrick Day should work only in 2 luck days according to Saulc
// If this is required use $PATRICK_DAYCTRL so the days before $@PATRICK_DAYMAX
// act with 100% chances (determinism).
// As it is being spawn 4 times at a day (like TMW-BR events), because it is
// flatly and outright IMPOSSIBLE to add a permanent spawn, that is not required.
if ($EVENT$ == "St. Patrick" && .@d <= $@PATRICK_DAYMAX) {
for (.@i=0; .@i < getarraysize(.maps$); .@i++) {
.@m$=.maps$[.@i];
.@x=getmapinfo(MAPINFO_SIZE_X, .@m$)-20;
.@y=getmapinfo(MAPINFO_SIZE_Y, .@m$)-20;
// Remove previously spawned clovers
killmonster(.@m$, "sPatrick::OnMyMobDeath");
// It is one clover for each 225 tiles (about a 25x25 square)
.@maparea=(.@x-20)*(.@y-20);
.@mobs=max(1, .@maparea/225);
areamonster .@m$, 20, 20, .@x, .@y, strmobinfo(1, StPatricksClover), StPatricksClover, .@mobs, "sPatrick::OnMyMobDeath";
}
}
end;
// Remove previously spawned clovers for event end
// And then disables the NPC
OnCleanUp:
for (.@i=0; .@i < getarraysize(.maps$); .@i++) {
.@m$=.maps$[.@i];
killmonster(.@m$, "sPatrick::OnMyMobDeath");
}
disablenpc "sPatrick";
end;
}
function script sThanksgiving {
// Variables:
// #THANKS_DAY
// #THANKS_STREAK
// @thanks_card
// Already spinned
if (#THANKS_DAY == gettime(5) || $EVENT$ != "Thanksgiving")
return;
// Not spinned yet
showavatar 1102;
mes l(".:: Thanksgiving ::.");
mesc l("Spin daily the card to get prizes!");
select
l("SPIN!"),
l("Later");
mes "";
if (@menu == 2) {
setskin "";
closeclientdialog;
return;
}
// Spin it
// Your prize is saved in .@luck. Rigged against fruits
.@luck=rand2(0,11);
.@luck=(.@luck == 10 ? rand2(0,11) : .@luck);
// A fruit before 10 days: rig to Arcmage or to blueprint
if (.@luck == 10 && #THANKS_STREAK < 10)
.@luck+=any(-1,1);
// A fruit before 20 days: Lower chances from 4% to 2%
if (.@luck == 10 && #THANKS_STREAK < 20)
.@luck=rand2(0,11);
// Extra spins
.@extra=rand2(1,3);
.@spins=.@extra*11+.@luck;
//.@extra=0;
// Show the spins
for (.@i=0;.@i<=.@spins;.@i++) {
.@cur=(.@i%11);
showavatar 1103+.@cur;
sleep2(60);
}
mes l(".:: Congratulations ::.");
#THANKS_DAY = gettime(5);
#THANKS_STREAK+=1;
if (debug || $@GM_OVERRIDE) {
mes l("You got a %d", .@luck);
mesf "Spins: %d/%d (cur %d extra %d)", .@i, .@spins, .@cur, .@extra;
mes "";
//.@luck=$@GM_OVERRIDE;
}
// Switch the reward
switch (.@luck) {
case 0: // EXP
.@p=BaseLevel*#THANKS_STREAK;
.@p*=3;
getexp .@p, 0;
mes l("You got %d EXP!", .@p);
break;
case 1: // JEXP
.@p=BaseLevel*#THANKS_STREAK;
.@p=.@p*15/10;
getexp 0, .@p;
mes l("You got %d JEXP!", .@p);
break;
case 2: // GP
.@p=BaseLevel*#THANKS_STREAK;
Zeny+=.@p;
mes l("You got %d GP!", .@p);
break;
case 3: // MOBPT
.@p=BaseLevel*#THANKS_STREAK;
Mobpt+=.@p;
mes l("You got %d Monster Points!", .@p);
break;
case 4: // RES
.@p=BaseLevel*#THANKS_STREAK;
.@p*=3;
REAL_ESTATE_CREDITS+=.@p;
mes l("You got %d Real Estate Credits!", .@p);
break;
case 5: // GIFT
.@p=BronzeGift;
.@p=(#THANKS_STREAK > 7 ? SilverGift : .@p);
.@p=(#THANKS_STREAK > 15 ? GoldenGift : .@p);
.@p=(#THANKS_STREAK > 22 ? PrismGift : .@p);
.@p=(#THANKS_STREAK > 27 ? SupremeGift : .@p);
mes l("You got a(n) %s gift!", getitemlink(.@p));
getitem .@p, 1;
break;
case 6: // STR C
.@p=#THANKS_STREAK;
getitem StrangeCoin, .@p;
mes l("You got %d %s!", .@p, getitemlink(StrangeCoin));
break;
case 7: // HERO C
.@p=#THANKS_STREAK;
.@p+=getq2(LoFQuest_HH)*max(1,#THANKS_STREAK/10);
getitem HeroCoin, .@p;
mes l("You got %d %s!", .@p, getitemlink(HeroCoin));
break;
case 8: // MERC
.@p=any(MercCard_GonzoDark, MercCard_Rosa, MercCard_Soren, MercCard_Apane);
.@p=(#THANKS_STREAK > 7 ? any(MercCard_EarthWitch, MercCard_Demure, MercCard_Jesusalva, MercCard_Pookie) : .@p);
.@p=(#THANKS_STREAK > 14 ? any(MercCard_Arthur, MercCard_LawnCable, MercCard_Crazyfefe, MercCard_Saulc) : .@p);
.@p=(#THANKS_STREAK > 21 ? any(MercCard_Swezanne, MercCard_DragonStar, MercCard_Msawis, MercCard_Aisen) : .@p);
.@p=(#THANKS_STREAK > 27 ? any(MercCard_Xanthem, MercCard_Woody, MercCard_Lilanna) : .@p);
getitem .@p, 1;
mes l("You got a %s!", getitemlink(.@p));
break;
case 9: // CARD
.@p=any(NatureCard, NinjaCard, MageCard, DruidCard, ClericCard, KnightCard, HeroCard, NecromancerCard);
.@p=(#THANKS_STREAK > 24 ? any(SpeedCard, ReflectCard, PowerCard, WallCard) : .@p);
getitem .@p, 1;
mes l("You got a %s!", getitemlink(.@p));
break;
case 10: // FRUIT
.@p=MysteriousFruit;
getitem .@p, 1;
mes l("You got a %s!", getitemlink(.@p));
break;
case 11: // BLUE
.@p=any(EquipmentBlueprintA, EquipmentBlueprintA, AlchemyBlueprintA);
.@p=(#THANKS_STREAK > 7 ? any(EquipmentBlueprintB, EquipmentBlueprintB, AlchemyBlueprintB) : .@p);
.@p=(#THANKS_STREAK > 14 ? any(EquipmentBlueprintC, EquipmentBlueprintC, AlchemyBlueprintC) : .@p);
.@p=(#THANKS_STREAK > 21 ? any(EquipmentBlueprintD, EquipmentBlueprintD, AlchemyBlueprintD) : .@p);
.@p=(#THANKS_STREAK > 27 ? any(EquipmentBlueprintE, EquipmentBlueprintE, AlchemyBlueprintE) : .@p);
getitem .@p, 1;
mes l("You got a %s!", getitemlink(.@p));
break;
}
// Close
next;
setskin "";
closeclientdialog;
return;
}
000-0,0,0,0 script #EventCore NPC_HIDDEN,{
end;
// Event Schedule (all dates are inclusive)
// NEVER, ever, include the last day of the month.
OnInit:
.valentine_stday=13;
.valentine_stmon=FEBRUARY;
.valentine_endday=16;
.valentine_endmon=FEBRUARY;
.tmw2day_stday=1;
.tmw2day_stmon=MARCH;
.tmw2day_endday=7;
.tmw2day_endmon=MARCH;
.patrick_stday=15;
.patrick_stmon=MARCH;
.patrick_endday=19;
.patrick_endmon=MARCH;
.easter_stday=17;
.easter_stmon=APRIL;
.easter_endday=24;
.easter_endmon=APRIL;
.worker_stday=27;
.worker_stmon=APRIL;
.worker_endday=3;
.worker_endmon=MAY;
.thanks_stday=1;
.thanks_stmon=NOVEMBER;
.thanks_endday=29;
.thanks_endmon=NOVEMBER;
.xmas_stday=19;
.xmas_stmon=DECEMBER;
.xmas_endday=2;
.xmas_endmon=JANUARY;
// Some setup
disablenpc "sPatrick";
// Check for events every midnight
OnClock0000:
.@d=gettime(GETTIME_DAYOFMONTH);
.@m=gettime(GETTIME_MONTH);
debugmes "A new day begins! Today is %02d/%02d", .@d, .@m;
if ($@DEBUG_OD)
.@d=$@DEBUG_OD;
if ($@DEBUG_OM)
.@m=$@DEBUG_OM;
debugmes "EVENT CORE, the %02d/%02d", .@d, .@m;
// Handle Valentine Day
if (.@m >=.valentine_stmon && .@m <= .valentine_endmon) {
// It's tomorrow: Send out an announcement
if (.@d == .valentine_stday - 1) {
kamibroadcast("Valentine Day will start tomorrow!");
}
// Last Day: Send out an announcement
if (.@d == .valentine_endday) {
kamibroadcast("It's the last day for Valentine Event! Hurry up!");
}
// Begin the event
if (.@d == .valentine_stday) {
kamibroadcast("Valentine Day begun!");
$EVENT$="Valentine";
$@VALENTINE_LOVELETTER = htnew();
$@VALENTINE_GIFTSTACKS = htnew();
}
// End the event the day after
if (.@d == .valentine_endday+1) {
kamibroadcast("Valentine Day ended!");
sClear();
$EVENT$="";
}
}
// Handle TMW2 Day
if (.@m >=.tmw2day_stmon && .@m <= .tmw2day_endmon) {
// It's tomorrow: Send out an announcement
if (.@d == .tmw2day_stday - 1) {
kamibroadcast("Moubootaur Legends Anniversary will start tomorrow!");
}
// Last Day: Send out an announcement
if (.@d == .tmw2day_endday) {
kamibroadcast("It's the last day of our Anniversary Event! Hurry up!");
}
// Begin the event
if (.@d == .tmw2day_stday) {
kamibroadcast("Moubootaur Legends Anniversary Event begun!");
if ($EVENT$ != "Anniversary")
$BCONFB_EXPR+=50;
$EVENT$="Anniversary";
}
// End the event the day after
if (.@d == .tmw2day_endday+1) {
kamibroadcast("Our Special Anniversary Event ended! Thanks!");
sClear();
$EVENT$="";
}
}
// Handle St. Patrick Day
// During this day, a special four leaf clover is spawned daily, at 4 times in the day
// in all forests: 6:00, 12:00, 18:00 and 00:00.
// $PATRICK_DAYMAX
if (.@m >=.patrick_stmon && .@m <= .patrick_endmon) {
// It's tomorrow: Send out an announcement
if (.@d == .patrick_stday - 1) {
kamibroadcast("St. Patrick Day will start tomorrow!");
}
// Last Day: Send out an announcement
else if (.@d == .patrick_endday) {
kamibroadcast("It's the last day for St. Patrick Event! Hurry up!");
}
// Begin the event
else if (.@d == .patrick_stday) {
kamibroadcast("St. Patrick Day begun!");
$EVENT$="St. Patrick";
$@PATRICK_DAYMAX=.patrick_endday;
enablenpc "sPatrick";
enablenpc "Patrick Saulc";
enablenpc "St. Patrick Gold Pot";
donpcevent "St. Patrick Gold Pot::OnForcedMove";
}
// End the event the day after
else if (.@d == .patrick_endday+1) {
kamibroadcast("St. Patrick Day ended!");
sClear();
$EVENT$="";
donpcevent "sPatrick::OnCleanUp";
disablenpc "Patrick Saulc";
}
}
// Handle Easter
if (.@m >=.easter_stmon && .@m <= .easter_endmon) {
// It's tomorrow: Send out an announcement
if (.@d == .easter_stday - 1 && .@m == .easter_stmon) {
kamibroadcast("Easter will start tomorrow!");
}
// Last Day: Send out an announcement
else if (.@d == .easter_endday && .@m == .easter_endmon) {
kamibroadcast("It's the last day for Easter Event! Hurry up!");
}
// Begin the event
else if (.@d == .easter_stday && .@m == .easter_stmon) {
kamibroadcast("Easter begun!");
$EVENT$="Easter";
}
// End the event the day after
else if (.@d == .easter_endday+1 && .@m == .easter_endmon) {
kamibroadcast("Easter ended!");
sClear();
$EVENT$="";
}
}
// Handle Worker Day
if (.@m >=.worker_stmon && .@m <= .worker_endmon) {
// It's tomorrow: Send out an announcement
if (.@d == .worker_stday - 1 && .@m == .worker_stmon) {
kamibroadcast("Worker Day will start tomorrow!");
}
// Last Day: Send out an announcement
else if (.@d == .worker_endday && .@m == .worker_endmon) {
kamibroadcast("It's the last day for Worker Day Event! Hurry up!");
}
// Begin the event
else if (.@d == .worker_stday && .@m == .worker_stmon) {
kamibroadcast("Worker Day begun!");
$EVENT$="Worker Day";
}
// End the event the day after
else if (.@d == .worker_endday+1 && .@m == .worker_endmon) {
kamibroadcast("Worker Day ended!");
sClear();
$EVENT$="";
}
}
// Handle Thanksgiving Day
if (.@m >=.thanks_stmon && .@m <= .thanks_endmon) {
// It's tomorrow: Send out an announcement
if (.@d == .thanks_stday - 1 && .@m == .thanks_stmon) {
kamibroadcast("Thanksgiving will start tomorrow!");
}
// Last Day: Send out an announcement
else if (.@d == .thanks_endday && .@m == .thanks_endmon) {
kamibroadcast("It's the last day for Thanksgiving Event! Hurry up!");
}
// Begin the event
else if (.@d == .thanks_stday && .@m == .thanks_stmon) {
kamibroadcast("Thanksgiving begun!");
$EVENT$="Thanksgiving";
}
// End the event the day after
else if (.@d == .thanks_endday+1 && .@m == .thanks_endmon) {
kamibroadcast("Thanksgiving ended!");
sClear();
$EVENT$="";
}
}
// Handle Christmas
if (.@m >=.xmas_stmon && .@m <= .xmas_endmon) {
// It's tomorrow: Send out an announcement
if (.@d == .xmas_stday - 1 && .@m == .xmas_stmon) {
kamibroadcast("Christmas will start tomorrow!");
}
// Last Day: Send out an announcement
else if (.@d == .xmas_endday && .@m == .xmas_endmon) {
kamibroadcast("It's the last day for Christmas Event! Hurry up!");
}
// Begin the event
else if (.@d == .xmas_stday && .@m == .xmas_stmon) {
kamibroadcast("Christmas begun!");
$EVENT$="Christmas";
query_sql("DELETE FROM `quest` WHERE `quest_id` = '"+SQuest_Christmas+"'");
sChristmas();
}
// End the event the day after
else if (.@d == .xmas_endday+1 && .@m == .xmas_endmon) {
kamibroadcast("Christmas ended!");
sClear();
$EVENT$="";
}
}
debugmes "EVENT CORE has finished";
end;
}