aboutsummaryrefslogtreecommitdiff
path: root/client/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'client/scripts')
-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
7 files changed, 152 insertions, 12 deletions
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)