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 newIntents, List results) { var pool = coreLoop.ProgramRow.ToDictionary(card => card.CardId); var orderedCards = new List(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(); }