The_Dark_Side_of_Earth/buildings/building.gd

56 lines
1.9 KiB
GDScript3
Raw Normal View History

2025-09-16 00:19:40 +02:00
class_name Building extends Node2D
@export var location : Vector2i # x is the angle, y is the height in the grid
2025-09-16 16:24:53 +02:00
@export var dimension : Vector2i = Vector2(2, 1) # same as above
2025-09-24 16:37:34 +02:00
@export var blocks_area = true
2025-09-16 00:19:40 +02:00
@onready var grid : Grid = get_parent()
2025-09-18 18:10:44 +02:00
var objects = []
var destroyed = false
2025-09-16 00:19:40 +02:00
# 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:
2025-09-16 11:44:16 +02:00
assert(grid != null)
2025-10-03 11:30:45 +02:00
position = grid.get_world_position(location)
2025-09-24 16:37:34 +02:00
if blocks_area:
grid.buildings.append(self)
2025-09-16 16:13:14 +02:00
2025-09-18 18:10:44 +02:00
await get_tree().create_timer(0.2).timeout
2025-09-16 16:24:53 +02:00
if get_node_or_null("EnemyList") != null:
2025-09-17 19:25:22 +02:00
var enemies = $EnemyList.get_children()
$EnemyList.reparent(get_tree().get_root().get_node("main"), false)
for enemy in enemies:
var oldpos = enemy.position;
2025-10-03 11:30:45 +02:00
enemy.position = grid.get_world_position(oldpos)
2025-09-18 18:10:44 +02:00
if enemy is Platform or enemy is Trap or enemy is Item:
objects.append(enemy)
if "building" in enemy: enemy.building = self
if(enemy.has_method("init_at_horizontal_distortion")):
enemy.init_at_horizontal_distortion(enemy.position.length() / grid.ground_radius)
2025-09-16 00:19:40 +02:00
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
2025-09-16 11:44:16 +02:00
if relative_other_loc + other.dimension.x > grid.num_collumns: return true
2025-09-16 00:19:40 +02:00
# If we get here, angles do not overlap
return false
2025-09-18 18:10:44 +02:00
func destroy():
if not destroyed:
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()