aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/game.gd53
-rw-r--r--client/game.tscn6
-rw-r--r--client/map/map.gd59
-rw-r--r--client/map/map.tscn49
-rw-r--r--client/map/progress.gd1
-rw-r--r--client/menu/menu_background.gd6
-rw-r--r--client/menu/menu_background.tscn5
-rw-r--r--client/player/controllable_player.gd10
8 files changed, 105 insertions, 84 deletions
diff --git a/client/game.gd b/client/game.gd
index 76ea21f0..b36b40a0 100644
--- a/client/game.gd
+++ b/client/game.gd
@@ -19,17 +19,19 @@ extends Node3D
@onready var camera: FollowCamera = $FollowCamera
@onready var mp: Multiplayer = $Multiplayer
+@onready var map: Map = $Map
@onready var marker: Marker = $Marker
+
var marker_target = Vector3(0,0,0)
var player_id: int = -1
var item_names: Array = []
var tile_names: Array = []
+var tile_id_by_name: Dictionary = {}
var tile_collide: Array = []
var tile_interact: Array = []
var item_idx_from_name: Dictionary = {}
-var tile_by_pos: Dictionary = {}
var players := {}
@@ -56,6 +58,9 @@ func _ready():
tile_names = tile_names_
tile_collide = tile_collide_
tile_interact = tile_interact_
+ tile_id_by_name = {}
+ for id in tile_names.size():
+ tile_id_by_name[tile_names[id]] = id
item_idx_from_name.clear()
for i in range(item_names.size()):
@@ -78,8 +83,7 @@ func _ready():
)
mp.set_tile.connect(set_tile)
-
- mp.remove_tile.connect(remove_tile_if_exists)
+ mp.remove_tile.connect(set_tile)
mp.position.connect(func(player: int, pos: Vector2, rot: float):
var player_instance: Player = players[player]
@@ -98,7 +102,7 @@ func _ready():
)
mp.set_tile_item.connect(func(tile: Vector2i, item: int):
- var t: Tile = tile_by_pos[str(tile)][1]
+ var t: Tile = map.get_tile_instance(tile)
var i = ItemFactory.produce(item_names[item], t.item_base)
add_child(i)
i.name = item_names[item]
@@ -106,7 +110,7 @@ func _ready():
)
mp.remove_tile_item.connect(func(tile: Vector2i):
- var t: Tile = tile_by_pos[str(tile)][1]
+ var t: Tile = map.get_tile_instance(tile)
t.take_item().queue_free()
)
@@ -124,24 +128,24 @@ func _ready():
)
mp.take_item.connect(func(tile: Vector2i, player: int):
- var t: Tile = tile_by_pos[str(tile)][1]
+ var t: Tile = map.get_tile_instance(tile)
var p: Player = players[player]
p.take_item(t)
)
mp.put_item.connect(func(tile: Vector2i, player: int):
- var t: Tile = tile_by_pos[str(tile)][1]
+ var t: Tile = map.get_tile_instance(tile)
var p: Player = players[player]
p.put_item(t)
)
mp.set_progress.connect(func(tile: Vector2i, progress: float, warn: bool):
- var t: Tile = tile_by_pos[str(tile)][1]
+ var t: Tile = map.get_tile_instance(tile)
t.progress(progress, warn)
)
mp.set_finished.connect(func(tile: Vector2i, warn: bool):
- var t: Tile = tile_by_pos[str(tile)][1]
+ var t: Tile = map.get_tile_instance(tile)
t.finish(warn)
)
@@ -166,33 +170,16 @@ func _process(delta):
marker.position = lerp(marker.position, marker_target, delta * 40.0)
func get_tile_collision(pos: Vector2i) -> bool:
- var t = tile_by_pos.get(str(pos))
+ var t = map.get_tile_name(pos)
if t == null: return true
- else: return tile_collide[t[0]]
+ else: return tile_collide[tile_id_by_name[t]]
func get_tile_interactive(pos: Vector2i) -> bool:
- var t = tile_by_pos.get(str(pos))
+ var t = map.get_tile_name(pos)
if t == null: return false
- else: return tile_interact[t[0]]
-
-func set_tile(tile: Vector2i, kind: int, neighbors: Array):
- remove_tile_if_exists(tile)
- var node_name = str(tile)
- var tile_name: String = tile_names[kind]
- neighbors = neighbors.map(func (x): return tile_names[x] if x != null else null)
- var instance: Tile = TileFactory.produce(tile_name, node_name, neighbors)
+ else: return tile_interact[tile_id_by_name[t]]
- instance.position = Vector3(tile[0], 0, tile[1])
- tile_by_pos[node_name] = [kind, instance]
- add_child(instance)
+func set_tile(tile: Vector2i, kind = null, neighbors = null):
+ if neighbors != null: neighbors = neighbors.map(func (x): return tile_names[x] if x != null else null)
+ map.set_tile(tile, tile_names[kind], neighbors)
-func remove_tile_if_exists(pos: Vector2i):
- var node_name = str(pos)
- var current = tile_by_pos.get(node_name)
- if current != null:
- var tile: Tile = current[1]
- if tile.item != null:
- tile.item.queue_free()
- tile_by_pos.erase(node_name)
- tile.name += "_queued_free"
- tile.queue_free()
diff --git a/client/game.tscn b/client/game.tscn
index 4165e270..ff6b8da5 100644
--- a/client/game.tscn
+++ b/client/game.tscn
@@ -1,10 +1,11 @@
-[gd_scene load_steps=9 format=3 uid="uid://c6krh36hoqfg8"]
+[gd_scene load_steps=10 format=3 uid="uid://c6krh36hoqfg8"]
[ext_resource type="Script" path="res://game.gd" id="1_sftfn"]
[ext_resource type="PackedScene" uid="uid://b31mlnao6ybt8" path="res://player/follow_camera.tscn" id="2_s8y6o"]
[ext_resource type="PackedScene" uid="uid://c0euiv7duqfp4" path="res://player/marker.tscn" id="4_igl0o"]
[ext_resource type="PackedScene" uid="uid://bg2d78ycorcqk" path="res://menu/scene_transition.tscn" id="5_yg6cl"]
[ext_resource type="Script" path="res://multiplayer.gd" id="6_fbxu8"]
+[ext_resource type="PackedScene" uid="uid://b4gone8fu53r7" path="res://map/map.tscn" id="6_prg6t"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_py7px"]
ground_bottom_color = Color(0.0826605, 0.065772, 0.0461518, 1)
@@ -17,7 +18,6 @@ background_mode = 2
sky = SubResource("Sky_ultpf")
tonemap_mode = 2
ssao_enabled = true
-sdfgi_enabled = true
sdfgi_use_occlusion = true
sdfgi_energy = 2.0
@@ -44,3 +44,5 @@ visible = false
[node name="SceneTransition" parent="." instance=ExtResource("5_yg6cl")]
ingame = true
+
+[node name="Map" parent="." instance=ExtResource("6_prg6t")]
diff --git a/client/map/map.gd b/client/map/map.gd
new file mode 100644
index 00000000..af80d9ac
--- /dev/null
+++ b/client/map/map.gd
@@ -0,0 +1,59 @@
+class_name Map
+extends Node3D
+
+var tile_by_pos: Dictionary = {}
+var baking = false
+
+func get_tile_name(pos: Vector2i):
+ var e = tile_by_pos[str(pos)]
+ if e != null: return e[1]
+ else: return null
+func get_tile_instance(pos: Vector2i) -> Tile:
+ var e = tile_by_pos[str(pos)]
+ if e != null: return e[2]
+ else: return null
+
+func set_tile(pos: Vector2i, name_: String, neighbors: Array = [null,null,null,null]) -> Tile:
+ var tile = TileFactory.produce(name_, str(pos), neighbors)
+ add_child(tile)
+ tile.position = Vector3(pos.x, 0, pos.y)
+ tile_by_pos[str(pos)] = [pos, name_, tile, neighbors]
+ if not baking: voxelgi_timer.start(1)
+ return tile
+
+func remove_tile_if_exists(pos: Vector2i):
+ var tile = get_tile_instance(pos)
+ if tile == null: return
+ if tile.item != null: tile.item.queue_free()
+ tile_by_pos.erase(str(pos))
+ tile.name += "_queued_free"
+ tile.queue_free()
+
+@onready var voxelgi_timer: Timer = $Timer
+@onready var voxelgi: VoxelGI = $VoxelGI
+
+func _ready():
+ if baking: return
+ voxelgi_timer.connect("timeout", gi_bake)
+
+func gi_bake():
+ print("Map: Rebaking VoxelGI")
+ gi_bake_blocking()
+
+func gi_bake_blocking():
+ var extent_min = Vector2(0,0)
+ var extent_max = Vector2(0,0)
+ for e in tile_by_pos.values():
+ extent_min.x = min(extent_min.x, e[0].x)
+ extent_min.y = min(extent_min.y, e[0].y)
+ extent_max.x = max(extent_max.x, e[0].x)
+ extent_max.y = max(extent_max.y, e[0].y)
+
+ var center = (extent_max + extent_min) / 2
+ var size = extent_max - extent_min
+ voxelgi.position = Vector3(center.x, 2, center.y)
+ voxelgi.size = Vector3(size.x, 5., size.y)
+ print("Baking now!")
+ var start = Time.get_ticks_msec()
+ voxelgi.bake()
+ print("Bake done. elapsed=", Time.get_ticks_msec() - start)
diff --git a/client/map/map.tscn b/client/map/map.tscn
index 612729f4..cd08e416 100644
--- a/client/map/map.tscn
+++ b/client/map/map.tscn
@@ -1,44 +1,17 @@
-[gd_scene load_steps=2 format=3 uid="uid://duqkg22yre6ry"]
+[gd_scene load_steps=4 format=3 uid="uid://b4gone8fu53r7"]
-[sub_resource type="GDScript" id="GDScript_qftmc"]
-script/source = "# Undercooked - a game about cooking
-# Copyright 2024 nokoe
-# Copyright 2024 tpart
-# Copyright 2024 metamuffin
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published by
-# the Free Software Foundation, version 3 of the License only.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see <https://www.gnu.org/licenses/>.
-#
-class_name Map
-extends Node3D
+[ext_resource type="Script" path="res://map/map.gd" id="1_3en0a"]
-var tile_by_pos: Dictionary = {}
+[sub_resource type="CameraAttributesPractical" id="CameraAttributesPractical_kwk4i"]
-func update(pos, tile_name, neighbors):
- var node_name = str(pos)
+[sub_resource type="VoxelGIData" id="VoxelGIData_m5j5n"]
- if has_node(node_name):
- queue_free_rename(get_node(node_name))
-
- var instance: Tile = TileFactory.produce(tile_name, node_name, neighbors)
-
- instance.position = Vector3(pos[0], 0, pos[1])
- tile_by_pos[str(Vector2i(pos[0], pos[1]))] = instance
- add_child(instance)
+[node name="Map" type="Node3D"]
+script = ExtResource("1_3en0a")
-func queue_free_rename(node: Node) -> void:
- node.name += \"_queued_free\"
- node.queue_free()
-"
+[node name="Timer" type="Timer" parent="."]
+one_shot = true
-[node name="Map" type="Node3D"]
-script = SubResource("GDScript_qftmc")
+[node name="VoxelGI" type="VoxelGI" parent="."]
+camera_attributes = SubResource("CameraAttributesPractical_kwk4i")
+data = SubResource("VoxelGIData_m5j5n")
diff --git a/client/map/progress.gd b/client/map/progress.gd
index 4d6494f6..dd855a36 100644
--- a/client/map/progress.gd
+++ b/client/map/progress.gd
@@ -20,3 +20,4 @@ func set_progress(progress: float, bad: bool):
var mat: ShaderMaterial = self.get_active_material(0)
mat.set_shader_parameter("progress", progress)
mat.set_shader_parameter("bad", bad)
+
diff --git a/client/menu/menu_background.gd b/client/menu/menu_background.gd
index 1d9322f3..4304cdbf 100644
--- a/client/menu/menu_background.gd
+++ b/client/menu/menu_background.gd
@@ -20,6 +20,7 @@ const NULLS = [null,null,null,null]
const BUCKETS = [[], ["floor","floor","floor","floor","tomato-crate", "raw-steak-crate"], ["table", "chair", "counter"], ["sink", "stove"]]
@onready var environment: WorldEnvironment = $Environment
+@onready var map: Map = $Map
func _ready():
if !Global.on_vulkan():
@@ -32,7 +33,4 @@ func _ready():
var bucket = BUCKETS[int(floor(k * BUCKETS.size())) % BUCKETS.size()]
if bucket.size() == 0: continue
var tile_name = bucket[randi() % bucket.size()]
- var tile = TileFactory.produce(tile_name, tile_name, NULLS)
-
- add_child(tile)
- tile.position = Vector3(x, 0, y)
+ map.set_tile(Vector2i(x,y), tile_name)
diff --git a/client/menu/menu_background.tscn b/client/menu/menu_background.tscn
index dbc7010a..fefffef3 100644
--- a/client/menu/menu_background.tscn
+++ b/client/menu/menu_background.tscn
@@ -1,7 +1,8 @@
-[gd_scene load_steps=10 format=3 uid="uid://l4vm07dtda4j"]
+[gd_scene load_steps=11 format=3 uid="uid://l4vm07dtda4j"]
[ext_resource type="Script" path="res://menu/menu_background.gd" id="1_ijsg0"]
[ext_resource type="Shader" path="res://menu/menu_background.gdshader" id="3_5mp8y"]
+[ext_resource type="PackedScene" uid="uid://b4gone8fu53r7" path="res://map/map.tscn" id="3_p80a7"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_uw50b"]
sky_top_color = Color(0.55, 0.55, 0.55, 1)
@@ -63,3 +64,5 @@ environment = SubResource("Environment_slkjl")
transform = Transform3D(0.614606, 0.499662, -0.610408, -0.00282255, 0.775198, 0.631712, 0.78883, -0.386531, 0.477851, 6, -13, -11)
mesh = SubResource("QuadMesh_fvp2p")
surface_material_override/0 = SubResource("ShaderMaterial_gd87g")
+
+[node name="Map" parent="." instance=ExtResource("3_p80a7")]
diff --git a/client/player/controllable_player.gd b/client/player/controllable_player.gd
index 68684217..8b2da8c2 100644
--- a/client/player/controllable_player.gd
+++ b/client/player/controllable_player.gd
@@ -122,16 +122,14 @@ func submit_message(text: String):
game.mp.send_chat(text)
func interact():
- var tile_idx = str(target)
- var data = game.tile_by_pos.get(tile_idx)
- if data != null:
- var t: Tile = data[1]
+ var tile = game.map.get_tile_instance(target)
+ if tile != null:
game.marker.set_interactive(game.get_tile_interactive(target))
game.marker.visible = true
- game.marker_target = t.item_base.global_position
+ game.marker_target = tile.item_base.global_position
if Input.is_action_just_pressed("interact"):
game.mp.send_interact(target, true)
- t.interact()
+ tile.interact()
elif Input.is_action_just_released("interact"):
game.mp.send_interact(target, false)
else: