1711 lines
52 KiB
C#
1711 lines
52 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: Terraria.GameContent.Events.DD2Event
|
|
// Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null
|
|
// MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83
|
|
// Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe
|
|
|
|
using Microsoft.Xna.Framework;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using Terraria.Chat;
|
|
using Terraria.Graphics.Effects;
|
|
using Terraria.ID;
|
|
using Terraria.Localization;
|
|
using Terraria.WorldBuilding;
|
|
|
|
namespace Terraria.GameContent.Events
|
|
{
|
|
public class DD2Event
|
|
{
|
|
private static readonly Color INFO_NEW_WAVE_COLOR = new Color(175, 55, (int) byte.MaxValue);
|
|
private static readonly Color INFO_START_INVASION_COLOR = new Color(50, (int) byte.MaxValue, 130);
|
|
private const int INVASION_ID = 3;
|
|
public static bool DownedInvasionT1;
|
|
public static bool DownedInvasionT2;
|
|
public static bool DownedInvasionT3;
|
|
public static bool LostThisRun;
|
|
public static bool WonThisRun;
|
|
public static int LaneSpawnRate = 60;
|
|
private static bool _downedDarkMageT1;
|
|
private static bool _downedOgreT2;
|
|
private static bool _spawnedBetsyT3;
|
|
public static bool Ongoing;
|
|
public static Microsoft.Xna.Framework.Rectangle ArenaHitbox;
|
|
private static int _arenaHitboxingCooldown;
|
|
public static int OngoingDifficulty;
|
|
private static List<Vector2> _deadGoblinSpots = new List<Vector2>();
|
|
private static int _crystalsDropping_lastWave;
|
|
private static int _crystalsDropping_toDrop;
|
|
private static int _crystalsDropping_alreadyDropped;
|
|
private static int _timeLeftUntilSpawningBegins;
|
|
|
|
public static bool ReadyToFindBartender => NPC.downedBoss2;
|
|
|
|
public static bool DownedInvasionAnyDifficulty => DD2Event.DownedInvasionT1 || DD2Event.DownedInvasionT2 || DD2Event.DownedInvasionT3;
|
|
|
|
public static int TimeLeftBetweenWaves
|
|
{
|
|
get => DD2Event._timeLeftUntilSpawningBegins;
|
|
set => DD2Event._timeLeftUntilSpawningBegins = value;
|
|
}
|
|
|
|
public static bool EnemySpawningIsOnHold => (uint) DD2Event._timeLeftUntilSpawningBegins > 0U;
|
|
|
|
public static bool EnemiesShouldChasePlayers => DD2Event.Ongoing || true;
|
|
|
|
public static void Save(BinaryWriter writer)
|
|
{
|
|
writer.Write(DD2Event.DownedInvasionT1);
|
|
writer.Write(DD2Event.DownedInvasionT2);
|
|
writer.Write(DD2Event.DownedInvasionT3);
|
|
}
|
|
|
|
public static void Load(BinaryReader reader, int gameVersionNumber)
|
|
{
|
|
if (gameVersionNumber < 178)
|
|
{
|
|
NPC.savedBartender = false;
|
|
DD2Event.ResetProgressEntirely();
|
|
}
|
|
else
|
|
{
|
|
NPC.savedBartender = reader.ReadBoolean();
|
|
DD2Event.DownedInvasionT1 = reader.ReadBoolean();
|
|
DD2Event.DownedInvasionT2 = reader.ReadBoolean();
|
|
DD2Event.DownedInvasionT3 = reader.ReadBoolean();
|
|
}
|
|
}
|
|
|
|
public static void ResetProgressEntirely()
|
|
{
|
|
int num;
|
|
DD2Event.DownedInvasionT3 = (num = 0) != 0;
|
|
DD2Event.DownedInvasionT2 = num != 0;
|
|
DD2Event.DownedInvasionT1 = num != 0;
|
|
DD2Event.Ongoing = false;
|
|
DD2Event.ArenaHitbox = new Microsoft.Xna.Framework.Rectangle();
|
|
DD2Event._arenaHitboxingCooldown = 0;
|
|
DD2Event._timeLeftUntilSpawningBegins = 0;
|
|
}
|
|
|
|
public static void ReportEventProgress()
|
|
{
|
|
int currentWave;
|
|
int requiredKillCount;
|
|
int currentKillCount;
|
|
DD2Event.GetInvasionStatus(out currentWave, out requiredKillCount, out currentKillCount);
|
|
Main.ReportInvasionProgress(currentKillCount, requiredKillCount, 3, currentWave);
|
|
}
|
|
|
|
public static void SyncInvasionProgress(int toWho)
|
|
{
|
|
int currentWave;
|
|
int requiredKillCount;
|
|
int currentKillCount;
|
|
DD2Event.GetInvasionStatus(out currentWave, out requiredKillCount, out currentKillCount);
|
|
NetMessage.SendData(78, toWho, number: currentKillCount, number2: ((float) requiredKillCount), number3: 3f, number4: ((float) currentWave));
|
|
}
|
|
|
|
public static void SpawnNPC(ref int newNPC)
|
|
{
|
|
}
|
|
|
|
public static void UpdateTime()
|
|
{
|
|
if (!DD2Event.Ongoing && !Main.dedServ)
|
|
{
|
|
Filters.Scene.Deactivate("CrystalDestructionVortex");
|
|
Filters.Scene.Deactivate("CrystalDestructionColor");
|
|
Filters.Scene.Deactivate("CrystalWin");
|
|
}
|
|
else
|
|
{
|
|
if (Main.netMode != 1 && !NPC.AnyNPCs(548))
|
|
DD2Event.StopInvasion();
|
|
if (Main.netMode == 1)
|
|
{
|
|
if (DD2Event._timeLeftUntilSpawningBegins > 0)
|
|
--DD2Event._timeLeftUntilSpawningBegins;
|
|
if (DD2Event._timeLeftUntilSpawningBegins >= 0)
|
|
return;
|
|
DD2Event._timeLeftUntilSpawningBegins = 0;
|
|
}
|
|
else
|
|
{
|
|
if (DD2Event._timeLeftUntilSpawningBegins > 0)
|
|
{
|
|
--DD2Event._timeLeftUntilSpawningBegins;
|
|
if (DD2Event._timeLeftUntilSpawningBegins == 0)
|
|
{
|
|
int currentWave;
|
|
int requiredKillCount;
|
|
int currentKillCount;
|
|
DD2Event.GetInvasionStatus(out currentWave, out requiredKillCount, out currentKillCount);
|
|
WorldGen.BroadcastText(Lang.GetInvasionWaveText(currentWave, DD2Event.GetEnemiesForWave(currentWave)), DD2Event.INFO_NEW_WAVE_COLOR);
|
|
if (currentWave == 7 && DD2Event.OngoingDifficulty == 3)
|
|
DD2Event.SummonBetsy();
|
|
if (Main.netMode != 1)
|
|
Main.ReportInvasionProgress(currentKillCount, requiredKillCount, 3, currentWave);
|
|
if (Main.netMode == 2)
|
|
NetMessage.SendData(78, number: Main.invasionProgress, number2: ((float) Main.invasionProgressMax), number3: 3f, number4: ((float) currentWave));
|
|
}
|
|
}
|
|
if (DD2Event._timeLeftUntilSpawningBegins >= 0)
|
|
return;
|
|
DD2Event._timeLeftUntilSpawningBegins = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void StartInvasion(int difficultyOverride = -1)
|
|
{
|
|
if (Main.netMode == 1)
|
|
return;
|
|
DD2Event._crystalsDropping_toDrop = 0;
|
|
DD2Event._crystalsDropping_alreadyDropped = 0;
|
|
DD2Event._crystalsDropping_lastWave = 0;
|
|
DD2Event._timeLeftUntilSpawningBegins = 0;
|
|
DD2Event.Ongoing = true;
|
|
DD2Event.FindProperDifficulty();
|
|
if (difficultyOverride != -1)
|
|
DD2Event.OngoingDifficulty = difficultyOverride;
|
|
DD2Event._deadGoblinSpots.Clear();
|
|
DD2Event._downedDarkMageT1 = false;
|
|
DD2Event._downedOgreT2 = false;
|
|
DD2Event._spawnedBetsyT3 = false;
|
|
DD2Event.LostThisRun = false;
|
|
DD2Event.WonThisRun = false;
|
|
NPC.waveKills = 0.0f;
|
|
NPC.waveNumber = 1;
|
|
DD2Event.ClearAllTowersInGame();
|
|
WorldGen.BroadcastText(NetworkText.FromKey("DungeonDefenders2.InvasionStart"), DD2Event.INFO_START_INVASION_COLOR);
|
|
NetMessage.SendData(7);
|
|
if (Main.netMode != 1)
|
|
Main.ReportInvasionProgress(0, 1, 3, 1);
|
|
if (Main.netMode == 2)
|
|
NetMessage.SendData(78, number2: 1f, number3: 3f, number4: 1f);
|
|
DD2Event.SetEnemySpawningOnHold(300);
|
|
DD2Event.WipeEntities();
|
|
}
|
|
|
|
public static void StopInvasion(bool win = false)
|
|
{
|
|
if (!DD2Event.Ongoing)
|
|
return;
|
|
if (win)
|
|
DD2Event.WinInvasionInternal();
|
|
DD2Event.Ongoing = false;
|
|
DD2Event._deadGoblinSpots.Clear();
|
|
if (Main.netMode == 1)
|
|
return;
|
|
NPC.waveKills = 0.0f;
|
|
NPC.waveNumber = 0;
|
|
DD2Event.WipeEntities();
|
|
NetMessage.SendData(7);
|
|
}
|
|
|
|
private static void WinInvasionInternal()
|
|
{
|
|
if (DD2Event.OngoingDifficulty >= 1)
|
|
DD2Event.DownedInvasionT1 = true;
|
|
if (DD2Event.OngoingDifficulty >= 2)
|
|
DD2Event.DownedInvasionT2 = true;
|
|
if (DD2Event.OngoingDifficulty >= 3)
|
|
DD2Event.DownedInvasionT3 = true;
|
|
if (DD2Event.OngoingDifficulty == 1)
|
|
DD2Event.DropMedals(3);
|
|
if (DD2Event.OngoingDifficulty == 2)
|
|
DD2Event.DropMedals(15);
|
|
if (DD2Event.OngoingDifficulty == 3)
|
|
DD2Event.DropMedals(60);
|
|
WorldGen.BroadcastText(NetworkText.FromKey("DungeonDefenders2.InvasionWin"), DD2Event.INFO_START_INVASION_COLOR);
|
|
}
|
|
|
|
public static bool ReadyForTier2 => Main.hardMode && NPC.downedMechBossAny;
|
|
|
|
public static bool ReadyForTier3 => Main.hardMode && NPC.downedGolemBoss;
|
|
|
|
private static void FindProperDifficulty()
|
|
{
|
|
DD2Event.OngoingDifficulty = 1;
|
|
if (DD2Event.ReadyForTier2)
|
|
DD2Event.OngoingDifficulty = 2;
|
|
if (!DD2Event.ReadyForTier3)
|
|
return;
|
|
DD2Event.OngoingDifficulty = 3;
|
|
}
|
|
|
|
public static void CheckProgress(int slainMonsterID)
|
|
{
|
|
if (Main.netMode == 1 || !DD2Event.Ongoing || DD2Event.LostThisRun || DD2Event.WonThisRun || DD2Event.EnemySpawningIsOnHold)
|
|
return;
|
|
int currentWave;
|
|
int requiredKillCount;
|
|
int currentKillCount;
|
|
DD2Event.GetInvasionStatus(out currentWave, out requiredKillCount, out currentKillCount);
|
|
float monsterPointsWorth = (float) DD2Event.GetMonsterPointsWorth(slainMonsterID);
|
|
float waveKills = NPC.waveKills;
|
|
NPC.waveKills += monsterPointsWorth;
|
|
currentKillCount += (int) monsterPointsWorth;
|
|
bool flag = false;
|
|
int progressWave = currentWave;
|
|
if ((double) NPC.waveKills >= (double) requiredKillCount && requiredKillCount != 0)
|
|
{
|
|
NPC.waveKills = 0.0f;
|
|
++NPC.waveNumber;
|
|
flag = true;
|
|
DD2Event.GetInvasionStatus(out currentWave, out requiredKillCount, out currentKillCount, true);
|
|
if (DD2Event.WonThisRun)
|
|
{
|
|
if ((double) currentKillCount == (double) waveKills || (double) monsterPointsWorth == 0.0)
|
|
return;
|
|
if (Main.netMode != 1)
|
|
Main.ReportInvasionProgress(currentKillCount, requiredKillCount, 3, currentWave);
|
|
if (Main.netMode != 2)
|
|
return;
|
|
NetMessage.SendData(78, number: Main.invasionProgress, number2: ((float) Main.invasionProgressMax), number3: 3f, number4: ((float) currentWave));
|
|
return;
|
|
}
|
|
int num = currentWave;
|
|
WorldGen.BroadcastText(NetworkText.FromKey("DungeonDefenders2.WaveComplete"), DD2Event.INFO_NEW_WAVE_COLOR);
|
|
DD2Event.SetEnemySpawningOnHold(1800);
|
|
if (DD2Event.OngoingDifficulty == 1)
|
|
{
|
|
if (num == 5)
|
|
DD2Event.DropMedals(1);
|
|
if (num == 4)
|
|
DD2Event.DropMedals(1);
|
|
}
|
|
if (DD2Event.OngoingDifficulty == 2)
|
|
{
|
|
if (num == 7)
|
|
DD2Event.DropMedals(6);
|
|
if (num == 6)
|
|
DD2Event.DropMedals(3);
|
|
if (num == 5)
|
|
DD2Event.DropMedals(1);
|
|
}
|
|
if (DD2Event.OngoingDifficulty == 3)
|
|
{
|
|
if (num == 7)
|
|
DD2Event.DropMedals(25);
|
|
if (num == 6)
|
|
DD2Event.DropMedals(11);
|
|
if (num == 5)
|
|
DD2Event.DropMedals(3);
|
|
if (num == 4)
|
|
DD2Event.DropMedals(1);
|
|
}
|
|
}
|
|
if ((double) currentKillCount == (double) waveKills)
|
|
return;
|
|
if (flag)
|
|
{
|
|
int num = 1;
|
|
int progressMax = 1;
|
|
if (Main.netMode != 1)
|
|
Main.ReportInvasionProgress(num, progressMax, 3, progressWave);
|
|
if (Main.netMode != 2)
|
|
return;
|
|
NetMessage.SendData(78, number: num, number2: ((float) progressMax), number3: 3f, number4: ((float) progressWave));
|
|
}
|
|
else
|
|
{
|
|
if (Main.netMode != 1)
|
|
Main.ReportInvasionProgress(currentKillCount, requiredKillCount, 3, currentWave);
|
|
if (Main.netMode != 2)
|
|
return;
|
|
NetMessage.SendData(78, number: Main.invasionProgress, number2: ((float) Main.invasionProgressMax), number3: 3f, number4: ((float) currentWave));
|
|
}
|
|
}
|
|
|
|
public static void StartVictoryScene()
|
|
{
|
|
DD2Event.WonThisRun = true;
|
|
int firstNpc = NPC.FindFirstNPC(548);
|
|
if (firstNpc == -1)
|
|
return;
|
|
Main.npc[firstNpc].ai[1] = 2f;
|
|
Main.npc[firstNpc].ai[0] = 2f;
|
|
Main.npc[firstNpc].netUpdate = true;
|
|
for (int index = 0; index < 200; ++index)
|
|
{
|
|
if (Main.npc[index] != null && Main.npc[index].active && Main.npc[index].type == 549)
|
|
{
|
|
Main.npc[index].ai[0] = 0.0f;
|
|
Main.npc[index].ai[1] = 1f;
|
|
Main.npc[index].netUpdate = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void ReportLoss()
|
|
{
|
|
DD2Event.LostThisRun = true;
|
|
DD2Event.SetEnemySpawningOnHold(30);
|
|
}
|
|
|
|
private static void GetInvasionStatus(
|
|
out int currentWave,
|
|
out int requiredKillCount,
|
|
out int currentKillCount,
|
|
bool currentlyInCheckProgress = false)
|
|
{
|
|
currentWave = NPC.waveNumber;
|
|
requiredKillCount = 10;
|
|
currentKillCount = (int) NPC.waveKills;
|
|
switch (DD2Event.OngoingDifficulty)
|
|
{
|
|
case 2:
|
|
requiredKillCount = DD2Event.Difficulty_2_GetRequiredWaveKills(ref currentWave, ref currentKillCount, currentlyInCheckProgress);
|
|
break;
|
|
case 3:
|
|
requiredKillCount = DD2Event.Difficulty_3_GetRequiredWaveKills(ref currentWave, ref currentKillCount, currentlyInCheckProgress);
|
|
break;
|
|
default:
|
|
requiredKillCount = DD2Event.Difficulty_1_GetRequiredWaveKills(ref currentWave, ref currentKillCount, currentlyInCheckProgress);
|
|
break;
|
|
}
|
|
}
|
|
|
|
private static short[] GetEnemiesForWave(int wave)
|
|
{
|
|
switch (DD2Event.OngoingDifficulty)
|
|
{
|
|
case 2:
|
|
return DD2Event.Difficulty_2_GetEnemiesForWave(wave);
|
|
case 3:
|
|
return DD2Event.Difficulty_3_GetEnemiesForWave(wave);
|
|
default:
|
|
return DD2Event.Difficulty_1_GetEnemiesForWave(wave);
|
|
}
|
|
}
|
|
|
|
private static int GetMonsterPointsWorth(int slainMonsterID)
|
|
{
|
|
switch (DD2Event.OngoingDifficulty)
|
|
{
|
|
case 2:
|
|
return DD2Event.Difficulty_2_GetMonsterPointsWorth(slainMonsterID);
|
|
case 3:
|
|
return DD2Event.Difficulty_3_GetMonsterPointsWorth(slainMonsterID);
|
|
default:
|
|
return DD2Event.Difficulty_1_GetMonsterPointsWorth(slainMonsterID);
|
|
}
|
|
}
|
|
|
|
public static void SpawnMonsterFromGate(Vector2 gateBottom)
|
|
{
|
|
switch (DD2Event.OngoingDifficulty)
|
|
{
|
|
case 2:
|
|
DD2Event.Difficulty_2_SpawnMonsterFromGate(gateBottom);
|
|
break;
|
|
case 3:
|
|
DD2Event.Difficulty_3_SpawnMonsterFromGate(gateBottom);
|
|
break;
|
|
default:
|
|
DD2Event.Difficulty_1_SpawnMonsterFromGate(gateBottom);
|
|
break;
|
|
}
|
|
}
|
|
|
|
public static void SummonCrystal(int x, int y)
|
|
{
|
|
if (Main.netMode == 1)
|
|
NetMessage.SendData(113, number: x, number2: ((float) y));
|
|
else
|
|
DD2Event.SummonCrystalDirect(x, y);
|
|
}
|
|
|
|
public static void SummonCrystalDirect(int x, int y)
|
|
{
|
|
if (NPC.AnyNPCs(548))
|
|
return;
|
|
Tile tileSafely = Framing.GetTileSafely(x, y);
|
|
if (!tileSafely.active() || tileSafely.type != (ushort) 466)
|
|
return;
|
|
Point point = new Point(x * 16, y * 16);
|
|
point.X -= (int) tileSafely.frameX / 18 * 16;
|
|
point.Y -= (int) tileSafely.frameY / 18 * 16;
|
|
point.X += 40;
|
|
point.Y += 64;
|
|
DD2Event.StartInvasion();
|
|
NPC.NewNPC(point.X, point.Y, 548);
|
|
DD2Event.DropStarterCrystals();
|
|
}
|
|
|
|
public static bool WouldFailSpawningHere(int x, int y)
|
|
{
|
|
Point xLeftEnd;
|
|
Point xRightEnd;
|
|
StrayMethods.CheckArenaScore(new Point(x, y).ToWorldCoordinates(), out xLeftEnd, out xRightEnd);
|
|
int num1 = xRightEnd.X - x;
|
|
int num2 = x - xLeftEnd.X;
|
|
return num1 < 60 || num2 < 60;
|
|
}
|
|
|
|
public static void FailureMessage(int client)
|
|
{
|
|
LocalizedText text = Language.GetText("DungeonDefenders2.BartenderWarning");
|
|
Color color = new Color((int) byte.MaxValue, (int) byte.MaxValue, 0);
|
|
if (Main.netMode == 2)
|
|
ChatHelper.SendChatMessageToClient(NetworkText.FromKey(text.Key), color, client);
|
|
else
|
|
Main.NewText(text.Value, color.R, color.G, color.B);
|
|
}
|
|
|
|
public static void WipeEntities()
|
|
{
|
|
DD2Event.ClearAllTowersInGame();
|
|
DD2Event.ClearAllDD2HostilesInGame();
|
|
DD2Event.ClearAllDD2EnergyCrystalsInChests();
|
|
if (Main.netMode != 2)
|
|
return;
|
|
NetMessage.SendData(114);
|
|
}
|
|
|
|
public static void ClearAllTowersInGame()
|
|
{
|
|
for (int index = 0; index < 1000; ++index)
|
|
{
|
|
if (Main.projectile[index].active && ProjectileID.Sets.IsADD2Turret[Main.projectile[index].type])
|
|
Main.projectile[index].Kill();
|
|
}
|
|
}
|
|
|
|
public static void ClearAllDD2HostilesInGame()
|
|
{
|
|
for (int number = 0; number < 200; ++number)
|
|
{
|
|
if (Main.npc[number].active && NPCID.Sets.BelongsToInvasionOldOnesArmy[Main.npc[number].type])
|
|
{
|
|
Main.npc[number].active = false;
|
|
if (Main.netMode == 2)
|
|
NetMessage.SendData(23, number: number);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void ClearAllDD2EnergyCrystalsInGame()
|
|
{
|
|
for (int number = 0; number < 400; ++number)
|
|
{
|
|
Item obj = Main.item[number];
|
|
if (obj.active && obj.type == 3822)
|
|
{
|
|
obj.active = false;
|
|
if (Main.netMode == 2)
|
|
NetMessage.SendData(21, number: number);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void ClearAllDD2EnergyCrystalsInChests()
|
|
{
|
|
if (Main.netMode == 1)
|
|
return;
|
|
List<int> currentlyOpenChests = Chest.GetCurrentlyOpenChests();
|
|
for (int number = 0; number < 8000; ++number)
|
|
{
|
|
Chest chest = Main.chest[number];
|
|
if (chest != null && currentlyOpenChests.Contains(number))
|
|
{
|
|
for (int index = 0; index < 40; ++index)
|
|
{
|
|
if (chest.item[index].type == 3822 && chest.item[index].stack > 0)
|
|
{
|
|
chest.item[index].TurnToAir();
|
|
if (Main.netMode != 0)
|
|
NetMessage.SendData(32, number: number, number2: ((float) index));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void AnnounceGoblinDeath(NPC n) => DD2Event._deadGoblinSpots.Add(n.Bottom);
|
|
|
|
public static bool CanRaiseGoblinsHere(Vector2 spot)
|
|
{
|
|
int num = 0;
|
|
foreach (Vector2 deadGoblinSpot in DD2Event._deadGoblinSpots)
|
|
{
|
|
if ((double) Vector2.DistanceSquared(deadGoblinSpot, spot) <= 640000.0)
|
|
{
|
|
++num;
|
|
if (num >= 3)
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static void RaiseGoblins(Vector2 spot)
|
|
{
|
|
List<Vector2> vector2List = new List<Vector2>();
|
|
foreach (Vector2 deadGoblinSpot in DD2Event._deadGoblinSpots)
|
|
{
|
|
if ((double) Vector2.DistanceSquared(deadGoblinSpot, spot) <= 722500.0)
|
|
vector2List.Add(deadGoblinSpot);
|
|
}
|
|
foreach (Vector2 vector2 in vector2List)
|
|
DD2Event._deadGoblinSpots.Remove(vector2);
|
|
int num = 0;
|
|
foreach (Vector2 vec in vector2List)
|
|
{
|
|
Point tileCoordinates = vec.ToTileCoordinates();
|
|
tileCoordinates.X += Main.rand.Next(-15, 16);
|
|
Point result;
|
|
if (WorldUtils.Find(tileCoordinates, Searches.Chain((GenSearch) new Searches.Down(50), (GenCondition) new Conditions.IsSolid()), out result))
|
|
{
|
|
if (DD2Event.OngoingDifficulty == 3)
|
|
NPC.NewNPC(result.X * 16 + 8, result.Y * 16, 567);
|
|
else
|
|
NPC.NewNPC(result.X * 16 + 8, result.Y * 16, 566);
|
|
if (++num >= 8)
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void FindArenaHitbox()
|
|
{
|
|
if (DD2Event._arenaHitboxingCooldown > 0)
|
|
{
|
|
--DD2Event._arenaHitboxingCooldown;
|
|
}
|
|
else
|
|
{
|
|
DD2Event._arenaHitboxingCooldown = 60;
|
|
Vector2 vector2_1 = new Vector2(float.MaxValue, float.MaxValue);
|
|
Vector2 vector2_2 = new Vector2(0.0f, 0.0f);
|
|
for (int index = 0; index < 200; ++index)
|
|
{
|
|
NPC npc = Main.npc[index];
|
|
if (npc.active && (npc.type == 549 || npc.type == 548))
|
|
{
|
|
Vector2 topLeft = npc.TopLeft;
|
|
if ((double) vector2_1.X > (double) topLeft.X)
|
|
vector2_1.X = topLeft.X;
|
|
if ((double) vector2_1.Y > (double) topLeft.Y)
|
|
vector2_1.Y = topLeft.Y;
|
|
Vector2 bottomRight = npc.BottomRight;
|
|
if ((double) vector2_2.X < (double) bottomRight.X)
|
|
vector2_2.X = bottomRight.X;
|
|
if ((double) vector2_2.Y < (double) bottomRight.Y)
|
|
vector2_2.Y = bottomRight.Y;
|
|
}
|
|
}
|
|
Vector2 vector2_3 = new Vector2(16f, 16f) * 50f;
|
|
vector2_1 -= vector2_3;
|
|
vector2_2 += vector2_3;
|
|
Vector2 vector2_4 = vector2_2 - vector2_1;
|
|
DD2Event.ArenaHitbox.X = (int) vector2_1.X;
|
|
DD2Event.ArenaHitbox.Y = (int) vector2_1.Y;
|
|
DD2Event.ArenaHitbox.Width = (int) vector2_4.X;
|
|
DD2Event.ArenaHitbox.Height = (int) vector2_4.Y;
|
|
}
|
|
}
|
|
|
|
public static bool ShouldBlockBuilding(Vector2 worldPosition) => DD2Event.ArenaHitbox.Contains(worldPosition.ToPoint());
|
|
|
|
public static void DropMedals(int numberOfMedals)
|
|
{
|
|
for (int index = 0; index < 200; ++index)
|
|
{
|
|
if (Main.npc[index].active && Main.npc[index].type == 548)
|
|
Main.npc[index].DropItemInstanced(Main.npc[index].position, Main.npc[index].Size, 3817, numberOfMedals, false);
|
|
}
|
|
}
|
|
|
|
public static bool ShouldDropCrystals()
|
|
{
|
|
int currentWave;
|
|
int requiredKillCount;
|
|
int currentKillCount;
|
|
DD2Event.GetInvasionStatus(out currentWave, out requiredKillCount, out currentKillCount);
|
|
if (DD2Event._crystalsDropping_lastWave < currentWave)
|
|
{
|
|
++DD2Event._crystalsDropping_lastWave;
|
|
if (DD2Event._crystalsDropping_alreadyDropped > 0)
|
|
DD2Event._crystalsDropping_alreadyDropped -= DD2Event._crystalsDropping_toDrop;
|
|
switch (DD2Event.OngoingDifficulty)
|
|
{
|
|
case 1:
|
|
switch (currentWave)
|
|
{
|
|
case 1:
|
|
DD2Event._crystalsDropping_toDrop = 20;
|
|
break;
|
|
case 2:
|
|
DD2Event._crystalsDropping_toDrop = 20;
|
|
break;
|
|
case 3:
|
|
DD2Event._crystalsDropping_toDrop = 30;
|
|
break;
|
|
case 4:
|
|
DD2Event._crystalsDropping_toDrop = 30;
|
|
break;
|
|
case 5:
|
|
DD2Event._crystalsDropping_toDrop = 40;
|
|
break;
|
|
}
|
|
break;
|
|
case 2:
|
|
switch (currentWave)
|
|
{
|
|
case 1:
|
|
DD2Event._crystalsDropping_toDrop = 20;
|
|
break;
|
|
case 2:
|
|
DD2Event._crystalsDropping_toDrop = 20;
|
|
break;
|
|
case 3:
|
|
DD2Event._crystalsDropping_toDrop = 20;
|
|
break;
|
|
case 4:
|
|
DD2Event._crystalsDropping_toDrop = 20;
|
|
break;
|
|
case 5:
|
|
DD2Event._crystalsDropping_toDrop = 20;
|
|
break;
|
|
case 6:
|
|
DD2Event._crystalsDropping_toDrop = 30;
|
|
break;
|
|
case 7:
|
|
DD2Event._crystalsDropping_toDrop = 30;
|
|
break;
|
|
}
|
|
break;
|
|
case 3:
|
|
switch (currentWave)
|
|
{
|
|
case 1:
|
|
DD2Event._crystalsDropping_toDrop = 20;
|
|
break;
|
|
case 2:
|
|
DD2Event._crystalsDropping_toDrop = 20;
|
|
break;
|
|
case 3:
|
|
DD2Event._crystalsDropping_toDrop = 20;
|
|
break;
|
|
case 4:
|
|
DD2Event._crystalsDropping_toDrop = 20;
|
|
break;
|
|
case 5:
|
|
DD2Event._crystalsDropping_toDrop = 30;
|
|
break;
|
|
case 6:
|
|
DD2Event._crystalsDropping_toDrop = 30;
|
|
break;
|
|
case 7:
|
|
DD2Event._crystalsDropping_toDrop = 30;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if (Main.netMode != 0 && Main.expertMode)
|
|
DD2Event._crystalsDropping_toDrop = (int) ((double) DD2Event._crystalsDropping_toDrop * (double) NPC.GetBalance());
|
|
float num = (float) currentKillCount / (float) requiredKillCount;
|
|
if ((double) DD2Event._crystalsDropping_alreadyDropped >= (double) DD2Event._crystalsDropping_toDrop * (double) num)
|
|
return false;
|
|
++DD2Event._crystalsDropping_alreadyDropped;
|
|
return true;
|
|
}
|
|
|
|
private static void SummonBetsy()
|
|
{
|
|
if (DD2Event._spawnedBetsyT3 || NPC.AnyNPCs(551))
|
|
return;
|
|
Vector2 Position = new Vector2(1f, 1f);
|
|
int firstNpc = NPC.FindFirstNPC(548);
|
|
if (firstNpc != -1)
|
|
Position = Main.npc[firstNpc].Center;
|
|
NPC.SpawnOnPlayer((int) Player.FindClosest(Position, 1, 1), 551);
|
|
DD2Event._spawnedBetsyT3 = true;
|
|
}
|
|
|
|
private static void DropStarterCrystals()
|
|
{
|
|
for (int index1 = 0; index1 < 200; ++index1)
|
|
{
|
|
if (Main.npc[index1].active && Main.npc[index1].type == 548)
|
|
{
|
|
for (int index2 = 0; index2 < 5; ++index2)
|
|
Item.NewItem(Main.npc[index1].position, Main.npc[index1].width, Main.npc[index1].height, 3822, 2);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void SetEnemySpawningOnHold(int forHowLong)
|
|
{
|
|
DD2Event._timeLeftUntilSpawningBegins = forHowLong;
|
|
if (Main.netMode != 2)
|
|
return;
|
|
NetMessage.SendData(116, number: DD2Event._timeLeftUntilSpawningBegins);
|
|
}
|
|
|
|
private static short[] Difficulty_1_GetEnemiesForWave(int wave)
|
|
{
|
|
DD2Event.LaneSpawnRate = 60;
|
|
switch (wave)
|
|
{
|
|
case 1:
|
|
DD2Event.LaneSpawnRate = 90;
|
|
return new short[1]{ (short) 552 };
|
|
case 2:
|
|
return new short[2]{ (short) 552, (short) 555 };
|
|
case 3:
|
|
DD2Event.LaneSpawnRate = 55;
|
|
return new short[3]
|
|
{
|
|
(short) 552,
|
|
(short) 555,
|
|
(short) 561
|
|
};
|
|
case 4:
|
|
DD2Event.LaneSpawnRate = 50;
|
|
return new short[4]
|
|
{
|
|
(short) 552,
|
|
(short) 555,
|
|
(short) 561,
|
|
(short) 558
|
|
};
|
|
case 5:
|
|
DD2Event.LaneSpawnRate = 40;
|
|
return new short[5]
|
|
{
|
|
(short) 552,
|
|
(short) 555,
|
|
(short) 561,
|
|
(short) 558,
|
|
(short) 564
|
|
};
|
|
default:
|
|
return new short[1]{ (short) 552 };
|
|
}
|
|
}
|
|
|
|
private static int Difficulty_1_GetRequiredWaveKills(
|
|
ref int waveNumber,
|
|
ref int currentKillCount,
|
|
bool currentlyInCheckProgress)
|
|
{
|
|
switch (waveNumber)
|
|
{
|
|
case -1:
|
|
return 0;
|
|
case 1:
|
|
return 60;
|
|
case 2:
|
|
return 80;
|
|
case 3:
|
|
return 100;
|
|
case 4:
|
|
DD2Event._deadGoblinSpots.Clear();
|
|
return 120;
|
|
case 5:
|
|
if (!DD2Event._downedDarkMageT1 && currentKillCount > 139)
|
|
currentKillCount = 139;
|
|
return 140;
|
|
case 6:
|
|
waveNumber = 5;
|
|
currentKillCount = 1;
|
|
if (currentlyInCheckProgress)
|
|
DD2Event.StartVictoryScene();
|
|
return 1;
|
|
default:
|
|
return 10;
|
|
}
|
|
}
|
|
|
|
private static void Difficulty_1_SpawnMonsterFromGate(Vector2 gateBottom)
|
|
{
|
|
int x = (int) gateBottom.X;
|
|
int y = (int) gateBottom.Y;
|
|
int num1 = 50;
|
|
int num2 = 6;
|
|
if (NPC.waveNumber > 4)
|
|
num2 = 12;
|
|
else if (NPC.waveNumber > 3)
|
|
num2 = 8;
|
|
int num3 = 6;
|
|
if (NPC.waveNumber > 4)
|
|
num3 = 8;
|
|
for (int index = 1; index < Main.CurrentFrameFlags.ActivePlayersCount; ++index)
|
|
{
|
|
num1 = (int) ((double) num1 * 1.3);
|
|
num2 = (int) ((double) num2 * 1.3);
|
|
num3 = (int) ((double) num3 * 1.3);
|
|
}
|
|
int number = 200;
|
|
switch (NPC.waveNumber)
|
|
{
|
|
case 1:
|
|
if (NPC.CountNPCS(552) + NPC.CountNPCS(555) < num1)
|
|
{
|
|
number = NPC.NewNPC(x, y, 552);
|
|
break;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (NPC.CountNPCS(552) + NPC.CountNPCS(555) < num1)
|
|
{
|
|
number = Main.rand.Next(7) != 0 ? NPC.NewNPC(x, y, 552) : NPC.NewNPC(x, y, 555);
|
|
break;
|
|
}
|
|
break;
|
|
case 3:
|
|
if (Main.rand.Next(6) == 0 && NPC.CountNPCS(561) < num2)
|
|
{
|
|
number = NPC.NewNPC(x, y, 561);
|
|
break;
|
|
}
|
|
if (NPC.CountNPCS(552) + NPC.CountNPCS(555) < num1)
|
|
{
|
|
number = Main.rand.Next(5) != 0 ? NPC.NewNPC(x, y, 552) : NPC.NewNPC(x, y, 555);
|
|
break;
|
|
}
|
|
break;
|
|
case 4:
|
|
if (Main.rand.Next(12) == 0 && NPC.CountNPCS(558) < num3)
|
|
{
|
|
number = NPC.NewNPC(x, y, 558);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(5) == 0 && NPC.CountNPCS(561) < num2)
|
|
{
|
|
number = NPC.NewNPC(x, y, 561);
|
|
break;
|
|
}
|
|
if (NPC.CountNPCS(552) + NPC.CountNPCS(555) < num1)
|
|
{
|
|
number = Main.rand.Next(5) != 0 ? NPC.NewNPC(x, y, 552) : NPC.NewNPC(x, y, 555);
|
|
break;
|
|
}
|
|
break;
|
|
case 5:
|
|
int requiredKillCount;
|
|
int currentKillCount;
|
|
DD2Event.GetInvasionStatus(out int _, out requiredKillCount, out currentKillCount);
|
|
if ((double) currentKillCount > (double) requiredKillCount * 0.5 && !NPC.AnyNPCs(564))
|
|
number = NPC.NewNPC(x, y, 564);
|
|
if (Main.rand.Next(10) == 0 && NPC.CountNPCS(558) < num3)
|
|
{
|
|
number = NPC.NewNPC(x, y, 558);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(4) == 0 && NPC.CountNPCS(561) < num2)
|
|
{
|
|
number = NPC.NewNPC(x, y, 561);
|
|
break;
|
|
}
|
|
if (NPC.CountNPCS(552) + NPC.CountNPCS(555) < num1)
|
|
{
|
|
number = Main.rand.Next(4) != 0 ? NPC.NewNPC(x, y, 552) : NPC.NewNPC(x, y, 555);
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
number = NPC.NewNPC(x, y, 552);
|
|
break;
|
|
}
|
|
if (Main.netMode != 2 || number >= 200)
|
|
return;
|
|
NetMessage.SendData(23, number: number);
|
|
}
|
|
|
|
private static int Difficulty_1_GetMonsterPointsWorth(int slainMonsterID)
|
|
{
|
|
if (NPC.waveNumber == 5 && (double) NPC.waveKills >= 139.0)
|
|
{
|
|
if (slainMonsterID != 564 && slainMonsterID != 565)
|
|
return 0;
|
|
DD2Event._downedDarkMageT1 = true;
|
|
return 1;
|
|
}
|
|
if ((uint) (slainMonsterID - 551) > 14U)
|
|
{
|
|
switch (slainMonsterID)
|
|
{
|
|
case 568:
|
|
case 569:
|
|
case 570:
|
|
case 571:
|
|
case 572:
|
|
case 573:
|
|
case 574:
|
|
case 575:
|
|
case 576:
|
|
case 577:
|
|
case 578:
|
|
break;
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
return NPC.waveNumber == 5 && (double) NPC.waveKills == 138.0 || !Main.expertMode ? 1 : 2;
|
|
}
|
|
|
|
private static short[] Difficulty_2_GetEnemiesForWave(int wave)
|
|
{
|
|
DD2Event.LaneSpawnRate = 60;
|
|
switch (wave)
|
|
{
|
|
case 1:
|
|
DD2Event.LaneSpawnRate = 90;
|
|
return new short[2]{ (short) 553, (short) 562 };
|
|
case 2:
|
|
DD2Event.LaneSpawnRate = 70;
|
|
return new short[3]
|
|
{
|
|
(short) 553,
|
|
(short) 562,
|
|
(short) 572
|
|
};
|
|
case 3:
|
|
return new short[5]
|
|
{
|
|
(short) 553,
|
|
(short) 556,
|
|
(short) 562,
|
|
(short) 559,
|
|
(short) 572
|
|
};
|
|
case 4:
|
|
DD2Event.LaneSpawnRate = 55;
|
|
return new short[5]
|
|
{
|
|
(short) 553,
|
|
(short) 559,
|
|
(short) 570,
|
|
(short) 572,
|
|
(short) 562
|
|
};
|
|
case 5:
|
|
DD2Event.LaneSpawnRate = 50;
|
|
return new short[6]
|
|
{
|
|
(short) 553,
|
|
(short) 556,
|
|
(short) 559,
|
|
(short) 572,
|
|
(short) 574,
|
|
(short) 570
|
|
};
|
|
case 6:
|
|
DD2Event.LaneSpawnRate = 45;
|
|
return new short[8]
|
|
{
|
|
(short) 553,
|
|
(short) 556,
|
|
(short) 562,
|
|
(short) 559,
|
|
(short) 568,
|
|
(short) 570,
|
|
(short) 572,
|
|
(short) 574
|
|
};
|
|
case 7:
|
|
DD2Event.LaneSpawnRate = 42;
|
|
return new short[8]
|
|
{
|
|
(short) 553,
|
|
(short) 556,
|
|
(short) 572,
|
|
(short) 559,
|
|
(short) 568,
|
|
(short) 574,
|
|
(short) 570,
|
|
(short) 576
|
|
};
|
|
default:
|
|
return new short[1]{ (short) 553 };
|
|
}
|
|
}
|
|
|
|
private static int Difficulty_2_GetRequiredWaveKills(
|
|
ref int waveNumber,
|
|
ref int currentKillCount,
|
|
bool currentlyInCheckProgress)
|
|
{
|
|
switch (waveNumber)
|
|
{
|
|
case -1:
|
|
return 0;
|
|
case 1:
|
|
return 60;
|
|
case 2:
|
|
return 80;
|
|
case 3:
|
|
return 100;
|
|
case 4:
|
|
return 120;
|
|
case 5:
|
|
return 140;
|
|
case 6:
|
|
return 180;
|
|
case 7:
|
|
if (!DD2Event._downedOgreT2 && currentKillCount > 219)
|
|
currentKillCount = 219;
|
|
return 220;
|
|
case 8:
|
|
waveNumber = 7;
|
|
currentKillCount = 1;
|
|
if (currentlyInCheckProgress)
|
|
DD2Event.StartVictoryScene();
|
|
return 1;
|
|
default:
|
|
return 10;
|
|
}
|
|
}
|
|
|
|
private static int Difficulty_2_GetMonsterPointsWorth(int slainMonsterID)
|
|
{
|
|
if (NPC.waveNumber == 7 && (double) NPC.waveKills >= 219.0)
|
|
{
|
|
if (slainMonsterID != 576 && slainMonsterID != 577)
|
|
return 0;
|
|
DD2Event._downedOgreT2 = true;
|
|
return 1;
|
|
}
|
|
if ((uint) (slainMonsterID - 551) > 14U)
|
|
{
|
|
switch (slainMonsterID)
|
|
{
|
|
case 568:
|
|
case 569:
|
|
case 570:
|
|
case 571:
|
|
case 572:
|
|
case 573:
|
|
case 574:
|
|
case 575:
|
|
case 576:
|
|
case 577:
|
|
case 578:
|
|
break;
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
return NPC.waveNumber == 7 && (double) NPC.waveKills == 218.0 || !Main.expertMode ? 1 : 2;
|
|
}
|
|
|
|
private static void Difficulty_2_SpawnMonsterFromGate(Vector2 gateBottom)
|
|
{
|
|
int x = (int) gateBottom.X;
|
|
int y = (int) gateBottom.Y;
|
|
int num1 = 50;
|
|
int num2 = 5;
|
|
if (NPC.waveNumber > 1)
|
|
num2 = 8;
|
|
if (NPC.waveNumber > 3)
|
|
num2 = 10;
|
|
if (NPC.waveNumber > 5)
|
|
num2 = 12;
|
|
int num3 = 5;
|
|
if (NPC.waveNumber > 4)
|
|
num3 = 7;
|
|
int num4 = 2;
|
|
int num5 = 8;
|
|
if (NPC.waveNumber > 3)
|
|
num5 = 12;
|
|
int num6 = 3;
|
|
if (NPC.waveNumber > 5)
|
|
num6 = 5;
|
|
for (int index = 1; index < Main.CurrentFrameFlags.ActivePlayersCount; ++index)
|
|
{
|
|
num1 = (int) ((double) num1 * 1.3);
|
|
num2 = (int) ((double) num2 * 1.3);
|
|
num5 = (int) ((double) num1 * 1.3);
|
|
num6 = (int) ((double) num1 * 1.35);
|
|
}
|
|
int number1 = 200;
|
|
int number2 = 200;
|
|
switch (NPC.waveNumber)
|
|
{
|
|
case 1:
|
|
if (Main.rand.Next(20) == 0 && NPC.CountNPCS(562) < num2)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 562);
|
|
break;
|
|
}
|
|
if (NPC.CountNPCS(553) < num1)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 553);
|
|
break;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (Main.rand.Next(3) == 0 && NPC.CountNPCS(572) < num5)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 572);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(8) == 0 && NPC.CountNPCS(562) < num2)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 562);
|
|
break;
|
|
}
|
|
if (NPC.CountNPCS(553) < num1)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 553);
|
|
break;
|
|
}
|
|
break;
|
|
case 3:
|
|
if (Main.rand.Next(7) == 0 && NPC.CountNPCS(572) < num5)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 572);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(10) == 0 && NPC.CountNPCS(559) < num3)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 559);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(8) == 0 && NPC.CountNPCS(562) < num2)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 562);
|
|
break;
|
|
}
|
|
if (NPC.CountNPCS(553) + NPC.CountNPCS(556) < num1)
|
|
{
|
|
if (Main.rand.Next(4) == 0)
|
|
number1 = NPC.NewNPC(x, y, 556);
|
|
number2 = NPC.NewNPC(x, y, 553);
|
|
break;
|
|
}
|
|
break;
|
|
case 4:
|
|
if (Main.rand.Next(10) == 0 && NPC.CountNPCS(570) < num6)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 570);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(12) == 0 && NPC.CountNPCS(559) < num3)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 559);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(6) == 0 && NPC.CountNPCS(562) < num2)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 562);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(3) == 0 && NPC.CountNPCS(572) < num5)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 572);
|
|
break;
|
|
}
|
|
if (NPC.CountNPCS(553) < num1)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 553);
|
|
break;
|
|
}
|
|
break;
|
|
case 5:
|
|
if (Main.rand.Next(7) == 0 && NPC.CountNPCS(570) < num6)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 570);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(10) == 0 && NPC.CountNPCS(559) < num3)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 559);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(4) == 0 && NPC.CountNPCS(572) + NPC.CountNPCS(574) < num5)
|
|
{
|
|
number1 = Main.rand.Next(2) != 0 ? NPC.NewNPC(x, y, 574) : NPC.NewNPC(x, y, 572);
|
|
break;
|
|
}
|
|
if (NPC.CountNPCS(553) + NPC.CountNPCS(556) < num1)
|
|
{
|
|
if (Main.rand.Next(3) == 0)
|
|
number1 = NPC.NewNPC(x, y, 556);
|
|
number2 = NPC.NewNPC(x, y, 553);
|
|
break;
|
|
}
|
|
break;
|
|
case 6:
|
|
if (Main.rand.Next(7) == 0 && NPC.CountNPCS(570) < num6)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 570);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(17) == 0 && NPC.CountNPCS(568) < num4)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 568);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(5) == 0 && NPC.CountNPCS(572) + NPC.CountNPCS(574) < num5)
|
|
{
|
|
number1 = Main.rand.Next(2) == 0 ? NPC.NewNPC(x, y, 574) : NPC.NewNPC(x, y, 572);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(9) == 0 && NPC.CountNPCS(559) < num3)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 559);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(3) == 0 && NPC.CountNPCS(562) < num2)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 562);
|
|
break;
|
|
}
|
|
if (NPC.CountNPCS(553) + NPC.CountNPCS(556) < num1)
|
|
{
|
|
if (Main.rand.Next(3) != 0)
|
|
number1 = NPC.NewNPC(x, y, 556);
|
|
number2 = NPC.NewNPC(x, y, 553);
|
|
break;
|
|
}
|
|
break;
|
|
case 7:
|
|
int requiredKillCount;
|
|
int currentKillCount;
|
|
DD2Event.GetInvasionStatus(out int _, out requiredKillCount, out currentKillCount);
|
|
if ((double) currentKillCount > (double) requiredKillCount * 0.100000001490116 && !NPC.AnyNPCs(576))
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 576);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(7) == 0 && NPC.CountNPCS(570) < num6)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 570);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(17) == 0 && NPC.CountNPCS(568) < num4)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 568);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(7) == 0 && NPC.CountNPCS(572) + NPC.CountNPCS(574) < num5)
|
|
{
|
|
number1 = Main.rand.Next(3) == 0 ? NPC.NewNPC(x, y, 574) : NPC.NewNPC(x, y, 572);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(11) == 0 && NPC.CountNPCS(559) < num3)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 559);
|
|
break;
|
|
}
|
|
if (NPC.CountNPCS(553) + NPC.CountNPCS(556) < num1)
|
|
{
|
|
if (Main.rand.Next(2) == 0)
|
|
number1 = NPC.NewNPC(x, y, 556);
|
|
number2 = NPC.NewNPC(x, y, 553);
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
number1 = NPC.NewNPC(x, y, 553);
|
|
break;
|
|
}
|
|
if (Main.netMode == 2 && number1 < 200)
|
|
NetMessage.SendData(23, number: number1);
|
|
if (Main.netMode != 2 || number2 >= 200)
|
|
return;
|
|
NetMessage.SendData(23, number: number2);
|
|
}
|
|
|
|
private static short[] Difficulty_3_GetEnemiesForWave(int wave)
|
|
{
|
|
DD2Event.LaneSpawnRate = 60;
|
|
switch (wave)
|
|
{
|
|
case 1:
|
|
DD2Event.LaneSpawnRate = 85;
|
|
return new short[3]
|
|
{
|
|
(short) 554,
|
|
(short) 557,
|
|
(short) 563
|
|
};
|
|
case 2:
|
|
DD2Event.LaneSpawnRate = 75;
|
|
return new short[5]
|
|
{
|
|
(short) 554,
|
|
(short) 557,
|
|
(short) 563,
|
|
(short) 573,
|
|
(short) 578
|
|
};
|
|
case 3:
|
|
DD2Event.LaneSpawnRate = 60;
|
|
return new short[5]
|
|
{
|
|
(short) 554,
|
|
(short) 563,
|
|
(short) 560,
|
|
(short) 573,
|
|
(short) 571
|
|
};
|
|
case 4:
|
|
DD2Event.LaneSpawnRate = 60;
|
|
return new short[7]
|
|
{
|
|
(short) 554,
|
|
(short) 560,
|
|
(short) 571,
|
|
(short) 573,
|
|
(short) 563,
|
|
(short) 575,
|
|
(short) 565
|
|
};
|
|
case 5:
|
|
DD2Event.LaneSpawnRate = 55;
|
|
return new short[7]
|
|
{
|
|
(short) 554,
|
|
(short) 557,
|
|
(short) 573,
|
|
(short) 575,
|
|
(short) 571,
|
|
(short) 569,
|
|
(short) 577
|
|
};
|
|
case 6:
|
|
DD2Event.LaneSpawnRate = 60;
|
|
return new short[8]
|
|
{
|
|
(short) 554,
|
|
(short) 557,
|
|
(short) 563,
|
|
(short) 560,
|
|
(short) 569,
|
|
(short) 571,
|
|
(short) 577,
|
|
(short) 565
|
|
};
|
|
case 7:
|
|
DD2Event.LaneSpawnRate = 90;
|
|
return new short[6]
|
|
{
|
|
(short) 554,
|
|
(short) 557,
|
|
(short) 563,
|
|
(short) 569,
|
|
(short) 571,
|
|
(short) 551
|
|
};
|
|
default:
|
|
return new short[1]{ (short) 554 };
|
|
}
|
|
}
|
|
|
|
private static int Difficulty_3_GetRequiredWaveKills(
|
|
ref int waveNumber,
|
|
ref int currentKillCount,
|
|
bool currentlyInCheckProgress)
|
|
{
|
|
switch (waveNumber)
|
|
{
|
|
case -1:
|
|
return 0;
|
|
case 1:
|
|
return 60;
|
|
case 2:
|
|
return 80;
|
|
case 3:
|
|
return 100;
|
|
case 4:
|
|
return 120;
|
|
case 5:
|
|
return 140;
|
|
case 6:
|
|
return 180;
|
|
case 7:
|
|
int firstNpc = NPC.FindFirstNPC(551);
|
|
if (firstNpc == -1)
|
|
return 1;
|
|
currentKillCount = 100 - (int) ((double) Main.npc[firstNpc].life / (double) Main.npc[firstNpc].lifeMax * 100.0);
|
|
return 100;
|
|
case 8:
|
|
waveNumber = 7;
|
|
currentKillCount = 1;
|
|
if (currentlyInCheckProgress)
|
|
DD2Event.StartVictoryScene();
|
|
return 1;
|
|
default:
|
|
return 10;
|
|
}
|
|
}
|
|
|
|
private static int Difficulty_3_GetMonsterPointsWorth(int slainMonsterID)
|
|
{
|
|
if (NPC.waveNumber == 7)
|
|
return slainMonsterID == 551 ? 1 : 0;
|
|
if ((uint) (slainMonsterID - 551) > 14U)
|
|
{
|
|
switch (slainMonsterID)
|
|
{
|
|
case 568:
|
|
case 569:
|
|
case 570:
|
|
case 571:
|
|
case 572:
|
|
case 573:
|
|
case 574:
|
|
case 575:
|
|
case 576:
|
|
case 577:
|
|
case 578:
|
|
break;
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
return !Main.expertMode ? 1 : 2;
|
|
}
|
|
|
|
private static void Difficulty_3_SpawnMonsterFromGate(Vector2 gateBottom)
|
|
{
|
|
int x = (int) gateBottom.X;
|
|
int y = (int) gateBottom.Y;
|
|
int num1 = 60;
|
|
int num2 = 7;
|
|
if (NPC.waveNumber > 1)
|
|
num2 = 9;
|
|
if (NPC.waveNumber > 3)
|
|
num2 = 12;
|
|
if (NPC.waveNumber > 5)
|
|
num2 = 15;
|
|
int num3 = 7;
|
|
if (NPC.waveNumber > 4)
|
|
num3 = 10;
|
|
int num4 = 2;
|
|
if (NPC.waveNumber > 5)
|
|
num4 = 3;
|
|
int num5 = 12;
|
|
if (NPC.waveNumber > 3)
|
|
num5 = 18;
|
|
int num6 = 4;
|
|
if (NPC.waveNumber > 5)
|
|
num6 = 6;
|
|
int num7 = 4;
|
|
for (int index = 1; index < Main.CurrentFrameFlags.ActivePlayersCount; ++index)
|
|
{
|
|
num1 = (int) ((double) num1 * 1.3);
|
|
num2 = (int) ((double) num2 * 1.3);
|
|
num5 = (int) ((double) num1 * 1.3);
|
|
num6 = (int) ((double) num1 * 1.35);
|
|
num7 = (int) ((double) num7 * 1.3);
|
|
}
|
|
int number1 = 200;
|
|
int number2 = 200;
|
|
switch (NPC.waveNumber)
|
|
{
|
|
case 1:
|
|
if (Main.rand.Next(18) == 0 && NPC.CountNPCS(563) < num2)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 563);
|
|
break;
|
|
}
|
|
if (NPC.CountNPCS(554) < num1)
|
|
{
|
|
if (Main.rand.Next(7) == 0)
|
|
number1 = NPC.NewNPC(x, y, 557);
|
|
number2 = NPC.NewNPC(x, y, 554);
|
|
break;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (Main.rand.Next(3) == 0 && NPC.CountNPCS(578) < num7)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 578);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(7) == 0 && NPC.CountNPCS(563) < num2)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 563);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(3) == 0 && NPC.CountNPCS(573) < num5)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 573);
|
|
break;
|
|
}
|
|
if (NPC.CountNPCS(554) < num1)
|
|
{
|
|
if (Main.rand.Next(4) == 0)
|
|
number1 = NPC.NewNPC(x, y, 557);
|
|
number2 = NPC.NewNPC(x, y, 554);
|
|
break;
|
|
}
|
|
break;
|
|
case 3:
|
|
if (Main.rand.Next(13) == 0 && NPC.CountNPCS(571) < num6)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 571);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(7) == 0 && NPC.CountNPCS(573) < num5)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 573);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(10) == 0 && NPC.CountNPCS(560) < num3)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 560);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(8) == 0 && NPC.CountNPCS(563) < num2)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 563);
|
|
break;
|
|
}
|
|
if (NPC.CountNPCS(554) + NPC.CountNPCS(557) < num1)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 554);
|
|
break;
|
|
}
|
|
break;
|
|
case 4:
|
|
if (Main.rand.Next(24) == 0 && !NPC.AnyNPCs(565))
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 565);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(12) == 0 && NPC.CountNPCS(571) < num6)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 571);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(15) == 0 && NPC.CountNPCS(560) < num3)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 560);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(7) == 0 && NPC.CountNPCS(563) < num2)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 563);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(5) == 0 && NPC.CountNPCS(573) + NPC.CountNPCS(575) < num5)
|
|
{
|
|
number1 = Main.rand.Next(3) == 0 ? NPC.NewNPC(x, y, 575) : NPC.NewNPC(x, y, 573);
|
|
break;
|
|
}
|
|
if (NPC.CountNPCS(554) < num1)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 554);
|
|
break;
|
|
}
|
|
break;
|
|
case 5:
|
|
if (Main.rand.Next(20) == 0 && !NPC.AnyNPCs(577))
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 577);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(17) == 0 && NPC.CountNPCS(569) < num4)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 569);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(8) == 0 && NPC.CountNPCS(571) < num6)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 571);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(7) == 0 && NPC.CountNPCS(573) + NPC.CountNPCS(575) < num5)
|
|
{
|
|
number1 = Main.rand.Next(4) == 0 ? NPC.NewNPC(x, y, 575) : NPC.NewNPC(x, y, 573);
|
|
break;
|
|
}
|
|
if (NPC.CountNPCS(554) + NPC.CountNPCS(557) < num1)
|
|
{
|
|
if (Main.rand.Next(3) == 0)
|
|
number1 = NPC.NewNPC(x, y, 557);
|
|
number2 = NPC.NewNPC(x, y, 554);
|
|
break;
|
|
}
|
|
break;
|
|
case 6:
|
|
if (Main.rand.Next(20) == 0 && !NPC.AnyNPCs(577))
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 577);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(20) == 0 && !NPC.AnyNPCs(565))
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 565);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(12) == 0 && NPC.CountNPCS(571) < num6)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 571);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(25) == 0 && NPC.CountNPCS(569) < num4)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 569);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(7) == 0 && NPC.CountNPCS(573) + NPC.CountNPCS(575) < num5)
|
|
{
|
|
number1 = Main.rand.Next(3) == 0 ? NPC.NewNPC(x, y, 575) : NPC.NewNPC(x, y, 573);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(10) == 0 && NPC.CountNPCS(560) < num3)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 560);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(5) == 0 && NPC.CountNPCS(563) < num2)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 563);
|
|
break;
|
|
}
|
|
if (NPC.CountNPCS(554) + NPC.CountNPCS(557) < num1)
|
|
{
|
|
if (Main.rand.Next(3) == 0)
|
|
number1 = NPC.NewNPC(x, y, 557);
|
|
number2 = NPC.NewNPC(x, y, 554);
|
|
break;
|
|
}
|
|
break;
|
|
case 7:
|
|
if (Main.rand.Next(20) == 0 && NPC.CountNPCS(571) < num6)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 571);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(17) == 0 && NPC.CountNPCS(569) < num4)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 569);
|
|
break;
|
|
}
|
|
if (Main.rand.Next(10) == 0 && NPC.CountNPCS(563) < num2)
|
|
{
|
|
number1 = NPC.NewNPC(x, y, 563);
|
|
break;
|
|
}
|
|
if (NPC.CountNPCS(554) + NPC.CountNPCS(557) < num1)
|
|
{
|
|
if (Main.rand.Next(5) == 0)
|
|
number1 = NPC.NewNPC(x, y, 557);
|
|
number2 = NPC.NewNPC(x, y, 554);
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
number1 = NPC.NewNPC(x, y, 554);
|
|
break;
|
|
}
|
|
if (Main.netMode == 2 && number1 < 200)
|
|
NetMessage.SendData(23, number: number1);
|
|
if (Main.netMode != 2 || number2 >= 200)
|
|
return;
|
|
NetMessage.SendData(23, number: number2);
|
|
}
|
|
}
|
|
}
|