ported from perforce
This commit is contained in:
73
RobotAndDonkey.Game/Intents/MoveCards.cs
Normal file
73
RobotAndDonkey.Game/Intents/MoveCards.cs
Normal file
@@ -0,0 +1,73 @@
|
||||
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();
|
||||
}
|
||||
Reference in New Issue
Block a user