diff options
-rw-r--r-- | client/game.gd | 53 | ||||
-rw-r--r-- | client/game.tscn | 6 | ||||
-rw-r--r-- | client/map/map.gd | 59 | ||||
-rw-r--r-- | client/map/map.tscn | 49 | ||||
-rw-r--r-- | client/map/progress.gd | 1 | ||||
-rw-r--r-- | client/menu/menu_background.gd | 6 | ||||
-rw-r--r-- | client/menu/menu_background.tscn | 5 | ||||
-rw-r--r-- | client/player/controllable_player.gd | 10 |
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: |