diff options
| author | metamuffin <metamuffin@disroot.org> | 2025-10-09 19:10:15 +0200 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2025-10-09 19:10:17 +0200 |
| commit | 7c3165796a65c6b7b30964d0a3e0516b83a55097 (patch) | |
| tree | a1c28ae3f137a58aab687ecd172effd0ef8fd030 /test-client | |
| parent | 6ed0228a1d2d6bee58971f60da11e5281cd3e2c3 (diff) | |
| download | hurrycurry-7c3165796a65c6b7b30964d0a3e0516b83a55097.tar hurrycurry-7c3165796a65c6b7b30964d0a3e0516b83a55097.tar.bz2 hurrycurry-7c3165796a65c6b7b30964d0a3e0516b83a55097.tar.zst | |
Update test-client
Diffstat (limited to 'test-client')
| -rw-r--r-- | test-client/main.ts | 47 | ||||
| -rw-r--r-- | test-client/movement.ts | 2 | ||||
| -rw-r--r-- | test-client/protocol.ts | 9 |
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 |