Files
2026-04-19 00:43:27 +02:00

74 lines
2.7 KiB
C#

using RobotAndDonkey.Game.Cards;
using RobotAndDonkey.Game.Data;
using RobotAndDonkey.Game.Execution;
using RobotAndDonkey.Game.Execution.Results;
using RobotAndDonkey.Game.GameState;
namespace RobotAndDonkey.Game.Intents;
public class MoveCards(Guid[] orderedCardIds, Guid[] tapeCardIds) : Intent
{
public override void Run(Guid requestId, CoreLoop coreLoop, List<Intent> newIntents, List<Result> results)
{
var pool = coreLoop.ProgramRow.ToDictionary(card => card.CardId);
var orderedCards = new List<Card>(orderedCardIds.Length);
foreach (var cardId in orderedCardIds)
{
if (pool.TryGetValue(cardId, out var card))
orderedCards.Add(card);
}
var tapeSet = tapeCardIds.ToHashSet();
var tapeCards = orderedCards.Where(card => tapeSet.Contains(card.CardId)).ToList();
var handCards = orderedCards.Where(card => !tapeSet.Contains(card.CardId)).ToList();
var occupiedHandSpace = handCards.Select(c => c.OccupiedSpace).Sum();
if (occupiedHandSpace > coreLoop.Currency.HandSize)
{
results.Add(new InvalidInstructionResult(requestId, EInvalidReason.NoSpace, null, null));
return;
}
var occupiedTapeSpace = tapeCards.Select(c => c.OccupiedSpace).Sum();
if (occupiedTapeSpace > coreLoop.Currency.TapeLength)
{
results.Add(new InvalidInstructionResult(requestId, EInvalidReason.NoSpace, null, null));
return;
}
coreLoop.SetProgramRow(orderedCards, tapeSet);
results.Add(new ProgramRowResult(requestId, coreLoop.ProgramRow.ToArray(), coreLoop.TapeCardIds));
results.Add(new HandResult(requestId, handCards.ToArray()));
results.Add(new TapeResult(requestId, tapeCards.ToArray()));
base.Run(requestId, coreLoop, newIntents, results);
}
public override bool IsValid(CoreLoop coreLoop)
{
if (!base.IsValid(coreLoop))
return false;
var inputSet = orderedCardIds.ToHashSet();
if (inputSet.Count != orderedCardIds.Length)
return false;
var coreLoopSet = coreLoop.ProgramRow.Select(card => card.CardId).ToHashSet();
if (!coreLoopSet.SetEquals(inputSet))
return false;
foreach (var cardId in tapeCardIds)
{
if (!inputSet.Contains(cardId))
return false;
}
return coreLoop.RunPhase == ERunPhase.ExecuteProgram;
}
public override bool Immune => true;
public override string ToString() => $"Rearrange, Ordered={string.Join(", ", orderedCardIds.Select(c => c.ToString()))}, Tape={string.Join(", ", tapeCardIds.Select(c => c.ToString()))}, " + base.ToString();
}