75 lines
2.0 KiB
GDScript
75 lines
2.0 KiB
GDScript
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
|