implemented visibility, so pegs can only scope out as far as they can see.

This commit is contained in:
2026-06-30 18:24:11 -04:00
parent c8e81e4f48
commit b1625b15a0
8 changed files with 53 additions and 32 deletions
+20 -8
View File
@@ -7,7 +7,7 @@ public partial class Peg : HoverableNode
{ {
[Signal] [Signal]
public delegate void DeathEventHandler(Peg THIS); public delegate void DeathEventHandler(Peg THIS);
public int _id, _health = 2, _healthMax = 2, _stamina, _staminaRemaining, _visibility = 4, _movement = 0, _disposition; public int _id, _health = 2, _healthMax = 2, _stamina, _staminaRemaining, _movement = 0, _disposition, _visibility;
public Vector2I _address; public Vector2I _address;
public List<Vector2I> _path = new(); public List<Vector2I> _path = new();
public PegController _pegController; public PegController _pegController;
@@ -36,12 +36,6 @@ public partial class Peg : HoverableNode
break; break;
} }
} }
if (action == null)
{
return null;
}
_staminaRemaining -= action._cost;
return action; return action;
} }
@@ -68,10 +62,28 @@ public partial class Peg : HoverableNode
return pathsOverZeroCount.OrderBy(p => p.Count).ToList()[0]; return pathsOverZeroCount.OrderBy(p => p.Count).ToList()[0];
} }
public virtual List<Vector2I> GetVisibleCells()
{
Map map = _pegController._playArea._map;
return [.. map._cells.Where(c => (c - _address).Length() <= _visibility)];
}
public virtual List<Vector2I> GetGoals() public virtual List<Vector2I> GetGoals()
{ {
Map map = _pegController._playArea._map; Map map = _pegController._playArea._map;
return [.. map._cells.Where(c => c.Y == (_disposition == 1 ? map._lastOpenRow : map._firstOpenRow)).Where(c => !map._astar.IsPointSolid(c))]; TileMapLayer pathLayer = _pegController._playArea.GetNode<TileMapLayer>("PathLayer");
List<Vector2I> pl = [.. pathLayer.GetUsedCells()];
List<Vector2I> visible = GetVisibleCells();
if (_id == 4)
for (int i = 0; i < pl.Count; i++)
{
Vector2I cell = pl[i];
pathLayer.GetUsedCells().ToList().ForEach(c => pathLayer.SetCell(cell,0,Vector2I.Down + Vector2I.Right*(visible.IndexOf(cell) > -1 ? 1 : 4)));
}
List<Vector2I> unoccupied = [.. visible.Where(c => !map._astar.IsPointSolid(c))];
List<Vector2I> closest = [.. unoccupied.Where(c => c.Y == (_disposition == -1 ? unoccupied.Min(c => c.Y) : unoccupied.Max(c => c.Y))).OrderByDescending(c => Math.Abs(c.X - _address.X))];
return closest;
} }
public Vector2 GetPositionFromAddress() public Vector2 GetPositionFromAddress()
+8 -8
View File
@@ -5,6 +5,8 @@ using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection.Metadata; using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Xml; using System.Xml;
@@ -52,6 +54,7 @@ public partial class PegController : TurnController
{ {
HostilePeg newHostilePeg = Globals.GetRandomFromList(_hostilePegScenes).Instantiate<HostilePeg>(); HostilePeg newHostilePeg = Globals.GetRandomFromList(_hostilePegScenes).Instantiate<HostilePeg>();
newHostilePeg._id = _pegsCreated; newHostilePeg._id = _pegsCreated;
newHostilePeg.Scale *= _pegsCreated == 4 ? 1.5f : 1f;
newHostilePeg.Death += HandlePegRemoval; newHostilePeg.Death += HandlePegRemoval;
newHostilePeg.Click += HandlePegClick; newHostilePeg.Click += HandlePegClick;
@@ -80,6 +83,7 @@ public partial class PegController : TurnController
if (action != null) if (action != null)
{ {
action.DoImmediately(peg);
string key = action._priority + ":" + loop; string key = action._priority + ":" + loop;
if (!_tweenStages.ContainsKey(key)) if (!_tweenStages.ContainsKey(key))
{ {
@@ -90,24 +94,23 @@ public partial class PegController : TurnController
{ {
anyPegsActed = true; anyPegsActed = true;
} }
peg._staminaRemaining -= action._cost;
} }
} }
loop++; loop++;
} }
ProcessTween();
} }
public void HandlePegClick(Node CLICKED_NODE, int CLICK_TYPE) public void HandlePegClick(Node CLICKED_NODE, int CLICK_TYPE)
{ {
TileMapLayer pathLayer = _playArea.GetNode<TileMapLayer>("PathLayer");
if (CLICKED_NODE is not Peg peg) if (CLICKED_NODE is not Peg peg)
{ {
return; return;
} }
if (CLICK_TYPE == 0) if (CLICK_TYPE == 0)
{ {
if (peg._staminaRemaining <= 0){
return;
}
TileMapLayer pathLayer = _playArea.GetNode<TileMapLayer>("PathLayer");
List<Vector2I> newPath = peg.GetBestPath(); List<Vector2I> newPath = peg.GetBestPath();
pathLayer.GetUsedCells().ToList().ForEach(c => pathLayer.SetCell(c,0,Vector2I.Down*4)); pathLayer.GetUsedCells().ToList().ForEach(c => pathLayer.SetCell(c,0,Vector2I.Down*4));
@@ -138,7 +141,7 @@ public partial class PegController : TurnController
public void Initiate() public void Initiate()
{ {
List<Vector2I> positions = [.. _playArea.GetNode<TileMapLayer>("InitialPositions").GetUsedCells()]; List<Vector2I> positions = [.. _playArea.GetNode<TileMapLayer>("InitialPositions").GetUsedCells().OrderBy(c => c.Y).ThenBy(c => c.X)];
AddHostilePegs(positions); AddHostilePegs(positions);
} }
@@ -181,12 +184,9 @@ public partial class PegController : TurnController
{ {
_pegs[i].StartTurn(); _pegs[i].StartTurn();
} }
HandlePegSort(); HandlePegSort();
HandlePegTurn(); HandlePegTurn();
ProcessTween();
} }
public void SetPeg(Peg PEG, Vector2I CELL) public void SetPeg(Peg PEG, Vector2I CELL)
+12 -8
View File
@@ -9,7 +9,6 @@ public partial class BasicMovement : PegAction
base._Ready(); base._Ready();
_category = "movement"; _category = "movement";
_priority = 0; _priority = 0;
_healthChange = 0;
_cost = 1; _cost = 1;
_range = 2^32; _range = 2^32;
_usesMax = 2^32; _usesMax = 2^32;
@@ -17,23 +16,28 @@ public partial class BasicMovement : PegAction
} }
public override Tween CreateAnimation(Peg PEG) public override Tween CreateAnimation(Peg PEG)
{
PegController pegController = PEG._pegController;
Map map = pegController._playArea._map;
Vector2I cell = PEG._path[0];
Tween subtween = CreateTween();
subtween.TweenProperty(PEG, "global_position", map.GetCellPositionFromAddress(cell), 0.25f);
PEG._path.RemoveAt(0);
return subtween;
}
public override void DoImmediately(Peg PEG)
{ {
List<Vector2I> path = PEG.GetBestPath(); List<Vector2I> path = PEG.GetBestPath();
PegController pegController = PEG._pegController; PegController pegController = PEG._pegController;
Map map = pegController._playArea._map; Map map = pegController._playArea._map;
if (path?.Count == 0) if (path?.Count == 0)
{ {
return null; return;
} }
Vector2I cell = path[0]; Vector2I cell = path[0];
map.SetCellPeg(cell, PEG); map.SetCellPeg(cell, PEG);
PEG._path.Add(cell); PEG._path.Add(cell);
Tween subtween = CreateTween();
subtween.TweenProperty(PEG, "global_position", map.GetCellPositionFromAddress(cell), 0.25f);
return subtween;
} }
public override bool MeetsCriteria(Peg PEG) public override bool MeetsCriteria(Peg PEG)
+1 -2
View File
@@ -9,7 +9,6 @@ public partial class Shortbow : PegAction
base._Ready(); base._Ready();
_category = "attack"; _category = "attack";
_priority = 1; _priority = 1;
_healthChange = -1;
_cost = 2; _cost = 2;
_range = 1; _range = 1;
_usesMax = 1; _usesMax = 1;
@@ -24,7 +23,7 @@ public partial class Shortbow : PegAction
subtween.TweenProperty(_image, "global_position", target, 0.5f); subtween.TweenProperty(_image, "global_position", target, 0.5f);
subtween.TweenCallback(Callable.From(() => subtween.TweenCallback(Callable.From(() =>
{ {
PEG._pegController._playerController.ChangeHealth(_healthChange, this); PEG._pegController._playerController.ChangeHealth(-1, this);
Position = Vector2.Zero; Position = Vector2.Zero;
Visible = false; Visible = false;
})); }));
+3 -4
View File
@@ -9,7 +9,6 @@ public partial class Shortsword : PegAction
base._Ready(); base._Ready();
_category = "attack"; _category = "attack";
_priority = 1; _priority = 1;
_healthChange = -2;
_cost = 2; _cost = 2;
_range = 0; _range = 0;
_usesMax = 1; _usesMax = 1;
@@ -18,14 +17,14 @@ public partial class Shortsword : PegAction
public override Tween CreateAnimation(Peg PEG) public override Tween CreateAnimation(Peg PEG)
{ {
Vector2 target = PEG._disposition * Vector2.Up * PEG._pegController._playArea._map._cellSize; Vector2 target = PEG._disposition * Vector2.Down * PEG._pegController._playArea._map._cellSize;
GD.Print(target); // GD.Print(target);
Tween subtween = CreateTween(); Tween subtween = CreateTween();
subtween.TweenProperty(_image, "visible", true, 0.0f); subtween.TweenProperty(_image, "visible", true, 0.0f);
subtween.TweenProperty(_image, "position", target, 0.5f); subtween.TweenProperty(_image, "position", target, 0.5f);
subtween.TweenCallback(Callable.From(() => subtween.TweenCallback(Callable.From(() =>
{ {
PEG._pegController._playerController.ChangeHealth(_healthChange, this); PEG._pegController._playerController.ChangeHealth(-2, this);
_image.Position = Vector2.Zero; _image.Position = Vector2.Zero;
_image.Visible = false; _image.Visible = false;
})); }));
+1
View File
@@ -7,5 +7,6 @@ public partial class Archer : HostilePeg
{ {
base._Ready(); base._Ready();
_stamina = 2; _stamina = 2;
_visibility = 4;
} }
} }
+1
View File
@@ -7,5 +7,6 @@ public partial class Infantry : HostilePeg
{ {
base._Ready(); base._Ready();
_stamina = 3; _stamina = 3;
_visibility = 3;
} }
} }
+6 -1
View File
@@ -4,7 +4,7 @@ using System;
public partial class PegAction : Node2D public partial class PegAction : Node2D
{ {
public string _category; public string _category;
public int _priority, _healthChange, _cost, _range, _usesMax, _usesRemaining, _triggers = 0; public int _priority, _cost, _range, _usesMax, _usesRemaining, _triggers = 0;
public Sprite2D _image; public Sprite2D _image;
public override void _Ready() public override void _Ready()
@@ -18,6 +18,11 @@ public partial class PegAction : Node2D
return null; return null;
} }
public virtual void DoImmediately(Peg PEG)
{
}
public virtual bool MeetsCriteria(Peg PEG) public virtual bool MeetsCriteria(Peg PEG)
{ {
return PEG._staminaRemaining >= _cost return PEG._staminaRemaining >= _cost