# 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 . # class_name Player extends Node3D const PLAYER_SIZE: float = 0.4 const SPEED: float = 25. var game: Game var rotation_ = 0. var rotation_anim = 0. var position_ = Vector2(0, 0) var position_anim = Vector2(0, 0) var character: Character = preload("res://player/character/character.tscn").instantiate() var bubble: ChatBubble = preload("res://player/chat_bubble.tscn").instantiate() var hand: Item = null var hand_base: Node3D = Node3D.new() var character_idx: int var _anim_angle: float = 0.0 const HAND_BASE_POSITION: Vector3 = Vector3(0, .25, .4) func _init(_id: int, new_name: String, pos: Vector2, new_character_idx: int, new_game: Game): add_child(character) position_ = pos name = new_name game = new_game hand_base.position = HAND_BASE_POSITION add_child(hand_base) add_child(bubble) character_idx = new_character_idx func _ready(): character.select_hairstyle(character_idx) 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 hand != null: hand.queue_free() if i == null: push_error("tile is null") hand = i character.holding = true func remove_item() -> Item: var i = hand if i == null: push_error("holding nothing") hand = null character.holding = false return i func take_item(tile: Tile): if hand != null: push_error("already holding an item") var i = tile.take_item() set_item(i) func put_item(tile: Tile): 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 character.walking = position_.distance_squared_to(position_anim) > 0.001