diff options
Diffstat (limited to 'client/multiplayer.gd')
-rw-r--r-- | client/multiplayer.gd | 199 |
1 files changed, 10 insertions, 189 deletions
diff --git a/client/multiplayer.gd b/client/multiplayer.gd index 1a261b99..6b642d90 100644 --- a/client/multiplayer.gd +++ b/client/multiplayer.gd @@ -18,47 +18,10 @@ class_name Multiplayer extends Node -signal joined(player_id: int) -signal data( - item_names: Array[String], - tile_names: Array[String], - tile_collide: Array[String], - tile_interact: Array[String], - maps: Array, - bot_algos: Array -) -signal set_tile(tile: Vector2i, kind: int, neighbors: Array[String]) -signal remove_tile(tile: Vector2i) -signal clear_message(player: int) -signal text_message(player: int, text: String, timeout_initial: float, timeout_remaining: float) -signal item_message(player: int, item: int, timeout_initial: float, timeout_remaining: float) -signal effect_message(player: int, effect: String, timeout_initial: float, timeout_remaining: float) -signal add_player(player: int, name: String, pos: Vector2, character: int) -signal remove_player(player: int) -signal movement(player: int, position: Vector2, rotation: float, boost: bool, direction: Vector2) -signal movement_sync() -signal take_item(tile: Vector2i, player: int) -signal put_item(player: int, tile: Vector2i, ) -signal pass_item_player(from: int, to: int) -signal pass_item_tile(from: Vector2i, to: Vector2i) -signal set_tile_item(tile: Vector2i, item: int) -signal remove_tile_item(tile: Vector2i) -signal set_player_item(player: int, item: int) -signal remove_player_item(player: int) -signal set_tile_progress(tile: Vector2i, position: float, speed: float, warn: bool, acting_player) -signal set_player_progress(player: int, position: float, speed: float, warn: bool) -signal set_tile_finished(tile: Vector2i, warn: bool) -signal set_player_finished(player: int, warn: bool) -signal set_ingame(state: bool, lobby: bool) -signal score(demands_failed: int, demands_completed: int, points: int, time_remaining: float) -signal environment(params: Dictionary) -signal server_message(text: String) -signal replay_start() -signal connection_closed(reason: String) -signal show_rating(stars: int, points: int) -signal show_book() +signal packet(packet: Dictionary) +signal connection_closed() -const VERSION_MAJOR: int = 6 +const VERSION_MAJOR: int = 7 const VERSION_MINOR: int = 0 var connected := false @@ -89,162 +52,20 @@ func _process(_delta): connection_closed.emit(tr("c.error.websocket") % [code, reason, code != -1]) self.queue_free() -func handle_packet(bytes: PackedByteArray): - var decoded = decode_packet(bytes) - - if decoded == null: +func handle_packet(coded): + var p = decode_packet(coded) + if p == null: return - var packet_type: String = decoded["type"] - match packet_type: - "joined": - var player_id = decoded["id"] - joined.emit(player_id) + match p["type"]: "version": - var major = decoded["major"] - var minor = decoded["minor"] + var major = p["major"] + var minor = p["minor"] if major != VERSION_MAJOR and minor >= VERSION_MINOR: socket.close() connected = false connection_closed.emit(tr("c.error.version_mismatch") % [major, minor, VERSION_MAJOR, VERSION_MINOR]) - "data": - var item_names = decoded["data"]["item_names"] - var tile_names = decoded["data"]["tile_names"] - var tile_collide = decoded["data"]["tile_collide"] - var tile_interact = decoded["data"]["tile_interact"] - var maps = decoded["data"]["maps"] - var bot_algos = decoded["data"]["bot_algos"] - data.emit(item_names, tile_names, tile_collide, tile_interact, maps, bot_algos) - "add_player": - var id = decoded["id"] - var player_name = decoded["name"] - var pos = decoded["position"] - var character = decoded["character"] - add_player.emit(id, player_name, pos_to_vec2(pos), character) - "remove_player": - var id = decoded["id"] - remove_player.emit(id) - "movement": - var player = decoded["player"] - var pos = decoded["pos"] - var rot = decoded["rot"] - var boost = decoded["boost"] - var dir = decoded["dir"] - movement.emit(player, pos_to_vec2(pos), rot, boost, pos_to_vec2(dir)) - "movement_sync": - movement_sync.emit() - "move_item": - var from: Dictionary = decoded["from"] - var to: Dictionary = decoded["to"] - var from_player = from.get("player") - var from_tile = from.get("tile") - var to_player = to.get("player") - var to_tile = to.get("tile") - if from_player != null and to_player != null: - pass_item_player.emit(from_player, to_player) - elif from_tile != null and to_player != null: - take_item.emit(pos_to_vec2i(from_tile), to_player) - elif from_player != null and to_tile != null: - put_item.emit(from_player, pos_to_vec2i(to_tile)) - elif from_tile != null and to_tile != null: - pass_item_tile.emit(pos_to_vec2i(from_tile), pos_to_vec2i(to_tile)) - "set_progress": - var warn: bool = decoded["warn"] - var position: float = decoded["position"] - var speed: float = decoded["speed"] - var item: Dictionary = decoded["item"] - var tile = item.get("tile") - var player = item.get("player") - var acting_player = decoded.get("player") - - if tile != null: - @warning_ignore("incompatible_ternary") - set_tile_progress.emit(pos_to_vec2i(tile), position, speed, warn, int(acting_player) if acting_player != null else null) - else: - set_player_progress.emit(player, position, speed, warn) - "clear_progress": - var item: Dictionary = decoded["item"] - var tile = item.get("tile") - var player = item.get("player") - - if tile != null: - set_tile_finished.emit(pos_to_vec2i(tile)) - else: - set_player_finished.emit(player) - "set_item": - var location: Dictionary = decoded["location"] - var tile = location.get("tile") - var player = location.get("player") - var item = decoded.get("item") - if item != null: - if tile != null: - set_tile_item.emit(pos_to_vec2i(tile), item) - else: - set_player_item.emit(player, item) - else: - if tile != null: - remove_tile_item.emit(pos_to_vec2i(tile)) - else: - remove_player_item.emit(player) - "update_map": - var tile: Vector2i = pos_to_vec2i(decoded["tile"]) - var kind = decoded.get("kind") - var neighbors: Array = decoded["neighbors"] - if kind != null: - set_tile.emit(tile, kind, neighbors) - else: - remove_tile.emit(tile) - "communicate": - var player: int = decoded["player"] - var message = decoded.get("message") - var timeout_initial: float = decoded["timeout"]["initial"] if decoded["timeout"] != null else 5. - var timeout_remaining: float = decoded["timeout"]["remaining"] if decoded["timeout"] != null else 5. - if message != null: - var item = message.get("item") - var text = message.get("text") - var effect = message.get("effect") - if item != null: - item_message.emit(player, item, timeout_initial, timeout_remaining) - elif text != null: - text_message.emit(player, text, timeout_initial, timeout_remaining) - elif effect != null: - effect_message.emit(player, effect, timeout_initial, timeout_remaining) - else: - push_error("neither text, item nor effect provided") - else: - clear_message.emit(player) - "set_ingame": - var state = decoded["state"] - var lobby = decoded["lobby"] - set_ingame.emit(state, lobby) - "error": - var message = decoded["message"] - push_warning("server error: %s" % message) - "score": - var demands_failed: int = decoded["demands_failed"] - var demands_completed: int = decoded["demands_completed"] - var points: int = decoded["points"] - var time_remaining = decoded.get("time_remaining") - if time_remaining != null: - score.emit(demands_failed, demands_completed, points, time_remaining) - "menu": - var menu: String = decoded["menu"] - match menu: - "book": - show_book.emit() - "score": - var d: Dictionary = decoded["data"] - var stars = d["stars"] - var points = d["points"] - show_rating.emit(stars, points) - "server_message": - var text = decoded["text"] - server_message.emit(text) - "environment": - environment.emit(decoded["effects"]) - "replay_start": replay_start.emit() - _: - push_error("Unrecognized packet type: %s" % packet_type) + _: packet.emit(p) func send_join(player_name: String, character: int): send_packet({ |