aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-06-27 14:18:54 +0200
committermetamuffin <metamuffin@disroot.org>2024-06-27 14:18:54 +0200
commit3d9398b552bee7615987cc177e14a21aba29689e (patch)
treeb963142c13016c86fa5e2304e1b10ce97c34a16a
parentec6377cb004ae564a8ad2fd895f8aad09b0153c6 (diff)
downloadhurrycurry-3d9398b552bee7615987cc177e14a21aba29689e.tar
hurrycurry-3d9398b552bee7615987cc177e14a21aba29689e.tar.bz2
hurrycurry-3d9398b552bee7615987cc177e14a21aba29689e.tar.zst
move map code to Map scene
-rw-r--r--client/game.gd53
-rw-r--r--client/game.tscn5
-rw-r--r--client/map/map.gd29
-rw-r--r--client/map/map.tscn44
-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, 67 insertions, 86 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 cfbde85b..b93f6b68 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)
@@ -43,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..1cd0bd30
--- /dev/null
+++ b/client/map/map.gd
@@ -0,0 +1,29 @@
+class_name Map
+extends Node3D
+
+var tile_by_pos: Dictionary = {}
+
+
+func get_tile_name(position: Vector2i):
+ var e = tile_by_pos[str(position)]
+ if e != null: return e[0]
+ else: return null
+func get_tile_instance(position: Vector2i) -> Tile:
+ var e = tile_by_pos[str(position)]
+ if e != null: return e[1]
+ else: return null
+
+func set_tile(position: Vector2i, name: String, neighbors: Array = [null,null,null,null]) -> Tile:
+ var tile = TileFactory.produce(name, str(position), neighbors)
+ add_child(tile)
+ tile.position = Vector3(position.x, 0, position.y)
+ tile_by_pos[str(position)] = [name, tile]
+ 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()
diff --git a/client/map/map.tscn b/client/map/map.tscn
index 612729f4..df359214 100644
--- a/client/map/map.tscn
+++ b/client/map/map.tscn
@@ -1,44 +1,6 @@
-[gd_scene load_steps=2 format=3 uid="uid://duqkg22yre6ry"]
+[gd_scene load_steps=2 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
-
-var tile_by_pos: Dictionary = {}
-
-func update(pos, tile_name, neighbors):
- var node_name = str(pos)
-
- 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)
-
-func queue_free_rename(node: Node) -> void:
- node.name += \"_queued_free\"
- node.queue_free()
-"
+[ext_resource type="Script" path="res://map/map.gd" id="1_3en0a"]
[node name="Map" type="Node3D"]
-script = SubResource("GDScript_qftmc")
+script = ExtResource("1_3en0a")
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 32fa3135..7501ca0a 100644
--- a/client/player/controllable_player.gd
+++ b/client/player/controllable_player.gd
@@ -110,16 +110,14 @@ func update_position(new_position: Vector2, _new_rotation: float):
position_ = new_position
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: