mirror of
https://github.com/creyD/ludum_dare_46.git
synced 2026-06-13 05:52:24 +02:00
Merge branch 'dev' into dev-gameplay
This commit is contained in:
217
src/Maps/Grid.gd
217
src/Maps/Grid.gd
@@ -1,32 +1,104 @@
|
||||
extends Node
|
||||
|
||||
const Kind = preload("res://Overlap/Kind.gd") # Relative path
|
||||
onready var aStar_node = AStar.new()
|
||||
|
||||
var path_start_position : Vector2= Vector2() setget _set_path_start_position
|
||||
var path_end_position : Vector2 = Vector2() setget _set_path_end_position
|
||||
|
||||
var obstacles = []
|
||||
var _point_path = []
|
||||
var _half_cell_size = Vector2()
|
||||
|
||||
var object_grid : Array = []
|
||||
var prio_grid : Array = []
|
||||
var used_grid : Array = []
|
||||
var time_passed := 0.0
|
||||
var offset
|
||||
export(float, 0, 42.0) var refresh_rate = 0.0
|
||||
export(float, 0, 42.0) var refresh_rate = 0.4
|
||||
|
||||
func _point_coors(point : Vector2):
|
||||
return 14*point.y+point.x
|
||||
|
||||
func _ready():
|
||||
var walls = get_tree().current_scene.get_node("FloorTileMap")
|
||||
offset = walls.global_position
|
||||
|
||||
|
||||
func _draw_object_grid():
|
||||
for x in range(14):
|
||||
object_grid.push_back([])
|
||||
prio_grid.push_back([])
|
||||
for y in range(7):
|
||||
object_grid[x].push_back([Kind.FIELD])
|
||||
prio_grid[x].push_back([Kind.TERMINAL_SYMBOL])
|
||||
|
||||
|
||||
for tile in walls.get_used_cells():
|
||||
if(is_in_coord(tile)):
|
||||
object_grid[tile.x][tile.y][0] = Kind.WALL
|
||||
obstacles.push_back(Vector2(tile.x, tile.y))
|
||||
|
||||
var walkableCells = []
|
||||
for y in range(7):
|
||||
var stri = ""
|
||||
for x in range(14):
|
||||
stri += str(object_grid[x][y]) + " "
|
||||
print(stri)
|
||||
print()
|
||||
|
||||
|
||||
func _draw_prio_grid():
|
||||
for y in range(7):
|
||||
var stri = ""
|
||||
for x in range(14):
|
||||
stri += str(prio_grid[x][y]) + " "
|
||||
print(stri)
|
||||
print()
|
||||
|
||||
if object_grid[x][y][0] == Kind.FIELD:
|
||||
walkableCells.push_back(Vector2(x,y))
|
||||
var Index = _point_coors(Vector2(x,y))
|
||||
aStar_node.add_point(Index, Vector3(x,y,0.0))
|
||||
|
||||
#add points straight
|
||||
for point in walkableCells:
|
||||
var point_index = _point_coors(point)
|
||||
|
||||
var points_relative_str = PoolVector2Array([
|
||||
Vector2(point.x + 1, point.y),
|
||||
Vector2(point.x - 1, point.y),
|
||||
Vector2(point.x , point.y + 1),
|
||||
Vector2(point.x , point.y - 1)
|
||||
])
|
||||
for point_rel in points_relative_str:
|
||||
var point_relative_index = _point_coors(point_rel)
|
||||
|
||||
if point_rel == point or not is_in_coord(point_rel):
|
||||
continue
|
||||
if not aStar_node.has_point(point_relative_index):
|
||||
continue
|
||||
aStar_node.connect_points(point_index, point_relative_index, true)
|
||||
|
||||
#diagonal
|
||||
for point in walkableCells:
|
||||
var point_index = _point_coors(point)
|
||||
|
||||
var points_relative_dia = PoolVector2Array([
|
||||
Vector2(point.x + 1, point.y + 1), Vector2(point.x, point.y + 1), Vector2(point.x + 1, point.y),
|
||||
Vector2(point.x - 1, point.y + 1), Vector2(point.x, point.y + 1), Vector2(point.x - 1, point.y),
|
||||
Vector2(point.x + 1, point.y - 1), Vector2(point.x, point.y - 1), Vector2(point.x + 1, point.y),
|
||||
Vector2(point.x - 1, point.y - 1), Vector2(point.x, point.y - 1), Vector2(point.x - 1, point.y)
|
||||
])
|
||||
|
||||
for i in range(points_relative_dia.size()/3):
|
||||
var p_targ = points_relative_dia[i*3]
|
||||
var p_ch1 = points_relative_dia[i*3+1]
|
||||
var p_ch2 = points_relative_dia[i*3+2]
|
||||
|
||||
var p_targ_c = _point_coors(p_targ)
|
||||
var p_ch1_c = _point_coors(p_targ)
|
||||
var p_ch2_c = _point_coors(p_targ)
|
||||
|
||||
if p_targ == point or not is_in_coord(p_targ) and not aStar_node.has_point(p_targ_c):
|
||||
continue
|
||||
if p_ch1 == point or not is_in_coord(p_ch1) and not aStar_node.has_point(p_ch1_c):
|
||||
continue
|
||||
if p_ch2 == point or not is_in_coord(p_ch2) and not aStar_node.has_point(p_ch2_c):
|
||||
continue
|
||||
|
||||
aStar_node.connect_points(point_index, p_targ_c, true)
|
||||
|
||||
|
||||
func recalculate_path():
|
||||
_point_path = []
|
||||
var start_index = _point_coors(path_start_position)
|
||||
var end_index = _point_coors(path_end_position)
|
||||
_point_path = aStar_node.get_point_path(start_index, end_index)
|
||||
|
||||
func _reset_grids():
|
||||
for x in range(14):
|
||||
@@ -37,32 +109,6 @@ func _reset_grids():
|
||||
prio_grid[x][y].pop_back()
|
||||
|
||||
|
||||
func _ready():
|
||||
var walls = get_tree().current_scene.get_node("FloorTileMap")
|
||||
offset = walls.global_position
|
||||
#todo put in grid_lul
|
||||
for x in range(14):
|
||||
object_grid.push_back([])
|
||||
prio_grid.push_back([])
|
||||
used_grid.push_back([])
|
||||
for y in range(7):
|
||||
object_grid[x].push_back([Kind.FIELD])
|
||||
prio_grid[x].push_back([Kind.TERMINAL_SYMBOL])
|
||||
used_grid[x].push_back(false)
|
||||
|
||||
for tile in walls.get_used_cells():
|
||||
if(_is_in_grid(tile)):
|
||||
object_grid[tile.x][tile.y][0] = Kind.WALL
|
||||
|
||||
_update_grid()
|
||||
|
||||
|
||||
func reset_history():
|
||||
for x in range(14):
|
||||
for y in range(7):
|
||||
used_grid[x][y] = false
|
||||
|
||||
|
||||
func countTargets(table):
|
||||
for i in range(table.size()):
|
||||
table[i]=0
|
||||
@@ -82,19 +128,6 @@ func _pixel_to_grid_coords(pixel : Vector2) -> Vector2:
|
||||
new_coords.y = floor((pixel.y-offset.y) / 32.0)
|
||||
return new_coords
|
||||
|
||||
|
||||
func _is_in_grid(grid_coords : Vector2) -> bool:
|
||||
if(grid_coords.x < 0):
|
||||
return false
|
||||
if(grid_coords.x > 13):
|
||||
return false
|
||||
if(grid_coords.y < 0):
|
||||
return false
|
||||
if(grid_coords.y > 6):
|
||||
return false
|
||||
return true
|
||||
|
||||
|
||||
func get_nearest(position, kind):
|
||||
var list = []
|
||||
for x in range(14):
|
||||
@@ -114,6 +147,23 @@ func get_nearest(position, kind):
|
||||
mini = i
|
||||
return list[mini]
|
||||
|
||||
func get_fields_around(point):
|
||||
var points_relative_str = PoolVector2Array([
|
||||
Vector2(point.x + 1, point.y + 1),
|
||||
Vector2(point.x - 1, point.y + 1),
|
||||
Vector2(point.x + 1, point.y - 1),
|
||||
Vector2(point.x - 1, point.y - 1)
|
||||
])
|
||||
var point_list = []
|
||||
for point_rel in points_relative_str:
|
||||
var point_relative_index = _point_coors(point_rel)
|
||||
if point_rel == point or not is_in_coord(point_rel):
|
||||
continue
|
||||
if not aStar_node.has_point(point_relative_index):
|
||||
continue
|
||||
point_list.push_back(point_rel)
|
||||
return point_list
|
||||
|
||||
|
||||
func _update_grid():
|
||||
_reset_grids()
|
||||
@@ -121,14 +171,65 @@ func _update_grid():
|
||||
for node in world.get_children():
|
||||
var node_kind = node.get_node("Kind")
|
||||
var grid_corrds = _pixel_to_grid_coords(node.global_position)
|
||||
if (_is_in_grid(grid_corrds)):
|
||||
if (is_in_coord(grid_corrds)):
|
||||
if(node_kind.general != Kind.FIELD): #and node_kind.general != Kind.WALL):
|
||||
object_grid[grid_corrds.x][grid_corrds.y].push_back(node_kind.general)
|
||||
prio_grid[grid_corrds.x][grid_corrds.y].push_back(node_kind.kind)
|
||||
|
||||
|
||||
for y in range(7):
|
||||
for x in range(14):
|
||||
var index = _point_coors(Vector2(x,y))
|
||||
var scale = 1.0
|
||||
for val in object_grid[x][y]:
|
||||
match val:
|
||||
Kind.DAMAGE:
|
||||
scale += 16
|
||||
Kind.HEALING:
|
||||
scale -= 8
|
||||
Kind.SLOW:
|
||||
scale += 8
|
||||
var neighboor_list = get_fields_around(Vector2(x,y))
|
||||
for neighboor in neighboor_list:
|
||||
for val in object_grid[neighboor.x][neighboor.y]:
|
||||
match val:
|
||||
Kind.DAMAGE:
|
||||
scale += 8
|
||||
Kind.HEALING:
|
||||
scale -= 4
|
||||
Kind.SLOW:
|
||||
scale += 4
|
||||
if(scale<0):
|
||||
scale = 0
|
||||
aStar_node.set_point_weight_scale(index, scale)
|
||||
|
||||
func _physics_process(delta):
|
||||
if(time_passed > refresh_rate):
|
||||
time_passed -= refresh_rate
|
||||
_update_grid()
|
||||
time_passed += delta
|
||||
|
||||
|
||||
func is_in_coord(point):
|
||||
if point[0]<0 || point[0]>13:
|
||||
return false
|
||||
if point[1]<0 || point[1]>6:
|
||||
return false
|
||||
return true
|
||||
|
||||
func _set_path_start_position(value : Vector2):
|
||||
if value in obstacles:
|
||||
return
|
||||
if not is_in_coord(value):
|
||||
return
|
||||
|
||||
path_start_position = value
|
||||
|
||||
|
||||
|
||||
func _set_path_end_position(value : Vector2):
|
||||
if value in obstacles:
|
||||
return
|
||||
if not is_in_coord(value):
|
||||
return
|
||||
|
||||
path_end_position = value
|
||||
|
||||
Reference in New Issue
Block a user