delurbelako/scripts/structure.gd

83 lines
2.7 KiB
GDScript

@tool
extends Node2D
## Game object that interact with other structures in its grid space
class_name Structure
signal changed_direction(to: float,max_directions : int)
## Dimensions of structure in grid tiles
@export var dimensions : Rect2i = Rect2i(0,0,1,1):
set(value):
dimensions = value
if Engine.is_editor_hint():
queue_redraw()
get:
return dimensions
## Inventory of this structure
@export var inventory : Inventory
@export var direction : float
@export var maximum_directions : int
## Debug draw of points
func _draw() -> void:
if Engine.is_editor_hint():
for x in range(dimensions.size.x):
for y in range(dimensions.size.y):
draw_circle((dimensions.position+Vector2i(x,y)) * Vector2i(Globals.GRID_SIZE),2,Color.AQUA)
## Get structure at tile coordinates relative to this structure [br]
## dv : Vector2 - get position in tiles [br]
func get_relative(dv : Vector2) -> Structure:
if get_parent() is GridController:
return get_parent().get_at(global_position+dv*Globals.GRID_SIZE)
return null
## Check structure is in zone and does not collide with any other structures [br]
## Returns true if structure is in zone and does not collide with any other structure [br]
## Returns false if structure is not in zone or does not collide with any other structure
func can_be_placed(zone : PlacementZone) -> bool:
for dp in get_dimension_points():
var point = global_position + dp
if zone.is_global_point_in_zone(point) == false:
return false
if zone.grid_controller.is_point_occupied(point):
return false
return true
## Tries to place structure in zone's grid controller
## Returns false if structure is not in zone or collides with any structure
func try_place(zone : PlacementZone) -> bool:
if can_be_placed(zone) == false:
return false
return zone.grid_controller.add_structure(self)
## Returns array of integer points in dimensions
func get_dimension_points() -> Array[Vector2]:
var result : Array[Vector2] = []
result.resize(dimensions.size.x*dimensions.size.y)
for x in range(dimensions.size.x):
for y in range(dimensions.size.y):
result[x + y * dimensions.size.x] = (Vector2(x,y)*Globals.GRID_SIZE + Vector2(dimensions.position))
return result
func set_direction(to : float) -> void:
direction = to
changed_direction.emit(direction,maximum_directions)
func increment_direction() -> void:
set_direction(wrapf(direction + TAU/maximum_directions,0,TAU))
func decrement_direction() -> void:
set_direction(wrapf(direction - TAU/maximum_directions,0,TAU))
func direction_vector() -> Vector2:
return Vector2.from_angle(direction)
func direction_to(structure: Structure):
return (structure.global_position-global_position).angle()
func direction_difference(structure: Structure):
return direction-structure.direction