summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/src/protocol.rs4
-rw-r--r--test-client/main.ts94
-rw-r--r--test-client/protocol.ts28
3 files changed, 72 insertions, 54 deletions
diff --git a/server/src/protocol.rs b/server/src/protocol.rs
index ef731b0d..3a40059a 100644
--- a/server/src/protocol.rs
+++ b/server/src/protocol.rs
@@ -9,7 +9,7 @@ pub type TileIndex = usize;
pub type RecipeIndex = usize;
#[derive(Debug, Clone, Serialize, Deserialize)]
-#[serde(rename_all = "snake_case")]
+#[serde(rename_all = "snake_case", tag = "type")]
pub enum PacketS {
Join { name: String },
Leave,
@@ -18,7 +18,7 @@ pub enum PacketS {
}
#[derive(Debug, Clone, Serialize, Deserialize)]
-#[serde(rename_all = "snake_case")]
+#[serde(rename_all = "snake_case", tag = "type")]
pub enum PacketC {
Joined {
data: Gamedata,
diff --git a/test-client/main.ts b/test-client/main.ts
index 1b034f28..7b515752 100644
--- a/test-client/main.ts
+++ b/test-client/main.ts
@@ -17,7 +17,7 @@ document.addEventListener("DOMContentLoaded", () => {
ws.onclose = () => console.log("close")
ws.onopen = () => {
console.log("open")
- send({ join: { name: "test" } })
+ send({ type: "join", name: "test" })
}
canvas = document.createElement("canvas");
@@ -49,41 +49,59 @@ let scale = 0
function send(p: PacketS) { ws.send(JSON.stringify(p)) }
function packet(p: PacketC) {
- if (!("position" in p) && !("set_active" in p)) console.log(p);
- if ("joined" in p) {
- my_id = p.joined.id
- data = p.joined.data
- } else if ("add_player" in p) {
- if (p.add_player.hand) items.set(p.add_player.hand[0], { kind: p.add_player.hand[1], player: p.add_player.id, tracking_player: true, x: 0, y: 0 })
- players.set(p.add_player.id, { x: 0, y: 0, name: p.add_player.name, rot: 0, hand: p.add_player.hand?.[0], facing: { x: 0, y: 1 } })
- } else if ("remove_player" in p) {
- players.delete(p.remove_player.id)
- } else if ("position" in p) {
- if (p.position.player == my_id) return; // we know better where we are
- const pl = players.get(p.position.player)!
- pl.x = p.position.pos[0]
- pl.y = p.position.pos[1]
- pl.rot = p.position.rot
- } else if ("take_item" in p) {
- const item = items.get(p.take_item.item)!
- item.tracking_player = true
- item.player = p.take_item.player
- } else if ("put_item" in p) {
- const item = items.get(p.put_item.item)!
- item.tracking_player = false
- item.tile = { x: p.put_item.pos[0], y: p.put_item.pos[1] }
- } else if ("produce_item" in p) {
- items.set(p.produce_item.id, { kind: p.produce_item.kind, x: p.produce_item.pos[0] + 0.5, y: p.produce_item.pos[1] + 0.5, tracking_player: false, tile: { x: p.produce_item.pos[0], y: p.produce_item.pos[1] } })
- tiles.get(p.produce_item.pos.toString())!.items.push(p.produce_item.id)
- } else if ("consume_item" in p) {
- const t = tiles.get(p.consume_item.pos.toString())!
- t.items.splice(t.items.indexOf(p.consume_item.id))
- items.delete(p.consume_item.id)
- } else if ("set_active" in p) {
- tiles.get(p.set_active.tile.toString())!.active_progress = p.set_active.progress
- } else if ("update_map" in p) {
- tiles.set(p.update_map.pos.toString(), { x: p.update_map.pos[0], y: p.update_map.pos[1], kind: p.update_map.tile, items: [] })
- } else console.warn("unknown packet", p);
+ if (!["position", "set_active"].includes(p.type)) console.log(p);
+ switch (p.type) {
+ case "joined":
+ my_id = p.id
+ data = p.data
+ break;
+ case "add_player":
+ if (p.hand) items.set(p.hand[0], { kind: p.hand[1], player: p.id, tracking_player: true, x: 0, y: 0 })
+ players.set(p.id, { x: 0, y: 0, name: p.name, rot: 0, hand: p.hand?.[0], facing: { x: 0, y: 1 } })
+ break;
+ case "remove_player":
+ players.delete(p.id)
+ break;
+ case "position": {
+ if (p.player == my_id) return; // we know better where we are
+ const pl = players.get(p.player)!
+ pl.x = p.pos[0]
+ pl.y = p.pos[1]
+ pl.rot = p.rot
+ break;
+ }
+ case "take_item": {
+ const item = items.get(p.item)!
+ item.tracking_player = true
+ item.player = p.player
+ break;
+ }
+ case "put_item": {
+ const item = items.get(p.item)!
+ item.tracking_player = false
+ item.tile = { x: p.pos[0], y: p.pos[1] }
+ break;
+ }
+ case "produce_item":
+ items.set(p.id, { kind: p.kind, x: p.pos[0] + 0.5, y: p.pos[1] + 0.5, tracking_player: false, tile: { x: p.pos[0], y: p.pos[1] } })
+ tiles.get(p.pos.toString())!.items.push(p.id)
+ break;
+ case "consume_item": {
+ const t = tiles.get(p.pos.toString())!
+ t.items.splice(t.items.indexOf(p.id))
+ items.delete(p.id)
+ break;
+ }
+ case "set_active": {
+ tiles.get(p.tile.toString())!.active_progress = p.progress
+ break;
+ }
+ case "update_map":
+ tiles.set(p.pos.toString(), { x: p.pos[0], y: p.pos[1], kind: p.tile, items: [] })
+ break;
+ default:
+ console.warn("unknown packet", p);
+ }
}
const keys_down = new Set();
@@ -109,14 +127,14 @@ function get_interact_target(): V2 | undefined {
function interact(edge: boolean) {
const { x, y } = get_interact_target()!;
- send({ interact: { pos: [x, y], edge } })
+ send({ type: "interact", pos: [x, y], edge })
}
function tick_update() {
const p = players.get(my_id)
if (!p) return
- send({ position: { pos: [p.x, p.y], rot: p.rot } })
+ send({ type: "position", pos: [p.x, p.y], rot: p.rot })
}
function frame_update(dt: number) {
const p = players.get(my_id)
diff --git a/test-client/protocol.ts b/test-client/protocol.ts
index 2dd18b4d..520709fb 100644
--- a/test-client/protocol.ts
+++ b/test-client/protocol.ts
@@ -10,20 +10,20 @@ export interface Gamedata {
}
export type PacketS =
- { join: { name: string } } // You join, sent as first packet.
- | { position: { pos: Vec2, rot: number } } // Update your position and rotation in radians (0 is -y)
- | { interact: { pos: Vec2, edge: boolean } } // Interact with some tile. edge is true when pressing and false when releasing interact button
- | { collide: { player: PlayerID, force: Vec2 } } // Apply force to another player as a result of a collision
+ { type: "join", name: string } // You join, sent as first packet.
+ | { type: "position", pos: Vec2, rot: number } // Update your position and rotation in radians (0 is -y)
+ | { type: "interact", pos: Vec2, edge: boolean } // Interact with some tile. edge is true when pressing and false when releasing interact button
+ | { type: "collide", player: PlayerID, force: Vec2 } // Apply force to another player as a result of a collision
export type PacketC =
- { joined: { id: PlayerID, data: Gamedata } } // You joined
- | { add_player: { id: PlayerID, name: string, hand?: [ItemID, ItemIndex] } } // Somebody else joined (or was already in the game)
- | { remove_player: { id: PlayerID } } // Somebody left
- | { position: { player: PlayerID, pos: Vec2, rot: number } } // Update the position of a players (your own position is included here)
- | { take_item: { item: ItemID, player: PlayerID } } // An item was taken from a tile
- | { put_item: { item: ItemID, pos: Vec2 } } // An item was put on a tile
- | { produce_item: { id: ItemID, pos: Vec2, kind: ItemIndex } } // A tile generated a new item
- | { consume_item: { id: ItemID, pos: Vec2 } } // A tile removed an item
- | { set_active: { tile: Vec2, progress?: number } } // A tile is doing something. progress goes from 0 to 1, then null when finished
- | { update_map: { pos: Vec2, tile: TileIndex } } // A map tile was changed
+ { type: "joined", id: PlayerID, data: Gamedata } // You joined
+ | { type: "add_player", id: PlayerID, name: string, hand?: [ItemID, ItemIndex] } // Somebody else joined (or was already in the game)
+ | { type: "remove_player", id: PlayerID } // Somebody left
+ | { type: "position", player: PlayerID, pos: Vec2, rot: number } // Update the position of a players (your own position is included here)
+ | { type: "take_item", item: ItemID, player: PlayerID } // An item was taken from a tile
+ | { type: "put_item", item: ItemID, pos: Vec2 } // An item was put on a tile
+ | { type: "produce_item", id: ItemID, pos: Vec2, kind: ItemIndex } // A tile generated a new item
+ | { type: "consume_item", id: ItemID, pos: Vec2 } // A tile removed an item
+ | { type: "set_active", tile: Vec2, progress?: number } // A tile is doing something. progress goes from 0 to 1, then null when finished
+ | { type: "update_map", pos: Vec2, tile: TileIndex } // A map tile was changed