diff --git a/items/metal.tres b/items/metal.tres new file mode 100644 index 0000000..06782b9 --- /dev/null +++ b/items/metal.tres @@ -0,0 +1,10 @@ +[gd_resource type="Resource" script_class="Item" load_steps=3 format=3 uid="uid://dbkxys3mr5u80"] + +[ext_resource type="Script" uid="uid://kcdpck5ufgcc" path="res://scripts/item.gd" id="1_a88ho"] +[ext_resource type="Texture2D" uid="uid://xpm6i82tui2o" path="res://assets/images/watchtower.png" id="1_jdpiu"] + +[resource] +script = ExtResource("1_a88ho") +icon = ExtResource("1_jdpiu") +name = "Metal" +metadata/_custom_type_script = "uid://kcdpck5ufgcc" diff --git a/objects/buildings/building.tscn b/objects/buildings/building.tscn new file mode 100644 index 0000000..a0095ab --- /dev/null +++ b/objects/buildings/building.tscn @@ -0,0 +1,28 @@ +[gd_scene load_steps=4 format=3 uid="uid://b1fnsl3k1mo5c"] + +[ext_resource type="Script" uid="uid://dvgo3kpjr2mmj" path="res://scripts/building_components/building.gd" id="1_k07no"] + +[sub_resource type="BoxMesh" id="BoxMesh_cee1v"] +size = Vector3(2, 2, 2) + +[sub_resource type="BoxShape3D" id="BoxShape3D_k07no"] +size = Vector3(2, 2, 2) + +[node name="Building" type="StaticBody3D"] +script = ExtResource("1_k07no") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +mesh = SubResource("BoxMesh_cee1v") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +shape = SubResource("BoxShape3D_k07no") + +[node name="NavigationObstacle3D" type="NavigationObstacle3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) +radius = 1.0 +vertices = PackedVector3Array(-1, 0, -1, 1, 0, -1, 1, 0, 1, -1, 0, 1) +affect_navigation_mesh = true +carve_navigation_mesh = true +use_3d_avoidance = true diff --git a/objects/buildings/processor.tscn b/objects/buildings/processor.tscn new file mode 100644 index 0000000..01f6d04 --- /dev/null +++ b/objects/buildings/processor.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=6 format=3 uid="uid://c6e1nifka3h4v"] + +[ext_resource type="PackedScene" uid="uid://b1fnsl3k1mo5c" path="res://objects/buildings/building.tscn" id="1_hxugg"] +[ext_resource type="Script" uid="uid://bshiyw2k3op02" path="res://scripts/building_components/consumer.gd" id="4_dx8de"] +[ext_resource type="Script" uid="uid://c4fquatkjmsgu" path="res://scripts/building_components/producer.gd" id="5_p3dou"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_evfwj"] +albedo_color = Color(0.023159, 1, 0, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_3h7kv"] +material = SubResource("StandardMaterial3D_evfwj") +size = Vector3(2, 2, 2) + +[node name="Processor" instance=ExtResource("1_hxugg")] + +[node name="MeshInstance3D" parent="." index="0"] +mesh = SubResource("BoxMesh_3h7kv") + +[node name="Consumer" type="Node" parent="." index="3"] +script = ExtResource("4_dx8de") +metadata/_custom_type_script = "uid://bshiyw2k3op02" + +[node name="Producer" type="Node" parent="." index="4"] +script = ExtResource("5_p3dou") +metadata/_custom_type_script = "uid://c4fquatkjmsgu" diff --git a/scripts/building_components/building.gd b/scripts/building_components/building.gd new file mode 100644 index 0000000..4416aee --- /dev/null +++ b/scripts/building_components/building.gd @@ -0,0 +1,20 @@ +extends Node +class_name Building + +@export var max_hp: int = 100 + +enum BuildState { + UNPLACED, + BUILDING, + READY, + DESTROYED +} + +var hp: int = max_hp + +var build_state: BuildState = BuildState.BUILDING: + set(state): + build_state = state + +func is_functional() -> bool: + return build_state == BuildState.READY diff --git a/scripts/building_components/building.gd.uid b/scripts/building_components/building.gd.uid new file mode 100644 index 0000000..c189090 --- /dev/null +++ b/scripts/building_components/building.gd.uid @@ -0,0 +1 @@ +uid://dvgo3kpjr2mmj diff --git a/scripts/building_components/consumer.gd b/scripts/building_components/consumer.gd new file mode 100644 index 0000000..1a55071 --- /dev/null +++ b/scripts/building_components/consumer.gd @@ -0,0 +1,42 @@ +extends Node +class_name Consumer +signal item_added(item: Item) + +@export var accepted_items: Array[Item] = [] +@export var storage_size: int = 4 +@export var max_inputs: int = 1 + +var storage_total: int = 0 +var storage: Dictionary[Item, int] = {} + +func can_accept_item(item: Item) -> bool: + return (storage_total < storage_size) and (accepted_items.has(item) or accepted_items.is_empty()) + +func offer_item(item: Item) -> bool: + if !can_accept_item(item): + return false + storage_total += 1 + var old_count: int = storage.get(item, 0) + storage.set(item, old_count + 1) + item_added.emit(item) + return true + +func check_storage_for_item(item: Item) -> bool: + return check_storage_for_items({item:1}) + +func check_storage_for_items(items: Dictionary[Item, int]) -> bool: + for item in items.keys(): + if storage.get(item, 0) < items[item]: + return false + return true + +func take_item_from_storage(item: Item) -> bool: + return take_items_from_storage({item: 1}) + +func take_items_from_storage(items: Dictionary[Item, int]) -> bool: + if !check_storage_for_items(items): + return false + for item in items.keys(): + var old_count: int = storage.get(item, 0) + storage.set(item, old_count - items[item]) + return true diff --git a/scripts/building_components/consumer.gd.uid b/scripts/building_components/consumer.gd.uid new file mode 100644 index 0000000..43e05c3 --- /dev/null +++ b/scripts/building_components/consumer.gd.uid @@ -0,0 +1 @@ +uid://bshiyw2k3op02 diff --git a/scripts/building_components/producer.gd b/scripts/building_components/producer.gd new file mode 100644 index 0000000..3722583 --- /dev/null +++ b/scripts/building_components/producer.gd @@ -0,0 +1,29 @@ +extends Node +class_name Producer + +@export var output_period: float = 0.1 +@export var max_outputs: int = 1 + +var consumers: Array[Consumer] +var next_consumer_idx: int = 0 +#var output_timer: float = 0.0 +#var output_item: Item + +#func _process(delta: float) -> void: + #output_timer += delta + #if output_timer >= output_period: + #output_timer -= output_period + #output() + +func send_item(item: Item) -> bool: + if consumers.is_empty(): + return false + next_consumer_idx += 1 + if next_consumer_idx >= consumers.size(): + next_consumer_idx = 0 + + var consumer: Consumer = consumers[next_consumer_idx] + var accepted: bool = consumer.offer_item(item) + return accepted + + diff --git a/scripts/building_components/producer.gd.uid b/scripts/building_components/producer.gd.uid new file mode 100644 index 0000000..e0d6955 --- /dev/null +++ b/scripts/building_components/producer.gd.uid @@ -0,0 +1 @@ +uid://c4fquatkjmsgu diff --git a/scripts/buildings/conveyor.gd b/scripts/buildings/conveyor.gd new file mode 100644 index 0000000..a6bc54d --- /dev/null +++ b/scripts/buildings/conveyor.gd @@ -0,0 +1,58 @@ +extends Path3D + +@export var speed: float = 1.0 +@export var item_offset: Vector3 = Vector3(0,1,0) + +var transported_items: Dictionary[Item, PackedFloat64Array] = {} + +@onready var producer: Producer = $Producer +@onready var multimesh: MultiMeshInstance3D = $MultiMeshInstance3D + +var test_timer: float = 0 +@onready var test_item: Item = load("res://items/metal.tres") + +func _process(delta: float) -> void: + test_timer += delta + if test_timer >= 2.0: + test_timer -= 2.0 + add_item(test_item) + + var belt_moving: bool = check_items_at_end() + if belt_moving: + for transported_item_type in transported_items.keys(): + var offsets: PackedFloat64Array = transported_items[transported_item_type] + multimesh.multimesh.instance_count = offsets.size() + for i in range(offsets.size()): + offsets[i] += (delta * speed) + position_item(i, transported_item_type, offsets[i]) + +func add_item(item: Item) -> void: + var offsets: PackedFloat64Array + if transported_items.has(item): + offsets = transported_items[item] + else: + offsets = [] + offsets.append(0.0) + transported_items[item] = offsets + +func check_items_at_end() -> bool: + var length: float = curve.get_baked_length() + var belt_moving: bool = true + for transported_item_type in transported_items.keys(): + var offsets: PackedFloat64Array = transported_items[transported_item_type] + var to_delete: Array[int] = [] + for i in range(offsets.size()): + if offsets[i] >= length: + var sent: bool = producer.send_item(transported_item_type) + if !sent: + belt_moving = false + else: + to_delete.append(i) + for d in to_delete: + offsets.remove_at(d) + return belt_moving + +func position_item(instance: int, item: Item, offset: float) -> void: + var trans: Transform3D = curve.sample_baked_with_rotation(offset).translated_local(item_offset) + multimesh.multimesh.set_instance_transform(instance, trans) + diff --git a/scripts/buildings/conveyor.gd.uid b/scripts/buildings/conveyor.gd.uid new file mode 100644 index 0000000..4fdbdfd --- /dev/null +++ b/scripts/buildings/conveyor.gd.uid @@ -0,0 +1 @@ +uid://cnoyykkcidp1d diff --git a/scripts/buildings/processor.gd b/scripts/buildings/processor.gd new file mode 100644 index 0000000..105e3be --- /dev/null +++ b/scripts/buildings/processor.gd @@ -0,0 +1,24 @@ +extends Building + +@export var ingredients: Dictionary[Item, int] = {} +@export var process_time: float = 1.0 +@export var created_item: Item + +var process_timer: float = 0.0 +var processing: bool = false + +func _process(delta: float) -> void: + if is_functional(): + if !processing: + processing = consume_ingredients() + if processing: + process_timer += delta + if process_timer >= process_time: + process_timer -= process_time + produce_item() + +func consume_ingredients() -> bool: + return $Consumer.take_items_from_storage(ingredients) + +func produce_item() -> void: + $Producer.set_output_item(created_item) diff --git a/scripts/buildings/processor.gd.uid b/scripts/buildings/processor.gd.uid new file mode 100644 index 0000000..f6f5c89 --- /dev/null +++ b/scripts/buildings/processor.gd.uid @@ -0,0 +1 @@ +uid://c3bqfgoof2c83 diff --git a/scripts/item.gd b/scripts/item.gd new file mode 100644 index 0000000..9e8f093 --- /dev/null +++ b/scripts/item.gd @@ -0,0 +1,6 @@ +extends Resource +class_name Item + +@export var icon: Texture2D +@export var name: String +@export var model: Mesh diff --git a/scripts/item.gd.uid b/scripts/item.gd.uid new file mode 100644 index 0000000..7461dd2 --- /dev/null +++ b/scripts/item.gd.uid @@ -0,0 +1 @@ +uid://kcdpck5ufgcc