- Random walks and spins from SpriteMovementData, with random sleeps. - CanObjectMoveInDirection: side walls, land, objects' current and previous tiles, the radius (stored plus one) and the screen edge. - Objects freeze while text is open and during applymovement, and return home when both they and their home leave the object window. - Wandering positions are not saved; test helpers replan around NPCs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
796fe8f6d5
commit
6a74f59e46
12 files changed
+386
-20
No files matched your search
+23
-8
@@ -96,7 +96,8 @@ export function findPath(
|
||||
throw new Error(`No route to ${targetX},${targetY}`);
|
||||
}
|
||||
|
||||
/** Walk to a tile, settling any scene that a step triggers. */
|
||||
/** Walk to a tile, settling any scene that a step triggers. A roaming NPC
|
||||
* that steps into the way is waited out, then the route is planned again. */
|
||||
export function walkTo(
|
||||
world: GameWorld,
|
||||
targetX: number,
|
||||
@@ -104,12 +105,26 @@ export function walkTo(
|
||||
answers: (number | string)[] = [],
|
||||
): string[] {
|
||||
const shown: string[] = [];
|
||||
for (const direction of findPath(world, targetX, targetY)) {
|
||||
if (!world.move(direction))
|
||||
throw new Error(
|
||||
`Blocked moving ${direction} at ${world.x},${world.y}: ${world.notice}`,
|
||||
);
|
||||
shown.push(...settle(world, answers));
|
||||
for (let attempt = 0; attempt < 20; attempt++) {
|
||||
let blocked = false;
|
||||
for (const direction of findPath(world, targetX, targetY)) {
|
||||
if (!world.move(direction)) {
|
||||
const [, dx, dy] = DIRECTIONS.find(([name]) => name === direction)!;
|
||||
const blocker = world
|
||||
.objects()
|
||||
.some((object) => object.x === world.x + dx && object.y === world.y + dy);
|
||||
if (!blocker)
|
||||
throw new Error(
|
||||
`Blocked moving ${direction} at ${world.x},${world.y}: ${world.notice}`,
|
||||
);
|
||||
for (let tick = 0; tick < 64; tick++) world.tick();
|
||||
blocked = true;
|
||||
break;
|
||||
}
|
||||
shown.push(...settle(world, answers));
|
||||
}
|
||||
// A warp target leaves the map, so a completed path is the success test.
|
||||
if (!blocked) return shown;
|
||||
}
|
||||
return shown;
|
||||
throw new Error(`Could not reach ${targetX},${targetY}`);
|
||||
}
|
||||
Reference in new issue
Block a user