summaryrefslogtreecommitdiff
path: root/npc
diff options
context:
space:
mode:
authorJesusaves <cpntb1@ymail.com>2019-07-29 20:44:16 -0300
committerJesusaves <cpntb1@ymail.com>2019-07-29 20:44:16 -0300
commit3af9de993f36b69fb7da3c4eacae5e16a5fcc2ec (patch)
tree3958fecb4545194a7ed1eb2141a82668747020d1 /npc
parentcd6610e32f60b51b06e27d6c87900ea021b806a1 (diff)
parent66203e9bba74774457133d8df8e0f7dd7e11c566 (diff)
downloadserverdata-3af9de993f36b69fb7da3c4eacae5e16a5fcc2ec.tar.gz
serverdata-3af9de993f36b69fb7da3c4eacae5e16a5fcc2ec.tar.bz2
serverdata-3af9de993f36b69fb7da3c4eacae5e16a5fcc2ec.tar.xz
serverdata-3af9de993f36b69fb7da3c4eacae5e16a5fcc2ec.zip
Merge branch 'master' into testserver
Diffstat (limited to 'npc')
-rw-r--r--npc/boss/throne.txt145
-rw-r--r--npc/functions/siege.txt29
-rw-r--r--npc/items/grenade.txt24
3 files changed, 187 insertions, 11 deletions
diff --git a/npc/boss/throne.txt b/npc/boss/throne.txt
index e8f375bff..c34cbf6cd 100644
--- a/npc/boss/throne.txt
+++ b/npc/boss/throne.txt
@@ -2,7 +2,7 @@
// Author:
// Jesusalva
// Description:
-// Monster King Throne
+// Monster King Throne ($@MK_CHALLENGE)
boss,45,45,0 script #monsterthrone NPC_HIDDEN,0,0,{
end;
@@ -14,4 +14,147 @@ OnTouch:
dispbottom "The throne is cursed, only the Monster King may seat on it.";
end;
+// Controls the Event
+OnBegin:
+ .CYCLES=0;
+ $@MK_CHALLENGE=true;
+ .MK=monster("boss", 45, 45, "The Monster King", MonsterKing, 1, .name$+"::OnVictory");
+ .@bhp=getunitdata(.MK, UDT_MAXHP);
+ setunitdata(.MK, UDT_MAXHP, .@bhp+50000+2000*.FAILS);
+ setunitdata(.MK, UDT_HP, .@bhp+50000+2000*.FAILS);
+
+ // Spawn reinforcements
+ .@mobId=MonsterLieutenant;
+ .@ts$="Lieutenant";
+ monster("boss", 40, 40, strmobinfo(1, .@mobId), .@mobId, 1, "#SiegeCtrl::On"+.@ts$+"Death");
+ monster("boss", 50, 50, strmobinfo(1, .@mobId), .@mobId, 1, "#SiegeCtrl::On"+.@ts$+"Death");
+ monster("boss", 40, 50, strmobinfo(1, .@mobId), .@mobId, 1, "#SiegeCtrl::On"+.@ts$+"Death");
+ monster("boss", 50, 40, strmobinfo(1, .@mobId), .@mobId, 1, "#SiegeCtrl::On"+.@ts$+"Death");
+
+ initnpctimer;
+ end;
+
+function CheckFinalAssault {
+ if (!siege_calcdiff(5)) {
+ kamibroadcast("You noobs, you all deserve to die!", "Monster King");
+ stopnpctimer;
+ $@MK_CHALLENGE=false;
+ // Clean Up
+ mapwarp("boss", "017-1", 120, 88);
+ killmonsterall("boss");
+ // Raise difficulty
+ .FAILS+=1;
+ // Halt execution
+ end;
+ }
+ return;
}
+
+OnTimer120000:
+ .CYCLES+=1;
+ //areamonster("boss", 20, 20, 70, 70, "Monster King Slave", );
+ // Spawn several monsters on the Boss Room every 2 minutes
+ siege_cast("boss", .name$, .FAILS, TP_TULIM|TP_HURNS|TP_NIVAL);
+ // Spawn an extra mini-boss at minutes: 10 and 30
+ if (.CYCLES == 5) {
+ .@mobId=MonsterColonel;
+ .@ts$="Colonel";
+ monster("boss", 45, 44, strmobinfo(1, .@mobId), .@mobId, 1, "#SiegeCtrl::On"+.@ts$+"Death");
+ }
+ if (.CYCLES == 15) {
+ .@mobId=MonsterGeneral;
+ .@ts$="General";
+ monster("boss", 45, 44, strmobinfo(1, .@mobId), .@mobId, 1, "#SiegeCtrl::On"+.@ts$+"Death");
+ }
+ initnpctimer;
+OnTimer15000:
+ // Each fail raise curse duration in 0.1s - chance of curse is 15% each 15s
+ if (rand2(100) <= 15) {
+ areasc2("boss", 45, 45, 25, 3000+(.FAILS*100), SC_CURSE, BL_PC | BL_HOM | BL_MER);
+ //globalmes("MSG");
+ unittalk(.MK, "Be cursed, you fools! I am the mighty Monster King!!");
+ }
+OnTimer5000:
+OnTimer10000:
+OnTimer20000:
+OnTimer25000:
+OnTimer30000:
+OnTimer35000:
+OnTimer40000:
+OnTimer45000:
+OnTimer50000:
+OnTimer55000:
+OnTimer60000:
+OnTimer65000:
+OnTimer70000:
+OnTimer75000:
+OnTimer80000:
+OnTimer85000:
+OnTimer90000:
+OnTimer95000:
+OnTimer100000:
+OnTimer105000:
+OnTimer110000:
+OnTimer115000:
+ CheckFinalAssault();
+ end;
+
+// Monster King was defeated - game won
+OnVictory:
+ // Not killed by a player? It doesn't counts, then
+ if (!playerattached())
+ end;
+ $@MK_CHALLENGE=false;
+ kamibroadcast("has just defeated the Monster King.", strcharinfo(0));
+ stopnpctimer;
+ mapwarp("boss", "017-1", 120, 88);
+ $GAME_STORYLINE=5;
+ // Without the Monster King to rule monsters... TODO Isbamuth
+ setbattleflag("monster_ai", 0x209);
+ setbattleflag("monster_active_enable", false);
+ setbattleflag("mob_count_rate", 25);
+ charcommand("@reloadbattleconf"); // Careful!
+ donpcevent("@exprate::OnReload");
+ donpcevent("@droprate::OnReload");
+ // Player Reward
+ getitembound(AegisShield, 1, 1);
+ dispbottom l("For defeating the Monster King, you've got the Legendary @@.", getitemlink(AegisShield));
+ dispbottom l("This item cannot be traded normally and is a Legendary Item.");
+ dispbottom l("You can transfer it with \"@grantpower\" command. Please contact a GM for more info.");
+ dispbottom l("Protip: If you plan in selling it, it's adviseable to ask for GM mediation.");
+ end;
+}
+
+// Room Traps, only against players
+boss,0,0,0 script #MKBossTrap01 NPC_TRAP,0,0,{
+ end;
+
+OnTouch:
+ SteelTrap(rand2(10, 20));
+ end;
+
+OnTimer10000:
+ stopnpctimer;
+ setnpctimer 0;
+ setnpcdisplay .name$, NPC_TRAP;
+ //end;
+ // Move the trap away after it disarms
+
+OnMinute14:
+OnMinute26:
+OnMinute40:
+OnMinute54:
+OnInit:
+ .@x=rand2(20,70);
+ .@y=rand2(20,70);
+ movenpc .name$, .@x, .@y;
+ end;
+}
+
+// Create more traps. (They can be on walls)
+boss,0,0,0 duplicate(#MKBossTrap01) #MKBossTrap02 NPC_TRAP,0,0
+boss,0,0,0 duplicate(#MKBossTrap01) #MKBossTrap03 NPC_TRAP,0,0
+boss,0,0,0 duplicate(#MKBossTrap01) #MKBossTrap04 NPC_TRAP,0,0
+boss,0,0,0 duplicate(#MKBossTrap01) #MKBossTrap05 NPC_TRAP,0,0
+
+
diff --git a/npc/functions/siege.txt b/npc/functions/siege.txt
index 95d16ebc2..baca59a63 100644
--- a/npc/functions/siege.txt
+++ b/npc/functions/siege.txt
@@ -18,22 +18,31 @@ function script siege_spawn {
}
// Calculate player average level
-// if highest is set, it will return highest player level, with minimum the value
-// passed. (A level "0" is clearly not valid, of course)
-// siege_calcdiff ( map{, highest_lvl} )
+// flag 1 - Don't count dead players
+// flag 2 - Return highest player level, instead of average.
+// flag 4 - Return the total sum of levels instead.
+// siege_calcdiff ( map{, flags} )
function script siege_calcdiff {
.@bsum=0;
- .@highest=getarg(1, false);
+ if (getarg(1,0) & 1)
+ .@deadcount=true;
+ if (getarg(1,0) & 2)
+ .@onlyhighest=true;
+ if (getarg(1,0) & 4)
+ .@onlytotal=true;
.@c = getunits(BL_PC, .@players, false, getarg(0));
.@skip=0;
// There is at least one player, do things properly
for (.@i = 0; .@i < .@c; .@i++) {
- /*
// Dead players are not counted
- if (ispcdead(strcharinfo(0, "", .@players[.@i])))
- continue;
- */
+ if (.@deadcount) {
+ if (ispcdead(strcharinfo(0, "", .@players[.@i]))) {
+ .@skip+=1;
+ continue;
+ }
+ }
+
.@b=readparam(BaseLevel, .@players[.@i]);
// GMs are not counted
@@ -53,8 +62,10 @@ function script siege_calcdiff {
//debugmes "calcdiff: Total %d Average %d Highest %d", .@bsum, (.@bsum/.@c), .@highest;
- if (getarg(1,false))
+ if (.@onlyhighest)
return .@highest;
+ else if (.@onlytotal)
+ return .@bsum;
else
return (.@bsum/.@c);
}
diff --git a/npc/items/grenade.txt b/npc/items/grenade.txt
index 0fdd5ea05..40959ad94 100644
--- a/npc/items/grenade.txt
+++ b/npc/items/grenade.txt
@@ -27,7 +27,7 @@ function script grenade {
}
// areasc(range, time, sc, bl) - defaults to 3x3 square, sleep mob for 500ms.
-// before was: smoke_grenade(). Valid BL: BL_MOB | BL_PC | BL_HOM | BL_MER
+// Need a player caster. Valid BL: BL_MOB | BL_PC | BL_HOM | BL_MER
function script areasc {
.@r=getarg(0, 3);
.@d=getarg(1, 500);
@@ -37,6 +37,28 @@ function script areasc {
getmapxy(.@m$, .@x, .@y, 0);
.@c=getunits(.@b, .@mbs, false, .@m$, .@x-.@r, .@y-.@r, .@x+.@r, .@y+.@r);
for (.@i = 0; .@i < .@c; .@i++) {
+ // Never target the caster
+ if (.@mbs[.@i] == getcharid(3))
+ continue;
+ sc_start .@s, .@d, 1, 10000, SCFLAG_NONE, .@mbs[.@i];
+ specialeffect(FX_BUFF, AREA, .@mbs[.@i]);
+ }
+ return;
+}
+
+// areasc2(map, x, y, {range, time, sc, bl}) - can be used by NPC
+// Valid BL: BL_MOB | BL_PC | BL_HOM | BL_MER
+function script areasc2 {
+ .@m$=getarg(0);
+ .@x=getarg(1);
+ .@y=getarg(2);
+ .@r=getarg(3, 3);
+ .@d=getarg(4, 500);
+ .@s=getarg(5, SC_SLEEP);
+ .@b=getarg(6, BL_MOB);
+
+ .@c=getunits(.@b, .@mbs, false, .@m$, .@x-.@r, .@y-.@r, .@x+.@r, .@y+.@r);
+ for (.@i = 0; .@i < .@c; .@i++) {
sc_start .@s, .@d, 1, 10000, SCFLAG_NONE, .@mbs[.@i];
specialeffect(FX_BUFF, AREA, .@mbs[.@i]);
}