From 279c718e94761ec86486a3fdf3bf758812f2f712 Mon Sep 17 00:00:00 2001 From: agustin-littlehat Date: Mon, 15 Jun 2026 02:54:55 -0300 Subject: [PATCH 01/10] Fix enemy visibility continuity --- src/runtime/shootables.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/runtime/shootables.ts b/src/runtime/shootables.ts index 7e83f28..602efa5 100644 --- a/src/runtime/shootables.ts +++ b/src/runtime/shootables.ts @@ -2201,11 +2201,19 @@ export function createQuakeShootablesController({ ): boolean { if (!canPrewarmShootableHandle(shootable)) return false; if (!shootable.enemy) return true; + if (canKeepEngagedEnemyPrewarmed(shootable, playerOrigin)) return true; if (shootable.visible || shootable.dead || !visibleLeaf) return false; if (!isShootableInFrontOfCameraNearPlane(shootable, playerOrigin)) return false; return shootableHasPlayerViewTargetAtDot(shootable, playerOrigin, QUAKE_SHOOTABLE_ENEMY_PREWARM_VIEW_DOT_MIN); } + function canKeepEngagedEnemyPrewarmed(shootable: QuakeShootableState, playerOrigin: Vec3): boolean { + const enemy = shootable.enemy; + if (!enemy || shootable.dead || shootable.health <= 0) return false; + if (!enemy.awake && !enemy.currentTarget && !enemy.pendingAttack) return false; + return distanceSq3(playerOrigin, shootable.origin) <= QUAKE_SHOOTABLE_PREWARM_DISTANCE_SQ; + } + function compareShootableVisibilityCandidates( a: QuakeShootableVisibilityCandidate, b: QuakeShootableVisibilityCandidate, @@ -2436,8 +2444,22 @@ export function createQuakeShootablesController({ now: number, ): void { combatBudget.beginEnemyFrame(now); + let movedEnemies = 0; for (const shootable of shootables.values()) { + const previousOrigin = shootable.enemy ? [...shootable.origin] as Vec3 : null; + const previousLeafIndex = shootable.leafIndex; updateEnemy(shootable, playerOrigin, dt, now); + if (!previousOrigin || !shootable.enemy) continue; + if ( + previousLeafIndex !== shootable.leafIndex || + distanceSq3(previousOrigin, shootable.origin) > QUAKE_SHOOTABLE_TRANSFORM_EPSILON * QUAKE_SHOOTABLE_TRANSFORM_EPSILON + ) { + movedEnemies++; + } + } + if (movedEnemies > 0) { + markQuakeTrace("shootables-enemy-motion-visibility-resync", { movedEnemies }); + syncVisibility(playerOrigin); } } From a75891d3aae79bb3cd0eac37026e7d675a26a8b6 Mon Sep 17 00:00:00 2001 From: agustin-littlehat Date: Mon, 15 Jun 2026 04:37:39 -0300 Subject: [PATCH 02/10] Bake main menu presentation --- index.html | 226 ++++++++++-------- src/App.ts | 65 +++-- src/assets/main-menu-cursor-baked.png | Bin 0 -> 879 bytes src/assets/main-menu-help-sprite.png | Bin 0 -> 1347 bytes src/assets/main-menu-level-select-sprite.png | Bin 0 -> 2600 bytes src/assets/main-menu-multiplayer-sprite.png | Bin 0 -> 2756 bytes src/assets/main-menu-options-sprite.png | Bin 0 -> 2041 bytes src/assets/main-menu-plaque-baked.png | Bin 0 -> 3575 bytes src/assets/main-menu-quit-sprite.png | Bin 0 -> 1256 bytes src/assets/main-menu-single-player-sprite.png | Bin 0 -> 3138 bytes src/assets/main-menu-title-baked.png | Bin 0 -> 2057 bytes src/assets/source-port-conback.png | Bin 60206 -> 58784 bytes src/quake.css | 131 ++++++---- src/runtime/app/debugPanelFlow.ts | 19 +- src/runtime/app/dom.ts | 2 - src/runtime/app/loadingFlow.ts | 3 +- src/runtime/menu.ts | 82 ++----- vite.config.ts | 8 + 18 files changed, 304 insertions(+), 232 deletions(-) create mode 100644 src/assets/main-menu-cursor-baked.png create mode 100644 src/assets/main-menu-help-sprite.png create mode 100644 src/assets/main-menu-level-select-sprite.png create mode 100644 src/assets/main-menu-multiplayer-sprite.png create mode 100644 src/assets/main-menu-options-sprite.png create mode 100644 src/assets/main-menu-plaque-baked.png create mode 100644 src/assets/main-menu-quit-sprite.png create mode 100644 src/assets/main-menu-single-player-sprite.png create mode 100644 src/assets/main-menu-title-baked.png diff --git a/index.html b/index.html index ec737d1..67fbe1a 100644 --- a/index.html +++ b/index.html @@ -4,6 +4,15 @@ + + + + + + + + +