aboutsummaryrefslogtreecommitdiff
path: root/test-client
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-10-09 19:10:15 +0200
committermetamuffin <metamuffin@disroot.org>2025-10-09 19:10:17 +0200
commit7c3165796a65c6b7b30964d0a3e0516b83a55097 (patch)
treea1c28ae3f137a58aab687ecd172effd0ef8fd030 /test-client
parent6ed0228a1d2d6bee58971f60da11e5281cd3e2c3 (diff)
downloadhurrycurry-7c3165796a65c6b7b30964d0a3e0516b83a55097.tar
hurrycurry-7c3165796a65c6b7b30964d0a3e0516b83a55097.tar.bz2
hurrycurry-7c3165796a65c6b7b30964d0a3e0516b83a55097.tar.zst
Update test-client
Diffstat (limited to 'test-client')
-rw-r--r--test-client/main.ts47
-rw-r--r--test-client/movement.ts2
-rw-r--r--test-client/protocol.ts9
3 files changed, 38 insertions, 20 deletions
diff --git a/test-client/main.ts b/test-client/main.ts
index 90991c45..60d3ea6c 100644
--- a/test-client/main.ts
+++ b/test-client/main.ts
@@ -117,7 +117,17 @@ export const tiles = new Map<string, TileData>()
export const items_removed = new Set<ItemData>()
export const server_hints = new Map<string, MessageData>()
-export let data: Gamedata = { item_names: [], tile_names: [], spawn: [0, 0], tile_collide: [], tile_interact: [], maps: [], hand_count: 0 }
+export let data: Gamedata = {
+ item_names: [],
+ tile_names: [],
+ tile_interactable_empty: [],
+ tile_placeable_items: {},
+ maps: [],
+ hand_count: 0,
+ bot_algos: [],
+ current_map: "",
+ tile_walkable: []
+}
export let global_message: MessageData | undefined = undefined
export let my_id: PlayerID = -1
@@ -280,6 +290,7 @@ function packet(p: PacketC) {
case "set_ingame":
console.log(`ingame ${p.state}`);
is_lobby = p.lobby
+ send({ type: "ready" })
break;
case "movement_sync": {
const me = players.get(my_id)
@@ -311,12 +322,6 @@ function packet(p: PacketC) {
break;
case "menu":
switch (p.menu) {
- case "document":
- // TODO implement document format
- if (JSON.stringify(p.data).search("b.toc") != -1)
- open("https://s.metamuffin.org/static/hurrycurry/book.pdf");
- else alert("document display not supported yet")
- break
case "score":
global_message = {
timeout: { initial: 5, remaining: 5, pinned: false },
@@ -337,11 +342,11 @@ function packet(p: PacketC) {
export let chat: null | HTMLInputElement = null;
const QUICK_COMMANDS: { [key: string]: string } = {
- "Numpad1": "/start junior",
- "Numpad2": "/start debug2",
- "Numpad3": "/start sophomore",
- "Numpad4": "/start debug",
- "Numpad5": "/start 5star",
+ "Numpad1": "/start -s junior",
+ "Numpad2": "/start -s debug2",
+ "Numpad3": "/start -s sophomore",
+ "Numpad4": "/start -s debug",
+ "Numpad5": "/start -s 5star",
"Numpad6": "/start campaign/lobby",
"Numpad8": "/start-tutorial plate:seared-patty,sliced-bun",
"Numpad9": "/start-tutorial plate:bun",
@@ -387,12 +392,19 @@ function toggle_chat() {
}
}
+export function can_interact_with_tile(t: TileData, hand: ItemSlot) {
+ return t.item
+ || (!hand.item && data.tile_interactable_empty.includes(t.kind))
+ || (hand.item && !data.tile_placeable_items[t.kind])
+ || (hand.item && data.tile_placeable_items[t.kind]?.includes(hand.item?.kind))
+}
+
export function get_interact_target(): V2 | undefined {
if (interacting) return interacting
const me = players.get(my_id)
if (!me) return
- if (location.hash.search("newinteract") == -1)
+ if (location.hash.search("oldinteract") != -1)
return {
x: Math.floor(me.position.x + Math.sin(me.rot)),
y: Math.floor(me.position.y + Math.cos(me.rot))
@@ -407,7 +419,8 @@ export function get_interact_target(): V2 | undefined {
for (let ox = -1; ox <= 1; ox++) for (let oy = -1; oy <= 1; oy++) {
const t = tiles.get([bx + ox, by + oy] + "")
if (!t) continue
- if (data.tile_interact[t.kind] || t.item) {
+ for (const hand of me.hands) {
+ if (!can_interact_with_tile(t, hand)) continue
const cx = (bx + ox + 0.5)
const cy = (by + oy + 0.5)
const dx = rx - cx
@@ -489,9 +502,11 @@ function frame_update(dt: number) {
if (global_message && tick_message(global_message, dt)) global_message = undefined
const it = get_interact_target() ?? { x: 0, y: 0 };
- const possible = data.tile_interact[tiles.get([it.x, it.y].toString())?.kind ?? 0] ?? false
+ const target_tile = tiles.get([it.x, it.y].toString())
+ const me = players.get(my_id)
+ const possible = target_tile && me && me.hands.find(h => can_interact_with_tile(target_tile, h))
lerp_exp_v2_mut(interact_target_anim, it, dt * 15.)
- interact_possible_anim = lerp_exp(interact_possible_anim, +possible, dt * 18.)
+ interact_possible_anim = lerp_exp(interact_possible_anim, +!!possible, dt * 18.)
interact_active_anim = lerp_exp(interact_active_anim, +!!interacting, dt * 15.)
const zoom_target = Math.min(canvas.width, canvas.height) * (keys_down.has(KEY_ZOOM) ? 0.05 : 0.1)
diff --git a/test-client/movement.ts b/test-client/movement.ts
index 501f8558..d3f30ae0 100644
--- a/test-client/movement.ts
+++ b/test-client/movement.ts
@@ -59,7 +59,7 @@ function collide_player(p: MovementBase, _dt: number) {
const y = Math.floor(p.position.y) + yo
const tile = tiles.get([x, y].toString())
- if (tile && !data.tile_collide[tile.kind]) continue
+ if (tile && data.tile_walkable.includes(tile.kind)) continue
const d = aabb_point_distance(x, y, x + 1, y + 1, p.position.x, p.position.y)
if (d > PLAYER_SIZE) continue
diff --git a/test-client/protocol.ts b/test-client/protocol.ts
index 4a80a37d..0a62f557 100644
--- a/test-client/protocol.ts
+++ b/test-client/protocol.ts
@@ -28,12 +28,14 @@ export interface MapMetadata {
}
export interface Gamedata {
+ current_map: string,
item_names: string[], // Look-up table for ItemIndex
tile_names: string[], // Look-up table for TileIndex
- tile_collide: boolean[], // Look-up table for TileIndex to check tile collision with players
- tile_interact: boolean[], // Look-up table for TileIndex to check if a tile is interactable
- spawn: Vec2, // Where players spawn when they join.
+ tile_walkable: number[], // List of TileIndex that have no collision
+ tile_placeable_items: { [key: string]: number[] }, // Map from TileIndex to list of ItemIndex which can be placed on that tile. Not set if not restricted
+ tile_interactable_empty: number[], // List of TileIndex that have "crate recipes"
maps: [string, MapMetadata][], // Metadata for most available maps
+ bot_algos: string[],
hand_count: number,
}
@@ -46,6 +48,7 @@ export type PacketS =
| { type: "communicate", player: PlayerID, message?: Message, timeout?: number, pin?: boolean } // Sends a message
| { type: "effect", player: PlayerID, name: string } // Sends an effect
| { type: "replay_tick", dt: number } // Steps forward in replay.
+ | { type: "ready" }
export type PacketC =
{ type: "version", minor: number, major: number, supports_bincode?: boolean } // Sent once after connecting to ensure you client is compatible