TowerGameProto/scripts/Building.gd

75 lines
2.0 KiB
GDScript3
Raw Normal View History

2025-04-16 22:56:14 +01:00
extends CollisionObject2D
class_name Building
enum BuildState { UNPLACED, BUILDING, FUNCTIONAL, DESTROYED }
signal selected(building: Building)
signal task_available(task: CitizenManager.Task)
signal placed()
signal built()
signal destroyed()
@export var build_materials_required: Dictionary[Item, int]
@export var build_time: float = 10.0
var build_materials: Dictionary[Item, int]
@export var build_state: BuildState = BuildState.UNPLACED
var old_collision_layers: int = 0
func start_placement() -> void:
set_collidable(false)
#$CollisionShape2D.disabled = true
func place() -> void:
build_state = BuildState.BUILDING
modulate = Color(1,1,1,0.25)
if !build_materials_required.is_empty():
for item in build_materials_required.keys():
for i in range(build_materials_required[item]):
var task: CitizenManager.FetchItemTask = CitizenManager.FetchItemTask.new()
task.building = self
task.item = item
task_available.emit(task)
else:
var build_task: CitizenManager.BuildTask = CitizenManager.BuildTask.new()
build_task.building = self
task_available.emit(build_task)
func add_build_material(item_node: ItemNode) -> void:
var item: Item = item_node.item_type
item_node.queue_free()
build_materials.set(item, build_materials.get(item,0) + 1)
if can_build():
var build_task: CitizenManager.BuildTask = CitizenManager.BuildTask.new()
build_task.building = self
task_available.emit(build_task)
func can_build() -> bool:
for item in build_materials_required.keys():
if build_materials.get(item, 0) < build_materials_required[item]:
return false
return true
func build() -> void:
build_state = BuildState.FUNCTIONAL
modulate = Color(1,1,1,1)
set_collidable(true)
func set_collidable(enabled: bool) -> void:
if enabled:
collision_layer = old_collision_layers
else:
old_collision_layers = collision_layer
collision_layer = 0x8000_0000 # layer 32
for child in find_children("*", "PathfindObstacle"):
child.enabled = enabled
func is_functional() -> bool:
return build_state == BuildState.FUNCTIONAL