HammeriteNavigationLinkBuilder

Navigation. Inherits RefCounted

Finds the ways through a level that are not walking, and measures them.

Why there are any. Ground derived from a carved world already connects itself: two rooms that abut are joined by an aperture the compiler punched from their shared wall, and their floors come out coplanar and edge-coincident, so the navigation server stitches the two regions together and an agent walks from one to the other without anything being authored. Measured on two_windows, every ordinary doorway in the level connects for free.

What does NOT connect is a height discontinuity. A window with a 96-unit sill, a balcony over a hall, a gap between two roofs - the ground stops, and the ground on the other side is somewhere else. Those are the links, and they are exactly the places a stealth game cares about, because they are the routes a guard cannot take and a thief can.

Three are derived and one is authored. Windows come from apertures whose sill stands above the floor; drops from a patch of ground overhanging lower ground; jumps from two patches within reach of each other across clear air. What cannot be seen in the geometry - that this ladder is climbable, that this rope reaches the balcony - is placed by hand as a entity_type() entity.

Nothing here knows what an agent is. Every link carries how high it must be climbed, how far it spans, how far it falls and how wide and tall the way through is; agent profiles compare against those numbers game-side. The thresholds below are only about what is worth LOOKING at - generous enough that nothing a game might permit is missed.

Properties

TypeNameDefault
HammeriteCompileProgressprogress
floatstep_height
String[]warnings

Methods

ReturnsMethod
HammeriteNavigationLinkData[]build_links(map: HammeriteMap, surfaces: HammeriteNavigationSurface[])
floatdefault_step_height() static
StringNameentity_type() static
floatmax_drop() static
floatmax_jump_rise() static
floatmax_jump_span() static
StringNamename_key() static
StringNameone_way_key() static
StringNametarget_key() static

Property descriptions

progress

var progress: HammeriteCompileProgress

Told how far build_links() has got, when it runs as part of a compile. It stops early once this says it was cancelled.

step_height

var step_height: float

The tallest rise that is a STEP rather than a drop or a climb - one stair tread, one kerb - for this build. Set from HammeriteNavigationAgentProfiles.step_height by the runtime.

It is a fact about the world's units rather than about any particular creature: whether a given agent can manage one is its profile's business (HammeriteNavigationAgentProfile.climb_height), so a rat with an 8-unit stride still cannot use a staircase built for people.

warnings

var warnings: String[]

What the last build could not do: an authored link with no other end, a window nobody can reach.

Method descriptions

func build_links(map: HammeriteMap, surfaces: HammeriteNavigationSurface[]) -> HammeriteNavigationLinkData[]

Every traversal link in map, derived from surfaces (the output of HammeriteNavigationBuilder) and from what the author placed.

default_step_height()

static func default_step_height() -> float

The step height a build uses when nobody says otherwise: 18 units, which Hammerite inherits from Hammer and which its stairs are built to.

entity_type()

static func entity_type() -> StringName

Entity type of an authored link, and the properties it carries.

max_drop()

static func max_drop() -> float

Drops further than this are not looked for. Nothing walks off a 1024-unit cliff on purpose, and the pair would only be filtered out game-side anyway.

max_jump_rise()

static func max_jump_rise() -> float

The biggest height change across a jump looked for, either way, in map units.

max_jump_span()

static func max_jump_span() -> float

The widest gap treated as jumpable, and the biggest height change across one. Deliberately larger than any agent's real reach: what is generated is a candidate, and profiles do the rejecting.

name_key()

static func name_key() -> StringName

Entity property: the link's name, for HammeriteNavigationRuntime.set_link_enabled().

one_way_key()

static func one_way_key() -> StringName

Entity property: true lets the link be taken only from the entity towards its far end.

target_key()

static func target_key() -> StringName

Entity property: a Vector3 from the entity's origin to the link's far end, in map units. A link whose far end is less than a unit away is dropped with a warning. Any entity carrying this is read as a link, whatever its type.

Hammerite 2.0 · built from 6d57ab2d, 2026-10-17