diff options
Diffstat (limited to 'client/game.gd')
-rw-r--r-- | client/game.gd | 116 |
1 files changed, 88 insertions, 28 deletions
diff --git a/client/game.gd b/client/game.gd index f3c2f81c..4b90f00c 100644 --- a/client/game.gd +++ b/client/game.gd @@ -18,25 +18,51 @@ class_name Game extends Node3D @onready var camera: FollowCamera = $FollowCamera -@onready var map: Map = $Map @onready var mp: Multiplayer = $Multiplayer @onready var marker: Marker = $Marker var marker_target = Vector3(0,0,0) +var player_id: int = -1 +var item_names: Array = [] +var tile_names: Array = [] +var tile_collide: Array = [] +var tile_interact: Array = [] + +var item_idx_from_name: Dictionary = {} +var tile_by_pos: Dictionary = {} + var players := {} func _ready(): - mp.connect("connection_closed", func(reason: String): + mp.connection_closed.connect(func(reason: String): Global.error_message = reason; $SceneTransition.instant_to("res://menu/error_menu.tscn") ) + mp.init.connect(func(player_id_: int): player_id = player_id_) + + mp.data.connect(func( + item_names_: Array, + tile_names_: Array, + tile_collide_: Array, + tile_interact_: Array + ): + item_names = item_names_ + tile_names = tile_names_ + tile_collide = tile_collide_ + tile_interact = tile_interact_ + + item_idx_from_name.clear() + for i in range(item_names.size()): + item_idx_from_name[item_names[i]] = i + ) await mp.init - if mp.player_id == -1: + + if player_id == -1: push_error("multiplayer has not been initialized") - mp.connect("add_player", func(player: int, player_name: String, pos: Vector2, character: int): + mp.add_player.connect(func(player: int, player_name: String, pos: Vector2, character: int): var player_instance: Player - if player == mp.player_id: + if player == player_id: player_instance = ControllablePlayer.new(player, player_name, pos, character, self) camera.target = player_instance else: @@ -45,15 +71,19 @@ func _ready(): add_child(player_instance) ) - mp.connect("update_map", map.update) + mp.set_tile.connect(set_tile) + + mp.remove_tile.connect(remove_tile_if_exists) - mp.connect("position", func(player: int, pos: Vector2, rot: float): + mp.position.connect(func(player: int, pos: Vector2, rot: float): var player_instance: Player = players[player] player_instance.update_position(pos, rot) ) - mp.connect("remove_player", func(id: int): + mp.remove_player.connect(func(id: int): var player: Player = players.get(id) + if id == player_id: + camera.target = self if player != null: if player.hand != null: player.hand.queue_free() @@ -61,56 +91,86 @@ func _ready(): player.queue_free() ) - mp.connect("set_tile_item", func(tile: Vector2i, item: int): - var t: Tile = map.tile_by_pos[str(tile)] - var i = ItemFactory.produce(mp.item_names[item], t.item_base) + mp.set_tile_item.connect(func(tile: Vector2i, item: int): + var t: Tile = tile_by_pos[str(tile)][1] + var i = ItemFactory.produce(item_names[item], t.item_base) add_child(i) - i.name = mp.item_names[item] + i.name = item_names[item] t.set_item(i) ) - mp.connect("remove_tile_item", func(tile: Vector2i): - var t: Tile = map.tile_by_pos[str(tile)] + mp.remove_tile_item.connect(func(tile: Vector2i): + var t: Tile = tile_by_pos[str(tile)][1] t.take_item().queue_free() ) - mp.connect("set_player_item", func(player: int, item: int): + mp.set_player_item.connect(func(player: int, item: int): var p: Player = players[player] - var i = ItemFactory.produce(mp.item_names[item], p.hand_base) + var i = ItemFactory.produce(item_names[item], p.hand_base) add_child(i) - i.name = mp.item_names[item] + i.name = item_names[item] p.set_item(i) ) - mp.connect("remove_player_item", func(player: int): + mp.remove_player_item.connect(func(player: int): var p: Player = players[player] p.remove_item().queue_free() ) - mp.connect("take_item", func(tile: Vector2i, player: int): - var t: Tile = map.tile_by_pos[str(tile)] + mp.take_item.connect(func(tile: Vector2i, player: int): + var t: Tile = tile_by_pos[str(tile)][1] var p: Player = players[player] p.take_item(t) ) - mp.connect("put_item", func(tile: Vector2i, player: int): - var t: Tile = map.tile_by_pos[str(tile)] + mp.put_item.connect(func(tile: Vector2i, player: int): + var t: Tile = tile_by_pos[str(tile)][1] var p: Player = players[player] p.put_item(t) ) - mp.connect("set_progress", func(tile: Vector2i, progress: float, warn: bool): - var t: Tile = map.tile_by_pos[str(tile)] + mp.set_progress.connect(func(tile: Vector2i, progress: float, warn: bool): + var t: Tile = tile_by_pos[str(tile)][1] t.progress(progress, warn) ) - mp.connect("set_finished", func(tile: Vector2i, warn: bool): - var t: Tile = map.tile_by_pos[str(tile)] + mp.set_finished.connect(func(tile: Vector2i, warn: bool): + var t: Tile = tile_by_pos[str(tile)][1] t.finish(warn) ) - mp.send_join(Global.username, Global.character) - func _process(delta): marker.position = lerp(marker.position, marker_target, delta * 40.0) + +func get_tile_collision(pos: Vector2i) -> bool: + var t: Array = tile_by_pos.get(str(pos)) + if t == null: return false + else: return tile_collide[t[0]] + +func get_tile_interactive(pos: Vector2i) -> bool: + var t: Array = tile_by_pos.get(str(pos)) + if t == null: return false + else: return tile_interact[t[0]] + +func set_tile(tile: Vector2i, kind: int, neighbors: Array): + remove_tile_if_exists(tile) + var node_name = str(tile) + var tile_name: String = tile_names[kind] + neighbors = neighbors.map(func (x): return tile_names[x] if x != null else null) + var instance: Tile = TileFactory.produce(tile_name, node_name, neighbors) + + instance.position = Vector3(tile[0], 0, tile[1]) + tile_by_pos[node_name] = [kind, instance] + add_child(instance) + +func remove_tile_if_exists(pos: Vector2i): + var node_name = str(pos) + var current = tile_by_pos.get(node_name) + if current != null: + var tile: Tile = current[1] + if tile.item != null: + tile.item.queue_free() + tile_by_pos.erase(node_name) + tile.name += "_queued_free" + tile.queue_free() |