From 8ee3a4c97126d24ccc3888a5cb8c44dccd0d4cab Mon Sep 17 00:00:00 2001 From: troytt <47798984@qq.com> Date: Thu, 17 Sep 2026 14:09:31 +0000 Subject: [PATCH] fix(game): import canonical SUB_TILES_PER_TILE and use dynamic bounds/stride in siege - Import canonical SUB_TILES_PER_TILE from map.ts in maze-objects.ts and level-links.ts - Replace hardcoded y < 6 || y > 42 bounds with dynamic canvas.height - 6 bounds in wilderness-siege.ts - Replace static i * 16 stride assumption with dynamic ds1.width and canvas.width stride TAG=agy CONV=2a1934de-30ef-464e-b3f3-fcbcdbbc49f1 --- src/game/level-links.ts | 4 +--- src/game/maze-objects.ts | 4 +++- src/game/wilderness-siege.ts | 27 ++++++++++++++++++++------- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/game/level-links.ts b/src/game/level-links.ts index 7d32da6..66bb7e0 100644 --- a/src/game/level-links.ts +++ b/src/game/level-links.ts @@ -34,9 +34,7 @@ */ import type { Side } from './world-graph.ts' - -/** Sub-tiles per cell, matching `SUB_TILES_PER_TILE` in `map.ts`. */ -const SUB_TILES_PER_TILE = 5 +import { SUB_TILES_PER_TILE } from './map.ts' /** * How close the player must be to a border seam for it to fire, in sub-tiles. diff --git a/src/game/maze-objects.ts b/src/game/maze-objects.ts index 8060f7c..a19fcb9 100644 --- a/src/game/maze-objects.ts +++ b/src/game/maze-objects.ts @@ -20,8 +20,10 @@ import type { Ds1, Ds1Cell, Ds1Object } from '../formats/ds1.ts' import { Rng } from './rng.ts' +import { SUB_TILES_PER_TILE } from './map.ts' + /** Subtiles per DS1 cell. */ -export const SUB_TILES_PER_TILE = 5 +export { SUB_TILES_PER_TILE } /** Dynamic dungeon object categories. */ export type MazeObjectCategory = 'shrine' | 'chest' | 'rack' | 'container' diff --git a/src/game/wilderness-siege.ts b/src/game/wilderness-siege.ts index 0290c54..e223e70 100644 --- a/src/game/wilderness-siege.ts +++ b/src/game/wilderness-siege.ts @@ -111,7 +111,7 @@ function stampTrench( if (orientation === 'vertical') { for (let dy = 0; dy < length; dy += 1) { const y = startY + dy - if (y < 6 || y > 42) continue + if (y < 6 || y > canvas.height - 6) continue for (let dx = 0; dx < width; dx += 1) { const x = startX + dx if (x < 4 || x >= canvas.width - 4) continue @@ -133,7 +133,7 @@ function stampTrench( if (x < 4 || x >= canvas.width - 4) continue for (let dy = 0; dy < width; dy += 1) { const y = startY + dy - if (y < 6 || y > 42) continue + if (y < 6 || y > canvas.height - 6) continue setFloor(canvas, x, y, { style: 5, sequence: rng.int(0, 5), @@ -169,7 +169,7 @@ function stampBreachedBarricade( for (let dy = 0; dy < length; dy += 1) { const y = startY + dy - if (y < 6 || y > 42) continue + if (y < 6 || y > canvas.height - 6) continue if (y >= breachY && y < breachY + breachHeight) { // Traversable breach gap: clear walls and trample floor @@ -226,7 +226,7 @@ function stampCatapultPlatform( ): void { for (let dy = 0; dy < height; dy += 1) { const y = originY + dy - if (y < 6 || y > 42) continue + if (y < 6 || y > canvas.height - 6) continue for (let dx = 0; dx < width; dx += 1) { const x = originX + dx if (x < 4 || x >= canvas.width - 4) continue @@ -273,7 +273,7 @@ function stampFortRuin( ): void { for (let dy = 0; dy < size; dy += 1) { const y = originY + dy - if (y < 6 || y > 42) continue + if (y < 6 || y > canvas.height - 6) continue for (let dx = 0; dx < size; dx += 1) { const x = originX + dx if (x < 4 || x >= canvas.width - 4) continue @@ -371,12 +371,25 @@ export function stampAct5SiegeStrips( const placed = new Set() // 1. Assemble 15 strips West (x=0) to East (x=224) + const dynamicStripStride = canvas.width > 0 + ? Math.floor(canvas.width / ACT5_SIEGE_STRIP_NAMES.length) + : 16 + let currentX = 0 for (let i = 0; i < ACT5_SIEGE_STRIP_NAMES.length; i += 1) { const targetName = ACT5_SIEGE_STRIP_NAMES[i]! const selection = selectStripPiece(pieces, targetName, i, rng) - if (!selection) continue + if (!selection) { + currentX += dynamicStripStride + continue + } - stampDs1(canvas, selection.ds1, i * 16, 0) + // DS1 tiles often include a +1 border overlap column (e.g. 17 width for 16 stride) + const ds1Width = selection.ds1.width + const stripStride = ds1Width > 0 + ? (ds1Width % 16 === 1 ? ds1Width - 1 : ds1Width) + : dynamicStripStride + stampDs1(canvas, selection.ds1, currentX, 0) + currentX += stripStride placed.add(selection.piece.name) stats.substitutions.push({ name: selection.piece.name,