summaryrefslogblamecommitdiff
path: root/npc/config/events.txt
blob: 89e7f3799c3bf6d6a5795568ce2a25729f1eb616 (plain) (tree)
1
2
3
4
5
6
7
8





                               
                           
                                   


                                                                                 
















                                                               
                              











                                                                      
                          



















































































































                                                                                                                                  
                                

















                                             
                                            



                                                       

                                                  

                                                  
                            






























































































































                                                                                                                        
                                










                       
























































































                                                                                                                                      
// TMW2 scripts.
// Author:
//    Jesusalva
// Description:
//    Some of the event scripts

001-3	mapflag	zone	MMO
001-13-2	mapflag	zone	MMO

/////////////////////////////////////////////////////////////////////////////////
// Area 06: Moubootaur Showdown
001-13-2,47,26,0	script	#FoSCore	NPC_NO_SPRITE,{
    if (!is_admin() && !is_master()) end;
    if ($@FIRESOFSTEAM_BOSS) end;
    select
        l("Ignore this book"),
        l("Begin Moubootaur Showdown");
    mes "";
    $@FIRESOFSTEAM_BOSS=(@menu-1)*2;
    if ($@FIRESOFSTEAM_BOSS == 0) close;
    select
        l("Easy Mode"),
        l("Crazy Mode"),
        l("Cadis Mode"),
        l("Crazy Cadis Ultimate Pandorica Mode"),
        l("Portable Apocalypse");
    mes "";
    $@FIRESOFSTEAM_DIFF=70+(@menu*30);
    $@EVENT_06 = PORTHOS_BUSY;
    switch (@menu) {
    case 1: .@d$="##2Easy"; break;
    case 2: .@d$="##3Crazy"; break;
    case 3: .@d$="##5Cadis"; break;
    case 4: .@d$="##6Crazy Cadis Ultimate Pandorica"; break;
    case 5: .@d$="##1Portable Apocalypse"; break;
    default: .@d$="Unknown";
    }
    mapannounce("001-13-2", "Difficulty Selected: ##B"+.@d$+"##b", 0);
    changemusic("001-13-2", "mythica.ogg");
    closeclientdialog;
    // Dispose of the GM
    warp "033-1", 49, 193;
    sleep(200);
    // PC no longer attached
    // Start the event
    mapwarp("001-13-2", "001-13-2", 47, 37);
    sleep(200);
    // Cleanup previous data (if any)
    $@FOS_ISB=0;
    $@FOS_MOB=0;
    $@FOS_AND=0;
    .Support1=0;
    .Support2=0;
    .Support3=0;
    .Support4=0;
    .Support5=0;
    $@FOS_MOB=monster("001-13-2", 47, 32, "Moubootaur (Sealed)", MobMoubootaur, 1, "#FoSCore::OnEventEnd");
    .@c = getunits(BL_PC|BL_MER|BL_HOM, .@players, MAX_CYCLE_PC, "001-13-2");
    for (.@i = 0; .@i < .@c; .@i++) {
        sc_start(SC_STUN, 31000, 1, 10000,
                 SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, .@players[.@i]);
    }
    sc_start(SC_STUN, 31000, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, $@FOS_MOB);
    sleep(1000); // Dramatic Silence
    unittalk($@FOS_MOB, "##1Who dares awake me from my slumber...");
    sleep(3000);
    unittalk($@FOS_MOB, "##1It was not even a decade since I turned a whole world in a Moubootaur Legend for their insolence...");
    sleep(5000);
    maptimer2("001-13-2", 2000, "#FoSCore::OnMFShake");
    sleep(2000);
    unittalk($@FOS_MOB, "##1AND YOU DARE TO NOT LEARN YOUR LESSON?? %%e");
    sleep(2000);
    unittalk($@FOS_MOB, "##1USELESS, UNWORTHY CREATURES!! %%e");
    sleep(6000);
    unittalk($@FOS_MOB, "##1I SHALL TURN THE WHOLE FRICKIN' MULTIVERSE INTO MOUBOOS...");
    sleep(6000);
    unittalk($@FOS_MOB, "##1MY RETURN... IS AT HAND!!");
    .@avg=$@FIRESOFSTEAM_DIFF*13/10; // Moubootaur: +30% bonus (+30~60 lvls)
    // Reconfigure the monster (otherwise it is night immortal)
    setunitdata($@FOS_MOB, UDT_LEVEL, .@avg);
    setunitdata($@FOS_MOB, UDT_STR, 1+.@avg*3/4);
    setunitdata($@FOS_MOB, UDT_AGI, 1+.@avg*3/4);
    setunitdata($@FOS_MOB, UDT_VIT, 1+.@avg*3/4);
    setunitdata($@FOS_MOB, UDT_INT, 1+.@avg*3/4);
    setunitdata($@FOS_MOB, UDT_DEX, 1+.@avg*3/4);
    setunitdata($@FOS_MOB, UDT_LUK, 1+.@avg*3/4);
    setunitdata($@FOS_MOB, UDT_ADELAY, 1472);
    setunitdata($@FOS_MOB, UDT_ATKRANGE, 4);
    // Battle Status
    setunitdata($@FOS_MOB, UDT_MAXHP,    .@avg*1350);
    setunitdata($@FOS_MOB, UDT_HP,       .@avg*1350);
    setunitdata($@FOS_MOB, UDT_ATKMIN,   .@avg*6);
    setunitdata($@FOS_MOB, UDT_ATKMAX,   .@avg*8);
    setunitdata($@FOS_MOB, UDT_DEF,      12+.@avg*5/3);
    setunitdata($@FOS_MOB, UDT_MDEF,     1+.@avg);
    setunitdata($@FOS_MOB, UDT_HIT,      .@avg*18); // Advised: x18
    setunitdata($@FOS_MOB, UDT_FLEE,     .@avg*4); // Advised: x5
    setunitdata($@FOS_MOB, UDT_CRIT,     60+.@avg*4/3);
    // Reconfigure the AI
    .@opt=getunitdata($@FOS_MOB, UDT_MODE);
    // Disable looting
    if (.@opt & MD_LOOTER)
        .@opt=.@opt^MD_LOOTER;
    // Add knockback immunity
    .@opt=.@opt|MD_NOKNOCKBACK;
    // Mark as boss
    .@opt=.@opt|MD_BOSS;
    // Mark as aggressive
    .@opt=.@opt|MD_AGGRESSIVE;
    .@opt=.@opt|MD_ANGRY;
    // Make it more op
    .@opt=.@opt|MD_DETECTOR;
    .@opt=.@opt|MD_CASTSENSOR_CHASE;
    .@opt=.@opt|MD_CASTSENSOR_IDLE;
    .@opt=.@opt|MD_CHANGECHASE;
    .@opt=.@opt|MD_CHANGETARGET_MELEE;
    .@opt=.@opt|MD_CHANGETARGET_CHASE;
    setunitdata($@FOS_MOB, UDT_MODE, .@opt);
    sleep(1000);
    mapannounce("001-13-2", "##1##BON YOUR MARKS...", 0);
    sleep(2000);
    mapannounce("001-13-2", "##1##B3...", 0);
    sleep(1000);
    mapannounce("001-13-2", "##1##B2...", 0);
    sleep(1000);
    mapannounce("001-13-2", "##1##B1...", 0);
    sleep(1000);
    mapannounce("001-13-2", "##1##BBEGIN!!", 0);
    .Support3=monster("001-13-2", 59, 36, "Magic Commander", Moubi, 1);
    .Support4=monster("001-13-2", 44, 44, "Army Commander", BloodyMouboo, 1);
    .Support5=monster("001-13-2", 37, 36, "Mouboo Governor", AlphaMouboo, 1);
    setunitdata(.Support3, UDT_MAXHP,    .@avg*300);
    setunitdata(.Support3, UDT_HP,       .@avg*300);
    setunitdata(.Support4, UDT_MAXHP,    .@avg*300);
    setunitdata(.Support4, UDT_HP,       .@avg*300);
    setunitdata(.Support5, UDT_MAXHP,    .@avg*300);
    setunitdata(.Support5, UDT_HP,       .@avg*300);
    setunitdata(.Support3, UDT_RACE,     RC_Legendary);
    setunitdata(.Support4, UDT_RACE,     RC_Legendary);
    setunitdata(.Support5, UDT_RACE,     RC_Legendary);
    initnpctimer;
    changemusic("001-13-2", "Arabesque.ogg");
    end;

////////////// Player's Victory //////////////
OnEventEnd:
    stopnpctimer;
    killmonsterall("001-13-2");
    changemusic("001-13-2", "Misty_Shrine.ogg");
    mapannounce("001-13-2", "Moubootaur : ##1##BThis is not the place...", 0);
    sleep(2000);
    mapannounce("001-13-2", "Moubootaur : ##1##BMy powers are weak here...", 0);
    sleep(2000);
    mapannounce("001-13-2", "Moubootaur : ##1##BBut you won't foil my plans forever!", 0);
    sleep(3000);
    mapannounce("001-13-2", "Moubootaur : ##1##BI'll come back... Stronger than ever!", 0);
    sleep(3000);
    maptimer2("001-13-2", 10, "#FoSCore::OnMFSurvive");
    $@EVENT_06 = PORTHOS_UNUSED;
    end;


////////////// Map Broadcast //////////////
OnMFMark:
    dispbottom col(l("On your marks..."), 1);
    end;

OnMFShake:
    sshake();
    closeclientdialog;
    sleep2(1000);
    sshake();
    sshake();
    closeclientdialog;
    end;

OnMFDispose:
    if (ispcdead()) warp("033-1", 154, 240);
    end;

OnMFSurvive:
    dispbottom l("Mission accomplished. Well played!");
    // Mark as "done" on Mirror Lake Quest Tracker
    ##01_CRQUEST = ##01_CRQUEST | MLP_CR_DEBUT;
    specialeffect(FX_FANFARE, AREA, getcharid(3));
    sleep2(15000);
    warp("033-1", 154, 240);
    end;

////////////// Heartbeat //////////////
OnTimer15000:
    maptimer2("001-13-2", 10, "#FoSCore::OnMFDispose");
    sleep(30);
    if (getmapusers("001-13-2") < 1) goto L_Defeat;
    // Main cycle
    if ($@FIRESOFSTEAM_BOSS) {
        // Handle Moubootaur Magic
        // But only if .Support3 was defined (control variable)
        if (!.Support3) {initnpctimer; end;}
        // Spawn a fiend
        .@m=monster("001-13-2", 47, 31, "Mouboo", Mouboo, 1);
        setunitdata(.@m, UDT_RACE, RC_Legendary);
        .@hp=getunitdata(.@m, UDT_MAXHP)*$@FIRESOFSTEAM_DIFF/80;
        .@op=getunitdata(.@m, UDT_MODE);
        .@op=.@op|MD_AGGRESSIVE;
        setunitdata(.@m, UDT_MAXHP,    .@hp);
        setunitdata(.@m, UDT_HP,       .@hp);
        setunitdata(.@m, UDT_MODE,     .@op);
        // Select random magic from arsenal
        .@r=rand2(16);
        switch (.@r) {
        case 1:
            mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Bleeding", 0);
            areasc2("001-13-2", 50, 40, 30, 15000, SC_BLOODING, BL_PC, 1);
            break;
        case 2:
            mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Blind", 0);
            areasc2("001-13-2", 50, 40, 30, 15000, SC_BLIND, BL_PC, 1);
            break;
        case 3:
            mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Lag", 0);
            areasc2("001-13-2", 50, 40, 30, 15000, SC_CONFUSION, BL_PC, 1);
            break;
        case 4:
            mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Curse", 0);
            areasc2("001-13-2", 50, 40, 30, 15000, SC_CURSE, BL_PC, 1);
            break;
        case 5:
            mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Poison", 0);
            areasc2("001-13-2", 50, 40, 30, 15000, SC_POISON, BL_PC, 1);
            break;
        case 6:
            mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Sleep", 0);
            areasc2("001-13-2", 50, 40, 30, 15000, SC_SLEEP, BL_PC, 1);
            break;
        case 7:
            mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Deadly Poison", 0);
            areasc2("001-13-2", 50, 40, 30, 15000, SC_DPOISON, BL_PC, 1);
            break;
        case 8:
            mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Chilling", 0);
            areasc2("001-13-2", 50, 40, 30, 15000, SC_COLD, BL_PC, 1);
            break;
        case 9:
            mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Burning", 0);
            areasc2("001-13-2", 50, 40, 30, 15000, SC_BURNING, BL_PC, 1);
            break;
        case 10:
            mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Fear", 0);
            areasc2("001-13-2", 50, 40, 30, 15000, SC_FEAR, BL_PC, 1);
            break;
        case 11:
            mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Obliterate", 0);
            rectharm($@FOS_MOB, 7, 7, rand2(700, 900), HARM_MISC, Ele_Holy, "filter_always", BL_PC | BL_MER | BL_HOM);
            break;
        case 12:
            mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Disarm Homun", 0);
            areasc2("001-13-2", 50, 40, 30, 15000, SC_STUN, BL_HOM, 1);
            break;
        case 13:
            mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Exterminate Lesserform", 0);
            rectharm($@FOS_MOB, 7, 7, rand2(800, 1400), HARM_MISC, Ele_Holy, "filter_always", BL_MER | BL_HOM);
            break;
        case 14:
            mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Summon Reinforcement", 0);
            for (.@i=0;.@i <= rand2(4);.@i++) {
                .@m=monster("001-13-2", rand2(35,43), rand2(35,38), "Reinforcement",
                    any(AlphaMouboo, Moubi, BloodyMouboo, Moubi), 1);
                setunitdata(.@m, UDT_RACE, RC_Legendary);
                .@hp=getunitdata(.@m, UDT_MAXHP)*$@FIRESOFSTEAM_DIFF/60;
                setunitdata(.@m, UDT_MAXHP,    .@hp);
                setunitdata(.@m, UDT_HP,       .@hp);
            }
            break;
        case 15:
            mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Wizcat", 0);
            for (.@i=0;.@i <= 2+rand2(7);.@i++) {
                .@m=monster("001-13-2", rand2(35,43), rand2(35,38),
                    "Reinforcement", BlackCat, 1);
                setunitdata(.@m, UDT_RACE, RC_Legendary);
                .@hp=getunitdata(.@m, UDT_MAXHP)*$@FIRESOFSTEAM_DIFF/70;
                setunitdata(.@m, UDT_MAXHP,    .@hp);
                setunitdata(.@m, UDT_HP,       .@hp);
            }
            break;
        case 16:
            mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Nuke", 0);
            rectharm($@FOS_MOB, 14, 14, rand2(450, 750), HARM_MISC, Ele_Holy, "filter_always", BL_PC | BL_MER | BL_HOM);
            break;
        default: // case 0
            mapannounce("001-13-2", "Moubootaur : ##BAncient Magic: Seal", 0);
            areasc2("001-13-2", 50, 40, 30, 15000, SC_SILENCE, BL_PC, 1);
            break;
        }
        sleep(rand2(45000)); // Wait a bit longer between magic (random)
    }
    initnpctimer;
    end;

////////////// Player's Defeat //////////////
OnDefeat:
L_Defeat:
    $@FIRESOFSTEAM_BOSS=0;
    $@FIRESOFSTEAM_DIFF=0;
    $@FOS_ISB=0;
    $@FOS_MOB=0;
    $@FOS_AND=0;
    .Support1=0;
    .Support2=0;
    .Support3=0;
    .Support4=0;
    .Support5=0;
    killmonsterall("001-13-2");
    kamibroadcast("The players were defeated at Fires of Steam Showdown.", "Fires of Steam");
    $@EVENT_06 = PORTHOS_UNUSED;
    stopnpctimer;
    end;

OnInit:
    .boostime = 900000;
    .subitime = 47000;
    .distance = 5;
    .sex = G_OTHER;
    end;
}


/////////////////////////////////////////////////////////////////////////////////
// Area 08: Blanc's Showdown
001-3,147,153,0	script	#E08_CF	NPC_HIDDEN,2,0,{
    end;
OnTouch:
    if (!(get_byte(EVENT_08, 0) & EV08_KEY)) {
        dispbottom l("Darn, it is locked. A few keys will be necessary to open this.");
        end;
    }
    warp "026-2", 32, 96;
    end;
OnBossDie:
    .@p=get_nibble(EVENT_08, 2)+1;
    set_nibble(EVENT_08, 2, .@p);
    if (.@p >= 3) {
        set_byte(EVENT_08, 0, get_byte(EVENT_08, 0) | EV08_KEY);
        dispbottom l("I got all the keys! Time to get out of here!");
        sleep2(500);
        warp "001-3", 164, 33;
        end;
    }
    dispbottom l("Keys: %d/%d", .@p, 3);
    end;
OnInit:
    .sex = G_OTHER;
    end;
}

001-3,35,32,0	script	#E08WP_150	NPC_HIDDEN,0,0,{
    end;
OnTouch:
    if ($@EVENT_08 != PORTHOS_ACTIVE) end;
    //if (get_byte(EVENT_08, 0) & EV08_P150) end;
    if (get_byte(EVENT_08, 0) & EV08_KEY) end;
    setpcblock(PCBLOCK_HARD, true);
    mesc l("STORY MODE ENABLED. Monsters won't attack you, so you can read without worries."), 1;
    next;
    mesc l("Seems like our prey was through. This portal connects to a Level %d Maze.", .lvl);
    if (BaseLevel > .lvl*2) {
        mesc l("Meaning I cannot use this one. Dang!");
        next;
        goto L_Close;
    }
    mesc l("If I can find Elmo or Marley inside, they should be holding the keys for the castle, where we presume Blanc ran off to.");
    mesc l("I need to defeat at least three of them."), 1;
    next;
    mesc l("Will I explore this Maze? Or will I look another?"), 1;
    next;
    if (askyesno() == ASK_YES) {
        set_nibble(EVENT_08, 2, 0);
        CreateMaze(IOT_CHAR, MAZE_SIZE_G | MAZE_SIZE_X);
        if (BaseLevel > .lvl)
            .density=12;
        else
            .density=15;
        MazeMobs(.lvl, false, .density);

        // Spawn & Configure the boss monster
        .@mx=getmapinfo(MAPINFO_SIZE_X, MAZE_MAP$)-20;
        .@my=getmapinfo(MAPINFO_SIZE_Y, MAZE_MAP$)-20;
        .@mob=areamonster(MAZE_MAP$, 20, 20, .@mx, .@my, "Elmo", Marley, 5, "#E08_CF::OnBossDie");
        InitMaze(7200);
        dispbottom col(l("Reminder : Defeat 3/5 %s to win. Time limit: %d minutes or death.", b("Elmo"), 120), 2);
    }

L_Close:
    closeclientdialog;
    setpcblock(PCBLOCK_HARD, false);
    end;
OnInit:
    .sex = G_OTHER;
    .@n$ = strnpcinfo(0, "_0");
    explode(.@ni$, .@n$, "_");
    .lvl = atoi(.@ni$[1]);
    end;
}

001-3,113,148,0	duplicate(#E08WP_150)	#E08WP_100	NPC_HIDDEN,0,0
001-3,258,39,0	duplicate(#E08WP_150)	#E08WP_75	NPC_HIDDEN,0,0
001-3,38,257,0	duplicate(#E08WP_150)	#E08WP_50	NPC_HIDDEN,0,0
001-3,229,188,0	duplicate(#E08WP_150)	#E08WP_25	NPC_HIDDEN,0,0

// 35,32 NW (150) OK
// 113,148 Central circle (100)
// 258,39 NE (75)
// 38,257 SW (50)
// 229,188 SE (25)