aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/project.godot43
-rw-r--r--client/scenes/game.tscn7
-rw-r--r--client/scenes/player.tscn12
-rw-r--r--client/scripts/map.gd3
-rw-r--r--client/scripts/multiplayer.gd4
-rw-r--r--client/scripts/player.gd89
-rw-r--r--client/scripts/tiles/counter.gd10
-rw-r--r--client/scripts/tiles/door.gd2
-rw-r--r--client/scripts/tiles/floor.gd1
-rw-r--r--client/scripts/tiles/wall_tile.gd55
10 files changed, 213 insertions, 13 deletions
diff --git a/client/project.godot b/client/project.godot
new file mode 100644
index 00000000..a473d236
--- /dev/null
+++ b/client/project.godot
@@ -0,0 +1,43 @@
+; Engine configuration file.
+; It's best edited using the editor UI and not directly,
+; since the parameters that go here are not all obvious.
+;
+; Format:
+; [section] ; section goes between []
+; param=value ; assign values to parameters
+
+config_version=5
+
+[application]
+
+config/name="undercooked"
+run/main_scene="res://scenes/socket_test.tscn"
+config/features=PackedStringArray("4.2", "Forward Plus")
+config/icon="res://icon.svg"
+
+[autoload]
+
+Multiplayer="*res://scripts/multiplayer.gd"
+
+[input]
+
+forward={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null)
+]
+}
+backwards={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null)
+]
+}
+left={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null)
+]
+}
+right={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null)
+]
+}
diff --git a/client/scenes/game.tscn b/client/scenes/game.tscn
index 1ac84396..e0a195f1 100644
--- a/client/scenes/game.tscn
+++ b/client/scenes/game.tscn
@@ -1,6 +1,7 @@
-[gd_scene load_steps=5 format=3 uid="uid://clsylbmw7jc0s"]
+[gd_scene load_steps=6 format=3 uid="uid://clsylbmw7jc0s"]
[ext_resource type="PackedScene" uid="uid://bnqujofthaa4h" path="res://scenes/map.tscn" id="1_qt88a"]
+[ext_resource type="PackedScene" uid="uid://d30bj2cp1m7gd" path="res://scenes/player.tscn" id="2_cdwnc"]
[sub_resource type="PhysicalSkyMaterial" id="PhysicalSkyMaterial_ko0bu"]
@@ -28,3 +29,7 @@ shadow_enabled = true
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_h880f")
+
+[node name="Player" parent="." node_paths=PackedStringArray("map") instance=ExtResource("2_cdwnc")]
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 2)
+map = NodePath("../Map")
diff --git a/client/scenes/player.tscn b/client/scenes/player.tscn
new file mode 100644
index 00000000..f746e0ec
--- /dev/null
+++ b/client/scenes/player.tscn
@@ -0,0 +1,12 @@
+[gd_scene load_steps=3 format=3 uid="uid://d30bj2cp1m7gd"]
+
+[ext_resource type="Script" path="res://scripts/player.gd" id="1_yh3ku"]
+
+[sub_resource type="CapsuleMesh" id="CapsuleMesh_4w71x"]
+
+[node name="Player" type="Node3D"]
+script = ExtResource("1_yh3ku")
+
+[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
+transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, 0.5, 0)
+mesh = SubResource("CapsuleMesh_4w71x")
diff --git a/client/scripts/map.gd b/client/scripts/map.gd
index a88c8cdc..8229bb0d 100644
--- a/client/scripts/map.gd
+++ b/client/scripts/map.gd
@@ -38,7 +38,8 @@ func update(pos, tile_name, neighbors):
instance = Wall.new()
"door":
instance = Door.new()
- _:
+ var t:
+ push_error("tile tile %s unknown" % t)
instance = Floor.new()
var node_name = str(pos)
diff --git a/client/scripts/multiplayer.gd b/client/scripts/multiplayer.gd
index 7b62907d..d7dd9d1b 100644
--- a/client/scripts/multiplayer.gd
+++ b/client/scripts/multiplayer.gd
@@ -38,10 +38,10 @@ func _process(_delta):
func handle_packet(bytes: PackedByteArray):
var decoded = decode_packet(bytes)
-
+
if decoded == null:
return
-
+
var packet_type: String = decoded["type"]
match packet_type:
"init":
diff --git a/client/scripts/player.gd b/client/scripts/player.gd
new file mode 100644
index 00000000..8296ebad
--- /dev/null
+++ b/client/scripts/player.gd
@@ -0,0 +1,89 @@
+extends Node3D
+
+const PLAYER_SIZE: float = 0.4
+
+@export var map: Node3D
+
+var facing = Vector2(1, 0)
+var velocity = Vector2(0, 0)
+
+func _physics_process(delta):
+ var input = Vector2(Input.get_axis("left", "right"), Input.get_axis("forward", "backwards")).normalized()
+
+ if input.length() > 0.1:
+ facing = lerp_vector2_exp(facing, input, delta * 10.)
+
+ self.rotation.y = facing.angle()
+
+ velocity.x += input.x * delta * 0.5
+ velocity.y += input.y * delta * 0.5
+
+ position = Vector3(position.x + velocity.x, 0, position.z + velocity.y)
+
+ # collide
+ collide(delta)
+
+ velocity = lerp_vector2_exp(velocity, Vector2(0, 0), delta * 5.)
+
+func collide(_delta: float):
+ for i in map.get_children():
+ if is_instance_of(i, FullTile):
+ var tile: FullTile = i
+ var d = aabb_circle_distance(
+ tile.position.x,
+ tile.position.z,
+ tile.position.x + 1,
+ tile.position.z + 1,
+ position.x,
+ position.z
+ )
+
+ if d > PLAYER_SIZE:
+ continue
+
+ var h = 0.01
+ var d_sample_x = aabb_circle_distance(
+ tile.position.x,
+ tile.position.z,
+ tile.position.x + 1,
+ tile.position.z + 1,
+ position.x + h,
+ position.z
+ )
+ var d_sample_y = aabb_circle_distance(
+ tile.position.x,
+ tile.position.z,
+ tile.position.x + 1,
+ tile.position.z + 1,
+ position.x,
+ position.z + h
+ )
+ var grad_x = (d_sample_x - d) / h
+ var grad_y = (d_sample_y - d) / h
+
+ position.x += (PLAYER_SIZE - d) * grad_x
+ position.z += (PLAYER_SIZE - d) * grad_y
+
+ var vdotn = (grad_x * velocity.x) + (grad_y * velocity.y)
+
+ velocity.x -= grad_x * vdotn
+ velocity.y -= grad_y * vdotn
+ # TODO: Player collisions
+
+func lerp_vector2_exp(current: Vector2, target: Vector2, delta: float) -> Vector2:
+ return Vector2(
+ target.x + (current.x - target.x) * exp( - delta),
+ target.y + (current.y - target.y) * exp( - delta)
+ )
+
+func aabb_circle_distance(
+ min_x: float,
+ min_y: float,
+ max_x: float,
+ max_y: float,
+ px: float,
+ py: float
+) -> float:
+ var dx = px - max(min_x, min(max_x, px))
+ var dy = py - max(min_y, min(max_y, py))
+ return sqrt(dx * dx + dy * dy)
diff --git a/client/scripts/tiles/counter.gd b/client/scripts/tiles/counter.gd
index d8b41804..83872315 100644
--- a/client/scripts/tiles/counter.gd
+++ b/client/scripts/tiles/counter.gd
@@ -30,7 +30,7 @@ func setup(rename: String, neighbors: Array):
var series: int = 0
var last_series: int = 0
var adj: Array = []
-
+
for i in range(4):
if edges[i] == "floor":
last_series += 1
@@ -39,14 +39,14 @@ func setup(rename: String, neighbors: Array):
series = last_series
else:
last_series = 0
-
+
var count = 4 - adj.size()
# we can neither find out whether it is an inner corner nor an outer corner
- # backsplash
+ # backsplash
if series == 1&&count == 3:
facing = adj[0] % 4
-
+
if edges[(adj[0] + 2) % 4] == "wall":
kind = CounterKind.STRAIGHT_BACKSPLASH
else:
@@ -54,7 +54,7 @@ func setup(rename: String, neighbors: Array):
elif series == 2&&count == 2:
facing = (adj[0] + 1) % 4
kind = CounterKind.OUTER_CORNER
-
+
turn_facing(facing)
func is_counter(tile_name_t) -> bool:
diff --git a/client/scripts/tiles/door.gd b/client/scripts/tiles/door.gd
index a300977f..0861b09a 100644
--- a/client/scripts/tiles/door.gd
+++ b/client/scripts/tiles/door.gd
@@ -3,7 +3,7 @@ extends Floor
func setup(rename: String, neighbors: Array):
super.setup(rename, neighbors)
-
+
var facing = 0
for i in range(4):
if tile_name(neighbors[i]) == "door":
diff --git a/client/scripts/tiles/floor.gd b/client/scripts/tiles/floor.gd
index a8a396c4..70a71c5a 100644
--- a/client/scripts/tiles/floor.gd
+++ b/client/scripts/tiles/floor.gd
@@ -13,6 +13,7 @@ enum Facing {
func setup(rename: String, _neighbors: Array):
add_child(load("res://models/prefabs/map/floor_kitchen_small.tscn").instantiate())
base.name = "Base"
+ base.position += Vector3(0.5, 0, 0.5)
add_child(base)
self.name = rename
diff --git a/client/scripts/tiles/wall_tile.gd b/client/scripts/tiles/wall_tile.gd
index d107d73e..f10cc53f 100644
--- a/client/scripts/tiles/wall_tile.gd
+++ b/client/scripts/tiles/wall_tile.gd
@@ -1,10 +1,59 @@
class_name WallTile
extends FullTile
+const WALLS: Array = [
+ "wall",
+ "window",
+ "door"
+]
+
+enum WallKind {
+ STRAIGHT,
+ OUTER_CORNER,
+ T,
+ CROSS,
+}
+
+var kind: WallKind = WallKind.STRAIGHT
+var facing: int = 0
+
func setup(rename: String, neighbors: Array):
super.setup(rename, neighbors)
- var facing = 0
+
+ var edges = neighbors.duplicate()
+
+ var series: int = 0
+ var last_series: int = 0
+ var adj: Array = []
+
+ for i in range(4):
+ var i_name = tile_name(edges[i])
+ if is_wall(i_name):
+ edges[i] = "wall"
+ else:
+ edges[i] = tile_name(edges[i])
+
for i in range(4):
- if neighbors[i] != null&&tile_name(neighbors[i]) != "wall":
- facing = i
+ if edges[i] != "wall":
+ last_series += 1
+ adj.append(i)
+ if last_series > series:
+ series = last_series
+ else:
+ last_series = 0
+
+ var count = 4 - adj.size()
+
+ if series == 1&&count == 2:
+ facing = adj[0]
+ kind = WallKind.STRAIGHT
+ elif series == 2&&count == 2:
+ facing = adj[0]
+ kind = WallKind.OUTER_CORNER
+ elif series == 1&&count == 3:
+ facing = adj[0]
+ kind = WallKind.T
+ elif series == 0&&count == 4:
+ facing = adj[0]
+ kind = WallKind.CROSS
turn_facing(facing)