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)  |