render current player in secondary color

This commit is contained in:
Vinzenz Schroeter 2024-04-16 00:07:44 +02:00
parent fbaad86555
commit c4c4eb6358
13 changed files with 255 additions and 72 deletions

View file

@ -21,7 +21,7 @@ internal sealed class ClientScreenServer(
return Task.WhenAll(_connections.Keys.Select(c => c.CloseAsync()));
}
public Task HandleClient(WebSocket socket)
public Task HandleClient(WebSocket socket, Guid? playerGuid)
{
if (_closing)
{
@ -30,8 +30,11 @@ internal sealed class ClientScreenServer(
}
logger.LogDebug("HandleClient");
var connection =
new ClientScreenServerConnection(socket, loggerFactory.CreateLogger<ClientScreenServerConnection>(), this);
var connection = new ClientScreenServerConnection(
socket,
loggerFactory.CreateLogger<ClientScreenServerConnection>(),
this,
playerGuid);
var added = _connections.TryAdd(connection, 0);
Debug.Assert(added);
return connection.Done;

View file

@ -1,7 +1,6 @@
using System.Diagnostics;
using System.Net.WebSockets;
using DisplayCommands;
using TanksServer.GameLogic;
using TanksServer.Graphics;
namespace TanksServer.Interactivity;
@ -27,7 +26,7 @@ internal sealed class ClientScreenServerConnection : IDisposable
_playerGuid = playerGuid;
if (playerGuid.HasValue)
_playerScreenData = new PlayerScreenData();
_playerScreenData = new PlayerScreenData(logger);
_channel = new ByteChannelWebSocket(webSocket, logger, 0);
Done = ReceiveAsync();
@ -55,6 +54,7 @@ internal sealed class ClientScreenServerConnection : IDisposable
_logger.LogTrace("sending");
try
{
_logger.LogTrace("sending {} bytes of pixel data", pixels.Data.Length);
await _channel.SendAsync(pixels.Data, _playerScreenData == null);
if (_playerScreenData != null)
await _channel.SendAsync(_playerScreenData.GetPacket());
@ -92,24 +92,3 @@ internal sealed class ClientScreenServerConnection : IDisposable
return _channel.CloseAsync();
}
}
internal sealed class PlayerScreenData
{
private Memory<byte> _data = new byte[MapService.PixelsPerRow * MapService.PixelsPerColumn];
public int Count { get; private set; } = 0;
public void Clear() => Count = 0;
public ReadOnlyMemory<byte> GetPacket() => _data[..Count];
public void Add(GamePixelEntityType entityKind, bool isCurrentPlayer)
{
var result = (byte)(isCurrentPlayer ? 0x1b : 0x0b);
var kind = (byte)entityKind;
Debug.Assert(kind < 3);
result += (byte)(kind << 2);
_data.Span[Count] = result;
Count++;
}
}

View file

@ -0,0 +1,39 @@
using System.Diagnostics;
using TanksServer.GameLogic;
using TanksServer.Graphics;
namespace TanksServer.Interactivity;
internal sealed class PlayerScreenData(ILogger logger)
{
private readonly Memory<byte> _data = new byte[MapService.PixelsPerRow * MapService.PixelsPerColumn / 2];
private int _count = 0;
public void Clear()
{
_count = 0;
_data.Span.Clear();
}
public ReadOnlyMemory<byte> GetPacket()
{
var index = _count / 2 + (_count % 2 == 0 ? 0 : 1);
logger.LogTrace("packet length: {} (count={})", index, _count);
return _data[..index];
}
public void Add(GamePixelEntityType entityKind, bool isCurrentPlayer)
{
var result = (byte)(isCurrentPlayer ? 0x1 : 0x0);
var kind = (byte)entityKind;
Debug.Assert(kind < 3);
result += (byte)(kind << 2);
var index = _count / 2;
if (_count % 2 != 0)
_data.Span[index] |= (byte)(result << 4);
else
_data.Span[index] = result;
_count++;
}
}

View file

@ -16,8 +16,6 @@ internal sealed class SendToServicePointDisplay : IFrameConsumer
private readonly ILogger<SendToServicePointDisplay> _logger;
private readonly PlayerServer _players;
private readonly Cp437Grid _scoresBuffer;
private PixelGrid? _lastSentFrame;
private DateTime _nextFailLog = DateTime.Now;
public SendToServicePointDisplay(
@ -47,12 +45,8 @@ internal sealed class SendToServicePointDisplay : IFrameConsumer
RefreshScores();
try
{
await _displayConnection.SendBitmapLinearWindowAsync(0, 0, observerPixels);
await _displayConnection.SendCp437DataAsync(MapService.TilesPerRow, 0, _scoresBuffer);
if (_lastSentFrame == observerPixels)
return;
_lastSentFrame = observerPixels;
await _displayConnection.SendBitmapLinearWindowAsync(0, 0, _lastSentFrame);
}
catch (SocketException ex)
{