Building scripts and scenes.

This commit is contained in:
Nekojimi 2025-04-21 20:49:29 +01:00
parent 40cb618efa
commit 1f561c6f7a
15 changed files with 248 additions and 0 deletions

10
items/metal.tres Normal file
View File

@ -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"

View File

@ -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

View File

@ -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"

View File

@ -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

View File

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

View File

@ -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

View File

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

View File

@ -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

View File

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

View File

@ -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)

View File

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

View File

@ -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)

View File

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

6
scripts/item.gd Normal file
View File

@ -0,0 +1,6 @@
extends Resource
class_name Item
@export var icon: Texture2D
@export var name: String
@export var model: Mesh

1
scripts/item.gd.uid Normal file
View File

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