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