Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ export_presets.cfg
# Mono-specific ignores
.mono/
data_*/
.godot
12 changes: 6 additions & 6 deletions AstarDebug.gd
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
extends Control

export(NodePath) onready var board = get_node(board)
onready var astar = board.astar if board else null
@export var board: AstarTileMap
@onready var astar: AStar2D = board.astar if board else null


func position_has_obstacle(obstacle_position):
return board.position_has_obstacle(obstacle_position) or board.position_has_unit(obstacle_position)

func _draw():
if not astar is AStar2D: return
var offset = board.cell_size/2
for point in astar.get_points():
var offset = Vector2.ZERO # Vector2( board.tile_set.tile_size )/2
for point in astar.get_point_ids():
if astar.is_point_disabled(point): continue
var point_position = astar.get_point_position(point)
if position_has_obstacle(point_position): continue

draw_circle(point_position+offset, 4, Color.white)
draw_circle(point_position+offset, 4, Color.WHITE)

var point_connections = astar.get_point_connections(point)
var connected_positions = []
Expand All @@ -26,4 +26,4 @@ func _draw():
connected_positions.append(connected_point_position)

for connected_position in connected_positions:
draw_line(point_position+offset, connected_position+offset, Color.white, 2)
draw_line(point_position+offset, connected_position+offset, Color.WHITE, 2)
42 changes: 26 additions & 16 deletions AstarTileMap.gd
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,15 @@ enum pairing_methods {
SZUDZIK_UNSIGNED, # more efficient than cantor
SZUDZIK_SIGNED, # both positive and negative values
SZUDZIK_IMPROVED, # improved version (best option)
SHIFTY_PAIR # For debugging; x and y are seeable by human. Ish.
}

export(pairing_methods) var current_pairing_method = pairing_methods.SZUDZIK_IMPROVED
@export var current_pairing_method : pairing_methods = pairing_methods.SZUDZIK_IMPROVED

export var diagonals := false
@export var diagonals := false

# The tile map layer to base the navigation on.
var read_layer = 0

var astar := AStar2D.new()
var obstacles := []
Expand All @@ -40,19 +44,19 @@ func create_pathfinding_points() -> void:
for cell_position in used_cell_positions:
connect_cardinals(cell_position)

func add_obstacle(obstacle: Object) -> void:
func add_obstacle(obstacle: Node) -> void:
obstacles.append(obstacle)
if not obstacle.is_connected("tree_exiting", self, "remove_obstacle"):
var _error := obstacle.connect("tree_exiting", self, "remove_obstacle", [obstacle])
if not obstacle.tree_exiting.is_connected(self.remove_obstacle):
var _error := obstacle.tree_exiting.connect( self.remove_obstacle.bind( obstacle ) )
if _error != 0: push_error(str(obstacle) + ": failed connect() function")

func remove_obstacle(obstacle: Object) -> void:
obstacles.erase(obstacle)

func add_unit(unit: Object) -> void:
func add_unit(unit: Node) -> void:
units.append(unit)
if not unit.is_connected("tree_exiting", self, "remove_unit"):
var _error := unit.connect("tree_exiting", self, "remove_unit", [unit])
if not unit.tree_exiting.is_connected(self.remove_unit):
var _error := unit.tree_exiting.connect(self.remove_unit.bind(unit))
if _error != 0: push_error(str(unit) + ": failed connect() function")

func remove_unit(unit: Object) -> void:
Expand Down Expand Up @@ -116,7 +120,7 @@ func get_floodfill_positions(start_position: Vector2, min_range: int, max_range:
var floodfill_positions := []
var checking_positions := [start_position]

while not checking_positions.empty():
while not checking_positions.is_empty():
var current_position : Vector2 = checking_positions.pop_back()
if skip_obstacles and position_has_obstacle(current_position, start_position): continue
if skip_units and position_has_unit(current_position, start_position): continue
Expand All @@ -133,7 +137,7 @@ func get_floodfill_positions(start_position: Vector2, min_range: int, max_range:
floodfill_positions.append(current_position)

for direction in DIRECTIONS:
var new_position := current_position + map_to_world(direction)
var new_position := current_position + self.global_position + self.map_to_local(direction)
if skip_obstacles and position_has_obstacle(new_position): continue
if skip_units and position_has_unit(new_position): continue
if new_position in floodfill_positions: continue
Expand Down Expand Up @@ -164,8 +168,8 @@ func path_directions(path) -> Array:
return directions

func get_point(point_position: Vector2) -> int:
var a := int(point_position.x)
var b := int(point_position.y)
var a := int(point_position.x / self.tile_set.tile_size.x)
var b := int(point_position.y / self.tile_set.tile_size.y)
match current_pairing_method:
pairing_methods.CANTOR_UNSIGNED:
assert(a >= 0 and b >= 0, "Board: pairing method has failed. Choose method that supports negative values.")
Expand All @@ -179,6 +183,8 @@ func get_point(point_position: Vector2) -> int:
return szudzik_pair_signed(a, b)
pairing_methods.SZUDZIK_IMPROVED:
return szudzik_pair_improved(a, b)
pairing_methods.SHIFTY_PAIR:
return shifty_pair(a, b)
return szudzik_pair_improved(a, b)

func cantor_pair(a:int, b:int) -> int:
Expand Down Expand Up @@ -229,15 +235,19 @@ func szudzik_pair_improved(x:int, y:int) -> int:
return -c - 1
return c

func shifty_pair( x: int, y: int) -> int:
# Assume they are less than 1000, combine by shifting.
return x * 1000 + y

func has_point(point_position: Vector2) -> bool:
var point_id := get_point(point_position)
return astar.has_point(point_id)

func get_used_cell_global_positions() -> Array:
var cells = get_used_cells()
var cells = get_used_cells( self.read_layer )
var cell_positions := []
for cell in cells:
var cell_position := global_position + map_to_world(cell)
var cell_position := global_position + map_to_local(cell)
cell_positions.append(cell_position)
return cell_positions

Expand All @@ -250,10 +260,10 @@ func connect_cardinals(point_position) -> void:
directions += diagonals_array

for direction in directions:
var cardinal_point := get_point(point_position + map_to_world(direction))
var cardinal_point := get_point(point_position + direction * tile_set.tile_size.x )
if cardinal_point != center and astar.has_point(cardinal_point):
astar.connect_points(center, cardinal_point, true)

func get_grid_distance(distance: Vector2) -> float:
var vec := world_to_map(distance).abs().floor()
var vec := local_to_map(distance).abs()
return vec.x + vec.y
31 changes: 15 additions & 16 deletions D6.png.import
Original file line number Diff line number Diff line change
@@ -1,35 +1,34 @@
[remap]

importer="texture"
type="StreamTexture"
path="res://.import/D6.png-6c575faccc49ff17e8f14be59da3fd95.stex"
type="CompressedTexture2D"
uid="uid://cjq5g36vd2eyd"
path="res://.godot/imported/D6.png-6c575faccc49ff17e8f14be59da3fd95.ctex"
metadata={
"vram_texture": false
}

[deps]

source_file="res://D6.png"
dest_files=[ "res://.import/D6.png-6c575faccc49ff17e8f14be59da3fd95.stex" ]
dest_files=["res://.godot/imported/D6.png-6c575faccc49ff17e8f14be59da3fd95.ctex"]

[params]

compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/hdr_compression=1
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
process/normal_map_invert_y=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
31 changes: 15 additions & 16 deletions D6_outline.png.import
Original file line number Diff line number Diff line change
@@ -1,35 +1,34 @@
[remap]

importer="texture"
type="StreamTexture"
path="res://.import/D6_outline.png-3b4077c841a3714cd66785ea9e8e4670.stex"
type="CompressedTexture2D"
uid="uid://470l4wyjhmig"
path="res://.godot/imported/D6_outline.png-3b4077c841a3714cd66785ea9e8e4670.ctex"
metadata={
"vram_texture": false
}

[deps]

source_file="res://D6_outline.png"
dest_files=[ "res://.import/D6_outline.png-3b4077c841a3714cd66785ea9e8e4670.stex" ]
dest_files=["res://.godot/imported/D6_outline.png-3b4077c841a3714cd66785ea9e8e4670.ctex"]

[params]

compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/hdr_compression=1
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
process/normal_map_invert_y=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
31 changes: 15 additions & 16 deletions Pawn.png.import
Original file line number Diff line number Diff line change
@@ -1,35 +1,34 @@
[remap]

importer="texture"
type="StreamTexture"
path="res://.import/Pawn.png-da0f362a1d182bb822ec23a0a67589a8.stex"
type="CompressedTexture2D"
uid="uid://cp7ffbyltj6km"
path="res://.godot/imported/Pawn.png-da0f362a1d182bb822ec23a0a67589a8.ctex"
metadata={
"vram_texture": false
}

[deps]

source_file="res://Pawn.png"
dest_files=[ "res://.import/Pawn.png-da0f362a1d182bb822ec23a0a67589a8.stex" ]
dest_files=["res://.godot/imported/Pawn.png-da0f362a1d182bb822ec23a0a67589a8.ctex"]

[params]

compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/hdr_compression=1
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
process/normal_map_invert_y=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
31 changes: 15 additions & 16 deletions StructureWall.png.import
Original file line number Diff line number Diff line change
@@ -1,35 +1,34 @@
[remap]

importer="texture"
type="StreamTexture"
path="res://.import/StructureWall.png-77b9540f29c022041c1fe57947db39fd.stex"
type="CompressedTexture2D"
uid="uid://dkr8omenqt7rn"
path="res://.godot/imported/StructureWall.png-77b9540f29c022041c1fe57947db39fd.ctex"
metadata={
"vram_texture": false
}

[deps]

source_file="res://StructureWall.png"
dest_files=[ "res://.import/StructureWall.png-77b9540f29c022041c1fe57947db39fd.stex" ]
dest_files=["res://.godot/imported/StructureWall.png-77b9540f29c022041c1fe57947db39fd.ctex"]

[params]

compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/hdr_compression=1
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
process/normal_map_invert_y=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
12 changes: 6 additions & 6 deletions World.gd
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
extends Node2D

onready var board = $Board
onready var astarDebug = $AstarDebug
onready var player = $Board/Player
onready var line = $Line
@onready var board : AstarTileMap = $Board
@onready var astarDebug = $AstarDebug
@onready var player = $Board/Player
@onready var line = $Line

func _input(event):
if event.is_action_pressed("mouse_left"):
var target_cell = (event.position / board.cell_size).floor() * board.cell_size
var target_cell = event.position
var path_points = board.get_astar_path_avoiding_obstacles_and_units(player.global_position, target_cell)
line.position = board.cell_size/2 # Use offset to move line to center of tiles
# line.position = board.tile_set.tile_size/2 # Use offset to move line to center of tiles
line.points = path_points

if event.is_action_pressed("mouse_right"):
Expand Down
Loading