fix/reach-and-movement-integrity #28
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/reach-and-movement-integrity"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #19
Closes #20
Closes #21
Closes #22
Closes #23
Closes #24
World.jump/2 set player.position outright. Nothing checked that the tile it landed on was standable -- fine while every destination came from the transport dump, and not fine once Climbing.Geometry started answering for the 380 {placement, action} pairs the dump never saw, at 53.6% exact. Contract.Landing now stands in front of it, for scripted teleports as well as transports: a dialogue that drops somebody inside a wall is the same bug as a staircase that does. Refusing outright was the obvious fix and the data says it is the wrong one. Measured against the 3,297 extracted transports, 105 destinations read as solid -- refusing them all breaks 3.2% of a table built from observations of the real game. 71 of the 105 have an open tile cardinally beside them and a one-tile nudge lands the player where they were plainly meant to be; the remaining 34 are enclosed with no open tile in the whole ring, and those are refused. Checking all eight neighbours instead of the four finds exactly the same 71, so the diagonals are left out. Both outcomes log. A nudge means our data or our geometry put somebody where they cannot stand, and correcting that silently is how it stays true. What this cannot catch is the void: no plane above 0 carries a single blocked-floor flag, so a climb landing outside a building upstairs arrives on open walkable ground and passes every check here. That needs connectivity rather than a tile lookup, which a placement cannot afford. Closes #19Opened as "NPCs have no move-speed mask, which blocks NPC running", on the premise that the NPC info packet carries distance in its movement bits and speed in a separate mask the way the player one does. Read against the client, that is not how rev 149 works and there is nothing to reserve. method708 hands the movement type straight to NPC.method1663(direction, speed), which stores it on the queued tile: 1 for the single 3-bit step of type 1, and 2 for each of the two steps of type 2. The shared Actor render loop reads pathTraversed[pathLength - 1] and doubles its per-cycle advance when it is 2 -- the same doubling the player path reaches through its per-slot byte, off a different source. So type 2 is the run mask. {:run, first, second} is already the whole of what an NPC needs to run correctly. All seven bits of the NPC mask block are spoken for by other fields and the eighth, 0x80, is never tested. Combat pursuit needs a server that gives an NPC two steps in a tick, and nothing in this encoder. Closes #27