Repository navigation
Conversation
dafioram
force-pushed
the
fix/prop-footprints
branch
2 times, most recently
from
November 7, 2026 20:01
9d0776c to
db2a384
Compare
Replays a single click walk with the coordinates the game log prints, with the follower's diagnostics on, so a stuck walk from a playtest can be stepped through offline. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FdjaHiBNBYFeCRNMsCg2Bs
The no-corridor diagnosis listed blockers without saying which prop they were. Each obstacle disc is now tagged with its template and scid. --broken=<template|0xscid>,... leaves out props the player broke in the session being replayed, which block nothing in-game. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FdjaHiBNBYFeCRNMsCg2Bs
A does_block_path prop that is neither long and thin nor big blocked a disc reaching its bounding box's corners. Beside a rectangle's sides that overshoots: a farmhouse bed's 1.66u disc covered the top stair triangles beside it and sealed the upper floor (hero-sim replay of the field log: sealed by bed_glb_04). These props now block their oriented footprint rectangle plus 0.1u, with the disc's rules otherwise (the vertical band, centroid containment, edge crossings only for small triangles). The game and hero-sim/roam-sim's mirror both change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FdjaHiBNBYFeCRNMsCg2Bs
The 0.1u margin is for centroid containment (bodies on a tile). Applied to the edge-crossing test it let two slivers grazing the bed's side at the farmhouse stair top seal the stair (hero-sim replay: bed_glb_04 rect edge a=0.25 / a=0.00). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FdjaHiBNBYFeCRNMsCg2Bs
The farmhouse stair's only links to the ground floor are three slivers at its foot. A cart's (in-game) or the bed's (hero-sim) footprint grazed their edges, and the edge test sealed them, cutting the stair off from both floors (field log: every click from the stair rejected, sealed by cart_grs_03 rect edge a=0.25/0.22/0.00). An edge crossing now seals a small triangle only when at least 0.4u of the edge lies inside the footprint; the blame tag records that depth. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FdjaHiBNBYFeCRNMsCg2Bs
The farmhouse stair was still sealed (field log: every click from its foot refused, sealed by cart_grs_03 rect edge a=0.25 in=0.45, tri 14162), just past the 0.4u edge-depth rule. Two rules for mid-size (rectangle) props: - An edge crossing seals a small triangle only when the triangle's center is within 0.3u of the footprint: a sliver that merely clips a corner stays walkable. - A rectangle prop blocks surfaces up to 0.9u above its base (and no higher than its top + 0.5), the ground it stands on; raised floors and stairs beside it, across a wall, are no longer blocked. Disc obstacles (long fences, big wagons) keep their band: one center base height would leave a hillside fence's uphill end unblocked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FdjaHiBNBYFeCRNMsCg2Bs
Writes every nav triangle within --near (source snode, vertices, neighbours across each edge, extra links, and the blame tag of whatever blocks it) and each blocking prop's footprint and Y band. Enough to redraw a sealed stair or doorway and check it against the walls without the game data. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FdjaHiBNBYFeCRNMsCg2Bs
A blocking prop's footprint was its mesh-space X × Z box run through its world transform, with the height band from mesh Y. Props authored Z-up and stood up by their root bind pose (most rigid props) are the other way round, so their footprint spanned their height and their band their length. The nav tools placed props without the root bind pose or scale_multiplier at all, so a replay blocked different ground than the game: the farmhouse stair the game blames on cart_grs_03 is open in hero-sim, which puts that cart in the yard. PropFootprint.FromBounds now takes the placed bounding box: the axis the transform points most nearly up is the height, the other two span the rectangle, and the band runs from the lowest to the highest corner. PropObstacle.Mark holds the capsule/grid/rectangle rules, and the game and the tools both mark through it, the tools placing each prop as the game does (scale × root bind pose × placement × node; the bind-pose helpers move to Core as PropBindPose). Blame tags carry the footprint's center. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FdjaHiBNBYFeCRNMsCg2Bs
Every break (a krug smashing a barrel, the hero a door) re-stamps all blocking props, and each disc and rectangle stamp tested every triangle of the ~50k-triangle mesh: ~95 props (more discs for fences) x 50k tests, a ~200ms frame each time (the field log's [perf] slow frames sit right after each '[smash]' / 'click-break'). The stamps now take their candidates from the mesh's XZ lookup grid (TrianglesNear, deduplicated): the same triangles can be hit, the far ones are never visited. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FdjaHiBNBYFeCRNMsCg2Bs
dafioram
force-pushed
the
fix/prop-footprints
branch
from
November 7, 2026 23:25
db2a384 to
5d8a353
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
First of four stacked nav PRs, now that hero-orders has merged. Next: nav replay tools (
tools/nav-replay), then multi-floor walking and door seams, which still need playtesting.What was wrong
scale_multiplier), so offline replays blocked different ground from what the player saw.What this changes
PropFootprintandPropObstacle(Core) compute a prop's footprint from its placed bounding box, detecting which box axis stands up. They mark it as a capsule (fences, walls), a disc grid (wagons, stalls) or its exact rectangle (mid-size props). The game and the tools both mark through them, placing props identically (PropBindPose, moved to Core;IsRigidRootPropandComputeRootBindPoseinRenderHostnow delegate to it). Covered byPropFootprintTests.--brokenleaves out props smashed in the session being replayed;--from/--toreplays one click walk from the game log's coordinates;--dumpwrites the nav mesh and prop footprints around a point as text.Relation to open work
PropBindPosehere doesn't know about rest clips, so hero-sim's footprint for those props would sit about a unit off. It touches only a handful of wall switches; I'll follow up once both have landed, moving the rest offset into the shared placement.Testing
dotnet build SiegeFX.sln -c Release -warnaserror: 0 warnings, 0 errors.dotnet test: all 133 pass.🤖 Generated with Claude Code
https://claude.ai/code/session_01FdjaHiBNBYFeCRNMsCg2Bs