The_Dark_Side_of_Earth/buildings/building.gd
2025-10-11 19:30:55 +02:00

58 lines
2.5 KiB
GDScript

class_name Building extends Node2D
@export var location : Vector2i # x is the angle, y is the height in the grid
@export var dimension : Vector2i = Vector2(2, 1) # same as above
@export var blocks_area = true
var objects = []
var destroyed = false
# make sure location is set before adding a building to the scene tree
# also make sure that the buildings are instantiated as children of the grid
func _ready() -> void:
global_position = Grid.get_world_position(location)
if blocks_area:
Grid.buildings.append(self)
await get_tree().create_timer(0.2).timeout
if get_node_or_null("ObjectList") != null:
var objects_to_be_placed = $ObjectList.get_children()
$ObjectList.reparent(get_tree().get_root().get_node("main"), false)
for object in objects_to_be_placed:
var offset = object.global_position;
object.global_position = Grid.get_world_position(location, offset)
# some objects, such as petals, require information about their position in the grid.
if "location" in object: object.location = Grid.get_location_from_world_pos(object.global_position)
if "offset" in object:
object.offset = Global.vec_mod(offset, 300)
# The building remembers these objects: If it is destroyed, so are they.
if object is Platform or object is Trap or object is Item:
objects.append(object)
if "building" in object: object.building = self
# This scales platforms hoizontally to make sure they still form a floor without gaps.
if(object.has_method("init_at_horizontal_distortion")):
object.init_at_horizontal_distortion(object.position.length() / Grid.ground_radius)
func overlaps(other : Building):
# heights don't overlap
if location.y >= other.location.y + other.dimension.y: return false # other is below
if location.y + dimension.y <= other.location.y: return false # other is above
# angles overlap. We can now assume heights overlap
var relative_other_loc = (other.location.x - location.x + Grid.num_collumns) % Grid.num_collumns
if dimension.x > relative_other_loc: return true
if relative_other_loc + other.dimension.x > Grid.num_collumns: return true
# If we get here, angles do not overlap
return false
func destroy():
if not destroyed:
# On destruction, the building is removed from the list and destroyed together with all its objects.
Grid.buildings.remove_at(Grid.buildings.find(self))
for object in objects:
if object != null and not ("collected" in object and object.collected):
object.queue_free()
destroyed = true
queue_free()