// TMW 2 Script
// Author:
// Jesusalva
// Micksha
// Description:
// Basement Boss Fight
042-2,41,22,0 script #KDoor0422 NPC_HIDDEN,0,0,{
function kdoor0422Spawn;
end;
OnTouch:
.@label$=instance_npcname(.name$)+"::OnKillBoss";
.@g=getcharid(2);
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)
percentheal -100, -100;
debugmes getmap();
if (getmap() != "042-2@"+.@g)
end;
debugmes $@KAMELOT_WAVE[.@g];
if ($@KAMELOT_WAVE[.@g] > 3)
end;
$@KAMELOT_WAVE[.@g]=100;
setd("$@GTEMP2_"+.@m$, $KAMELOT_PC[.@g]);
setd("$@GTEMP3_"+.@m$, $KAMELOT_MX[.@g]);
initnpctimer;
debugmes "Timer Started";
//if ($@KAMELOT_WAVE == 0)
// goto OnKillMob;
// TODO: Fire dialog
// TODO: Stun yourself for cutscene
// ...
end;
OnEmergency:
.@m$=instance_mapname("042-2");
setd("$@GTEMP2_"+.@m$, $KAMELOT_PC[getcharid(2)]);
setd("$@GTEMP3_"+.@m$, $KAMELOT_MX[getcharid(2)]);
initnpctimer;
end;
OnEmergency2:
dispbottom instance_npcname("#KDoor0422", $@KAMELOT_ID[.@g]);
end;
OnTimer1000:
.@m$=instance_mapname("042-2");
mapannounce .@m$, "??? : What's this? Why do I hear a commotion up there??", 0;
.@gcount=getd("$@GTEMP2_"+.@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$, "??? : 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 : Both is impossible for weaklings like you lot. Minions, ATTACK!", 0;
.@gcount=getd("$@GTEMP2_"+.@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("$@GTEMP2_"+.@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("$@GTEMP2_"+.@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. Charge!", 0;
.@gcount=getd("$@GTEMP2_"+.@m$);
.@avg=getd("$@GTEMP3_"+.@m$);
kdoor0422Spawn(.@gcount*3, 20, 24, 59, 59);
.@avg=getd("$@GTEMP3_"+.@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*300);
setunitdata(.@mob, UDT_HP, .@avg*300);
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("$@GTEMP1_"+.@m$, 10);
end;
OnTimer185000:
debugmes "Timer Running";
.@m$=instance_mapname("042-2");
.@mob=getd("$@GTEMP_"+.@m$);
.@gdcount=getd("$@GTEMP2_"+.@m$);
.@ratio=getunitdata(.@mob, UDT_HP)*10/getunitdata(.@mob, UDT_MAXHP);
debugmes "Ratio %d/%d", .@ratio, getd("$@GTEMP1_"+.@m$);
if (.@ratio < getd("$@GTEMP1_"+.@m$)) {
mapannounce .@m$, "General Krukan : "+any("Charge!", "To the Abyss with you already!", "Kill them already!", "More of them are coming!", "Minions, ATTACK!"), 0;
kdoor0422Spawn(.@gcount*2, 20, 24, 59, 59);
setd("$@GTEMP1_"+.@m$, .@ratio);
}
debugmes "Restart timer";
setnpctimer 180001;
end;
OnVerifyIntent:
.@g=getcharid(2);
if (.@g < 1) percentheal -100, -100;
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) percentheal -100, -100;
getexp $KAMELOT_MX[.@g]*5, $KAMELOT_MX[.@g]*2;
end;
OnKillBoss:
setd("$@GTEMP_"+.@m$, 0);
setd("$@GTEMP1_"+.@m$, 0);
setd("$@GTEMP2_"+.@m$, 0);
.@g=getcharid(2);
dispbottom l("This is all in KAMELOT for now.");
$KAMELOT_QUEST[.@g]=$KAMELOT_QUEST[.@g]|4; // FIXME
// 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=300+$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;
// 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;
stopnpctimer;
// TODO: maptimer to give EXP to helpers/survivors
// TODO: Arrest scene
// TODO: Actual arresting
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);
.@avg=getd("$@GTEMP3_"+.@m$);
.@m$=instance_mapname("042-2");
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$, 21, 24, 59, 99, 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*45/10);
setunitdata(.@mob, UDT_ATKMAX, .@avg*65/10);
setunitdata(.@mob, UDT_DEF, 1+.@avg*9/10);
setunitdata(.@mob, UDT_MDEF, 1+.@avg*5/10);
setunitdata(.@mob, UDT_HIT, .@avg*4); // 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
}