Oprava spawnování monster, optimalizace v CommandProcessor a EventProcessor. Přesunutí některých tříd do vlastních namespaců, pročištění kódu, úpravy formátování, odstranění nepoužívaných souborů a zakomentovaného kódu
This commit is contained in:
parent
e5d746d597
commit
243f071a43
62 changed files with 873 additions and 1217 deletions
|
|
@ -2,16 +2,17 @@ using System.Diagnostics;
|
|||
using GlobalClassLib;
|
||||
using ONDServer.Enemies;
|
||||
using ONDServer.Map;
|
||||
using ONDServer.Net;
|
||||
using PacketLib;
|
||||
|
||||
namespace ONDServer;
|
||||
|
||||
public class GameLogic {
|
||||
public static class GameLogic {
|
||||
|
||||
public const int START_CAMERA = 12;
|
||||
|
||||
private static MovementOpportunity secondCycleTimer = new(1000);
|
||||
private static MovementOpportunity gamePhaseTimer = new(60_000);
|
||||
private static readonly OpportunityTimer secondCycleTimer = new(1000);
|
||||
private static readonly OpportunityTimer gamePhaseTimer = new(60_000);
|
||||
public static bool NSecondUpdate{ get; private set; } = false;
|
||||
|
||||
public static MapTile P1Office;
|
||||
|
|
@ -25,17 +26,12 @@ public class GameLogic {
|
|||
|
||||
private static List<List<Enemy>> spawnOrder;
|
||||
|
||||
private static int[] defaultSpawnPoints = [2, 22];
|
||||
private static readonly int[] defaultSpawnPoints = [2, 22];
|
||||
|
||||
private static Random random = new();
|
||||
|
||||
private static bool unlimitedPower = false; // Debug
|
||||
private static bool noPhases = true; // Debug
|
||||
private static readonly Random random = new();
|
||||
|
||||
// public const int POWER_MAX = 1000;
|
||||
// public static int P1Power{ get; set; } = Power.MAX_POWER_VALUE;
|
||||
// public static int P2Power{ get; set; } = Power.MAX_POWER_VALUE;
|
||||
// public static int[] PowerValues =>[P1Power, P2Power];
|
||||
private const bool UNLIMITED_POWER = false; // Debug
|
||||
private const bool NO_PHASES = false; // Debug
|
||||
|
||||
public static Dictionary<object, (int usage, int pid)> PowerConsumers{ get; set; } = new();
|
||||
|
||||
|
|
@ -44,10 +40,6 @@ public class GameLogic {
|
|||
MapManager.InitMap();
|
||||
P1Office = MapManager.Get(10);
|
||||
P2Office = MapManager.Get(14);
|
||||
//
|
||||
// foreach (var player in Server.Players.Values){
|
||||
// player.state.power = Power.MAX_POWER_VALUE;
|
||||
// }
|
||||
|
||||
//Send map to client
|
||||
TileConnector[] connectors = MapManager.GetAllConnectors();
|
||||
|
|
@ -56,7 +48,7 @@ public class GameLogic {
|
|||
connectorsConverted[i * 4] = connectors[i].Tiles.tile1.Id;
|
||||
connectorsConverted[i * 4 + 1] = connectors[i].Tiles.tile2.Id;
|
||||
connectorsConverted[i * 4 + 2] = (int)connectors[i].Type;
|
||||
connectorsConverted[i * 4 + 3] = connectors[i].Owner == null ? -1 : connectors[i].Owner.state.pid;
|
||||
connectorsConverted[i * 4 + 3] = connectors[i].Owner == null ? -1 : connectors[i].Owner!.State.Pid;
|
||||
}
|
||||
|
||||
List<int> p1Tiles = new();
|
||||
|
|
@ -68,25 +60,26 @@ public class GameLogic {
|
|||
else if(tile.Owner == Server.P2) p2Tiles.Add(tile.Id);
|
||||
}
|
||||
|
||||
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);
|
||||
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)]];
|
||||
// Enemy test = new SpotEnemy(3);
|
||||
spawnOrder.ForEach(l => l.ForEach(e => EnemyManager.AddEnemy(e)));
|
||||
|
||||
Thread.Sleep(3000);
|
||||
secondCycleTimer.Start();
|
||||
gamePhaseTimer.Start();
|
||||
Server.SendUpdateToAll([GameEvent.GAME_START()]);
|
||||
|
||||
// debug
|
||||
// EnemyManager.AddEnemy(new SpotEnemy(10)).Spawn(MapManager.Get(12));
|
||||
// EnemyManager.AddEnemy(new LurkEnemy(10)).Spawn(MapManager.Get(12));
|
||||
EnemyManager.AddEnemy(new NekoEnemy(7)).Spawn(MapManager.Get(2));
|
||||
// EnemyManager.AddEnemy(new NekoEnemy(7)).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));
|
||||
EnemyManager.AddEnemy(new LurkEnemy(4)).Spawn(MapManager.Get(2));
|
||||
EnemyManager.AddEnemy(new NekoEnemy(4)).Spawn(MapManager.Get(22));
|
||||
|
||||
}
|
||||
public static void Update() {
|
||||
|
|
@ -94,24 +87,23 @@ public class GameLogic {
|
|||
|
||||
if (NSecondUpdate){
|
||||
(int p1, int p2) powerUsage = CalculatePowerUsage();
|
||||
Server.P1.state.power -= powerUsage.p1;
|
||||
Server.P2.state.power -= powerUsage.p2;
|
||||
Server.P1.State.Power -= powerUsage.p1;
|
||||
Server.P2.State.Power -= powerUsage.p2;
|
||||
|
||||
foreach (var player in Server.Players.Values){
|
||||
if (player.state.power < 0){
|
||||
player.state.poweredOut = true;
|
||||
player.state.power = 0;
|
||||
if (player.State.Power < 0){
|
||||
player.State.PoweredOut = true;
|
||||
player.State.Power = 0;
|
||||
PowerOut(player);
|
||||
}
|
||||
// Server.SendUpdateToAll([GameEvent.POWER_OUT(player.state.pid)]);
|
||||
}
|
||||
|
||||
if (unlimitedPower){ // Debug
|
||||
Server.P1.state.power = Power.MAX_POWER_VALUE;
|
||||
Server.P2.state.power = Power.MAX_POWER_VALUE;
|
||||
if (UNLIMITED_POWER){ // Debug
|
||||
Server.P1.State.Power = Power.MAX_POWER_VALUE;
|
||||
Server.P2.State.Power = Power.MAX_POWER_VALUE;
|
||||
}
|
||||
|
||||
Server.SendUpdateToAll([GameEvent.POWER_TICK(Server.P1.state.pid, Server.P1.state.power), GameEvent.POWER_TICK(Server.P2.state.pid, Server.P2.state.power)]);
|
||||
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();
|
||||
|
|
@ -125,8 +117,8 @@ public class GameLogic {
|
|||
|
||||
public static void DeclareWinner(ServerPlayer player) {
|
||||
if (Server.Players.Count == 2){
|
||||
Server.SendUpdateToAll([GameEvent.PLAYER_WIN(player.state.pid)]);
|
||||
Console.WriteLine("Player " + player.state.pid + " won!");
|
||||
Server.SendUpdateToAll([GameEvent.PLAYER_WIN(player.State.Pid)]);
|
||||
Console.WriteLine("Player " + player.State.Pid + " won!");
|
||||
}
|
||||
Thread.Sleep(1000);
|
||||
Server.Stop();
|
||||
|
|
@ -141,10 +133,10 @@ public class GameLogic {
|
|||
int p2Usage = 0;
|
||||
|
||||
foreach (var consumer in PowerConsumers){
|
||||
if (consumer.Value.pid == Server.P1.state.pid){
|
||||
if (consumer.Value.pid == Server.P1.State.Pid){
|
||||
p1Usage += consumer.Value.usage;
|
||||
}
|
||||
else if (consumer.Value.pid == Server.P2.state.pid){
|
||||
else if (consumer.Value.pid == Server.P2.State.Pid){
|
||||
p2Usage += consumer.Value.usage;
|
||||
}
|
||||
}
|
||||
|
|
@ -159,53 +151,60 @@ public class GameLogic {
|
|||
foreach (var tile in MapManager.GetAllTiles().Where(t => t.Owner == player)){
|
||||
tile.Lit = false;
|
||||
}
|
||||
PowerConsumers.Where(c => c.Value.pid == player.state.pid).ToList().ForEach(c => PowerConsumers.Remove(c.Key));
|
||||
Server.SendUpdateToAll([GameEvent.POWER_OUT(player.state.pid)]);
|
||||
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() {
|
||||
if(noPhases) return;
|
||||
if(NO_PHASES) return;
|
||||
|
||||
PhaseCounter++;
|
||||
Server.SendUpdateToAll([GameEvent.NEXT_PHASE()]);
|
||||
|
||||
int roll = spawnOrder.Count > 0 ? random.Next(3) : random.Next(1,3);
|
||||
switch (roll){
|
||||
case 0:
|
||||
int spawnRoll = random.Next(spawnOrder[0].Count);
|
||||
SpawnNext(spawnOrder[0][spawnRoll]);
|
||||
int roll = spawnOrder.Count == 0 ? random.Next(1, 3) : random.Next(3);
|
||||
if (roll == 0){
|
||||
int spawnRoll = random.Next(spawnOrder[0].Count);
|
||||
if (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;
|
||||
|
||||
}
|
||||
else{
|
||||
roll = random.Next(1, 3);
|
||||
}
|
||||
}
|
||||
if (roll == 1){
|
||||
Enemy[] allEnemies = EnemyManager.GetAll().Where(e => e.Difficulty <= 10).ToArray();
|
||||
if (allEnemies.Length == 0) return;
|
||||
for (int i = 0; i < 2; i++){
|
||||
Enemy enemy = allEnemies[random.Next(allEnemies.Length)];
|
||||
enemy.SetDifficulty(enemy.Difficulty + 2);
|
||||
}
|
||||
}
|
||||
else if (roll == 2){
|
||||
Enemy[] enemies = EnemyManager.GetAll();
|
||||
for (int i = 0; i < enemies.Length; i++){
|
||||
enemies[i].SetDifficulty(enemies[i].Difficulty + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void SpawnNext(Enemy enemy) {
|
||||
if ((EnemyType)enemy.TypeId == EnemyType.NEKO || (EnemyType)enemy.TypeId == EnemyType.LURK || (EnemyType)enemy.TypeId == EnemyType.MARE){
|
||||
private static bool SpawnNext(Enemy enemy) {
|
||||
if (enemy.Type == EnemyType.NEKO || enemy.Type == EnemyType.LURK || enemy.Type == 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;
|
||||
return false;
|
||||
}
|
||||
enemy.Spawn(spawnLocations[random.Next(spawnLocations.Length)]);
|
||||
return true;
|
||||
}
|
||||
else if ((EnemyType)enemy.TypeId == EnemyType.SPOT || (EnemyType)enemy.TypeId == EnemyType.DASH){
|
||||
|
||||
if (enemy.Type == EnemyType.SPOT || enemy.Type == EnemyType.DASH){
|
||||
enemy.Spawn(MapManager.Get(12));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue