quake2ts 0.0.542 → 0.0.544

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.
Files changed (37) hide show
  1. package/package.json +1 -1
  2. package/packages/cgame/dist/index.cjs +4 -5
  3. package/packages/cgame/dist/index.cjs.map +1 -1
  4. package/packages/cgame/dist/index.d.cts +7 -4
  5. package/packages/cgame/dist/index.d.ts +7 -4
  6. package/packages/cgame/dist/index.js +4 -5
  7. package/packages/cgame/dist/index.js.map +1 -1
  8. package/packages/client/dist/browser/index.global.js +17 -17
  9. package/packages/client/dist/browser/index.global.js.map +1 -1
  10. package/packages/client/dist/cjs/index.cjs +268 -8
  11. package/packages/client/dist/cjs/index.cjs.map +1 -1
  12. package/packages/client/dist/esm/index.js +269 -9
  13. package/packages/client/dist/esm/index.js.map +1 -1
  14. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  15. package/packages/client/dist/types/effects-system.d.ts +1 -1
  16. package/packages/client/dist/types/effects-system.d.ts.map +1 -1
  17. package/packages/client/dist/types/index.d.ts +1 -1
  18. package/packages/client/dist/types/index.d.ts.map +1 -1
  19. package/packages/client/dist/types/net/connection.d.ts +2 -1
  20. package/packages/client/dist/types/net/connection.d.ts.map +1 -1
  21. package/packages/engine/dist/browser/index.global.js +15 -15
  22. package/packages/engine/dist/browser/index.global.js.map +1 -1
  23. package/packages/engine/dist/cjs/index.cjs +388 -46
  24. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  25. package/packages/engine/dist/esm/index.js +384 -46
  26. package/packages/engine/dist/esm/index.js.map +1 -1
  27. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  28. package/packages/engine/dist/types/assets/visibilityAnalyzer.d.ts +17 -0
  29. package/packages/engine/dist/types/assets/visibilityAnalyzer.d.ts.map +1 -0
  30. package/packages/engine/dist/types/demo/parser.d.ts.map +1 -1
  31. package/packages/engine/dist/types/demo/writer.d.ts +13 -12
  32. package/packages/engine/dist/types/demo/writer.d.ts.map +1 -1
  33. package/packages/engine/dist/types/index.d.ts +1 -1
  34. package/packages/engine/dist/types/index.d.ts.map +1 -1
  35. package/packages/engine/dist/types/render/particleSystem.d.ts +16 -0
  36. package/packages/engine/dist/types/render/particleSystem.d.ts.map +1 -1
  37. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hud/crosshair.ts","../src/hud/icons.ts","../src/hud/damage.ts","../src/hud/messages.ts","../src/hud/subtitles.ts","../src/hud/blends.ts","../src/hud/pickup.ts","../src/hud/numbers.ts","../src/hud/statusbar.ts","../src/hud/layout.ts","../src/screen.ts","../src/parse.ts","../../../node_modules/.pnpm/gl-matrix@3.4.4/node_modules/gl-matrix/esm/common.js","../../../node_modules/.pnpm/gl-matrix@3.4.4/node_modules/gl-matrix/esm/vec3.js","../src/view/camera.ts","../src/view/effects.ts","../src/prediction/index.ts","../src/index.ts"],"names":["cgi","angleVectors","dotVec3","angle","hudNumberPics","numberWidth","PlayerStat","ConfigStringIndex","scale","MAX_MODELS","MAX_SOUNDS","MAX_IMAGES","round","len","hasPmFlag","PmFlag","clampViewAngles","ZERO_VEC3","PmType","WaterLevel","lerp","angleMod","applyPmove","subtractVec3","lengthVec3","scaleVec3","WEAPON_WHEEL_ORDER","WEAPON_AMMO_MAP","G_GetAmmoStat","PowerupId","G_GetPowerupStat","zero","str","messageSystem","subtitleSystem"],"mappings":"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","file":"index.cjs","sourcesContent":["import { CGameImport } from '../types.js';\n\nlet crosshairPic: unknown | 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: (unknown | null)[] = [null, null, null];\n\nexport const Init_Crosshair = (cgi: CGameImport) => {\n for (let i = 0; i < CROSSHAIR_NAMES.length; i++) {\n const name = CROSSHAIR_NAMES[i];\n try {\n crosshairPics[i] = cgi.Draw_RegisterPic(`pics/${name}.pcx`);\n } catch (e) {\n if (i === 0) {\n try {\n crosshairPics[i] = cgi.Draw_RegisterPic('pics/crosshair.pcx');\n } catch (e2) {\n cgi.Com_Print('Failed to load crosshair image\\n');\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 = (cgi: CGameImport, width: number, height: number) => {\n if (crosshairEnabled && crosshairPic) {\n const size = cgi.Draw_GetPicSize(crosshairPic);\n const x = (width - size.width) / 2;\n const y = (height - size.height) / 2;\n // Draw with color\n cgi.SCR_DrawColorPic(x, y, crosshairPic, { x: crosshairColor[0], y: crosshairColor[1], z: crosshairColor[2] }, crosshairColor[3]);\n }\n};\n","import { CGameImport } from '../types.js';\n\n/**\n * Global map of loaded HUD icons.\n * This is imported and used by statusbar.ts for rendering.\n */\nexport const iconPics = new Map<string, unknown>();\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\n/**\n * Initialize and precache all HUD icon images.\n * Called during level load via CG_TouchPics().\n */\nexport const Init_Icons = (cgi: CGameImport) => {\n for (const name of ICON_NAMES) {\n try {\n const pic = cgi.Draw_RegisterPic(`pics/${name}.pcx`);\n iconPics.set(name, pic);\n } catch (e) {\n cgi.Com_Print(`Failed to load HUD image: pics/${name}.pcx\\n`);\n }\n }\n};\n","import { CGameImport } from '../types.js';\nimport { PlayerState, Vec3, dotVec3, angleVectors } from '@quake2ts/shared';\n\nconst damagePics = new Map<string, unknown>();\n\nconst DAMAGE_INDICATOR_NAMES = [\n 'd_left', 'd_right', 'd_up', 'd_down'\n];\n\nexport const Init_Damage = (cgi: CGameImport) => {\n for (const name of DAMAGE_INDICATOR_NAMES) {\n try {\n const pic = cgi.Draw_RegisterPic(`pics/${name}.pcx`);\n damagePics.set(name, pic);\n } catch (e) {\n cgi.Com_Print(`Failed to load HUD image: pics/${name}.pcx\\n`);\n }\n }\n};\n\nconst WHITE: Vec3 = { x: 1, y: 1, z: 1 };\n\nexport const Draw_Damage = (cgi: CGameImport, ps: PlayerState, width: number, height: number) => {\n // Check if we have damage to show\n if ((!ps.damageAlpha || ps.damageAlpha <= 0) && (!ps.damageIndicators || ps.damageIndicators.length === 0)) {\n return;\n }\n\n if (!ps.damageIndicators || ps.damageIndicators.length === 0) {\n return;\n }\n\n const cx = width * 0.5;\n const cy = height * 0.5;\n const { forward, right } = angleVectors(ps.viewAngles);\n\n // Draw indicators at a fixed radius from the center of the screen\n const radius = Math.min(width, height) * 0.25;\n\n for (const indicator of ps.damageIndicators) {\n // Project the direction vector onto the player's view plane\n // indicator.direction is assumed to be the vector pointing TO the damage source\n const localRight = dotVec3(indicator.direction, right);\n const localForward = dotVec3(indicator.direction, forward);\n\n // Calculate the angle relative to the player's view\n // 0 degrees = Right, 90 degrees = Forward\n const angle = Math.atan2(localForward, localRight) * (180 / Math.PI);\n\n let picName = '';\n let xOff = 0;\n let yOff = 0;\n\n // Map angle to quadrants\n if (angle >= 45 && angle < 135) {\n // Front (Up)\n picName = 'd_up';\n yOff = -radius;\n } else if (angle >= -45 && angle < 45) {\n // Right\n picName = 'd_right';\n xOff = radius;\n } else if (angle >= -135 && angle < -45) {\n // Back (Down)\n picName = 'd_down';\n yOff = radius;\n } else {\n // Left (angle >= 135 || angle < -135)\n picName = 'd_left';\n xOff = -radius;\n }\n\n const pic = damagePics.get(picName);\n if (pic) {\n const size = cgi.Draw_GetPicSize(pic);\n // Center the sprite at the calculated offset position\n const x = cx + xOff - size.width * 0.5;\n const y = cy + yOff - size.height * 0.5;\n\n // Use indicator strength as alpha, clamped to [0, 1]\n const alpha = Math.max(0, Math.min(1, indicator.strength));\n cgi.SCR_DrawColorPic(x, y, pic, WHITE, alpha);\n }\n }\n};\n","import type { CGameImport } from '../types.js';\nimport { getHudLayout } from './layout.js';\n\ninterface Message {\n text: string;\n startTime: number;\n duration: number;\n}\n\nconst CENTER_PRINT_DURATION = 3000;\nconst NOTIFY_DURATION = 5000;\nconst MAX_NOTIFY_MESSAGES = 4;\n\nexport class MessageSystem {\n private centerPrintMsg: Message | null = null;\n private notifyMessages: Message[] = [];\n\n addCenterPrint(text: string, now: number) {\n this.centerPrintMsg = {\n text,\n startTime: now,\n duration: CENTER_PRINT_DURATION,\n };\n }\n\n addNotify(text: string, now: number) {\n this.notifyMessages.push({\n text,\n startTime: now,\n duration: NOTIFY_DURATION,\n });\n\n if (this.notifyMessages.length > MAX_NOTIFY_MESSAGES) {\n this.notifyMessages.shift();\n }\n }\n\n // Additional methods for cgame API\n setCenterPrint(text: string, now: number) {\n this.centerPrintMsg = {\n text,\n startTime: now,\n duration: CENTER_PRINT_DURATION,\n };\n }\n\n addNotification(text: string, is_chat: boolean, now: number) {\n this.notifyMessages.push({\n text,\n startTime: now,\n duration: NOTIFY_DURATION,\n });\n\n if (this.notifyMessages.length > MAX_NOTIFY_MESSAGES) {\n this.notifyMessages.shift();\n }\n }\n\n clearNotifications() {\n this.notifyMessages = [];\n }\n\n clearCenterPrint() {\n this.centerPrintMsg = null;\n }\n\n drawCenterPrint(cgi: CGameImport, now: number, layout: ReturnType<typeof getHudLayout>) {\n if (!this.centerPrintMsg) return;\n\n if (now > this.centerPrintMsg.startTime + this.centerPrintMsg.duration) {\n this.centerPrintMsg = null;\n return;\n }\n\n // Draw centered text\n const y = layout.CENTER_PRINT_Y;\n\n cgi.SCR_DrawCenterString(y, this.centerPrintMsg.text);\n }\n\n drawNotifications(cgi: CGameImport, now: number) {\n // Remove expired messages\n while (this.notifyMessages.length > 0 && now > this.notifyMessages[0].startTime + this.notifyMessages[0].duration) {\n this.notifyMessages.shift();\n }\n\n let y = 10; // Start near top-left\n for (const msg of this.notifyMessages) {\n cgi.SCR_DrawFontString(10, y, msg.text); // Use SCR_DrawFontString instead of drawString\n y += cgi.SCR_FontLineHeight();\n }\n }\n}\n","import { CGameImport } from '../types.js';\n\ninterface Subtitle {\n text: string;\n startTime: number;\n duration: number;\n}\n\nconst SUBTITLE_DURATION = 3000;\n\nexport class SubtitleSystem {\n private subtitle: Subtitle | null = null;\n\n addSubtitle(text: string, now: number) {\n this.subtitle = {\n text,\n startTime: now,\n duration: SUBTITLE_DURATION,\n };\n }\n\n drawSubtitles(cgi: CGameImport, now: number) {\n if (!this.subtitle) {\n return;\n }\n\n if (now > this.subtitle.startTime + this.subtitle.duration) {\n this.subtitle = null;\n return;\n }\n\n // Draw centered text at the bottom of the screen\n // We assume 240 is roughly 480/2 or similar scale, but typically CGame uses virtual coordinates.\n // If SCR_DrawCenterString uses virtual coords (usually based on 320x240 or similar),\n // we need to know the virtual screen height.\n // However, existing SCR_DrawCenterString likely handles centering horizontally.\n // We just need a Y coordinate.\n // In original Q2, HUD is drawn in a virtual 320x240 space usually, or scaled.\n // Let's assume SCR_DrawCenterString takes a Y coordinate in virtual space.\n // Typically bottom of screen.\n\n // For now, let's try a reasonable offset from bottom.\n // If standard Q2 res is 320x240, bottom is 240.\n const y = 200;\n\n cgi.SCR_DrawCenterString(y, this.subtitle.text);\n }\n}\n","import { CGameImport } from '../types.js';\nimport { PlayerState } from '@quake2ts/shared';\n\nexport const Draw_Blends = (cgi: CGameImport, ps: PlayerState, width: number, height: number) => {\n if (!ps.blend) return;\n\n const [r, g, b, a] = ps.blend;\n\n if (a > 0) {\n // Use SCR_DrawColorPic with a white pixel/texture stretched?\n // Or cgi needs a fill rect function.\n // SCR_DrawPic usually takes a pic.\n // Rerelease might use a specific blend function or just a 1x1 white texture scaled up.\n // Assuming cgi can draw colored quads if we register a \"white\" texture or similar.\n // For now, let's assume we can draw a colored rectangle if we had a white texture.\n\n // Since we don't have a fillRect in CGameImport, we might need to add it or use a registered texture.\n // Let's assume for now we skip or need to register a 'pics/white.pcx' or similar if it existed.\n // A common trick is to use any opaque texture and tint it, but that shows the texture.\n\n // Let's defer this or add a \"DrawFill\" to CGameImport if strictly needed,\n // OR standard Q2 just uses the poly drawing which isn't exposed yet.\n // Actually, Q2 V_CalcBlend handles this by setting palette/gamma or drawing a full screen poly.\n\n // For this port, we likely want a SCR_DrawFill calls.\n // Let's add SCR_DrawFill to CGameImport in types.ts in next step if it's missing.\n // Checking types.ts... it has SCR_DrawChar, SCR_DrawPic... no DrawFill.\n\n // I'll leave it commented/TODO for now or assume a 'white' pic is available.\n // cgi.SCR_DrawColorPic(0, 0, whitePic, {x:r, y:g, z:b}, a);\n }\n};\n","import { CGameImport } from '../types.js';\nimport { PlayerState } from '@quake2ts/shared';\nimport { iconPics } from './icons.js'; // Reuse loaded icons\n\nexport const Draw_Pickup = (cgi: CGameImport, ps: PlayerState, width: number, height: number) => {\n if (!ps.pickupIcon) return;\n\n const icon = iconPics.get(ps.pickupIcon);\n if (icon) {\n const size = cgi.Draw_GetPicSize(icon);\n const x = width - size.width - 10;\n const y = height - size.height - 10;\n cgi.SCR_DrawPic(x, y, icon);\n }\n};\n","import { CGameImport } from '../types.js';\n\nexport const Draw_Number = (cgi: CGameImport, x: number, y: number, value: number, pics: readonly unknown[], width: number, color?: [number, number, number, number]) => {\n const s = Math.abs(value).toString();\n for (let i = 0; i < s.length; i++) {\n const digit = parseInt(s[i]);\n const pic = pics[digit];\n if (pic) {\n if (color) {\n // cgi expects color as Vec3 (x,y,z) and alpha separate.\n // Assuming color is [r, g, b, a]\n cgi.SCR_DrawColorPic(x + i * width, y, pic, { x: color[0], y: color[1], z: color[2] }, color[3]);\n } else {\n cgi.SCR_DrawPic(x + i * width, y, pic);\n }\n }\n }\n};\n","import { CGameImport } from '../types.js';\nimport { Draw_Number } from './numbers.js';\nimport { getHudLayout } from './layout.js';\nimport { PlayerState, PlayerStat, ConfigStringIndex } from '@quake2ts/shared';\n\nlet colorblindMode = false;\n\nexport const Set_ColorblindMode = (enabled: boolean) => {\n colorblindMode = enabled;\n};\n\n/**\n * Draws the status bar (health, armor, ammo, icons) using ps.stats.\n *\n * NOTE: This implementation relies on the server correctly populating ps.stats\n * (STAT_HEALTH, STAT_ARMOR, STAT_AMMO, etc.) and valid configstring mappings\n * for icons (STAT_SELECTED_ICON, STAT_ARMOR_ICON, etc.).\n *\n * If ps.stats is not yet populated by the server (or is empty), the HUD will\n * display zeros or nothing. This is expected behavior during the migration phase.\n */\nexport const Draw_StatusBar = (\n cgi: CGameImport,\n ps: PlayerState,\n hudNumberPics: readonly unknown[],\n numberWidth: number,\n timeMs: number,\n layout: ReturnType<typeof getHudLayout>\n) => {\n // Stat Indices\n const health = ps.stats[PlayerStat.STAT_HEALTH] || 0;\n const armor = ps.stats[PlayerStat.STAT_ARMOR] || 0;\n // STAT_AMMO is no longer packed, it's just the integer count of the current ammo.\n const ammo = ps.stats[PlayerStat.STAT_AMMO] || 0;\n\n // Icon Indices (into ConfigStrings or predefined map)\n const armorIconIdx = ps.stats[PlayerStat.STAT_ARMOR_ICON] || 0;\n // const ammoIconIdx = ps.stats[PlayerStat.STAT_AMMO_ICON] || 0; // Unused in standard Q2 HUD?\n\n // Draw Health\n let healthColor: [number, number, number, number] | undefined = undefined;\n\n if (health <= 25) {\n if (colorblindMode) {\n // Use Blue/Cyan for low health in colorblind mode instead of Red\n healthColor = [0.2, 0.6, 1, 1];\n } else {\n healthColor = [1, 0, 0, 1]; // Red for low health\n }\n }\n\n if (hudNumberPics.length > 0) {\n Draw_Number(cgi, layout.HEALTH_X, layout.HEALTH_Y, health, hudNumberPics, numberWidth, healthColor);\n Draw_Number(cgi, layout.ARMOR_X, layout.ARMOR_Y, armor, hudNumberPics, numberWidth);\n Draw_Number(cgi, layout.AMMO_X, layout.AMMO_Y, ammo, hudNumberPics, numberWidth);\n }\n\n // Draw Armor Icon\n if (armorIconIdx > 0) {\n const iconName = cgi.get_configstring(ConfigStringIndex.Images + armorIconIdx);\n if (iconName) {\n const icon = cgi.Draw_RegisterPic(iconName);\n if (icon) {\n cgi.SCR_DrawPic(layout.ARMOR_X - 24, layout.ARMOR_Y - 2, icon);\n }\n }\n }\n\n // Draw Weapon Icon\n // Uses STAT_SELECTED_ICON\n if (ps.pickupIcon) {\n // Fallback to legacy string field if present, helpful for transition\n const icon = cgi.Draw_RegisterPic(ps.pickupIcon);\n if (icon) {\n cgi.SCR_DrawPic(layout.WEAPON_ICON_X, layout.WEAPON_ICON_Y, icon);\n }\n } else {\n // Standard Q2 path via STAT_SELECTED_ICON\n const selectedIconIdx = ps.stats[PlayerStat.STAT_SELECTED_ICON] || 0;\n if (selectedIconIdx > 0) {\n const iconName = cgi.get_configstring(ConfigStringIndex.Images + selectedIconIdx);\n if (iconName) {\n const icon = cgi.Draw_RegisterPic(iconName);\n if (icon) {\n cgi.SCR_DrawPic(layout.WEAPON_ICON_X, layout.WEAPON_ICON_Y, icon);\n }\n }\n }\n }\n\n // Draw Keys\n // Rerelease/Q2 uses STAT_LAYOUTS to determine if inventory/keys overlay is shown.\n // But for the persistent key icons on the HUD (Q2TS specific feature?), we might need logic.\n // Standard Q2 doesn't show key icons on the main HUD, only in inventory.\n // If we want to keep Q2TS specific key icons, we need to know which keys we have.\n // Since we don't have the inventory set in ps.stats easily (unless packed),\n // we might lose this feature until we implement a \"Key Stat\" or read inventory bits.\n //\n // For now, we omit the key drawing if we don't have the data, matching standard Q2 behavior.\n\n // Draw Powerups\n // Handled by Draw_Blends or STAT_TIMER logic usually.\n};\n","// Dynamic Layout Scaling\nconst REFERENCE_WIDTH = 640;\nconst REFERENCE_HEIGHT = 480;\n\nexport const getHudLayout = (width: number, height: number) => {\n // Determine scale factor - usually based on height to preserve aspect ratio logic or just scale uniform\n // Quake 2 typically scales 2D elements.\n const scaleX = width / REFERENCE_WIDTH;\n const scaleY = height / REFERENCE_HEIGHT;\n const scale = Math.min(scaleX, scaleY); // Uniform scaling\n\n // Or we can just center the 640x480 rect?\n // Modern approach: Scale UI to fit, or anchor to edges.\n // Let's implement edge anchoring logic relative to 640x480 coordinates.\n\n // Original constants (approximate):\n // HEALTH_X: 100, HEALTH_Y: 450\n // ARMOR_X: 200, ARMOR_Y: 450\n // AMMO_X: 540, AMMO_Y: 450\n // CENTER_PRINT: Center screen\n // WEAPON_ICON: Bottom left\n // POWERUP: Bottom right?\n\n // We'll return scaled coordinates.\n // For bottom elements, we should anchor to bottom.\n\n return {\n // Status bar numbers - Anchored Bottom-Left / Center / Right\n HEALTH_X: 100 * scale,\n HEALTH_Y: height - (REFERENCE_HEIGHT - 450) * scale,\n\n ARMOR_X: 200 * scale,\n ARMOR_Y: height - (REFERENCE_HEIGHT - 450) * scale,\n\n AMMO_X: width - (REFERENCE_WIDTH - 540) * scale, // Anchor right? 540 is near right (640)\n AMMO_Y: height - (REFERENCE_HEIGHT - 450) * scale,\n\n // Center print messages - Center\n CENTER_PRINT_X: width / 2,\n CENTER_PRINT_Y: 100 * scale, // Top anchor\n\n // Weapon and powerup icons\n WEAPON_ICON_X: 10 * scale,\n WEAPON_ICON_Y: height - (REFERENCE_HEIGHT - 450) * scale,\n\n POWERUP_X: width - (REFERENCE_WIDTH - 610) * scale,\n POWERUP_Y: height - (REFERENCE_HEIGHT - 450) * scale,\n\n scale: scale\n };\n};\n\n// Backward compatibility (deprecated, but useful for initial refactor)\nexport const HUD_LAYOUT = {\n HEALTH_X: 100,\n HEALTH_Y: 450,\n ARMOR_X: 200,\n ARMOR_Y: 450,\n AMMO_X: 540,\n AMMO_Y: 450,\n CENTER_PRINT_X: 320,\n CENTER_PRINT_Y: 100,\n WEAPON_ICON_X: 10,\n WEAPON_ICON_Y: 450,\n POWERUP_X: 610,\n POWERUP_Y: 450,\n};\n","/**\n * CGame HUD Screen Drawing\n * Reference: rerelease/cg_screen.cpp\n *\n * This module handles all HUD rendering for the cgame package, including:\n * - Status bar (health, armor, ammo)\n * - Crosshair\n * - Damage indicators\n * - Pickup notifications\n * - Messages and center print\n * - Subtitles\n */\n\nimport type { PlayerState } from '@quake2ts/shared';\nimport type { CGameImport } from './types.js';\n\n// HUD component imports\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 { SubtitleSystem } from './hud/subtitles.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\n// Module-level state\nlet cgi: CGameImport | null = null;\nconst hudNumberPics: unknown[] = []; // Will hold pic handles from cgi.Draw_RegisterPic()\nlet numberWidth = 0;\n\n// Message and subtitle systems\nconst messageSystem = new MessageSystem();\nconst subtitleSystem = new SubtitleSystem();\n\n/**\n * Initialize the CGame screen module with import functions.\n * Reference: rerelease/cg_screen.cpp InitCGame()\n */\nexport function CG_InitScreen(imports: CGameImport): void {\n cgi = imports;\n}\n\n/**\n * Precache all HUD images.\n * Reference: rerelease/cg_screen.cpp:1689 (TouchPics)\n *\n * This is called during level load to register all required HUD assets.\n */\nexport function CG_TouchPics(): void {\n if (!cgi) return;\n\n // Load HUD number pics\n hudNumberPics.length = 0;\n for (let i = 0; i < 10; i++) {\n try {\n const pic = cgi.Draw_RegisterPic(`pics/hud/num_${i}.pcx`);\n hudNumberPics.push(pic);\n if (i === 0) {\n const size = cgi.Draw_GetPicSize(pic);\n numberWidth = size.width;\n }\n } catch (e) {\n cgi.Com_Print(`Warning: Failed to load HUD image: pics/hud/num_${i}.pcx\\n`);\n }\n }\n\n Init_Crosshair(cgi);\n Init_Icons(cgi);\n Init_Damage(cgi);\n}\n\n/**\n * Main HUD drawing function.\n * Reference: rerelease/cg_screen.cpp CG_DrawHUD()\n *\n * Called each frame by the client to render the HUD overlay.\n *\n * @param isplit - Split-screen index (0 for single player)\n * @param data - Additional HUD data (unused in initial implementation)\n * @param hud_vrect - Virtual HUD rectangle (screen coordinates)\n * @param hud_safe - Safe area rectangle (for overscan)\n * @param scale - HUD scale factor\n * @param playernum - Player number\n * @param ps - Current player state\n */\nexport function CG_DrawHUD(\n isplit: number,\n data: unknown,\n hud_vrect: { x: number; y: number; width: number; height: number },\n hud_safe: { x: number; y: number; width: number; height: number },\n scale: number,\n playernum: number,\n ps: PlayerState\n): void {\n if (!cgi) {\n console.error('CG_DrawHUD: cgame imports not initialized');\n return;\n }\n\n const timeMs = cgi.CL_ClientTime();\n const layout = getHudLayout(hud_vrect.width, hud_vrect.height);\n\n // Screen blends (damage, powerups)\n Draw_Blends(cgi, ps, hud_vrect.width, hud_vrect.height);\n\n // Status bar\n // Now directly using ps.stats via Draw_StatusBar\n Draw_StatusBar(cgi, ps, hudNumberPics, numberWidth, timeMs, layout);\n\n // Pickup messages\n Draw_Pickup(cgi, ps, hud_vrect.width, hud_vrect.height);\n\n // Damage indicators\n Draw_Damage(cgi, ps, hud_vrect.width, hud_vrect.height);\n\n // Center print (Legacy PS support)\n if (ps.centerPrint) {\n const lines = ps.centerPrint.split('\\n');\n let y = hud_vrect.height / 2 - (lines.length * 10); // Approximation\n for (const line of lines) {\n cgi.SCR_DrawCenterString(y, line);\n y += 16;\n }\n }\n\n // Message System (CenterPrint & Notifications)\n messageSystem.drawCenterPrint(cgi, timeMs, layout);\n messageSystem.drawNotifications(cgi, timeMs);\n\n // Subtitles\n subtitleSystem.drawSubtitles(cgi, timeMs);\n\n // Crosshair\n Draw_Crosshair(cgi, hud_vrect.width, hud_vrect.height);\n}\n\n/**\n * Get message system instance.\n * Used by parsing functions to add messages.\n */\nexport function CG_GetMessageSystem(): MessageSystem {\n return messageSystem;\n}\n\n/**\n * Get subtitle system instance.\n * Used by audio system to display subtitles.\n */\nexport function CG_GetSubtitleSystem(): SubtitleSystem {\n return subtitleSystem;\n}\n","import type { CGameImport } from './types.js';\nimport { ConfigStringIndex, MAX_MODELS, MAX_SOUNDS, MAX_IMAGES } from '@quake2ts/shared';\n\n/**\n * Parses a config string update and precaches assets if necessary.\n * Reference: rerelease/cg_main.cpp CL_ParseConfigString\n */\nexport function CG_ParseConfigString(cgi: CGameImport, i: number, s: string): void {\n if (i >= ConfigStringIndex.Models && i < ConfigStringIndex.Models + MAX_MODELS) {\n cgi.RegisterModel(s);\n } else if (i >= ConfigStringIndex.Sounds && i < ConfigStringIndex.Sounds + MAX_SOUNDS) {\n cgi.RegisterSound(s);\n } else if (i >= ConfigStringIndex.Images && i < ConfigStringIndex.Images + MAX_IMAGES) {\n cgi.Draw_RegisterPic(s);\n }\n}\n","/**\n * Common utilities\n * @module glMatrix\n */\n\n// Configuration Constants\nexport var EPSILON = 0.000001;\nexport var ARRAY_TYPE = typeof Float32Array !== \"undefined\" ? Float32Array : Array;\nexport var RANDOM = Math.random;\nexport var ANGLE_ORDER = \"zyx\";\n\n/**\n * Symmetric round\n * see https://www.npmjs.com/package/round-half-up-symmetric#user-content-detailed-background\n *\n * @param {Number} a value to round\n */\nexport function round(a) {\n if (a >= 0) return Math.round(a);\n return a % 0.5 === 0 ? Math.floor(a) : Math.round(a);\n}\n\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */\nexport function setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\nvar radian = 180 / Math.PI;\n\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\nexport function toRadian(a) {\n return a * degree;\n}\n\n/**\n * Convert Radian To Degree\n *\n * @param {Number} a Angle in Radians\n */\nexport function toDegree(a) {\n return a * radian;\n}\n\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @param {Number} tolerance Absolute or relative tolerance (default glMatrix.EPSILON)\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\nexport function equals(a, b) {\n var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EPSILON;\n return Math.abs(a - b) <= tolerance * Math.max(1, Math.abs(a), Math.abs(b));\n}","import * as glMatrix from \"./common.js\";\n\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n return out;\n}\n\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.sqrt(x * x + y * y + z * z);\n}\n\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n\n/**\n * symmetric round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */\nexport function round(out, a) {\n out[0] = glMatrix.round(a[0]);\n out[1] = glMatrix.round(a[1]);\n out[2] = glMatrix.round(a[2]);\n return out;\n}\n\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.sqrt(x * x + y * y + z * z);\n}\n\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n\n/**\n * Performs a spherical linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function slerp(out, a, b, t) {\n var angle = Math.acos(Math.min(Math.max(dot(a, b), -1), 1));\n var sinTotal = Math.sin(angle);\n var ratioA = Math.sin((1 - t) * angle) / sinTotal;\n var ratioB = Math.sin(t * angle) / sinTotal;\n out[0] = ratioA * a[0] + ratioB * b[0];\n out[1] = ratioA * a[1] + ratioB * b[1];\n out[2] = ratioA * a[2] + ratioB * b[2];\n return out;\n}\n\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned\n * @returns {vec3} out\n */\nexport function random(out, scale) {\n scale = scale === undefined ? 1.0 : scale;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q normalized quaternion to transform with\n * @returns {vec3} out\n */\nexport function transformQuat(out, a, q) {\n // Fast Vector Rotation using Quaternions by Robert Eisele\n // https://raw.org/proof/vector-rotation-using-quaternions/\n\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var vx = a[0],\n vy = a[1],\n vz = a[2];\n\n // t = q x v\n var tx = qy * vz - qz * vy;\n var ty = qz * vx - qx * vz;\n var tz = qx * vy - qy * vx;\n\n // t = 2t\n tx = tx + tx;\n ty = ty + ty;\n tz = tz + tz;\n\n // v + w t + q x t\n out[0] = vx + qw * tx + qy * tz - qz * ty;\n out[1] = vy + qw * ty + qz * tx - qx * tz;\n out[2] = vz + qw * tz + qx * ty - qy * tx;\n return out;\n}\n\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = [];\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad);\n\n //translate to correct position\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = [];\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad);\n\n //translate to correct position\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = [];\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2];\n\n //translate to correct position\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag = Math.sqrt((ax * ax + ay * ay + az * az) * (bx * bx + by * by + bz * bz)),\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\nexport var sub = subtract;\n\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\nexport var mul = multiply;\n\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\nexport var div = divide;\n\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\nexport var dist = distance;\n\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\nexport var sqrDist = squaredDistance;\n\n/**\n * Alias for {@link vec3.length}\n * @function\n */\nexport var len = length;\n\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\nexport var sqrLen = squaredLength;\n\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n if (!stride) {\n stride = 3;\n }\n if (!offset) {\n offset = 0;\n }\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n return a;\n };\n}();","import { Camera } from '@quake2ts/engine';\nimport { ViewSample } from './effects.js';\nimport { vec3 } from 'gl-matrix';\nimport { Vec3 } from '@quake2ts/shared';\n\nconst toGlMatrixVec3 = (v: Vec3): vec3 => {\n return vec3.fromValues(v.x, v.y, v.z);\n};\n\nexport const updateCamera = (camera: Camera, viewSample: ViewSample) => {\n // Apply the view model effects to the camera\n camera.bobAngles = toGlMatrixVec3(viewSample.angles);\n camera.bobOffset = toGlMatrixVec3(viewSample.offset);\n};\n","import { ZERO_VEC3, angleVectors, clampViewAngles, dotVec3, hasPmFlag, PmFlag, type PmFlags, type Vec3 } from '@quake2ts/shared';\nimport type { PredictionState } from '../prediction/index.js';\n\nexport interface ViewEffectSettings {\n readonly runPitch: number;\n readonly runRoll: number;\n readonly bobUp: number;\n readonly bobPitch: number;\n readonly bobRoll: number;\n readonly maxBobHeight: number;\n readonly maxBobAngle: number;\n}\n\nconst DEFAULT_SETTINGS: ViewEffectSettings = {\n runPitch: 0.002,\n runRoll: 0.01,\n bobUp: 0.005,\n bobPitch: 0.002,\n bobRoll: 0.002,\n maxBobHeight: 6,\n maxBobAngle: 1.2,\n};\n\nexport interface ViewKick {\n readonly pitch: number;\n readonly roll: number;\n readonly durationMs: number;\n readonly origin?: Vec3; // Optional origin offset (weapon recoil)\n}\n\nexport interface ActiveKick extends ViewKick {\n remainingMs: number;\n}\n\nexport interface ViewSample {\n readonly angles: Vec3;\n readonly offset: Vec3;\n readonly bobCycle: number;\n readonly bobCycleRun: number;\n readonly bobFracSin: number;\n readonly xyspeed: number;\n}\n\nfunction clampViewOffset(offset: Vec3): Vec3 {\n return {\n x: Math.max(-14, Math.min(14, offset.x)),\n y: Math.max(-14, Math.min(14, offset.y)),\n z: Math.max(-22, Math.min(30, offset.z)),\n };\n}\n\nfunction computeBobMove(xyspeed: number, onGround: boolean, frameTimeMs: number): number {\n if (!onGround) return 0;\n\n if (xyspeed > 210) return frameTimeMs / 400;\n if (xyspeed > 100) return frameTimeMs / 800;\n return frameTimeMs / 1600;\n}\n\nfunction computeBobValues(\n previousBobTime: number,\n xyspeed: number,\n pmFlags: PmFlags,\n onGround: boolean,\n frameTimeMs: number,\n): { bobTime: number; bobCycle: number; bobCycleRun: number; bobFracSin: number } {\n if (xyspeed < 5) {\n return { bobTime: 0, bobCycle: 0, bobCycleRun: 0, bobFracSin: 0 };\n }\n\n const bobMove = computeBobMove(xyspeed, onGround, frameTimeMs);\n const bobTimeRun = previousBobTime + bobMove;\n const crouched = hasPmFlag(pmFlags, PmFlag.Ducked) && onGround;\n const bobTime = crouched ? bobTimeRun * 4 : bobTimeRun;\n\n return {\n bobTime: bobTimeRun,\n bobCycle: Math.floor(bobTime),\n bobCycleRun: Math.floor(bobTimeRun),\n bobFracSin: Math.abs(Math.sin(bobTime * Math.PI)),\n };\n}\n\nexport class ViewEffects {\n private readonly settings: ViewEffectSettings;\n private bobTime = 0;\n private bobCycle = 0;\n private bobCycleRun = 0;\n private bobFracSin = 0;\n private kick: ActiveKick | undefined;\n private lastSample: ViewSample | undefined;\n\n constructor(settings: Partial<ViewEffectSettings> = {}) {\n this.settings = { ...DEFAULT_SETTINGS, ...settings } satisfies ViewEffectSettings;\n }\n\n addKick(kick: ViewKick): void {\n if (kick.durationMs <= 0) return;\n this.kick = { ...kick, remainingMs: kick.durationMs } satisfies ActiveKick;\n }\n\n get last(): ViewSample | undefined {\n return this.lastSample;\n }\n\n sample(state: PredictionState, frameTimeMs: number): ViewSample {\n const { forward, right } = angleVectors(\n clampViewAngles({ pmFlags: state.pmFlags, cmdAngles: state.viewAngles, deltaAngles: state.deltaAngles ?? ZERO_VEC3 }).viewangles,\n );\n\n const xyspeed = Math.sqrt(state.velocity.x * state.velocity.x + state.velocity.y * state.velocity.y);\n const onGround = hasPmFlag(state.pmFlags, PmFlag.OnGround);\n\n const bobValues = computeBobValues(this.bobTime, xyspeed, state.pmFlags, onGround, frameTimeMs);\n this.bobTime = bobValues.bobTime;\n this.bobCycle = bobValues.bobCycle;\n this.bobCycleRun = bobValues.bobCycleRun;\n this.bobFracSin = bobValues.bobFracSin;\n\n // Velocity-based tilt\n let pitchTilt = dotVec3(state.velocity, forward) * this.settings.runPitch;\n\n const side = dotVec3(state.velocity, right);\n const sign = side < 0 ? -1 : 1;\n const absSide = Math.abs(side);\n\n let rollTilt = absSide * this.settings.runRoll;\n if (rollTilt > 2.0) {\n rollTilt = 2.0;\n }\n rollTilt *= sign;\n\n // Bob tilt\n let pitchDelta = this.bobFracSin * this.settings.bobPitch * xyspeed;\n let rollDelta = this.bobFracSin * this.settings.bobRoll * xyspeed;\n if (hasPmFlag(state.pmFlags, PmFlag.Ducked) && onGround) {\n pitchDelta *= 6;\n rollDelta *= 6;\n }\n\n pitchTilt += Math.min(pitchDelta, this.settings.maxBobAngle);\n rollDelta = Math.min(rollDelta, this.settings.maxBobAngle);\n if (this.bobCycle & 1) rollDelta = -rollDelta;\n rollTilt += rollDelta;\n\n // Bob height\n const bobHeight = Math.min(this.bobFracSin * xyspeed * this.settings.bobUp, this.settings.maxBobHeight);\n\n let kickPitch = 0;\n let kickRoll = 0;\n let kickX = 0;\n let kickY = 0;\n let kickZ = 0;\n\n // Apply active kick\n // Reference: rerelease/p_view.cpp CalcKickOffset\n // Matches the \"interpolation\" requested in the task\n if (this.kick && this.kick.remainingMs > 0) {\n // ratio goes from 1.0 (start) to 0.0 (end)\n const ratio = Math.max(0, Math.min(1, this.kick.remainingMs / this.kick.durationMs));\n\n kickPitch += ratio * this.kick.pitch;\n kickRoll += ratio * this.kick.roll;\n\n if (this.kick.origin) {\n kickX += ratio * this.kick.origin.x;\n kickY += ratio * this.kick.origin.y;\n kickZ += ratio * this.kick.origin.z;\n }\n\n this.kick.remainingMs = Math.max(0, this.kick.remainingMs - frameTimeMs);\n if (this.kick.remainingMs === 0) this.kick = undefined;\n }\n\n const angles: Vec3 = { x: pitchTilt + kickPitch, y: 0, z: rollTilt + kickRoll };\n const offset: Vec3 = { x: kickX, y: kickY, z: bobHeight + kickZ };\n\n const sample: ViewSample = {\n angles,\n offset: clampViewOffset(offset),\n bobCycle: this.bobCycle,\n bobCycleRun: this.bobCycleRun,\n bobFracSin: this.bobFracSin,\n xyspeed,\n } satisfies ViewSample;\n this.lastSample = sample;\n return sample;\n }\n}\n","import {\n addVec3,\n subtractVec3,\n lengthVec3,\n angleMod,\n scaleVec3,\n type Vec3,\n buildAirGroundWish,\n buildWaterWish,\n clampViewAngles,\n hasPmFlag,\n PmFlag,\n PmType,\n WaterLevel,\n type PmFlags,\n type UserCommand,\n PlayerState,\n applyPmove,\n PmoveCmd,\n PmoveTraceFn\n} from '@quake2ts/shared';\nimport type { GameFrameResult } from '@quake2ts/engine';\nimport type { PlayerClient } from '@quake2ts/game';\n\n\n// PredictionState extends PlayerState with fields needed for physics simulation\n// that might not be in the base PlayerState interface yet or are client-side specific.\nexport interface PredictionState extends PlayerState {\n deltaAngles?: Vec3;\n pmFlags: PmFlags;\n pmType: PmType;\n gravity?: number;\n waterLevel: WaterLevel;\n\n // Client-side fields for HUD/rendering, added to satisfy client package usage\n client?: PlayerClient;\n health?: number;\n armor?: number;\n ammo?: number;\n}\n\nexport interface PredictionSettings {\n readonly pmFriction: number;\n readonly pmStopSpeed: number;\n readonly pmAccelerate: number;\n readonly pmAirAccelerate: number;\n readonly pmWaterAccelerate: number;\n readonly pmWaterFriction: number;\n readonly pmMaxSpeed: number;\n readonly pmDuckSpeed: number;\n readonly pmWaterSpeed: number;\n readonly groundIsSlick: boolean;\n readonly errorTolerance: number;\n readonly errorSnapThreshold: number;\n}\n\nconst DEFAULTS: PredictionSettings = {\n pmFriction: 6,\n pmStopSpeed: 100,\n pmAccelerate: 10,\n pmAirAccelerate: 1,\n pmWaterAccelerate: 4,\n pmWaterFriction: 1,\n pmMaxSpeed: 300,\n pmDuckSpeed: 100,\n pmWaterSpeed: 400,\n groundIsSlick: false,\n errorTolerance: 0.1,\n errorSnapThreshold: 10,\n};\n\nconst DEFAULT_GRAVITY = 800;\nconst ZERO_VEC3: Vec3 = { x: 0, y: 0, z: 0 };\nconst MSEC_MAX = 250;\nconst CMD_BACKUP = 64;\n\nexport function defaultPredictionState(): PredictionState {\n return {\n origin: ZERO_VEC3,\n velocity: ZERO_VEC3,\n viewAngles: ZERO_VEC3,\n onGround: false,\n\n // Physics fields\n pmFlags: PmFlag.OnGround,\n pmType: PmType.Normal,\n waterLevel: WaterLevel.None,\n gravity: DEFAULT_GRAVITY,\n deltaAngles: ZERO_VEC3,\n\n // Bounds\n mins: { x: -16, y: -16, z: -24 },\n maxs: { x: 16, y: 16, z: 32 },\n\n // Visual/Game fields\n damageAlpha: 0,\n damageIndicators: [],\n blend: [0, 0, 0, 0],\n stats: [],\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\n pm_time: 0,\n pm_type: PmType.Normal,\n pm_flags: PmFlag.OnGround,\n gun_frame: 0,\n rdflags: 0,\n fov: 90,\n renderfx: 0,\n\n // Optional fields\n pickupIcon: undefined,\n centerPrint: undefined,\n notify: undefined,\n client: undefined,\n health: 0,\n armor: 0,\n ammo: 0\n };\n}\n\nfunction normalizeState(state: PredictionState | undefined): PredictionState {\n if (!state) return defaultPredictionState();\n\n return {\n ...defaultPredictionState(),\n ...state,\n origin: { ...state.origin },\n velocity: { ...state.velocity },\n viewAngles: { ...state.viewAngles },\n deltaAngles: state.deltaAngles ? { ...state.deltaAngles } : ZERO_VEC3,\n blend: state.blend ? [...state.blend] : [0, 0, 0, 0],\n damageIndicators: state.damageIndicators ? [...state.damageIndicators] : [],\n stats: state.stats ? [...state.stats] : [],\n } satisfies PredictionState;\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 let delta = angleMod(b - a);\n if (delta > 180) {\n delta -= 360;\n }\n return angleMod(a + delta * t);\n}\n\nexport function interpolatePredictionState(\n previous: PredictionState,\n latest: PredictionState,\n alpha: number,\n): PredictionState {\n const clamped = Math.max(0, Math.min(alpha, 1));\n\n return {\n ...latest, // Default to latest for discrete fields\n origin: {\n x: lerp(previous.origin.x, latest.origin.x, clamped),\n y: lerp(previous.origin.y, latest.origin.y, clamped),\n z: lerp(previous.origin.z, latest.origin.z, clamped),\n },\n velocity: {\n x: lerp(previous.velocity.x, latest.velocity.x, clamped),\n y: lerp(previous.velocity.y, latest.velocity.y, clamped),\n z: lerp(previous.velocity.z, latest.velocity.z, clamped),\n },\n viewAngles: {\n x: lerpAngle(previous.viewAngles.x, latest.viewAngles.x, clamped),\n y: lerpAngle(previous.viewAngles.y, latest.viewAngles.y, clamped),\n z: lerpAngle(previous.viewAngles.z, latest.viewAngles.z, clamped),\n },\n damageAlpha: lerp(previous.damageAlpha, latest.damageAlpha, clamped),\n blend: [\n lerp(previous.blend[0], latest.blend[0], clamped),\n lerp(previous.blend[1], latest.blend[1], clamped),\n lerp(previous.blend[2], latest.blend[2], clamped),\n lerp(previous.blend[3], latest.blend[3], clamped),\n ],\n // Interpolate health/armor for smooth HUD? Usually step.\n health: lerp(previous.health || 0, latest.health || 0, clamped),\n armor: lerp(previous.armor || 0, latest.armor || 0, clamped),\n ammo: lerp(previous.ammo || 0, latest.ammo || 0, clamped)\n } satisfies PredictionState;\n}\n\nfunction simulateCommand(\n state: PredictionState,\n cmd: UserCommand,\n settings: PredictionSettings,\n trace: PmoveTraceFn,\n pointContents: (p: Vec3) => number\n): PredictionState {\n // Convert UserCommand to PmoveCmd\n const pmoveCmd: PmoveCmd = {\n forwardmove: cmd.forwardmove,\n sidemove: cmd.sidemove,\n upmove: cmd.upmove,\n buttons: cmd.buttons,\n angles: cmd.angles // Added missing property\n };\n\n // Delegate physics to shared applyPmove\n // Note: applyPmove returns a NEW PlayerState, it does not mutate.\n // We must ensure that PredictionState specific fields are preserved if they are not part of PlayerState\n // But since PredictionState extends PlayerState and applyPmove spreads ...state, we should get them back.\n\n const newState = applyPmove(state, pmoveCmd, trace, pointContents);\n\n // applyPmove calculates physics.\n // However, applyPmove also handles view angle clamping?\n // shared/pmove/apply.ts imports categorizePosition, checkWater etc.\n\n // One detail: applyPmove uses the cmd to update viewAngles?\n // Looking at applyPmove in shared: it returns `...newState` which comes from `...state`\n // But `applyPmove` doesn't seem to modify viewAngles directly unless it's implicit?\n // Wait, applyPmove handles origin and velocity.\n // View angle changes (like from mouse input) are usually pre-applied to the command angles.\n // But physics might affect view angles? (Not usually, except maybe knockback?)\n\n // The original simulateCommand implementation clamped view angles.\n const { viewangles } = clampViewAngles({\n pmFlags: state.pmFlags,\n cmdAngles: cmd.angles,\n deltaAngles: state.deltaAngles ?? ZERO_VEC3,\n });\n\n return {\n ...newState,\n viewAngles: viewangles\n } as PredictionState;\n}\n\nexport class ClientPrediction {\n private readonly settings: PredictionSettings;\n private readonly trace: PmoveTraceFn;\n private readonly pointContents: (p: Vec3) => number;\n private enabled = true;\n private baseFrame: GameFrameResult<PredictionState> = {\n frame: 0,\n timeMs: 0,\n state: defaultPredictionState(),\n } satisfies GameFrameResult<PredictionState>;\n private commands: UserCommand[] = [];\n private predicted: PredictionState = defaultPredictionState();\n private predictionError: Vec3 = ZERO_VEC3;\n\n constructor(trace: PmoveTraceFn, pointContents: (p: Vec3) => number, settings: Partial<PredictionSettings> = {}) {\n this.settings = { ...DEFAULTS, ...settings } satisfies PredictionSettings;\n this.trace = trace;\n this.pointContents = pointContents;\n this.predicted = this.baseFrame.state ?? defaultPredictionState();\n }\n\n setPredictionEnabled(enabled: boolean): void {\n this.enabled = enabled;\n }\n\n setAuthoritative(frame: GameFrameResult<PredictionState>): PredictionState {\n const normalized = normalizeState(frame.state);\n\n if (frame.frame <= this.baseFrame.frame) {\n return this.predicted; // Ignore old or duplicate frames\n }\n\n if (this.enabled) {\n // Calculate prediction error before updating baseFrame\n // We need to know what we *thought* the state was at this frame.\n // Since we don't store history, we'll re-simulate from the OLD base frame up to this new frame's sequence.\n\n // 1. Find the command that matches the new frame's sequence (if we have it)\n // The new frame corresponds to state AFTER executing command with sequence = frame.frame\n\n let predictedAtFrame: PredictionState | undefined;\n\n // We can only check error if we have the commands to reproduce the state up to this point\n const relevantCommands = this.commands.filter(c => c.sequence <= frame.frame && c.sequence > this.baseFrame.frame);\n\n if (relevantCommands.length > 0 || this.baseFrame.frame === frame.frame) {\n let tempState = normalizeState(this.baseFrame.state);\n for (const cmd of relevantCommands) {\n tempState = simulateCommand(tempState, cmd, this.settings, this.trace, this.pointContents);\n }\n predictedAtFrame = tempState;\n }\n\n if (predictedAtFrame) {\n const error = subtractVec3(predictedAtFrame.origin, normalized.origin);\n const errorLen = lengthVec3(error);\n\n // If error is large (> errorSnapThreshold), snap immediately (reset error)\n // If error is small, add it to existing error to smooth out\n if (errorLen > this.settings.errorSnapThreshold) {\n this.predictionError = ZERO_VEC3;\n } else if (errorLen > this.settings.errorTolerance) {\n // Accumulate error? Or just set it?\n // Usually we set it, and then decay it in simulateCommand or frame update.\n // But wait, \"prediction error\" is usually added to the view position to keep the camera\n // where the client PREDICTED it was, then slowly slide it to the server position.\n // So if we predicted X, and server says X-5, we are at X-5 but we want to render at X-5+5 = X.\n // So error = predicted - server.\n this.predictionError = error;\n } else {\n this.predictionError = ZERO_VEC3;\n }\n } else {\n // Can't verify prediction, reset error\n this.predictionError = ZERO_VEC3;\n }\n } else {\n this.predictionError = ZERO_VEC3;\n }\n\n this.baseFrame = { ...frame, state: normalized };\n\n // Discard commands that have been acknowledged/processed by the server\n this.commands = this.commands.filter((cmd) => cmd.sequence > frame.frame);\n\n return this.recompute();\n }\n\n getPredictionError(): Vec3 {\n return this.predictionError;\n }\n\n // Decay error over time - usually called once per client frame\n decayError(frametime: number) {\n const len = lengthVec3(this.predictionError);\n if (len > 0) {\n const decay = len * 10 * frametime; // Decay speed\n const scale = Math.max(0, len - decay) / len;\n this.predictionError = scaleVec3(this.predictionError, scale);\n }\n }\n\n enqueueCommand(cmd: UserCommand): PredictionState {\n this.commands.push(cmd);\n if (this.commands.length > CMD_BACKUP) {\n this.commands.shift();\n }\n return this.recompute();\n }\n\n getCommand(sequence: number): UserCommand | undefined {\n return this.commands.find((c) => c.sequence === sequence);\n }\n\n getPredictedState(): PredictionState {\n return this.predicted;\n }\n\n private recompute(): PredictionState {\n let state = normalizeState(this.baseFrame.state);\n\n if (this.enabled) {\n for (const cmd of this.commands) {\n state = simulateCommand(state, cmd, this.settings, this.trace, this.pointContents);\n }\n }\n\n this.predicted = state;\n return state;\n }\n}\n","/**\n * CGame Module Entry Point\n * Reference: rerelease/cg_main.cpp\n *\n * This module provides the GetCGameAPI() function that returns the cgame_export_t\n * interface to the client engine.\n */\n\nimport type { CGameImport, CGameExport, PmoveInfo } from './types.js';\nimport { PlayerState, PlayerStat, Vec3, applyPmove, PmoveTraceResult, WEAPON_WHEEL_ORDER, WEAPON_AMMO_MAP, G_GetAmmoStat, G_GetPowerupStat, PowerupId } from '@quake2ts/shared';\nimport { LayoutFlags } from '@quake2ts/shared';\nimport { CG_InitScreen, CG_TouchPics, CG_DrawHUD, CG_GetMessageSystem, CG_GetSubtitleSystem } from './screen.js';\nimport { CG_ParseConfigString } from './parse.js';\n\nexport type { CGameImport, CGameExport } from './types.js';\n\n// Re-export new modules\nexport * from './view/camera.js';\nexport * from './view/effects.js';\nexport * from './prediction/index.js';\n\n// Module-level state\nlet cgi: CGameImport | null = null;\nlet cg_predict: { value: number } | null = null;\nlet cg_showmiss: { value: number } | null = null;\n\n/**\n * Initialize the CGame module.\n * Reference: rerelease/cg_main.cpp InitCGame()\n */\nfunction Init(): void {\n if (!cgi) {\n console.error('CGame Init: cgame imports not set');\n return;\n }\n\n cgi.Com_Print('===== CGame Initialization =====\\n');\n\n // Initialize screen/HUD module\n CG_InitScreen(cgi);\n\n // Register CVars\n cg_predict = cgi.Cvar_Get('cg_predict', '1', 0);\n cg_showmiss = cgi.Cvar_Get('cg_showmiss', '0', 0);\n\n cgi.Com_Print('CGame initialized\\n');\n}\n\n/**\n * Shutdown the CGame module.\n * Reference: rerelease/cg_main.cpp ShutdownCGame()\n */\nfunction Shutdown(): void {\n if (cgi) {\n cgi.Com_Print('CGame shutdown\\n');\n }\n cgi = null;\n}\n\n/**\n * Main HUD drawing function (wrapper for CG_DrawHUD).\n * Reference: rerelease/cg_screen.cpp CG_DrawHUD()\n */\nfunction DrawHUD(\n isplit: number,\n data: unknown,\n hud_vrect: { x: number; y: number; width: number; height: number },\n hud_safe: { x: number; y: number; width: number; height: number },\n scale: number,\n playernum: number,\n ps: PlayerState\n): void {\n CG_DrawHUD(isplit, data, hud_vrect, hud_safe, scale, playernum, ps);\n}\n\n/**\n * Precache all HUD images.\n * Reference: rerelease/cg_screen.cpp TouchPics()\n */\nfunction TouchPics(): void {\n CG_TouchPics();\n}\n\n/**\n * Get layout flags for current player state.\n * Reference: rerelease/cg_screen.cpp\n */\nfunction GetLayoutFlags(ps: PlayerState): LayoutFlags {\n // TODO: Implement proper layout flag calculation\n // Based on inventory state, help state, intermission, etc.\n return 0 as LayoutFlags; // No flags set by default\n}\n\n/**\n * Placeholder stubs for remaining CGameExport functions.\n * These will be implemented as needed.\n */\n\nfunction GetActiveWeaponWheelWeapon(ps: PlayerState): number {\n return ps.stats[PlayerStat.STAT_ACTIVE_WHEEL_WEAPON] ?? 0;\n}\n\nfunction GetOwnedWeaponWheelWeapons(ps: PlayerState): number[] {\n const owned: number[] = [];\n const bits1 = ps.stats[PlayerStat.STAT_WEAPONS_OWNED_1] || 0;\n const bits2 = ps.stats[PlayerStat.STAT_WEAPONS_OWNED_2] || 0;\n const fullBits = bits1 | (bits2 << 16);\n\n for (let i = 0; i < WEAPON_WHEEL_ORDER.length; i++) {\n if (fullBits & (1 << i)) {\n owned.push(i);\n }\n }\n return owned;\n}\n\nfunction GetWeaponWheelAmmoCount(ps: PlayerState, weapon: number): number {\n if (weapon < 0 || weapon >= WEAPON_WHEEL_ORDER.length) {\n return 0;\n }\n const weaponId = WEAPON_WHEEL_ORDER[weapon];\n const ammoType = WEAPON_AMMO_MAP[weaponId];\n if (ammoType === null) {\n return -1; // Infinite/No ammo\n }\n return G_GetAmmoStat(ps.stats, ammoType);\n}\n\nfunction GetPowerupWheelCount(ps: PlayerState): number {\n let count = 0;\n // Iterate over all known powerups to check if they are active\n const powerups = Object.values(PowerupId);\n for (const id of powerups) {\n if (G_GetPowerupStat(ps.stats, id) > 0) {\n count++;\n }\n }\n return count;\n}\n\nfunction GetHitMarkerDamage(ps: PlayerState): number {\n return ps.stats[PlayerStat.STAT_HIT_MARKER] ?? 0;\n}\n\n/**\n * Pmove implementation for client-side prediction.\n * Calls the shared Pmove() function (applyPmove in TS port).\n *\n * @param pmove - PmoveInfo structure (similar to pmove_t)\n */\nfunction Pmove(pmove: unknown): void {\n const pm = pmove as PmoveInfo;\n if (!pm || !pm.s || !pm.cmd || !cgi) {\n return;\n }\n\n // If prediction is disabled, do nothing (server state prevails)\n if (cg_predict && cg_predict.value === 0) {\n return;\n }\n\n // Adapter for PmoveTraceFn using CGameImport trace\n const traceAdapter = (start: Vec3, end: Vec3, mins?: Vec3, maxs?: Vec3): PmoveTraceResult => {\n // Shared PmoveTraceFn uses optional mins/maxs, CGameImport expects them.\n // If not provided, assume point trace (0,0,0)\n const zero: Vec3 = { x: 0, y: 0, z: 0 };\n return cgi!.PM_Trace(\n start,\n end,\n mins || zero,\n maxs || zero\n );\n };\n\n // Adapter for PmovePointContentsFn using CGameImport trace\n const pointContentsAdapter = (point: Vec3): number => {\n const zero: Vec3 = { x: 0, y: 0, z: 0 };\n // Perform a point trace to get contents\n const tr = cgi!.PM_Trace(point, point, zero, zero);\n return tr.contents || 0;\n };\n\n // Check for prediction errors if enabled\n // Note: The actual prediction logic (reconciliation) happens in ClientPrediction class which\n // drives the client-side state update. However, Pmove here is called by the client engine\n // to execute the *current* frame's prediction during the client loop.\n\n // In Quake 2, CL_PredictMovement calls Pmove repeatedly.\n // The client prediction class we built (ClientPrediction) encapsulates state management.\n // Ideally, the client engine should use ClientPrediction to get the state to render.\n\n // But keeping with the Pmove API:\n // This function simply advances the physics for one command.\n\n // Call shared Pmove implementation\n // This returns a NEW PlayerState, so we must update pm.s\n const newState = applyPmove(pm.s, pm.cmd, traceAdapter, pointContentsAdapter);\n\n // Update mutable state\n pm.s.origin = newState.origin;\n pm.s.velocity = newState.velocity;\n pm.s.onGround = newState.onGround;\n pm.s.waterLevel = newState.waterLevel;\n // applyPmove might update other fields in the future\n\n // If debug enabled, we might log something here, but Pmove is high frequency.\n // We defer logging to the reconciliation step in ClientPrediction.\n}\n\nfunction ParseConfigString(i: number, s: string): void {\n if (!cgi) return;\n CG_ParseConfigString(cgi, i, s);\n}\n\nfunction ParseCenterPrint(str: string, isplit: number, instant: boolean): void {\n if (!cgi) return;\n const messageSystem = CG_GetMessageSystem();\n // TODO: Parse layout strings and handle key bindings\n messageSystem.setCenterPrint(str, cgi.CL_ClientTime());\n}\n\nfunction NotifyMessage(isplit: number, msg: string, is_chat: boolean): void {\n if (!cgi) return;\n const messageSystem = CG_GetMessageSystem();\n messageSystem.addNotification(msg, is_chat, cgi.CL_ClientTime());\n}\n\nfunction ClearNotify(isplit: number): void {\n const messageSystem = CG_GetMessageSystem();\n messageSystem.clearNotifications();\n}\n\nfunction ClearCenterprint(isplit: number): void {\n const messageSystem = CG_GetMessageSystem();\n messageSystem.clearCenterPrint();\n}\n\nfunction ShowSubtitle(text: string, soundName: string): void {\n if (!cgi) return;\n const subtitleSystem = CG_GetSubtitleSystem();\n subtitleSystem.addSubtitle(text, cgi.CL_ClientTime());\n}\n\nfunction GetMonsterFlashOffset(id: number): Vec3 {\n return { x: 0, y: 0, z: 0 };\n}\n\nfunction GetExtension(name: string): unknown {\n return null;\n}\n\n/**\n * Main entry point for CGame module.\n * Reference: rerelease/cg_main.cpp GetCGameAPI()\n *\n * @param imports - Functions provided by the client engine\n * @returns CGame export interface\n */\nexport function GetCGameAPI(imports: CGameImport): CGameExport {\n cgi = imports;\n\n return {\n // Lifecycle\n Init,\n Shutdown,\n\n // Rendering\n DrawHUD,\n TouchPics,\n\n // Layout\n LayoutFlags: GetLayoutFlags,\n\n // Weapon wheel\n GetActiveWeaponWheelWeapon,\n GetOwnedWeaponWheelWeapons,\n GetWeaponWheelAmmoCount,\n GetPowerupWheelCount,\n\n // Hit markers\n GetHitMarkerDamage,\n\n // Prediction\n Pmove,\n\n // Parsing\n ParseConfigString,\n ParseCenterPrint,\n NotifyMessage,\n ShowSubtitle,\n\n // State management\n ClearNotify,\n ClearCenterprint,\n\n // Effects\n GetMonsterFlashOffset,\n\n // Extension\n GetExtension,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/hud/crosshair.ts","../src/hud/icons.ts","../src/hud/damage.ts","../src/hud/messages.ts","../src/hud/subtitles.ts","../src/hud/blends.ts","../src/hud/pickup.ts","../src/hud/numbers.ts","../src/hud/statusbar.ts","../src/hud/layout.ts","../src/screen.ts","../src/parse.ts","../../../node_modules/.pnpm/gl-matrix@3.4.4/node_modules/gl-matrix/esm/common.js","../../../node_modules/.pnpm/gl-matrix@3.4.4/node_modules/gl-matrix/esm/vec3.js","../src/view/camera.ts","../src/view/effects.ts","../src/prediction/index.ts","../src/index.ts"],"names":["cgi","angleVectors","dotVec3","angle","hudNumberPics","numberWidth","PlayerStat","ConfigStringIndex","scale","MAX_MODELS","MAX_SOUNDS","MAX_IMAGES","round","len","hasPmFlag","PmFlag","clampViewAngles","ZERO_VEC3","PmType","WaterLevel","lerp","angleMod","applyPmove","subtractVec3","lengthVec3","scaleVec3","WEAPON_WHEEL_ORDER","WEAPON_AMMO_MAP","G_GetAmmoStat","PowerupId","G_GetPowerupStat","zero","str","messageSystem","subtitleSystem"],"mappings":"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","file":"index.cjs","sourcesContent":["import { CGameImport } from '../types.js';\n\nlet crosshairPic: unknown | 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: (unknown | null)[] = [null, null, null];\n\nexport const Init_Crosshair = (cgi: CGameImport) => {\n for (let i = 0; i < CROSSHAIR_NAMES.length; i++) {\n const name = CROSSHAIR_NAMES[i];\n try {\n crosshairPics[i] = cgi.Draw_RegisterPic(`pics/${name}.pcx`);\n } catch (e) {\n if (i === 0) {\n try {\n crosshairPics[i] = cgi.Draw_RegisterPic('pics/crosshair.pcx');\n } catch (e2) {\n cgi.Com_Print('Failed to load crosshair image\\n');\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 = (cgi: CGameImport, width: number, height: number) => {\n if (crosshairEnabled && crosshairPic) {\n const size = cgi.Draw_GetPicSize(crosshairPic);\n const x = (width - size.width) / 2;\n const y = (height - size.height) / 2;\n // Draw with color\n cgi.SCR_DrawColorPic(x, y, crosshairPic, { x: crosshairColor[0], y: crosshairColor[1], z: crosshairColor[2] }, crosshairColor[3]);\n }\n};\n","import { CGameImport } from '../types.js';\n\n/**\n * Global map of loaded HUD icons.\n * This is imported and used by statusbar.ts for rendering.\n */\nexport const iconPics = new Map<string, unknown>();\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\n/**\n * Initialize and precache all HUD icon images.\n * Called during level load via CG_TouchPics().\n */\nexport const Init_Icons = (cgi: CGameImport) => {\n for (const name of ICON_NAMES) {\n try {\n const pic = cgi.Draw_RegisterPic(`pics/${name}.pcx`);\n iconPics.set(name, pic);\n } catch (e) {\n cgi.Com_Print(`Failed to load HUD image: pics/${name}.pcx\\n`);\n }\n }\n};\n","import { CGameImport } from '../types.js';\nimport { PlayerState, Vec3, dotVec3, angleVectors } from '@quake2ts/shared';\n\nconst damagePics = new Map<string, unknown>();\n\nconst DAMAGE_INDICATOR_NAMES = [\n 'd_left', 'd_right', 'd_up', 'd_down'\n];\n\nexport const Init_Damage = (cgi: CGameImport) => {\n for (const name of DAMAGE_INDICATOR_NAMES) {\n try {\n const pic = cgi.Draw_RegisterPic(`pics/${name}.pcx`);\n damagePics.set(name, pic);\n } catch (e) {\n cgi.Com_Print(`Failed to load HUD image: pics/${name}.pcx\\n`);\n }\n }\n};\n\nconst WHITE: Vec3 = { x: 1, y: 1, z: 1 };\n\nexport const Draw_Damage = (cgi: CGameImport, ps: PlayerState, width: number, height: number) => {\n // Check if we have damage to show\n if ((!ps.damageAlpha || ps.damageAlpha <= 0) && (!ps.damageIndicators || ps.damageIndicators.length === 0)) {\n return;\n }\n\n if (!ps.damageIndicators || ps.damageIndicators.length === 0) {\n return;\n }\n\n const cx = width * 0.5;\n const cy = height * 0.5;\n const { forward, right } = angleVectors(ps.viewAngles);\n\n // Draw indicators at a fixed radius from the center of the screen\n const radius = Math.min(width, height) * 0.25;\n\n for (const indicator of ps.damageIndicators) {\n // Project the direction vector onto the player's view plane\n // indicator.direction is assumed to be the vector pointing TO the damage source\n const localRight = dotVec3(indicator.direction, right);\n const localForward = dotVec3(indicator.direction, forward);\n\n // Calculate the angle relative to the player's view\n // 0 degrees = Right, 90 degrees = Forward\n const angle = Math.atan2(localForward, localRight) * (180 / Math.PI);\n\n let picName = '';\n let xOff = 0;\n let yOff = 0;\n\n // Map angle to quadrants\n if (angle >= 45 && angle < 135) {\n // Front (Up)\n picName = 'd_up';\n yOff = -radius;\n } else if (angle >= -45 && angle < 45) {\n // Right\n picName = 'd_right';\n xOff = radius;\n } else if (angle >= -135 && angle < -45) {\n // Back (Down)\n picName = 'd_down';\n yOff = radius;\n } else {\n // Left (angle >= 135 || angle < -135)\n picName = 'd_left';\n xOff = -radius;\n }\n\n const pic = damagePics.get(picName);\n if (pic) {\n const size = cgi.Draw_GetPicSize(pic);\n // Center the sprite at the calculated offset position\n const x = cx + xOff - size.width * 0.5;\n const y = cy + yOff - size.height * 0.5;\n\n // Use indicator strength as alpha, clamped to [0, 1]\n const alpha = Math.max(0, Math.min(1, indicator.strength));\n cgi.SCR_DrawColorPic(x, y, pic, WHITE, alpha);\n }\n }\n};\n","import type { CGameImport } from '../types.js';\nimport { getHudLayout } from './layout.js';\n\ninterface Message {\n text: string;\n startTime: number;\n duration: number;\n}\n\nconst CENTER_PRINT_DURATION = 3000;\nconst NOTIFY_DURATION = 5000;\nconst MAX_NOTIFY_MESSAGES = 4;\n\nexport class MessageSystem {\n private centerPrintMsg: Message | null = null;\n private notifyMessages: Message[] = [];\n\n addCenterPrint(text: string, now: number) {\n this.centerPrintMsg = {\n text,\n startTime: now,\n duration: CENTER_PRINT_DURATION,\n };\n }\n\n addNotify(text: string, now: number) {\n this.notifyMessages.push({\n text,\n startTime: now,\n duration: NOTIFY_DURATION,\n });\n\n if (this.notifyMessages.length > MAX_NOTIFY_MESSAGES) {\n this.notifyMessages.shift();\n }\n }\n\n // Additional methods for cgame API\n setCenterPrint(text: string, now: number) {\n this.centerPrintMsg = {\n text,\n startTime: now,\n duration: CENTER_PRINT_DURATION,\n };\n }\n\n addNotification(text: string, is_chat: boolean, now: number) {\n this.notifyMessages.push({\n text,\n startTime: now,\n duration: NOTIFY_DURATION,\n });\n\n if (this.notifyMessages.length > MAX_NOTIFY_MESSAGES) {\n this.notifyMessages.shift();\n }\n }\n\n clearNotifications() {\n this.notifyMessages = [];\n }\n\n clearCenterPrint() {\n this.centerPrintMsg = null;\n }\n\n drawCenterPrint(cgi: CGameImport, now: number, layout: ReturnType<typeof getHudLayout>) {\n if (!this.centerPrintMsg) return;\n\n if (now > this.centerPrintMsg.startTime + this.centerPrintMsg.duration) {\n this.centerPrintMsg = null;\n return;\n }\n\n // Draw centered text\n const y = layout.CENTER_PRINT_Y;\n\n cgi.SCR_DrawCenterString(y, this.centerPrintMsg.text);\n }\n\n drawNotifications(cgi: CGameImport, now: number) {\n // Remove expired messages\n while (this.notifyMessages.length > 0 && now > this.notifyMessages[0].startTime + this.notifyMessages[0].duration) {\n this.notifyMessages.shift();\n }\n\n let y = 10; // Start near top-left\n for (const msg of this.notifyMessages) {\n cgi.SCR_DrawFontString(10, y, msg.text); // Use SCR_DrawFontString instead of drawString\n y += cgi.SCR_FontLineHeight();\n }\n }\n}\n","import { CGameImport } from '../types.js';\n\ninterface Subtitle {\n text: string;\n startTime: number;\n duration: number;\n}\n\nconst SUBTITLE_DURATION = 3000;\n\nexport class SubtitleSystem {\n private subtitle: Subtitle | null = null;\n\n addSubtitle(text: string, now: number) {\n this.subtitle = {\n text,\n startTime: now,\n duration: SUBTITLE_DURATION,\n };\n }\n\n drawSubtitles(cgi: CGameImport, now: number) {\n if (!this.subtitle) {\n return;\n }\n\n if (now > this.subtitle.startTime + this.subtitle.duration) {\n this.subtitle = null;\n return;\n }\n\n // Draw centered text at the bottom of the screen\n // We assume 240 is roughly 480/2 or similar scale, but typically CGame uses virtual coordinates.\n // If SCR_DrawCenterString uses virtual coords (usually based on 320x240 or similar),\n // we need to know the virtual screen height.\n // However, existing SCR_DrawCenterString likely handles centering horizontally.\n // We just need a Y coordinate.\n // In original Q2, HUD is drawn in a virtual 320x240 space usually, or scaled.\n // Let's assume SCR_DrawCenterString takes a Y coordinate in virtual space.\n // Typically bottom of screen.\n\n // For now, let's try a reasonable offset from bottom.\n // If standard Q2 res is 320x240, bottom is 240.\n const y = 200;\n\n cgi.SCR_DrawCenterString(y, this.subtitle.text);\n }\n}\n","import { CGameImport } from '../types.js';\nimport { PlayerState } from '@quake2ts/shared';\n\nexport const Draw_Blends = (cgi: CGameImport, ps: PlayerState, width: number, height: number) => {\n if (!ps.blend) return;\n\n const [r, g, b, a] = ps.blend;\n\n if (a > 0) {\n // Use SCR_DrawColorPic with a white pixel/texture stretched?\n // Or cgi needs a fill rect function.\n // SCR_DrawPic usually takes a pic.\n // Rerelease might use a specific blend function or just a 1x1 white texture scaled up.\n // Assuming cgi can draw colored quads if we register a \"white\" texture or similar.\n // For now, let's assume we can draw a colored rectangle if we had a white texture.\n\n // Since we don't have a fillRect in CGameImport, we might need to add it or use a registered texture.\n // Let's assume for now we skip or need to register a 'pics/white.pcx' or similar if it existed.\n // A common trick is to use any opaque texture and tint it, but that shows the texture.\n\n // Let's defer this or add a \"DrawFill\" to CGameImport if strictly needed,\n // OR standard Q2 just uses the poly drawing which isn't exposed yet.\n // Actually, Q2 V_CalcBlend handles this by setting palette/gamma or drawing a full screen poly.\n\n // For this port, we likely want a SCR_DrawFill calls.\n // Let's add SCR_DrawFill to CGameImport in types.ts in next step if it's missing.\n // Checking types.ts... it has SCR_DrawChar, SCR_DrawPic... no DrawFill.\n\n // I'll leave it commented/TODO for now or assume a 'white' pic is available.\n // cgi.SCR_DrawColorPic(0, 0, whitePic, {x:r, y:g, z:b}, a);\n }\n};\n","import { CGameImport } from '../types.js';\nimport { PlayerState } from '@quake2ts/shared';\nimport { iconPics } from './icons.js'; // Reuse loaded icons\n\nexport const Draw_Pickup = (cgi: CGameImport, ps: PlayerState, width: number, height: number) => {\n if (!ps.pickupIcon) return;\n\n const icon = iconPics.get(ps.pickupIcon);\n if (icon) {\n const size = cgi.Draw_GetPicSize(icon);\n const x = width - size.width - 10;\n const y = height - size.height - 10;\n cgi.SCR_DrawPic(x, y, icon);\n }\n};\n","import { CGameImport } from '../types.js';\n\nexport const Draw_Number = (cgi: CGameImport, x: number, y: number, value: number, pics: readonly unknown[], width: number, color?: [number, number, number, number]) => {\n const s = Math.abs(value).toString();\n for (let i = 0; i < s.length; i++) {\n const digit = parseInt(s[i]);\n const pic = pics[digit];\n if (pic) {\n if (color) {\n // cgi expects color as Vec3 (x,y,z) and alpha separate.\n // Assuming color is [r, g, b, a]\n cgi.SCR_DrawColorPic(x + i * width, y, pic, { x: color[0], y: color[1], z: color[2] }, color[3]);\n } else {\n cgi.SCR_DrawPic(x + i * width, y, pic);\n }\n }\n }\n};\n","import { CGameImport } from '../types.js';\nimport { Draw_Number } from './numbers.js';\nimport { getHudLayout } from './layout.js';\nimport { PlayerState, PlayerStat, ConfigStringIndex } from '@quake2ts/shared';\n\nlet colorblindMode = false;\n\nexport const Set_ColorblindMode = (enabled: boolean) => {\n colorblindMode = enabled;\n};\n\n/**\n * Draws the status bar (health, armor, ammo, icons) using ps.stats.\n *\n * NOTE: This implementation relies on the server correctly populating ps.stats\n * (STAT_HEALTH, STAT_ARMOR, STAT_AMMO, etc.) and valid configstring mappings\n * for icons (STAT_SELECTED_ICON, STAT_ARMOR_ICON, etc.).\n *\n * If ps.stats is not yet populated by the server (or is empty), the HUD will\n * display zeros or nothing. This is expected behavior during the migration phase.\n */\nexport const Draw_StatusBar = (\n cgi: CGameImport,\n ps: PlayerState,\n hudNumberPics: readonly unknown[],\n numberWidth: number,\n timeMs: number,\n layout: ReturnType<typeof getHudLayout>\n) => {\n // Stat Indices\n const health = ps.stats[PlayerStat.STAT_HEALTH] || 0;\n const armor = ps.stats[PlayerStat.STAT_ARMOR] || 0;\n // STAT_AMMO is no longer packed, it's just the integer count of the current ammo.\n const ammo = ps.stats[PlayerStat.STAT_AMMO] || 0;\n\n // Icon Indices (into ConfigStrings or predefined map)\n const armorIconIdx = ps.stats[PlayerStat.STAT_ARMOR_ICON] || 0;\n // const ammoIconIdx = ps.stats[PlayerStat.STAT_AMMO_ICON] || 0; // Unused in standard Q2 HUD?\n\n // Draw Health\n let healthColor: [number, number, number, number] | undefined = undefined;\n\n if (health <= 25) {\n if (colorblindMode) {\n // Use Blue/Cyan for low health in colorblind mode instead of Red\n healthColor = [0.2, 0.6, 1, 1];\n } else {\n healthColor = [1, 0, 0, 1]; // Red for low health\n }\n }\n\n if (hudNumberPics.length > 0) {\n Draw_Number(cgi, layout.HEALTH_X, layout.HEALTH_Y, health, hudNumberPics, numberWidth, healthColor);\n Draw_Number(cgi, layout.ARMOR_X, layout.ARMOR_Y, armor, hudNumberPics, numberWidth);\n Draw_Number(cgi, layout.AMMO_X, layout.AMMO_Y, ammo, hudNumberPics, numberWidth);\n }\n\n // Draw Armor Icon\n if (armorIconIdx > 0) {\n const iconName = cgi.get_configstring(ConfigStringIndex.Images + armorIconIdx);\n if (iconName) {\n const icon = cgi.Draw_RegisterPic(iconName);\n if (icon) {\n cgi.SCR_DrawPic(layout.ARMOR_X - 24, layout.ARMOR_Y - 2, icon);\n }\n }\n }\n\n // Draw Weapon Icon\n // Uses STAT_SELECTED_ICON\n if (ps.pickupIcon) {\n // Fallback to legacy string field if present, helpful for transition\n const icon = cgi.Draw_RegisterPic(ps.pickupIcon);\n if (icon) {\n cgi.SCR_DrawPic(layout.WEAPON_ICON_X, layout.WEAPON_ICON_Y, icon);\n }\n } else {\n // Standard Q2 path via STAT_SELECTED_ICON\n const selectedIconIdx = ps.stats[PlayerStat.STAT_SELECTED_ICON] || 0;\n if (selectedIconIdx > 0) {\n const iconName = cgi.get_configstring(ConfigStringIndex.Images + selectedIconIdx);\n if (iconName) {\n const icon = cgi.Draw_RegisterPic(iconName);\n if (icon) {\n cgi.SCR_DrawPic(layout.WEAPON_ICON_X, layout.WEAPON_ICON_Y, icon);\n }\n }\n }\n }\n\n // Draw Keys\n // Rerelease/Q2 uses STAT_LAYOUTS to determine if inventory/keys overlay is shown.\n // But for the persistent key icons on the HUD (Q2TS specific feature?), we might need logic.\n // Standard Q2 doesn't show key icons on the main HUD, only in inventory.\n // If we want to keep Q2TS specific key icons, we need to know which keys we have.\n // Since we don't have the inventory set in ps.stats easily (unless packed),\n // we might lose this feature until we implement a \"Key Stat\" or read inventory bits.\n //\n // For now, we omit the key drawing if we don't have the data, matching standard Q2 behavior.\n\n // Draw Powerups\n // Handled by Draw_Blends or STAT_TIMER logic usually.\n};\n","// Dynamic Layout Scaling\nconst REFERENCE_WIDTH = 640;\nconst REFERENCE_HEIGHT = 480;\n\nexport const getHudLayout = (width: number, height: number) => {\n // Determine scale factor - usually based on height to preserve aspect ratio logic or just scale uniform\n // Quake 2 typically scales 2D elements.\n const scaleX = width / REFERENCE_WIDTH;\n const scaleY = height / REFERENCE_HEIGHT;\n const scale = Math.min(scaleX, scaleY); // Uniform scaling\n\n // Or we can just center the 640x480 rect?\n // Modern approach: Scale UI to fit, or anchor to edges.\n // Let's implement edge anchoring logic relative to 640x480 coordinates.\n\n // Original constants (approximate):\n // HEALTH_X: 100, HEALTH_Y: 450\n // ARMOR_X: 200, ARMOR_Y: 450\n // AMMO_X: 540, AMMO_Y: 450\n // CENTER_PRINT: Center screen\n // WEAPON_ICON: Bottom left\n // POWERUP: Bottom right?\n\n // We'll return scaled coordinates.\n // For bottom elements, we should anchor to bottom.\n\n return {\n // Status bar numbers - Anchored Bottom-Left / Center / Right\n HEALTH_X: 100 * scale,\n HEALTH_Y: height - (REFERENCE_HEIGHT - 450) * scale,\n\n ARMOR_X: 200 * scale,\n ARMOR_Y: height - (REFERENCE_HEIGHT - 450) * scale,\n\n AMMO_X: width - (REFERENCE_WIDTH - 540) * scale, // Anchor right? 540 is near right (640)\n AMMO_Y: height - (REFERENCE_HEIGHT - 450) * scale,\n\n // Center print messages - Center\n CENTER_PRINT_X: width / 2,\n CENTER_PRINT_Y: 100 * scale, // Top anchor\n\n // Weapon and powerup icons\n WEAPON_ICON_X: 10 * scale,\n WEAPON_ICON_Y: height - (REFERENCE_HEIGHT - 450) * scale,\n\n POWERUP_X: width - (REFERENCE_WIDTH - 610) * scale,\n POWERUP_Y: height - (REFERENCE_HEIGHT - 450) * scale,\n\n scale: scale\n };\n};\n\n// Backward compatibility (deprecated, but useful for initial refactor)\nexport const HUD_LAYOUT = {\n HEALTH_X: 100,\n HEALTH_Y: 450,\n ARMOR_X: 200,\n ARMOR_Y: 450,\n AMMO_X: 540,\n AMMO_Y: 450,\n CENTER_PRINT_X: 320,\n CENTER_PRINT_Y: 100,\n WEAPON_ICON_X: 10,\n WEAPON_ICON_Y: 450,\n POWERUP_X: 610,\n POWERUP_Y: 450,\n};\n","/**\n * CGame HUD Screen Drawing\n * Reference: rerelease/cg_screen.cpp\n *\n * This module handles all HUD rendering for the cgame package, including:\n * - Status bar (health, armor, ammo)\n * - Crosshair\n * - Damage indicators\n * - Pickup notifications\n * - Messages and center print\n * - Subtitles\n */\n\nimport type { PlayerState } from '@quake2ts/shared';\nimport type { CGameImport } from './types.js';\n\n// HUD component imports\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 { SubtitleSystem } from './hud/subtitles.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\n// Module-level state\nlet cgi: CGameImport | null = null;\nconst hudNumberPics: unknown[] = []; // Will hold pic handles from cgi.Draw_RegisterPic()\nlet numberWidth = 0;\n\n// Message and subtitle systems\nconst messageSystem = new MessageSystem();\nconst subtitleSystem = new SubtitleSystem();\n\n/**\n * Initialize the CGame screen module with import functions.\n * Reference: rerelease/cg_screen.cpp InitCGame()\n */\nexport function CG_InitScreen(imports: CGameImport): void {\n cgi = imports;\n}\n\n/**\n * Precache all HUD images.\n * Reference: rerelease/cg_screen.cpp:1689 (TouchPics)\n *\n * This is called during level load to register all required HUD assets.\n */\nexport function CG_TouchPics(): void {\n if (!cgi) return;\n\n // Load HUD number pics\n hudNumberPics.length = 0;\n for (let i = 0; i < 10; i++) {\n try {\n const pic = cgi.Draw_RegisterPic(`pics/hud/num_${i}.pcx`);\n hudNumberPics.push(pic);\n if (i === 0) {\n const size = cgi.Draw_GetPicSize(pic);\n numberWidth = size.width;\n }\n } catch (e) {\n cgi.Com_Print(`Warning: Failed to load HUD image: pics/hud/num_${i}.pcx\\n`);\n }\n }\n\n Init_Crosshair(cgi);\n Init_Icons(cgi);\n Init_Damage(cgi);\n}\n\n/**\n * Main HUD drawing function.\n * Reference: rerelease/cg_screen.cpp CG_DrawHUD()\n *\n * Called each frame by the client to render the HUD overlay.\n *\n * @param isplit - Split-screen index (0 for single player)\n * @param data - Additional HUD data (unused in initial implementation)\n * @param hud_vrect - Virtual HUD rectangle (screen coordinates)\n * @param hud_safe - Safe area rectangle (for overscan)\n * @param scale - HUD scale factor\n * @param playernum - Player number\n * @param ps - Current player state\n */\nexport function CG_DrawHUD(\n isplit: number,\n data: unknown,\n hud_vrect: { x: number; y: number; width: number; height: number },\n hud_safe: { x: number; y: number; width: number; height: number },\n scale: number,\n playernum: number,\n ps: PlayerState\n): void {\n if (!cgi) {\n console.error('CG_DrawHUD: cgame imports not initialized');\n return;\n }\n\n const timeMs = cgi.CL_ClientTime();\n const layout = getHudLayout(hud_vrect.width, hud_vrect.height);\n\n // Screen blends (damage, powerups)\n Draw_Blends(cgi, ps, hud_vrect.width, hud_vrect.height);\n\n // Status bar\n // Now directly using ps.stats via Draw_StatusBar\n Draw_StatusBar(cgi, ps, hudNumberPics, numberWidth, timeMs, layout);\n\n // Pickup messages\n Draw_Pickup(cgi, ps, hud_vrect.width, hud_vrect.height);\n\n // Damage indicators\n Draw_Damage(cgi, ps, hud_vrect.width, hud_vrect.height);\n\n // Center print (Legacy PS support)\n if (ps.centerPrint) {\n const lines = ps.centerPrint.split('\\n');\n let y = hud_vrect.height / 2 - (lines.length * 10); // Approximation\n for (const line of lines) {\n cgi.SCR_DrawCenterString(y, line);\n y += 16;\n }\n }\n\n // Message System (CenterPrint & Notifications)\n messageSystem.drawCenterPrint(cgi, timeMs, layout);\n messageSystem.drawNotifications(cgi, timeMs);\n\n // Subtitles\n subtitleSystem.drawSubtitles(cgi, timeMs);\n\n // Crosshair\n Draw_Crosshair(cgi, hud_vrect.width, hud_vrect.height);\n}\n\n/**\n * Get message system instance.\n * Used by parsing functions to add messages.\n */\nexport function CG_GetMessageSystem(): MessageSystem {\n return messageSystem;\n}\n\n/**\n * Get subtitle system instance.\n * Used by audio system to display subtitles.\n */\nexport function CG_GetSubtitleSystem(): SubtitleSystem {\n return subtitleSystem;\n}\n","import type { CGameImport } from './types.js';\nimport { ConfigStringIndex, MAX_MODELS, MAX_SOUNDS, MAX_IMAGES } from '@quake2ts/shared';\n\n/**\n * Parses a config string update and precaches assets if necessary.\n * Reference: rerelease/cg_main.cpp CL_ParseConfigString\n */\nexport function CG_ParseConfigString(cgi: CGameImport, i: number, s: string): void {\n if (i >= ConfigStringIndex.Models && i < ConfigStringIndex.Models + MAX_MODELS) {\n cgi.RegisterModel(s);\n } else if (i >= ConfigStringIndex.Sounds && i < ConfigStringIndex.Sounds + MAX_SOUNDS) {\n cgi.RegisterSound(s);\n } else if (i >= ConfigStringIndex.Images && i < ConfigStringIndex.Images + MAX_IMAGES) {\n cgi.Draw_RegisterPic(s);\n }\n}\n","/**\n * Common utilities\n * @module glMatrix\n */\n\n// Configuration Constants\nexport var EPSILON = 0.000001;\nexport var ARRAY_TYPE = typeof Float32Array !== \"undefined\" ? Float32Array : Array;\nexport var RANDOM = Math.random;\nexport var ANGLE_ORDER = \"zyx\";\n\n/**\n * Symmetric round\n * see https://www.npmjs.com/package/round-half-up-symmetric#user-content-detailed-background\n *\n * @param {Number} a value to round\n */\nexport function round(a) {\n if (a >= 0) return Math.round(a);\n return a % 0.5 === 0 ? Math.floor(a) : Math.round(a);\n}\n\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */\nexport function setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\nvar radian = 180 / Math.PI;\n\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\nexport function toRadian(a) {\n return a * degree;\n}\n\n/**\n * Convert Radian To Degree\n *\n * @param {Number} a Angle in Radians\n */\nexport function toDegree(a) {\n return a * radian;\n}\n\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @param {Number} tolerance Absolute or relative tolerance (default glMatrix.EPSILON)\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\nexport function equals(a, b) {\n var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EPSILON;\n return Math.abs(a - b) <= tolerance * Math.max(1, Math.abs(a), Math.abs(b));\n}","import * as glMatrix from \"./common.js\";\n\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n return out;\n}\n\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.sqrt(x * x + y * y + z * z);\n}\n\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n\n/**\n * symmetric round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */\nexport function round(out, a) {\n out[0] = glMatrix.round(a[0]);\n out[1] = glMatrix.round(a[1]);\n out[2] = glMatrix.round(a[2]);\n return out;\n}\n\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.sqrt(x * x + y * y + z * z);\n}\n\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n\n/**\n * Performs a spherical linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function slerp(out, a, b, t) {\n var angle = Math.acos(Math.min(Math.max(dot(a, b), -1), 1));\n var sinTotal = Math.sin(angle);\n var ratioA = Math.sin((1 - t) * angle) / sinTotal;\n var ratioB = Math.sin(t * angle) / sinTotal;\n out[0] = ratioA * a[0] + ratioB * b[0];\n out[1] = ratioA * a[1] + ratioB * b[1];\n out[2] = ratioA * a[2] + ratioB * b[2];\n return out;\n}\n\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned\n * @returns {vec3} out\n */\nexport function random(out, scale) {\n scale = scale === undefined ? 1.0 : scale;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q normalized quaternion to transform with\n * @returns {vec3} out\n */\nexport function transformQuat(out, a, q) {\n // Fast Vector Rotation using Quaternions by Robert Eisele\n // https://raw.org/proof/vector-rotation-using-quaternions/\n\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var vx = a[0],\n vy = a[1],\n vz = a[2];\n\n // t = q x v\n var tx = qy * vz - qz * vy;\n var ty = qz * vx - qx * vz;\n var tz = qx * vy - qy * vx;\n\n // t = 2t\n tx = tx + tx;\n ty = ty + ty;\n tz = tz + tz;\n\n // v + w t + q x t\n out[0] = vx + qw * tx + qy * tz - qz * ty;\n out[1] = vy + qw * ty + qz * tx - qx * tz;\n out[2] = vz + qw * tz + qx * ty - qy * tx;\n return out;\n}\n\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = [];\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad);\n\n //translate to correct position\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = [];\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad);\n\n //translate to correct position\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = [];\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2];\n\n //translate to correct position\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag = Math.sqrt((ax * ax + ay * ay + az * az) * (bx * bx + by * by + bz * bz)),\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\nexport var sub = subtract;\n\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\nexport var mul = multiply;\n\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\nexport var div = divide;\n\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\nexport var dist = distance;\n\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\nexport var sqrDist = squaredDistance;\n\n/**\n * Alias for {@link vec3.length}\n * @function\n */\nexport var len = length;\n\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\nexport var sqrLen = squaredLength;\n\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n if (!stride) {\n stride = 3;\n }\n if (!offset) {\n offset = 0;\n }\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n return a;\n };\n}();","import { Camera } from '@quake2ts/engine';\nimport { ViewSample } from './effects.js';\nimport { vec3 } from 'gl-matrix';\nimport { Vec3 } from '@quake2ts/shared';\n\nconst toGlMatrixVec3 = (v: Vec3): vec3 => {\n return vec3.fromValues(v.x, v.y, v.z);\n};\n\nexport const updateCamera = (camera: Camera, viewSample: ViewSample) => {\n // Apply the view model effects to the camera\n camera.bobAngles = toGlMatrixVec3(viewSample.angles);\n camera.bobOffset = toGlMatrixVec3(viewSample.offset);\n};\n","import { ZERO_VEC3, angleVectors, clampViewAngles, dotVec3, hasPmFlag, PmFlag, type PmFlags, type Vec3 } from '@quake2ts/shared';\nimport type { PredictionState } from '../prediction/index.js';\n\nexport interface ViewEffectSettings {\n readonly runPitch: number;\n readonly runRoll: number;\n readonly bobUp: number;\n readonly bobPitch: number;\n readonly bobRoll: number;\n readonly maxBobHeight: number;\n readonly maxBobAngle: number;\n}\n\nconst DEFAULT_SETTINGS: ViewEffectSettings = {\n runPitch: 0.002,\n runRoll: 0.01,\n bobUp: 0.005,\n bobPitch: 0.002,\n bobRoll: 0.002,\n maxBobHeight: 6,\n maxBobAngle: 1.2,\n};\n\nexport interface ViewKick {\n readonly pitch: number;\n readonly roll: number;\n readonly durationMs: number;\n readonly origin?: Vec3; // Optional origin offset (weapon recoil)\n}\n\nexport interface ActiveKick extends ViewKick {\n remainingMs: number;\n}\n\nexport interface ViewSample {\n readonly angles: Vec3;\n readonly offset: Vec3;\n readonly bobCycle: number;\n readonly bobCycleRun: number;\n readonly bobFracSin: number;\n readonly xyspeed: number;\n}\n\nfunction clampViewOffset(offset: Vec3): Vec3 {\n return {\n x: Math.max(-14, Math.min(14, offset.x)),\n y: Math.max(-14, Math.min(14, offset.y)),\n z: Math.max(-22, Math.min(30, offset.z)),\n };\n}\n\nfunction computeBobMove(xyspeed: number, onGround: boolean, frameTimeMs: number): number {\n if (!onGround) return 0;\n\n if (xyspeed > 210) return frameTimeMs / 400;\n if (xyspeed > 100) return frameTimeMs / 800;\n return frameTimeMs / 1600;\n}\n\nfunction computeBobValues(\n previousBobTime: number,\n xyspeed: number,\n pmFlags: PmFlags,\n onGround: boolean,\n frameTimeMs: number,\n): { bobTime: number; bobCycle: number; bobCycleRun: number; bobFracSin: number } {\n if (xyspeed < 5) {\n return { bobTime: 0, bobCycle: 0, bobCycleRun: 0, bobFracSin: 0 };\n }\n\n const bobMove = computeBobMove(xyspeed, onGround, frameTimeMs);\n const bobTimeRun = previousBobTime + bobMove;\n const crouched = hasPmFlag(pmFlags, PmFlag.Ducked) && onGround;\n const bobTime = crouched ? bobTimeRun * 4 : bobTimeRun;\n\n return {\n bobTime: bobTimeRun,\n bobCycle: Math.floor(bobTime),\n bobCycleRun: Math.floor(bobTimeRun),\n bobFracSin: Math.abs(Math.sin(bobTime * Math.PI)),\n };\n}\n\nexport class ViewEffects {\n private readonly settings: ViewEffectSettings;\n private bobTime = 0;\n private bobCycle = 0;\n private bobCycleRun = 0;\n private bobFracSin = 0;\n private kick: ActiveKick | undefined;\n private lastSample: ViewSample | undefined;\n\n constructor(settings: Partial<ViewEffectSettings> = {}) {\n this.settings = { ...DEFAULT_SETTINGS, ...settings } satisfies ViewEffectSettings;\n }\n\n addKick(kick: ViewKick): void {\n if (kick.durationMs <= 0) return;\n this.kick = { ...kick, remainingMs: kick.durationMs } satisfies ActiveKick;\n }\n\n get last(): ViewSample | undefined {\n return this.lastSample;\n }\n\n sample(state: PredictionState, frameTimeMs: number): ViewSample {\n const { forward, right } = angleVectors(\n clampViewAngles({ pmFlags: state.pmFlags, cmdAngles: state.viewAngles, deltaAngles: state.deltaAngles ?? ZERO_VEC3 }).viewangles,\n );\n\n const xyspeed = Math.sqrt(state.velocity.x * state.velocity.x + state.velocity.y * state.velocity.y);\n const onGround = hasPmFlag(state.pmFlags, PmFlag.OnGround);\n\n const bobValues = computeBobValues(this.bobTime, xyspeed, state.pmFlags, onGround, frameTimeMs);\n this.bobTime = bobValues.bobTime;\n this.bobCycle = bobValues.bobCycle;\n this.bobCycleRun = bobValues.bobCycleRun;\n this.bobFracSin = bobValues.bobFracSin;\n\n // Velocity-based tilt\n let pitchTilt = dotVec3(state.velocity, forward) * this.settings.runPitch;\n\n const side = dotVec3(state.velocity, right);\n const sign = side < 0 ? -1 : 1;\n const absSide = Math.abs(side);\n\n let rollTilt = absSide * this.settings.runRoll;\n if (rollTilt > 2.0) {\n rollTilt = 2.0;\n }\n rollTilt *= sign;\n\n // Bob tilt\n let pitchDelta = this.bobFracSin * this.settings.bobPitch * xyspeed;\n let rollDelta = this.bobFracSin * this.settings.bobRoll * xyspeed;\n if (hasPmFlag(state.pmFlags, PmFlag.Ducked) && onGround) {\n pitchDelta *= 6;\n rollDelta *= 6;\n }\n\n pitchTilt += Math.min(pitchDelta, this.settings.maxBobAngle);\n rollDelta = Math.min(rollDelta, this.settings.maxBobAngle);\n if (this.bobCycle & 1) rollDelta = -rollDelta;\n rollTilt += rollDelta;\n\n // Bob height\n const bobHeight = Math.min(this.bobFracSin * xyspeed * this.settings.bobUp, this.settings.maxBobHeight);\n\n let kickPitch = 0;\n let kickRoll = 0;\n let kickX = 0;\n let kickY = 0;\n let kickZ = 0;\n\n // Apply active kick\n // Reference: rerelease/p_view.cpp CalcKickOffset\n // Matches the \"interpolation\" requested in the task\n if (this.kick && this.kick.remainingMs > 0) {\n // ratio goes from 1.0 (start) to 0.0 (end)\n const ratio = Math.max(0, Math.min(1, this.kick.remainingMs / this.kick.durationMs));\n\n kickPitch += ratio * this.kick.pitch;\n kickRoll += ratio * this.kick.roll;\n\n if (this.kick.origin) {\n kickX += ratio * this.kick.origin.x;\n kickY += ratio * this.kick.origin.y;\n kickZ += ratio * this.kick.origin.z;\n }\n\n this.kick.remainingMs = Math.max(0, this.kick.remainingMs - frameTimeMs);\n if (this.kick.remainingMs === 0) this.kick = undefined;\n }\n\n const angles: Vec3 = { x: pitchTilt + kickPitch, y: 0, z: rollTilt + kickRoll };\n const offset: Vec3 = { x: kickX, y: kickY, z: bobHeight + kickZ };\n\n const sample: ViewSample = {\n angles,\n offset: clampViewOffset(offset),\n bobCycle: this.bobCycle,\n bobCycleRun: this.bobCycleRun,\n bobFracSin: this.bobFracSin,\n xyspeed,\n } satisfies ViewSample;\n this.lastSample = sample;\n return sample;\n }\n}\n","import {\n addVec3,\n subtractVec3,\n lengthVec3,\n angleMod,\n scaleVec3,\n type Vec3,\n buildAirGroundWish,\n buildWaterWish,\n clampViewAngles,\n hasPmFlag,\n PmFlag,\n PmType,\n WaterLevel,\n type PmFlags,\n type UserCommand,\n PlayerState,\n applyPmove,\n PmoveCmd,\n PmoveTraceFn\n} from '@quake2ts/shared';\nimport type { GameFrameResult } from '@quake2ts/engine';\nimport type { PlayerClient } from '@quake2ts/game';\n\n\n// PredictionState extends PlayerState with fields needed for physics simulation\n// that might not be in the base PlayerState interface yet or are client-side specific.\nexport interface PredictionState extends PlayerState {\n deltaAngles?: Vec3;\n pmFlags: PmFlags;\n pmType: PmType;\n gravity?: number;\n waterLevel: WaterLevel;\n\n // Client-side fields for HUD/rendering, added to satisfy client package usage\n client?: PlayerClient;\n health?: number;\n armor?: number;\n ammo?: number;\n}\n\nexport interface PredictionSettings {\n readonly pmFriction: number;\n readonly pmStopSpeed: number;\n readonly pmAccelerate: number;\n readonly pmAirAccelerate: number;\n readonly pmWaterAccelerate: number;\n readonly pmWaterFriction: number;\n readonly pmMaxSpeed: number;\n readonly pmDuckSpeed: number;\n readonly pmWaterSpeed: number;\n readonly groundIsSlick: boolean;\n readonly errorTolerance: number;\n readonly errorSnapThreshold: number;\n}\n\nconst DEFAULTS: PredictionSettings = {\n pmFriction: 6,\n pmStopSpeed: 100,\n pmAccelerate: 10,\n pmAirAccelerate: 1,\n pmWaterAccelerate: 4,\n pmWaterFriction: 1,\n pmMaxSpeed: 300,\n pmDuckSpeed: 100,\n pmWaterSpeed: 400,\n groundIsSlick: false,\n errorTolerance: 0.1,\n errorSnapThreshold: 10,\n};\n\nconst DEFAULT_GRAVITY = 800;\nconst ZERO_VEC3: Vec3 = { x: 0, y: 0, z: 0 };\nconst MSEC_MAX = 250;\nconst CMD_BACKUP = 64;\n\nexport function defaultPredictionState(): PredictionState {\n return {\n origin: ZERO_VEC3,\n velocity: ZERO_VEC3,\n viewAngles: ZERO_VEC3,\n onGround: false,\n\n // Physics fields\n pmFlags: PmFlag.OnGround,\n pmType: PmType.Normal,\n waterLevel: WaterLevel.None,\n gravity: DEFAULT_GRAVITY,\n deltaAngles: ZERO_VEC3,\n\n // Bounds\n mins: { x: -16, y: -16, z: -24 },\n maxs: { x: 16, y: 16, z: 32 },\n\n // Visual/Game fields\n damageAlpha: 0,\n damageIndicators: [],\n blend: [0, 0, 0, 0],\n stats: [],\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\n pm_time: 0,\n pm_type: PmType.Normal,\n pm_flags: PmFlag.OnGround,\n gun_frame: 0,\n rdflags: 0,\n fov: 90,\n renderfx: 0,\n\n // Optional fields\n pickupIcon: undefined,\n centerPrint: undefined,\n notify: undefined,\n client: undefined,\n health: 0,\n armor: 0,\n ammo: 0\n };\n}\n\nfunction normalizeState(state: PredictionState | undefined): PredictionState {\n if (!state) return defaultPredictionState();\n\n return {\n ...defaultPredictionState(),\n ...state,\n origin: { ...state.origin },\n velocity: { ...state.velocity },\n viewAngles: { ...state.viewAngles },\n deltaAngles: state.deltaAngles ? { ...state.deltaAngles } : ZERO_VEC3,\n blend: state.blend ? [...state.blend] : [0, 0, 0, 0],\n damageIndicators: state.damageIndicators ? [...state.damageIndicators] : [],\n stats: state.stats ? [...state.stats] : [],\n } satisfies PredictionState;\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 let delta = angleMod(b - a);\n if (delta > 180) {\n delta -= 360;\n }\n return angleMod(a + delta * t);\n}\n\nexport function interpolatePredictionState(\n previous: PredictionState,\n latest: PredictionState,\n alpha: number,\n): PredictionState {\n const clamped = Math.max(0, Math.min(alpha, 1));\n\n return {\n ...latest, // Default to latest for discrete fields\n origin: {\n x: lerp(previous.origin.x, latest.origin.x, clamped),\n y: lerp(previous.origin.y, latest.origin.y, clamped),\n z: lerp(previous.origin.z, latest.origin.z, clamped),\n },\n velocity: {\n x: lerp(previous.velocity.x, latest.velocity.x, clamped),\n y: lerp(previous.velocity.y, latest.velocity.y, clamped),\n z: lerp(previous.velocity.z, latest.velocity.z, clamped),\n },\n viewAngles: {\n x: lerpAngle(previous.viewAngles.x, latest.viewAngles.x, clamped),\n y: lerpAngle(previous.viewAngles.y, latest.viewAngles.y, clamped),\n z: lerpAngle(previous.viewAngles.z, latest.viewAngles.z, clamped),\n },\n damageAlpha: lerp(previous.damageAlpha, latest.damageAlpha, clamped),\n blend: [\n lerp(previous.blend[0], latest.blend[0], clamped),\n lerp(previous.blend[1], latest.blend[1], clamped),\n lerp(previous.blend[2], latest.blend[2], clamped),\n lerp(previous.blend[3], latest.blend[3], clamped),\n ],\n // Interpolate health/armor for smooth HUD? Usually step.\n health: lerp(previous.health || 0, latest.health || 0, clamped),\n armor: lerp(previous.armor || 0, latest.armor || 0, clamped),\n ammo: lerp(previous.ammo || 0, latest.ammo || 0, clamped)\n } satisfies PredictionState;\n}\n\nfunction simulateCommand(\n state: PredictionState,\n cmd: UserCommand,\n settings: PredictionSettings,\n trace: PmoveTraceFn,\n pointContents: (p: Vec3) => number\n): PredictionState {\n // Convert UserCommand to PmoveCmd\n const pmoveCmd: PmoveCmd = {\n forwardmove: cmd.forwardmove,\n sidemove: cmd.sidemove,\n upmove: cmd.upmove,\n buttons: cmd.buttons,\n angles: cmd.angles // Added missing property\n };\n\n // Delegate physics to shared applyPmove\n // Note: applyPmove returns a NEW PlayerState, it does not mutate.\n // We must ensure that PredictionState specific fields are preserved if they are not part of PlayerState\n // But since PredictionState extends PlayerState and applyPmove spreads ...state, we should get them back.\n\n const newState = applyPmove(state, pmoveCmd, trace, pointContents);\n\n // applyPmove calculates physics.\n // However, applyPmove also handles view angle clamping?\n // shared/pmove/apply.ts imports categorizePosition, checkWater etc.\n\n // One detail: applyPmove uses the cmd to update viewAngles?\n // Looking at applyPmove in shared: it returns `...newState` which comes from `...state`\n // But `applyPmove` doesn't seem to modify viewAngles directly unless it's implicit?\n // Wait, applyPmove handles origin and velocity.\n // View angle changes (like from mouse input) are usually pre-applied to the command angles.\n // But physics might affect view angles? (Not usually, except maybe knockback?)\n\n // The original simulateCommand implementation clamped view angles.\n const { viewangles } = clampViewAngles({\n pmFlags: state.pmFlags,\n cmdAngles: cmd.angles,\n deltaAngles: state.deltaAngles ?? ZERO_VEC3,\n });\n\n return {\n ...newState,\n viewAngles: viewangles\n } as PredictionState;\n}\n\nexport interface PredictionPhysics {\n trace: PmoveTraceFn;\n pointContents: (p: Vec3) => number;\n}\n\nexport class ClientPrediction {\n private readonly settings: PredictionSettings;\n private readonly physics: PredictionPhysics;\n private enabled = true;\n private baseFrame: GameFrameResult<PredictionState> = {\n frame: 0,\n timeMs: 0,\n state: defaultPredictionState(),\n } satisfies GameFrameResult<PredictionState>;\n private commands: UserCommand[] = [];\n private predicted: PredictionState = defaultPredictionState();\n private predictionError: Vec3 = ZERO_VEC3;\n\n constructor(physics: PredictionPhysics, settings: Partial<PredictionSettings> = {}) {\n this.settings = { ...DEFAULTS, ...settings } satisfies PredictionSettings;\n this.physics = physics;\n this.predicted = this.baseFrame.state ?? defaultPredictionState();\n }\n\n setPredictionEnabled(enabled: boolean): void {\n this.enabled = enabled;\n }\n\n setAuthoritative(frame: GameFrameResult<PredictionState>): PredictionState {\n const normalized = normalizeState(frame.state);\n\n if (frame.frame <= this.baseFrame.frame) {\n return this.predicted; // Ignore old or duplicate frames\n }\n\n if (this.enabled) {\n // Calculate prediction error before updating baseFrame\n // We need to know what we *thought* the state was at this frame.\n // Since we don't store history, we'll re-simulate from the OLD base frame up to this new frame's sequence.\n\n // 1. Find the command that matches the new frame's sequence (if we have it)\n // The new frame corresponds to state AFTER executing command with sequence = frame.frame\n\n let predictedAtFrame: PredictionState | undefined;\n\n // We can only check error if we have the commands to reproduce the state up to this point\n const relevantCommands = this.commands.filter(c => c.sequence <= frame.frame && c.sequence > this.baseFrame.frame);\n\n if (relevantCommands.length > 0 || this.baseFrame.frame === frame.frame) {\n let tempState = normalizeState(this.baseFrame.state);\n for (const cmd of relevantCommands) {\n tempState = simulateCommand(tempState, cmd, this.settings, this.physics.trace, this.physics.pointContents);\n }\n predictedAtFrame = tempState;\n }\n\n if (predictedAtFrame) {\n const error = subtractVec3(predictedAtFrame.origin, normalized.origin);\n const errorLen = lengthVec3(error);\n\n // If error is large (> errorSnapThreshold), snap immediately (reset error)\n // If error is small, add it to existing error to smooth out\n if (errorLen > this.settings.errorSnapThreshold) {\n this.predictionError = ZERO_VEC3;\n } else if (errorLen > this.settings.errorTolerance) {\n // Accumulate error? Or just set it?\n // Usually we set it, and then decay it in simulateCommand or frame update.\n // But wait, \"prediction error\" is usually added to the view position to keep the camera\n // where the client PREDICTED it was, then slowly slide it to the server position.\n // So if we predicted X, and server says X-5, we are at X-5 but we want to render at X-5+5 = X.\n // So error = predicted - server.\n this.predictionError = error;\n } else {\n this.predictionError = ZERO_VEC3;\n }\n } else {\n // Can't verify prediction, reset error\n this.predictionError = ZERO_VEC3;\n }\n } else {\n this.predictionError = ZERO_VEC3;\n }\n\n this.baseFrame = { ...frame, state: normalized };\n\n // Discard commands that have been acknowledged/processed by the server\n this.commands = this.commands.filter((cmd) => cmd.sequence > frame.frame);\n\n return this.recompute();\n }\n\n getPredictionError(): Vec3 {\n return this.predictionError;\n }\n\n // Decay error over time - usually called once per client frame\n decayError(frametime: number) {\n const len = lengthVec3(this.predictionError);\n if (len > 0) {\n const decay = len * 10 * frametime; // Decay speed\n const scale = Math.max(0, len - decay) / len;\n this.predictionError = scaleVec3(this.predictionError, scale);\n }\n }\n\n enqueueCommand(cmd: UserCommand): PredictionState {\n this.commands.push(cmd);\n if (this.commands.length > CMD_BACKUP) {\n this.commands.shift();\n }\n return this.recompute();\n }\n\n getCommand(sequence: number): UserCommand | undefined {\n return this.commands.find((c) => c.sequence === sequence);\n }\n\n getPredictedState(): PredictionState {\n return this.predicted;\n }\n\n private recompute(): PredictionState {\n let state = normalizeState(this.baseFrame.state);\n\n if (this.enabled) {\n for (const cmd of this.commands) {\n state = simulateCommand(state, cmd, this.settings, this.physics.trace, this.physics.pointContents);\n }\n }\n\n this.predicted = state;\n return state;\n }\n}\n","/**\n * CGame Module Entry Point\n * Reference: rerelease/cg_main.cpp\n *\n * This module provides the GetCGameAPI() function that returns the cgame_export_t\n * interface to the client engine.\n */\n\nimport type { CGameImport, CGameExport, PmoveInfo } from './types.js';\nimport { PlayerState, PlayerStat, Vec3, applyPmove, PmoveTraceResult, WEAPON_WHEEL_ORDER, WEAPON_AMMO_MAP, G_GetAmmoStat, G_GetPowerupStat, PowerupId } from '@quake2ts/shared';\nimport { LayoutFlags } from '@quake2ts/shared';\nimport { CG_InitScreen, CG_TouchPics, CG_DrawHUD, CG_GetMessageSystem, CG_GetSubtitleSystem } from './screen.js';\nimport { CG_ParseConfigString } from './parse.js';\n\nexport type { CGameImport, CGameExport } from './types.js';\n\n// Re-export new modules\nexport * from './view/camera.js';\nexport * from './view/effects.js';\nexport * from './prediction/index.js';\n\n// Module-level state\nlet cgi: CGameImport | null = null;\nlet cg_predict: { value: number } | null = null;\nlet cg_showmiss: { value: number } | null = null;\n\n/**\n * Initialize the CGame module.\n * Reference: rerelease/cg_main.cpp InitCGame()\n */\nfunction Init(): void {\n if (!cgi) {\n console.error('CGame Init: cgame imports not set');\n return;\n }\n\n cgi.Com_Print('===== CGame Initialization =====\\n');\n\n // Initialize screen/HUD module\n CG_InitScreen(cgi);\n\n // Register CVars\n cg_predict = cgi.Cvar_Get('cg_predict', '1', 0);\n cg_showmiss = cgi.Cvar_Get('cg_showmiss', '0', 0);\n\n cgi.Com_Print('CGame initialized\\n');\n}\n\n/**\n * Shutdown the CGame module.\n * Reference: rerelease/cg_main.cpp ShutdownCGame()\n */\nfunction Shutdown(): void {\n if (cgi) {\n cgi.Com_Print('CGame shutdown\\n');\n }\n cgi = null;\n}\n\n/**\n * Main HUD drawing function (wrapper for CG_DrawHUD).\n * Reference: rerelease/cg_screen.cpp CG_DrawHUD()\n */\nfunction DrawHUD(\n isplit: number,\n data: unknown,\n hud_vrect: { x: number; y: number; width: number; height: number },\n hud_safe: { x: number; y: number; width: number; height: number },\n scale: number,\n playernum: number,\n ps: PlayerState\n): void {\n CG_DrawHUD(isplit, data, hud_vrect, hud_safe, scale, playernum, ps);\n}\n\n/**\n * Precache all HUD images.\n * Reference: rerelease/cg_screen.cpp TouchPics()\n */\nfunction TouchPics(): void {\n CG_TouchPics();\n}\n\n/**\n * Get layout flags for current player state.\n * Reference: rerelease/cg_screen.cpp\n */\nfunction GetLayoutFlags(ps: PlayerState): LayoutFlags {\n // TODO: Implement proper layout flag calculation\n // Based on inventory state, help state, intermission, etc.\n return 0 as LayoutFlags; // No flags set by default\n}\n\n/**\n * Placeholder stubs for remaining CGameExport functions.\n * These will be implemented as needed.\n */\n\nfunction GetActiveWeaponWheelWeapon(ps: PlayerState): number {\n return ps.stats[PlayerStat.STAT_ACTIVE_WHEEL_WEAPON] ?? 0;\n}\n\nfunction GetOwnedWeaponWheelWeapons(ps: PlayerState): number[] {\n const owned: number[] = [];\n const bits1 = ps.stats[PlayerStat.STAT_WEAPONS_OWNED_1] || 0;\n const bits2 = ps.stats[PlayerStat.STAT_WEAPONS_OWNED_2] || 0;\n const fullBits = bits1 | (bits2 << 16);\n\n for (let i = 0; i < WEAPON_WHEEL_ORDER.length; i++) {\n if (fullBits & (1 << i)) {\n owned.push(i);\n }\n }\n return owned;\n}\n\nfunction GetWeaponWheelAmmoCount(ps: PlayerState, weapon: number): number {\n if (weapon < 0 || weapon >= WEAPON_WHEEL_ORDER.length) {\n return 0;\n }\n const weaponId = WEAPON_WHEEL_ORDER[weapon];\n const ammoType = WEAPON_AMMO_MAP[weaponId];\n if (ammoType === null) {\n return -1; // Infinite/No ammo\n }\n return G_GetAmmoStat(ps.stats, ammoType);\n}\n\nfunction GetPowerupWheelCount(ps: PlayerState): number {\n let count = 0;\n // Iterate over all known powerups to check if they are active\n const powerups = Object.values(PowerupId);\n for (const id of powerups) {\n if (G_GetPowerupStat(ps.stats, id) > 0) {\n count++;\n }\n }\n return count;\n}\n\nfunction GetHitMarkerDamage(ps: PlayerState): number {\n return ps.stats[PlayerStat.STAT_HIT_MARKER] ?? 0;\n}\n\n/**\n * Pmove implementation for client-side prediction.\n * Calls the shared Pmove() function (applyPmove in TS port).\n *\n * @param pmove - PmoveInfo structure (similar to pmove_t)\n */\nfunction Pmove(pmove: unknown): void {\n const pm = pmove as PmoveInfo;\n if (!pm || !pm.s || !pm.cmd || !cgi) {\n return;\n }\n\n // If prediction is disabled, do nothing (server state prevails)\n if (cg_predict && cg_predict.value === 0) {\n return;\n }\n\n // Adapter for PmoveTraceFn using CGameImport trace\n const traceAdapter = (start: Vec3, end: Vec3, mins?: Vec3, maxs?: Vec3): PmoveTraceResult => {\n // Shared PmoveTraceFn uses optional mins/maxs, CGameImport expects them.\n // If not provided, assume point trace (0,0,0)\n const zero: Vec3 = { x: 0, y: 0, z: 0 };\n return cgi!.PM_Trace(\n start,\n end,\n mins || zero,\n maxs || zero\n );\n };\n\n // Adapter for PmovePointContentsFn using CGameImport trace\n const pointContentsAdapter = (point: Vec3): number => {\n const zero: Vec3 = { x: 0, y: 0, z: 0 };\n // Perform a point trace to get contents\n const tr = cgi!.PM_Trace(point, point, zero, zero);\n return tr.contents || 0;\n };\n\n // Check for prediction errors if enabled\n // Note: The actual prediction logic (reconciliation) happens in ClientPrediction class which\n // drives the client-side state update. However, Pmove here is called by the client engine\n // to execute the *current* frame's prediction during the client loop.\n\n // In Quake 2, CL_PredictMovement calls Pmove repeatedly.\n // The client prediction class we built (ClientPrediction) encapsulates state management.\n // Ideally, the client engine should use ClientPrediction to get the state to render.\n\n // But keeping with the Pmove API:\n // This function simply advances the physics for one command.\n\n // Call shared Pmove implementation\n // This returns a NEW PlayerState, so we must update pm.s\n const newState = applyPmove(pm.s, pm.cmd, traceAdapter, pointContentsAdapter);\n\n // Update mutable state\n pm.s.origin = newState.origin;\n pm.s.velocity = newState.velocity;\n pm.s.onGround = newState.onGround;\n pm.s.waterLevel = newState.waterLevel;\n // applyPmove might update other fields in the future\n\n // If debug enabled, we might log something here, but Pmove is high frequency.\n // We defer logging to the reconciliation step in ClientPrediction.\n}\n\nfunction ParseConfigString(i: number, s: string): void {\n if (!cgi) return;\n CG_ParseConfigString(cgi, i, s);\n}\n\nfunction ParseCenterPrint(str: string, isplit: number, instant: boolean): void {\n if (!cgi) return;\n const messageSystem = CG_GetMessageSystem();\n // TODO: Parse layout strings and handle key bindings\n messageSystem.setCenterPrint(str, cgi.CL_ClientTime());\n}\n\nfunction NotifyMessage(isplit: number, msg: string, is_chat: boolean): void {\n if (!cgi) return;\n const messageSystem = CG_GetMessageSystem();\n messageSystem.addNotification(msg, is_chat, cgi.CL_ClientTime());\n}\n\nfunction ClearNotify(isplit: number): void {\n const messageSystem = CG_GetMessageSystem();\n messageSystem.clearNotifications();\n}\n\nfunction ClearCenterprint(isplit: number): void {\n const messageSystem = CG_GetMessageSystem();\n messageSystem.clearCenterPrint();\n}\n\nfunction ShowSubtitle(text: string, soundName: string): void {\n if (!cgi) return;\n const subtitleSystem = CG_GetSubtitleSystem();\n subtitleSystem.addSubtitle(text, cgi.CL_ClientTime());\n}\n\nfunction GetMonsterFlashOffset(id: number): Vec3 {\n return { x: 0, y: 0, z: 0 };\n}\n\nfunction GetExtension(name: string): unknown {\n return null;\n}\n\n/**\n * Main entry point for CGame module.\n * Reference: rerelease/cg_main.cpp GetCGameAPI()\n *\n * @param imports - Functions provided by the client engine\n * @returns CGame export interface\n */\nexport function GetCGameAPI(imports: CGameImport): CGameExport {\n cgi = imports;\n\n return {\n // Lifecycle\n Init,\n Shutdown,\n\n // Rendering\n DrawHUD,\n TouchPics,\n\n // Layout\n LayoutFlags: GetLayoutFlags,\n\n // Weapon wheel\n GetActiveWeaponWheelWeapon,\n GetOwnedWeaponWheelWeapons,\n GetWeaponWheelAmmoCount,\n GetPowerupWheelCount,\n\n // Hit markers\n GetHitMarkerDamage,\n\n // Prediction\n Pmove,\n\n // Parsing\n ParseConfigString,\n ParseCenterPrint,\n NotifyMessage,\n ShowSubtitle,\n\n // State management\n ClearNotify,\n ClearCenterprint,\n\n // Effects\n GetMonsterFlashOffset,\n\n // Extension\n GetExtension,\n };\n}\n"]}