Building scripts and scenes.
This commit is contained in:
parent
40cb618efa
commit
1f561c6f7a
|
@ -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"
|
|
@ -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
|
|
@ -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"
|
|
@ -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
|
|
@ -0,0 +1 @@
|
||||||
|
uid://dvgo3kpjr2mmj
|
|
@ -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
|
|
@ -0,0 +1 @@
|
||||||
|
uid://bshiyw2k3op02
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
uid://c4fquatkjmsgu
|
|
@ -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)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
uid://cnoyykkcidp1d
|
|
@ -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)
|
|
@ -0,0 +1 @@
|
||||||
|
uid://c3bqfgoof2c83
|
|
@ -0,0 +1,6 @@
|
||||||
|
extends Resource
|
||||||
|
class_name Item
|
||||||
|
|
||||||
|
@export var icon: Texture2D
|
||||||
|
@export var name: String
|
||||||
|
@export var model: Mesh
|
|
@ -0,0 +1 @@
|
||||||
|
uid://kcdpck5ufgcc
|
Loading…
Reference in New Issue