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

84 lines
3.2 KiB
C#

using System;
using System.Collections.Generic;
using RobotAndDonkey.Game.Board;
using RobotAndDonkey.Game.Cards;
using RobotAndDonkey.Game.Data;
using RobotAndDonkey.Game.Execution.Results;
using RobotAndDonkey.Game.GameState;
using RobotAndDonkey.Game.Pois;
namespace RobotAndDonkey.Game.Intents;
public class Move(Cell cell, Card card, EDirection direction, bool ignoreBlocking, int amount) : Intent
{
public override void Run(Guid requestId, CoreLoop coreLoop, List<Intent> newIntents, List<Result> results)
{
if (cell.Type == ECellType.Mud)
{
newIntents.Add(new ModifyCurrency(new(-Balancing.Instance.MudMoveEnergyCost, 0, 0, 0, 0, 0)));
}
var neighbour = cell.Hex;
for (int i = 0; i < Amount; ++i)
neighbour = neighbour.GetNeighbour(Direction);
var neighbourIndex = coreLoop.Board.FindCellIndex(neighbour);
if (neighbourIndex < 0)
{
results.Add(new InvalidInstructionResult(requestId, EInvalidReason.OutOfBounds, card, cell));
}
else
{
var neighbourCell = coreLoop.Board.Cells[neighbourIndex];
if (!ignoreBlocking && (neighbourCell.Type == ECellType.Blocked || neighbourCell.Poi != null))
{
results.Add(new InvalidInstructionResult(requestId, EInvalidReason.Blocked, card, neighbourCell));
}
else
{
var avatar = (Avatar)cell.Poi!;
cell.Poi = null;
neighbourCell.Poi = avatar;
results.Add(new PoiResult(requestId, new(coreLoop.Board), null, cell.Hex));
results.Add(new PoiResult(requestId, new(coreLoop.Board), avatar, neighbour));
coreLoop.PathLength += Amount;
coreLoop.CellsVisited.Add(cell.Hex);
coreLoop.CellsVisited.Add(neighbour);
if (coreLoop.Currency.Energy == 0)
{
coreLoop.EnergyWasted += 1;
}
foreach (var modifier in neighbourCell.Modifiers)
{
if (modifier.DebuffSources.Count > 0)
continue;
switch (modifier.Id)
{
case EModifierId.Corrupt:
case EModifierId.Unreliable:
case EModifierId.RaceCondition:
{
var tape = coreLoop.GetTapeCards();
var currentIndex = tape.IndexOf(card);
for (int i = currentIndex + 1; i < tape.Count; ++i)
newIntents.Add(new ModifyCard(tape[i], modifier.Id, EModifierDuration.Temporary, ECardLocation.Tape));
break;
}
}
}
}
}
base.Run(requestId, coreLoop, newIntents, results);
}
public EDirection Direction { get; set; } = direction;
public override bool IsValid(CoreLoop coreLoop) => base.IsValid(coreLoop) && cell.Poi is Avatar;
public int Amount { get; set; } = amount;
public override string ToString() => $"Move towards {Direction} by {Amount}, " + base.ToString();
}