Files
tbd-station-14/Content.Server/GameObjects/EntitySystems/BlockGameSystem.cs
DrSmugleaf 5c0cf1b1a0 Use 'new' expression in places where the type is evident for content (#2590)
* Content.Client

* Content.Benchmarks

* Content.IntegrationTests

* Content.Server

* Content.Server.Database

* Content.Shared

* Content.Tests

* Merge fixes

Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
2020-11-27 21:00:49 +11:00

85 lines
3.1 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Content.Server.GameObjects.Components.Arcade;
using Content.Shared.Arcade;
using Robust.Shared.GameObjects.Systems;
using Robust.Shared.Utility;
namespace Content.Server.GameObjects.EntitySystems
{
// ReSharper disable once ClassNeverInstantiated.Global
public class BlockGameSystem : EntitySystem
{
private readonly List<BlockGameMessages.HighScoreEntry> _roundHighscores = new();
private readonly List<BlockGameMessages.HighScoreEntry> _globalHighscores = new();
public HighScorePlacement RegisterHighScore(string name, int score)
{
var entry = new BlockGameMessages.HighScoreEntry(name, score);
return new HighScorePlacement(TryInsertIntoList(_roundHighscores, entry), TryInsertIntoList(_globalHighscores, entry));
}
public List<BlockGameMessages.HighScoreEntry> GetLocalHighscores() => GetSortedHighscores(_roundHighscores);
public List<BlockGameMessages.HighScoreEntry> GetGlobalHighscores() => GetSortedHighscores(_globalHighscores);
private List<BlockGameMessages.HighScoreEntry> GetSortedHighscores(List<BlockGameMessages.HighScoreEntry> highScoreEntries)
{
var result = highScoreEntries.ShallowClone();
result.Sort((p1, p2) => p2.Score.CompareTo(p1.Score));
return result;
}
private int? TryInsertIntoList(List<BlockGameMessages.HighScoreEntry> highScoreEntries, BlockGameMessages.HighScoreEntry entry)
{
if (highScoreEntries.Count < 5)
{
highScoreEntries.Add(entry);
return GetPlacement(highScoreEntries, entry);
}
if (highScoreEntries.Min(e => e.Score) >= entry.Score) return null;
var lowestHighscore = highScoreEntries.Min();
highScoreEntries.Remove(lowestHighscore);
highScoreEntries.Add(entry);
return GetPlacement(highScoreEntries, entry);
}
private int? GetPlacement(List<BlockGameMessages.HighScoreEntry> highScoreEntries, BlockGameMessages.HighScoreEntry entry)
{
int? placement = null;
if (highScoreEntries.Contains(entry))
{
highScoreEntries.Sort((p1,p2) => p2.Score.CompareTo(p1.Score));
placement = 1 + highScoreEntries.IndexOf(entry);
}
return placement;
}
public override void Update(float frameTime)
{
foreach (var comp in ComponentManager.EntityQuery<BlockGameArcadeComponent>())
{
comp.DoGameTick(frameTime);
}
}
public readonly struct HighScorePlacement
{
public readonly int? GlobalPlacement;
public readonly int? LocalPlacement;
public HighScorePlacement(int? globalPlacement, int? localPlacement)
{
GlobalPlacement = globalPlacement;
LocalPlacement = localPlacement;
}
}
}
}