Stop drawing bullets past the edge of sight -- but never sooner than is safe
ci / verify (push) Successful in 54s
ci / verify (push) Successful in 54s
Bullets were drawn everywhere on screen, including out in the black past the edge of sight: shots that could not reach you, streaking across the dark. They now fade out beyond sight, under one condition that bounds the whole change: no enemy bullet may hit you without having been on screen, at full strength, for at least WARNING_TIME (0.75s) first. So each enemy bullet is drawn out to the edge of sight or to however far it could close in that window with you running straight at it -- its own speed, plus acceleration over the window, plus yours -- whichever is further, and fades over 80 units beyond. With today's content the edge of sight always wins: the fastest enemy bullet is 300 u/s, so head-on it is on screen 0.83s before it lands. The speed term is what keeps that true when something faster is added. Player shots fade at the edge of sight however fast they are, since they cannot hurt you; a Sniper's 1500 u/s shot was the commonest thing crossing the dark. Shadow does not hide a bullet. One behind a wall within sight range is still drawn over the darkness, because you can step round the corner into it, and hiding it would be exactly the invisible hit the condition rules out. The guarantee is tested the hard way: every emitter in the content, and bullets far faster than any of them, simulated head-on against a player running at them, measuring how long each was fully drawn before it landed. The rule's weakenings -- no speed term, forgetting the player's own approach, ignoring acceleration -- each fail it. The connect screen's backdrop passes no eye and draws everything, as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
170eb409dd
commit
94ad6b3429
8 files changed
+197
-10
No files matched your search
@@ -13,7 +13,7 @@ the obvious default.
|
||||
|
||||
```bash
|
||||
tools/check.sh # parse-check every script (~5s) -- run after every edit
|
||||
tools/test.sh # 568 GUT tests, headless (~4s)
|
||||
tools/test.sh # 576 GUT tests, headless (~4s)
|
||||
tools/smoke.sh # real server + 4 bot clients over ENet (~40s)
|
||||
tools/server.sh # dedicated server
|
||||
tools/client.sh --listen # host and play, no menu
|
||||
@@ -254,6 +254,12 @@ ticks in milliseconds with no SceneTree.
|
||||
`Visibility` over them, then whatever must stay visible. That is what lets a
|
||||
tile or an enemy be half lit. Anything new that fog may hide goes *before*
|
||||
`_draw_darkness`; anything it must not goes after.
|
||||
- **No enemy bullet may land without having been drawn first.** Bullets fade
|
||||
beyond the edge of sight, but `BulletRenderer.visibility()` stretches each
|
||||
enemy bullet's draw distance with its speed so it is always fully on screen
|
||||
`WARNING_TIME` before it could reach you. A faster bullet in new content is
|
||||
covered automatically; `test_bullet_draw.gd` fails if it is not. Never hide
|
||||
bullets by shadow alone — you can walk round a corner into one.
|
||||
- **A telegraph must be visible through fog.** `WorldView._draw_telegraphs`
|
||||
is drawn after the darkness on purpose; everything else in the view is under it. A
|
||||
warning you cannot see is an unavoidable hit with extra steps.
|
||||
|
||||
Reference in new issue
Block a user