diff options
author | Jesusaves <jesusalva@themanaworld.org> | 2020-04-13 04:52:44 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-13 07:52:44 +0000 |
commit | d0ce35ecaa36c2908070645bfa6d616fffbc7030 (patch) | |
tree | 19d13ba8490218964ee7ef0e863024289b2038bd /world/map/npc | |
parent | 59919f9f1b0f47fde4248746cf78ba8a7d843d2b (diff) | |
download | serverdata-d0ce35ecaa36c2908070645bfa6d616fffbc7030.tar.gz serverdata-d0ce35ecaa36c2908070645bfa6d616fffbc7030.tar.bz2 serverdata-d0ce35ecaa36c2908070645bfa6d616fffbc7030.tar.xz serverdata-d0ce35ecaa36c2908070645bfa6d616fffbc7030.zip |
Doomsday 3 Additional Patches (#553)
The core I've wrote was too primitive and was not be able to handle the heat of TMW playerbase.
This new one is more sturdy, more flexible, more scalable.
It also redefines the siege rules, logic and mechanics after a few sieges, and spawn amounts is based on players around and number of victories.
Should be much more fun than the previous core.
* Add two new monsters for Doomsday Act 3: Flashmob and Koyntety.
Both are "boss" which Kage may use at their own whim.
72000 experience, 27k HP, one attacks and walks fast, other is ranged high DPS.
Drops:
Chocolate Bar: 100.00%
Enchanter Amulet: 0.35%
Black Evoker Robe: 0.05%
White Evoker Robe: 0.05%
Apprentice Robe: 0.05%
Flawed Lens: 0.02%
Paladin's Helmet: 0.02%
A siege may contain only two boss at most. The time fastforward is still in effect.
Spawn stage last 25 minutes in total, overrun is checked 45 minutes later.
This means players have 20 minutes after siege spawns are concluded to clean
up the area. More players cause more difficult sieges, but beware:
This primitive difficulty barment logic is the opposite!
Every 1.5 siege victories (=a whole day), it expects +1 player in combat.
Diffstat (limited to 'world/map/npc')
-rw-r--r-- | world/map/npc/functions/doomsday.txt | 234 |
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; |