Fog lit by rays: shadows cut through tiles, and walls stay visible
ci / verify (push) Successful in 52s
ci / verify (push) Successful in 52s
The fog asked one question per tile -- can I see its centre? -- and drew or skipped the whole tile on the answer. Every shadow was a staircase, tiles snapped in and out as you walked, and a wall beside you vanished whenever its centre happened to sit behind its neighbour. Visibility casts rays from the eye instead: a fixed sweep, plus two aimed either side of every wall corner, which is what makes each shadow edge a straight line rather than a smear between rays. The view now draws terrain and actors first and then darkness over whatever the rays did not reach, so a shadow runs straight through a tile and an enemy rounding a corner appears a slice at a time. Bullets are a child node and are still drawn over the dark; telegraphs are drawn after it, as they must be. "A bit less strict" is three specific things. A wall face you can see is lit 26 units in, measured perpendicular to the face; shadows end in a short fade rather than a line; and sight fades over its last 64 units rather than stopping at a circle. Still hard fog -- nothing remembered. The first version measured that depth along the ray, and a screenshot caught what no test had: a wall you look along got a sliver, so the wall beside you in a tunnel looked missing -- the old fog's own complaint. Perpendicular depth fixes it, and light stops the instant a ray steps back into the open, so it never rounds a corner, never reaches the far side of a one-tile wall, and never leaves a stepped wall through its other face. Two tiles touching only at a corner are closed. About half a millisecond a frame. Measured against the old fog in the same scene: hub 68 fps against 62, dungeon 240 against 240. The hub's own low rate predates this. MapGrid gains a revision counter so the corner list is rebuilt only when the map changes or the eye crosses a tile. screenshot.tscn now captures a dungeon, a tunnel and the tunnel with F1's overlay, which draws where each ray stopped -- and makes SHOT_DIR rather than failing every capture when it does not exist. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
83c3b920fb
commit
855669a665
12 files changed
+871
-45
No files matched your search
+10
-7
@@ -40,11 +40,14 @@ and more specific than the table above.
|
||||
|
||||
### Known flake
|
||||
|
||||
`tools/smoke.sh` failed once in a pre-push hook and then passed on four
|
||||
consecutive runs with no stray processes. It was not reproduced and is not
|
||||
diagnosed. The suspicion is machine load — the smoke test has fixed tick budgets
|
||||
and was competing with a full suite run — but that is a guess. If it recurs,
|
||||
that is the first thing to check.
|
||||
`tools/smoke.sh` has failed twice, **both times inside the pre-push hook**, and
|
||||
then passed on every direct run after: four in a row the first time, eight the
|
||||
second (six in a background loop plus two more, one of them the hook itself).
|
||||
Neither failure's logs survived, because the hook runs smoke without `KEEP`.
|
||||
The first suspicion was machine load, but the second failure had nothing else
|
||||
running. What is different about the hook is its context — stdin is git's
|
||||
pipe of ref lines, which every bot inherits. Unconfirmed. Push with
|
||||
`KEEP=1 git push` so the logs of the next one survive.
|
||||
|
||||
---
|
||||
|
||||
@@ -90,7 +93,7 @@ against itself.
|
||||
| Walls, pillars, pits, barricades | done | `MapGrid.Kind` + the three `BLOCKS_*` tables |
|
||||
| Enemies placed per room at creation | done | `Instance._populate()` |
|
||||
| Scrolling camera | done | [src/view/game_scene.gd](../src/view/game_scene.gd) |
|
||||
| Hard fog of war | done | `WorldView._draw_terrain` / `_visible` |
|
||||
| Hard fog of war, lit by rays rather than per tile | done | [src/view/visibility.gd](../src/view/visibility.gd), `WorldView._draw_darkness` |
|
||||
| Per-peer map streaming (anti map-hack) | done | `ServerRuntime._stream_map` |
|
||||
| Aggro: range **and** line of sight | done | `SimWorld._aggro_target` |
|
||||
| Cursor-to-world aiming under a scrolling camera | done | `ClientRuntime.screen_to_world` |
|
||||
@@ -427,7 +430,7 @@ feet is a coin flip, the same burst with a second of notice is a question.
|
||||
- **`EmitContext` gained an `events` list**, the only thing an emitter can do
|
||||
besides spawn bullets.
|
||||
- **Markers are drawn through fog and through walls.** Everything else in the
|
||||
view respects line of sight; a warning you cannot see is not a warning. See
|
||||
view is covered by the darkness; a warning you cannot see is not a warning. See
|
||||
`WorldView._draw_telegraphs`.
|
||||
|
||||
### The Cantor of the Vault
|
||||
|
||||
Reference in new issue
Block a user