summaryrefslogblamecommitdiff
path: root/npc/042-2/boss.txt
blob: b3adb12579e08a6b385b70822cb2198a7116d106 (plain) (tree)
1
2
3
4
5
6
7
8
9





                       
                                    

                                                        
                            




                                                     
                       
                                                                     
                                   







                                                   
                                  
                                   

                     
              
                        

                                 
                                   
                                 
            
                            

                                               
                 
                               

        

                                   
                                                                                   
                                      
                                                                    



                                   
                                                                                                                     






                                                                                                                     

        

                                   




                                                                                                                             
                                                                                                                              








                                                                                
                                                                                                
                                      





                                                                                                                    
                                      





                                                                                                                                                              
                                      




                                               
                                  
                                                                                                                               

                                      
                                               
                                   
                                                                     











                                                                                                     

                                                











                                                                 
                                 


              
                               

                                   
                                      
                                                                        


                                                                                                                                                                             
                                                   
                                          
     
                               
                       

        
               
                     
                       
























                                                                                                                                                   



                               
                       



                                                  




                           
                                   

                                  
                             
                                
                                
                                
                     



                                                    
                                  

                              
                                                                        

                                                                    




                                           






                                                                                           


































                                                                               




                                                                               























                                                                               
                              
                                                                              










                                                                     
                                            

                                                                               
                                                                 

         
                                                                       
                             
                 
        
 

                     
                       
                                   























                                                                                          

        
                         
                          





                                                    
                                   
                                   
                                                                    


                                                                
                                                                                                      












                                                                                          

                                                      

                                                       
                                                                     







                                                                     
                                  



             

 












                                                             
 
// TMW 2 Script
// Author:
//  Jesusalva
//  Micksha
// Description:
//  Basement Boss Fight
// We'll be counting attendance now.

042-2,41,22,0	script	#KDoor0422	NPC_HIDDEN,0,0,{
    function kdoor0422Spawn;
    end;

OnTouch:
    .@label$=instance_npcname(.name$)+"::OnKillBoss";
    .@g=getcharid(2);
    if (.@g < 1) die();
    if (($KAMELOT_QUEST[.@g] & 4) && !mobcount(getmap(), .@label$)) {
        warp "042-3@"+.@g, 58, 139;
    } else {
        dispbottom l("Powerful magic repels you!");
        percentheal -5, -5;
        slide 38, 28;
    }
    end;

OnArrival:
    //debugmes "Arrival detected";
    .@m$=instance_mapname("042-2");
    .@g=getcharid(2);
    if (.@g < 1)
        die();
    //debugmes getmap();
    if (getmap() != "042-2@"+.@g)
        end;
    //debugmes $@KAMELOT_WAVE[.@g];
    if ($@KAMELOT_WAVE[.@g] > 10)
        end;
    $@KAMELOT_WAVE[.@g]=100;
    setd("$@GTEMP_PC_"+.@m$, $KAMELOT_PC[.@g]);
    setd("$@GTEMP_MX_"+.@m$, $KAMELOT_MX[.@g]);
    initnpctimer;
    //debugmes "Timer Started";
    end;

OnTimer1000:
    .@m$=instance_mapname("042-2");
    mapannounce .@m$, "??? : What's this? Why do I hear a commotion up there??", 0;
    .@gcount=getd("$@GTEMP_PC_"+.@m$);
    kdoor0422Spawn(.@gcount*2, 20, 24, 59, 59); // Prologue monsters
    end;

OnTimer30000:
    .@m$=instance_mapname("042-2");
    mapannounce .@m$, "??? : WHAT?! This is not possible. Who are you, and how did you manage to come down here?", 0;
    end;

OnTimer35000:
    .@m$=instance_mapname("042-2");
    .@n$=instance_npcname(.name$);
    mapannounce .@m$, "??? : The sheer power of our lord should prevent anyone not under his control to go here.", 0;
    maptimer .@m$, 5000, .@n$+"::OnVerifyIntent";
    end;

OnTimer60000:
    .@m$=instance_mapname("042-2");
    mapannounce .@m$, "??? : HAHAHA! Meh, you will die anyways, so I can tell you that you never will even see our Lord.", 0;
    end;

OnTimer67000:
    .@m$=instance_mapname("042-2");
    mapannounce .@m$, b("??? : You require the key hidden in the caves, additionally you must overcome the magical seal."), 0;
    end;

OnTimer74000:
    .@m$=instance_mapname("042-2");
    mapannounce .@m$, "??? : Both is impossible for weaklings like you lot.", 0;
    end;

OnTimer80000:
    .@m$=instance_mapname("042-2");
    mapannounce .@m$, "General Krukan : ##1I am General Krukan the Strong. Minions, ATTACK!", 0;
    .@gcount=getd("$@GTEMP_PC_"+.@m$);
    kdoor0422Spawn(.@gcount*2, 20, 24, 59, 59);
    end;

OnTimer100000:
    .@m$=instance_mapname("042-2");
    mapannounce .@m$, "General Krukan : MUhahahahaha! Minions, Dispose of these Adventurers! Kill them already!", 0;
    .@gcount=getd("$@GTEMP_PC_"+.@m$);
    kdoor0422Spawn(.@gcount*2, 20, 24, 59, 59);
    end;

OnTimer120000:
    .@m$=instance_mapname("042-2");
    mapannounce .@m$, "General Krukan : *facepalm* Now, you're just being pathetic minions. How about you try a different approach and kill them already!", 0;
    .@gcount=getd("$@GTEMP_PC_"+.@m$);
    kdoor0422Spawn(.@gcount*2, 20, 24, 59, 59);
    end;

OnTimer180000:
    .@m$=instance_mapname("042-2");
    .@n$=instance_npcname(.name$);
    mapannounce .@m$, "General Krukan : Looks like if you want something done right you have to do it yourself. ##1Charge!", 0;
    .@gcount=getd("$@GTEMP_PC_"+.@m$);
    .@avg=getd("$@GTEMP_MX_"+.@m$);
    kdoor0422Spawn(.@gcount*3, 20, 24, 59, 59);
    .@avg=getd("$@GTEMP_MX_"+.@m$);
    //debugmes "BOSS - %d, map %s (power %d)", .@gcount, .@m$, .@avg;
    .@mob=monster(.@m$, 34, 26, strmobinfo(1, GeneralKrukan), GeneralKrukan, 1, .@n$+"::OnKillBoss");
    // Reconfigure the monster
    setunitdata(.@mob, UDT_LEVEL, .@avg);
    setunitdata(.@mob, UDT_STR, 1+.@avg/3);
    setunitdata(.@mob, UDT_AGI, 1+.@avg/3);
    setunitdata(.@mob, UDT_VIT, 1+.@avg/3);
    setunitdata(.@mob, UDT_INT, 1+.@avg/3);
    setunitdata(.@mob, UDT_DEX, 1+.@avg/3);
    setunitdata(.@mob, UDT_LUK, 1+.@avg/3);
    setunitdata(.@mob, UDT_ADELAY, 1372);
    setunitdata(.@mob, UDT_ATKRANGE, 3);
    // Battle Status
    setunitdata(.@mob, UDT_MAXHP,    .@avg*320);
    setunitdata(.@mob, UDT_HP,       .@avg*320);
    setunitdata(.@mob, UDT_ATKMIN,   .@avg*65/10);
    setunitdata(.@mob, UDT_ATKMAX,   .@avg*85/10);
    setunitdata(.@mob, UDT_DEF,      1+.@avg);
    setunitdata(.@mob, UDT_MDEF,     1+.@avg*8/10);
    setunitdata(.@mob, UDT_HIT,      .@avg*12); // Advised: x3
    setunitdata(.@mob, UDT_FLEE,     .@avg*39/10); // Advised: x4
    // Critical calculation
    .@min=15;
    .@max=max(.@min, min(50, .@avg/4));
    setunitdata(.@mob, UDT_CRIT,     rand2(.@min, .@max));
    // Loop through
    setd("$@GTEMP_"+.@m$, .@mob);
    setd("$@GTEMP_HP_"+.@m$, 10);
    end;

OnTimer185000:
    //debugmes "Timer Running";
    .@m$=instance_mapname("042-2");
    .@mob=getd("$@GTEMP_"+.@m$);
    .@gcount=getd("$@GTEMP_PC_"+.@m$);
    .@ratio=getunitdata(.@mob, UDT_HP)*10/getunitdata(.@mob, UDT_MAXHP);
    //debugmes "Ratio %d/%d", .@ratio, getd("$@GTEMP_HP_"+.@m$);
    if (.@ratio < getd("$@GTEMP_HP_"+.@m$)) {
        mapannounce .@m$, "General Krukan : "+any("Charge!", "To the Abyss with you already!", "Kill them already!", "More of them might be coming!", "Minions, ATTACK!"), 0;
        kdoor0422Spawn(.@gcount*2, 20, 24, 59, 59);
        setd("$@GTEMP_HP_"+.@m$, .@ratio);
    }
    //debugmes "Restart timer";
    setnpctimer 180001;
    end;

OnVerifyIntent:
    .@g=getcharid(2);
    if (.@g < 1) die();
    mesq l("Who are you, and how did you manage to come down here? The sheer power of our Lord prevents anyone not under his control to go here.");
    select
        l("We are strong fighters, and we want to free the King from his obsession."),
        l("Oh, yea, you are right, it was a mistake. Bye-bye.");
    mes "";
    if (@menu == 2) {
        mesc l("ARE YOU SURE?"), 1;
        mesc l("This will remove you from the quest!");
        next;
        if (askyesno() == ASK_YES) {
            mapannounce getmap(), "General Krukan : I praise you for running away, "+strcharinfo(0)+". You're not a fool it seems.", 0;
            warp "014-4", 67, 27;
            percentheal 100, 100;
            closeclientdialog;
            end;
        }
    } else {
        getexp $KAMELOT_MX[.@g]*6, $KAMELOT_MX[.@g]*2;
    }
    mesc l("With fresh conviction, you prepare yourself to the fight which draws near.");
    getitem GuildCoin, 1;
    close;




OnKillMob:
    if (!playerattached()) end;
    .@g=getcharid(2);
    if (.@g < 1) die();
    getexp $KAMELOT_MX[.@g]*5, $KAMELOT_MX[.@g]*2;
    end;

OnKillBoss:
    // Fallback
    if (!playerattached())
        goto OnTimer180000;

    // OnKillBoss begin
    .@m$=instance_mapname("042-2");
    .@n$=instance_npcname(.name$);
    stopnpctimer;
    setd("$@GTEMP_"+.@m$, 0);
    setd("$@GTEMP_HP_"+.@m$, 0);
    setd("$@GTEMP_PC_"+.@m$, 0);
    setd("$@GTEMP_MX_"+.@m$, 0);
    .@g=getcharid(2);
    // Player Reward for completing this stage
    getitem GuildCoin, min(1, $KAMELOT_MX[.@g]/20);
    getexp $KAMELOT_MX[.@g]*50, $KAMELOT_MX[.@g]*10;
    // Guild Reward for completing this stage
    .@ggp=1200+$KAMELOT_MX[.@g]*5;
    .@gxp=$KAMELOT_MX[.@g]*10;
    $GUILD_BANK[.@g]+=.@ggp;
    guildgetexp(.@gxp); // 10xp per player average level (max 1000/1500)
    // Announce
    mapannounce getmap(), strcharinfo(0)+" has defeated Krukan!", 0;
    // Arrest scene + exp
    maptimer .@m$, 1500, .@n$+"::OnReward";
    setd("$@GTEMP_"+.@m$, .@g);
    setnpctimer 1000000; // Prefix 1M
    startnpctimer;
    // Guild Master Notification
    .@gm$=getguildmaster(.@g);
    if (!getcharid(3, .@gm$)) end;
    .@gma=getcharid(3, .@gm$);
    .@gmb=getcharid(0, .@gm$);
    if (!isloggedin(.@gma, .@gmb)) end;
    message .@gm$, strcharinfo(0)+" defeated Krukan: Guild GP +"+.@ggp+" Guild XP +"+.@gxp;
    end;


///////////////////////////////////////////////////////////////////////
OnTimer1002000:
    .@m$=instance_mapname("042-2");
    .@n$=instance_npcname(.name$);
    // Bring Razha (the only mob with fixed difficulty in Kamelot)
    .@raz=monster(.@m$, 41, 23, strmobinfo(1, GeneralRazha), GeneralRazha, 1,
                  .@n$+"::OnOptionalBoss");
    // Configure the optional boss
    setunitdata(.@raz, UDT_LEVEL, 150);
    setunitdata(.@raz, UDT_STR, 150);
    setunitdata(.@raz, UDT_AGI, 150);
    setunitdata(.@raz, UDT_VIT, 150);
    setunitdata(.@raz, UDT_INT, 150);
    setunitdata(.@raz, UDT_DEX, 150);
    setunitdata(.@raz, UDT_LUK, 150);
    setunitdata(.@raz, UDT_ADELAY, 1072);
    setunitdata(.@raz, UDT_ATKRANGE, 3);
    // Battle Status
    setunitdata(.@raz, UDT_MAXHP,    150000);
    setunitdata(.@raz, UDT_HP,       150000);
    setunitdata(.@raz, UDT_ATKMIN,   400);
    setunitdata(.@raz, UDT_ATKMAX,   750);
    setunitdata(.@raz, UDT_DEF,      300);
    setunitdata(.@raz, UDT_MDEF,     300);
    setunitdata(.@raz, UDT_HIT,      32767); // Advised: x3
    setunitdata(.@raz, UDT_FLEE,     420); // Advised: x4
    setunitdata(.@raz, UDT_CRIT,     70);
    // Loop through

    sc_start(SC_STUN, 15000, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, .@raz);
    unittalk(.@raz, "What is happening here??");
    mapannounce .@m$, "General Razha : ##1What's happening here??", 0;
    sleep(100);
    sc_end(SC_STUN, .@raz);
    unitwalk(.@raz, 41, 24);
    sleep(200);
    sc_start(SC_STUN, 15000, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, .@raz);
    end;

OnTimer1007000:
    .@m$=instance_mapname("042-2");
    mapannounce .@m$, "General Razha : GUARDS!!", 0;
    end;

OnTimer1007500:
    .@m$=instance_mapname("042-2");
    .@r1=monster(.@m$, 40, 24, strmobinfo(1, CursedSoldier), CursedSoldier, 1);
    .@r2=monster(.@m$, 42, 24, strmobinfo(1, CursedArcher), CursedArcher, 1);
    sc_start(SC_STUN, 15000, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, .@r1);
    sc_start(SC_STUN, 15000, 1, 10000, SCFLAG_NOAVOID|SCFLAG_FIXEDTICK, .@r2);
    kdoor0422Spawn(49, 20, 24, 59, 59); // 1225 tiles, 1 per 25 tiles
    end;

OnTimer1012000:
    .@m$=instance_mapname("042-2");
    mapannounce .@m$, "General Razha : Arrest them all!!", 0;
    end;

OnTimer1015000:
    .@m$=instance_mapname("042-2");
    .@t$=instance_mapname("042-3");
    .@g=getd("$@GTEMP_"+.@m$);
    .@n$="#KSlimeSpawn"; //instance_npcname("#KSlimeSpawn", $KAMELOT_ID[.@g]);
    setarray .@x,  33,  84,  41,  74, 36, 57, 79, 43, 24, 86, 59, 38;
    setarray .@y, 135, 127, 119, 107, 96, 84, 63, 67, 67, 22, 49, 27;
    .@c=getunits(BL_PC, .@unt, false, .@m$, 20, 24, 59, 59);
    for (.@i = 0; .@i < .@c; .@i++) {
        specialeffect(FX_HIT, AREA, .@unt[.@i]);
        .@v = (.@i % 12);
        .@r=attachrid(.@unt[.@i]);
        if (.@r) {
            warp .@t$, .@x[.@v], .@y[.@v];
            if (!countitem(Lockpicks))
                addtimer 700, .@n$+"::OnFirstSlime";
            setpcblock(PCBLOCK_HARD, false);
        } else {
            unitwarp(.@unt[.@i], .@t$, .@x[.@v], .@y[.@v]); // And good luck D:
            consolebug "FATAL: Could not attach: %d", .@unt[.@i];
        }
    }
    $KAMELOT_QUEST[.@g]=$KAMELOT_QUEST[.@g]|4; // This part is complete
    setd("$@GTEMP_"+.@m$, 0);
    stopnpctimer;
    end;

OnReward:
    .@g=getcharid(2);
    if (.@g < 1) die();
    setpcblock(PCBLOCK_HARD, true);
    getitem GuildCoin, min(1, $KAMELOT_MX[.@g]/25);
    getexp $KAMELOT_MX[.@g]*50, $KAMELOT_MX[.@g]*10;
    dispbottom l("Wait- Something is happening!");
    end;

OnOptionalBoss:
    .@g=getcharid(2);
    // Player Reward for completing this stage
    getitem GuildCoin, 5;
    getexp 50000, 10000;
    // Guild Reward for completing this stage
    .@ggp=12000;
    .@gxp=100000;
    $GUILD_BANK[.@g]+=.@ggp;
    guildgetexp(.@gxp); // 10xp per player average level (max 1000/1500)
    // Announce
    mapannounce getmap(), strcharinfo(0)+" has defeated Razha!", 0;
    // Guild Master Notification
    .@gm$=getguildmaster(.@g);
    if (!getcharid(3, .@gm$)) end;
    .@gma=getcharid(3, .@gm$);
    .@gmb=getcharid(0, .@gm$);
    if (!isloggedin(.@gma, .@gmb)) end;
    message .@gm$, strcharinfo(0)+" defeated Razha: Guild GP +"+.@ggp+" Guild XP +"+.@gxp;
    end;

function kdoor0422Spawn {
    //debugmes "Spawning";
    .@label$=instance_npcname(.name$)+"::OnKillMob";
    .@gcount=getarg(0);
    .@x1=getarg(1);
    .@y1=getarg(2);
    .@x2=getarg(3);
    .@y2=getarg(4);
    .@m$=instance_mapname("042-2");
    .@avg=getd("$@GTEMP_MX_"+.@m$);
    //debugmes "Total %d, map %s (power %d)", .@gcount, .@m$, .@avg;
    freeloop(true);
    for (.@i=0; .@i < .@gcount; .@i++) {
        .@mobId=any(CursedSoldier, CursedArcher); // 50-50 ratio
        .@mob=areamonster(.@m$, .@x1, .@y1, .@x2, .@y2, strmobinfo(1, .@mobId), .@mobId, 1, .@label$);
        // Reconfigure the monster
        setunitdata(.@mob, UDT_LEVEL, .@avg);
        setunitdata(.@mob, UDT_STR, 1+.@avg/4);
        setunitdata(.@mob, UDT_AGI, 1+.@avg/4);
        setunitdata(.@mob, UDT_VIT, 1+.@avg/4);
        setunitdata(.@mob, UDT_INT, 1+.@avg/4);
        setunitdata(.@mob, UDT_DEX, 1+.@avg/4);
        setunitdata(.@mob, UDT_LUK, 1+.@avg/4);
        setunitdata(.@mob, UDT_ADELAY, 1672);
        setunitdata(.@mob, UDT_ATKRANGE, (.@mobId == CursedArcher ? any(6,7) : any(1,2)));
        // Battle Status
        setunitdata(.@mob, UDT_MAXHP,    .@avg*33);
        setunitdata(.@mob, UDT_HP,       .@avg*33);
        setunitdata(.@mob, UDT_ATKMIN,   .@avg*40/10);
        setunitdata(.@mob, UDT_ATKMAX,   .@avg*60/10);
        setunitdata(.@mob, UDT_DEF,      1+.@avg*9/10);
        setunitdata(.@mob, UDT_MDEF,     1+.@avg*5/10);
        setunitdata(.@mob, UDT_HIT,      .@avg*45/10); // Advised: x3
        setunitdata(.@mob, UDT_FLEE,     .@avg*35/10); // Advised: x4
        // Critical calculation
        .@min=2;
        .@max=max(.@min, min(25, .@avg/5));
        setunitdata(.@mob, UDT_CRIT,     rand2(.@min, .@max));
        // Loop through
    }
    freeloop(false);
    //debugmes "Done spawn 042-2";
    return;
}

// Script end
}

// Required exit
042-2,44,60,0	script	#KDoor0422B	NPC_HIDDEN,0,0,{
    end;

OnTouch:
    .@g=getcharid(2);
    if ($KAMELOT_QUEST[.@g] & 4) {
        warp "042-1@"+.@g, 51, 24;
    } else {
        dispbottom l("Oh noes! The guards locked the door!");
    }
    end;
}