diff options
| -rw-r--r-- | client/project.godot | 43 | ||||
| -rw-r--r-- | client/scenes/game.tscn | 7 | ||||
| -rw-r--r-- | client/scenes/player.tscn | 12 | ||||
| -rw-r--r-- | client/scripts/map.gd | 3 | ||||
| -rw-r--r-- | client/scripts/multiplayer.gd | 4 | ||||
| -rw-r--r-- | client/scripts/player.gd | 89 | ||||
| -rw-r--r-- | client/scripts/tiles/counter.gd | 10 | ||||
| -rw-r--r-- | client/scripts/tiles/door.gd | 2 | ||||
| -rw-r--r-- | client/scripts/tiles/floor.gd | 1 | ||||
| -rw-r--r-- | client/scripts/tiles/wall_tile.gd | 55 | 
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) | 
