Citizens now take stuff from producers. Also added build hologram when building a thingy.

This commit is contained in:
Nekojimi 2025-05-08 13:05:57 +01:00
parent 78bfcde7a0
commit a23db504ca
15 changed files with 234 additions and 84 deletions

File diff suppressed because one or more lines are too long

View File

@ -6,6 +6,7 @@
[ext_resource type="Resource" uid="uid://dxlb2ixt3fx7l" path="res://items/ore.tres" id="3_w18nb"] [ext_resource type="Resource" uid="uid://dxlb2ixt3fx7l" path="res://items/ore.tres" id="3_w18nb"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_0gk2u"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_0gk2u"]
albedo_color = Color(0.245167, 1, 0, 1)
[sub_resource type="BoxMesh" id="BoxMesh_cee1v"] [sub_resource type="BoxMesh" id="BoxMesh_cee1v"]
material = SubResource("StandardMaterial3D_0gk2u") material = SubResource("StandardMaterial3D_0gk2u")

View File

@ -10,6 +10,8 @@
[node name="Miner" instance=ExtResource("1_8r86l")] [node name="Miner" instance=ExtResource("1_8r86l")]
script = ExtResource("2_k13eg") script = ExtResource("2_k13eg")
mine_period = 1.0 mine_period = 1.0
hologram_build_min = 0.0
hologram_build_max = 2.0
build_materials_needed = Dictionary[ExtResource("3_8y6s2"), int]({}) build_materials_needed = Dictionary[ExtResource("3_8y6s2"), int]({})
can_stack = false can_stack = false

View File

@ -1,20 +1,14 @@
[gd_scene load_steps=12 format=3 uid="uid://c6e1nifka3h4v"] [gd_scene load_steps=10 format=3 uid="uid://c6e1nifka3h4v"]
[ext_resource type="PackedScene" uid="uid://b1fnsl3k1mo5c" path="res://objects/buildings/building.tscn" id="1_hxugg"] [ext_resource type="PackedScene" uid="uid://b1fnsl3k1mo5c" path="res://objects/buildings/building.tscn" id="1_hxugg"]
[ext_resource type="Script" uid="uid://c3bqfgoof2c83" path="res://scripts/buildings/processor.gd" id="2_evfwj"] [ext_resource type="Script" uid="uid://c3bqfgoof2c83" path="res://scripts/buildings/processor.gd" id="2_evfwj"]
[ext_resource type="Script" uid="uid://kcdpck5ufgcc" path="res://scripts/item.gd" id="3_dx8de"] [ext_resource type="Script" uid="uid://kcdpck5ufgcc" path="res://scripts/item.gd" id="3_dx8de"]
[ext_resource type="Resource" uid="uid://ed64yksg1y6m" path="res://items/bullets.tres" id="4_3h7kv"] [ext_resource type="Resource" uid="uid://ed64yksg1y6m" path="res://items/bullets.tres" id="4_3h7kv"]
[ext_resource type="Script" uid="uid://bshiyw2k3op02" path="res://scripts/building_components/consumer.gd" id="4_dx8de"] [ext_resource type="Script" uid="uid://bshiyw2k3op02" path="res://scripts/building_components/consumer.gd" id="4_dx8de"]
[ext_resource type="Shader" uid="uid://c7ahmb00sly4d" path="res://shaders/hologram.gdshader" id="5_dx8de"]
[ext_resource type="Script" uid="uid://c4fquatkjmsgu" path="res://scripts/building_components/producer.gd" id="5_p3dou"] [ext_resource type="Script" uid="uid://c4fquatkjmsgu" path="res://scripts/building_components/producer.gd" id="5_p3dou"]
[ext_resource type="Resource" uid="uid://dxlb2ixt3fx7l" path="res://items/ore.tres" id="7_dx8de"] [ext_resource type="Resource" uid="uid://dxlb2ixt3fx7l" path="res://items/ore.tres" id="7_dx8de"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_p3dou"]
render_priority = 0
shader = ExtResource("5_dx8de")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_evfwj"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_evfwj"]
next_pass = SubResource("ShaderMaterial_p3dou")
albedo_color = Color(0.023159, 1, 0, 1) albedo_color = Color(0.023159, 1, 0, 1)
[sub_resource type="BoxMesh" id="BoxMesh_3h7kv"] [sub_resource type="BoxMesh" id="BoxMesh_3h7kv"]

View File

@ -0,0 +1,29 @@
[gd_scene load_steps=7 format=3 uid="uid://buoyeprlof38x"]
[ext_resource type="PackedScene" uid="uid://b1fnsl3k1mo5c" path="res://objects/buildings/building.tscn" id="1_7qwib"]
[ext_resource type="Script" uid="uid://bshiyw2k3op02" path="res://scripts/building_components/consumer.gd" id="2_36s1u"]
[ext_resource type="Script" uid="uid://ba5aqcwabpfp0" path="res://scripts/buildings/storage.gd" id="2_evbsr"]
[ext_resource type="Script" uid="uid://c4fquatkjmsgu" path="res://scripts/building_components/producer.gd" id="3_evbsr"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_nr174"]
albedo_color = Color(0, 1, 0.979857, 1)
[sub_resource type="BoxMesh" id="BoxMesh_36s1u"]
material = SubResource("StandardMaterial3D_nr174")
size = Vector3(2, 2, 2)
[node name="Building" instance=ExtResource("1_7qwib")]
script = ExtResource("2_evbsr")
[node name="MeshInstance3D" parent="." index="0"]
mesh = SubResource("BoxMesh_36s1u")
[node name="Consumer" type="Node" parent="." index="6"]
script = ExtResource("2_36s1u")
storage_size = 250
max_inputs = 3
metadata/_custom_type_script = "uid://bshiyw2k3op02"
[node name="Producer" type="Node" parent="." index="7"]
script = ExtResource("3_evbsr")
metadata/_custom_type_script = "uid://c4fquatkjmsgu"

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=8 format=3 uid="uid://cw3vtaevqx20y"] [gd_scene load_steps=9 format=3 uid="uid://cw3vtaevqx20y"]
[ext_resource type="PackedScene" uid="uid://b1fnsl3k1mo5c" path="res://objects/buildings/building.tscn" id="1_cgb0l"] [ext_resource type="PackedScene" uid="uid://b1fnsl3k1mo5c" path="res://objects/buildings/building.tscn" id="1_cgb0l"]
[ext_resource type="Script" uid="uid://bl78fqp1abxd6" path="res://scripts/buildings/turret.gd" id="2_brx0q"] [ext_resource type="Script" uid="uid://bl78fqp1abxd6" path="res://scripts/buildings/turret.gd" id="2_brx0q"]
@ -8,6 +8,10 @@
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cgb0l"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cgb0l"]
albedo_color = Color(0, 0.00397563, 1, 1) albedo_color = Color(0, 0.00397563, 1, 1)
[sub_resource type="BoxMesh" id="BoxMesh_kpsgq"]
material = SubResource("StandardMaterial3D_cgb0l")
size = Vector3(2, 2, 2)
[sub_resource type="CylinderMesh" id="CylinderMesh_kpsgq"] [sub_resource type="CylinderMesh" id="CylinderMesh_kpsgq"]
material = SubResource("StandardMaterial3D_cgb0l") material = SubResource("StandardMaterial3D_cgb0l")
top_radius = 1.0 top_radius = 1.0
@ -36,7 +40,7 @@ compensate_for_gravity = true
use_artillery_firing_solution = false use_artillery_firing_solution = false
[node name="MeshInstance3D" parent="." index="0"] [node name="MeshInstance3D" parent="." index="0"]
material_override = SubResource("StandardMaterial3D_cgb0l") mesh = SubResource("BoxMesh_kpsgq")
[node name="MeshInstance3D" type="MeshInstance3D" parent="MeshInstance3D" index="0"] [node name="MeshInstance3D" type="MeshInstance3D" parent="MeshInstance3D" index="0"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.25, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.25, 0)

View File

@ -28,6 +28,7 @@ run/main_scene="uid://bwftban1ppo17"
config/features=PackedStringArray("4.4") config/features=PackedStringArray("4.4")
config/icon="uid://u1hpdb62rxlc" config/icon="uid://u1hpdb62rxlc"
addons/icon_finder/preview_size=25 addons/icon_finder/preview_size=25
config/git_describe="78bfcde"
[autoload] [autoload]

View File

@ -45,7 +45,7 @@ func remove_task(task: Task):
task_queue.remove_at(idx) task_queue.remove_at(idx)
func add_task(task: Task): func add_task(task: Task):
print("Task added to queue: %s" % task.name) print("Task added to queue: %s" % task.get_task_name())
var idx: int = task_queue.bsearch_custom(task, sort_tasks, false) var idx: int = task_queue.bsearch_custom(task, sort_tasks, false)
task_queue.insert(idx, task) task_queue.insert(idx, task)

View File

@ -1,6 +1,10 @@
extends Node3D extends Node3D
class_name Building class_name Building
@export var hologram_material: Material = preload("res://shaders/hologram_material.tres")
@export var hologram_build_min: float = -1
@export var hologram_build_max: float = 1
@export_group("Construction", "build") @export_group("Construction", "build")
@export var build_time: float = 5.0 ## Worker-time taken for 1 citizen to finish the building, in citizen-seconds. @export var build_time: float = 5.0 ## Worker-time taken for 1 citizen to finish the building, in citizen-seconds.
@export var build_materials_needed: Dictionary[Item, int] = {} @export var build_materials_needed: Dictionary[Item, int] = {}
@ -157,5 +161,12 @@ func set_visual_build_progress(ratio: float) -> void:
var geometries: Array[Node] = find_children("", "GeometryInstance3D", true) var geometries: Array[Node] = find_children("", "GeometryInstance3D", true)
for node in geometries: for node in geometries:
var geometry: GeometryInstance3D = node as GeometryInstance3D var geometry: GeometryInstance3D = node as GeometryInstance3D
var opacity: float = 0.5 + (ratio * 0.5) if geometry != null:
geometry.transparency = 1.0 - opacity if ratio >= 1.0:
geometry.material_override = null
else:
geometry.material_override = hologram_material
var built_amount: float = remap(ratio, 0, 1, hologram_build_min, hologram_build_max)
geometry.set_instance_shader_parameter("built_amount", built_amount)
#var opacity: float = 0.5 + (ratio * 0.5)
#geometry.transparency = 1.0 - opacity

View File

@ -10,11 +10,18 @@ var last_consumer_idx: int = 0
#var output_timer: float = 0.0 #var output_timer: float = 0.0
#var output_item: Item #var output_item: Item
#func _process(delta: float) -> void: class ItemRequest:
#output_timer += delta var item: Item
#if output_timer >= output_period: var timeout: float
#output_timer -= output_period var requests: Array[ItemRequest] = []
#output() signal requested_item_received(request: ItemRequest)
func _process(delta: float) -> void:
for request in requests:
request.timeout -= delta
if request.timeout <= 0:
cancel_request(request)
func can_produce() -> bool: func can_produce() -> bool:
return can_send_item(produced_item) return can_send_item(produced_item)
@ -24,6 +31,9 @@ func produce() -> bool:
func can_send_item(item: Item) -> bool: func can_send_item(item: Item) -> bool:
if !enabled: if !enabled:
return false return false
for request in requests:
if request.item == item:
return true
for consumer in consumers: for consumer in consumers:
if consumer.can_accept_item(item): if consumer.can_accept_item(item):
return true return true
@ -32,6 +42,8 @@ func can_send_item(item: Item) -> bool:
func send_item(item: Item) -> bool: func send_item(item: Item) -> bool:
if !enabled: if !enabled:
return false return false
if check_requested_items(item):
return true
if consumers.is_empty(): if consumers.is_empty():
return false return false
var start_idx: int = last_consumer_idx var start_idx: int = last_consumer_idx
@ -50,4 +62,24 @@ func send_item(item: Item) -> bool:
return true return true
return false return false
func check_requested_items(new_item: Item) -> bool:
for request in requests:
if new_item == request.item:
requested_item_received.emit(request)
return true
return false
func cancel_request(request: ItemRequest):
requested_item_received.emit(request)
## Waits for an item to be available at this storage, or a timeout to be reached.
func wait_for_item(item: Item, timeout: float) -> bool:
var request: ItemRequest = ItemRequest.new()
request.item = item
request.timeout = timeout
requests.append(request)
var finished_request: ItemRequest = null
while finished_request != request:
finished_request = await requested_item_received
requests.erase(request)
return finished_request.timeout > 0

View File

@ -0,0 +1,10 @@
extends Building
var held_item: Item = null
func _process(delta: float) -> void:
if !producer.consumers.is_empty():
held_item = consumer.take_any_item_from_storage()
if held_item != null and producer.send_item(held_item):
held_item = null

View File

@ -0,0 +1 @@
uid://ba5aqcwabpfp0

View File

@ -1,7 +1,7 @@
extends RefCounted extends RefCounted
class_name Task class_name Task
var name: String #var name: String
#var source: TaskManager #var source: TaskManager
var solicitation_time: float = 1.0 var solicitation_time: float = 1.0
var priority: int = TASK_PRIORITY_ANYTIME var priority: int = TASK_PRIORITY_ANYTIME
@ -15,6 +15,8 @@ const TASK_PRIORITY_ANYTIME = 0
const TASK_PRIORITY_BY_WAVE_START = 10 const TASK_PRIORITY_BY_WAVE_START = 10
const TASK_PRIORITY_ASAP = 20 const TASK_PRIORITY_ASAP = 20
func get_task_name() -> String:
return ""
func is_ready_to_start() -> bool: func is_ready_to_start() -> bool:
return true return true
func get_location() -> Vector3: func get_location() -> Vector3:
@ -63,9 +65,13 @@ class FetchItemTask extends Task:
for building2 in worker.get_tree().get_nodes_in_group("Buildings"): for building2 in worker.get_tree().get_nodes_in_group("Buildings"):
if building2 is not Building: if building2 is not Building:
continue continue
if building2.consumer == null: var item_found: bool = false
continue #if building2.consumer != null:
if building2.consumer.check_storage_for_item(item): #item_found |= building2.consumer.check_storage_for_item(item)
if building2.producer != null:
item_found = building2.producer.produced_item == item
if item_found:
var distance_sqr: float = building2.global_position.distance_squared_to(worker.position) var distance_sqr: float = building2.global_position.distance_squared_to(worker.position)
if distance_sqr < closest: if distance_sqr < closest:
storage_building = building2 storage_building = building2

View File

@ -148,11 +148,14 @@ func go_to_destination(destination: Vector3) -> bool:
func take_item_from_building(item: Item, building: Building) -> bool: func take_item_from_building(item: Item, building: Building) -> bool:
if held_item != null: if held_item != null:
return false return false
if building.consumer == null: if building.producer != null:
return false if !await building.producer.wait_for_item(item, 3.0):
if await building.consumer.wait_for_item(item, 3.0):
if !building.consumer.take_item_from_storage(item):
return false return false
#if building.consumer == null:
#return false
#if await building.consumer.wait_for_item(item, 3.0):
#if !building.consumer.take_item_from_storage(item):
#return false
held_item = item held_item = item
return true return true

View File

@ -0,0 +1,12 @@
[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://8s2tly6ax07u"]
[ext_resource type="Shader" uid="uid://bqr6jesnetffs" path="res://shaders/hologram.gdshader" id="1_p0wwg"]
[resource]
render_priority = 0
shader = ExtResource("1_p0wwg")
shader_parameter/albedo_color = Color(1, 1, 1, 1)
shader_parameter/enable_warp = true
shader_parameter/warp_vector = Vector3(0.1, 0, 0.1)
shader_parameter/warp_strength = 0.576
shader_parameter/warp_rate = 29.667