summaryrefslogtreecommitdiff
path: root/world/map/npc/functions
diff options
context:
space:
mode:
Diffstat (limited to 'world/map/npc/functions')
-rw-r--r--world/map/npc/functions/doomsday.txt234
1 files changed, 183 insertions, 51 deletions
diff --git a/world/map/npc/functions/doomsday.txt b/world/map/npc/functions/doomsday.txt
index 7bd6fa9c..641bd6b0 100644
--- a/world/map/npc/functions/doomsday.txt
+++ b/world/map/npc/functions/doomsday.txt
@@ -199,6 +199,7 @@ OnJanitor:
// Check for our current doomsday state
OnInit:
setarray $@doomsday_mobs, 1140, 1141, 1143, 1140, 1141, 1143, 1140, 1141, 1143;
+ setarray $@doomsday_boss, 1146, 1147, 1146, 1147, 1146, 1147, 1146, 1147, 1146, 1147;
if ($DOOMSDAY == 1)
goto L_Doomsday1;
if ($DOOMSDAY == 2)
@@ -365,6 +366,10 @@ L_DDAdvanceWave:
if ($@DD_NUMWAVES > 6)
end; // TODO: Maybe a final wave announcement?
+ // Variable initialization
+ set $@DD_INT, 0;
+ set $@DD_UNITS, getmapusers($@DD_LOC$)+$DOOMSDAY_SCORE;
+
// Spawns
if ($@DoomsdayLoc == 0)
goto L_DD3Tulim;
@@ -386,7 +391,14 @@ L_DDAdvanceTimers:
// If we have more users than possible, waves come faster
L_DDAdvanceTimers2:
- setnpctimer (($@DD_UNITS*2-$@DD_INT)*500); // ±1 second per player
+ set $@ADD_TIME, (($@DD_UNITS*2-$@DD_INT)*500); // ±1 second per player/victory
+ // Cap to 90s (to prevent skipping first third)
+ if ($@ADD_TIME > 90000)
+ set $@ADD_TIME, 90000;
+
+ setnpctimer $@ADD_TIME;
+
+ set $@ADD_TIME, 0;
goto L_DDAdvanceWavePost;
// Clear temporary variables and broadcast
@@ -403,46 +415,43 @@ L_DDAdvanceWavePost:
// Tulimshar Siege points
L_DD3Tulim:
- set $@DD_INT, 0;
- set $@DD_UNITS, getmapusers($@DD_LOC$);
-
// Compulsory spawns
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "002-1", 98, 75, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "002-1", 97, 86, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
// Non-compulsory spawns
if ($@DD_INT >= $@DD_UNITS*2) goto L_DDAdvanceTimers;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "002-1", 91, 99, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
if ($@DD_INT >= $@DD_UNITS*2) goto L_DDAdvanceTimers;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "002-1", 75, 104, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
if ($@DD_INT >= $@DD_UNITS*2) goto L_DDAdvanceTimers;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "002-1", 56, 81, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
if ($@DD_INT >= $@DD_UNITS*2) goto L_DDAdvanceTimers;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "002-1", 44, 63, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
if ($@DD_INT >= $@DD_UNITS*2) goto L_DDAdvanceTimers;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "002-1", 76, 76, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
if ($@DD_INT >= $@DD_UNITS*2) goto L_DDAdvanceTimers;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "002-1", 54, 96, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
@@ -453,46 +462,43 @@ L_DD3Tulim:
// Hurnscald Siege points
L_DD3Hurns:
- set $@DD_INT, 0;
- set $@DD_UNITS, getmapusers($@DD_LOC$);
-
// Compulsory spawns
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "018-1", 138, 63, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "018-1", 136, 71, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
// Non-compulsory spawns
if ($@DD_INT >= $@DD_UNITS*2) goto L_DDAdvanceTimers;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "018-1", 133, 79, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
if ($@DD_INT >= $@DD_UNITS*2) goto L_DDAdvanceTimers;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "018-1", 111, 74, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
if ($@DD_INT >= $@DD_UNITS*2) goto L_DDAdvanceTimers;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "018-1", 94, 75, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
if ($@DD_INT >= $@DD_UNITS*2) goto L_DDAdvanceTimers;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "018-1", 79, 64, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
if ($@DD_INT >= $@DD_UNITS*2) goto L_DDAdvanceTimers;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "018-1", 67, 82, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
if ($@DD_INT >= $@DD_UNITS*2) goto L_DDAdvanceTimers;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "018-1", 88, 90, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
@@ -503,46 +509,43 @@ L_DD3Hurns:
// Nivalis Siege points
L_DD3Nival:
- set $@DD_INT, 0;
- set $@DD_UNITS, getmapusers($@DD_LOC$);
-
// Compulsory spawns
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "031-1", 44, 55, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "031-1", 62, 49, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
// Non-compulsory spawns
if ($@DD_INT >= $@DD_UNITS*2) goto L_DDAdvanceTimers;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "031-1", 63, 61, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
if ($@DD_INT >= $@DD_UNITS*2) goto L_DDAdvanceTimers;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "031-1", 56, 83, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
if ($@DD_INT >= $@DD_UNITS*2) goto L_DDAdvanceTimers;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "031-1", 70, 41, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
if ($@DD_INT >= $@DD_UNITS*2) goto L_DDAdvanceTimers;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "031-1", 36, 37, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
if ($@DD_INT >= $@DD_UNITS*2) goto L_DDAdvanceTimers;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "031-1", 62, 26, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
if ($@DD_INT >= $@DD_UNITS*2) goto L_DDAdvanceTimers;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "031-1", 85, 30, "", $@doomsday_mobs[$@DD_IDX], 1, "Doomsday::OnDeathAct3";
set $@DD_INT, $@DD_INT+1;
@@ -552,6 +555,117 @@ L_DD3Nival:
+// Extra wave control system [0]
+S_DD3ThirdSpawns:
+ set $@DD_IDX1, rand(getarraysize($@DD_XPOS));
+ set $@DD_IDX2, rand(getarraysize($@doomsday_mobs));
+
+ monster $@DD_LOC$, $@DD_XPOS[$@DD_IDX1], $@DD_YPOS[$@DD_IDX1], "", $@doomsday_mobs[$@DD_IDX2], 1, "Doomsday::OnDeathAct3";
+
+ set $@DD_INT, $@DD_INT+1;
+ if($@DD_INT < $@DD_UNITS) goto S_DD3ThirdSpawns;
+ return;
+
+// Extra wave control system [1]
+L_DD3FirstThird:
+ set $@DD_UNITS, getmapusers($@DD_LOC$)-mobcount($@DD_LOC$, "Doomsday::OnDeathAct3")+1;
+ set $@DD_INT, 0;
+
+ // Difficulty adjustment: Invoke -1 mob per player and +1 mob per 2 score points
+ set $@DD_UNITS, $@DD_UNITS-getmapusers($@DD_LOC$)+($DOOMSDAY_SCORE/2);
+
+ // Monsters already overpower players
+ if ($@DD_UNITS < 0)
+ goto L_DD3EndThird;
+
+ // Tulimshar
+ if ($@DoomsdayLoc == 0)
+ setarray $@DD_XPOS, 98, 97, 91, 75, 56, 44, 76, 54;
+ if ($@DoomsdayLoc == 0)
+ setarray $@DD_YPOS, 75, 86, 99,104, 81, 63, 76, 96;
+
+ // Hurnscald
+ if ($@DoomsdayLoc == 1)
+ setarray $@DD_XPOS,138,136,133,111, 95, 79, 67, 88;
+ if ($@DoomsdayLoc == 1)
+ setarray $@DD_YPOS, 63, 71, 79, 74, 75, 64, 82, 90;
+
+ // Nivalis
+ if ($@DoomsdayLoc == 2)
+ setarray $@DD_XPOS, 44, 62, 63, 56, 70, 36, 62, 85;
+ if ($@DoomsdayLoc == 2)
+ setarray $@DD_YPOS, 55, 49, 61, 83, 41, 37, 26, 30;
+
+ // Prepare optional boss
+ set $@DD_IDX1, rand(getarraysize($@DD_XPOS));
+ set $@DD_IDX2, rand(getarraysize($@doomsday_boss));
+
+ // Spawn optional boss
+ if ($@DD_NUMWAVES == 5 && $DOOMSDAY_SCORE > 6)
+ monster $@DD_LOC$, $@DD_XPOS[$@DD_IDX1], $@DD_YPOS[$@DD_IDX1], "", $@doomsday_boss[$@DD_IDX2], 1, "Doomsday::OnDeathAct3";
+
+ // Spawn first third's wave
+ callsub S_DD3ThirdSpawns;
+ goto L_DD3EndThird;
+
+// Extra wave control system [2]
+L_DD3SecondThird:
+ set $@DD_UNITS, getmapusers($@DD_LOC$)-mobcount($@DD_LOC$, "Doomsday::OnDeathAct3")+1;
+ set $@DD_INT, 0;
+
+ // Intensity control
+ if ($DOOMSDAY_SCORE < 12)
+ goto L_DD3EndThird;
+
+ // Difficulty adjustment: Invoke -1 mob per player and +1 mob per 3 score points
+ set $@DD_UNITS, $@DD_UNITS-getmapusers($@DD_LOC$)+($DOOMSDAY_SCORE/3);
+
+ // Tulimshar
+ if ($@DoomsdayLoc == 0)
+ setarray $@DD_XPOS, 98, 97, 91, 75, 56, 44, 76, 54;
+ if ($@DoomsdayLoc == 0)
+ setarray $@DD_YPOS, 75, 86, 99,104, 81, 63, 76, 96;
+
+ // Hurnscald
+ if ($@DoomsdayLoc == 1)
+ setarray $@DD_XPOS,138,136,133,111, 95, 79, 67, 88;
+ if ($@DoomsdayLoc == 1)
+ setarray $@DD_YPOS, 63, 71, 79, 74, 75, 64, 82, 90;
+
+ // Nivalis
+ if ($@DoomsdayLoc == 2)
+ setarray $@DD_XPOS, 44, 62, 63, 56, 70, 36, 62, 85;
+ if ($@DoomsdayLoc == 2)
+ setarray $@DD_YPOS, 55, 49, 61, 83, 41, 37, 26, 30;
+
+ // Prepare optional boss
+ set $@DD_IDX1, rand(getarraysize($@DD_XPOS));
+ set $@DD_IDX2, rand(getarraysize($@doomsday_boss));
+
+ // Spawn optional boss
+ if ($@DD_NUMWAVES == 5)
+ monster $@DD_LOC$, $@DD_XPOS[$@DD_IDX1], $@DD_YPOS[$@DD_IDX1], "", $@doomsday_boss[$@DD_IDX2], 1, "Doomsday::OnDeathAct3";
+
+ // Monsters already overpower players
+ if ($@DD_UNITS < 0)
+ goto L_DD3EndThird;
+
+ // Spawn second third's wave
+ callsub S_DD3ThirdSpawns;
+ goto L_DD3EndThird;
+
+// Extra wave control system [3]
+L_DD3EndThird:
+ set $@DD_UNITS, 0;
+ set $@DD_IDX1, 0;
+ set $@DD_IDX2, 0;
+ set $@DD_INT, 0;
+ cleararray $@DD_XPOS, 0, 8;
+ cleararray $@DD_YPOS, 0, 8;
+ end;
+
+
+
// Timer controls (5 minutes between waves);
// It only fires after first wave
L_TimerCheck2:
@@ -572,7 +686,7 @@ L_Doomsday3Defeat:
mapannounce $@DD_LOC$, "Jande : Oh noes, "+$@DoomsdayMc+" monsters passed the barricate!!", 0;
// Move the monsters to town
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
if ($@DoomsdayLoc == 0)
areamonster "001-1", 52, 35, 119, 113, "", $@doomsday_mobs[$@DD_IDX], $@DoomsdayMc;
if ($@DoomsdayLoc == 1)
@@ -587,8 +701,8 @@ L_Doomsday3Defeat:
// Siege was cleared up
L_Doomsday3Victory:
- mapannounce $@DD_LOC$, "Jande : That was a close call, but we did it! We defended "+$DOOMSDAY_SCORE+" times.", 0;
set $DOOMSDAY_SCORE, $DOOMSDAY_SCORE+1;
+ mapannounce $@DD_LOC$, "Jande : That was a close call, but we did it! We defended "+$DOOMSDAY_SCORE+" times.", 0;
goto L_Doomsday3Cleanup;
// Clean up temporary variables (except skip)
@@ -602,31 +716,49 @@ L_Doomsday3Cleanup:
// Bonus spawn
L_Doomsday3Bonus:
- announce "Jande: Stray minions from Zax De'Kagen were sighted all over the world!", 0;
+ announce "Jande: Stray minions from Zax De'Kagen army were sighted all over the world!", 0;
+ set $@DD_UNITS, 2+($DOOMSDAY_SCORE/5);
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ // Cap value (to prevent huge spikes)
+ if ($@DD_UNITS > 5)
+ set $@DD_UNITS, 3+($DOOMSDAY_SCORE/10);
+
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "031-1", 62, 49, "", $@doomsday_mobs[$@DD_IDX], 1;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "018-1", 136, 71, "", $@doomsday_mobs[$@DD_IDX], 1;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
monster "002-1", 97, 86, "", $@doomsday_mobs[$@DD_IDX], 1;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
areamonster "017-1", 169, 49, 198, 77, "", $@doomsday_mobs[$@DD_IDX], 1;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
- areamonster "012-1", 20, 47, 74, 77, "", $@doomsday_mobs[$@DD_IDX], 2;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
- areamonster "057-1", 115, 50, 140, 75, "", $@doomsday_mobs[$@DD_IDX], 2;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
- areamonster "046-1", 58, 49, 92, 70, "", $@doomsday_mobs[$@DD_IDX], 2;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
- areamonster "034-1", 83, 51, 121, 98, "", $@doomsday_mobs[$@DD_IDX], 2;
- setarray $@DD_IDX, rand(getarraysize($@doomsday_mobs));
- areamonster "003-4", 20, 20, 85, 60, "", $@doomsday_mobs[$@DD_IDX], 2;
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ areamonster "012-1", 20, 47, 74, 77, "", $@doomsday_mobs[$@DD_IDX], $@DD_UNITS;
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ areamonster "057-1", 115, 50, 140, 75, "", $@doomsday_mobs[$@DD_IDX], $@DD_UNITS;
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ areamonster "046-1", 58, 49, 92, 70, "", $@doomsday_mobs[$@DD_IDX], $@DD_UNITS;
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ areamonster "034-1", 83, 51, 121, 98, "", $@doomsday_mobs[$@DD_IDX], $@DD_UNITS;
+ set $@DD_IDX, rand(getarraysize($@doomsday_mobs));
+ areamonster "003-4", 20, 20, 85, 60, "", $@doomsday_mobs[$@DD_IDX], $@DD_UNITS;
+
+ set $@DD_UNITS, 0;
+ set $@DD_IDX, 0;
end;
////////////////////////////////////////////////////////////////////////////////
// Respawn logic (5 minutes)
+OnTimer100000:
+ if ($DOOMSDAY == 2)
+ goto L_DD3FirstThird;
+ end;
+
+OnTimer200000:
+ if ($DOOMSDAY == 2)
+ goto L_DD3SecondThird;
+ end;
+
OnTimer300000:
if ($DOOMSDAY == 1)
goto L_Doomsday1Respawn;