aboutsummaryrefslogtreecommitdiff
path: root/client/player/player.gd
diff options
context:
space:
mode:
Diffstat (limited to 'client/player/player.gd')
-rw-r--r--client/player/player.gd81
1 files changed, 81 insertions, 0 deletions
diff --git a/client/player/player.gd b/client/player/player.gd
new file mode 100644
index 00000000..423855e9
--- /dev/null
+++ b/client/player/player.gd
@@ -0,0 +1,81 @@
+# Undercooked - a game about cooking
+# Copyright 2024 nokoe
+# Copyright 2024 metamuffin
+# Copyright 2024 tpart
+#
+# 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 Player
+extends Node3D
+
+const PLAYER_SIZE: float = 0.4
+const SPEED: float = 25.
+
+var game: Game
+var position_ = Vector2(0, 0)
+
+var mesh = preload("res://scenes/player.tscn").instantiate()
+
+var hand: Node3D = null
+
+var _anim_angle: float = 0.0
+
+const HAND_BASE_POSITION: Vector3 = Vector3(0, .25, .4)
+
+@onready var character: Character = $Player/Character
+
+func _init(_id: int, new_name: String, pos: Vector2, _character: int, new_game: Game):
+ add_child(mesh)
+ position_ = pos
+ name = new_name
+ game = new_game
+
+func update_position(new_position: Vector2, new_rotation: float):
+ position_ = new_position
+ rotation_ = new_rotation
+
+func set_item(i: Item):
+ i.owned_by = hand_base
+ if i == null:
+ push_error("tile is null")
+ hand = i
+ character.play_animation("hold")
+
+func remove_item() -> Item:
+ var i = hand
+ if i == null:
+ push_error("holding nothing")
+ hand = null
+ character.play_animation("idle")
+ return i
+
+func take_item(tile: Floor):
+ if hand != null:
+ push_error("already holding an item")
+ var i = tile.take_item()
+ if i == null:
+ push_error("tile is null")
+ hand = i
+
+func put_item(tile: Floor):
+ var i = remove_item()
+ tile.put_item(i)
+
+func _process(delta):
+ _anim_angle = fmod(_anim_angle + delta, TAU)
+ hand_base.position.y = HAND_BASE_POSITION.y + 0.05 * sin(_anim_angle * 3)
+ position_anim = lerp(position_anim, position_, delta * 10)
+ rotation_anim = lerp_angle(rotation_anim, rotation_, delta * 10)
+ position.x = position_anim.x
+ position.z = position_anim.y
+ rotation.y = rotation_anim