diff --git a/FNAF_Clone/Content/Content.mgcb b/FNAF_Clone/Content/Content.mgcb index 65915be..8f14c89 100644 --- a/FNAF_Clone/Content/Content.mgcb +++ b/FNAF_Clone/Content/Content.mgcb @@ -101,6 +101,12 @@ /processorParam:Quality=Best /build:sounds/ambience.wav +#begin sounds/bell.wav +/importer:WavImporter +/processor:SoundEffectProcessor +/processorParam:Quality=Best +/build:sounds/bell.wav + #begin sounds/camera-switch.wav /importer:WavImporter /processor:SoundEffectProcessor diff --git a/FNAF_Clone/Content/sounds/bell.wav b/FNAF_Clone/Content/sounds/bell.wav new file mode 100644 index 0000000..f066624 Binary files /dev/null and b/FNAF_Clone/Content/sounds/bell.wav differ diff --git a/FNAF_Clone/EventProcessor.cs b/FNAF_Clone/EventProcessor.cs index c242c25..c2ee66f 100644 --- a/FNAF_Clone/EventProcessor.cs +++ b/FNAF_Clone/EventProcessor.cs @@ -176,6 +176,9 @@ public class EventProcessor { SoundManager.PlayVentWalk(); break; + case 18: + SoundManager.PlayBell(); + break; } } } diff --git a/FNAF_Clone/SoundManager.cs b/FNAF_Clone/SoundManager.cs index 28ce4fc..7ff21ea 100644 --- a/FNAF_Clone/SoundManager.cs +++ b/FNAF_Clone/SoundManager.cs @@ -25,6 +25,7 @@ public static class SoundManager { private static SoundEffect jumpscare; private static SoundEffect nekoAnger; private static SoundEffect nekoMove; + private static SoundEffect bell; private static SoundEffectInstance ambienceInstance; private static SoundEffectInstance nekoPurrInstance; @@ -51,7 +52,8 @@ public static class SoundManager { jumpscare = Core.content.Load("sounds/jumpscare"); nekoAnger = Core.content.Load("sounds/neko-angry"); nekoMove = Core.content.Load("sounds/neko-move1"); - + bell = Core.content.Load("sounds/bell"); + nekoPurrInstance = nekoPurr.CreateInstance(); ambienceInstance = ambience.CreateInstance(); } @@ -113,6 +115,8 @@ public static class SoundManager { public static void PlayCameraSwitch() => camSwitch.Play(); public static void PlayVentWalk() => ventWalk.Play(); + + public static void PlayBell() => bell.Play(); public static void StartNekoPurr() { nekoPurrInstance = nekoPurr.CreateInstance(); diff --git a/FNAF_Server/Enemies/EnemyManager.cs b/FNAF_Server/Enemies/EnemyManager.cs index 0eba22c..6c9a31f 100644 --- a/FNAF_Server/Enemies/EnemyManager.cs +++ b/FNAF_Server/Enemies/EnemyManager.cs @@ -26,4 +26,7 @@ public class EnemyManager { return output.ToArray(); } + + public static Enemy Get(int id) => enemies[id]; + public static Enemy[] GetAll() => enemies.Values.ToArray(); } \ No newline at end of file diff --git a/FNAF_Server/Enemies/LurkEnemy.cs b/FNAF_Server/Enemies/LurkEnemy.cs index f7fe077..8fb8922 100644 --- a/FNAF_Server/Enemies/LurkEnemy.cs +++ b/FNAF_Server/Enemies/LurkEnemy.cs @@ -49,7 +49,7 @@ public class LurkEnemy : Enemy { public override void SetDifficulty(int difficulty) { Difficulty = difficulty; - movementOpportunity.MovementChance = ((2 + Math.Pow(1.5f, Difficulty)) * Math.Sign(Difficulty)) / (2 + Math.Pow(1.5f, 10)); + movementOpportunity.MovementChance = ((5 + Math.Pow(1.5f, Difficulty)) * Math.Sign(Difficulty)) / (5 + Math.Pow(1.5f, 10)); } public override void Update() { diff --git a/FNAF_Server/Enemies/MareEnemy.cs b/FNAF_Server/Enemies/MareEnemy.cs index 91f9a1c..6069fd5 100644 --- a/FNAF_Server/Enemies/MareEnemy.cs +++ b/FNAF_Server/Enemies/MareEnemy.cs @@ -44,7 +44,7 @@ public class MareEnemy : Enemy { public override void SetDifficulty(int difficulty) { Difficulty = difficulty; movementOpportunity.MovementChance = - ((2 + Math.Pow(1.5f, Difficulty)) * Math.Sign(Difficulty)) / (2 + Math.Pow(1.5f, 10)); + ((5 + Math.Pow(1.5f, Difficulty)) * Math.Sign(Difficulty)) / (5 + Math.Pow(1.5f, 10)); } diff --git a/FNAF_Server/Enemies/NekoEnemy.cs b/FNAF_Server/Enemies/NekoEnemy.cs index 1f4b492..72f8722 100644 --- a/FNAF_Server/Enemies/NekoEnemy.cs +++ b/FNAF_Server/Enemies/NekoEnemy.cs @@ -44,7 +44,7 @@ public class NekoEnemy : Enemy { public override void SetDifficulty(int difficulty) { Difficulty = difficulty; movementOpportunity.MovementChance = - ((2 + Math.Pow(1.5f, Difficulty)) * Math.Sign(Difficulty)) / (2 + Math.Pow(1.5f, 10)); + ((5 + Math.Pow(1.5f, Difficulty)) * Math.Sign(Difficulty)) / (5 + Math.Pow(1.5f, 10)); } public override void Update() { @@ -64,7 +64,13 @@ public class NekoEnemy : Enemy { Target = Server.P1; } else{ - return; + if (GameLogic.PhaseCounter > 1){ + Target = Server.Players[new Random().Next(2)]; + SetDifficulty(8); + } + else{ + return; + } } } diff --git a/FNAF_Server/GameLogic.cs b/FNAF_Server/GameLogic.cs index 6c2cef6..175ac4a 100644 --- a/FNAF_Server/GameLogic.cs +++ b/FNAF_Server/GameLogic.cs @@ -11,6 +11,7 @@ public class GameLogic { public const int START_CAMERA = 12; private static MovementOpportunity secondCycleTimer = new(1000); + private static MovementOpportunity gamePhaseTimer = new(30_000); public static bool NSecondUpdate{ get; private set; } = false; public static MapTile P1Office; @@ -20,6 +21,13 @@ public class GameLogic { public static int OfficeDoorUsage{ get; set; } = 10; public static int RemoteDoorUsage{ get; set; } = 3; public static int LightUsage{ get; set; } = 2; + public static int PhaseCounter{ get; private set; } = 1; + + private static List> spawnOrder; + + private static int[] defaultSpawnPoints = [2, 22]; + + private static Random random = new(); private static bool unlimitedPower = false; // Debug @@ -62,15 +70,22 @@ public class GameLogic { Server.SendPacket(new MapInitPacket{Connectors = connectorsConverted, UpsideDown = false, YourTiles = p1Tiles.ToArray(), OpponentTiles = p2Tiles.ToArray(), LitTiles = neutralTiles.ToArray()}, Server.P1.peer); Server.SendPacket(new MapInitPacket{Connectors = connectorsConverted, UpsideDown = true, YourTiles = p2Tiles.ToArray(), OpponentTiles = p1Tiles.ToArray(), LitTiles = neutralTiles.ToArray()}, Server.P2.peer); + spawnOrder = [[new SpotEnemy(3), new MareEnemy(3)], [new DashEnemy(6)], [new LurkEnemy(3), new NekoEnemy(3)]]; + Thread.Sleep(3000); secondCycleTimer.Start(); + gamePhaseTimer.Start(); Server.SendUpdateToAll([GameEvent.GAME_START()]); // EnemyManager.AddEnemy(new SpotEnemy(10)).Spawn(MapManager.Get(12)); // EnemyManager.AddEnemy(new LurkEnemy(10)).Spawn(MapManager.Get(12)); - EnemyManager.AddEnemy(new NekoEnemy(10)).Spawn(MapManager.Get(2)); + // EnemyManager.AddEnemy(new NekoEnemy(10)).Spawn(MapManager.Get(2)); // EnemyManager.AddEnemy(new DashEnemy(10)).Spawn(MapManager.Get(12)); // EnemyManager.AddEnemy(new MareEnemy(10)).Spawn(MapManager.Get(22)); + + EnemyManager.AddEnemy(new LurkEnemy(4)).Spawn(MapManager.Get(2)); + EnemyManager.AddEnemy(new NekoEnemy(4)).Spawn(MapManager.Get(22)); + } public static void Update() { if(secondCycleTimer.Check()) NSecondUpdate = true; @@ -95,7 +110,10 @@ public class GameLogic { } Server.SendUpdateToAll([GameEvent.POWER_TICK(Server.P1.state.pid, Server.P1.state.power), GameEvent.POWER_TICK(Server.P2.state.pid, Server.P2.state.power)]); - + + if (gamePhaseTimer.Check()){ + NextPhase(); + } } EnemyManager.Update(); @@ -135,4 +153,48 @@ public class GameLogic { PowerConsumers.Where(c => c.Value.pid == player.state.pid).ToList().ForEach(c => PowerConsumers.Remove(c.Key)); Server.SendUpdateToAll([GameEvent.POWER_OUT(player.state.pid)]); } + + private static void NextPhase() { + PhaseCounter++; + Server.SendUpdateToAll([GameEvent.NEXT_PHASE()]); + + int roll = random.Next(3); + switch (roll){ + case 0: + int spawnRoll = random.Next(spawnOrder[0].Count); + SpawnNext(spawnOrder[0][spawnRoll]); + spawnOrder[0].RemoveAt(spawnRoll); + if (spawnOrder[0].Count == 0){ + spawnOrder.RemoveAt(0); + } + break; + case 1: + Enemy[] allEnemies = EnemyManager.GetAll(); + for (int i = 0; i < 2; i++){ + Enemy enemy = allEnemies[random.Next(allEnemies.Length)]; + enemy.SetDifficulty(enemy.Difficulty + 2); + } + break; + case 2: + Enemy[] enemies = EnemyManager.GetAll(); + for (int i = 0; i < enemies.Length; i++){ + enemies[i].SetDifficulty(enemies[i].Difficulty + 1); + } + break; + + } + } + + private static void SpawnNext(Enemy enemy) { + if ((EnemyType)enemy.TypeId == EnemyType.NEKO || (EnemyType)enemy.TypeId == EnemyType.LURK || (EnemyType)enemy.TypeId == EnemyType.MARE){ + MapTile[] spawnLocations = defaultSpawnPoints.Select(i => MapManager.Get(i)).Where(t => EnemyManager.GetByLocation(t).All(e => !e.BlocksTile)).ToArray(); + if (spawnLocations.Length == 0){ + return; + } + enemy.Spawn(spawnLocations[random.Next(spawnLocations.Length)]); + } + else if ((EnemyType)enemy.TypeId == EnemyType.SPOT || (EnemyType)enemy.TypeId == EnemyType.DASH){ + enemy.Spawn(MapManager.Get(12)); + } + } } \ No newline at end of file diff --git a/PacketLib/GameEvent.cs b/PacketLib/GameEvent.cs index 8d07c33..e213779 100644 --- a/PacketLib/GameEvent.cs +++ b/PacketLib/GameEvent.cs @@ -26,6 +26,7 @@ public struct GameEvent : INetSerializable{ public static GameEvent TOGGLE_LIGHT(int pid, int camId, bool state) => new(){ID = 15, Args = [pid, camId, state ? 1 : 0]}; public static GameEvent NEKO_ANGERED(int pid, int enemyId) => new(){ID = 16, Args = [pid, enemyId]}; public static GameEvent VENT_USED() => new(){ID = 17}; + public static GameEvent NEXT_PHASE() => new(){ID = 18}; public int ID{ get; set; } public bool Hideable => ID < 0;