summaryrefslogblamecommitdiff
path: root/npc/functions/event.txt
blob: 58f3ec57f6914d8c80423afef9660e2be21b6521 (plain) (tree)































                                                                                         
            
            
            
































                                                                                                                                    



























                                                               

                                                             
                          


                                                          











                                     
                             



                                                                            
               
                               





                                     
               




                                      
                      





















                                                      

                                                     

                                                         
                       







                                                               
                                                         























                                                                                                                        




                                                                                                           



                                                 

            
         
















                      
























                                                    




                            
















                                                             
                                                                

                                             
                                       
                                                                              


                                      
                                                  





                                             
                                                  












                                                                                          
                                                                  

                                             
                                     
                                                                                


                                    
                                                    


                                             
                                      

                                                            


                                       
                                                    


                                             
                                       


         
 


                                                       
                                                               
                                                         

                                             
                                                             
                                                                           

                          
                                                           
                                           


                                      
                                                               
                                           




                       
 


                                                       
                                                               
                                                             

                                             
                                                             
                                                                               

                          
                                                           
                                               


                                      
                                                               
                                               





                       























                                                                                 


                                                   
                                                           
                                                            

                                             
                                                         
                                                                              

                          
                                                       
                                              




                                                                                       
                                                           
                                              






                       
// 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)
OnInit:
    .valentine_stday=12;
    .valentine_stmon=FEBRUARY;
    .valentine_endday=15;
    .valentine_endmon=FEBRUARY;

    .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=30;
    .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);

    // 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 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
        if (.@d == .patrick_endday) {
            kamibroadcast("It's the last day for St. Patrick Event! Hurry up!");
        }
        // Begin the event
        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
        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
        if (.@d == .easter_endday && .@m == .easter_endmon) {
            kamibroadcast("It's the last day for Easter Event! Hurry up!");
        }
        // Begin the event
        if (.@d == .easter_stday && .@m == .easter_stmon) {
            kamibroadcast("Easter begun!");
            $EVENT$="Easter";
        }
        // End the event the day after
        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
        if (.@d == .worker_endday && .@m == .worker_endmon) {
            kamibroadcast("It's the last day for Worker Day Event! Hurry up!");
        }
        // Begin the event
        if (.@d == .worker_stday && .@m == .worker_stmon) {
            kamibroadcast("Worker Day begun!");
            $EVENT$="Worker Day";
        }
        // End the event the day after
        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
        if (.@d == .thanks_endday && .@m == .thanks_endmon) {
            kamibroadcast("It's the last day for Thanksgiving Event! Hurry up!");
        }
        // Begin the event
        if (.@d == .thanks_stday && .@m == .thanks_stmon) {
            kamibroadcast("Thanksgiving begun!");
            $EVENT$="Thanksgiving";
        }
        // End the event the day after
        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
        if (.@d == .xmas_endday && .@m == .xmas_endmon) {
            kamibroadcast("It's the last day for Christmas Event! Hurry up!");
        }
        // Begin the event
        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
        if (.@d == .xmas_endday+1 && .@m == .xmas_endmon) {
            kamibroadcast("Christmas ended!");
            sClear();
            $EVENT$="";
        }
    }
    end;
}