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 obj_list = $ObjectList obj_list.call_deferred("reparent", get_tree().get_root().get_node("main"), false) await get_tree().create_timer(0.2).timeout var objects_to_be_placed = obj_list.get_children() for object in objects_to_be_placed: var offset = object.global_position; object.global_position = Grid.get_world_position(location, offset) # 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) grid_entrance_callback(object) func grid_entrance_callback(object : Node): # Objects receive a callback when placed, starting from the deepest children for child in object.get_children(): grid_entrance_callback(child) if object.has_method("_enter_grid"): object.call_deferred("_enter_grid") 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()