74 lines
2.7 KiB
C#
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();
|
|
}
|