From 6d38a73a43db7eec57cecf980eebe6e610df4de4 Mon Sep 17 00:00:00 2001 From: Leonardo Bishop Date: Mon, 31 Jul 2023 02:37:57 +0100 Subject: Add character names --- code/phase/AssignPhase.cs | 114 ++++++++++++++++++++++++++++++++++++++-------- code/phase/PlayPhase.cs | 38 ++++++++-------- code/phase/WaitPhase.cs | 2 +- 3 files changed, 116 insertions(+), 38 deletions(-) (limited to 'code/phase') diff --git a/code/phase/AssignPhase.cs b/code/phase/AssignPhase.cs index 0ae6bd2..04ebdb0 100644 --- a/code/phase/AssignPhase.cs +++ b/code/phase/AssignPhase.cs @@ -3,6 +3,7 @@ using Sandbox.UI; using System; using System.Collections.Generic; using System.Linq; +using System.Net.Http.Headers; namespace MurderGame; @@ -10,59 +11,134 @@ public class AssignPhase : BasePhase { public override string Title => "Assigning teams"; public int TicksElapsed; + + private List NatoNames = new() + { + "Alpha", + "Bravo", + "Charlie", + "Delta", + "Echo", + "Foxtrot", + "Golf", + "Hotel", + "India", + "Juliet", + "Kilo", + "Lima", + "Mike", + "November", + "Oscar", + "Papa", + "Quebec", + "Romeo", + "Sierra", + "Tango", + "Uniform", + "Victor", + "Whiskey", + "X-Ray", + "Yankee", + "Zulu" + }; + + private List HexColours = new() + { + "#0074D9", // blue + "#7FDBFF", // aqua + "#39CCCC", // teal + "#B10DC9", // purple + "#F012BE", // fuchsia + "#85144B", // maroon + "#FF4136", // red + "#FF851B", // orange + "#FFDC00", // yellow + "#3D9970", // olive + "#2ECC40", // lime + "#01FF70" // green + }; public override void Activate() { + // cleanup -- start foreach (var entity in Entity.All.OfType()) { entity.Delete(); } + // cleanup -- end var detectivesNeeded = 1; var murderersNeeded = 1; - + Random random = new(); - List spawnpoints = Entity.All.OfType().OrderBy( _ => random.Next() ).ToList(); - var clients = Game.Clients.ToList(); - foreach ( int i in Enumerable.Range( 0, clients.Count ).OrderBy( _ => random.Next() ) ) + + var spawnPoints = Entity.All.OfType().OrderBy( _ => random.Next() ).ToList(); + var clients = Game.Clients.ToList().OrderBy( _ => random.Next() ); + var natoNamesRemaining = new List(NatoNames.OrderBy( _ => random.Next() )); + var coloursRemaining = new List(HexColours.OrderBy( _ => random.Next() )); + + foreach ( var client in clients ) { - var client = clients[i]; if (client.Pawn != null) { ((Player) client.Pawn).Cleanup(); client.Pawn.Delete(); } + Player pawn = new(); client.Pawn = pawn; - if (spawnpoints.Count == 0) + + if (spawnPoints.Count == 0) { ChatBox.Say( "Could not spawn " + client.Name + " as there are not enough spawn points." ); - pawn.CurrentTeam = Team.Spectator; + pawn.Team = Team.Spectator; continue; } pawn.DressFromClient( client ); + + // re-use names and colours if needed + if (natoNamesRemaining.Count == 0) + { + natoNamesRemaining = new List(NatoNames); + } + if (coloursRemaining.Count == 0) + { + coloursRemaining = new List(HexColours); + } + // assign team if (murderersNeeded > 0) { - pawn.CurrentTeam = Team.Murderer; + pawn.Team = Team.Murderer; --murderersNeeded; } else if (detectivesNeeded > 0) { - pawn.CurrentTeam = Team.Detective; + pawn.Team = Team.Detective; --detectivesNeeded; } else { - pawn.CurrentTeam = Team.Bystander; + pawn.Team = Team.Bystander; } - Log.Info( "Assigning " + client.Name + " to team " + TeamOperations.GetTeamName( pawn.CurrentTeam ) ); + Log.Info( "Assigning " + client.Name + " to team " + pawn.GetTeamName() ); - var spawnpoint = spawnpoints[0]; - spawnpoints.RemoveAt( 0 ); - var tx = spawnpoint.Transform; - tx.Position = tx.Position + Vector3.Up * 10.0f; + // position pawn + var spawnPoint = spawnPoints[0]; + spawnPoints.RemoveAt( 0 ); + var tx = spawnPoint.Transform; + tx.Position += Vector3.Up * 10.0f; pawn.Transform = tx; + + // assign nato name + var natoName = natoNamesRemaining[0]; + natoNamesRemaining.RemoveAt( 0 ); + pawn.CharacterName = natoName; + + // assign nato name + var hexColour = coloursRemaining[0]; + coloursRemaining.RemoveAt( 0 ); + pawn.HexColor = hexColour; RoleOverlay.Show( To.Single( client ) ); } @@ -80,11 +156,13 @@ public class AssignPhase : BasePhase public override void Tick() { ++TicksElapsed; - if ( base.TimeLeft != -1 && TicksElapsed % Game.TickRate == 0 && --base.TimeLeft == 0 ) + if ( TimeLeft == -1 || TicksElapsed % Game.TickRate != 0 || --base.TimeLeft != 0 ) { - base.IsFinished = true; - base.NextPhase = new PlayPhase(); + return; } + + IsFinished = true; + NextPhase = new PlayPhase(); } } diff --git a/code/phase/PlayPhase.cs b/code/phase/PlayPhase.cs index 2a28fda..682cfe7 100644 --- a/code/phase/PlayPhase.cs +++ b/code/phase/PlayPhase.cs @@ -20,16 +20,15 @@ public class PlayPhase : BasePhase Event.Register(this); foreach ( var client in Game.Clients ) { - if ( client.Pawn is Player pawn ) + if ( client.Pawn is not Player pawn || pawn.Team == Team.Spectator ) { - if (pawn.CurrentTeam != Team.Spectator) - { - pawn.Respawn(); - TeamCapabilities.GiveLoadouts( pawn ); - } + continue; } + + pawn.Respawn(); + TeamCapabilities.GiveLoadouts( pawn ); } - MurdererNames = string.Join( ',', Game.Clients.Where( c => ((Player)c.Pawn).CurrentTeam == Team.Murderer ).Select(c => c.Name)); + MurdererNames = string.Join( ',', Game.Clients.Where( c => ((Player)c.Pawn).Team == Team.Murderer ).Select(c => c.Name)); } public override void Deactivate() @@ -48,12 +47,14 @@ public class PlayPhase : BasePhase Log.Info( "Removing blind from " + entity.Name ); BlindedOverlay.Hide( To.Single( entity ) ); DeathOverlay.Hide( To.Single( entity ) ); - if (entity is Player pawn && pawn.IsValid() ) + if ( entity is not Player pawn || !pawn.IsValid() ) { - if (pawn.Controller is WalkControllerComponent controller) controller.SpeedMultiplier = 1; - if (pawn.Inventory!= null) pawn.Inventory.AllowPickup = true; + return; } + if (pawn.Controller is WalkControllerComponent controller) controller.SpeedMultiplier = 1; + if (pawn.Inventory!= null) pawn.Inventory.AllowPickup = true; + } public override void Tick() @@ -64,8 +65,8 @@ public class PlayPhase : BasePhase TriggerEndOfGame(); return; } - bool bystandersAlive = Game.Clients.Any(c =>((Player)c.Pawn).CurrentTeam == Team.Bystander || ((Player)c.Pawn).CurrentTeam == Team.Detective); - bool murderersAlive = Game.Clients.Any(c =>((Player)c.Pawn).CurrentTeam == Team.Murderer); + var bystandersAlive = Game.Clients.Any(c =>((Player)c.Pawn).Team == Team.Bystander || ((Player)c.Pawn).Team == Team.Detective); + var murderersAlive = Game.Clients.Any(c =>((Player)c.Pawn).Team == Team.Murderer); if (!bystandersAlive || !murderersAlive) { TriggerEndOfGame(); @@ -89,7 +90,7 @@ public class PlayPhase : BasePhase public void TriggerEndOfGame() { - bool bystandersWin = Game.Clients.Any(c =>((Player)c.Pawn).CurrentTeam == Team.Bystander || ((Player)c.Pawn).CurrentTeam == Team.Detective); + var bystandersWin = Game.Clients.Any(c =>((Player)c.Pawn).Team is Team.Bystander or Team.Detective); ChatBox.Say( (bystandersWin ? "Bystanders" : "Murderers") +" win! The murderers were: " + MurdererNames ); base.NextPhase = new EndPhase(); base.IsFinished = true; @@ -102,9 +103,9 @@ public class PlayPhase : BasePhase { return; } - Player victimPlayer = (Player)victim; - Team victimTeam = victimPlayer.CurrentTeam; - victimPlayer.CurrentTeam = Team.Spectator; + var victimPlayer = (Player)victim; + var victimTeam = victimPlayer.Team; + victimPlayer.Team = Team.Spectator; if (killer == null) { @@ -112,9 +113,8 @@ public class PlayPhase : BasePhase return; } - - Player killerPlayer = (Player)killer; - Team killerTeam = killerPlayer.CurrentTeam; + var killerPlayer = (Player)killer; + var killerTeam = killerPlayer.Team; Log.Info( victimPlayer + " died to " + killerPlayer ); diff --git a/code/phase/WaitPhase.cs b/code/phase/WaitPhase.cs index c3d0e16..e52c91c 100644 --- a/code/phase/WaitPhase.cs +++ b/code/phase/WaitPhase.cs @@ -67,7 +67,7 @@ public class WaitPhase : BasePhase private void RespawnPlayer(Player pawn) { - pawn.CurrentTeam = Team.Spectator; + pawn.Team = Team.Spectator; pawn.DressFromClient( pawn.Client ); pawn.Respawn(); } -- cgit v1.2.3-70-g09d2