@quake2ts/client 0.0.753 → 0.0.756
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.global.js +17 -17
- package/dist/browser/index.global.js.map +1 -1
- package/dist/cjs/index.cjs +17 -6
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/index.js +18 -7
- package/dist/esm/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/demo/handler.d.ts.map +1 -1
- package/dist/types/entities.d.ts.map +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/net/connection.d.ts.map +1 -1
- package/package.json +10 -10
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cgameBridge.ts","../../src/hud/crosshair.ts","../../src/hud/icons.ts","../../src/hud/damage.ts","../../src/hud.ts","../../src/demo/itemMapping.ts","../../src/lod.ts","../../src/entities.ts","../../src/demo/handler.ts","../../src/configStrings.ts","../../src/ui/menu/main.ts","../../src/ui/menu/saveLoad.ts","../../src/ui/menu/system.ts","../../src/ui/menu/options.ts","../../src/ui/menu/maps.ts","../../src/ui/menu/pause.ts","../../src/ui/menu/multiplayer.ts","../../src/demo/storage.ts","../../src/ui/menu/demo.ts","../../src/ui/menu/render.ts","../../src/ui/settings.ts","../../src/ui/storage.ts","../../src/ui/loading/screen.ts","../../src/ui/error.ts","../../src/ui/wheels/index.ts","../../src/net/browserWsDriver.ts","../../src/net/connection.ts","../../src/ui/demo-controls.ts","../../src/demo/camera.ts","../../src/effects.ts","../../src/effects-system.ts","../../src/blend.ts","../../src/scoreboard.ts","../../src/chat.ts","../../src/input/bindings.ts","../../src/input/controller.ts","../../src/input/command-buffer.ts","../../src/session.ts","../../src/net/master.ts","../../src/index.ts"],"names":["ArmorType","WeaponId","AmmoType","PowerupId","KeyId","vec3","mat4","RenderFx","U_REMOVE","createEmptyEntityState","applyEntityDelta","ZERO_VEC3","G_GetPowerupStat","MZ_SHOTGUN","MZ_SSHOTGUN","MZ_MACHINEGUN","MZ_CHAINGUN1","MZ_CHAINGUN2","MZ_CHAINGUN3","MZ_RAILGUN","MZ_ROCKET","MZ_GRENADE","MZ_BFG","MZ_HYPERBLASTER","MZ_BLASTER","angleVectors","dotVec3","WaterLevel","defaultPredictionState","interpolatePredictionState","ConfigStringIndex","MAX_MODELS","MAX_SOUNDS","MAX_IMAGES","DemoValidator","CvarFlags","NetChan","CMD_BACKUP","BinaryWriter","ClientCommand","writeUserCommand","crc8","BinaryStream","NetworkMessageParser","NetworkMessageBuilder","PROTOCOL_VERSION_RERELEASE","PlaybackState","DemoCameraMode","EntityEffects","MZ_BLUEHYPERBLASTER","MZ_PHALANX","MZ_IONRIPPER","MZ_ETF_RIFLE","MZ_HEATBEAM","spawnMuzzleFlash","TempEntity","spawnBulletImpact","spawnBlood","spawnExplosion","spawnBfgExplosion","spawnSplash","spawnSteam","spawnRailTrail","spawnBlasterImpact","spawnSparks","PlayerStat","CONTENTS_LAVA","CONTENTS_SLIME","MAX_CLIENTS","InputAction","PlayerButton","DEFAULT_FORWARD_SPEED","DEFAULT_SIDE_SPEED","DEFAULT_UP_SPEED","DEFAULT_YAW_SPEED","DEFAULT_PITCH_SPEED","DEFAULT_MOUSE_SENSITIVITY","mouseDeltaToViewDelta","addViewAngles","console","SaveStorage","createGame","EngineHost","ClientMode","ClientPrediction","ViewEffects","DemoPlaybackController","DemoRecorder","DynamicLightManager","GetCGameAPI","lowerKey","Camera","CONTENTS_WATER","hasPmFlag","PmFlag","vectorToAngles"],"mappings":"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","file":"index.cjs","sourcesContent":["import { CGameImport, CGameExport } from '@quake2ts/cgame';\nimport { ClientImports } from './index.js';\nimport { PmoveTraceResult, Vec3 } from '@quake2ts/shared';\nimport { ClientConfigStrings } from './configStrings.js';\nimport { Pic } from '@quake2ts/engine';\n\nexport interface ClientStateProvider {\n tickRate: number;\n frameTimeMs: number;\n serverFrame: number;\n serverProtocol: number;\n configStrings: ClientConfigStrings;\n getClientName(num: number): string;\n getKeyBinding(key: string): string;\n inAutoDemo: boolean;\n}\n\n// Stub implementation of CGameImport using existing client/engine state\nexport function createCGameImport(\n imports: ClientImports,\n state: ClientStateProvider,\n onPrint?: (msg: string) => void\n): CGameImport {\n // Local cache for texture handles to Pic objects\n // CGame uses handles (unknown), we use strings as handles.\n const picCache = new Map<string, Pic>();\n const pendingPics = new Set<string>();\n\n const getRenderer = () => imports.engine.renderer;\n\n return {\n // Frame timing\n get tick_rate() { return state.tickRate; },\n get frame_time_s() { return state.frameTimeMs / 1000.0; },\n get frame_time_ms() { return state.frameTimeMs; },\n\n // Console\n Com_Print: (msg: string) => {\n // Route to console system if exists\n console.log(`[CGAME] ${msg}`);\n if (onPrint) {\n onPrint(msg);\n }\n },\n Com_Error: (msg: string) => {\n console.error(`[CGAME ERROR] ${msg}`);\n if (onPrint) {\n onPrint(`^1[ERROR] ${msg}`);\n }\n },\n\n // Config strings\n get_configstring: (num: number) => {\n return state.configStrings.get(num) || '';\n },\n\n // Memory (No-op in JS)\n TagMalloc: (size: number, tag: number) => ({}),\n TagFree: (ptr: unknown) => {},\n FreeTags: (tag: number) => {},\n\n // Cvars\n cvar: (name: string, value: string, flags: number) => {\n if (!imports.host || !imports.host.cvars) {\n return null;\n }\n\n // Check if existing\n const existing = imports.host.cvars.get(name);\n if (existing) {\n return existing;\n }\n\n // Register new cvar\n return imports.host.cvars.register({\n name,\n defaultValue: value,\n flags,\n });\n },\n Cvar_Get: (name: string, value: string, flags: number) => {\n if (!imports.host || !imports.host.cvars) {\n // Return dummy if no host\n return { value: parseInt(value) || 0 };\n }\n // Check if existing\n let existing = imports.host.cvars.get(name);\n if (!existing) {\n // Register new cvar\n existing = imports.host.cvars.register({\n name,\n defaultValue: value,\n flags,\n });\n }\n\n // Return proxy object\n return {\n get value() { return existing!.number; }\n };\n },\n cvar_set: (name: string, value: string) => {\n imports.host?.cvars?.setValue(name, value);\n },\n cvar_forceset: (name: string, value: string) => {\n // Force set ignoring flags (if API supported)\n // For now, CvarRegistry.setValue doesn't strictly enforce flags like LATCH internally for every call,\n // but usually ForceSet implies overriding read-only or similar.\n // Our CvarRegistry.setValue is basic.\n imports.host?.cvars?.setValue(name, value);\n },\n\n // Client state\n CL_FrameValid: () => true, // Always assume valid for now\n CL_FrameTime: () => state.frameTimeMs,\n CL_ClientTime: () => state.frameTimeMs, // Use frame time as client time\n CL_ServerFrame: () => state.serverFrame,\n CL_ServerProtocol: () => state.serverProtocol,\n\n // Client info\n CL_GetClientName: (playerNum: number) => {\n return state.getClientName(playerNum);\n },\n CL_GetClientPic: (playerNum: number) => {\n // TODO: Skin/icon logic\n return '';\n },\n CL_GetClientDogtag: (playerNum: number) => {\n return '';\n },\n CL_GetKeyBinding: (key: string) => {\n return state.getKeyBinding(key);\n },\n\n // Asset Registration\n RegisterModel: (name: string) => {\n if (!imports.engine.assets) return;\n const ext = name.split('.').pop()?.toLowerCase();\n if (ext === 'md2') {\n imports.engine.assets.loadMd2Model(name).catch(e => console.warn(`Failed to precache MD2 ${name}`, e));\n } else if (ext === 'sp2') {\n imports.engine.assets.loadSprite(name).catch(e => console.warn(`Failed to precache Sprite ${name}`, e));\n } else if (ext === 'md3') {\n imports.engine.assets.loadMd3Model(name).catch(e => console.warn(`Failed to precache MD3 ${name}`, e));\n }\n },\n RegisterSound: (name: string) => {\n if (imports.engine.assets) {\n imports.engine.assets.loadSound(name).catch(e => console.warn(`Failed to precache sound ${name}`, e));\n }\n },\n\n // Drawing\n Draw_RegisterPic: (name: string) => {\n if (picCache.has(name)) {\n return name;\n }\n if (pendingPics.has(name)) {\n return name;\n }\n\n // Initiate load\n pendingPics.add(name);\n\n // We need to find the asset.\n // CGame passes names like \"pics/something.pcx\" or just \"w_shotgun\".\n // AssetManager expects specific paths usually.\n // But we can try loading as texture.\n\n // NOTE: CGame often registers simple names that map to paths.\n // We assume the name is a path or resolvable by AssetManager.\n if (imports.engine.assets) {\n imports.engine.assets.loadTexture(name).then(texture => {\n // Register with renderer\n if (imports.engine.renderer) {\n const pic = imports.engine.renderer.registerTexture(name, texture);\n picCache.set(name, pic);\n }\n pendingPics.delete(name);\n }).catch(err => {\n console.warn(`[CGameImport] Failed to load pic: ${name}`, err);\n pendingPics.delete(name);\n });\n }\n\n return name;\n },\n Draw_GetPicSize: (picHandle: unknown) => {\n const name = picHandle as string;\n const pic = picCache.get(name);\n if (pic) {\n return { width: pic.width, height: pic.height };\n }\n return { width: 0, height: 0 };\n },\n SCR_DrawChar: (x: number, y: number, char: number) => {\n // Not directly exposed, use drawString hack or expose it\n // Using single char string\n getRenderer()?.drawString(x, y, String.fromCharCode(char));\n },\n SCR_DrawPic: (x: number, y: number, picHandle: unknown) => {\n const name = picHandle as string;\n const pic = picCache.get(name);\n if (pic) {\n getRenderer()?.drawPic(x, y, pic);\n }\n },\n SCR_DrawColorPic: (x: number, y: number, picHandle: unknown, color: Vec3, alpha: number) => {\n const name = picHandle as string;\n const pic = picCache.get(name);\n if (pic) {\n getRenderer()?.drawPic(x, y, pic, [color.x, color.y, color.z, alpha]);\n }\n },\n SCR_DrawFontString: (x: number, y: number, str: string) => {\n getRenderer()?.drawString(x, y, str);\n },\n SCR_DrawCenterString: (y: number, str: string) => {\n getRenderer()?.drawCenterString(y, str);\n },\n SCR_MeasureFontString: (str: string) => {\n const stripped = str.replace(/\\^[0-9]/g, '');\n return stripped.length * 8;\n },\n SCR_FontLineHeight: () => 8,\n SCR_SetAltTypeface: (alt: boolean) => {\n // Stub\n },\n SCR_DrawBind: (x: number, y: number, command: string) => {\n // Look up binding and draw\n const key = state.getKeyBinding(command); // command is actually command name, we need key?\n // Wait, SCR_DrawBind usually takes a command and finds the key bound to it.\n // We only implemented `getKeyBinding` which takes a key.\n // We need `getBindingForKey` or `getKeysForCommand`.\n // For now, draw command name\n getRenderer()?.drawString(x, y, `[${command}]`);\n },\n\n // Localization\n Localize: (key: string) => key,\n\n // State queries\n CL_GetTextInput: () => '',\n CL_GetWarnAmmoCount: () => 5,\n CL_InAutoDemoLoop: () => state.inAutoDemo,\n\n // Prediction Trace\n PM_Trace: (start: Vec3, end: Vec3, mins: Vec3, maxs: Vec3): PmoveTraceResult => {\n return imports.engine.trace(start, end, mins, maxs);\n }\n };\n}\n","import { AssetManager, Pic, Renderer } from '@quake2ts/engine';\n\nlet crosshairPic: Pic | null = null;\nlet crosshairIndex = 0; // Default to ch1\nlet crosshairColor: [number, number, number, number] = [1, 1, 1, 1]; // Default white\nlet crosshairEnabled = true;\n\nconst CROSSHAIR_NAMES = ['ch1', 'ch2', 'ch3'];\nconst crosshairPics: (Pic | null)[] = [null, null, null];\n\nexport const Init_Crosshair = async (renderer: Renderer, assets: AssetManager) => {\n for (let i = 0; i < CROSSHAIR_NAMES.length; i++) {\n const name = CROSSHAIR_NAMES[i];\n try {\n const texture = await assets.loadTexture(`pics/${name}.pcx`);\n crosshairPics[i] = renderer.registerTexture(name, texture);\n } catch (e) {\n if (i === 0) {\n try {\n const texture = await assets.loadTexture('pics/crosshair.pcx');\n crosshairPics[i] = renderer.registerTexture('crosshair', texture);\n } catch (e2) {\n console.error('Failed to load crosshair image');\n }\n }\n }\n }\n\n crosshairPic = crosshairPics[0];\n}\n\nexport const Set_Crosshair = (index: number) => {\n // If index is 0, we treat it as disabled if we want to follow Q2 convention strictly,\n // but here index maps to CROSSHAIR_NAMES.\n // If we want a \"None\" option, we can check for that.\n\n // For now, let's keep index pointing to textures.\n // We can add a separate enable/disable function or make index -1 disable it.\n\n if (index === -1) {\n crosshairEnabled = false;\n return;\n }\n\n crosshairEnabled = true;\n if (index >= 0 && index < crosshairPics.length) {\n crosshairIndex = index;\n crosshairPic = crosshairPics[index];\n }\n};\n\nexport const Set_CrosshairColor = (r: number, g: number, b: number, a: number = 1) => {\n crosshairColor = [r, g, b, a];\n}\n\nexport const Cycle_Crosshair = () => {\n // Cycle includes a \"None\" state (represented by index -1 or just disabling)\n // 0 -> 1 -> 2 -> ... -> Disabled -> 0\n\n if (!crosshairEnabled) {\n crosshairEnabled = true;\n crosshairIndex = 0;\n } else {\n crosshairIndex++;\n if (crosshairIndex >= CROSSHAIR_NAMES.length) {\n crosshairEnabled = false;\n crosshairIndex = 0; // Reset for next cycle\n }\n }\n\n if (crosshairEnabled) {\n crosshairPic = crosshairPics[crosshairIndex];\n if (!crosshairPic) {\n let found = false;\n for (let i = 0; i < CROSSHAIR_NAMES.length; i++) {\n const idx = (crosshairIndex + i) % CROSSHAIR_NAMES.length;\n if (crosshairPics[idx]) {\n crosshairIndex = idx;\n crosshairPic = crosshairPics[idx];\n found = true;\n break;\n }\n }\n if (!found) crosshairPic = null;\n }\n } else {\n crosshairPic = null;\n }\n\n return crosshairEnabled ? crosshairIndex : -1;\n};\n\nexport const Draw_Crosshair = (renderer: Renderer, width: number, height: number) => {\n if (crosshairEnabled && crosshairPic) {\n const x = (width - crosshairPic.width) / 2;\n const y = (height - crosshairPic.height) / 2;\n renderer.drawPic(x, y, crosshairPic, crosshairColor);\n }\n};\n","import { AssetManager, Pic, Renderer } from '@quake2ts/engine';\nimport { PlayerClient, WEAPON_ITEMS, WeaponItem, PowerupId, KeyId } from '@quake2ts/game';\nimport { HUD_LAYOUT } from './layout.js';\nimport { Draw_Number } from './numbers.js';\n\nexport const iconPics = new Map<string, Pic>();\n\nconst ICON_NAMES = [\n // Weapons\n 'w_blaster', 'w_shotgun', 'w_sshotgun', 'w_machinegun', 'w_chaingun',\n 'w_glauncher', 'w_rlauncher', 'w_hyperblaster', 'w_railgun', 'w_bfg',\n 'w_grapple',\n // Ammo\n 'a_grenades', 'a_bullets', 'a_cells', 'a_rockets', 'a_shells', 'a_slugs',\n // Powerups\n 'p_quad', 'p_invulnerability', 'p_silencer', 'p_rebreather', 'p_envirosuit',\n 'p_adrenaline', 'p_megahealth',\n // Armor\n 'i_jacketarmor', 'i_combatarmor', 'i_bodyarmor', 'i_powerscreen', 'i_powershield',\n // Keys\n 'k_datacd', 'k_powercube', 'k_pyramid', 'k_dataspin', 'k_security', 'k_bluekey', 'k_redkey'\n];\n\nexport const Init_Icons = async (renderer: Renderer, assets: AssetManager) => {\n for (const name of ICON_NAMES) {\n try {\n const texture = await assets.loadTexture(`pics/${name}.pcx`);\n const pic = renderer.registerTexture(name, texture);\n iconPics.set(name, pic);\n } catch (e) {\n console.error(`Failed to load HUD image: pics/${name}.pcx`);\n }\n }\n};\n\nexport const Draw_Icons = (\n renderer: Renderer,\n client: PlayerClient,\n hudNumberPics: readonly Pic[],\n numberWidth: number,\n timeMs: number\n) => {\n if (!client) {\n return;\n }\n\n // Draw armor icon\n const armor = client.inventory.armor;\n if (armor && armor.armorCount > 0) {\n const iconName = `i_${armor.armorType}armor`;\n const icon = iconPics.get(iconName);\n if (icon) {\n renderer.drawPic(HUD_LAYOUT.ARMOR_X - 24, HUD_LAYOUT.ARMOR_Y - 2, icon);\n }\n }\n\n // Draw current weapon icon\n const currentWeapon = client.inventory.currentWeapon;\n if (currentWeapon) {\n const weaponDef = Object.values(WEAPON_ITEMS).find((w: WeaponItem) => w.weaponId === currentWeapon);\n if (weaponDef) {\n const iconName = `w_${weaponDef.id.substring(7)}`;\n const icon = iconPics.get(iconName);\n if (icon) {\n renderer.drawPic(HUD_LAYOUT.WEAPON_ICON_X, HUD_LAYOUT.WEAPON_ICON_Y, icon);\n }\n }\n }\n\n // Draw powerup icons\n let powerupX = HUD_LAYOUT.POWERUP_X;\n for (const [powerup, expiresAt] of client.inventory.powerups.entries()) {\n if (expiresAt && expiresAt > timeMs) {\n const iconName = `p_${powerup}`;\n const icon = iconPics.get(iconName);\n if (icon) {\n renderer.drawPic(powerupX, HUD_LAYOUT.POWERUP_Y, icon);\n\n // Draw remaining time\n const remainingSeconds = Math.ceil((expiresAt - timeMs) / 1000);\n Draw_Number(renderer, powerupX + icon.width + 2, HUD_LAYOUT.POWERUP_Y, remainingSeconds, hudNumberPics, numberWidth);\n\n powerupX -= (icon.width + numberWidth * remainingSeconds.toString().length + 8);\n }\n }\n }\n\n const keys = Array.from(client.inventory.keys).sort();\n let keyY = 300;\n\n for (const key of keys) {\n let iconName = '';\n switch (key) {\n case KeyId.Blue: iconName = 'k_bluekey'; break;\n case KeyId.Red: iconName = 'k_redkey'; break;\n case KeyId.Green: iconName = 'k_security'; break;\n case KeyId.Yellow: iconName = 'k_pyramid'; break;\n }\n\n if (iconName) {\n const icon = iconPics.get(iconName);\n if (icon) {\n renderer.drawPic(HUD_LAYOUT.WEAPON_ICON_X, keyY, icon);\n keyY += icon.height + 2;\n }\n }\n }\n};\n","import { AssetManager, Pic, Renderer } from '@quake2ts/engine';\nimport { PlayerState, angleVectors, dotVec3, Vec3 } from '@quake2ts/shared';\n\nconst damagePics = new Map<string, Pic>();\n\nconst DAMAGE_INDICATOR_NAMES = [\n 'd_left', 'd_right', 'd_up', 'd_down'\n];\n\nexport const Init_Damage = async (renderer: Renderer, assets: AssetManager) => {\n for (const name of DAMAGE_INDICATOR_NAMES) {\n try {\n const texture = await assets.loadTexture(`pics/${name}.pcx`);\n const pic = renderer.registerTexture(name, texture);\n damagePics.set(name, pic);\n } catch (e) {\n console.error(`Failed to load HUD image: pics/${name}.pcx`);\n }\n }\n};\n\nexport const Draw_Damage = (renderer: Renderer, ps: PlayerState) => {\n if (!ps.damageIndicators) {\n return;\n }\n\n const screenWidth = renderer.width;\n const screenHeight = renderer.height;\n\n const { forward, right, up } = angleVectors(ps.viewAngles);\n\n for (const indicator of ps.damageIndicators) {\n const { direction, strength } = indicator;\n\n const normalizedDirection = { ...direction };\n const len = Math.sqrt(normalizedDirection.x * normalizedDirection.x + normalizedDirection.y * normalizedDirection.y + normalizedDirection.z * normalizedDirection.z);\n if (len > 0) {\n normalizedDirection.x /= len;\n normalizedDirection.y /= len;\n normalizedDirection.z /= len;\n }\n\n const rightDot = dotVec3(normalizedDirection, right);\n const forwardDot = dotVec3(normalizedDirection, forward);\n\n const angle = Math.atan2(forwardDot, rightDot) * 180 / Math.PI;\n\n let pic: Pic | undefined;\n let x = 0;\n let y = 0;\n\n if (angle > -45 && angle <= 45) {\n pic = damagePics.get('d_right');\n x = screenWidth - (pic?.width || 0);\n y = (screenHeight - (pic?.height || 0)) / 2;\n } else if (angle > 45 && angle <= 135) {\n pic = damagePics.get('d_up');\n x = (screenWidth - (pic?.width || 0)) / 2;\n y = 0;\n } else if (angle > 135 || angle <= -135) {\n pic = damagePics.get('d_left');\n x = 0;\n y = (screenHeight - (pic?.height || 0)) / 2;\n } else {\n pic = damagePics.get('d_down');\n x = (screenWidth - (pic?.width || 0)) / 2;\n y = screenHeight - (pic?.height || 0);\n }\n \n if (pic) {\n renderer.drawPic(x, y, pic);\n }\n }\n};\n","import { FrameRenderStats, AssetManager } from '@quake2ts/engine';\nimport { Pic, Renderer } from '@quake2ts/engine';\nimport { PlayerClient } from '@quake2ts/game';\nimport { PlayerState } from '@quake2ts/shared';\nimport { Draw_Crosshair, Init_Crosshair } from './hud/crosshair.js';\nimport { Init_Icons } from './hud/icons.js';\nimport { Draw_Damage, Init_Damage } from './hud/damage.js';\nimport { Draw_Diagnostics } from './hud/diagnostics.js';\nimport { MessageSystem } from './hud/messages.js';\nimport { Draw_Blends } from './hud/blends.js';\nimport { Draw_Pickup } from './hud/pickup.js';\nimport { Draw_StatusBar } from './hud/statusbar.js';\nimport { getHudLayout } from './hud/layout.js';\n\nconst hudNumberPics: Pic[] = [];\nlet numberWidth = 0;\n\nexport const Init_Hud = async (renderer: Renderer, assets: AssetManager) => {\n for (let i = 0; i < 10; i++) {\n try {\n const texture = await assets.loadTexture(`pics/hud/num_${i}.pcx`);\n const pic = renderer.registerTexture(`hud_num_${i}`, texture);\n hudNumberPics.push(pic);\n } catch (e) {\n console.error(`Failed to load HUD image: pics/hud/num_${i}.pcx`, e);\n }\n }\n if (hudNumberPics.length > 0) {\n numberWidth = hudNumberPics[0].width;\n }\n\n await Init_Crosshair(renderer, assets);\n await Init_Icons(renderer, assets);\n await Init_Damage(renderer, assets);\n};\n\nexport const Draw_Hud = (\n renderer: Renderer,\n ps: PlayerState,\n client: PlayerClient,\n health: number,\n armor: number,\n ammo: number,\n stats: FrameRenderStats,\n messageSystem: MessageSystem,\n timeMs: number\n) => {\n renderer.begin2D();\n\n Draw_Blends(renderer, ps);\n\n if (ps.damageAlpha > 0) {\n renderer.drawfillRect(0, 0, renderer.width, renderer.height, [1, 0, 0, ps.damageAlpha]);\n }\n\n const layout = getHudLayout(renderer.width, renderer.height);\n\n Draw_StatusBar(renderer, client, health, armor, ammo, hudNumberPics, numberWidth, timeMs, layout);\n\n Draw_Pickup(renderer, ps);\n\n Draw_Damage(renderer, ps);\n Draw_Diagnostics(renderer, stats);\n\n messageSystem.drawCenterPrint(renderer, timeMs, layout);\n messageSystem.drawNotifications(renderer, timeMs);\n\n if (ps.centerPrint) {\n // Use layout for position?\n // Or keep hardcoded logic relative to layout.\n // Assuming renderer.height/2 is always center.\n renderer.drawCenterString(renderer.height / 2 - 20, ps.centerPrint);\n }\n\n if (ps.notify) {\n renderer.drawString(8, 8, ps.notify);\n }\n\n Draw_Crosshair(renderer, renderer.width, renderer.height);\n renderer.end2D();\n};\n","import { WeaponId, PowerupId, KeyId } from '@quake2ts/game';\nimport { AmmoType } from '@quake2ts/game';\nimport { ArmorType } from '@quake2ts/game';\n\nexport type ItemMappingType =\n | { type: 'weapon'; id: WeaponId }\n | { type: 'ammo'; id: AmmoType }\n | { type: 'armor'; id: ArmorType }\n | { type: 'powerup'; id: PowerupId }\n | { type: 'key'; id: KeyId }\n | { type: 'health'; id: string } // Health is usually handled specially or just ignored in inventory listing\n | { type: 'item'; id: string }\n | { type: 'null' };\n\n// Order based on item_id_t in g_local.h and itemlist in g_items.cpp\n// This MUST match the original Quake 2 item index order.\nexport const DEMO_ITEM_MAPPING: ItemMappingType[] = [\n { type: 'null' }, // IT_NULL = 0\n\n // Armor\n { type: 'armor', id: ArmorType.BODY }, // IT_ARMOR_BODY\n { type: 'armor', id: ArmorType.COMBAT }, // IT_ARMOR_COMBAT\n { type: 'armor', id: ArmorType.JACKET }, // IT_ARMOR_JACKET\n { type: 'armor', id: ArmorType.JACKET }, // IT_ARMOR_SHARD (Handled as jacket in base game logic usually, or separate counter)\n\n // Power Armor\n { type: 'item', id: 'item_power_screen' }, // IT_ITEM_POWER_SCREEN\n { type: 'item', id: 'item_power_shield' }, // IT_ITEM_POWER_SHIELD\n\n // Weapons\n { type: 'weapon', id: WeaponId.Grapple }, // IT_WEAPON_GRAPPLE\n { type: 'weapon', id: WeaponId.Blaster }, // IT_WEAPON_BLASTER\n { type: 'weapon', id: WeaponId.ChainFist }, // IT_WEAPON_CHAINFIST\n { type: 'weapon', id: WeaponId.Shotgun }, // IT_WEAPON_SHOTGUN\n { type: 'weapon', id: WeaponId.SuperShotgun },// IT_WEAPON_SSHOTGUN\n { type: 'weapon', id: WeaponId.Machinegun }, // IT_WEAPON_MACHINEGUN\n { type: 'weapon', id: WeaponId.EtfRifle }, // IT_WEAPON_ETF_RIFLE\n { type: 'weapon', id: WeaponId.Chaingun }, // IT_WEAPON_CHAINGUN\n\n // Ammo\n { type: 'ammo', id: AmmoType.Grenades }, // IT_AMMO_GRENADES\n { type: 'ammo', id: AmmoType.Trap }, // IT_AMMO_TRAP\n { type: 'ammo', id: AmmoType.Tesla }, // IT_AMMO_TESLA\n\n // Weapons cont.\n { type: 'weapon', id: WeaponId.GrenadeLauncher }, // IT_WEAPON_GLAUNCHER\n { type: 'weapon', id: WeaponId.ProxLauncher }, // IT_WEAPON_PROXLAUNCHER\n { type: 'weapon', id: WeaponId.RocketLauncher }, // IT_WEAPON_RLAUNCHER\n { type: 'weapon', id: WeaponId.HyperBlaster }, // IT_WEAPON_HYPERBLASTER\n { type: 'weapon', id: WeaponId.IonRipper }, // IT_WEAPON_IONRIPPER\n { type: 'weapon', id: WeaponId.PlasmaBeam }, // IT_WEAPON_PLASMABEAM\n { type: 'weapon', id: WeaponId.Railgun }, // IT_WEAPON_RAILGUN\n { type: 'weapon', id: WeaponId.Phalanx }, // IT_WEAPON_PHALANX\n { type: 'weapon', id: WeaponId.BFG10K }, // IT_WEAPON_BFG\n { type: 'weapon', id: WeaponId.Disruptor }, // IT_WEAPON_DISRUPTOR\n\n // Ammo\n { type: 'ammo', id: AmmoType.Shells }, // IT_AMMO_SHELLS\n { type: 'ammo', id: AmmoType.Bullets }, // IT_AMMO_BULLETS\n { type: 'ammo', id: AmmoType.Cells }, // IT_AMMO_CELLS\n { type: 'ammo', id: AmmoType.Rockets }, // IT_AMMO_ROCKETS\n { type: 'ammo', id: AmmoType.Slugs }, // IT_AMMO_SLUGS\n { type: 'ammo', id: AmmoType.MagSlugs }, // IT_AMMO_MAGSLUG\n { type: 'ammo', id: AmmoType.Flechettes }, // IT_AMMO_FLECHETTES\n { type: 'ammo', id: AmmoType.Prox }, // IT_AMMO_PROX\n { type: 'ammo', id: AmmoType.Nuke }, // IT_AMMO_NUKE\n { type: 'ammo', id: AmmoType.Rounds }, // IT_AMMO_ROUNDS\n\n // Items / Powerups\n { type: 'powerup', id: PowerupId.QuadDamage }, // IT_ITEM_QUAD\n { type: 'powerup', id: PowerupId.QuadFire }, // IT_ITEM_QUADFIRE\n { type: 'powerup', id: PowerupId.Invulnerability }, // IT_ITEM_INVULNERABILITY\n { type: 'powerup', id: PowerupId.Invisibility }, // IT_ITEM_INVISIBILITY\n { type: 'powerup', id: PowerupId.Silencer }, // IT_ITEM_SILENCER\n { type: 'powerup', id: PowerupId.Rebreather }, // IT_ITEM_REBREATHER\n { type: 'powerup', id: PowerupId.EnviroSuit }, // IT_ITEM_ENVIROSUIT\n { type: 'health', id: 'ancient_head' }, // IT_ITEM_ANCIENT_HEAD\n { type: 'health', id: 'legacy_head' }, // IT_ITEM_LEGACY_HEAD\n { type: 'health', id: 'adrenaline' }, // IT_ITEM_ADRENALINE\n { type: 'powerup', id: PowerupId.Bandolier }, // IT_ITEM_BANDOLIER\n { type: 'powerup', id: PowerupId.AmmoPack }, // IT_ITEM_PACK\n { type: 'powerup', id: PowerupId.IRGoggles }, // IT_ITEM_IR_GOGGLES\n { type: 'powerup', id: PowerupId.DoubleDamage }, // IT_ITEM_DOUBLE\n { type: 'powerup', id: PowerupId.SphereVengeance }, // IT_ITEM_SPHERE_VENGEANCE\n { type: 'powerup', id: PowerupId.SphereHunter }, // IT_ITEM_SPHERE_HUNTER\n { type: 'powerup', id: PowerupId.SphereDefender }, // IT_ITEM_SPHERE_DEFENDER\n { type: 'powerup', id: PowerupId.Doppelganger }, // IT_ITEM_DOPPELGANGER\n { type: 'powerup', id: PowerupId.TagToken }, // IT_ITEM_TAG_TOKEN\n\n // Keys\n { type: 'key', id: KeyId.DataCD }, // IT_KEY_DATA_CD\n { type: 'key', id: KeyId.PowerCube }, // IT_KEY_POWER_CUBE\n { type: 'key', id: KeyId.ExplosiveCharges }, // IT_KEY_EXPLOSIVE_CHARGES\n { type: 'key', id: KeyId.Yellow }, // IT_KEY_YELLOW\n { type: 'key', id: KeyId.PowerCore }, // IT_KEY_POWER_CORE\n { type: 'key', id: KeyId.Pyramid }, // IT_KEY_PYRAMID\n { type: 'key', id: KeyId.DataSpinner }, // IT_KEY_DATA_SPINNER\n { type: 'key', id: KeyId.Pass }, // IT_KEY_PASS\n { type: 'key', id: KeyId.Blue }, // IT_KEY_BLUE_KEY\n { type: 'key', id: KeyId.Red }, // IT_KEY_RED_KEY\n { type: 'key', id: KeyId.Green }, // IT_KEY_GREEN_KEY\n { type: 'key', id: KeyId.CommanderHead }, // IT_KEY_COMMANDER_HEAD\n { type: 'key', id: KeyId.Airstrike }, // IT_KEY_AIRSTRIKE\n { type: 'key', id: KeyId.NukeContainer }, // IT_KEY_NUKE_CONTAINER\n { type: 'key', id: KeyId.Nuke }, // IT_KEY_NUKE\n\n // Health\n { type: 'health', id: 'health_small' }, // IT_HEALTH_SMALL\n { type: 'health', id: 'health_medium' }, // IT_HEALTH_MEDIUM\n { type: 'health', id: 'health_large' }, // IT_HEALTH_LARGE\n { type: 'health', id: 'health_mega' }, // IT_HEALTH_MEGA\n\n // CTF\n { type: 'key', id: KeyId.RedFlag }, // IT_FLAG1\n { type: 'key', id: KeyId.BlueFlag }, // IT_FLAG2\n\n // Tech\n { type: 'powerup', id: PowerupId.TechResistance }, // IT_TECH_RESISTANCE\n { type: 'powerup', id: PowerupId.TechStrength }, // IT_TECH_STRENGTH\n { type: 'powerup', id: PowerupId.TechHaste }, // IT_TECH_HASTE\n { type: 'powerup', id: PowerupId.TechRegeneration }, // IT_TECH_REGENERATION\n\n { type: 'powerup', id: PowerupId.Flashlight }, // IT_ITEM_FLASHLIGHT\n { type: 'powerup', id: PowerupId.Compass }, // IT_ITEM_COMPASS\n];\n","\nexport interface LodModel {\n distance: number;\n model: string;\n}\n\nexport class LodRegistry {\n private registry = new Map<string, LodModel[]>();\n\n register(baseModel: string, lods: LodModel[]) {\n // Sort LODs by distance descending so we can find the first one that fits\n this.registry.set(baseModel, lods.sort((a, b) => b.distance - a.distance));\n }\n\n getLodModel(baseModel: string, distance: number): string | undefined {\n const lods = this.registry.get(baseModel);\n if (!lods) return undefined;\n\n // Find first LOD where distance > threshold\n // Actually, typically:\n // dist 0-500: base\n // dist 500-1000: lod1\n // dist 1000+: lod2\n\n // My registry has { distance: 500, model: lod1 }, { distance: 1000, model: lod2 }\n\n // If distance > 1000, use lod2.\n // If distance > 500, use lod1.\n\n for (const lod of lods) {\n if (distance > lod.distance) {\n return lod.model;\n }\n }\n\n return undefined;\n }\n}\n\nexport const lodRegistry = new LodRegistry();\n","\nimport { EntityState, RenderFx } from '@quake2ts/shared';\nimport { RenderableEntity, Renderer } from '@quake2ts/engine';\nimport { mat4, vec3 } from 'gl-matrix';\nimport { ClientConfigStrings } from './configStrings.js';\nimport { ClientImports } from './index.js';\nimport { lodRegistry } from './lod.js';\n\nfunction lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\nfunction lerpAngle(a: number, b: number, t: number): number {\n // Simple lerp for now, should ideally handle wrapping\n return lerp(a, b, t);\n}\n\n// Define a type that covers both Shared (camelCase) and Engine (lowercase) EntityState\n// to avoid strict type mismatches when called from Demo Handler (Engine types).\ntype AnyEntityState = {\n number: number;\n origin: { x: number, y: number, z: number };\n angles: { x: number, y: number, z: number };\n frame: number;\n alpha?: number;\n scale?: number;\n // Shared uses camelCase\n modelIndex?: number;\n skinNum?: number;\n renderfx?: number;\n // Engine uses lowercase\n modelindex?: number;\n skinnum?: number;\n};\n\nexport function buildRenderableEntities(\n latestEntities: AnyEntityState[],\n previousEntities: AnyEntityState[] | Map<number, AnyEntityState>,\n alpha: number,\n configStrings: ClientConfigStrings,\n imports: ClientImports,\n cameraPosition?: { x: number, y: number, z: number } // Optional camera position for LOD\n): RenderableEntity[] {\n const renderables: RenderableEntity[] = [];\n const assets = imports.engine.assets;\n if (!assets) return renderables;\n\n let prevMap: Map<number, AnyEntityState>;\n if (previousEntities instanceof Map) {\n prevMap = previousEntities;\n } else {\n prevMap = new Map(previousEntities.map(e => [e.number, e]));\n }\n\n const camVec = cameraPosition ? vec3.fromValues(cameraPosition.x, cameraPosition.y, cameraPosition.z) : null;\n\n for (const ent of latestEntities) {\n const prev = prevMap.get(ent.number) ?? ent;\n\n // Normalize property access\n const modelIndex = ent.modelIndex ?? ent.modelindex;\n const skinNum = ent.skinNum ?? ent.skinnum;\n\n if (modelIndex === undefined) continue;\n\n let modelName = configStrings.getModelName(modelIndex);\n if (!modelName) continue;\n\n // Interpolate origin and angles\n const origin = {\n x: lerp(prev.origin.x, ent.origin.x, alpha),\n y: lerp(prev.origin.y, ent.origin.y, alpha),\n z: lerp(prev.origin.z, ent.origin.z, alpha)\n };\n\n // Check LOD\n if (camVec) {\n const dist = vec3.distance(camVec, vec3.fromValues(origin.x, origin.y, origin.z));\n const lodModel = lodRegistry.getLodModel(modelName, dist);\n if (lodModel) {\n // If the LOD model is loaded, use it. Otherwise stick to base.\n // We don't want to trigger sync loads or fail here.\n // Assuming LOD models are preloaded or check existence.\n if (assets.getMd2Model(lodModel) || assets.getMd3Model(lodModel)) {\n modelName = lodModel;\n }\n }\n }\n\n const model = assets.getMd2Model(modelName) || assets.getMd3Model(modelName);\n if (!model) continue;\n\n const angles = {\n x: lerpAngle(prev.angles.x, ent.angles.x, alpha),\n y: lerpAngle(prev.angles.y, ent.angles.y, alpha),\n z: lerpAngle(prev.angles.z, ent.angles.z, alpha)\n };\n\n // Animation interpolation\n const frame = ent.frame;\n const prevFrame = prev.frame;\n\n // Scale interpolation\n const scaleA: number = (prev.scale !== undefined) ? prev.scale : 1.0;\n const scaleB: number = (ent.scale !== undefined) ? ent.scale : 1.0;\n const scale = lerp(scaleA, scaleB, alpha);\n\n // Alpha interpolation\n const getAlpha = (val: number | undefined) => (val === undefined || val === 0) ? 255 : val;\n const alphaA = getAlpha(prev.alpha);\n const alphaB = getAlpha(ent.alpha);\n const alphaVal = lerp(alphaA, alphaB, alpha);\n const normalizedAlpha = alphaVal / 255.0;\n\n const mat = mat4.create();\n mat4.translate(mat, mat, [origin.x, origin.y, origin.z]);\n mat4.rotateZ(mat, mat, angles.z * Math.PI / 180);\n mat4.rotateY(mat, mat, angles.y * Math.PI / 180);\n mat4.rotateX(mat, mat, angles.x * Math.PI / 180);\n mat4.scale(mat, mat, [scale, scale, scale]);\n\n const skinName = (skinNum !== undefined && skinNum > 0) ? configStrings.getImageName(skinNum) : undefined;\n\n // Handle RenderFx Tints\n let tint: [number, number, number, number] | undefined;\n const renderfx = ent.renderfx ?? 0;\n\n // Check for Freeze effect (ShellGreen | ShellBlue) explicitly first\n if ((renderfx & (RenderFx.ShellGreen | RenderFx.ShellBlue)) === (RenderFx.ShellGreen | RenderFx.ShellBlue)) {\n tint = [0, 1, 1, 1]; // Cyan (Freeze)\n } else if (renderfx & RenderFx.ShellRed) {\n tint = [1, 0, 0, 1]; // Red Shell\n } else if (renderfx & RenderFx.ShellGreen) {\n tint = [0, 1, 0, 1]; // Green Shell\n } else if (renderfx & RenderFx.ShellBlue) {\n tint = [0, 0, 1, 1]; // Blue Shell\n } else if (renderfx & RenderFx.ShellDouble) {\n tint = [1, 1, 0, 1]; // Double Damage\n } else if (renderfx & RenderFx.ShellHalfDam) {\n tint = [0.5, 0.5, 0.5, 1]; // Half Damage\n }\n\n if (model.header.magic === 844121161) { // IDP2 (MD2)\n renderables.push({\n type: 'md2',\n model: model as any, // Cast to Md2Model\n blend: {\n frame0: prevFrame,\n frame1: frame,\n lerp: alpha\n },\n transform: mat as Float32Array,\n skin: skinName,\n alpha: normalizedAlpha,\n tint: tint as readonly [number, number, number, number] | undefined\n });\n } else if (model.header.magic === 860898377) { // IDP3 (MD3)\n renderables.push({\n type: 'md3',\n model: model as any,\n blend: {\n frame0: prevFrame,\n frame1: frame,\n lerp: alpha\n },\n transform: mat as Float32Array,\n alpha: normalizedAlpha,\n tint: tint as readonly [number, number, number, number] | undefined\n // Lighting? Skins?\n });\n }\n }\n\n return renderables;\n}\n","import {\n NetworkMessageHandler,\n EntityState,\n FrameData,\n createEmptyEntityState,\n ProtocolPlayerState,\n U_ORIGIN1, U_ORIGIN2, U_ORIGIN3,\n U_ANGLE1, U_ANGLE2, U_ANGLE3,\n U_MODEL, U_MODEL2, U_MODEL3, U_MODEL4,\n U_FRAME8, U_FRAME16,\n U_SKIN8, U_SKIN16,\n U_EFFECTS8, U_EFFECTS16,\n U_RENDERFX8, U_RENDERFX16,\n U_OLDORIGIN,\n U_SOUND,\n U_EVENT,\n U_SOLID,\n U_REMOVE,\n // New Rerelease Flags\n U_ALPHA,\n U_SCALE,\n U_INSTANCE_BITS,\n U_LOOP_VOLUME,\n U_LOOP_ATTENUATION_HIGH,\n U_OWNER_HIGH,\n U_OLD_FRAME_HIGH,\n FogData,\n DamageIndicator,\n RenderableEntity,\n applyEntityDelta\n} from '@quake2ts/engine';\nimport {\n Vec3, ZERO_VEC3,\n G_GetPowerupStat, PowerupId,\n MZ_BLASTER, MZ_MACHINEGUN, MZ_SHOTGUN, MZ_CHAINGUN1, MZ_CHAINGUN2, MZ_CHAINGUN3,\n MZ_RAILGUN, MZ_ROCKET, MZ_GRENADE, MZ_LOGIN, MZ_LOGOUT, MZ_SSHOTGUN, MZ_BFG, MZ_HYPERBLASTER,\n angleVectors, dotVec3\n} from '@quake2ts/shared';\n// Import from cgame\nimport { PredictionState, defaultPredictionState, interpolatePredictionState, ViewEffects } from '@quake2ts/cgame';\nimport { PmFlag, PmType, WaterLevel } from '@quake2ts/shared';\nimport { PlayerInventory, WeaponId, KeyId, ArmorType } from '@quake2ts/game';\nimport { DEMO_ITEM_MAPPING } from './itemMapping.js';\nimport { ClientImports } from '../index.js';\nimport { buildRenderableEntities } from '../entities.js';\nimport { ClientConfigStrings } from '../configStrings.js';\n\n// Constants\nconst MAX_CONFIGSTRINGS = 32768; // Rerelease increased limits\n\nexport interface DemoHandlerCallbacks {\n onCenterPrint?: (msg: string) => void;\n onPrint?: (level: number, msg: string) => void;\n onConfigString?: (index: number, str: string) => void;\n onLevelRestart?: () => void;\n onWaitingForPlayers?: () => void;\n onMuzzleFlash?: (ent: number, weapon: number) => void;\n onMuzzleFlash2?: (ent: number, weapon: number) => void;\n onMuzzleFlash3?: (ent: number, weapon: number) => void;\n onTempEntity?: (type: number, pos: Vec3, pos2?: Vec3, dir?: Vec3, cnt?: number, color?: number, ent?: number, srcEnt?: number, destEnt?: number) => void;\n onFog?: (data: FogData) => void;\n onDamage?: (indicators: DamageIndicator[]) => void;\n onServerData?: (protocol: number, tickRate?: number) => void;\n onLocPrint?: (flags: number, base: string, args: string[]) => void;\n onLayout?: (layout: string) => void;\n}\n\nexport class ClientNetworkHandler implements NetworkMessageHandler {\n public configstrings: string[] = new Array(MAX_CONFIGSTRINGS).fill('');\n public entities: Map<number, EntityState> = new Map(); // Current frame entities\n public previousEntities: Map<number, EntityState> = new Map(); // Previous frame entities\n public baselines: Map<number, EntityState> = new Map();\n\n public previousFrame: FrameData | null = null;\n public latestFrame: FrameData | null = null;\n\n // Stats for HUD\n public stats: number[] = new Array(32).fill(0);\n public inventory: number[] = new Array(256).fill(0);\n\n private imports?: ClientImports;\n private callbacks?: DemoHandlerCallbacks;\n private view?: ViewEffects;\n private playerNum: number = 0;\n\n constructor(imports?: ClientImports, callbacks?: DemoHandlerCallbacks) {\n this.imports = imports;\n this.callbacks = callbacks;\n }\n\n setImports(imports: ClientImports) {\n this.imports = imports;\n }\n\n setCallbacks(callbacks: DemoHandlerCallbacks) {\n this.callbacks = callbacks;\n }\n\n setView(view: ViewEffects) {\n this.view = view;\n }\n\n onServerData(protocol: number, serverCount: number, attractLoop: number, gameDir: string, playerNum: number, levelName: string, tickRate?: number, demoType?: number): void {\n console.log(`Demo: Server Data - Protocol: ${protocol}, Level: ${levelName}, Tick: ${tickRate ?? 10}`);\n // Reset state on new server connection\n this.configstrings.fill('');\n this.entities.clear();\n this.previousEntities.clear();\n this.baselines.clear();\n this.latestFrame = null;\n this.previousFrame = null;\n this.playerNum = playerNum;\n\n if (this.callbacks?.onServerData) {\n this.callbacks.onServerData(protocol, tickRate);\n }\n }\n\n onConfigString(index: number, str: string): void {\n this.configstrings[index] = str;\n if (this.callbacks?.onConfigString) {\n this.callbacks.onConfigString(index, str);\n }\n }\n\n onSpawnBaseline(entity: EntityState): void {\n // Deep copy to ensure baseline is preserved\n this.baselines.set(entity.number, structuredClone(entity));\n }\n\n onFrame(frame: FrameData): void {\n if (this.latestFrame) {\n this.previousFrame = this.latestFrame;\n // Store previous entities before updating\n this.previousEntities = this.entities;\n }\n this.latestFrame = frame;\n this.stats = [...frame.playerState.stats];\n\n const packetEntities = frame.packetEntities;\n const newEntities = new Map<number, EntityState>();\n\n // Fix: If delta frame, copy previous entities as starting state.\n if (packetEntities.delta) {\n for (const [num, ent] of this.entities) {\n newEntities.set(num, structuredClone(ent));\n }\n } else {\n // If not delta, we start fresh (empty newEntities)\n }\n\n for (const partial of packetEntities.entities) {\n if (partial.bits & U_REMOVE) {\n // Explicit removal: remove from newEntities if present\n newEntities.delete(partial.number);\n continue;\n }\n\n const number = partial.number;\n let source: EntityState | undefined;\n\n // Determine source for delta compression\n if (packetEntities.delta && this.entities.has(number)) {\n source = this.entities.get(number);\n } else if (this.baselines.has(number)) {\n source = this.baselines.get(number);\n } else {\n source = createEmptyEntityState();\n }\n\n // Apply delta\n const final = structuredClone(source!);\n applyEntityDelta(final, partial);\n newEntities.set(number, final);\n }\n\n this.entities = newEntities;\n }\n\n onCenterPrint(msg: string): void {\n if (this.callbacks?.onCenterPrint) {\n this.callbacks.onCenterPrint(msg);\n } else {\n console.log(`[Center]: ${msg}`);\n }\n }\n\n onStuffText(msg: string): void {\n if (this.imports?.engine.cmd) {\n this.imports.engine.cmd.executeText(msg);\n }\n }\n\n onPrint(level: number, msg: string): void {\n if (this.callbacks?.onPrint) {\n this.callbacks.onPrint(level, msg);\n } else {\n console.log(`[Print ${level}]: ${msg}`);\n }\n }\n\n onSound(flags: number, soundNum: number, volume?: number, attenuation?: number, offset?: number, ent?: number, pos?: Vec3): void {\n if (!this.imports?.engine.audio) return;\n\n // Ensure volume/attenuation defaults if missing\n const vol = volume ?? 1.0;\n const attn = attenuation ?? 1.0;\n const timeofs = offset ?? 0;\n\n if (ent && ent > 0) {\n this.imports.engine.audio.sound(ent, 0, soundNum, vol, attn, timeofs);\n } else if (pos) {\n this.imports.engine.audio.positioned_sound(pos, soundNum, vol, attn);\n } else {\n // Global sound?\n // this.imports.engine.audio.play_channel(...);\n }\n }\n\n onTempEntity(type: number, pos: Vec3, pos2?: Vec3, dir?: Vec3, cnt?: number, color?: number, ent?: number, srcEnt?: number, destEnt?: number): void {\n if (this.callbacks?.onTempEntity) {\n this.callbacks.onTempEntity(type, pos, pos2, dir, cnt, color, ent, srcEnt, destEnt);\n }\n }\n\n onLayout(layout: string): void {\n if (this.callbacks?.onLayout) {\n this.callbacks.onLayout(layout);\n }\n }\n\n onInventory(inventory: number[]): void {\n this.inventory = [...inventory];\n }\n\n onMuzzleFlash(ent: number, weapon: number): void {\n if (this.callbacks?.onMuzzleFlash) {\n this.callbacks.onMuzzleFlash(ent, weapon);\n }\n }\n\n onMuzzleFlash2(ent: number, weapon: number): void {\n if (this.callbacks?.onMuzzleFlash2) {\n this.callbacks.onMuzzleFlash2(ent, weapon);\n }\n }\n\n onMuzzleFlash3(ent: number, weapon: number): void {\n // EV_MUZZLEFLASH broadcast includes entity number.\n // We only want to add view kick if this is the local player.\n // ent is 1-based index (usually) or raw number.\n // playerNum is 0-based.\n // In Q2 server: player entities are at index `playernum + 1`.\n const isLocalPlayer = ent === (this.playerNum + 1);\n\n if (isLocalPlayer && this.view) {\n let pitch = 0;\n let yaw = 0;\n let roll = 0; // Not used often\n let kickOrigin: Vec3 = ZERO_VEC3;\n\n // Check Quad Damage scaling\n const quad = G_GetPowerupStat(this.stats, PowerupId.QuadDamage);\n const scale = quad ? 4 : 1;\n\n switch (weapon) {\n case MZ_SHOTGUN:\n pitch = -2;\n kickOrigin = { x: -2, y: 0, z: 0 };\n break;\n case MZ_SSHOTGUN:\n pitch = -4;\n kickOrigin = { x: -4, y: 0, z: 0 };\n break;\n case MZ_MACHINEGUN:\n pitch = -1;\n yaw = (Math.random() - 0.5); // crandom\n break;\n case MZ_CHAINGUN1:\n case MZ_CHAINGUN2:\n case MZ_CHAINGUN3:\n pitch = -0.5;\n yaw = (Math.random() - 0.5);\n break;\n case MZ_RAILGUN:\n pitch = -3;\n kickOrigin = { x: -3, y: 0, z: 0 };\n break;\n case MZ_ROCKET:\n case MZ_GRENADE:\n pitch = -2;\n kickOrigin = { x: -2, y: 0, z: 0 };\n break;\n case MZ_BFG:\n pitch = -5;\n kickOrigin = { x: -2, y: 0, z: 0 };\n break;\n case MZ_HYPERBLASTER:\n case MZ_BLASTER:\n pitch = -0.5;\n break;\n }\n\n if (pitch !== 0 || yaw !== 0 || roll !== 0) {\n this.view.addKick({\n pitch: pitch * scale,\n roll: roll * scale,\n durationMs: 200,\n origin: kickOrigin // Should origin be scaled? Q2 source P_AddWeaponKick only scales angles.\n // But we have origin kick logic now. Let's assume origin kick is physical recoil and maybe doesn't scale with quad (magic damage)?\n // P_AddWeaponKick only scales kick_angles.\n });\n }\n }\n\n if (this.callbacks?.onMuzzleFlash3) {\n this.callbacks.onMuzzleFlash3(ent, weapon);\n }\n }\n\n onFog(data: FogData): void {\n if (this.callbacks?.onFog) {\n this.callbacks.onFog(data);\n }\n }\n\n onDamage(indicators: DamageIndicator[]): void {\n if (this.view) {\n // Apply damage view kick based on Quake 2's CL_ParseDamage and V_AddKick logic.\n // CL_ParseDamage calculates a directional kick to viewangles (not implemented here to avoid permanent angle modification),\n // while V_AddKick adds a temporary pitch kick (pain flinch).\n\n for (const ind of indicators) {\n // Use damage value directly from indicator\n const estimatedDamage = ind.damage;\n\n // Determine directional roll\n // Damage direction (ind.dir) is likely the vector of the attack (or from attacker to player?)\n // Assuming it represents the attack vector (velocity), or direction TO attacker.\n // Let's assume direction TO attacker (or FROM attacker to player?)\n // Quake 2 CL_ParseDamage uses (origin - cl.simorg) which is vector TO attacker (if origin is attacker pos).\n // Actually in Q2: VectorSubtract (origin, cl.simorg, v); where 'origin' is read from message.\n // MSG_ReadCoord(msg). The server sends damage origin.\n // Rerelease protocol sends a 'dir' (byte).\n // If it follows Q2 logic, 'dir' points from Player to Attacker (or Attacker to Player).\n // Let's assume it points to where the damage came FROM.\n\n // We need player's right vector.\n let roll = 0;\n if (this.latestFrame && this.latestFrame.playerState) {\n const ps = this.latestFrame.playerState;\n // Cast MutableVec3 to Vec3 for angleVectors\n const angles: Vec3 = { x: ps.viewangles.x, y: ps.viewangles.y, z: ps.viewangles.z } as any;\n const vectors = angleVectors(angles);\n // Q2: cl.kick_angles[2] = damage * 0.5 * DotProduct(v, right);\n // where v is normalized direction to damage source.\n const side = dotVec3(ind.dir, vectors.right);\n roll = estimatedDamage * 0.5 * side;\n }\n\n // Apply pitch kick to simulate pain flinch.\n // Negative pitch corresponds to looking up (\"head snaps back\").\n this.view.addKick({\n pitch: -estimatedDamage * 0.5,\n roll: roll,\n durationMs: 200,\n });\n }\n }\n\n if (this.callbacks?.onDamage) {\n this.callbacks.onDamage(indicators);\n }\n }\n\n onLocPrint(flags: number, base: string, args: string[]): void {\n if (this.callbacks?.onLocPrint) {\n this.callbacks.onLocPrint(flags, base, args);\n }\n }\n\n // New Rerelease Handlers\n onLevelRestart(): void {\n if (this.callbacks?.onLevelRestart) this.callbacks.onLevelRestart();\n }\n\n onWaitingForPlayers(count: number): void {\n if (this.callbacks?.onWaitingForPlayers) this.callbacks.onWaitingForPlayers();\n }\n\n onDisconnect(): void {\n console.log(\"Demo disconnected\");\n }\n\n onReconnect(): void {\n console.log(\"Demo reconnect\");\n }\n\n onDownload(size: number, percent: number, data?: Uint8Array): void {\n }\n\n private convertFrameToPredictionState(frame: FrameData): PredictionState {\n const ps = frame.playerState;\n\n const inventory: PlayerInventory = {\n ammo: {\n caps: [],\n counts: []\n },\n ownedWeapons: new Set(),\n armor: null,\n powerups: new Map(),\n keys: new Set(),\n items: new Set(),\n };\n\n // Map inventory array to PlayerInventory\n for (let i = 0; i < this.inventory.length; i++) {\n const count = this.inventory[i];\n if (count <= 0) continue;\n\n if (i >= DEMO_ITEM_MAPPING.length) break;\n\n const mapping = DEMO_ITEM_MAPPING[i];\n\n switch (mapping.type) {\n case 'weapon':\n inventory.ownedWeapons.add(mapping.id);\n break;\n case 'ammo':\n if (!inventory.ammo.counts[mapping.id]) {\n inventory.ammo.counts[mapping.id] = 0;\n }\n inventory.ammo.counts[mapping.id] = count;\n break;\n case 'armor':\n inventory.armor = {\n armorType: mapping.id,\n armorCount: count\n };\n break;\n case 'powerup':\n inventory.powerups.set(mapping.id, count);\n break;\n case 'key':\n inventory.keys.add(mapping.id);\n break;\n case 'health':\n // Ignore, health is in stats\n break;\n case 'item':\n // Map generic items (like power armor)\n inventory.items.add(mapping.id);\n break;\n }\n }\n\n const origin: Vec3 = { ...ps.origin };\n const velocity: Vec3 = { ...ps.velocity };\n const viewAngles: Vec3 = { ...ps.viewangles };\n const deltaAngles: Vec3 = { ...ps.delta_angles };\n\n return {\n origin,\n velocity,\n viewAngles,\n pmFlags: ps.pm_flags,\n pmType: ps.pm_type,\n waterLevel: WaterLevel.None,\n watertype: ps.watertype,\n gravity: ps.gravity,\n deltaAngles,\n client: {\n inventory,\n weaponStates: {\n states: new Map()\n },\n buttons: 0,\n pm_type: ps.pm_type,\n pm_time: ps.pm_time,\n pm_flags: ps.pm_flags,\n gun_frame: ps.gun_frame,\n rdflags: ps.rdflags,\n fov: ps.fov,\n pers: {\n connected: true,\n inventory: [],\n health: 100,\n max_health: 100,\n savedFlags: 0,\n selected_item: 0\n }\n },\n health: ps.stats[1], // STAT_HEALTH\n armor: ps.stats[4], // STAT_ARMOR\n ammo: ps.stats[2], // STAT_AMMO\n blend: [0, 0, 0, 0], // No blend from demo frame currently (need to parse svc_playerinfo more fully)\n damageAlpha: 0, // Need to extract from renderfx/flash\n damageIndicators: [],\n\n // Stubs\n stats: [...ps.stats],\n kick_angles: ZERO_VEC3,\n kick_origin: ZERO_VEC3,\n gunoffset: ZERO_VEC3,\n gunangles: ZERO_VEC3,\n gunindex: 0,\n onGround: false, // Infer from pmFlags?\n mins: { x: -16, y: -16, z: -24 },\n maxs: { x: 16, y: 16, z: 32 },\n\n // New fields\n pm_time: ps.pm_time,\n pm_type: ps.pm_type,\n pm_flags: ps.pm_flags,\n gun_frame: ps.gun_frame,\n rdflags: ps.rdflags,\n fov: ps.fov,\n renderfx: 0\n };\n }\n\n public getPredictionState(timeMs?: number): PredictionState {\n if (!this.latestFrame) return defaultPredictionState();\n\n const latestState = this.convertFrameToPredictionState(this.latestFrame);\n\n // If we have a previous frame and a timeMs, try to interpolate\n if (this.previousFrame && timeMs !== undefined) {\n // Note: This assumes 10Hz (100ms) server frames as per standard Quake 2\n // Ideally we'd have exact server times on frames\n const latestServerTime = this.latestFrame.serverFrame * 100; // ms\n const previousServerTime = this.previousFrame.serverFrame * 100; // ms\n\n // Check if timeMs is alpha (0-1) or absolute time\n // We assume absolute for now if it's large, but logic above used absolute.\n // If caller passes alpha, we can handle that.\n if (timeMs <= 1.0) {\n const previousState = this.convertFrameToPredictionState(this.previousFrame);\n return interpolatePredictionState(previousState, latestState, Math.max(0, Math.min(1, timeMs)));\n } else if (timeMs >= previousServerTime && timeMs <= latestServerTime) {\n const alpha = (timeMs - previousServerTime) / (latestServerTime - previousServerTime);\n const previousState = this.convertFrameToPredictionState(this.previousFrame);\n return interpolatePredictionState(previousState, latestState, Math.max(0, Math.min(1, alpha)));\n }\n }\n\n return latestState;\n }\n\n public getRenderableEntities(alpha: number, configStrings: ClientConfigStrings): RenderableEntity[] {\n if (!this.latestFrame) return [];\n if (!this.imports) return [];\n\n const latest = Array.from(this.entities.values());\n const previous = this.previousEntities.size > 0 ? this.previousEntities : latest;\n\n return buildRenderableEntities(\n latest,\n previous,\n alpha,\n configStrings,\n this.imports\n );\n }\n\n public getDemoCamera(alpha: number): { origin: Vec3, angles: Vec3, fov: number } {\n // Use getPredictionState to interpolate camera properties\n const ps = this.getPredictionState(alpha);\n return {\n origin: ps.origin,\n angles: ps.viewAngles,\n fov: ps.fov ?? 90\n };\n }\n\n public get latestServerFrame(): number {\n return this.latestFrame?.serverFrame ?? 0;\n }\n}\n","import {\n ConfigStringIndex,\n MAX_MODELS,\n MAX_SOUNDS,\n MAX_IMAGES,\n} from '@quake2ts/shared';\n\n/**\n * Handles parsing and storage of config strings on the client side.\n * Maintains mappings of indices to resource names (models, sounds, images).\n */\nexport class ClientConfigStrings {\n private readonly strings: Map<number, string> = new Map();\n private readonly models: string[] = [];\n private readonly sounds: string[] = [];\n private readonly images: string[] = [];\n\n constructor() {\n // Initialize arrays with empty strings or nulls as needed\n // In JS/TS, sparse arrays or checking for undefined is common,\n // but C array emulation suggests fixed sizing or explicit bounds.\n }\n\n /**\n * Called when a config string is received from the server.\n */\n public set(index: number, value: string): void {\n this.strings.set(index, value);\n\n if (index >= ConfigStringIndex.Models && index < ConfigStringIndex.Models + MAX_MODELS) {\n const modelIndex = index - ConfigStringIndex.Models;\n this.models[modelIndex] = value;\n } else if (index >= ConfigStringIndex.Sounds && index < ConfigStringIndex.Sounds + MAX_SOUNDS) {\n const soundIndex = index - ConfigStringIndex.Sounds;\n this.sounds[soundIndex] = value;\n } else if (index >= ConfigStringIndex.Images && index < ConfigStringIndex.Images + MAX_IMAGES) {\n const imageIndex = index - ConfigStringIndex.Images;\n this.images[imageIndex] = value;\n }\n }\n\n public get(index: number): string | undefined {\n return this.strings.get(index);\n }\n\n public getModelName(index: number): string | undefined {\n return this.models[index];\n }\n\n public getSoundName(index: number): string | undefined {\n return this.sounds[index];\n }\n\n public getImageName(index: number): string | undefined {\n return this.images[index];\n }\n\n public getPlayerName(playernum: number): string | undefined {\n const csIndex = ConfigStringIndex.Players + playernum;\n const info = this.strings.get(csIndex);\n if (!info) return undefined;\n // Player info is a userinfo string: \\name\\Player\\skin\\male/grunt...\n // We need to parse it to get the name.\n // Simple parse: extract value for 'name' key.\n const parts = info.split('\\\\');\n for (let i = 1; i < parts.length; i += 2) {\n if (parts[i] === 'name') {\n return parts[i + 1];\n }\n }\n return undefined;\n }\n\n public clear(): void {\n this.strings.clear();\n this.models.length = 0;\n this.sounds.length = 0;\n this.images.length = 0;\n }\n}\n","import { Menu, MenuItem } from './types.js';\nimport { MenuSystem } from './system.js';\nimport { SaveLoadMenuFactory } from './saveLoad.js';\nimport { OptionsMenuFactory } from './options.js';\nimport { MapsMenuFactory } from './maps.js';\nimport { MultiplayerMenuFactory } from './multiplayer.js';\nimport { DemoMenuFactory } from './demo.js';\n\nexport interface MainMenuOptions {\n onNewGame: () => void;\n onQuit: () => void;\n optionsFactory: OptionsMenuFactory;\n mapsFactory: MapsMenuFactory;\n onSetDifficulty?: (skill: number) => void;\n showSaveOption?: boolean;\n multiplayerFactory?: MultiplayerMenuFactory;\n demoFactory?: DemoMenuFactory;\n}\n\nexport class MainMenuFactory {\n constructor(\n private readonly menuSystem: MenuSystem,\n private readonly saveLoadFactory: SaveLoadMenuFactory,\n private readonly options: MainMenuOptions\n ) {}\n\n createMainMenu(): Menu {\n const items: MenuItem[] = [\n {\n label: 'New Game',\n action: () => {\n this.menuSystem.pushMenu(this.createDifficultyMenu());\n },\n },\n {\n label: 'Multiplayer',\n action: () => {\n if (this.options.multiplayerFactory) {\n this.menuSystem.pushMenu(this.options.multiplayerFactory.createMultiplayerMenu());\n } else {\n console.warn('Multiplayer factory not configured');\n }\n }\n },\n {\n label: 'Demos',\n action: () => {\n if (this.options.demoFactory) {\n this.menuSystem.pushMenu(this.options.demoFactory.createDemoMenu());\n } else {\n console.warn('Demo factory not configured');\n }\n }\n },\n {\n label: 'Load Game',\n action: () => {\n void this.saveLoadFactory.createLoadMenu().then((menu) => {\n this.menuSystem.pushMenu(menu);\n });\n },\n },\n ];\n\n if (this.options.showSaveOption !== false) {\n items.push({\n label: 'Save Game',\n action: () => {\n void this.saveLoadFactory.createSaveMenu().then((menu) => {\n this.menuSystem.pushMenu(menu);\n });\n },\n });\n }\n\n items.push(\n {\n label: 'Options',\n action: () => {\n this.menuSystem.pushMenu(this.options.optionsFactory.createOptionsMenu());\n }\n },\n {\n label: 'Quit',\n action: () => {\n this.options.onQuit();\n },\n },\n );\n\n return {\n title: 'Main Menu',\n items,\n };\n }\n\n private createDifficultyMenu(): Menu {\n return {\n title: 'Select Difficulty',\n items: [\n {\n label: 'Easy',\n action: () => this.startNewGame(0)\n },\n {\n label: 'Medium',\n action: () => this.startNewGame(1)\n },\n {\n label: 'Hard',\n action: () => this.startNewGame(2)\n },\n {\n label: 'Map Select...',\n action: () => {\n this.menuSystem.pushMenu(this.options.mapsFactory.createMapsMenu());\n }\n },\n {\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n }\n ]\n };\n }\n\n private startNewGame(difficulty: number) {\n if (this.options.onSetDifficulty) {\n this.options.onSetDifficulty(difficulty);\n }\n this.options.onNewGame();\n }\n}\n","import { Menu, MenuItem } from './types.js';\nimport { MenuSystem } from './system.js';\nimport { SaveStorage, SaveSlotMetadata, GameSaveFile } from '@quake2ts/game';\n\nexport class SaveLoadMenuFactory {\n constructor(\n private readonly menuSystem: MenuSystem,\n private readonly storage: SaveStorage,\n private readonly onSave: (name: string) => Promise<void>,\n private readonly onLoad: (slotId: string) => Promise<void>,\n private readonly onDelete: (slotId: string) => Promise<void>\n ) {}\n\n async createSaveMenu(): Promise<Menu> {\n const saves = await this.storage.list();\n const items: MenuItem[] = [];\n\n // New Save Item\n items.push({\n label: 'New Save...',\n action: () => {\n this.menuSystem.pushMenu(this.createNewSaveInputMenu());\n },\n });\n\n // Overwrite existing saves\n saves.forEach((save) => {\n items.push({\n label: `${save.name} - ${save.map} (${formatTime(save.playtimeSeconds)})`,\n action: () => {\n // Confirm overwrite?\n this.menuSystem.pushMenu(this.createConfirmOverwriteMenu(save));\n },\n });\n });\n\n items.push({\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n });\n\n return {\n title: 'Save Game',\n items,\n };\n }\n\n async createLoadMenu(): Promise<Menu> {\n const saves = await this.storage.list();\n const items: MenuItem[] = [];\n\n saves.forEach((save) => {\n items.push({\n label: `${save.name} - ${save.map} (${formatTime(save.playtimeSeconds)})`,\n action: () => {\n // Open submenu for Load / Delete\n this.menuSystem.pushMenu(this.createLoadActionMenu(save));\n },\n });\n });\n\n if (saves.length === 0) {\n items.push({\n label: 'No saves found',\n action: () => {}\n });\n }\n\n items.push({\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n });\n\n return {\n title: 'Load Game',\n items,\n };\n }\n\n private createLoadActionMenu(save: SaveSlotMetadata): Menu {\n return {\n title: `Slot: ${save.name}`,\n items: [\n {\n label: 'Load Game',\n action: () => {\n void this.onLoad(save.id).then(() => {\n this.menuSystem.closeAll();\n });\n }\n },\n {\n label: 'Delete Save',\n action: () => {\n this.menuSystem.pushMenu(this.createConfirmDeleteMenu(save));\n }\n },\n {\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n }\n ]\n };\n }\n\n private createConfirmDeleteMenu(save: SaveSlotMetadata): Menu {\n return {\n title: `Delete ${save.name}?`,\n items: [\n {\n label: 'Yes, Delete',\n action: () => {\n void this.onDelete(save.id).then(() => {\n this.menuSystem.popMenu(); // Pop confirm\n this.menuSystem.popMenu(); // Pop action menu\n // We need to refresh the load menu.\n // The simplest way is to pop the load menu and push a new one,\n // or if the parent menu (Load Game) was dynamic, it would update.\n // But here createLoadMenu returns a static structure.\n // Ideally, we'd go back and 'refresh'.\n // For now, let's close all or navigate back to root?\n // Or we can assume the caller will rebuild.\n\n // Let's just pop back to where we were (Load Menu),\n // but since it's stale, we might want to re-create it.\n // A better approach in this MenuSystem might be to have dynamic providers.\n\n // Hack: Close all for now to be safe, or just accept the menu is stale until re-opened.\n // Re-opening \"Load Game\" from main menu/pause menu will show updated list.\n this.menuSystem.popMenu(); // Pop Load Menu to go back to previous menu\n });\n }\n },\n {\n label: 'No, Cancel',\n action: () => this.menuSystem.popMenu()\n }\n ]\n };\n }\n\n private createNewSaveInputMenu(): Menu {\n // Use a local state object to hold the value\n const state = {\n name: `Save ${new Date().toLocaleString()}`\n };\n\n return {\n title: 'Enter Save Name',\n items: [\n {\n label: 'Name',\n type: 'input',\n getValue: () => state.name,\n onUpdate: (val) => { state.name = val; }\n },\n {\n label: 'Save',\n action: () => {\n void this.onSave(state.name).then(() => {\n this.menuSystem.closeAll();\n });\n }\n },\n {\n label: 'Cancel',\n action: () => this.menuSystem.popMenu()\n }\n ]\n }\n }\n\n private createConfirmOverwriteMenu(save: SaveSlotMetadata): Menu {\n return {\n title: `Overwrite ${save.name}?`,\n items: [\n {\n label: 'Yes, Overwrite',\n action: () => {\n void this.onSave(save.name).then(() => { // Reuse name logic, or pass ID if update is supported\n this.menuSystem.closeAll();\n });\n }\n },\n {\n label: 'No, Cancel',\n action: () => this.menuSystem.popMenu()\n }\n ]\n }\n }\n}\n\nfunction formatTime(seconds: number): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = Math.floor(seconds % 60);\n return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n}\n","import { Menu, MenuItem, MenuState } from './types.js';\n\nexport class MenuSystem {\n private activeMenu: Menu | null = null;\n private selectedIndex = 0;\n private menuStack: Menu[] = [];\n public onStateChange?: (active: boolean) => void;\n\n constructor() {}\n\n pushMenu(menu: Menu): void {\n const wasActive = this.isActive();\n if (this.activeMenu) {\n this.menuStack.push(this.activeMenu);\n // Link parent for back navigation if not already linked\n if (!menu.parent) {\n (menu as any).parent = this.activeMenu;\n }\n }\n this.activeMenu = menu;\n this.selectedIndex = 0;\n if (!wasActive && this.onStateChange) {\n this.onStateChange(true);\n }\n }\n\n popMenu(): void {\n const wasActive = this.isActive();\n if (this.menuStack.length > 0) {\n this.activeMenu = this.menuStack.pop()!;\n this.selectedIndex = 0;\n } else {\n this.activeMenu = null;\n }\n\n const isActive = this.isActive();\n if (wasActive !== isActive && this.onStateChange) {\n this.onStateChange(isActive);\n }\n }\n\n closeAll(): void {\n const wasActive = this.isActive();\n this.activeMenu = null;\n this.menuStack = [];\n this.selectedIndex = 0;\n\n if (wasActive && this.onStateChange) {\n this.onStateChange(false);\n }\n }\n\n handleInput(action: 'up' | 'down' | 'left' | 'right' | 'select' | 'back' | 'char', char?: string): boolean {\n if (!this.activeMenu) {\n return false;\n }\n\n const currentItem = this.activeMenu.items[this.selectedIndex];\n\n if (action === 'up') {\n this.selectedIndex = (this.selectedIndex - 1 + this.activeMenu.items.length) % this.activeMenu.items.length;\n return true;\n }\n\n if (action === 'down') {\n this.selectedIndex = (this.selectedIndex + 1) % this.activeMenu.items.length;\n return true;\n }\n\n if (action === 'select') {\n if (currentItem.action) {\n currentItem.action();\n }\n return true;\n }\n\n if (action === 'back') {\n this.popMenu();\n return true;\n }\n\n // Pass other inputs to item if it supports input\n if (currentItem.type === 'input' && currentItem.onUpdate && currentItem.getValue) {\n const currentValue = currentItem.getValue();\n if (action === 'char' && char) {\n const newValue = (currentValue || '') + char;\n currentItem.onUpdate(newValue);\n } else if (action === 'left') {\n // Backspace simulation for simplicity\n const str = String(currentValue || '');\n if (str.length > 0) {\n currentItem.onUpdate(str.slice(0, -1));\n }\n }\n }\n\n return true;\n }\n\n isActive(): boolean {\n return this.activeMenu !== null;\n }\n\n getState(): MenuState {\n return {\n activeMenu: this.activeMenu,\n selectedIndex: this.selectedIndex,\n };\n }\n}\n","import { Menu, MenuItem } from './types.js';\nimport { MenuSystem } from './system.js';\nimport { EngineHost } from '@quake2ts/engine';\n\nexport class OptionsMenuFactory {\n constructor(\n private readonly menuSystem: MenuSystem,\n private readonly host: EngineHost\n ) {}\n\n createOptionsMenu(): Menu {\n return {\n title: 'Options',\n items: [\n {\n label: 'Video Options',\n action: () => {\n this.menuSystem.pushMenu(this.createVideoMenu());\n }\n },\n {\n label: 'Audio Options',\n action: () => {\n this.menuSystem.pushMenu(this.createAudioMenu());\n }\n },\n {\n label: 'Controls',\n action: () => {\n this.menuSystem.pushMenu(this.createControlsMenu());\n }\n },\n {\n label: 'Gameplay',\n action: () => {\n this.menuSystem.pushMenu(this.createGameplayMenu());\n }\n },\n {\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n }\n ]\n };\n }\n\n private createVideoMenu(): Menu {\n const cvars = this.host.cvars;\n return {\n title: 'Video Options',\n items: [\n {\n label: 'Field of View',\n type: 'input',\n getValue: () => cvars?.get('fov')?.string ?? '90',\n onUpdate: (val) => {\n const f = parseFloat(val);\n if (!isNaN(f)) {\n cvars?.setValue('fov', val);\n }\n }\n },\n {\n label: 'Fullscreen',\n type: 'toggle',\n getValue: () => (document.fullscreenElement ? 'On' : 'Off'),\n onUpdate: () => {\n if (!document.fullscreenElement) {\n document.documentElement.requestFullscreen().catch(err => {\n console.error(`Error attempting to enable fullscreen: ${err.message}`);\n });\n } else {\n document.exitFullscreen();\n }\n }\n },\n {\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n }\n ]\n };\n }\n\n private createAudioMenu(): Menu {\n const cvars = this.host.cvars;\n return {\n title: 'Audio Options',\n items: [\n {\n label: 'Master Volume',\n type: 'input',\n getValue: () => cvars?.get('s_volume')?.string ?? '0.7',\n onUpdate: (val) => {\n const f = parseFloat(val);\n if (!isNaN(f)) cvars?.setValue('s_volume', val);\n }\n },\n {\n label: 'Music Volume',\n type: 'input',\n getValue: () => cvars?.get('ogg_volume')?.string ?? '0.7',\n onUpdate: (val) => {\n const f = parseFloat(val);\n if (!isNaN(f)) cvars?.setValue('ogg_volume', val);\n }\n },\n {\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n }\n ]\n };\n }\n\n private createControlsMenu(): Menu {\n const cvars = this.host.cvars;\n return {\n title: 'Controls',\n items: [\n {\n label: 'Sensitivity',\n type: 'input',\n getValue: () => cvars?.get('sensitivity')?.string ?? '3',\n onUpdate: (val) => {\n const f = parseFloat(val);\n if (!isNaN(f)) cvars?.setValue('sensitivity', val);\n }\n },\n {\n label: 'Invert Mouse',\n type: 'toggle',\n getValue: () => (cvars?.get('m_pitch')?.string.startsWith('-') ? 'Yes' : 'No'),\n onUpdate: () => {\n const current = parseFloat(cvars?.get('m_pitch')?.string ?? '0.022');\n cvars?.setValue('m_pitch', (-current).toString());\n }\n },\n {\n label: 'Always Run',\n type: 'toggle',\n getValue: () => (cvars?.get('cl_run')?.integer ? 'Yes' : 'No'),\n onUpdate: () => {\n const current = cvars?.get('cl_run')?.integer ?? 1;\n cvars?.setValue('cl_run', current ? '0' : '1');\n }\n },\n {\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n }\n ]\n };\n }\n\n private createGameplayMenu(): Menu {\n const cvars = this.host.cvars;\n return {\n title: 'Gameplay Options',\n items: [\n {\n label: 'Crosshair',\n type: 'toggle',\n getValue: () => (cvars?.get('crosshair')?.integer ? 'On' : 'Off'),\n onUpdate: () => {\n const current = cvars?.get('crosshair')?.integer ?? 1;\n cvars?.setValue('crosshair', current ? '0' : '1');\n }\n },\n {\n label: 'Handedness',\n type: 'toggle',\n getValue: () => (cvars?.get('hand')?.integer === 1 ? 'Left' : (cvars?.get('hand')?.integer === 2 ? 'Center' : 'Right')),\n onUpdate: () => {\n const current = cvars?.get('hand')?.integer ?? 0;\n const next = (current + 1) % 3;\n cvars?.setValue('hand', next.toString());\n }\n },\n {\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n }\n ]\n }\n }\n}\n","import { Menu, MenuItem } from './types.js';\nimport { MenuSystem } from './system.js';\nimport { AssetManager, VirtualFileSystem } from '@quake2ts/engine';\n\nexport class MapsMenuFactory {\n constructor(\n private readonly menuSystem: MenuSystem,\n private readonly vfs: VirtualFileSystem,\n private readonly onStartMap: (mapName: string) => void\n ) {}\n\n createMapsMenu(): Menu {\n const maps = this.vfs.findByExtension('.bsp');\n\n // Filter maps if needed (e.g. exclude test maps)\n // For now, list all.\n // Quake 2 maps usually are in maps/ folder.\n const mapItems: MenuItem[] = maps.map(file => ({\n label: file.path.replace(/^maps\\//, '').replace(/\\.bsp$/, ''),\n action: () => {\n this.onStartMap(file.path.replace(/^maps\\//, '').replace(/\\.bsp$/, ''));\n this.menuSystem.closeAll();\n }\n }));\n\n if (mapItems.length === 0) {\n mapItems.push({\n label: 'No maps found',\n action: () => {}\n });\n }\n\n mapItems.push({\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n });\n\n return {\n title: 'Select Map',\n items: mapItems\n };\n }\n}\n","import { Menu } from './types.js';\nimport { MenuSystem } from './system.js';\nimport { OptionsMenuFactory } from './options.js';\nimport { EngineHost } from '@quake2ts/engine';\n\nexport class PauseMenuFactory {\n constructor(\n private readonly menuSystem: MenuSystem,\n private readonly optionsFactory: OptionsMenuFactory,\n private readonly host?: EngineHost\n ) {}\n\n createPauseMenu(): Menu {\n return {\n title: 'Game Paused',\n items: [\n {\n label: 'Resume Game',\n action: () => {\n this.menuSystem.closeAll();\n }\n },\n {\n label: 'Options',\n action: () => {\n this.menuSystem.pushMenu(this.optionsFactory.createOptionsMenu());\n }\n },\n {\n label: 'Restart Level',\n action: () => {\n this.host?.commands.execute('restart');\n this.menuSystem.closeAll();\n }\n },\n {\n label: 'Quit to Main Menu',\n action: () => {\n this.host?.commands.execute('disconnect');\n this.menuSystem.closeAll();\n }\n }\n ]\n };\n }\n}\n","import { Menu, MenuItem } from './types.js';\nimport { MenuSystem } from './system.js';\nimport { MultiplayerConnection } from '../../net/connection.js';\n\nexport class MultiplayerMenuFactory {\n constructor(\n private readonly menuSystem: MenuSystem,\n private readonly connection: MultiplayerConnection\n ) {}\n\n createMultiplayerMenu(initialAddress: string = 'localhost:27910', status: string = ''): Menu {\n // We cannot mutate MenuItems because they are readonly.\n // So we capture state in closure and recreate the menu structure when needed.\n\n let address = initialAddress;\n\n const items: MenuItem[] = [];\n\n // Status item\n if (status) {\n items.push({\n label: status,\n action: () => {} // No-op\n });\n }\n\n items.push(\n {\n label: 'Address: ' + address,\n action: () => {\n if (typeof window !== 'undefined') {\n const newAddr = window.prompt('Enter Server Address', address);\n if (newAddr) {\n address = newAddr;\n this.refreshMenu(address);\n }\n }\n }\n },\n {\n label: 'Connect',\n action: () => {\n this.refreshMenu(address, 'Connecting...');\n this.connection.connect('ws://' + address)\n .then(() => {\n this.menuSystem.closeAll();\n })\n .catch(err => {\n console.error(err);\n const failStatus = 'Failed: ' + (err.message || 'Unknown error');\n this.refreshMenu(address, failStatus);\n });\n }\n },\n {\n label: 'Disconnect',\n action: () => {\n this.connection.disconnect();\n this.refreshMenu(address, 'Disconnected');\n }\n },\n {\n label: 'Back',\n action: () => {\n this.menuSystem.popMenu();\n }\n }\n );\n\n return {\n title: 'Multiplayer',\n items\n };\n }\n\n private refreshMenu(address: string, status: string = '') {\n this.menuSystem.popMenu();\n this.menuSystem.pushMenu(this.createMultiplayerMenu(address, status));\n }\n}\n","\nexport interface StoredDemoMetadata {\n name: string;\n date: number;\n size: number;\n duration?: number;\n}\n\nexport interface StoredDemo extends StoredDemoMetadata {\n data: ArrayBuffer;\n}\n\nexport class DemoStorage {\n private dbName = 'quake2ts-demos';\n private version = 1;\n private storeName = 'demos';\n private dbPromise: Promise<IDBDatabase> | null = null;\n private dbInstance: IDBDatabase | null = null;\n\n constructor() {}\n\n private getDB(): Promise<IDBDatabase> {\n if (this.dbPromise) return this.dbPromise;\n\n this.dbPromise = new Promise((resolve, reject) => {\n if (typeof indexedDB === 'undefined') {\n reject(new Error('IndexedDB is not supported'));\n return;\n }\n\n const request = indexedDB.open(this.dbName, this.version);\n\n request.onerror = () => {\n reject(new Error(`Failed to open database: ${request.error?.message}`));\n };\n\n request.onsuccess = () => {\n this.dbInstance = request.result;\n resolve(request.result);\n };\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains(this.storeName)) {\n // Key by name\n db.createObjectStore(this.storeName, { keyPath: 'name' });\n }\n };\n });\n\n return this.dbPromise;\n }\n\n // Helper to close connection, useful for tests\n public close(): void {\n if (this.dbInstance) {\n this.dbInstance.close();\n this.dbInstance = null;\n this.dbPromise = null;\n }\n }\n\n async saveDemo(name: string, data: ArrayBuffer, duration?: number): Promise<void> {\n const db = await this.getDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([this.storeName], 'readwrite');\n const store = transaction.objectStore(this.storeName);\n\n const record: StoredDemo = {\n name,\n data,\n date: Date.now(),\n size: data.byteLength,\n duration\n };\n\n const request = store.put(record);\n\n request.onsuccess = () => resolve();\n request.onerror = () => reject(new Error(`Failed to save demo: ${request.error?.message}`));\n });\n }\n\n async loadDemo(name: string): Promise<StoredDemo | null> {\n const db = await this.getDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([this.storeName], 'readonly');\n const store = transaction.objectStore(this.storeName);\n const request = store.get(name);\n\n request.onsuccess = () => {\n resolve(request.result || null);\n };\n request.onerror = () => reject(new Error(`Failed to load demo: ${request.error?.message}`));\n });\n }\n\n async listDemos(): Promise<StoredDemoMetadata[]> {\n const db = await this.getDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([this.storeName], 'readonly');\n const store = transaction.objectStore(this.storeName);\n const request = store.getAll();\n\n request.onsuccess = () => {\n const results: StoredDemo[] = request.result;\n // Map to metadata to avoid loading all buffers into memory if possible,\n // though getAll() loads everything.\n // Optimally we would use a cursor, but getAll is simpler for now.\n const metadata = results.map(demo => ({\n name: demo.name,\n date: demo.date,\n size: demo.size,\n duration: demo.duration\n })).sort((a, b) => b.date - a.date); // Sort by date descending\n\n resolve(metadata);\n };\n request.onerror = () => reject(new Error(`Failed to list demos: ${request.error?.message}`));\n });\n }\n\n async deleteDemo(name: string): Promise<void> {\n const db = await this.getDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([this.storeName], 'readwrite');\n const store = transaction.objectStore(this.storeName);\n const request = store.delete(name);\n\n request.onsuccess = () => resolve();\n request.onerror = () => reject(new Error(`Failed to delete demo: ${request.error?.message}`));\n });\n }\n}\n","import { Menu, MenuItem } from './types.js';\nimport { MenuSystem } from './system.js';\nimport { ClientExports } from '../../index.js';\nimport { DemoValidator } from '@quake2ts/engine';\nimport { DemoStorage, StoredDemoMetadata } from '../../demo/storage.js';\n\nexport interface DemoMenuOptions {\n onLoadDemoFile?: () => Promise<void>;\n}\n\nexport class DemoMenuFactory {\n private storage: DemoStorage;\n\n constructor(\n private readonly menuSystem: MenuSystem,\n private readonly client: ClientExports,\n private readonly options?: DemoMenuOptions\n ) {\n this.storage = new DemoStorage();\n }\n\n createDemoMenu(): Menu {\n const items: MenuItem[] = [\n {\n label: 'Load Demo File...',\n action: () => {\n if (this.options?.onLoadDemoFile) {\n this.options.onLoadDemoFile().then(() => {\n this.menuSystem.closeAll();\n }).catch(err => {\n this.client.errorDialog.show(\"Error Loading Demo\", err.message);\n });\n } else {\n this.loadDemoFromFilePicker();\n }\n }\n },\n // Stored demos will be appended here via refreshDemos,\n // but Menu structure expects static return.\n // We'll create a dynamic loader for the stored demos sub-section or just inject them.\n // For now, let's load them and update the menu?\n // Or better, return a Menu that has a \"Stored Demos\" submenu if we want to be clean,\n // but flattening is probably better for UX if few demos.\n // Since createDemoMenu is synchronous, we can't await listDemos().\n // We'll add a \"Stored Demos...\" item that opens a new menu which loads async.\n {\n label: 'Stored Demos...',\n action: () => this.openStoredDemosMenu()\n },\n {\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n }\n ];\n\n return {\n title: 'Demos',\n items\n };\n }\n\n private openStoredDemosMenu() {\n // Show loading placeholder\n // Ideally we would fetch first then show menu, but we need to handle async\n\n this.storage.listDemos().then(demos => {\n const items: MenuItem[] = [];\n\n if (demos.length === 0) {\n items.push({ label: '<No stored demos>', action: () => {} });\n } else {\n demos.forEach(demo => {\n items.push({\n label: demo.name,\n action: () => this.playStoredDemo(demo.name)\n });\n });\n\n // Add a delete option? Or submenu for each demo?\n // For simplicity: Click to play.\n // Maybe long-press or a separate \"Manage Demos\" menu for deletion.\n items.push({ label: '---', action: () => {} });\n items.push({\n label: 'Manage Demos (Delete)...',\n action: () => this.openManageDemosMenu(demos)\n });\n }\n\n items.push({\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n });\n\n this.menuSystem.pushMenu({\n title: 'Stored Demos',\n items\n });\n\n }).catch(err => {\n console.error(\"Failed to list demos\", err);\n this.client.errorDialog.show(\"Error\", \"Failed to list stored demos\");\n });\n }\n\n private openManageDemosMenu(demos: StoredDemoMetadata[]) {\n const items: MenuItem[] = demos.map(demo => ({\n label: `Delete ${demo.name}`,\n action: () => {\n if (confirm(`Delete ${demo.name}?`)) {\n this.storage.deleteDemo(demo.name).then(() => {\n this.menuSystem.popMenu(); // Close manage menu\n this.menuSystem.popMenu(); // Close list menu to refresh\n this.openStoredDemosMenu(); // Re-open list\n });\n }\n }\n }));\n\n items.push({\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n });\n\n this.menuSystem.pushMenu({\n title: 'Delete Demos',\n items\n });\n }\n\n private async playStoredDemo(name: string) {\n try {\n const demo = await this.storage.loadDemo(name);\n if (demo) {\n this.client.startDemoPlayback(demo.data, demo.name);\n this.menuSystem.closeAll();\n } else {\n this.client.errorDialog.show(\"Error\", \"Demo not found in storage\");\n }\n } catch (e) {\n console.error(\"Failed to load demo from storage\", e);\n this.client.errorDialog.show(\"Error\", \"Failed to load demo\");\n }\n }\n\n private loadDemoFromFilePicker() {\n // Create a hidden file input\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.dm2';\n input.style.display = 'none';\n document.body.appendChild(input);\n\n input.onchange = async () => {\n if (input.files && input.files.length > 0) {\n const file = input.files[0];\n try {\n const buffer = await file.arrayBuffer();\n\n // Validate demo file\n const result = DemoValidator.validate(buffer, file.name);\n if (!result.valid) {\n const msg = result.error || 'Unknown validation error';\n this.client.errorDialog.show(\"Invalid Demo File\", msg);\n return;\n }\n\n // Save to storage (fire and forget, or await?)\n // Better to await so we know it's safe? Or just let it happen.\n // Task says \"Store uploaded demos for quick access\".\n // We'll try to save it.\n try {\n await this.storage.saveDemo(file.name, buffer);\n } catch (storeErr) {\n console.warn(\"Failed to save demo to storage\", storeErr);\n }\n\n // Start playback\n this.client.startDemoPlayback(buffer, file.name);\n this.menuSystem.closeAll();\n } catch (e) {\n console.error(\"Failed to load demo:\", e);\n this.client.errorDialog.show(\"Load Error\", \"Failed to read demo file.\");\n }\n }\n document.body.removeChild(input);\n };\n\n input.click();\n }\n}\n","import { Renderer } from '@quake2ts/engine';\nimport { MenuState } from './types.js';\n\nexport function Draw_Menu(renderer: Renderer, state: MenuState, width: number, height: number): void {\n if (!state.activeMenu) {\n return;\n }\n\n const menu = state.activeMenu;\n const centerX = width / 2;\n const centerY = height / 2;\n const lineHeight = 20;\n const totalHeight = (menu.items.length * lineHeight) + 40; // Items + title space\n const startY = centerY - totalHeight / 2;\n\n // Draw background overlay\n renderer.drawfillRect(0, 0, width, height, [0, 0, 0, 0.7]);\n\n // Draw title\n // TODO: Use a larger font or a specific title graphic if available\n renderer.drawCenterString(startY, menu.title);\n\n // Draw items\n menu.items.forEach((item, index) => {\n const y = startY + 40 + index * lineHeight;\n let text = item.label;\n\n if (item.type === 'input' && item.getValue) {\n text += `: ${item.getValue()}`;\n if (index === state.selectedIndex) {\n // Blinking cursor or static underscore\n const time = Date.now();\n if (Math.floor(time / 500) % 2 === 0) {\n text += '_';\n }\n }\n } else if (item.type === 'toggle' && item.getValue) {\n text += `: ${item.getValue()}`;\n }\n\n if (index === state.selectedIndex) {\n // Draw cursor arrow to the left\n // Quake 2 typically uses a specific character or graphic for cursor\n // char 13 is often an arrow in Quake fonts\n const cursorChar = 13;\n const charWidth = 8;\n\n // Calculate text width to position cursor\n const stripped = text.replace(/\\^[0-9]/g, '');\n const textWidth = stripped.length * charWidth;\n const textX = (width - textWidth) / 2;\n\n // Draw cursor to the left of the text\n // renderer.drawChar(textX - 16, y, cursorChar); // Renderer doesn't expose drawChar directly yet, need to check interface\n // Since drawChar isn't on the interface, we'll use a string with just that char\n renderer.drawString(textX - 16, y, String.fromCharCode(cursorChar));\n }\n\n renderer.drawCenterString(y, text);\n });\n}\n","import { CvarFlags } from '@quake2ts/shared';\n\nexport interface SettingsStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n}\n\nexport class BrowserSettings {\n constructor(private readonly storage: SettingsStorage) {}\n\n loadCvars(cvars: Map<string, { value: string, setValue: (v: string) => void }>) {\n try {\n const stored = this.storage.getItem('quake2ts_cvars');\n if (stored) {\n const data = JSON.parse(stored) as Record<string, string>;\n for (const [key, value] of Object.entries(data)) {\n // Only update if cvar exists\n const cvar = cvars.get(key);\n if (cvar) {\n cvar.setValue(value);\n }\n }\n }\n } catch (e) {\n console.warn('Failed to load settings', e);\n }\n }\n\n saveCvars(cvars: { name: string, value: string, flags: number }[]) {\n const data: Record<string, string> = {};\n for (const cvar of cvars) {\n if (cvar.flags & CvarFlags.Archive) {\n data[cvar.name] = cvar.value;\n }\n }\n try {\n this.storage.setItem('quake2ts_cvars', JSON.stringify(data));\n } catch (e) {\n console.warn('Failed to save settings', e);\n }\n }\n}\n","import { SettingsStorage } from './settings.js';\n\nexport class LocalStorageSettings implements SettingsStorage {\n getItem(key: string): string | null {\n try {\n return localStorage.getItem(key);\n } catch (e) {\n console.warn('localStorage not available', e);\n return null;\n }\n }\n\n setItem(key: string, value: string): void {\n try {\n localStorage.setItem(key, value);\n } catch (e) {\n console.warn('Failed to write to localStorage', e);\n }\n }\n}\n\nexport { BrowserSettings, SettingsStorage } from './settings.js';\n","import { Renderer } from '@quake2ts/engine';\n\nexport class LoadingScreen {\n private total = 0;\n private current = 0;\n private message = '';\n private active = false;\n\n start(total: number, message: string = 'Loading...') {\n this.total = total;\n this.current = 0;\n this.message = message;\n this.active = true;\n }\n\n update(current: number, message?: string) {\n this.current = current;\n if (message) {\n this.message = message;\n }\n }\n\n finish() {\n this.active = false;\n this.current = this.total;\n }\n\n render(renderer: Renderer) {\n if (!this.active) return;\n\n const width = renderer.width;\n const height = renderer.height;\n\n // Draw background\n renderer.drawfillRect(0, 0, width, height, [0.1, 0.1, 0.1, 1]);\n\n // Draw progress bar\n const barWidth = width * 0.6;\n const barHeight = 20;\n const barX = (width - barWidth) / 2;\n const barY = height * 0.7;\n\n renderer.drawfillRect(barX, barY, barWidth, barHeight, [0.3, 0.3, 0.3, 1]);\n\n const progress = this.total > 0 ? this.current / this.total : 0;\n renderer.drawfillRect(barX, barY, barWidth * progress, barHeight, [0.8, 0.5, 0.1, 1]);\n\n // Draw text\n renderer.drawCenterString(barY - 30, this.message);\n const percent = Math.floor(progress * 100);\n renderer.drawCenterString(barY + barHeight + 10, `${percent}%`);\n }\n}\n","import { Renderer } from '@quake2ts/engine';\n\nexport interface ErrorDialogState {\n active: boolean;\n title: string;\n message: string;\n}\n\nexport class ErrorDialog {\n private state: ErrorDialogState = {\n active: false,\n title: '',\n message: ''\n };\n\n show(title: string, message: string) {\n this.state = {\n active: true,\n title,\n message\n };\n }\n\n hide() {\n this.state.active = false;\n }\n\n render(renderer: Renderer) {\n if (!this.state.active) return;\n\n const width = renderer.width;\n const height = renderer.height;\n const centerX = width / 2;\n const centerY = height / 2;\n const boxWidth = 400;\n const boxHeight = 200;\n\n // Overlay\n renderer.drawfillRect(0, 0, width, height, [0, 0, 0, 0.5]);\n\n // Dialog Box\n renderer.drawfillRect(centerX - boxWidth / 2, centerY - boxHeight / 2, boxWidth, boxHeight, [0.2, 0, 0, 1]); // Dark red for error\n\n // Text\n renderer.drawCenterString(centerY - 40, `^1${this.state.title}`); // ^1 for Red\n renderer.drawCenterString(centerY, this.state.message);\n renderer.drawCenterString(centerY + 60, \"Press ESC to close\");\n }\n}\n","import { Renderer } from '@quake2ts/engine';\nimport { PlayerClient } from '@quake2ts/game';\n\nexport interface WheelMenu {\n active: boolean;\n type: 'weapon' | 'item';\n selectedIndex: number;\n}\n\nexport class WheelMenuSystem {\n private state: WheelMenu = {\n active: false,\n type: 'weapon',\n selectedIndex: -1\n };\n\n open(type: 'weapon' | 'item') {\n this.state.active = true;\n this.state.type = type;\n }\n\n close() {\n this.state.active = false;\n }\n\n isOpen(): boolean {\n return this.state.active;\n }\n\n handleInput(deltaX: number, deltaY: number) {\n if (!this.state.active) return;\n // Calculate angle from center to select item\n // Stub implementation\n }\n\n render(renderer: Renderer, width: number, height: number, client: PlayerClient) {\n if (!this.state.active) return;\n\n // Draw radial menu background\n const centerX = width / 2;\n const centerY = height / 2;\n // Stub: draw a transparent circle/box\n renderer.drawfillRect(centerX - 100, centerY - 100, 200, 200, [0, 0, 0, 0.5]);\n renderer.drawCenterString(centerY, `Select ${this.state.type}`);\n }\n}\n","import { NetDriver } from '@quake2ts/shared';\n\nexport class BrowserWebSocketNetDriver implements NetDriver {\n private socket: WebSocket | null = null;\n private messageCallback: ((data: Uint8Array) => void) | null = null;\n private closeCallback: (() => void) | null = null;\n private errorCallback: ((error: Error) => void) | null = null;\n\n async connect(url: string): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.socket = new WebSocket(url);\n this.socket.binaryType = 'arraybuffer';\n\n this.socket.onopen = () => {\n resolve();\n };\n\n this.socket.onerror = (event) => {\n const error = new Error('WebSocket connection error');\n if (this.errorCallback) {\n this.errorCallback(error);\n }\n reject(error);\n };\n\n this.socket.onclose = () => {\n if (this.closeCallback) {\n this.closeCallback();\n }\n this.socket = null;\n };\n\n this.socket.onmessage = (event) => {\n if (this.messageCallback) {\n if (event.data instanceof ArrayBuffer) {\n this.messageCallback(new Uint8Array(event.data));\n } else {\n console.warn('Received non-binary message from server');\n }\n }\n };\n\n } catch (e) {\n reject(e);\n }\n });\n }\n\n disconnect(): void {\n if (this.socket) {\n this.socket.close();\n this.socket = null;\n }\n }\n\n send(data: Uint8Array): void {\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n this.socket.send(data);\n } else {\n console.warn('Attempted to send data on closed or connecting socket');\n }\n }\n\n onMessage(callback: (data: Uint8Array) => void): void {\n this.messageCallback = callback;\n }\n\n onClose(callback: () => void): void {\n this.closeCallback = callback;\n }\n\n onError(callback: (error: Error) => void): void {\n this.errorCallback = callback;\n }\n\n isConnected(): boolean {\n return this.socket !== null && this.socket.readyState === WebSocket.OPEN;\n }\n}\n","import {\n NetDriver,\n ClientCommand,\n ServerCommand,\n UserCommand,\n BinaryStream,\n NetworkMessageBuilder,\n writeUserCommand,\n BinaryWriter,\n CMD_BACKUP,\n NetChan,\n Vec3,\n crc8\n} from '@quake2ts/shared';\nimport {\n NetworkMessageParser,\n NetworkMessageHandler,\n EntityState,\n FrameData,\n createEmptyEntityState,\n applyEntityDelta,\n PROTOCOL_VERSION_RERELEASE,\n DemoRecorder,\n FogData,\n DamageIndicator\n} from '@quake2ts/engine';\nimport { BrowserWebSocketNetDriver } from './browserWsDriver.js';\nimport { ClientPrediction, PredictionState, defaultPredictionState } from '@quake2ts/cgame';\nimport { GameFrameResult } from '@quake2ts/engine';\nimport { ClientEffectSystem } from '../effects-system.js';\n\nexport enum ConnectionState {\n Disconnected,\n Connecting,\n Challenge,\n Connected,\n Loading,\n Active\n}\n\nexport interface MultiplayerConnectionOptions {\n username: string;\n model: string;\n skin: string;\n hand?: number;\n fov?: number;\n netchan?: NetChan;\n}\n\nexport class MultiplayerConnection implements NetworkMessageHandler {\n private driver: NetDriver;\n private state: ConnectionState = ConnectionState.Disconnected;\n private parser: NetworkMessageParser | null = null;\n private options: MultiplayerConnectionOptions;\n private netchan: NetChan;\n\n // Game State\n public serverProtocol = 0;\n public serverCount = 0;\n public gameDir = '';\n public playerNum = 0;\n public levelName = '';\n public configStrings = new Map<number, string>();\n public baselines = new Map<number, EntityState>();\n public entities = new Map<number, EntityState>();\n\n private challenge = 0;\n private connectPacketCount = 0;\n private connectPacketTime = 0;\n\n public latestServerFrame = 0;\n private commandHistory: UserCommand[] = [];\n\n // Prediction\n public prediction: ClientPrediction | null = null;\n\n // Demo Recording\n private demoRecorder: DemoRecorder | null = null;\n\n // Events\n public onConnectionStateChange?: (state: ConnectionState) => void;\n public onConnectionError?: (error: Error) => void;\n\n // Ping calculation\n private lastPingTime = 0;\n private currentPing = 0;\n\n private effectSystem?: ClientEffectSystem;\n\n // Frame CRC\n private frameCRCs = new Map<number, number>();\n private currentPacketCRC = 0;\n\n constructor(options: MultiplayerConnectionOptions) {\n this.driver = new BrowserWebSocketNetDriver();\n this.options = options;\n this.netchan = options.netchan ?? new NetChan();\n\n this.driver.onMessage((data) => this.handleMessage(data));\n this.driver.onClose(() => this.handleDisconnect());\n this.driver.onError((err) => {\n console.error('Network Error:', err);\n if (this.onConnectionError) {\n this.onConnectionError(err);\n }\n });\n }\n\n public setPrediction(prediction: ClientPrediction) {\n this.prediction = prediction;\n }\n\n public setDemoRecorder(recorder: DemoRecorder) {\n this.demoRecorder = recorder;\n }\n\n public setEffectSystem(system: ClientEffectSystem) {\n this.effectSystem = system;\n }\n\n public async connectToServer(address: string, port: number): Promise<void> {\n const url = `ws://${address}:${port}`;\n return this.connect(url);\n }\n\n public async connect(url: string): Promise<void> {\n if (this.state !== ConnectionState.Disconnected) {\n this.disconnect();\n }\n\n console.log(`Connecting to ${url}...`);\n this.setState(ConnectionState.Connecting);\n\n // Reset netchan state for new connection\n this.netchan.reset();\n\n try {\n await this.driver.connect(url);\n console.log('WebSocket connected.');\n this.setState(ConnectionState.Challenge);\n this.sendChallenge();\n this.lastPingTime = Date.now();\n } catch (e) {\n console.error('Connection failed:', e);\n this.setState(ConnectionState.Disconnected);\n if (this.onConnectionError) {\n this.onConnectionError(e instanceof Error ? e : new Error(String(e)));\n }\n throw e;\n }\n }\n\n public disconnect(): void {\n if (this.state === ConnectionState.Disconnected) return;\n\n this.driver.disconnect();\n this.setState(ConnectionState.Disconnected);\n this.cleanup();\n }\n\n private cleanup(): void {\n this.configStrings.clear();\n this.baselines.clear();\n this.entities.clear();\n this.commandHistory = [];\n this.latestServerFrame = 0;\n this.parser = null;\n this.frameCRCs.clear();\n // Note: Do not clear options or listeners as they might be reused\n }\n\n private setState(newState: ConnectionState): void {\n if (this.state !== newState) {\n this.state = newState;\n if (this.onConnectionStateChange) {\n this.onConnectionStateChange(newState);\n }\n }\n }\n\n public getPing(): number {\n return this.currentPing;\n }\n\n public sendCommand(cmd: UserCommand): void {\n if (this.state !== ConnectionState.Active) return;\n\n // Assign the last acknowledged server frame to this command\n const commandWithFrame: UserCommand = {\n ...cmd,\n serverFrame: cmd.serverFrame ?? this.latestServerFrame\n };\n\n // Buffer command for retransmission/prediction\n this.commandHistory.push(commandWithFrame);\n if (this.commandHistory.length > CMD_BACKUP) {\n this.commandHistory.shift();\n }\n\n // Enqueue to local prediction system if available\n if (this.prediction) {\n this.prediction.enqueueCommand(commandWithFrame);\n }\n\n const writer = new BinaryWriter();\n\n writer.writeByte(ClientCommand.move);\n\n const checksum = this.frameCRCs.get(this.latestServerFrame) || 0;\n writer.writeByte(checksum);\n\n writer.writeLong(this.latestServerFrame); // lastframe (ack)\n\n writeUserCommand(writer, commandWithFrame);\n\n // Use NetChan to wrap the command\n const packet = this.netchan.transmit(writer.getData());\n this.driver.send(packet);\n }\n\n private handleMessage(data: Uint8Array): void {\n // Check if buffer is SharedArrayBuffer and copy if necessary\n let buffer = data.buffer;\n if (typeof SharedArrayBuffer !== 'undefined' && buffer instanceof SharedArrayBuffer) {\n // Copy to ArrayBuffer\n const newBuffer = new ArrayBuffer(data.byteLength);\n new Uint8Array(newBuffer).set(data);\n buffer = newBuffer;\n }\n\n // Process via NetChan\n const processedData = this.netchan.process(new Uint8Array(buffer));\n\n if (!processedData) {\n return;\n }\n\n // Process the payload\n if (processedData.byteLength > 0) {\n if (this.demoRecorder && this.demoRecorder.getIsRecording()) {\n this.demoRecorder.recordMessage(processedData);\n }\n\n // Calculate CRC for potential frame update\n this.currentPacketCRC = crc8(processedData);\n\n const stream = new BinaryStream(processedData.buffer as ArrayBuffer);\n this.parser = new NetworkMessageParser(stream, this);\n this.parser.parseMessage();\n\n // Update ping on receiving frame or valid response\n const now = Date.now();\n if (this.lastPingTime > 0) {\n // Very rough ping estimation (RTT)\n // Real ping should be based on ack of commands but this is a start\n this.currentPing = now - this.lastPingTime;\n }\n this.lastPingTime = now;\n }\n }\n\n private handleDisconnect(): void {\n console.log('Disconnected from server.');\n this.setState(ConnectionState.Disconnected);\n this.cleanup();\n }\n\n private sendChallenge(): void {\n const builder = new NetworkMessageBuilder();\n builder.writeByte(ClientCommand.stringcmd);\n builder.writeString('getchallenge');\n\n const packet = this.netchan.transmit(builder.getData());\n this.driver.send(packet);\n }\n\n private sendConnect(challenge: number): void {\n const builder = new NetworkMessageBuilder();\n builder.writeByte(ClientCommand.stringcmd);\n\n const userinfo = `\\\\name\\\\${this.options.username}\\\\model\\\\${this.options.model}\\\\skin\\\\${this.options.skin}\\\\hand\\\\${this.options.hand ?? 0}\\\\fov\\\\${this.options.fov ?? 90}`;\n\n builder.writeString(`connect ${PROTOCOL_VERSION_RERELEASE} ${challenge} ${userinfo}`);\n\n const packet = this.netchan.transmit(builder.getData());\n this.driver.send(packet);\n }\n\n public isConnected(): boolean {\n return this.state === ConnectionState.Active;\n }\n\n // ==================================================================================\n // NetworkMessageHandler Implementation\n // ==================================================================================\n\n onServerData(protocol: number, serverCount: number, attractLoop: number, gameDir: string, playerNum: number, levelName: string): void {\n console.log(`Server Data: Protocol ${protocol}, Level ${levelName}`);\n this.serverProtocol = protocol;\n this.serverCount = serverCount;\n this.gameDir = gameDir;\n this.playerNum = playerNum;\n this.levelName = levelName;\n\n this.setState(ConnectionState.Connected);\n\n // Send \"new\" command to acknowledge we are loading\n const builder = new NetworkMessageBuilder();\n builder.writeByte(ClientCommand.stringcmd);\n builder.writeString('new');\n\n const packet = this.netchan.transmit(builder.getData());\n this.driver.send(packet);\n\n this.setState(ConnectionState.Loading);\n }\n\n onConfigString(index: number, str: string): void {\n this.configStrings.set(index, str);\n }\n\n onSpawnBaseline(entity: EntityState): void {\n this.baselines.set(entity.number, entity);\n }\n\n onStuffText(msg: string): void {\n console.log(`Server StuffText: ${msg}`);\n if (msg.startsWith('precache')) {\n this.finishLoading();\n }\n\n if (msg.startsWith('challenge ')) {\n const parts = msg.split(' ');\n if (parts.length > 1) {\n this.challenge = parseInt(parts[1], 10);\n this.sendConnect(this.challenge);\n }\n }\n }\n\n private finishLoading(): void {\n console.log('Finished loading, sending begin...');\n const builder = new NetworkMessageBuilder();\n builder.writeByte(ClientCommand.stringcmd);\n builder.writeString('begin');\n\n const packet = this.netchan.transmit(builder.getData());\n this.driver.send(packet);\n\n this.setState(ConnectionState.Active);\n }\n\n onFrame(frame: FrameData): void {\n if (frame.serverFrame > this.latestServerFrame) {\n this.latestServerFrame = frame.serverFrame;\n }\n\n // Store CRC for this frame\n this.frameCRCs.set(frame.serverFrame, this.currentPacketCRC);\n\n // Update Entities Map\n const packetEntities = frame.packetEntities;\n\n if (!packetEntities.delta) {\n this.entities.clear();\n }\n\n for (const ent of packetEntities.entities) {\n let current = this.entities.get(ent.number);\n if (!current) {\n current = createEmptyEntityState();\n current.number = ent.number;\n this.entities.set(ent.number, current);\n }\n applyEntityDelta(current, ent);\n }\n\n if (this.prediction && frame.playerState) {\n const ps = frame.playerState;\n const predState: PredictionState = {\n ...defaultPredictionState(),\n origin: { x: ps.origin.x, y: ps.origin.y, z: ps.origin.z },\n velocity: { x: ps.velocity.x, y: ps.velocity.y, z: ps.velocity.z },\n viewAngles: { x: ps.viewangles.x, y: ps.viewangles.y, z: ps.viewangles.z },\n deltaAngles: { x: ps.delta_angles.x, y: ps.delta_angles.y, z: ps.delta_angles.z },\n pmFlags: ps.pm_flags,\n pmType: ps.pm_type,\n gravity: ps.gravity,\n health: ps.stats[0],\n };\n\n const gameFrame: GameFrameResult<PredictionState> = {\n frame: frame.serverFrame,\n timeMs: 0,\n state: predState\n };\n\n this.prediction.setAuthoritative(gameFrame);\n }\n }\n\n onCenterPrint(msg: string): void {}\n onPrint(level: number, msg: string): void {}\n onSound(flags: number, soundNum: number, volume?: number, attenuation?: number, offset?: number, ent?: number, pos?: Vec3): void {}\n\n onTempEntity(type: number, pos: Vec3, pos2?: Vec3, dir?: Vec3, cnt?: number, color?: number, ent?: number, srcEnt?: number, destEnt?: number): void {\n if (this.effectSystem) {\n const time = Date.now() / 1000.0; // Use local time for now\n this.effectSystem.onTempEntity(type, pos, time);\n }\n }\n\n onLayout(layout: string): void {}\n onInventory(inventory: number[]): void {}\n\n onMuzzleFlash(ent: number, weapon: number): void {\n if (this.effectSystem) {\n const time = Date.now() / 1000.0;\n this.effectSystem.onMuzzleFlash(ent, weapon, time);\n }\n }\n\n onMuzzleFlash2(ent: number, weapon: number): void {\n // Helper for MZ2 types?\n }\n\n onMuzzleFlash3(ent: number, weapon: number): void {\n if (this.effectSystem) {\n const time = Date.now() / 1000.0;\n this.effectSystem.onMuzzleFlash(ent, weapon, time);\n }\n }\n\n onDisconnect(): void { this.disconnect(); }\n onReconnect(): void {}\n onDownload(size: number, percent: number, data?: Uint8Array): void {}\n\n // New handlers stubs\n onSplitClient(clientNum: number): void {}\n onConfigBlast(index: number, data: Uint8Array): void {}\n onSpawnBaselineBlast(entity: EntityState): void {}\n onLevelRestart(): void {}\n onDamage(indicators: DamageIndicator[]): void {}\n onLocPrint(flags: number, base: string, args: string[]): void {}\n onFog(data: FogData): void {}\n onWaitingForPlayers(count: number): void {}\n onBotChat(msg: string): void {}\n onPoi(flags: number, pos: Vec3): void {}\n onHelpPath(pos: Vec3): void {}\n onAchievement(id: string): void {}\n}","import { Renderer, DemoPlaybackController, PlaybackState } from '@quake2ts/engine';\n\nexport class DemoControls {\n private playback: DemoPlaybackController;\n private isVisible: boolean = true;\n private demoName: string | null = null;\n private onSpeedChange?: (speed: number) => void;\n\n constructor(playback: DemoPlaybackController, onSpeedChange?: (speed: number) => void) {\n this.playback = playback;\n this.onSpeedChange = onSpeedChange;\n }\n\n public setDemoName(name: string | null) {\n this.demoName = name;\n }\n\n public render(renderer: Renderer, width: number, height: number): void {\n if (!this.isVisible) return;\n\n const state = this.playback.getState();\n const isPlaying = state === PlaybackState.Playing;\n\n // Bottom overlay\n const overlayHeight = 60;\n const y = height - overlayHeight;\n renderer.drawfillRect(0, y, width, overlayHeight, [0, 0, 0, 0.5]);\n\n // Play/Pause button\n const iconSize = 24;\n const iconY = y + (overlayHeight - iconSize) / 2;\n const iconX = 20;\n\n const statusText = isPlaying ? \"PAUSE\" : \"PLAY\";\n renderer.drawString(iconX, iconY, statusText);\n\n // Speed indicator\n const speed = this.playback.getSpeed();\n const speedText = `Speed: ${speed}x`;\n renderer.drawCenterString(iconY, speedText);\n\n // Time Text (MM:SS / MM:SS)\n const currentTime = this.playback.getCurrentTime();\n const totalTime = this.playback.getDuration();\n const currentFormatted = this.formatTime(currentTime);\n const totalFormatted = this.formatTime(totalTime);\n const timeText = `${currentFormatted} / ${totalFormatted}`;\n\n // Position time text to the right\n const timeX = width - 150;\n renderer.drawString(timeX, iconY, timeText);\n\n // Demo Name\n if (this.demoName) {\n renderer.drawString(width - 300, iconY - 20, this.demoName);\n }\n\n // Timeline (Progress Bar)\n const timelineY = y + 5;\n const timelineHeight = 4;\n const timelineWidth = width - 40;\n const timelineX = 20;\n\n // Draw background bar\n renderer.drawfillRect(timelineX, timelineY, timelineWidth, timelineHeight, [0.3, 0.3, 0.3, 1.0]);\n\n // Draw progress\n const progress = totalTime > 0 ? (currentTime / totalTime) : 0;\n const clampedProgress = Math.max(0, Math.min(1, progress));\n const progressWidth = timelineWidth * clampedProgress;\n renderer.drawfillRect(timelineX, timelineY, progressWidth, timelineHeight, [1.0, 1.0, 1.0, 1.0]);\n\n // Draw marker\n const markerX = timelineX + progressWidth;\n renderer.drawfillRect(markerX - 2, timelineY - 2, 4, timelineHeight + 4, [1.0, 0.0, 0.0, 1.0]);\n\n // Controls Help\n const helpText = \"[Space] Toggle [< >] Step [ [ ] ] Speed [Esc] Stop\";\n renderer.drawCenterString(y + 35, helpText);\n }\n\n public handleInput(key: string, down: boolean): boolean {\n if (!down) return false;\n\n // We only consume specific keys\n switch (key.toLowerCase()) {\n case ' ':\n if (this.playback.getState() === PlaybackState.Playing) {\n this.playback.pause();\n } else if (this.playback.getState() === PlaybackState.Paused) {\n this.playback.play();\n }\n return true;\n\n case 'arrowright':\n this.playback.stepForward();\n return true;\n\n case 'arrowleft':\n this.playback.stepBackward();\n return true;\n\n case ']':\n this.changeSpeed(2.0); // Multiply by 2\n return true;\n\n case '[':\n this.changeSpeed(0.5); // Multiply by 0.5\n return true;\n\n case 'escape':\n this.playback.stop();\n return true;\n }\n\n return false;\n }\n\n private changeSpeed(factor: number) {\n const current = this.playback.getSpeed();\n let newSpeed = current * factor;\n if (newSpeed < 0.1) newSpeed = 0.1;\n if (newSpeed > 16) newSpeed = 16;\n this.playback.setSpeed(newSpeed);\n if (this.onSpeedChange) {\n this.onSpeedChange(newSpeed);\n }\n }\n\n private formatTime(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n}\n","import { Vec3 } from '@quake2ts/shared';\n\nexport enum DemoCameraMode {\n FirstPerson,\n ThirdPerson,\n Free,\n Follow\n}\n\nexport interface DemoCameraState {\n mode: DemoCameraMode;\n thirdPersonDistance: number;\n thirdPersonOffset: Vec3;\n freeCameraOrigin: Vec3;\n freeCameraAngles: Vec3;\n followEntityId: number;\n currentFollowOrigin?: Vec3;\n}\n","import { EntityEffects, RenderFx, Vec3 } from '@quake2ts/shared';\nimport { DLight } from '@quake2ts/engine';\n\n// Helper to add dlight\nfunction addDLight(\n dlights: DLight[],\n origin: Vec3,\n color: [number, number, number],\n intensity: number,\n minLight: number = 0,\n die: number = 0\n) {\n dlights.push({\n origin,\n color: { x: color[0], y: color[1], z: color[2] },\n intensity,\n minLight,\n die,\n });\n}\n\nexport function processEntityEffects(\n entity: {\n effects: number;\n renderfx: number;\n origin: Vec3;\n alpha?: number;\n },\n dlights: DLight[],\n time: number\n) {\n const { effects, origin } = entity;\n const lifetime = time + 0.1;\n\n // EF_BLASTER: Yellow light\n if (effects & EntityEffects.Blaster) {\n addDLight(dlights, origin, [1.0, 1.0, 0.0], 200, 0, lifetime);\n }\n\n // EF_HYPERBLASTER: Yellow light\n if (effects & EntityEffects.HyperBlaster) {\n const intensity = flicker(time, 200, 32);\n addDLight(dlights, origin, [1.0, 1.0, 0.0], intensity, 0, lifetime);\n }\n\n // EF_ROCKET: Red/Orange light + Trail? (Trails handled elsewhere usually)\n // Task 4.1.4: \"Color based on projectile type\", \"Trail effect\" (Trails are particles, here we do lights)\n if (effects & EntityEffects.Rocket) {\n addDLight(dlights, origin, [1.0, 0.5, 0.2], 200, 0, lifetime);\n }\n\n // EF_GRENADE: Orange light\n if (effects & EntityEffects.Grenade) {\n addDLight(dlights, origin, [1.0, 0.5, 0.0], 100, 0, lifetime);\n }\n\n // EF_BFG: Green light\n if (effects & EntityEffects.Bfg) {\n addDLight(dlights, origin, [0.1, 1.0, 0.1], 300, 0, lifetime);\n }\n\n // EF_BLUEHYPERBLASTER: Blue light\n if (effects & EntityEffects.Bluehyperblaster) {\n const intensity = flicker(time, 200, 32);\n addDLight(dlights, origin, [0.2, 0.2, 1.0], intensity, 0, lifetime);\n }\n\n // EF_PLASMA: Blue light\n if (effects & EntityEffects.Plasma) {\n addDLight(dlights, origin, [0.2, 0.5, 1.0], 200, 0, lifetime);\n }\n\n // EF_TRACKER: Green light\n if (effects & EntityEffects.Tracker) {\n addDLight(dlights, origin, [0.2, 1.0, 0.2], 200, 0, lifetime);\n }\n\n // EF_TRAP: Green light\n if (effects & EntityEffects.Trap) {\n addDLight(dlights, origin, [0.2, 1.0, 0.2], 200, 0, lifetime);\n }\n\n // EF_FLAG1: Red Light\n if (effects & EntityEffects.Flag1) {\n const intensity = flicker(time, 200, 40);\n addDLight(dlights, origin, [1.0, 0.2, 0.2], intensity, 0, lifetime);\n }\n\n // EF_FLAG2: Blue Light\n if (effects & EntityEffects.Flag2) {\n const intensity = flicker(time, 200, 40);\n addDLight(dlights, origin, [0.2, 0.2, 1.0], intensity, 0, lifetime);\n }\n\n // EF_COLOR_SHELL (16) often implies power shield or specific coloring?\n // EF_POWERSCREEN (32)\n}\n\nfunction flicker(time: number, base: number, variance: number): number {\n return base + (Math.random() - 0.5) * variance;\n}\n","import { DynamicLightManager, EngineImports, EntityState } from '@quake2ts/engine';\nimport {\n Vec3,\n MZ_BLASTER, MZ_MACHINEGUN, MZ_SHOTGUN, MZ_CHAINGUN1, MZ_CHAINGUN2, MZ_CHAINGUN3,\n MZ_RAILGUN, MZ_ROCKET, MZ_GRENADE, MZ_LOGIN, MZ_LOGOUT, MZ_SSHOTGUN, MZ_BFG, MZ_HYPERBLASTER,\n MZ_BLUEHYPERBLASTER, MZ_PHALANX, MZ_IONRIPPER, MZ_ETF_RIFLE, MZ_HEATBEAM,\n MZ_BLASTER2, MZ_TRACKER, MZ_NUKE1, MZ_NUKE2, MZ_NUKE4, MZ_NUKE8,\n TempEntity,\n angleVectors\n} from '@quake2ts/shared';\n// Import particle helpers from engine\nimport {\n spawnBulletImpact, spawnExplosion, spawnBlood, spawnMuzzleFlash,\n spawnTrail, spawnSplash, spawnSteam, spawnRailTrail, spawnSparks,\n spawnBlasterImpact, spawnBfgExplosion\n} from '@quake2ts/engine';\nimport { ClientConfigStrings } from './configStrings.js';\n\n// Helper to copy vec3\nconst copyVec3 = (v: Vec3): Vec3 => ({ x: v.x, y: v.y, z: v.z });\n\n// Helper to scale and add\nconst vectorMA = (start: Vec3, scale: number, dir: Vec3): Vec3 => ({\n x: start.x + dir.x * scale,\n y: start.y + dir.y * scale,\n z: start.z + dir.z * scale\n});\n\nexport interface EntityProvider {\n getEntity(entNum: number): EntityState | undefined;\n getPlayerNum(): number;\n}\n\n// Muzzle Flash Offsets (Forward, Right, Up)\nconst FLASH_OFFSETS: Record<number, Vec3> = {\n [MZ_BLASTER]: { x: 24, y: 8, z: 0 },\n [MZ_MACHINEGUN]: { x: 28, y: 8, z: 0 },\n [MZ_SHOTGUN]: { x: 24, y: 8, z: 0 },\n [MZ_SSHOTGUN]: { x: 20, y: 8, z: 0 },\n [MZ_CHAINGUN1]: { x: 30, y: 8, z: -4 },\n [MZ_CHAINGUN2]: { x: 30, y: 8, z: -4 },\n [MZ_CHAINGUN3]: { x: 30, y: 8, z: -4 },\n [MZ_RAILGUN]: { x: 32, y: 8, z: 0 },\n [MZ_ROCKET]: { x: 30, y: 8, z: 0 },\n [MZ_GRENADE]: { x: 24, y: 8, z: 0 },\n [MZ_BFG]: { x: 32, y: 8, z: -2 },\n [MZ_HYPERBLASTER]: { x: 30, y: 8, z: 0 },\n [MZ_BLUEHYPERBLASTER]: { x: 30, y: 8, z: 0 },\n [MZ_PHALANX]: { x: 28, y: 8, z: 0 },\n [MZ_IONRIPPER]: { x: 28, y: 8, z: 0 },\n [MZ_ETF_RIFLE]: { x: 30, y: 8, z: 0 },\n [MZ_HEATBEAM]: { x: 24, y: 8, z: 0 },\n};\n\nconst getFlashOffset = (weapon: number): Vec3 => {\n return FLASH_OFFSETS[weapon] || { x: 18, y: 16, z: 0 };\n};\n\nexport class ClientEffectSystem {\n private dlightManager: DynamicLightManager;\n private engine: EngineImports;\n private entityProvider: EntityProvider;\n private configStrings?: ClientConfigStrings;\n\n constructor(dlightManager: DynamicLightManager, engine: EngineImports, entityProvider: EntityProvider, configStrings?: ClientConfigStrings) {\n this.dlightManager = dlightManager;\n this.engine = engine;\n this.entityProvider = entityProvider;\n this.configStrings = configStrings;\n }\n\n // Helper to add dlight\n private addLight(key: number | undefined, origin: Vec3, color: Vec3, radius: number, minLight: number, die: number, radiusSpeed: number = 0) {\n this.dlightManager.addLight({\n key,\n origin: copyVec3(origin),\n color,\n intensity: radius,\n minLight,\n die: die,\n radiusSpeed\n }, 0);\n }\n\n private playSound(pos: Vec3 | null, ent: number, soundName: string, vol: number = 1.0, attn: number = 1.0) {\n if (!this.engine.audio) return;\n\n const index = this.engine.audio.soundindex(soundName);\n if (index === 0) return;\n\n if (pos) {\n this.engine.audio.positioned_sound(pos, index, vol, attn);\n } else {\n this.engine.audio.sound(ent, 0, index, vol, attn, 0);\n }\n }\n\n public onMuzzleFlash(entNum: number, weapon: number, time: number) {\n const ent = this.entityProvider.getEntity(entNum);\n if (!ent) return;\n\n const origin = { x: ent.origin.x, y: ent.origin.y, z: ent.origin.z };\n const angles = { x: ent.angles.x, y: ent.angles.y, z: ent.angles.z };\n\n const silenced = (weapon & 128) !== 0;\n weapon &= ~128;\n\n let flashOrigin = { ...origin };\n\n // Determine flash position based on weapon type offsets\n const vectors = angleVectors(angles);\n const offset = getFlashOffset(weapon);\n\n flashOrigin = vectorMA(flashOrigin, offset.x, vectors.forward);\n flashOrigin = vectorMA(flashOrigin, offset.y, vectors.right);\n flashOrigin = vectorMA(flashOrigin, offset.z, vectors.up);\n\n let radius = silenced ? 100 : 200;\n let duration = 0.1;\n let minLight = 32;\n let color: Vec3 = { x: 1, y: 1, z: 0 }; // Default yellow\n\n // Vary properties per weapon (Task: Duration and intensity per weapon)\n switch (weapon) {\n case MZ_BLASTER:\n radius = 150;\n color = { x: 1, y: 1, z: 0 };\n break;\n case MZ_MACHINEGUN:\n case MZ_CHAINGUN1:\n case MZ_CHAINGUN2:\n case MZ_CHAINGUN3:\n radius = 150;\n color = { x: 1, y: 1, z: 0 };\n break;\n case MZ_SHOTGUN:\n case MZ_SSHOTGUN:\n radius = 200;\n color = { x: 1, y: 1, z: 0 };\n break;\n case MZ_HYPERBLASTER:\n radius = 250;\n color = { x: 1, y: 1, z: 0 };\n break;\n case MZ_BLUEHYPERBLASTER:\n radius = 250;\n color = { x: 0, y: 0, z: 1 };\n break;\n case MZ_RAILGUN:\n radius = 150;\n color = { x: 0.5, y: 0.5, z: 1.0 };\n duration = 0.15; // Slightly longer for powerful shot\n break;\n case MZ_ROCKET:\n case MZ_GRENADE:\n radius = 300;\n color = { x: 1, y: 0.5, z: 0.2 };\n break;\n case MZ_BFG:\n radius = 400;\n color = { x: 0, y: 1, z: 0 };\n duration = 0.2; // BFG Flash lingers\n break;\n }\n\n if (silenced) radius *= 0.75;\n // Jitter radius\n if (Math.random() < 0.5) radius += Math.random() * 31;\n\n const die = time + duration;\n const volume = silenced ? 0.2 : 1.0;\n\n this.addLight(entNum, flashOrigin, color, radius, minLight, die);\n\n // Spawn particle muzzle flash if renderer is available\n if (this.engine.renderer && this.engine.renderer.particleSystem) {\n // Muzzle flash direction usually follows view angles or model forward\n // Here we use vectors.forward from entity angles\n spawnMuzzleFlash({\n system: this.engine.renderer.particleSystem,\n origin: flashOrigin,\n direction: vectors.forward\n });\n }\n\n let soundName = '';\n switch (weapon) {\n case MZ_BLASTER: soundName = \"weapons/blastf1a.wav\"; break;\n case MZ_SHOTGUN: soundName = \"weapons/shotgf1b.wav\"; break;\n case MZ_SSHOTGUN: soundName = \"weapons/sshotf1b.wav\"; break;\n case MZ_MACHINEGUN: soundName = `weapons/machgf${Math.floor(Math.random()*5)+1}b.wav`; break;\n case MZ_RAILGUN: soundName = \"weapons/railgf1a.wav\"; break;\n case MZ_ROCKET: soundName = \"weapons/rocklf1a.wav\"; break;\n case MZ_GRENADE: soundName = \"weapons/grenlf1a.wav\"; break;\n case MZ_BFG: soundName = \"weapons/bfg__f1y.wav\"; break;\n case MZ_HYPERBLASTER: soundName = \"weapons/hyprbf1a.wav\"; break;\n case MZ_BLUEHYPERBLASTER: soundName = \"weapons/hyprbf1a.wav\"; break;\n case MZ_CHAINGUN1:\n case MZ_CHAINGUN2:\n case MZ_CHAINGUN3:\n soundName = `weapons/machgf${Math.floor(Math.random()*5)+1}b.wav`;\n break;\n }\n\n if (soundName) {\n this.playSound(null, entNum, soundName, volume, 1.0);\n }\n }\n\n public onTempEntity(type: number, pos: Vec3, time: number, dir?: Vec3, pos2?: Vec3) {\n const particleSystem = this.engine.renderer?.particleSystem;\n\n switch (type) {\n case TempEntity.GUNSHOT:\n if (particleSystem) {\n spawnBulletImpact({\n system: particleSystem,\n origin: pos,\n normal: dir || { x: 0, y: 0, z: 1 }\n });\n }\n this.playSound(pos, 0, \"weapons/tink1.wav\"); // Generic hit sound, usually localized based on surface type in CL_ParseTEnt\n break;\n\n case TempEntity.BLOOD:\n if (particleSystem) {\n spawnBlood({\n system: particleSystem,\n origin: pos,\n direction: dir || { x: 0, y: 0, z: 1 }\n });\n }\n break;\n\n case TempEntity.EXPLOSION1:\n case TempEntity.EXPLOSION1_BIG:\n case TempEntity.EXPLOSION1_NP:\n case TempEntity.ROCKET_EXPLOSION:\n case TempEntity.GRENADE_EXPLOSION:\n case TempEntity.ROCKET_EXPLOSION_WATER:\n case TempEntity.GRENADE_EXPLOSION_WATER:\n {\n const color: Vec3 = { x: 1, y: 0.5, z: 0.2 };\n const duration = 0.5;\n const startRadius = 50;\n const endRadius = 400; // Expanding to 400\n // Speed = delta / duration = 350 / 0.5 = 700\n const speed = (endRadius - startRadius) / duration;\n\n this.addLight(undefined, pos, color, startRadius, 0, time + duration, speed);\n this.playSound(pos, 0, \"weapons/rocklx1a.wav\", 1.0, 0.5);\n\n if (particleSystem) {\n spawnExplosion({\n system: particleSystem,\n origin: pos\n });\n }\n }\n break;\n\n case TempEntity.BFG_EXPLOSION:\n case TempEntity.BFG_BIGEXPLOSION:\n {\n const color: Vec3 = { x: 0, y: 1, z: 0 };\n const duration = 0.5;\n const startRadius = 200;\n const endRadius = 500;\n const speed = (endRadius - startRadius) / duration;\n this.addLight(undefined, pos, color, startRadius, 0, time + duration, speed);\n this.playSound(pos, 0, \"weapons/bfg__x1b.wav\", 1.0, 0.5);\n\n if (particleSystem) {\n spawnBfgExplosion({\n system: particleSystem,\n origin: pos\n });\n }\n }\n break;\n\n case TempEntity.SPLASH:\n if (particleSystem) {\n spawnSplash({\n system: particleSystem,\n origin: pos,\n normal: dir || { x: 0, y: 0, z: 1 }\n });\n }\n this.playSound(pos, 0, \"world/splash.wav\"); // Or generic splash sound\n break;\n\n case TempEntity.STEAM:\n if (particleSystem) {\n spawnSteam({\n system: particleSystem,\n origin: pos\n });\n }\n break;\n\n case TempEntity.RAILTRAIL:\n if (particleSystem && pos2) {\n spawnRailTrail({\n system: particleSystem,\n start: pos,\n end: pos2\n });\n }\n break;\n\n case TempEntity.BLASTER:\n if (particleSystem) {\n spawnBlasterImpact({\n system: particleSystem,\n origin: pos,\n color: [1.0, 1.0, 0.0, 1.0] // Yellow\n });\n }\n this.playSound(pos, 0, \"weapons/lasthit.wav\"); // Adjust sound if needed\n break;\n\n case TempEntity.BLUEHYPERBLASTER:\n if (particleSystem) {\n spawnBlasterImpact({\n system: particleSystem,\n origin: pos,\n color: [0.0, 0.0, 1.0, 1.0] // Blue\n });\n }\n this.playSound(pos, 0, \"weapons/lasthit.wav\");\n break;\n\n case TempEntity.SPARKS:\n case TempEntity.BULLET_SPARKS:\n case TempEntity.WELDING_SPARKS:\n if (particleSystem) {\n spawnSparks({\n system: particleSystem,\n origin: pos,\n normal: dir || { x: 0, y: 0, z: 1 },\n count: 8,\n color: [1.0, 0.8, 0.2, 1.0]\n });\n }\n this.playSound(pos, 0, \"world/spark1.wav\"); // Or similar\n break;\n\n case TempEntity.SHIELD_SPARKS:\n case TempEntity.SCREEN_SPARKS:\n if (particleSystem) {\n spawnSparks({\n system: particleSystem,\n origin: pos,\n normal: dir || { x: 0, y: 0, z: 1 },\n count: 12,\n color: [0.5, 1.0, 0.5, 1.0] // Greenish for shield? Or classic spark color.\n });\n }\n this.playSound(pos, 0, \"world/spark2.wav\");\n break;\n }\n }\n}\n","import { PlayerState, PlayerStat, CONTENTS_LAVA, CONTENTS_SLIME, CONTENTS_WATER } from '@quake2ts/shared';\n\nexport interface BlendState {\n damageAlpha: number;\n bonusAlpha: number;\n lastFlashes: number;\n}\n\nexport const createBlendState = (): BlendState => ({\n damageAlpha: 0,\n bonusAlpha: 0,\n lastFlashes: 0\n});\n\nexport const updateBlend = (\n state: BlendState,\n ps: PlayerState,\n dt: number,\n damageIntensity: number = 0\n): [number, number, number, number] => {\n // Update damage alpha\n state.damageAlpha -= dt;\n if (state.damageAlpha < 0) state.damageAlpha = 0;\n\n if (damageIntensity > 0) {\n state.damageAlpha = damageIntensity;\n }\n\n // Update bonus alpha\n state.bonusAlpha -= dt;\n if (state.bonusAlpha < 0) state.bonusAlpha = 0;\n\n // Check for flashes (pickups)\n const flashes = ps.stats ? (ps.stats[PlayerStat.STAT_FLASHES] ?? 0) : 0;\n\n if (flashes !== state.lastFlashes) {\n state.bonusAlpha = 0.6;\n state.lastFlashes = flashes;\n }\n\n if (state.bonusAlpha > 0) {\n return [1, 1, 0, state.bonusAlpha * 0.3];\n } else if (state.damageAlpha > 0) {\n return [1, 0, 0, state.damageAlpha * 0.5];\n }\n\n // Underwater tints\n if (ps.waterLevel >= 3) {\n if (ps.watertype & CONTENTS_LAVA) {\n // Lava: Strong Orange/Red\n return [1.0, 0.3, 0.0, 0.6];\n } else if (ps.watertype & CONTENTS_SLIME) {\n // Slime: Sickly Green\n return [0.0, 0.1, 0.05, 0.6];\n } else {\n // Water: Brown/Gold tint matching Q2\n return [0.5, 0.3, 0.2, 0.4];\n }\n }\n\n return [0, 0, 0, 0];\n};\n","import { ConfigStringIndex, MAX_CLIENTS } from '@quake2ts/shared';\nimport { ClientConfigStrings } from './configStrings.js';\n\nexport interface ScoreboardEntry {\n name: string;\n frags: number;\n deaths: number;\n ping: number;\n id: number;\n skin?: string;\n model?: string;\n team?: string; // Team name or identifier (e.g. \"red\", \"blue\")\n}\n\nexport interface ScoreboardData {\n players: ScoreboardEntry[];\n mapName: string;\n}\n\nexport class ScoreboardManager {\n private configStrings: ClientConfigStrings;\n private localPlayerId: number = -1;\n private listeners: ((data: ScoreboardData) => void)[] = [];\n\n // Cache players to support stateful updates (e.g. scores)\n private players: Map<number, ScoreboardEntry> = new Map();\n\n constructor(configStrings: ClientConfigStrings) {\n this.configStrings = configStrings;\n this.refreshAll();\n }\n\n public setLocalPlayerId(id: number) {\n this.localPlayerId = id;\n }\n\n public addListener(listener: (data: ScoreboardData) => void) {\n this.listeners.push(listener);\n }\n\n public removeListener(listener: (data: ScoreboardData) => void) {\n const index = this.listeners.indexOf(listener);\n if (index !== -1) {\n this.listeners.splice(index, 1);\n }\n }\n\n public notifyUpdate() {\n const data = this.getScoreboard();\n for (const listener of this.listeners) {\n listener(data);\n }\n }\n\n private refreshAll() {\n this.players.clear();\n for (let i = 0; i < MAX_CLIENTS; i++) {\n const csIndex = ConfigStringIndex.PlayerSkins + i;\n const str = this.configStrings.get(csIndex);\n if (str && str.length > 0) {\n this.parseConfigString(csIndex, str);\n }\n }\n }\n\n public parseConfigString(index: number, str: string) {\n if (index < ConfigStringIndex.PlayerSkins || index >= ConfigStringIndex.PlayerSkins + MAX_CLIENTS) {\n return;\n }\n const id = index - ConfigStringIndex.PlayerSkins;\n\n // If string is empty, remove player\n if (!str || str.length === 0) {\n if (this.players.has(id)) {\n this.players.delete(id);\n }\n return;\n }\n\n const entry = this.parsePlayerConfigString(id, str);\n if (entry) {\n // Preserve existing scores if updating same player\n const existing = this.players.get(id);\n if (existing) {\n entry.frags = existing.frags;\n entry.deaths = existing.deaths;\n entry.ping = existing.ping;\n entry.team = existing.team;\n }\n this.players.set(id, entry);\n }\n }\n\n public getScoreboard(): ScoreboardData {\n const players = Array.from(this.players.values());\n\n // Sort by frags (descending)\n players.sort((a, b) => b.frags - a.frags);\n\n // Get map name (ConfigStringIndex.Name is server name, usually map name is in another CS or serverinfo)\n const worldModel = this.configStrings.getModelName(1);\n let mapName = 'unknown';\n if (worldModel) {\n // Extract map name from maps/foo.bsp\n const match = worldModel.match(/maps\\/(.*)\\.bsp/i);\n if (match) {\n mapName = match[1];\n } else {\n mapName = worldModel;\n }\n }\n\n return {\n players,\n mapName\n };\n }\n\n private parsePlayerConfigString(id: number, str: string): ScoreboardEntry | null {\n // Format: \\name\\Player\\skin\\male/grunt...\n const parts = str.split('\\\\');\n const info: Record<string, string> = {};\n\n // Skip empty first part if string starts with \\\n let startIndex = 0;\n if (parts.length > 0 && parts[0] === '') {\n startIndex = 1;\n }\n\n for (let i = startIndex; i < parts.length; i += 2) {\n if (i + 1 < parts.length) {\n const key = parts[i].toLowerCase();\n const value = parts[i + 1];\n info[key] = value;\n }\n }\n\n if (!info.name) {\n return null;\n }\n\n return {\n id,\n name: info.name,\n frags: 0,\n deaths: 0,\n ping: 0,\n skin: info.skin,\n model: info.model,\n team: undefined\n };\n }\n\n // Method to update scores explicitly\n public updateScore(id: number, frags: number, deaths: number, ping: number) {\n const player = this.players.get(id);\n if (player) {\n player.frags = frags;\n player.deaths = deaths;\n player.ping = ping;\n this.notifyUpdate();\n }\n }\n\n /**\n * Parses the layout string from svc_layout and updates player scores.\n * Expected format example:\n * xv 32 yv 32 string \"%4i %4i %-12.12s %4i\"\n * followed by values? No, the string command draws text.\n * In Q2, the layout message sends a series of drawing commands.\n * The server formats the string:\n * \"xv 32 yv %i string \\\"%4i %4i %-12.12s %4i\\\" \"\n * The client receives the formatting commands AND the string data.\n * Wait, svc_layout in Q2 sends a single string that the client parses and draws.\n * The string contains tokens.\n * Example:\n * \"xv 32 yv 32 string \\\" 10 50 PlayerName 10\\\"\"\n * We need to regex this.\n */\n public processScoreboardMessage(layout: string) {\n // Regex to find string commands\n // string \"text\"\n // text might contain quotes escaped? Q2 doesn't usually escape quotes inside the string command value like JSON.\n // It's usually `string \"content\"`\n // Content is: Frags Ping Name Time\n // %4i %4i %-12.12s %4i\n // Example: \" 12 50 Julian 10\"\n\n const stringCmdRegex = /string\\s+\"([^\"]+)\"/g;\n let match;\n\n // We need to match names to IDs. This is fuzzy if names are duplicates.\n // But it's the best we can do with standard Q2 layout.\n\n while ((match = stringCmdRegex.exec(layout)) !== null) {\n const content = match[1];\n\n // Check if this looks like a player row\n // It should have 3 numbers and a name?\n // Frags (int), Ping (int), Name (string), Time (int)\n // The name might contain spaces?\n // The format is fixed width usually.\n // \"%4i %4i %-12.12s %4i\"\n // Frags: 0-4 chars\n // Ping: 5-9 chars\n // Name: 10-22 chars (12 chars max)\n // Time: 23+ chars\n\n // Or we can try to split by whitespace, but name can have spaces?\n // Actually Q2 names can have spaces? I think they can.\n // But strict Q2 format uses fixed width for the name field in the scoreboard string.\n\n // Let's try to parse based on the known format.\n if (content.length > 20) {\n const fragsStr = content.substring(0, 4).trim();\n const pingStr = content.substring(5, 9).trim();\n const nameStr = content.substring(10, 22).trim();\n // const timeStr = content.substring(23, 27).trim();\n\n const frags = parseInt(fragsStr, 10);\n const ping = parseInt(pingStr, 10);\n\n if (!isNaN(frags) && !isNaN(ping) && nameStr.length > 0) {\n // Find player by name\n // We iterate all players to find a match\n for (const player of this.players.values()) {\n if (player.name === nameStr) {\n player.frags = frags;\n player.ping = ping;\n // Deaths are not in standard layout\n }\n }\n }\n }\n }\n this.notifyUpdate();\n }\n}\n","export interface ChatMessage {\n timestamp: number;\n sender?: string; // If undefined, it's a system message\n text: string;\n team: boolean;\n}\n\nexport class ChatManager {\n private history: ChatMessage[] = [];\n private maxHistory = 100;\n private listeners: ((sender: string, message: string, team: boolean) => void)[] = [];\n private sendCommand: (cmd: string) => void;\n\n constructor(sendCommand: (cmd: string) => void) {\n this.sendCommand = sendCommand;\n }\n\n public addListener(listener: (sender: string, message: string, team: boolean) => void) {\n this.listeners.push(listener);\n }\n\n public removeListener(listener: (sender: string, message: string, team: boolean) => void) {\n const index = this.listeners.indexOf(listener);\n if (index !== -1) {\n this.listeners.splice(index, 1);\n }\n }\n\n public sendChatMessage(message: string, team: boolean = false) {\n // Escape quotes and backslashes to prevent command injection\n const escaped = message.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n const cmd = team ? `say_team \"${escaped}\"` : `say \"${escaped}\"`;\n this.sendCommand(cmd);\n }\n\n public addMessage(level: number, text: string) {\n // Parse chat vs system message\n // Q2 Chat format: \"Name: message\"\n // Team Chat: \"(Name): message\" (Standard Q2 team chat format is often just Name: but sent to team only,\n // or (Name): ... depending on mod. Vanilla Q2 uses (Name): for team chat I believe.)\n\n // However, the `text` received in `onPrint` might be raw text.\n // We need to heuristic parsing.\n\n let sender: string | undefined;\n let content = text;\n let team = false;\n\n // Check for standard chat pattern \"Name: message\"\n // Be careful of system messages that might contain colon.\n // Names in Q2 can contain almost anything except quotes maybe?\n // And usually they don't contain newlines.\n\n // Regex for \"Name: message\"\n // We assume name is at start of string.\n const match = text.match(/^([^:]+):\\s(.*)$/);\n const teamMatch = text.match(/^\\(([^)]+)\\):\\s(.*)$/);\n\n if (teamMatch) {\n sender = teamMatch[1];\n content = teamMatch[2];\n team = true;\n } else if (match) {\n sender = match[1];\n content = match[2];\n team = false;\n }\n\n // Filter out common system messages that might look like chat?\n // \"print\" messages.\n // e.g. \"Connection accepted.\"\n\n const message: ChatMessage = {\n timestamp: Date.now(),\n sender,\n text: content,\n team\n };\n\n this.history.push(message);\n if (this.history.length > this.maxHistory) {\n this.history.shift();\n }\n\n if (sender) {\n this.notifyListeners(sender, content, team);\n }\n }\n\n public getHistory(): ChatMessage[] {\n return [...this.history];\n }\n\n private notifyListeners(sender: string, message: string, team: boolean) {\n for (const listener of this.listeners) {\n listener(sender, message, team);\n }\n }\n}\n","export type InputCode = string;\n\nexport interface BindingEntry {\n readonly code: InputCode;\n readonly command: string;\n}\n\nexport const DEFAULT_BINDINGS: readonly BindingEntry[] = [\n { code: 'KeyW', command: '+forward' },\n { code: 'ArrowUp', command: '+forward' },\n { code: 'KeyS', command: '+back' },\n { code: 'ArrowDown', command: '+back' },\n { code: 'KeyA', command: '+moveleft' },\n { code: 'KeyD', command: '+moveright' },\n { code: 'Space', command: '+jump' },\n { code: 'ControlLeft', command: '+crouch' },\n { code: 'ShiftLeft', command: '+speed' },\n { code: 'Mouse1', command: '+attack' },\n { code: 'Mouse2', command: '+use' },\n { code: 'Mouse3', command: '+zoom' },\n { code: 'ArrowLeft', command: '+left' },\n { code: 'ArrowRight', command: '+right' },\n { code: 'PageUp', command: '+lookup' },\n { code: 'PageDown', command: '+lookdown' },\n { code: 'Gamepad0-Button7', command: '+attack' },\n { code: 'Gamepad0-Button6', command: '+zoom' },\n { code: 'Gamepad0-Button0', command: '+jump' },\n { code: 'Gamepad0-Button1', command: '+crouch' },\n { code: 'Gamepad0-Button2', command: '+use' },\n { code: 'Gamepad0-Button4', command: 'prevweapon' },\n { code: 'Gamepad0-Button5', command: 'nextweapon' },\n { code: 'Digit1', command: 'weapon 1' },\n { code: 'Digit2', command: 'weapon 2' },\n { code: 'Digit3', command: 'weapon 3' },\n { code: 'Digit4', command: 'weapon 4' },\n { code: 'Digit5', command: 'weapon 5' },\n { code: 'Digit6', command: 'weapon 6' },\n { code: 'Digit7', command: 'weapon 7' },\n { code: 'Digit8', command: 'weapon 8' },\n { code: 'Digit9', command: 'weapon 9' },\n { code: 'Digit0', command: 'weapon 10' },\n];\n\nexport type BindingMap = ReadonlyMap<InputCode, string>;\n\nexport class InputBindings {\n private readonly bindings = new Map<InputCode, string>();\n\n constructor(entries: Iterable<BindingEntry> = DEFAULT_BINDINGS) {\n for (const entry of entries) {\n this.bind(entry.code, entry.command);\n }\n }\n\n bind(code: InputCode, command: string): void {\n this.bindings.set(code, command);\n }\n\n unbind(code: InputCode): void {\n this.bindings.delete(code);\n }\n\n getBinding(code: InputCode): string | undefined {\n return this.bindings.get(code);\n }\n\n getBoundKeys(command: string): InputCode[] {\n const normalizedCommand = normalizeCommand(command);\n const keys: InputCode[] = [];\n for (const [code, cmd] of this.bindings) {\n if (cmd === normalizedCommand) {\n keys.push(code);\n }\n }\n return keys;\n }\n\n entries(): BindingMap {\n return new Map(this.bindings.entries());\n }\n}\n\nexport function createDefaultBindings(): InputBindings {\n return new InputBindings();\n}\n\nexport function normalizeInputCode(code: string): InputCode {\n return code;\n}\n\nexport function normalizeCommand(command: string): string {\n return command.trim().toLowerCase();\n}\n","import {\n DEFAULT_FORWARD_SPEED,\n DEFAULT_MOUSE_SENSITIVITY,\n DEFAULT_PITCH_SPEED,\n DEFAULT_SIDE_SPEED,\n DEFAULT_UP_SPEED,\n DEFAULT_YAW_SPEED,\n PlayerButton,\n addViewAngles,\n mouseDeltaToViewDelta,\n type MouseDelta,\n type UserCommand,\n type Vec3,\n} from '@quake2ts/shared';\nimport { InputBindings, normalizeCommand, normalizeInputCode, type InputCode } from './bindings.js';\n\nconst MSEC_MAX = 250;\n\nexport interface GamepadLikeButton {\n readonly pressed: boolean;\n readonly value: number;\n}\n\nexport interface GamepadLike {\n readonly axes: readonly number[];\n readonly buttons: readonly GamepadLikeButton[];\n readonly index?: number;\n readonly connected?: boolean;\n}\n\ninterface ButtonState {\n readonly active: boolean;\n readonly wasPressed: boolean;\n readonly fraction: number;\n}\n\nexport interface TouchInputState {\n readonly move?: { readonly x: number; readonly y: number };\n readonly look?: { readonly x: number; readonly y: number };\n readonly buttons?: Partial<Record<InputAction, boolean>>;\n}\n\nexport interface InputSource {\n on(event: 'keydown', handler: (code: string) => void): void;\n on(event: 'keyup', handler: (code: string) => void): void;\n on(event: 'mousedown', handler: (button: number) => void): void;\n on(event: 'mouseup', handler: (button: number) => void): void;\n on(event: 'mousemove', handler: (dx: number, dy: number) => void): void;\n}\n\nclass KeyButton {\n private readonly activeCodes = new Set<InputCode>();\n private downTime = 0;\n private msec = 0;\n private pressed = false;\n\n press(code: InputCode, now: number): boolean {\n if (this.activeCodes.has(code)) return false;\n\n this.activeCodes.add(code);\n this.pressed = true;\n if (this.activeCodes.size === 1) {\n this.downTime = now;\n return true;\n }\n\n return false;\n }\n\n release(code: InputCode, now: number): boolean {\n if (!this.activeCodes.delete(code)) return false;\n\n if (this.activeCodes.size === 0) {\n this.msec += now - this.downTime;\n this.downTime = 0;\n return true;\n }\n\n return false;\n }\n\n sample(frameMsec: number, now: number): ButtonState {\n if (frameMsec <= 0) {\n return { active: this.activeCodes.size > 0, wasPressed: this.pressed, fraction: 0 };\n }\n\n let total = this.msec;\n\n if (this.activeCodes.size > 0) {\n total += now - this.downTime;\n this.downTime = now;\n }\n\n this.msec = 0;\n\n const fraction = Math.min(total / frameMsec, 1);\n const wasPressed = this.pressed;\n this.pressed = false;\n\n return { active: this.activeCodes.size > 0, wasPressed, fraction };\n }\n}\n\nexport interface InputControllerOptions {\n readonly forwardSpeed?: number;\n readonly sideSpeed?: number;\n readonly upSpeed?: number;\n readonly yawSpeed?: number;\n readonly pitchSpeed?: number;\n readonly sensitivity?: number;\n readonly sensitivityX?: number;\n readonly sensitivityY?: number;\n readonly invertMouseY?: boolean;\n readonly runByDefault?: boolean;\n readonly requirePointerLock?: boolean;\n readonly jumpAddsUpMove?: boolean;\n readonly crouchAddsDownMove?: boolean;\n readonly mouseFilter?: boolean;\n readonly getGamepads?: () => readonly (GamepadLike | null | undefined)[];\n readonly gamepadDeadZone?: number;\n readonly gamepadLookScale?: number;\n readonly invertGamepadY?: boolean;\n}\n\nexport enum InputAction {\n Forward = '+forward',\n Back = '+back',\n MoveLeft = '+moveleft',\n MoveRight = '+moveright',\n MoveUp = '+moveup',\n MoveDown = '+movedown',\n Jump = '+jump',\n Crouch = '+crouch',\n Attack = '+attack',\n Use = '+use',\n Holster = '+holster',\n TurnLeft = '+left',\n TurnRight = '+right',\n LookUp = '+lookup',\n LookDown = '+lookdown',\n SpeedModifier = '+speed',\n Zoom = '+zoom',\n}\n\nconst BUTTON_ACTIONS: Partial<Record<InputAction, PlayerButton>> = {\n [InputAction.Attack]: PlayerButton.Attack,\n [InputAction.Use]: PlayerButton.Use,\n [InputAction.Holster]: PlayerButton.Holster,\n [InputAction.Jump]: PlayerButton.Jump,\n [InputAction.Crouch]: PlayerButton.Crouch,\n};\n\nconst ACTION_LOOKUP = new Map<string, InputAction>(\n Object.values(InputAction).map((action) => [normalizeCommand(action), action]),\n);\n\nfunction commandToAction(command: string): InputAction | undefined {\n return ACTION_LOOKUP.get(normalizeCommand(command));\n}\n\nfunction nowMs(): number {\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n return performance.now();\n }\n\n return Date.now();\n}\n\nexport class InputController {\n private readonly bindings: InputBindings;\n private readonly buttons = new Map<InputAction, KeyButton>();\n private viewAngles: Vec3 = { x: 0, y: 0, z: 0 };\n private pointerLocked = false;\n private mouseDelta: MouseDelta = { deltaX: 0, deltaY: 0 };\n private previousMouseDelta: MouseDelta = { deltaX: 0, deltaY: 0 };\n private anyPressed = false;\n private commandQueue: string[] = [];\n private pendingGamepads: readonly (GamepadLike | null | undefined)[] | undefined;\n private readonly gamepadButtons = new Map<string, boolean>();\n private gamepadMove = { x: 0, y: 0 };\n private gamepadLook = { x: 0, y: 0 };\n private pendingTouchState: TouchInputState | undefined;\n private readonly touchButtons = new Map<InputAction, boolean>();\n private touchMove = { x: 0, y: 0 };\n private touchLook = { x: 0, y: 0 };\n\n private readonly forwardSpeed: number;\n private readonly sideSpeed: number;\n private readonly upSpeed: number;\n private readonly yawSpeed: number;\n private readonly pitchSpeed: number;\n private readonly sensitivity: number;\n private readonly sensitivityX?: number;\n private readonly sensitivityY?: number;\n private readonly invertMouseY: boolean;\n private readonly runByDefault: boolean;\n private readonly requirePointerLock: boolean;\n private readonly jumpAddsUpMove: boolean;\n private readonly crouchAddsDownMove: boolean;\n private readonly mouseFilter: boolean;\n private readonly getGamepads?: () => readonly (GamepadLike | null | undefined)[];\n private readonly gamepadDeadZone: number;\n private readonly gamepadLookScale: number;\n private readonly invertGamepadY: boolean;\n\n private sequence = 0;\n private impulse = 0;\n\n public onInputCommand?: (cmd: UserCommand) => void;\n\n constructor(options: InputControllerOptions = {}, bindings = new InputBindings()) {\n this.bindings = bindings;\n this.forwardSpeed = options.forwardSpeed ?? DEFAULT_FORWARD_SPEED;\n this.sideSpeed = options.sideSpeed ?? DEFAULT_SIDE_SPEED;\n this.upSpeed = options.upSpeed ?? DEFAULT_UP_SPEED;\n this.yawSpeed = options.yawSpeed ?? DEFAULT_YAW_SPEED;\n this.pitchSpeed = options.pitchSpeed ?? DEFAULT_PITCH_SPEED;\n this.sensitivity = options.sensitivity ?? DEFAULT_MOUSE_SENSITIVITY;\n this.sensitivityX = options.sensitivityX;\n this.sensitivityY = options.sensitivityY;\n this.invertMouseY = options.invertMouseY ?? false;\n this.runByDefault = options.runByDefault ?? true;\n this.requirePointerLock = options.requirePointerLock ?? true;\n this.jumpAddsUpMove = options.jumpAddsUpMove ?? true;\n this.crouchAddsDownMove = options.crouchAddsDownMove ?? true;\n this.mouseFilter = options.mouseFilter ?? false;\n this.getGamepads = options.getGamepads;\n this.gamepadDeadZone = options.gamepadDeadZone ?? 0.15;\n this.gamepadLookScale = options.gamepadLookScale ?? 1;\n this.invertGamepadY = options.invertGamepadY ?? this.invertMouseY;\n }\n\n handleKeyDown(code: string, eventTimeMs: number = nowMs()): void {\n const normalized = normalizeInputCode(code);\n const binding = this.bindings.getBinding(normalized);\n if (!binding) return;\n\n this.applyCommand(binding, true, normalized, eventTimeMs);\n }\n\n handleKeyUp(code: string, eventTimeMs: number = nowMs()): void {\n const normalized = normalizeInputCode(code);\n const binding = this.bindings.getBinding(normalized);\n if (!binding) return;\n\n this.applyCommand(binding, false, normalized, eventTimeMs);\n }\n\n handleMouseButtonDown(button: number, eventTimeMs: number = nowMs()): void {\n const code = this.mouseButtonToCode(button);\n this.applyCommand(this.mouseButtonToCommand(code), true, code, eventTimeMs);\n }\n\n handleMouseButtonUp(button: number, eventTimeMs: number = nowMs()): void {\n const code = this.mouseButtonToCode(button);\n this.applyCommand(this.mouseButtonToCommand(code), false, code, eventTimeMs);\n }\n\n handleMouseMove(deltaX: number, deltaY: number): void {\n if (this.requirePointerLock && !this.pointerLocked) return;\n\n this.mouseDelta = {\n deltaX: this.mouseDelta.deltaX + deltaX,\n deltaY: this.mouseDelta.deltaY + deltaY,\n };\n }\n\n setPointerLocked(locked: boolean): void {\n this.pointerLocked = locked;\n }\n\n setGamepadState(gamepads: readonly (GamepadLike | null | undefined)[]): void {\n this.pendingGamepads = gamepads;\n }\n\n setTouchState(state: TouchInputState): void {\n this.pendingTouchState = state;\n }\n\n bindInputSource(source: InputSource): void {\n source.on('keydown', (code) => this.handleKeyDown(code));\n source.on('keyup', (code) => this.handleKeyUp(code));\n source.on('mousedown', (button) => this.handleMouseButtonDown(button));\n source.on('mouseup', (button) => this.handleMouseButtonUp(button));\n source.on('mousemove', (dx, dy) => this.handleMouseMove(dx, dy));\n }\n\n setKeyBinding(action: string, keys: string[]): void {\n const normalizedAction = normalizeCommand(action);\n for (const key of keys) {\n this.bindings.bind(normalizeInputCode(key), normalizedAction);\n }\n }\n\n getBoundKeys(command: string): InputCode[] {\n return this.bindings.getBoundKeys(command);\n }\n\n getDefaultBindings(): InputBindings {\n return this.bindings;\n }\n\n buildCommand(frameMsec: number, now: number = nowMs(), serverFrame?: number): UserCommand {\n this.pollGamepads(now);\n this.applyTouchState(now);\n\n const yawStep = (this.yawSpeed * frameMsec) / 1000;\n const pitchStep = (this.pitchSpeed * frameMsec) / 1000;\n\n const turnLeft = this.sample(InputAction.TurnLeft, frameMsec, now);\n const turnRight = this.sample(InputAction.TurnRight, frameMsec, now);\n const lookUp = this.sample(InputAction.LookUp, frameMsec, now);\n const lookDown = this.sample(InputAction.LookDown, frameMsec, now);\n\n let viewDelta: Vec3 = {\n x: (lookDown.fraction - lookUp.fraction) * pitchStep,\n y: (turnRight.fraction - turnLeft.fraction) * yawStep,\n z: 0,\n };\n\n if (this.gamepadLook.x !== 0 || this.gamepadLook.y !== 0) {\n const pitch = this.gamepadLook.y * (this.invertGamepadY ? -1 : 1);\n viewDelta = {\n x: viewDelta.x + pitch * pitchStep * this.gamepadLookScale,\n y: viewDelta.y + this.gamepadLook.x * yawStep * this.gamepadLookScale,\n z: 0,\n };\n }\n\n if (this.touchLook.x !== 0 || this.touchLook.y !== 0) {\n const pitch = this.touchLook.y * (this.invertMouseY ? -1 : 1);\n viewDelta = {\n x: viewDelta.x + pitch * pitchStep,\n y: viewDelta.y + this.touchLook.x * yawStep,\n z: 0,\n };\n }\n\n if (this.pointerLocked || !this.requirePointerLock) {\n const sampledDelta = this.sampleMouseDelta();\n const mouseDelta = mouseDeltaToViewDelta(sampledDelta, {\n sensitivity: this.sensitivity,\n sensitivityX: this.sensitivityX,\n sensitivityY: this.sensitivityY,\n invertY: this.invertMouseY,\n });\n viewDelta = {\n x: viewDelta.x + mouseDelta.x,\n y: viewDelta.y + mouseDelta.y,\n z: 0,\n };\n }\n\n const angles = addViewAngles(this.viewAngles, viewDelta);\n this.viewAngles = angles;\n\n const forward = this.sample(InputAction.Forward, frameMsec, now);\n const back = this.sample(InputAction.Back, frameMsec, now);\n const moveLeft = this.sample(InputAction.MoveLeft, frameMsec, now);\n const moveRight = this.sample(InputAction.MoveRight, frameMsec, now);\n const moveUp = this.sample(InputAction.MoveUp, frameMsec, now);\n const moveDown = this.sample(InputAction.MoveDown, frameMsec, now);\n const speed = this.sample(InputAction.SpeedModifier, frameMsec, now);\n const jump = this.sample(InputAction.Jump, frameMsec, now);\n const crouch = this.sample(InputAction.Crouch, frameMsec, now);\n\n const speedScale = this.runByDefault\n ? speed.active\n ? 0.5\n : 1\n : speed.active\n ? 1\n : 0.5;\n\n let forwardmove = this.forwardSpeed * (forward.fraction - back.fraction) * speedScale;\n let sidemove = this.sideSpeed * (moveRight.fraction - moveLeft.fraction) * speedScale;\n let upmove = this.upSpeed * (moveUp.fraction - moveDown.fraction);\n\n if (this.gamepadMove.x !== 0 || this.gamepadMove.y !== 0) {\n forwardmove += this.forwardSpeed * this.gamepadMove.y * speedScale;\n sidemove += this.sideSpeed * this.gamepadMove.x * speedScale;\n }\n\n if (this.touchMove.x !== 0 || this.touchMove.y !== 0) {\n forwardmove += this.forwardSpeed * this.touchMove.y * speedScale;\n sidemove += this.sideSpeed * this.touchMove.x * speedScale;\n }\n\n if (this.jumpAddsUpMove && jump.fraction > 0) {\n upmove += this.upSpeed * jump.fraction;\n }\n\n if (this.crouchAddsDownMove && crouch.fraction > 0) {\n upmove -= this.upSpeed * crouch.fraction;\n }\n\n forwardmove = this.clampMove(forwardmove, this.forwardSpeed);\n sidemove = this.clampMove(sidemove, this.sideSpeed);\n upmove = this.clampMove(upmove, this.upSpeed);\n\n let buttons = this.collectButtonBits(frameMsec, now);\n\n const msec = Math.min(Math.max(Math.round(frameMsec), 1), MSEC_MAX);\n\n if (this.anyPressed || buttons !== PlayerButton.None) {\n buttons |= PlayerButton.Any;\n }\n\n this.anyPressed = false;\n\n // Command sequence number (client-side generated)\n this.sequence++;\n\n const command = {\n msec,\n buttons,\n angles: { ...this.viewAngles },\n forwardmove,\n sidemove,\n upmove,\n serverFrame,\n sequence: this.sequence,\n lightlevel: 0,\n impulse: this.impulse,\n } satisfies UserCommand;\n\n this.impulse = 0;\n\n if (this.onInputCommand) {\n this.onInputCommand(command);\n }\n\n return command;\n }\n\n consumeConsoleCommands(): readonly string[] {\n const commands = this.commandQueue;\n this.commandQueue = [];\n return commands;\n }\n\n private pollGamepads(now: number): void {\n const gamepads = this.getGamepads?.() ?? this.pendingGamepads ?? [];\n this.pendingGamepads = undefined;\n\n this.gamepadMove = { x: 0, y: 0 };\n this.gamepadLook = { x: 0, y: 0 };\n\n const pressedThisFrame = new Set<InputCode>();\n\n for (const pad of gamepads) {\n if (!pad || pad.connected === false) continue;\n\n const index = pad.index ?? 0;\n const axes = pad.axes ?? [];\n\n this.gamepadMove = {\n x: this.mergeAnalog(this.gamepadMove.x, this.applyDeadZone(axes[0] ?? 0)),\n y: this.mergeAnalog(this.gamepadMove.y, -this.applyDeadZone(axes[1] ?? 0)),\n };\n\n this.gamepadLook = {\n x: this.mergeAnalog(this.gamepadLook.x, this.applyDeadZone(axes[2] ?? 0)),\n y: this.mergeAnalog(this.gamepadLook.y, this.applyDeadZone(axes[3] ?? 0)),\n };\n\n const buttons = pad.buttons ?? [];\n for (let i = 0; i < buttons.length; i++) {\n const button = buttons[i];\n if (!button) continue;\n\n const pressed = button.pressed || button.value > this.gamepadDeadZone;\n const code = this.gamepadButtonCode(index, i);\n if (pressed) pressedThisFrame.add(code);\n\n const wasPressed = this.gamepadButtons.get(code) ?? false;\n if (pressed !== wasPressed) {\n this.applyCommand(this.bindings.getBinding(code), pressed, code, now);\n this.gamepadButtons.set(code, pressed);\n }\n }\n }\n\n for (const [code, wasPressed] of this.gamepadButtons.entries()) {\n if (wasPressed && !pressedThisFrame.has(code)) {\n this.applyCommand(this.bindings.getBinding(code), false, code, now);\n this.gamepadButtons.set(code, false);\n }\n }\n }\n\n private applyTouchState(now: number): void {\n const state = this.pendingTouchState;\n if (!state) return;\n\n this.pendingTouchState = undefined;\n\n if (state.move) {\n this.touchMove = {\n x: this.clampAnalog(state.move.x),\n y: this.clampAnalog(state.move.y),\n };\n }\n\n if (state.look) {\n this.touchLook = {\n x: this.clampAnalog(state.look.x),\n y: this.clampAnalog(state.look.y),\n };\n }\n\n if (state.buttons) {\n for (const [action, pressed] of Object.entries(state.buttons) as Array<\n [InputAction, boolean | undefined]\n >) {\n if (pressed === undefined) continue;\n\n const wasPressed = this.touchButtons.get(action) ?? false;\n if (pressed !== wasPressed) {\n this.applyCommand(action, pressed, this.touchButtonCode(action), now);\n this.touchButtons.set(action, pressed);\n }\n }\n }\n }\n\n private applyCommand(\n command: string | undefined,\n isDown: boolean,\n code: InputCode,\n eventTimeMs: number,\n ): void {\n if (!command) return;\n\n const action = commandToAction(command);\n if (action) {\n const button = this.lookupButton(action);\n if (isDown) {\n if (button.press(code, eventTimeMs)) {\n this.commandQueue.push(action);\n }\n this.anyPressed = true;\n } else if (button.release(code, eventTimeMs)) {\n this.commandQueue.push(action.replace('+', '-'));\n }\n } else if (isDown) {\n if (command.startsWith('impulse ')) {\n const parts = command.split(' ');\n if (parts.length > 1) {\n const val = parseInt(parts[1], 10);\n if (!isNaN(val)) {\n this.impulse = Math.max(0, Math.min(255, val));\n }\n }\n } else {\n this.commandQueue.push(command);\n }\n }\n }\n\n private sampleMouseDelta(): MouseDelta {\n const delta = this.mouseDelta;\n this.mouseDelta = { deltaX: 0, deltaY: 0 };\n\n if (!this.mouseFilter) {\n this.previousMouseDelta = delta;\n return delta;\n }\n\n const filtered = {\n deltaX: (delta.deltaX + this.previousMouseDelta.deltaX) * 0.5,\n deltaY: (delta.deltaY + this.previousMouseDelta.deltaY) * 0.5,\n } satisfies MouseDelta;\n\n this.previousMouseDelta = delta;\n return filtered;\n }\n\n private collectButtonBits(frameMsec: number, now: number): PlayerButton {\n let buttons = PlayerButton.None;\n\n for (const [action, bit] of Object.entries(BUTTON_ACTIONS) as Array<\n [InputAction, PlayerButton]\n >) {\n const sample = this.sample(action, frameMsec, now);\n if (sample.fraction > 0 || sample.active || sample.wasPressed) {\n buttons |= bit;\n }\n }\n\n return buttons;\n }\n\n private lookupButton(action: InputAction): KeyButton {\n let button = this.buttons.get(action);\n if (!button) {\n button = new KeyButton();\n this.buttons.set(action, button);\n }\n return button;\n }\n\n private mouseButtonToCode(button: number): InputCode {\n if (button === 0) return 'Mouse1';\n if (button === 1) return 'Mouse3';\n if (button === 2) return 'Mouse2';\n return `Mouse${button + 1}`;\n }\n\n private mouseButtonToCommand(code: InputCode): string | undefined {\n return this.bindings.getBinding(code);\n }\n\n private sample(action: InputAction, frameMsec: number, now: number): ButtonState {\n const button = this.lookupButton(action);\n return button.sample(frameMsec, now);\n }\n\n private gamepadButtonCode(index: number, button: number): InputCode {\n return `Gamepad${index}-Button${button}`;\n }\n\n private touchButtonCode(action: InputAction): InputCode {\n return `Touch-${action}`;\n }\n\n private clampAnalog(value: number): number {\n return Math.max(-1, Math.min(1, value));\n }\n\n private applyDeadZone(value: number): number {\n return Math.abs(value) < this.gamepadDeadZone ? 0 : value;\n }\n\n private mergeAnalog(current: number, incoming: number): number {\n return Math.abs(incoming) > Math.abs(current) ? incoming : current;\n }\n\n private clampMove(value: number, max: number): number {\n return Math.max(-max, Math.min(max, value));\n }\n}\n","import type { UserCommand } from '@quake2ts/shared';\nimport { InputController, type InputControllerOptions } from './controller.js';\n\nexport interface QueuedFrameCommands {\n readonly command: UserCommand;\n readonly console: readonly string[];\n}\n\nexport class InputCommandBuffer {\n private readonly controller: InputController;\n private readonly queued: QueuedFrameCommands[] = [];\n\n constructor(options?: InputControllerOptions, controller = new InputController(options)) {\n this.controller = controller;\n }\n\n captureFrame(frameMsec: number, now?: number, serverFrame?: number): QueuedFrameCommands {\n const command = this.controller.buildCommand(frameMsec, now, serverFrame);\n const console = this.controller.consumeConsoleCommands();\n const entry: QueuedFrameCommands = { command, console };\n this.queued.push(entry);\n return entry;\n }\n\n consumeQueued(): readonly QueuedFrameCommands[] {\n const queued = [...this.queued];\n this.queued.length = 0;\n return queued;\n }\n\n getController(): InputController {\n return this.controller;\n }\n}\n","import { ClientExports, createClient, ClientImports, InputController, InputSource, InputBindings, HudData, StatusBarData, CrosshairInfo } from './index.js';\nimport { MenuState } from './ui/menu/types.js';\nimport { createGame, GameExports, GameSaveFile, GameCreateOptions, GameEngine, SaveStorage, SaveSlotMetadata, SaveCreationOptions } from '@quake2ts/game';\nimport { EngineImports, Renderer, EngineHost, TraceResult } from '@quake2ts/engine';\nimport { UserCommand, Vec3, CollisionPlane, PlayerState } from '@quake2ts/shared';\n\nexport interface SessionOptions {\n mapName?: string;\n skill?: number;\n renderMode?: string;\n audioEnabled?: boolean;\n engine: EngineImports & { renderer: Renderer; cmd?: { executeText(text: string): void } };\n}\n\nexport interface SaveMetadata {\n timestamp: number;\n mapName: string;\n playtimeSeconds: number;\n difficulty: number;\n}\n\nexport class GameSession {\n private client: ClientExports | null = null;\n private game: GameExports | null = null;\n private engine: EngineImports & { renderer: Renderer; cmd?: { executeText(text: string): void } };\n private host: EngineHost | null = null;\n private options: SessionOptions;\n private currentMapName: string = '';\n private inputController: InputController;\n private saveStorage: SaveStorage;\n private _onInputCommand?: (cmd: UserCommand) => void;\n private _onHudUpdate?: (data: HudData) => void;\n private _onCenterPrint?: (message: string, duration: number) => void;\n private _onNotify?: (message: string) => void;\n private _onPickupMessage?: (item: string) => void;\n private _onObituaryMessage?: (message: string) => void;\n private _onMenuStateChange?: (active: boolean) => void;\n private _onLoadComplete?: () => void;\n private _onLoadError?: (error: Error) => void;\n\n constructor(options: SessionOptions) {\n this.options = options;\n this.engine = options.engine;\n this.inputController = new InputController();\n this.saveStorage = new SaveStorage();\n }\n\n public startNewGame(mapName: string, skill: number = 1): void {\n if (this.host) {\n this.shutdown();\n }\n\n this.currentMapName = mapName;\n\n const gameOptions: GameCreateOptions = {\n gravity: { x: 0, y: 0, z: -800 }, // Default gravity\n skill: skill,\n deathmatch: false, // Single player default\n coop: false\n };\n\n const gameEngineAdapter: GameEngine = {\n trace: (start: Vec3, end: Vec3) => {\n return this.engine.trace(start, end);\n },\n centerprintf: (ent, msg) => {\n if (this.client) {\n this.client.ParseCenterPrint(msg);\n }\n },\n configstring: (idx, val) => {\n if (this.client) {\n this.client.ParseConfigString(idx, val);\n }\n },\n multicast: () => {},\n unicast: () => {},\n serverCommand: () => {},\n };\n\n const gameImports = {\n trace: (start: Vec3, mins: Vec3 | null, maxs: Vec3 | null, end: Vec3, passent: any, contentmask: number) => {\n const tr = this.engine.trace(start, end, mins || undefined, maxs || undefined);\n\n let plane: CollisionPlane | null = null;\n if (tr.planeNormal) {\n plane = {\n normal: tr.planeNormal,\n dist: 0, // Unknown distance\n type: 0, // Unknown type\n signbits: 0, // Unknown\n };\n }\n\n return {\n allsolid: tr.allsolid,\n startsolid: tr.startsolid,\n fraction: tr.fraction,\n endpos: tr.endpos,\n plane: plane,\n surfaceFlags: tr.surfaceFlags ?? 0,\n contents: tr.contents ?? 0,\n ent: null\n };\n },\n pointcontents: (p: Vec3) => {\n const t = this.engine.trace(p, p, undefined, undefined);\n return t.contents || 0;\n },\n multicast: () => {},\n unicast: () => {},\n configstring: (idx: number, val: string) => {\n if (this.client) {\n this.client.ParseConfigString(idx, val);\n }\n },\n serverCommand: (cmd: string) => {}\n };\n\n this.game = createGame(gameImports, gameEngineAdapter, gameOptions);\n\n const clientProxy: any = {\n init: (initial: any) => this.client?.init(initial),\n render: (sample: any) => this.client?.render(sample),\n shutdown: () => this.client?.shutdown(),\n get camera() { return this.client?.camera; }\n };\n\n this.host = new EngineHost(this.game, clientProxy);\n\n const clientImports: ClientImports = {\n engine: this.engine,\n host: this.host,\n inputController: this.inputController\n };\n\n this.client = createClient(clientImports);\n if (this._onInputCommand) {\n this.client.onInputCommand = this._onInputCommand;\n }\n if (this._onHudUpdate) {\n this.client.onHudUpdate = this._onHudUpdate;\n }\n this.client.onCenterPrint = this._onCenterPrint;\n this.client.onNotify = this._onNotify;\n this.client.onPickupMessage = this._onPickupMessage;\n this.client.onObituaryMessage = this._onObituaryMessage;\n this.client.onMenuStateChange = this._onMenuStateChange;\n\n this.game.spawnWorld();\n\n this.host.start();\n\n if (this.engine.cmd) {\n this.engine.cmd.executeText(`map ${mapName}`);\n } else if (this.host.commands) {\n this.host.commands.execute(`map ${mapName}`);\n }\n }\n\n // 4.3.1 Save Game API\n public async saveGame(slotName: string): Promise<GameSaveFile> {\n if (!this.game) {\n throw new Error(\"Game not running\");\n }\n\n // TODO: Track total playtime across levels\n const playtime = this.game.time;\n const difficulty = this.game.skill;\n const mapName = this.getMapName();\n\n const saveData = this.game.createSave(mapName, difficulty, playtime);\n\n await this.saveStorage.save(slotName, saveData);\n\n return saveData;\n }\n\n public getSaveMetadata(saveData: GameSaveFile): SaveMetadata {\n return {\n timestamp: saveData.timestamp,\n mapName: saveData.map,\n playtimeSeconds: saveData.playtimeSeconds,\n difficulty: saveData.difficulty\n };\n }\n\n // 4.3.2 Load Game API\n public async loadGame(saveData: GameSaveFile): Promise<void> {\n try {\n this.loadSavedGame(saveData);\n if (this._onLoadComplete) {\n this._onLoadComplete();\n }\n } catch (e: any) {\n if (this._onLoadError) {\n this._onLoadError(e);\n }\n throw e;\n }\n }\n\n public set onLoadComplete(handler: (() => void) | undefined) {\n this._onLoadComplete = handler;\n }\n\n public get onLoadComplete(): (() => void) | undefined {\n return this._onLoadComplete;\n }\n\n public set onLoadError(handler: ((error: Error) => void) | undefined) {\n this._onLoadError = handler;\n }\n\n public get onLoadError(): ((error: Error) => void) | undefined {\n return this._onLoadError;\n }\n\n // 4.3.3 Quick Save/Load\n public async quickSave(): Promise<void> {\n if (!this.game) {\n throw new Error(\"Game not running\");\n }\n const playtime = this.game.time;\n const difficulty = this.game.skill;\n const mapName = this.getMapName();\n const saveData = this.game.createSave(mapName, difficulty, playtime);\n\n await this.saveStorage.quickSave(saveData);\n }\n\n public async quickLoad(): Promise<void> {\n try {\n const saveData = await this.saveStorage.quickLoad();\n this.loadSavedGame(saveData);\n if (this._onLoadComplete) {\n this._onLoadComplete();\n }\n } catch (e: any) {\n // If quick load fails (e.g. no file), we should propagate or handle\n if (this._onLoadError) {\n this._onLoadError(e);\n }\n throw e;\n }\n }\n\n public async hasQuickSave(): Promise<boolean> {\n const saves = await this.saveStorage.list();\n // SaveStorage uses 'quicksave' as the ID for quick saves (defined in SaveStorage class but private/static)\n // We can check if any save has the ID 'quicksave' or name 'Quick Save'\n // The implementation of SaveStorage.quickSave uses SaveStorage.QUICK_SLOT = 'quicksave'.\n return saves.some(s => s.id === 'quicksave');\n }\n\n public loadSavedGame(saveData: GameSaveFile): void {\n if (this.host) {\n this.shutdown();\n }\n\n const mapName = saveData.map;\n this.currentMapName = mapName;\n const skill = saveData.difficulty;\n\n const gameOptions: GameCreateOptions = {\n gravity: { x: 0, y: 0, z: -800 },\n skill: skill,\n deathmatch: false,\n coop: false\n };\n\n const gameEngineAdapter: GameEngine = {\n trace: (start: Vec3, end: Vec3) => {\n return this.engine.trace(start, end);\n },\n centerprintf: (ent, msg) => {\n if (this.client) {\n this.client.ParseCenterPrint(msg);\n }\n },\n configstring: (idx, val) => {\n if (this.client) {\n this.client.ParseConfigString(idx, val);\n }\n },\n multicast: () => {},\n unicast: () => {},\n serverCommand: () => {},\n };\n\n const gameImports = {\n trace: (start: Vec3, mins: Vec3 | null, maxs: Vec3 | null, end: Vec3, passent: any, contentmask: number) => {\n const tr = this.engine.trace(start, end, mins || undefined, maxs || undefined);\n let plane: CollisionPlane | null = null;\n if (tr.planeNormal) {\n plane = {\n normal: tr.planeNormal,\n dist: 0,\n type: 0,\n signbits: 0,\n };\n }\n return {\n allsolid: tr.allsolid,\n startsolid: tr.startsolid,\n fraction: tr.fraction,\n endpos: tr.endpos,\n plane: plane,\n surfaceFlags: tr.surfaceFlags ?? 0,\n contents: tr.contents ?? 0,\n ent: null\n };\n },\n pointcontents: (p: Vec3) => {\n const t = this.engine.trace(p, p, undefined, undefined);\n return t.contents || 0;\n },\n multicast: () => {},\n unicast: () => {},\n configstring: (idx: number, val: string) => {\n if (this.client) {\n this.client.ParseConfigString(idx, val);\n }\n },\n serverCommand: (cmd: string) => {}\n };\n\n this.game = createGame(gameImports, gameEngineAdapter, gameOptions);\n\n const clientProxy: any = {\n init: (initial: any) => this.client?.init(initial),\n render: (sample: any) => this.client?.render(sample),\n shutdown: () => this.client?.shutdown(),\n get camera() { return this.client?.camera; }\n };\n\n this.host = new EngineHost(this.game, clientProxy);\n\n const clientImports: ClientImports = {\n engine: this.engine,\n host: this.host,\n inputController: this.inputController\n };\n\n this.client = createClient(clientImports);\n if (this._onInputCommand) {\n this.client.onInputCommand = this._onInputCommand;\n }\n if (this._onHudUpdate) {\n this.client.onHudUpdate = this._onHudUpdate;\n }\n this.client.onCenterPrint = this._onCenterPrint;\n this.client.onNotify = this._onNotify;\n this.client.onPickupMessage = this._onPickupMessage;\n this.client.onObituaryMessage = this._onObituaryMessage;\n this.client.onMenuStateChange = this._onMenuStateChange;\n\n if (this.engine.cmd) {\n this.engine.cmd.executeText(`map ${mapName}`);\n } else if (this.host.commands) {\n this.host.commands.execute(`map ${mapName}`);\n }\n\n if (this.game) {\n this.game.loadSave(saveData);\n }\n\n this.host.start();\n }\n\n public shutdown(): void {\n if (this.host) {\n this.host.stop();\n this.host = null;\n }\n if (this.client) {\n this.client.shutdown();\n this.client = null;\n }\n this.game = null;\n }\n\n public getClient(): ClientExports | null {\n return this.client;\n }\n\n public getGame(): GameExports | null {\n return this.game;\n }\n\n public getHost(): EngineHost | null {\n return this.host;\n }\n\n public getSaveStorage(): SaveStorage {\n return this.saveStorage;\n }\n\n public bindInputSource(source: InputSource): void {\n this.inputController.bindInputSource(source);\n }\n\n public setKeyBinding(action: string, keys: string[]): void {\n this.inputController.setKeyBinding(action, keys);\n }\n\n public getDefaultBindings(): InputBindings {\n return this.inputController.getDefaultBindings();\n }\n\n public set onInputCommand(handler: ((cmd: UserCommand) => void) | undefined) {\n this._onInputCommand = handler;\n if (this.client) {\n this.client.onInputCommand = handler;\n }\n }\n\n public get onInputCommand(): ((cmd: UserCommand) => void) | undefined {\n return this._onInputCommand;\n }\n\n // Section 4.2: HUD and UI Integration\n public getHudData(): HudData | null {\n return this.client?.getHudData() ?? null;\n }\n\n public getStatusBar(): StatusBarData | null {\n return this.client?.getStatusBar() ?? null;\n }\n\n public getCrosshairInfo(): CrosshairInfo | null {\n return this.client?.getCrosshairInfo() ?? null;\n }\n\n public set onHudUpdate(handler: ((data: HudData) => void) | undefined) {\n this._onHudUpdate = handler;\n if (this.client) {\n this.client.onHudUpdate = handler;\n }\n }\n\n public get onHudUpdate(): ((data: HudData) => void) | undefined {\n return this._onHudUpdate;\n }\n\n public set onCenterPrint(handler: ((message: string, duration: number) => void) | undefined) {\n this._onCenterPrint = handler;\n if (this.client) {\n this.client.onCenterPrint = handler;\n }\n }\n\n public get onCenterPrint(): ((message: string, duration: number) => void) | undefined {\n return this._onCenterPrint;\n }\n\n public set onNotify(handler: ((message: string) => void) | undefined) {\n this._onNotify = handler;\n if (this.client) {\n this.client.onNotify = handler;\n }\n }\n\n public get onNotify(): ((message: string) => void) | undefined {\n return this._onNotify;\n }\n\n public set onPickupMessage(handler: ((item: string) => void) | undefined) {\n this._onPickupMessage = handler;\n if (this.client) {\n this.client.onPickupMessage = handler;\n }\n }\n\n public get onPickupMessage(): ((item: string) => void) | undefined {\n return this._onPickupMessage;\n }\n\n public set onObituaryMessage(handler: ((message: string) => void) | undefined) {\n this._onObituaryMessage = handler;\n if (this.client) {\n this.client.onObituaryMessage = handler;\n }\n }\n\n public get onObituaryMessage(): ((message: string) => void) | undefined {\n return this._onObituaryMessage;\n }\n\n public set onMenuStateChange(handler: ((active: boolean) => void) | undefined) {\n this._onMenuStateChange = handler;\n if (this.client) {\n this.client.onMenuStateChange = handler;\n }\n }\n\n public get onMenuStateChange(): ((active: boolean) => void) | undefined {\n return this._onMenuStateChange;\n }\n\n public showPauseMenu(): void {\n if (this.client) {\n this.client.showPauseMenu();\n }\n }\n\n public hidePauseMenu(): void {\n if (this.client) {\n this.client.hidePauseMenu();\n }\n }\n\n public isMenuActive(): boolean {\n if (this.client) {\n return this.client.isMenuActive();\n }\n return false;\n }\n\n public getMenuState(): MenuState | null {\n if (this.client) {\n return this.client.getMenuState();\n }\n return null;\n }\n\n // Section 4.1.3: Game State Queries\n\n public getPlayerState(): PlayerState | null {\n if (this.client && this.client.lastRendered) {\n return this.client.lastRendered as unknown as PlayerState;\n }\n return null;\n }\n\n public getGameTime(): number {\n if (this.game) {\n return this.game.time;\n }\n if (this.client && this.client.lastRendered) {\n return 0;\n }\n return 0;\n }\n\n public isPaused(): boolean {\n if (this.host) {\n return this.host.paused;\n }\n return false;\n }\n\n public getSkillLevel(): number {\n if (this.game) {\n return this.game.skill;\n }\n return this.options.skill ?? 1;\n }\n\n public getMapName(): string {\n if (this.game && this.game.entities && this.game.entities.level && this.game.entities.level.mapname) {\n return this.game.entities.level.mapname;\n }\n return this.currentMapName;\n }\n\n public getGameMode(): 'single' | 'deathmatch' | 'coop' {\n if (this.game) {\n if (this.game.deathmatch) return 'deathmatch';\n if (this.game.coop) return 'coop';\n }\n return 'single';\n }\n}\n\nexport function createSession(options: SessionOptions): GameSession {\n return new GameSession(options);\n}\n","export interface ServerInfo {\n name: string;\n address: string; // WebSocket URL\n map: string;\n players: number;\n maxPlayers: number;\n gamemode: string;\n ping?: number;\n}\n\n/**\n * Query master server for list of active game servers\n *\n * Note: Quake 2 master servers typically use UDP.\n * This implementation assumes an HTTP-based master server or gateway\n * compatible with web clients (WebSocket addresses).\n *\n * Expected JSON response format from master:\n * [\n * { \"address\": \"ws://example.com:27910\", \"info\": { \"hostname\": \"Server\", \"mapname\": \"q2dm1\", ... } }\n * ]\n *\n * Or a simple list of addresses if we query them individually.\n * For now, we'll assume a standard JSON structure.\n */\nexport async function queryMasterServer(masterUrl: string): Promise<ServerInfo[]> {\n try {\n const response = await fetch(masterUrl);\n if (!response.ok) {\n throw new Error(`Master server request failed: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n\n // Parse data\n if (!Array.isArray(data)) {\n throw new Error('Invalid master server response: expected array');\n }\n\n return data.map((entry: any) => {\n // Adapt to different possible formats\n const address = entry.address || entry.ip + ':' + entry.port;\n const info = entry.info || {};\n\n // Validate address protocol\n let wsAddress = address;\n if (!address.startsWith('ws://') && !address.startsWith('wss://')) {\n // If it looks like a domain, assume wss or ws based on current page?\n // Or maybe assume ws:// for now.\n wsAddress = `ws://${address}`;\n }\n\n return {\n name: info.hostname || entry.name || address,\n address: wsAddress,\n map: info.mapname || entry.map || 'unknown',\n players: parseInt(info.clients || entry.players || '0', 10),\n maxPlayers: parseInt(info.maxclients || entry.maxPlayers || '0', 10),\n gamemode: info.gamename || entry.gamemode || 'baseq2',\n ping: undefined // Ping is client-side latency, not server reported usually\n };\n });\n\n } catch (error) {\n console.error('Failed to query master server:', error);\n return [];\n }\n}\n","import {\n ClientRenderer,\n EngineImports,\n GameFrameResult,\n GameRenderSample,\n Camera,\n Renderer,\n DemoPlaybackController,\n PlaybackState,\n EngineHost,\n RenderableEntity,\n} from '@quake2ts/engine';\nimport { UserCommand, Vec3, PlayerState, hasPmFlag, PmFlag, ConfigStringIndex, MAX_MODELS, MAX_SOUNDS, MAX_IMAGES, CvarFlags, EntityState, mat4FromBasis, PlayerStat, RenderFx, MAX_CLIENTS, CONTENTS_WATER, CONTENTS_LAVA, CONTENTS_SLIME } from '@quake2ts/shared';\nimport { vec3, mat4 } from 'gl-matrix';\n// Updated imports to use @quake2ts/cgame\nimport { ClientPrediction, interpolatePredictionState, PredictionState, GetCGameAPI, CGameExport } from '@quake2ts/cgame';\nimport { ViewEffects, ViewSample } from '@quake2ts/cgame';\nimport { createCGameImport, ClientStateProvider } from './cgameBridge.js';\n\nimport { Draw_Hud, Init_Hud } from './hud.js';\nimport { FrameRenderStats, WorldRenderState } from '@quake2ts/engine';\nimport { ClientNetworkHandler } from './demo/handler.js';\nimport { ClientConfigStrings } from './configStrings.js';\nimport { Cycle_Crosshair } from './hud/crosshair.js';\nimport { MainMenuFactory, MainMenuOptions } from './ui/menu/main.js';\nimport { SaveLoadMenuFactory } from './ui/menu/saveLoad.js';\nimport { MenuSystem } from './ui/menu/system.js';\nimport { SaveStorage, PlayerClient } from '@quake2ts/game';\nimport { OptionsMenuFactory } from './ui/menu/options.js';\nimport { MapsMenuFactory } from './ui/menu/maps.js';\nimport { PauseMenuFactory } from './ui/menu/pause.js';\nimport { MultiplayerMenuFactory } from './ui/menu/multiplayer.js';\nimport { DemoMenuFactory } from './ui/menu/demo.js';\nimport { Draw_Menu } from './ui/menu/render.js';\nimport { InputBindings } from './input/bindings.js';\nimport { BrowserSettings, LocalStorageSettings } from './ui/storage.js';\nimport { LoadingScreen } from './ui/loading/screen.js';\nimport { ErrorDialog } from './ui/error.js';\nimport { WheelMenuSystem } from './ui/wheels/index.js';\nimport { angleVectors, vectorToAngles } from '@quake2ts/shared';\nimport { buildRenderableEntities } from './entities.js';\nimport { MultiplayerConnection } from './net/connection.js';\nimport { DemoControls } from './ui/demo-controls.js';\nimport { DemoRecorder, DLight, DynamicLightManager, FogData, DamageIndicator } from '@quake2ts/engine';\nimport { DemoCameraMode, DemoCameraState } from './demo/camera.js';\nimport { processEntityEffects } from './effects.js';\nimport { ClientEffectSystem, EntityProvider } from './effects-system.js';\nimport { createBlendState, updateBlend } from './blend.js';\nimport { ScoreboardManager, ScoreboardData, ScoreboardEntry } from './scoreboard.js';\nimport { ChatManager } from './chat.js';\nimport { HudData, StatusBarData, CrosshairInfo } from './hud/data.js';\nimport { MenuState } from './ui/menu/types.js';\nimport { lodRegistry, LodModel } from './lod.js';\n\nexport { createDefaultBindings, InputBindings, normalizeCommand, normalizeInputCode } from './input/bindings.js';\nimport { InputController, InputSource } from './input/controller.js';\nexport {\n GamepadLike,\n GamepadLikeButton,\n InputAction,\n InputController,\n InputSource,\n TouchInputState,\n type InputControllerOptions,\n} from './input/controller.js';\nexport {\n InputCommandBuffer,\n type QueuedFrameCommands,\n} from './input/command-buffer.js';\n\n// Re-export from cgame if needed, or consumers should import directly\nexport {\n ClientPrediction,\n interpolatePredictionState,\n defaultPredictionState,\n} from '@quake2ts/cgame';\nexport type { PredictionSettings, PredictionState } from '@quake2ts/cgame';\n\nexport { ViewEffects } from '@quake2ts/cgame';\nexport type { ViewEffectSettings, ViewKick, ViewSample } from '@quake2ts/cgame';\n\nexport { ClientConfigStrings } from './configStrings.js';\nexport * from './scoreboard.js';\n\nexport { HudData, StatusBarData, CrosshairInfo } from './hud/data.js';\n\nexport * from './session.js';\nexport * from './demo/camera.js'; // Export DemoCameraMode\nexport { queryMasterServer, type ServerInfo } from './net/master.js';\n\nconst ZERO_VEC3: Vec3 = { x: 0, y: 0, z: 0 };\n\nexport interface ClientImports {\n readonly engine: EngineImports & { renderer: Renderer; cmd?: { executeText(text: string): void } };\n readonly host?: EngineHost;\n readonly inputController?: InputController;\n}\n\nexport enum ClientMode {\n Normal,\n DemoPlayback,\n Multiplayer\n}\n\nexport interface ClientExports extends ClientRenderer<PredictionState> {\n // Core Engine Hooks\n predict(command: UserCommand): PredictionState;\n ParseCenterPrint(msg: string): void;\n ParseNotify(msg: string): void;\n ParseConfigString(index: number, value: string): void;\n showSubtitle(text: string, soundName: string): void;\n\n // State Access\n readonly prediction: ClientPrediction;\n readonly lastRendered?: PredictionState;\n readonly view: ViewEffects;\n readonly lastView?: ViewSample;\n readonly configStrings: ClientConfigStrings;\n camera?: Camera;\n\n // Demo Playback\n demoPlayback: DemoPlaybackController;\n demoHandler: ClientNetworkHandler;\n readonly isDemoPlaying: boolean;\n readonly currentDemoName: string | null;\n readonly mode: ClientMode;\n startDemoPlayback(buffer: ArrayBuffer, filename: string): void;\n stopDemoPlayback(): void;\n\n // Demo Camera\n setDemoCameraMode(mode: DemoCameraMode): void;\n setDemoThirdPersonDistance(dist: number): void;\n setDemoThirdPersonOffset(offset: Vec3): void;\n setDemoFreeCamera(origin: Vec3, angles: Vec3): void;\n setDemoFollowEntity(entityId: number): void;\n\n // Spectator API\n setSpectatorTarget(targetEntityId: number | null): void;\n getSpectatorTargets(): { id: number; name: string }[];\n\n // Networking\n multiplayer: MultiplayerConnection;\n\n // Recording\n startRecording(filename: string): void;\n stopRecording(): void;\n\n // Menu System\n createMainMenu(options: Omit<MainMenuOptions, 'optionsFactory' | 'mapsFactory' | 'onSetDifficulty' | 'multiplayerFactory'>, storage: SaveStorage, saveCallback: (name: string) => Promise<void>, loadCallback: (slot: string) => Promise<void>, deleteCallback: (slot: string) => Promise<void>): { menuSystem: MenuSystem, factory: MainMenuFactory };\n showPauseMenu(): void;\n hidePauseMenu(): void;\n isMenuActive(): boolean;\n onMenuStateChange?: (active: boolean) => void;\n getMenuState(): MenuState;\n\n // Input handling\n handleInput(key: string, down: boolean): boolean;\n toggleMenu(): void;\n bindInputSource(source: InputSource): void;\n setKeyBinding(action: string, keys: string[]): void;\n getDefaultBindings(): InputBindings;\n onInputCommand?: (cmd: UserCommand) => void;\n\n // cgame_export_t equivalents (if explicit names required)\n Init(initial?: GameFrameResult<PredictionState>): void;\n Shutdown(): void;\n DrawHUD(stats: FrameRenderStats, timeMs: number): void;\n\n // New UI components\n readonly loadingScreen: LoadingScreen;\n readonly errorDialog: ErrorDialog;\n\n readonly dlightManager: DynamicLightManager;\n\n // Scoreboard API\n getScoreboard(): ScoreboardData;\n onScoreboardUpdate?: (scoreboard: ScoreboardData) => void;\n\n // Chat API\n sendChatMessage(message: string, team?: boolean): void;\n onChatMessage?: (sender: string, message: string, team: boolean) => void;\n getChatHistory(): any[];\n\n // HUD Data API\n getHudData(): HudData | null;\n getStatusBar(): StatusBarData | null;\n getCrosshairInfo(): CrosshairInfo;\n onHudUpdate?: (data: HudData) => void;\n\n // Message Events\n onCenterPrint?: (message: string, duration: number) => void;\n onNotify?: (message: string) => void;\n onPickupMessage?: (item: string) => void;\n onObituaryMessage?: (message: string) => void;\n\n // LOD\n registerLod(baseModel: string, lods: LodModel[]): void;\n}\n\nfunction lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\nfunction lerpAngle(a: number, b: number, t: number): number {\n // Simple lerp for now, should ideally handle wrapping\n return lerp(a, b, t);\n}\n\nexport function createClient(imports: ClientImports): ClientExports {\n // Adapter for pointContents using trace\n const pointContents = (point: Vec3): number => {\n const zero: Vec3 = { x: 0, y: 0, z: 0 };\n // Perform a point trace to get contents\n const tr = imports.engine.trace(point, point, zero, zero);\n return tr.contents || 0;\n };\n\n const prediction = new ClientPrediction({ trace: imports.engine.trace, pointContents });\n const view = new ViewEffects();\n const demoPlayback = new DemoPlaybackController();\n const demoControls = new DemoControls(demoPlayback, (speed) => {\n // Propagate speed change to AudioSystem if available\n if (imports.engine.audio) {\n // Assuming AudioApi has setPlaybackRate or we need to cast/access internal\n // AudioApi from host usually has setPlaybackRate if we added it to interface\n // But AudioApi is an interface in engine/src/audio/api.ts.\n // We implemented setPlaybackRate in AudioSystem, but AudioApi needs to expose it.\n // Let's check AudioApi. If not, we cast or assume for now, then fix interface.\n const audio = imports.engine.audio as any;\n if (typeof audio.setPlaybackRate === 'function') {\n audio.setPlaybackRate(speed);\n }\n }\n });\n const demoHandler = new ClientNetworkHandler(imports);\n const demoRecorder = new DemoRecorder();\n demoHandler.setView(view);\n\n const dlightManager = new DynamicLightManager();\n\n // Entity Provider for effects system\n // Needs to handle both demo playback and multiplayer/prediction states\n // We need to cast types because 'EntityState' definition varies slightly between shared/engine/parser context\n // The 'EntityState' imported in effects-system.ts is from @quake2ts/engine\n const entityProvider: EntityProvider = {\n getEntity(entNum: number) {\n if (isDemoPlaying) {\n // Demo handler maintains current frame entities\n return demoHandler.entities.get(entNum);\n } else {\n // Multiplayer / Local\n // Check multiplayer connection first\n if (multiplayer.isConnected()) {\n // MultiplayerConnection needs to expose entities map\n return multiplayer.entities.get(entNum);\n }\n }\n return undefined;\n },\n getPlayerNum(): number {\n return multiplayer.playerNum; // Or demoHandler.playerNum\n }\n };\n\n const effectSystem = new ClientEffectSystem(dlightManager, imports.engine, entityProvider);\n\n let isDemoPlaying = false;\n let currentDemoName: string | null = null;\n let clientMode: ClientMode = ClientMode.Normal;\n\n // Demo Camera State\n const demoCameraState: DemoCameraState = {\n mode: DemoCameraMode.FirstPerson,\n thirdPersonDistance: 80,\n thirdPersonOffset: { x: 0, y: 0, z: 0 },\n freeCameraOrigin: { x: 0, y: 0, z: 0 },\n freeCameraAngles: { x: 0, y: 0, z: 0 },\n followEntityId: -1\n };\n\n const inputController = imports.inputController ?? new InputController();\n inputController.onInputCommand = (cmd) => {\n if (clientExports.onInputCommand) {\n clientExports.onInputCommand(cmd);\n }\n };\n\n // State to track key inputs for free camera movement\n const inputState = {\n forward: false,\n backward: false,\n left: false,\n right: false,\n up: false,\n down: false\n };\n\n // Initialize persistent Menu System\n const menuSystem = new MenuSystem();\n menuSystem.onStateChange = (active) => {\n if (clientExports.onMenuStateChange) {\n clientExports.onMenuStateChange(active);\n }\n };\n\n // Initialize UI components\n const loadingScreen = new LoadingScreen();\n const errorDialog = new ErrorDialog();\n const wheelMenuSystem = new WheelMenuSystem();\n const settings = new BrowserSettings(new LocalStorageSettings());\n\n // Menu Factories\n let pauseMenuFactory: PauseMenuFactory | undefined;\n let optionsFactory: OptionsMenuFactory | undefined;\n\n const configStrings = new ClientConfigStrings();\n const scoreboardManager = new ScoreboardManager(configStrings);\n\n const chatManager = new ChatManager((cmd) => {\n if (imports.engine.cmd) {\n imports.engine.cmd.executeText(cmd);\n }\n });\n\n const blendState = createBlendState();\n let currentBlend: [number, number, number, number] = [0, 0, 0, 0];\n let pendingDamage = 0;\n\n // Define State Provider for CGame first\n let latestFrame: GameFrameResult<PredictionState> | undefined;\n let lastRenderTime = 0;\n let clientInAutoDemo = false;\n\n const stateProvider: ClientStateProvider = {\n get tickRate() { return 10; }, // Default 10Hz\n get frameTimeMs() { return latestFrame?.timeMs ?? 0; },\n get serverFrame() { return demoHandler.latestServerFrame; },\n get serverProtocol() { return 34; },\n get configStrings() { return configStrings; },\n getClientName: (num) => `Player ${num}`,\n getKeyBinding: (key) => `[${key}]`,\n get inAutoDemo() { return clientInAutoDemo; }\n };\n\n // CGame Interface\n const cgameImport = createCGameImport(imports, stateProvider, (msg) => {\n // Use level 0 (PRINT_LOW/INFO) for general output\n chatManager.addMessage(0, msg);\n });\n const cg: CGameExport = GetCGameAPI(cgameImport);\n\n // Networking\n const multiplayer = new MultiplayerConnection({\n get username() { return imports.host?.cvars?.get('name')?.string || 'Player'; },\n get model() { return imports.host?.cvars?.get('model')?.string || 'male'; },\n get skin() { return imports.host?.cvars?.get('skin')?.string || 'grunt'; },\n get fov() { return fovValue; }\n });\n multiplayer.setDemoRecorder(demoRecorder);\n multiplayer.setEffectSystem(effectSystem); // Inject Effect System\n\n const multiplayerFactory = new MultiplayerMenuFactory(menuSystem, multiplayer);\n\n // Helper to process CD tracks\n const processCdTrack = (trackStr: string) => {\n if (!imports.engine.audio) return;\n\n const track = parseInt(trackStr, 10);\n if (!isNaN(track)) {\n // Tracks 0 and 1 are usually ignored (data)\n if (track >= 2) {\n // Use exposed play_track from AudioApi\n if (imports.engine.audio.play_track) {\n void imports.engine.audio.play_track(track);\n } else {\n // Fallback if play_track isn't available (should not happen if engine updated)\n const trackName = `music/track${track.toString().padStart(2, '0')}.ogg`;\n void imports.engine.audio.play_music(trackName);\n }\n } else {\n imports.engine.audio.stop_music();\n }\n }\n };\n\n // Hook up message system to demo handler via CG\n demoHandler.setCallbacks({\n onCenterPrint: (msg: string) => cg.ParseCenterPrint(msg, 0, false),\n onPrint: (level: number, msg: string) => {\n cg.NotifyMessage(0, msg, false);\n chatManager.addMessage(level, msg);\n },\n onConfigString: (index: number, str: string) => {\n configStrings.set(index, str);\n cg.ParseConfigString(index, str);\n\n // Trigger scoreboard update if player skin changes\n if (index >= ConfigStringIndex.PlayerSkins && index < ConfigStringIndex.PlayerSkins + MAX_CLIENTS) {\n scoreboardManager.parseConfigString(index, str);\n scoreboardManager.notifyUpdate();\n }\n\n // Handle CD Track\n if (index === ConfigStringIndex.CdTrack) {\n processCdTrack(str);\n }\n },\n onServerData: (protocol: number, tickRate?: number) => {\n if (tickRate && tickRate > 0) {\n demoPlayback.setFrameDuration(1000 / tickRate);\n } else {\n demoPlayback.setFrameDuration(100); // 10Hz fallback\n }\n },\n // New hooks for effects\n onMuzzleFlash: (ent: number, weapon: number) => {\n const time = demoPlayback.getCurrentTime() / 1000.0;\n effectSystem.onMuzzleFlash(ent, weapon, time);\n },\n onMuzzleFlash2: (ent: number, weapon: number) => {\n // TODO: Implement MZ2 handling\n },\n onTempEntity: (type: number, pos: Vec3, pos2?: Vec3, dir?: Vec3, cnt?: number, color?: number, ent?: number, srcEnt?: number, destEnt?: number) => {\n const time = demoPlayback.getCurrentTime() / 1000.0;\n if (pos) {\n effectSystem.onTempEntity(type, pos, time, dir, pos2);\n }\n },\n onDamage: (indicators: DamageIndicator[]) => {\n pendingDamage = 0.5;\n },\n onLayout: (layout: string) => {\n scoreboardManager.processScoreboardMessage(layout);\n scoreboardManager.notifyUpdate();\n }\n });\n\n demoPlayback.setHandler(demoHandler);\n\n let lastRendered: PredictionState | undefined;\n let lastView: ViewSample | undefined;\n let camera: Camera | undefined;\n\n // Default FOV\n let fovValue = 90;\n let isZooming = false;\n let flashlightEnabled = false;\n\n // Initialize Menu Factories\n if (imports.host) {\n optionsFactory = new OptionsMenuFactory(menuSystem, imports.host);\n pauseMenuFactory = new PauseMenuFactory(menuSystem, optionsFactory, imports.host);\n\n // Load Settings\n const cvarsMap = new Map<string, { value: string, setValue: (v: string) => void }>();\n if (imports.host.cvars) {\n for (const cvar of imports.host.cvars.list()) {\n cvarsMap.set(cvar.name, {\n value: cvar.string,\n setValue: (v) => imports.host!.cvars.setValue(cvar.name, v)\n });\n }\n settings.loadCvars(cvarsMap);\n }\n }\n\n if (imports.host?.commands) {\n imports.host.commands.register('playdemo', (args) => {\n if (args.length < 1) {\n console.log('usage: playdemo <filename>');\n return;\n }\n const filename = args[0];\n console.log(`playdemo: ${filename}`);\n console.log('Note: Demo loading requires VFS access which is not yet fully integrated into this console command.');\n }, 'Play a recorded demo');\n\n imports.host.commands.register('crosshair', () => {\n const index = Cycle_Crosshair();\n console.log(`Crosshair changed to index ${index}`);\n }, 'Cycle through available crosshairs');\n\n imports.host.commands.register('+zoom', () => {\n isZooming = true;\n }, 'Zoom in view');\n\n imports.host.commands.register('-zoom', () => {\n isZooming = false;\n }, 'Reset zoom');\n\n imports.host.commands.register('togglemenu', () => {\n if (menuSystem.isActive()) {\n menuSystem.closeAll();\n } else if (pauseMenuFactory) {\n menuSystem.pushMenu(pauseMenuFactory.createPauseMenu());\n }\n }, 'Toggle the main/pause menu');\n\n imports.host.commands.register('connect', (args) => {\n if (args.length < 1) {\n console.log('usage: connect <address>');\n return;\n }\n const address = args[0];\n console.log(`Connecting to ${address}...`);\n multiplayer.connect(address).catch(e => {\n console.error('Failed to connect:', e);\n errorDialog.show('Connection Failed', e instanceof Error ? e.message : 'Unknown error');\n });\n }, 'Connect to a multiplayer server');\n\n imports.host.commands.register('disconnect', () => {\n multiplayer.disconnect();\n console.log('Disconnected.');\n }, 'Disconnect from server');\n\n imports.host.commands.register('record', (args) => {\n const name = args.length > 0 ? args[0] : `demo_${Date.now()}`;\n clientExports.startRecording(name + '.dm2');\n }, 'Record a demo');\n\n imports.host.commands.register('stop', () => {\n clientExports.stopRecording();\n }, 'Stop recording demo');\n\n imports.host.commands.register('flashlight', () => {\n flashlightEnabled = !flashlightEnabled;\n if (imports.host?.cvars) {\n imports.host.cvars.setValue('cl_flashlight', flashlightEnabled ? '1' : '0');\n }\n }, 'Toggle flashlight');\n\n if (imports.host.cvars) {\n imports.host.cvars.register({\n name: 'fov',\n defaultValue: '90',\n flags: CvarFlags.Archive,\n onChange: (cvar) => {\n const f = cvar.number;\n if (!isNaN(f)) {\n fovValue = Math.max(1, Math.min(179, f));\n }\n },\n description: 'Field of view'\n });\n\n imports.host.cvars.register({\n name: 'cl_flashlight',\n defaultValue: '0',\n flags: CvarFlags.Archive,\n onChange: (cvar) => {\n flashlightEnabled = cvar.number !== 0;\n },\n description: 'Flashlight toggle'\n });\n\n imports.host.cvars.register({\n name: 'cl_predict',\n defaultValue: '1',\n flags: CvarFlags.Archive,\n onChange: (cvar) => {\n prediction.setPredictionEnabled(cvar.number !== 0);\n },\n description: 'Toggle client-side prediction'\n });\n\n imports.host.cvars.register({\n name: 's_musicvolume',\n defaultValue: '1',\n flags: CvarFlags.Archive,\n onChange: (cvar) => {\n const vol = cvar.number;\n if (!isNaN(vol)) {\n // Defensive call in case engine interface is partial\n const audio = imports.engine.audio as any;\n if (audio && typeof audio.set_music_volume === 'function') {\n audio.set_music_volume(Math.max(0, Math.min(1, vol)));\n }\n }\n },\n description: 'Music volume'\n });\n\n imports.host.cvars.register({\n name: 'vid_gamma',\n defaultValue: '1.0',\n flags: CvarFlags.Archive,\n onChange: (cvar) => {\n const val = cvar.number;\n if (!isNaN(val) && imports.engine.renderer) {\n imports.engine.renderer.setGamma(val);\n }\n },\n description: 'Gamma correction'\n });\n\n imports.host.cvars.register({\n name: 'r_brightness',\n defaultValue: '1.0',\n flags: CvarFlags.Archive,\n onChange: (cvar) => {\n const val = cvar.number;\n if (!isNaN(val) && imports.engine.renderer) {\n imports.engine.renderer.setBrightness(val);\n }\n },\n description: 'Brightness control'\n });\n\n imports.host.cvars.register({\n name: 'r_bloom',\n defaultValue: '0',\n flags: CvarFlags.Archive,\n onChange: (cvar) => {\n if (imports.engine.renderer) {\n imports.engine.renderer.setBloom(cvar.number !== 0);\n }\n },\n description: 'Enable bloom effect'\n });\n\n imports.host.cvars.register({\n name: 'r_bloom_intensity',\n defaultValue: '0.5',\n flags: CvarFlags.Archive,\n onChange: (cvar) => {\n const val = cvar.number;\n if (!isNaN(val) && imports.engine.renderer) {\n imports.engine.renderer.setBloomIntensity(val);\n }\n },\n description: 'Bloom intensity'\n });\n\n // Initialize fovValue from cvar\n const initialFov = imports.host.cvars.get('fov');\n if (initialFov) {\n const f = initialFov.number;\n if (!isNaN(f)) {\n fovValue = Math.max(1, Math.min(179, f));\n }\n }\n\n // Initialize music volume\n const initialMusicVol = imports.host.cvars.get('s_musicvolume');\n if (initialMusicVol) {\n const vol = initialMusicVol.number;\n if (!isNaN(vol)) {\n const audio = imports.engine.audio as any;\n if (audio && typeof audio.set_music_volume === 'function') {\n audio.set_music_volume(Math.max(0, Math.min(1, vol)));\n }\n }\n }\n }\n }\n\n const clientExports: ClientExports = {\n loadingScreen,\n errorDialog,\n dlightManager,\n\n init(initial) {\n this.Init(initial);\n },\n\n Init(initial) {\n latestFrame = initial;\n if (initial?.state) {\n prediction.setAuthoritative(initial);\n }\n\n // Initialize CGame\n cg.Init();\n\n // Initialize HUD assets if asset manager is available\n if (imports.engine.assets && imports.engine.renderer) {\n loadingScreen.start(100, 'Loading assets...'); // Mock total\n // Actually Init_Hud is async. We should await it or handle promise.\n // ClientExports.Init is void.\n Init_Hud(imports.engine.renderer, imports.engine.assets).then(() => {\n loadingScreen.finish();\n });\n }\n\n // Apply initial render settings from cvars\n if (imports.engine.renderer && imports.host?.cvars) {\n const gamma = imports.host.cvars.get('vid_gamma');\n if (gamma && !isNaN(gamma.number)) {\n imports.engine.renderer.setGamma(gamma.number);\n }\n const brightness = imports.host.cvars.get('r_brightness');\n if (brightness && !isNaN(brightness.number)) {\n imports.engine.renderer.setBrightness(brightness.number);\n }\n const bloom = imports.host.cvars.get('r_bloom');\n if (bloom) {\n imports.engine.renderer.setBloom(bloom.number !== 0);\n }\n const bloomIntensity = imports.host.cvars.get('r_bloom_intensity');\n if (bloomIntensity && !isNaN(bloomIntensity.number)) {\n imports.engine.renderer.setBloomIntensity(bloomIntensity.number);\n }\n }\n\n void imports.engine.trace({ x: 0, y: 0, z: 0 }, { x: 1, y: 0, z: 0 });\n\n // Setup global events\n if (typeof document !== 'undefined') {\n document.addEventListener('fullscreenchange', () => {\n if (document.fullscreenElement) {\n if (!menuSystem.isActive()) {\n document.body.requestPointerLock?.();\n }\n }\n });\n }\n },\n\n predict(command: UserCommand): PredictionState {\n if (menuSystem.isActive()) {\n // Suppress movement if desired\n }\n\n // If connected to multiplayer, send command to server\n if (multiplayer.isConnected()) {\n multiplayer.sendCommand(command);\n }\n\n return prediction.enqueueCommand(command);\n },\n\n handleInput(key: string, down: boolean): boolean {\n if (isDemoPlaying) {\n // Handle camera inputs if in Free mode\n if (demoCameraState.mode === DemoCameraMode.Free) {\n const lowerKey = key.toLowerCase();\n if (lowerKey === 'arrowup' || lowerKey === 'w') inputState.forward = down;\n if (lowerKey === 'arrowdown' || lowerKey === 's') inputState.backward = down;\n if (lowerKey === 'arrowleft' || lowerKey === 'a') inputState.left = down;\n if (lowerKey === 'arrowright' || lowerKey === 'd') inputState.right = down;\n if (lowerKey === 'q') inputState.up = down;\n if (lowerKey === 'e') inputState.down = down;\n }\n\n if (demoControls.handleInput(key, down)) {\n return true;\n }\n // If demo controls didn't consume input, fall through (e.g. for togglemenu)\n }\n\n if (!menuSystem.isActive()) return false;\n\n if (!down) return true;\n\n const lowerKey = key.toLowerCase();\n\n if (lowerKey === 'arrowup' || lowerKey === 'w') {\n return menuSystem.handleInput('up');\n } else if (lowerKey === 'arrowdown' || lowerKey === 's') {\n return menuSystem.handleInput('down');\n } else if (lowerKey === 'arrowleft' || lowerKey === 'a') {\n return menuSystem.handleInput('left');\n } else if (lowerKey === 'arrowright' || lowerKey === 'd') {\n return menuSystem.handleInput('right');\n } else if (lowerKey === 'enter' || lowerKey === ' ') {\n return menuSystem.handleInput('select');\n } else if (lowerKey === 'escape') {\n if (menuSystem.getState().activeMenu?.parent) {\n return menuSystem.handleInput('back');\n }\n return false;\n } else if (key.length === 1) {\n return menuSystem.handleInput('char', key);\n } else if (key === 'Backspace') {\n return menuSystem.handleInput('left');\n }\n\n return true;\n },\n\n toggleMenu() {\n if (menuSystem.isActive()) {\n menuSystem.closeAll();\n // Save settings when closing menu\n if (imports.host?.cvars) {\n const list = imports.host.cvars.list().map(c => ({\n name: c.name,\n value: c.string,\n flags: c.flags\n }));\n settings.saveCvars(list);\n }\n } else if (pauseMenuFactory) {\n menuSystem.pushMenu(pauseMenuFactory.createPauseMenu());\n }\n },\n\n bindInputSource(source: InputSource) {\n inputController.bindInputSource(source);\n },\n\n setKeyBinding(action: string, keys: string[]) {\n inputController.setKeyBinding(action, keys);\n },\n\n getDefaultBindings() {\n return inputController.getDefaultBindings();\n },\n\n createMainMenu(options: Omit<MainMenuOptions, 'optionsFactory' | 'mapsFactory' | 'onSetDifficulty' | 'multiplayerFactory' | 'demoFactory'>, storage: SaveStorage, saveCallback: (name: string) => Promise<void>, loadCallback: (slot: string) => Promise<void>, deleteCallback: (slot: string) => Promise<void>) {\n const saveLoadFactory = new SaveLoadMenuFactory(menuSystem, storage, saveCallback, loadCallback, deleteCallback);\n let optsFactory = optionsFactory;\n if (!optsFactory) {\n if (!imports.host) {\n throw new Error('Cannot create Main Menu: EngineHost is missing');\n }\n optsFactory = new OptionsMenuFactory(menuSystem, imports.host);\n }\n\n const assets = imports.engine.assets;\n const vfsShim = {\n findByExtension: (ext: string) => assets ? assets.listFiles(ext) : []\n };\n\n const mapsFactory = new MapsMenuFactory(menuSystem, vfsShim as any, (map) => {\n console.log(`Starting map: ${map}`);\n imports.host?.commands.execute(`map ${map}`);\n });\n\n const demoFactory = new DemoMenuFactory(menuSystem, clientExports);\n\n const factory = new MainMenuFactory(menuSystem, saveLoadFactory, {\n ...options,\n optionsFactory: optsFactory,\n mapsFactory,\n multiplayerFactory,\n demoFactory,\n onSetDifficulty: (skill: number) => {\n if (imports.host?.cvars) {\n imports.host.cvars.setValue('skill', skill.toString());\n }\n }\n });\n\n return { menuSystem, factory };\n },\n\n showPauseMenu() {\n if (!menuSystem.isActive() && pauseMenuFactory) {\n menuSystem.pushMenu(pauseMenuFactory.createPauseMenu());\n }\n },\n\n hidePauseMenu() {\n if (menuSystem.isActive()) {\n menuSystem.closeAll();\n }\n },\n\n isMenuActive() {\n return menuSystem.isActive();\n },\n\n getMenuState() {\n return menuSystem.getState();\n },\n\n render(sample: GameRenderSample<PredictionState>): UserCommand {\n // Keep track of entities to render\n let renderEntities: RenderableEntity[] = [];\n let currentPacketEntities: any[] = []; // Store raw packet entities for effect processing\n\n const now = sample.nowMs;\n const dtMs = lastRenderTime > 0 ? Math.max(0, now - lastRenderTime) : 0;\n lastRenderTime = now;\n\n if (isDemoPlaying) {\n // Update demo playback with delta time since last frame\n demoPlayback.update(dtMs);\n\n lastRendered = demoHandler.getPredictionState(demoPlayback.getCurrentTime());\n // Calculate alpha for interpolation\n const alpha = demoPlayback.getInterpolationFactor();\n\n // Get Camera info for LOD\n let camPos = lastRendered ? { x: lastRendered.origin.x, y: lastRendered.origin.y, z: lastRendered.origin.z } : undefined;\n\n renderEntities = demoHandler.getRenderableEntities(alpha, configStrings); // demo handler needs update to pass camera pos or we do it inside\n\n // Get packet entities for effect processing.\n if (demoHandler.latestFrame && demoHandler.latestFrame.packetEntities) {\n currentPacketEntities = demoHandler.latestFrame.packetEntities.entities;\n }\n\n if (lastRendered) {\n const demoCamera = demoHandler.getDemoCamera(1.0);\n // Apply Demo Camera Modes logic\n if (demoCameraState.mode === DemoCameraMode.FirstPerson) {\n if (demoCamera) {\n lastRendered.origin = demoCamera.origin;\n lastRendered.viewAngles = demoCamera.angles;\n if (demoCamera.fov) {\n lastRendered.fov = demoCamera.fov;\n }\n }\n } else if (demoCameraState.mode === DemoCameraMode.ThirdPerson) {\n if (demoCamera) {\n // Simple third person: Move back along view angles\n const vectors = angleVectors(demoCamera.angles);\n const forward = vectors.forward;\n\n const dist = demoCameraState.thirdPersonDistance;\n\n // Calculate new origin\n // origin - forward * dist\n const camOrigin = { ...demoCamera.origin };\n camOrigin.x -= forward.x * dist;\n camOrigin.y -= forward.y * dist;\n camOrigin.z -= forward.z * dist;\n\n // Check for collision using trace\n const traceStart = demoCamera.origin;\n const traceEnd = camOrigin;\n // Trace against solids (MASK_SOLID = 1)\n // We need to define a small bounding box for the camera or use point trace\n const mins = { x: -4, y: -4, z: -4 };\n const maxs = { x: 4, y: 4, z: 4 };\n\n const trace = imports.engine.trace(traceStart, traceEnd, mins, maxs);\n\n if (trace.fraction < 1.0) {\n // Hit something, clamp to hit position (endpos)\n // Add a small buffer to prevent clipping right into the wall\n lastRendered.origin = trace.endpos;\n } else {\n lastRendered.origin = camOrigin;\n }\n lastRendered.viewAngles = demoCamera.angles;\n }\n } else if (demoCameraState.mode === DemoCameraMode.Free) {\n // Update free camera position based on input state\n const speed = 300 * (dtMs / 1000);\n const vectors = angleVectors(demoCameraState.freeCameraAngles);\n const forward = vectors.forward;\n const right = vectors.right;\n const up = vectors.up;\n\n // Use a temporary mutable vector for calculation\n const newOrigin = vec3.fromValues(\n demoCameraState.freeCameraOrigin.x,\n demoCameraState.freeCameraOrigin.y,\n demoCameraState.freeCameraOrigin.z\n );\n\n if (inputState.forward) {\n vec3.scaleAndAdd(newOrigin, newOrigin, [forward.x, forward.y, forward.z], speed);\n }\n if (inputState.backward) {\n vec3.scaleAndAdd(newOrigin, newOrigin, [forward.x, forward.y, forward.z], -speed);\n }\n if (inputState.right) {\n vec3.scaleAndAdd(newOrigin, newOrigin, [right.x, right.y, right.z], speed);\n }\n if (inputState.left) {\n vec3.scaleAndAdd(newOrigin, newOrigin, [right.x, right.y, right.z], -speed);\n }\n if (inputState.up) {\n vec3.scaleAndAdd(newOrigin, newOrigin, [0, 0, 1], speed);\n }\n if (inputState.down) {\n vec3.scaleAndAdd(newOrigin, newOrigin, [0, 0, 1], -speed);\n }\n\n // Update state with new values\n demoCameraState.freeCameraOrigin = { x: newOrigin[0], y: newOrigin[1], z: newOrigin[2] };\n lastRendered.origin = { ...demoCameraState.freeCameraOrigin };\n lastRendered.viewAngles = demoCameraState.freeCameraAngles;\n\n } else if (demoCameraState.mode === DemoCameraMode.Follow) {\n if (demoCameraState.followEntityId !== -1) {\n // Find entity in renderEntities\n const ent = renderEntities.find(e => e.id === demoCameraState.followEntityId);\n if (ent) {\n const mat = ent.transform;\n const targetOrigin = { x: mat[12], y: mat[13], z: mat[14] };\n\n // Smoothing: Linear interpolation towards target\n const smoothingFactor = 0.1; // Adjust for lag effect\n\n // Initialize if missing\n if (!demoCameraState.currentFollowOrigin) {\n demoCameraState.currentFollowOrigin = { ...targetOrigin };\n }\n\n const current = demoCameraState.currentFollowOrigin;\n\n // If far away, snap\n if (Math.abs(current.x - targetOrigin.x) > 1000 ||\n Math.abs(current.y - targetOrigin.y) > 1000 ||\n Math.abs(current.z - targetOrigin.z) > 1000) {\n demoCameraState.currentFollowOrigin = { ...targetOrigin };\n } else {\n const nextX = current.x + (targetOrigin.x - current.x) * smoothingFactor;\n const nextY = current.y + (targetOrigin.y - current.y) * smoothingFactor;\n const nextZ = current.z + (targetOrigin.z - current.z) * smoothingFactor;\n demoCameraState.currentFollowOrigin = { x: nextX, y: nextY, z: nextZ };\n }\n\n lastRendered.origin = { ...demoCameraState.currentFollowOrigin };\n }\n }\n }\n }\n } else {\n if (sample.latest?.state) {\n prediction.setAuthoritative(sample.latest);\n latestFrame = sample.latest;\n }\n\n if (sample.previous?.state && sample.latest?.state) {\n lastRendered = interpolatePredictionState(sample.previous.state, sample.latest.state, sample.alpha);\n\n // Interpolate entities\n if ((sample.latest.state as any).packetEntities && (sample.previous.state as any).packetEntities) {\n const latestPacketEntities = (sample.latest.state as any).packetEntities;\n const previousPacketEntities = (sample.previous.state as any).packetEntities;\n\n // Determine camera pos for LOD\n const camPos = lastRendered ? { x: lastRendered.origin.x, y: lastRendered.origin.y, z: lastRendered.origin.z } : undefined;\n\n renderEntities = buildRenderableEntities(\n latestPacketEntities,\n previousPacketEntities,\n sample.alpha,\n configStrings,\n imports,\n camPos\n );\n // Use latest packet entities for effects (or interpolate if we get fancy)\n currentPacketEntities = latestPacketEntities;\n }\n\n } else {\n lastRendered = sample.latest?.state ?? sample.previous?.state ?? prediction.getPredictedState();\n }\n }\n\n const frameTimeMs = sample.latest && sample.previous ? Math.max(0, sample.latest.timeMs - sample.previous.timeMs) : 0;\n\n // Decay prediction error\n if (frameTimeMs > 0) {\n prediction.decayError(frameTimeMs / 1000.0);\n }\n\n lastView = view.sample(lastRendered, frameTimeMs);\n\n // Update screen blend (damage/pickup flashes)\n if (lastRendered) {\n currentBlend = updateBlend(blendState, lastRendered as unknown as PlayerState, frameTimeMs / 1000.0, pendingDamage);\n pendingDamage = 0;\n } else {\n currentBlend = [0, 0, 0, 0];\n }\n\n // Generate user command from input controller\n const command = inputController.buildCommand(dtMs, now, demoHandler.latestServerFrame);\n\n // Apply prediction\n if (!isDemoPlaying && !menuSystem.isActive()) {\n clientExports.predict(command);\n }\n\n // Update Dynamic Light Manager\n const timeSeconds = sample.nowMs / 1000.0;\n dlightManager.update(timeSeconds, dtMs / 1000.0);\n\n // Collect lights (persistent + per-frame)\n const dlights: DLight[] = [...dlightManager.getActiveLights()];\n\n // Process Entity Effects (Per-frame lights)\n for (const ent of currentPacketEntities) {\n processEntityEffects(ent, dlights, timeSeconds);\n }\n\n if (lastRendered) {\n const { origin, viewAngles } = lastRendered;\n camera = new Camera();\n camera.position = vec3.fromValues(origin.x, origin.y, origin.z);\n // Add view offset if FirstPerson\n if (!isDemoPlaying || demoCameraState.mode === DemoCameraMode.FirstPerson) {\n const viewOffset = lastView?.offset ?? { x: 0, y: 0, z: 0 };\n vec3.add(camera.position, camera.position, [viewOffset.x, viewOffset.y, viewOffset.z]);\n }\n\n // Add view effects angles\n const effectAngles = lastView?.angles ?? { x: 0, y: 0, z: 0 };\n camera.angles = vec3.fromValues(viewAngles.x + effectAngles.x, viewAngles.y + effectAngles.y, viewAngles.z + effectAngles.z);\n\n // In demo playback, prefer the recorded FOV if available\n if (isDemoPlaying && lastRendered.fov) {\n camera.fov = lastRendered.fov;\n } else {\n camera.fov = isZooming ? 40 : fovValue;\n }\n\n camera.aspect = 4 / 3; // Default aspect\n\n // Update aspect from renderer\n if (imports.engine.renderer) {\n camera.aspect = imports.engine.renderer.width / imports.engine.renderer.height;\n }\n\n // Flashlight logic\n if (flashlightEnabled || (lastRendered.renderfx & RenderFx.Flashlight)) {\n // Flashlight originates from view position\n const lightOrigin = { x: camera.position[0], y: camera.position[1], z: camera.position[2] };\n\n dlights.push({\n origin: lightOrigin,\n color: { x: 1, y: 1, z: 1 },\n intensity: 200,\n die: (sample.nowMs / 1000) + 0.1,\n minLight: 0\n });\n }\n }\n\n // RENDER THE WORLD\n if (imports.engine.renderer && camera) {\n let world: WorldRenderState | undefined;\n\n if (imports.engine.assets) {\n const mapName = configStrings.getModelName(1);\n if (mapName) {\n const bspMap = imports.engine.assets.getMap(mapName);\n if (bspMap) {\n // Construct world state.\n }\n }\n }\n\n // Check camera contents for water tint\n const cameraContents = pointContents({ x: camera.position[0], y: camera.position[1], z: camera.position[2] });\n let waterTint: readonly [number, number, number, number] | undefined;\n let underwaterWarp = false;\n\n if ((cameraContents & CONTENTS_WATER) !== 0) {\n waterTint = [0.5, 0.5, 0.6, 0.6]; // Blueish\n underwaterWarp = true;\n } else if ((cameraContents & CONTENTS_SLIME) !== 0) {\n waterTint = [0.0, 0.1, 0.05, 0.6]; // Slime green\n underwaterWarp = true;\n } else if ((cameraContents & CONTENTS_LAVA) !== 0) {\n waterTint = [1.0, 0.3, 0.0, 0.6]; // Lava red\n underwaterWarp = true;\n }\n\n imports.engine.renderer.setUnderwaterWarp(underwaterWarp);\n\n imports.engine.renderer.renderFrame({\n camera,\n world,\n dlights: dlights,\n deltaTime: dtMs / 1000.0,\n timeSeconds,\n waterTint // Pass it here\n }, renderEntities);\n }\n\n if (imports.engine.renderer && lastRendered && lastRendered.client) {\n const perfReport = imports.engine.renderer.getPerformanceReport();\n const stats: FrameRenderStats = {\n batches: perfReport.textureBinds,\n facesDrawn: perfReport.triangles,\n drawCalls: perfReport.drawCalls,\n skyDrawn: false,\n viewModelDrawn: false,\n fps: 0,\n vertexCount: perfReport.vertices,\n };\n const timeMs = sample.latest?.timeMs ?? 0;\n\n this.DrawHUD(stats, timeMs);\n }\n\n if (clientExports.onHudUpdate) {\n const hudData = clientExports.getHudData();\n if (hudData) {\n clientExports.onHudUpdate(hudData);\n }\n }\n\n return command;\n },\n\n DrawHUD(stats: FrameRenderStats, timeMs: number) {\n if (!imports.engine.renderer) return;\n\n const renderer = imports.engine.renderer;\n const width = renderer.width;\n const height = renderer.height;\n\n // Only draw full player HUD if not in demo mode\n if (!isDemoPlaying && lastRendered && lastRendered.client) {\n const playerState: PlayerState = {\n origin: lastRendered.origin,\n velocity: lastRendered.velocity,\n viewAngles: lastRendered.viewAngles,\n onGround: hasPmFlag(lastRendered.pmFlags, PmFlag.OnGround),\n waterLevel: lastRendered.waterLevel,\n watertype: lastRendered.watertype,\n mins: { x: -16, y: -16, z: -24 },\n maxs: { x: 16, y: 16, z: 32 },\n damageAlpha: lastRendered.damageAlpha ?? 0,\n damageIndicators: lastRendered.damageIndicators ?? [],\n blend: currentBlend,\n pickupIcon: lastRendered.pickupIcon,\n centerPrint: undefined,\n notify: undefined,\n\n // Stubs for new fields\n stats: lastRendered.stats ? [...lastRendered.stats] : new Array(32).fill(0),\n kick_angles: ZERO_VEC3,\n kick_origin: ZERO_VEC3,\n gunoffset: ZERO_VEC3,\n gunangles: ZERO_VEC3,\n gunindex: 0,\n\n // New fields for Q2 network compatibility\n pm_type: lastRendered.pm_type ?? 0,\n pm_time: lastRendered.pm_time ?? 0,\n pm_flags: lastRendered.pmFlags,\n gun_frame: lastRendered.gun_frame ?? 0,\n rdflags: lastRendered.rdflags ?? 0,\n fov: lastRendered.fov ?? 90,\n renderfx: lastRendered.renderfx\n };\n\n // Populate stats for status bar (Health, Armor, Ammo) if not already populated by server\n playerState.stats[PlayerStat.STAT_HEALTH] = lastRendered.health ?? 0;\n playerState.stats[PlayerStat.STAT_AMMO] = lastRendered.ammo ?? 0;\n playerState.stats[PlayerStat.STAT_ARMOR] = lastRendered.armor ?? 0;\n\n renderer.begin2D();\n cg.DrawHUD(\n 0, // isplit\n null, // data\n { x: 0, y: 0, width, height }, // hud_vrect\n { x: 0, y: 0, width, height }, // hud_safe\n 1.0, // scale\n 0, // playernum\n playerState\n );\n renderer.end2D();\n }\n\n if (menuSystem.isActive()) {\n Draw_Menu(imports.engine.renderer, menuSystem.getState(), imports.engine.renderer.width, imports.engine.renderer.height);\n }\n\n if (isDemoPlaying) {\n demoControls.render(imports.engine.renderer, imports.engine.renderer.width, imports.engine.renderer.height);\n }\n\n if (lastRendered && lastRendered.client) {\n wheelMenuSystem.render(imports.engine.renderer, imports.engine.renderer.width, imports.engine.renderer.height, lastRendered.client as PlayerClient);\n }\n\n errorDialog.render(imports.engine.renderer);\n loadingScreen.render(imports.engine.renderer);\n },\n\n getHudData(): HudData | null {\n if (!lastRendered) return null;\n\n const health = lastRendered.health ?? 0;\n const armor = lastRendered.armor ?? 0;\n const ammo = lastRendered.ammo ?? 0;\n const fps = 60; // TODO: Calculate real FPS\n\n const damageIndicators = (lastRendered.damageIndicators ?? []).map(ind => ({\n angle: vectorToAngles(ind.direction).y,\n alpha: ind.strength\n }));\n\n return {\n health,\n armor,\n ammo,\n inventory: [], // Todo\n damageIndicators,\n fps,\n pickupIcon: lastRendered.pickupIcon\n };\n },\n\n getStatusBar(): StatusBarData | null {\n if (!lastRendered) return null;\n return {\n health: lastRendered.health ?? 0,\n armor: lastRendered.armor ?? 0,\n ammo: lastRendered.ammo ?? 0,\n selectedAmmoIndex: 0\n };\n },\n\n getCrosshairInfo(): CrosshairInfo {\n return {\n index: 0,\n name: 'default'\n };\n },\n\n shutdown() {\n this.Shutdown();\n },\n\n Shutdown() {\n // Shutdown CGame\n cg.Shutdown();\n\n latestFrame = undefined;\n lastRendered = undefined;\n // Save settings on shutdown\n if (imports.host?.cvars) {\n const list = imports.host.cvars.list().map(c => ({\n name: c.name,\n value: c.string,\n flags: c.flags\n }));\n settings.saveCvars(list);\n }\n },\n\n get prediction(): ClientPrediction {\n return prediction;\n },\n get lastRendered(): PredictionState | undefined {\n return lastRendered;\n },\n get view(): ViewEffects {\n return view;\n },\n get lastView(): ViewSample | undefined {\n return lastView;\n },\n get camera(): Camera | undefined {\n return camera;\n },\n demoPlayback,\n get isDemoPlaying() {\n return isDemoPlaying;\n },\n get currentDemoName() {\n return currentDemoName;\n },\n get mode() {\n return clientMode;\n },\n startDemoPlayback(buffer: ArrayBuffer, filename: string) {\n demoPlayback.loadDemo(buffer);\n demoPlayback.setHandler(demoHandler);\n demoControls.setDemoName(filename);\n isDemoPlaying = true;\n currentDemoName = filename;\n clientMode = ClientMode.DemoPlayback;\n lastRenderTime = 0;\n // Reset state\n configStrings.clear(); // Clear existing configstrings\n },\n stopDemoPlayback() {\n demoPlayback.stop();\n demoControls.setDemoName(null);\n isDemoPlaying = false;\n currentDemoName = null;\n clientMode = ClientMode.Normal;\n // Clean up\n },\n startRecording(filename: string) {\n if (multiplayer.isConnected()) {\n demoRecorder.startRecording(filename);\n console.log(`Recording started: ${filename}`);\n } else {\n console.log(\"Not connected to a server.\");\n }\n },\n stopRecording() {\n if (demoRecorder.getIsRecording()) {\n const data = demoRecorder.stopRecording();\n console.log(`Recording stopped. Size: ${data?.length} bytes.`);\n // Auto-save to VFS or download?\n // For now, let's offer download if in browser\n if (data && typeof document !== 'undefined') {\n const blob = new Blob([data as any], { type: 'application/octet-stream' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'demo.dm2'; // Should use filename\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }\n }\n },\n ParseCenterPrint(msg: string) {\n cg.ParseCenterPrint(msg, 0, false);\n\n if (clientExports.onCenterPrint) {\n // Default duration 3 seconds for now\n clientExports.onCenterPrint(msg, 3.0);\n }\n\n // Simple heuristic for pickup messages\n // \"You got the <item>\"\n if (msg.startsWith('You got the ')) {\n const item = msg.substring(12).replace('.', '');\n if (clientExports.onPickupMessage) {\n clientExports.onPickupMessage(item);\n }\n }\n },\n ParseNotify(msg: string) {\n cg.NotifyMessage(0, msg, false);\n\n if (clientExports.onNotify) {\n clientExports.onNotify(msg);\n }\n\n if (clientExports.onObituaryMessage) {\n if (!msg.includes(': ')) {\n clientExports.onObituaryMessage(msg);\n }\n }\n },\n showSubtitle(text: string, soundName: string) {\n cg.ShowSubtitle(text, soundName);\n },\n ParseConfigString(index: number, value: string) {\n configStrings.set(index, value);\n cg.ParseConfigString(index, value);\n\n // Handle CD Track\n if (index === ConfigStringIndex.CdTrack) {\n processCdTrack(value);\n }\n },\n demoHandler,\n multiplayer,\n configStrings,\n\n // Demo Camera API\n setDemoCameraMode(mode: DemoCameraMode) {\n demoCameraState.mode = mode;\n },\n setDemoThirdPersonDistance(dist: number) {\n demoCameraState.thirdPersonDistance = dist;\n },\n setDemoThirdPersonOffset(offset: Vec3) {\n demoCameraState.thirdPersonOffset = offset;\n },\n setDemoFreeCamera(origin: Vec3, angles: Vec3) {\n demoCameraState.freeCameraOrigin = origin;\n demoCameraState.freeCameraAngles = angles;\n },\n setDemoFollowEntity(entityId: number) {\n demoCameraState.followEntityId = entityId;\n },\n\n // Spectator API\n setSpectatorTarget(targetEntityId: number | null) {\n if (targetEntityId === null) {\n if (demoCameraState.mode === DemoCameraMode.Follow) {\n demoCameraState.mode = DemoCameraMode.Free;\n }\n demoCameraState.followEntityId = -1;\n } else {\n demoCameraState.mode = DemoCameraMode.Follow;\n demoCameraState.followEntityId = targetEntityId;\n }\n },\n\n getSpectatorTargets(): { id: number; name: string }[] {\n const targets: { id: number; name: string }[] = [];\n for (let i = 0; i < MAX_CLIENTS; i++) {\n const name = configStrings.getPlayerName(i);\n if (name) {\n const entityId = i + 1;\n targets.push({ id: entityId, name });\n }\n }\n return targets;\n },\n\n // Scoreboard API\n getScoreboard() {\n return scoreboardManager.getScoreboard();\n },\n\n // Chat API\n sendChatMessage(message: string, team: boolean = false) {\n chatManager.sendChatMessage(message, team);\n },\n getChatHistory() {\n return chatManager.getHistory();\n },\n\n registerLod(baseModel: string, lods: LodModel[]) {\n lodRegistry.register(baseModel, lods);\n }\n };\n\n // Hook up scoreboard listener\n scoreboardManager.addListener((data) => {\n if (clientExports.onScoreboardUpdate) {\n clientExports.onScoreboardUpdate(data);\n }\n });\n\n // Hook up chat listener\n chatManager.addListener((sender, message, team) => {\n if (clientExports.onChatMessage) {\n clientExports.onChatMessage(sender, message, team);\n }\n });\n\n return clientExports;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cgameBridge.ts","../../src/hud/crosshair.ts","../../src/hud/icons.ts","../../src/hud/damage.ts","../../src/hud.ts","../../src/demo/itemMapping.ts","../../src/lod.ts","../../src/entities.ts","../../src/demo/handler.ts","../../src/configStrings.ts","../../src/ui/menu/main.ts","../../src/ui/menu/saveLoad.ts","../../src/ui/menu/system.ts","../../src/ui/menu/options.ts","../../src/ui/menu/maps.ts","../../src/ui/menu/pause.ts","../../src/ui/menu/multiplayer.ts","../../src/demo/storage.ts","../../src/ui/menu/demo.ts","../../src/ui/menu/render.ts","../../src/ui/settings.ts","../../src/ui/storage.ts","../../src/ui/loading/screen.ts","../../src/ui/error.ts","../../src/ui/wheels/index.ts","../../src/net/browserWsDriver.ts","../../src/net/connection.ts","../../src/ui/demo-controls.ts","../../src/demo/camera.ts","../../src/effects.ts","../../src/effects-system.ts","../../src/blend.ts","../../src/scoreboard.ts","../../src/chat.ts","../../src/input/bindings.ts","../../src/input/controller.ts","../../src/input/command-buffer.ts","../../src/session.ts","../../src/net/master.ts","../../src/index.ts"],"names":["ArmorType","WeaponId","AmmoType","PowerupId","KeyId","vec3","mat4","RenderFx","U_REMOVE","createEmptyEntityState","applyEntityDelta","ZERO_VEC3","G_GetPowerupStat","MZ_SHOTGUN","MZ_SSHOTGUN","MZ_MACHINEGUN","MZ_CHAINGUN1","MZ_CHAINGUN2","MZ_CHAINGUN3","MZ_RAILGUN","MZ_ROCKET","MZ_GRENADE","MZ_BFG","MZ_HYPERBLASTER","MZ_BLASTER","angleVectors","dotVec3","WaterLevel","defaultPredictionState","interpolatePredictionState","ConfigStringIndex","MAX_MODELS","MAX_SOUNDS","MAX_IMAGES","DemoValidator","CvarFlags","NetChan","CMD_BACKUP","BinaryWriter","ClientCommand","writeUserCommand","crc8","BinaryStream","NetworkMessageParser","NetworkMessageBuilder","PROTOCOL_VERSION_RERELEASE","PlaybackState","DemoCameraMode","EntityEffects","MZ_BLUEHYPERBLASTER","MZ_PHALANX","MZ_IONRIPPER","MZ_ETF_RIFLE","MZ_HEATBEAM","spawnMuzzleFlash","TempEntity","spawnBulletImpact","spawnBlood","spawnExplosion","spawnBfgExplosion","spawnSplash","spawnSteam","spawnRailTrail","spawnBlasterImpact","spawnSparks","PlayerStat","CONTENTS_LAVA","CONTENTS_SLIME","MAX_CLIENTS","InputAction","PlayerButton","DEFAULT_FORWARD_SPEED","DEFAULT_SIDE_SPEED","DEFAULT_UP_SPEED","DEFAULT_YAW_SPEED","DEFAULT_PITCH_SPEED","DEFAULT_MOUSE_SENSITIVITY","mouseDeltaToViewDelta","addViewAngles","console","SaveStorage","createGame","EngineHost","ClientMode","ClientPrediction","ViewEffects","DemoPlaybackController","DemoRecorder","DynamicLightManager","GetCGameAPI","lowerKey","Camera","CONTENTS_WATER","hasPmFlag","PmFlag","vectorToAngles"],"mappings":"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","file":"index.cjs","sourcesContent":["import { CGameImport, CGameExport } from '@quake2ts/cgame';\nimport { ClientImports } from './index.js';\nimport { PmoveTraceResult, Vec3 } from '@quake2ts/shared';\nimport { ClientConfigStrings } from './configStrings.js';\nimport { Pic } from '@quake2ts/engine';\n\nexport interface ClientStateProvider {\n tickRate: number;\n frameTimeMs: number;\n serverFrame: number;\n serverProtocol: number;\n configStrings: ClientConfigStrings;\n getClientName(num: number): string;\n getKeyBinding(key: string): string;\n inAutoDemo: boolean;\n}\n\n// Stub implementation of CGameImport using existing client/engine state\nexport function createCGameImport(\n imports: ClientImports,\n state: ClientStateProvider,\n onPrint?: (msg: string) => void\n): CGameImport {\n // Local cache for texture handles to Pic objects\n // CGame uses handles (unknown), we use strings as handles.\n const picCache = new Map<string, Pic>();\n const pendingPics = new Set<string>();\n\n const getRenderer = () => imports.engine.renderer;\n\n return {\n // Frame timing\n get tick_rate() { return state.tickRate; },\n get frame_time_s() { return state.frameTimeMs / 1000.0; },\n get frame_time_ms() { return state.frameTimeMs; },\n\n // Console\n Com_Print: (msg: string) => {\n // Route to console system if exists\n console.log(`[CGAME] ${msg}`);\n if (onPrint) {\n onPrint(msg);\n }\n },\n Com_Error: (msg: string) => {\n console.error(`[CGAME ERROR] ${msg}`);\n if (onPrint) {\n onPrint(`^1[ERROR] ${msg}`);\n }\n },\n\n // Config strings\n get_configstring: (num: number) => {\n return state.configStrings.get(num) || '';\n },\n\n // Memory (No-op in JS)\n TagMalloc: (size: number, tag: number) => ({}),\n TagFree: (ptr: unknown) => {},\n FreeTags: (tag: number) => {},\n\n // Cvars\n cvar: (name: string, value: string, flags: number) => {\n if (!imports.host || !imports.host.cvars) {\n return null;\n }\n\n // Check if existing\n const existing = imports.host.cvars.get(name);\n if (existing) {\n return existing;\n }\n\n // Register new cvar\n return imports.host.cvars.register({\n name,\n defaultValue: value,\n flags,\n });\n },\n Cvar_Get: (name: string, value: string, flags: number) => {\n if (!imports.host || !imports.host.cvars) {\n // Return dummy if no host\n return { value: parseInt(value) || 0 };\n }\n // Check if existing\n let existing = imports.host.cvars.get(name);\n if (!existing) {\n // Register new cvar\n existing = imports.host.cvars.register({\n name,\n defaultValue: value,\n flags,\n });\n }\n\n // Return proxy object\n return {\n get value() { return existing!.number; }\n };\n },\n cvar_set: (name: string, value: string) => {\n imports.host?.cvars?.setValue(name, value);\n },\n cvar_forceset: (name: string, value: string) => {\n // Force set ignoring flags (if API supported)\n // For now, CvarRegistry.setValue doesn't strictly enforce flags like LATCH internally for every call,\n // but usually ForceSet implies overriding read-only or similar.\n // Our CvarRegistry.setValue is basic.\n imports.host?.cvars?.setValue(name, value);\n },\n\n // Client state\n CL_FrameValid: () => true, // Always assume valid for now\n CL_FrameTime: () => state.frameTimeMs,\n CL_ClientTime: () => state.frameTimeMs, // Use frame time as client time\n CL_ServerFrame: () => state.serverFrame,\n CL_ServerProtocol: () => state.serverProtocol,\n\n // Client info\n CL_GetClientName: (playerNum: number) => {\n return state.getClientName(playerNum);\n },\n CL_GetClientPic: (playerNum: number) => {\n // TODO: Skin/icon logic\n return '';\n },\n CL_GetClientDogtag: (playerNum: number) => {\n return '';\n },\n CL_GetKeyBinding: (key: string) => {\n return state.getKeyBinding(key);\n },\n\n // Asset Registration\n RegisterModel: (name: string) => {\n if (!imports.engine.assets) return;\n const ext = name.split('.').pop()?.toLowerCase();\n if (ext === 'md2') {\n imports.engine.assets.loadMd2Model(name).catch(e => console.warn(`Failed to precache MD2 ${name}`, e));\n } else if (ext === 'sp2') {\n imports.engine.assets.loadSprite(name).catch(e => console.warn(`Failed to precache Sprite ${name}`, e));\n } else if (ext === 'md3') {\n imports.engine.assets.loadMd3Model(name).catch(e => console.warn(`Failed to precache MD3 ${name}`, e));\n }\n },\n RegisterSound: (name: string) => {\n if (imports.engine.assets) {\n imports.engine.assets.loadSound(name).catch(e => console.warn(`Failed to precache sound ${name}`, e));\n }\n },\n\n // Drawing\n Draw_RegisterPic: (name: string) => {\n if (picCache.has(name)) {\n return name;\n }\n if (pendingPics.has(name)) {\n return name;\n }\n\n // Initiate load\n pendingPics.add(name);\n\n // We need to find the asset.\n // CGame passes names like \"pics/something.pcx\" or just \"w_shotgun\".\n // AssetManager expects specific paths usually.\n // But we can try loading as texture.\n\n // NOTE: CGame often registers simple names that map to paths.\n // We assume the name is a path or resolvable by AssetManager.\n if (imports.engine.assets) {\n imports.engine.assets.loadTexture(name).then(texture => {\n // Register with renderer\n if (imports.engine.renderer) {\n const pic = imports.engine.renderer.registerTexture(name, texture);\n picCache.set(name, pic);\n }\n pendingPics.delete(name);\n }).catch(err => {\n console.warn(`[CGameImport] Failed to load pic: ${name}`, err);\n pendingPics.delete(name);\n });\n }\n\n return name;\n },\n Draw_GetPicSize: (picHandle: unknown) => {\n const name = picHandle as string;\n const pic = picCache.get(name);\n if (pic) {\n return { width: pic.width, height: pic.height };\n }\n return { width: 0, height: 0 };\n },\n SCR_DrawChar: (x: number, y: number, char: number) => {\n // Not directly exposed, use drawString hack or expose it\n // Using single char string\n getRenderer()?.drawString(x, y, String.fromCharCode(char));\n },\n SCR_DrawPic: (x: number, y: number, picHandle: unknown) => {\n const name = picHandle as string;\n const pic = picCache.get(name);\n if (pic) {\n getRenderer()?.drawPic(x, y, pic);\n }\n },\n SCR_DrawColorPic: (x: number, y: number, picHandle: unknown, color: Vec3, alpha: number) => {\n const name = picHandle as string;\n const pic = picCache.get(name);\n if (pic) {\n getRenderer()?.drawPic(x, y, pic, [color.x, color.y, color.z, alpha]);\n }\n },\n SCR_DrawFontString: (x: number, y: number, str: string) => {\n getRenderer()?.drawString(x, y, str);\n },\n SCR_DrawCenterString: (y: number, str: string) => {\n getRenderer()?.drawCenterString(y, str);\n },\n SCR_MeasureFontString: (str: string) => {\n const stripped = str.replace(/\\^[0-9]/g, '');\n return stripped.length * 8;\n },\n SCR_FontLineHeight: () => 8,\n SCR_SetAltTypeface: (alt: boolean) => {\n // Stub\n },\n SCR_DrawBind: (x: number, y: number, command: string) => {\n // Look up binding and draw\n const key = state.getKeyBinding(command); // command is actually command name, we need key?\n // Wait, SCR_DrawBind usually takes a command and finds the key bound to it.\n // We only implemented `getKeyBinding` which takes a key.\n // We need `getBindingForKey` or `getKeysForCommand`.\n // For now, draw command name\n getRenderer()?.drawString(x, y, `[${command}]`);\n },\n\n // Localization\n Localize: (key: string) => key,\n\n // State queries\n CL_GetTextInput: () => '',\n CL_GetWarnAmmoCount: () => 5,\n CL_InAutoDemoLoop: () => state.inAutoDemo,\n\n // Prediction Trace\n PM_Trace: (start: Vec3, end: Vec3, mins: Vec3, maxs: Vec3): PmoveTraceResult => {\n return imports.engine.trace(start, end, mins, maxs);\n }\n };\n}\n","import { AssetManager, Pic, Renderer } from '@quake2ts/engine';\n\nlet crosshairPic: Pic | null = null;\nlet crosshairIndex = 0; // Default to ch1\nlet crosshairColor: [number, number, number, number] = [1, 1, 1, 1]; // Default white\nlet crosshairEnabled = true;\n\nconst CROSSHAIR_NAMES = ['ch1', 'ch2', 'ch3'];\nconst crosshairPics: (Pic | null)[] = [null, null, null];\n\nexport const Init_Crosshair = async (renderer: Renderer, assets: AssetManager) => {\n for (let i = 0; i < CROSSHAIR_NAMES.length; i++) {\n const name = CROSSHAIR_NAMES[i];\n try {\n const texture = await assets.loadTexture(`pics/${name}.pcx`);\n crosshairPics[i] = renderer.registerTexture(name, texture);\n } catch (e) {\n if (i === 0) {\n try {\n const texture = await assets.loadTexture('pics/crosshair.pcx');\n crosshairPics[i] = renderer.registerTexture('crosshair', texture);\n } catch (e2) {\n console.error('Failed to load crosshair image');\n }\n }\n }\n }\n\n crosshairPic = crosshairPics[0];\n}\n\nexport const Set_Crosshair = (index: number) => {\n // If index is 0, we treat it as disabled if we want to follow Q2 convention strictly,\n // but here index maps to CROSSHAIR_NAMES.\n // If we want a \"None\" option, we can check for that.\n\n // For now, let's keep index pointing to textures.\n // We can add a separate enable/disable function or make index -1 disable it.\n\n if (index === -1) {\n crosshairEnabled = false;\n return;\n }\n\n crosshairEnabled = true;\n if (index >= 0 && index < crosshairPics.length) {\n crosshairIndex = index;\n crosshairPic = crosshairPics[index];\n }\n};\n\nexport const Set_CrosshairColor = (r: number, g: number, b: number, a: number = 1) => {\n crosshairColor = [r, g, b, a];\n}\n\nexport const Cycle_Crosshair = () => {\n // Cycle includes a \"None\" state (represented by index -1 or just disabling)\n // 0 -> 1 -> 2 -> ... -> Disabled -> 0\n\n if (!crosshairEnabled) {\n crosshairEnabled = true;\n crosshairIndex = 0;\n } else {\n crosshairIndex++;\n if (crosshairIndex >= CROSSHAIR_NAMES.length) {\n crosshairEnabled = false;\n crosshairIndex = 0; // Reset for next cycle\n }\n }\n\n if (crosshairEnabled) {\n crosshairPic = crosshairPics[crosshairIndex];\n if (!crosshairPic) {\n let found = false;\n for (let i = 0; i < CROSSHAIR_NAMES.length; i++) {\n const idx = (crosshairIndex + i) % CROSSHAIR_NAMES.length;\n if (crosshairPics[idx]) {\n crosshairIndex = idx;\n crosshairPic = crosshairPics[idx];\n found = true;\n break;\n }\n }\n if (!found) crosshairPic = null;\n }\n } else {\n crosshairPic = null;\n }\n\n return crosshairEnabled ? crosshairIndex : -1;\n};\n\nexport const Draw_Crosshair = (renderer: Renderer, width: number, height: number) => {\n if (crosshairEnabled && crosshairPic) {\n const x = (width - crosshairPic.width) / 2;\n const y = (height - crosshairPic.height) / 2;\n renderer.drawPic(x, y, crosshairPic, crosshairColor);\n }\n};\n","import { AssetManager, Pic, Renderer } from '@quake2ts/engine';\nimport { PlayerClient, WEAPON_ITEMS, WeaponItem, PowerupId, KeyId } from '@quake2ts/game';\nimport { HUD_LAYOUT } from './layout.js';\nimport { Draw_Number } from './numbers.js';\n\nexport const iconPics = new Map<string, Pic>();\n\nconst ICON_NAMES = [\n // Weapons\n 'w_blaster', 'w_shotgun', 'w_sshotgun', 'w_machinegun', 'w_chaingun',\n 'w_glauncher', 'w_rlauncher', 'w_hyperblaster', 'w_railgun', 'w_bfg',\n 'w_grapple',\n // Ammo\n 'a_grenades', 'a_bullets', 'a_cells', 'a_rockets', 'a_shells', 'a_slugs',\n // Powerups\n 'p_quad', 'p_invulnerability', 'p_silencer', 'p_rebreather', 'p_envirosuit',\n 'p_adrenaline', 'p_megahealth',\n // Armor\n 'i_jacketarmor', 'i_combatarmor', 'i_bodyarmor', 'i_powerscreen', 'i_powershield',\n // Keys\n 'k_datacd', 'k_powercube', 'k_pyramid', 'k_dataspin', 'k_security', 'k_bluekey', 'k_redkey'\n];\n\nexport const Init_Icons = async (renderer: Renderer, assets: AssetManager) => {\n for (const name of ICON_NAMES) {\n try {\n const texture = await assets.loadTexture(`pics/${name}.pcx`);\n const pic = renderer.registerTexture(name, texture);\n iconPics.set(name, pic);\n } catch (e) {\n console.error(`Failed to load HUD image: pics/${name}.pcx`);\n }\n }\n};\n\nexport const Draw_Icons = (\n renderer: Renderer,\n client: PlayerClient,\n hudNumberPics: readonly Pic[],\n numberWidth: number,\n timeMs: number\n) => {\n if (!client) {\n return;\n }\n\n // Draw armor icon\n const armor = client.inventory.armor;\n if (armor && armor.armorCount > 0) {\n const iconName = `i_${armor.armorType}armor`;\n const icon = iconPics.get(iconName);\n if (icon) {\n renderer.drawPic(HUD_LAYOUT.ARMOR_X - 24, HUD_LAYOUT.ARMOR_Y - 2, icon);\n }\n }\n\n // Draw current weapon icon\n const currentWeapon = client.inventory.currentWeapon;\n if (currentWeapon) {\n const weaponDef = Object.values(WEAPON_ITEMS).find((w: WeaponItem) => w.weaponId === currentWeapon);\n if (weaponDef) {\n const iconName = `w_${weaponDef.id.substring(7)}`;\n const icon = iconPics.get(iconName);\n if (icon) {\n renderer.drawPic(HUD_LAYOUT.WEAPON_ICON_X, HUD_LAYOUT.WEAPON_ICON_Y, icon);\n }\n }\n }\n\n // Draw powerup icons\n let powerupX = HUD_LAYOUT.POWERUP_X;\n for (const [powerup, expiresAt] of client.inventory.powerups.entries()) {\n if (expiresAt && expiresAt > timeMs) {\n const iconName = `p_${powerup}`;\n const icon = iconPics.get(iconName);\n if (icon) {\n renderer.drawPic(powerupX, HUD_LAYOUT.POWERUP_Y, icon);\n\n // Draw remaining time\n const remainingSeconds = Math.ceil((expiresAt - timeMs) / 1000);\n Draw_Number(renderer, powerupX + icon.width + 2, HUD_LAYOUT.POWERUP_Y, remainingSeconds, hudNumberPics, numberWidth);\n\n powerupX -= (icon.width + numberWidth * remainingSeconds.toString().length + 8);\n }\n }\n }\n\n const keys = Array.from(client.inventory.keys).sort();\n let keyY = 300;\n\n for (const key of keys) {\n let iconName = '';\n switch (key) {\n case KeyId.Blue: iconName = 'k_bluekey'; break;\n case KeyId.Red: iconName = 'k_redkey'; break;\n case KeyId.Green: iconName = 'k_security'; break;\n case KeyId.Yellow: iconName = 'k_pyramid'; break;\n }\n\n if (iconName) {\n const icon = iconPics.get(iconName);\n if (icon) {\n renderer.drawPic(HUD_LAYOUT.WEAPON_ICON_X, keyY, icon);\n keyY += icon.height + 2;\n }\n }\n }\n};\n","import { AssetManager, Pic, Renderer } from '@quake2ts/engine';\nimport { PlayerState, angleVectors, dotVec3, Vec3 } from '@quake2ts/shared';\n\nconst damagePics = new Map<string, Pic>();\n\nconst DAMAGE_INDICATOR_NAMES = [\n 'd_left', 'd_right', 'd_up', 'd_down'\n];\n\nexport const Init_Damage = async (renderer: Renderer, assets: AssetManager) => {\n for (const name of DAMAGE_INDICATOR_NAMES) {\n try {\n const texture = await assets.loadTexture(`pics/${name}.pcx`);\n const pic = renderer.registerTexture(name, texture);\n damagePics.set(name, pic);\n } catch (e) {\n console.error(`Failed to load HUD image: pics/${name}.pcx`);\n }\n }\n};\n\nexport const Draw_Damage = (renderer: Renderer, ps: PlayerState) => {\n if (!ps.damageIndicators) {\n return;\n }\n\n const screenWidth = renderer.width;\n const screenHeight = renderer.height;\n\n const { forward, right, up } = angleVectors(ps.viewAngles);\n\n for (const indicator of ps.damageIndicators) {\n const { direction, strength } = indicator;\n\n const normalizedDirection = { ...direction };\n const len = Math.sqrt(normalizedDirection.x * normalizedDirection.x + normalizedDirection.y * normalizedDirection.y + normalizedDirection.z * normalizedDirection.z);\n if (len > 0) {\n normalizedDirection.x /= len;\n normalizedDirection.y /= len;\n normalizedDirection.z /= len;\n }\n\n const rightDot = dotVec3(normalizedDirection, right);\n const forwardDot = dotVec3(normalizedDirection, forward);\n\n const angle = Math.atan2(forwardDot, rightDot) * 180 / Math.PI;\n\n let pic: Pic | undefined;\n let x = 0;\n let y = 0;\n\n if (angle > -45 && angle <= 45) {\n pic = damagePics.get('d_right');\n x = screenWidth - (pic?.width || 0);\n y = (screenHeight - (pic?.height || 0)) / 2;\n } else if (angle > 45 && angle <= 135) {\n pic = damagePics.get('d_up');\n x = (screenWidth - (pic?.width || 0)) / 2;\n y = 0;\n } else if (angle > 135 || angle <= -135) {\n pic = damagePics.get('d_left');\n x = 0;\n y = (screenHeight - (pic?.height || 0)) / 2;\n } else {\n pic = damagePics.get('d_down');\n x = (screenWidth - (pic?.width || 0)) / 2;\n y = screenHeight - (pic?.height || 0);\n }\n \n if (pic) {\n renderer.drawPic(x, y, pic);\n }\n }\n};\n","import { FrameRenderStats, AssetManager } from '@quake2ts/engine';\nimport { Pic, Renderer } from '@quake2ts/engine';\nimport { PlayerClient } from '@quake2ts/game';\nimport { PlayerState } from '@quake2ts/shared';\nimport { Draw_Crosshair, Init_Crosshair } from './hud/crosshair.js';\nimport { Init_Icons } from './hud/icons.js';\nimport { Draw_Damage, Init_Damage } from './hud/damage.js';\nimport { Draw_Diagnostics } from './hud/diagnostics.js';\nimport { MessageSystem } from './hud/messages.js';\nimport { Draw_Blends } from './hud/blends.js';\nimport { Draw_Pickup } from './hud/pickup.js';\nimport { Draw_StatusBar } from './hud/statusbar.js';\nimport { getHudLayout } from './hud/layout.js';\n\nconst hudNumberPics: Pic[] = [];\nlet numberWidth = 0;\n\nexport const Init_Hud = async (renderer: Renderer, assets: AssetManager) => {\n for (let i = 0; i < 10; i++) {\n try {\n const texture = await assets.loadTexture(`pics/hud/num_${i}.pcx`);\n const pic = renderer.registerTexture(`hud_num_${i}`, texture);\n hudNumberPics.push(pic);\n } catch (e) {\n console.error(`Failed to load HUD image: pics/hud/num_${i}.pcx`, e);\n }\n }\n if (hudNumberPics.length > 0) {\n numberWidth = hudNumberPics[0].width;\n }\n\n await Init_Crosshair(renderer, assets);\n await Init_Icons(renderer, assets);\n await Init_Damage(renderer, assets);\n};\n\nexport const Draw_Hud = (\n renderer: Renderer,\n ps: PlayerState,\n client: PlayerClient,\n health: number,\n armor: number,\n ammo: number,\n stats: FrameRenderStats,\n messageSystem: MessageSystem,\n timeMs: number\n) => {\n renderer.begin2D();\n\n Draw_Blends(renderer, ps);\n\n if (ps.damageAlpha > 0) {\n renderer.drawfillRect(0, 0, renderer.width, renderer.height, [1, 0, 0, ps.damageAlpha]);\n }\n\n const layout = getHudLayout(renderer.width, renderer.height);\n\n Draw_StatusBar(renderer, client, health, armor, ammo, hudNumberPics, numberWidth, timeMs, layout);\n\n Draw_Pickup(renderer, ps);\n\n Draw_Damage(renderer, ps);\n Draw_Diagnostics(renderer, stats);\n\n messageSystem.drawCenterPrint(renderer, timeMs, layout);\n messageSystem.drawNotifications(renderer, timeMs);\n\n if (ps.centerPrint) {\n // Use layout for position?\n // Or keep hardcoded logic relative to layout.\n // Assuming renderer.height/2 is always center.\n renderer.drawCenterString(renderer.height / 2 - 20, ps.centerPrint);\n }\n\n if (ps.notify) {\n renderer.drawString(8, 8, ps.notify);\n }\n\n Draw_Crosshair(renderer, renderer.width, renderer.height);\n renderer.end2D();\n};\n","import { WeaponId, PowerupId, KeyId } from '@quake2ts/game';\nimport { AmmoType } from '@quake2ts/game';\nimport { ArmorType } from '@quake2ts/game';\n\nexport type ItemMappingType =\n | { type: 'weapon'; id: WeaponId }\n | { type: 'ammo'; id: AmmoType }\n | { type: 'armor'; id: ArmorType }\n | { type: 'powerup'; id: PowerupId }\n | { type: 'key'; id: KeyId }\n | { type: 'health'; id: string } // Health is usually handled specially or just ignored in inventory listing\n | { type: 'item'; id: string }\n | { type: 'null' };\n\n// Order based on item_id_t in g_local.h and itemlist in g_items.cpp\n// This MUST match the original Quake 2 item index order.\nexport const DEMO_ITEM_MAPPING: ItemMappingType[] = [\n { type: 'null' }, // IT_NULL = 0\n\n // Armor\n { type: 'armor', id: ArmorType.BODY }, // IT_ARMOR_BODY\n { type: 'armor', id: ArmorType.COMBAT }, // IT_ARMOR_COMBAT\n { type: 'armor', id: ArmorType.JACKET }, // IT_ARMOR_JACKET\n { type: 'armor', id: ArmorType.JACKET }, // IT_ARMOR_SHARD (Handled as jacket in base game logic usually, or separate counter)\n\n // Power Armor\n { type: 'item', id: 'item_power_screen' }, // IT_ITEM_POWER_SCREEN\n { type: 'item', id: 'item_power_shield' }, // IT_ITEM_POWER_SHIELD\n\n // Weapons\n { type: 'weapon', id: WeaponId.Grapple }, // IT_WEAPON_GRAPPLE\n { type: 'weapon', id: WeaponId.Blaster }, // IT_WEAPON_BLASTER\n { type: 'weapon', id: WeaponId.ChainFist }, // IT_WEAPON_CHAINFIST\n { type: 'weapon', id: WeaponId.Shotgun }, // IT_WEAPON_SHOTGUN\n { type: 'weapon', id: WeaponId.SuperShotgun },// IT_WEAPON_SSHOTGUN\n { type: 'weapon', id: WeaponId.Machinegun }, // IT_WEAPON_MACHINEGUN\n { type: 'weapon', id: WeaponId.EtfRifle }, // IT_WEAPON_ETF_RIFLE\n { type: 'weapon', id: WeaponId.Chaingun }, // IT_WEAPON_CHAINGUN\n\n // Ammo\n { type: 'ammo', id: AmmoType.Grenades }, // IT_AMMO_GRENADES\n { type: 'ammo', id: AmmoType.Trap }, // IT_AMMO_TRAP\n { type: 'ammo', id: AmmoType.Tesla }, // IT_AMMO_TESLA\n\n // Weapons cont.\n { type: 'weapon', id: WeaponId.GrenadeLauncher }, // IT_WEAPON_GLAUNCHER\n { type: 'weapon', id: WeaponId.ProxLauncher }, // IT_WEAPON_PROXLAUNCHER\n { type: 'weapon', id: WeaponId.RocketLauncher }, // IT_WEAPON_RLAUNCHER\n { type: 'weapon', id: WeaponId.HyperBlaster }, // IT_WEAPON_HYPERBLASTER\n { type: 'weapon', id: WeaponId.IonRipper }, // IT_WEAPON_IONRIPPER\n { type: 'weapon', id: WeaponId.PlasmaBeam }, // IT_WEAPON_PLASMABEAM\n { type: 'weapon', id: WeaponId.Railgun }, // IT_WEAPON_RAILGUN\n { type: 'weapon', id: WeaponId.Phalanx }, // IT_WEAPON_PHALANX\n { type: 'weapon', id: WeaponId.BFG10K }, // IT_WEAPON_BFG\n { type: 'weapon', id: WeaponId.Disruptor }, // IT_WEAPON_DISRUPTOR\n\n // Ammo\n { type: 'ammo', id: AmmoType.Shells }, // IT_AMMO_SHELLS\n { type: 'ammo', id: AmmoType.Bullets }, // IT_AMMO_BULLETS\n { type: 'ammo', id: AmmoType.Cells }, // IT_AMMO_CELLS\n { type: 'ammo', id: AmmoType.Rockets }, // IT_AMMO_ROCKETS\n { type: 'ammo', id: AmmoType.Slugs }, // IT_AMMO_SLUGS\n { type: 'ammo', id: AmmoType.MagSlugs }, // IT_AMMO_MAGSLUG\n { type: 'ammo', id: AmmoType.Flechettes }, // IT_AMMO_FLECHETTES\n { type: 'ammo', id: AmmoType.Prox }, // IT_AMMO_PROX\n { type: 'ammo', id: AmmoType.Nuke }, // IT_AMMO_NUKE\n { type: 'ammo', id: AmmoType.Rounds }, // IT_AMMO_ROUNDS\n\n // Items / Powerups\n { type: 'powerup', id: PowerupId.QuadDamage }, // IT_ITEM_QUAD\n { type: 'powerup', id: PowerupId.QuadFire }, // IT_ITEM_QUADFIRE\n { type: 'powerup', id: PowerupId.Invulnerability }, // IT_ITEM_INVULNERABILITY\n { type: 'powerup', id: PowerupId.Invisibility }, // IT_ITEM_INVISIBILITY\n { type: 'powerup', id: PowerupId.Silencer }, // IT_ITEM_SILENCER\n { type: 'powerup', id: PowerupId.Rebreather }, // IT_ITEM_REBREATHER\n { type: 'powerup', id: PowerupId.EnviroSuit }, // IT_ITEM_ENVIROSUIT\n { type: 'health', id: 'ancient_head' }, // IT_ITEM_ANCIENT_HEAD\n { type: 'health', id: 'legacy_head' }, // IT_ITEM_LEGACY_HEAD\n { type: 'health', id: 'adrenaline' }, // IT_ITEM_ADRENALINE\n { type: 'powerup', id: PowerupId.Bandolier }, // IT_ITEM_BANDOLIER\n { type: 'powerup', id: PowerupId.AmmoPack }, // IT_ITEM_PACK\n { type: 'powerup', id: PowerupId.IRGoggles }, // IT_ITEM_IR_GOGGLES\n { type: 'powerup', id: PowerupId.DoubleDamage }, // IT_ITEM_DOUBLE\n { type: 'powerup', id: PowerupId.SphereVengeance }, // IT_ITEM_SPHERE_VENGEANCE\n { type: 'powerup', id: PowerupId.SphereHunter }, // IT_ITEM_SPHERE_HUNTER\n { type: 'powerup', id: PowerupId.SphereDefender }, // IT_ITEM_SPHERE_DEFENDER\n { type: 'powerup', id: PowerupId.Doppelganger }, // IT_ITEM_DOPPELGANGER\n { type: 'powerup', id: PowerupId.TagToken }, // IT_ITEM_TAG_TOKEN\n\n // Keys\n { type: 'key', id: KeyId.DataCD }, // IT_KEY_DATA_CD\n { type: 'key', id: KeyId.PowerCube }, // IT_KEY_POWER_CUBE\n { type: 'key', id: KeyId.ExplosiveCharges }, // IT_KEY_EXPLOSIVE_CHARGES\n { type: 'key', id: KeyId.Yellow }, // IT_KEY_YELLOW\n { type: 'key', id: KeyId.PowerCore }, // IT_KEY_POWER_CORE\n { type: 'key', id: KeyId.Pyramid }, // IT_KEY_PYRAMID\n { type: 'key', id: KeyId.DataSpinner }, // IT_KEY_DATA_SPINNER\n { type: 'key', id: KeyId.Pass }, // IT_KEY_PASS\n { type: 'key', id: KeyId.Blue }, // IT_KEY_BLUE_KEY\n { type: 'key', id: KeyId.Red }, // IT_KEY_RED_KEY\n { type: 'key', id: KeyId.Green }, // IT_KEY_GREEN_KEY\n { type: 'key', id: KeyId.CommanderHead }, // IT_KEY_COMMANDER_HEAD\n { type: 'key', id: KeyId.Airstrike }, // IT_KEY_AIRSTRIKE\n { type: 'key', id: KeyId.NukeContainer }, // IT_KEY_NUKE_CONTAINER\n { type: 'key', id: KeyId.Nuke }, // IT_KEY_NUKE\n\n // Health\n { type: 'health', id: 'health_small' }, // IT_HEALTH_SMALL\n { type: 'health', id: 'health_medium' }, // IT_HEALTH_MEDIUM\n { type: 'health', id: 'health_large' }, // IT_HEALTH_LARGE\n { type: 'health', id: 'health_mega' }, // IT_HEALTH_MEGA\n\n // CTF\n { type: 'key', id: KeyId.RedFlag }, // IT_FLAG1\n { type: 'key', id: KeyId.BlueFlag }, // IT_FLAG2\n\n // Tech\n { type: 'powerup', id: PowerupId.TechResistance }, // IT_TECH_RESISTANCE\n { type: 'powerup', id: PowerupId.TechStrength }, // IT_TECH_STRENGTH\n { type: 'powerup', id: PowerupId.TechHaste }, // IT_TECH_HASTE\n { type: 'powerup', id: PowerupId.TechRegeneration }, // IT_TECH_REGENERATION\n\n { type: 'powerup', id: PowerupId.Flashlight }, // IT_ITEM_FLASHLIGHT\n { type: 'powerup', id: PowerupId.Compass }, // IT_ITEM_COMPASS\n];\n","\nexport interface LodModel {\n distance: number;\n model: string;\n}\n\nexport class LodRegistry {\n private registry = new Map<string, LodModel[]>();\n\n register(baseModel: string, lods: LodModel[]) {\n // Sort LODs by distance descending so we can find the first one that fits\n this.registry.set(baseModel, lods.sort((a, b) => b.distance - a.distance));\n }\n\n getLodModel(baseModel: string, distance: number): string | undefined {\n const lods = this.registry.get(baseModel);\n if (!lods) return undefined;\n\n // Find first LOD where distance > threshold\n // Actually, typically:\n // dist 0-500: base\n // dist 500-1000: lod1\n // dist 1000+: lod2\n\n // My registry has { distance: 500, model: lod1 }, { distance: 1000, model: lod2 }\n\n // If distance > 1000, use lod2.\n // If distance > 500, use lod1.\n\n for (const lod of lods) {\n if (distance > lod.distance) {\n return lod.model;\n }\n }\n\n return undefined;\n }\n}\n\nexport const lodRegistry = new LodRegistry();\n","\nimport { EntityState, RenderFx } from '@quake2ts/shared';\nimport { RenderableEntity, Renderer } from '@quake2ts/engine';\nimport { mat4, vec3 } from 'gl-matrix';\nimport { ClientConfigStrings } from './configStrings.js';\nimport { ClientImports } from './index.js';\nimport { lodRegistry } from './lod.js';\n\nfunction lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\nfunction lerpAngle(a: number, b: number, t: number): number {\n // Simple lerp for now, should ideally handle wrapping\n return lerp(a, b, t);\n}\n\n// Define a type that covers both Shared (camelCase) and Engine (lowercase) EntityState\n// to avoid strict type mismatches when called from Demo Handler (Engine types).\ntype AnyEntityState = {\n number: number;\n origin: { x: number, y: number, z: number };\n angles: { x: number, y: number, z: number };\n frame: number;\n alpha?: number;\n scale?: number;\n // Shared uses camelCase\n modelIndex?: number;\n skinNum?: number;\n renderfx?: number;\n // Engine uses lowercase\n modelindex?: number;\n skinnum?: number;\n};\n\nexport function buildRenderableEntities(\n latestEntities: AnyEntityState[],\n previousEntities: AnyEntityState[] | Map<number, AnyEntityState>,\n alpha: number,\n configStrings: ClientConfigStrings,\n imports: ClientImports,\n cameraPosition?: { x: number, y: number, z: number } // Optional camera position for LOD\n): RenderableEntity[] {\n const renderables: RenderableEntity[] = [];\n const assets = imports.engine.assets;\n if (!assets) return renderables;\n\n let prevMap: Map<number, AnyEntityState>;\n if (previousEntities instanceof Map) {\n prevMap = previousEntities;\n } else {\n prevMap = new Map(previousEntities.map(e => [e.number, e]));\n }\n\n const camVec = cameraPosition ? vec3.fromValues(cameraPosition.x, cameraPosition.y, cameraPosition.z) : null;\n\n for (const ent of latestEntities) {\n console.log(`Processing Entity: ${ent.number} (frame: ${ent.frame})`);\n\n // This is the suspicious line\n const prev = prevMap.get(ent.number) ?? ent;\n\n console.log(`Matched Previous: ${prev === ent ? 'SAME AS CURRENT' : 'FOUND PREVIOUS'} (frame: ${prev.frame})`);\n\n // Normalize property access\n const modelIndex = ent.modelIndex ?? ent.modelindex;\n const skinNum = ent.skinNum ?? ent.skinnum;\n\n if (modelIndex === undefined) continue;\n\n let modelName = configStrings.getModelName(modelIndex);\n if (!modelName) continue;\n\n // Interpolate origin and angles\n const origin = {\n x: lerp(prev.origin.x, ent.origin.x, alpha),\n y: lerp(prev.origin.y, ent.origin.y, alpha),\n z: lerp(prev.origin.z, ent.origin.z, alpha)\n };\n\n // Check LOD\n if (camVec) {\n const dist = vec3.distance(camVec, vec3.fromValues(origin.x, origin.y, origin.z));\n const lodModel = lodRegistry.getLodModel(modelName, dist);\n if (lodModel) {\n // If the LOD model is loaded, use it. Otherwise stick to base.\n // We don't want to trigger sync loads or fail here.\n // Assuming LOD models are preloaded or check existence.\n if (assets.getMd2Model(lodModel) || assets.getMd3Model(lodModel)) {\n modelName = lodModel;\n }\n }\n }\n\n const model = assets.getMd2Model(modelName) || assets.getMd3Model(modelName);\n if (!model) continue;\n\n const angles = {\n x: lerpAngle(prev.angles.x, ent.angles.x, alpha),\n y: lerpAngle(prev.angles.y, ent.angles.y, alpha),\n z: lerpAngle(prev.angles.z, ent.angles.z, alpha)\n };\n\n // Animation interpolation\n const frame = ent.frame;\n const prevFrame = prev.frame;\n\n // Scale interpolation\n const scaleA: number = (prev.scale !== undefined) ? prev.scale : 1.0;\n const scaleB: number = (ent.scale !== undefined) ? ent.scale : 1.0;\n const scale = lerp(scaleA, scaleB, alpha);\n\n // Alpha interpolation\n const getAlpha = (val: number | undefined) => (val === undefined || val === 0) ? 255 : val;\n const alphaA = getAlpha(prev.alpha);\n const alphaB = getAlpha(ent.alpha);\n const alphaVal = lerp(alphaA, alphaB, alpha);\n const normalizedAlpha = alphaVal / 255.0;\n\n const mat = mat4.create();\n mat4.translate(mat, mat, [origin.x, origin.y, origin.z]);\n mat4.rotateZ(mat, mat, angles.z * Math.PI / 180);\n mat4.rotateY(mat, mat, angles.y * Math.PI / 180);\n mat4.rotateX(mat, mat, angles.x * Math.PI / 180);\n mat4.scale(mat, mat, [scale, scale, scale]);\n\n const skinName = (skinNum !== undefined && skinNum > 0) ? configStrings.getImageName(skinNum) : undefined;\n\n // Handle RenderFx Tints\n let tint: [number, number, number, number] | undefined;\n const renderfx = ent.renderfx ?? 0;\n\n // Check for Freeze effect (ShellGreen | ShellBlue) explicitly first\n if ((renderfx & (RenderFx.ShellGreen | RenderFx.ShellBlue)) === (RenderFx.ShellGreen | RenderFx.ShellBlue)) {\n tint = [0, 1, 1, 1]; // Cyan (Freeze)\n } else if (renderfx & RenderFx.ShellRed) {\n tint = [1, 0, 0, 1]; // Red Shell\n } else if (renderfx & RenderFx.ShellGreen) {\n tint = [0, 1, 0, 1]; // Green Shell\n } else if (renderfx & RenderFx.ShellBlue) {\n tint = [0, 0, 1, 1]; // Blue Shell\n } else if (renderfx & RenderFx.ShellDouble) {\n tint = [1, 1, 0, 1]; // Double Damage\n } else if (renderfx & RenderFx.ShellHalfDam) {\n tint = [0.5, 0.5, 0.5, 1]; // Half Damage\n }\n\n if (model.header.magic === 844121161) { // IDP2 (MD2)\n renderables.push({\n type: 'md2',\n model: model as any, // Cast to Md2Model\n blend: {\n frame0: prevFrame,\n frame1: frame,\n lerp: alpha\n },\n transform: mat as Float32Array,\n skin: skinName,\n alpha: normalizedAlpha,\n tint: tint as readonly [number, number, number, number] | undefined\n });\n } else if (model.header.magic === 860898377) { // IDP3 (MD3)\n renderables.push({\n type: 'md3',\n model: model as any,\n blend: {\n frame0: prevFrame,\n frame1: frame,\n lerp: alpha\n },\n transform: mat as Float32Array,\n alpha: normalizedAlpha,\n tint: tint as readonly [number, number, number, number] | undefined\n // Lighting? Skins?\n });\n }\n }\n\n return renderables;\n}\n","import {\n NetworkMessageHandler,\n EntityState,\n FrameData,\n createEmptyEntityState,\n ProtocolPlayerState,\n U_ORIGIN1, U_ORIGIN2, U_ORIGIN3,\n U_ANGLE1, U_ANGLE2, U_ANGLE3,\n U_MODEL, U_MODEL2, U_MODEL3, U_MODEL4,\n U_FRAME8, U_FRAME16,\n U_SKIN8, U_SKIN16,\n U_EFFECTS8, U_EFFECTS16,\n U_RENDERFX8, U_RENDERFX16,\n U_OLDORIGIN,\n U_SOUND,\n U_EVENT,\n U_SOLID,\n U_REMOVE,\n // New Rerelease Flags\n U_ALPHA,\n U_SCALE,\n U_INSTANCE_BITS,\n U_LOOP_VOLUME,\n U_LOOP_ATTENUATION_HIGH,\n U_OWNER_HIGH,\n U_OLD_FRAME_HIGH,\n FogData,\n DamageIndicator,\n RenderableEntity,\n applyEntityDelta\n} from '@quake2ts/engine';\nimport {\n Vec3, ZERO_VEC3,\n G_GetPowerupStat, PowerupId,\n MZ_BLASTER, MZ_MACHINEGUN, MZ_SHOTGUN, MZ_CHAINGUN1, MZ_CHAINGUN2, MZ_CHAINGUN3,\n MZ_RAILGUN, MZ_ROCKET, MZ_GRENADE, MZ_LOGIN, MZ_LOGOUT, MZ_SSHOTGUN, MZ_BFG, MZ_HYPERBLASTER,\n angleVectors, dotVec3\n} from '@quake2ts/shared';\n// Import from cgame\nimport { PredictionState, defaultPredictionState, interpolatePredictionState, ViewEffects } from '@quake2ts/cgame';\nimport { PmFlag, PmType, WaterLevel } from '@quake2ts/shared';\nimport { PlayerInventory, WeaponId, KeyId, ArmorType } from '@quake2ts/game';\nimport { DEMO_ITEM_MAPPING } from './itemMapping.js';\nimport { ClientImports } from '../index.js';\nimport { buildRenderableEntities } from '../entities.js';\nimport { ClientConfigStrings } from '../configStrings.js';\n\n// Constants\nconst MAX_CONFIGSTRINGS = 32768; // Rerelease increased limits\n\nexport interface DemoHandlerCallbacks {\n onCenterPrint?: (msg: string) => void;\n onPrint?: (level: number, msg: string) => void;\n onConfigString?: (index: number, str: string) => void;\n onLevelRestart?: () => void;\n onWaitingForPlayers?: () => void;\n onMuzzleFlash?: (ent: number, weapon: number) => void;\n onMuzzleFlash2?: (ent: number, weapon: number) => void;\n onMuzzleFlash3?: (ent: number, weapon: number) => void;\n onTempEntity?: (type: number, pos: Vec3, pos2?: Vec3, dir?: Vec3, cnt?: number, color?: number, ent?: number, srcEnt?: number, destEnt?: number) => void;\n onFog?: (data: FogData) => void;\n onDamage?: (indicators: DamageIndicator[]) => void;\n onServerData?: (protocol: number, tickRate?: number) => void;\n onLocPrint?: (flags: number, base: string, args: string[]) => void;\n onLayout?: (layout: string) => void;\n}\n\nexport class ClientNetworkHandler implements NetworkMessageHandler {\n public configstrings: string[] = new Array(MAX_CONFIGSTRINGS).fill('');\n public entities: Map<number, EntityState> = new Map(); // Current frame entities\n public previousEntities: Map<number, EntityState> = new Map(); // Previous frame entities\n public baselines: Map<number, EntityState> = new Map();\n\n public previousFrame: FrameData | null = null;\n public latestFrame: FrameData | null = null;\n\n // Stats for HUD\n public stats: number[] = new Array(32).fill(0);\n public inventory: number[] = new Array(256).fill(0);\n\n private imports?: ClientImports;\n private callbacks?: DemoHandlerCallbacks;\n private view?: ViewEffects;\n private playerNum: number = 0;\n\n constructor(imports?: ClientImports, callbacks?: DemoHandlerCallbacks) {\n this.imports = imports;\n this.callbacks = callbacks;\n }\n\n setImports(imports: ClientImports) {\n this.imports = imports;\n }\n\n setCallbacks(callbacks: DemoHandlerCallbacks) {\n this.callbacks = callbacks;\n }\n\n setView(view: ViewEffects) {\n this.view = view;\n }\n\n onServerData(protocol: number, serverCount: number, attractLoop: number, gameDir: string, playerNum: number, levelName: string, tickRate?: number, demoType?: number): void {\n console.log(`Demo: Server Data - Protocol: ${protocol}, Level: ${levelName}, Tick: ${tickRate ?? 10}`);\n // Reset state on new server connection\n this.configstrings.fill('');\n this.entities.clear();\n this.previousEntities.clear();\n this.baselines.clear();\n this.latestFrame = null;\n this.previousFrame = null;\n this.playerNum = playerNum;\n\n if (this.callbacks?.onServerData) {\n this.callbacks.onServerData(protocol, tickRate);\n }\n }\n\n onConfigString(index: number, str: string): void {\n this.configstrings[index] = str;\n if (this.callbacks?.onConfigString) {\n this.callbacks.onConfigString(index, str);\n }\n }\n\n onSpawnBaseline(entity: EntityState): void {\n // Deep copy to ensure baseline is preserved\n this.baselines.set(entity.number, JSON.parse(JSON.stringify(entity)));\n }\n\n onFrame(frame: FrameData): void {\n if (this.latestFrame) {\n this.previousFrame = this.latestFrame;\n // Store previous entities before updating\n // TODO - We create a deep snapshot to ensure previous state is preserved exactly as it was but this is clearly inefficient each frame, need to fix so not needed or is optional for debug\n this.previousEntities = new Map();\n for (const [k, v] of this.entities) {\n this.previousEntities.set(k, JSON.parse(JSON.stringify(v)));\n }\n }\n this.latestFrame = frame;\n this.stats = [...frame.playerState.stats];\n\n const packetEntities = frame.packetEntities;\n const newEntities = new Map<number, EntityState>();\n\n // TODO: If delta frame, then we deep copy copy previous entities as starting state but this is inefficient, perhaps just need to have debug plag to deep vs shallow \n if (packetEntities.delta) {\n for (const [num, ent] of this.entities) {\n newEntities.set(num, JSON.parse(JSON.stringify(ent)));\n }\n } else {\n // If not delta, we start fresh (empty newEntities)\n }\n\n for (const partial of packetEntities.entities) {\n if (partial.bits & U_REMOVE) {\n // Explicit removal: remove from newEntities if present\n newEntities.delete(partial.number);\n continue;\n }\n\n const number = partial.number;\n let source: EntityState | undefined;\n\n // Determine source for delta compression\n if (packetEntities.delta && this.entities.has(number)) {\n source = this.entities.get(number);\n } else if (this.baselines.has(number)) {\n source = this.baselines.get(number);\n } else {\n source = createEmptyEntityState();\n }\n\n // TODO again another deep copy, should be behind a flag surely for debug only\n const final = JSON.parse(JSON.stringify(source!));\n applyEntityDelta(final, partial);\n newEntities.set(number, final);\n }\n\n this.entities = newEntities;\n }\n\n onCenterPrint(msg: string): void {\n if (this.callbacks?.onCenterPrint) {\n this.callbacks.onCenterPrint(msg);\n } else {\n console.log(`[Center]: ${msg}`);\n }\n }\n\n onStuffText(msg: string): void {\n if (this.imports?.engine.cmd) {\n this.imports.engine.cmd.executeText(msg);\n }\n }\n\n onPrint(level: number, msg: string): void {\n if (this.callbacks?.onPrint) {\n this.callbacks.onPrint(level, msg);\n } else {\n console.log(`[Print ${level}]: ${msg}`);\n }\n }\n\n onSound(flags: number, soundNum: number, volume?: number, attenuation?: number, offset?: number, ent?: number, pos?: Vec3): void {\n if (!this.imports?.engine.audio) return;\n\n // Ensure volume/attenuation defaults if missing\n const vol = volume ?? 1.0;\n const attn = attenuation ?? 1.0;\n const timeofs = offset ?? 0;\n\n if (ent && ent > 0) {\n this.imports.engine.audio.sound(ent, 0, soundNum, vol, attn, timeofs);\n } else if (pos) {\n this.imports.engine.audio.positioned_sound(pos, soundNum, vol, attn);\n } else {\n // TODO Global sound?\n // this.imports.engine.audio.play_channel(...);\n }\n }\n\n onTempEntity(type: number, pos: Vec3, pos2?: Vec3, dir?: Vec3, cnt?: number, color?: number, ent?: number, srcEnt?: number, destEnt?: number): void {\n if (this.callbacks?.onTempEntity) {\n this.callbacks.onTempEntity(type, pos, pos2, dir, cnt, color, ent, srcEnt, destEnt);\n }\n }\n\n onLayout(layout: string): void {\n if (this.callbacks?.onLayout) {\n this.callbacks.onLayout(layout);\n }\n }\n\n onInventory(inventory: number[]): void {\n this.inventory = [...inventory];\n }\n\n onMuzzleFlash(ent: number, weapon: number): void {\n if (this.callbacks?.onMuzzleFlash) {\n this.callbacks.onMuzzleFlash(ent, weapon);\n }\n }\n\n onMuzzleFlash2(ent: number, weapon: number): void {\n if (this.callbacks?.onMuzzleFlash2) {\n this.callbacks.onMuzzleFlash2(ent, weapon);\n }\n }\n\n onMuzzleFlash3(ent: number, weapon: number): void {\n // EV_MUZZLEFLASH broadcast includes entity number.\n // We only want to add view kick if this is the local player.\n // ent is 1-based index (usually) or raw number.\n // playerNum is 0-based.\n // In Q2 server: player entities are at index `playernum + 1`.\n const isLocalPlayer = ent === (this.playerNum + 1);\n\n if (isLocalPlayer && this.view) {\n let pitch = 0;\n let yaw = 0;\n let roll = 0; // Not used often\n let kickOrigin: Vec3 = ZERO_VEC3;\n\n // Check Quad Damage scaling\n const quad = G_GetPowerupStat(this.stats, PowerupId.QuadDamage);\n const scale = quad ? 4 : 1;\n\n switch (weapon) {\n case MZ_SHOTGUN:\n pitch = -2;\n kickOrigin = { x: -2, y: 0, z: 0 };\n break;\n case MZ_SSHOTGUN:\n pitch = -4;\n kickOrigin = { x: -4, y: 0, z: 0 };\n break;\n case MZ_MACHINEGUN:\n pitch = -1;\n yaw = (Math.random() - 0.5); // crandom\n break;\n case MZ_CHAINGUN1:\n case MZ_CHAINGUN2:\n case MZ_CHAINGUN3:\n pitch = -0.5;\n yaw = (Math.random() - 0.5);\n break;\n case MZ_RAILGUN:\n pitch = -3;\n kickOrigin = { x: -3, y: 0, z: 0 };\n break;\n case MZ_ROCKET:\n case MZ_GRENADE:\n pitch = -2;\n kickOrigin = { x: -2, y: 0, z: 0 };\n break;\n case MZ_BFG:\n pitch = -5;\n kickOrigin = { x: -2, y: 0, z: 0 };\n break;\n case MZ_HYPERBLASTER:\n case MZ_BLASTER:\n pitch = -0.5;\n break;\n }\n\n if (pitch !== 0 || yaw !== 0 || roll !== 0) {\n this.view.addKick({\n pitch: pitch * scale,\n roll: roll * scale,\n durationMs: 200,\n origin: kickOrigin // Should origin be scaled? Q2 source P_AddWeaponKick only scales angles.\n // But we have origin kick logic now. Let's assume origin kick is physical recoil and maybe doesn't scale with quad (magic damage)?\n // P_AddWeaponKick only scales kick_angles.\n });\n }\n }\n\n if (this.callbacks?.onMuzzleFlash3) {\n this.callbacks.onMuzzleFlash3(ent, weapon);\n }\n }\n\n onFog(data: FogData): void {\n if (this.callbacks?.onFog) {\n this.callbacks.onFog(data);\n }\n }\n\n onDamage(indicators: DamageIndicator[]): void {\n if (this.view) {\n // Apply damage view kick based on Quake 2's CL_ParseDamage and V_AddKick logic.\n // CL_ParseDamage calculates a directional kick to viewangles (not implemented here to avoid permanent angle modification),\n // while V_AddKick adds a temporary pitch kick (pain flinch).\n\n for (const ind of indicators) {\n // Use damage value directly from indicator\n const estimatedDamage = ind.damage;\n\n // Determine directional roll\n // Damage direction (ind.dir) is likely the vector of the attack (or from attacker to player?)\n // Assuming it represents the attack vector (velocity), or direction TO attacker.\n // Let's assume direction TO attacker (or FROM attacker to player?)\n // Quake 2 CL_ParseDamage uses (origin - cl.simorg) which is vector TO attacker (if origin is attacker pos).\n // Actually in Q2: VectorSubtract (origin, cl.simorg, v); where 'origin' is read from message.\n // MSG_ReadCoord(msg). The server sends damage origin.\n // Rerelease protocol sends a 'dir' (byte).\n // If it follows Q2 logic, 'dir' points from Player to Attacker (or Attacker to Player).\n // Let's assume it points to where the damage came FROM.\n\n // We need player's right vector.\n let roll = 0;\n if (this.latestFrame && this.latestFrame.playerState) {\n const ps = this.latestFrame.playerState;\n // Cast MutableVec3 to Vec3 for angleVectors\n const angles: Vec3 = { x: ps.viewangles.x, y: ps.viewangles.y, z: ps.viewangles.z } as any;\n const vectors = angleVectors(angles);\n // Q2: cl.kick_angles[2] = damage * 0.5 * DotProduct(v, right);\n // where v is normalized direction to damage source.\n const side = dotVec3(ind.dir, vectors.right);\n roll = estimatedDamage * 0.5 * side;\n }\n\n // Apply pitch kick to simulate pain flinch.\n // Negative pitch corresponds to looking up (\"head snaps back\").\n this.view.addKick({\n pitch: -estimatedDamage * 0.5,\n roll: roll,\n durationMs: 200,\n });\n }\n }\n\n if (this.callbacks?.onDamage) {\n this.callbacks.onDamage(indicators);\n }\n }\n\n onLocPrint(flags: number, base: string, args: string[]): void {\n if (this.callbacks?.onLocPrint) {\n this.callbacks.onLocPrint(flags, base, args);\n }\n }\n\n // New Rerelease Handlers\n onLevelRestart(): void {\n if (this.callbacks?.onLevelRestart) this.callbacks.onLevelRestart();\n }\n\n onWaitingForPlayers(count: number): void {\n if (this.callbacks?.onWaitingForPlayers) this.callbacks.onWaitingForPlayers();\n }\n\n onDisconnect(): void {\n console.log(\"Demo disconnected\");\n }\n\n onReconnect(): void {\n console.log(\"Demo reconnect\");\n }\n\n onDownload(size: number, percent: number, data?: Uint8Array): void {\n }\n\n private convertFrameToPredictionState(frame: FrameData): PredictionState {\n const ps = frame.playerState;\n\n const inventory: PlayerInventory = {\n ammo: {\n caps: [],\n counts: []\n },\n ownedWeapons: new Set(),\n armor: null,\n powerups: new Map(),\n keys: new Set(),\n items: new Set(),\n };\n\n // Map inventory array to PlayerInventory\n for (let i = 0; i < this.inventory.length; i++) {\n const count = this.inventory[i];\n if (count <= 0) continue;\n\n if (i >= DEMO_ITEM_MAPPING.length) break;\n\n const mapping = DEMO_ITEM_MAPPING[i];\n\n switch (mapping.type) {\n case 'weapon':\n inventory.ownedWeapons.add(mapping.id);\n break;\n case 'ammo':\n if (!inventory.ammo.counts[mapping.id]) {\n inventory.ammo.counts[mapping.id] = 0;\n }\n inventory.ammo.counts[mapping.id] = count;\n break;\n case 'armor':\n inventory.armor = {\n armorType: mapping.id,\n armorCount: count\n };\n break;\n case 'powerup':\n inventory.powerups.set(mapping.id, count);\n break;\n case 'key':\n inventory.keys.add(mapping.id);\n break;\n case 'health':\n // Ignore, health is in stats\n break;\n case 'item':\n // Map generic items (like power armor)\n inventory.items.add(mapping.id);\n break;\n }\n }\n\n const origin: Vec3 = { ...ps.origin };\n const velocity: Vec3 = { ...ps.velocity };\n const viewAngles: Vec3 = { ...ps.viewangles };\n const deltaAngles: Vec3 = { ...ps.delta_angles };\n\n return {\n origin,\n velocity,\n viewAngles,\n pmFlags: ps.pm_flags,\n pmType: ps.pm_type,\n waterLevel: WaterLevel.None,\n watertype: ps.watertype,\n gravity: ps.gravity,\n deltaAngles,\n client: {\n inventory,\n weaponStates: {\n states: new Map()\n },\n buttons: 0,\n pm_type: ps.pm_type,\n pm_time: ps.pm_time,\n pm_flags: ps.pm_flags,\n gun_frame: ps.gun_frame,\n rdflags: ps.rdflags,\n fov: ps.fov,\n pers: {\n connected: true,\n inventory: [],\n health: 100,\n max_health: 100,\n savedFlags: 0,\n selected_item: 0\n }\n },\n health: ps.stats[1], // STAT_HEALTH\n armor: ps.stats[4], // STAT_ARMOR\n ammo: ps.stats[2], // STAT_AMMO\n blend: [0, 0, 0, 0], // No blend from demo frame currently (need to parse svc_playerinfo more fully)\n damageAlpha: 0, // Need to extract from renderfx/flash\n damageIndicators: [],\n\n // Stubs\n stats: [...ps.stats],\n kick_angles: ZERO_VEC3,\n kick_origin: ZERO_VEC3,\n gunoffset: ZERO_VEC3,\n gunangles: ZERO_VEC3,\n gunindex: 0,\n onGround: false, // Infer from pmFlags?\n mins: { x: -16, y: -16, z: -24 },\n maxs: { x: 16, y: 16, z: 32 },\n\n // New fields\n pm_time: ps.pm_time,\n pm_type: ps.pm_type,\n pm_flags: ps.pm_flags,\n gun_frame: ps.gun_frame,\n rdflags: ps.rdflags,\n fov: ps.fov,\n renderfx: 0\n };\n }\n\n public getPredictionState(timeMs?: number): PredictionState {\n if (!this.latestFrame) return defaultPredictionState();\n\n const latestState = this.convertFrameToPredictionState(this.latestFrame);\n\n // If we have a previous frame and a timeMs, try to interpolate\n if (this.previousFrame && timeMs !== undefined) {\n // Note: This assumes 10Hz (100ms) server frames as per standard Quake 2\n // Ideally we'd have exact server times on frames\n const latestServerTime = this.latestFrame.serverFrame * 100; // ms\n const previousServerTime = this.previousFrame.serverFrame * 100; // ms\n\n // Check if timeMs is alpha (0-1) or absolute time\n // We assume absolute for now if it's large, but logic above used absolute.\n // If caller passes alpha, we can handle that.\n if (timeMs <= 1.0) {\n const previousState = this.convertFrameToPredictionState(this.previousFrame);\n return interpolatePredictionState(previousState, latestState, Math.max(0, Math.min(1, timeMs)));\n } else if (timeMs >= previousServerTime && timeMs <= latestServerTime) {\n const alpha = (timeMs - previousServerTime) / (latestServerTime - previousServerTime);\n const previousState = this.convertFrameToPredictionState(this.previousFrame);\n return interpolatePredictionState(previousState, latestState, Math.max(0, Math.min(1, alpha)));\n }\n }\n\n return latestState;\n }\n\n public getRenderableEntities(alpha: number, configStrings: ClientConfigStrings): RenderableEntity[] {\n if (!this.latestFrame) return [];\n if (!this.imports) return [];\n\n const latest = Array.from(this.entities.values());\n const previous = this.previousEntities.size > 0 ? this.previousEntities : latest;\n\n return buildRenderableEntities(\n latest,\n previous,\n alpha,\n configStrings,\n this.imports\n );\n }\n\n public getDemoCamera(alpha: number): { origin: Vec3, angles: Vec3, fov: number } {\n // Use getPredictionState to interpolate camera properties\n const ps = this.getPredictionState(alpha);\n return {\n origin: ps.origin,\n angles: ps.viewAngles,\n fov: ps.fov ?? 90\n };\n }\n\n public get latestServerFrame(): number {\n return this.latestFrame?.serverFrame ?? 0;\n }\n}\n","import {\n ConfigStringIndex,\n MAX_MODELS,\n MAX_SOUNDS,\n MAX_IMAGES,\n} from '@quake2ts/shared';\n\n/**\n * Handles parsing and storage of config strings on the client side.\n * Maintains mappings of indices to resource names (models, sounds, images).\n */\nexport class ClientConfigStrings {\n private readonly strings: Map<number, string> = new Map();\n private readonly models: string[] = [];\n private readonly sounds: string[] = [];\n private readonly images: string[] = [];\n\n constructor() {\n // Initialize arrays with empty strings or nulls as needed\n // In JS/TS, sparse arrays or checking for undefined is common,\n // but C array emulation suggests fixed sizing or explicit bounds.\n }\n\n /**\n * Called when a config string is received from the server.\n */\n public set(index: number, value: string): void {\n this.strings.set(index, value);\n\n if (index >= ConfigStringIndex.Models && index < ConfigStringIndex.Models + MAX_MODELS) {\n const modelIndex = index - ConfigStringIndex.Models;\n this.models[modelIndex] = value;\n } else if (index >= ConfigStringIndex.Sounds && index < ConfigStringIndex.Sounds + MAX_SOUNDS) {\n const soundIndex = index - ConfigStringIndex.Sounds;\n this.sounds[soundIndex] = value;\n } else if (index >= ConfigStringIndex.Images && index < ConfigStringIndex.Images + MAX_IMAGES) {\n const imageIndex = index - ConfigStringIndex.Images;\n this.images[imageIndex] = value;\n }\n }\n\n public get(index: number): string | undefined {\n return this.strings.get(index);\n }\n\n public getModelName(index: number): string | undefined {\n return this.models[index];\n }\n\n public getSoundName(index: number): string | undefined {\n return this.sounds[index];\n }\n\n public getImageName(index: number): string | undefined {\n return this.images[index];\n }\n\n public getPlayerName(playernum: number): string | undefined {\n const csIndex = ConfigStringIndex.Players + playernum;\n const info = this.strings.get(csIndex);\n if (!info) return undefined;\n // Player info is a userinfo string: \\name\\Player\\skin\\male/grunt...\n // We need to parse it to get the name.\n // Simple parse: extract value for 'name' key.\n const parts = info.split('\\\\');\n for (let i = 1; i < parts.length; i += 2) {\n if (parts[i] === 'name') {\n return parts[i + 1];\n }\n }\n return undefined;\n }\n\n public clear(): void {\n this.strings.clear();\n this.models.length = 0;\n this.sounds.length = 0;\n this.images.length = 0;\n }\n}\n","import { Menu, MenuItem } from './types.js';\nimport { MenuSystem } from './system.js';\nimport { SaveLoadMenuFactory } from './saveLoad.js';\nimport { OptionsMenuFactory } from './options.js';\nimport { MapsMenuFactory } from './maps.js';\nimport { MultiplayerMenuFactory } from './multiplayer.js';\nimport { DemoMenuFactory } from './demo.js';\n\nexport interface MainMenuOptions {\n onNewGame: () => void;\n onQuit: () => void;\n optionsFactory: OptionsMenuFactory;\n mapsFactory: MapsMenuFactory;\n onSetDifficulty?: (skill: number) => void;\n showSaveOption?: boolean;\n multiplayerFactory?: MultiplayerMenuFactory;\n demoFactory?: DemoMenuFactory;\n}\n\nexport class MainMenuFactory {\n constructor(\n private readonly menuSystem: MenuSystem,\n private readonly saveLoadFactory: SaveLoadMenuFactory,\n private readonly options: MainMenuOptions\n ) {}\n\n createMainMenu(): Menu {\n const items: MenuItem[] = [\n {\n label: 'New Game',\n action: () => {\n this.menuSystem.pushMenu(this.createDifficultyMenu());\n },\n },\n {\n label: 'Multiplayer',\n action: () => {\n if (this.options.multiplayerFactory) {\n this.menuSystem.pushMenu(this.options.multiplayerFactory.createMultiplayerMenu());\n } else {\n console.warn('Multiplayer factory not configured');\n }\n }\n },\n {\n label: 'Demos',\n action: () => {\n if (this.options.demoFactory) {\n this.menuSystem.pushMenu(this.options.demoFactory.createDemoMenu());\n } else {\n console.warn('Demo factory not configured');\n }\n }\n },\n {\n label: 'Load Game',\n action: () => {\n void this.saveLoadFactory.createLoadMenu().then((menu) => {\n this.menuSystem.pushMenu(menu);\n });\n },\n },\n ];\n\n if (this.options.showSaveOption !== false) {\n items.push({\n label: 'Save Game',\n action: () => {\n void this.saveLoadFactory.createSaveMenu().then((menu) => {\n this.menuSystem.pushMenu(menu);\n });\n },\n });\n }\n\n items.push(\n {\n label: 'Options',\n action: () => {\n this.menuSystem.pushMenu(this.options.optionsFactory.createOptionsMenu());\n }\n },\n {\n label: 'Quit',\n action: () => {\n this.options.onQuit();\n },\n },\n );\n\n return {\n title: 'Main Menu',\n items,\n };\n }\n\n private createDifficultyMenu(): Menu {\n return {\n title: 'Select Difficulty',\n items: [\n {\n label: 'Easy',\n action: () => this.startNewGame(0)\n },\n {\n label: 'Medium',\n action: () => this.startNewGame(1)\n },\n {\n label: 'Hard',\n action: () => this.startNewGame(2)\n },\n {\n label: 'Map Select...',\n action: () => {\n this.menuSystem.pushMenu(this.options.mapsFactory.createMapsMenu());\n }\n },\n {\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n }\n ]\n };\n }\n\n private startNewGame(difficulty: number) {\n if (this.options.onSetDifficulty) {\n this.options.onSetDifficulty(difficulty);\n }\n this.options.onNewGame();\n }\n}\n","import { Menu, MenuItem } from './types.js';\nimport { MenuSystem } from './system.js';\nimport { SaveStorage, SaveSlotMetadata, GameSaveFile } from '@quake2ts/game';\n\nexport class SaveLoadMenuFactory {\n constructor(\n private readonly menuSystem: MenuSystem,\n private readonly storage: SaveStorage,\n private readonly onSave: (name: string) => Promise<void>,\n private readonly onLoad: (slotId: string) => Promise<void>,\n private readonly onDelete: (slotId: string) => Promise<void>\n ) {}\n\n async createSaveMenu(): Promise<Menu> {\n const saves = await this.storage.list();\n const items: MenuItem[] = [];\n\n // New Save Item\n items.push({\n label: 'New Save...',\n action: () => {\n this.menuSystem.pushMenu(this.createNewSaveInputMenu());\n },\n });\n\n // Overwrite existing saves\n saves.forEach((save) => {\n items.push({\n label: `${save.name} - ${save.map} (${formatTime(save.playtimeSeconds)})`,\n action: () => {\n // Confirm overwrite?\n this.menuSystem.pushMenu(this.createConfirmOverwriteMenu(save));\n },\n });\n });\n\n items.push({\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n });\n\n return {\n title: 'Save Game',\n items,\n };\n }\n\n async createLoadMenu(): Promise<Menu> {\n const saves = await this.storage.list();\n const items: MenuItem[] = [];\n\n saves.forEach((save) => {\n items.push({\n label: `${save.name} - ${save.map} (${formatTime(save.playtimeSeconds)})`,\n action: () => {\n // Open submenu for Load / Delete\n this.menuSystem.pushMenu(this.createLoadActionMenu(save));\n },\n });\n });\n\n if (saves.length === 0) {\n items.push({\n label: 'No saves found',\n action: () => {}\n });\n }\n\n items.push({\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n });\n\n return {\n title: 'Load Game',\n items,\n };\n }\n\n private createLoadActionMenu(save: SaveSlotMetadata): Menu {\n return {\n title: `Slot: ${save.name}`,\n items: [\n {\n label: 'Load Game',\n action: () => {\n void this.onLoad(save.id).then(() => {\n this.menuSystem.closeAll();\n });\n }\n },\n {\n label: 'Delete Save',\n action: () => {\n this.menuSystem.pushMenu(this.createConfirmDeleteMenu(save));\n }\n },\n {\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n }\n ]\n };\n }\n\n private createConfirmDeleteMenu(save: SaveSlotMetadata): Menu {\n return {\n title: `Delete ${save.name}?`,\n items: [\n {\n label: 'Yes, Delete',\n action: () => {\n void this.onDelete(save.id).then(() => {\n this.menuSystem.popMenu(); // Pop confirm\n this.menuSystem.popMenu(); // Pop action menu\n // We need to refresh the load menu.\n // The simplest way is to pop the load menu and push a new one,\n // or if the parent menu (Load Game) was dynamic, it would update.\n // But here createLoadMenu returns a static structure.\n // Ideally, we'd go back and 'refresh'.\n // For now, let's close all or navigate back to root?\n // Or we can assume the caller will rebuild.\n\n // Let's just pop back to where we were (Load Menu),\n // but since it's stale, we might want to re-create it.\n // A better approach in this MenuSystem might be to have dynamic providers.\n\n // Hack: Close all for now to be safe, or just accept the menu is stale until re-opened.\n // Re-opening \"Load Game\" from main menu/pause menu will show updated list.\n this.menuSystem.popMenu(); // Pop Load Menu to go back to previous menu\n });\n }\n },\n {\n label: 'No, Cancel',\n action: () => this.menuSystem.popMenu()\n }\n ]\n };\n }\n\n private createNewSaveInputMenu(): Menu {\n // Use a local state object to hold the value\n const state = {\n name: `Save ${new Date().toLocaleString()}`\n };\n\n return {\n title: 'Enter Save Name',\n items: [\n {\n label: 'Name',\n type: 'input',\n getValue: () => state.name,\n onUpdate: (val) => { state.name = val; }\n },\n {\n label: 'Save',\n action: () => {\n void this.onSave(state.name).then(() => {\n this.menuSystem.closeAll();\n });\n }\n },\n {\n label: 'Cancel',\n action: () => this.menuSystem.popMenu()\n }\n ]\n }\n }\n\n private createConfirmOverwriteMenu(save: SaveSlotMetadata): Menu {\n return {\n title: `Overwrite ${save.name}?`,\n items: [\n {\n label: 'Yes, Overwrite',\n action: () => {\n void this.onSave(save.name).then(() => { // Reuse name logic, or pass ID if update is supported\n this.menuSystem.closeAll();\n });\n }\n },\n {\n label: 'No, Cancel',\n action: () => this.menuSystem.popMenu()\n }\n ]\n }\n }\n}\n\nfunction formatTime(seconds: number): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = Math.floor(seconds % 60);\n return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n}\n","import { Menu, MenuItem, MenuState } from './types.js';\n\nexport class MenuSystem {\n private activeMenu: Menu | null = null;\n private selectedIndex = 0;\n private menuStack: Menu[] = [];\n public onStateChange?: (active: boolean) => void;\n\n constructor() {}\n\n pushMenu(menu: Menu): void {\n const wasActive = this.isActive();\n if (this.activeMenu) {\n this.menuStack.push(this.activeMenu);\n // Link parent for back navigation if not already linked\n if (!menu.parent) {\n (menu as any).parent = this.activeMenu;\n }\n }\n this.activeMenu = menu;\n this.selectedIndex = 0;\n if (!wasActive && this.onStateChange) {\n this.onStateChange(true);\n }\n }\n\n popMenu(): void {\n const wasActive = this.isActive();\n if (this.menuStack.length > 0) {\n this.activeMenu = this.menuStack.pop()!;\n this.selectedIndex = 0;\n } else {\n this.activeMenu = null;\n }\n\n const isActive = this.isActive();\n if (wasActive !== isActive && this.onStateChange) {\n this.onStateChange(isActive);\n }\n }\n\n closeAll(): void {\n const wasActive = this.isActive();\n this.activeMenu = null;\n this.menuStack = [];\n this.selectedIndex = 0;\n\n if (wasActive && this.onStateChange) {\n this.onStateChange(false);\n }\n }\n\n handleInput(action: 'up' | 'down' | 'left' | 'right' | 'select' | 'back' | 'char', char?: string): boolean {\n if (!this.activeMenu) {\n return false;\n }\n\n const currentItem = this.activeMenu.items[this.selectedIndex];\n\n if (action === 'up') {\n this.selectedIndex = (this.selectedIndex - 1 + this.activeMenu.items.length) % this.activeMenu.items.length;\n return true;\n }\n\n if (action === 'down') {\n this.selectedIndex = (this.selectedIndex + 1) % this.activeMenu.items.length;\n return true;\n }\n\n if (action === 'select') {\n if (currentItem.action) {\n currentItem.action();\n }\n return true;\n }\n\n if (action === 'back') {\n this.popMenu();\n return true;\n }\n\n // Pass other inputs to item if it supports input\n if (currentItem.type === 'input' && currentItem.onUpdate && currentItem.getValue) {\n const currentValue = currentItem.getValue();\n if (action === 'char' && char) {\n const newValue = (currentValue || '') + char;\n currentItem.onUpdate(newValue);\n } else if (action === 'left') {\n // Backspace simulation for simplicity\n const str = String(currentValue || '');\n if (str.length > 0) {\n currentItem.onUpdate(str.slice(0, -1));\n }\n }\n }\n\n return true;\n }\n\n isActive(): boolean {\n return this.activeMenu !== null;\n }\n\n getState(): MenuState {\n return {\n activeMenu: this.activeMenu,\n selectedIndex: this.selectedIndex,\n };\n }\n}\n","import { Menu, MenuItem } from './types.js';\nimport { MenuSystem } from './system.js';\nimport { EngineHost } from '@quake2ts/engine';\n\nexport class OptionsMenuFactory {\n constructor(\n private readonly menuSystem: MenuSystem,\n private readonly host: EngineHost\n ) {}\n\n createOptionsMenu(): Menu {\n return {\n title: 'Options',\n items: [\n {\n label: 'Video Options',\n action: () => {\n this.menuSystem.pushMenu(this.createVideoMenu());\n }\n },\n {\n label: 'Audio Options',\n action: () => {\n this.menuSystem.pushMenu(this.createAudioMenu());\n }\n },\n {\n label: 'Controls',\n action: () => {\n this.menuSystem.pushMenu(this.createControlsMenu());\n }\n },\n {\n label: 'Gameplay',\n action: () => {\n this.menuSystem.pushMenu(this.createGameplayMenu());\n }\n },\n {\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n }\n ]\n };\n }\n\n private createVideoMenu(): Menu {\n const cvars = this.host.cvars;\n return {\n title: 'Video Options',\n items: [\n {\n label: 'Field of View',\n type: 'input',\n getValue: () => cvars?.get('fov')?.string ?? '90',\n onUpdate: (val) => {\n const f = parseFloat(val);\n if (!isNaN(f)) {\n cvars?.setValue('fov', val);\n }\n }\n },\n {\n label: 'Fullscreen',\n type: 'toggle',\n getValue: () => (document.fullscreenElement ? 'On' : 'Off'),\n onUpdate: () => {\n if (!document.fullscreenElement) {\n document.documentElement.requestFullscreen().catch(err => {\n console.error(`Error attempting to enable fullscreen: ${err.message}`);\n });\n } else {\n document.exitFullscreen();\n }\n }\n },\n {\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n }\n ]\n };\n }\n\n private createAudioMenu(): Menu {\n const cvars = this.host.cvars;\n return {\n title: 'Audio Options',\n items: [\n {\n label: 'Master Volume',\n type: 'input',\n getValue: () => cvars?.get('s_volume')?.string ?? '0.7',\n onUpdate: (val) => {\n const f = parseFloat(val);\n if (!isNaN(f)) cvars?.setValue('s_volume', val);\n }\n },\n {\n label: 'Music Volume',\n type: 'input',\n getValue: () => cvars?.get('ogg_volume')?.string ?? '0.7',\n onUpdate: (val) => {\n const f = parseFloat(val);\n if (!isNaN(f)) cvars?.setValue('ogg_volume', val);\n }\n },\n {\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n }\n ]\n };\n }\n\n private createControlsMenu(): Menu {\n const cvars = this.host.cvars;\n return {\n title: 'Controls',\n items: [\n {\n label: 'Sensitivity',\n type: 'input',\n getValue: () => cvars?.get('sensitivity')?.string ?? '3',\n onUpdate: (val) => {\n const f = parseFloat(val);\n if (!isNaN(f)) cvars?.setValue('sensitivity', val);\n }\n },\n {\n label: 'Invert Mouse',\n type: 'toggle',\n getValue: () => (cvars?.get('m_pitch')?.string.startsWith('-') ? 'Yes' : 'No'),\n onUpdate: () => {\n const current = parseFloat(cvars?.get('m_pitch')?.string ?? '0.022');\n cvars?.setValue('m_pitch', (-current).toString());\n }\n },\n {\n label: 'Always Run',\n type: 'toggle',\n getValue: () => (cvars?.get('cl_run')?.integer ? 'Yes' : 'No'),\n onUpdate: () => {\n const current = cvars?.get('cl_run')?.integer ?? 1;\n cvars?.setValue('cl_run', current ? '0' : '1');\n }\n },\n {\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n }\n ]\n };\n }\n\n private createGameplayMenu(): Menu {\n const cvars = this.host.cvars;\n return {\n title: 'Gameplay Options',\n items: [\n {\n label: 'Crosshair',\n type: 'toggle',\n getValue: () => (cvars?.get('crosshair')?.integer ? 'On' : 'Off'),\n onUpdate: () => {\n const current = cvars?.get('crosshair')?.integer ?? 1;\n cvars?.setValue('crosshair', current ? '0' : '1');\n }\n },\n {\n label: 'Handedness',\n type: 'toggle',\n getValue: () => (cvars?.get('hand')?.integer === 1 ? 'Left' : (cvars?.get('hand')?.integer === 2 ? 'Center' : 'Right')),\n onUpdate: () => {\n const current = cvars?.get('hand')?.integer ?? 0;\n const next = (current + 1) % 3;\n cvars?.setValue('hand', next.toString());\n }\n },\n {\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n }\n ]\n }\n }\n}\n","import { Menu, MenuItem } from './types.js';\nimport { MenuSystem } from './system.js';\nimport { AssetManager, VirtualFileSystem } from '@quake2ts/engine';\n\nexport class MapsMenuFactory {\n constructor(\n private readonly menuSystem: MenuSystem,\n private readonly vfs: VirtualFileSystem,\n private readonly onStartMap: (mapName: string) => void\n ) {}\n\n createMapsMenu(): Menu {\n const maps = this.vfs.findByExtension('.bsp');\n\n // Filter maps if needed (e.g. exclude test maps)\n // For now, list all.\n // Quake 2 maps usually are in maps/ folder.\n const mapItems: MenuItem[] = maps.map(file => ({\n label: file.path.replace(/^maps\\//, '').replace(/\\.bsp$/, ''),\n action: () => {\n this.onStartMap(file.path.replace(/^maps\\//, '').replace(/\\.bsp$/, ''));\n this.menuSystem.closeAll();\n }\n }));\n\n if (mapItems.length === 0) {\n mapItems.push({\n label: 'No maps found',\n action: () => {}\n });\n }\n\n mapItems.push({\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n });\n\n return {\n title: 'Select Map',\n items: mapItems\n };\n }\n}\n","import { Menu } from './types.js';\nimport { MenuSystem } from './system.js';\nimport { OptionsMenuFactory } from './options.js';\nimport { EngineHost } from '@quake2ts/engine';\n\nexport class PauseMenuFactory {\n constructor(\n private readonly menuSystem: MenuSystem,\n private readonly optionsFactory: OptionsMenuFactory,\n private readonly host?: EngineHost\n ) {}\n\n createPauseMenu(): Menu {\n return {\n title: 'Game Paused',\n items: [\n {\n label: 'Resume Game',\n action: () => {\n this.menuSystem.closeAll();\n }\n },\n {\n label: 'Options',\n action: () => {\n this.menuSystem.pushMenu(this.optionsFactory.createOptionsMenu());\n }\n },\n {\n label: 'Restart Level',\n action: () => {\n this.host?.commands.execute('restart');\n this.menuSystem.closeAll();\n }\n },\n {\n label: 'Quit to Main Menu',\n action: () => {\n this.host?.commands.execute('disconnect');\n this.menuSystem.closeAll();\n }\n }\n ]\n };\n }\n}\n","import { Menu, MenuItem } from './types.js';\nimport { MenuSystem } from './system.js';\nimport { MultiplayerConnection } from '../../net/connection.js';\n\nexport class MultiplayerMenuFactory {\n constructor(\n private readonly menuSystem: MenuSystem,\n private readonly connection: MultiplayerConnection\n ) {}\n\n createMultiplayerMenu(initialAddress: string = 'localhost:27910', status: string = ''): Menu {\n // We cannot mutate MenuItems because they are readonly.\n // So we capture state in closure and recreate the menu structure when needed.\n\n let address = initialAddress;\n\n const items: MenuItem[] = [];\n\n // Status item\n if (status) {\n items.push({\n label: status,\n action: () => {} // No-op\n });\n }\n\n items.push(\n {\n label: 'Address: ' + address,\n action: () => {\n if (typeof window !== 'undefined') {\n const newAddr = window.prompt('Enter Server Address', address);\n if (newAddr) {\n address = newAddr;\n this.refreshMenu(address);\n }\n }\n }\n },\n {\n label: 'Connect',\n action: () => {\n this.refreshMenu(address, 'Connecting...');\n this.connection.connect('ws://' + address)\n .then(() => {\n this.menuSystem.closeAll();\n })\n .catch(err => {\n console.error(err);\n const failStatus = 'Failed: ' + (err.message || 'Unknown error');\n this.refreshMenu(address, failStatus);\n });\n }\n },\n {\n label: 'Disconnect',\n action: () => {\n this.connection.disconnect();\n this.refreshMenu(address, 'Disconnected');\n }\n },\n {\n label: 'Back',\n action: () => {\n this.menuSystem.popMenu();\n }\n }\n );\n\n return {\n title: 'Multiplayer',\n items\n };\n }\n\n private refreshMenu(address: string, status: string = '') {\n this.menuSystem.popMenu();\n this.menuSystem.pushMenu(this.createMultiplayerMenu(address, status));\n }\n}\n","\nexport interface StoredDemoMetadata {\n name: string;\n date: number;\n size: number;\n duration?: number;\n}\n\nexport interface StoredDemo extends StoredDemoMetadata {\n data: ArrayBuffer;\n}\n\nexport class DemoStorage {\n private dbName = 'quake2ts-demos';\n private version = 1;\n private storeName = 'demos';\n private dbPromise: Promise<IDBDatabase> | null = null;\n private dbInstance: IDBDatabase | null = null;\n\n constructor() {}\n\n private getDB(): Promise<IDBDatabase> {\n if (this.dbPromise) return this.dbPromise;\n\n this.dbPromise = new Promise((resolve, reject) => {\n if (typeof indexedDB === 'undefined') {\n reject(new Error('IndexedDB is not supported'));\n return;\n }\n\n const request = indexedDB.open(this.dbName, this.version);\n\n request.onerror = () => {\n reject(new Error(`Failed to open database: ${request.error?.message}`));\n };\n\n request.onsuccess = () => {\n this.dbInstance = request.result;\n resolve(request.result);\n };\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains(this.storeName)) {\n // Key by name\n db.createObjectStore(this.storeName, { keyPath: 'name' });\n }\n };\n });\n\n return this.dbPromise;\n }\n\n // Helper to close connection, useful for tests\n public close(): void {\n if (this.dbInstance) {\n this.dbInstance.close();\n this.dbInstance = null;\n this.dbPromise = null;\n }\n }\n\n async saveDemo(name: string, data: ArrayBuffer, duration?: number): Promise<void> {\n const db = await this.getDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([this.storeName], 'readwrite');\n const store = transaction.objectStore(this.storeName);\n\n const record: StoredDemo = {\n name,\n data,\n date: Date.now(),\n size: data.byteLength,\n duration\n };\n\n const request = store.put(record);\n\n request.onsuccess = () => resolve();\n request.onerror = () => reject(new Error(`Failed to save demo: ${request.error?.message}`));\n });\n }\n\n async loadDemo(name: string): Promise<StoredDemo | null> {\n const db = await this.getDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([this.storeName], 'readonly');\n const store = transaction.objectStore(this.storeName);\n const request = store.get(name);\n\n request.onsuccess = () => {\n resolve(request.result || null);\n };\n request.onerror = () => reject(new Error(`Failed to load demo: ${request.error?.message}`));\n });\n }\n\n async listDemos(): Promise<StoredDemoMetadata[]> {\n const db = await this.getDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([this.storeName], 'readonly');\n const store = transaction.objectStore(this.storeName);\n const request = store.getAll();\n\n request.onsuccess = () => {\n const results: StoredDemo[] = request.result;\n // Map to metadata to avoid loading all buffers into memory if possible,\n // though getAll() loads everything.\n // Optimally we would use a cursor, but getAll is simpler for now.\n const metadata = results.map(demo => ({\n name: demo.name,\n date: demo.date,\n size: demo.size,\n duration: demo.duration\n })).sort((a, b) => b.date - a.date); // Sort by date descending\n\n resolve(metadata);\n };\n request.onerror = () => reject(new Error(`Failed to list demos: ${request.error?.message}`));\n });\n }\n\n async deleteDemo(name: string): Promise<void> {\n const db = await this.getDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([this.storeName], 'readwrite');\n const store = transaction.objectStore(this.storeName);\n const request = store.delete(name);\n\n request.onsuccess = () => resolve();\n request.onerror = () => reject(new Error(`Failed to delete demo: ${request.error?.message}`));\n });\n }\n}\n","import { Menu, MenuItem } from './types.js';\nimport { MenuSystem } from './system.js';\nimport { ClientExports } from '../../index.js';\nimport { DemoValidator } from '@quake2ts/engine';\nimport { DemoStorage, StoredDemoMetadata } from '../../demo/storage.js';\n\nexport interface DemoMenuOptions {\n onLoadDemoFile?: () => Promise<void>;\n}\n\nexport class DemoMenuFactory {\n private storage: DemoStorage;\n\n constructor(\n private readonly menuSystem: MenuSystem,\n private readonly client: ClientExports,\n private readonly options?: DemoMenuOptions\n ) {\n this.storage = new DemoStorage();\n }\n\n createDemoMenu(): Menu {\n const items: MenuItem[] = [\n {\n label: 'Load Demo File...',\n action: () => {\n if (this.options?.onLoadDemoFile) {\n this.options.onLoadDemoFile().then(() => {\n this.menuSystem.closeAll();\n }).catch(err => {\n this.client.errorDialog.show(\"Error Loading Demo\", err.message);\n });\n } else {\n this.loadDemoFromFilePicker();\n }\n }\n },\n // Stored demos will be appended here via refreshDemos,\n // but Menu structure expects static return.\n // We'll create a dynamic loader for the stored demos sub-section or just inject them.\n // For now, let's load them and update the menu?\n // Or better, return a Menu that has a \"Stored Demos\" submenu if we want to be clean,\n // but flattening is probably better for UX if few demos.\n // Since createDemoMenu is synchronous, we can't await listDemos().\n // We'll add a \"Stored Demos...\" item that opens a new menu which loads async.\n {\n label: 'Stored Demos...',\n action: () => this.openStoredDemosMenu()\n },\n {\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n }\n ];\n\n return {\n title: 'Demos',\n items\n };\n }\n\n private openStoredDemosMenu() {\n // Show loading placeholder\n // Ideally we would fetch first then show menu, but we need to handle async\n\n this.storage.listDemos().then(demos => {\n const items: MenuItem[] = [];\n\n if (demos.length === 0) {\n items.push({ label: '<No stored demos>', action: () => {} });\n } else {\n demos.forEach(demo => {\n items.push({\n label: demo.name,\n action: () => this.playStoredDemo(demo.name)\n });\n });\n\n // Add a delete option? Or submenu for each demo?\n // For simplicity: Click to play.\n // Maybe long-press or a separate \"Manage Demos\" menu for deletion.\n items.push({ label: '---', action: () => {} });\n items.push({\n label: 'Manage Demos (Delete)...',\n action: () => this.openManageDemosMenu(demos)\n });\n }\n\n items.push({\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n });\n\n this.menuSystem.pushMenu({\n title: 'Stored Demos',\n items\n });\n\n }).catch(err => {\n console.error(\"Failed to list demos\", err);\n this.client.errorDialog.show(\"Error\", \"Failed to list stored demos\");\n });\n }\n\n private openManageDemosMenu(demos: StoredDemoMetadata[]) {\n const items: MenuItem[] = demos.map(demo => ({\n label: `Delete ${demo.name}`,\n action: () => {\n if (confirm(`Delete ${demo.name}?`)) {\n this.storage.deleteDemo(demo.name).then(() => {\n this.menuSystem.popMenu(); // Close manage menu\n this.menuSystem.popMenu(); // Close list menu to refresh\n this.openStoredDemosMenu(); // Re-open list\n });\n }\n }\n }));\n\n items.push({\n label: 'Back',\n action: () => this.menuSystem.popMenu()\n });\n\n this.menuSystem.pushMenu({\n title: 'Delete Demos',\n items\n });\n }\n\n private async playStoredDemo(name: string) {\n try {\n const demo = await this.storage.loadDemo(name);\n if (demo) {\n this.client.startDemoPlayback(demo.data, demo.name);\n this.menuSystem.closeAll();\n } else {\n this.client.errorDialog.show(\"Error\", \"Demo not found in storage\");\n }\n } catch (e) {\n console.error(\"Failed to load demo from storage\", e);\n this.client.errorDialog.show(\"Error\", \"Failed to load demo\");\n }\n }\n\n private loadDemoFromFilePicker() {\n // Create a hidden file input\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.dm2';\n input.style.display = 'none';\n document.body.appendChild(input);\n\n input.onchange = async () => {\n if (input.files && input.files.length > 0) {\n const file = input.files[0];\n try {\n const buffer = await file.arrayBuffer();\n\n // Validate demo file\n const result = DemoValidator.validate(buffer, file.name);\n if (!result.valid) {\n const msg = result.error || 'Unknown validation error';\n this.client.errorDialog.show(\"Invalid Demo File\", msg);\n return;\n }\n\n // Save to storage (fire and forget, or await?)\n // Better to await so we know it's safe? Or just let it happen.\n // Task says \"Store uploaded demos for quick access\".\n // We'll try to save it.\n try {\n await this.storage.saveDemo(file.name, buffer);\n } catch (storeErr) {\n console.warn(\"Failed to save demo to storage\", storeErr);\n }\n\n // Start playback\n this.client.startDemoPlayback(buffer, file.name);\n this.menuSystem.closeAll();\n } catch (e) {\n console.error(\"Failed to load demo:\", e);\n this.client.errorDialog.show(\"Load Error\", \"Failed to read demo file.\");\n }\n }\n document.body.removeChild(input);\n };\n\n input.click();\n }\n}\n","import { Renderer } from '@quake2ts/engine';\nimport { MenuState } from './types.js';\n\nexport function Draw_Menu(renderer: Renderer, state: MenuState, width: number, height: number): void {\n if (!state.activeMenu) {\n return;\n }\n\n const menu = state.activeMenu;\n const centerX = width / 2;\n const centerY = height / 2;\n const lineHeight = 20;\n const totalHeight = (menu.items.length * lineHeight) + 40; // Items + title space\n const startY = centerY - totalHeight / 2;\n\n // Draw background overlay\n renderer.drawfillRect(0, 0, width, height, [0, 0, 0, 0.7]);\n\n // Draw title\n // TODO: Use a larger font or a specific title graphic if available\n renderer.drawCenterString(startY, menu.title);\n\n // Draw items\n menu.items.forEach((item, index) => {\n const y = startY + 40 + index * lineHeight;\n let text = item.label;\n\n if (item.type === 'input' && item.getValue) {\n text += `: ${item.getValue()}`;\n if (index === state.selectedIndex) {\n // Blinking cursor or static underscore\n const time = Date.now();\n if (Math.floor(time / 500) % 2 === 0) {\n text += '_';\n }\n }\n } else if (item.type === 'toggle' && item.getValue) {\n text += `: ${item.getValue()}`;\n }\n\n if (index === state.selectedIndex) {\n // Draw cursor arrow to the left\n // Quake 2 typically uses a specific character or graphic for cursor\n // char 13 is often an arrow in Quake fonts\n const cursorChar = 13;\n const charWidth = 8;\n\n // Calculate text width to position cursor\n const stripped = text.replace(/\\^[0-9]/g, '');\n const textWidth = stripped.length * charWidth;\n const textX = (width - textWidth) / 2;\n\n // Draw cursor to the left of the text\n // renderer.drawChar(textX - 16, y, cursorChar); // Renderer doesn't expose drawChar directly yet, need to check interface\n // Since drawChar isn't on the interface, we'll use a string with just that char\n renderer.drawString(textX - 16, y, String.fromCharCode(cursorChar));\n }\n\n renderer.drawCenterString(y, text);\n });\n}\n","import { CvarFlags } from '@quake2ts/shared';\n\nexport interface SettingsStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n}\n\nexport class BrowserSettings {\n constructor(private readonly storage: SettingsStorage) {}\n\n loadCvars(cvars: Map<string, { value: string, setValue: (v: string) => void }>) {\n try {\n const stored = this.storage.getItem('quake2ts_cvars');\n if (stored) {\n const data = JSON.parse(stored) as Record<string, string>;\n for (const [key, value] of Object.entries(data)) {\n // Only update if cvar exists\n const cvar = cvars.get(key);\n if (cvar) {\n cvar.setValue(value);\n }\n }\n }\n } catch (e) {\n console.warn('Failed to load settings', e);\n }\n }\n\n saveCvars(cvars: { name: string, value: string, flags: number }[]) {\n const data: Record<string, string> = {};\n for (const cvar of cvars) {\n if (cvar.flags & CvarFlags.Archive) {\n data[cvar.name] = cvar.value;\n }\n }\n try {\n this.storage.setItem('quake2ts_cvars', JSON.stringify(data));\n } catch (e) {\n console.warn('Failed to save settings', e);\n }\n }\n}\n","import { SettingsStorage } from './settings.js';\n\nexport class LocalStorageSettings implements SettingsStorage {\n getItem(key: string): string | null {\n try {\n return localStorage.getItem(key);\n } catch (e) {\n console.warn('localStorage not available', e);\n return null;\n }\n }\n\n setItem(key: string, value: string): void {\n try {\n localStorage.setItem(key, value);\n } catch (e) {\n console.warn('Failed to write to localStorage', e);\n }\n }\n}\n\nexport { BrowserSettings, SettingsStorage } from './settings.js';\n","import { Renderer } from '@quake2ts/engine';\n\nexport class LoadingScreen {\n private total = 0;\n private current = 0;\n private message = '';\n private active = false;\n\n start(total: number, message: string = 'Loading...') {\n this.total = total;\n this.current = 0;\n this.message = message;\n this.active = true;\n }\n\n update(current: number, message?: string) {\n this.current = current;\n if (message) {\n this.message = message;\n }\n }\n\n finish() {\n this.active = false;\n this.current = this.total;\n }\n\n render(renderer: Renderer) {\n if (!this.active) return;\n\n const width = renderer.width;\n const height = renderer.height;\n\n // Draw background\n renderer.drawfillRect(0, 0, width, height, [0.1, 0.1, 0.1, 1]);\n\n // Draw progress bar\n const barWidth = width * 0.6;\n const barHeight = 20;\n const barX = (width - barWidth) / 2;\n const barY = height * 0.7;\n\n renderer.drawfillRect(barX, barY, barWidth, barHeight, [0.3, 0.3, 0.3, 1]);\n\n const progress = this.total > 0 ? this.current / this.total : 0;\n renderer.drawfillRect(barX, barY, barWidth * progress, barHeight, [0.8, 0.5, 0.1, 1]);\n\n // Draw text\n renderer.drawCenterString(barY - 30, this.message);\n const percent = Math.floor(progress * 100);\n renderer.drawCenterString(barY + barHeight + 10, `${percent}%`);\n }\n}\n","import { Renderer } from '@quake2ts/engine';\n\nexport interface ErrorDialogState {\n active: boolean;\n title: string;\n message: string;\n}\n\nexport class ErrorDialog {\n private state: ErrorDialogState = {\n active: false,\n title: '',\n message: ''\n };\n\n show(title: string, message: string) {\n this.state = {\n active: true,\n title,\n message\n };\n }\n\n hide() {\n this.state.active = false;\n }\n\n render(renderer: Renderer) {\n if (!this.state.active) return;\n\n const width = renderer.width;\n const height = renderer.height;\n const centerX = width / 2;\n const centerY = height / 2;\n const boxWidth = 400;\n const boxHeight = 200;\n\n // Overlay\n renderer.drawfillRect(0, 0, width, height, [0, 0, 0, 0.5]);\n\n // Dialog Box\n renderer.drawfillRect(centerX - boxWidth / 2, centerY - boxHeight / 2, boxWidth, boxHeight, [0.2, 0, 0, 1]); // Dark red for error\n\n // Text\n renderer.drawCenterString(centerY - 40, `^1${this.state.title}`); // ^1 for Red\n renderer.drawCenterString(centerY, this.state.message);\n renderer.drawCenterString(centerY + 60, \"Press ESC to close\");\n }\n}\n","import { Renderer } from '@quake2ts/engine';\nimport { PlayerClient } from '@quake2ts/game';\n\nexport interface WheelMenu {\n active: boolean;\n type: 'weapon' | 'item';\n selectedIndex: number;\n}\n\nexport class WheelMenuSystem {\n private state: WheelMenu = {\n active: false,\n type: 'weapon',\n selectedIndex: -1\n };\n\n open(type: 'weapon' | 'item') {\n this.state.active = true;\n this.state.type = type;\n }\n\n close() {\n this.state.active = false;\n }\n\n isOpen(): boolean {\n return this.state.active;\n }\n\n handleInput(deltaX: number, deltaY: number) {\n if (!this.state.active) return;\n // Calculate angle from center to select item\n // Stub implementation\n }\n\n render(renderer: Renderer, width: number, height: number, client: PlayerClient) {\n if (!this.state.active) return;\n\n // Draw radial menu background\n const centerX = width / 2;\n const centerY = height / 2;\n // Stub: draw a transparent circle/box\n renderer.drawfillRect(centerX - 100, centerY - 100, 200, 200, [0, 0, 0, 0.5]);\n renderer.drawCenterString(centerY, `Select ${this.state.type}`);\n }\n}\n","import { NetDriver } from '@quake2ts/shared';\n\nexport class BrowserWebSocketNetDriver implements NetDriver {\n private socket: WebSocket | null = null;\n private messageCallback: ((data: Uint8Array) => void) | null = null;\n private closeCallback: (() => void) | null = null;\n private errorCallback: ((error: Error) => void) | null = null;\n\n async connect(url: string): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.socket = new WebSocket(url);\n this.socket.binaryType = 'arraybuffer';\n\n this.socket.onopen = () => {\n resolve();\n };\n\n this.socket.onerror = (event) => {\n const error = new Error('WebSocket connection error');\n if (this.errorCallback) {\n this.errorCallback(error);\n }\n reject(error);\n };\n\n this.socket.onclose = () => {\n if (this.closeCallback) {\n this.closeCallback();\n }\n this.socket = null;\n };\n\n this.socket.onmessage = (event) => {\n if (this.messageCallback) {\n if (event.data instanceof ArrayBuffer) {\n this.messageCallback(new Uint8Array(event.data));\n } else {\n console.warn('Received non-binary message from server');\n }\n }\n };\n\n } catch (e) {\n reject(e);\n }\n });\n }\n\n disconnect(): void {\n if (this.socket) {\n this.socket.close();\n this.socket = null;\n }\n }\n\n send(data: Uint8Array): void {\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n this.socket.send(data);\n } else {\n console.warn('Attempted to send data on closed or connecting socket');\n }\n }\n\n onMessage(callback: (data: Uint8Array) => void): void {\n this.messageCallback = callback;\n }\n\n onClose(callback: () => void): void {\n this.closeCallback = callback;\n }\n\n onError(callback: (error: Error) => void): void {\n this.errorCallback = callback;\n }\n\n isConnected(): boolean {\n return this.socket !== null && this.socket.readyState === WebSocket.OPEN;\n }\n}\n","import {\n NetDriver,\n ClientCommand,\n ServerCommand,\n UserCommand,\n BinaryStream,\n NetworkMessageBuilder,\n writeUserCommand,\n BinaryWriter,\n CMD_BACKUP,\n NetChan,\n Vec3,\n crc8\n} from '@quake2ts/shared';\nimport {\n NetworkMessageParser,\n NetworkMessageHandler,\n EntityState,\n FrameData,\n createEmptyEntityState,\n applyEntityDelta,\n PROTOCOL_VERSION_RERELEASE,\n DemoRecorder,\n FogData,\n DamageIndicator\n} from '@quake2ts/engine';\nimport { BrowserWebSocketNetDriver } from './browserWsDriver.js';\nimport { ClientPrediction, PredictionState, defaultPredictionState } from '@quake2ts/cgame';\nimport { GameFrameResult } from '@quake2ts/engine';\nimport { ClientEffectSystem } from '../effects-system.js';\n\nexport enum ConnectionState {\n Disconnected,\n Connecting,\n Challenge,\n Connected,\n Loading,\n Active\n}\n\nexport interface MultiplayerConnectionOptions {\n username: string;\n model: string;\n skin: string;\n hand?: number;\n fov?: number;\n netchan?: NetChan;\n}\n\nexport class MultiplayerConnection implements NetworkMessageHandler {\n private driver: NetDriver;\n private state: ConnectionState = ConnectionState.Disconnected;\n private parser: NetworkMessageParser | null = null;\n private options: MultiplayerConnectionOptions;\n private netchan: NetChan;\n\n // Game State\n public serverProtocol = 0;\n public serverCount = 0;\n public gameDir = '';\n public playerNum = 0;\n public levelName = '';\n public configStrings = new Map<number, string>();\n public baselines = new Map<number, EntityState>();\n public entities = new Map<number, EntityState>();\n\n private challenge = 0;\n private connectPacketCount = 0;\n private connectPacketTime = 0;\n\n public latestServerFrame = 0;\n private commandHistory: UserCommand[] = [];\n\n // Prediction\n public prediction: ClientPrediction | null = null;\n\n // Demo Recording\n private demoRecorder: DemoRecorder | null = null;\n\n // Events\n public onConnectionStateChange?: (state: ConnectionState) => void;\n public onConnectionError?: (error: Error) => void;\n\n // Ping calculation\n private lastPingTime = 0;\n private currentPing = 0;\n\n private effectSystem?: ClientEffectSystem;\n\n // Frame CRC\n private frameCRCs = new Map<number, number>();\n private currentPacketCRC = 0;\n\n constructor(options: MultiplayerConnectionOptions) {\n this.driver = new BrowserWebSocketNetDriver();\n this.options = options;\n this.netchan = options.netchan ?? new NetChan();\n\n this.driver.onMessage((data) => this.handleMessage(data));\n this.driver.onClose(() => this.handleDisconnect());\n this.driver.onError((err) => {\n console.error('Network Error:', err);\n if (this.onConnectionError) {\n this.onConnectionError(err);\n }\n });\n }\n\n public setPrediction(prediction: ClientPrediction) {\n this.prediction = prediction;\n }\n\n public setDemoRecorder(recorder: DemoRecorder) {\n this.demoRecorder = recorder;\n }\n\n public setEffectSystem(system: ClientEffectSystem) {\n this.effectSystem = system;\n }\n\n public async connectToServer(address: string, port: number): Promise<void> {\n const url = `ws://${address}:${port}`;\n return this.connect(url);\n }\n\n public async connect(url: string): Promise<void> {\n if (this.state !== ConnectionState.Disconnected) {\n this.disconnect();\n }\n\n console.log(`Connecting to ${url}...`);\n this.setState(ConnectionState.Connecting);\n\n // Reset netchan state for new connection\n this.netchan.reset();\n\n try {\n await this.driver.connect(url);\n console.log('WebSocket connected.');\n this.setState(ConnectionState.Challenge);\n this.sendChallenge();\n this.lastPingTime = Date.now();\n } catch (e) {\n console.error('Connection failed:', e);\n this.setState(ConnectionState.Disconnected);\n if (this.onConnectionError) {\n this.onConnectionError(e instanceof Error ? e : new Error(String(e)));\n }\n throw e;\n }\n }\n\n public disconnect(): void {\n if (this.state === ConnectionState.Disconnected) return;\n\n this.driver.disconnect();\n this.setState(ConnectionState.Disconnected);\n this.cleanup();\n }\n\n private cleanup(): void {\n this.configStrings.clear();\n this.baselines.clear();\n this.entities.clear();\n this.commandHistory = [];\n this.latestServerFrame = 0;\n this.parser = null;\n this.frameCRCs.clear();\n // Note: Do not clear options or listeners as they might be reused\n }\n\n private setState(newState: ConnectionState): void {\n if (this.state !== newState) {\n this.state = newState;\n if (this.onConnectionStateChange) {\n this.onConnectionStateChange(newState);\n }\n }\n }\n\n public getPing(): number {\n return this.currentPing;\n }\n\n public sendCommand(cmd: UserCommand): void {\n if (this.state !== ConnectionState.Active) return;\n\n // Assign the last acknowledged server frame to this command\n const commandWithFrame: UserCommand = {\n ...cmd,\n serverFrame: cmd.serverFrame ?? this.latestServerFrame\n };\n\n // Buffer command for retransmission/prediction\n this.commandHistory.push(commandWithFrame);\n if (this.commandHistory.length > CMD_BACKUP) {\n this.commandHistory.shift();\n }\n\n // Enqueue to local prediction system if available\n if (this.prediction) {\n this.prediction.enqueueCommand(commandWithFrame);\n }\n\n const writer = new BinaryWriter();\n\n writer.writeByte(ClientCommand.move);\n\n const checksum = this.frameCRCs.get(this.latestServerFrame) || 0;\n writer.writeByte(checksum);\n\n writer.writeLong(this.latestServerFrame); // lastframe (ack)\n\n writeUserCommand(writer, commandWithFrame);\n\n // Use NetChan to wrap the command\n const packet = this.netchan.transmit(writer.getData());\n this.driver.send(packet);\n }\n\n private handleMessage(data: Uint8Array): void {\n // Check if buffer is SharedArrayBuffer and copy if necessary\n let buffer = data.buffer;\n if (typeof SharedArrayBuffer !== 'undefined' && buffer instanceof SharedArrayBuffer) {\n // Copy to ArrayBuffer\n const newBuffer = new ArrayBuffer(data.byteLength);\n new Uint8Array(newBuffer).set(data);\n buffer = newBuffer;\n }\n\n // Process via NetChan\n const processedData = this.netchan.process(new Uint8Array(buffer));\n\n if (!processedData) {\n return;\n }\n\n // Process the payload\n if (processedData.byteLength > 0) {\n if (this.demoRecorder && this.demoRecorder.getIsRecording()) {\n this.demoRecorder.recordMessage(processedData);\n }\n\n // Calculate CRC for potential frame update\n this.currentPacketCRC = crc8(processedData);\n\n const stream = new BinaryStream(processedData.buffer as ArrayBuffer);\n this.parser = new NetworkMessageParser(stream, this);\n this.parser.parseMessage();\n\n // Update ping on receiving frame or valid response\n const now = Date.now();\n if (this.lastPingTime > 0) {\n // Very rough ping estimation (RTT)\n // Real ping should be based on ack of commands but this is a start\n this.currentPing = now - this.lastPingTime;\n }\n this.lastPingTime = now;\n }\n }\n\n private handleDisconnect(): void {\n console.log('Disconnected from server.');\n this.setState(ConnectionState.Disconnected);\n this.cleanup();\n }\n\n private sendChallenge(): void {\n const builder = new NetworkMessageBuilder();\n builder.writeByte(ClientCommand.stringcmd);\n builder.writeString('getchallenge');\n\n const packet = this.netchan.transmit(builder.getData());\n this.driver.send(packet);\n }\n\n private sendConnect(challenge: number): void {\n const builder = new NetworkMessageBuilder();\n builder.writeByte(ClientCommand.stringcmd);\n\n const userinfo = `\\\\name\\\\${this.options.username}\\\\model\\\\${this.options.model}\\\\skin\\\\${this.options.skin}\\\\hand\\\\${this.options.hand ?? 0}\\\\fov\\\\${this.options.fov ?? 90}`;\n\n builder.writeString(`connect ${PROTOCOL_VERSION_RERELEASE} ${challenge} ${userinfo}`);\n\n const packet = this.netchan.transmit(builder.getData());\n this.driver.send(packet);\n }\n\n public isConnected(): boolean {\n return this.state === ConnectionState.Active;\n }\n\n // ==================================================================================\n // NetworkMessageHandler Implementation\n // ==================================================================================\n\n onServerData(protocol: number, serverCount: number, attractLoop: number, gameDir: string, playerNum: number, levelName: string): void {\n console.log(`Server Data: Protocol ${protocol}, Level ${levelName}`);\n this.serverProtocol = protocol;\n this.serverCount = serverCount;\n this.gameDir = gameDir;\n this.playerNum = playerNum;\n this.levelName = levelName;\n\n this.setState(ConnectionState.Connected);\n\n // Send \"new\" command to acknowledge we are loading\n const builder = new NetworkMessageBuilder();\n builder.writeByte(ClientCommand.stringcmd);\n builder.writeString('new');\n\n const packet = this.netchan.transmit(builder.getData());\n this.driver.send(packet);\n\n this.setState(ConnectionState.Loading);\n }\n\n onConfigString(index: number, str: string): void {\n this.configStrings.set(index, str);\n }\n\n onSpawnBaseline(entity: EntityState): void {\n this.baselines.set(entity.number, entity);\n }\n\n onStuffText(msg: string): void {\n if (msg.startsWith('precache')) {\n this.finishLoading();\n }\n\n if (msg.startsWith('challenge ')) {\n const parts = msg.split(' ');\n if (parts.length > 1) {\n this.challenge = parseInt(parts[1], 10);\n this.sendConnect(this.challenge);\n }\n }\n }\n\n private finishLoading(): void {\n console.log('Finished loading, sending begin...');\n const builder = new NetworkMessageBuilder();\n builder.writeByte(ClientCommand.stringcmd);\n builder.writeString('begin');\n\n const packet = this.netchan.transmit(builder.getData());\n this.driver.send(packet);\n\n this.setState(ConnectionState.Active);\n }\n\n onFrame(frame: FrameData): void {\n if (frame.serverFrame > this.latestServerFrame) {\n this.latestServerFrame = frame.serverFrame;\n }\n\n // Store CRC for this frame\n this.frameCRCs.set(frame.serverFrame, this.currentPacketCRC);\n\n // Update Entities Map\n const packetEntities = frame.packetEntities;\n\n if (!packetEntities.delta) {\n this.entities.clear();\n }\n\n for (const ent of packetEntities.entities) {\n let current = this.entities.get(ent.number);\n if (!current) {\n current = createEmptyEntityState();\n current.number = ent.number;\n this.entities.set(ent.number, current);\n }\n applyEntityDelta(current, ent);\n }\n\n if (this.prediction && frame.playerState) {\n const ps = frame.playerState;\n const predState: PredictionState = {\n ...defaultPredictionState(),\n origin: { x: ps.origin.x, y: ps.origin.y, z: ps.origin.z },\n velocity: { x: ps.velocity.x, y: ps.velocity.y, z: ps.velocity.z },\n viewAngles: { x: ps.viewangles.x, y: ps.viewangles.y, z: ps.viewangles.z },\n deltaAngles: { x: ps.delta_angles.x, y: ps.delta_angles.y, z: ps.delta_angles.z },\n pmFlags: ps.pm_flags,\n pmType: ps.pm_type,\n gravity: ps.gravity,\n health: ps.stats[0],\n };\n\n const gameFrame: GameFrameResult<PredictionState> = {\n frame: frame.serverFrame,\n timeMs: 0,\n state: predState\n };\n\n this.prediction.setAuthoritative(gameFrame);\n }\n }\n\n onCenterPrint(msg: string): void {}\n onPrint(level: number, msg: string): void {}\n onSound(flags: number, soundNum: number, volume?: number, attenuation?: number, offset?: number, ent?: number, pos?: Vec3): void {}\n\n onTempEntity(type: number, pos: Vec3, pos2?: Vec3, dir?: Vec3, cnt?: number, color?: number, ent?: number, srcEnt?: number, destEnt?: number): void {\n if (this.effectSystem) {\n const time = Date.now() / 1000.0; // Use local time for now\n this.effectSystem.onTempEntity(type, pos, time);\n }\n }\n\n onLayout(layout: string): void {}\n onInventory(inventory: number[]): void {}\n\n onMuzzleFlash(ent: number, weapon: number): void {\n if (this.effectSystem) {\n const time = Date.now() / 1000.0;\n this.effectSystem.onMuzzleFlash(ent, weapon, time);\n }\n }\n\n onMuzzleFlash2(ent: number, weapon: number): void {\n // Helper for MZ2 types?\n }\n\n onMuzzleFlash3(ent: number, weapon: number): void {\n if (this.effectSystem) {\n const time = Date.now() / 1000.0;\n this.effectSystem.onMuzzleFlash(ent, weapon, time);\n }\n }\n\n onDisconnect(): void { this.disconnect(); }\n onReconnect(): void {}\n onDownload(size: number, percent: number, data?: Uint8Array): void {}\n\n // New handlers stubs\n onSplitClient(clientNum: number): void {}\n onConfigBlast(index: number, data: Uint8Array): void {}\n onSpawnBaselineBlast(entity: EntityState): void {}\n onLevelRestart(): void {}\n onDamage(indicators: DamageIndicator[]): void {}\n onLocPrint(flags: number, base: string, args: string[]): void {}\n onFog(data: FogData): void {}\n onWaitingForPlayers(count: number): void {}\n onBotChat(msg: string): void {}\n onPoi(flags: number, pos: Vec3): void {}\n onHelpPath(pos: Vec3): void {}\n onAchievement(id: string): void {}\n}","import { Renderer, DemoPlaybackController, PlaybackState } from '@quake2ts/engine';\n\nexport class DemoControls {\n private playback: DemoPlaybackController;\n private isVisible: boolean = true;\n private demoName: string | null = null;\n private onSpeedChange?: (speed: number) => void;\n\n constructor(playback: DemoPlaybackController, onSpeedChange?: (speed: number) => void) {\n this.playback = playback;\n this.onSpeedChange = onSpeedChange;\n }\n\n public setDemoName(name: string | null) {\n this.demoName = name;\n }\n\n public render(renderer: Renderer, width: number, height: number): void {\n if (!this.isVisible) return;\n\n const state = this.playback.getState();\n const isPlaying = state === PlaybackState.Playing;\n\n // Bottom overlay\n const overlayHeight = 60;\n const y = height - overlayHeight;\n renderer.drawfillRect(0, y, width, overlayHeight, [0, 0, 0, 0.5]);\n\n // Play/Pause button\n const iconSize = 24;\n const iconY = y + (overlayHeight - iconSize) / 2;\n const iconX = 20;\n\n const statusText = isPlaying ? \"PAUSE\" : \"PLAY\";\n renderer.drawString(iconX, iconY, statusText);\n\n // Speed indicator\n const speed = this.playback.getSpeed();\n const speedText = `Speed: ${speed}x`;\n renderer.drawCenterString(iconY, speedText);\n\n // Time Text (MM:SS / MM:SS)\n const currentTime = this.playback.getCurrentTime();\n const totalTime = this.playback.getDuration();\n const currentFormatted = this.formatTime(currentTime);\n const totalFormatted = this.formatTime(totalTime);\n const timeText = `${currentFormatted} / ${totalFormatted}`;\n\n // Position time text to the right\n const timeX = width - 150;\n renderer.drawString(timeX, iconY, timeText);\n\n // Demo Name\n if (this.demoName) {\n renderer.drawString(width - 300, iconY - 20, this.demoName);\n }\n\n // Timeline (Progress Bar)\n const timelineY = y + 5;\n const timelineHeight = 4;\n const timelineWidth = width - 40;\n const timelineX = 20;\n\n // Draw background bar\n renderer.drawfillRect(timelineX, timelineY, timelineWidth, timelineHeight, [0.3, 0.3, 0.3, 1.0]);\n\n // Draw progress\n const progress = totalTime > 0 ? (currentTime / totalTime) : 0;\n const clampedProgress = Math.max(0, Math.min(1, progress));\n const progressWidth = timelineWidth * clampedProgress;\n renderer.drawfillRect(timelineX, timelineY, progressWidth, timelineHeight, [1.0, 1.0, 1.0, 1.0]);\n\n // Draw marker\n const markerX = timelineX + progressWidth;\n renderer.drawfillRect(markerX - 2, timelineY - 2, 4, timelineHeight + 4, [1.0, 0.0, 0.0, 1.0]);\n\n // Controls Help\n const helpText = \"[Space] Toggle [< >] Step [ [ ] ] Speed [Esc] Stop\";\n renderer.drawCenterString(y + 35, helpText);\n }\n\n public handleInput(key: string, down: boolean): boolean {\n if (!down) return false;\n\n // We only consume specific keys\n switch (key.toLowerCase()) {\n case ' ':\n if (this.playback.getState() === PlaybackState.Playing) {\n this.playback.pause();\n } else if (this.playback.getState() === PlaybackState.Paused) {\n this.playback.play();\n }\n return true;\n\n case 'arrowright':\n this.playback.stepForward();\n return true;\n\n case 'arrowleft':\n this.playback.stepBackward();\n return true;\n\n case ']':\n this.changeSpeed(2.0); // Multiply by 2\n return true;\n\n case '[':\n this.changeSpeed(0.5); // Multiply by 0.5\n return true;\n\n case 'escape':\n this.playback.stop();\n return true;\n }\n\n return false;\n }\n\n private changeSpeed(factor: number) {\n const current = this.playback.getSpeed();\n let newSpeed = current * factor;\n if (newSpeed < 0.1) newSpeed = 0.1;\n if (newSpeed > 16) newSpeed = 16;\n this.playback.setSpeed(newSpeed);\n if (this.onSpeedChange) {\n this.onSpeedChange(newSpeed);\n }\n }\n\n private formatTime(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n}\n","import { Vec3 } from '@quake2ts/shared';\n\nexport enum DemoCameraMode {\n FirstPerson,\n ThirdPerson,\n Free,\n Follow\n}\n\nexport interface DemoCameraState {\n mode: DemoCameraMode;\n thirdPersonDistance: number;\n thirdPersonOffset: Vec3;\n freeCameraOrigin: Vec3;\n freeCameraAngles: Vec3;\n followEntityId: number;\n currentFollowOrigin?: Vec3;\n}\n","import { EntityEffects, RenderFx, Vec3 } from '@quake2ts/shared';\nimport { DLight } from '@quake2ts/engine';\n\n// Helper to add dlight\nfunction addDLight(\n dlights: DLight[],\n origin: Vec3,\n color: [number, number, number],\n intensity: number,\n minLight: number = 0,\n die: number = 0\n) {\n dlights.push({\n origin,\n color: { x: color[0], y: color[1], z: color[2] },\n intensity,\n minLight,\n die,\n });\n}\n\nexport function processEntityEffects(\n entity: {\n effects: number;\n renderfx: number;\n origin: Vec3;\n alpha?: number;\n },\n dlights: DLight[],\n time: number\n) {\n const { effects, origin } = entity;\n const lifetime = time + 0.1;\n\n // EF_BLASTER: Yellow light\n if (effects & EntityEffects.Blaster) {\n addDLight(dlights, origin, [1.0, 1.0, 0.0], 200, 0, lifetime);\n }\n\n // EF_HYPERBLASTER: Yellow light\n if (effects & EntityEffects.HyperBlaster) {\n const intensity = flicker(time, 200, 32);\n addDLight(dlights, origin, [1.0, 1.0, 0.0], intensity, 0, lifetime);\n }\n\n // EF_ROCKET: Red/Orange light + Trail? (Trails handled elsewhere usually)\n // Task 4.1.4: \"Color based on projectile type\", \"Trail effect\" (Trails are particles, here we do lights)\n if (effects & EntityEffects.Rocket) {\n addDLight(dlights, origin, [1.0, 0.5, 0.2], 200, 0, lifetime);\n }\n\n // EF_GRENADE: Orange light\n if (effects & EntityEffects.Grenade) {\n addDLight(dlights, origin, [1.0, 0.5, 0.0], 100, 0, lifetime);\n }\n\n // EF_BFG: Green light\n if (effects & EntityEffects.Bfg) {\n addDLight(dlights, origin, [0.1, 1.0, 0.1], 300, 0, lifetime);\n }\n\n // EF_BLUEHYPERBLASTER: Blue light\n if (effects & EntityEffects.Bluehyperblaster) {\n const intensity = flicker(time, 200, 32);\n addDLight(dlights, origin, [0.2, 0.2, 1.0], intensity, 0, lifetime);\n }\n\n // EF_PLASMA: Blue light\n if (effects & EntityEffects.Plasma) {\n addDLight(dlights, origin, [0.2, 0.5, 1.0], 200, 0, lifetime);\n }\n\n // EF_TRACKER: Green light\n if (effects & EntityEffects.Tracker) {\n addDLight(dlights, origin, [0.2, 1.0, 0.2], 200, 0, lifetime);\n }\n\n // EF_TRAP: Green light\n if (effects & EntityEffects.Trap) {\n addDLight(dlights, origin, [0.2, 1.0, 0.2], 200, 0, lifetime);\n }\n\n // EF_FLAG1: Red Light\n if (effects & EntityEffects.Flag1) {\n const intensity = flicker(time, 200, 40);\n addDLight(dlights, origin, [1.0, 0.2, 0.2], intensity, 0, lifetime);\n }\n\n // EF_FLAG2: Blue Light\n if (effects & EntityEffects.Flag2) {\n const intensity = flicker(time, 200, 40);\n addDLight(dlights, origin, [0.2, 0.2, 1.0], intensity, 0, lifetime);\n }\n\n // EF_COLOR_SHELL (16) often implies power shield or specific coloring?\n // EF_POWERSCREEN (32)\n}\n\nfunction flicker(time: number, base: number, variance: number): number {\n return base + (Math.random() - 0.5) * variance;\n}\n","import { DynamicLightManager, EngineImports, EntityState } from '@quake2ts/engine';\nimport {\n Vec3,\n MZ_BLASTER, MZ_MACHINEGUN, MZ_SHOTGUN, MZ_CHAINGUN1, MZ_CHAINGUN2, MZ_CHAINGUN3,\n MZ_RAILGUN, MZ_ROCKET, MZ_GRENADE, MZ_LOGIN, MZ_LOGOUT, MZ_SSHOTGUN, MZ_BFG, MZ_HYPERBLASTER,\n MZ_BLUEHYPERBLASTER, MZ_PHALANX, MZ_IONRIPPER, MZ_ETF_RIFLE, MZ_HEATBEAM,\n MZ_BLASTER2, MZ_TRACKER, MZ_NUKE1, MZ_NUKE2, MZ_NUKE4, MZ_NUKE8,\n TempEntity,\n angleVectors\n} from '@quake2ts/shared';\n// Import particle helpers from engine\nimport {\n spawnBulletImpact, spawnExplosion, spawnBlood, spawnMuzzleFlash,\n spawnTrail, spawnSplash, spawnSteam, spawnRailTrail, spawnSparks,\n spawnBlasterImpact, spawnBfgExplosion\n} from '@quake2ts/engine';\nimport { ClientConfigStrings } from './configStrings.js';\n\n// Helper to copy vec3\nconst copyVec3 = (v: Vec3): Vec3 => ({ x: v.x, y: v.y, z: v.z });\n\n// Helper to scale and add\nconst vectorMA = (start: Vec3, scale: number, dir: Vec3): Vec3 => ({\n x: start.x + dir.x * scale,\n y: start.y + dir.y * scale,\n z: start.z + dir.z * scale\n});\n\nexport interface EntityProvider {\n getEntity(entNum: number): EntityState | undefined;\n getPlayerNum(): number;\n}\n\n// Muzzle Flash Offsets (Forward, Right, Up)\nconst FLASH_OFFSETS: Record<number, Vec3> = {\n [MZ_BLASTER]: { x: 24, y: 8, z: 0 },\n [MZ_MACHINEGUN]: { x: 28, y: 8, z: 0 },\n [MZ_SHOTGUN]: { x: 24, y: 8, z: 0 },\n [MZ_SSHOTGUN]: { x: 20, y: 8, z: 0 },\n [MZ_CHAINGUN1]: { x: 30, y: 8, z: -4 },\n [MZ_CHAINGUN2]: { x: 30, y: 8, z: -4 },\n [MZ_CHAINGUN3]: { x: 30, y: 8, z: -4 },\n [MZ_RAILGUN]: { x: 32, y: 8, z: 0 },\n [MZ_ROCKET]: { x: 30, y: 8, z: 0 },\n [MZ_GRENADE]: { x: 24, y: 8, z: 0 },\n [MZ_BFG]: { x: 32, y: 8, z: -2 },\n [MZ_HYPERBLASTER]: { x: 30, y: 8, z: 0 },\n [MZ_BLUEHYPERBLASTER]: { x: 30, y: 8, z: 0 },\n [MZ_PHALANX]: { x: 28, y: 8, z: 0 },\n [MZ_IONRIPPER]: { x: 28, y: 8, z: 0 },\n [MZ_ETF_RIFLE]: { x: 30, y: 8, z: 0 },\n [MZ_HEATBEAM]: { x: 24, y: 8, z: 0 },\n};\n\nconst getFlashOffset = (weapon: number): Vec3 => {\n return FLASH_OFFSETS[weapon] || { x: 18, y: 16, z: 0 };\n};\n\nexport class ClientEffectSystem {\n private dlightManager: DynamicLightManager;\n private engine: EngineImports;\n private entityProvider: EntityProvider;\n private configStrings?: ClientConfigStrings;\n\n constructor(dlightManager: DynamicLightManager, engine: EngineImports, entityProvider: EntityProvider, configStrings?: ClientConfigStrings) {\n this.dlightManager = dlightManager;\n this.engine = engine;\n this.entityProvider = entityProvider;\n this.configStrings = configStrings;\n }\n\n // Helper to add dlight\n private addLight(key: number | undefined, origin: Vec3, color: Vec3, radius: number, minLight: number, die: number, radiusSpeed: number = 0) {\n this.dlightManager.addLight({\n key,\n origin: copyVec3(origin),\n color,\n intensity: radius,\n minLight,\n die: die,\n radiusSpeed\n }, 0);\n }\n\n private playSound(pos: Vec3 | null, ent: number, soundName: string, vol: number = 1.0, attn: number = 1.0) {\n if (!this.engine.audio) return;\n\n const index = this.engine.audio.soundindex(soundName);\n if (index === 0) return;\n\n if (pos) {\n this.engine.audio.positioned_sound(pos, index, vol, attn);\n } else {\n this.engine.audio.sound(ent, 0, index, vol, attn, 0);\n }\n }\n\n public onMuzzleFlash(entNum: number, weapon: number, time: number) {\n const ent = this.entityProvider.getEntity(entNum);\n if (!ent) return;\n\n const origin = { x: ent.origin.x, y: ent.origin.y, z: ent.origin.z };\n const angles = { x: ent.angles.x, y: ent.angles.y, z: ent.angles.z };\n\n const silenced = (weapon & 128) !== 0;\n weapon &= ~128;\n\n let flashOrigin = { ...origin };\n\n // Determine flash position based on weapon type offsets\n const vectors = angleVectors(angles);\n const offset = getFlashOffset(weapon);\n\n flashOrigin = vectorMA(flashOrigin, offset.x, vectors.forward);\n flashOrigin = vectorMA(flashOrigin, offset.y, vectors.right);\n flashOrigin = vectorMA(flashOrigin, offset.z, vectors.up);\n\n let radius = silenced ? 100 : 200;\n let duration = 0.1;\n let minLight = 32;\n let color: Vec3 = { x: 1, y: 1, z: 0 }; // Default yellow\n\n // Vary properties per weapon (Task: Duration and intensity per weapon)\n switch (weapon) {\n case MZ_BLASTER:\n radius = 150;\n color = { x: 1, y: 1, z: 0 };\n break;\n case MZ_MACHINEGUN:\n case MZ_CHAINGUN1:\n case MZ_CHAINGUN2:\n case MZ_CHAINGUN3:\n radius = 150;\n color = { x: 1, y: 1, z: 0 };\n break;\n case MZ_SHOTGUN:\n case MZ_SSHOTGUN:\n radius = 200;\n color = { x: 1, y: 1, z: 0 };\n break;\n case MZ_HYPERBLASTER:\n radius = 250;\n color = { x: 1, y: 1, z: 0 };\n break;\n case MZ_BLUEHYPERBLASTER:\n radius = 250;\n color = { x: 0, y: 0, z: 1 };\n break;\n case MZ_RAILGUN:\n radius = 150;\n color = { x: 0.5, y: 0.5, z: 1.0 };\n duration = 0.15; // Slightly longer for powerful shot\n break;\n case MZ_ROCKET:\n case MZ_GRENADE:\n radius = 300;\n color = { x: 1, y: 0.5, z: 0.2 };\n break;\n case MZ_BFG:\n radius = 400;\n color = { x: 0, y: 1, z: 0 };\n duration = 0.2; // BFG Flash lingers\n break;\n }\n\n if (silenced) radius *= 0.75;\n // Jitter radius\n if (Math.random() < 0.5) radius += Math.random() * 31;\n\n const die = time + duration;\n const volume = silenced ? 0.2 : 1.0;\n\n this.addLight(entNum, flashOrigin, color, radius, minLight, die);\n\n // Spawn particle muzzle flash if renderer is available\n if (this.engine.renderer && this.engine.renderer.particleSystem) {\n // Muzzle flash direction usually follows view angles or model forward\n // Here we use vectors.forward from entity angles\n spawnMuzzleFlash({\n system: this.engine.renderer.particleSystem,\n origin: flashOrigin,\n direction: vectors.forward\n });\n }\n\n let soundName = '';\n switch (weapon) {\n case MZ_BLASTER: soundName = \"weapons/blastf1a.wav\"; break;\n case MZ_SHOTGUN: soundName = \"weapons/shotgf1b.wav\"; break;\n case MZ_SSHOTGUN: soundName = \"weapons/sshotf1b.wav\"; break;\n case MZ_MACHINEGUN: soundName = `weapons/machgf${Math.floor(Math.random()*5)+1}b.wav`; break;\n case MZ_RAILGUN: soundName = \"weapons/railgf1a.wav\"; break;\n case MZ_ROCKET: soundName = \"weapons/rocklf1a.wav\"; break;\n case MZ_GRENADE: soundName = \"weapons/grenlf1a.wav\"; break;\n case MZ_BFG: soundName = \"weapons/bfg__f1y.wav\"; break;\n case MZ_HYPERBLASTER: soundName = \"weapons/hyprbf1a.wav\"; break;\n case MZ_BLUEHYPERBLASTER: soundName = \"weapons/hyprbf1a.wav\"; break;\n case MZ_CHAINGUN1:\n case MZ_CHAINGUN2:\n case MZ_CHAINGUN3:\n soundName = `weapons/machgf${Math.floor(Math.random()*5)+1}b.wav`;\n break;\n }\n\n if (soundName) {\n this.playSound(null, entNum, soundName, volume, 1.0);\n }\n }\n\n public onTempEntity(type: number, pos: Vec3, time: number, dir?: Vec3, pos2?: Vec3) {\n const particleSystem = this.engine.renderer?.particleSystem;\n\n switch (type) {\n case TempEntity.GUNSHOT:\n if (particleSystem) {\n spawnBulletImpact({\n system: particleSystem,\n origin: pos,\n normal: dir || { x: 0, y: 0, z: 1 }\n });\n }\n this.playSound(pos, 0, \"weapons/tink1.wav\"); // Generic hit sound, usually localized based on surface type in CL_ParseTEnt\n break;\n\n case TempEntity.BLOOD:\n if (particleSystem) {\n spawnBlood({\n system: particleSystem,\n origin: pos,\n direction: dir || { x: 0, y: 0, z: 1 }\n });\n }\n break;\n\n case TempEntity.EXPLOSION1:\n case TempEntity.EXPLOSION1_BIG:\n case TempEntity.EXPLOSION1_NP:\n case TempEntity.ROCKET_EXPLOSION:\n case TempEntity.GRENADE_EXPLOSION:\n case TempEntity.ROCKET_EXPLOSION_WATER:\n case TempEntity.GRENADE_EXPLOSION_WATER:\n {\n const color: Vec3 = { x: 1, y: 0.5, z: 0.2 };\n const duration = 0.5;\n const startRadius = 50;\n const endRadius = 400; // Expanding to 400\n // Speed = delta / duration = 350 / 0.5 = 700\n const speed = (endRadius - startRadius) / duration;\n\n this.addLight(undefined, pos, color, startRadius, 0, time + duration, speed);\n this.playSound(pos, 0, \"weapons/rocklx1a.wav\", 1.0, 0.5);\n\n if (particleSystem) {\n spawnExplosion({\n system: particleSystem,\n origin: pos\n });\n }\n }\n break;\n\n case TempEntity.BFG_EXPLOSION:\n case TempEntity.BFG_BIGEXPLOSION:\n {\n const color: Vec3 = { x: 0, y: 1, z: 0 };\n const duration = 0.5;\n const startRadius = 200;\n const endRadius = 500;\n const speed = (endRadius - startRadius) / duration;\n this.addLight(undefined, pos, color, startRadius, 0, time + duration, speed);\n this.playSound(pos, 0, \"weapons/bfg__x1b.wav\", 1.0, 0.5);\n\n if (particleSystem) {\n spawnBfgExplosion({\n system: particleSystem,\n origin: pos\n });\n }\n }\n break;\n\n case TempEntity.SPLASH:\n if (particleSystem) {\n spawnSplash({\n system: particleSystem,\n origin: pos,\n normal: dir || { x: 0, y: 0, z: 1 }\n });\n }\n this.playSound(pos, 0, \"world/splash.wav\"); // Or generic splash sound\n break;\n\n case TempEntity.STEAM:\n if (particleSystem) {\n spawnSteam({\n system: particleSystem,\n origin: pos\n });\n }\n break;\n\n case TempEntity.RAILTRAIL:\n if (particleSystem && pos2) {\n spawnRailTrail({\n system: particleSystem,\n start: pos,\n end: pos2\n });\n }\n break;\n\n case TempEntity.BLASTER:\n if (particleSystem) {\n spawnBlasterImpact({\n system: particleSystem,\n origin: pos,\n color: [1.0, 1.0, 0.0, 1.0] // Yellow\n });\n }\n this.playSound(pos, 0, \"weapons/lasthit.wav\"); // Adjust sound if needed\n break;\n\n case TempEntity.BLUEHYPERBLASTER:\n if (particleSystem) {\n spawnBlasterImpact({\n system: particleSystem,\n origin: pos,\n color: [0.0, 0.0, 1.0, 1.0] // Blue\n });\n }\n this.playSound(pos, 0, \"weapons/lasthit.wav\");\n break;\n\n case TempEntity.SPARKS:\n case TempEntity.BULLET_SPARKS:\n case TempEntity.WELDING_SPARKS:\n if (particleSystem) {\n spawnSparks({\n system: particleSystem,\n origin: pos,\n normal: dir || { x: 0, y: 0, z: 1 },\n count: 8,\n color: [1.0, 0.8, 0.2, 1.0]\n });\n }\n this.playSound(pos, 0, \"world/spark1.wav\"); // Or similar\n break;\n\n case TempEntity.SHIELD_SPARKS:\n case TempEntity.SCREEN_SPARKS:\n if (particleSystem) {\n spawnSparks({\n system: particleSystem,\n origin: pos,\n normal: dir || { x: 0, y: 0, z: 1 },\n count: 12,\n color: [0.5, 1.0, 0.5, 1.0] // Greenish for shield? Or classic spark color.\n });\n }\n this.playSound(pos, 0, \"world/spark2.wav\");\n break;\n }\n }\n}\n","import { PlayerState, PlayerStat, CONTENTS_LAVA, CONTENTS_SLIME, CONTENTS_WATER } from '@quake2ts/shared';\n\nexport interface BlendState {\n damageAlpha: number;\n bonusAlpha: number;\n lastFlashes: number;\n}\n\nexport const createBlendState = (): BlendState => ({\n damageAlpha: 0,\n bonusAlpha: 0,\n lastFlashes: 0\n});\n\nexport const updateBlend = (\n state: BlendState,\n ps: PlayerState,\n dt: number,\n damageIntensity: number = 0\n): [number, number, number, number] => {\n // Update damage alpha\n state.damageAlpha -= dt;\n if (state.damageAlpha < 0) state.damageAlpha = 0;\n\n if (damageIntensity > 0) {\n state.damageAlpha = damageIntensity;\n }\n\n // Update bonus alpha\n state.bonusAlpha -= dt;\n if (state.bonusAlpha < 0) state.bonusAlpha = 0;\n\n // Check for flashes (pickups)\n const flashes = ps.stats ? (ps.stats[PlayerStat.STAT_FLASHES] ?? 0) : 0;\n\n if (flashes !== state.lastFlashes) {\n state.bonusAlpha = 0.6;\n state.lastFlashes = flashes;\n }\n\n if (state.bonusAlpha > 0) {\n return [1, 1, 0, state.bonusAlpha * 0.3];\n } else if (state.damageAlpha > 0) {\n return [1, 0, 0, state.damageAlpha * 0.5];\n }\n\n // Underwater tints\n if (ps.waterLevel >= 3) {\n if (ps.watertype & CONTENTS_LAVA) {\n // Lava: Strong Orange/Red\n return [1.0, 0.3, 0.0, 0.6];\n } else if (ps.watertype & CONTENTS_SLIME) {\n // Slime: Sickly Green\n return [0.0, 0.1, 0.05, 0.6];\n } else {\n // Water: Brown/Gold tint matching Q2\n return [0.5, 0.3, 0.2, 0.4];\n }\n }\n\n return [0, 0, 0, 0];\n};\n","import { ConfigStringIndex, MAX_CLIENTS } from '@quake2ts/shared';\nimport { ClientConfigStrings } from './configStrings.js';\n\nexport interface ScoreboardEntry {\n name: string;\n frags: number;\n deaths: number;\n ping: number;\n id: number;\n skin?: string;\n model?: string;\n team?: string; // Team name or identifier (e.g. \"red\", \"blue\")\n}\n\nexport interface ScoreboardData {\n players: ScoreboardEntry[];\n mapName: string;\n}\n\nexport class ScoreboardManager {\n private configStrings: ClientConfigStrings;\n private localPlayerId: number = -1;\n private listeners: ((data: ScoreboardData) => void)[] = [];\n\n // Cache players to support stateful updates (e.g. scores)\n private players: Map<number, ScoreboardEntry> = new Map();\n\n constructor(configStrings: ClientConfigStrings) {\n this.configStrings = configStrings;\n this.refreshAll();\n }\n\n public setLocalPlayerId(id: number) {\n this.localPlayerId = id;\n }\n\n public addListener(listener: (data: ScoreboardData) => void) {\n this.listeners.push(listener);\n }\n\n public removeListener(listener: (data: ScoreboardData) => void) {\n const index = this.listeners.indexOf(listener);\n if (index !== -1) {\n this.listeners.splice(index, 1);\n }\n }\n\n public notifyUpdate() {\n const data = this.getScoreboard();\n for (const listener of this.listeners) {\n listener(data);\n }\n }\n\n private refreshAll() {\n this.players.clear();\n for (let i = 0; i < MAX_CLIENTS; i++) {\n const csIndex = ConfigStringIndex.PlayerSkins + i;\n const str = this.configStrings.get(csIndex);\n if (str && str.length > 0) {\n this.parseConfigString(csIndex, str);\n }\n }\n }\n\n public parseConfigString(index: number, str: string) {\n if (index < ConfigStringIndex.PlayerSkins || index >= ConfigStringIndex.PlayerSkins + MAX_CLIENTS) {\n return;\n }\n const id = index - ConfigStringIndex.PlayerSkins;\n\n // If string is empty, remove player\n if (!str || str.length === 0) {\n if (this.players.has(id)) {\n this.players.delete(id);\n }\n return;\n }\n\n const entry = this.parsePlayerConfigString(id, str);\n if (entry) {\n // Preserve existing scores if updating same player\n const existing = this.players.get(id);\n if (existing) {\n entry.frags = existing.frags;\n entry.deaths = existing.deaths;\n entry.ping = existing.ping;\n entry.team = existing.team;\n }\n this.players.set(id, entry);\n }\n }\n\n public getScoreboard(): ScoreboardData {\n const players = Array.from(this.players.values());\n\n // Sort by frags (descending)\n players.sort((a, b) => b.frags - a.frags);\n\n // Get map name (ConfigStringIndex.Name is server name, usually map name is in another CS or serverinfo)\n const worldModel = this.configStrings.getModelName(1);\n let mapName = 'unknown';\n if (worldModel) {\n // Extract map name from maps/foo.bsp\n const match = worldModel.match(/maps\\/(.*)\\.bsp/i);\n if (match) {\n mapName = match[1];\n } else {\n mapName = worldModel;\n }\n }\n\n return {\n players,\n mapName\n };\n }\n\n private parsePlayerConfigString(id: number, str: string): ScoreboardEntry | null {\n // Format: \\name\\Player\\skin\\male/grunt...\n const parts = str.split('\\\\');\n const info: Record<string, string> = {};\n\n // Skip empty first part if string starts with \\\n let startIndex = 0;\n if (parts.length > 0 && parts[0] === '') {\n startIndex = 1;\n }\n\n for (let i = startIndex; i < parts.length; i += 2) {\n if (i + 1 < parts.length) {\n const key = parts[i].toLowerCase();\n const value = parts[i + 1];\n info[key] = value;\n }\n }\n\n if (!info.name) {\n return null;\n }\n\n return {\n id,\n name: info.name,\n frags: 0,\n deaths: 0,\n ping: 0,\n skin: info.skin,\n model: info.model,\n team: undefined\n };\n }\n\n // Method to update scores explicitly\n public updateScore(id: number, frags: number, deaths: number, ping: number) {\n const player = this.players.get(id);\n if (player) {\n player.frags = frags;\n player.deaths = deaths;\n player.ping = ping;\n this.notifyUpdate();\n }\n }\n\n /**\n * Parses the layout string from svc_layout and updates player scores.\n * Expected format example:\n * xv 32 yv 32 string \"%4i %4i %-12.12s %4i\"\n * followed by values? No, the string command draws text.\n * In Q2, the layout message sends a series of drawing commands.\n * The server formats the string:\n * \"xv 32 yv %i string \\\"%4i %4i %-12.12s %4i\\\" \"\n * The client receives the formatting commands AND the string data.\n * Wait, svc_layout in Q2 sends a single string that the client parses and draws.\n * The string contains tokens.\n * Example:\n * \"xv 32 yv 32 string \\\" 10 50 PlayerName 10\\\"\"\n * We need to regex this.\n */\n public processScoreboardMessage(layout: string) {\n // Regex to find string commands\n // string \"text\"\n // text might contain quotes escaped? Q2 doesn't usually escape quotes inside the string command value like JSON.\n // It's usually `string \"content\"`\n // Content is: Frags Ping Name Time\n // %4i %4i %-12.12s %4i\n // Example: \" 12 50 Julian 10\"\n\n const stringCmdRegex = /string\\s+\"([^\"]+)\"/g;\n let match;\n\n // We need to match names to IDs. This is fuzzy if names are duplicates.\n // But it's the best we can do with standard Q2 layout.\n\n while ((match = stringCmdRegex.exec(layout)) !== null) {\n const content = match[1];\n\n // Check if this looks like a player row\n // It should have 3 numbers and a name?\n // Frags (int), Ping (int), Name (string), Time (int)\n // The name might contain spaces?\n // The format is fixed width usually.\n // \"%4i %4i %-12.12s %4i\"\n // Frags: 0-4 chars\n // Ping: 5-9 chars\n // Name: 10-22 chars (12 chars max)\n // Time: 23+ chars\n\n // Or we can try to split by whitespace, but name can have spaces?\n // Actually Q2 names can have spaces? I think they can.\n // But strict Q2 format uses fixed width for the name field in the scoreboard string.\n\n // Let's try to parse based on the known format.\n if (content.length > 20) {\n const fragsStr = content.substring(0, 4).trim();\n const pingStr = content.substring(5, 9).trim();\n const nameStr = content.substring(10, 22).trim();\n // const timeStr = content.substring(23, 27).trim();\n\n const frags = parseInt(fragsStr, 10);\n const ping = parseInt(pingStr, 10);\n\n if (!isNaN(frags) && !isNaN(ping) && nameStr.length > 0) {\n // Find player by name\n // We iterate all players to find a match\n for (const player of this.players.values()) {\n if (player.name === nameStr) {\n player.frags = frags;\n player.ping = ping;\n // Deaths are not in standard layout\n }\n }\n }\n }\n }\n this.notifyUpdate();\n }\n}\n","export interface ChatMessage {\n timestamp: number;\n sender?: string; // If undefined, it's a system message\n text: string;\n team: boolean;\n}\n\nexport class ChatManager {\n private history: ChatMessage[] = [];\n private maxHistory = 100;\n private listeners: ((sender: string, message: string, team: boolean) => void)[] = [];\n private sendCommand: (cmd: string) => void;\n\n constructor(sendCommand: (cmd: string) => void) {\n this.sendCommand = sendCommand;\n }\n\n public addListener(listener: (sender: string, message: string, team: boolean) => void) {\n this.listeners.push(listener);\n }\n\n public removeListener(listener: (sender: string, message: string, team: boolean) => void) {\n const index = this.listeners.indexOf(listener);\n if (index !== -1) {\n this.listeners.splice(index, 1);\n }\n }\n\n public sendChatMessage(message: string, team: boolean = false) {\n // Escape quotes and backslashes to prevent command injection\n const escaped = message.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n const cmd = team ? `say_team \"${escaped}\"` : `say \"${escaped}\"`;\n this.sendCommand(cmd);\n }\n\n public addMessage(level: number, text: string) {\n // Parse chat vs system message\n // Q2 Chat format: \"Name: message\"\n // Team Chat: \"(Name): message\" (Standard Q2 team chat format is often just Name: but sent to team only,\n // or (Name): ... depending on mod. Vanilla Q2 uses (Name): for team chat I believe.)\n\n // However, the `text` received in `onPrint` might be raw text.\n // We need to heuristic parsing.\n\n let sender: string | undefined;\n let content = text;\n let team = false;\n\n // Check for standard chat pattern \"Name: message\"\n // Be careful of system messages that might contain colon.\n // Names in Q2 can contain almost anything except quotes maybe?\n // And usually they don't contain newlines.\n\n // Regex for \"Name: message\"\n // We assume name is at start of string.\n const match = text.match(/^([^:]+):\\s(.*)$/);\n const teamMatch = text.match(/^\\(([^)]+)\\):\\s(.*)$/);\n\n if (teamMatch) {\n sender = teamMatch[1];\n content = teamMatch[2];\n team = true;\n } else if (match) {\n sender = match[1];\n content = match[2];\n team = false;\n }\n\n // Filter out common system messages that might look like chat?\n // \"print\" messages.\n // e.g. \"Connection accepted.\"\n\n const message: ChatMessage = {\n timestamp: Date.now(),\n sender,\n text: content,\n team\n };\n\n this.history.push(message);\n if (this.history.length > this.maxHistory) {\n this.history.shift();\n }\n\n if (sender) {\n this.notifyListeners(sender, content, team);\n }\n }\n\n public getHistory(): ChatMessage[] {\n return [...this.history];\n }\n\n private notifyListeners(sender: string, message: string, team: boolean) {\n for (const listener of this.listeners) {\n listener(sender, message, team);\n }\n }\n}\n","export type InputCode = string;\n\nexport interface BindingEntry {\n readonly code: InputCode;\n readonly command: string;\n}\n\nexport const DEFAULT_BINDINGS: readonly BindingEntry[] = [\n { code: 'KeyW', command: '+forward' },\n { code: 'ArrowUp', command: '+forward' },\n { code: 'KeyS', command: '+back' },\n { code: 'ArrowDown', command: '+back' },\n { code: 'KeyA', command: '+moveleft' },\n { code: 'KeyD', command: '+moveright' },\n { code: 'Space', command: '+jump' },\n { code: 'ControlLeft', command: '+crouch' },\n { code: 'ShiftLeft', command: '+speed' },\n { code: 'Mouse1', command: '+attack' },\n { code: 'Mouse2', command: '+use' },\n { code: 'Mouse3', command: '+zoom' },\n { code: 'ArrowLeft', command: '+left' },\n { code: 'ArrowRight', command: '+right' },\n { code: 'PageUp', command: '+lookup' },\n { code: 'PageDown', command: '+lookdown' },\n { code: 'Gamepad0-Button7', command: '+attack' },\n { code: 'Gamepad0-Button6', command: '+zoom' },\n { code: 'Gamepad0-Button0', command: '+jump' },\n { code: 'Gamepad0-Button1', command: '+crouch' },\n { code: 'Gamepad0-Button2', command: '+use' },\n { code: 'Gamepad0-Button4', command: 'prevweapon' },\n { code: 'Gamepad0-Button5', command: 'nextweapon' },\n { code: 'Digit1', command: 'weapon 1' },\n { code: 'Digit2', command: 'weapon 2' },\n { code: 'Digit3', command: 'weapon 3' },\n { code: 'Digit4', command: 'weapon 4' },\n { code: 'Digit5', command: 'weapon 5' },\n { code: 'Digit6', command: 'weapon 6' },\n { code: 'Digit7', command: 'weapon 7' },\n { code: 'Digit8', command: 'weapon 8' },\n { code: 'Digit9', command: 'weapon 9' },\n { code: 'Digit0', command: 'weapon 10' },\n];\n\nexport type BindingMap = ReadonlyMap<InputCode, string>;\n\nexport class InputBindings {\n private readonly bindings = new Map<InputCode, string>();\n\n constructor(entries: Iterable<BindingEntry> = DEFAULT_BINDINGS) {\n for (const entry of entries) {\n this.bind(entry.code, entry.command);\n }\n }\n\n bind(code: InputCode, command: string): void {\n this.bindings.set(code, command);\n }\n\n unbind(code: InputCode): void {\n this.bindings.delete(code);\n }\n\n getBinding(code: InputCode): string | undefined {\n return this.bindings.get(code);\n }\n\n getBoundKeys(command: string): InputCode[] {\n const normalizedCommand = normalizeCommand(command);\n const keys: InputCode[] = [];\n for (const [code, cmd] of this.bindings) {\n if (cmd === normalizedCommand) {\n keys.push(code);\n }\n }\n return keys;\n }\n\n entries(): BindingMap {\n return new Map(this.bindings.entries());\n }\n}\n\nexport function createDefaultBindings(): InputBindings {\n return new InputBindings();\n}\n\nexport function normalizeInputCode(code: string): InputCode {\n return code;\n}\n\nexport function normalizeCommand(command: string): string {\n return command.trim().toLowerCase();\n}\n","import {\n DEFAULT_FORWARD_SPEED,\n DEFAULT_MOUSE_SENSITIVITY,\n DEFAULT_PITCH_SPEED,\n DEFAULT_SIDE_SPEED,\n DEFAULT_UP_SPEED,\n DEFAULT_YAW_SPEED,\n PlayerButton,\n addViewAngles,\n mouseDeltaToViewDelta,\n type MouseDelta,\n type UserCommand,\n type Vec3,\n} from '@quake2ts/shared';\nimport { InputBindings, normalizeCommand, normalizeInputCode, type InputCode } from './bindings.js';\n\nconst MSEC_MAX = 250;\n\nexport interface GamepadLikeButton {\n readonly pressed: boolean;\n readonly value: number;\n}\n\nexport interface GamepadLike {\n readonly axes: readonly number[];\n readonly buttons: readonly GamepadLikeButton[];\n readonly index?: number;\n readonly connected?: boolean;\n}\n\ninterface ButtonState {\n readonly active: boolean;\n readonly wasPressed: boolean;\n readonly fraction: number;\n}\n\nexport interface TouchInputState {\n readonly move?: { readonly x: number; readonly y: number };\n readonly look?: { readonly x: number; readonly y: number };\n readonly buttons?: Partial<Record<InputAction, boolean>>;\n}\n\nexport interface InputSource {\n on(event: 'keydown', handler: (code: string) => void): void;\n on(event: 'keyup', handler: (code: string) => void): void;\n on(event: 'mousedown', handler: (button: number) => void): void;\n on(event: 'mouseup', handler: (button: number) => void): void;\n on(event: 'mousemove', handler: (dx: number, dy: number) => void): void;\n}\n\nclass KeyButton {\n private readonly activeCodes = new Set<InputCode>();\n private downTime = 0;\n private msec = 0;\n private pressed = false;\n\n press(code: InputCode, now: number): boolean {\n if (this.activeCodes.has(code)) return false;\n\n this.activeCodes.add(code);\n this.pressed = true;\n if (this.activeCodes.size === 1) {\n this.downTime = now;\n return true;\n }\n\n return false;\n }\n\n release(code: InputCode, now: number): boolean {\n if (!this.activeCodes.delete(code)) return false;\n\n if (this.activeCodes.size === 0) {\n this.msec += now - this.downTime;\n this.downTime = 0;\n return true;\n }\n\n return false;\n }\n\n sample(frameMsec: number, now: number): ButtonState {\n if (frameMsec <= 0) {\n return { active: this.activeCodes.size > 0, wasPressed: this.pressed, fraction: 0 };\n }\n\n let total = this.msec;\n\n if (this.activeCodes.size > 0) {\n total += now - this.downTime;\n this.downTime = now;\n }\n\n this.msec = 0;\n\n const fraction = Math.min(total / frameMsec, 1);\n const wasPressed = this.pressed;\n this.pressed = false;\n\n return { active: this.activeCodes.size > 0, wasPressed, fraction };\n }\n}\n\nexport interface InputControllerOptions {\n readonly forwardSpeed?: number;\n readonly sideSpeed?: number;\n readonly upSpeed?: number;\n readonly yawSpeed?: number;\n readonly pitchSpeed?: number;\n readonly sensitivity?: number;\n readonly sensitivityX?: number;\n readonly sensitivityY?: number;\n readonly invertMouseY?: boolean;\n readonly runByDefault?: boolean;\n readonly requirePointerLock?: boolean;\n readonly jumpAddsUpMove?: boolean;\n readonly crouchAddsDownMove?: boolean;\n readonly mouseFilter?: boolean;\n readonly getGamepads?: () => readonly (GamepadLike | null | undefined)[];\n readonly gamepadDeadZone?: number;\n readonly gamepadLookScale?: number;\n readonly invertGamepadY?: boolean;\n}\n\nexport enum InputAction {\n Forward = '+forward',\n Back = '+back',\n MoveLeft = '+moveleft',\n MoveRight = '+moveright',\n MoveUp = '+moveup',\n MoveDown = '+movedown',\n Jump = '+jump',\n Crouch = '+crouch',\n Attack = '+attack',\n Use = '+use',\n Holster = '+holster',\n TurnLeft = '+left',\n TurnRight = '+right',\n LookUp = '+lookup',\n LookDown = '+lookdown',\n SpeedModifier = '+speed',\n Zoom = '+zoom',\n}\n\nconst BUTTON_ACTIONS: Partial<Record<InputAction, PlayerButton>> = {\n [InputAction.Attack]: PlayerButton.Attack,\n [InputAction.Use]: PlayerButton.Use,\n [InputAction.Holster]: PlayerButton.Holster,\n [InputAction.Jump]: PlayerButton.Jump,\n [InputAction.Crouch]: PlayerButton.Crouch,\n};\n\nconst ACTION_LOOKUP = new Map<string, InputAction>(\n Object.values(InputAction).map((action) => [normalizeCommand(action), action]),\n);\n\nfunction commandToAction(command: string): InputAction | undefined {\n return ACTION_LOOKUP.get(normalizeCommand(command));\n}\n\nfunction nowMs(): number {\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n return performance.now();\n }\n\n return Date.now();\n}\n\nexport class InputController {\n private readonly bindings: InputBindings;\n private readonly buttons = new Map<InputAction, KeyButton>();\n private viewAngles: Vec3 = { x: 0, y: 0, z: 0 };\n private pointerLocked = false;\n private mouseDelta: MouseDelta = { deltaX: 0, deltaY: 0 };\n private previousMouseDelta: MouseDelta = { deltaX: 0, deltaY: 0 };\n private anyPressed = false;\n private commandQueue: string[] = [];\n private pendingGamepads: readonly (GamepadLike | null | undefined)[] | undefined;\n private readonly gamepadButtons = new Map<string, boolean>();\n private gamepadMove = { x: 0, y: 0 };\n private gamepadLook = { x: 0, y: 0 };\n private pendingTouchState: TouchInputState | undefined;\n private readonly touchButtons = new Map<InputAction, boolean>();\n private touchMove = { x: 0, y: 0 };\n private touchLook = { x: 0, y: 0 };\n\n private readonly forwardSpeed: number;\n private readonly sideSpeed: number;\n private readonly upSpeed: number;\n private readonly yawSpeed: number;\n private readonly pitchSpeed: number;\n private readonly sensitivity: number;\n private readonly sensitivityX?: number;\n private readonly sensitivityY?: number;\n private readonly invertMouseY: boolean;\n private readonly runByDefault: boolean;\n private readonly requirePointerLock: boolean;\n private readonly jumpAddsUpMove: boolean;\n private readonly crouchAddsDownMove: boolean;\n private readonly mouseFilter: boolean;\n private readonly getGamepads?: () => readonly (GamepadLike | null | undefined)[];\n private readonly gamepadDeadZone: number;\n private readonly gamepadLookScale: number;\n private readonly invertGamepadY: boolean;\n\n private sequence = 0;\n private impulse = 0;\n\n public onInputCommand?: (cmd: UserCommand) => void;\n\n constructor(options: InputControllerOptions = {}, bindings = new InputBindings()) {\n this.bindings = bindings;\n this.forwardSpeed = options.forwardSpeed ?? DEFAULT_FORWARD_SPEED;\n this.sideSpeed = options.sideSpeed ?? DEFAULT_SIDE_SPEED;\n this.upSpeed = options.upSpeed ?? DEFAULT_UP_SPEED;\n this.yawSpeed = options.yawSpeed ?? DEFAULT_YAW_SPEED;\n this.pitchSpeed = options.pitchSpeed ?? DEFAULT_PITCH_SPEED;\n this.sensitivity = options.sensitivity ?? DEFAULT_MOUSE_SENSITIVITY;\n this.sensitivityX = options.sensitivityX;\n this.sensitivityY = options.sensitivityY;\n this.invertMouseY = options.invertMouseY ?? false;\n this.runByDefault = options.runByDefault ?? true;\n this.requirePointerLock = options.requirePointerLock ?? true;\n this.jumpAddsUpMove = options.jumpAddsUpMove ?? true;\n this.crouchAddsDownMove = options.crouchAddsDownMove ?? true;\n this.mouseFilter = options.mouseFilter ?? false;\n this.getGamepads = options.getGamepads;\n this.gamepadDeadZone = options.gamepadDeadZone ?? 0.15;\n this.gamepadLookScale = options.gamepadLookScale ?? 1;\n this.invertGamepadY = options.invertGamepadY ?? this.invertMouseY;\n }\n\n handleKeyDown(code: string, eventTimeMs: number = nowMs()): void {\n const normalized = normalizeInputCode(code);\n const binding = this.bindings.getBinding(normalized);\n if (!binding) return;\n\n this.applyCommand(binding, true, normalized, eventTimeMs);\n }\n\n handleKeyUp(code: string, eventTimeMs: number = nowMs()): void {\n const normalized = normalizeInputCode(code);\n const binding = this.bindings.getBinding(normalized);\n if (!binding) return;\n\n this.applyCommand(binding, false, normalized, eventTimeMs);\n }\n\n handleMouseButtonDown(button: number, eventTimeMs: number = nowMs()): void {\n const code = this.mouseButtonToCode(button);\n this.applyCommand(this.mouseButtonToCommand(code), true, code, eventTimeMs);\n }\n\n handleMouseButtonUp(button: number, eventTimeMs: number = nowMs()): void {\n const code = this.mouseButtonToCode(button);\n this.applyCommand(this.mouseButtonToCommand(code), false, code, eventTimeMs);\n }\n\n handleMouseMove(deltaX: number, deltaY: number): void {\n if (this.requirePointerLock && !this.pointerLocked) return;\n\n this.mouseDelta = {\n deltaX: this.mouseDelta.deltaX + deltaX,\n deltaY: this.mouseDelta.deltaY + deltaY,\n };\n }\n\n setPointerLocked(locked: boolean): void {\n this.pointerLocked = locked;\n }\n\n setGamepadState(gamepads: readonly (GamepadLike | null | undefined)[]): void {\n this.pendingGamepads = gamepads;\n }\n\n setTouchState(state: TouchInputState): void {\n this.pendingTouchState = state;\n }\n\n bindInputSource(source: InputSource): void {\n source.on('keydown', (code) => this.handleKeyDown(code));\n source.on('keyup', (code) => this.handleKeyUp(code));\n source.on('mousedown', (button) => this.handleMouseButtonDown(button));\n source.on('mouseup', (button) => this.handleMouseButtonUp(button));\n source.on('mousemove', (dx, dy) => this.handleMouseMove(dx, dy));\n }\n\n setKeyBinding(action: string, keys: string[]): void {\n const normalizedAction = normalizeCommand(action);\n for (const key of keys) {\n this.bindings.bind(normalizeInputCode(key), normalizedAction);\n }\n }\n\n getBoundKeys(command: string): InputCode[] {\n return this.bindings.getBoundKeys(command);\n }\n\n getDefaultBindings(): InputBindings {\n return this.bindings;\n }\n\n buildCommand(frameMsec: number, now: number = nowMs(), serverFrame?: number): UserCommand {\n this.pollGamepads(now);\n this.applyTouchState(now);\n\n const yawStep = (this.yawSpeed * frameMsec) / 1000;\n const pitchStep = (this.pitchSpeed * frameMsec) / 1000;\n\n const turnLeft = this.sample(InputAction.TurnLeft, frameMsec, now);\n const turnRight = this.sample(InputAction.TurnRight, frameMsec, now);\n const lookUp = this.sample(InputAction.LookUp, frameMsec, now);\n const lookDown = this.sample(InputAction.LookDown, frameMsec, now);\n\n let viewDelta: Vec3 = {\n x: (lookDown.fraction - lookUp.fraction) * pitchStep,\n y: (turnRight.fraction - turnLeft.fraction) * yawStep,\n z: 0,\n };\n\n if (this.gamepadLook.x !== 0 || this.gamepadLook.y !== 0) {\n const pitch = this.gamepadLook.y * (this.invertGamepadY ? -1 : 1);\n viewDelta = {\n x: viewDelta.x + pitch * pitchStep * this.gamepadLookScale,\n y: viewDelta.y + this.gamepadLook.x * yawStep * this.gamepadLookScale,\n z: 0,\n };\n }\n\n if (this.touchLook.x !== 0 || this.touchLook.y !== 0) {\n const pitch = this.touchLook.y * (this.invertMouseY ? -1 : 1);\n viewDelta = {\n x: viewDelta.x + pitch * pitchStep,\n y: viewDelta.y + this.touchLook.x * yawStep,\n z: 0,\n };\n }\n\n if (this.pointerLocked || !this.requirePointerLock) {\n const sampledDelta = this.sampleMouseDelta();\n const mouseDelta = mouseDeltaToViewDelta(sampledDelta, {\n sensitivity: this.sensitivity,\n sensitivityX: this.sensitivityX,\n sensitivityY: this.sensitivityY,\n invertY: this.invertMouseY,\n });\n viewDelta = {\n x: viewDelta.x + mouseDelta.x,\n y: viewDelta.y + mouseDelta.y,\n z: 0,\n };\n }\n\n const angles = addViewAngles(this.viewAngles, viewDelta);\n this.viewAngles = angles;\n\n const forward = this.sample(InputAction.Forward, frameMsec, now);\n const back = this.sample(InputAction.Back, frameMsec, now);\n const moveLeft = this.sample(InputAction.MoveLeft, frameMsec, now);\n const moveRight = this.sample(InputAction.MoveRight, frameMsec, now);\n const moveUp = this.sample(InputAction.MoveUp, frameMsec, now);\n const moveDown = this.sample(InputAction.MoveDown, frameMsec, now);\n const speed = this.sample(InputAction.SpeedModifier, frameMsec, now);\n const jump = this.sample(InputAction.Jump, frameMsec, now);\n const crouch = this.sample(InputAction.Crouch, frameMsec, now);\n\n const speedScale = this.runByDefault\n ? speed.active\n ? 0.5\n : 1\n : speed.active\n ? 1\n : 0.5;\n\n let forwardmove = this.forwardSpeed * (forward.fraction - back.fraction) * speedScale;\n let sidemove = this.sideSpeed * (moveRight.fraction - moveLeft.fraction) * speedScale;\n let upmove = this.upSpeed * (moveUp.fraction - moveDown.fraction);\n\n if (this.gamepadMove.x !== 0 || this.gamepadMove.y !== 0) {\n forwardmove += this.forwardSpeed * this.gamepadMove.y * speedScale;\n sidemove += this.sideSpeed * this.gamepadMove.x * speedScale;\n }\n\n if (this.touchMove.x !== 0 || this.touchMove.y !== 0) {\n forwardmove += this.forwardSpeed * this.touchMove.y * speedScale;\n sidemove += this.sideSpeed * this.touchMove.x * speedScale;\n }\n\n if (this.jumpAddsUpMove && jump.fraction > 0) {\n upmove += this.upSpeed * jump.fraction;\n }\n\n if (this.crouchAddsDownMove && crouch.fraction > 0) {\n upmove -= this.upSpeed * crouch.fraction;\n }\n\n forwardmove = this.clampMove(forwardmove, this.forwardSpeed);\n sidemove = this.clampMove(sidemove, this.sideSpeed);\n upmove = this.clampMove(upmove, this.upSpeed);\n\n let buttons = this.collectButtonBits(frameMsec, now);\n\n const msec = Math.min(Math.max(Math.round(frameMsec), 1), MSEC_MAX);\n\n if (this.anyPressed || buttons !== PlayerButton.None) {\n buttons |= PlayerButton.Any;\n }\n\n this.anyPressed = false;\n\n // Command sequence number (client-side generated)\n this.sequence++;\n\n const command = {\n msec,\n buttons,\n angles: { ...this.viewAngles },\n forwardmove,\n sidemove,\n upmove,\n serverFrame,\n sequence: this.sequence,\n lightlevel: 0,\n impulse: this.impulse,\n } satisfies UserCommand;\n\n this.impulse = 0;\n\n if (this.onInputCommand) {\n this.onInputCommand(command);\n }\n\n return command;\n }\n\n consumeConsoleCommands(): readonly string[] {\n const commands = this.commandQueue;\n this.commandQueue = [];\n return commands;\n }\n\n private pollGamepads(now: number): void {\n const gamepads = this.getGamepads?.() ?? this.pendingGamepads ?? [];\n this.pendingGamepads = undefined;\n\n this.gamepadMove = { x: 0, y: 0 };\n this.gamepadLook = { x: 0, y: 0 };\n\n const pressedThisFrame = new Set<InputCode>();\n\n for (const pad of gamepads) {\n if (!pad || pad.connected === false) continue;\n\n const index = pad.index ?? 0;\n const axes = pad.axes ?? [];\n\n this.gamepadMove = {\n x: this.mergeAnalog(this.gamepadMove.x, this.applyDeadZone(axes[0] ?? 0)),\n y: this.mergeAnalog(this.gamepadMove.y, -this.applyDeadZone(axes[1] ?? 0)),\n };\n\n this.gamepadLook = {\n x: this.mergeAnalog(this.gamepadLook.x, this.applyDeadZone(axes[2] ?? 0)),\n y: this.mergeAnalog(this.gamepadLook.y, this.applyDeadZone(axes[3] ?? 0)),\n };\n\n const buttons = pad.buttons ?? [];\n for (let i = 0; i < buttons.length; i++) {\n const button = buttons[i];\n if (!button) continue;\n\n const pressed = button.pressed || button.value > this.gamepadDeadZone;\n const code = this.gamepadButtonCode(index, i);\n if (pressed) pressedThisFrame.add(code);\n\n const wasPressed = this.gamepadButtons.get(code) ?? false;\n if (pressed !== wasPressed) {\n this.applyCommand(this.bindings.getBinding(code), pressed, code, now);\n this.gamepadButtons.set(code, pressed);\n }\n }\n }\n\n for (const [code, wasPressed] of this.gamepadButtons.entries()) {\n if (wasPressed && !pressedThisFrame.has(code)) {\n this.applyCommand(this.bindings.getBinding(code), false, code, now);\n this.gamepadButtons.set(code, false);\n }\n }\n }\n\n private applyTouchState(now: number): void {\n const state = this.pendingTouchState;\n if (!state) return;\n\n this.pendingTouchState = undefined;\n\n if (state.move) {\n this.touchMove = {\n x: this.clampAnalog(state.move.x),\n y: this.clampAnalog(state.move.y),\n };\n }\n\n if (state.look) {\n this.touchLook = {\n x: this.clampAnalog(state.look.x),\n y: this.clampAnalog(state.look.y),\n };\n }\n\n if (state.buttons) {\n for (const [action, pressed] of Object.entries(state.buttons) as Array<\n [InputAction, boolean | undefined]\n >) {\n if (pressed === undefined) continue;\n\n const wasPressed = this.touchButtons.get(action) ?? false;\n if (pressed !== wasPressed) {\n this.applyCommand(action, pressed, this.touchButtonCode(action), now);\n this.touchButtons.set(action, pressed);\n }\n }\n }\n }\n\n private applyCommand(\n command: string | undefined,\n isDown: boolean,\n code: InputCode,\n eventTimeMs: number,\n ): void {\n if (!command) return;\n\n const action = commandToAction(command);\n if (action) {\n const button = this.lookupButton(action);\n if (isDown) {\n if (button.press(code, eventTimeMs)) {\n this.commandQueue.push(action);\n }\n this.anyPressed = true;\n } else if (button.release(code, eventTimeMs)) {\n this.commandQueue.push(action.replace('+', '-'));\n }\n } else if (isDown) {\n if (command.startsWith('impulse ')) {\n const parts = command.split(' ');\n if (parts.length > 1) {\n const val = parseInt(parts[1], 10);\n if (!isNaN(val)) {\n this.impulse = Math.max(0, Math.min(255, val));\n }\n }\n } else {\n this.commandQueue.push(command);\n }\n }\n }\n\n private sampleMouseDelta(): MouseDelta {\n const delta = this.mouseDelta;\n this.mouseDelta = { deltaX: 0, deltaY: 0 };\n\n if (!this.mouseFilter) {\n this.previousMouseDelta = delta;\n return delta;\n }\n\n const filtered = {\n deltaX: (delta.deltaX + this.previousMouseDelta.deltaX) * 0.5,\n deltaY: (delta.deltaY + this.previousMouseDelta.deltaY) * 0.5,\n } satisfies MouseDelta;\n\n this.previousMouseDelta = delta;\n return filtered;\n }\n\n private collectButtonBits(frameMsec: number, now: number): PlayerButton {\n let buttons = PlayerButton.None;\n\n for (const [action, bit] of Object.entries(BUTTON_ACTIONS) as Array<\n [InputAction, PlayerButton]\n >) {\n const sample = this.sample(action, frameMsec, now);\n if (sample.fraction > 0 || sample.active || sample.wasPressed) {\n buttons |= bit;\n }\n }\n\n return buttons;\n }\n\n private lookupButton(action: InputAction): KeyButton {\n let button = this.buttons.get(action);\n if (!button) {\n button = new KeyButton();\n this.buttons.set(action, button);\n }\n return button;\n }\n\n private mouseButtonToCode(button: number): InputCode {\n if (button === 0) return 'Mouse1';\n if (button === 1) return 'Mouse3';\n if (button === 2) return 'Mouse2';\n return `Mouse${button + 1}`;\n }\n\n private mouseButtonToCommand(code: InputCode): string | undefined {\n return this.bindings.getBinding(code);\n }\n\n private sample(action: InputAction, frameMsec: number, now: number): ButtonState {\n const button = this.lookupButton(action);\n return button.sample(frameMsec, now);\n }\n\n private gamepadButtonCode(index: number, button: number): InputCode {\n return `Gamepad${index}-Button${button}`;\n }\n\n private touchButtonCode(action: InputAction): InputCode {\n return `Touch-${action}`;\n }\n\n private clampAnalog(value: number): number {\n return Math.max(-1, Math.min(1, value));\n }\n\n private applyDeadZone(value: number): number {\n return Math.abs(value) < this.gamepadDeadZone ? 0 : value;\n }\n\n private mergeAnalog(current: number, incoming: number): number {\n return Math.abs(incoming) > Math.abs(current) ? incoming : current;\n }\n\n private clampMove(value: number, max: number): number {\n return Math.max(-max, Math.min(max, value));\n }\n}\n","import type { UserCommand } from '@quake2ts/shared';\nimport { InputController, type InputControllerOptions } from './controller.js';\n\nexport interface QueuedFrameCommands {\n readonly command: UserCommand;\n readonly console: readonly string[];\n}\n\nexport class InputCommandBuffer {\n private readonly controller: InputController;\n private readonly queued: QueuedFrameCommands[] = [];\n\n constructor(options?: InputControllerOptions, controller = new InputController(options)) {\n this.controller = controller;\n }\n\n captureFrame(frameMsec: number, now?: number, serverFrame?: number): QueuedFrameCommands {\n const command = this.controller.buildCommand(frameMsec, now, serverFrame);\n const console = this.controller.consumeConsoleCommands();\n const entry: QueuedFrameCommands = { command, console };\n this.queued.push(entry);\n return entry;\n }\n\n consumeQueued(): readonly QueuedFrameCommands[] {\n const queued = [...this.queued];\n this.queued.length = 0;\n return queued;\n }\n\n getController(): InputController {\n return this.controller;\n }\n}\n","import { ClientExports, createClient, ClientImports, InputController, InputSource, InputBindings, HudData, StatusBarData, CrosshairInfo } from './index.js';\nimport { MenuState } from './ui/menu/types.js';\nimport { createGame, GameExports, GameSaveFile, GameCreateOptions, GameEngine, SaveStorage, SaveSlotMetadata, SaveCreationOptions } from '@quake2ts/game';\nimport { EngineImports, Renderer, EngineHost, TraceResult } from '@quake2ts/engine';\nimport { UserCommand, Vec3, CollisionPlane, PlayerState } from '@quake2ts/shared';\n\nexport interface SessionOptions {\n mapName?: string;\n skill?: number;\n renderMode?: string;\n audioEnabled?: boolean;\n engine: EngineImports & { renderer: Renderer; cmd?: { executeText(text: string): void } };\n}\n\nexport interface SaveMetadata {\n timestamp: number;\n mapName: string;\n playtimeSeconds: number;\n difficulty: number;\n}\n\nexport class GameSession {\n private client: ClientExports | null = null;\n private game: GameExports | null = null;\n private engine: EngineImports & { renderer: Renderer; cmd?: { executeText(text: string): void } };\n private host: EngineHost | null = null;\n private options: SessionOptions;\n private currentMapName: string = '';\n private inputController: InputController;\n private saveStorage: SaveStorage;\n private _onInputCommand?: (cmd: UserCommand) => void;\n private _onHudUpdate?: (data: HudData) => void;\n private _onCenterPrint?: (message: string, duration: number) => void;\n private _onNotify?: (message: string) => void;\n private _onPickupMessage?: (item: string) => void;\n private _onObituaryMessage?: (message: string) => void;\n private _onMenuStateChange?: (active: boolean) => void;\n private _onLoadComplete?: () => void;\n private _onLoadError?: (error: Error) => void;\n\n constructor(options: SessionOptions) {\n this.options = options;\n this.engine = options.engine;\n this.inputController = new InputController();\n this.saveStorage = new SaveStorage();\n }\n\n public startNewGame(mapName: string, skill: number = 1): void {\n if (this.host) {\n this.shutdown();\n }\n\n this.currentMapName = mapName;\n\n const gameOptions: GameCreateOptions = {\n gravity: { x: 0, y: 0, z: -800 }, // Default gravity\n skill: skill,\n deathmatch: false, // Single player default\n coop: false\n };\n\n const gameEngineAdapter: GameEngine = {\n trace: (start: Vec3, end: Vec3) => {\n return this.engine.trace(start, end);\n },\n centerprintf: (ent, msg) => {\n if (this.client) {\n this.client.ParseCenterPrint(msg);\n }\n },\n configstring: (idx, val) => {\n if (this.client) {\n this.client.ParseConfigString(idx, val);\n }\n },\n multicast: () => {},\n unicast: () => {},\n serverCommand: () => {},\n };\n\n const gameImports = {\n trace: (start: Vec3, mins: Vec3 | null, maxs: Vec3 | null, end: Vec3, passent: any, contentmask: number) => {\n const tr = this.engine.trace(start, end, mins || undefined, maxs || undefined);\n\n let plane: CollisionPlane | null = null;\n if (tr.planeNormal) {\n plane = {\n normal: tr.planeNormal,\n dist: 0, // Unknown distance\n type: 0, // Unknown type\n signbits: 0, // Unknown\n };\n }\n\n return {\n allsolid: tr.allsolid,\n startsolid: tr.startsolid,\n fraction: tr.fraction,\n endpos: tr.endpos,\n plane: plane,\n surfaceFlags: tr.surfaceFlags ?? 0,\n contents: tr.contents ?? 0,\n ent: null\n };\n },\n pointcontents: (p: Vec3) => {\n const t = this.engine.trace(p, p, undefined, undefined);\n return t.contents || 0;\n },\n multicast: () => {},\n unicast: () => {},\n configstring: (idx: number, val: string) => {\n if (this.client) {\n this.client.ParseConfigString(idx, val);\n }\n },\n serverCommand: (cmd: string) => {}\n };\n\n this.game = createGame(gameImports, gameEngineAdapter, gameOptions);\n\n const clientProxy: any = {\n init: (initial: any) => this.client?.init(initial),\n render: (sample: any) => this.client?.render(sample),\n shutdown: () => this.client?.shutdown(),\n get camera() { return this.client?.camera; }\n };\n\n this.host = new EngineHost(this.game, clientProxy);\n\n const clientImports: ClientImports = {\n engine: this.engine,\n host: this.host,\n inputController: this.inputController\n };\n\n this.client = createClient(clientImports);\n if (this._onInputCommand) {\n this.client.onInputCommand = this._onInputCommand;\n }\n if (this._onHudUpdate) {\n this.client.onHudUpdate = this._onHudUpdate;\n }\n this.client.onCenterPrint = this._onCenterPrint;\n this.client.onNotify = this._onNotify;\n this.client.onPickupMessage = this._onPickupMessage;\n this.client.onObituaryMessage = this._onObituaryMessage;\n this.client.onMenuStateChange = this._onMenuStateChange;\n\n this.game.spawnWorld();\n\n this.host.start();\n\n if (this.engine.cmd) {\n this.engine.cmd.executeText(`map ${mapName}`);\n } else if (this.host.commands) {\n this.host.commands.execute(`map ${mapName}`);\n }\n }\n\n // 4.3.1 Save Game API\n public async saveGame(slotName: string): Promise<GameSaveFile> {\n if (!this.game) {\n throw new Error(\"Game not running\");\n }\n\n // TODO: Track total playtime across levels\n const playtime = this.game.time;\n const difficulty = this.game.skill;\n const mapName = this.getMapName();\n\n const saveData = this.game.createSave(mapName, difficulty, playtime);\n\n await this.saveStorage.save(slotName, saveData);\n\n return saveData;\n }\n\n public getSaveMetadata(saveData: GameSaveFile): SaveMetadata {\n return {\n timestamp: saveData.timestamp,\n mapName: saveData.map,\n playtimeSeconds: saveData.playtimeSeconds,\n difficulty: saveData.difficulty\n };\n }\n\n // 4.3.2 Load Game API\n public async loadGame(saveData: GameSaveFile): Promise<void> {\n try {\n this.loadSavedGame(saveData);\n if (this._onLoadComplete) {\n this._onLoadComplete();\n }\n } catch (e: any) {\n if (this._onLoadError) {\n this._onLoadError(e);\n }\n throw e;\n }\n }\n\n public set onLoadComplete(handler: (() => void) | undefined) {\n this._onLoadComplete = handler;\n }\n\n public get onLoadComplete(): (() => void) | undefined {\n return this._onLoadComplete;\n }\n\n public set onLoadError(handler: ((error: Error) => void) | undefined) {\n this._onLoadError = handler;\n }\n\n public get onLoadError(): ((error: Error) => void) | undefined {\n return this._onLoadError;\n }\n\n // 4.3.3 Quick Save/Load\n public async quickSave(): Promise<void> {\n if (!this.game) {\n throw new Error(\"Game not running\");\n }\n const playtime = this.game.time;\n const difficulty = this.game.skill;\n const mapName = this.getMapName();\n const saveData = this.game.createSave(mapName, difficulty, playtime);\n\n await this.saveStorage.quickSave(saveData);\n }\n\n public async quickLoad(): Promise<void> {\n try {\n const saveData = await this.saveStorage.quickLoad();\n this.loadSavedGame(saveData);\n if (this._onLoadComplete) {\n this._onLoadComplete();\n }\n } catch (e: any) {\n // If quick load fails (e.g. no file), we should propagate or handle\n if (this._onLoadError) {\n this._onLoadError(e);\n }\n throw e;\n }\n }\n\n public async hasQuickSave(): Promise<boolean> {\n const saves = await this.saveStorage.list();\n // SaveStorage uses 'quicksave' as the ID for quick saves (defined in SaveStorage class but private/static)\n // We can check if any save has the ID 'quicksave' or name 'Quick Save'\n // The implementation of SaveStorage.quickSave uses SaveStorage.QUICK_SLOT = 'quicksave'.\n return saves.some(s => s.id === 'quicksave');\n }\n\n public loadSavedGame(saveData: GameSaveFile): void {\n if (this.host) {\n this.shutdown();\n }\n\n const mapName = saveData.map;\n this.currentMapName = mapName;\n const skill = saveData.difficulty;\n\n const gameOptions: GameCreateOptions = {\n gravity: { x: 0, y: 0, z: -800 },\n skill: skill,\n deathmatch: false,\n coop: false\n };\n\n const gameEngineAdapter: GameEngine = {\n trace: (start: Vec3, end: Vec3) => {\n return this.engine.trace(start, end);\n },\n centerprintf: (ent, msg) => {\n if (this.client) {\n this.client.ParseCenterPrint(msg);\n }\n },\n configstring: (idx, val) => {\n if (this.client) {\n this.client.ParseConfigString(idx, val);\n }\n },\n multicast: () => {},\n unicast: () => {},\n serverCommand: () => {},\n };\n\n const gameImports = {\n trace: (start: Vec3, mins: Vec3 | null, maxs: Vec3 | null, end: Vec3, passent: any, contentmask: number) => {\n const tr = this.engine.trace(start, end, mins || undefined, maxs || undefined);\n let plane: CollisionPlane | null = null;\n if (tr.planeNormal) {\n plane = {\n normal: tr.planeNormal,\n dist: 0,\n type: 0,\n signbits: 0,\n };\n }\n return {\n allsolid: tr.allsolid,\n startsolid: tr.startsolid,\n fraction: tr.fraction,\n endpos: tr.endpos,\n plane: plane,\n surfaceFlags: tr.surfaceFlags ?? 0,\n contents: tr.contents ?? 0,\n ent: null\n };\n },\n pointcontents: (p: Vec3) => {\n const t = this.engine.trace(p, p, undefined, undefined);\n return t.contents || 0;\n },\n multicast: () => {},\n unicast: () => {},\n configstring: (idx: number, val: string) => {\n if (this.client) {\n this.client.ParseConfigString(idx, val);\n }\n },\n serverCommand: (cmd: string) => {}\n };\n\n this.game = createGame(gameImports, gameEngineAdapter, gameOptions);\n\n const clientProxy: any = {\n init: (initial: any) => this.client?.init(initial),\n render: (sample: any) => this.client?.render(sample),\n shutdown: () => this.client?.shutdown(),\n get camera() { return this.client?.camera; }\n };\n\n this.host = new EngineHost(this.game, clientProxy);\n\n const clientImports: ClientImports = {\n engine: this.engine,\n host: this.host,\n inputController: this.inputController\n };\n\n this.client = createClient(clientImports);\n if (this._onInputCommand) {\n this.client.onInputCommand = this._onInputCommand;\n }\n if (this._onHudUpdate) {\n this.client.onHudUpdate = this._onHudUpdate;\n }\n this.client.onCenterPrint = this._onCenterPrint;\n this.client.onNotify = this._onNotify;\n this.client.onPickupMessage = this._onPickupMessage;\n this.client.onObituaryMessage = this._onObituaryMessage;\n this.client.onMenuStateChange = this._onMenuStateChange;\n\n if (this.engine.cmd) {\n this.engine.cmd.executeText(`map ${mapName}`);\n } else if (this.host.commands) {\n this.host.commands.execute(`map ${mapName}`);\n }\n\n if (this.game) {\n this.game.loadSave(saveData);\n }\n\n this.host.start();\n }\n\n public shutdown(): void {\n if (this.host) {\n this.host.stop();\n this.host = null;\n }\n if (this.client) {\n this.client.shutdown();\n this.client = null;\n }\n this.game = null;\n }\n\n public getClient(): ClientExports | null {\n return this.client;\n }\n\n public getGame(): GameExports | null {\n return this.game;\n }\n\n public getHost(): EngineHost | null {\n return this.host;\n }\n\n public getSaveStorage(): SaveStorage {\n return this.saveStorage;\n }\n\n public bindInputSource(source: InputSource): void {\n this.inputController.bindInputSource(source);\n }\n\n public setKeyBinding(action: string, keys: string[]): void {\n this.inputController.setKeyBinding(action, keys);\n }\n\n public getDefaultBindings(): InputBindings {\n return this.inputController.getDefaultBindings();\n }\n\n public set onInputCommand(handler: ((cmd: UserCommand) => void) | undefined) {\n this._onInputCommand = handler;\n if (this.client) {\n this.client.onInputCommand = handler;\n }\n }\n\n public get onInputCommand(): ((cmd: UserCommand) => void) | undefined {\n return this._onInputCommand;\n }\n\n // Section 4.2: HUD and UI Integration\n public getHudData(): HudData | null {\n return this.client?.getHudData() ?? null;\n }\n\n public getStatusBar(): StatusBarData | null {\n return this.client?.getStatusBar() ?? null;\n }\n\n public getCrosshairInfo(): CrosshairInfo | null {\n return this.client?.getCrosshairInfo() ?? null;\n }\n\n public set onHudUpdate(handler: ((data: HudData) => void) | undefined) {\n this._onHudUpdate = handler;\n if (this.client) {\n this.client.onHudUpdate = handler;\n }\n }\n\n public get onHudUpdate(): ((data: HudData) => void) | undefined {\n return this._onHudUpdate;\n }\n\n public set onCenterPrint(handler: ((message: string, duration: number) => void) | undefined) {\n this._onCenterPrint = handler;\n if (this.client) {\n this.client.onCenterPrint = handler;\n }\n }\n\n public get onCenterPrint(): ((message: string, duration: number) => void) | undefined {\n return this._onCenterPrint;\n }\n\n public set onNotify(handler: ((message: string) => void) | undefined) {\n this._onNotify = handler;\n if (this.client) {\n this.client.onNotify = handler;\n }\n }\n\n public get onNotify(): ((message: string) => void) | undefined {\n return this._onNotify;\n }\n\n public set onPickupMessage(handler: ((item: string) => void) | undefined) {\n this._onPickupMessage = handler;\n if (this.client) {\n this.client.onPickupMessage = handler;\n }\n }\n\n public get onPickupMessage(): ((item: string) => void) | undefined {\n return this._onPickupMessage;\n }\n\n public set onObituaryMessage(handler: ((message: string) => void) | undefined) {\n this._onObituaryMessage = handler;\n if (this.client) {\n this.client.onObituaryMessage = handler;\n }\n }\n\n public get onObituaryMessage(): ((message: string) => void) | undefined {\n return this._onObituaryMessage;\n }\n\n public set onMenuStateChange(handler: ((active: boolean) => void) | undefined) {\n this._onMenuStateChange = handler;\n if (this.client) {\n this.client.onMenuStateChange = handler;\n }\n }\n\n public get onMenuStateChange(): ((active: boolean) => void) | undefined {\n return this._onMenuStateChange;\n }\n\n public showPauseMenu(): void {\n if (this.client) {\n this.client.showPauseMenu();\n }\n }\n\n public hidePauseMenu(): void {\n if (this.client) {\n this.client.hidePauseMenu();\n }\n }\n\n public isMenuActive(): boolean {\n if (this.client) {\n return this.client.isMenuActive();\n }\n return false;\n }\n\n public getMenuState(): MenuState | null {\n if (this.client) {\n return this.client.getMenuState();\n }\n return null;\n }\n\n // Section 4.1.3: Game State Queries\n\n public getPlayerState(): PlayerState | null {\n if (this.client && this.client.lastRendered) {\n return this.client.lastRendered as unknown as PlayerState;\n }\n return null;\n }\n\n public getGameTime(): number {\n if (this.game) {\n return this.game.time;\n }\n if (this.client && this.client.lastRendered) {\n return 0;\n }\n return 0;\n }\n\n public isPaused(): boolean {\n if (this.host) {\n return this.host.paused;\n }\n return false;\n }\n\n public getSkillLevel(): number {\n if (this.game) {\n return this.game.skill;\n }\n return this.options.skill ?? 1;\n }\n\n public getMapName(): string {\n if (this.game && this.game.entities && this.game.entities.level && this.game.entities.level.mapname) {\n return this.game.entities.level.mapname;\n }\n return this.currentMapName;\n }\n\n public getGameMode(): 'single' | 'deathmatch' | 'coop' {\n if (this.game) {\n if (this.game.deathmatch) return 'deathmatch';\n if (this.game.coop) return 'coop';\n }\n return 'single';\n }\n}\n\nexport function createSession(options: SessionOptions): GameSession {\n return new GameSession(options);\n}\n","export interface ServerInfo {\n name: string;\n address: string; // WebSocket URL\n map: string;\n players: number;\n maxPlayers: number;\n gamemode: string;\n ping?: number;\n}\n\n/**\n * Query master server for list of active game servers\n *\n * Note: Quake 2 master servers typically use UDP.\n * This implementation assumes an HTTP-based master server or gateway\n * compatible with web clients (WebSocket addresses).\n *\n * Expected JSON response format from master:\n * [\n * { \"address\": \"ws://example.com:27910\", \"info\": { \"hostname\": \"Server\", \"mapname\": \"q2dm1\", ... } }\n * ]\n *\n * Or a simple list of addresses if we query them individually.\n * For now, we'll assume a standard JSON structure.\n */\nexport async function queryMasterServer(masterUrl: string): Promise<ServerInfo[]> {\n try {\n const response = await fetch(masterUrl);\n if (!response.ok) {\n throw new Error(`Master server request failed: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n\n // Parse data\n if (!Array.isArray(data)) {\n throw new Error('Invalid master server response: expected array');\n }\n\n return data.map((entry: any) => {\n // Adapt to different possible formats\n const address = entry.address || entry.ip + ':' + entry.port;\n const info = entry.info || {};\n\n // Validate address protocol\n let wsAddress = address;\n if (!address.startsWith('ws://') && !address.startsWith('wss://')) {\n // If it looks like a domain, assume wss or ws based on current page?\n // Or maybe assume ws:// for now.\n wsAddress = `ws://${address}`;\n }\n\n return {\n name: info.hostname || entry.name || address,\n address: wsAddress,\n map: info.mapname || entry.map || 'unknown',\n players: parseInt(info.clients || entry.players || '0', 10),\n maxPlayers: parseInt(info.maxclients || entry.maxPlayers || '0', 10),\n gamemode: info.gamename || entry.gamemode || 'baseq2',\n ping: undefined // Ping is client-side latency, not server reported usually\n };\n });\n\n } catch (error) {\n console.error('Failed to query master server:', error);\n return [];\n }\n}\n","import {\n ClientRenderer,\n EngineImports,\n GameFrameResult,\n GameRenderSample,\n Camera,\n Renderer,\n DemoPlaybackController,\n PlaybackState,\n EngineHost,\n RenderableEntity,\n} from '@quake2ts/engine';\nimport { NetChan, UserCommand, Vec3, PlayerState, hasPmFlag, PmFlag, ConfigStringIndex, MAX_MODELS, MAX_SOUNDS, MAX_IMAGES, CvarFlags, EntityState, mat4FromBasis, PlayerStat, RenderFx, MAX_CLIENTS, CONTENTS_WATER, CONTENTS_LAVA, CONTENTS_SLIME } from '@quake2ts/shared';\nimport { vec3, mat4 } from 'gl-matrix';\n// Updated imports to use @quake2ts/cgame\nimport { ClientPrediction, interpolatePredictionState, PredictionState, GetCGameAPI, CGameExport } from '@quake2ts/cgame';\nimport { ViewEffects, ViewSample } from '@quake2ts/cgame';\nimport { createCGameImport, ClientStateProvider } from './cgameBridge.js';\n\nimport { Draw_Hud, Init_Hud } from './hud.js';\nimport { FrameRenderStats, WorldRenderState } from '@quake2ts/engine';\nimport { ClientNetworkHandler } from './demo/handler.js';\nimport { ClientConfigStrings } from './configStrings.js';\nimport { Cycle_Crosshair } from './hud/crosshair.js';\nimport { MainMenuFactory, MainMenuOptions } from './ui/menu/main.js';\nimport { SaveLoadMenuFactory } from './ui/menu/saveLoad.js';\nimport { MenuSystem } from './ui/menu/system.js';\nimport { SaveStorage, PlayerClient } from '@quake2ts/game';\nimport { OptionsMenuFactory } from './ui/menu/options.js';\nimport { MapsMenuFactory } from './ui/menu/maps.js';\nimport { PauseMenuFactory } from './ui/menu/pause.js';\nimport { MultiplayerMenuFactory } from './ui/menu/multiplayer.js';\nimport { DemoMenuFactory } from './ui/menu/demo.js';\nimport { Draw_Menu } from './ui/menu/render.js';\nimport { InputBindings } from './input/bindings.js';\nimport { BrowserSettings, LocalStorageSettings } from './ui/storage.js';\nimport { LoadingScreen } from './ui/loading/screen.js';\nimport { ErrorDialog } from './ui/error.js';\nimport { WheelMenuSystem } from './ui/wheels/index.js';\nimport { angleVectors, vectorToAngles } from '@quake2ts/shared';\nimport { buildRenderableEntities } from './entities.js';\nimport { MultiplayerConnection } from './net/connection.js';\nimport { DemoControls } from './ui/demo-controls.js';\nimport { DemoRecorder, DLight, DynamicLightManager, FogData, DamageIndicator } from '@quake2ts/engine';\nimport { DemoCameraMode, DemoCameraState } from './demo/camera.js';\nimport { processEntityEffects } from './effects.js';\nimport { ClientEffectSystem, EntityProvider } from './effects-system.js';\nimport { createBlendState, updateBlend } from './blend.js';\nimport { ScoreboardManager, ScoreboardData, ScoreboardEntry } from './scoreboard.js';\nimport { ChatManager } from './chat.js';\nimport { HudData, StatusBarData, CrosshairInfo } from './hud/data.js';\nimport { MenuState } from './ui/menu/types.js';\nimport { lodRegistry, LodModel } from './lod.js';\n\nexport { createDefaultBindings, InputBindings, normalizeCommand, normalizeInputCode } from './input/bindings.js';\nimport { InputController, InputSource } from './input/controller.js';\nexport {\n GamepadLike,\n GamepadLikeButton,\n InputAction,\n InputController,\n InputSource,\n TouchInputState,\n type InputControllerOptions,\n} from './input/controller.js';\nexport {\n InputCommandBuffer,\n type QueuedFrameCommands,\n} from './input/command-buffer.js';\n\n// Re-export from cgame if needed, or consumers should import directly\nexport {\n ClientPrediction,\n interpolatePredictionState,\n defaultPredictionState,\n} from '@quake2ts/cgame';\nexport type { PredictionSettings, PredictionState } from '@quake2ts/cgame';\n\nexport { ViewEffects } from '@quake2ts/cgame';\nexport type { ViewEffectSettings, ViewKick, ViewSample } from '@quake2ts/cgame';\n\nexport { ClientConfigStrings } from './configStrings.js';\nexport * from './scoreboard.js';\n\nexport { HudData, StatusBarData, CrosshairInfo } from './hud/data.js';\n\nexport * from './session.js';\nexport * from './demo/camera.js'; // Export DemoCameraMode\nexport { queryMasterServer, type ServerInfo } from './net/master.js';\n\nconst ZERO_VEC3: Vec3 = { x: 0, y: 0, z: 0 };\n\nexport interface ClientImports {\n readonly engine: EngineImports & { renderer: Renderer; cmd?: { executeText(text: string): void } };\n readonly host?: EngineHost;\n readonly inputController?: InputController;\n}\n\nexport enum ClientMode {\n Normal,\n DemoPlayback,\n Multiplayer\n}\n\nexport interface ClientExports extends ClientRenderer<PredictionState> {\n // Core Engine Hooks\n predict(command: UserCommand): PredictionState;\n ParseCenterPrint(msg: string): void;\n ParseNotify(msg: string): void;\n ParseConfigString(index: number, value: string): void;\n showSubtitle(text: string, soundName: string): void;\n\n // State Access\n readonly prediction: ClientPrediction;\n readonly lastRendered?: PredictionState;\n readonly view: ViewEffects;\n readonly lastView?: ViewSample;\n readonly configStrings: ClientConfigStrings;\n camera?: Camera;\n\n // Demo Playback\n demoPlayback: DemoPlaybackController;\n demoHandler: ClientNetworkHandler;\n readonly isDemoPlaying: boolean;\n readonly currentDemoName: string | null;\n readonly mode: ClientMode;\n startDemoPlayback(buffer: ArrayBuffer, filename: string): void;\n stopDemoPlayback(): void;\n\n // Demo Camera\n setDemoCameraMode(mode: DemoCameraMode): void;\n setDemoThirdPersonDistance(dist: number): void;\n setDemoThirdPersonOffset(offset: Vec3): void;\n setDemoFreeCamera(origin: Vec3, angles: Vec3): void;\n setDemoFollowEntity(entityId: number): void;\n\n // Spectator API\n setSpectatorTarget(targetEntityId: number | null): void;\n getSpectatorTargets(): { id: number; name: string }[];\n\n // Networking\n multiplayer: MultiplayerConnection;\n\n // Recording\n startRecording(filename: string): void;\n stopRecording(): void;\n\n // Menu System\n createMainMenu(options: Omit<MainMenuOptions, 'optionsFactory' | 'mapsFactory' | 'onSetDifficulty' | 'multiplayerFactory'>, storage: SaveStorage, saveCallback: (name: string) => Promise<void>, loadCallback: (slot: string) => Promise<void>, deleteCallback: (slot: string) => Promise<void>): { menuSystem: MenuSystem, factory: MainMenuFactory };\n showPauseMenu(): void;\n hidePauseMenu(): void;\n isMenuActive(): boolean;\n onMenuStateChange?: (active: boolean) => void;\n getMenuState(): MenuState;\n\n // Input handling\n handleInput(key: string, down: boolean): boolean;\n toggleMenu(): void;\n bindInputSource(source: InputSource): void;\n setKeyBinding(action: string, keys: string[]): void;\n getDefaultBindings(): InputBindings;\n onInputCommand?: (cmd: UserCommand) => void;\n\n // cgame_export_t equivalents (if explicit names required)\n Init(initial?: GameFrameResult<PredictionState>): void;\n Shutdown(): void;\n DrawHUD(stats: FrameRenderStats, timeMs: number): void;\n\n // New UI components\n readonly loadingScreen: LoadingScreen;\n readonly errorDialog: ErrorDialog;\n\n readonly dlightManager: DynamicLightManager;\n\n // Scoreboard API\n getScoreboard(): ScoreboardData;\n onScoreboardUpdate?: (scoreboard: ScoreboardData) => void;\n\n // Chat API\n sendChatMessage(message: string, team?: boolean): void;\n onChatMessage?: (sender: string, message: string, team: boolean) => void;\n getChatHistory(): any[];\n\n // HUD Data API\n getHudData(): HudData | null;\n getStatusBar(): StatusBarData | null;\n getCrosshairInfo(): CrosshairInfo;\n onHudUpdate?: (data: HudData) => void;\n\n // Message Events\n onCenterPrint?: (message: string, duration: number) => void;\n onNotify?: (message: string) => void;\n onPickupMessage?: (item: string) => void;\n onObituaryMessage?: (message: string) => void;\n\n // LOD\n registerLod(baseModel: string, lods: LodModel[]): void;\n}\n\nfunction lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\nfunction lerpAngle(a: number, b: number, t: number): number {\n // Simple lerp for now, should ideally handle wrapping\n return lerp(a, b, t);\n}\n\nexport function createClient(imports: ClientImports): ClientExports {\n // Adapter for pointContents using trace\n const pointContents = (point: Vec3): number => {\n const zero: Vec3 = { x: 0, y: 0, z: 0 };\n // Perform a point trace to get contents\n const tr = imports.engine.trace(point, point, zero, zero);\n return tr.contents || 0;\n };\n\n const prediction = new ClientPrediction({ trace: imports.engine.trace, pointContents });\n const view = new ViewEffects();\n const demoPlayback = new DemoPlaybackController();\n const demoControls = new DemoControls(demoPlayback, (speed) => {\n // Propagate speed change to AudioSystem if available\n if (imports.engine.audio) {\n // Assuming AudioApi has setPlaybackRate or we need to cast/access internal\n // AudioApi from host usually has setPlaybackRate if we added it to interface\n // But AudioApi is an interface in engine/src/audio/api.ts.\n // We implemented setPlaybackRate in AudioSystem, but AudioApi needs to expose it.\n // Let's check AudioApi. If not, we cast or assume for now, then fix interface.\n const audio = imports.engine.audio as any;\n if (typeof audio.setPlaybackRate === 'function') {\n audio.setPlaybackRate(speed);\n }\n }\n });\n const demoHandler = new ClientNetworkHandler(imports);\n const demoRecorder = new DemoRecorder();\n demoHandler.setView(view);\n\n const dlightManager = new DynamicLightManager();\n\n // Entity Provider for effects system\n // Needs to handle both demo playback and multiplayer/prediction states\n // We need to cast types because 'EntityState' definition varies slightly between shared/engine/parser context\n // The 'EntityState' imported in effects-system.ts is from @quake2ts/engine\n const entityProvider: EntityProvider = {\n getEntity(entNum: number) {\n if (isDemoPlaying) {\n // Demo handler maintains current frame entities\n return demoHandler.entities.get(entNum);\n } else {\n // Multiplayer / Local\n // Check multiplayer connection first\n if (multiplayer.isConnected()) {\n // MultiplayerConnection needs to expose entities map\n return multiplayer.entities.get(entNum);\n }\n }\n return undefined;\n },\n getPlayerNum(): number {\n return multiplayer.playerNum; // Or demoHandler.playerNum\n }\n };\n\n const effectSystem = new ClientEffectSystem(dlightManager, imports.engine, entityProvider);\n\n let isDemoPlaying = false;\n let currentDemoName: string | null = null;\n let clientMode: ClientMode = ClientMode.Normal;\n\n // Demo Camera State\n const demoCameraState: DemoCameraState = {\n mode: DemoCameraMode.FirstPerson,\n thirdPersonDistance: 80,\n thirdPersonOffset: { x: 0, y: 0, z: 0 },\n freeCameraOrigin: { x: 0, y: 0, z: 0 },\n freeCameraAngles: { x: 0, y: 0, z: 0 },\n followEntityId: -1\n };\n\n const inputController = imports.inputController ?? new InputController();\n inputController.onInputCommand = (cmd) => {\n if (clientExports.onInputCommand) {\n clientExports.onInputCommand(cmd);\n }\n };\n\n // State to track key inputs for free camera movement\n const inputState = {\n forward: false,\n backward: false,\n left: false,\n right: false,\n up: false,\n down: false\n };\n\n // Initialize persistent Menu System\n const menuSystem = new MenuSystem();\n menuSystem.onStateChange = (active) => {\n if (clientExports.onMenuStateChange) {\n clientExports.onMenuStateChange(active);\n }\n };\n\n // Initialize UI components\n const loadingScreen = new LoadingScreen();\n const errorDialog = new ErrorDialog();\n const wheelMenuSystem = new WheelMenuSystem();\n const settings = new BrowserSettings(new LocalStorageSettings());\n\n // Menu Factories\n let pauseMenuFactory: PauseMenuFactory | undefined;\n let optionsFactory: OptionsMenuFactory | undefined;\n\n const configStrings = new ClientConfigStrings();\n const scoreboardManager = new ScoreboardManager(configStrings);\n\n const chatManager = new ChatManager((cmd) => {\n if (imports.engine.cmd) {\n imports.engine.cmd.executeText(cmd);\n }\n });\n\n const blendState = createBlendState();\n let currentBlend: [number, number, number, number] = [0, 0, 0, 0];\n let pendingDamage = 0;\n\n // Define State Provider for CGame first\n let latestFrame: GameFrameResult<PredictionState> | undefined;\n let lastRenderTime = 0;\n let clientInAutoDemo = false;\n\n const stateProvider: ClientStateProvider = {\n get tickRate() { return 10; }, // Default 10Hz\n get frameTimeMs() { return latestFrame?.timeMs ?? 0; },\n get serverFrame() { return demoHandler.latestServerFrame; },\n get serverProtocol() { return 34; },\n get configStrings() { return configStrings; },\n getClientName: (num) => `Player ${num}`,\n getKeyBinding: (key) => `[${key}]`,\n get inAutoDemo() { return clientInAutoDemo; }\n };\n\n // CGame Interface\n const cgameImport = createCGameImport(imports, stateProvider, (msg) => {\n // Use level 0 (PRINT_LOW/INFO) for general output\n chatManager.addMessage(0, msg);\n });\n const cg: CGameExport = GetCGameAPI(cgameImport);\n\n // Initialize NetChan with optional qport override\n let netchan: NetChan | undefined;\n const qportCvar = imports.host?.cvars?.get('net_qport');\n if (qportCvar && !isNaN(qportCvar.number)) {\n netchan = new NetChan();\n netchan.setup(qportCvar.number);\n }\n\n // Networking\n const multiplayer = new MultiplayerConnection({\n get username() { return imports.host?.cvars?.get('name')?.string || 'Player'; },\n get model() { return imports.host?.cvars?.get('model')?.string || 'male'; },\n get skin() { return imports.host?.cvars?.get('skin')?.string || 'grunt'; },\n get fov() { return fovValue; },\n netchan\n });\n multiplayer.setDemoRecorder(demoRecorder);\n multiplayer.setEffectSystem(effectSystem); // Inject Effect System\n\n const multiplayerFactory = new MultiplayerMenuFactory(menuSystem, multiplayer);\n\n // Helper to process CD tracks\n const processCdTrack = (trackStr: string) => {\n if (!imports.engine.audio) return;\n\n const track = parseInt(trackStr, 10);\n if (!isNaN(track)) {\n // Tracks 0 and 1 are usually ignored (data)\n if (track >= 2) {\n // Use exposed play_track from AudioApi\n if (imports.engine.audio.play_track) {\n void imports.engine.audio.play_track(track);\n } else {\n // Fallback if play_track isn't available (should not happen if engine updated)\n const trackName = `music/track${track.toString().padStart(2, '0')}.ogg`;\n void imports.engine.audio.play_music(trackName);\n }\n } else {\n imports.engine.audio.stop_music();\n }\n }\n };\n\n // Hook up message system to demo handler via CG\n demoHandler.setCallbacks({\n onCenterPrint: (msg: string) => cg.ParseCenterPrint(msg, 0, false),\n onPrint: (level: number, msg: string) => {\n cg.NotifyMessage(0, msg, false);\n chatManager.addMessage(level, msg);\n },\n onConfigString: (index: number, str: string) => {\n configStrings.set(index, str);\n cg.ParseConfigString(index, str);\n\n // Trigger scoreboard update if player skin changes\n if (index >= ConfigStringIndex.PlayerSkins && index < ConfigStringIndex.PlayerSkins + MAX_CLIENTS) {\n scoreboardManager.parseConfigString(index, str);\n scoreboardManager.notifyUpdate();\n }\n\n // Handle CD Track\n if (index === ConfigStringIndex.CdTrack) {\n processCdTrack(str);\n }\n },\n onServerData: (protocol: number, tickRate?: number) => {\n if (tickRate && tickRate > 0) {\n demoPlayback.setFrameDuration(1000 / tickRate);\n } else {\n demoPlayback.setFrameDuration(100); // 10Hz fallback\n }\n },\n // New hooks for effects\n onMuzzleFlash: (ent: number, weapon: number) => {\n const time = demoPlayback.getCurrentTime() / 1000.0;\n effectSystem.onMuzzleFlash(ent, weapon, time);\n },\n onMuzzleFlash2: (ent: number, weapon: number) => {\n // TODO: Implement MZ2 handling\n },\n onTempEntity: (type: number, pos: Vec3, pos2?: Vec3, dir?: Vec3, cnt?: number, color?: number, ent?: number, srcEnt?: number, destEnt?: number) => {\n const time = demoPlayback.getCurrentTime() / 1000.0;\n if (pos) {\n effectSystem.onTempEntity(type, pos, time, dir, pos2);\n }\n },\n onDamage: (indicators: DamageIndicator[]) => {\n pendingDamage = 0.5;\n },\n onLayout: (layout: string) => {\n scoreboardManager.processScoreboardMessage(layout);\n scoreboardManager.notifyUpdate();\n }\n });\n\n demoPlayback.setHandler(demoHandler);\n\n let lastRendered: PredictionState | undefined;\n let lastView: ViewSample | undefined;\n let camera: Camera | undefined;\n\n // Default FOV\n let fovValue = 90;\n let isZooming = false;\n let flashlightEnabled = false;\n\n // Initialize Menu Factories\n if (imports.host) {\n optionsFactory = new OptionsMenuFactory(menuSystem, imports.host);\n pauseMenuFactory = new PauseMenuFactory(menuSystem, optionsFactory, imports.host);\n\n // Load Settings\n const cvarsMap = new Map<string, { value: string, setValue: (v: string) => void }>();\n if (imports.host.cvars) {\n for (const cvar of imports.host.cvars.list()) {\n cvarsMap.set(cvar.name, {\n value: cvar.string,\n setValue: (v) => imports.host!.cvars.setValue(cvar.name, v)\n });\n }\n settings.loadCvars(cvarsMap);\n }\n }\n\n if (imports.host?.commands) {\n imports.host.commands.register('playdemo', (args) => {\n if (args.length < 1) {\n console.log('usage: playdemo <filename>');\n return;\n }\n const filename = args[0];\n console.log(`playdemo: ${filename}`);\n console.log('Note: Demo loading requires VFS access which is not yet fully integrated into this console command.');\n }, 'Play a recorded demo');\n\n imports.host.commands.register('crosshair', () => {\n const index = Cycle_Crosshair();\n console.log(`Crosshair changed to index ${index}`);\n }, 'Cycle through available crosshairs');\n\n imports.host.commands.register('+zoom', () => {\n isZooming = true;\n }, 'Zoom in view');\n\n imports.host.commands.register('-zoom', () => {\n isZooming = false;\n }, 'Reset zoom');\n\n imports.host.commands.register('togglemenu', () => {\n if (menuSystem.isActive()) {\n menuSystem.closeAll();\n } else if (pauseMenuFactory) {\n menuSystem.pushMenu(pauseMenuFactory.createPauseMenu());\n }\n }, 'Toggle the main/pause menu');\n\n imports.host.commands.register('connect', (args) => {\n if (args.length < 1) {\n console.log('usage: connect <address>');\n return;\n }\n const address = args[0];\n console.log(`Connecting to ${address}...`);\n multiplayer.connect(address).catch(e => {\n console.error('Failed to connect:', e);\n errorDialog.show('Connection Failed', e instanceof Error ? e.message : 'Unknown error');\n });\n }, 'Connect to a multiplayer server');\n\n imports.host.commands.register('disconnect', () => {\n multiplayer.disconnect();\n console.log('Disconnected.');\n }, 'Disconnect from server');\n\n imports.host.commands.register('record', (args) => {\n const name = args.length > 0 ? args[0] : `demo_${Date.now()}`;\n clientExports.startRecording(name + '.dm2');\n }, 'Record a demo');\n\n imports.host.commands.register('stop', () => {\n clientExports.stopRecording();\n }, 'Stop recording demo');\n\n imports.host.commands.register('flashlight', () => {\n flashlightEnabled = !flashlightEnabled;\n if (imports.host?.cvars) {\n imports.host.cvars.setValue('cl_flashlight', flashlightEnabled ? '1' : '0');\n }\n }, 'Toggle flashlight');\n\n if (imports.host.cvars) {\n imports.host.cvars.register({\n name: 'fov',\n defaultValue: '90',\n flags: CvarFlags.Archive,\n onChange: (cvar) => {\n const f = cvar.number;\n if (!isNaN(f)) {\n fovValue = Math.max(1, Math.min(179, f));\n }\n },\n description: 'Field of view'\n });\n\n imports.host.cvars.register({\n name: 'cl_flashlight',\n defaultValue: '0',\n flags: CvarFlags.Archive,\n onChange: (cvar) => {\n flashlightEnabled = cvar.number !== 0;\n },\n description: 'Flashlight toggle'\n });\n\n imports.host.cvars.register({\n name: 'cl_predict',\n defaultValue: '1',\n flags: CvarFlags.Archive,\n onChange: (cvar) => {\n prediction.setPredictionEnabled(cvar.number !== 0);\n },\n description: 'Toggle client-side prediction'\n });\n\n imports.host.cvars.register({\n name: 's_musicvolume',\n defaultValue: '1',\n flags: CvarFlags.Archive,\n onChange: (cvar) => {\n const vol = cvar.number;\n if (!isNaN(vol)) {\n // Defensive call in case engine interface is partial\n const audio = imports.engine.audio as any;\n if (audio && typeof audio.set_music_volume === 'function') {\n audio.set_music_volume(Math.max(0, Math.min(1, vol)));\n }\n }\n },\n description: 'Music volume'\n });\n\n imports.host.cvars.register({\n name: 'vid_gamma',\n defaultValue: '1.0',\n flags: CvarFlags.Archive,\n onChange: (cvar) => {\n const val = cvar.number;\n if (!isNaN(val) && imports.engine.renderer) {\n imports.engine.renderer.setGamma(val);\n }\n },\n description: 'Gamma correction'\n });\n\n imports.host.cvars.register({\n name: 'r_brightness',\n defaultValue: '1.0',\n flags: CvarFlags.Archive,\n onChange: (cvar) => {\n const val = cvar.number;\n if (!isNaN(val) && imports.engine.renderer) {\n imports.engine.renderer.setBrightness(val);\n }\n },\n description: 'Brightness control'\n });\n\n imports.host.cvars.register({\n name: 'r_bloom',\n defaultValue: '0',\n flags: CvarFlags.Archive,\n onChange: (cvar) => {\n if (imports.engine.renderer) {\n imports.engine.renderer.setBloom(cvar.number !== 0);\n }\n },\n description: 'Enable bloom effect'\n });\n\n imports.host.cvars.register({\n name: 'r_bloom_intensity',\n defaultValue: '0.5',\n flags: CvarFlags.Archive,\n onChange: (cvar) => {\n const val = cvar.number;\n if (!isNaN(val) && imports.engine.renderer) {\n imports.engine.renderer.setBloomIntensity(val);\n }\n },\n description: 'Bloom intensity'\n });\n\n // Initialize fovValue from cvar\n const initialFov = imports.host.cvars.get('fov');\n if (initialFov) {\n const f = initialFov.number;\n if (!isNaN(f)) {\n fovValue = Math.max(1, Math.min(179, f));\n }\n }\n\n // Initialize music volume\n const initialMusicVol = imports.host.cvars.get('s_musicvolume');\n if (initialMusicVol) {\n const vol = initialMusicVol.number;\n if (!isNaN(vol)) {\n const audio = imports.engine.audio as any;\n if (audio && typeof audio.set_music_volume === 'function') {\n audio.set_music_volume(Math.max(0, Math.min(1, vol)));\n }\n }\n }\n }\n }\n\n const clientExports: ClientExports = {\n loadingScreen,\n errorDialog,\n dlightManager,\n\n init(initial) {\n this.Init(initial);\n },\n\n Init(initial) {\n latestFrame = initial;\n if (initial?.state) {\n prediction.setAuthoritative(initial);\n }\n\n // Initialize CGame\n cg.Init();\n\n // Initialize HUD assets if asset manager is available\n if (imports.engine.assets && imports.engine.renderer) {\n loadingScreen.start(100, 'Loading assets...'); // Mock total\n // Actually Init_Hud is async. We should await it or handle promise.\n // ClientExports.Init is void.\n Init_Hud(imports.engine.renderer, imports.engine.assets).then(() => {\n loadingScreen.finish();\n });\n }\n\n // Apply initial render settings from cvars\n if (imports.engine.renderer && imports.host?.cvars) {\n const gamma = imports.host.cvars.get('vid_gamma');\n if (gamma && !isNaN(gamma.number)) {\n imports.engine.renderer.setGamma(gamma.number);\n }\n const brightness = imports.host.cvars.get('r_brightness');\n if (brightness && !isNaN(brightness.number)) {\n imports.engine.renderer.setBrightness(brightness.number);\n }\n const bloom = imports.host.cvars.get('r_bloom');\n if (bloom) {\n imports.engine.renderer.setBloom(bloom.number !== 0);\n }\n const bloomIntensity = imports.host.cvars.get('r_bloom_intensity');\n if (bloomIntensity && !isNaN(bloomIntensity.number)) {\n imports.engine.renderer.setBloomIntensity(bloomIntensity.number);\n }\n }\n\n void imports.engine.trace({ x: 0, y: 0, z: 0 }, { x: 1, y: 0, z: 0 });\n\n // Setup global events\n if (typeof document !== 'undefined') {\n document.addEventListener('fullscreenchange', () => {\n if (document.fullscreenElement) {\n if (!menuSystem.isActive()) {\n document.body.requestPointerLock?.();\n }\n }\n });\n }\n },\n\n predict(command: UserCommand): PredictionState {\n if (menuSystem.isActive()) {\n // Suppress movement if desired\n }\n\n // If connected to multiplayer, send command to server\n if (multiplayer.isConnected()) {\n multiplayer.sendCommand(command);\n }\n\n return prediction.enqueueCommand(command);\n },\n\n handleInput(key: string, down: boolean): boolean {\n if (isDemoPlaying) {\n // Handle camera inputs if in Free mode\n if (demoCameraState.mode === DemoCameraMode.Free) {\n const lowerKey = key.toLowerCase();\n if (lowerKey === 'arrowup' || lowerKey === 'w') inputState.forward = down;\n if (lowerKey === 'arrowdown' || lowerKey === 's') inputState.backward = down;\n if (lowerKey === 'arrowleft' || lowerKey === 'a') inputState.left = down;\n if (lowerKey === 'arrowright' || lowerKey === 'd') inputState.right = down;\n if (lowerKey === 'q') inputState.up = down;\n if (lowerKey === 'e') inputState.down = down;\n }\n\n if (demoControls.handleInput(key, down)) {\n return true;\n }\n // If demo controls didn't consume input, fall through (e.g. for togglemenu)\n }\n\n if (!menuSystem.isActive()) return false;\n\n if (!down) return true;\n\n const lowerKey = key.toLowerCase();\n\n if (lowerKey === 'arrowup' || lowerKey === 'w') {\n return menuSystem.handleInput('up');\n } else if (lowerKey === 'arrowdown' || lowerKey === 's') {\n return menuSystem.handleInput('down');\n } else if (lowerKey === 'arrowleft' || lowerKey === 'a') {\n return menuSystem.handleInput('left');\n } else if (lowerKey === 'arrowright' || lowerKey === 'd') {\n return menuSystem.handleInput('right');\n } else if (lowerKey === 'enter' || lowerKey === ' ') {\n return menuSystem.handleInput('select');\n } else if (lowerKey === 'escape') {\n if (menuSystem.getState().activeMenu?.parent) {\n return menuSystem.handleInput('back');\n }\n return false;\n } else if (key.length === 1) {\n return menuSystem.handleInput('char', key);\n } else if (key === 'Backspace') {\n return menuSystem.handleInput('left');\n }\n\n return true;\n },\n\n toggleMenu() {\n if (menuSystem.isActive()) {\n menuSystem.closeAll();\n // Save settings when closing menu\n if (imports.host?.cvars) {\n const list = imports.host.cvars.list().map(c => ({\n name: c.name,\n value: c.string,\n flags: c.flags\n }));\n settings.saveCvars(list);\n }\n } else if (pauseMenuFactory) {\n menuSystem.pushMenu(pauseMenuFactory.createPauseMenu());\n }\n },\n\n bindInputSource(source: InputSource) {\n inputController.bindInputSource(source);\n },\n\n setKeyBinding(action: string, keys: string[]) {\n inputController.setKeyBinding(action, keys);\n },\n\n getDefaultBindings() {\n return inputController.getDefaultBindings();\n },\n\n createMainMenu(options: Omit<MainMenuOptions, 'optionsFactory' | 'mapsFactory' | 'onSetDifficulty' | 'multiplayerFactory' | 'demoFactory'>, storage: SaveStorage, saveCallback: (name: string) => Promise<void>, loadCallback: (slot: string) => Promise<void>, deleteCallback: (slot: string) => Promise<void>) {\n const saveLoadFactory = new SaveLoadMenuFactory(menuSystem, storage, saveCallback, loadCallback, deleteCallback);\n let optsFactory = optionsFactory;\n if (!optsFactory) {\n if (!imports.host) {\n throw new Error('Cannot create Main Menu: EngineHost is missing');\n }\n optsFactory = new OptionsMenuFactory(menuSystem, imports.host);\n }\n\n const assets = imports.engine.assets;\n const vfsShim = {\n findByExtension: (ext: string) => assets ? assets.listFiles(ext) : []\n };\n\n const mapsFactory = new MapsMenuFactory(menuSystem, vfsShim as any, (map) => {\n console.log(`Starting map: ${map}`);\n imports.host?.commands.execute(`map ${map}`);\n });\n\n const demoFactory = new DemoMenuFactory(menuSystem, clientExports);\n\n const factory = new MainMenuFactory(menuSystem, saveLoadFactory, {\n ...options,\n optionsFactory: optsFactory,\n mapsFactory,\n multiplayerFactory,\n demoFactory,\n onSetDifficulty: (skill: number) => {\n if (imports.host?.cvars) {\n imports.host.cvars.setValue('skill', skill.toString());\n }\n }\n });\n\n return { menuSystem, factory };\n },\n\n showPauseMenu() {\n if (!menuSystem.isActive() && pauseMenuFactory) {\n menuSystem.pushMenu(pauseMenuFactory.createPauseMenu());\n }\n },\n\n hidePauseMenu() {\n if (menuSystem.isActive()) {\n menuSystem.closeAll();\n }\n },\n\n isMenuActive() {\n return menuSystem.isActive();\n },\n\n getMenuState() {\n return menuSystem.getState();\n },\n\n render(sample: GameRenderSample<PredictionState>): UserCommand {\n // Keep track of entities to render\n let renderEntities: RenderableEntity[] = [];\n let currentPacketEntities: any[] = []; // Store raw packet entities for effect processing\n\n const now = sample.nowMs;\n const dtMs = lastRenderTime > 0 ? Math.max(0, now - lastRenderTime) : 0;\n lastRenderTime = now;\n\n if (isDemoPlaying) {\n // Update demo playback with delta time since last frame\n demoPlayback.update(dtMs);\n\n lastRendered = demoHandler.getPredictionState(demoPlayback.getCurrentTime());\n // Calculate alpha for interpolation\n const alpha = demoPlayback.getInterpolationFactor();\n\n // Get Camera info for LOD\n let camPos = lastRendered ? { x: lastRendered.origin.x, y: lastRendered.origin.y, z: lastRendered.origin.z } : undefined;\n\n renderEntities = demoHandler.getRenderableEntities(alpha, configStrings); // demo handler needs update to pass camera pos or we do it inside\n\n // Get packet entities for effect processing.\n if (demoHandler.latestFrame && demoHandler.latestFrame.packetEntities) {\n currentPacketEntities = demoHandler.latestFrame.packetEntities.entities;\n }\n\n if (lastRendered) {\n const demoCamera = demoHandler.getDemoCamera(1.0);\n // Apply Demo Camera Modes logic\n if (demoCameraState.mode === DemoCameraMode.FirstPerson) {\n if (demoCamera) {\n lastRendered.origin = demoCamera.origin;\n lastRendered.viewAngles = demoCamera.angles;\n if (demoCamera.fov) {\n lastRendered.fov = demoCamera.fov;\n }\n }\n } else if (demoCameraState.mode === DemoCameraMode.ThirdPerson) {\n if (demoCamera) {\n // Simple third person: Move back along view angles\n const vectors = angleVectors(demoCamera.angles);\n const forward = vectors.forward;\n\n const dist = demoCameraState.thirdPersonDistance;\n\n // Calculate new origin\n // origin - forward * dist\n const camOrigin = { ...demoCamera.origin };\n camOrigin.x -= forward.x * dist;\n camOrigin.y -= forward.y * dist;\n camOrigin.z -= forward.z * dist;\n\n // Check for collision using trace\n const traceStart = demoCamera.origin;\n const traceEnd = camOrigin;\n // Trace against solids (MASK_SOLID = 1)\n // We need to define a small bounding box for the camera or use point trace\n const mins = { x: -4, y: -4, z: -4 };\n const maxs = { x: 4, y: 4, z: 4 };\n\n const trace = imports.engine.trace(traceStart, traceEnd, mins, maxs);\n\n if (trace.fraction < 1.0) {\n // Hit something, clamp to hit position (endpos)\n // Add a small buffer to prevent clipping right into the wall\n lastRendered.origin = trace.endpos;\n } else {\n lastRendered.origin = camOrigin;\n }\n lastRendered.viewAngles = demoCamera.angles;\n }\n } else if (demoCameraState.mode === DemoCameraMode.Free) {\n // Update free camera position based on input state\n const speed = 300 * (dtMs / 1000);\n const vectors = angleVectors(demoCameraState.freeCameraAngles);\n const forward = vectors.forward;\n const right = vectors.right;\n const up = vectors.up;\n\n // Use a temporary mutable vector for calculation\n const newOrigin = vec3.fromValues(\n demoCameraState.freeCameraOrigin.x,\n demoCameraState.freeCameraOrigin.y,\n demoCameraState.freeCameraOrigin.z\n );\n\n if (inputState.forward) {\n vec3.scaleAndAdd(newOrigin, newOrigin, [forward.x, forward.y, forward.z], speed);\n }\n if (inputState.backward) {\n vec3.scaleAndAdd(newOrigin, newOrigin, [forward.x, forward.y, forward.z], -speed);\n }\n if (inputState.right) {\n vec3.scaleAndAdd(newOrigin, newOrigin, [right.x, right.y, right.z], speed);\n }\n if (inputState.left) {\n vec3.scaleAndAdd(newOrigin, newOrigin, [right.x, right.y, right.z], -speed);\n }\n if (inputState.up) {\n vec3.scaleAndAdd(newOrigin, newOrigin, [0, 0, 1], speed);\n }\n if (inputState.down) {\n vec3.scaleAndAdd(newOrigin, newOrigin, [0, 0, 1], -speed);\n }\n\n // Update state with new values\n demoCameraState.freeCameraOrigin = { x: newOrigin[0], y: newOrigin[1], z: newOrigin[2] };\n lastRendered.origin = { ...demoCameraState.freeCameraOrigin };\n lastRendered.viewAngles = demoCameraState.freeCameraAngles;\n\n } else if (demoCameraState.mode === DemoCameraMode.Follow) {\n if (demoCameraState.followEntityId !== -1) {\n // Find entity in renderEntities\n const ent = renderEntities.find(e => e.id === demoCameraState.followEntityId);\n if (ent) {\n const mat = ent.transform;\n const targetOrigin = { x: mat[12], y: mat[13], z: mat[14] };\n\n // Smoothing: Linear interpolation towards target\n const smoothingFactor = 0.1; // Adjust for lag effect\n\n // Initialize if missing\n if (!demoCameraState.currentFollowOrigin) {\n demoCameraState.currentFollowOrigin = { ...targetOrigin };\n }\n\n const current = demoCameraState.currentFollowOrigin;\n\n // If far away, snap\n if (Math.abs(current.x - targetOrigin.x) > 1000 ||\n Math.abs(current.y - targetOrigin.y) > 1000 ||\n Math.abs(current.z - targetOrigin.z) > 1000) {\n demoCameraState.currentFollowOrigin = { ...targetOrigin };\n } else {\n const nextX = current.x + (targetOrigin.x - current.x) * smoothingFactor;\n const nextY = current.y + (targetOrigin.y - current.y) * smoothingFactor;\n const nextZ = current.z + (targetOrigin.z - current.z) * smoothingFactor;\n demoCameraState.currentFollowOrigin = { x: nextX, y: nextY, z: nextZ };\n }\n\n lastRendered.origin = { ...demoCameraState.currentFollowOrigin };\n }\n }\n }\n }\n } else {\n if (sample.latest?.state) {\n prediction.setAuthoritative(sample.latest);\n latestFrame = sample.latest;\n }\n\n if (sample.previous?.state && sample.latest?.state) {\n lastRendered = interpolatePredictionState(sample.previous.state, sample.latest.state, sample.alpha);\n\n // Interpolate entities\n if ((sample.latest.state as any).packetEntities && (sample.previous.state as any).packetEntities) {\n const latestPacketEntities = (sample.latest.state as any).packetEntities;\n const previousPacketEntities = (sample.previous.state as any).packetEntities;\n\n // Determine camera pos for LOD\n const camPos = lastRendered ? { x: lastRendered.origin.x, y: lastRendered.origin.y, z: lastRendered.origin.z } : undefined;\n\n renderEntities = buildRenderableEntities(\n latestPacketEntities,\n previousPacketEntities,\n sample.alpha,\n configStrings,\n imports,\n camPos\n );\n // Use latest packet entities for effects (or interpolate if we get fancy)\n currentPacketEntities = latestPacketEntities;\n }\n\n } else {\n lastRendered = sample.latest?.state ?? sample.previous?.state ?? prediction.getPredictedState();\n }\n }\n\n const frameTimeMs = sample.latest && sample.previous ? Math.max(0, sample.latest.timeMs - sample.previous.timeMs) : 0;\n\n // Decay prediction error\n if (frameTimeMs > 0) {\n prediction.decayError(frameTimeMs / 1000.0);\n }\n\n lastView = view.sample(lastRendered, frameTimeMs);\n\n // Update screen blend (damage/pickup flashes)\n if (lastRendered) {\n currentBlend = updateBlend(blendState, lastRendered as unknown as PlayerState, frameTimeMs / 1000.0, pendingDamage);\n pendingDamage = 0;\n } else {\n currentBlend = [0, 0, 0, 0];\n }\n\n // Generate user command from input controller\n const command = inputController.buildCommand(dtMs, now, demoHandler.latestServerFrame);\n\n // Apply prediction\n if (!isDemoPlaying && !menuSystem.isActive()) {\n clientExports.predict(command);\n }\n\n // Update Dynamic Light Manager\n const timeSeconds = sample.nowMs / 1000.0;\n dlightManager.update(timeSeconds, dtMs / 1000.0);\n\n // Collect lights (persistent + per-frame)\n const dlights: DLight[] = [...dlightManager.getActiveLights()];\n\n // Process Entity Effects (Per-frame lights)\n for (const ent of currentPacketEntities) {\n processEntityEffects(ent, dlights, timeSeconds);\n }\n\n if (lastRendered) {\n const { origin, viewAngles } = lastRendered;\n camera = new Camera();\n camera.position = vec3.fromValues(origin.x, origin.y, origin.z);\n // Add view offset if FirstPerson\n if (!isDemoPlaying || demoCameraState.mode === DemoCameraMode.FirstPerson) {\n const viewOffset = lastView?.offset ?? { x: 0, y: 0, z: 0 };\n vec3.add(camera.position, camera.position, [viewOffset.x, viewOffset.y, viewOffset.z]);\n }\n\n // Add view effects angles\n const effectAngles = lastView?.angles ?? { x: 0, y: 0, z: 0 };\n camera.angles = vec3.fromValues(viewAngles.x + effectAngles.x, viewAngles.y + effectAngles.y, viewAngles.z + effectAngles.z);\n\n // In demo playback, prefer the recorded FOV if available\n if (isDemoPlaying && lastRendered.fov) {\n camera.fov = lastRendered.fov;\n } else {\n camera.fov = isZooming ? 40 : fovValue;\n }\n\n camera.aspect = 4 / 3; // Default aspect\n\n // Update aspect from renderer\n if (imports.engine.renderer) {\n camera.aspect = imports.engine.renderer.width / imports.engine.renderer.height;\n }\n\n // Flashlight logic\n if (flashlightEnabled || (lastRendered.renderfx & RenderFx.Flashlight)) {\n // Flashlight originates from view position\n const lightOrigin = { x: camera.position[0], y: camera.position[1], z: camera.position[2] };\n\n dlights.push({\n origin: lightOrigin,\n color: { x: 1, y: 1, z: 1 },\n intensity: 200,\n die: (sample.nowMs / 1000) + 0.1,\n minLight: 0\n });\n }\n }\n\n // RENDER THE WORLD\n if (imports.engine.renderer && camera) {\n let world: WorldRenderState | undefined;\n\n if (imports.engine.assets) {\n const mapName = configStrings.getModelName(1);\n if (mapName) {\n const bspMap = imports.engine.assets.getMap(mapName);\n if (bspMap) {\n // Construct world state.\n }\n }\n }\n\n // Check camera contents for water tint\n const cameraContents = pointContents({ x: camera.position[0], y: camera.position[1], z: camera.position[2] });\n let waterTint: readonly [number, number, number, number] | undefined;\n let underwaterWarp = false;\n\n if ((cameraContents & CONTENTS_WATER) !== 0) {\n waterTint = [0.5, 0.5, 0.6, 0.6]; // Blueish\n underwaterWarp = true;\n } else if ((cameraContents & CONTENTS_SLIME) !== 0) {\n waterTint = [0.0, 0.1, 0.05, 0.6]; // Slime green\n underwaterWarp = true;\n } else if ((cameraContents & CONTENTS_LAVA) !== 0) {\n waterTint = [1.0, 0.3, 0.0, 0.6]; // Lava red\n underwaterWarp = true;\n }\n\n imports.engine.renderer.setUnderwaterWarp(underwaterWarp);\n\n imports.engine.renderer.renderFrame({\n camera,\n world,\n dlights: dlights,\n deltaTime: dtMs / 1000.0,\n timeSeconds,\n waterTint // Pass it here\n }, renderEntities);\n }\n\n if (imports.engine.renderer && lastRendered && lastRendered.client) {\n const perfReport = imports.engine.renderer.getPerformanceReport();\n const stats: FrameRenderStats = {\n batches: perfReport.textureBinds,\n facesDrawn: perfReport.triangles,\n drawCalls: perfReport.drawCalls,\n skyDrawn: false,\n viewModelDrawn: false,\n fps: 0,\n vertexCount: perfReport.vertices,\n };\n const timeMs = sample.latest?.timeMs ?? 0;\n\n this.DrawHUD(stats, timeMs);\n }\n\n if (clientExports.onHudUpdate) {\n const hudData = clientExports.getHudData();\n if (hudData) {\n clientExports.onHudUpdate(hudData);\n }\n }\n\n return command;\n },\n\n DrawHUD(stats: FrameRenderStats, timeMs: number) {\n if (!imports.engine.renderer) return;\n\n const renderer = imports.engine.renderer;\n const width = renderer.width;\n const height = renderer.height;\n\n // Only draw full player HUD if not in demo mode\n if (!isDemoPlaying && lastRendered && lastRendered.client) {\n const playerState: PlayerState = {\n origin: lastRendered.origin,\n velocity: lastRendered.velocity,\n viewAngles: lastRendered.viewAngles,\n onGround: hasPmFlag(lastRendered.pmFlags, PmFlag.OnGround),\n waterLevel: lastRendered.waterLevel,\n watertype: lastRendered.watertype,\n mins: { x: -16, y: -16, z: -24 },\n maxs: { x: 16, y: 16, z: 32 },\n damageAlpha: lastRendered.damageAlpha ?? 0,\n damageIndicators: lastRendered.damageIndicators ?? [],\n blend: currentBlend,\n pickupIcon: lastRendered.pickupIcon,\n centerPrint: undefined,\n notify: undefined,\n\n // Stubs for new fields\n stats: lastRendered.stats ? [...lastRendered.stats] : new Array(32).fill(0),\n kick_angles: ZERO_VEC3,\n kick_origin: ZERO_VEC3,\n gunoffset: ZERO_VEC3,\n gunangles: ZERO_VEC3,\n gunindex: 0,\n\n // New fields for Q2 network compatibility\n pm_type: lastRendered.pm_type ?? 0,\n pm_time: lastRendered.pm_time ?? 0,\n pm_flags: lastRendered.pmFlags,\n gun_frame: lastRendered.gun_frame ?? 0,\n rdflags: lastRendered.rdflags ?? 0,\n fov: lastRendered.fov ?? 90,\n renderfx: lastRendered.renderfx\n };\n\n // Populate stats for status bar (Health, Armor, Ammo) if not already populated by server\n playerState.stats[PlayerStat.STAT_HEALTH] = lastRendered.health ?? 0;\n playerState.stats[PlayerStat.STAT_AMMO] = lastRendered.ammo ?? 0;\n playerState.stats[PlayerStat.STAT_ARMOR] = lastRendered.armor ?? 0;\n\n renderer.begin2D();\n cg.DrawHUD(\n 0, // isplit\n null, // data\n { x: 0, y: 0, width, height }, // hud_vrect\n { x: 0, y: 0, width, height }, // hud_safe\n 1.0, // scale\n 0, // playernum\n playerState\n );\n renderer.end2D();\n }\n\n if (menuSystem.isActive()) {\n Draw_Menu(imports.engine.renderer, menuSystem.getState(), imports.engine.renderer.width, imports.engine.renderer.height);\n }\n\n if (isDemoPlaying) {\n demoControls.render(imports.engine.renderer, imports.engine.renderer.width, imports.engine.renderer.height);\n }\n\n if (lastRendered && lastRendered.client) {\n wheelMenuSystem.render(imports.engine.renderer, imports.engine.renderer.width, imports.engine.renderer.height, lastRendered.client as PlayerClient);\n }\n\n errorDialog.render(imports.engine.renderer);\n loadingScreen.render(imports.engine.renderer);\n },\n\n getHudData(): HudData | null {\n if (!lastRendered) return null;\n\n const health = lastRendered.health ?? 0;\n const armor = lastRendered.armor ?? 0;\n const ammo = lastRendered.ammo ?? 0;\n const fps = 60; // TODO: Calculate real FPS\n\n const damageIndicators = (lastRendered.damageIndicators ?? []).map(ind => ({\n angle: vectorToAngles(ind.direction).y,\n alpha: ind.strength\n }));\n\n return {\n health,\n armor,\n ammo,\n inventory: [], // Todo\n damageIndicators,\n fps,\n pickupIcon: lastRendered.pickupIcon\n };\n },\n\n getStatusBar(): StatusBarData | null {\n if (!lastRendered) return null;\n return {\n health: lastRendered.health ?? 0,\n armor: lastRendered.armor ?? 0,\n ammo: lastRendered.ammo ?? 0,\n selectedAmmoIndex: 0\n };\n },\n\n getCrosshairInfo(): CrosshairInfo {\n return {\n index: 0,\n name: 'default'\n };\n },\n\n shutdown() {\n this.Shutdown();\n },\n\n Shutdown() {\n // Shutdown CGame\n cg.Shutdown();\n\n latestFrame = undefined;\n lastRendered = undefined;\n // Save settings on shutdown\n if (imports.host?.cvars) {\n const list = imports.host.cvars.list().map(c => ({\n name: c.name,\n value: c.string,\n flags: c.flags\n }));\n settings.saveCvars(list);\n }\n },\n\n get prediction(): ClientPrediction {\n return prediction;\n },\n get lastRendered(): PredictionState | undefined {\n return lastRendered;\n },\n get view(): ViewEffects {\n return view;\n },\n get lastView(): ViewSample | undefined {\n return lastView;\n },\n get camera(): Camera | undefined {\n return camera;\n },\n demoPlayback,\n get isDemoPlaying() {\n return isDemoPlaying;\n },\n get currentDemoName() {\n return currentDemoName;\n },\n get mode() {\n return clientMode;\n },\n startDemoPlayback(buffer: ArrayBuffer, filename: string) {\n demoPlayback.loadDemo(buffer);\n demoPlayback.setHandler(demoHandler);\n demoControls.setDemoName(filename);\n isDemoPlaying = true;\n currentDemoName = filename;\n clientMode = ClientMode.DemoPlayback;\n lastRenderTime = 0;\n // Reset state\n configStrings.clear(); // Clear existing configstrings\n },\n stopDemoPlayback() {\n demoPlayback.stop();\n demoControls.setDemoName(null);\n isDemoPlaying = false;\n currentDemoName = null;\n clientMode = ClientMode.Normal;\n // Clean up\n },\n startRecording(filename: string) {\n if (multiplayer.isConnected()) {\n demoRecorder.startRecording(filename);\n console.log(`Recording started: ${filename}`);\n } else {\n console.log(\"Not connected to a server.\");\n }\n },\n stopRecording() {\n if (demoRecorder.getIsRecording()) {\n const data = demoRecorder.stopRecording();\n console.log(`Recording stopped. Size: ${data?.length} bytes.`);\n // Auto-save to VFS or download?\n // For now, let's offer download if in browser\n if (data && typeof document !== 'undefined') {\n const blob = new Blob([data as any], { type: 'application/octet-stream' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'demo.dm2'; // Should use filename\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }\n }\n },\n ParseCenterPrint(msg: string) {\n cg.ParseCenterPrint(msg, 0, false);\n\n if (clientExports.onCenterPrint) {\n // Default duration 3 seconds for now\n clientExports.onCenterPrint(msg, 3.0);\n }\n\n // Simple heuristic for pickup messages\n // \"You got the <item>\"\n if (msg.startsWith('You got the ')) {\n const item = msg.substring(12).replace('.', '');\n if (clientExports.onPickupMessage) {\n clientExports.onPickupMessage(item);\n }\n }\n },\n ParseNotify(msg: string) {\n cg.NotifyMessage(0, msg, false);\n\n if (clientExports.onNotify) {\n clientExports.onNotify(msg);\n }\n\n if (clientExports.onObituaryMessage) {\n if (!msg.includes(': ')) {\n clientExports.onObituaryMessage(msg);\n }\n }\n },\n showSubtitle(text: string, soundName: string) {\n cg.ShowSubtitle(text, soundName);\n },\n ParseConfigString(index: number, value: string) {\n configStrings.set(index, value);\n cg.ParseConfigString(index, value);\n\n // Handle CD Track\n if (index === ConfigStringIndex.CdTrack) {\n processCdTrack(value);\n }\n },\n demoHandler,\n multiplayer,\n configStrings,\n\n // Demo Camera API\n setDemoCameraMode(mode: DemoCameraMode) {\n demoCameraState.mode = mode;\n },\n setDemoThirdPersonDistance(dist: number) {\n demoCameraState.thirdPersonDistance = dist;\n },\n setDemoThirdPersonOffset(offset: Vec3) {\n demoCameraState.thirdPersonOffset = offset;\n },\n setDemoFreeCamera(origin: Vec3, angles: Vec3) {\n demoCameraState.freeCameraOrigin = origin;\n demoCameraState.freeCameraAngles = angles;\n },\n setDemoFollowEntity(entityId: number) {\n demoCameraState.followEntityId = entityId;\n },\n\n // Spectator API\n setSpectatorTarget(targetEntityId: number | null) {\n if (targetEntityId === null) {\n if (demoCameraState.mode === DemoCameraMode.Follow) {\n demoCameraState.mode = DemoCameraMode.Free;\n }\n demoCameraState.followEntityId = -1;\n } else {\n demoCameraState.mode = DemoCameraMode.Follow;\n demoCameraState.followEntityId = targetEntityId;\n }\n },\n\n getSpectatorTargets(): { id: number; name: string }[] {\n const targets: { id: number; name: string }[] = [];\n for (let i = 0; i < MAX_CLIENTS; i++) {\n const name = configStrings.getPlayerName(i);\n if (name) {\n const entityId = i + 1;\n targets.push({ id: entityId, name });\n }\n }\n return targets;\n },\n\n // Scoreboard API\n getScoreboard() {\n return scoreboardManager.getScoreboard();\n },\n\n // Chat API\n sendChatMessage(message: string, team: boolean = false) {\n chatManager.sendChatMessage(message, team);\n },\n getChatHistory() {\n return chatManager.getHistory();\n },\n\n registerLod(baseModel: string, lods: LodModel[]) {\n lodRegistry.register(baseModel, lods);\n }\n };\n\n // Hook up scoreboard listener\n scoreboardManager.addListener((data) => {\n if (clientExports.onScoreboardUpdate) {\n clientExports.onScoreboardUpdate(data);\n }\n });\n\n // Hook up chat listener\n chatManager.addListener((sender, message, team) => {\n if (clientExports.onChatMessage) {\n clientExports.onChatMessage(sender, message, team);\n }\n });\n\n return clientExports;\n}\n"]}
|