summaryrefslogtreecommitdiff
path: root/npc/042-2
diff options
context:
space:
mode:
authorJesusaves <cpntb1@ymail.com>2022-10-23 21:44:22 -0300
committerJesusaves <cpntb1@ymail.com>2022-10-23 21:44:22 -0300
commita7c45a192268da2601cef47a4cdba987ae2327ca (patch)
treec5fb5b97db109fe7106496dd96498c475881046b /npc/042-2
downloadserverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.tar.gz
serverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.tar.bz2
serverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.tar.xz
serverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.zip
Initial commit (Moubootaur Legends fork)
Diffstat (limited to 'npc/042-2')
-rw-r--r--npc/042-2/_import.txt3
-rw-r--r--npc/042-2/boss.txt405
2 files changed, 408 insertions, 0 deletions
diff --git a/npc/042-2/_import.txt b/npc/042-2/_import.txt
new file mode 100644
index 0000000..2d59e35
--- /dev/null
+++ b/npc/042-2/_import.txt
@@ -0,0 +1,3 @@
+// Map 042-2: Camelot - Basement
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/042-2/boss.txt",
diff --git a/npc/042-2/boss.txt b/npc/042-2/boss.txt
new file mode 100644
index 0000000..b3adb12
--- /dev/null
+++ b/npc/042-2/boss.txt
@@ -0,0 +1,405 @@
+// 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;
+}
+