summaryrefslogtreecommitdiff
path: root/test-client
diff options
context:
space:
mode:
Diffstat (limited to 'test-client')
-rw-r--r--test-client/main.ts73
-rw-r--r--test-client/protocol.ts12
2 files changed, 44 insertions, 41 deletions
diff --git a/test-client/main.ts b/test-client/main.ts
index aeca8084..580ff755 100644
--- a/test-client/main.ts
+++ b/test-client/main.ts
@@ -18,8 +18,8 @@
/// <reference lib="dom" />
import { MovementBase, update_movement } from "./movement.ts";
-import { Gamedata, ItemIndex, Message, PacketC, PacketS, PlayerID, TileIndex } from "./protocol.ts";
-import { V2, add_v2, lerp_exp_v2_mut, normalize, lerp_exp } from "./util.ts";
+import { Gamedata, ItemIndex, ItemLocation, Message, PacketC, PacketS, PlayerID, TileIndex } from "./protocol.ts";
+import { V2, lerp_exp_v2_mut, normalize, lerp_exp } from "./util.ts";
import { draw_ingame, draw_wait } from "./visual.ts";
const KEY_INTERACT = "KeyJ"
@@ -82,8 +82,8 @@ export interface PlayerData extends MovementBase {
}
export interface TileData {
- x: number
- y: number
+ x: number, y: number // tile position
+ position: V2, // center position
kind: TileIndex
item?: ItemData
}
@@ -113,6 +113,12 @@ export let interact_possible_anim: number = 0
export let interact_active_anim: number = 0
let interacting: V2 | undefined;
+function get_item_location(loc: ItemLocation): PlayerData | TileData {
+ if ("tile" in loc) return tiles.get(loc.tile.toString())!
+ if ("player" in loc) return players.get(loc.player)!
+ throw new Error("invalid item location");
+}
+
function send(p: PacketS) { ws.send(JSON.stringify(p)) }
function packet(p: PacketC) {
if (!["position", "set_active", "update_map"].includes(p.type))
@@ -153,45 +159,40 @@ function packet(p: PacketC) {
pl.rot = p.rot
break;
}
- case "take_item": {
- const player = players.get(p.player)!
- const tile = tiles.get(p.tile.toString())!
- player.item = tile.item;
- player.item!.tracking = player.position
- tile.item = undefined
- break;
- }
- case "put_item": {
- const player = players.get(p.player)!
- const tile = tiles.get(p.tile.toString())!
- tile.item = player.item
- tile.item!.tracking = add_v2(tile, 0.5)
- player.item = undefined
- break;
- }
- case "set_tile_item": {
- const tile = tiles.get(p.tile.toString())!
- if (tile.item !== undefined && tile.item !== null) items_removed.add(tile.item)
- tile.item = undefined
- if (p.item !== undefined && p.item !== null) tile.item = { kind: p.item, x: p.tile[0] + 0.5, y: p.tile[1] + 0.5 }
+ case "move_item": {
+ const from = get_item_location(p.from)
+ const to = get_item_location(p.to)
+
+ to.item = from.item
+ to.item!.tracking = to.position
+ from.item = undefined
+
break;
}
- case "set_player_item": {
- const player = players.get(p.player)!
- if (player.item !== undefined && player.item !== null) items_removed.add(player.item)
- player.item = undefined
- if (p.item !== undefined && p.item !== null) player.item = { kind: p.item, x: player.position.x + 0.5, y: player.position.y + 0.5 }
+ case "set_item": {
+ const slot = get_item_location(p.location)
+ if (slot.item !== undefined && slot.item !== null) items_removed.add(slot.item)
+ slot.item = undefined
+ if (p.item !== undefined && p.item !== null) slot.item = { kind: p.item, x: slot.position.x, y: slot.position.y }
break;
}
- case "set_active": {
- const item = tiles.get(p.tile.toString())!.item!;
- item.progress = p.progress
- item.progress_warn = p.warn
+ case "set_progress": {
+ const slot = get_item_location(p.item)
+ if (!slot.item) return
+ slot.item.progress = p.progress
+ slot.item.progress_warn = p.warn
break;
}
case "update_map":
- if (p.kind !== undefined && p.kind !== null) tiles.set(p.tile.toString(), { x: p.tile[0], y: p.tile[1], kind: p.kind })
- else tiles.delete(p.tile.toString())
+ if (p.kind !== undefined && p.kind !== null)
+ tiles.set(p.tile.toString(), {
+ x: p.tile[0],
+ y: p.tile[1],
+ position: { x: p.tile[0] + 0.5, y: p.tile[1] + 0.5 },
+ kind: p.kind
+ })
+ else
+ tiles.delete(p.tile.toString())
break;
case "communicate": {
const player = players.get(p.player)!
diff --git a/test-client/protocol.ts b/test-client/protocol.ts
index 1e76700a..fd0f8d43 100644
--- a/test-client/protocol.ts
+++ b/test-client/protocol.ts
@@ -41,11 +41,9 @@ export type PacketC =
| { type: "add_player", id: PlayerID, name: string, position: Vec2, character: number } // 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", tile: Vec2, player: PlayerID } // An item was taken from a tile
- | { type: "put_item", tile: Vec2, player: PlayerID } // An item was put on a tile
- | { type: "set_tile_item", tile: Vec2, item?: ItemIndex } // A tile changed its item
- | { type: "set_player_item", player: PlayerID, item?: ItemIndex } // A player changed their item
- | { type: "set_active", tile: Vec2, progress?: number, warn: boolean } // A tile is doing something. progress goes from 0 to 1, then null when finished
+ | { type: "move_item", from: ItemLocation, to: ItemLocation } // Item moved
+ | { type: "set_item", location: ItemLocation, item?: ItemIndex } // the item contained in a tile or player changed
+ | { type: "set_progress", item: ItemLocation, progress?: number, warn: boolean } // A tile is doing something. progress goes from 0 to 1, then null when finished
| { type: "update_map", tile: Vec2, kind: TileIndex | null, neighbors: [TileIndex | null] } // A map tile was changed
| { type: "communicate", player: PlayerID, message?: Message, persist: boolean } // A player wants to communicate something, message is null when cleared
| { type: "server_message", text: string } // Text message from the server
@@ -57,3 +55,7 @@ export type Message =
{ item: number }
| { text: string }
| { effect: string }
+
+export type ItemLocation =
+ { player: PlayerID }
+ | { tile: Vec2 }