56 lines
1.4 KiB
C#
56 lines
1.4 KiB
C#
using Civilization.Core.Game;
|
|
using Civilization.Core.Interfaces;
|
|
|
|
|
|
namespace Civilization.Core.Units;
|
|
|
|
public class Unit : IOnTurnListener, IEntity
|
|
{
|
|
public Guid Id { get; } = Guid.NewGuid();
|
|
public int OwnerId { get; }
|
|
public UnitType Type { get; }
|
|
public UnitData Data { get; }
|
|
|
|
public Vec2I Position { get; set; }
|
|
public int MaxActionPoints { get; }
|
|
public int ActionPoints { get; set; }
|
|
|
|
public Unit(int ownerId, UnitType type, Vec2I position)
|
|
{
|
|
Id = Guid.NewGuid();
|
|
OwnerId = ownerId;
|
|
Type = type;
|
|
Position = position;
|
|
|
|
Data = UnitDataRegistry.Get(Type);
|
|
MaxActionPoints = Data.MaxActionPoints;
|
|
ActionPoints = MaxActionPoints;
|
|
}
|
|
|
|
public void ResetActionPoints()
|
|
{
|
|
ActionPoints = MaxActionPoints;
|
|
}
|
|
|
|
public bool CanMoveTo(Vec2I destination, GameMap map)
|
|
{
|
|
if (ActionPoints <= 0) return false;
|
|
|
|
if (!map.Grid.IsValidPosition(destination)) return false;
|
|
|
|
var distance = Math.Abs(Position.X - destination.X) + Math.Abs(Position.Y - destination.Y);
|
|
return distance <= Data.MoveRange;
|
|
}
|
|
|
|
public bool HasTag(UnitTag tag) => Data.HasTag(tag);
|
|
|
|
public void OnTurnStart(GameState state)
|
|
{
|
|
ResetActionPoints();
|
|
}
|
|
|
|
public void OnTurnEnd(GameState state)
|
|
{
|
|
|
|
}
|
|
} |