public Hex GetHexInDirectionOf(Hex from, Hex to) { HexCoords closetCoords = null; var minDistance = 99; foreach (var direction in HexCoords.directions) { var dirCoords = from.coords + direction; if (IsHexEmpty(dirCoords) && !IsHexLocked(dirCoords)) { var newDistance = HexCoords.Distance(dirCoords, to.coords); if (newDistance < minDistance) { minDistance = newDistance; closetCoords = dirCoords; } } } if (!(closetCoords is null)) { var offsetCoords = closetCoords.ToOffset(); return(grid[offsetCoords.y, offsetCoords.x]); } return(null); }
public Entity FindEnemyInRange(HexCoords fromPosition, int attackRange, Guid team) { Entity entity = null; Queue <HexCoords> openSet = new(); HashSet <HexCoords> closedSet = new(); foreach (var direction in HexCoords.directions) { openSet.Enqueue(fromPosition + direction); } while (openSet.Count > 0) { var coord = openSet.Dequeue(); closedSet.Add(coord); if (HexCoords.Distance(fromPosition, coord) > attackRange) { continue; } if (coord == fromPosition) { continue; } var unit = GetUnit(coord); if (!(unit is null)) { if (unit.GetComponent <TeamComponent>().Team != team) { return(unit); } } foreach (var direction in HexCoords.directions) { var newCoord = coord + direction; if (!Contains(newCoord)) { continue; } if (closedSet.Contains(newCoord)) { continue; } openSet.Enqueue(newCoord); } } return(entity); }
public int Distance(Hex other) { return(HexCoords.Distance(coords, other.coords)); }