diff options
Diffstat (limited to 'client/game.gd')
-rw-r--r-- | client/game.gd | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/client/game.gd b/client/game.gd new file mode 100644 index 00000000..eb338eaa --- /dev/null +++ b/client/game.gd @@ -0,0 +1,110 @@ +# Undercooked - a game about cooking +# Copyright 2024 nokoe +# Copyright 2024 metamuffin +# +# 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 Game +extends Node3D + +@onready var camera: FollowCamera = $FollowCamera +@onready var map: Map = $Map +@onready var marker: Marker = $Marker +var marker_target = Vector3(0,0,0) + +var players := {} +# Called when the node enters the scene tree for the first time. +func _ready(): + await Multiplayer.init + if Multiplayer.player_id == -1: + push_error("multiplayer has not been initialized") + Multiplayer.connect("add_player", + func(player: int, player_name: String, pos: Vector2, character: int): + var player_instance: Player + if player == Multiplayer.player_id: + player_instance = ControllablePlayer.new(player, player_name, pos, character, self) + camera.target = player_instance + else: + player_instance = Player.new(player, player_name, pos, character, self) + players[player] = player_instance + add_child(player_instance) + ) + + Multiplayer.connect("position", + func(player: int, pos: Vector2, rot: float): + var player_instance: Player = players[player] + player_instance.update_position(pos, rot) + ) + + Multiplayer.connect("remove_player", func(id: int): + var player: Player = players.get(id) + if player != null: + if player.hand != null: + player.hand.queue_free() + players.erase(id) + player.queue_free() + ) + + Multiplayer.connect("set_tile_item", func(tile: Vector2i, item: int): + var t: Floor = map.tile_by_pos[str(tile)] + var i = Item.new(item, t.item_base) + add_child(i) + i.name = Multiplayer.item_names[item] + t.set_item(i) + ) + + Multiplayer.connect("remove_tile_item", func(tile: Vector2i): + var t: Floor = map.tile_by_pos[str(tile)] + t.take_item().queue_free() + ) + + Multiplayer.connect("set_player_item", func(player: int, item: int): + var p: Player = players[player] + var i = Item.new(item, p.hand_base) + add_child(i) + i.name = Multiplayer.item_names[item] + p.set_item(i) + ) + + Multiplayer.connect("remove_player_item", func(player: int): + var p: Player = players[player] + p.remove_item().queue_free() + ) + + Multiplayer.connect("take_item", func(tile: Vector2i, player: int): + var t: Floor = map.tile_by_pos[str(tile)] + var p: Player = players[player] + p.take_item(t) + ) + + Multiplayer.connect("put_item", func(tile: Vector2i, player: int): + var t: FullTile = map.tile_by_pos[str(tile)] + var p: Player = players[player] + p.put_item(t) + ) + + Multiplayer.connect("set_progress", func(tile: Vector2i, progress: float, warn: bool): + var t: FullTile = map.tile_by_pos[str(tile)] + t.progress(progress, warn) + ) + + Multiplayer.connect("set_finished", func(tile: Vector2i, warn: bool): + var t: FullTile = map.tile_by_pos[str(tile)] + t.finish(warn) + ) + + Multiplayer.send_join("Blub", 1) + + +func _process(delta): + marker.position = lerp(marker.position, marker_target, delta * 40.0) |