aboutsummaryrefslogtreecommitdiff
path: root/client/multiplayer.gd
diff options
context:
space:
mode:
Diffstat (limited to 'client/multiplayer.gd')
-rw-r--r--client/multiplayer.gd199
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({