@bardway/trpg-pixi 0.0.0-stage → 0.1.0

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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +10 -0
  3. package/NOTICE.md +1 -0
  4. package/README.md +25 -2
  5. package/dist/AnimationMilestones.d.ts +17 -0
  6. package/dist/BattleActionMotionMath.d.ts +24 -0
  7. package/dist/BattleActionPresentationRecipes.d.ts +11 -0
  8. package/dist/BattleFxLibrary.d.ts +16 -0
  9. package/dist/BattlePresentationEngine.d.ts +26 -0
  10. package/dist/BattlePresentationPoseRegistry.d.ts +25 -0
  11. package/dist/BattlePresentationRecipe.d.ts +48 -0
  12. package/dist/BattleSequenceScheduler.d.ts +11 -0
  13. package/dist/DisplayEventQueue.d.ts +24 -0
  14. package/dist/PixiAnimationActivity.d.ts +7 -0
  15. package/dist/PixiAnimationDirector.d.ts +21 -0
  16. package/dist/PixiApplicationFactory.d.ts +17 -0
  17. package/dist/PixiAssetManager.d.ts +70 -0
  18. package/dist/PixiBattleActionRecipes.d.ts +75 -0
  19. package/dist/PixiBattleCinematicSurface.d.ts +23 -0
  20. package/dist/PixiBattleEntryTransition.d.ts +87 -0
  21. package/dist/PixiBattleFieldSurface.d.ts +125 -0
  22. package/dist/PixiBattleFxResources.d.ts +154 -0
  23. package/dist/PixiBattleGrid.d.ts +13 -0
  24. package/dist/PixiBattleHudPorts.d.ts +192 -0
  25. package/dist/PixiBattleHudSurface.d.ts +159 -0
  26. package/dist/PixiBattleLightningResources.d.ts +57 -0
  27. package/dist/PixiBattleMapDissolve.d.ts +38 -0
  28. package/dist/PixiBattleSceneTransition.d.ts +30 -0
  29. package/dist/PixiBattleTokenLifecycleCoordinator.d.ts +44 -0
  30. package/dist/PixiBattleVisualLayout.d.ts +284 -0
  31. package/dist/PixiBattleWhipGeometry.d.ts +18 -0
  32. package/dist/PixiBattleWhipMotion.d.ts +63 -0
  33. package/dist/PixiBattleWhipResources.d.ts +53 -0
  34. package/dist/PixiCameraFocusController.d.ts +40 -0
  35. package/dist/PixiCombatMotion.d.ts +223 -0
  36. package/dist/PixiCurrentActorCardGlow.d.ts +37 -0
  37. package/dist/PixiCurrentActorHalo.d.ts +55 -0
  38. package/dist/PixiDirectionalMotionBlur.d.ts +12 -0
  39. package/dist/PixiDisplayRenderer.d.ts +85 -0
  40. package/dist/PixiEffectPlugin.d.ts +25 -0
  41. package/dist/PixiEndingSurface.d.ts +104 -0
  42. package/dist/PixiInvestigatorDossierInsanityFilter.d.ts +14 -0
  43. package/dist/PixiLocalGlowMesh.d.ts +38 -0
  44. package/dist/PixiMapEdgeShadow.d.ts +36 -0
  45. package/dist/PixiMapMediaSurface.d.ts +71 -0
  46. package/dist/PixiMapWorldUtils.d.ts +24 -0
  47. package/dist/PixiMediaBreathRuntime.d.ts +69 -0
  48. package/dist/PixiMotion.d.ts +42 -0
  49. package/dist/PixiObjectiveBreathingGlow.d.ts +39 -0
  50. package/dist/PixiPartyHudSurface.d.ts +58 -0
  51. package/dist/PixiPersistentEffectTransition.d.ts +23 -0
  52. package/dist/PixiPortraitResourceCard.d.ts +147 -0
  53. package/dist/PixiPreludeStoryTransition.d.ts +35 -0
  54. package/dist/PixiPreludeSurface.d.ts +203 -0
  55. package/dist/PixiProgressCinematic.d.ts +65 -0
  56. package/dist/PixiResultEffectSurface.d.ts +101 -0
  57. package/dist/PixiRetainedMeterAnimator.d.ts +44 -0
  58. package/dist/PixiRuntimeContext.d.ts +21 -0
  59. package/dist/PixiSceneGraph.d.ts +42 -0
  60. package/dist/PixiSceneMotion.d.ts +41 -0
  61. package/dist/PixiSceneMotionPorts.d.ts +83 -0
  62. package/dist/PixiScenePresentationDirector.d.ts +118 -0
  63. package/dist/PixiSessionLayout.d.ts +61 -0
  64. package/dist/PixiSessionSkin.d.ts +30 -0
  65. package/dist/PixiShaderRuntime.d.ts +191 -0
  66. package/dist/PixiStageFontLoader.d.ts +2 -0
  67. package/dist/PixiStageMetrics.d.ts +25 -0
  68. package/dist/PixiStageTheme.d.ts +26 -0
  69. package/dist/PixiStoryArchiveMotion.d.ts +19 -0
  70. package/dist/PixiStoryCardCut.d.ts +58 -0
  71. package/dist/PixiStorySurface.d.ts +285 -0
  72. package/dist/PixiStoryWorkspaceSurface.d.ts +64 -0
  73. package/dist/PixiSummaryBoardSurface.d.ts +112 -0
  74. package/dist/PixiSystemHudSurface.d.ts +73 -0
  75. package/dist/PixiTeamCheckCinematic.d.ts +34 -0
  76. package/dist/PixiTextTransitionEffect.d.ts +54 -0
  77. package/dist/PixiTokenPersistentStatus.d.ts +101 -0
  78. package/dist/PixiTokenWorld.d.ts +170 -0
  79. package/dist/PixiTypography.d.ts +96 -0
  80. package/dist/PixiVideoRuntime.d.ts +61 -0
  81. package/dist/PixiViewportController.d.ts +25 -0
  82. package/dist/ResultEffectTuning.d.ts +57 -0
  83. package/dist/RetainedStageSurface.d.ts +50 -0
  84. package/dist/SessionFieldEffectRuntime.d.ts +45 -0
  85. package/dist/SessionSceneHistory.d.ts +10 -0
  86. package/dist/SessionSceneRegistry.d.ts +31 -0
  87. package/dist/StoryEventCoordinator.d.ts +61 -0
  88. package/dist/effects/PixiEffectLayerRegistry.d.ts +54 -0
  89. package/dist/effects/PixiEffectScope.d.ts +20 -0
  90. package/dist/effects/PixiStableRandom.d.ts +2 -0
  91. package/dist/index.d.ts +92 -0
  92. package/dist/index.js +24184 -0
  93. package/dist/index.js.map +7 -0
  94. package/dist/recipes/EffectPrimitiveRuntimeRegistry.d.ts +28 -0
  95. package/dist/recipes/EffectRecipeExecutor.d.ts +73 -0
  96. package/dist/recipes/primitives.d.ts +39 -0
  97. package/dist/recipes/registry.d.ts +57 -0
  98. package/dist/recipes/schema.d.ts +93 -0
  99. package/dist/recipes.d.ts +5 -0
  100. package/dist/recipes.js +1384 -0
  101. package/dist/recipes.js.map +7 -0
  102. package/dist/story/PixiStoryPresentationEngine.d.ts +90 -0
  103. package/dist/story/StoryContentSurface.d.ts +34 -0
  104. package/dist/story/StoryImageFilter.d.ts +15 -0
  105. package/dist/story/StoryTimelineClock.d.ts +22 -0
  106. package/dist/story/StoryVisualMath.d.ts +6 -0
  107. package/dist/tuning/SessionTuningResolver.d.ts +1 -0
  108. package/dist/tuning/SessionTuningTypes.d.ts +1 -0
  109. package/dist/ui/PixiStagePrimitives.d.ts +36 -0
  110. package/dist/uniforms.d.ts +1 -0
  111. package/package.json +44 -4
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/PixiAnimationActivity.ts", "../src/PixiAnimationDirector.ts", "../src/PixiMotion.ts", "../src/PixiStageMetrics.ts", "../src/PixiApplicationFactory.ts", "../src/PixiAssetManager.ts", "../src/PixiSessionLayout.ts", "../src/PixiBattleCinematicSurface.ts", "../src/uniforms.ts", "../src/PixiBattleWhipGeometry.ts", "../src/PixiBattleWhipResources.ts", "../src/PixiBattleLightningResources.ts", "../src/PixiBattleFxResources.ts", "../src/PixiBattleMapDissolve.ts", "../src/PixiDirectionalMotionBlur.ts", "../src/PixiBattleSceneTransition.ts", "../src/PixiBattleTokenLifecycleCoordinator.ts", "../src/PixiCurrentActorCardGlow.ts", "../src/PixiCurrentActorHalo.ts", "../src/PixiInvestigatorDossierInsanityFilter.ts", "../src/PixiLocalGlowMesh.ts", "../src/PixiMapEdgeShadow.ts", "../src/PixiMediaBreathRuntime.ts", "../src/PixiObjectiveBreathingGlow.ts", "../src/PixiPersistentEffectTransition.ts", "../src/effects/PixiStableRandom.ts", "../src/PixiMapWorldUtils.ts", "../src/PixiPreludeStoryTransition.ts", "../src/PixiRetainedMeterAnimator.ts", "../src/PixiRuntimeContext.ts", "../src/PixiSceneGraph.ts", "../src/PixiStoryArchiveMotion.ts", "../src/PixiTeamCheckCinematic.ts", "../src/PixiVideoRuntime.ts", "../src/PixiViewportController.ts", "../src/BattlePresentationPoseRegistry.ts", "../src/BattlePresentationRecipe.ts", "../src/BattleSequenceScheduler.ts", "../src/BattleActionPresentationRecipes.ts", "../src/PixiBattleActionRecipes.ts", "../src/effects/PixiEffectScope.ts", "../src/effects/PixiEffectLayerRegistry.ts", "../src/story/StoryTimelineClock.ts", "../src/story/StoryImageFilter.ts", "../src/story/StoryVisualMath.ts", "../src/PixiShaderRuntime.ts", "../src/DisplayEventQueue.ts", "../src/AnimationMilestones.ts", "../src/PixiTypography.ts", "../src/ui/PixiStagePrimitives.ts", "../src/BattleFxLibrary.ts", "../src/BattlePresentationEngine.ts", "../src/PixiStageFontLoader.ts", "../src/PixiDisplayRenderer.ts", "../src/RetainedStageSurface.ts", "../src/BattleActionMotionMath.ts", "../src/PixiBattleVisualLayout.ts", "../src/PixiBattleEntryTransition.ts", "../src/PixiStoryCardCut.ts", "../src/PixiBattleWhipMotion.ts", "../src/recipes/EffectPrimitiveRuntimeRegistry.ts", "../src/recipes/schema.ts", "../src/recipes/registry.ts", "../src/recipes/EffectRecipeExecutor.ts", "../src/story/PixiStoryPresentationEngine.ts", "../src/PixiEffectPlugin.ts", "../src/SessionSceneRegistry.ts", "../src/SessionSceneHistory.ts", "../src/PixiSessionSkin.ts", "../src/SessionFieldEffectRuntime.ts", "../src/PixiBattleGrid.ts", "../src/StoryEventCoordinator.ts", "../src/PixiTokenWorld.ts", "../src/PixiMapMediaSurface.ts", "../src/PixiCombatMotion.ts", "../src/PixiTokenPersistentStatus.ts", "../src/PixiEndingSurface.ts", "../src/PixiPreludeSurface.ts", "../src/PixiPortraitResourceCard.ts", "../src/PixiPartyHudSurface.ts", "../src/PixiStoryWorkspaceSurface.ts", "../src/PixiStorySurface.ts", "../src/PixiBattleFieldSurface.ts", "../src/PixiResultEffectSurface.ts", "../src/PixiSummaryBoardSurface.ts", "../src/PixiBattleHudPorts.ts", "../src/PixiBattleHudSurface.ts", "../src/PixiScenePresentationDirector.ts", "../src/PixiSystemHudSurface.ts", "../src/PixiCameraFocusController.ts", "../src/PixiProgressCinematic.ts", "../src/PixiSceneMotion.ts", "../src/PixiTextTransitionEffect.ts"],
4
+ "sourcesContent": ["import type { Ticker } from 'pixi.js';\n\nexport interface PixiAnimationActivity {\n acquire(reason: string): () => void;\n clear(): void;\n setPaused(paused: boolean): void;\n}\n\nexport const createPixiAnimationActivity = (ticker: Ticker): PixiAnimationActivity => {\n const reasons = new Map<string, number>();\n let generation = 0;\n let paused = false;\n\n const syncTicker = () => {\n if (reasons.size > 0 && !paused) ticker.start();\n else ticker.stop();\n };\n\n return {\n acquire(reason) {\n const ticket = generation;\n reasons.set(reason, (reasons.get(reason) ?? 0) + 1);\n syncTicker();\n let released = false;\n return () => {\n if (released) return;\n released = true;\n if (ticket !== generation) return;\n const count = reasons.get(reason) ?? 0;\n if (count <= 1) reasons.delete(reason);\n else reasons.set(reason, count - 1);\n syncTicker();\n };\n },\n clear() {\n generation++;\n reasons.clear();\n ticker.stop();\n },\n setPaused(value) {\n paused = value;\n syncTicker();\n },\n };\n};\n", "import { gsap } from 'gsap';\nimport { pixiMotion } from './PixiMotion.js';\nimport type { StoryTimelineClock } from './story/StoryTimelineClock.js';\nimport type { PixiAnimationActivity } from './PixiAnimationActivity.js';\n\nexport type PixiTweenTarget = Parameters<typeof gsap.to>[0];\nexport type PixiTweenVars = Parameters<typeof gsap.to>[1];\nexport type PixiManagedTweenVars = PixiTweenVars & {\n /** Keep a short, explicit duration when reduced-motion mode would otherwise make it instant. */\n reducedMotionDuration?: number;\n};\n\ninterface ManagedTween {\n readonly tween: gsap.core.Tween;\n readonly settle: () => void;\n}\n\nexport interface PixiAnimationDirector {\n tween(target: PixiTweenTarget, vars: PixiManagedTweenVars, signal: AbortSignal): Promise<void>;\n sequence(tasks: Array<() => Promise<void>>, signal: AbortSignal): Promise<void>;\n loop(target: PixiTweenTarget, vars: PixiTweenVars): () => void;\n setReducedMotion(reducedMotion: boolean): void;\n setPlaybackRate(rate: number): void;\n pause(): void;\n resume(): void;\n clear(): void;\n destroy(): void;\n}\n\nexport const createPixiAnimationDirector = (\n clock: StoryTimelineClock,\n activity?: PixiAnimationActivity,\n): PixiAnimationDirector => {\n const tweens = new Set<ManagedTween>();\n let destroyed = false;\n let paused = false;\n let reducedMotion = false;\n let playbackRate = 1;\n\n const settleAll = () => {\n for (const managed of [...tweens]) {\n managed.tween.kill();\n managed.settle();\n }\n };\n\n return {\n tween(target, vars, signal) {\n if (destroyed || signal.aborted) return Promise.resolve();\n return new Promise((resolve) => {\n const releaseActivity = activity?.acquire('finite-tween');\n let settled = false;\n let managed: ManagedTween | null = null;\n let detachClock: (() => void) | undefined;\n const settle = () => {\n if (settled) return;\n settled = true;\n releaseActivity?.();\n detachClock?.();\n signal.removeEventListener('abort', abort);\n if (managed) tweens.delete(managed);\n resolve();\n };\n const abort = () => {\n managed?.tween.kill();\n settle();\n };\n const { reducedMotionDuration, ...tweenVars } = vars;\n const tween = gsap.to(target, {\n ...tweenVars,\n paused: true,\n duration: reducedMotion\n ? (reducedMotionDuration ?? pixiMotion.duration.instant)\n : vars.duration,\n onComplete: () => {\n vars.onComplete?.();\n settle();\n },\n });\n {\n const start = clock.now();\n detachClock = clock.subscribe((now) => {\n tween.totalTime(\n Math.max(0, (now - start) / 1000 - (typeof vars.delay === 'number' ? vars.delay : 0)),\n false,\n );\n });\n }\n managed = { tween, settle };\n tweens.add(managed);\n signal.addEventListener('abort', abort, { once: true });\n if ((reducedMotion ? (reducedMotionDuration ?? 0) : vars.duration) === 0) {\n tween.totalTime(0, false);\n tween.progress(1, false);\n settle();\n }\n if (paused) tween.pause();\n });\n },\n async sequence(tasks, signal) {\n for (const task of tasks) {\n if (destroyed || signal.aborted) return;\n await task();\n }\n },\n loop(target, vars) {\n if (destroyed || reducedMotion) return () => undefined;\n let settled = false;\n const releaseActivity = activity?.acquire('loop-tween');\n const tween = gsap.to(target, { ...vars, repeat: -1, paused: true });\n const start = clock.now();\n const detachClock = clock.subscribe((now) => {\n if (!paused) tween.totalTime(Math.max(0, (now - start) / 1000), false);\n });\n const managed: ManagedTween = {\n tween,\n settle: () => {\n if (settled) return;\n settled = true;\n detachClock();\n releaseActivity?.();\n tweens.delete(managed);\n },\n };\n tweens.add(managed);\n if (paused) tween.pause();\n return () => {\n tween.kill();\n managed.settle();\n };\n },\n setReducedMotion(nextReducedMotion) {\n reducedMotion = nextReducedMotion;\n if (reducedMotion) settleAll();\n },\n setPlaybackRate(rate) {\n playbackRate = Math.max(0.1, Math.min(2, rate));\n if (!clock) for (const { tween } of tweens) tween.timeScale(playbackRate);\n },\n pause() {\n paused = true;\n for (const { tween } of tweens) tween.pause();\n },\n resume() {\n paused = false;\n if (!destroyed && !clock) for (const { tween } of tweens) tween.resume();\n },\n clear: settleAll,\n destroy() {\n destroyed = true;\n settleAll();\n },\n };\n};\n", "export const pixiMotion = {\n duration: { instant: 0, fast: 0.16, normal: 0.28, slow: 0.46, cinematic: 0.8 },\n preset: {\n fadeIn: { duration: 0.28, ease: 'power2.out' },\n fadeOut: { duration: 0.16, ease: 'power1.out' },\n enter: { duration: 0.28, ease: 'power3.out' },\n emphasis: { duration: 0.46, ease: 'power2.inOut' },\n },\n battleCurrentActor: {\n enterDurationMs: 280,\n enterOffsetPx: 4,\n breathePeriodMs: 2400,\n innerGlowAlpha: { min: 0.34, max: 0.58 },\n },\n} as const;\n\n/** Existing battle effect timings stay explicit and do not become general UI values. */\nexport const pixiCinematicTimings = {\n impact: 0.12,\n resource: 0.28,\n return: 0.22,\n} as const;\n", "export const PIXI_STAGE_METRICS = {\n width: 1920,\n height: 1080,\n centerX: 960,\n centerY: 540,\n aspectRatio: 16 / 9,\n edgeInset: 28,\n overscanRatio: 0.05,\n} as const;\n\nexport const PIXI_STAGE_SAFE_AREA = {\n x: PIXI_STAGE_METRICS.edgeInset,\n y: PIXI_STAGE_METRICS.edgeInset,\n width: PIXI_STAGE_METRICS.width - PIXI_STAGE_METRICS.edgeInset * 2,\n height: PIXI_STAGE_METRICS.height - PIXI_STAGE_METRICS.edgeInset * 2,\n} as const;\n\nexport const PIXI_STAGE_OVERSCAN_AREA = {\n x: PIXI_STAGE_METRICS.width * PIXI_STAGE_METRICS.overscanRatio,\n y: PIXI_STAGE_METRICS.height * PIXI_STAGE_METRICS.overscanRatio,\n width: PIXI_STAGE_METRICS.width * (1 - PIXI_STAGE_METRICS.overscanRatio * 2),\n height: PIXI_STAGE_METRICS.height * (1 - PIXI_STAGE_METRICS.overscanRatio * 2),\n} as const;\n\nexport const PIXI_LOGICAL_STAGE = {\n width: PIXI_STAGE_METRICS.width,\n height: PIXI_STAGE_METRICS.height,\n} as const;\n", "import type { Application } from 'pixi.js';\nimport { PIXI_LOGICAL_STAGE } from './PixiStageMetrics.js';\n\nexport { PIXI_LOGICAL_STAGE } from './PixiStageMetrics.js';\n\nexport const STAGE_RENDER_QUALITIES = {\n performance: 1,\n balanced: 1.25,\n quality: 1.5,\n ultra: 2,\n} as const;\n\nexport type StageRenderQuality = keyof typeof STAGE_RENDER_QUALITIES;\n\nexport const resolveStageRenderQuality = (value: unknown): StageRenderQuality =>\n typeof value === 'string' && value in STAGE_RENDER_QUALITIES\n ? (value as StageRenderQuality)\n : 'balanced';\n\nconst getDevicePixelRatio = (): number =>\n typeof window === 'undefined' ? 1 : window.devicePixelRatio;\n\nconst normalizeDevicePixelRatio = (value: unknown): number =>\n typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : 1;\n\n/** Resolves the device pixel ratio without exceeding the selected render-quality ceiling. */\nexport const resolveDisplayResolution = (\n quality: unknown,\n devicePixelRatio: unknown = getDevicePixelRatio(),\n): number =>\n Math.min(\n STAGE_RENDER_QUALITIES[resolveStageRenderQuality(quality)],\n normalizeDevicePixelRatio(devicePixelRatio),\n );\n\nexport type PixiApplicationConstructor = new () => Application;\n\nexport const createPixiApplication = async (\n ApplicationConstructor: PixiApplicationConstructor,\n quality: unknown = 'balanced',\n stage: { width: number; height: number } = PIXI_LOGICAL_STAGE,\n): Promise<Application> => {\n const app = new ApplicationConstructor();\n await app.init({\n preference: 'webgl',\n sharedTicker: false,\n autoStart: false,\n antialias: true,\n backgroundAlpha: 0,\n powerPreference: 'high-performance',\n width: stage.width,\n height: stage.height,\n resolution: resolveDisplayResolution(quality),\n autoDensity: true,\n });\n return app;\n};\n", "import type { Texture } from 'pixi.js';\nimport {\n retrySessionDisplayResource,\n SESSION_DISPLAY_RESOURCE_RETRY_COUNT,\n SESSION_DISPLAY_RESOURCE_RETRY_DELAY_MS,\n} from '@bardway/trpg-media';\n\ninterface PixiAssetLoadOptions {\n readonly strategy: 'retry';\n readonly retryCount: number;\n readonly retryDelay: number;\n}\n\ninterface PixiAssetsApi {\n load: (asset: PixiAssetDescriptor, options?: PixiAssetLoadOptions) => Promise<Texture>;\n unload: (aliases: string[]) => Promise<void> | void;\n}\n\ninterface PixiAssetDescriptor {\n alias: string;\n src: string;\n parser?: 'video';\n data?: {\n autoPlay: false;\n loop: true;\n muted: true;\n playsinline: true;\n preload: true;\n updateFPS: 0;\n crossorigin: true;\n mime: 'video/webm';\n };\n}\n\ninterface AssetRecord {\n readonly alias: string;\n readonly src: string;\n readonly scopes: Set<string>;\n load: Promise<Texture>;\n generation: number;\n loaded: boolean;\n readonly videoSource?: VideoObjectSource;\n unload: Promise<void> | null;\n}\n\ninterface SharedAssetOwnership {\n readonly retainedSources: Map<string, Set<AssetRecord>>;\n readonly pendingUnloads: Map<string, Promise<void>>;\n}\n\n// Pixi's cache is shared by every renderer using the same Assets API.\nconst ownershipByAssets = new WeakMap<PixiAssetsApi, SharedAssetOwnership>();\n\nconst getSharedOwnership = (assets: PixiAssetsApi): SharedAssetOwnership => {\n let ownership = ownershipByAssets.get(assets);\n if (!ownership) {\n ownership = { retainedSources: new Map(), pendingUnloads: new Map() };\n ownershipByAssets.set(assets, ownership);\n }\n return ownership;\n};\n\ninterface VideoObjectSource {\n readonly originalSrc: string;\n readonly objectUrl: string;\n managed: boolean;\n revoked: boolean;\n}\n\ninterface VideoBlobRecord {\n readonly controller: AbortController;\n readonly load: Promise<Blob>;\n}\n\ninterface VideoDownloadQueue {\n active: number;\n readonly waiting: Array<() => void>;\n}\n\ninterface PixiVideoAssetDependencies {\n readonly fetchVideo?: typeof fetch;\n readonly createObjectURL?: typeof URL.createObjectURL;\n readonly revokeObjectURL?: typeof URL.revokeObjectURL;\n readonly retryDelayMs?: number;\n readonly resolveUrl?: (url: string) => string;\n}\n\nconst MAX_VIDEO_DOWNLOADS = 2;\n\nexport type PixiAssetScope =\n | 'stage-critical'\n | 'stage-ui'\n | 'battle-common'\n | `scene:${string}`\n | `battle-map:${string}`\n | `effect:${string}`\n | `cinematic:${string}`\n | `hud-clue:${string}`\n | `runtime:${string}`;\n\n/**\n * Renderer-local asset ownership on top of Pixi Assets' global cache.\n * A scope may request the same alias many times; it is loaded once and released\n * only after its final scope is released.\n */\nexport class PixiAssetManager {\n private readonly records = new Map<string, AssetRecord>();\n private readonly aliasesByScope = new Map<string, Set<string>>();\n private readonly sharedOwnership: SharedAssetOwnership;\n private readonly pendingSourceUnloads: Map<string, Promise<void>>;\n private readonly ownUnloads = new Set<Promise<void>>();\n private readonly waitingScopeLoads = new Map<string, Set<{ cancelled: boolean }>>();\n private readonly videoBytes = new Map<string, VideoBlobRecord>();\n private videoDownloads: VideoDownloadQueue = { active: 0, waiting: [] };\n private videoGeneration = 0;\n private disposed = false;\n\n constructor(\n private readonly assets: PixiAssetsApi,\n private readonly videoDependencies: PixiVideoAssetDependencies = {},\n ) {\n this.sharedOwnership = getSharedOwnership(assets);\n this.pendingSourceUnloads = this.sharedOwnership.pendingUnloads;\n }\n\n async loadTexture(\n alias: string,\n src: string,\n scope: PixiAssetScope | string = 'stage-critical',\n signal?: AbortSignal,\n ): Promise<Texture> {\n return this.loadAsset(\n { alias, src: this.videoDependencies.resolveUrl?.(src) ?? src },\n scope,\n signal,\n );\n }\n\n async loadVideoTexture(\n alias: string,\n src: string,\n scope: PixiAssetScope | string,\n signal?: AbortSignal,\n ): Promise<Texture> {\n const generation = this.videoGeneration;\n const originalSrc = this.videoDependencies.resolveUrl?.(src) ?? src;\n const blob = await this.loadVideoBlob(originalSrc, signal);\n if (this.disposed || signal?.aborted || generation !== this.videoGeneration) {\n throw createAbortError();\n }\n let videoSource = this.records.get(alias)?.videoSource;\n if (this.records.has(alias) && videoSource?.originalSrc !== originalSrc) {\n await this.releaseAlias(alias);\n if (this.disposed || signal?.aborted || generation !== this.videoGeneration) {\n throw createAbortError();\n }\n videoSource = undefined;\n }\n videoSource ??= {\n originalSrc,\n objectUrl: this.videoDependencies.createObjectURL?.(blob) ?? URL.createObjectURL(blob),\n managed: false,\n revoked: false,\n };\n try {\n return await this.loadAsset(\n {\n alias,\n src: videoSource.objectUrl,\n parser: 'video',\n data: {\n autoPlay: false,\n loop: true,\n muted: true,\n playsinline: true,\n preload: true,\n updateFPS: 0,\n crossorigin: true,\n mime: 'video/webm',\n },\n },\n scope,\n signal,\n videoSource,\n );\n } catch (error) {\n if (!videoSource.managed) this.revokeVideoSource(videoSource);\n throw error;\n }\n }\n\n async preloadVideoBytes(src: string, signal?: AbortSignal): Promise<void> {\n await this.loadVideoBlob(this.videoDependencies.resolveUrl?.(src) ?? src, signal);\n }\n\n async releaseVideoTexture(alias: string): Promise<void> {\n if (!this.records.get(alias)?.videoSource) return;\n await this.releaseAlias(alias);\n }\n\n clearVideoCache(): void {\n this.videoGeneration += 1;\n for (const record of this.videoBytes.values()) record.controller.abort();\n this.videoBytes.clear();\n this.videoDownloads = { active: 0, waiting: [] };\n }\n\n private async loadVideoBlob(src: string, signal?: AbortSignal): Promise<Blob> {\n if (this.disposed || signal?.aborted) throw createAbortError();\n let record = this.videoBytes.get(src);\n if (!record) {\n const controller = new AbortController();\n const generation = this.videoGeneration;\n const downloads = this.videoDownloads;\n const load = retrySessionDisplayResource(\n async () => {\n const releaseDownload = await reserveVideoDownload(downloads, controller.signal);\n try {\n if (this.disposed || controller.signal.aborted || generation !== this.videoGeneration) {\n throw createAbortError();\n }\n const fetchVideo = this.videoDependencies.fetchVideo ?? fetch;\n const response = await fetchVideo(src, { signal: controller.signal });\n if (!response.ok) throw new Error(`Session video request failed: ${response.status}`);\n const blob = await response.blob();\n if (this.disposed || controller.signal.aborted || generation !== this.videoGeneration) {\n throw createAbortError();\n }\n return blob;\n } finally {\n releaseDownload();\n }\n },\n {\n signal: controller.signal,\n retryCount: SESSION_DISPLAY_RESOURCE_RETRY_COUNT,\n retryDelayMs:\n this.videoDependencies.retryDelayMs ?? SESSION_DISPLAY_RESOURCE_RETRY_DELAY_MS,\n },\n );\n record = { controller, load };\n this.videoBytes.set(src, record);\n const loadingRecord = record;\n void load.catch(() => {\n if (this.videoBytes.get(src) === loadingRecord) this.videoBytes.delete(src);\n });\n }\n return waitForVideoLoad(waitForVideoLoad(record.load, record.controller.signal), signal);\n }\n\n private async loadAsset(\n descriptor: PixiAssetDescriptor,\n scope: PixiAssetScope | string,\n signal?: AbortSignal,\n videoSource?: VideoObjectSource,\n ): Promise<Texture> {\n if (this.disposed || signal?.aborted) throw createAbortError();\n const previous = this.records.get(descriptor.alias);\n if (previous && previous.src !== descriptor.src) await this.releaseAlias(descriptor.alias);\n let waiting: { cancelled: boolean } | undefined;\n let scopeLoads: Set<{ cancelled: boolean }> | undefined;\n if (this.pendingSourceUnloads.has(descriptor.src)) {\n waiting = { cancelled: false };\n scopeLoads = this.waitingScopeLoads.get(scope) ?? new Set<{ cancelled: boolean }>();\n scopeLoads.add(waiting);\n this.waitingScopeLoads.set(scope, scopeLoads);\n }\n let record: AssetRecord;\n try {\n if (waiting) await this.waitForSourceUnload(descriptor.src, signal);\n if (this.disposed || signal?.aborted || waiting?.cancelled) throw createAbortError();\n record = this.records.get(descriptor.alias) ?? this.createRecord(descriptor, videoSource);\n this.retain(scope, descriptor.alias, record);\n } finally {\n if (waiting && scopeLoads) {\n scopeLoads.delete(waiting);\n if (scopeLoads.size === 0 && this.waitingScopeLoads.get(scope) === scopeLoads) {\n this.waitingScopeLoads.delete(scope);\n }\n }\n }\n const generation = record.generation;\n let texture: Texture;\n try {\n texture = await record.load;\n } catch (error) {\n if (this.records.get(descriptor.alias) === record) {\n record.generation += 1;\n this.records.delete(descriptor.alias);\n for (const retainedScope of record.scopes) {\n this.aliasesByScope.get(retainedScope)?.delete(descriptor.alias);\n }\n this.releaseOwnership(record);\n }\n throw error;\n }\n if (\n this.disposed ||\n signal?.aborted ||\n this.records.get(descriptor.alias) !== record ||\n record.generation !== generation\n ) {\n throw createAbortError();\n }\n return texture;\n }\n\n async releaseScope(scope: PixiAssetScope | string): Promise<void> {\n for (const waiting of this.waitingScopeLoads.get(scope) ?? []) waiting.cancelled = true;\n this.waitingScopeLoads.delete(scope);\n const aliases = this.aliasesByScope.get(scope);\n if (!aliases) return;\n this.aliasesByScope.delete(scope);\n const released: AssetRecord[] = [];\n for (const alias of aliases) {\n const record = this.records.get(alias);\n if (!record) continue;\n record.scopes.delete(scope);\n if (record.scopes.size === 0) {\n record.generation += 1;\n this.records.delete(alias);\n this.releaseOwnership(record);\n released.push(record);\n }\n }\n await this.unloadOrphanedRecords(released);\n }\n\n async releaseAll(): Promise<void> {\n this.disposed = true;\n this.clearVideoCache();\n const records = [...this.records.values()];\n for (const record of records) this.releaseOwnership(record);\n this.records.clear();\n this.aliasesByScope.clear();\n const unloading = this.unloadOrphanedRecords(records);\n await Promise.all([unloading, ...this.ownUnloads]);\n }\n\n private async waitForSourceUnload(src: string, signal?: AbortSignal): Promise<void> {\n let unloading = this.pendingSourceUnloads.get(src);\n while (unloading) {\n await unloading;\n if (this.disposed || signal?.aborted) throw createAbortError();\n unloading = this.pendingSourceUnloads.get(src);\n }\n }\n\n private createRecord(asset: PixiAssetDescriptor, videoSource?: VideoObjectSource): AssetRecord {\n const { alias, src } = asset;\n const record: AssetRecord = {\n alias,\n src,\n scopes: new Set(),\n load: this.assets.load(\n { ...asset, alias: src },\n {\n strategy: 'retry',\n retryCount: SESSION_DISPLAY_RESOURCE_RETRY_COUNT,\n retryDelay: SESSION_DISPLAY_RESOURCE_RETRY_DELAY_MS,\n },\n ),\n generation: 0,\n loaded: false,\n videoSource,\n unload: null,\n };\n this.records.set(alias, record);\n if (videoSource) videoSource.managed = true;\n void record.load.then(\n () => {\n record.loaded = true;\n if (this.records.get(alias) !== record || record.scopes.size === 0) {\n void this.unloadOrphanedRecords([record]).catch(() => undefined);\n }\n },\n () => this.revokeVideoSource(record.videoSource),\n );\n return record;\n }\n\n private retain(scope: string, alias: string, record: AssetRecord): void {\n record.scopes.add(scope);\n const retained = this.sharedOwnership.retainedSources.get(record.src) ?? new Set<AssetRecord>();\n retained.add(record);\n this.sharedOwnership.retainedSources.set(record.src, retained);\n const aliases = this.aliasesByScope.get(scope) ?? new Set<string>();\n aliases.add(alias);\n this.aliasesByScope.set(scope, aliases);\n }\n\n private releaseOwnership(record: AssetRecord): void {\n const retained = this.sharedOwnership.retainedSources.get(record.src);\n retained?.delete(record);\n if (retained?.size === 0) this.sharedOwnership.retainedSources.delete(record.src);\n record.scopes.clear();\n }\n\n private async releaseAlias(alias: string): Promise<void> {\n const record = this.records.get(alias);\n if (!record) return;\n record.generation += 1;\n this.records.delete(alias);\n for (const scope of record.scopes) this.aliasesByScope.get(scope)?.delete(alias);\n this.releaseOwnership(record);\n await this.unloadOrphanedRecords([record]);\n }\n\n private async unloadOrphanedRecords(records: readonly AssetRecord[]): Promise<void> {\n const sourcesToUnload = new Set<string>();\n const recordsToUnload: AssetRecord[] = [];\n const pendingUnloads = new Set<Promise<void>>();\n for (const record of records) {\n if (!record.loaded) continue;\n if (this.sharedOwnership.retainedSources.has(record.src)) continue;\n const pendingUnload = record.unload ?? this.pendingSourceUnloads.get(record.src);\n if (pendingUnload) {\n record.unload = pendingUnload;\n pendingUnloads.add(pendingUnload);\n continue;\n }\n recordsToUnload.push(record);\n sourcesToUnload.add(record.src);\n }\n const sources = [...sourcesToUnload];\n if (sources.length > 0) {\n const unloading = Promise.resolve()\n .then(() => this.assets.unload(sources))\n .then(() => {\n for (const record of recordsToUnload) this.revokeVideoSource(record.videoSource);\n })\n .finally(() => {\n for (const src of sourcesToUnload) {\n if (this.pendingSourceUnloads.get(src) === unloading) {\n this.pendingSourceUnloads.delete(src);\n }\n }\n });\n for (const record of recordsToUnload) record.unload = unloading;\n for (const src of sourcesToUnload) this.pendingSourceUnloads.set(src, unloading);\n this.ownUnloads.add(unloading);\n void unloading.then(\n () => this.ownUnloads.delete(unloading),\n () => this.ownUnloads.delete(unloading),\n );\n pendingUnloads.add(unloading);\n }\n await Promise.all(pendingUnloads);\n }\n\n private revokeVideoSource(source?: VideoObjectSource): void {\n if (!source || source.revoked) return;\n source.revoked = true;\n if (this.videoDependencies.revokeObjectURL) {\n this.videoDependencies.revokeObjectURL(source.objectUrl);\n } else {\n URL.revokeObjectURL(source.objectUrl);\n }\n }\n}\n\nconst createAbortError = (): DOMException =>\n new DOMException('Pixi asset load was aborted', 'AbortError');\n\nconst reserveVideoDownload = (\n queue: VideoDownloadQueue,\n signal: AbortSignal,\n): Promise<() => void> => {\n if (signal.aborted) return Promise.reject(createAbortError());\n return new Promise((resolve, reject) => {\n const abort = () => {\n const index = queue.waiting.indexOf(start);\n if (index >= 0) queue.waiting.splice(index, 1);\n signal.removeEventListener('abort', abort);\n reject(createAbortError());\n };\n const start = () => {\n signal.removeEventListener('abort', abort);\n if (signal.aborted) {\n reject(createAbortError());\n return;\n }\n queue.active += 1;\n let released = false;\n resolve(() => {\n if (released) return;\n released = true;\n queue.active -= 1;\n queue.waiting.shift()?.();\n });\n };\n if (queue.active < MAX_VIDEO_DOWNLOADS) {\n start();\n } else {\n queue.waiting.push(start);\n signal.addEventListener('abort', abort, { once: true });\n }\n });\n};\n\nconst waitForVideoLoad = <T>(load: Promise<T>, signal?: AbortSignal): Promise<T> => {\n if (!signal) return load;\n if (signal.aborted) return Promise.reject(createAbortError());\n return new Promise((resolve, reject) => {\n const abort = () => {\n signal.removeEventListener('abort', abort);\n reject(createAbortError());\n };\n signal.addEventListener('abort', abort, { once: true });\n void load.then(\n (value) => {\n signal.removeEventListener('abort', abort);\n resolve(value);\n },\n (error: unknown) => {\n signal.removeEventListener('abort', abort);\n reject(error);\n },\n );\n });\n};\n", "import { PIXI_STAGE_METRICS } from './PixiStageMetrics.js';\nexport interface PixiLayoutRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface PixiLayoutCenter {\n x: number;\n y: number;\n}\n\n/** Builds a rect from a stable visual center for all image-layout scaling. */\nexport const resolvePixiLayoutRectAtCenter = (\n center: PixiLayoutCenter,\n size: Pick<PixiLayoutRect, 'width' | 'height'>,\n): PixiLayoutRect => ({\n x: center.x - size.width / 2,\n y: center.y - size.height / 2,\n width: size.width,\n height: size.height,\n});\n\nexport const resizePixiLayoutRectFromCenter = (\n rect: PixiLayoutRect,\n size: Pick<PixiLayoutRect, 'width' | 'height'>,\n): PixiLayoutRect =>\n resolvePixiLayoutRectAtCenter({ x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 }, size);\n\nexport interface BattleViewportGridLayout extends PixiLayoutRect {\n cols: number;\n rows: number;\n cellW: number;\n cellH: number;\n offsetX: number;\n offsetY: number;\n renderW: number;\n renderH: number;\n}\n\nexport const stablePortraitRotation = (id: string): number => {\n let hash = 2166136261;\n for (let index = 0; index < id.length; index += 1) {\n hash ^= id.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n return [-2, -1, 1, 2][Math.abs(hash) % 4] ?? 1;\n};\n\nexport const stableSeededRotation = (id: string, maxDegrees: number, salt = ''): number => {\n let hash = 2166136261;\n const value = `${salt}:${id}`;\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n const normalized = (hash >>> 0) / 0xffffffff;\n const degrees = (normalized * 2 - 1) * Math.abs(maxDegrees);\n return Math.round(degrees * 10) / 10;\n};\n\n/** Stable integer jitter for casually placed repeated cards; never returns zero. */\nexport const stableSeededPixelOffset = (\n id: string,\n minPixels = 1,\n maxPixels = 3,\n salt = '',\n): number => {\n const min = Math.max(1, Math.floor(Math.min(minPixels, maxPixels)));\n const max = Math.max(min, Math.floor(Math.max(minPixels, maxPixels)));\n let hash = 2166136261;\n const value = `${salt}:${id}`;\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n const unsigned = hash >>> 0;\n const magnitude = min + (unsigned % (max - min + 1));\n return (unsigned & 1) === 0 ? -magnitude : magnitude;\n};\n\nexport const clampResourceRatio = (\n current: number | undefined,\n max: number | undefined,\n): number => {\n if (!Number.isFinite(current) || !Number.isFinite(max) || (max ?? 0) <= 0) return 0;\n return Math.max(0, Math.min(1, (current ?? 0) / (max ?? 1)));\n};\n\nexport const normalizedPositionToScreen = (\n position: { x: number; y: number },\n rect: PixiLayoutRect,\n): { x: number; y: number } => ({\n x: rect.x + Math.max(0, Math.min(1, position.x)) * rect.width,\n y: rect.y + Math.max(0, Math.min(1, position.y)) * rect.height,\n});\n\nexport const resolveBattleViewportGridLayout = (\n map: { size: { width: number; height: number }; grid: { cols: number; rows: number } },\n viewport: PixiLayoutRect,\n): BattleViewportGridLayout => {\n const mapRatio = map.size.width / Math.max(1, map.size.height);\n const viewportRatio = viewport.width / viewport.height;\n const renderW = mapRatio > viewportRatio ? viewport.width : viewport.height * mapRatio;\n const renderH = mapRatio > viewportRatio ? viewport.width / mapRatio : viewport.height;\n const renderedMapRect = resizePixiLayoutRectFromCenter(viewport, {\n width: renderW,\n height: renderH,\n });\n return {\n ...viewport,\n cols: map.grid.cols,\n rows: map.grid.rows,\n cellW: renderW / map.grid.cols,\n cellH: renderH / map.grid.rows,\n offsetX: renderedMapRect.x,\n offsetY: renderedMapRect.y,\n renderW,\n renderH,\n };\n};\n\nexport interface PixiMosaicTile extends PixiLayoutRect {\n col: number;\n row: number;\n order: number;\n}\n\nconst transitionHash = (col: number, row: number, transitionId: string): number => {\n let hash = col * 73856093 + row * 19349663;\n for (let index = 0; index < transitionId.length; index += 1) {\n hash = Math.imul(hash ^ transitionId.charCodeAt(index), 16777619);\n }\n return hash >>> 0;\n};\n\nexport const createBattleMosaicTiles = (\n layout: BattleViewportGridLayout,\n transitionId: string,\n): PixiMosaicTile[] => {\n const columns = 32;\n const rows = 20;\n const tileWidth = layout.renderW / columns;\n const tileHeight = layout.renderH / rows;\n const tiles: PixiMosaicTile[] = [];\n for (let row = 0; row < rows; row += 1) {\n for (let col = 0; col < columns; col += 1) {\n tiles.push({\n col,\n row,\n x: layout.offsetX + col * tileWidth,\n y: layout.offsetY + row * tileHeight,\n width: tileWidth,\n height: tileHeight,\n order: transitionHash(col, row, transitionId),\n });\n }\n }\n return tiles.sort((left, right) => left.order - right.order);\n};\n\nexport interface ComboSlashRegion {\n index: number;\n points: number[];\n bounds: PixiLayoutRect;\n}\n\nexport const createComboSlashRegions = (\n participantCount: number,\n bounds?: PixiLayoutRect,\n): ComboSlashRegion[] => {\n const count = Math.max(1, Math.floor(participantCount));\n const resolvedBounds =\n bounds ??\n (() => {\n const panelWidth = Math.min(400, 1600 / count);\n const size = { width: panelWidth * count, height: panelWidth * 1.25 };\n return {\n x: (PIXI_STAGE_METRICS.width - size.width) / 2,\n y: (PIXI_STAGE_METRICS.height - size.height) / 2,\n ...size,\n };\n })();\n const columnCount = count;\n const sliceWidth = Math.min(resolvedBounds.width / columnCount, (resolvedBounds.height * 4) / 5);\n const rowWidth = sliceWidth * columnCount;\n const rowHeight = sliceWidth * 1.25;\n const rowX = resolvedBounds.x + (resolvedBounds.width - rowWidth) / 2;\n const rowY = resolvedBounds.y + (resolvedBounds.height - rowHeight) / 2;\n return Array.from({ length: count }, (_, index) => {\n const column = index;\n const slant = Math.min(92, sliceWidth * 0.24);\n const left = rowX + column * sliceWidth;\n const right = rowX + (column + 1) * sliceWidth;\n const top = rowY;\n const bottom = top + rowHeight;\n return {\n index,\n points: [left, top, right - slant, top, right, bottom, left + slant, bottom],\n bounds: { x: left, y: top, width: sliceWidth, height: rowHeight },\n };\n });\n};\n\nexport const PIXI_SESSION_STAGE = {\n width: PIXI_STAGE_METRICS.width,\n height: PIXI_STAGE_METRICS.height,\n} as const;\n", "import { createComboSlashRegions, type ComboSlashRegion } from './PixiSessionLayout.js';\n\nexport interface BattlePictureLayout {\n width: number;\n height: number;\n centerX: number;\n centerY: number;\n entryX: number;\n driftX: number;\n exitX: number;\n}\n\n/** Shared screen-space geometry and cadence for retained battle cinematics. */\nexport class PixiBattleCinematicSurface {\n static resolveBattlePictureLayout(\n source: { width: number; height: number },\n direction: -1 | 1,\n bounds: { maxWidth: number; maxHeight: number; allowUpscale?: boolean } = {\n maxWidth: 1280,\n maxHeight: 720,\n },\n ): BattlePictureLayout {\n const scale = Math.min(\n bounds.maxWidth / source.width,\n bounds.maxHeight / source.height,\n bounds.allowUpscale ? Infinity : 1,\n );\n return {\n width: source.width * scale,\n height: source.height * scale,\n centerX: 960,\n centerY: 540,\n entryX: 960 + direction * 1920 * 0.78,\n driftX: 960 - direction * 1920 * 0.03,\n exitX: 960 - direction * 1920 * 0.78,\n };\n }\n\n static resolveComboRegions(participantCount: number): ComboSlashRegion[] {\n return createComboSlashRegions(participantCount);\n }\n\n static resolveComboHoldMs(totalMs: number): number {\n return Math.max(120, totalMs - 520);\n }\n}\n", "export function assertUniformFields<N extends string, A extends string>(\n value: unknown,\n numbers: readonly N[],\n arrays: readonly A[],\n): asserts value is Record<N, number> & Record<A, Float32Array> {\n if (typeof value !== 'object' || value === null)\n throw new Error('Uniform values must be an object');\n for (const key of numbers)\n if (!(key in value) || typeof Reflect.get(value, key) !== 'number')\n throw new Error(`Invalid numeric uniform: ${key}`);\n for (const key of arrays) {\n const property: unknown = Reflect.get(value, key);\n if (!(property instanceof Float32Array)) throw new Error(`Invalid vector uniform: ${key}`);\n }\n}\n", "/** Fixed topology: one narrow ribbon, updated in place for the entire attack. */\nexport const WHIP_SEGMENTS = 40;\n\nexport interface WhipShape {\n length: number;\n reach: number;\n bend: number;\n phase: number;\n width: number;\n tipRatio: number;\n}\n\nexport const createWhipBuffers = () => {\n const positions = new Float32Array((WHIP_SEGMENTS + 1) * 4);\n const centers = new Float32Array((WHIP_SEGMENTS + 1) * 2);\n const uvs = new Float32Array(positions.length);\n const indices = new Uint32Array(WHIP_SEGMENTS * 6);\n for (let i = 0; i <= WHIP_SEGMENTS; i += 1) {\n uvs.set([i / WHIP_SEGMENTS, 0, i / WHIP_SEGMENTS, 1], i * 4);\n if (i < WHIP_SEGMENTS) {\n const v = i * 2;\n indices.set([v, v + 1, v + 2, v + 1, v + 3, v + 2], i * 6);\n }\n }\n return { positions, centers, uvs, indices };\n};\n\nexport type WhipBuffers = ReturnType<typeof createWhipBuffers>;\n\nexport const updateWhipPositions = (buffers: WhipBuffers, shape: WhipShape): void => {\n const { positions, centers } = buffers;\n const length = Math.max(1, shape.length);\n const reach = Math.max(0.005, shape.reach);\n for (let i = 0; i <= WHIP_SEGMENTS; i += 1) {\n const t = i / WHIP_SEGMENTS;\n // A taut chain bends under tension; both ends remain pinned.\n const envelope = i === WHIP_SEGMENTS ? 0 : Math.sin(Math.PI * t);\n centers[i * 2] = length * reach * t - envelope * shape.bend * (1 - reach) * 0.65;\n centers[i * 2 + 1] = envelope * shape.bend;\n }\n for (let i = 0; i <= WHIP_SEGMENTS; i += 1) {\n const before = Math.max(0, i - 1) * 2;\n const after = Math.min(WHIP_SEGMENTS, i + 1) * 2;\n const dx = centers[after]! - centers[before]!;\n const dy = centers[after + 1]! - centers[before + 1]!;\n const magnitude = Math.hypot(dx, dy) || 1;\n // tipRatio is retained in the input contract for saved tuning compatibility.\n const halfWidth = Math.max(0, shape.width) * 0.5;\n const nx = (-dy / magnitude) * halfWidth;\n const ny = (dx / magnitude) * halfWidth;\n positions[i * 4] = centers[i * 2]! + nx;\n positions[i * 4 + 1] = centers[i * 2 + 1]! + ny;\n positions[i * 4 + 2] = centers[i * 2]! - nx;\n positions[i * 4 + 3] = centers[i * 2 + 1]! - ny;\n }\n};\n", "import type { Container, Mesh, MeshGeometry, Shader, UniformGroup } from 'pixi.js';\nimport type { PixiBattleFxCapabilities } from './PixiBattleFxResources.js';\nimport {\n createWhipBuffers,\n updateWhipPositions,\n type WhipBuffers,\n type WhipShape,\n} from './PixiBattleWhipGeometry.js';\n\nconst VERTEX = `\nprecision highp float;\nattribute vec2 aPosition;\nattribute vec2 aUV;\nuniform mat3 uProjectionMatrix;\nuniform mat3 uWorldTransformMatrix;\nuniform mat3 uTransformMatrix;\nuniform vec4 uWorldColorAlpha;\nuniform vec4 uColor;\nvarying vec2 vUV;\nvarying float vAlpha;\nvoid main() {\n vUV = aUV;\n vAlpha = uWorldColorAlpha.a * uColor.a;\n vec3 p = uProjectionMatrix * uWorldTransformMatrix * uTransformMatrix * vec3(aPosition, 1.0);\n gl_Position = vec4(p.xy, 0.0, 1.0);\n}`;\n\nconst FRAGMENT = `\nprecision highp float;\nvarying vec2 vUV;\nvarying float vAlpha;\nuniform vec3 uBodyColor;\nuniform vec3 uEdgeColor;\nuniform float uLength;\nuniform float uLinkLength;\nuniform float uBlur;\nfloat chain(vec2 uv) {\n float along = uv.x * uLength / max(1.0, uLinkLength);\n float link = floor(along);\n float x = (fract(along) - 0.5) * 2.0;\n float y = (uv.y - 0.5) * 2.0;\n float thin = mix(1.0, 0.4, mod(link, 2.0));\n float ellipse = length(vec2(x, y / thin));\n float ring = (1.0 - smoothstep(0.83, 1.0, ellipse)) * smoothstep(0.42, 0.63, ellipse);\n return ring * step(0.0, uv.x) * step(uv.x, 1.0);\n}\nvoid main() {\n float coverage = 0.0;\n float weight = 0.0;\n // Integrate a directional shutter over the chain, without an offscreen blur pass.\n for (int i = -4; i <= 4; i++) {\n float t = float(i) / 4.0;\n float w = exp(-t * t * 2.0);\n coverage += chain(vUV + vec2(t * uBlur / max(1.0, uLength), 0.0)) * w;\n weight += w;\n }\n vec3 color = mix(uBodyColor, uEdgeColor, 0.3 + 0.7 * pow(1.0 - abs(vUV.y * 2.0 - 1.0), 2.0));\n float alpha = coverage / weight * vAlpha;\n gl_FragColor = vec4(color * alpha, alpha);\n}`;\n\nexport interface PixiBattleWhipHandle {\n mesh: Mesh<MeshGeometry, Shader>;\n geometry: MeshGeometry;\n shader: Shader;\n buffers: WhipBuffers;\n bodyColor: Float32Array;\n edgeColor: Float32Array;\n uniforms: UniformGroup<{\n uBodyColor: { value: Float32Array; type: 'vec3<f32>' };\n uEdgeColor: { value: Float32Array; type: 'vec3<f32>' };\n uLength: { value: number; type: 'f32' };\n uLinkLength: { value: number; type: 'f32' };\n uBlur: { value: number; type: 'f32' };\n }>;\n released: boolean;\n generation: number;\n}\n\n/** Sub-pool owned exclusively by PixiBattleFxResourceOwner. */\nexport class PixiBattleWhipResources {\n private readonly available: PixiBattleWhipHandle[] = [];\n private readonly active = new Set<PixiBattleWhipHandle>();\n private readonly owned = new Set<PixiBattleWhipHandle>();\n\n constructor(private readonly capabilities: PixiBattleFxCapabilities) {}\n\n acquire(parent: Container, bodyColor: string, edgeColor: string): PixiBattleWhipHandle | null {\n const writeColor = this.capabilities.writeColor;\n if (!writeColor) return null;\n const handle = this.available.pop() ?? this.create();\n if (!handle) return null;\n writeColor(bodyColor, handle.bodyColor);\n writeColor(edgeColor, handle.edgeColor);\n handle.generation += 1;\n handle.released = false;\n handle.mesh.visible = true;\n handle.mesh.alpha = 1;\n parent.addChild(handle.mesh);\n this.active.add(handle);\n return handle;\n }\n\n update(\n handle: PixiBattleWhipHandle,\n shape: WhipShape,\n detail?: { linkLength: number; blur: number },\n ): void {\n if (handle.released) return;\n updateWhipPositions(handle.buffers, shape);\n handle.uniforms.uniforms.uLength = Math.max(1, shape.length * shape.reach);\n handle.uniforms.uniforms.uLinkLength = Math.max(1, detail?.linkLength ?? shape.width * 2);\n handle.uniforms.uniforms.uBlur = Math.max(0, detail?.blur ?? shape.width * 3);\n handle.geometry.getBuffer('aPosition').update();\n }\n\n release(handle: PixiBattleWhipHandle | null, generation = handle?.generation): void {\n if (\n !handle ||\n handle.generation !== generation ||\n handle.released ||\n !this.active.delete(handle)\n )\n return;\n handle.released = true;\n handle.mesh.parent?.removeChild(handle.mesh);\n handle.mesh.visible = false;\n this.available.push(handle);\n }\n\n reset(): void {\n for (const handle of this.active) this.release(handle);\n }\n\n destroy(): void {\n this.reset();\n for (const handle of this.owned) {\n handle.mesh.destroy();\n handle.shader.destroy();\n handle.geometry.destroy();\n }\n this.owned.clear();\n this.available.length = 0;\n }\n\n get activeCount(): number {\n return this.active.size;\n }\n\n private create(): PixiBattleWhipHandle | null {\n const { Mesh, MeshGeometry, Shader, UniformGroup } = this.capabilities;\n if (!Mesh || !MeshGeometry || !Shader || !UniformGroup) return null;\n const buffers = createWhipBuffers();\n const geometry = new MeshGeometry({\n positions: buffers.positions,\n uvs: buffers.uvs,\n indices: buffers.indices,\n topology: 'triangle-list',\n });\n const bodyColor = new Float32Array(3);\n const edgeColor = new Float32Array(3);\n const uniforms = new UniformGroup({\n uBodyColor: { value: bodyColor, type: 'vec3<f32>' },\n uEdgeColor: { value: edgeColor, type: 'vec3<f32>' },\n uLength: { value: 1, type: 'f32' },\n uLinkLength: { value: 16, type: 'f32' },\n uBlur: { value: 24, type: 'f32' },\n });\n const shader = Shader.from({\n gl: { vertex: VERTEX, fragment: FRAGMENT },\n resources: { whipUniforms: uniforms },\n });\n const mesh = new Mesh({ geometry, shader, label: 'battle-action-whip' });\n mesh.eventMode = 'none';\n mesh.blendMode = 'normal';\n const handle = {\n mesh,\n geometry,\n shader,\n buffers,\n bodyColor,\n edgeColor,\n uniforms,\n released: true,\n generation: 0,\n };\n this.owned.add(handle);\n return handle;\n }\n}\n", "import type { Container, Mesh, MeshGeometry, Shader, UniformGroup } from 'pixi.js';\nimport type { PixiBattleFxCapabilities } from './PixiBattleFxResources.js';\nimport type { BattleFxPoint } from './BattleActionMotionMath.js';\n\nconst SEGMENTS = 16;\nconst VERTEX = `\nprecision highp float;\nattribute vec2 aPosition;\nattribute vec2 aUV;\nuniform mat3 uProjectionMatrix;\nuniform mat3 uWorldTransformMatrix;\nuniform mat3 uTransformMatrix;\nuniform vec4 uWorldColorAlpha;\nuniform vec4 uColor;\nvarying vec2 vUV;\nvarying float vAlpha;\nvoid main() {\n vUV = aUV;\n vAlpha = uWorldColorAlpha.a * uColor.a;\n vec3 p = uProjectionMatrix * uWorldTransformMatrix * uTransformMatrix * vec3(aPosition, 1.0);\n gl_Position = vec4(p.xy, 0.0, 1.0);\n}`;\nconst FRAGMENT = `\nprecision highp float;\nvarying vec2 vUV;\nvarying float vAlpha;\nuniform vec3 uColorFx;\nuniform float uCoreRatio;\nuniform float uInnerGlowRatio;\nuniform float uOuterGlowAlpha;\nvoid main() {\n float d = abs(vUV.y * 2.0 - 1.0);\n float core = 1.0 - smoothstep(uCoreRatio * 0.5, uCoreRatio, d);\n float innerD = d / uInnerGlowRatio;\n float innerGlow = exp(-innerD * innerD * 7.0) * (1.0 - smoothstep(0.65, 1.0, innerD));\n float outerGlow = exp(-d * d * 3.0) * (1.0 - smoothstep(0.7, 1.0, d));\n float alpha = (1.0 - (1.0 - core) * (1.0 - innerGlow * 0.55)\n * (1.0 - outerGlow * uOuterGlowAlpha)) * vAlpha;\n vec3 color = mix(uColorFx, vec3(0.96, 0.99, 1.0), core);\n gl_FragColor = vec4(color * alpha, alpha);\n}`;\n\nexport interface PixiBattleLightningHandle {\n readonly root: Mesh<MeshGeometry, Shader>;\n readonly geometry: MeshGeometry;\n readonly shader: Shader;\n readonly uniforms: UniformGroup<{\n uColorFx: { value: Float32Array; type: 'vec3<f32>' };\n uCoreRatio: { value: number; type: 'f32' };\n uInnerGlowRatio: { value: number; type: 'f32' };\n uOuterGlowAlpha: { value: number; type: 'f32' };\n }>;\n readonly points: Float32Array;\n readonly positions: Float32Array;\n from: BattleFxPoint;\n to: BattleFxPoint;\n width: number;\n seed: number;\n frame: number;\n generation: number;\n released: boolean;\n}\n\n/** One retained strip shades both the narrow core and soft halo in a single pass. */\nexport class PixiBattleLightningResources {\n private readonly available: PixiBattleLightningHandle[] = [];\n private readonly active = new Set<PixiBattleLightningHandle>();\n private readonly owned = new Set<PixiBattleLightningHandle>();\n constructor(private readonly capabilities: PixiBattleFxCapabilities) {}\n\n acquire(\n parent: Container,\n from: BattleFxPoint,\n to: BattleFxPoint,\n options: {\n color: string;\n seed: number;\n width: number;\n blurStrength: number;\n outerGlowRadius?: number;\n outerGlowAlpha?: number;\n },\n ): PixiBattleLightningHandle | null {\n const handle = this.available.pop() ?? this.create();\n if (!handle) return null;\n const hex = Number.parseInt(options.color.replace('#', ''), 16);\n handle.uniforms.uniforms.uColorFx.set([\n ((hex >> 16) & 255) / 255,\n ((hex >> 8) & 255) / 255,\n (hex & 255) / 255,\n ]);\n const core = Math.max(0.1, options.width);\n const innerWidth = core / 2 + Math.max(0, options.blurStrength) * 1.5;\n const outerRadius = Math.max(0, options.outerGlowRadius ?? 0);\n handle.width = Math.max(innerWidth, core / 2 + outerRadius);\n handle.uniforms.uniforms.uCoreRatio = Math.min(1, core / Math.max(0.1, handle.width * 2));\n handle.uniforms.uniforms.uInnerGlowRatio = innerWidth / handle.width;\n handle.uniforms.uniforms.uOuterGlowAlpha =\n outerRadius > 0 ? Math.max(0, options.outerGlowAlpha ?? 0) : 0;\n handle.from = { x: from.x, y: from.y };\n handle.to = { x: to.x, y: to.y };\n handle.seed = options.seed;\n handle.frame = -1;\n handle.generation++;\n handle.released = false;\n handle.root.alpha = 0;\n handle.root.visible = true;\n parent.addChild(handle.root);\n this.active.add(handle);\n this.update(handle, 0);\n return handle;\n }\n\n update(handle: PixiBattleLightningHandle, frame: number, generation = handle.generation): void {\n if (handle.generation !== generation || handle.released || handle.frame === frame) return;\n handle.frame = frame;\n const { from, to, points, positions } = handle;\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const length = Math.hypot(dx, dy) || 1;\n const random = (index: number, salt: number) => {\n const value =\n Math.sin(index * 127.1 + frame * 269.5 + handle.seed * 971.7 + salt) * 43758.5453;\n return value - Math.floor(value);\n };\n for (let i = 0; i <= SEGMENTS; i++) {\n const t = i === 0 ? 0 : i === SEGMENTS ? 1 : (i + (random(i, 13) - 0.5) * 0.7) / SEGMENTS;\n const offset = (random(i, 71) * 2 - 1) * Math.min(22, length * 0.07) * Math.sin(t * Math.PI);\n points[i * 2] = from.x + dx * t - (dy / length) * offset;\n points[i * 2 + 1] = from.y + dy * t + (dx / length) * offset;\n }\n for (let i = 0; i <= SEGMENTS; i++) {\n const before = Math.max(0, i - 1) * 2;\n const after = Math.min(SEGMENTS, i + 1) * 2;\n const tx = points[after]! - points[before]!;\n const ty = points[after + 1]! - points[before + 1]!;\n const size = Math.hypot(tx, ty) || 1;\n const nx = (-ty / size) * handle.width;\n const ny = (tx / size) * handle.width;\n positions[i * 4] = points[i * 2]! + nx;\n positions[i * 4 + 1] = points[i * 2 + 1]! + ny;\n positions[i * 4 + 2] = points[i * 2]! - nx;\n positions[i * 4 + 3] = points[i * 2 + 1]! - ny;\n }\n handle.geometry.getBuffer('aPosition').update();\n }\n\n release(handle: PixiBattleLightningHandle | null, generation = handle?.generation): void {\n if (!handle || handle.generation !== generation || !this.active.delete(handle)) return;\n handle.released = true;\n handle.root.parent?.removeChild(handle.root);\n handle.root.visible = false;\n this.available.push(handle);\n }\n reset(): void {\n for (const handle of this.active) this.release(handle);\n }\n destroy(): void {\n this.reset();\n for (const handle of this.owned) {\n handle.root.destroy();\n handle.shader.destroy();\n handle.geometry.destroy();\n }\n this.available.length = 0;\n this.owned.clear();\n }\n get activeCount(): number {\n return this.active.size;\n }\n\n private create(): PixiBattleLightningHandle | null {\n const { Mesh, MeshGeometry, Shader, UniformGroup } = this.capabilities;\n if (!Mesh || !MeshGeometry || !Shader || !UniformGroup) return null;\n const positions = new Float32Array((SEGMENTS + 1) * 4);\n const points = new Float32Array((SEGMENTS + 1) * 2);\n const uvs = new Float32Array(positions.length);\n const indices = new Uint32Array(SEGMENTS * 6);\n for (let i = 0; i <= SEGMENTS; i++) {\n uvs.set([i / SEGMENTS, 0, i / SEGMENTS, 1], i * 4);\n if (i < SEGMENTS) {\n const v = i * 2;\n indices.set([v, v + 1, v + 2, v + 1, v + 3, v + 2], i * 6);\n }\n }\n const geometry = new MeshGeometry({ positions, uvs, indices });\n const uniforms = new UniformGroup({\n uColorFx: { value: new Float32Array(3), type: 'vec3<f32>' },\n uCoreRatio: { value: 0.2, type: 'f32' },\n uInnerGlowRatio: { value: 1, type: 'f32' },\n uOuterGlowAlpha: { value: 0, type: 'f32' },\n });\n const shader = Shader.from({\n gl: { vertex: VERTEX, fragment: FRAGMENT },\n resources: { lightningUniforms: uniforms },\n });\n const root = new Mesh({ geometry, shader, label: 'battle-action-lightning' });\n root.eventMode = 'none';\n root.blendMode = 'screen';\n const handle: PixiBattleLightningHandle = {\n root,\n geometry,\n shader,\n uniforms,\n points,\n positions,\n from: { x: 0, y: 0 },\n to: { x: 0, y: 0 },\n width: 1,\n seed: 0,\n frame: -1,\n generation: 0,\n released: true,\n };\n this.owned.add(handle);\n return handle;\n }\n}\n", "import { assertUniformFields } from './uniforms.js';\nimport type {\n BlurFilter,\n Container,\n Graphics,\n GraphicsContext,\n Mesh,\n MeshGeometry,\n Shader,\n Sprite,\n UniformGroup,\n} from 'pixi.js';\n\nimport { PixiBattleWhipResources } from './PixiBattleWhipResources.js';\nimport {\n PixiBattleLightningResources,\n type PixiBattleLightningHandle,\n} from './PixiBattleLightningResources.js';\nexport type { PixiBattleLightningHandle } from './PixiBattleLightningResources.js';\n\ntype PixiMesh = Mesh<MeshGeometry, Shader>;\n\nexport interface PixiBattleFxCapabilities {\n writeColor?: (value: string, out: Float32Array) => void;\n BlurFilter?: typeof import('pixi.js').BlurFilter;\n Filter?: typeof import('pixi.js').Filter;\n Container?: typeof import('pixi.js').Container;\n Graphics?: typeof import('pixi.js').Graphics;\n Mesh?: typeof import('pixi.js').Mesh;\n MeshGeometry?: typeof import('pixi.js').MeshGeometry;\n Shader?: typeof import('pixi.js').Shader;\n UniformGroup?: typeof import('pixi.js').UniformGroup;\n Sprite?: typeof import('pixi.js').Sprite;\n Texture?: { WHITE: import('pixi.js').Texture };\n generateTexture?: (target: Container) => import('pixi.js').Texture;\n}\n\nexport type PixiBattleTrailMode = 'shoot' | 'melee' | 'electric' | 'charge' | 'support';\n\ninterface TrailUniforms {\n uFxColor: Float32Array;\n uMode: number;\n uSeed: number;\n uSoftness: number;\n uTailBlur: number;\n}\n\ninterface BurstUniforms {\n uFxColor: Float32Array;\n uSeed: number;\n uRing: number;\n}\n\nexport interface SpeedLineUniforms {\n uFxColor: Float32Array;\n uTime: number;\n uCycleA: number;\n uCycleB: number;\n uCycleC: number;\n uSeed: number;\n uDensity: number;\n uMinLength: number;\n uMaxLength: number;\n uMotionBlur: number;\n uThicknessScale: number;\n}\n\nexport interface PixiBattleFxHandle {\n readonly mesh: PixiMesh;\n readonly geometry: MeshGeometry;\n readonly shader: Shader;\n readonly kind: 'trail' | 'burst' | 'speed-lines';\n readonly uniforms: UniformGroup;\n released: boolean;\n}\n\nconst FX_VERTEX = `\nprecision highp float;\nattribute vec2 aPosition;\nattribute vec2 aUV;\nuniform mat3 uProjectionMatrix;\nuniform mat3 uWorldTransformMatrix;\nuniform mat3 uTransformMatrix;\nuniform vec4 uWorldColorAlpha;\nuniform vec4 uColor;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\n\nvoid main(void) {\n vUV = aUV;\n vWorldAlpha = uWorldColorAlpha.a * uColor.a;\n vec3 position = uProjectionMatrix * uWorldTransformMatrix * uTransformMatrix * vec3(aPosition, 1.0);\n gl_Position = vec4(position.xy, 0.0, 1.0);\n}\n`;\n\nconst TRAIL_FRAGMENT = `\nprecision highp float;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\nuniform vec3 uFxColor;\nuniform float uMode;\nuniform float uSeed;\nuniform float uSoftness;\nuniform float uTailBlur;\n\nfloat hash12(vec2 value) {\n vec3 p3 = fract(vec3(value.xyx) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33 + uSeed);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nvoid main(void) {\n float center = abs(vUV.y - 0.5) * 2.0;\n float tailBlur = uTailBlur * pow(1.0 - vUV.x, 2.0);\n float body = 1.0 - smoothstep(0.08, max(0.1, uSoftness + tailBlur), center);\n float head = smoothstep(0.0, 0.14, vUV.x);\n float tail = 1.0 - smoothstep(0.72, 1.0, vUV.x);\n float meleeArc = 0.72 + 0.28 * sin(vUV.x * 3.14159265);\n float electricBreak = step(0.24, hash12(vec2(floor(vUV.x * 34.0), floor(vUV.y * 5.0))));\n float modeMask = uMode < 0.5 ? 1.0 : uMode < 1.5 ? meleeArc : uMode < 2.5 ? electricBreak : 0.82;\n float endMask = uMode > 3.5 ? 1.0 : head * tail;\n float alpha = body * endMask * modeMask * vWorldAlpha;\n float core = 1.0 - smoothstep(0.0, 0.16, center);\n vec3 color = uFxColor * (0.72 + core * 1.65);\n gl_FragColor = vec4(color * alpha, alpha);\n}\n`;\n\nconst SPEED_LINES_FRAGMENT = `\nprecision highp float;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\nuniform vec3 uFxColor;\nuniform float uTime;\nuniform float uCycleA;\nuniform float uCycleB;\nuniform float uCycleC;\nuniform float uSeed;\nuniform float uDensity;\nuniform float uMinLength;\nuniform float uMaxLength;\nuniform float uMotionBlur;\nuniform float uThicknessScale;\n\nfloat hash11(float value) {\n return fract(sin(value * 127.1 + uSeed * 311.7) * 43758.5453);\n}\n\nfloat lineLayer(vec2 uv, float cycle, float bands, float seed) {\n float band = floor(uv.y * bands);\n float densityGate = 1.0 - step(uDensity, hash11(band + seed * 19.0));\n float center = (band + 0.18 + hash11(band + seed * 37.0) * 0.64) / bands;\n float thickness = mix(0.6, 1.45, hash11(band + seed * 53.0)) / bands * uThicknessScale;\n float vertical = 1.0 - smoothstep(thickness * 0.35, thickness, abs(uv.y - center));\n float length = mix(uMinLength, uMaxLength, hash11(band + seed * 71.0));\n float phase = fract(uv.x + uTime / cycle + hash11(band + seed * 89.0));\n float blur = min(length * 0.48, max(0.002, uMotionBlur));\n float segment = smoothstep(0.0, blur, phase) * (1.0 - smoothstep(length - blur, length, phase));\n float directionalTail = mix(0.22, 1.0, smoothstep(0.0, max(length, 0.001), phase));\n return densityGate * vertical * segment * directionalTail;\n}\n\nvoid main(void) {\n float lines = lineLayer(vUV, uCycleA, 31.0, 0.13) * 0.38;\n lines += lineLayer(vUV, uCycleB, 47.0, 0.41) * 0.58;\n lines += lineLayer(vUV, uCycleC, 67.0, 0.73) * 0.82;\n float edge = smoothstep(0.0, 0.12, vUV.y) * smoothstep(0.0, 0.12, 1.0 - vUV.y);\n float alpha = clamp(lines * edge, 0.0, 1.0) * vWorldAlpha;\n gl_FragColor = vec4(uFxColor * alpha, alpha);\n}\n`;\n\nconst BURST_FRAGMENT = `\nprecision highp float;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\nuniform vec3 uFxColor;\nuniform float uSeed;\nuniform float uRing;\n\nfloat hash12(vec2 value) {\n vec3 p3 = fract(vec3(value.xyx) * 0.1031);\n p3 += dot(p3, p3.yzx + 31.32 + uSeed);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nvoid main(void) {\n vec2 local = vUV * 2.0 - 1.0;\n float radius = length(local);\n float angle = atan(local.y, local.x);\n float noise = hash12(vec2(floor(angle * 13.0), floor(radius * 8.0)));\n float core = 1.0 - smoothstep(0.0, 0.36 + noise * 0.08, radius);\n float ring = 1.0 - smoothstep(0.035, 0.12, abs(radius - uRing));\n float rays = pow(max(0.0, sin(angle * 7.0 + uSeed) * 0.5 + 0.5), 8.0);\n rays *= 1.0 - smoothstep(0.18, 0.96, radius);\n float alpha = clamp(core * 0.72 + ring * 0.86 + rays * 0.58, 0.0, 1.0) * vWorldAlpha;\n vec3 color = uFxColor * (0.8 + core * 1.25 + ring * 0.45);\n gl_FragColor = vec4(color * alpha, alpha);\n}\n`;\n\nconst parseColor = (value: string): Float32Array => {\n const parsed = Number.parseInt(value.replace('#', ''), 16);\n if (!Number.isFinite(parsed)) return new Float32Array([1, 1, 1]);\n return new Float32Array([\n ((parsed >> 16) & 0xff) / 255,\n ((parsed >> 8) & 0xff) / 255,\n (parsed & 0xff) / 255,\n ]);\n};\n\nconst resolveTrailMode = (mode: PixiBattleTrailMode): number => {\n switch (mode) {\n case 'shoot':\n return 0;\n case 'melee':\n return 1;\n case 'electric':\n return 2;\n case 'charge':\n return 3;\n case 'support':\n return 4;\n }\n};\n\n/** Owns the small retained Mesh pool used by battle action FX. */\nexport class PixiBattleFxResourceOwner {\n private readonly availableTrails: PixiBattleFxHandle[] = [];\n private readonly availableBursts: PixiBattleFxHandle[] = [];\n private readonly availableSpeedLines: PixiBattleFxHandle[] = [];\n private readonly active = new Set<PixiBattleFxHandle>();\n private readonly owned = new Set<PixiBattleFxHandle>();\n private readonly availableDebris: Sprite[] = [];\n private readonly activeDebris = new Set<Sprite>();\n private readonly ownedDebris = new Set<Sprite>();\n private readonly availableSnapshots: Sprite[] = [];\n private readonly activeSnapshots = new Set<Sprite>();\n private readonly ownedSnapshots = new Set<Sprite>();\n private readonly snapshotTextures = new Map<string, import('pixi.js').Texture>();\n private readonly availableBlurFilters: BlurFilter[] = [];\n private readonly activeBlurFilters = new Set<BlurFilter>();\n private readonly ownedBlurFilters = new Set<BlurFilter>();\n private readonly irregularContexts: GraphicsContext[] = [];\n private readonly availableIrregularDebris: Graphics[] = [];\n private readonly activeIrregularDebris = new Set<Graphics>();\n private readonly ownedIrregularDebris = new Set<Graphics>();\n private readonly availableScreenFlashes: Graphics[] = [];\n private readonly activeScreenFlashes = new Set<Graphics>();\n private readonly ownedScreenFlashes = new Set<Graphics>();\n private readonly availableActionGraphics: Graphics[] = [];\n private readonly activeActionGraphics = new Set<Graphics>();\n private readonly ownedActionGraphics = new Set<Graphics>();\n\n readonly whips: PixiBattleWhipResources;\n readonly lightning: PixiBattleLightningResources;\n\n constructor(private readonly capabilities: PixiBattleFxCapabilities = {}) {\n this.whips = new PixiBattleWhipResources(capabilities);\n this.lightning = new PixiBattleLightningResources(capabilities);\n }\n\n acquireTrail(\n parent: Container,\n from: { x: number; y: number },\n to: { x: number; y: number },\n options: {\n color: string;\n mode: PixiBattleTrailMode;\n seed: number;\n width: number;\n softness: number;\n initialLengthRatio?: number;\n tailBlurStrength?: number;\n },\n ): PixiBattleFxHandle | null {\n const handle = this.availableTrails.pop() ?? this.createTrail();\n if (!handle) return null;\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const distance = Math.max(1, Math.hypot(dx, dy));\n const uniforms = readTrailUniforms(handle.uniforms.uniforms);\n uniforms.uFxColor = parseColor(options.color);\n uniforms.uMode = resolveTrailMode(options.mode);\n uniforms.uSeed = options.seed;\n uniforms.uSoftness = Math.max(0.12, options.softness);\n uniforms.uTailBlur = Math.max(0, options.tailBlurStrength ?? 0) / 16;\n handle.mesh.position.set((from.x + to.x) / 2, (from.y + to.y) / 2);\n handle.mesh.rotation = Math.atan2(dy, dx);\n handle.mesh.scale.set(\n (distance / 2) * Math.max(0, options.initialLengthRatio ?? 1),\n Math.max(1, options.width) / 2,\n );\n return this.activate(parent, handle);\n }\n\n acquireSpeedLines(\n parent: Container,\n color: string,\n cycles: readonly [number, number, number],\n options?: {\n seed?: number;\n density?: number;\n minLength?: number;\n maxLength?: number;\n motionBlur?: number;\n thicknessScale?: number;\n },\n ): PixiBattleFxHandle | null {\n const handle = this.availableSpeedLines.pop() ?? this.createSpeedLines();\n if (!handle) return null;\n const uniforms = readSpeedLineUniforms(handle.uniforms.uniforms);\n uniforms.uFxColor = parseColor(color);\n uniforms.uTime = 0;\n uniforms.uCycleA = cycles[0];\n uniforms.uCycleB = cycles[1];\n uniforms.uCycleC = cycles[2];\n uniforms.uSeed = options?.seed ?? 0;\n uniforms.uDensity = Math.max(0, Math.min(1, options?.density ?? 1 / 3));\n uniforms.uMinLength = Math.max(0.02, options?.minLength ?? 0.24);\n uniforms.uMaxLength = Math.max(uniforms.uMinLength, options?.maxLength ?? 0.62);\n uniforms.uMotionBlur = Math.max(0.002, options?.motionBlur ?? 0.12);\n uniforms.uThicknessScale = Math.max(0.05, options?.thicknessScale ?? 1 / 3);\n handle.mesh.position.set(960, 540);\n handle.mesh.scale.set(960, 540);\n return this.activate(parent, handle);\n }\n\n getSpeedLineUniforms(handle: PixiBattleFxHandle): SpeedLineUniforms {\n return readSpeedLineUniforms(handle.uniforms.uniforms);\n }\n\n acquireLightning(\n parent: Container,\n from: { x: number; y: number },\n to: { x: number; y: number },\n options: Parameters<PixiBattleLightningResources['acquire']>[3],\n ): PixiBattleLightningHandle | null {\n return this.lightning.acquire(parent, from, to, options);\n }\n\n releaseLightning(\n handle: PixiBattleLightningHandle | null,\n generation = handle?.generation,\n ): void {\n this.lightning.release(handle, generation);\n }\n\n acquireIrregularDebris(\n parent: Container,\n center: { x: number; y: number },\n options: { color: string; templateIndex: number; size: number },\n ): Graphics | null {\n const GraphicsConstructor = this.capabilities.Graphics;\n const contexts = this.ensureIrregularContexts(options.color);\n if (!GraphicsConstructor || contexts.length === 0) return null;\n const context = contexts[Math.abs(options.templateIndex) % contexts.length]!;\n const node = this.availableIrregularDebris.pop() ?? new GraphicsConstructor({ context });\n if (!this.ownedIrregularDebris.has(node)) this.ownedIrregularDebris.add(node);\n node.context = context;\n node.position.set(center.x, center.y);\n node.scale.set(Math.max(1, options.size));\n node.rotation = 0;\n node.alpha = 1;\n node.visible = true;\n node.eventMode = 'none';\n node.blendMode = 'screen';\n parent.addChild(node);\n this.activeIrregularDebris.add(node);\n return node;\n }\n\n releaseIrregularDebris(node: Graphics | null): void {\n if (!node || !this.activeIrregularDebris.delete(node)) return;\n node.parent?.removeChild(node);\n node.visible = false;\n node.alpha = 1;\n node.scale.set(1);\n this.availableIrregularDebris.push(node);\n }\n\n acquireBurst(\n parent: Container,\n center: { x: number; y: number },\n options: { color: string; radius: number; seed: number; ring: number },\n ): PixiBattleFxHandle | null {\n const handle = this.availableBursts.pop() ?? this.createBurst();\n if (!handle) return null;\n const uniforms = readBurstUniforms(handle.uniforms.uniforms);\n uniforms.uFxColor = parseColor(options.color);\n uniforms.uSeed = options.seed;\n uniforms.uRing = options.ring;\n handle.mesh.position.set(center.x, center.y);\n handle.mesh.rotation = options.seed % (Math.PI * 2);\n handle.mesh.scale.set(Math.max(1, options.radius));\n return this.activate(parent, handle);\n }\n\n release(handle: PixiBattleFxHandle | null): void {\n if (!handle || handle.released) return;\n handle.released = true;\n this.active.delete(handle);\n handle.mesh.parent?.removeChild(handle.mesh);\n handle.mesh.visible = false;\n handle.mesh.alpha = 1;\n handle.mesh.rotation = 0;\n handle.mesh.scale.set(1);\n if (handle.kind === 'speed-lines') {\n readSpeedLineUniforms(handle.uniforms.uniforms).uTime = 0;\n }\n if (handle.kind === 'trail') this.availableTrails.push(handle);\n else if (handle.kind === 'burst') this.availableBursts.push(handle);\n else this.availableSpeedLines.push(handle);\n }\n\n acquireDebris(\n parent: Container,\n center: { x: number; y: number },\n options: { color: string; angle: number; length: number; thickness: number },\n ): Sprite | null {\n const { Sprite: SpriteConstructor, Texture } = this.capabilities;\n if (!SpriteConstructor || !Texture) return null;\n const debris = this.availableDebris.pop() ?? new SpriteConstructor(Texture.WHITE);\n if (!this.ownedDebris.has(debris)) this.ownedDebris.add(debris);\n debris.anchor.set(0.5);\n debris.position.set(center.x, center.y);\n debris.rotation = options.angle;\n debris.scale.set(Math.max(1, options.length), Math.max(1, options.thickness));\n debris.tint = options.color;\n debris.alpha = 1;\n debris.visible = true;\n debris.eventMode = 'none';\n debris.blendMode = 'screen';\n parent.addChild(debris);\n this.activeDebris.add(debris);\n return debris;\n }\n\n releaseDebris(debris: Sprite | null): void {\n if (!debris || !this.activeDebris.delete(debris)) return;\n debris.parent?.removeChild(debris);\n debris.visible = false;\n debris.alpha = 1;\n debris.rotation = 0;\n debris.scale.set(1);\n this.availableDebris.push(debris);\n }\n\n acquireTokenSnapshot(parent: Container, key: string, target: Container): Sprite | null {\n const { Sprite: SpriteConstructor, generateTexture } = this.capabilities;\n if (!SpriteConstructor || !generateTexture) return null;\n let texture = this.snapshotTextures.get(key);\n if (!texture) {\n texture = generateTexture(target);\n this.snapshotTextures.set(key, texture);\n }\n const snapshot = this.availableSnapshots.pop() ?? new SpriteConstructor(texture);\n if (!this.ownedSnapshots.has(snapshot)) this.ownedSnapshots.add(snapshot);\n snapshot.texture = texture;\n snapshot.anchor.set(0.5);\n snapshot.position.copyFrom(target.position);\n snapshot.scale.set(1);\n snapshot.rotation = 0;\n snapshot.alpha = 1;\n snapshot.tint = 0xffffff;\n snapshot.visible = true;\n snapshot.eventMode = 'none';\n parent.addChild(snapshot);\n this.activeSnapshots.add(snapshot);\n return snapshot;\n }\n\n releaseTokenSnapshot(snapshot: Sprite | null): void {\n if (!snapshot || !this.activeSnapshots.delete(snapshot)) return;\n snapshot.parent?.removeChild(snapshot);\n snapshot.filters = [];\n snapshot.visible = false;\n snapshot.alpha = 1;\n snapshot.scale.set(1);\n this.availableSnapshots.push(snapshot);\n }\n\n acquireBlurFilter(strength: number): BlurFilter | null {\n const BlurFilterConstructor = this.capabilities.BlurFilter;\n if (!BlurFilterConstructor) return null;\n const filter =\n this.availableBlurFilters.pop() ??\n new BlurFilterConstructor({ strength: 0, quality: 2, resolution: 0.75 });\n this.ownedBlurFilters.add(filter);\n this.activeBlurFilters.add(filter);\n filter.strength = Math.max(0, strength);\n filter.padding = Math.max(12, strength * 3);\n filter.enabled = strength > 0;\n return filter;\n }\n\n releaseBlurFilter(filter: BlurFilter | null): void {\n if (!filter || !this.activeBlurFilters.delete(filter)) return;\n filter.enabled = false;\n filter.strength = 0;\n this.availableBlurFilters.push(filter);\n }\n\n acquireScreenFlash(parent: Container, color: number): Graphics | null {\n const GraphicsConstructor = this.capabilities.Graphics;\n if (!GraphicsConstructor) return null;\n const flash = this.availableScreenFlashes.pop() ?? new GraphicsConstructor();\n if (!this.ownedScreenFlashes.has(flash)) this.ownedScreenFlashes.add(flash);\n flash.clear().rect(0, 0, 1920, 1080).fill({ color, alpha: 1 });\n flash.alpha = 0;\n flash.visible = true;\n flash.eventMode = 'none';\n parent.addChild(flash);\n this.activeScreenFlashes.add(flash);\n return flash;\n }\n\n releaseScreenFlash(flash: Graphics | null): void {\n if (!flash || !this.activeScreenFlashes.delete(flash)) return;\n flash.parent?.removeChild(flash);\n flash.alpha = 0;\n flash.visible = false;\n this.availableScreenFlashes.push(flash);\n }\n\n acquireActionGraphic(parent: Container): Graphics | null {\n const GraphicsConstructor = this.capabilities.Graphics;\n if (!GraphicsConstructor) return null;\n const graphic = this.availableActionGraphics.pop() ?? new GraphicsConstructor();\n this.ownedActionGraphics.add(graphic);\n graphic.clear();\n graphic.position.set(0, 0);\n graphic.scale.set(1);\n graphic.rotation = 0;\n graphic.alpha = 1;\n graphic.visible = true;\n graphic.eventMode = 'none';\n graphic.blendMode = 'screen';\n graphic.filters = [];\n parent.addChild(graphic);\n this.activeActionGraphics.add(graphic);\n return graphic;\n }\n\n releaseActionGraphic(graphic: Graphics | null): void {\n if (!graphic || !this.activeActionGraphics.delete(graphic)) return;\n graphic.parent?.removeChild(graphic);\n graphic.filters = [];\n graphic.visible = false;\n graphic.alpha = 1;\n this.availableActionGraphics.push(graphic);\n }\n\n reset(): void {\n this.whips.reset();\n for (const handle of [...this.active]) this.release(handle);\n for (const debris of [...this.activeDebris]) this.releaseDebris(debris);\n for (const snapshot of [...this.activeSnapshots]) this.releaseTokenSnapshot(snapshot);\n for (const filter of [...this.activeBlurFilters]) this.releaseBlurFilter(filter);\n this.lightning.reset();\n for (const debris of [...this.activeIrregularDebris]) this.releaseIrregularDebris(debris);\n for (const flash of [...this.activeScreenFlashes]) this.releaseScreenFlash(flash);\n for (const graphic of [...this.activeActionGraphics]) this.releaseActionGraphic(graphic);\n for (const texture of this.snapshotTextures.values()) texture.destroy(true);\n this.snapshotTextures.clear();\n }\n\n destroy(): void {\n this.reset();\n this.whips.destroy();\n for (const handle of this.owned) {\n handle.mesh.destroy();\n handle.shader.destroy();\n handle.geometry.destroy();\n }\n for (const debris of this.ownedDebris) debris.destroy();\n for (const snapshot of this.ownedSnapshots) snapshot.destroy();\n for (const filter of this.ownedBlurFilters) filter.destroy();\n this.lightning.destroy();\n for (const debris of this.ownedIrregularDebris) debris.destroy({ context: false });\n for (const flash of this.ownedScreenFlashes) flash.destroy();\n for (const graphic of this.ownedActionGraphics) graphic.destroy();\n for (const context of this.irregularContexts) context.destroy();\n this.active.clear();\n this.owned.clear();\n this.availableTrails.length = 0;\n this.availableBursts.length = 0;\n this.availableSpeedLines.length = 0;\n this.activeDebris.clear();\n this.ownedDebris.clear();\n this.availableDebris.length = 0;\n this.activeSnapshots.clear();\n this.ownedSnapshots.clear();\n this.availableSnapshots.length = 0;\n this.activeBlurFilters.clear();\n this.ownedBlurFilters.clear();\n this.availableBlurFilters.length = 0;\n this.activeIrregularDebris.clear();\n this.ownedIrregularDebris.clear();\n this.availableIrregularDebris.length = 0;\n this.irregularContexts.length = 0;\n this.activeScreenFlashes.clear();\n this.ownedScreenFlashes.clear();\n this.availableScreenFlashes.length = 0;\n this.activeActionGraphics.clear();\n this.ownedActionGraphics.clear();\n this.availableActionGraphics.length = 0;\n }\n\n get activeCount(): number {\n return (\n this.whips.activeCount +\n this.active.size +\n this.activeDebris.size +\n this.activeSnapshots.size +\n this.activeBlurFilters.size +\n this.lightning.activeCount +\n this.activeIrregularDebris.size +\n this.activeScreenFlashes.size +\n this.activeActionGraphics.size\n );\n }\n\n private activate(parent: Container, handle: PixiBattleFxHandle): PixiBattleFxHandle {\n handle.released = false;\n handle.mesh.alpha = 1;\n handle.mesh.visible = true;\n parent.addChild(handle.mesh);\n this.active.add(handle);\n return handle;\n }\n\n private createTrail(): PixiBattleFxHandle | null {\n const uniformGroup = this.createUniformGroup({\n uFxColor: { value: new Float32Array([1, 1, 1]), type: 'vec3<f32>' },\n uMode: { value: 0, type: 'f32' },\n uSeed: { value: 0, type: 'f32' },\n uSoftness: { value: 0.6, type: 'f32' },\n uTailBlur: { value: 0, type: 'f32' },\n });\n return uniformGroup\n ? this.createHandle('trail', 'battle-action-trail', TRAIL_FRAGMENT, uniformGroup)\n : null;\n }\n\n private createSpeedLines(): PixiBattleFxHandle | null {\n const uniformGroup = this.createUniformGroup({\n uFxColor: { value: new Float32Array([1, 1, 1]), type: 'vec3<f32>' },\n uTime: { value: 0, type: 'f32' },\n uCycleA: { value: 0.35, type: 'f32' },\n uCycleB: { value: 0.25, type: 'f32' },\n uCycleC: { value: 0.175, type: 'f32' },\n uSeed: { value: 0, type: 'f32' },\n uDensity: { value: 1 / 3, type: 'f32' },\n uMinLength: { value: 0.24, type: 'f32' },\n uMaxLength: { value: 0.62, type: 'f32' },\n uMotionBlur: { value: 0.12, type: 'f32' },\n uThicknessScale: { value: 1 / 3, type: 'f32' },\n });\n return uniformGroup\n ? this.createHandle(\n 'speed-lines',\n 'battle-picture-speed-lines',\n SPEED_LINES_FRAGMENT,\n uniformGroup,\n )\n : null;\n }\n\n private ensureIrregularContexts(color: string): GraphicsContext[] {\n const GraphicsConstructor = this.capabilities.Graphics;\n if (!GraphicsConstructor || this.irregularContexts.length > 0) return this.irregularContexts;\n for (let template = 0; template < 8; template += 1) {\n const vertices = 4 + (template % 4);\n const points: number[] = [];\n for (let index = 0; index < vertices; index += 1) {\n const angle = (index / vertices) * Math.PI * 2;\n const radius = 0.52 + 0.28 * Math.sin(template * 2.17 + index * 4.31);\n points.push(Math.cos(angle) * radius, Math.sin(angle) * radius);\n }\n const source = new GraphicsConstructor().poly(points, true).fill({ color, alpha: 0.94 });\n this.irregularContexts.push(source.context);\n source.destroy({ context: false });\n }\n return this.irregularContexts;\n }\n\n private createBurst(): PixiBattleFxHandle | null {\n const uniformGroup = this.createUniformGroup({\n uFxColor: { value: new Float32Array([1, 1, 1]), type: 'vec3<f32>' },\n uSeed: { value: 0, type: 'f32' },\n uRing: { value: 0.52, type: 'f32' },\n });\n return uniformGroup\n ? this.createHandle('burst', 'battle-action-burst', BURST_FRAGMENT, uniformGroup)\n : null;\n }\n\n private createUniformGroup(\n entries: ConstructorParameters<typeof import('pixi.js').UniformGroup>[0],\n ): UniformGroup | null {\n const UniformGroupConstructor = this.capabilities.UniformGroup;\n return UniformGroupConstructor ? new UniformGroupConstructor(entries) : null;\n }\n\n private createHandle(\n kind: PixiBattleFxHandle['kind'],\n label: string,\n fragment: string,\n uniforms: UniformGroup,\n ): PixiBattleFxHandle | null {\n const {\n Mesh: MeshConstructor,\n MeshGeometry: MeshGeometryConstructor,\n Shader: ShaderConstructor,\n } = this.capabilities;\n if (!MeshConstructor || !MeshGeometryConstructor || !ShaderConstructor) return null;\n const geometry = new MeshGeometryConstructor({\n positions: new Float32Array([-1, -1, 1, -1, 1, 1, -1, 1]),\n uvs: new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),\n indices: new Uint32Array([0, 1, 2, 0, 2, 3]),\n topology: 'triangle-list',\n });\n const shader = ShaderConstructor.from({\n gl: { vertex: FX_VERTEX, fragment },\n resources: { battleFxUniforms: uniforms },\n });\n const mesh = new MeshConstructor({ geometry, shader, label });\n mesh.blendMode = 'screen';\n mesh.eventMode = 'none';\n mesh.visible = false;\n const handle = { mesh, geometry, shader, kind, uniforms, released: true };\n this.owned.add(handle);\n return handle;\n }\n}\n\nconst readTrailUniforms = (value: unknown): TrailUniforms => {\n assertUniformFields(value, ['uMode', 'uSeed', 'uSoftness', 'uTailBlur'], ['uFxColor']);\n return value;\n};\n\nconst readSpeedLineUniforms = (value: unknown): SpeedLineUniforms => {\n assertUniformFields(\n value,\n [\n 'uTime',\n 'uCycleA',\n 'uCycleB',\n 'uCycleC',\n 'uSeed',\n 'uDensity',\n 'uMinLength',\n 'uMaxLength',\n 'uMotionBlur',\n 'uThicknessScale',\n ],\n ['uFxColor'],\n );\n return value;\n};\n\nconst readBurstUniforms = (value: unknown): BurstUniforms => {\n assertUniformFields(value, ['uSeed', 'uRing'], ['uFxColor']);\n return value;\n};\n", "import type { Filter, Sprite, UniformGroup } from 'pixi.js';\nimport type { PixiAnimationActivity } from './PixiAnimationActivity.js';\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\n\nconst MAP_DISSOLVE_VERTEX = `\nin vec2 aPosition;\nout vec2 vTextureCoord;\nuniform vec4 uInputSize;\nuniform vec4 uOutputFrame;\nuniform vec4 uOutputTexture;\nvec4 filterVertexPosition(void) {\n vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;\n position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;\n return vec4(position, 0.0, 1.0);\n}\nvec2 filterTextureCoord(void) { return aPosition * (uOutputFrame.zw * uInputSize.zw); }\nvoid main(void) { gl_Position = filterVertexPosition(); vTextureCoord = filterTextureCoord(); }\n`;\n\nexport const MAP_DISSOLVE_FRAGMENT = `\nin vec2 vTextureCoord;\nout vec4 finalColor;\nuniform sampler2D uTexture;\nuniform float uProgress;\nuniform float uEdgeSoftness;\nuniform float uHighlightWidth;\nuniform float uHighlightIntensity;\nuniform float uGrainAmount;\nuniform float uGrainScale;\nuniform float uSeed;\nuniform vec3 uHighlightColor;\n\nfloat stableNoise(vec2 point) {\n return fract(sin(dot(point, vec2(127.1, 311.7)) + uSeed * 91.7) * 43758.5453123);\n}\n\nvoid main(void) {\n vec4 source = texture(uTexture, vTextureCoord);\n float progress = clamp(uProgress, 0.0, 1.0);\n float luminance = dot(source.rgb, vec3(0.2126, 0.7152, 0.0722));\n float darkness = 1.0 - luminance;\n float grain = (stableNoise(floor(vTextureCoord * max(1.0, uGrainScale))) - 0.5) * uGrainAmount;\n float signal = clamp(darkness + grain, 0.0, 1.0);\n float threshold = 1.0 - progress;\n float softness = max(0.0001, uEdgeSoftness);\n float reveal = smoothstep(threshold - softness, threshold + softness, signal);\n reveal *= smoothstep(0.0, 0.02, progress);\n reveal = mix(reveal, 1.0, smoothstep(0.98, 1.0, progress));\n float bandDistance = abs(signal - threshold);\n float highlight = 1.0 - smoothstep(uHighlightWidth, uHighlightWidth + softness, bandDistance);\n highlight *= (1.0 - smoothstep(0.92, 1.0, progress)) * smoothstep(0.0, 0.08, progress);\n float visible = max(reveal, highlight);\n vec3 highlighted = mix(source.rgb, uHighlightColor, highlight * uHighlightIntensity);\n finalColor = vec4(highlighted, source.a * visible);\n}\n`;\n\nexport interface PixiBattleMapDissolveSettings {\n readonly durationMs: number;\n readonly edgeSoftness: number;\n readonly highlightWidth: number;\n readonly highlightIntensity: number;\n readonly grainAmount: number;\n readonly grainScale: number;\n readonly highlightColor: string;\n}\n\nexport const DEFAULT_PIXI_BATTLE_MAP_DISSOLVE_SETTINGS: PixiBattleMapDissolveSettings = {\n durationMs: 1200,\n edgeSoftness: 0.05,\n highlightWidth: 0.045,\n highlightIntensity: 0.5,\n grainAmount: 0.12,\n grainScale: 32,\n highlightColor: '#f3d49c',\n};\n\ninterface Constructors {\n readonly Filter: typeof Filter;\n readonly UniformGroup: typeof UniformGroup;\n}\n\ninterface ActiveRun {\n readonly controller: AbortController;\n readonly sprite: Sprite;\n readonly releaseActivity: (() => void) | null;\n}\n\nconst hexToRgb = (color: string): Float32Array => {\n const normalized = color.trim().replace(/^#/, '');\n const expanded =\n normalized.length === 3\n ? normalized\n .split('')\n .map((part) => `${part}${part}`)\n .join('')\n : normalized;\n const value = /^[0-9a-f]{6}$/i.test(expanded) ? Number.parseInt(expanded, 16) : 0xf3d49c;\n return new Float32Array([\n ((value >> 16) & 0xff) / 255,\n ((value >> 8) & 0xff) / 255,\n (value & 0xff) / 255,\n ]);\n};\n\nconst clamp = (value: number, min: number, max: number): number =>\n Math.max(min, Math.min(max, value));\n\n/** Retained, single-pass darkness-first dissolve used only by the incoming battle-map sprite. */\nexport class PixiBattleMapDissolve {\n private readonly filter: Filter;\n private readonly uniforms: UniformGroup;\n private settings: PixiBattleMapDissolveSettings;\n private active: ActiveRun | null = null;\n private reducedMotion = false;\n private destroyed = false;\n\n constructor(\n constructors: Constructors,\n private readonly director: PixiAnimationDirector,\n private readonly activity: PixiAnimationActivity | undefined,\n private readonly requestRender: (() => void) | undefined,\n settings: PixiBattleMapDissolveSettings = DEFAULT_PIXI_BATTLE_MAP_DISSOLVE_SETTINGS,\n ) {\n this.settings = settings;\n this.uniforms = new constructors.UniformGroup({\n uProgress: { value: 0, type: 'f32' },\n uEdgeSoftness: { value: settings.edgeSoftness, type: 'f32' },\n uHighlightWidth: { value: settings.highlightWidth, type: 'f32' },\n uHighlightIntensity: { value: settings.highlightIntensity, type: 'f32' },\n uGrainAmount: { value: settings.grainAmount, type: 'f32' },\n uGrainScale: { value: settings.grainScale, type: 'f32' },\n uSeed: { value: 0, type: 'f32' },\n uHighlightColor: { value: hexToRgb(settings.highlightColor), type: 'vec3<f32>' },\n });\n this.filter = constructors.Filter.from({\n gl: {\n vertex: MAP_DISSOLVE_VERTEX,\n fragment: MAP_DISSOLVE_FRAGMENT,\n name: 'battle-map-highlight-dissolve',\n },\n resources: { battleMapDissolveUniforms: this.uniforms },\n resolution: 0.75,\n padding: 0,\n });\n }\n\n setReducedMotion(reducedMotion: boolean): void {\n this.reducedMotion = reducedMotion;\n }\n\n updateSettings(settings: PixiBattleMapDissolveSettings): void {\n this.settings = settings;\n const values = this.uniforms.uniforms;\n values.uEdgeSoftness = clamp(settings.edgeSoftness, 0.001, 0.5);\n values.uHighlightWidth = clamp(settings.highlightWidth, 0, 0.5);\n values.uHighlightIntensity = clamp(settings.highlightIntensity, 0, 2);\n values.uGrainAmount = clamp(settings.grainAmount, 0, 1);\n values.uGrainScale = clamp(settings.grainScale, 1, 512);\n const highlightColor = hexToRgb(settings.highlightColor);\n const currentHighlightColor = values.uHighlightColor;\n if (currentHighlightColor instanceof Float32Array) currentHighlightColor.set(highlightColor);\n else values.uHighlightColor = highlightColor;\n }\n\n async play(sprite: Sprite, seed: number): Promise<void> {\n if (this.destroyed) return;\n this.commit();\n const controller = new AbortController();\n const run: ActiveRun = {\n controller,\n sprite,\n releaseActivity: this.activity?.acquire('battle-map-highlight-dissolve') ?? null,\n };\n this.active = run;\n const progress = { value: 0 };\n if (this.reducedMotion) {\n sprite.alpha = 0;\n } else {\n const values = this.uniforms.uniforms;\n values.uProgress = 0;\n values.uSeed = seed;\n // Let Pixi derive the global filter bounds from the scaled and positioned Sprite.\n // filterArea is local-space in Pixi v8, so stage-space map bounds are transformed twice.\n sprite.filters = [...(sprite.filters ?? []), this.filter];\n }\n try {\n await this.director.tween(\n this.reducedMotion ? sprite : progress,\n this.reducedMotion\n ? { alpha: 1, duration: 0.12, reducedMotionDuration: 0.12, ease: 'none' }\n : {\n value: 1,\n duration: Math.max(0, this.settings.durationMs) / 1000,\n ease: 'none',\n onUpdate: () => {\n this.uniforms.uniforms.uProgress = progress.value;\n this.requestRender?.();\n },\n },\n controller.signal,\n );\n } finally {\n if (this.active === run) {\n this.active = null;\n this.cleanup(run);\n }\n }\n }\n\n commit(): void {\n const run = this.active;\n if (!run) return;\n this.active = null;\n run.controller.abort('map-transition-commit');\n this.cleanup(run);\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.commit();\n this.filter.destroy();\n }\n\n private cleanup(run: ActiveRun): void {\n run.sprite.filters =\n run.sprite.filters?.filter((candidate) => candidate !== this.filter) ?? null;\n run.sprite.alpha = 1;\n run.releaseActivity?.();\n this.requestRender?.();\n }\n}\n", "import type { Filter } from 'pixi.js';\n\nexport interface PixiDirectionalMotionBlur {\n readonly filter: Filter;\n update(velocityX: number, velocityY: number): void;\n reset(): void;\n destroy(): void;\n}\n\nconst VERTEX = `\nin vec2 aPosition;\nout vec2 vTextureCoord;\nuniform highp vec4 uInputSize;\nuniform highp vec4 uOutputFrame;\nuniform highp vec4 uOutputTexture;\n\nvoid main(void) {\n vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;\n position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;\n gl_Position = vec4(position, 0.0, 1.0);\n vTextureCoord = aPosition * (uOutputFrame.zw * uInputSize.zw);\n}\n`;\n\nconst FRAGMENT = `\nin vec2 vTextureCoord;\nout vec4 finalColor;\nuniform sampler2D uTexture;\nuniform highp vec4 uInputSize;\nuniform highp vec4 uInputClamp;\nuniform highp vec2 uVelocity;\n\nvec4 sampleMotion(float offset) {\n vec2 uv = clamp(vTextureCoord - offset * uVelocity * uInputSize.zw, uInputClamp.xy, uInputClamp.zw);\n return texture(uTexture, uv);\n}\n\nvoid main(void) {\n finalColor = sampleMotion(0.0) * 0.28 + sampleMotion(0.16) * 0.20 +\n sampleMotion(0.32) * 0.16 + sampleMotion(0.50) * 0.13 +\n sampleMotion(0.68) * 0.10 + sampleMotion(0.84) * 0.08 + sampleMotion(1.0) * 0.05;\n}\n`;\n\n/** Retained, single-pass directional trail. Mutates the original typed uniform without allocation. */\nexport const createPixiDirectionalMotionBlur = (\n FilterConstructor: typeof Filter,\n options: { resolution?: number; padding?: number } = {},\n): PixiDirectionalMotionBlur => {\n const velocity = new Float32Array([0, 0]);\n const filter = FilterConstructor.from({\n gl: { vertex: VERTEX, fragment: FRAGMENT },\n resources: { motionBlurUniforms: { uVelocity: { value: velocity, type: 'vec2<f32>' } } },\n resolution: options.resolution ?? 0.5,\n padding: options.padding ?? 32,\n antialias: 'off',\n });\n let destroyed = false;\n filter.enabled = false;\n const reset = () => {\n velocity.fill(0);\n filter.enabled = false;\n };\n return {\n filter,\n update(velocityX, velocityY) {\n if (destroyed) return;\n velocity[0] = velocityX;\n velocity[1] = velocityY;\n filter.enabled = Math.hypot(velocityX, velocityY) >= 2;\n },\n reset,\n destroy() {\n if (destroyed) return;\n destroyed = true;\n reset();\n filter.destroy();\n },\n };\n};\n", "import type { Container, Filter, Graphics, Sprite, Texture } from 'pixi.js';\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\nimport {\n createPixiDirectionalMotionBlur,\n type PixiDirectionalMotionBlur,\n} from './PixiDirectionalMotionBlur.js';\nimport { PIXI_STAGE_METRICS } from './PixiStageMetrics.js';\nimport type { PixiStageTheme } from './PixiStageTheme.js';\nimport type { SessionTuningResolver } from './tuning/SessionTuningResolver.js';\n\ninterface Constructors {\n Container: typeof Container;\n Filter?: typeof Filter;\n Graphics: typeof Graphics;\n Sprite: new (texture?: Texture | import('pixi.js').SpriteOptions) => Sprite;\n}\n\n/** One captured image, translated horizontally. It never owns the live scene or a ticker. */\nexport class PixiBattleSceneTransition {\n readonly node: Container;\n private readonly veil: Graphics;\n private readonly slide: Container | null;\n private blur: PixiDirectionalMotionBlur | null = null;\n private destroyed = false;\n\n constructor(\n private readonly constructors: Constructors,\n private readonly animation: PixiAnimationDirector,\n private readonly render: () => void,\n private readonly texture: Texture | null,\n private readonly pixiStageTheme: PixiStageTheme,\n private readonly tuning?: SessionTuningResolver,\n ) {\n const { width, height } = PIXI_STAGE_METRICS;\n this.node = new constructors.Container();\n this.node.label = 'battle-scene-transition';\n this.node.eventMode = 'none';\n const ink = this.tuning?.get('visual.transition.betweenBattles.maskColor');\n this.veil = new constructors.Graphics()\n .rect(0, 0, width, height)\n .fill(\n typeof ink === 'string' || typeof ink === 'number'\n ? ink\n : this.pixiStageTheme.palette.backdrop,\n );\n this.veil.label = 'scene-switch-veil';\n this.veil.alpha = 1;\n this.node.addChild(this.veil);\n this.slide = texture ? new constructors.Container() : null;\n if (this.slide && texture) {\n this.slide.label = 'scene-switch-slide';\n const image = new constructors.Sprite(texture);\n image.width = width;\n image.height = height;\n this.slide.addChild(image);\n this.node.addChild(this.slide);\n }\n }\n\n async play(\n signal: AbortSignal,\n reducedMotion: boolean,\n commit: () => void,\n onStart?: () => void,\n ): Promise<void> {\n if (signal.aborted || this.destroyed) return;\n const seconds = this.number('motion.transition.betweenBattles.duration', 0.85);\n const coverDuration = reducedMotion ? 0.12 : seconds * (10 / 17);\n const direction = this.number('motion.transition.betweenBattles.direction', 1) < 0 ? -1 : 1;\n const blurStrength = reducedMotion\n ? 0\n : Math.min(\n 72,\n Math.max(\n 0,\n this.number(\n 'visual.transition.betweenBattles.motionBlurStrength',\n this.pixiStageTheme.sceneTransition.motionBlurStrength,\n ),\n ),\n );\n // Old saved values (e.g. 1200) must still move the whole image and its trailing pixels offscreen.\n const distance = Math.max(\n PIXI_STAGE_METRICS.width + blurStrength + 2,\n this.number('motion.transition.betweenBattles.displacement', 2000),\n );\n if (this.slide && blurStrength > 0 && this.constructors.Filter) {\n this.blur = createPixiDirectionalMotionBlur(this.constructors.Filter, {\n resolution: this.pixiStageTheme.sceneTransition.motionBlurResolution,\n padding: Math.ceil(blurStrength) + 2,\n });\n this.slide.filters = [this.blur.filter];\n }\n const progress = { value: 0 };\n let started = false;\n try {\n await this.animation.tween(\n progress,\n {\n value: 1,\n duration: coverDuration,\n reducedMotionDuration: coverDuration,\n ease: 'none',\n onStart: () => {\n if (started || signal.aborted || this.destroyed) return;\n started = true;\n onStart?.();\n },\n onUpdate: () => {\n if (signal.aborted || this.destroyed) return;\n const time = Math.max(0, Math.min(1, progress.value));\n if (this.slide) {\n if (reducedMotion) this.slide.alpha = 1 - time;\n else {\n const travel = time < 0.5 ? 4 * time ** 3 : 1 - (-2 * time + 2) ** 3 / 2;\n this.slide.position.set(direction * distance * travel, 0);\n // An early, short exposure ramp makes the trail legible before most travel occurs.\n const exposure = Math.min(1, (time * coverDuration) / 0.075);\n this.blur?.update(-direction * blurStrength * exposure, 0);\n }\n }\n this.render();\n },\n },\n signal,\n );\n if (signal.aborted || this.destroyed) return;\n if (this.slide) this.slide.visible = false;\n this.releaseBlur();\n commit();\n await this.animation.tween(\n this.veil,\n {\n alpha: 0,\n duration: reducedMotion ? 0.12 : seconds - coverDuration,\n reducedMotionDuration: 0.12,\n ease: 'power2.out',\n onUpdate: this.render,\n },\n signal,\n );\n } finally {\n this.releaseBlur();\n }\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.releaseBlur();\n this.node.destroy({ children: true });\n this.texture?.destroy(true);\n }\n\n private releaseBlur(): void {\n if (this.slide) this.slide.filters = null;\n this.blur?.destroy();\n this.blur = null;\n }\n\n private number(path: `motion.${string}` | `visual.${string}`, fallback: number): number {\n const value = this.tuning?.get(path);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n }\n}\n", "export interface TokenLifecyclePoint {\n col: number;\n row: number;\n}\n\nexport interface TokenLifecycleSnapshot {\n id: string;\n gridPosition: TokenLifecyclePoint;\n}\n\nexport interface TokenMovementTransition {\n id: string;\n from: TokenLifecyclePoint;\n to: TokenLifecyclePoint;\n generation: number;\n}\n\nexport interface BattleSnapshotTransition {\n revision: number;\n added: Array<{ id: string; generation: number }>;\n removed: Array<{ id: string; generation: number }>;\n moved: TokenMovementTransition[];\n skipAnim: boolean;\n}\n\nexport interface TokenLifecycleLease {\n generation: number;\n signal: AbortSignal;\n}\n\n/** Computes renderer-local snapshot transitions and guards async completion by token generation. */\nexport class PixiBattleTokenLifecycleCoordinator {\n private readonly known = new Map<string, TokenLifecyclePoint>();\n private readonly generations = new Map<string, number>();\n private readonly controllers = new Map<string, AbortController>();\n\n diff(\n revision: number,\n tokens: readonly TokenLifecycleSnapshot[],\n skipAnim = false,\n ): BattleSnapshotTransition {\n const next = new Map(tokens.map((token) => [token.id, { ...token.gridPosition }]));\n const added: BattleSnapshotTransition['added'] = [];\n const removed: BattleSnapshotTransition['removed'] = [];\n const moved: BattleSnapshotTransition['moved'] = [];\n for (const [id, position] of next) {\n const previous = this.known.get(id);\n if (!previous) {\n this.abort(id);\n const generation = (this.generations.get(id) ?? 0) + 1;\n this.generations.set(id, generation);\n added.push({ id, generation });\n } else if (previous.col !== position.col || previous.row !== position.row) {\n moved.push({\n id,\n from: { ...previous },\n to: { ...position },\n generation: this.generations.get(id) ?? 1,\n });\n }\n }\n for (const id of this.known.keys()) {\n if (next.has(id)) continue;\n removed.push({ id, generation: this.generations.get(id) ?? 1 });\n }\n this.known.clear();\n for (const [id, position] of next) this.known.set(id, position);\n return { revision, added, removed, moved, skipAnim };\n }\n\n begin(id: string): TokenLifecycleLease {\n this.abort(id);\n const controller = new AbortController();\n this.controllers.set(id, controller);\n return { generation: this.generations.get(id) ?? 1, signal: controller.signal };\n }\n\n isCurrent(id: string, lease: TokenLifecycleLease): boolean {\n return !lease.signal.aborted && this.generations.get(id) === lease.generation;\n }\n\n complete(id: string, lease: TokenLifecycleLease): void {\n if (this.controllers.get(id)?.signal === lease.signal) this.controllers.delete(id);\n }\n\n settle(id: string, position: TokenLifecyclePoint): void {\n if (!this.known.has(id)) return;\n this.known.set(id, { ...position });\n }\n\n abort(id: string): void {\n this.controllers.get(id)?.abort();\n this.controllers.delete(id);\n }\n\n reset(): void {\n for (const controller of this.controllers.values()) controller.abort();\n this.controllers.clear();\n this.known.clear();\n this.generations.clear();\n }\n}\n", "import { assertUniformFields } from './uniforms.js';\nimport type { Container, Mesh, MeshGeometry, Shader, UniformGroup } from 'pixi.js';\n\ntype PixiContainer = Container;\ntype PixiMesh = Mesh<MeshGeometry, Shader>;\ntype PixiMeshGeometry = MeshGeometry;\ntype PixiShader = Shader;\ntype PixiUniformGroup = UniformGroup;\n\nexport interface PixiCurrentActorCardGlowConstructors {\n Mesh?: typeof import('pixi.js').Mesh;\n MeshGeometry?: typeof import('pixi.js').MeshGeometry;\n Shader?: typeof import('pixi.js').Shader;\n UniformGroup?: typeof import('pixi.js').UniformGroup;\n}\n\nexport interface CurrentActorCardGlowLayout {\n readonly width: number;\n readonly height: number;\n readonly intensity: number;\n readonly softness: number;\n readonly color: string;\n}\n\ninterface CurrentActorCardGlowUniformValues {\n uProgress: number;\n uSize: Float32Array;\n uCornerRadius: number;\n uSpread: number;\n uSoftness: number;\n uOpacity: number;\n uGlowColor: Float32Array;\n}\n\nconst CARD_GLOW_VERTEX = `\nprecision highp float;\nattribute vec2 aPosition;\nattribute vec2 aUV;\nuniform mat3 uProjectionMatrix;\nuniform mat3 uWorldTransformMatrix;\nuniform mat3 uTransformMatrix;\nuniform vec4 uWorldColorAlpha;\nuniform vec4 uColor;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\n\nvoid main(void) {\n vUV = aUV;\n vWorldAlpha = uWorldColorAlpha.a * uColor.a;\n vec3 position = uProjectionMatrix * uWorldTransformMatrix * uTransformMatrix * vec3(aPosition, 1.0);\n gl_Position = vec4(position.xy, 0.0, 1.0);\n}\n`;\n\nconst CARD_GLOW_FRAGMENT = `\nprecision highp float;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\nuniform float uProgress;\nuniform vec2 uSize;\nuniform float uCornerRadius;\nuniform float uSpread;\nuniform float uSoftness;\nuniform float uOpacity;\nuniform vec3 uGlowColor;\n\nfloat sdRoundBox(vec2 point, vec2 halfSize, float radius) {\n vec2 corner = abs(point) - halfSize + radius;\n return length(max(corner, 0.0)) + min(max(corner.x, corner.y), 0.0) - radius;\n}\n\nvoid main(void) {\n vec2 point = (vUV - 0.5) * uSize;\n float distanceToEdge = sdRoundBox(point, uSize * 0.5, uCornerRadius);\n float inside = 1.0 - smoothstep(0.0, 1.0, distanceToEdge);\n float inwardDistance = max(0.0, -distanceToEdge);\n float expansion = smoothstep(0.0, 0.62, uProgress);\n float revealDepth = uSpread * expansion;\n float revealFeather = max(1.0, uSpread * 0.09 + uSoftness);\n float revealed = 1.0 - smoothstep(revealDepth, revealDepth + revealFeather, inwardDistance);\n float crispFalloff = exp(-3.2 * pow(inwardDistance / max(1.0, uSpread), 1.45));\n float softFalloff = exp(-2.35 * pow(inwardDistance / max(1.0, uSpread + uSoftness), 1.2));\n float softnessMix = smoothstep(0.0, 8.0, uSoftness);\n float falloff = mix(crispFalloff, softFalloff, softnessMix);\n float fadeIn = smoothstep(0.0, 0.08, uProgress);\n float fadeOut = 1.0 - smoothstep(0.62, 1.0, uProgress);\n float alpha = inside * revealed * falloff * fadeIn * fadeOut * uOpacity * vWorldAlpha;\n gl_FragColor = vec4(uGlowColor * alpha, alpha);\n}\n`;\n\nconst clampProgress = (value: number): number => Math.min(1, Math.max(0, value));\n\nconst parseHexColor = (value: string): Float32Array => {\n const normalized = value.trim().replace('#', '');\n const expanded =\n normalized.length === 3\n ? normalized\n .split('')\n .map((channel) => `${channel}${channel}`)\n .join('')\n : normalized;\n const parsed = Number.parseInt(expanded, 16);\n if (!Number.isFinite(parsed)) return new Float32Array([1, 1, 1]);\n return new Float32Array([\n ((parsed >> 16) & 0xff) / 255,\n ((parsed >> 8) & 0xff) / 255,\n (parsed & 0xff) / 255,\n ]);\n};\n\n/** One retained rounded-rectangle shader surface for the active roster card. */\nexport class PixiCurrentActorCardGlow {\n private mesh: PixiMesh | null = null;\n private geometry: PixiMeshGeometry | null = null;\n private shader: PixiShader | null = null;\n private uniformGroup: PixiUniformGroup | null = null;\n\n constructor(private readonly constructors: PixiCurrentActorCardGlowConstructors) {}\n\n configure(\n parent: PixiContainer,\n before: PixiContainer,\n layout: CurrentActorCardGlowLayout,\n ): void {\n const mesh = this.ensureMesh();\n const values = this.getUniformValues();\n if (!mesh || !values) return;\n const intensity = 1 - Math.exp(-Math.max(0, layout.intensity) / 25);\n const width = Math.max(1, layout.width);\n const height = Math.max(1, layout.height);\n const maxSpread = Math.max(5, height / 2 - 7);\n\n values.uSize = new Float32Array([width, height]);\n values.uCornerRadius = 5;\n values.uSpread = 5 + (maxSpread - 5) * intensity;\n values.uSoftness = Math.max(0, layout.softness);\n values.uOpacity = 0.08 + intensity * 0.5;\n values.uGlowColor = parseHexColor(layout.color);\n mesh.position.set(width / 2, height / 2);\n mesh.scale.set(width / 2, height / 2);\n mesh.visible = intensity > 0;\n this.attachBefore(parent, before, mesh);\n }\n\n setFrame(progress: number, staticPresentation = false): void {\n const values = this.getUniformValues();\n if (!values || !this.mesh) return;\n values.uProgress = staticPresentation ? 0.62 : clampProgress(progress);\n this.mesh.alpha = staticPresentation ? 0.76 : 1;\n }\n\n hide(): void {\n if (this.mesh) this.mesh.visible = false;\n }\n\n hideIfAttachedTo(parent: PixiContainer): void {\n if (this.mesh?.parent === parent) this.hide();\n }\n\n detachFrom(parent?: PixiContainer): void {\n if (!this.mesh?.parent) return;\n if (parent && this.mesh.parent !== parent) return;\n this.mesh.parent.removeChild(this.mesh);\n }\n\n destroy(): void {\n this.detachFrom();\n this.mesh?.destroy();\n this.shader?.destroy();\n this.geometry?.destroy();\n this.mesh = null;\n this.shader = null;\n this.geometry = null;\n this.uniformGroup = null;\n }\n\n getMesh(): PixiMesh | null {\n return this.mesh;\n }\n\n getProgress(): number | null {\n return this.getUniformValues()?.uProgress ?? null;\n }\n\n private ensureMesh(): PixiMesh | null {\n if (this.mesh) return this.mesh;\n const {\n Mesh: MeshConstructor,\n MeshGeometry: MeshGeometryConstructor,\n Shader: ShaderConstructor,\n UniformGroup: UniformGroupConstructor,\n } = this.constructors;\n if (\n !MeshConstructor ||\n !MeshGeometryConstructor ||\n !ShaderConstructor ||\n !UniformGroupConstructor\n )\n return null;\n const uniformGroup = new UniformGroupConstructor({\n uProgress: { value: 0, type: 'f32' },\n uSize: { value: new Float32Array([1, 1]), type: 'vec2<f32>' },\n uCornerRadius: { value: 5, type: 'f32' },\n uSpread: { value: 5, type: 'f32' },\n uSoftness: { value: 0, type: 'f32' },\n uOpacity: { value: 0, type: 'f32' },\n uGlowColor: { value: new Float32Array([1, 1, 1]), type: 'vec3<f32>' },\n });\n const shader = ShaderConstructor.from({\n gl: { vertex: CARD_GLOW_VERTEX, fragment: CARD_GLOW_FRAGMENT },\n resources: { currentActorCardGlowUniforms: uniformGroup },\n });\n const geometry = new MeshGeometryConstructor({\n positions: new Float32Array([-1, -1, 1, -1, 1, 1, -1, 1]),\n uvs: new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),\n indices: new Uint32Array([0, 1, 2, 0, 2, 3]),\n topology: 'triangle-list',\n });\n const mesh = new MeshConstructor({ geometry, shader, label: 'battle-current-actor-card-glow' });\n mesh.visible = false;\n this.mesh = mesh;\n this.geometry = geometry;\n this.shader = shader;\n this.uniformGroup = uniformGroup;\n return mesh;\n }\n\n private attachBefore(parent: PixiContainer, before: PixiContainer, mesh: PixiMesh): void {\n const targetIndex = Math.max(0, parent.children.indexOf(before));\n if (mesh.parent === parent && parent.children.indexOf(mesh) === targetIndex) return;\n parent.addChildAt(mesh, Math.min(targetIndex, parent.children.length));\n }\n\n private getUniformValues(): CurrentActorCardGlowUniformValues | null {\n if (!this.uniformGroup) return null;\n return readCurrentActorCardGlowUniformValues(this.uniformGroup.uniforms);\n }\n}\n\nconst readCurrentActorCardGlowUniformValues = (\n value: unknown,\n): CurrentActorCardGlowUniformValues => {\n assertUniformFields(\n value,\n ['uProgress', 'uCornerRadius', 'uSpread', 'uSoftness', 'uOpacity'],\n ['uSize', 'uGlowColor'],\n );\n return value;\n};\n", "import { assertUniformFields } from './uniforms.js';\nimport type { Container, Mesh, MeshGeometry, Shader, UniformGroup } from 'pixi.js';\n\ntype PixiContainer = Container;\ntype PixiMesh = Mesh<MeshGeometry, Shader>;\ntype PixiMeshGeometry = MeshGeometry;\ntype PixiShader = Shader;\ntype PixiUniformGroup = UniformGroup;\n\nexport interface PixiCurrentActorHaloConstructors {\n Mesh?: typeof import('pixi.js').Mesh;\n MeshGeometry?: typeof import('pixi.js').MeshGeometry;\n Shader?: typeof import('pixi.js').Shader;\n UniformGroup?: typeof import('pixi.js').UniformGroup;\n}\n\nexport interface CurrentActorHaloLayout {\n readonly ringDiameter: number;\n readonly avatarAperture: number;\n readonly range: number;\n readonly brightness: number;\n readonly innerBrightness: number;\n readonly innerThickness: number;\n readonly innerSoftness: number;\n readonly waveScale: number;\n readonly color: string;\n}\n\ninterface CurrentActorHaloUniformValues {\n uProgress: number;\n uWaveEndRadius: number;\n uSoftness: number;\n uBrightness: number;\n uInnerRadius: number;\n uInnerBrightness: number;\n uInnerThickness: number;\n uInnerSoftness: number;\n uHaloColor: Float32Array;\n}\n\nconst HALO_VERTEX = `\nprecision highp float;\nattribute vec2 aPosition;\nattribute vec2 aUV;\nuniform mat3 uProjectionMatrix;\nuniform mat3 uWorldTransformMatrix;\nuniform mat3 uTransformMatrix;\nuniform vec4 uWorldColorAlpha;\nuniform vec4 uColor;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\n\nvoid main(void) {\n vUV = aUV;\n vWorldAlpha = uWorldColorAlpha.a * uColor.a;\n vec3 position = uProjectionMatrix * uWorldTransformMatrix * uTransformMatrix * vec3(aPosition, 1.0);\n gl_Position = vec4(position.xy, 0.0, 1.0);\n}\n`;\n\nconst HALO_FRAGMENT = `\nprecision highp float;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\nuniform float uProgress;\nuniform float uWaveEndRadius;\nuniform float uSoftness;\nuniform float uBrightness;\nuniform vec3 uHaloColor;\n\nfloat hash12(vec2 value) {\n vec3 p3 = fract(vec3(value.xyx) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nvoid main(void) {\n vec2 local = vUV * 2.0 - 1.0;\n float distanceToCenter = length(local);\n float peakRadius = uWaveEndRadius * uProgress;\n float normalizedDistance = (distanceToCenter - peakRadius) / max(uSoftness, 0.0001);\n float gaussian = exp(-4.5 * normalizedDistance * normalizedDistance);\n float fadeIn = smoothstep(0.0, 0.12, uProgress);\n float fadeOut = 1.0 - smoothstep(0.58, 1.0, uProgress);\n float baseAlpha = gaussian * fadeIn * fadeOut * uBrightness;\n float dither = (hash12(gl_FragCoord.xy) - 0.5) / 255.0;\n float ditherWeight = smoothstep(0.003, 0.05, baseAlpha);\n float alpha = clamp(baseAlpha + dither * ditherWeight, 0.0, 1.0) * vWorldAlpha;\n gl_FragColor = vec4(uHaloColor * alpha, alpha);\n}\n`;\n\nconst INNER_GLOW_FRAGMENT = `\nprecision highp float;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\nuniform float uProgress;\nuniform float uInnerRadius;\nuniform float uInnerBrightness;\nuniform float uInnerThickness;\nuniform float uInnerSoftness;\nuniform vec3 uHaloColor;\n\nvoid main(void) {\n vec2 local = vUV * 2.0 - 1.0;\n float distanceToCenter = length(local);\n float inwardDistance = max(0.0, uInnerRadius - distanceToCenter);\n float apertureMask = 1.0 - smoothstep(uInnerRadius, uInnerRadius + 0.002, distanceToCenter);\n float softEdge = max(0.001, uInnerSoftness);\n float coreBand = 1.0 - smoothstep(uInnerThickness, uInnerThickness + softEdge, inwardDistance);\n float blurredBand = exp(-1.7 * pow(inwardDistance / max(0.001, uInnerThickness + softEdge), 1.35));\n float softnessMix = 1.0 - exp(-uInnerSoftness / 0.04);\n float innerBand = mix(coreBand, blurredBand, softnessMix);\n float fadeIn = smoothstep(0.0, 0.24, uProgress);\n float fadeOut = 1.0 - smoothstep(0.62, 1.0, uProgress);\n float alpha = apertureMask * innerBand * fadeIn * fadeOut * uInnerBrightness * vWorldAlpha;\n gl_FragColor = vec4(uHaloColor * alpha, alpha);\n}\n`;\n\nconst clampProgress = (value: number): number => Math.min(1, Math.max(0, value));\n\nconst smoothstep = (edgeStart: number, edgeEnd: number, value: number): number => {\n const normalized = Math.min(1, Math.max(0, (value - edgeStart) / (edgeEnd - edgeStart)));\n return normalized * normalized * (3 - 2 * normalized);\n};\n\nexport const resolveCurrentActorHaloSoftness = (range: number): number =>\n 0.1 + 0.9 * (1 - Math.exp(-Math.max(0, range) / 1.5));\n\nexport const resolveCurrentActorHaloBrightness = (brightness: number): number =>\n 0.92 * (1 - Math.exp(-Math.max(0, brightness) / 4));\n\nexport const resolveCurrentActorHaloEnvelope = (progress: number): number => {\n const normalized = clampProgress(progress);\n const fadeIn = smoothstep(0, 0.12, normalized);\n const fadeOut = 1 - smoothstep(0.58, 1, normalized);\n return fadeIn * fadeOut;\n};\n\nexport const resolveCurrentActorHaloPeakRadius = (\n tokenRadius: number,\n waveScale: number,\n progress: number,\n): number => tokenRadius * Math.max(1, waveScale) * clampProgress(progress);\n\nconst parseHexColor = (value: string): Float32Array => {\n const normalized = value.trim().replace('#', '');\n const expanded =\n normalized.length === 3\n ? normalized\n .split('')\n .map((channel) => `${channel}${channel}`)\n .join('')\n : normalized;\n const parsed = Number.parseInt(expanded, 16);\n if (!Number.isFinite(parsed)) return new Float32Array([1, 1, 1]);\n return new Float32Array([\n ((parsed >> 16) & 0xff) / 255,\n ((parsed >> 8) & 0xff) / 255,\n (parsed & 0xff) / 255,\n ]);\n};\n\n/** One retained, local shader surface for the active battle Token. */\nexport class PixiCurrentActorHalo {\n private mesh: PixiMesh | null = null;\n private geometry: PixiMeshGeometry | null = null;\n private shader: PixiShader | null = null;\n private innerMesh: PixiMesh | null = null;\n private innerGeometry: PixiMeshGeometry | null = null;\n private innerShader: PixiShader | null = null;\n private uniformGroup: PixiUniformGroup | null = null;\n private presentationAlpha = 1;\n private highlightMultiplier = 1;\n\n constructor(private readonly constructors: PixiCurrentActorHaloConstructors) {}\n\n configure(\n parent: PixiContainer,\n shadow: PixiContainer,\n avatarLayer: PixiContainer,\n layout: CurrentActorHaloLayout,\n ): void {\n const mesh = this.ensureMesh();\n const innerMesh = this.ensureInnerMesh();\n if (!mesh) return;\n const values = this.getUniformValues();\n if (!values) return;\n const tokenRadius = Math.max(1, layout.ringDiameter / 2);\n const waveEndRadius = tokenRadius * Math.max(1, layout.waveScale);\n const softness = tokenRadius * resolveCurrentActorHaloSoftness(layout.range);\n const extent = Math.max(tokenRadius, waveEndRadius + softness * 1.25);\n\n values.uWaveEndRadius = waveEndRadius / extent;\n values.uSoftness = softness / extent;\n values.uBrightness = resolveCurrentActorHaloBrightness(layout.brightness);\n values.uInnerRadius = Math.max(1, layout.avatarAperture / 2) / extent;\n values.uInnerBrightness = resolveCurrentActorHaloBrightness(layout.innerBrightness) * 0.56;\n values.uInnerThickness = Math.max(0, layout.innerThickness) / extent;\n values.uInnerSoftness = Math.max(0, layout.innerSoftness) / extent;\n values.uHaloColor = parseHexColor(layout.color);\n mesh.scale.set(extent);\n mesh.visible = true;\n if (innerMesh) {\n innerMesh.scale.set(extent);\n innerMesh.visible = values.uInnerBrightness > 0;\n }\n this.attachBehindShadow(parent, shadow, mesh);\n if (innerMesh) this.attachAfterAvatar(parent, avatarLayer, innerMesh);\n }\n\n setProgress(progress: number): void {\n const values = this.getUniformValues();\n if (values) values.uProgress = clampProgress(progress);\n }\n\n setStaticPresentation(): void {\n this.setProgress(0.28);\n this.presentationAlpha = 0.65;\n if (this.mesh) {\n this.mesh.alpha = this.presentationAlpha * this.highlightMultiplier;\n this.mesh.visible = true;\n }\n if (this.innerMesh) {\n this.innerMesh.alpha = this.presentationAlpha * this.highlightMultiplier;\n this.innerMesh.visible = true;\n }\n }\n\n setAnimatedPresentation(): void {\n this.presentationAlpha = 1;\n if (this.mesh) {\n this.mesh.alpha = this.presentationAlpha * this.highlightMultiplier;\n this.mesh.visible = true;\n }\n if (this.innerMesh) {\n this.innerMesh.alpha = this.presentationAlpha * this.highlightMultiplier;\n this.innerMesh.visible = true;\n }\n }\n\n setHighlightMultiplier(multiplier: number): void {\n this.highlightMultiplier = Math.max(0, multiplier);\n if (this.mesh) this.mesh.alpha = this.presentationAlpha * this.highlightMultiplier;\n if (this.innerMesh) this.innerMesh.alpha = this.presentationAlpha * this.highlightMultiplier;\n }\n\n hide(): void {\n if (this.mesh) this.mesh.visible = false;\n if (this.innerMesh) this.innerMesh.visible = false;\n }\n\n detachFrom(parent?: PixiContainer): void {\n if (this.mesh?.parent && (!parent || this.mesh.parent === parent))\n this.mesh.parent.removeChild(this.mesh);\n if (this.innerMesh?.parent && (!parent || this.innerMesh.parent === parent))\n this.innerMesh.parent.removeChild(this.innerMesh);\n }\n\n isAttachedTo(parent: PixiContainer): boolean {\n return this.mesh?.parent === parent || this.innerMesh?.parent === parent;\n }\n\n destroy(): void {\n this.detachFrom();\n this.mesh?.destroy();\n this.shader?.destroy();\n this.geometry?.destroy();\n this.innerMesh?.destroy();\n this.innerShader?.destroy();\n this.innerGeometry?.destroy();\n this.mesh = null;\n this.shader = null;\n this.geometry = null;\n this.innerMesh = null;\n this.innerShader = null;\n this.innerGeometry = null;\n this.uniformGroup = null;\n }\n\n getMesh(): PixiMesh | null {\n return this.mesh;\n }\n\n getInnerMesh(): PixiMesh | null {\n return this.innerMesh;\n }\n\n private ensureMesh(): PixiMesh | null {\n if (this.mesh) return this.mesh;\n const {\n Mesh: MeshConstructor,\n MeshGeometry: MeshGeometryConstructor,\n Shader: ShaderConstructor,\n UniformGroup: UniformGroupConstructor,\n } = this.constructors;\n if (\n !MeshConstructor ||\n !MeshGeometryConstructor ||\n !ShaderConstructor ||\n !UniformGroupConstructor\n )\n return null;\n const uniformGroup = new UniformGroupConstructor({\n uProgress: { value: 0, type: 'f32' },\n uWaveEndRadius: { value: 0.6, type: 'f32' },\n uSoftness: { value: 0.2, type: 'f32' },\n uBrightness: { value: 0, type: 'f32' },\n uInnerRadius: { value: 0.2, type: 'f32' },\n uInnerBrightness: { value: 0, type: 'f32' },\n uInnerThickness: { value: 0.01, type: 'f32' },\n uInnerSoftness: { value: 0.01, type: 'f32' },\n uHaloColor: { value: new Float32Array([1, 1, 1]), type: 'vec3<f32>' },\n });\n const shader = ShaderConstructor.from({\n gl: { vertex: HALO_VERTEX, fragment: HALO_FRAGMENT },\n resources: { haloUniforms: uniformGroup },\n });\n const geometry = new MeshGeometryConstructor({\n positions: new Float32Array([-1, -1, 1, -1, 1, 1, -1, 1]),\n uvs: new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),\n indices: new Uint32Array([0, 1, 2, 0, 2, 3]),\n topology: 'triangle-list',\n });\n const mesh = new MeshConstructor({ geometry, shader, label: 'battle-current-actor-halo' });\n mesh.blendMode = 'screen';\n mesh.visible = false;\n this.mesh = mesh;\n this.geometry = geometry;\n this.shader = shader;\n this.uniformGroup = uniformGroup;\n return mesh;\n }\n\n private ensureInnerMesh(): PixiMesh | null {\n if (this.innerMesh) return this.innerMesh;\n const {\n Mesh: MeshConstructor,\n MeshGeometry: MeshGeometryConstructor,\n Shader: ShaderConstructor,\n } = this.constructors;\n const uniformGroup = this.uniformGroup;\n if (!MeshConstructor || !MeshGeometryConstructor || !ShaderConstructor || !uniformGroup)\n return null;\n const shader = ShaderConstructor.from({\n gl: { vertex: HALO_VERTEX, fragment: INNER_GLOW_FRAGMENT },\n resources: { haloUniforms: uniformGroup },\n });\n const geometry = new MeshGeometryConstructor({\n positions: new Float32Array([-1, -1, 1, -1, 1, 1, -1, 1]),\n uvs: new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),\n indices: new Uint32Array([0, 1, 2, 0, 2, 3]),\n topology: 'triangle-list',\n });\n const mesh = new MeshConstructor({\n geometry,\n shader,\n label: 'battle-current-actor-token-inner-glow',\n });\n mesh.visible = false;\n this.innerMesh = mesh;\n this.innerGeometry = geometry;\n this.innerShader = shader;\n return mesh;\n }\n\n private attachBehindShadow(parent: PixiContainer, shadow: PixiContainer, mesh: PixiMesh): void {\n const shadowIndex = parent.children.indexOf(shadow);\n const targetIndex = Math.max(0, shadowIndex + 1);\n if (mesh.parent === parent && parent.children.indexOf(mesh) === targetIndex) return;\n parent.addChildAt(mesh, Math.min(targetIndex, parent.children.length));\n }\n\n private attachAfterAvatar(\n parent: PixiContainer,\n avatarLayer: PixiContainer,\n mesh: PixiMesh,\n ): void {\n const avatarIndex = parent.children.indexOf(avatarLayer);\n const targetIndex = Math.max(0, avatarIndex + 1);\n if (mesh.parent === parent && parent.children.indexOf(mesh) === targetIndex) return;\n parent.addChildAt(mesh, Math.min(targetIndex, parent.children.length));\n }\n\n private getUniformValues(): CurrentActorHaloUniformValues | null {\n if (!this.uniformGroup) return null;\n return readCurrentActorHaloUniformValues(this.uniformGroup.uniforms);\n }\n}\n\nconst readCurrentActorHaloUniformValues = (value: unknown): CurrentActorHaloUniformValues => {\n assertUniformFields(\n value,\n [\n 'uProgress',\n 'uWaveEndRadius',\n 'uSoftness',\n 'uBrightness',\n 'uInnerRadius',\n 'uInnerBrightness',\n 'uInnerThickness',\n 'uInnerSoftness',\n ],\n ['uHaloColor'],\n );\n return value;\n};\n", "import type { Filter, UniformGroup } from 'pixi.js';\n\nexport const DOSSIER_INSANITY_MODES = ['mosaic', 'ripple', 'chromatic', 'shatter'] as const;\n\nexport type DossierInsanityMode = (typeof DOSSIER_INSANITY_MODES)[number];\n\nconst DOSSIER_INSANITY_FRAGMENT = `\nin vec2 vTextureCoord;\nout vec4 finalColor;\nuniform sampler2D uTexture;\nuniform float uMode;\nuniform float uIntensity;\nuniform float uSeed;\nuniform vec3 uTearGapColor;\n\nvec2 clampUv(vec2 uv) {\n return clamp(uv, vec2(0.001), vec2(0.999));\n}\n\nfloat hash21(vec2 point) {\n return fract(sin(dot(point, vec2(127.1, 311.7))) * 43758.5453123);\n}\n\nvec2 hash22(vec2 point) {\n return fract(sin(vec2(\n dot(point, vec2(127.1, 311.7)),\n dot(point, vec2(269.5, 183.3))\n )) * 43758.5453123);\n}\n\nmat2 rotate2d(float angle) {\n float sine = sin(angle);\n float cosine = cos(angle);\n return mat2(cosine, -sine, sine, cosine);\n}\n\nvoid shatterCard(vec2 uv, float strength) {\n if (strength < 0.001) {\n finalColor = texture(uTexture, clampUv(uv));\n return;\n }\n\n vec2 grid = vec2(9.0, 6.0);\n vec2 seedOffset = vec2(uSeed * 83.17, uSeed * 47.29);\n vec2 point = uv * grid;\n vec2 baseCell = floor(point);\n vec2 fragmentCell = baseCell;\n vec2 fragmentCenter = baseCell + vec2(0.5);\n float nearest = 8.0;\n float secondNearest = 8.0;\n\n for (int y = -1; y <= 1; y++) {\n for (int x = -1; x <= 1; x++) {\n vec2 candidateCell = baseCell + vec2(float(x), float(y));\n vec2 candidateCenter = candidateCell + mix(vec2(0.18), vec2(0.82), hash22(candidateCell + seedOffset));\n float distanceToCenter = length(point - candidateCenter);\n if (distanceToCenter < nearest) {\n secondNearest = nearest;\n nearest = distanceToCenter;\n fragmentCell = candidateCell;\n fragmentCenter = candidateCenter;\n } else if (distanceToCenter < secondNearest) {\n secondNearest = distanceToCenter;\n }\n }\n }\n\n vec2 sourceCell = floor(hash22(fragmentCell + vec2(31.7, 47.3) + seedOffset) * grid);\n vec2 sourceCenter = sourceCell + mix(vec2(0.18), vec2(0.82), hash22(sourceCell + seedOffset));\n vec2 localPoint = point - fragmentCenter;\n float angle = (hash21(fragmentCell + vec2(73.1, 19.4) + seedOffset) - 0.5) * 1.5 * strength;\n float scale = mix(1.0, mix(0.78, 1.18, hash21(fragmentCell + vec2(11.3, 59.7) + seedOffset)), strength);\n vec2 shuffledUv = (sourceCenter + rotate2d(angle) * (localPoint / scale)) / grid;\n vec4 fragment = texture(uTexture, clampUv(mix(uv, shuffledUv, strength)));\n\n float crackWidth = 0.1 * strength;\n float solid = smoothstep(crackWidth, crackWidth * 2.4 + 0.0001, secondNearest - nearest);\n vec4 gap = vec4(uTearGapColor * fragment.a * 0.24, fragment.a * 0.24);\n finalColor = mix(gap, fragment, solid);\n}\n\nvoid main(void) {\n vec2 uv = vTextureCoord;\n float strength = clamp(uIntensity, 0.0, 1.0);\n\n if (uMode < 0.5) {\n float cells = mix(220.0, 34.0, strength) * mix(0.82, 1.18, hash21(vec2(uSeed, 13.0)));\n vec2 mosaicOffset = (hash22(vec2(uSeed, 29.0)) - 0.5) / cells;\n uv = (floor((uv + mosaicOffset) * cells) + 0.5) / cells;\n finalColor = texture(uTexture, clampUv(uv));\n return;\n }\n\n if (uMode < 1.5) {\n vec2 center = uv - mix(vec2(0.39), vec2(0.61), hash22(vec2(uSeed, 41.0)));\n float radius = length(center);\n vec2 direction = radius > 0.0001 ? center / radius : vec2(0.0);\n float rings = sin(radius * mix(44.0, 68.0, hash21(vec2(uSeed, 53.0))) + uSeed * 6.2831853) * (0.016 * strength);\n uv += direction * rings;\n finalColor = texture(uTexture, clampUv(uv));\n return;\n }\n\n if (uMode < 2.5) {\n vec2 frequency = mix(vec2(31.0, 28.0), vec2(53.0, 49.0), hash22(vec2(uSeed, 67.0)));\n vec2 shift = vec2(sin(uv.y * frequency.x + uSeed * 6.2831853), cos(uv.x * frequency.y + uSeed * 3.1415926)) * (0.012 * strength);\n vec4 base = texture(uTexture, clampUv(uv));\n float red = texture(uTexture, clampUv(uv + shift)).r;\n float blue = texture(uTexture, clampUv(uv - shift)).b;\n finalColor = vec4(red, base.g, blue, base.a);\n return;\n }\n\n shatterCard(uv, strength);\n}\n`;\n\nconst DOSSIER_INSANITY_VERTEX = `\nin vec2 aPosition;\nout vec2 vTextureCoord;\nuniform vec4 uInputSize;\nuniform vec4 uOutputFrame;\nuniform vec4 uOutputTexture;\nvec4 filterVertexPosition(void) {\n vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;\n position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;\n return vec4(position, 0.0, 1.0);\n}\nvec2 filterTextureCoord(void) { return aPosition * (uOutputFrame.zw * uInputSize.zw); }\nvoid main(void) { gl_Position = filterVertexPosition(); vTextureCoord = filterTextureCoord(); }\n`;\n\nexport interface DossierInsanityFilter {\n readonly filter: Filter;\n update(mode: DossierInsanityMode, intensity: number, seed: number): void;\n destroy(): void;\n}\n\nexport interface DossierInsanityFilterConstructors {\n Filter: typeof Filter;\n UniformGroup: typeof UniformGroup;\n tearGapColor: Float32Array;\n}\n\nconst modeValue = (mode: DossierInsanityMode): number => DOSSIER_INSANITY_MODES.indexOf(mode);\n\nexport const createDossierInsanityFilter = ({\n Filter,\n UniformGroup,\n tearGapColor,\n}: DossierInsanityFilterConstructors): DossierInsanityFilter => {\n const uniforms = new UniformGroup({\n uMode: { value: modeValue('ripple'), type: 'f32' },\n uIntensity: { value: 1, type: 'f32' },\n uSeed: { value: 0, type: 'f32' },\n uTearGapColor: { value: tearGapColor, type: 'vec3<f32>' },\n });\n const filter = Filter.from({\n gl: { vertex: DOSSIER_INSANITY_VERTEX, fragment: DOSSIER_INSANITY_FRAGMENT },\n resources: { dossierInsanityUniforms: uniforms },\n });\n\n return {\n filter,\n update(mode, intensity, seed) {\n uniforms.uniforms.uMode = modeValue(mode);\n uniforms.uniforms.uIntensity = Math.max(0, Math.min(1, intensity));\n uniforms.uniforms.uSeed = Math.max(0, Math.min(1, seed));\n },\n destroy() {\n filter.destroy();\n },\n };\n};\n", "import type { Container, Mesh, MeshGeometry, Shader, UniformGroup } from 'pixi.js';\n\ntype PixiMesh = Mesh<MeshGeometry, Shader>;\n\nexport interface PixiLocalGlowConstructors {\n Mesh?: typeof import('pixi.js').Mesh;\n MeshGeometry?: typeof import('pixi.js').MeshGeometry;\n Shader?: typeof import('pixi.js').Shader;\n UniformGroup?: typeof import('pixi.js').UniformGroup;\n}\n\nexport interface PixiLocalGlowLayout {\n x: number;\n y: number;\n width: number;\n height: number;\n color: string;\n intensity: number;\n softness: number;\n edge: number;\n edgeIntensity?: number;\n shape: 'ellipse' | 'rounded-rect';\n}\n\ninterface GlowUniforms {\n uGlowColor: Float32Array;\n uIntensity: number;\n uSoftness: number;\n uEdge: number;\n uEdgeIntensity: number;\n uShape: number;\n uAspect: number;\n uProgress: number;\n}\n\nconst GLOW_VERTEX = `\nprecision highp float;\nattribute vec2 aPosition;\nattribute vec2 aUV;\nuniform mat3 uProjectionMatrix;\nuniform mat3 uWorldTransformMatrix;\nuniform mat3 uTransformMatrix;\nuniform vec4 uWorldColorAlpha;\nuniform vec4 uColor;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\n\nvoid main(void) {\n vUV = aUV;\n vWorldAlpha = uWorldColorAlpha.a * uColor.a;\n vec3 position = uProjectionMatrix * uWorldTransformMatrix * uTransformMatrix * vec3(aPosition, 1.0);\n gl_Position = vec4(position.xy, 0.0, 1.0);\n}\n`;\n\nconst GLOW_FRAGMENT = `\nprecision highp float;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\nuniform vec3 uGlowColor;\nuniform float uIntensity;\nuniform float uSoftness;\nuniform float uEdge;\nuniform float uEdgeIntensity;\nuniform float uShape;\nuniform float uAspect;\nuniform float uProgress;\n\nfloat hash12(vec2 value) {\n vec3 p3 = fract(vec3(value.xyx) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nfloat roundedBoxDistance(vec2 point, vec2 halfSize, float radius) {\n vec2 corner = abs(point) - halfSize + radius;\n return length(max(corner, 0.0)) + min(max(corner.x, corner.y), 0.0) - radius;\n}\n\nvoid main(void) {\n vec2 local = vUV * 2.0 - 1.0;\n float ellipseDistance = length(local);\n float boxDistance = roundedBoxDistance(local, vec2(0.82, 0.78), 0.12) + 0.78;\n float distanceToCenter = mix(ellipseDistance, boxDistance, step(0.5, uShape));\n float breathing = 0.93 + sin(uProgress * 6.283185) * 0.07;\n float inner = 1.0 - smoothstep(0.0, max(0.08, uSoftness), distanceToCenter);\n float edge = (1.0 - smoothstep(max(0.001, uEdge), max(0.002, uEdge + uSoftness * 0.22), abs(distanceToCenter - 0.78))) * uEdgeIntensity;\n float vignette = 1.0 - smoothstep(0.68, 1.02, distanceToCenter);\n float alpha = (inner * 0.52 + edge * 0.74) * vignette * uIntensity * breathing;\n float dither = (hash12(gl_FragCoord.xy) - 0.5) / 255.0;\n alpha = clamp(alpha + dither * smoothstep(0.002, 0.08, alpha), 0.0, 1.0) * vWorldAlpha;\n vec3 color = uGlowColor * (0.72 + edge * 0.72 + inner * 0.35);\n gl_FragColor = vec4(color * alpha, alpha);\n}\n`;\n\nconst parseColor = (value: string): Float32Array => {\n const parsed = Number.parseInt(value.replace('#', ''), 16);\n if (!Number.isFinite(parsed)) return new Float32Array([1, 1, 1]);\n return new Float32Array([\n ((parsed >> 16) & 0xff) / 255,\n ((parsed >> 8) & 0xff) / 255,\n (parsed & 0xff) / 255,\n ]);\n};\n\n/** Retained, tightly bounded glow surface shared by non-battle scene composition. */\nexport class PixiLocalGlowMesh {\n private mesh: PixiMesh | null = null;\n private geometry: MeshGeometry | null = null;\n private shader: Shader | null = null;\n private uniforms: UniformGroup | null = null;\n\n constructor(\n private readonly constructors: PixiLocalGlowConstructors,\n private readonly label: string,\n ) {}\n\n configure(parent: Container, layout: PixiLocalGlowLayout): PixiMesh | null {\n const mesh = this.ensureMesh();\n const uniforms = this.uniforms?.uniforms as GlowUniforms | undefined;\n if (!mesh || !uniforms) return null;\n uniforms.uGlowColor = parseColor(layout.color);\n uniforms.uIntensity = Math.max(0, layout.intensity);\n uniforms.uSoftness = Math.max(0.01, layout.softness);\n uniforms.uEdge = Math.max(0.001, layout.edge);\n uniforms.uEdgeIntensity = Math.max(0, layout.edgeIntensity ?? 1);\n uniforms.uShape = layout.shape === 'rounded-rect' ? 1 : 0;\n uniforms.uAspect = Math.max(0.01, layout.width / Math.max(1, layout.height));\n mesh.position.set(layout.x, layout.y);\n mesh.scale.set(Math.max(1, layout.width) / 2, Math.max(1, layout.height) / 2);\n mesh.visible = layout.intensity > 0;\n if (mesh.parent !== parent) parent.addChild(mesh);\n return mesh;\n }\n\n setProgress(progress: number): void {\n const uniforms = this.uniforms?.uniforms as GlowUniforms | undefined;\n if (uniforms) uniforms.uProgress = progress - Math.floor(progress);\n }\n\n setIntensity(intensity: number): void {\n const uniforms = this.uniforms?.uniforms as GlowUniforms | undefined;\n if (uniforms) uniforms.uIntensity = Math.max(0, intensity);\n }\n\n setVisible(visible: boolean): void {\n if (this.mesh) this.mesh.visible = visible;\n }\n\n destroy(): void {\n this.mesh?.parent?.removeChild(this.mesh);\n this.mesh?.destroy();\n this.shader?.destroy();\n this.geometry?.destroy();\n this.mesh = null;\n this.shader = null;\n this.geometry = null;\n this.uniforms = null;\n }\n\n get node(): PixiMesh | null {\n return this.mesh;\n }\n\n private ensureMesh(): PixiMesh | null {\n if (this.mesh) return this.mesh;\n const {\n Mesh: MeshConstructor,\n MeshGeometry: MeshGeometryConstructor,\n Shader: ShaderConstructor,\n UniformGroup: UniformGroupConstructor,\n } = this.constructors;\n if (\n !MeshConstructor ||\n !MeshGeometryConstructor ||\n !ShaderConstructor ||\n !UniformGroupConstructor\n )\n return null;\n const uniforms = new UniformGroupConstructor({\n uGlowColor: { value: new Float32Array([1, 1, 1]), type: 'vec3<f32>' },\n uIntensity: { value: 0, type: 'f32' },\n uSoftness: { value: 0.4, type: 'f32' },\n uEdge: { value: 0.06, type: 'f32' },\n uEdgeIntensity: { value: 1, type: 'f32' },\n uShape: { value: 0, type: 'f32' },\n uAspect: { value: 1, type: 'f32' },\n uProgress: { value: 0, type: 'f32' },\n });\n const shader = ShaderConstructor.from({\n gl: { vertex: GLOW_VERTEX, fragment: GLOW_FRAGMENT },\n resources: { localGlowUniforms: uniforms },\n });\n const geometry = new MeshGeometryConstructor({\n positions: new Float32Array([-1, -1, 1, -1, 1, 1, -1, 1]),\n uvs: new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),\n indices: new Uint32Array([0, 1, 2, 0, 2, 3]),\n topology: 'triangle-list',\n });\n const mesh = new MeshConstructor({ geometry, shader, label: this.label });\n mesh.blendMode = 'screen';\n mesh.eventMode = 'none';\n mesh.visible = false;\n this.mesh = mesh;\n this.geometry = geometry;\n this.shader = shader;\n this.uniforms = uniforms;\n return mesh;\n }\n}\n", "import type { Container, Mesh, MeshGeometry, Shader, UniformGroup } from 'pixi.js';\n\nimport type { PixiBattleFxCapabilities } from './PixiBattleFxResources.js';\n\ntype EdgeUniforms = {\n uSize: Float32Array;\n uDepth: Float32Array;\n uAlpha: Float32Array;\n uPower: Float32Array;\n uShadowColor: Float32Array;\n};\n\nconst VERTEX = `\nprecision highp float;\nattribute vec2 aPosition;\nattribute vec2 aUV;\nuniform mat3 uProjectionMatrix;\nuniform mat3 uWorldTransformMatrix;\nuniform mat3 uTransformMatrix;\nuniform vec4 uWorldColorAlpha;\nuniform vec4 uColor;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\nvoid main(void) {\n vUV = aUV;\n vWorldAlpha = uWorldColorAlpha.a * uColor.a;\n vec3 position = uProjectionMatrix * uWorldTransformMatrix * uTransformMatrix * vec3(aPosition, 1.0);\n gl_Position = vec4(position.xy, 0.0, 1.0);\n}`;\n\nconst FRAGMENT = `\nprecision highp float;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\nuniform vec2 uSize;\nuniform vec4 uDepth;\nuniform vec4 uAlpha;\nuniform vec4 uPower;\nuniform vec3 uShadowColor;\nfloat edge(float distancePx, float depthPx, float alpha, float power) {\n float value = clamp(1.0 - distancePx / max(depthPx, 0.001), 0.0, 1.0);\n return alpha * pow(value, power);\n}\nvoid main(void) {\n float top = edge(vUV.y * uSize.y, uDepth.x, uAlpha.x, uPower.x);\n float right = edge((1.0 - vUV.x) * uSize.x, uDepth.y, uAlpha.y, uPower.y);\n float bottom = edge((1.0 - vUV.y) * uSize.y, uDepth.z, uAlpha.z, uPower.z);\n float left = edge(vUV.x * uSize.x, uDepth.w, uAlpha.w, uPower.w);\n float alpha = (1.0 - (1.0 - top) * (1.0 - right) * (1.0 - bottom) * (1.0 - left)) * vWorldAlpha;\n gl_FragColor = vec4(uShadowColor * alpha, alpha);\n}`;\n\nexport interface MapEdgeShadowStyle {\n color: string;\n top: { depth: number; alpha: number; power: number };\n side: { depth: number; alpha: number; power: number };\n bottom: { depth: number; alpha: number; power: number };\n}\n\nexport class PixiMapEdgeShadow {\n private mesh: Mesh<MeshGeometry, Shader> | null = null;\n private geometry: MeshGeometry | null = null;\n private shader: Shader | null = null;\n private uniforms: UniformGroup | null = null;\n\n constructor(private readonly constructors: PixiBattleFxCapabilities) {}\n\n sync(\n parent: Container,\n rect: { x: number; y: number; width: number; height: number },\n style: MapEdgeShadowStyle,\n ): void {\n const mesh = this.ensure();\n if (!mesh || !this.uniforms) return;\n if (mesh.parent !== parent) parent.addChild(mesh);\n mesh.position.set(rect.x, rect.y);\n mesh.scale.set(rect.width, rect.height);\n const values = this.uniforms.uniforms as EdgeUniforms;\n values.uSize.set([rect.width, rect.height]);\n values.uDepth.set([style.top.depth, style.side.depth, style.bottom.depth, style.side.depth]);\n values.uAlpha.set([style.top.alpha, style.side.alpha, style.bottom.alpha, style.side.alpha]);\n values.uPower.set([style.top.power, style.side.power, style.bottom.power, style.side.power]);\n values.uShadowColor.set(parseColor(style.color));\n }\n\n destroy(): void {\n this.mesh?.parent?.removeChild(this.mesh);\n this.mesh?.destroy();\n this.shader?.destroy();\n this.geometry?.destroy();\n this.mesh = null;\n this.shader = null;\n this.geometry = null;\n this.uniforms = null;\n }\n\n private ensure(): Mesh<MeshGeometry, Shader> | null {\n if (this.mesh) return this.mesh;\n const { Mesh, MeshGeometry, Shader, UniformGroup } = this.constructors;\n if (!Mesh || !MeshGeometry || !Shader || !UniformGroup) return null;\n const uniforms = new UniformGroup({\n uSize: { value: new Float32Array([1, 1]), type: 'vec2<f32>' },\n uDepth: { value: new Float32Array([56, 40, 46, 40]), type: 'vec4<f32>' },\n uAlpha: { value: new Float32Array([0.72, 0.28, 0.34, 0.28]), type: 'vec4<f32>' },\n uPower: { value: new Float32Array([1.35, 1.2, 1.25, 1.2]), type: 'vec4<f32>' },\n uShadowColor: {\n value: new Float32Array([5 / 255, 3 / 255, 2 / 255]),\n type: 'vec3<f32>',\n },\n });\n const shader = Shader.from({\n gl: { vertex: VERTEX, fragment: FRAGMENT },\n resources: { edgeUniforms: uniforms },\n });\n const geometry = new MeshGeometry({\n positions: new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),\n uvs: new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),\n indices: new Uint32Array([0, 1, 2, 0, 2, 3]),\n topology: 'triangle-list',\n });\n const mesh = new Mesh({ geometry, shader, label: 'battle-map-edge-shadow' });\n mesh.eventMode = 'none';\n this.uniforms = uniforms;\n this.shader = shader;\n this.geometry = geometry;\n this.mesh = mesh;\n return mesh;\n }\n}\n\nconst parseColor = (value: string): Float32Array => {\n const hex = value.replace('#', '').padEnd(6, '0').slice(0, 6);\n return new Float32Array([\n Number.parseInt(hex.slice(0, 2), 16) / 255,\n Number.parseInt(hex.slice(2, 4), 16) / 255,\n Number.parseInt(hex.slice(4, 6), 16) / 255,\n ]);\n};\n", "import type { Filter, Sprite, Ticker, UniformGroup } from 'pixi.js';\nimport type { PixiAnimationActivity } from './PixiAnimationActivity.js';\nimport type { SessionTuningResolver } from './tuning/SessionTuningResolver.js';\n\nexport type PixiMediaBreathCategory = 'primary' | 'map' | 'avatar';\n\nexport interface PixiMediaBreathBinding {\n readonly filter: Filter;\n release(): void;\n}\n\nexport interface PixiMediaBreathFrame {\n readonly breath: number;\n readonly uiHighlightMultiplier: number;\n}\n\ninterface Constructors {\n Filter: typeof Filter;\n UniformGroup: typeof UniformGroup;\n}\n\ninterface ManagedBinding {\n readonly sprite: Sprite;\n readonly category: PixiMediaBreathCategory;\n readonly filter: Filter;\n readonly uniforms: UniformGroup;\n released: boolean;\n}\n\nexport interface PixiMediaBreathSettings {\n readonly enabled: boolean;\n readonly contrast: number;\n readonly shadowCrush: number;\n readonly highlightBoost: number;\n readonly dynamicStrength: number;\n readonly brightReact: number;\n readonly filterResolution: number;\n readonly primaryGain: number;\n readonly mapGain: number;\n readonly avatarGain: number;\n readonly uiHighlightGain: number;\n readonly speedMultiplier: number;\n}\n\nexport const DEFAULT_PIXI_MEDIA_BREATH_SETTINGS: PixiMediaBreathSettings = {\n enabled: true,\n contrast: 1.08,\n shadowCrush: 0.04,\n highlightBoost: 0.1,\n dynamicStrength: 0.08,\n brightReact: 0.75,\n filterResolution: 0.75,\n primaryGain: 1,\n mapGain: 0.55,\n avatarGain: 0.4,\n uiHighlightGain: 0.25,\n speedMultiplier: 0.4,\n};\n\nconst CATEGORY_PHASE: Readonly<Record<PixiMediaBreathCategory, number>> = {\n primary: 0,\n map: 1 / 3,\n avatar: 2 / 3,\n};\n\nconst MEDIA_BREATH_VERTEX = `\nin vec2 aPosition;\nout vec2 vTextureCoord;\nuniform vec4 uInputSize;\nuniform vec4 uOutputFrame;\nuniform vec4 uOutputTexture;\n\nvec4 filterVertexPosition(void) {\n vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;\n position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;\n return vec4(position, 0.0, 1.0);\n}\n\nvec2 filterTextureCoord(void) {\n return aPosition * (uOutputFrame.zw * uInputSize.zw);\n}\n\nvoid main(void) {\n gl_Position = filterVertexPosition();\n vTextureCoord = filterTextureCoord();\n}\n`;\n\nconst MEDIA_BREATH_FRAGMENT = `\nin vec2 vTextureCoord;\nout vec4 finalColor;\nuniform sampler2D uTexture;\nuniform float uContrast;\nuniform float uShadowCrush;\nuniform float uHighlightBoost;\nuniform float uDynamicStrength;\nuniform float uBrightReact;\nuniform float uBreath;\n\nvec3 softShoulder(vec3 value) {\n vec3 safeValue = max(value, vec3(0.0));\n const float shoulder = 0.82;\n const float headroom = 0.18;\n vec3 compressed = vec3(shoulder) + vec3(headroom) *\n (vec3(1.0) - exp(-max(safeValue - vec3(shoulder), vec3(0.0)) / headroom));\n return mix(safeValue, compressed, step(vec3(shoulder), safeValue));\n}\n\nvoid main(void) {\n vec4 tex = texture(uTexture, vTextureCoord);\n if (tex.a <= 0.00001) {\n finalColor = vec4(0.0);\n return;\n }\n\n vec3 color = tex.rgb / tex.a;\n float luma = dot(color, vec3(0.2126, 0.7152, 0.0722));\n color = (color - 0.5) * uContrast + 0.5;\n\n float shadowMask = 1.0 - smoothstep(0.08, 0.50, luma);\n float highlightMask = smoothstep(0.38, 0.90, luma);\n color *= 1.0 - shadowMask * uShadowCrush;\n color *= 1.0 + highlightMask * uHighlightBoost;\n\n float brightnessResponse = mix(0.42, 1.0, smoothstep(0.10, 0.86, luma));\n brightnessResponse = mix(0.72, brightnessResponse, uBrightReact);\n float exposure = 1.0 + uBreath * uDynamicStrength * brightnessResponse;\n color *= max(exposure, 0.05);\n\n float positiveBreath = max(uBreath, 0.0);\n color *= 1.0 + positiveBreath * highlightMask * uDynamicStrength * uBrightReact * 0.62;\n float negativeBreath = max(-uBreath, 0.0);\n color *= 1.0 - negativeBreath * shadowMask * uDynamicStrength * 0.16;\n\n color = softShoulder(color);\n finalColor = vec4(color * tex.a, tex.a);\n}\n`;\n\nconst finiteNumber = (\n tuning: SessionTuningResolver | undefined,\n path: Parameters<SessionTuningResolver['get']>[0],\n fallback: number,\n): number => {\n const value = tuning?.get(path);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n};\n\nconst booleanValue = (\n tuning: SessionTuningResolver | undefined,\n path: Parameters<SessionTuningResolver['get']>[0],\n fallback: boolean,\n): boolean => {\n const value = tuning?.get(path);\n return typeof value === 'boolean' ? value : fallback;\n};\n\nexport const resolveMediaBreathSettings = (\n tuning?: SessionTuningResolver,\n): PixiMediaBreathSettings => ({\n enabled: booleanValue(\n tuning,\n 'visual.mediaBreath.enabled',\n DEFAULT_PIXI_MEDIA_BREATH_SETTINGS.enabled,\n ),\n contrast: finiteNumber(\n tuning,\n 'visual.mediaBreath.contrast',\n DEFAULT_PIXI_MEDIA_BREATH_SETTINGS.contrast,\n ),\n shadowCrush: finiteNumber(\n tuning,\n 'visual.mediaBreath.shadowCrush',\n DEFAULT_PIXI_MEDIA_BREATH_SETTINGS.shadowCrush,\n ),\n highlightBoost: finiteNumber(\n tuning,\n 'visual.mediaBreath.highlightBoost',\n DEFAULT_PIXI_MEDIA_BREATH_SETTINGS.highlightBoost,\n ),\n dynamicStrength: finiteNumber(\n tuning,\n 'visual.mediaBreath.dynamicStrength',\n DEFAULT_PIXI_MEDIA_BREATH_SETTINGS.dynamicStrength,\n ),\n brightReact: finiteNumber(\n tuning,\n 'visual.mediaBreath.brightReact',\n DEFAULT_PIXI_MEDIA_BREATH_SETTINGS.brightReact,\n ),\n filterResolution: finiteNumber(\n tuning,\n 'visual.mediaBreath.filterResolution',\n DEFAULT_PIXI_MEDIA_BREATH_SETTINGS.filterResolution,\n ),\n primaryGain: finiteNumber(\n tuning,\n 'visual.mediaBreath.primaryGain',\n DEFAULT_PIXI_MEDIA_BREATH_SETTINGS.primaryGain,\n ),\n mapGain: finiteNumber(\n tuning,\n 'visual.mediaBreath.mapGain',\n DEFAULT_PIXI_MEDIA_BREATH_SETTINGS.mapGain,\n ),\n avatarGain: finiteNumber(\n tuning,\n 'visual.mediaBreath.avatarGain',\n DEFAULT_PIXI_MEDIA_BREATH_SETTINGS.avatarGain,\n ),\n uiHighlightGain: finiteNumber(\n tuning,\n 'visual.mediaBreath.uiHighlightGain',\n DEFAULT_PIXI_MEDIA_BREATH_SETTINGS.uiHighlightGain,\n ),\n speedMultiplier: finiteNumber(\n tuning,\n 'motion.mediaBreath.speedMultiplier',\n DEFAULT_PIXI_MEDIA_BREATH_SETTINGS.speedMultiplier,\n ),\n});\n\nexport const resolveMediaBreathWave = (elapsedSeconds: number, phase = 0): number => {\n const phaseRadians = phase * Math.PI * 2;\n const main = Math.sin(elapsedSeconds * 1.55 + phaseRadians);\n const slow = Math.sin(elapsedSeconds * 0.57 + 1.35 + phaseRadians);\n const verySlow = Math.sin(elapsedSeconds * 0.23 + 4.1 + phaseRadians);\n const breath = main * 0.82 + slow * 0.13 + verySlow * 0.05;\n return breath / (1 + Math.abs(breath) * 0.1);\n};\n\nconst categoryGain = (\n settings: PixiMediaBreathSettings,\n category: PixiMediaBreathCategory,\n): number => {\n if (category === 'map') return settings.mapGain;\n if (category === 'avatar') return settings.avatarGain;\n return settings.primaryGain;\n};\n\nexport class PixiMediaBreathRuntime {\n private readonly bindings = new Set<ManagedBinding>();\n private readonly highlightListeners = new Set<(frame: PixiMediaBreathFrame) => void>();\n private settings: PixiMediaBreathSettings;\n private elapsedSeconds = 0;\n private paused = false;\n private active = false;\n private suspended = false;\n private reducedMotion = false;\n private destroyed = false;\n private releaseActivity: (() => void) | null = null;\n\n constructor(\n private readonly constructors: Constructors,\n private readonly ticker: Ticker,\n private readonly activity: PixiAnimationActivity,\n private readonly requestRender: () => void,\n tuning?: SessionTuningResolver,\n ) {\n this.settings = resolveMediaBreathSettings(tuning);\n ticker.add(this.tick);\n }\n\n attach(sprite: Sprite, category: PixiMediaBreathCategory): PixiMediaBreathBinding {\n if (this.destroyed) throw new Error('PixiMediaBreathRuntime has been destroyed');\n const uniforms = new this.constructors.UniformGroup({\n uContrast: { value: 1, type: 'f32' },\n uShadowCrush: { value: 0, type: 'f32' },\n uHighlightBoost: { value: 0, type: 'f32' },\n uDynamicStrength: { value: 0, type: 'f32' },\n uBrightReact: { value: this.settings.brightReact, type: 'f32' },\n uBreath: { value: 0, type: 'f32' },\n });\n const filter = this.constructors.Filter.from({\n gl: {\n vertex: MEDIA_BREATH_VERTEX,\n fragment: MEDIA_BREATH_FRAGMENT,\n name: `session-media-breath-${category}`,\n },\n resources: { mediaBreathUniforms: uniforms },\n resolution: Math.max(0.1, this.settings.filterResolution),\n padding: 0,\n });\n const binding: ManagedBinding = { sprite, category, filter, uniforms, released: false };\n sprite.filters = [...(sprite.filters ?? []), filter];\n this.bindings.add(binding);\n this.applyBinding(binding);\n this.syncActivity();\n this.requestRender();\n return {\n filter,\n release: () => this.releaseBinding(binding),\n };\n }\n\n subscribeUiHighlight(listener: (frame: PixiMediaBreathFrame) => void): () => void {\n if (this.destroyed) return () => undefined;\n this.highlightListeners.add(listener);\n listener(this.resolveFrame());\n this.syncActivity();\n return () => {\n this.highlightListeners.delete(listener);\n this.syncActivity();\n };\n }\n\n getFrame(): PixiMediaBreathFrame {\n return this.resolveFrame();\n }\n\n updateTuning(tuning: SessionTuningResolver | undefined): void {\n this.settings = resolveMediaBreathSettings(tuning);\n for (const binding of this.bindings) this.applyBinding(binding);\n this.publishHighlightFrame();\n this.syncActivity();\n this.requestRender();\n }\n\n setPaused(paused: boolean): void {\n if (this.paused === paused) return;\n this.paused = paused;\n this.syncActivity();\n }\n\n setActive(active: boolean): void {\n if (this.active === active) return;\n this.active = active;\n for (const binding of this.bindings) this.applyBinding(binding);\n this.publishHighlightFrame();\n this.syncActivity();\n this.requestRender();\n }\n\n syncPresentationState(active: boolean, suspended: boolean): void {\n if (this.active === active && this.suspended === suspended) return;\n this.active = active;\n this.suspended = suspended;\n for (const binding of this.bindings) this.applyBinding(binding);\n this.publishHighlightFrame();\n this.syncActivity();\n }\n\n setSuspended(suspended: boolean): void {\n if (this.suspended === suspended) return;\n this.suspended = suspended;\n for (const binding of this.bindings) this.applyBinding(binding);\n this.publishHighlightFrame();\n this.syncActivity();\n this.requestRender();\n }\n\n setReducedMotion(reducedMotion: boolean): void {\n if (this.reducedMotion === reducedMotion) return;\n this.reducedMotion = reducedMotion;\n for (const binding of this.bindings) this.applyBinding(binding);\n this.publishHighlightFrame();\n this.syncActivity();\n this.requestRender();\n }\n\n reset(): void {\n this.elapsedSeconds = 0;\n this.suspended = false;\n for (const binding of this.bindings) this.applyBinding(binding);\n this.publishHighlightFrame();\n this.syncActivity();\n this.requestRender();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.releaseActivity?.();\n this.releaseActivity = null;\n this.ticker.remove(this.tick);\n for (const binding of [...this.bindings]) this.releaseBinding(binding);\n this.highlightListeners.clear();\n }\n\n private releaseBinding(binding: ManagedBinding): void {\n if (binding.released) return;\n binding.released = true;\n this.bindings.delete(binding);\n if (!binding.sprite.destroyed) {\n const remaining = (binding.sprite.filters ?? []).filter(\n (candidate) => candidate !== binding.filter,\n );\n binding.sprite.filters = remaining.length > 0 ? remaining : null;\n }\n binding.filter.destroy();\n this.syncActivity();\n }\n\n private applyBinding(binding: ManagedBinding): void {\n const gain = categoryGain(this.settings, binding.category);\n const uniforms = binding.uniforms.uniforms;\n binding.filter.enabled = this.settings.enabled && gain !== 0;\n binding.filter.resolution = Math.max(0.1, this.settings.filterResolution);\n uniforms.uContrast = 1 + (this.settings.contrast - 1) * gain;\n uniforms.uShadowCrush = this.settings.shadowCrush * gain;\n uniforms.uHighlightBoost = this.settings.highlightBoost * gain;\n uniforms.uDynamicStrength = this.settings.dynamicStrength * gain;\n uniforms.uBrightReact = this.settings.brightReact;\n uniforms.uBreath = this.resolveCategoryBreath(binding.category);\n }\n\n private resolveCategoryBreath(category: PixiMediaBreathCategory): number {\n if (!this.active || this.reducedMotion || this.suspended || !this.settings.enabled) return 0;\n return resolveMediaBreathWave(\n this.elapsedSeconds * this.settings.speedMultiplier,\n CATEGORY_PHASE[category],\n );\n }\n\n private resolveFrame(): PixiMediaBreathFrame {\n if (!this.settings.enabled || !this.active) return { breath: 0, uiHighlightMultiplier: 1 };\n const breath =\n this.reducedMotion || this.suspended\n ? 0\n : resolveMediaBreathWave(this.elapsedSeconds * this.settings.speedMultiplier, 1 / 6);\n const gain = this.settings.uiHighlightGain;\n const staticLift = this.settings.highlightBoost * gain * 0.5;\n const dynamicLift = breath * this.settings.dynamicStrength * gain;\n return {\n breath,\n uiHighlightMultiplier: Math.max(0, 1 + staticLift + dynamicLift),\n };\n }\n\n private publishHighlightFrame(): void {\n const frame = this.resolveFrame();\n for (const listener of this.highlightListeners) listener(frame);\n }\n\n private syncActivity(): void {\n const hasConsumers = this.bindings.size > 0 || this.highlightListeners.size > 0;\n const shouldAnimate =\n hasConsumers &&\n this.active &&\n this.settings.enabled &&\n this.settings.dynamicStrength !== 0 &&\n !this.paused &&\n !this.suspended &&\n !this.reducedMotion;\n if (shouldAnimate && !this.releaseActivity) {\n this.releaseActivity = this.activity.acquire('media-breath');\n } else if (!shouldAnimate && this.releaseActivity) {\n this.releaseActivity();\n this.releaseActivity = null;\n }\n }\n\n private tick = (ticker: Ticker): void => {\n if (\n this.paused ||\n !this.active ||\n this.suspended ||\n this.reducedMotion ||\n !this.settings.enabled ||\n this.settings.dynamicStrength === 0\n )\n return;\n this.elapsedSeconds += ticker.deltaMS / 1000;\n for (const binding of this.bindings) {\n const uniforms = binding.uniforms.uniforms;\n uniforms.uBreath = this.resolveCategoryBreath(binding.category);\n }\n this.publishHighlightFrame();\n this.requestRender();\n };\n}\n", "import { assertUniformFields } from './uniforms.js';\nimport type { Container, Mesh, MeshGeometry, Shader, UniformGroup } from 'pixi.js';\n\nexport interface PixiObjectiveBreathingGlowConstructors {\n Mesh?: typeof import('pixi.js').Mesh;\n MeshGeometry?: typeof import('pixi.js').MeshGeometry;\n Shader?: typeof import('pixi.js').Shader;\n UniformGroup?: typeof import('pixi.js').UniformGroup;\n}\n\nexport interface ObjectiveBreathingGlowLayout {\n readonly width: number;\n readonly height: number;\n readonly cornerRadius: number;\n readonly padding: number;\n readonly coreWidth: number;\n readonly softness: number;\n readonly maxAlpha: number;\n readonly maxScale: number;\n readonly color: string;\n}\n\ninterface ObjectiveGlowUniformValues {\n uSurfaceSize: Float32Array;\n uCardHalfSize: Float32Array;\n uCornerRadius: number;\n uCoreWidth: number;\n uSoftness: number;\n uOpacity: number;\n uGlowColor: Float32Array;\n}\n\nconst VERTEX = `\nprecision highp float;\nattribute vec2 aPosition;\nattribute vec2 aUV;\nuniform mat3 uProjectionMatrix;\nuniform mat3 uWorldTransformMatrix;\nuniform mat3 uTransformMatrix;\nuniform vec4 uWorldColorAlpha;\nuniform vec4 uColor;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\n\nvoid main(void) {\n vUV = aUV;\n vWorldAlpha = uWorldColorAlpha.a * uColor.a;\n vec3 position = uProjectionMatrix * uWorldTransformMatrix * uTransformMatrix * vec3(aPosition, 1.0);\n gl_Position = vec4(position.xy, 0.0, 1.0);\n}\n`;\n\nconst FRAGMENT = `\nprecision highp float;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\nuniform vec2 uSurfaceSize;\nuniform vec2 uCardHalfSize;\nuniform float uCornerRadius;\nuniform float uCoreWidth;\nuniform float uSoftness;\nuniform float uOpacity;\nuniform vec3 uGlowColor;\n\nfloat sdRoundBox(vec2 point, vec2 halfSize, float radius) {\n vec2 corner = abs(point) - halfSize + radius;\n return length(max(corner, 0.0)) + min(max(corner.x, corner.y), 0.0) - radius;\n}\n\nfloat dither(vec2 point) {\n return fract(52.9829189 * fract(dot(point, vec2(0.06711056, 0.00583715))));\n}\n\nvoid main(void) {\n vec2 point = (vUV - 0.5) * uSurfaceSize;\n float distanceToEdge = sdRoundBox(point, uCardHalfSize, uCornerRadius);\n float outsideDistance = max(0.0, distanceToEdge);\n float softness = max(0.5, uSoftness);\n float coreWidth = max(0.5, uCoreWidth);\n float cloud = exp(-1.55 * pow(outsideDistance / softness, 1.28));\n float core = exp(-0.72 * pow(outsideDistance / coreWidth, 1.18));\n float interiorFade = smoothstep(-max(1.5, coreWidth * 1.8), 0.75, distanceToEdge);\n float glow = mix(cloud, max(cloud, core), 0.28) * interiorFade;\n float alpha = glow * uOpacity * vWorldAlpha;\n alpha = clamp(alpha + (dither(gl_FragCoord.xy) - 0.5) / 255.0, 0.0, 1.0);\n gl_FragColor = vec4(uGlowColor * alpha, alpha);\n}\n`;\n\nconst parseColor = (value: string): Float32Array => {\n const normalized = value.trim().replace('#', '');\n const expanded =\n normalized.length === 3\n ? normalized\n .split('')\n .map((channel) => `${channel}${channel}`)\n .join('')\n : normalized;\n const parsed = Number.parseInt(expanded, 16);\n if (!Number.isFinite(parsed)) return new Float32Array([1, 1, 1]);\n return new Float32Array([\n ((parsed >> 16) & 0xff) / 255,\n ((parsed >> 8) & 0xff) / 255,\n (parsed & 0xff) / 255,\n ]);\n};\n\n/** One retained local shader surface for a map-objective cloud glow. */\nexport class PixiObjectiveBreathingGlow {\n private mesh: Mesh<MeshGeometry, Shader> | null = null;\n private geometry: MeshGeometry | null = null;\n private shader: Shader | null = null;\n private uniforms: UniformGroup | null = null;\n private surfaceHalfWidth = 1;\n private surfaceHalfHeight = 1;\n private maxAlpha = 1;\n private maxScale = 1;\n private highlightMultiplier = 1;\n\n constructor(private readonly constructors: PixiObjectiveBreathingGlowConstructors) {}\n\n configure(parent: Container, layout: ObjectiveBreathingGlowLayout): void {\n const mesh = this.ensure();\n const values = this.getUniformValues();\n if (!mesh || !values) return;\n const padding = Math.max(0, layout.padding);\n const softness = Math.max(0.5, layout.softness);\n const coreWidth = Math.max(0.5, layout.coreWidth);\n const extent = padding + softness * 3.2 + coreWidth * 1.5;\n const cardHalfWidth = Math.max(0.5, layout.width / 2 + padding);\n const cardHalfHeight = Math.max(0.5, layout.height / 2 + padding);\n this.surfaceHalfWidth = cardHalfWidth + extent;\n this.surfaceHalfHeight = cardHalfHeight + extent;\n this.maxAlpha = Math.max(0, layout.maxAlpha);\n this.maxScale = Math.max(1, layout.maxScale);\n values.uSurfaceSize.set([this.surfaceHalfWidth * 2, this.surfaceHalfHeight * 2]);\n values.uCardHalfSize.set([cardHalfWidth, cardHalfHeight]);\n values.uCornerRadius = Math.max(0.5, layout.cornerRadius + padding);\n values.uCoreWidth = coreWidth;\n values.uSoftness = softness;\n values.uGlowColor.set(parseColor(layout.color));\n mesh.position.set(layout.width / 2, layout.height / 2);\n if (mesh.parent !== parent) parent.addChildAt(mesh, 0);\n }\n\n setFrame(breath: number, staticPresentation = false): void {\n const mesh = this.mesh;\n const values = this.getUniformValues();\n if (!mesh || !values) return;\n const normalized = Math.max(0, Math.min(1, breath));\n const intensity = staticPresentation ? 0.72 : normalized;\n const scale = staticPresentation ? 1 : 1 + (this.maxScale - 1) * normalized;\n values.uOpacity = this.maxAlpha * intensity * this.highlightMultiplier;\n mesh.scale.set(this.surfaceHalfWidth * scale, this.surfaceHalfHeight * scale);\n mesh.visible = values.uOpacity > 0;\n }\n\n setHighlightMultiplier(multiplier: number): void {\n this.highlightMultiplier = Math.max(0, multiplier);\n }\n\n hide(): void {\n if (this.mesh) this.mesh.visible = false;\n }\n\n destroy(): void {\n this.mesh?.parent?.removeChild(this.mesh);\n this.mesh?.destroy();\n this.shader?.destroy();\n this.geometry?.destroy();\n this.mesh = null;\n this.shader = null;\n this.geometry = null;\n this.uniforms = null;\n }\n\n private ensure(): Mesh<MeshGeometry, Shader> | null {\n if (this.mesh) return this.mesh;\n const { Mesh, MeshGeometry, Shader, UniformGroup } = this.constructors;\n if (!Mesh || !MeshGeometry || !Shader || !UniformGroup) return null;\n const uniforms = new UniformGroup({\n uSurfaceSize: { value: new Float32Array([2, 2]), type: 'vec2<f32>' },\n uCardHalfSize: { value: new Float32Array([1, 1]), type: 'vec2<f32>' },\n uCornerRadius: { value: 5, type: 'f32' },\n uCoreWidth: { value: 2, type: 'f32' },\n uSoftness: { value: 14, type: 'f32' },\n uOpacity: { value: 0, type: 'f32' },\n uGlowColor: { value: new Float32Array([0.84, 0.71, 0.43]), type: 'vec3<f32>' },\n });\n const shader = Shader.from({\n gl: { vertex: VERTEX, fragment: FRAGMENT },\n resources: { objectiveGlowUniforms: uniforms },\n });\n const geometry = new MeshGeometry({\n positions: new Float32Array([-1, -1, 1, -1, 1, 1, -1, 1]),\n uvs: new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),\n indices: new Uint32Array([0, 1, 2, 0, 2, 3]),\n topology: 'triangle-list',\n });\n const mesh = new Mesh({ geometry, shader, label: 'battle-objective-breathing-glow' });\n mesh.eventMode = 'none';\n mesh.visible = false;\n this.mesh = mesh;\n this.geometry = geometry;\n this.shader = shader;\n this.uniforms = uniforms;\n return mesh;\n }\n\n private getUniformValues(): ObjectiveGlowUniformValues | null {\n return readObjectiveGlowUniformValues(this.uniforms?.uniforms);\n }\n}\n\nconst readObjectiveGlowUniformValues = (value: unknown): ObjectiveGlowUniformValues | null => {\n if (value === undefined || value === null) return null;\n assertUniformFields(\n value,\n ['uCornerRadius', 'uCoreWidth', 'uSoftness', 'uOpacity'],\n ['uSurfaceSize', 'uCardHalfSize', 'uGlowColor'],\n );\n return value;\n};\n", "import type { PixiAnimationDirector } from './PixiAnimationDirector.js';\nimport type { SessionTuningResolver } from './tuning/SessionTuningResolver.js';\nimport type { SessionTuningPath } from './tuning/SessionTuningTypes.js';\n\ninterface AlphaTarget {\n alpha: number;\n}\n\ninterface ActiveTransition {\n readonly controller: AbortController;\n readonly target: AlphaTarget;\n readonly endAlpha: number;\n completedByReducedMotion: boolean;\n}\n\ninterface PixiPersistentEffectTransitionOptions {\n readonly director: PixiAnimationDirector;\n readonly getTuning: () => SessionTuningResolver | undefined;\n readonly requestRender?: () => void;\n}\n\nconst DEFAULT_FADE_IN_SECONDS = 0.5;\nconst DEFAULT_FADE_OUT_SECONDS = 0.5;\nconst REDUCED_MOTION_SECONDS = 0.01;\nconst MIN_ALPHA_DISTANCE = 0.000_001;\n\n/** Shared alpha envelope for retained Field and Global persistent effects. */\nexport class PixiPersistentEffectTransition {\n private active: ActiveTransition | null = null;\n\n constructor(private readonly options: PixiPersistentEffectTransitionOptions) {}\n\n fadeIn(target: AlphaTarget, targetAlpha: number, signal: AbortSignal): Promise<boolean> {\n return this.transition(\n target,\n targetAlpha,\n targetAlpha,\n 'motion.persistentEffects.fadeInDuration',\n DEFAULT_FADE_IN_SECONDS,\n signal,\n );\n }\n\n fadeOut(target: AlphaTarget, targetAlpha: number, signal: AbortSignal): Promise<boolean> {\n return this.transition(\n target,\n 0,\n targetAlpha,\n 'motion.persistentEffects.fadeOutDuration',\n DEFAULT_FADE_OUT_SECONDS,\n signal,\n );\n }\n\n setReducedMotion(reducedMotion: boolean): void {\n if (!reducedMotion || !this.active) return;\n this.active.completedByReducedMotion = true;\n this.active.target.alpha = this.active.endAlpha;\n this.options.requestRender?.();\n this.active.controller.abort('persistent-effect-reduced-motion');\n }\n\n cancel(reason: string): void {\n this.active?.controller.abort(reason);\n }\n\n private async transition(\n target: AlphaTarget,\n endAlpha: number,\n fullAlpha: number,\n durationPath: SessionTuningPath,\n fallbackDuration: number,\n externalSignal: AbortSignal,\n ): Promise<boolean> {\n if (externalSignal.aborted) return false;\n this.cancel('persistent-effect-transition-replaced');\n\n const distance = Math.abs(endAlpha - target.alpha);\n const fullDistance = Math.max(MIN_ALPHA_DISTANCE, Math.abs(fullAlpha));\n const duration =\n this.resolveDuration(durationPath, fallbackDuration) * Math.min(1, distance / fullDistance);\n if (distance <= MIN_ALPHA_DISTANCE || duration <= 0) {\n target.alpha = endAlpha;\n this.options.requestRender?.();\n return true;\n }\n\n const controller = new AbortController();\n const active: ActiveTransition = {\n controller,\n target,\n endAlpha,\n completedByReducedMotion: false,\n };\n this.active = active;\n const abortFromExternal = () => controller.abort(externalSignal.reason);\n externalSignal.addEventListener('abort', abortFromExternal, { once: true });\n try {\n await this.options.director.tween(\n target,\n {\n alpha: endAlpha,\n duration,\n ease: 'none',\n reducedMotionDuration: REDUCED_MOTION_SECONDS,\n },\n controller.signal,\n );\n const completed = !controller.signal.aborted || active.completedByReducedMotion;\n if (completed) {\n target.alpha = endAlpha;\n this.options.requestRender?.();\n }\n return completed;\n } finally {\n externalSignal.removeEventListener('abort', abortFromExternal);\n if (this.active === active) this.active = null;\n }\n }\n\n private resolveDuration(path: SessionTuningPath, fallback: number): number {\n const value = this.options.getTuning()?.get(path);\n return typeof value === 'number' && Number.isFinite(value) ? Math.max(0, value) : fallback;\n }\n}\n", "/** Stable pseudo-random values for previews and semantic event effects. */\nconst hash = (seed: string): number => {\n let value = 2166136261;\n for (let index = 0; index < seed.length; index += 1) {\n value ^= seed.charCodeAt(index);\n value = Math.imul(value, 16777619);\n }\n return value >>> 0;\n};\n\nexport const stableUnit = (seed: string, channel = 0): number => {\n let value = hash(`${seed}:${channel}`) || 1;\n value ^= value << 13;\n value ^= value >>> 17;\n value ^= value << 5;\n return (value >>> 0) / 0x100000000;\n};\n\nexport const stableRange = (seed: string, min: number, max: number, channel = 0): number =>\n min + (max - min) * stableUnit(seed, channel);\n", "import type { PixiLayoutRect } from './PixiSessionLayout.js';\nexport interface TokenAvatarCrop {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport const resolveContainRect = (\n source: { width: number; height: number },\n viewport: PixiLayoutRect,\n): PixiLayoutRect => {\n const ratio = Math.min(\n viewport.width / Math.max(1, source.width),\n viewport.height / Math.max(1, source.height),\n );\n const width = source.width * ratio;\n const height = source.height * ratio;\n return {\n x: viewport.x + (viewport.width - width) / 2,\n y: viewport.y + (viewport.height - height) / 2,\n width,\n height,\n };\n};\n\nexport const resolveCoverRect = (\n source: { width: number; height: number },\n viewport: PixiLayoutRect,\n): PixiLayoutRect => {\n const ratio = Math.max(\n viewport.width / Math.max(1, source.width),\n viewport.height / Math.max(1, source.height),\n );\n const width = source.width * ratio;\n const height = source.height * ratio;\n return {\n x: viewport.x + (viewport.width - width) / 2,\n y: viewport.y + (viewport.height - height) / 2,\n width,\n height,\n };\n};\n\n/** Covers a viewport while retaining the upper edge of the source image. */\nexport const resolveTopCoverRect = (\n source: { width: number; height: number },\n viewport: PixiLayoutRect,\n): PixiLayoutRect => {\n const rect = resolveCoverRect(source, viewport);\n return { ...rect, y: viewport.y };\n};\n\nexport const resolveCroppedCoverRect = (\n source: { width: number; height: number },\n viewport: PixiLayoutRect,\n crop?: TokenAvatarCrop,\n): PixiLayoutRect => {\n if (!crop) return resolveCoverRect(source, viewport);\n const cropX = Math.max(0, Math.min(1, crop.x));\n const cropY = Math.max(0, Math.min(1, crop.y));\n const cropWidth = Math.max(0.01, Math.min(1 - cropX, crop.width));\n const cropHeight = Math.max(0.01, Math.min(1 - cropY, crop.height));\n const ratio = Math.max(\n viewport.width / Math.max(1, source.width * cropWidth),\n viewport.height / Math.max(1, source.height * cropHeight),\n );\n const width = source.width * ratio;\n const height = source.height * ratio;\n return {\n x:\n viewport.x +\n (viewport.width - source.width * cropWidth * ratio) / 2 -\n source.width * cropX * ratio,\n y:\n viewport.y +\n (viewport.height - source.height * cropHeight * ratio) / 2 -\n source.height * cropY * ratio,\n width,\n height,\n };\n};\n", "import { stableRange } from './effects/PixiStableRandom.js';\nimport { resolveContainRect } from './PixiMapWorldUtils.js';\nimport type { PixiLayoutRect } from './PixiSessionLayout.js';\n\nexport interface PreludeStoryTransitionTiming {\n readonly backgroundDarkenDuration: number;\n readonly moduleTravelDelay: number;\n readonly moduleTravelDuration: number;\n readonly storyBaseRevealDuration: number;\n readonly finalHandoffDuration: number;\n readonly partyHudEnterDuration: number;\n readonly partyHudMaxStagger: number;\n readonly moduleTravelEase: string;\n readonly hudEnterEase: string;\n}\n\nexport const DEFAULT_PRELUDE_STORY_TRANSITION_TIMING: PreludeStoryTransitionTiming = {\n backgroundDarkenDuration: 0.74,\n moduleTravelDelay: 0.34,\n moduleTravelDuration: 4.16,\n storyBaseRevealDuration: 0.5,\n finalHandoffDuration: 0.5,\n partyHudEnterDuration: 0.38,\n partyHudMaxStagger: 0.12,\n moduleTravelEase: 'sine.inOut',\n hudEnterEase: 'back.out(1.7)',\n};\n\nexport const resolvePreludeStoryTimeline = (timing: PreludeStoryTransitionTiming) => ({\n storyBaseRevealAt: timing.moduleTravelDelay + timing.moduleTravelDuration,\n storyCommitAt: timing.moduleTravelDelay + timing.moduleTravelDuration,\n completeAt: timing.moduleTravelDelay + timing.moduleTravelDuration + timing.finalHandoffDuration,\n});\n\nexport const resolvePreludeStoryModuleTarget = (\n aperture: { readonly width: number; readonly height: number },\n textureSize: { readonly width: number; readonly height: number } | null,\n media: PixiLayoutRect,\n) => {\n const rect = textureSize ? resolveContainRect(textureSize, media) : media;\n return {\n rect,\n x: rect.x + rect.width / 2,\n y: rect.y + rect.height / 2,\n scaleX: rect.width / Math.max(1, aperture.width),\n scaleY: rect.height / Math.max(1, aperture.height),\n };\n};\n\nexport const resolvePreludeStoryPortraitOrder = <T extends { readonly id: string }>(\n entries: readonly T[],\n): T[] => {\n const center = (entries.length - 1) / 2;\n return entries\n .map((entry, index) => ({ entry, index }))\n .sort((left, right) => {\n const distance = Math.abs(left.index - center) - Math.abs(right.index - center);\n return distance || left.index - right.index;\n })\n .map(({ entry }) => entry);\n};\n\nexport const resolvePreludeStoryPartyHudDelay = (id: string, maxDelay: number): number =>\n stableRange(`${id}:prelude-story-party-hud-delay`, 0, Math.max(0, maxDelay));\n", "import type { PixiAnimationDirector } from './PixiAnimationDirector.js';\n\nexport interface PixiRetainedMeterView {\n setRatio(ratio: number): void;\n setFlashAlpha(alpha: number): void;\n}\n\nexport interface PixiRetainedMeterSnapshot {\n readonly displayedRatio: number;\n readonly targetRatio: number;\n readonly initialized: boolean;\n}\n\nexport interface PixiRetainedMeterAnimationOptions {\n readonly flashDuration: number;\n readonly transitionDuration: number;\n}\n\nconst DEFAULT_ANIMATION_OPTIONS: PixiRetainedMeterAnimationOptions = {\n flashDuration: 0.12,\n transitionDuration: 0.36,\n};\n\nconst clampRatio = (ratio: number): number => Math.max(0, Math.min(1, ratio));\n\n/**\n * Animates a retained meter from its currently rendered value. Snapshot syncs\n * may replace the target while a tween is active without snapping back to the\n * prior authoritative value.\n */\nexport class PixiRetainedMeterAnimator {\n private displayedRatio = 0;\n private targetRatio = 0;\n private initialized = false;\n private reducedMotion = false;\n private controller: AbortController | null = null;\n private options: PixiRetainedMeterAnimationOptions;\n\n constructor(\n private readonly animation: PixiAnimationDirector,\n private readonly view: PixiRetainedMeterView,\n private readonly requestRender: () => void,\n options: Partial<PixiRetainedMeterAnimationOptions> = {},\n ) {\n this.options = this.normalizeOptions(options);\n }\n\n updateOptions(options: Partial<PixiRetainedMeterAnimationOptions>): void {\n this.options = this.normalizeOptions(options);\n }\n\n sync(ratio: number, options: { immediate?: boolean } = {}): void {\n const targetRatio = clampRatio(ratio);\n const targetChanged = Math.abs(targetRatio - this.targetRatio) >= 0.0001;\n this.targetRatio = targetRatio;\n if (!this.initialized || options.immediate || this.reducedMotion) {\n this.controller?.abort();\n this.controller = null;\n this.initialized = true;\n this.applyRatio(targetRatio);\n this.applyFlash(0);\n return;\n }\n if (!targetChanged && this.controller) return;\n if (Math.abs(targetRatio - this.displayedRatio) < 0.0001) return;\n this.controller?.abort();\n const controller = new AbortController();\n this.controller = controller;\n void this.play(targetRatio, controller);\n }\n\n setReducedMotion(reducedMotion: boolean): void {\n this.reducedMotion = reducedMotion;\n if (!reducedMotion) return;\n this.controller?.abort();\n this.controller = null;\n if (this.initialized) this.applyRatio(this.targetRatio);\n this.applyFlash(0);\n }\n\n settle(ratio = this.targetRatio): void {\n this.controller?.abort();\n this.controller = null;\n this.targetRatio = clampRatio(ratio);\n this.initialized = true;\n this.applyRatio(this.targetRatio);\n this.applyFlash(0);\n }\n\n reset(): void {\n this.controller?.abort();\n this.controller = null;\n this.displayedRatio = 0;\n this.targetRatio = 0;\n this.initialized = false;\n this.view.setRatio(0);\n this.view.setFlashAlpha(0);\n this.requestRender();\n }\n\n destroy(): void {\n this.controller?.abort();\n this.controller = null;\n }\n\n getSnapshot(): PixiRetainedMeterSnapshot {\n return {\n displayedRatio: this.displayedRatio,\n targetRatio: this.targetRatio,\n initialized: this.initialized,\n };\n }\n\n private async play(targetRatio: number, controller: AbortController): Promise<void> {\n const flash = { alpha: 0 };\n await this.animation.tween(\n flash,\n {\n alpha: 1,\n duration: this.options.flashDuration / 2,\n repeat: 1,\n yoyo: true,\n ease: 'power1.inOut',\n onUpdate: () => this.applyFlash(flash.alpha),\n },\n controller.signal,\n );\n if (controller.signal.aborted) return;\n this.applyFlash(0);\n const progress = { ratio: this.displayedRatio };\n await this.animation.tween(\n progress,\n {\n ratio: targetRatio,\n duration: this.options.transitionDuration,\n ease: 'power2.out',\n onUpdate: () => this.applyRatio(progress.ratio),\n },\n controller.signal,\n );\n if (controller.signal.aborted) return;\n this.applyRatio(targetRatio);\n if (this.controller === controller) this.controller = null;\n }\n\n private applyRatio(ratio: number): void {\n this.displayedRatio = clampRatio(ratio);\n this.view.setRatio(this.displayedRatio);\n this.requestRender();\n }\n\n private applyFlash(alpha: number): void {\n this.view.setFlashAlpha(Math.max(0, Math.min(1, alpha)));\n this.requestRender();\n }\n\n private normalizeOptions(\n options: Partial<PixiRetainedMeterAnimationOptions>,\n ): PixiRetainedMeterAnimationOptions {\n const finiteNonNegative = (value: number | undefined, fallback: number): number =>\n typeof value === 'number' && Number.isFinite(value) ? Math.max(0, value) : fallback;\n return {\n flashDuration: finiteNonNegative(\n options.flashDuration,\n DEFAULT_ANIMATION_OPTIONS.flashDuration,\n ),\n transitionDuration: finiteNonNegative(\n options.transitionDuration,\n DEFAULT_ANIMATION_OPTIONS.transitionDuration,\n ),\n };\n }\n}\n", "import type { Application, Assets } from 'pixi.js';\nimport type { PixiAnimationActivity } from './PixiAnimationActivity.js';\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\nimport type { PixiAssetManager } from './PixiAssetManager.js';\nimport type { PixiSceneGraph } from './PixiSceneGraph.js';\nimport type { PixiViewportController } from './PixiViewportController.js';\nimport type { StageRenderQuality } from './PixiApplicationFactory.js';\n\nexport type PixiRuntimeApi = typeof import('pixi.js');\n\nexport interface PixiRuntimeContext {\n readonly app: Application;\n readonly pixi: PixiRuntimeApi;\n readonly assetsApi: typeof Assets;\n readonly scene: PixiSceneGraph;\n readonly activity: PixiAnimationActivity;\n readonly assets: PixiAssetManager;\n readonly animation: PixiAnimationDirector;\n readonly viewport: PixiViewportController;\n readonly quality: StageRenderQuality;\n requestRender(): void;\n}\n\nexport const createPixiRuntimeContext = (context: PixiRuntimeContext): PixiRuntimeContext =>\n context;\n", "import type { Container } from 'pixi.js';\n\nexport type PixiContainerConstructor = new () => Container;\n\nexport interface PixiSceneGraph {\n readonly root: Container;\n readonly backgroundLayer: Container;\n /** Battle-world shake transform. The semantic camera remains its child. */\n readonly worldShakeLayer: Container;\n /** Additive hit reaction between field shake and semantic camera transforms. */\n readonly cameraImpactLayer: Container;\n readonly cameraContainer: Container;\n readonly viewportMaskLayer: Container;\n readonly mapLayer: Container;\n readonly gridLayer: Container;\n readonly worldUnderlayFxLayer: Container;\n readonly tokenLayer: Container;\n readonly tokenStatusLayer: Container;\n readonly worldOverlayFxLayer: Container;\n readonly fieldFxLayer: Container;\n readonly cinematicLayer: Container;\n /** Top-level transient battle illustration surface. */\n readonly battlePictureFxLayer: Container;\n /** Top-level combo photo surface, above battle illustrations. */\n readonly comboFxLayer: Container;\n readonly globalFxLayer: Container;\n /** Fixed-stage surfaces that are not part of the battle camera. */\n readonly presentationLayer: Container;\n readonly screenFxLayer: Container;\n readonly sceneHudLayer: Container;\n /** @deprecated Migration-only alias. New scene UI must use sceneHudLayer. */\n readonly modalLayer: Container;\n readonly systemHudLayer: Container;\n /** Unmasked Story illustration entrance, above UI and below active Global FX. */\n readonly storyEntranceLayer: Container;\n readonly debugLayer: Container;\n}\n\nexport interface PixiSessionEffectLayerPlacement {\n readonly fieldAboveUi: boolean;\n readonly globalAboveUi: boolean;\n}\n\nexport const DEFAULT_PIXI_SESSION_EFFECT_LAYER_PLACEMENT: PixiSessionEffectLayerPlacement = {\n fieldAboveUi: true,\n globalAboveUi: true,\n};\n\nexport const placePixiSessionEffectLayers = (\n scene: PixiSceneGraph,\n profile: 'story' | 'battle',\n placement: PixiSessionEffectLayerPlacement = DEFAULT_PIXI_SESSION_EFFECT_LAYER_PLACEMENT,\n storyEntranceActive = false,\n): void => {\n const {\n root,\n battlePictureFxLayer,\n comboFxLayer,\n fieldFxLayer,\n globalFxLayer,\n sceneHudLayer,\n modalLayer,\n systemHudLayer,\n storyEntranceLayer,\n debugLayer,\n } = scene;\n if (profile === 'story' && storyEntranceActive) {\n root.addChild(\n battlePictureFxLayer,\n comboFxLayer,\n fieldFxLayer,\n sceneHudLayer,\n modalLayer,\n systemHudLayer,\n debugLayer,\n storyEntranceLayer,\n globalFxLayer,\n );\n return;\n }\n const belowUiLayers = [\n ...(placement.fieldAboveUi ? [] : [fieldFxLayer]),\n ...(placement.globalAboveUi ? [] : [globalFxLayer]),\n ];\n const aboveUiLayers = [\n ...(placement.fieldAboveUi ? [fieldFxLayer] : []),\n ...(placement.globalAboveUi ? [globalFxLayer] : []),\n ];\n if (profile === 'story') {\n root.addChild(\n battlePictureFxLayer,\n comboFxLayer,\n ...belowUiLayers,\n sceneHudLayer,\n modalLayer,\n systemHudLayer,\n storyEntranceLayer,\n debugLayer,\n ...aboveUiLayers,\n );\n return;\n }\n root.addChild(\n ...belowUiLayers,\n sceneHudLayer,\n modalLayer,\n systemHudLayer,\n storyEntranceLayer,\n debugLayer,\n battlePictureFxLayer,\n comboFxLayer,\n ...aboveUiLayers,\n );\n};\n\nexport const createPixiSceneGraph = (\n ContainerConstructor: PixiContainerConstructor,\n): PixiSceneGraph => {\n const root = new ContainerConstructor();\n const backgroundLayer = new ContainerConstructor();\n const worldShakeLayer = new ContainerConstructor();\n const cameraImpactLayer = new ContainerConstructor();\n const cameraContainer = new ContainerConstructor();\n const viewportMaskLayer = new ContainerConstructor();\n const mapLayer = new ContainerConstructor();\n const gridLayer = new ContainerConstructor();\n const worldUnderlayFxLayer = new ContainerConstructor();\n const tokenLayer = new ContainerConstructor();\n const tokenStatusLayer = new ContainerConstructor();\n const worldOverlayFxLayer = new ContainerConstructor();\n const fieldFxLayer = new ContainerConstructor();\n const cinematicLayer = new ContainerConstructor();\n const battlePictureFxLayer = new ContainerConstructor();\n const comboFxLayer = new ContainerConstructor();\n const globalFxLayer = new ContainerConstructor();\n const presentationLayer = new ContainerConstructor();\n const screenFxLayer = new ContainerConstructor();\n const sceneHudLayer = new ContainerConstructor();\n const modalLayer = new ContainerConstructor();\n const systemHudLayer = new ContainerConstructor();\n const storyEntranceLayer = new ContainerConstructor();\n const debugLayer = new ContainerConstructor();\n\n cameraContainer.addChild(\n mapLayer,\n gridLayer,\n worldUnderlayFxLayer,\n tokenLayer,\n tokenStatusLayer,\n worldOverlayFxLayer,\n );\n cameraImpactLayer.addChild(cameraContainer);\n worldShakeLayer.addChild(cameraImpactLayer);\n root.addChild(\n backgroundLayer,\n worldShakeLayer,\n viewportMaskLayer,\n cinematicLayer,\n presentationLayer,\n screenFxLayer,\n sceneHudLayer,\n modalLayer,\n systemHudLayer,\n storyEntranceLayer,\n debugLayer,\n battlePictureFxLayer,\n comboFxLayer,\n fieldFxLayer,\n globalFxLayer,\n );\n\n return {\n root,\n backgroundLayer,\n worldShakeLayer,\n cameraImpactLayer,\n cameraContainer,\n viewportMaskLayer,\n mapLayer,\n gridLayer,\n worldUnderlayFxLayer,\n tokenLayer,\n tokenStatusLayer,\n worldOverlayFxLayer,\n fieldFxLayer,\n cinematicLayer,\n battlePictureFxLayer,\n comboFxLayer,\n globalFxLayer,\n presentationLayer,\n screenFxLayer,\n sceneHudLayer,\n modalLayer,\n systemHudLayer,\n storyEntranceLayer,\n debugLayer,\n };\n};\n", "import {\n createPixiDirectionalMotionBlur,\n type PixiDirectionalMotionBlur,\n} from './PixiDirectionalMotionBlur.js';\n\nexport interface StoryArchiveMotionPose {\n x: number;\n y: number;\n scaleX: number;\n scaleY: number;\n rotation: number;\n}\n\nexport interface StoryArchiveMotionFrame extends StoryArchiveMotionPose {\n shadeAlpha: number;\n blurX: number;\n blurY: number;\n}\n\nexport type PixiStoryArchiveMotionFilter = PixiDirectionalMotionBlur;\n\nconst ROTATION_SETTLE_START_TIME = 0.82;\n\nconst clamp01 = (value: number): number => Math.max(0, Math.min(1, value));\nconst lerp = (from: number, to: number, progress: number): number => from + (to - from) * progress;\n\nexport const writeStoryArchiveMotionFrame = (\n start: StoryArchiveMotionPose,\n end: StoryArchiveMotionPose,\n linearProgress: number,\n maxBlurStrength: number,\n output: StoryArchiveMotionFrame,\n): void => {\n const time = clamp01(linearProgress);\n const remaining = 1 - time;\n const travelProgress = 1 - remaining * remaining * remaining;\n const rotationLinearProgress = clamp01(\n (time - ROTATION_SETTLE_START_TIME) / (1 - ROTATION_SETTLE_START_TIME),\n );\n const rotationProgress = 1 - (1 - rotationLinearProgress) ** 2;\n\n output.x = lerp(start.x, end.x, travelProgress);\n output.y = lerp(start.y, end.y, travelProgress);\n output.scaleX = lerp(start.scaleX, end.scaleX, travelProgress);\n output.scaleY = lerp(start.scaleY, end.scaleY, travelProgress);\n output.rotation = lerp(start.rotation, end.rotation, rotationProgress);\n output.shadeAlpha = 1 - time * time;\n\n const travelX = end.x - start.x;\n const travelY = end.y - start.y;\n const distance = Math.hypot(travelX, travelY);\n const blurStrength = Math.max(0, maxBlurStrength) * remaining * remaining;\n if (time >= 1) {\n output.x = end.x;\n output.y = end.y;\n output.scaleX = end.scaleX;\n output.scaleY = end.scaleY;\n output.rotation = end.rotation;\n }\n if (distance <= Number.EPSILON || blurStrength <= Number.EPSILON) {\n output.blurX = 0;\n output.blurY = 0;\n return;\n }\n output.blurX = (travelX / distance) * blurStrength;\n output.blurY = (travelY / distance) * blurStrength;\n};\n\nexport const createPixiStoryArchiveMotionFilter = createPixiDirectionalMotionBlur;\n", "import { resolveContainRect } from './PixiMapWorldUtils.js';\nimport type { PixiLayoutRect } from './PixiSessionLayout.js';\n\nexport interface TeamCheckLampLayout {\n x: number;\n y: number;\n size: number;\n}\n\nexport interface TeamCheckLampRowOptions {\n centerX: number;\n width: number;\n y: number;\n minSize: number;\n maxSize: number;\n maxGap: number;\n}\n\nconst TEAM_CHECK_FRAME_WIDTH = 960;\nconst TEAM_CHECK_FRAME_HEIGHT = (TEAM_CHECK_FRAME_WIDTH * 298) / 815;\n\nexport class PixiTeamCheckCinematic {\n static readonly panel = {\n x: (1920 - TEAM_CHECK_FRAME_WIDTH) / 2,\n y: (1080 - TEAM_CHECK_FRAME_HEIGHT) / 2,\n width: TEAM_CHECK_FRAME_WIDTH,\n height: TEAM_CHECK_FRAME_HEIGHT,\n radius: 5,\n } as const;\n static readonly enterMs = 460;\n static readonly lampMs = 280;\n static readonly successInMs = 140;\n static readonly successOutMs = 380;\n static readonly failureStepMs = 60;\n static readonly failureOutMs = 260;\n\n static resolveFrameRect(\n source: { width: number; height: number },\n panel: PixiLayoutRect = PixiTeamCheckCinematic.panel,\n ): PixiLayoutRect {\n return resolveContainRect(source, panel);\n }\n\n static resolveLampLayout(\n totalLights: number,\n options: TeamCheckLampRowOptions = {\n centerX: 960,\n width: 653,\n y: 584,\n minSize: 42,\n maxSize: 68,\n maxGap: 26,\n },\n ): TeamCheckLampLayout[] {\n const total = Math.max(1, Math.floor(totalLights));\n const size = Math.max(\n options.minSize,\n Math.min(options.maxSize, (options.width - Math.max(0, total - 1) * 14) / total),\n );\n const gap =\n total > 1 ? Math.min(options.maxGap, (options.width - size * total) / (total - 1)) : 0;\n const width = size * total + gap * Math.max(0, total - 1);\n return Array.from({ length: total }, (_, index) => ({\n x: options.centerX - width / 2 + size / 2 + index * (size + gap),\n y: options.y,\n size,\n }));\n }\n}\n", "import type { Texture, Ticker } from 'pixi.js';\nimport type { RuntimeLogger } from '@bardway/trpg-media';\nimport type { PixiAnimationActivity } from './PixiAnimationActivity.js';\nimport type { PixiAssetManager, PixiAssetScope } from './PixiAssetManager.js';\n\nconst VIDEO_UPDATE_INTERVAL_MS = 1000 / 30;\n\ninterface ManagedVideoSource {\n autoUpdate: boolean;\n resource: HTMLVideoElement;\n update(): void;\n}\n\ninterface RuntimeBindingRecord {\n readonly alias: string;\n readonly source: ManagedVideoSource;\n readonly texture: Texture;\n readonly videoUrl: string;\n readonly onPlaybackFailure?: () => void;\n active: boolean;\n released: boolean;\n failed: boolean;\n playGeneration: number;\n playPromise: Promise<boolean> | null;\n finishPlayback?: (completed: boolean) => void;\n cleanup: () => void;\n}\n\nexport interface PixiVideoBinding {\n readonly texture: Texture;\n activate(restart?: boolean): Promise<boolean>;\n playOnce(): Promise<boolean>;\n deactivate(reset?: boolean): void;\n release(): void;\n}\n\nexport interface PixiVideoRuntimeDiagnostics {\n bindings: number;\n activeBindings: number;\n textureUpdates: number;\n}\n\nconst isManagedVideoSource = (value: unknown): value is ManagedVideoSource => {\n if (!value || typeof value !== 'object') return false;\n const candidate = value as Partial<ManagedVideoSource>;\n return candidate.resource instanceof HTMLVideoElement && typeof candidate.update === 'function';\n};\n\nexport class PixiVideoRuntime {\n private readonly bindings = new Set<RuntimeBindingRecord>();\n private releaseActivity: (() => void) | null = null;\n private elapsedSinceUpdateMs = 0;\n private textureUpdates = 0;\n private paused = false;\n private reducedMotion = false;\n private contextLost = false;\n private destroyed = false;\n private bindingSequence = 0;\n\n constructor(\n private readonly ticker: Ticker,\n private readonly activity: PixiAnimationActivity,\n private readonly assets: PixiAssetManager,\n private readonly requestRender: () => void,\n private readonly logger: RuntimeLogger,\n ) {\n ticker.add(this.update);\n }\n\n async loadBinding(input: {\n alias: string;\n videoUrl: string;\n scope: PixiAssetScope | string;\n signal?: AbortSignal;\n muted?: boolean;\n onPlaybackFailure?: () => void;\n }): Promise<PixiVideoBinding> {\n if (this.destroyed || input.signal?.aborted) throw new DOMException('Aborted', 'AbortError');\n const alias = `${input.alias}:binding:${++this.bindingSequence}`;\n let texture: Texture;\n let source: ManagedVideoSource;\n try {\n texture = await this.assets.loadVideoTexture(\n alias,\n input.videoUrl,\n input.scope,\n input.signal,\n );\n if (this.destroyed || input.signal?.aborted) throw new DOMException('Aborted', 'AbortError');\n const candidate = texture.source;\n if (!isManagedVideoSource(candidate)) {\n throw new Error('Pixi \u89C6\u9891\u7EB9\u7406\u7F3A\u5C11 HTMLVideoElement source');\n }\n source = candidate;\n } catch (error) {\n this.releaseVideoTexture(alias);\n throw error;\n }\n source.autoUpdate = false;\n const video = source.resource;\n video.muted = input.muted ?? true;\n video.loop = true;\n video.playsInline = true;\n const record: RuntimeBindingRecord = {\n alias,\n source,\n texture,\n videoUrl: input.videoUrl,\n onPlaybackFailure: input.onPlaybackFailure,\n active: false,\n released: false,\n failed: false,\n playGeneration: 0,\n playPromise: null,\n cleanup: () => undefined,\n };\n const onError = () => this.failPlayback(record, video.error);\n const onEnded = () => {\n if (!record.active || record.released || record.failed) return;\n source.update();\n this.requestRender();\n this.finishPlayback(record, true);\n this.deactivate(record, false);\n };\n const onAbort = () => this.release(record);\n video.addEventListener('error', onError);\n video.addEventListener('ended', onEnded);\n input.signal?.addEventListener('abort', onAbort, { once: true });\n record.cleanup = () => {\n video.removeEventListener('error', onError);\n video.removeEventListener('ended', onEnded);\n input.signal?.removeEventListener('abort', onAbort);\n };\n this.bindings.add(record);\n return {\n texture,\n activate: (restart = true) => this.activate(record, restart),\n playOnce: () => this.playOnce(record),\n deactivate: (reset = true) => this.deactivate(record, reset),\n release: () => this.release(record),\n };\n }\n\n setPaused(paused: boolean): void {\n if (this.paused === paused) return;\n this.paused = paused;\n if (paused) {\n for (const binding of this.bindings) this.interruptPlayback(binding);\n this.syncActivity();\n return;\n }\n this.resumeActiveBindings();\n }\n\n setReducedMotion(reducedMotion: boolean): void {\n if (this.reducedMotion === reducedMotion) return;\n this.reducedMotion = reducedMotion;\n for (const binding of this.bindings) {\n if (!binding.active || binding.released) continue;\n if (reducedMotion) {\n if (binding.finishPlayback) this.deactivate(binding, false);\n this.interruptPlayback(binding);\n this.seekToStart(binding);\n }\n }\n if (!reducedMotion) this.resumeActiveBindings();\n this.syncActivity();\n }\n\n handleContextLost(): void {\n this.contextLost = true;\n for (const binding of this.bindings) this.interruptPlayback(binding);\n this.syncActivity();\n }\n\n handleContextRestored(): void {\n this.contextLost = false;\n for (const binding of this.bindings) {\n if (binding.active && !binding.released && !binding.failed) binding.source.update();\n }\n this.requestRender();\n this.resumeActiveBindings();\n }\n\n reset(): void {\n for (const binding of [...this.bindings]) this.deactivate(binding, true);\n this.elapsedSinceUpdateMs = 0;\n this.syncActivity();\n }\n\n diagnostics(): PixiVideoRuntimeDiagnostics {\n return {\n bindings: this.bindings.size,\n activeBindings: [...this.bindings].filter((binding) => binding.active).length,\n textureUpdates: this.textureUpdates,\n };\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.ticker.remove(this.update);\n for (const binding of [...this.bindings]) this.release(binding);\n this.releaseActivity?.();\n this.releaseActivity = null;\n }\n\n private readonly update = (ticker: Ticker): void => {\n if (this.paused || this.reducedMotion || this.contextLost) return;\n this.elapsedSinceUpdateMs += ticker.elapsedMS;\n if (this.elapsedSinceUpdateMs < VIDEO_UPDATE_INTERVAL_MS) return;\n this.elapsedSinceUpdateMs %= VIDEO_UPDATE_INTERVAL_MS;\n let updated = false;\n for (const binding of this.bindings) {\n if (!binding.active || binding.released || binding.failed || binding.source.resource.paused) {\n continue;\n }\n binding.source.update();\n this.textureUpdates += 1;\n updated = true;\n }\n if (updated) this.requestRender();\n };\n\n private playOnce(binding: RuntimeBindingRecord): Promise<boolean> {\n if (this.destroyed || binding.released || binding.failed || this.reducedMotion) {\n return Promise.resolve(false);\n }\n this.finishPlayback(binding, false);\n binding.source.resource.loop = false;\n return new Promise((resolve) => {\n binding.finishPlayback = resolve;\n void this.activate(binding, true).then((playing) => {\n if (!playing && binding.finishPlayback === resolve) this.finishPlayback(binding, false);\n });\n });\n }\n\n private finishPlayback(binding: RuntimeBindingRecord, completed: boolean): void {\n const finish = binding.finishPlayback;\n binding.finishPlayback = undefined;\n finish?.(completed);\n }\n\n private activate(binding: RuntimeBindingRecord, restart: boolean): Promise<boolean> {\n if (this.destroyed || binding.released || binding.failed) return Promise.resolve(false);\n if (binding.playPromise && !restart) return binding.playPromise;\n if (\n !restart &&\n binding.active &&\n !binding.source.resource.paused &&\n !this.paused &&\n !this.reducedMotion &&\n !this.contextLost\n ) {\n return Promise.resolve(true);\n }\n binding.active = true;\n if (restart) this.seekToStart(binding);\n if (this.paused || this.reducedMotion || this.contextLost) {\n this.interruptPlayback(binding);\n binding.source.update();\n this.requestRender();\n this.syncActivity();\n return Promise.resolve(true);\n }\n const generation = ++binding.playGeneration;\n const playPromise: Promise<boolean> = this.play(binding, generation).finally(() => {\n if (binding.playPromise === playPromise) binding.playPromise = null;\n });\n binding.playPromise = playPromise;\n return playPromise;\n }\n\n private async play(binding: RuntimeBindingRecord, generation: number): Promise<boolean> {\n try {\n await binding.source.resource.play();\n if (generation !== binding.playGeneration) {\n if (!binding.active || this.paused || this.reducedMotion || this.contextLost) {\n binding.source.resource.pause();\n }\n return binding.playPromise ?? (binding.active && !binding.released && !binding.failed);\n }\n if (this.destroyed || binding.released || binding.failed || !binding.active) {\n binding.source.resource.pause();\n return false;\n }\n if (this.paused || this.reducedMotion || this.contextLost) binding.source.resource.pause();\n this.syncActivity();\n return true;\n } catch (error) {\n if (generation !== binding.playGeneration || !binding.active || binding.released) {\n return binding.playPromise ?? (binding.active && !binding.released && !binding.failed);\n }\n this.failPlayback(binding, error);\n return false;\n }\n }\n\n private deactivate(binding: RuntimeBindingRecord, reset: boolean): void {\n if (binding.released) return;\n binding.active = false;\n this.finishPlayback(binding, false);\n this.interruptPlayback(binding);\n if (reset) this.seekToStart(binding);\n this.syncActivity();\n }\n\n private release(binding: RuntimeBindingRecord): void {\n if (binding.released) return;\n this.deactivate(binding, true);\n binding.released = true;\n binding.cleanup();\n this.bindings.delete(binding);\n this.syncActivity();\n this.releaseVideoTexture(binding.alias);\n }\n\n private interruptPlayback(binding: RuntimeBindingRecord): void {\n binding.playGeneration += 1;\n binding.playPromise = null;\n binding.source.resource.pause();\n }\n\n private releaseVideoTexture(alias: string): void {\n void this.assets.releaseVideoTexture(alias).catch((error: unknown) => {\n this.logger.warn('[PixiVideoRuntime] WebM \u7EB9\u7406\u91CA\u653E\u5931\u8D25', { alias, error });\n });\n }\n\n private seekToStart(binding: RuntimeBindingRecord): void {\n try {\n binding.source.resource.currentTime = 0;\n binding.source.update();\n this.requestRender();\n } catch (error) {\n this.logger.warn('[PixiVideoRuntime] WebM \u9996\u5E27\u5B9A\u4F4D\u5931\u8D25', {\n videoUrl: binding.videoUrl,\n error,\n });\n }\n }\n\n private failPlayback(binding: RuntimeBindingRecord, error: unknown): void {\n if (binding.released || binding.failed || this.destroyed) return;\n binding.failed = true;\n binding.active = false;\n this.finishPlayback(binding, false);\n this.interruptPlayback(binding);\n this.syncActivity();\n this.logger.warn('[PixiVideoRuntime] WebM \u64AD\u653E\u5931\u8D25\uFF0C\u4FDD\u7559 WebP \u6D77\u62A5', {\n videoUrl: binding.videoUrl,\n error,\n });\n try {\n binding.onPlaybackFailure?.();\n } finally {\n this.release(binding);\n }\n }\n\n private resumeActiveBindings(): void {\n if (this.paused || this.reducedMotion || this.contextLost) {\n this.syncActivity();\n return;\n }\n for (const binding of this.bindings) {\n if (!binding.active || binding.released || binding.failed) continue;\n void this.activate(binding, false);\n }\n this.syncActivity();\n }\n\n private syncActivity(): void {\n const shouldRun =\n !this.destroyed &&\n !this.paused &&\n !this.reducedMotion &&\n !this.contextLost &&\n [...this.bindings].some((binding) => binding.active && !binding.released && !binding.failed);\n if (shouldRun && !this.releaseActivity) {\n this.releaseActivity = this.activity.acquire('video-textures');\n } else if (!shouldRun && this.releaseActivity) {\n this.releaseActivity();\n this.releaseActivity = null;\n }\n }\n}\n", "import type { Application, Container } from 'pixi.js';\nimport { PIXI_LOGICAL_STAGE } from './PixiStageMetrics.js';\n\nexport interface PixiViewport {\n width: number;\n height: number;\n}\n\nexport const resolvePixiStageViewport = (\n { width, height }: PixiViewport,\n stage: PixiViewport = PIXI_LOGICAL_STAGE,\n) => {\n const scale = Math.min(width / stage.width, height / stage.height);\n return {\n scale: Number.isFinite(scale) ? Math.max(0, scale) : 0,\n x: Math.max(0, (width - stage.width * scale) / 2),\n y: Math.max(0, (height - stage.height * scale) / 2),\n };\n};\n\nexport class PixiViewportController {\n private readonly observer: ResizeObserver;\n private pendingViewport: PixiViewport | null = null;\n private resizeQueued = false;\n private destroyed = false;\n\n constructor(\n private readonly app: Application,\n private readonly root: Container,\n host: HTMLElement,\n private readonly onResize?: (viewport: PixiViewport) => void,\n private readonly stage: PixiViewport = PIXI_LOGICAL_STAGE,\n ) {\n this.observer = new ResizeObserver(([entry]) => {\n const { width, height } = entry.contentRect;\n this.queueResize({ width, height });\n });\n this.observer.observe(host);\n this.resize({ width: host.clientWidth, height: host.clientHeight });\n }\n\n resize(viewport: PixiViewport): void {\n if (this.destroyed || !this.isValidViewport(viewport)) return;\n this.app.renderer.resize(viewport.width, viewport.height);\n const stage = resolvePixiStageViewport(viewport, this.stage);\n this.root.scale.set(stage.scale);\n this.root.position.set(stage.x, stage.y);\n this.onResize?.(viewport);\n }\n\n destroy(): void {\n this.destroyed = true;\n this.observer.disconnect();\n this.resizeQueued = false;\n this.pendingViewport = null;\n }\n\n private queueResize(viewport: PixiViewport): void {\n if (this.destroyed || !this.isValidViewport(viewport)) return;\n this.pendingViewport = viewport;\n if (this.resizeQueued) return;\n this.resizeQueued = true;\n queueMicrotask(() => {\n this.resizeQueued = false;\n const nextViewport = this.pendingViewport;\n this.pendingViewport = null;\n if (nextViewport) this.resize(nextViewport);\n });\n }\n\n private isValidViewport({ width, height }: PixiViewport): boolean {\n return Number.isFinite(width) && Number.isFinite(height) && width > 0 && height > 0;\n }\n}\n", "export interface BattlePresentationPose {\n x: number;\n y: number;\n rotation: number;\n scale: number;\n alpha: number;\n}\n\nconst IDENTITY_POSE: BattlePresentationPose = { x: 0, y: 0, rotation: 0, scale: 1, alpha: 1 };\n\ninterface PoseEntry {\n authoritative: { x: number; y: number };\n pose: BattlePresentationPose;\n locked: boolean;\n}\n\nexport class BattlePresentationPoseRegistry {\n private readonly entries = new Map<string, PoseEntry>();\n\n syncAuthoritative(tokenId: string, point: { x: number; y: number }): void {\n const entry = this.entries.get(tokenId);\n if (entry) entry.authoritative = { ...point };\n else\n this.entries.set(tokenId, {\n authoritative: { ...point },\n pose: { ...IDENTITY_POSE },\n locked: false,\n });\n }\n\n beginPresentation(tokenId: string): void {\n const entry = this.require(tokenId);\n entry.locked = true;\n }\n\n setPose(tokenId: string, pose: Partial<BattlePresentationPose>): void {\n const entry = this.require(tokenId);\n entry.pose = { ...entry.pose, ...pose };\n }\n\n reconcile(tokenId: string): void {\n const entry = this.require(tokenId);\n entry.locked = false;\n entry.pose = { ...IDENTITY_POSE };\n }\n\n resolve(\n tokenId: string,\n ): BattlePresentationPose & { authoritativeX: number; authoritativeY: number } {\n const entry = this.require(tokenId);\n return {\n ...entry.pose,\n authoritativeX: entry.authoritative.x,\n authoritativeY: entry.authoritative.y,\n };\n }\n\n isLocked(tokenId: string): boolean {\n return this.entries.get(tokenId)?.locked ?? false;\n }\n\n reset(): void {\n for (const entry of this.entries.values()) {\n entry.locked = false;\n entry.pose = { ...IDENTITY_POSE };\n }\n }\n\n deleteMissing(tokenIds: ReadonlySet<string>): void {\n for (const id of this.entries.keys()) if (!tokenIds.has(id)) this.entries.delete(id);\n }\n\n private require(tokenId: string): PoseEntry {\n const entry = this.entries.get(tokenId);\n if (entry) return entry;\n const created = { authoritative: { x: 0, y: 0 }, pose: { ...IDENTITY_POSE }, locked: false };\n this.entries.set(tokenId, created);\n return created;\n }\n}\n", "import type { BattleSequenceMilestone } from './BattleSequenceScheduler.js';\n\nexport type BattlePresentationPhase = 'approach' | 'impact' | 'feedback' | 'resource' | 'return';\n\nexport type BattlePresentationTaskMode = 'blocking' | 'sidecar' | 'camera-barrier';\n\nexport type BattlePresentationClaim =\n | { type: 'token-position'; tokenId: string }\n | { type: 'token-visual'; tokenId: string }\n | { type: 'map'; id?: string }\n | { type: 'roster'; tokenId?: string }\n | { type: 'camera'; id?: string }\n | { type: 'screen'; id?: string };\n\nexport interface BattlePresentationTask {\n id: string;\n phase: BattlePresentationPhase;\n mode: BattlePresentationTaskMode;\n reads?: readonly BattlePresentationClaim[];\n writes?: readonly BattlePresentationClaim[];\n run(signal: AbortSignal): Promise<void>;\n}\n\nexport interface BattlePresentationPlan {\n id: string;\n tasks: readonly BattlePresentationTask[];\n}\n\nexport interface BattlePresentationRecipe<TInput, TServices = undefined> {\n id: string;\n matches(input: TInput): boolean;\n build(input: TInput, services: TServices): BattlePresentationPlan;\n}\n\nexport const BATTLE_PRESENTATION_PHASES: readonly BattlePresentationPhase[] = [\n 'approach',\n 'impact',\n 'feedback',\n 'resource',\n 'return',\n];\n\nexport const battlePresentationPhaseMilestone = (\n phase: BattlePresentationPhase,\n): Exclude<BattleSequenceMilestone, 'done'> => (phase === 'approach' ? 'start' : phase);\n\nexport const serializeBattlePresentationClaim = (claim: BattlePresentationClaim): string => {\n switch (claim.type) {\n case 'token-position':\n case 'token-visual':\n return `${claim.type}:${claim.tokenId}`;\n case 'roster':\n return `${claim.type}:${claim.tokenId ?? '*'}`;\n case 'map':\n case 'camera':\n case 'screen':\n return `${claim.type}:${claim.id ?? 'default'}`;\n }\n};\n\nexport class BattlePresentationRecipeRegistry<TInput, TServices = undefined> {\n private readonly recipes: BattlePresentationRecipe<TInput, TServices>[] = [];\n\n register(recipe: BattlePresentationRecipe<TInput, TServices>): void {\n if (this.recipes.some((candidate) => candidate.id === recipe.id)) {\n throw new Error(`Battle presentation recipe already registered: ${recipe.id}`);\n }\n this.recipes.push(recipe);\n }\n\n resolve(input: TInput): BattlePresentationRecipe<TInput, TServices> | null {\n return this.recipes.find((recipe) => recipe.matches(input)) ?? null;\n }\n\n get registeredIds(): readonly string[] {\n return this.recipes.map((recipe) => recipe.id);\n }\n}\n", "export type BattleSequenceMilestone =\n | 'start'\n | 'impact'\n | 'feedback'\n | 'resource'\n | 'return'\n | 'done';\n\nexport interface BattleSequenceTask {\n id: string;\n reads?: string[];\n writes?: string[];\n run(signal: AbortSignal, emit: (milestone: BattleSequenceMilestone) => void): Promise<void>;\n}\n\nconst conflicts = (left: BattleSequenceTask, right: BattleSequenceTask): boolean => {\n const leftWrites = new Set(left.writes ?? []);\n return (\n [...(right.writes ?? []), ...(right.reads ?? [])].some((key) => leftWrites.has(key)) ||\n (right.writes ?? []).some((key) => (left.reads ?? []).includes(key))\n );\n};\n\nexport const planBattleSequenceBatches = (tasks: BattleSequenceTask[]): BattleSequenceTask[][] => {\n const batches: BattleSequenceTask[][] = [];\n for (const task of tasks) {\n let batchIndex = 0;\n batches.forEach((batch, index) => {\n if (batch.some((other) => conflicts(other, task)))\n batchIndex = Math.max(batchIndex, index + 1);\n });\n (batches[batchIndex] ??= []).push(task);\n }\n return batches;\n};\n\nexport class BattleSequenceScheduler {\n async run(\n tasks: BattleSequenceTask[],\n signal: AbortSignal,\n onMilestone: (taskId: string, milestone: BattleSequenceMilestone) => void,\n ): Promise<void> {\n for (const batch of planBattleSequenceBatches(tasks)) {\n if (signal.aborted) return;\n await Promise.all(\n batch.map((task) =>\n task.run(signal, (milestone) => {\n if (!signal.aborted) onMilestone(task.id, milestone);\n }),\n ),\n );\n }\n }\n}\n", "import type {\n BattlePresentationPlan,\n BattlePresentationRecipe,\n} from './BattlePresentationRecipe.js';\nimport { BattlePresentationRecipeRegistry } from './BattlePresentationRecipe.js';\n\nexport type BattleActionPresentationRecipeId =\n | 'shoot'\n | 'throw'\n | 'electric'\n | 'melee'\n | 'swing'\n | 'whip'\n | 'blade'\n | 'charge'\n | 'explosion'\n | 'recovery'\n | 'resource'\n | 'status'\n | 'fallback';\n\nexport interface BattleActionPresentationRecipeInput {\n actionType: string;\n createPlan(recipeId: BattleActionPresentationRecipeId): BattlePresentationPlan;\n}\n\nconst createRecipe = (\n id: BattleActionPresentationRecipeId,\n matches: (input: BattleActionPresentationRecipeInput) => boolean,\n): BattlePresentationRecipe<BattleActionPresentationRecipeInput> => ({\n id,\n matches,\n build: (input) => input.createPlan(id),\n});\n\nexport const createBattleActionPresentationRecipeRegistry = (\n bindings: readonly { id: BattleActionPresentationRecipeId; actionTypes: readonly string[] }[],\n): BattlePresentationRecipeRegistry<BattleActionPresentationRecipeInput> => {\n const registry = new BattlePresentationRecipeRegistry<BattleActionPresentationRecipeInput>();\n for (const binding of bindings)\n registry.register(\n createRecipe(binding.id, ({ actionType }) => binding.actionTypes.includes(actionType)),\n );\n registry.register(createRecipe('fallback', () => true));\n return registry;\n};\n", "export const PIXI_BATTLE_ACTION_TIMING = {\n shootMs: 100,\n electricEnterMs: 40,\n electricHoldMs: 80,\n electricExitMs: 120,\n electricScreenFlashMs: 120,\n muzzleFlashMs: 100,\n meleeLineMs: 300,\n meleeScale: 1.08,\n meleeReturnMs: 250,\n dodgeShiftPx: 26,\n dodgeDelayMs: 160,\n targetShakeMs: 100,\n explosionProjectileMs: 500,\n explosionFireRingMs: 180,\n chargeImpactHoldMs: 20,\n explosionShakeMs: 200,\n damageFloatMs: 1600,\n healFloatMs: 2000,\n resourceStaggerMs: 200,\n rosterFeedbackMs: 500,\n rosterSameResourceStaggerMs: 60,\n statusMs: 1100,\n} as const;\n\nexport const resolveDodgeOffset = (\n attacker: { x: number; y: number },\n target: { x: number; y: number },\n direction: -1 | 1,\n): { x: number; y: number } => {\n const dx = target.x - attacker.x;\n const dy = target.y - attacker.y;\n const length = Math.hypot(dx, dy) || 1;\n return {\n x: (-dy / length) * PIXI_BATTLE_ACTION_TIMING.dodgeShiftPx * direction,\n y: (dx / length) * PIXI_BATTLE_ACTION_TIMING.dodgeShiftPx * direction,\n };\n};\n\nexport const resolveAwayDodgeOffset = (\n attacker: { x: number; y: number },\n target: { x: number; y: number },\n seed: number,\n distance: number,\n): { x: number; y: number } => {\n const dx = target.x - attacker.x;\n const dy = target.y - attacker.y;\n const baseAngle = Math.atan2(dy, dx);\n const spread = (Math.max(0, Math.min(1, seed)) - 0.5) * (Math.PI / 2);\n return {\n x: Math.cos(baseAngle + spread) * distance,\n y: Math.sin(baseAngle + spread) * distance,\n };\n};\n\nexport const resolveParticipantBoundsCenter = (\n points: readonly { x: number; y: number }[],\n): { x: number; y: number } | null => {\n if (points.length === 0) return null;\n const xs = points.map((point) => point.x);\n const ys = points.map((point) => point.y);\n return {\n x: (Math.min(...xs) + Math.max(...xs)) / 2,\n y: (Math.min(...ys) + Math.max(...ys)) / 2,\n };\n};\n\nexport const resolveExplosionCoverage = (\n points: readonly { x: number; y: number }[],\n tokenRadius: number,\n): { center: { x: number; y: number }; radius: number } | null => {\n const center = resolveParticipantBoundsCenter(points);\n if (!center) return null;\n return {\n center,\n radius:\n Math.max(0, ...points.map((point) => Math.hypot(point.x - center.x, point.y - center.y))) +\n Math.max(0, tokenRadius),\n };\n};\n\nexport const resolveExplosionArcPoint = (\n from: { x: number; y: number },\n to: { x: number; y: number },\n progress: number,\n): { x: number; y: number; rotation: number; height: number } => {\n const normalized = Math.max(0, Math.min(1, progress));\n const height = Math.max(52, Math.min(150, Math.hypot(to.x - from.x, to.y - from.y) * 0.28));\n return {\n x: from.x + (to.x - from.x) * normalized,\n y: from.y + (to.y - from.y) * normalized - 4 * height * normalized * (1 - normalized),\n rotation: (normalized * (520 * Math.PI)) / 180,\n height,\n };\n};\n\nexport const resolveResourceFloatDuration = (text: string): number =>\n text.startsWith('+')\n ? PIXI_BATTLE_ACTION_TIMING.healFloatMs\n : PIXI_BATTLE_ACTION_TIMING.damageFloatMs;\n\nexport const resolveTransientStatus = <T extends string>(\n priority: readonly T[],\n active: ReadonlySet<T>,\n): T | null => priority.find((id) => active.has(id)) ?? null;\n", "import type { Container, Filter, Ticker } from 'pixi.js';\n\nimport type { PixiAnimationActivity } from '../PixiAnimationActivity.js';\n\n/**\n * Owns every short-lived resource created by an effect. Releasing a scope is\n * idempotent so reset, scene changes and context restoration share one path.\n */\nexport class PixiEffectScope {\n private readonly controller = new AbortController();\n private readonly cleanups: Array<() => void> = [];\n private released = false;\n\n get signal(): AbortSignal {\n return this.controller.signal;\n }\n\n addNode(node: Container): void {\n this.defer(() => node.destroy({ children: true }));\n }\n\n addFilter(filter: Filter): void {\n this.defer(() => filter.destroy());\n }\n\n addTicker(ticker: Ticker, callback: (ticker: Ticker) => void): void {\n ticker.add(callback);\n this.defer(() => ticker.remove(callback));\n }\n\n addActivity(activity: PixiAnimationActivity, reason: string): void {\n this.defer(activity.acquire(reason));\n }\n\n defer(cleanup: () => void): void {\n if (this.released) {\n cleanup();\n return;\n }\n this.cleanups.push(cleanup);\n }\n\n reset(): void {\n this.release();\n }\n\n destroy(): void {\n this.release();\n }\n\n release(): void {\n if (this.released) return;\n this.released = true;\n this.controller.abort();\n for (const cleanup of this.cleanups.splice(0).reverse()) cleanup();\n }\n}\n", "import type { Container } from 'pixi.js';\n\nimport { PixiEffectScope } from './PixiEffectScope.js';\nimport type { PixiContainerConstructor, PixiSceneGraph } from '../PixiSceneGraph.js';\n\nexport type PixiEffectLayerName =\n | 'worldUnderlayFxLayer'\n | 'worldOverlayFxLayer'\n | 'cinematicLayer'\n | 'presentationLayer'\n | 'screenFxLayer'\n | 'modalLayer'\n | 'fieldFxLayer'\n | 'battlePictureFxLayer'\n | 'comboFxLayer'\n | 'globalFxLayer';\n\nexport type PixiEffectLayerOwner =\n | 'battle-world'\n | 'battle-action'\n | 'battle-cinematic'\n | 'scene-transition'\n | 'story-presentation'\n | 'story-reveal'\n | 'story-dice-result'\n | 'battle-summary'\n | 'session-field'\n | 'battle-picture'\n | 'combo'\n | 'session-global';\n\nexport interface PixiEffectLayerOwnerByLayer {\n worldUnderlayFxLayer: 'battle-world' | 'battle-action';\n worldOverlayFxLayer: 'battle-action';\n cinematicLayer: 'battle-cinematic';\n presentationLayer: 'scene-transition';\n screenFxLayer: 'story-presentation' | 'scene-transition';\n modalLayer: 'story-reveal' | 'story-dice-result' | 'battle-summary' | 'scene-transition';\n fieldFxLayer: 'session-field';\n battlePictureFxLayer: 'battle-picture';\n comboFxLayer: 'combo';\n globalFxLayer: 'session-global';\n}\n\nexport type PixiEffectLayerOverrides = {\n [Layer in PixiEffectLayerName]?: PixiEffectLayerOwnerByLayer[Layer];\n};\n\nconst OWNER_ORDER: {\n readonly [Layer in PixiEffectLayerName]: readonly PixiEffectLayerOwnerByLayer[Layer][];\n} = {\n worldUnderlayFxLayer: ['battle-world', 'battle-action'],\n worldOverlayFxLayer: ['battle-action'],\n cinematicLayer: ['battle-cinematic'],\n presentationLayer: ['scene-transition'],\n screenFxLayer: ['story-presentation', 'scene-transition'],\n modalLayer: ['story-reveal', 'story-dice-result', 'battle-summary', 'scene-transition'],\n fieldFxLayer: ['session-field'],\n battlePictureFxLayer: ['battle-picture'],\n comboFxLayer: ['combo'],\n globalFxLayer: ['session-global'],\n};\n\nconst EFFECT_LAYER_NAMES = Object.keys(OWNER_ORDER) as PixiEffectLayerName[];\n\n/** A stable renderer-owned branch. Reset releases transient scopes without destroying the branch. */\nexport class PixiEffectLayerOwnerHandle {\n private readonly scopes = new Set<PixiEffectScope>();\n private destroyed = false;\n\n constructor(\n readonly owner: PixiEffectLayerOwner,\n private readonly layers: ReadonlyMap<PixiEffectLayerName, Container>,\n ) {}\n\n getLayer(layer: PixiEffectLayerName): Container {\n const node = this.layers.get(layer);\n if (!node) throw new Error(`Pixi effect owner ${this.owner} cannot access ${layer}`);\n return node;\n }\n\n createScope(): PixiEffectScope {\n if (this.destroyed) throw new Error(`Pixi effect owner ${this.owner} is destroyed`);\n const scope = new PixiEffectScope();\n this.scopes.add(scope);\n return scope;\n }\n\n reset(): void {\n for (const scope of this.scopes) scope.reset();\n this.scopes.clear();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.reset();\n for (const layer of this.layers.values()) {\n layer.parent?.removeChild(layer);\n layer.destroy({ children: true });\n }\n }\n}\n\n/** Owns the fixed child branches inside the renderer's shared physical effect layers. */\nexport class PixiEffectLayerRegistry {\n private readonly handles = new Map<PixiEffectLayerOwner, PixiEffectLayerOwnerHandle>();\n private destroyed = false;\n\n constructor(scene: PixiSceneGraph, ContainerConstructor: PixiContainerConstructor) {\n const ownerLayers = new Map<PixiEffectLayerOwner, Map<PixiEffectLayerName, Container>>();\n\n for (const layerName of EFFECT_LAYER_NAMES) {\n const physicalLayer = scene[layerName];\n for (const owner of OWNER_ORDER[layerName]) {\n const branch = new ContainerConstructor();\n branch.label = `effect-owner:${owner}:${layerName}`;\n branch.eventMode = 'none';\n physicalLayer.addChild(branch);\n const layers = ownerLayers.get(owner) ?? new Map<PixiEffectLayerName, Container>();\n layers.set(layerName, branch);\n ownerLayers.set(owner, layers);\n }\n }\n\n for (const [owner, layers] of ownerLayers) {\n this.handles.set(owner, new PixiEffectLayerOwnerHandle(owner, layers));\n }\n }\n\n get(owner: PixiEffectLayerOwner): PixiEffectLayerOwnerHandle {\n const handle = this.handles.get(owner);\n if (!handle || this.destroyed) throw new Error(`Pixi effect owner ${owner} is unavailable`);\n return handle;\n }\n\n createSceneView(scene: PixiSceneGraph, overrides: PixiEffectLayerOverrides): PixiSceneGraph {\n const effectLayers = Object.fromEntries(\n Object.entries(overrides).map(([layer, owner]) => [\n layer,\n this.get(owner as PixiEffectLayerOwner).getLayer(layer as PixiEffectLayerName),\n ]),\n ) as Partial<Pick<PixiSceneGraph, PixiEffectLayerName>>;\n return { ...scene, ...effectLayers };\n }\n\n reset(): void {\n if (this.destroyed) return;\n for (const handle of this.handles.values()) handle.reset();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n for (const handle of this.handles.values()) handle.destroy();\n this.handles.clear();\n }\n}\n\nexport const PIXI_EFFECT_LAYER_OWNER_ORDER = OWNER_ORDER;\n", "/** Logical animation time. Only the renderer's ticker advances production clocks. */\nexport class StoryTimelineClock {\n private time = 0;\n private serial = 0;\n private paused = false;\n private rate = 1;\n private readonly timers = new Map<number, { at: number; callback: () => void }>();\n private readonly listeners = new Set<(nowMs: number) => void>();\n\n now(): number {\n return this.time;\n }\n resourceCounts(): { timers: number; samplers: number } {\n return { timers: this.timers.size, samplers: this.listeners.size };\n }\n setPaused(value: boolean): void {\n this.paused = value;\n }\n setPlaybackRate(value: number): void {\n this.rate = Math.max(0.25, Math.min(2, value));\n }\n subscribe(listener: (nowMs: number) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n setTimeout(callback: () => void, delayMs: number): number {\n const id = ++this.serial;\n this.timers.set(id, { at: this.time + Math.max(0, delayMs), callback });\n return id;\n }\n clearTimeout(handle: unknown): void {\n if (typeof handle === 'number') this.timers.delete(handle);\n }\n advance(deltaMs: number): void {\n if (this.paused || !Number.isFinite(deltaMs) || deltaMs < 0) return;\n const end = this.time + deltaMs * this.rate;\n for (;;) {\n let boundary = Infinity;\n for (const timer of this.timers.values()) boundary = Math.min(boundary, timer.at);\n if (boundary > end) break;\n this.sample(boundary);\n for (const [id, timer] of [...this.timers]) {\n if (timer.at <= boundary && this.timers.delete(id)) timer.callback();\n }\n }\n this.sample(end);\n }\n clear(): void {\n this.timers.clear();\n this.listeners.clear();\n }\n private sample(time: number): void {\n this.time = time;\n for (const listener of [...this.listeners]) listener(time);\n }\n}\n", "import type { Filter } from 'pixi.js';\n\nexport type StoryRevealStyle = 'highlights-first' | 'random-fragments';\n\nconst vertex = `\nprecision highp float;\nin vec2 aPosition;\nout vec2 vTextureCoord;\nout vec2 vStoryUV;\nuniform vec4 uInputSize;\nuniform vec4 uOutputFrame;\nuniform vec4 uOutputTexture;\nvoid main() {\n vec2 p = aPosition * uOutputFrame.zw + uOutputFrame.xy;\n p.x = p.x * (2.0 / uOutputTexture.x) - 1.0;\n p.y = p.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;\n gl_Position = vec4(p, 0., 1.);\n vTextureCoord = aPosition * uOutputFrame.zw * uInputSize.zw;\n vStoryUV = aPosition;\n}`;\n\nconst vignetteFragment = `\nprecision highp float;\nin vec2 vTextureCoord;\nin vec2 vStoryUV;\nout vec4 finalColor;\nuniform sampler2D uTexture;\nuniform vec4 uVignette;\nuniform vec2 uEllipse;\nvoid main() {\n vec4 color = texture(uTexture, vTextureCoord);\n float radius = length((vStoryUV - .5) * 2. / max(uEllipse, vec2(.05)));\n float innerRadius = uVignette.y;\n float outerRadius = max(innerRadius + .001, uVignette.z);\n float softnessPower = max(.1, uVignette.w * 2.);\n float edge = pow(smoothstep(innerRadius, outerRadius, radius), softnessPower);\n color.rgb *= 1. - uVignette.x * edge;\n finalColor = color;\n}`;\n\nconst revealFragment = `\nprecision highp float;\nin vec2 vTextureCoord;\nin vec2 vStoryUV;\nout vec4 finalColor;\nuniform sampler2D uTexture;\nuniform vec4 uReveal;\nuniform vec4 uDetail;\nuniform vec2 uFadeRatios;\n\nfloat hash21(vec2 p) {\n p = fract(p * vec2(123.34, 456.21));\n p += dot(p, p + 45.32);\n return fract(p.x * p.y);\n}\n\nvec2 cellPoint(vec2 cell, float seed) {\n return vec2(\n hash21(cell + vec2(seed, seed * .17)),\n hash21(cell + vec2(seed * .31, seed + 19.7))\n );\n}\n\nfloat fragmentMask(vec2 uv, float progress, float edgeSoftness, float seed) {\n vec2 grid = max(vec2(1.), uDetail.zw);\n vec2 scaled = uv * grid;\n vec2 base = floor(scaled);\n float nearest = 100.;\n float secondNearest = 100.;\n vec2 nearestCell = base;\n for (int y = -1; y <= 1; y++) {\n for (int x = -1; x <= 1; x++) {\n vec2 cell = base + vec2(float(x), float(y));\n vec2 point = cell + mix(vec2(.18), vec2(.82), cellPoint(cell, seed));\n float distanceToPoint = length(scaled - point);\n if (distanceToPoint < nearest) {\n secondNearest = nearest;\n nearest = distanceToPoint;\n nearestCell = cell;\n } else if (distanceToPoint < secondNearest) {\n secondNearest = distanceToPoint;\n }\n }\n }\n float cellRandom = hash21(nearestCell + vec2(seed * .07, seed * .13));\n float duration = mix(uFadeRatios.x, uFadeRatios.y, hash21(nearestCell + seed * .23));\n float onset = cellRandom * max(.001, 1. - duration);\n float cellReveal = smoothstep(onset, onset + max(.001, duration), progress);\n float border = smoothstep(0., max(.002, edgeSoftness) * max(grid.x, grid.y), secondNearest - nearest);\n float softened = cellReveal * mix(.76, 1., border);\n return mix(softened, 1., smoothstep(.94, 1., progress));\n}\n\nvoid main() {\n vec4 color = texture(uTexture, vTextureCoord);\n float mode = uReveal.x;\n float progress = clamp(uReveal.y, 0., 1.);\n float edgeSoftness = uReveal.z;\n float seed = uReveal.w;\n float mask;\n if (mode < .5) {\n float luminance = dot(color.rgb, vec3(.2126, .7152, .0722));\n vec2 grainCell = floor(vStoryUV * max(1., uDetail.y));\n float grain = (hash21(grainCell + seed) - .5) * uDetail.x;\n float threshold = 1. - progress;\n mask = smoothstep(threshold - edgeSoftness, threshold + edgeSoftness, luminance + grain);\n mask = mix(mask, 1., smoothstep(.92, 1., progress));\n } else {\n mask = fragmentMask(vStoryUV, progress, edgeSoftness, seed);\n }\n finalColor = color * clamp(mask, 0., 1.);\n}`;\n\n/** Retained single-pass vignette filter; only uniforms change during playback. */\nexport function createStoryVignetteFilter(FilterConstructor: typeof Filter) {\n const vignette = new Float32Array([1, 0.18, 0.95, 0.45]);\n const ellipse = new Float32Array([1, 0.85]);\n const filter = FilterConstructor.from({\n gl: { vertex, fragment: vignetteFragment },\n resources: {\n storyVignette: {\n uVignette: { value: vignette, type: 'vec4<f32>' },\n uEllipse: { value: ellipse, type: 'vec2<f32>' },\n },\n },\n });\n return { filter, vignette, ellipse };\n}\n\n/** Retained single-pass reveal filter for luminance dissolve and stable Voronoi fragments. */\nexport function createStoryRevealFilter(style: StoryRevealStyle, FilterConstructor: typeof Filter) {\n const reveal = new Float32Array([style === 'random-fragments' ? 1 : 0, 0, 0.06, 0]);\n const detail = new Float32Array([0.18, 22, 9, 5]);\n const fadeRatios = new Float32Array([0.08, 0.18]);\n const filter = FilterConstructor.from({\n gl: { vertex, fragment: revealFragment },\n resources: {\n storyReveal: {\n uReveal: { value: reveal, type: 'vec4<f32>' },\n uDetail: { value: detail, type: 'vec4<f32>' },\n uFadeRatios: { value: fadeRatios, type: 'vec2<f32>' },\n },\n },\n });\n return { filter, reveal, detail, fadeRatios };\n}\n", "export const clamp01 = (value: number): number => Math.max(0, Math.min(1, value));\nexport const smooth = (value: number): number => {\n const t = clamp01(value);\n return t * t * (3 - 2 * t);\n};\nexport function envelope(time: number, attack: number, hold: number, release: number): number {\n if (time < 0) return 0;\n if (attack > 0 && time < attack) return smooth(time / attack);\n if (time < attack + hold) return 1;\n return release > 0 ? 1 - smooth((time - attack - hold) / release) : 0;\n}\nexport function seededRandom(seed: number): () => number {\n let state = seed >>> 0;\n return () => {\n state = (Math.imul(state, 1664525) + 1013904223) >>> 0;\n return state / 4294967296;\n };\n}\nexport function storySeed(value: string): number {\n let seed = 2166136261;\n for (const char of value) seed = Math.imul(seed ^ char.charCodeAt(0), 16777619);\n return seed >>> 0;\n}\nexport function shakeSample(\n time: number,\n duration: number,\n frequency: number,\n decay: number,\n seed: number,\n): number {\n if (time >= duration) return 0;\n const t = clamp01(time / Math.max(1, duration));\n const phase = (seed % 97) / 97;\n return (\n Math.exp(-decay * t) *\n (1 - t) *\n (0.72 * Math.cos((time * frequency * Math.PI * 2) / 1000) +\n 0.28 * Math.cos((time * frequency * 9.7) / 1000 + phase))\n );\n}\n", "import type { Filter, Rectangle, Sprite, Texture, Ticker, UniformGroup } from 'pixi.js';\n\nimport type { PixiAnimationActivity } from './PixiAnimationActivity.js';\n\nexport type PixiShaderEffectId =\n | 'galaxy'\n | 'prismaticBurst'\n | 'sideRays'\n | 'lightning'\n | 'lightPillar'\n | 'lineWaves'\n | 'teamCheckStrands'\n | 'arcaneVeil'\n | 'heavyRain'\n | 'fire'\n | 'denseFog'\n | 'dark'\n | 'thunderstorm'\n | 'earthquake';\n\nexport type PixiShaderUniformEntry = {\n value: number | Float32Array;\n type: 'f32' | 'vec2<f32>' | 'vec3<f32>';\n};\n\nexport type PixiShaderUniformEntries = Record<string, PixiShaderUniformEntry>;\n\ninterface PixiEffectReleaseTarget {\n sprite: Sprite;\n filter: Filter;\n}\n\nexport interface PixiEffectDefinition<\n TUniforms extends PixiShaderUniformEntries = PixiShaderUniformEntries,\n> {\n id: PixiShaderEffectId;\n /** A stable mode consumed by the shared full-screen WebGL program. */\n mode: number;\n layer: 'field' | 'global' | 'cinematic';\n qualityCost: 'low' | 'medium' | 'high';\n reducedMotion: 'static-commit' | 'disabled';\n resolution: number;\n fragment: () => string;\n createUniforms: () => TUniforms;\n update: (uniforms: UniformGroup, elapsed: number) => void;\n release: (target: PixiEffectReleaseTarget) => void;\n}\n\ntype PixiEffectMetadata = Omit<\n PixiEffectDefinition,\n 'fragment' | 'createUniforms' | 'update' | 'release'\n>;\n\n/**\n * Every high-dynamic full-screen 2D effect has one Pixi-owned shader entry.\n * The renderer owns its uniforms and advances them with its single ticker;\n * individual effects never create a canvas, GL context, RAF or observer.\n */\nconst PIXI_SHADER_METADATA: Readonly<Record<PixiShaderEffectId, PixiEffectMetadata>> = {\n galaxy: {\n id: 'galaxy',\n mode: 1,\n layer: 'global',\n qualityCost: 'high',\n reducedMotion: 'static-commit',\n resolution: 1,\n },\n prismaticBurst: {\n id: 'prismaticBurst',\n mode: 2,\n layer: 'global',\n qualityCost: 'high',\n reducedMotion: 'static-commit',\n resolution: 1,\n },\n sideRays: {\n id: 'sideRays',\n mode: 3,\n layer: 'global',\n qualityCost: 'medium',\n reducedMotion: 'static-commit',\n resolution: 1,\n },\n lightning: {\n id: 'lightning',\n mode: 4,\n layer: 'global',\n qualityCost: 'medium',\n reducedMotion: 'static-commit',\n resolution: 1,\n },\n lightPillar: {\n id: 'lightPillar',\n mode: 5,\n layer: 'global',\n qualityCost: 'high',\n reducedMotion: 'static-commit',\n resolution: 1,\n },\n lineWaves: {\n id: 'lineWaves',\n mode: 6,\n layer: 'cinematic',\n qualityCost: 'medium',\n reducedMotion: 'disabled',\n resolution: 1,\n },\n teamCheckStrands: {\n id: 'teamCheckStrands',\n mode: 7,\n layer: 'cinematic',\n qualityCost: 'medium',\n reducedMotion: 'static-commit',\n resolution: 1,\n },\n arcaneVeil: {\n id: 'arcaneVeil',\n mode: 8,\n layer: 'field',\n qualityCost: 'high',\n reducedMotion: 'static-commit',\n resolution: 0.75,\n },\n heavyRain: {\n id: 'heavyRain',\n mode: 9,\n layer: 'field',\n qualityCost: 'medium',\n reducedMotion: 'static-commit',\n resolution: 1,\n },\n fire: {\n id: 'fire',\n mode: 10,\n layer: 'field',\n qualityCost: 'medium',\n reducedMotion: 'static-commit',\n resolution: 1,\n },\n denseFog: {\n id: 'denseFog',\n mode: 11,\n layer: 'field',\n qualityCost: 'medium',\n reducedMotion: 'static-commit',\n resolution: 0.75,\n },\n dark: {\n id: 'dark',\n mode: 12,\n layer: 'field',\n qualityCost: 'low',\n reducedMotion: 'static-commit',\n resolution: 0.75,\n },\n thunderstorm: {\n id: 'thunderstorm',\n mode: 13,\n layer: 'field',\n qualityCost: 'medium',\n reducedMotion: 'static-commit',\n resolution: 1,\n },\n earthquake: {\n id: 'earthquake',\n mode: 14,\n layer: 'field',\n qualityCost: 'medium',\n reducedMotion: 'static-commit',\n resolution: 1,\n },\n};\n\nconst defineEffect = (metadata: PixiEffectMetadata): PixiEffectDefinition => ({\n ...metadata,\n fragment: () => resolveShaderFragment(metadata.id),\n createUniforms: () => ({}),\n update: (uniforms, elapsed) => {\n uniforms.uniforms.uTime = elapsed;\n },\n release: ({ sprite, filter }) => {\n if (!sprite.destroyed) {\n sprite.filters = null;\n sprite.filterArea = undefined;\n }\n filter.destroy();\n },\n});\n\nexport const PIXI_SHADER_REGISTRY: Readonly<Record<PixiShaderEffectId, PixiEffectDefinition>> = {\n galaxy: defineEffect(PIXI_SHADER_METADATA.galaxy),\n prismaticBurst: defineEffect(PIXI_SHADER_METADATA.prismaticBurst),\n sideRays: defineEffect(PIXI_SHADER_METADATA.sideRays),\n lightning: defineEffect(PIXI_SHADER_METADATA.lightning),\n lightPillar: defineEffect(PIXI_SHADER_METADATA.lightPillar),\n lineWaves: defineEffect(PIXI_SHADER_METADATA.lineWaves),\n teamCheckStrands: defineEffect(PIXI_SHADER_METADATA.teamCheckStrands),\n arcaneVeil: defineEffect(PIXI_SHADER_METADATA.arcaneVeil),\n heavyRain: defineEffect(PIXI_SHADER_METADATA.heavyRain),\n fire: defineEffect(PIXI_SHADER_METADATA.fire),\n denseFog: defineEffect(PIXI_SHADER_METADATA.denseFog),\n dark: defineEffect(PIXI_SHADER_METADATA.dark),\n thunderstorm: defineEffect(PIXI_SHADER_METADATA.thunderstorm),\n earthquake: defineEffect(PIXI_SHADER_METADATA.earthquake),\n};\n\nexport interface PixiShaderUniformConfig {\n mode: number;\n intensity: number;\n rate: number;\n}\n\nexport interface PixiLineWavesUniforms {\n speed: number;\n innerLines: number;\n outerLines: number;\n warpIntensity: number;\n rotation: number;\n edgeFadeWidth: number;\n colorCycleSpeed: number;\n brightness: number;\n color1: Float32Array;\n color2: Float32Array;\n color3: Float32Array;\n}\n\nexport interface PixiSideRaysUniforms {\n speed: number;\n rayColor1: Float32Array;\n rayColor2: Float32Array;\n intensity: number;\n spread: number;\n flipX: number;\n flipY: number;\n tilt: number;\n saturation: number;\n blend: number;\n falloff: number;\n opacity: number;\n}\n\nexport interface PixiLightningUniforms {\n hue: number;\n xOffset: number;\n speed: number;\n intensity: number;\n size: number;\n}\n\nexport interface PixiLightPillarUniforms {\n topColor: Float32Array;\n bottomColor: Float32Array;\n intensity: number;\n glowAmount: number;\n width: number;\n height: number;\n noiseIntensity: number;\n rotation: number;\n waveRotation: number;\n timeScale: number;\n rotationSpeed: number;\n}\n\nexport interface PixiGalaxyUniforms {\n focal: Float32Array;\n rotation: Float32Array;\n starSpeed: number;\n density: number;\n hueShift: number;\n speed: number;\n glowIntensity: number;\n saturation: number;\n twinkleIntensity: number;\n rotationSpeed: number;\n autoCenterRepulsion: number;\n}\n\nexport interface PixiPrismaticBurstUniforms {\n intensity: number;\n speed: number;\n animationType: number;\n distort: number;\n offset: Float32Array;\n noiseAmount: number;\n rayCount: number;\n color1: Float32Array;\n color2: Float32Array;\n color3: Float32Array;\n}\n\nexport interface PixiArcaneVeilUniforms {\n color: Float32Array;\n speed: number;\n scale: number;\n opacity: number;\n quality: number;\n}\n\nexport interface PixiHeavyRainUniforms {\n color: Float32Array;\n density: number;\n speed: number;\n hazeOpacity: number;\n slant: number;\n}\n\nexport interface PixiFieldSurfaceUniforms {\n color1: Float32Array;\n color2: Float32Array;\n color3: Float32Array;\n density: number;\n speed: number;\n opacity: number;\n}\n\nexport interface PixiTeamCheckStrandsUniforms {\n count: number;\n speed: number;\n amplitude: number;\n waviness: number;\n thickness: number;\n glow: number;\n taper: number;\n spread: number;\n hueShift: number;\n opacity: number;\n scale: number;\n saturation: number;\n color1: Float32Array;\n color2: Float32Array;\n color3: Float32Array;\n}\n\n/** Exact Line Waves parameters previously supplied by the raw WebGL host. */\ntype PixiFilterConstructor = {\n from(options: {\n gl: { vertex: string; fragment: string; name: string };\n resources: Record<string, UniformGroup>;\n resolution?: number;\n }): Filter;\n};\n\nexport interface PixiShaderRuntimeConstructors {\n Filter: PixiFilterConstructor;\n Rectangle: new (x?: number, y?: number, width?: number, height?: number) => Rectangle;\n Sprite: new (texture?: Texture) => Sprite;\n Texture: { WHITE: Texture };\n UniformGroup: typeof import('pixi.js').UniformGroup;\n}\n\ninterface ManagedSurface {\n effectId: PixiShaderEffectId;\n sprite: Sprite;\n filter: Filter;\n uniforms: UniformGroup;\n releaseTicker: () => void;\n onDestroyed: () => void;\n suspended: boolean;\n}\n\nconst FILTER_VERTEX = `\nin vec2 aPosition;\nout vec2 vTextureCoord;\nout vec2 vSurfaceCoord;\nuniform vec4 uInputSize;\nuniform vec4 uOutputFrame;\nuniform vec4 uOutputTexture;\nvec4 filterVertexPosition(void) {\n vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;\n position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;\n return vec4(position, 0.0, 1.0);\n}\nvec2 filterTextureCoord(void) { return aPosition * (uOutputFrame.zw * uInputSize.zw); }\nvoid main(void) { gl_Position = filterVertexPosition(); vTextureCoord = filterTextureCoord(); vSurfaceCoord = aPosition; }\n`;\n\n// Do not use GLSL uniform blocks here. Pixi v8 transparently adapts these\n// WebGL-style shaders for WebGL 1, which is still common on TV browsers; UBO\n// declarations require GLSL ES 3.00 and prevent every dependent effect from\n// compiling on those devices.\n// Pixi's Filter input for these WHITE-backed procedural surfaces stays opaque and does not\n// carry ancestor alpha. The runtime therefore injects the effective scene-graph alpha.\nconst COMMON_UNIFORMS = `uniform float uTime;uniform vec2 uResolution;uniform float uIntensity;uniform float uMode;uniform float uRate;uniform float uA;`;\n\n// WebGL GLSL owned by Pixi Filter. Modes retain the prior effect families while\n// moving their timing and resource lifetime under the sole Pixi renderer.\nconst LINE_WAVES_FRAGMENT = `in vec2 vTextureCoord;out vec4 finalColor;\n${COMMON_UNIFORMS}\nuniform float uLineSpeed;uniform float uLineInnerLines;uniform float uLineOuterLines;uniform float uLineWarpIntensity;\nuniform float uLineRotation;uniform float uLineEdgeFadeWidth;uniform float uLineColorCycleSpeed;uniform float uLineBrightness;\nuniform vec3 uLineColor1;uniform vec3 uLineColor2;uniform vec3 uLineColor3;\n#define HALF_PI 1.5707963\nfloat hashF(float n) { return fract(sin(n * 127.1) * 43758.5453123); }\nfloat smoothNoise(float x) { float i = floor(x); float f = fract(x); float u = f * f * (3.0 - 2.0 * f); return mix(hashF(i), hashF(i + 1.0), u); }\nfloat displaceA(float coord, float t) { float result = sin(coord * 2.123) * 0.2; result += sin(coord * 3.234 + t * 4.345) * 0.1; result += sin(coord * 0.589 + t * 0.934) * 0.5; return result; }\nfloat displaceB(float coord, float t) { float result = sin(coord * 1.345) * 0.3; result += sin(coord * 2.734 + t * 3.345) * 0.2; result += sin(coord * 0.189 + t * 0.934) * 0.3; return result; }\nvec2 rotate2D(vec2 p, float angle) { float c = cos(angle); float s = sin(angle); return vec2(p.x * c - p.y * s, p.x * s + p.y * c); }\nvoid main() {\n vec2 coords = vec2(vTextureCoord.x, 1.0 - vTextureCoord.y) * 2.0 - 1.0; coords = rotate2D(coords, uLineRotation);\n float halfT = uTime * uLineSpeed * 0.5; float fullT = uTime * uLineSpeed;\n float warpAx = coords.x + displaceA(coords.y, halfT) * uLineWarpIntensity;\n float warpAy = coords.y - displaceA(coords.x * cos(fullT) * 1.235, halfT) * uLineWarpIntensity;\n float warpBx = coords.x + displaceB(coords.y, halfT) * uLineWarpIntensity;\n float warpBy = coords.y - displaceB(coords.x * sin(fullT) * 1.235, halfT) * uLineWarpIntensity;\n vec2 fieldA = vec2(warpAx, warpAy); vec2 fieldB = vec2(warpBx, warpBy); vec2 blended = mix(fieldA, fieldB, mix(fieldA, fieldB, 0.5));\n float fadeTop = smoothstep(uLineEdgeFadeWidth, uLineEdgeFadeWidth + 0.4, blended.y);\n float fadeBottom = smoothstep(-uLineEdgeFadeWidth, -(uLineEdgeFadeWidth + 0.4), blended.y);\n float vMask = 1.0 - max(fadeTop, fadeBottom); float tileCount = mix(uLineOuterLines, uLineInnerLines, vMask);\n float scaledY = blended.y * tileCount; float nY = smoothNoise(abs(scaledY));\n float ridge = pow(step(abs(nY - blended.x) * 2.0, HALF_PI) * cos(2.0 * (nY - blended.x)), 5.0);\n float lines = 0.0; for (float i = 1.0; i < 3.0; i += 1.0) { lines += pow(max(fract(scaledY), fract(-scaledY)), i * 2.0); }\n float pattern = vMask * lines; float cycleT = fullT * uLineColorCycleSpeed;\n float rChannel = (pattern + lines * ridge) * (cos(blended.y + cycleT * 0.234) * 0.5 + 1.0);\n float gChannel = (pattern + vMask * ridge) * (sin(blended.x + cycleT * 1.745) * 0.5 + 1.0);\n float bChannel = (pattern + lines * ridge) * (cos(blended.x + cycleT * 0.534) * 0.5 + 1.0);\n vec3 col = (rChannel * uLineColor1 + gChannel * uLineColor2 + bChannel * uLineColor3) * uLineBrightness * uIntensity;\n finalColor=vec4(col,clamp(length(col),0.0,1.0))*uA;\n}`;\n\n// Source attribution: reactbits-lightning-standalone-fixed.html, MIT +\n// Commons Clause License Condition v1.0. The legacy fractal and temporal\n// flicker are retained; only Pixi Filter coordinates replace gl_FragCoord.\nconst LIGHTNING_FRAGMENT = `\nin vec2 vTextureCoord; in vec2 vSurfaceCoord; out vec4 finalColor;\n${COMMON_UNIFORMS}\nuniform float uLightningHue; uniform float uLightningXOffset; uniform float uLightningSpeed; uniform float uLightningIntensity; uniform float uLightningSize; uniform float uLightningHorizontal; uniform float uLightningAmplitude;\n#define OCTAVE_COUNT 10\nvec3 hsv2rgb(vec3 c) { vec3 rgb=clamp(abs(mod(c.x*6.0+vec3(0.0,4.0,2.0),6.0)-3.0)-1.0,0.0,1.0); return c.z*mix(vec3(1.0),rgb,c.y); }\nfloat hash11(float p) { p=fract(p*0.1031); p*=p+33.33; p*=p+p; return fract(p); }\nfloat hash12(vec2 p) { vec3 p3=fract(vec3(p.xyx)*0.1031); p3+=dot(p3,p3.yzx+33.33); return fract((p3.x+p3.y)*p3.z); }\nmat2 rotate2d(float theta) { float c=cos(theta),s=sin(theta); return mat2(c,-s,s,c); }\nfloat noise(vec2 p) { vec2 ip=floor(p),fp=fract(p); float a=hash12(ip),b=hash12(ip+vec2(1.0,0.0)),c=hash12(ip+vec2(0.0,1.0)),d=hash12(ip+vec2(1.0,1.0)); vec2 t=smoothstep(0.0,1.0,fp); return mix(mix(a,b,t.x),mix(c,d,t.x),t.y); }\nfloat fbm(vec2 p) { float value=0.0,amplitude=0.5; for(int i=0;i<OCTAVE_COUNT;++i) { value+=amplitude*noise(p); p*=rotate2d(0.45); p*=2.0; amplitude*=0.5; } return value; }\nvoid main() { vec2 uv=vec2(vSurfaceCoord.x,1.0-vSurfaceCoord.y)*2.0-1.0; if(uLightningHorizontal>0.5) { uv=vec2(-uv.y,uv.x); uv.x*=uResolution.y/max(uResolution.x,1.0); } else { uv.x*=uResolution.x/max(uResolution.y,1.0); } uv.x+=uLightningXOffset; uv+=(2.0*fbm(uv*uLightningSize+0.8*uTime*uLightningSpeed)-1.0)*uLightningAmplitude; float dist=abs(uv.x); vec3 baseColor=hsv2rgb(vec3(uLightningHue/360.0,0.7,0.8)); vec3 col=baseColor*pow(mix(0.0,0.07,hash11(uTime*uLightningSpeed))/max(dist,0.0001),1.0)*uLightningIntensity*uIntensity; float alpha=clamp(max(col.r,max(col.g,col.b)),0.0,1.0); finalColor=vec4(col,alpha)*uA; }`;\n\n// Source attribution: reactbits-side-rays-standalone.html, MIT + Commons\n// Clause License Condition v1.0. Coordinates are adapted for Pixi Filter;\n// all effect controls retain their legacy values through the UniformGroup.\nconst SIDE_RAYS_FRAGMENT = `\nin vec2 vTextureCoord; in vec2 vSurfaceCoord; out vec4 finalColor;\n${COMMON_UNIFORMS}\nuniform float uSideSpeed; uniform vec3 uSideRayColor1; uniform vec3 uSideRayColor2; uniform float uSideIntensity; uniform float uSideSpread; uniform float uSideFlipX; uniform float uSideFlipY; uniform float uSideTilt; uniform float uSideSaturation; uniform float uSideBlend; uniform float uSideFalloff; uniform float uSideOpacity;\nfloat rayStrength(vec2 raySource, vec2 rayRefDirection, vec2 coord, float seedA, float seedB, float speed) { vec2 sourceToCoord=coord-raySource; float cosAngle=dot(normalize(sourceToCoord),rayRefDirection); return clamp((0.45+0.15*sin(cosAngle*seedA+uTime*speed))+(0.30+0.20*cos(-cosAngle*seedB+uTime*speed)),0.0,1.0)*clamp((uResolution.x-length(sourceToCoord))/uResolution.x,0.5,1.0); }\nvoid main() { vec2 fragCoord=vSurfaceCoord*uResolution; if(uSideFlipX>0.5) fragCoord.x=uResolution.x-fragCoord.x; if(uSideFlipY>0.5) fragCoord.y=uResolution.y-fragCoord.y; vec2 coord=vec2(fragCoord.x,uResolution.y-fragCoord.y); vec2 rayPos=vec2(uResolution.x*1.1,-0.5*uResolution.y); float cs=cos(uSideTilt), sn=sin(uSideTilt); vec2 rel=coord-rayPos; vec2 tiltedCoord=vec2(rel.x*cs-rel.y*sn,rel.x*sn+rel.y*cs)+rayPos; float halfSpread=uSideSpread*0.275; vec2 rayRefDir1=normalize(vec2(cos(0.785398+halfSpread),sin(0.785398+halfSpread))); vec2 rayRefDir2=normalize(vec2(cos(0.785398-halfSpread),sin(0.785398-halfSpread))); vec4 rays1=vec4(uSideRayColor1,1.0)*rayStrength(rayPos,rayRefDir1,tiltedCoord,36.2214,21.11349,uSideSpeed); vec4 rays2=vec4(uSideRayColor2,1.0)*rayStrength(rayPos,rayRefDir2,tiltedCoord,22.3991,18.0234,uSideSpeed*0.2); vec4 color=rays1*(1.0-uSideBlend)*0.9+rays2*uSideBlend*0.9; float distanceToLight=length(fragCoord.xy-vec2(rayPos.x,uResolution.y-rayPos.y))/uResolution.y; float brightness=uSideIntensity*0.4/pow(max(distanceToLight,0.001),uSideFalloff); color.rgb*=brightness; float gray=dot(color.rgb,vec3(0.299,0.587,0.114)); color.rgb=mix(vec3(gray),color.rgb,uSideSaturation); color.a=clamp(max(color.r,max(color.g,color.b))*uSideOpacity,0.0,1.0); finalColor=color*uA; }`;\n\n// Source attribution: reactbits-light-pillar-standalone.html, MIT + Commons\n// Clause License Condition v1.0. The original raymarch is retained under Pixi.\nconst LIGHT_PILLAR_FRAGMENT = `\nin vec2 vTextureCoord; in vec2 vSurfaceCoord; out vec4 finalColor;\n${COMMON_UNIFORMS}\nuniform vec3 uPillarTopColor; uniform vec3 uPillarBottomColor; uniform float uPillarIntensity; uniform float uPillarGlowAmount; uniform float uPillarWidth; uniform float uPillarHeight; uniform float uPillarNoiseIntensity; uniform float uPillarRotation; uniform float uPillarWaveRotation; uniform float uPillarTimeScale; uniform float uPillarRotationSpeed;\nconst float STEP_MULT=1.0; const int MAX_ITER=80; const int WAVE_ITER=4;\nvec3 tanhApprox(vec3 x) { vec3 e2x=exp(clamp(2.0*x,-20.0,20.0)); return (e2x-1.0)/(e2x+1.0); }\nvoid main() { float time=uTime*uPillarTimeScale; vec2 fragCoord=vec2(vSurfaceCoord.x,1.0-vSurfaceCoord.y)*uResolution; vec2 uv=(fragCoord/uResolution.y)*2.0-vec2(uResolution.x/uResolution.y,1.0); float pillarCos=cos(uPillarRotation),pillarSin=sin(uPillarRotation); uv=vec2(pillarCos*uv.x-pillarSin*uv.y,pillarSin*uv.x+pillarCos*uv.y); vec3 rayOrigin=vec3(0.0,0.0,-10.0); vec3 rayDirection=normalize(vec3(uv,1.0)); vec3 color=vec3(0.0); float travel=0.1; float rotCos=cos(uTime*uPillarRotationSpeed),rotSin=sin(uTime*uPillarRotationSpeed); float waveSin=sin(uPillarWaveRotation),waveCos=cos(uPillarWaveRotation); for(int i=0;i<MAX_ITER;i++) { vec3 point=rayOrigin+rayDirection*travel; point.xz=vec2(rotCos*point.x-rotSin*point.z,rotSin*point.x+rotCos*point.z); vec3 fieldPoint=point; fieldPoint.y=point.y*uPillarHeight+time; float frequency=1.0,amplitude=1.0; for(int j=0;j<WAVE_ITER;j++) { fieldPoint.xz=vec2(waveCos*fieldPoint.x-waveSin*fieldPoint.z,waveSin*fieldPoint.x+waveCos*fieldPoint.z); fieldPoint+=cos(fieldPoint.zxy*frequency-time*float(j)*2.0)*amplitude; frequency*=2.0; amplitude*=0.5; } float distanceField=length(cos(fieldPoint.xz))-0.2; float cylinderBound=length(point.xz)-uPillarWidth; float smoothness=4.0; float blend=max(smoothness-abs(distanceField-cylinderBound),0.0); distanceField=max(distanceField,cylinderBound)+blend*blend*0.0625/smoothness; distanceField=abs(distanceField)*0.15+0.01; float verticalGradient=clamp((15.0-point.y)/30.0,0.0,1.0); color+=mix(uPillarBottomColor,uPillarTopColor,verticalGradient)/distanceField; travel+=distanceField*STEP_MULT; if(travel>50.0) break; } float normalizedWidth=max(uPillarWidth/3.0,0.0001); color=tanhApprox(color*uPillarGlowAmount/normalizedWidth); float randomValue=fract(sin(dot(fragCoord.xy,vec2(12.9898,78.233)))*43758.5453); color-=randomValue/15.0*uPillarNoiseIntensity; vec3 outputColor=max(color*uPillarIntensity*uIntensity,0.0); finalColor=vec4(outputColor,clamp(max(outputColor.r,max(outputColor.g,outputColor.b)),0.0,1.0))*uA; }`;\n\n// Source attribution: reactbits-galaxy-standalone.html, MIT + Commons Clause\n// License Condition v1.0. The original layered star field runs under Pixi.\nconst GALAXY_FRAGMENT = `\nin vec2 vTextureCoord; in vec2 vSurfaceCoord; out vec4 finalColor;\n${COMMON_UNIFORMS}\nuniform vec2 uGalaxyFocal; uniform vec2 uGalaxyRotation; uniform float uGalaxyStarSpeed; uniform float uGalaxyDensity; uniform float uGalaxyHueShift; uniform float uGalaxySpeed; uniform float uGalaxyGlowIntensity; uniform float uGalaxySaturation; uniform float uGalaxyTwinkleIntensity; uniform float uGalaxyRotationSpeed; uniform float uGalaxyAutoCenterRepulsion;\n#define NUM_LAYER 4.0\n#define STAR_COLOR_CUTOFF 0.2\n#define MAT45 mat2(0.7071,-0.7071,0.7071,0.7071)\n#define PERIOD 3.0\nfloat hash21(vec2 p) { p=fract(p*vec2(123.34,456.21)); p+=dot(p,p+45.32); return fract(p.x*p.y); }\nfloat tri(float x) { return abs(fract(x)*2.0-1.0); }\nfloat tris(float x) { float t=fract(x); return 1.0-smoothstep(0.0,1.0,abs(2.0*t-1.0)); }\nfloat trisn(float x) { return 2.0*(1.0-smoothstep(0.0,1.0,abs(2.0*fract(x)-1.0)))-1.0; }\nvec3 hsv2rgb(vec3 c) { vec4 k=vec4(1.0,2.0/3.0,1.0/3.0,3.0); vec3 p=abs(fract(c.xxx+k.xyz)*6.0-k.www); return c.z*mix(k.xxx,clamp(p-k.xxx,0.0,1.0),c.y); }\nfloat star(vec2 uv,float flare) { float d=max(length(uv),0.0001); float m=(0.05*uGalaxyGlowIntensity)/d; float rays=smoothstep(0.0,1.0,1.0-abs(uv.x*uv.y*1000.0)); m+=rays*flare*uGalaxyGlowIntensity; uv*=MAT45; rays=smoothstep(0.0,1.0,1.0-abs(uv.x*uv.y*1000.0)); m+=rays*0.3*flare*uGalaxyGlowIntensity; return m*smoothstep(1.0,0.2,d); }\nvec3 starLayer(vec2 uv) { vec3 col=vec3(0.0); vec2 gv=fract(uv)-0.5; vec2 id=floor(uv); for(int y=-1;y<=1;y++) { for(int x=-1;x<=1;x++) { vec2 offset=vec2(float(x),float(y)); vec2 si=id+offset; float seed=hash21(si); float size=fract(seed*345.32); float flareSize=smoothstep(0.9,1.0,size)*tri((uTime*uGalaxyStarSpeed/10.0)/(PERIOD*seed+1.0)); float red=smoothstep(STAR_COLOR_CUTOFF,1.0,hash21(si+1.0))+STAR_COLOR_CUTOFF; float blu=smoothstep(STAR_COLOR_CUTOFF,1.0,hash21(si+3.0))+STAR_COLOR_CUTOFF; float grn=min(red,blu)*seed; vec3 base=vec3(red,grn,blu); float hue=atan(base.g-base.r,base.b-base.r)/(2.0*3.14159)+0.5; hue=fract(hue+uGalaxyHueShift/360.0); float sat=length(base-vec3(dot(base,vec3(0.299,0.587,0.114))))*uGalaxySaturation; base=hsv2rgb(vec3(hue,sat,max(max(base.r,base.g),base.b))); vec2 pad=vec2(tris(seed*34.0+uTime*uGalaxySpeed/10.0),tris(seed*38.0+uTime*uGalaxySpeed/30.0))-0.5; float twinkle=mix(1.0,trisn(uTime*uGalaxySpeed+seed*6.2831)*0.5+1.0,uGalaxyTwinkleIntensity); col+=star(gv-offset-pad,flareSize)*twinkle*size*base; } } return col; }\nvoid main() { vec2 uv=(vSurfaceCoord*uResolution-uGalaxyFocal*uResolution)/uResolution.y; float centerDist=length(uv); vec2 direction=centerDist>0.0001?normalize(uv):vec2(0.0); uv+=direction*(uGalaxyAutoCenterRepulsion/(centerDist+0.1))*0.05; float rotation=uTime*uGalaxyRotationSpeed; uv=mat2(cos(rotation),-sin(rotation),sin(rotation),cos(rotation))*uv; uv=mat2(uGalaxyRotation.x,-uGalaxyRotation.y,uGalaxyRotation.y,uGalaxyRotation.x)*uv; vec3 col=vec3(0.0); for(float i=0.0;i<1.0;i+=1.0/NUM_LAYER) { float depth=fract(i+uTime*uGalaxyStarSpeed/10.0); col+=starLayer(uv*mix(20.0*uGalaxyDensity,0.5*uGalaxyDensity,depth)+i*453.32)*depth*smoothstep(1.0,0.9,depth); } col*=uIntensity; finalColor=vec4(col,1.0)*uA; }`;\n\n// Source attribution: reactbits-prismatic-burst-standalone.html, MIT +\n// Commons Clause License Condition v1.0. The three-stop gradient is sampled\n// from the same theme values to keep the effect inside the Pixi renderer.\nconst PRISMATIC_BURST_FRAGMENT = `\nin vec2 vTextureCoord; in vec2 vSurfaceCoord; out vec4 finalColor;\n${COMMON_UNIFORMS}\nuniform float uPrismaticIntensity; uniform float uPrismaticSpeed; uniform float uPrismaticAnimationType; uniform float uPrismaticDistort; uniform vec2 uPrismaticOffset; uniform float uPrismaticNoiseAmount; uniform float uPrismaticRayCount; uniform vec3 uPrismaticColor1; uniform vec3 uPrismaticColor2; uniform vec3 uPrismaticColor3;\nfloat hash21(vec2 p){p=floor(p);return fract(52.9829189*fract(dot(p,vec2(0.065,0.005))));} mat2 rot30(){return mat2(0.8,-0.5,0.5,0.8);} float layeredNoise(vec2 fragPx){vec2 p=mod(fragPx+vec2(uTime*30.0,-uTime*21.0),1024.0);vec2 q=rot30()*p;return 0.40*hash21(q)+0.25*hash21(q*2.0+17.0)+0.20*hash21(q*4.0+47.0)+0.10*hash21(q*8.0+113.0)+0.05*hash21(q*16.0+191.0);} vec3 rayDir(vec2 frag,vec2 res,vec2 offset,float dist){float focal=res.y*max(dist,1e-3);return normalize(vec3(2.0*(frag-offset)-res,focal));} float edgeFade(vec2 frag,vec2 res,vec2 offset){vec2 toC=frag-0.5*res-offset;float r=length(toC)/(0.5*min(res.x,res.y));float x=clamp(r,0.0,1.0);float q=x*x*x*(x*(x*6.0-15.0)+10.0);float s=pow(q*0.5,1.5);float tail=1.0-pow(1.0-s,2.0);s=mix(s,tail,0.2);return clamp(s+(layeredNoise(frag*0.15)-0.5)*0.0015*s,0.0,1.0);} mat3 rotX(float a){float c=cos(a),s=sin(a);return mat3(1.,0.,0.,0.,c,-s,0.,s,c);} mat3 rotY(float a){float c=cos(a),s=sin(a);return mat3(c,0.,s,0.,1.,0.,-s,0.,c);} mat3 rotZ(float a){float c=cos(a),s=sin(a);return mat3(c,-s,0.,s,c,0.,0.,0.,1.);} vec2 rot2(vec2 v,float a){float s=sin(a),c=cos(a);return mat2(c,-s,s,c)*v;} float bendAngle(vec3 q,float t){return 0.8*sin(q.x*0.55+t*0.6)+0.7*sin(q.y*0.50-t*0.5)+0.6*sin(q.z*0.60+t*0.7);} vec3 sampleGradient(float t){return t<0.5?mix(uPrismaticColor1,uPrismaticColor2,t*2.0):mix(uPrismaticColor2,uPrismaticColor3,(t-0.5)*2.0);}\nvoid main(){vec2 frag=vec2(vSurfaceCoord.x,1.0-vSurfaceCoord.y)*uResolution;float t=uTime*uPrismaticSpeed;float jitterAmp=0.1*clamp(uPrismaticNoiseAmount,0.0,1.0);vec3 dir=rayDir(frag,uResolution,uPrismaticOffset,1.0);float marchT=0.0;vec3 col=vec3(0.0);float n=layeredNoise(frag);vec4 c=cos(t*0.2+vec4(0.0,33.0,11.0,0.0));mat2 M2=mat2(c.x,c.y,c.z,c.w);float amp=clamp(uPrismaticDistort,0.0,50.0)*0.15;mat3 rot3dMat=mat3(1.0);if(uPrismaticAnimationType==1.0){vec3 ang=vec3(t*0.31,t*0.21,t*0.17);rot3dMat=rotZ(ang.z)*rotY(ang.y)*rotX(ang.x);}for(int i=0;i<44;++i){vec3 P=marchT*dir;P.z-=2.0;float rad=length(P);vec3 Pl=P*(10.0/max(rad,1e-6));if(uPrismaticAnimationType==0.0)Pl.xz*=M2;else if(uPrismaticAnimationType==1.0)Pl=rot3dMat*Pl;float stepLen=min(rad-0.3,n*jitterAmp)+0.1;float grow=smoothstep(0.35,3.0,marchT);float a1=amp*grow*bendAngle(Pl*0.6,t);float a2=0.5*amp*grow*bendAngle(Pl.zyx*0.5+3.1,t*0.9);vec3 Pb=Pl;Pb.xz=rot2(Pb.xz,a1);Pb.xy=rot2(Pb.xy,a2);float rayPattern=smoothstep(0.5,0.7,sin(Pb.x+cos(Pb.y)*cos(Pb.z))*sin(Pb.z+sin(Pb.y)*cos(Pb.x+t)));if(uPrismaticRayCount>0.0){float ang=atan(Pb.y,Pb.x);float comb=0.5+0.5*cos(uPrismaticRayCount*ang);rayPattern*=smoothstep(0.15,0.95,pow(comb,3.0));}float saw=fract(marchT*0.25);float tRay=saw*saw*(3.0-2.0*saw);col+=(0.05/(0.4+stepLen))*smoothstep(5.0,0.0,rad)*2.0*sampleGradient(tRay)*rayPattern;marchT+=stepLen;}vec3 outputColor=clamp(col*edgeFade(frag,uResolution,uPrismaticOffset)*uPrismaticIntensity*uIntensity,0.0,1.0);finalColor=vec4(outputColor,clamp(max(outputColor.r,max(outputColor.g,outputColor.b)),0.0,1.0))*uA;}`;\n\n// Source attribution: Arcane Veil's existing field-effect GLSL. Its raymarch\n// is unchanged; Pixi provides the filter coordinates, clock and resource life.\nconst ARCANE_VEIL_FRAGMENT = `\nin vec2 vTextureCoord; out vec4 finalColor;\n${COMMON_UNIFORMS}\nuniform vec3 uArcaneColor; uniform float uArcaneSpeed; uniform float uArcaneScale; uniform float uArcaneOpacity; uniform float uArcaneQuality;\nvec3 tanhApprox(vec3 x){vec3 e2x=exp(clamp(2.0*x,-20.0,20.0));return (e2x-1.0)/(e2x+1.0);}\nvoid main(){vec2 fragCoord=vec2(vTextureCoord.x,1.0-vTextureCoord.y)*uResolution;vec2 center=uResolution*0.5;vec2 C=(fragCoord-center)/uArcaneScale+center;float z=0.0;vec3 O=vec3(0.0);vec3 p;vec3 S;vec4 o;float d;float T=uTime*uArcaneSpeed;for(int i=0;i<60;i++){p=z*normalize(vec3(C-0.5*uResolution,uResolution.y));p.z-=4.0;S=p;d=p.y-T;p.x+=0.4*(1.0+p.y)*sin(d+p.x*0.1)*cos(0.34*d+p.x*0.05);p.xz=p.xz*mat2(cos(p.y+vec4(0.0,11.0,33.0,0.0)-T));z+=d=(abs(sqrt(length(p.xz*p.xz))-0.25*(5.0+S.y))/3.0+8e-4);o=1.0+sin(S.y+p.z*0.5+S.z-length(S-p)+vec4(2.0,1.0,0.0,8.0));O+=o.w/d*o.xyz;if(float(i)>=uArcaneQuality)break;}vec3 rgb=tanhApprox(O/1e4);float intensity=(rgb.r+rgb.g+rgb.b)/3.0;finalColor=vec4(intensity*uArcaneColor*uIntensity,length(rgb)*uArcaneOpacity*uIntensity)*uA;}`;\n\n// Replaces the legacy DOM RainCurtain with a single Pixi-owned procedural\n// layer. Three depth bands preserve the prior direction, density and haze.\nconst HEAVY_RAIN_FRAGMENT = `\nin vec2 vTextureCoord; out vec4 finalColor;\n${COMMON_UNIFORMS}\nuniform vec3 uRainColor; uniform float uRainDensity; uniform float uRainSpeed; uniform float uRainHazeOpacity; uniform float uRainSlant;\nfloat hash21(vec2 p){return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453123);} float rainBand(vec2 uv,float scale,float speed,float width){vec2 cell=uv*vec2(uRainDensity*scale,18.0*scale);vec2 id=floor(cell);float seed=hash21(id);vec2 f=fract(cell);f.y=fract(f.y-uTime*uRainSpeed*speed-seed);float x=abs(f.x-0.5-(f.y-0.5)*uRainSlant);float streak=(1.0-smoothstep(width,width*2.2,x))*smoothstep(0.0,0.16,f.y)*(1.0-smoothstep(0.60,1.0,f.y));return streak*(0.35+0.65*seed);} void main(){vec2 uv=vec2(vTextureCoord.x,1.0-vTextureCoord.y);float far=rainBand(uv,0.55,0.48,0.040);float mid=rainBand(uv+vec2(0.213,0.0),0.84,0.70,0.030);float near=rainBand(uv+vec2(0.517,0.0),1.28,1.02,0.020);float rain=far*0.35+mid*0.65+near;float hazePulse=.88+.12*sin(uTime*6.283185/2.4);float haze=(0.22+0.78*uv.y)*uRainHazeOpacity*hazePulse;float alpha=clamp(rain*0.82+haze,0.0,0.86)*uIntensity;finalColor=vec4(uRainColor*(rain+haze*0.55),alpha)*uA;}`;\n\nconst FIELD_SURFACE_UNIFORMS = `${COMMON_UNIFORMS}\nuniform vec3 uFieldColor1; uniform vec3 uFieldColor2; uniform vec3 uFieldColor3;\nuniform float uFieldDensity; uniform float uFieldSpeed; uniform float uFieldOpacity;`;\n\n// Field filters replace the legacy DOM effect modules. They use no isolated\n// animation clock or canvas; their motion is advanced only by PixiShaderRuntime.\nconst FIRE_FRAGMENT = `\nin vec2 vTextureCoord; out vec4 finalColor; ${FIELD_SURFACE_UNIFORMS}\nuniform vec3 uFireSmokeColor; uniform float uFireSmokeOpacity; uniform float uFirelightIntensity;\nfloat hash21(vec2 p){return fract(sin(dot(p,vec2(41.23,289.17)))*43758.5453);} float noise(vec2 p){vec2 i=floor(p),f=fract(p);f=f*f*(3.0-2.0*f);return mix(mix(hash21(i),hash21(i+vec2(1,0)),f.x),mix(hash21(i+vec2(0,1)),hash21(i+vec2(1,1)),f.x),f.y);} float fbm(vec2 p){float n=0.0,a=.5;for(int i=0;i<4;i++){n+=a*noise(p);p=p*2.03+17.0;a*=.5;}return n;} void main(){vec2 uv=vec2(vTextureCoord.x,1.0-vTextureCoord.y);float t=uTime*uFieldSpeed;float turbulence=fbm(vec2(uv.x*5.0-t*.18,uv.y*3.2-t*.45));float flame=pow(max(0.0,1.0-uv.y*1.42+.22*(turbulence-.5)+.12*sin(uv.x*21.0+t*2.8)),2.15);float smoke=fbm(vec2(uv.x*3.6+t*.08,uv.y*2.4-t*.18))*smoothstep(.08,.84,uv.y)*(1.0-smoothstep(.78,1.0,uv.y));float firelight=(1.0-uv.y)*uFirelightIntensity*(.75+.25*sin(t*2.1+uv.x*10.0));vec3 col=mix(uFieldColor2,uFieldColor3,smoothstep(0.0,.62,flame))*flame+uFireSmokeColor*smoke*uFireSmokeOpacity+uFieldColor3*firelight;float alpha=clamp(flame*.82+smoke*uFireSmokeOpacity*.8+firelight,0.0,.94)*uFieldOpacity*uIntensity;finalColor=vec4(col,alpha)*uA;}`;\n\nconst DENSE_FOG_FRAGMENT = `\nin vec2 vTextureCoord; out vec4 finalColor; ${FIELD_SURFACE_UNIFORMS}\nfloat hash21(vec2 p){return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453);} float noise(vec2 p){vec2 i=floor(p),f=fract(p);f=f*f*(3.0-2.0*f);return mix(mix(hash21(i),hash21(i+vec2(1,0)),f.x),mix(hash21(i+vec2(0,1)),hash21(i+vec2(1,1)),f.x),f.y);} float fbm(vec2 p){float n=0.0,a=.5;for(int i=0;i<4;i++){n+=a*noise(p);p=p*2.03+17.0;a*=.5;}return n;} void main(){vec2 uv=vec2(vTextureCoord.x,1.0-vTextureCoord.y);float t=uTime*uFieldSpeed;float near=fbm(uv*uFieldDensity+vec2(t,-t*.18));float far=fbm(uv*uFieldDensity*.58+vec2(-t*.62,t*.08));float fog=smoothstep(.32,.84,near*.65+far*.55)*(0.52+0.48*uv.y);vec3 col=mix(uFieldColor2,uFieldColor1,near)*fog+uFieldColor3*far*.10;finalColor=vec4(col,clamp(fog*uFieldOpacity*uIntensity,0.0,.82))*uA;}`;\n\nconst DARK_FRAGMENT = `\nin vec2 vTextureCoord; out vec4 finalColor; ${FIELD_SURFACE_UNIFORMS}\nvoid main(){float breath=.5+.5*sin(uTime*uFieldSpeed*6.283185);float alpha=mix(uFieldOpacity,uFieldOpacity*.94,breath)*uIntensity;finalColor=vec4(uFieldColor1,alpha)*uA;}`;\n\nconst THUNDERSTORM_FRAGMENT = `\nin vec2 vTextureCoord; out vec4 finalColor; ${FIELD_SURFACE_UNIFORMS}\nfloat hash21(vec2 p){return fract(sin(dot(p,vec2(157.3,71.9)))*43758.5453);}\nfloat strikeEnvelope(float localTime){float attack=smoothstep(0.0,.025,localTime);float release=1.0-smoothstep(.025,.43,localTime);return attack*release;}\nfloat boltPath(vec2 uv,float seed,float origin){float branch=sin(uv.y*(11.0+seed*5.0)+seed*19.0)*.075+sin(uv.y*31.0+seed*7.0)*.025;float center=origin+branch*(1.0-uv.y*.28);float core=1.0-smoothstep(.0025,.010,abs(uv.x-center));float glow=1.0-smoothstep(.012,.052,abs(uv.x-center));return core+glow*.45;}\nvoid main(){vec2 uv=vec2(vTextureCoord.x,1.0-vTextureCoord.y);float rainTime=uTime*uFieldSpeed;vec2 cell=uv*vec2(uFieldDensity,22.0);vec2 f=fract(cell);f.y=fract(f.y-rainTime-hash21(floor(cell)));float streak=(1.0-smoothstep(.018,.055,abs(f.x-.5-(f.y-.5)*.30)))*smoothstep(0.0,.10,f.y)*(1.0-smoothstep(.58,1.0,f.y));float firstDelay=.8+hash21(vec2(13.0,7.0));float first=strikeEnvelope(uTime-firstDelay);float later=max(0.0,uTime-firstDelay-.43);float strikeIndex=floor(later/12.5);float local=mod(later,12.5);float recurring=step(firstDelay+.43,uTime)*strikeEnvelope(local);float pulse=max(first,recurring);float seed=hash21(vec2(strikeIndex+31.0,17.0));float path1=boltPath(uv,seed,.16+seed*.30);float path2=boltPath(uv,seed+.37,.52+seed*.28)*step(.55,seed);float path3=boltPath(uv,seed+.61,.20+seed*.24);float path4=boltPath(uv,seed+.83,.58+seed*.22)*step(.55,seed);float pair=mod(strikeIndex,2.0);float bolt=mix(path1+path2,path3+path4,pair)*pulse;float flash=pulse*(.12+.18*uFieldOpacity);vec3 col=uFieldColor1*streak+uFieldColor2*(bolt+flash)+uFieldColor3*.10;finalColor=vec4(col,clamp(streak*.74+bolt+flash,0.0,.94)*uIntensity)*uA;}`;\n\nconst EARTHQUAKE_FRAGMENT = `\nin vec2 vTextureCoord; out vec4 finalColor; ${FIELD_SURFACE_UNIFORMS}\nfloat hash21(vec2 p){return fract(sin(dot(p,vec2(19.17,241.31)))*43758.5453);} void main(){vec2 uv=vec2(vTextureCoord.x,1.0-vTextureCoord.y);float t=uTime*uFieldSpeed;vec2 cell=uv*vec2(uFieldDensity,11.0);float grain=step(.90,hash21(floor(cell)+floor(vec2(t*1.6,-t*.4))))*(1.0-uv.y);float dust=smoothstep(.76,.04,uv.y)*(.28+.72*hash21(floor(uv*vec2(14.0,7.0)+t)));vec3 col=mix(uFieldColor2,uFieldColor3,grain)*grain+uFieldColor1*dust;finalColor=vec4(col,clamp(grain*.62+dust*.34,0.0,.64)*uFieldOpacity*uIntensity)*uA;}`;\n\n// Source attribution: reactbits-strands-standalone.html, MIT + Commons Clause License Condition v1.0.\nconst TEAM_CHECK_STRANDS_FRAGMENT = `\nin vec2 vTextureCoord; in vec2 vSurfaceCoord; out vec4 finalColor;\n${COMMON_UNIFORMS}\nuniform float uTeamCount; uniform float uTeamSpeed; uniform float uTeamAmplitude; uniform float uTeamWaviness; uniform float uTeamThickness; uniform float uTeamGlow; uniform float uTeamTaper; uniform float uTeamSpread; uniform float uTeamHueShift; uniform float uTeamOpacity; uniform float uTeamScale; uniform float uTeamSaturation; uniform vec3 uTeamColor1; uniform vec3 uTeamColor2; uniform vec3 uTeamColor3;\nconst float PI = 3.14159265;\nvec3 palette(float t) { t=fract(t)*3.0; return t<1.0?mix(uTeamColor1,uTeamColor2,t):t<2.0?mix(uTeamColor2,uTeamColor3,t-1.0):mix(uTeamColor3,uTeamColor1,t-2.0); }\nvoid main() { vec2 uv=(vec2(vSurfaceCoord.x,1.0-vSurfaceCoord.y)-0.5)*vec2(uResolution.x/max(uResolution.y,1.0),1.0); uv/=max(uTeamScale,0.0001); float e=0.06+uIntensity*0.94; float env=pow(max(cos(uv.x*PI*1.3),0.0),uTeamTaper); vec3 col=vec3(0.0); for(int i=0;i<12;i++){ if(float(i)>=uTeamCount) break; float fi=float(i); float ph=fi*1.7*uTeamSpread; float freq=(2.0+fi*0.35)*uTeamWaviness; float tt=uTime*uTeamSpeed; float w=sin(uv.x*freq+tt*(1.4+fi*1.2)+ph)*0.60+sin(uv.x*freq*1.1-tt*(1.4+fi*1.2)*0.7+ph*1.7)*0.40; float amp=(0.1+0.02*e)*env*uTeamAmplitude; float d=abs(uv.y-w*amp); float thick=(0.001+0.05*e)*(0.35+env)*uTeamThickness; float glow=thick/(d+thick*0.45); glow*=glow; col+=palette(fi/uTeamCount+uv.x*0.30+uTime*0.04+uTeamHueShift)*glow*env; } col*=0.45+0.7*e; col=1.0-exp(-col*uTeamGlow); float gray=dot(col,vec3(0.2126,0.7152,0.0722)); col=max(mix(vec3(gray),col,uTeamSaturation),0.0); float alpha=clamp(max(max(col.r,col.g),col.b),0.0,1.0)*uTeamOpacity; finalColor=vec4(col*uTeamOpacity,alpha)*uA; }`;\n\nconst createCommonUniformEntries = (\n effectId: PixiShaderEffectId,\n intensity: number,\n resolution: Float32Array,\n): PixiShaderUniformEntries => {\n const config = { mode: PIXI_SHADER_METADATA[effectId].mode, intensity: 1, rate: 1 };\n return {\n uTime: { value: 0, type: 'f32' },\n uResolution: { value: resolution, type: 'vec2<f32>' },\n uIntensity: { value: config.intensity * intensity, type: 'f32' },\n uMode: { value: config.mode, type: 'f32' },\n uRate: { value: config.rate, type: 'f32' },\n uA: { value: 1, type: 'f32' },\n };\n};\n\nconst resolveShaderFragment = (effectId: PixiShaderEffectId): string => {\n switch (effectId) {\n case 'galaxy':\n return GALAXY_FRAGMENT;\n case 'prismaticBurst':\n return PRISMATIC_BURST_FRAGMENT;\n case 'arcaneVeil':\n return ARCANE_VEIL_FRAGMENT;\n case 'heavyRain':\n return HEAVY_RAIN_FRAGMENT;\n case 'fire':\n return FIRE_FRAGMENT;\n case 'denseFog':\n return DENSE_FOG_FRAGMENT;\n case 'dark':\n return DARK_FRAGMENT;\n case 'thunderstorm':\n return THUNDERSTORM_FRAGMENT;\n case 'earthquake':\n return EARTHQUAKE_FRAGMENT;\n case 'lineWaves':\n return LINE_WAVES_FRAGMENT;\n case 'teamCheckStrands':\n return TEAM_CHECK_STRANDS_FRAGMENT;\n case 'lightning':\n return LIGHTNING_FRAGMENT;\n case 'sideRays':\n return SIDE_RAYS_FRAGMENT;\n case 'lightPillar':\n return LIGHT_PILLAR_FRAGMENT;\n }\n};\n\nexport class PixiShaderRuntime {\n private readonly surfaces = new Set<ManagedSurface>();\n private readonly stageBounds: Rectangle;\n private readonly stageResolution = new Float32Array([1920, 1080]);\n private paused = false;\n private playbackRate = 1;\n private reducedMotion = false;\n private elapsed = 0;\n\n constructor(\n private readonly constructors: PixiShaderRuntimeConstructors,\n ticker: Ticker,\n private readonly activity: PixiAnimationActivity,\n private readonly uniformsFor: (effect: PixiShaderEffectId) => PixiShaderUniformEntries,\n private readonly stageSize: { width: number; height: number } = { width: 1920, height: 1080 },\n ) {\n this.stageBounds = new constructors.Rectangle(0, 0, stageSize.width, stageSize.height);\n this.stageResolution.set([stageSize.width, stageSize.height]);\n ticker.add(this.tick);\n this.ticker = ticker;\n }\n\n private readonly ticker: Ticker;\n\n create(\n effectId: PixiShaderEffectId,\n intensity = 1,\n uniformOverrides: PixiShaderUniformEntries = {},\n ): Sprite {\n const definition = PIXI_SHADER_REGISTRY[effectId];\n const entries = {\n ...createCommonUniformEntries(effectId, intensity, this.stageResolution),\n ...this.uniformsFor(effectId),\n ...uniformOverrides,\n };\n for (const [name, entry] of Object.entries(entries)) {\n const expectedLength = entry.type === 'f32' ? 1 : entry.type === 'vec2<f32>' ? 2 : 3;\n const values = typeof entry.value === 'number' ? [entry.value] : [...entry.value];\n if (\n !name.startsWith('u') ||\n values.length !== expectedLength ||\n values.some((value) => !Number.isFinite(value))\n ) {\n throw new Error(`Invalid shader uniform: ${name}`);\n }\n }\n for (const match of definition\n .fragment()\n .matchAll(/uniform\\s+(float|vec2|vec3)\\s+(u\\w+)\\s*;/g)) {\n if (!(match[2] in entries))\n throw new Error(`Missing shader uniform: ${effectId}.${match[2]}`);\n }\n const group = new this.constructors.UniformGroup(entries);\n const filter = this.constructors.Filter.from({\n gl: {\n vertex: FILTER_VERTEX,\n fragment: definition.fragment(),\n name: `session-display-${effectId}`,\n },\n resources: { effectUniforms: group },\n resolution: definition.resolution,\n });\n const sprite = new this.constructors.Sprite(this.constructors.Texture.WHITE);\n sprite.label = `session-display-${effectId}`;\n sprite.eventMode = 'none';\n sprite.width = this.stageSize.width;\n sprite.height = this.stageSize.height;\n sprite.visible = !this.reducedMotion || definition.reducedMotion !== 'disabled';\n sprite.filters = [filter];\n sprite.filterArea = this.stageBounds;\n const onDestroyed = () => this.release(sprite);\n sprite.once('destroyed', onDestroyed);\n this.surfaces.add({\n effectId,\n sprite,\n filter,\n uniforms: group,\n releaseTicker: this.activity.acquire(`shader:${effectId}`),\n onDestroyed,\n suspended: false,\n });\n return sprite;\n }\n\n release(sprite: Sprite): void {\n for (const surface of this.surfaces) {\n if (surface.sprite !== sprite) continue;\n this.surfaces.delete(surface);\n sprite.off('destroyed', surface.onDestroyed);\n surface.releaseTicker();\n PIXI_SHADER_REGISTRY[surface.effectId].release(surface);\n return;\n }\n }\n\n setPaused(paused: boolean): void {\n this.paused = paused;\n }\n\n setPlaybackRate(rate: number): void {\n this.playbackRate = Math.max(0.1, Math.min(2, rate));\n }\n\n setReducedMotion(reducedMotion: boolean): void {\n this.reducedMotion = reducedMotion;\n for (const surface of this.surfaces) {\n surface.sprite.visible =\n !reducedMotion || PIXI_SHADER_REGISTRY[surface.effectId].reducedMotion !== 'disabled';\n }\n }\n\n resize(): void {\n // Shader surfaces share the fixed logical stage with the scene graph.\n // PixiViewportController maps that stage to the physical viewport.\n for (const surface of this.surfaces) {\n surface.sprite.x = 0;\n surface.sprite.y = 0;\n surface.sprite.width = this.stageSize.width;\n surface.sprite.height = this.stageSize.height;\n surface.sprite.filterArea = this.stageBounds;\n }\n }\n\n setSuspended(sprite: Sprite, suspended: boolean): void {\n for (const surface of this.surfaces) {\n if (surface.sprite === sprite) surface.suspended = suspended;\n }\n }\n\n destroy(): void {\n this.ticker.remove(this.tick);\n for (const surface of [...this.surfaces]) this.release(surface.sprite);\n }\n\n private tick = (ticker: { deltaMS: number }): void => {\n const advancesTime = !this.paused && !this.reducedMotion;\n if (advancesTime) {\n this.elapsed += (Math.max(0, Math.min(50, ticker.deltaMS)) / 1000) * this.playbackRate;\n }\n for (const surface of this.surfaces) {\n surface.uniforms.uniforms.uA = surface.sprite.getGlobalAlpha();\n if (advancesTime && !surface.suspended) {\n PIXI_SHADER_REGISTRY[surface.effectId].update(surface.uniforms, this.elapsed);\n }\n }\n };\n}\n", "import type { RuntimeLogger } from '@bardway/trpg-media';\n\nexport interface DisplayQueueItem {\n id: string;\n kind: string;\n blocking: boolean;\n run: (signal: AbortSignal) => Promise<void>;\n}\n\nexport type DisplayQueueRunResult = 'completed' | 'aborted';\n\nexport interface DisplayEventQueue {\n enqueue(item: DisplayQueueItem): Promise<DisplayQueueRunResult>;\n clear(reason: string): void;\n pause(): void;\n resume(): void;\n destroy(): void;\n getState(): DisplayEventQueueState;\n}\n\nexport interface DisplayEventQueueState {\n pending: number;\n activeBlocking: number;\n activeNonBlocking: number;\n paused: boolean;\n destroyed: boolean;\n}\n\nexport const createDisplayEventQueue = (logger: RuntimeLogger): DisplayEventQueue => {\n interface QueueEntry {\n item: DisplayQueueItem;\n settle: (result: DisplayQueueRunResult) => void;\n }\n\n let destroyed = false;\n let paused = false;\n let activeController: AbortController | null = null;\n let activeEntry: QueueEntry | null = null;\n const parallelControllers = new Map<AbortController, QueueEntry>();\n const pending: QueueEntry[] = [];\n\n const runNext = (): void => {\n if (destroyed || paused || activeController || pending.length === 0) return;\n const entry = pending.shift();\n if (!entry) return;\n const { item } = entry;\n const controller = new AbortController();\n activeController = controller;\n activeEntry = entry;\n void item\n .run(controller.signal)\n .then(() => entry.settle(controller.signal.aborted ? 'aborted' : 'completed'))\n .catch((error) => {\n entry.settle('aborted');\n if (!controller.signal.aborted) {\n logger.error('[SessionDisplayQueue] \u64AD\u653E\u4EFB\u52A1\u5931\u8D25', {\n id: item.id,\n kind: item.kind,\n error,\n });\n }\n })\n .finally(() => {\n if (activeController === controller) activeController = null;\n if (activeEntry === entry) activeEntry = null;\n runNext();\n });\n };\n\n return {\n enqueue(item) {\n return new Promise<DisplayQueueRunResult>((resolve) => {\n let settled = false;\n const entry: QueueEntry = {\n item,\n settle: (result) => {\n if (settled) return;\n settled = true;\n resolve(result);\n },\n };\n if (destroyed) {\n entry.settle('aborted');\n return;\n }\n if (!item.blocking) {\n const controller = new AbortController();\n parallelControllers.set(controller, entry);\n void item\n .run(controller.signal)\n .then(() => entry.settle(controller.signal.aborted ? 'aborted' : 'completed'))\n .catch((error) => {\n entry.settle('aborted');\n if (!controller.signal.aborted) {\n logger.error('[SessionDisplayQueue] \u5E76\u884C\u64AD\u653E\u4EFB\u52A1\u5931\u8D25', {\n id: item.id,\n kind: item.kind,\n error,\n });\n }\n })\n .finally(() => {\n parallelControllers.delete(controller);\n });\n return;\n }\n pending.push(entry);\n runNext();\n });\n },\n clear(reason) {\n pending.splice(0).forEach((entry) => entry.settle('aborted'));\n activeEntry?.settle('aborted');\n pending.length = 0;\n activeController?.abort(reason);\n activeController = null;\n activeEntry = null;\n parallelControllers.forEach((entry, controller) => {\n entry.settle('aborted');\n controller.abort(reason);\n });\n parallelControllers.clear();\n },\n pause() {\n paused = true;\n },\n resume() {\n paused = false;\n runNext();\n },\n destroy() {\n destroyed = true;\n pending.splice(0).forEach((entry) => entry.settle('aborted'));\n activeEntry?.settle('aborted');\n activeController?.abort('destroy');\n activeController = null;\n activeEntry = null;\n parallelControllers.forEach((entry, controller) => {\n entry.settle('aborted');\n controller.abort('destroy');\n });\n parallelControllers.clear();\n },\n getState() {\n return {\n pending: pending.length,\n activeBlocking: activeController ? 1 : 0,\n activeNonBlocking: parallelControllers.size,\n paused,\n destroyed,\n };\n },\n };\n};\n", "/**\n * Renderer-independent action milestones. Renderers may draw different\n * primitives, but they must advance observable battle feedback in this order.\n */\nexport const ANIMATION_MILESTONES = [\n 'start',\n 'impact',\n 'feedback',\n 'resource',\n 'return',\n 'done',\n] as const;\n\nexport type AnimationMilestone = (typeof ANIMATION_MILESTONES)[number];\n\nexport interface AnimationMilestoneEvent {\n actionId: string;\n milestone: AnimationMilestone;\n}\n\nexport type AnimationMilestoneListener = (event: AnimationMilestoneEvent) => void;\n\n/**\n * The abort check lives at the emission boundary. This prevents a killed\n * renderer timeline from reporting stale feedback after a snapshot reset or\n * session switch.\n */\nexport const emitAnimationMilestone = (\n listener: AnimationMilestoneListener | undefined,\n actionId: string,\n milestone: AnimationMilestone,\n signal: AbortSignal,\n): boolean => {\n if (signal.aborted) return false;\n listener?.({ actionId, milestone });\n return !signal.aborted;\n};\n", "import type { TextStyleOptions } from 'pixi.js';\nimport type { PixiStageTheme } from './PixiStageTheme.js';\n\nexport const createPixiTypography = (\n pixiStageTheme: PixiStageTheme,\n fonts: { body: string; data: string; display: string },\n) =>\n ({\n displayTitle: {\n fill: pixiStageTheme.palette.accent,\n fontFamily: fonts.body,\n fontSize: 48,\n fontWeight: '700',\n },\n sceneTitle: {\n fill: pixiStageTheme.palette.accent,\n fontFamily: fonts.body,\n fontSize: 36,\n fontWeight: '700',\n },\n sectionTitle: {\n fill: pixiStageTheme.palette.accent,\n fontFamily: fonts.body,\n fontSize: 30,\n fontWeight: '700',\n },\n hudPrimary: {\n fill: pixiStageTheme.palette.accent,\n fontFamily: fonts.data,\n fontSize: 20,\n fontWeight: '700',\n letterSpacing: 3,\n },\n battleRound: {\n fill: pixiStageTheme.palette.accent,\n fontFamily: fonts.data,\n fontSize: 29,\n fontWeight: '700',\n letterSpacing: 0,\n },\n battleOrder: {\n fill: pixiStageTheme.palette.accent,\n fontFamily: fonts.display,\n fontSize: 30,\n fontWeight: '700',\n letterSpacing: 0,\n },\n battleToken: {\n fill: pixiStageTheme.palette.accent,\n fontFamily: fonts.body,\n fontSize: 29,\n fontWeight: '700',\n letterSpacing: 0,\n },\n hudSecondary: {\n fill: pixiStageTheme.palette.accent,\n fontFamily: fonts.body,\n fontSize: 24,\n fontWeight: '600',\n },\n caption: {\n fill: pixiStageTheme.palette.accent,\n fontFamily: fonts.body,\n fontSize: 20,\n fontWeight: '500',\n },\n data: {\n fill: pixiStageTheme.palette.accent,\n fontFamily: fonts.data,\n fontSize: 22,\n fontWeight: '600',\n },\n damage: {\n fill: pixiStageTheme.palette.enemy,\n fontFamily: fonts.data,\n fontSize: 40,\n fontWeight: '700',\n },\n resourceDelta: {\n fill: pixiStageTheme.palette.investigator,\n fontFamily: fonts.data,\n fontSize: 28,\n fontWeight: '700',\n },\n modalTitle: {\n fill: pixiStageTheme.palette.accent,\n fontFamily: fonts.body,\n fontSize: 48,\n fontWeight: '700',\n },\n clueTitle: {\n fill: pixiStageTheme.palette.accent,\n fontFamily: fonts.body,\n fontSize: 30,\n fontWeight: '700',\n },\n }) as const satisfies Record<string, TextStyleOptions>;\n\nexport type PixiTypographyToken = keyof ReturnType<typeof createPixiTypography>;\n", "import type { Container, Graphics, Text } from 'pixi.js';\nimport type { PixiStageTheme } from '../PixiStageTheme.js';\nimport type { createPixiTypography, PixiTypographyToken } from '../PixiTypography.js';\n\nexport interface PixiStageUiConstructors {\n Container: new () => Container;\n Graphics: new () => Graphics;\n Text: new (options: import('pixi.js').TextOptions) => Text;\n}\n\nexport interface PixiStageButtonOptions {\n x: number;\n y: number;\n width: number;\n height: number;\n label: string;\n enabled: boolean;\n onActivate: () => void;\n typography?: PixiTypographyToken;\n accessibleLabel: string;\n}\n\n/** A retained, pointer-safe canvas button. Consumers update props rather than recreate listeners. */\nexport class PixiStageButton {\n readonly node: Container;\n private readonly background: Graphics;\n private readonly label: Text;\n private options: PixiStageButtonOptions;\n private pressed = false;\n\n constructor(\n constructors: PixiStageUiConstructors,\n options: PixiStageButtonOptions,\n private readonly pixiStageTheme: PixiStageTheme,\n private readonly pixiTypography: ReturnType<typeof createPixiTypography>,\n ) {\n this.options = options;\n this.node = new constructors.Container();\n this.background = new constructors.Graphics();\n this.label = new constructors.Text({ text: '', style: this.pixiTypography.hudPrimary });\n this.label.anchor.set(0.5);\n this.node.eventMode = 'static';\n this.node.cursor = 'pointer';\n this.node.accessible = true;\n this.node.accessibleTitle = options.accessibleLabel;\n this.node.accessibleHint = '\u6309 Enter \u6216\u7A7A\u683C\u542F\u7528\u3002';\n this.node.tabIndex = 0;\n this.node.on('pointerover', () => this.setHovered(true));\n this.node.on('pointerout', () => this.setHovered(false));\n this.node.on('pointerdown', () => this.setPressed(true));\n this.node.on('pointerup', () => this.setPressed(false));\n this.node.on('pointerupoutside', () => this.setPressed(false));\n this.node.on('pointertap', () => this.activate());\n this.node.addChild(this.background, this.label);\n this.update(options);\n }\n\n update(options: PixiStageButtonOptions): void {\n this.options = options;\n this.node.accessibleTitle = options.accessibleLabel;\n this.node.eventMode = options.enabled ? 'static' : 'none';\n this.node.cursor = options.enabled ? 'pointer' : 'default';\n this.node.hitArea = {\n contains: (x: number, y: number) =>\n x >= options.x &&\n x <= options.x + options.width &&\n y >= options.y &&\n y <= options.y + options.height,\n };\n this.label.text = options.label;\n this.label.style = this.pixiTypography[options.typography ?? 'hudPrimary'];\n this.label.position.set(options.x + options.width / 2, options.y + options.height / 2);\n this.redraw(false);\n }\n\n activate(): void {\n if (this.options.enabled) this.options.onActivate();\n }\n\n private setHovered(hovered: boolean): void {\n if (!this.options.enabled) return;\n this.redraw(hovered || this.pressed);\n }\n\n private setPressed(pressed: boolean): void {\n this.pressed = pressed;\n this.redraw(pressed);\n }\n\n private redraw(emphasized: boolean): void {\n const { x, y, width, height, enabled } = this.options;\n const accent = enabled\n ? this.pixiStageTheme.palette.investigator\n : this.pixiStageTheme.palette.accent;\n this.background\n .clear()\n .roundRect(x, y, width, height, this.pixiStageTheme.radius.container)\n .fill({\n color: this.pixiStageTheme.palette.surface,\n alpha: emphasized ? 1 : this.pixiStageTheme.opacity.strong,\n })\n .stroke({\n color: accent,\n width: this.pixiStageTheme.stroke.subtle,\n alpha: enabled ? 0.76 : this.pixiStageTheme.opacity.disabled,\n });\n this.node.alpha = enabled ? 1 : this.pixiStageTheme.opacity.disabled;\n }\n}\n\nexport const createPixiStageLabel = (\n constructors: Pick<PixiStageUiConstructors, 'Text'>,\n text: string,\n typography: PixiTypographyToken,\n pixiTypography: ReturnType<typeof createPixiTypography>,\n): Text => new constructors.Text({ text, style: pixiTypography[typography] });\n", "import type { Graphics } from 'pixi.js';\nexport interface BattleFxColors {\n recover: string;\n electric: string;\n damage: string;\n cinematic: string;\n}\n\nexport const BATTLE_FX_PRIMITIVES = [\n 'cameraFocus',\n 'cameraShake',\n 'tracer',\n 'muzzleFlash',\n 'electricArc',\n 'lungeMotion',\n 'motionTrail',\n 'dodgeOffset',\n 'knockback',\n 'impactFlash',\n 'bloodBurst',\n 'explosionBurst',\n 'resourceFloat',\n 'healAura',\n 'tokenShake',\n 'tokenShatter',\n 'statusStamp',\n 'insanityGlitch',\n 'speedLines',\n 'focusVignette',\n] as const;\n\nexport type BattleFxPrimitive = (typeof BATTLE_FX_PRIMITIVES)[number];\n\n/** Graphics graybox renderer. Formal textures can replace this renderer without changing planners. */\nexport class BattleFxLibrary {\n constructor(\n private readonly GraphicsConstructor: typeof Graphics,\n private readonly colors: BattleFxColors,\n ) {}\n\n create(kind: BattleFxPrimitive): Graphics {\n const color =\n kind.includes('heal') || kind === 'resourceFloat'\n ? this.colors.recover\n : kind.includes('electric')\n ? this.colors.electric\n : kind.includes('blood') || kind.includes('impact')\n ? this.colors.damage\n : this.colors.cinematic;\n const graphic = new this.GraphicsConstructor();\n if (kind === 'tracer' || kind === 'motionTrail' || kind === 'speedLines') {\n graphic.moveTo(-70, 0).lineTo(70, 0).stroke({ color, width: 4, alpha: 0.86 });\n } else if (kind === 'muzzleFlash' || kind === 'impactFlash' || kind === 'explosionBurst') {\n graphic.star(0, 0, 8, 42, 12).fill({ color, alpha: 0.82 });\n } else {\n graphic.circle(0, 0, 28).stroke({ color, width: 4, alpha: 0.78 });\n }\n return graphic;\n }\n}\n", "import type { Graphics } from 'pixi.js';\nimport { BattleFxLibrary, type BattleFxColors } from './BattleFxLibrary.js';\nimport { BattlePresentationPoseRegistry } from './BattlePresentationPoseRegistry.js';\nimport { BattleSequenceScheduler, type BattleSequenceTask } from './BattleSequenceScheduler.js';\nimport {\n BATTLE_PRESENTATION_PHASES,\n battlePresentationPhaseMilestone,\n serializeBattlePresentationClaim,\n type BattlePresentationPlan,\n type BattlePresentationTask,\n} from './BattlePresentationRecipe.js';\n\nexport class BattlePresentationEngine {\n readonly poses = new BattlePresentationPoseRegistry();\n readonly scheduler = new BattleSequenceScheduler();\n readonly fx: BattleFxLibrary;\n private abortController = new AbortController();\n private readonly sidecars = new Set<Promise<void>>();\n private readonly cameraBarriers = new Set<Promise<void>>();\n private readonly activeClaimedTasks = new Map<\n symbol,\n { task: BattlePresentationTask; done: Promise<void>; resolve: () => void }\n >();\n\n constructor(GraphicsConstructor: typeof Graphics, colors: BattleFxColors) {\n this.fx = new BattleFxLibrary(GraphicsConstructor, colors);\n }\n\n run(\n tasks: BattleSequenceTask[],\n onMilestone: Parameters<BattleSequenceScheduler['run']>[2],\n externalSignal?: AbortSignal,\n ): Promise<void> {\n if (!externalSignal) return this.scheduler.run(tasks, this.abortController.signal, onMilestone);\n const sequenceAbort = new AbortController();\n const abort = () => sequenceAbort.abort();\n this.abortController.signal.addEventListener('abort', abort, { once: true });\n externalSignal.addEventListener('abort', abort, { once: true });\n if (this.abortController.signal.aborted || externalSignal.aborted) abort();\n return this.scheduler.run(tasks, sequenceAbort.signal, onMilestone).finally(() => {\n this.abortController.signal.removeEventListener('abort', abort);\n externalSignal.removeEventListener('abort', abort);\n });\n }\n\n async runPlan(\n plan: BattlePresentationPlan,\n onMilestone: (\n milestone: Exclude<import('./BattleSequenceScheduler.js').BattleSequenceMilestone, 'done'>,\n ) => void,\n externalSignal?: AbortSignal,\n ): Promise<void> {\n const linked = this.createLinkedSignal(externalSignal);\n try {\n for (const phase of BATTLE_PRESENTATION_PHASES) {\n if (linked.signal.aborted) return;\n onMilestone(battlePresentationPhaseMilestone(phase));\n const tasks = plan.tasks.filter((task) => task.phase === phase);\n const blocking = tasks.filter((task) => task.mode === 'blocking');\n const sidecars = tasks.filter(\n (task) => task.mode === 'sidecar' || task.mode === 'camera-barrier',\n );\n for (const task of sidecars) this.startSidecar(task, linked.signal);\n if (blocking.length > 0) {\n await this.scheduler.run(\n blocking.map((task) => this.toSequenceTask(task, true)),\n linked.signal,\n () => undefined,\n );\n }\n }\n } finally {\n linked.cleanup();\n }\n }\n\n startSidecar(task: BattlePresentationTask, externalSignal?: AbortSignal): Promise<void> {\n const linked = this.createLinkedSignal(externalSignal);\n const promise = this.scheduler\n .run([this.toSequenceTask(task, true)], linked.signal, () => undefined)\n .catch(() => undefined)\n .finally(() => {\n linked.cleanup();\n this.sidecars.delete(promise);\n this.cameraBarriers.delete(promise);\n });\n this.sidecars.add(promise);\n if (task.mode === 'camera-barrier') this.cameraBarriers.add(promise);\n return promise;\n }\n\n async waitForCameraBarriers(): Promise<void> {\n await Promise.all([...this.cameraBarriers]);\n }\n\n reset(): void {\n this.abortController.abort();\n this.abortController = new AbortController();\n this.poses.reset();\n this.sidecars.clear();\n this.cameraBarriers.clear();\n }\n\n destroy(): void {\n this.abortController.abort();\n this.poses.reset();\n this.sidecars.clear();\n this.cameraBarriers.clear();\n }\n\n get activeSidecarCount(): number {\n return this.sidecars.size;\n }\n\n private toSequenceTask(task: BattlePresentationTask, manageClaims = false): BattleSequenceTask {\n return {\n id: task.id,\n reads: task.reads?.map(serializeBattlePresentationClaim),\n writes: task.writes?.map(serializeBattlePresentationClaim),\n run: (signal) => (manageClaims ? this.runClaimedTask(task, signal) : task.run(signal)),\n };\n }\n\n private async runClaimedTask(task: BattlePresentationTask, signal: AbortSignal): Promise<void> {\n while (!signal.aborted) {\n const blockers = [...this.activeClaimedTasks.values()].filter(({ task: activeTask }) =>\n this.tasksConflict(activeTask, task),\n );\n if (blockers.length === 0) break;\n await Promise.all(blockers.map(({ done }) => done));\n }\n if (signal.aborted) return;\n let resolve: () => void = () => undefined;\n const done = new Promise<void>((resolveDone) => {\n resolve = resolveDone;\n });\n const key = Symbol(task.id);\n this.activeClaimedTasks.set(key, { task, done, resolve });\n try {\n await task.run(signal);\n } finally {\n this.activeClaimedTasks.delete(key);\n resolve();\n }\n }\n\n private tasksConflict(left: BattlePresentationTask, right: BattlePresentationTask): boolean {\n const leftReads = new Set((left.reads ?? []).map(serializeBattlePresentationClaim));\n const leftWrites = new Set((left.writes ?? []).map(serializeBattlePresentationClaim));\n const rightReads = new Set((right.reads ?? []).map(serializeBattlePresentationClaim));\n const rightWrites = new Set((right.writes ?? []).map(serializeBattlePresentationClaim));\n return (\n [...rightWrites, ...rightReads].some((claim) => leftWrites.has(claim)) ||\n [...rightWrites].some((claim) => leftReads.has(claim))\n );\n }\n\n private createLinkedSignal(externalSignal?: AbortSignal): {\n signal: AbortSignal;\n cleanup: () => void;\n } {\n if (!externalSignal) {\n return { signal: this.abortController.signal, cleanup: () => undefined };\n }\n const controller = new AbortController();\n const abort = () => controller.abort();\n this.abortController.signal.addEventListener('abort', abort, { once: true });\n externalSignal.addEventListener('abort', abort, { once: true });\n if (this.abortController.signal.aborted || externalSignal.aborted) abort();\n return {\n signal: controller.signal,\n cleanup: () => {\n this.abortController.signal.removeEventListener('abort', abort);\n externalSignal.removeEventListener('abort', abort);\n },\n };\n }\n}\n", "import { retrySessionDisplayResource } from '@bardway/trpg-media';\n\n/** Waits for browser font resolution without adding the PDF CJK font to the stage preload. */\nexport const preloadPixiStageFonts = async (fontTests: readonly string[]): Promise<void> => {\n if (typeof document === 'undefined' || !('fonts' in document)) return;\n const fonts = document.fonts;\n await retrySessionDisplayResource(async () => {\n await Promise.all([...fontTests.map((font) => fonts.load(font)), fonts.ready]);\n });\n};\n", "import type { Application, Ticker } from 'pixi.js';\nimport {\n acceptsPresentationEvent,\n displaySnapshotCodec,\n presentationEventCodec,\n type DisplaySnapshot,\n type PresentationEvent,\n} from '@bardway/trpg-display';\nimport type { RuntimeLogger } from '@bardway/trpg-media';\nimport { createPixiApplication, type StageRenderQuality } from './PixiApplicationFactory.js';\nimport {\n createPixiAnimationActivity,\n type PixiAnimationActivity,\n} from './PixiAnimationActivity.js';\nimport {\n createPixiAnimationDirector,\n type PixiAnimationDirector,\n} from './PixiAnimationDirector.js';\nimport { PixiAssetManager } from './PixiAssetManager.js';\nimport { createPixiSceneGraph, type PixiSceneGraph } from './PixiSceneGraph.js';\nimport { PixiViewportController } from './PixiViewportController.js';\nimport { PixiVideoRuntime } from './PixiVideoRuntime.js';\nimport { StoryTimelineClock } from './story/StoryTimelineClock.js';\nimport { createDisplayEventQueue, type DisplayEventQueue } from './DisplayEventQueue.js';\n\nexport interface PixiDisplayContext {\n readonly app: Application;\n readonly pixi: typeof import('pixi.js');\n readonly scene: PixiSceneGraph;\n readonly assets: PixiAssetManager;\n readonly animation: PixiAnimationDirector;\n readonly activity: PixiAnimationActivity;\n readonly video: PixiVideoRuntime;\n readonly clock: StoryTimelineClock;\n readonly stage: { readonly width: number; readonly height: number };\n readonly signal: AbortSignal;\n readonly logger: RuntimeLogger;\n requestRender(): void;\n}\n\n/** The host owns the visual policy and exposes already adjudicated public data. */\nexport interface PixiDisplaySurface {\n applySnapshot(snapshot: DisplaySnapshot, signal: AbortSignal): void | Promise<void>;\n play(event: PresentationEvent, signal: AbortSignal): Promise<void>;\n setPaused?(paused: boolean): void;\n setReducedMotion?(reducedMotion: boolean): void;\n resize?(): void;\n reset(): void;\n destroy(): void;\n}\n\nexport interface PixiDisplayRendererOptions {\n readonly logger: RuntimeLogger;\n readonly stage: { readonly width: number; readonly height: number };\n readonly quality?: StageRenderQuality;\n readonly resolveAssetUrl: (uri: string) => string;\n readonly createSurface: (context: PixiDisplayContext) => PixiDisplaySurface;\n readonly blocking?: (event: PresentationEvent) => boolean;\n readonly onCommitted?: (snapshot: DisplaySnapshot) => void;\n}\n\n/** One Application, one private ticker and a renderer-owned logical animation clock. */\nexport class PixiDisplayRenderer {\n private app: Application | null = null;\n private mountPromise: Promise<void> | null = null;\n private viewport: PixiViewportController | null = null;\n private context: PixiDisplayContext | null = null;\n private surface: PixiDisplaySurface | null = null;\n private queue: DisplayEventQueue;\n private lifecycle = new AbortController();\n private snapshotController: AbortController | null = null;\n private latest: DisplaySnapshot | null = null;\n private committed: DisplaySnapshot | null = null;\n private seen = new Set<string>();\n private pendingApply: Promise<void> = Promise.resolve();\n private paused = false;\n private reducedMotion = false;\n private lost = false;\n private destroyed = false;\n private epoch = 0;\n\n constructor(private readonly options: PixiDisplayRendererOptions) {\n if (\n ![options.stage.width, options.stage.height].every(\n (value) => Number.isFinite(value) && value > 0,\n )\n ) {\n throw new Error('Stage dimensions must be finite positive numbers');\n }\n this.queue = createDisplayEventQueue(options.logger);\n }\n\n mount(host: HTMLElement): Promise<void> {\n if (this.destroyed) return Promise.reject(new Error('Renderer destroyed'));\n if (this.mountPromise) return this.mountPromise;\n this.mountPromise = this.initialize(host);\n return this.mountPromise;\n }\n\n private async initialize(host: HTMLElement): Promise<void> {\n const pixi = await import('pixi.js');\n if (this.destroyed) return;\n const app = await createPixiApplication(\n pixi.Application,\n this.options.quality,\n this.options.stage,\n );\n if (this.destroyed) {\n app.destroy({ removeView: true, releaseGlobalResources: true }, { children: true });\n return;\n }\n this.app = app;\n host.appendChild(app.canvas);\n app.canvas.addEventListener('webglcontextlost', this.onContextLost);\n app.canvas.addEventListener('webglcontextrestored', this.onContextRestored);\n this.createRuntime(pixi);\n this.viewport = new PixiViewportController(\n app,\n app.stage,\n host,\n () => this.surface?.resize?.(),\n this.options.stage,\n );\n if (this.latest) await this.applySnapshot(this.latest);\n }\n\n private createRuntime(pixi: typeof import('pixi.js')): void {\n const app = this.app;\n if (!app || this.destroyed) return;\n this.lifecycle = new AbortController();\n const scene = createPixiSceneGraph(pixi.Container);\n app.stage.addChild(scene.root);\n const clock = new StoryTimelineClock();\n const activity = createPixiAnimationActivity(app.ticker);\n const animation = createPixiAnimationDirector(clock, activity);\n const assets = new PixiAssetManager(pixi.Assets, { resolveUrl: this.options.resolveAssetUrl });\n const requestRender = () => {\n if (!this.destroyed && !this.lost && !this.paused) app.render();\n };\n const video = new PixiVideoRuntime(\n app.ticker,\n activity,\n assets,\n requestRender,\n this.options.logger,\n );\n this.context = {\n app,\n pixi,\n scene,\n assets,\n animation,\n activity,\n clock,\n video,\n stage: this.options.stage,\n signal: this.lifecycle.signal,\n logger: this.options.logger,\n requestRender,\n };\n app.ticker.add(this.advanceClock);\n this.surface = this.options.createSurface(this.context);\n this.pause(this.paused);\n this.setReducedMotion(this.reducedMotion);\n }\n\n async applySnapshot(input: unknown): Promise<void> {\n if (this.destroyed) throw new Error('Renderer destroyed');\n const snapshot = displaySnapshotCodec.parse(input);\n const previous = this.latest;\n const sameTarget =\n previous?.sessionId === snapshot.sessionId &&\n previous?.encounterId === snapshot.encounterId &&\n previous?.epoch === snapshot.epoch;\n if (\n previous?.sessionId === snapshot.sessionId &&\n snapshot.displayRevision < previous.displayRevision\n )\n return;\n if (sameTarget && snapshot.encounterRevision < previous.encounterRevision) return;\n const switched = previous !== null && !sameTarget;\n if (switched) {\n this.queue.clear('display-target-changed');\n this.context?.animation.clear();\n this.context?.video.reset();\n this.surface?.reset();\n this.seen.clear();\n }\n this.latest = snapshot;\n this.snapshotController?.abort('snapshot-replaced');\n const controller = new AbortController();\n this.snapshotController = controller;\n const ticket = ++this.epoch;\n const apply = this.pendingApply\n .catch(() => undefined)\n .then(async () => {\n if (controller.signal.aborted || this.destroyed || this.lost || !this.surface) return;\n await this.surface.applySnapshot(snapshot, controller.signal);\n if (!controller.signal.aborted && ticket === this.epoch) {\n this.committed = snapshot;\n this.options.onCommitted?.(snapshot);\n this.context?.requestRender();\n }\n });\n this.pendingApply = apply;\n await apply;\n }\n\n async play(input: unknown): Promise<'completed' | 'aborted' | 'ignored'> {\n const event = presentationEventCodec.parse(input);\n await this.pendingApply;\n if (\n !this.committed ||\n !this.surface ||\n this.destroyed ||\n this.lost ||\n !acceptsPresentationEvent(this.committed, event, this.seen)\n )\n return 'ignored';\n this.seen.add(event.id);\n const ticket = this.epoch;\n return this.queue.enqueue({\n id: event.id,\n kind: event.kind,\n blocking: this.options.blocking?.(event) ?? true,\n run: async (signal) => {\n if (signal.aborted || ticket !== this.epoch || !this.surface) return;\n const release = this.context?.activity.acquire(`presentation:${event.id}`);\n try {\n await this.surface.play(event, signal);\n } finally {\n release?.();\n }\n },\n });\n }\n\n pause(paused = true): void {\n this.paused = paused;\n this.context?.activity.setPaused(paused);\n this.context?.clock.setPaused(paused);\n this.context?.animation[paused ? 'pause' : 'resume']();\n this.context?.video.setPaused(paused);\n this.surface?.setPaused?.(paused);\n if (paused) {\n this.queue.pause();\n this.app?.stop();\n } else {\n this.queue.resume();\n const release = this.context?.activity.acquire('resume');\n release?.();\n this.context?.requestRender();\n }\n }\n\n setReducedMotion(reduced: boolean): void {\n this.reducedMotion = reduced;\n this.context?.animation.setReducedMotion(reduced);\n this.context?.video.setReducedMotion(reduced);\n this.surface?.setReducedMotion?.(reduced);\n }\n\n resize(width: number, height: number): void {\n this.viewport?.resize({ width, height });\n }\n\n async reset(): Promise<void> {\n this.epoch++;\n this.latest = null;\n this.committed = null;\n this.seen.clear();\n this.snapshotController?.abort('renderer-reset');\n this.queue.clear('renderer-reset');\n const pixi = this.context?.pixi;\n await this.disposeRuntime();\n if (pixi && !this.destroyed && !this.lost) this.createRuntime(pixi);\n this.context?.requestRender();\n }\n\n async destroy(): Promise<void> {\n if (this.destroyed) return;\n this.destroyed = true;\n this.epoch++;\n this.snapshotController?.abort('renderer-destroy');\n this.queue.destroy();\n this.viewport?.destroy();\n this.viewport = null;\n await this.disposeRuntime();\n if (this.app) {\n this.app.canvas.removeEventListener('webglcontextlost', this.onContextLost);\n this.app.canvas.removeEventListener('webglcontextrestored', this.onContextRestored);\n this.app.destroy({ removeView: true, releaseGlobalResources: true }, { children: true });\n this.app = null;\n }\n }\n\n private async disposeRuntime(): Promise<void> {\n this.lifecycle.abort('runtime-dispose');\n this.app?.ticker.remove(this.advanceClock);\n this.surface?.destroy();\n this.surface = null;\n const context = this.context;\n this.context = null;\n if (!context) return;\n context.video.destroy();\n context.animation.destroy();\n context.clock.clear();\n context.activity.clear();\n context.scene.root.destroy({ children: true });\n await context.assets.releaseAll();\n }\n\n private readonly advanceClock = (ticker: Ticker): void => {\n this.context?.clock.advance(ticker.deltaMS);\n };\n\n private readonly onContextLost = (event: Event): void => {\n event.preventDefault();\n this.lost = true;\n this.epoch++;\n this.snapshotController?.abort('context-lost');\n this.queue.clear('context-lost');\n this.context?.video.handleContextLost();\n this.context?.animation.clear();\n this.surface?.reset();\n this.app?.stop();\n };\n\n private readonly onContextRestored = (): void => {\n if (this.destroyed || !this.context) return;\n const pixi = this.context.pixi;\n void this.disposeRuntime()\n .then(async () => {\n if (this.destroyed) return;\n this.lost = false;\n this.createRuntime(pixi);\n if (this.latest) await this.applySnapshot(this.latest);\n })\n .catch((error: unknown) =>\n this.options.logger.error('Pixi context restoration failed', { error }),\n );\n };\n}\n", "import type { Container, Graphics, Sprite, Text } from 'pixi.js';\nimport type { DisplayEntity, DisplaySnapshot, PresentationEvent } from '@bardway/trpg-display';\nimport { PixiRetainedMeterAnimator } from './PixiRetainedMeterAnimator.js';\nimport { resolveContainRect, resolveCroppedCoverRect } from './PixiMapWorldUtils.js';\nimport type { PixiVideoBinding } from './PixiVideoRuntime.js';\nimport type { PixiDisplayContext, PixiDisplaySurface } from './PixiDisplayRenderer.js';\nimport type { PixiStageTheme } from './PixiStageTheme.js';\nimport { createPixiTypography } from './PixiTypography.js';\n\ninterface ResourceRow {\n node: Container;\n fill: Graphics;\n meter: PixiRetainedMeterAnimator;\n label: Text;\n}\ninterface EntityCard {\n node: Container;\n name: Text;\n avatar: Sprite;\n mask: Graphics;\n statuses: Text;\n rows: Map<string, ResourceRow>;\n assetKey?: string;\n}\n\nexport interface RetainedStageSurfaceOptions {\n readonly theme: PixiStageTheme;\n readonly fonts: { body: string; data: string; display: string };\n readonly resourceColor: (entity: DisplayEntity, resourceId: string) => string;\n readonly play: (\n event: PresentationEvent,\n context: PixiDisplayContext,\n signal: AbortSignal,\n ) => Promise<void>;\n readonly layout?: {\n cardWidth: number;\n cardGap: number;\n rosterHeight: number;\n avatarSize: number;\n resourceHeight: number;\n };\n}\n\n/**\n * Neutral composition of the extracted retained portrait/meter/media primitives.\n * Scene kind, titles, resources, statuses and action ordering are supplied by the host.\n * Product Prelude/Story/Battle/Ending artwork and rule conditions stay outside the package.\n */\nexport class RetainedStageSurface implements PixiDisplaySurface {\n readonly node: Container;\n private readonly title: Text;\n private readonly image: Sprite;\n private readonly cards = new Map<string, EntityCard>();\n private readonly typography;\n private readonly layout;\n private generation = 0;\n private scope: string | null = null;\n private video: PixiVideoBinding | null = null;\n private reducedMotion = false;\n private destroyed = false;\n\n constructor(\n private readonly context: PixiDisplayContext,\n private readonly options: RetainedStageSurfaceOptions,\n ) {\n const { Container, Sprite, Text } = context.pixi;\n this.node = new Container();\n this.node.eventMode = 'none';\n this.typography = createPixiTypography(options.theme, options.fonts);\n this.layout = options.layout ?? {\n cardWidth: 260,\n cardGap: 18,\n rosterHeight: 290,\n avatarSize: 100,\n resourceHeight: 30,\n };\n this.image = new Sprite();\n this.title = new Text({ text: '', style: this.typography.sceneTitle });\n this.title.position.set(28, 24);\n this.node.addChild(this.image, this.title);\n context.scene.presentationLayer.addChild(this.node);\n }\n\n async applySnapshot(snapshot: DisplaySnapshot, signal: AbortSignal): Promise<void> {\n const ticket = ++this.generation;\n const previousScope = this.scope;\n const scope = `scene:${snapshot.sessionId}:${snapshot.encounterId ?? 'story'}:${snapshot.epoch}:${snapshot.displayRevision}`;\n this.scope = scope;\n this.title.text = snapshot.scene.title;\n this.video?.release();\n this.video = null;\n this.image.visible = false;\n const activeIds = new Set(snapshot.entities.map((entity) => entity.id));\n for (const [id, card] of this.cards) if (!activeIds.has(id)) this.removeCard(id, card);\n const orderedIds = new Map(snapshot.actionSequence.map((id, index) => [id, index]));\n const ordered = [...snapshot.entities].sort(\n (a, b) => (orderedIds.get(a.id) ?? Infinity) - (orderedIds.get(b.id) ?? Infinity),\n );\n const loads = ordered.map(async (entity, index) => {\n const card = this.cards.get(entity.id) ?? this.createCard(entity.id);\n this.syncCard(card, entity, index, snapshot);\n if (!entity.avatar) {\n card.avatar.visible = false;\n return;\n }\n const assetKey = `${entity.avatar.id}:${entity.avatar.revision}`;\n const texture = await this.context.assets.loadTexture(\n assetKey,\n entity.avatar.uri,\n scope,\n signal,\n );\n if (signal.aborted || ticket !== this.generation || this.destroyed) return;\n card.assetKey = assetKey;\n card.avatar.texture = texture;\n card.avatar.visible = true;\n const rect = resolveCroppedCoverRect(\n texture,\n { x: 0, y: 36, width: this.layout.avatarSize, height: this.layout.avatarSize },\n entity.avatarCrop,\n );\n card.avatar.position.set(rect.x, rect.y);\n card.avatar.width = rect.width;\n card.avatar.height = rect.height;\n });\n const sceneAsset =\n snapshot.scene.assets.find((asset) => asset.mediaType === 'video') ??\n snapshot.scene.assets.find((asset) => asset.mediaType === 'image');\n if (sceneAsset)\n loads.push(\n (async () => {\n if (sceneAsset.mediaType === 'video') {\n const binding = await this.context.video.loadBinding({\n alias: `${sceneAsset.id}:${sceneAsset.revision}`,\n videoUrl: sceneAsset.uri,\n scope,\n signal,\n });\n if (signal.aborted || ticket !== this.generation || this.destroyed) {\n binding.release();\n return;\n }\n this.video = binding;\n this.image.texture = binding.texture;\n await binding.activate();\n } else {\n const texture = await this.context.assets.loadTexture(\n `${sceneAsset.id}:${sceneAsset.revision}`,\n sceneAsset.uri,\n scope,\n signal,\n );\n if (signal.aborted || ticket !== this.generation || this.destroyed) return;\n this.image.texture = texture;\n }\n if (signal.aborted || ticket !== this.generation || this.destroyed) return;\n const rect = resolveContainRect(this.image.texture, {\n x: 0,\n y: 0,\n width: this.context.stage.width,\n height: this.context.stage.height - this.layout.rosterHeight,\n });\n this.image.position.set(rect.x, rect.y);\n this.image.width = rect.width;\n this.image.height = rect.height;\n this.image.visible = true;\n })(),\n );\n try {\n await Promise.all(loads);\n } finally {\n if (previousScope && previousScope !== scope)\n await this.context.assets.releaseScope(previousScope);\n if (signal.aborted || ticket !== this.generation)\n await this.context.assets.releaseScope(scope);\n }\n }\n\n play(event: PresentationEvent, signal: AbortSignal): Promise<void> {\n return this.options.play(event, this.context, signal);\n }\n\n setReducedMotion(reduced: boolean): void {\n this.reducedMotion = reduced;\n for (const card of this.cards.values())\n for (const row of card.rows.values()) row.meter.setReducedMotion(reduced);\n }\n\n reset(): void {\n this.generation++;\n this.video?.release();\n this.video = null;\n for (const [id, card] of this.cards) this.removeCard(id, card);\n this.image.visible = false;\n this.title.text = '';\n if (this.scope)\n void this.context.assets\n .releaseScope(this.scope)\n .catch((error: unknown) =>\n this.context.logger.warn('Stage asset release failed', { error }),\n );\n this.scope = null;\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.reset();\n this.node.destroy({ children: true });\n }\n\n private createCard(id: string): EntityCard {\n const { Container, Sprite, Graphics, Text } = this.context.pixi;\n const node = new Container();\n const name = new Text({ text: '', style: this.typography.hudSecondary });\n const avatar = new Sprite();\n const mask = new Graphics()\n .rect(0, 36, this.layout.avatarSize, this.layout.avatarSize)\n .fill(0xffffff);\n avatar.mask = mask;\n const statuses = new Text({ text: '', style: this.typography.caption });\n statuses.position.set(0, 148);\n node.addChild(name, avatar, mask, statuses);\n this.node.addChild(node);\n const card = { node, name, avatar, mask, statuses, rows: new Map<string, ResourceRow>() };\n this.cards.set(id, card);\n return card;\n }\n\n private syncCard(\n card: EntityCard,\n entity: DisplayEntity,\n index: number,\n snapshot: DisplaySnapshot,\n ): void {\n const { Container, Graphics, Text } = this.context.pixi;\n card.name.text = entity.label;\n card.statuses.text = entity.statuses.map((status) => status.label).join(' \u00B7 ');\n card.node.position.set(\n entity.position?.x ?? 28 + index * (this.layout.cardWidth + this.layout.cardGap),\n entity.position?.y ?? this.context.stage.height - this.layout.rosterHeight + 12,\n );\n card.name.alpha =\n snapshot.actionSequence[snapshot.currentActionIndex ?? -1] === entity.id ? 1 : 0.76;\n const ids = new Set(entity.resources.map((resource) => resource.id));\n for (const [id, row] of card.rows)\n if (!ids.has(id)) {\n row.meter.destroy();\n row.node.destroy({ children: true });\n card.rows.delete(id);\n }\n entity.resources.forEach((resource, rowIndex) => {\n let row = card.rows.get(resource.id);\n if (!row) {\n const node = new Container();\n const fill = new Graphics()\n .rect(0, 24, this.layout.cardWidth - 116, 4)\n .fill(this.options.resourceColor(entity, resource.id));\n const label = new Text({ text: '', style: this.typography.data });\n node.addChild(label, fill);\n card.node.addChild(node);\n const meter = new PixiRetainedMeterAnimator(\n this.context.animation,\n {\n setRatio: (ratio) => {\n fill.scale.x = ratio;\n },\n setFlashAlpha: (alpha) => {\n fill.alpha = 0.7 + alpha * 0.3;\n },\n },\n this.context.requestRender,\n );\n meter.setReducedMotion(this.reducedMotion);\n row = { node, fill, label, meter };\n card.rows.set(resource.id, row);\n }\n row.node.position.set(112, 36 + rowIndex * this.layout.resourceHeight);\n row.label.text = `${resource.label} ${resource.current}${resource.maximum === undefined ? '' : ` / ${resource.maximum}`}`;\n row.meter.sync(\n resource.maximum === undefined || resource.maximum <= 0\n ? 0\n : resource.current / resource.maximum,\n );\n });\n }\n\n private removeCard(id: string, card: EntityCard): void {\n for (const row of card.rows.values()) row.meter.destroy();\n card.node.destroy({ children: true });\n this.cards.delete(id);\n }\n}\n", "export interface BattleFxPoint {\n x: number;\n y: number;\n}\n\n/** Avalanche the event key so adjacent hit IDs do not produce adjacent angles. */\nexport const battleFxRandom = (key: string): number => {\n let hash = 2166136261;\n for (let index = 0; index < key.length; index++)\n hash = Math.imul(hash ^ key.charCodeAt(index), 16777619);\n hash = Math.imul(hash ^ (hash >>> 16), 0x7feb352d);\n hash = Math.imul(hash ^ (hash >>> 15), 0x846ca68b);\n return ((hash ^ (hash >>> 16)) >>> 0) / 4294967296;\n};\n\nexport const resolveBladeSlashAngle = (\n id: string,\n hitIndex: number,\n offsetDegrees: number,\n): number =>\n battleFxRandom(`${id}:${hitIndex}:blade`) * Math.PI * 2 + (offsetDegrees * Math.PI) / 180;\n\nexport const resolveMeleeApproachPoint = (\n from: BattleFxPoint,\n target: BattleFxPoint,\n standOff: number,\n): BattleFxPoint => {\n const dx = target.x - from.x;\n const dy = target.y - from.y;\n const distance = Math.hypot(dx, dy);\n // Pixi ObservablePoint exposes x/y through accessors, not enumerable own properties.\n if (distance <= standOff || distance === 0) return { x: from.x, y: from.y };\n return { x: target.x - (dx / distance) * standOff, y: target.y - (dy / distance) * standOff };\n};\n\nexport interface BattlePassByPath {\n end: BattleFxPoint;\n crossingProgress: number;\n dodgeProgress: number;\n fadeProgress: number;\n tailLength: number;\n}\n\n/** Tangent to the visible token circle; fading starts only after the entire tail clears it. */\nexport const resolveBattlePassByPath = (\n from: BattleFxPoint,\n target: BattleFxPoint,\n options: {\n radius: number;\n clearance: number;\n behind: number;\n tailLength: number;\n side: -1 | 1;\n dodge: boolean;\n },\n): BattlePassByPath => {\n const dx = target.x - from.x;\n const dy = target.y - from.y;\n const distance = Math.hypot(dx, dy);\n const clearance = Math.max(0, options.radius + options.clearance);\n const angle =\n Math.atan2(dy, dx) +\n (options.dodge\n ? 0\n : options.side * Math.asin(Math.min(0.95, clearance / Math.max(1, distance))));\n const ux = Math.cos(angle);\n const uy = Math.sin(angle);\n const crossing = Math.max(0, dx * ux + dy * uy);\n const tailLength = Math.max(1, options.tailLength);\n const behind = Math.max(\n options.behind,\n options.radius + tailLength + Math.max(1, options.behind * 0.2),\n );\n const total = Math.max(1, crossing + behind);\n return {\n end: { x: from.x + ux * total, y: from.y + uy * total },\n crossingProgress: crossing / total,\n dodgeProgress: Math.max(0, (crossing - options.radius * 2) / total),\n fadeProgress: (crossing + options.radius + tailLength) / total,\n tailLength,\n };\n};\n", "import type { SessionTuningResolver } from './tuning/SessionTuningResolver.js';\n\nexport type BattleHpColorTone = 'healthy' | 'wounded' | 'critical' | 'empty';\n\nexport const resolveBattleHpColor = (\n tone: BattleHpColorTone,\n tuning: SessionTuningResolver | undefined,\n battleHpColors: Readonly<Record<BattleHpColorTone, string>>,\n): string => {\n if (tone === 'empty') return battleHpColors.empty;\n const value = tuning?.get(`visual.battle.hp.${tone}`);\n return typeof value === 'string' ? value : battleHpColors[tone];\n};\n\nexport const resolveUnitCardHpGradientAlpha = (\n segmentIndex: number,\n segmentCount: number,\n): number => {\n const safeCount = Math.max(1, Math.floor(segmentCount));\n const progress = Math.max(0, Math.min(safeCount - 1, Math.floor(segmentIndex))) / safeCount;\n return 0.32 + progress * 0.68;\n};\n\nexport const UNIT_CARD_LAYOUT = {\n source: { width: 724, height: 166 },\n rowGap: 6,\n maxVisibleRows: 13,\n avatar: { x: 14, y: 13, width: 136, height: 140, radius: 5 },\n order: { x: 205, y: 83, fontSize: 27 },\n name: { x: 238, y: 83, fontSize: 25, minFontSize: 17, rightPadding: 12 },\n status: { right: 700, y: 32, radius: 10, paddingX: 12, fontSize: 15 },\n hp: { x: 695, y: 91, fontSize: 17 },\n hpBar: { x: 238, y: 130, width: 455, height: 7 },\n activeOutline: { inset: 5, width: 2.65 },\n} as const;\n\nexport const BATTLE_TYPOGRAPHY_DEFAULTS = {\n round: { fontSize: 29 },\n roster: {\n order: { x: 205, y: 83, fontSize: 27 },\n name: { x: 238, y: 83, fontSize: 25, minFontSize: 17 },\n hp: { x: 695, y: 91, fontSize: 17 },\n status: {\n right: 700,\n y: 32,\n paddingX: 12,\n paddingY: 4,\n fontSize: 10,\n text: { x: 0, y: 0 },\n icon: { x: 0, y: 0, size: 12 },\n },\n },\n objective: {\n title: { x: 42, y: 28, fontSize: 23 },\n percent: { x: 505, y: 28, fontSize: 22 },\n },\n token: { x: 0, y: 0, fontSize: 14 },\n distance: { x: 27, y: 13.5, fontSize: 14, ruler: { x: 7, y: 5.5 } },\n} as const;\n\nexport type BattleTypographyTuning = {\n round: { fontSize: number };\n roster: {\n order: { x: number; y: number; fontSize: number };\n name: { x: number; y: number; fontSize: number; minFontSize: number };\n hp: { x: number; y: number; fontSize: number };\n status: {\n right: number;\n y: number;\n paddingX: number;\n paddingY: number;\n fontSize: number;\n text: { x: number; y: number };\n icon: { x: number; y: number; size: number };\n };\n };\n objective: {\n title: { x: number; y: number; fontSize: number };\n percent: { x: number; y: number; fontSize: number };\n };\n token: { x: number; y: number; fontSize: number };\n distance: { x: number; y: number; fontSize: number; ruler: { x: number; y: number } };\n};\n\nexport const resolveBattleTypography = (\n value: BattleTypographyTuning | undefined,\n): BattleTypographyTuning => value ?? structuredClone(BATTLE_TYPOGRAPHY_DEFAULTS);\n\nexport const resolveBattleStatusPillLayout = (\n style: BattleTypographyTuning['roster']['status'],\n options: { hasIcon: boolean; labelWidth: number; labelHeight: number },\n) => {\n const icon = options.hasIcon\n ? { x: style.icon.x, y: style.icon.y, width: style.icon.size, height: style.icon.size }\n : null;\n const label = {\n x: (icon ? style.icon.x + style.icon.size + 4 : 0) + style.text.x,\n y: (icon ? style.icon.y + style.icon.size / 2 : options.labelHeight / 2) + style.text.y,\n width: options.labelWidth,\n height: options.labelHeight,\n };\n const left = Math.min(label.x, icon?.x ?? Number.POSITIVE_INFINITY);\n const top = Math.min(label.y - label.height / 2, icon?.y ?? Number.POSITIVE_INFINITY);\n const right = Math.max(\n label.x + label.width,\n icon ? icon.x + icon.width : Number.NEGATIVE_INFINITY,\n );\n const bottom = Math.max(\n label.y + label.height / 2,\n icon ? icon.y + icon.height : Number.NEGATIVE_INFINITY,\n );\n const width = Math.max(1, Math.ceil(right - left + style.paddingX * 2));\n const height = Math.max(1, Math.ceil(bottom - top + style.paddingY * 2));\n const offsetX = style.paddingX - left;\n const offsetY = style.paddingY - top;\n\n return {\n width,\n height,\n label: { x: label.x + offsetX, y: label.y + offsetY },\n icon: icon ? { x: icon.x + offsetX, y: icon.y + offsetY } : null,\n };\n};\n\nexport const TOKEN_RING_LAYOUT = {\n textureDiameter: 1254,\n outerDiameterByCell: 1.2,\n svgInnerDiameterRatio: 0.728,\n avatarApertureInset: 1.02,\n shadow: { offsetXRatio: 0.08, offsetYRatio: 0.11, radiusRatio: 0.455 },\n} as const;\n\nexport const resolveBattleTokenVisualLayout = (cellDiameter: number) => {\n const safeCellDiameter = Math.max(1, cellDiameter);\n const ringDiameter = safeCellDiameter * TOKEN_RING_LAYOUT.outerDiameterByCell;\n const avatarAperture =\n ringDiameter * TOKEN_RING_LAYOUT.svgInnerDiameterRatio * TOKEN_RING_LAYOUT.avatarApertureInset;\n return { ringDiameter, avatarAperture };\n};\n\nexport const DISTANCE_RULER_STYLE = {\n leadingWidth: 40,\n x: 7,\n y: 5.5,\n width: 9,\n height: 16,\n tickLengths: [4, 7, 4, 7],\n textX: 27,\n} as const;\n\nexport const OBJECTIVE_LAYOUT = {\n source: { width: 550, height: 110 },\n maxWidth: 275,\n gap: 10,\n title: { x: 42, y: 28, fontSize: 23 },\n percent: { x: 505, y: 28, fontSize: 22 },\n track: { x: 60, y: 63, width: 430, height: 10, radius: 2 },\n} as const;\n\nexport const OBJECTIVE_PROGRESS_STYLE = {\n smallTickEvery: 0.05,\n majorTicks: [0, 0.25, 0.5, 0.75, 1],\n smallTickHeight: 4,\n majorTickHeight: 8,\n endMarkerWidth: 2,\n highlightHeight: 1,\n shadowHeight: 1,\n} as const;\n\nexport const clampProgress = (value: number): number => Math.max(0, Math.min(1, value));\n\nexport interface BattleTeamCheckIconLayoutOptions {\n areaWidth: number;\n areaHeight: number;\n iconHeight: number;\n gap: number;\n textureAspectRatio: number;\n}\n\nexport interface BattleTeamCheckIconLayout {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport const resolveBattleTeamCheckIconLayouts = (\n count: number,\n options: BattleTeamCheckIconLayoutOptions,\n): BattleTeamCheckIconLayout[] => {\n const safeCount = Math.max(0, Math.floor(count));\n if (safeCount === 0) return [];\n\n const areaWidth = Math.max(1, options.areaWidth);\n const areaHeight = Math.max(1, options.areaHeight);\n const aspectRatio = Math.max(0.01, options.textureAspectRatio);\n const requestedHeight = Math.max(1, options.iconHeight);\n const requestedGap = Math.max(0, options.gap);\n const maxGap =\n safeCount > 1 ? Math.max(0, (areaWidth - safeCount * aspectRatio) / (safeCount - 1)) : 0;\n const gap = safeCount > 1 ? Math.min(requestedGap, maxGap) : 0;\n const heightByWidth = (areaWidth - gap * (safeCount - 1)) / (safeCount * aspectRatio);\n const height = Math.max(1, Math.min(requestedHeight, areaHeight, heightByWidth));\n const width = height * aspectRatio;\n const groupWidth = width * safeCount + gap * (safeCount - 1);\n const startX = (areaWidth - groupWidth) / 2;\n const y = (areaHeight - height) / 2;\n\n return Array.from({ length: safeCount }, (_, index) => ({\n x: startX + index * (width + gap),\n y,\n width,\n height,\n }));\n};\n\nexport interface BattleRosterCardLayoutOptions {\n maxVisibleRows?: number;\n rowGap?: number;\n}\n\nexport const resolveBattleRosterCardLayout = (\n availableWidth: number,\n availableHeight: number,\n textureWidth: number,\n textureHeight: number,\n options: BattleRosterCardLayoutOptions = {},\n) => {\n const safeWidth = Math.max(1, textureWidth);\n const safeHeight = Math.max(1, textureHeight);\n const requestedCount = options.maxVisibleRows ?? UNIT_CARD_LAYOUT.maxVisibleRows;\n const requestedGap = options.rowGap ?? UNIT_CARD_LAYOUT.rowGap;\n const count = Math.max(\n 1,\n Math.min(\n UNIT_CARD_LAYOUT.maxVisibleRows,\n Number.isFinite(requestedCount)\n ? Math.floor(requestedCount)\n : UNIT_CARD_LAYOUT.maxVisibleRows,\n ),\n );\n const gap = Math.max(0, Number.isFinite(requestedGap) ? requestedGap : UNIT_CARD_LAYOUT.rowGap);\n const scale = Math.min(\n availableWidth / safeWidth,\n (availableHeight - gap * (count - 1)) / (count * safeHeight),\n );\n return {\n scale,\n width: safeWidth * scale,\n height: safeHeight * scale,\n gap,\n pitch: safeHeight * scale + gap,\n };\n};\n", "import type {\n BlurFilter,\n Container,\n Graphics,\n Particle,\n ParticleContainer,\n Rectangle,\n Texture,\n} from 'pixi.js';\n\nimport type { BattleViewportGridLayout } from './PixiSessionLayout.js';\nimport { PIXI_STAGE_METRICS } from './PixiStageMetrics.js';\n\ninterface Constructors {\n BlurFilter: typeof BlurFilter;\n Container: typeof Container;\n Graphics: typeof Graphics;\n Particle: typeof Particle;\n ParticleContainer: typeof ParticleContainer;\n Rectangle: typeof Rectangle;\n Texture: typeof Texture;\n}\n\nexport interface BattleEntryGridStyle {\n readonly lineWidth: number;\n readonly lineAlpha: number;\n readonly lineColor: string;\n readonly cellFillAlpha: number;\n readonly cellEdgeAlpha: number;\n readonly cellEdgeWidth: number;\n readonly cellEdgeGlowAlpha: number;\n readonly cellEdgeGlowWidth: number;\n readonly cellEdgeGlowBlurStrength: number;\n}\n\nconst DEFAULT_TRANSITION_GRID_STYLE: Omit<BattleEntryGridStyle, 'lineColor'> = {\n lineWidth: 2,\n lineAlpha: 0.72,\n cellFillAlpha: 0.5,\n cellEdgeAlpha: 0.9,\n cellEdgeWidth: 2,\n cellEdgeGlowAlpha: 0.8,\n cellEdgeGlowWidth: 3,\n cellEdgeGlowBlurStrength: 8,\n};\n\nexport interface BattleEntryCell {\n readonly col: number;\n readonly row: number;\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n readonly order: number;\n}\n\nconst transitionHash = (key: string, seed: string): number => {\n let hash = 2166136261;\n const value = `${seed}:${key}`;\n for (let index = 0; index < value.length; index += 1) {\n hash = Math.imul(hash ^ value.charCodeAt(index), 16777619);\n }\n hash ^= hash >>> 16;\n hash = Math.imul(hash, 0x85ebca6b);\n hash ^= hash >>> 13;\n hash = Math.imul(hash, 0xc2b2ae35);\n hash ^= hash >>> 16;\n return hash >>> 0;\n};\n\nexport const createBattleEntryCells = (\n layout: BattleViewportGridLayout,\n seed: string,\n): BattleEntryCell[] => {\n const cells: BattleEntryCell[] = [];\n for (let row = 0; row < layout.rows; row += 1) {\n for (let col = 0; col < layout.cols; col += 1) {\n cells.push({\n col,\n row,\n x: layout.offsetX + col * layout.cellW,\n y: layout.offsetY + row * layout.cellH,\n width: layout.cellW,\n height: layout.cellH,\n order: transitionHash(`${col}:${row}`, seed),\n });\n }\n }\n return cells.sort(\n (left, right) => left.order - right.order || left.row - right.row || left.col - right.col,\n );\n};\n\nexport const createStableBattleEntryOrder = (ids: readonly string[], seed: string): string[] =>\n [...ids].sort(\n (left, right) =>\n transitionHash(left, seed) - transitionHash(right, seed) || left.localeCompare(right),\n );\n\nconst clampUnit = (value: number): number => Math.max(0, Math.min(1, value));\n\nexport const resolveBattleEntryHandoffAlpha = (\n progress: number,\n targetAlpha: number,\n): { veilAlpha: number; cellAlpha: number } => {\n const target = clampUnit(targetAlpha);\n const veilAlpha = target * (1 - clampUnit(progress));\n return {\n veilAlpha,\n cellAlpha: (target - veilAlpha) / Math.max(0.0001, 1 - veilAlpha),\n };\n};\n\nexport const resolveBattleEntryCellPulse = (\n progress: number,\n peakProgress: number,\n): { fill: number; edge: number } => {\n const local = clampUnit(progress);\n const peak = Math.max(0.0001, Math.min(0.9999, peakProgress));\n if (local <= peak) return { fill: 1, edge: local / peak };\n const fade = clampUnit((local - peak) / (1 - peak));\n return { fill: 1 - fade, edge: 1 - fade };\n};\n\n/** Assigns ordered cells to accelerating reveal waves sized 1, 2, 3, 4, ... */\nexport const createBattleEntryRevealBatchIndices = (cellCount: number): number[] => {\n const count = Math.max(0, Math.floor(cellCount));\n const batches: number[] = [];\n let batchIndex = 0;\n let remainingInBatch = 1;\n for (let index = 0; index < count; index += 1) {\n batches.push(batchIndex);\n remainingInBatch -= 1;\n if (remainingInBatch > 0) continue;\n batchIndex += 1;\n remainingInBatch = batchIndex + 1;\n }\n return batches;\n};\n\nexport interface BattleRosterProgressEntry {\n readonly root: {\n alpha: number;\n readonly position: { set: (x: number, y: number) => void };\n };\n readonly targetX: number;\n readonly targetY: number;\n}\n\nexport const applyBattleRosterEntryProgress = (\n entries: readonly BattleRosterProgressEntry[],\n progress: number,\n offsetX: number,\n entryDuration: number,\n maxStagger: number,\n): void => {\n const duration = Math.max(0.0001, entryDuration);\n const staggerWindow = Math.max(0, maxStagger);\n const elapsed = Math.max(0, Math.min(1, progress)) * (duration + staggerWindow);\n const lastIndex = Math.max(1, entries.length - 1);\n entries.forEach((entry, index) => {\n const start = staggerWindow * (index / lastIndex);\n const local = Math.max(0, Math.min(1, (elapsed - start) / duration));\n const eased = 1 - (1 - local) ** 3;\n entry.root.position.set(entry.targetX - Math.abs(offsetX) * (1 - eased), entry.targetY);\n entry.root.alpha = eased;\n });\n};\n\n/** Owns all temporary visual nodes used by a single battle-entry transition. */\nexport class PixiBattleEntryTransition {\n readonly node: Container;\n readonly whiteVeil: Graphics;\n readonly verticalLines: Graphics;\n readonly horizontalLines: Graphics;\n readonly cells: readonly BattleEntryCell[];\n readonly particles: readonly Particle[];\n readonly edgeParticles: readonly Particle[];\n readonly edgeGlowParticles: readonly Particle[];\n readonly revealBatchIndices: readonly number[];\n private readonly particleContainer: ParticleContainer;\n private readonly edgeParticleContainer: ParticleContainer;\n private readonly edgeGlowParticleContainer: ParticleContainer;\n private readonly edgeGlowLayer: Container;\n private readonly edgeGlowBlur: BlurFilter;\n private readonly gridStyle: BattleEntryGridStyle;\n private destroyed = false;\n\n constructor(\n constructors: Constructors,\n layout: BattleViewportGridLayout | null,\n seed: string,\n gridStyle: BattleEntryGridStyle,\n colors: { mask: string },\n stage: { width: number; height: number } = PIXI_STAGE_METRICS,\n ) {\n const resolvedGridStyle = { ...DEFAULT_TRANSITION_GRID_STYLE, ...gridStyle };\n this.gridStyle = resolvedGridStyle;\n this.node = new constructors.Container({ label: 'battle-entry-transition' });\n this.node.eventMode = 'none';\n this.node.interactiveChildren = false;\n this.whiteVeil = new constructors.Graphics()\n .rect(0, 0, stage.width, stage.height)\n .fill({ color: colors.mask, alpha: 1 });\n this.whiteVeil.alpha = 0;\n this.verticalLines = new constructors.Graphics({ label: 'battle-entry-vertical-lines' });\n this.horizontalLines = new constructors.Graphics({ label: 'battle-entry-horizontal-lines' });\n this.cells = layout ? createBattleEntryCells(layout, seed) : [];\n const whiteTexture = constructors.Texture.WHITE;\n this.particles = this.cells.map(\n (cell) =>\n new constructors.Particle({\n texture: whiteTexture,\n x: cell.x,\n y: cell.y,\n scaleX: (cell.width + 0.5) / Math.max(1, whiteTexture.width),\n scaleY: (cell.height + 0.5) / Math.max(1, whiteTexture.height),\n tint: colors.mask,\n alpha: 0,\n }),\n );\n this.edgeParticles = this.createCellEdgeParticles(\n constructors,\n whiteTexture,\n resolvedGridStyle.cellEdgeWidth,\n );\n this.edgeGlowParticles = this.createCellEdgeParticles(\n constructors,\n whiteTexture,\n resolvedGridStyle.cellEdgeGlowWidth,\n );\n this.revealBatchIndices = createBattleEntryRevealBatchIndices(this.particles.length);\n this.particleContainer = new constructors.ParticleContainer({\n texture: whiteTexture,\n particles: [...this.particles],\n dynamicProperties: {\n position: false,\n rotation: false,\n vertex: false,\n uvs: false,\n color: true,\n },\n });\n this.particleContainer.update();\n this.edgeParticleContainer = this.createParticleContainer(\n constructors,\n whiteTexture,\n this.edgeParticles,\n );\n this.edgeGlowParticleContainer = this.createParticleContainer(\n constructors,\n whiteTexture,\n this.edgeGlowParticles,\n );\n this.edgeParticleContainer.blendMode = 'screen';\n this.edgeGlowParticleContainer.blendMode = 'screen';\n this.edgeGlowBlur = new constructors.BlurFilter({\n strength: Math.max(0, resolvedGridStyle.cellEdgeGlowBlurStrength),\n quality: 2,\n });\n const glowPadding = Math.max(\n 4,\n resolvedGridStyle.cellEdgeGlowWidth + resolvedGridStyle.cellEdgeGlowBlurStrength * 2,\n );\n this.edgeGlowBlur.padding = glowPadding;\n this.edgeGlowLayer = new constructors.Container({ label: 'battle-entry-cell-edge-glow' });\n this.edgeGlowLayer.eventMode = 'none';\n this.edgeGlowLayer.interactiveChildren = false;\n this.edgeGlowLayer.filters = [this.edgeGlowBlur];\n this.edgeGlowLayer.addChild(this.edgeGlowParticleContainer);\n if (layout) {\n const particleBounds = new constructors.Rectangle(\n layout.offsetX,\n layout.offsetY,\n layout.renderW,\n layout.renderH,\n );\n this.particleContainer.boundsArea = particleBounds;\n this.edgeParticleContainer.boundsArea = new constructors.Rectangle(\n particleBounds.x,\n particleBounds.y,\n particleBounds.width,\n particleBounds.height,\n );\n this.edgeGlowParticleContainer.boundsArea = new constructors.Rectangle(\n particleBounds.x - glowPadding,\n particleBounds.y - glowPadding,\n particleBounds.width + glowPadding * 2,\n particleBounds.height + glowPadding * 2,\n );\n this.edgeGlowLayer.filterArea = new constructors.Rectangle(\n particleBounds.x - glowPadding,\n particleBounds.y - glowPadding,\n particleBounds.width + glowPadding * 2,\n particleBounds.height + glowPadding * 2,\n );\n this.verticalLines.position.set(layout.offsetX, layout.offsetY);\n this.horizontalLines.position.set(layout.offsetX, layout.offsetY);\n for (let column = 0; column <= layout.cols; column += 1) {\n this.verticalLines\n .rect(column * layout.cellW, 0, resolvedGridStyle.lineWidth, layout.renderH)\n .fill({ color: resolvedGridStyle.lineColor, alpha: resolvedGridStyle.lineAlpha });\n }\n for (let row = 0; row <= layout.rows; row += 1) {\n this.horizontalLines\n .rect(0, row * layout.cellH, layout.renderW, resolvedGridStyle.lineWidth)\n .fill({ color: resolvedGridStyle.lineColor, alpha: resolvedGridStyle.lineAlpha });\n }\n }\n this.verticalLines.scale.y = 0.001;\n this.horizontalLines.scale.x = 0.001;\n this.node.addChild(\n this.whiteVeil,\n this.particleContainer,\n this.edgeGlowLayer,\n this.edgeParticleContainer,\n this.verticalLines,\n this.horizontalLines,\n );\n }\n\n get temporaryObjectCount(): number {\n return 8 + this.particles.length + this.edgeParticles.length + this.edgeGlowParticles.length;\n }\n\n setHandoffProgress(progress: number): void {\n const alpha = resolveBattleEntryHandoffAlpha(progress, this.gridStyle.cellFillAlpha);\n this.whiteVeil.alpha = alpha.veilAlpha;\n this.particles.forEach((particle) => {\n particle.alpha = alpha.cellAlpha;\n });\n }\n\n setRevealProgress(\n progress: number,\n totalDuration: number,\n fadeDuration: number,\n gridFadeStartProgress: number,\n glowPeakProgress: number,\n glowIntensityScale = 1,\n ): void {\n const clampedProgress = Math.max(0, Math.min(1, progress));\n const clampedGridFadeStart = Math.max(0, Math.min(1, gridFadeStartProgress));\n const gridFadeProgress =\n clampedProgress >= 1\n ? 1\n : clampedProgress <= clampedGridFadeStart\n ? 0\n : (clampedProgress - clampedGridFadeStart) / Math.max(0.0001, 1 - clampedGridFadeStart);\n const gridAlpha = 1 - Math.max(0, Math.min(1, gridFadeProgress));\n this.verticalLines.alpha = gridAlpha;\n this.horizontalLines.alpha = gridAlpha;\n if (clampedProgress <= 0 || clampedProgress >= 1) {\n const fillAlpha = clampedProgress >= 1 ? 0 : this.gridStyle.cellFillAlpha;\n this.particles.forEach((particle) => (particle.alpha = fillAlpha));\n this.edgeParticles.forEach((particle) => (particle.alpha = 0));\n this.edgeGlowParticles.forEach((particle) => (particle.alpha = 0));\n return;\n }\n const duration = Math.max(0.0001, totalDuration);\n const fade = Math.max(0.0001, Math.min(duration, fadeDuration));\n const staggerWindow = Math.max(0, duration - fade);\n const elapsed = clampedProgress * duration;\n const lastBatchIndex = Math.max(1, this.revealBatchIndices.at(-1) ?? 0);\n this.particles.forEach((particle, index) => {\n const start = staggerWindow * ((this.revealBatchIndices[index] ?? 0) / lastBatchIndex);\n const pulse = resolveBattleEntryCellPulse((elapsed - start) / fade, glowPeakProgress);\n particle.alpha = this.gridStyle.cellFillAlpha * pulse.fill;\n const edgeAlpha = this.gridStyle.cellEdgeAlpha * pulse.edge * clampUnit(glowIntensityScale);\n const glowAlpha =\n this.gridStyle.cellEdgeGlowAlpha * pulse.edge * clampUnit(glowIntensityScale);\n for (let edgeIndex = 0; edgeIndex < 4; edgeIndex += 1) {\n const particleIndex = index * 4 + edgeIndex;\n const edgeParticle = this.edgeParticles[particleIndex];\n const glowParticle = this.edgeGlowParticles[particleIndex];\n if (edgeParticle) edgeParticle.alpha = edgeAlpha;\n if (glowParticle) glowParticle.alpha = glowAlpha;\n }\n });\n }\n\n hideGridLines(): void {\n this.verticalLines.visible = false;\n this.horizontalLines.visible = false;\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.edgeGlowLayer.filters = null;\n this.edgeGlowBlur.destroy();\n this.node.destroy({ children: true });\n }\n\n private createCellEdgeParticles(\n constructors: Constructors,\n texture: Texture,\n edgeWidth: number,\n ): Particle[] {\n const particles: Particle[] = [];\n const width = Math.max(0.5, edgeWidth);\n this.cells.forEach((cell) => {\n const rightX = cell.x + Math.max(0, cell.width - width);\n const bottomY = cell.y + Math.max(0, cell.height - width);\n particles.push(\n new constructors.Particle({\n texture,\n x: cell.x,\n y: cell.y,\n scaleX: cell.width / Math.max(1, texture.width),\n scaleY: width / Math.max(1, texture.height),\n tint: this.gridStyle.lineColor,\n alpha: 0,\n }),\n new constructors.Particle({\n texture,\n x: cell.x,\n y: bottomY,\n scaleX: cell.width / Math.max(1, texture.width),\n scaleY: width / Math.max(1, texture.height),\n tint: this.gridStyle.lineColor,\n alpha: 0,\n }),\n new constructors.Particle({\n texture,\n x: cell.x,\n y: cell.y,\n scaleX: width / Math.max(1, texture.width),\n scaleY: cell.height / Math.max(1, texture.height),\n tint: this.gridStyle.lineColor,\n alpha: 0,\n }),\n new constructors.Particle({\n texture,\n x: rightX,\n y: cell.y,\n scaleX: width / Math.max(1, texture.width),\n scaleY: cell.height / Math.max(1, texture.height),\n tint: this.gridStyle.lineColor,\n alpha: 0,\n }),\n );\n });\n return particles;\n }\n\n private createParticleContainer(\n constructors: Constructors,\n texture: Texture,\n particles: readonly Particle[],\n ): ParticleContainer {\n const container = new constructors.ParticleContainer({\n texture,\n particles: [...particles],\n dynamicProperties: {\n position: false,\n rotation: false,\n vertex: false,\n uvs: false,\n color: true,\n },\n });\n container.update();\n return container;\n }\n}\n", "import type { BlurFilter, Container, Graphics, Sprite, Texture } from 'pixi.js';\n\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\nimport type { PixiLayoutRect } from './PixiSessionLayout.js';\nimport type { PixiMediaBreathBinding, PixiMediaBreathRuntime } from './PixiMediaBreathRuntime.js';\n\ninterface Constructors {\n BlurFilter: typeof BlurFilter;\n Container: typeof Container;\n Graphics: typeof Graphics;\n Sprite: new (texture?: Texture | import('pixi.js').SpriteOptions) => Sprite;\n}\n\nexport interface StoryCardCutOptions {\n readonly duration: number;\n readonly travel: number;\n readonly shadowAlpha: number;\n}\n\nexport interface StoryCardCutFrame {\n readonly layer: 'back' | 'front';\n readonly x: number;\n readonly y: number;\n readonly rotation: number;\n readonly scale: number;\n readonly shadowAlpha: number;\n readonly shadowOffsetX: number;\n readonly shadowOffsetY: number;\n readonly edgeAlpha: number;\n}\n\nconst CUTOVER_PROGRESS = 0.44;\nconst SETTLE_PROGRESS = 0.82;\nconst DEGREES_TO_RADIANS = Math.PI / 180;\n\nconst clamp01 = (value: number): number => Math.max(0, Math.min(1, value));\nconst easeInOutCubic = (value: number): number =>\n value < 0.5 ? 4 * value * value * value : 1 - Math.pow(-2 * value + 2, 3) / 2;\nconst easeOutCubic = (value: number): number => 1 - Math.pow(1 - value, 3);\nconst mix = (from: number, to: number, progress: number): number => from + (to - from) * progress;\n\nexport const resolveStoryCardCutFrame = (\n progress: number,\n bounds: PixiLayoutRect,\n travel: number,\n maximumShadowAlpha: number,\n): StoryCardCutFrame => {\n const t = clamp01(progress);\n const travelX = bounds.width * Math.max(0, travel);\n const startX = travelX * 0.28;\n const peakX = travelX;\n const startY = -bounds.height * 0.018;\n const peakY = bounds.height * 0.034;\n const overshootX = -bounds.width * 0.012;\n const overshootY = bounds.height * 0.006;\n const maximumShadow = clamp01(maximumShadowAlpha);\n\n if (t < CUTOVER_PROGRESS) {\n const phase = easeInOutCubic(t / CUTOVER_PROGRESS);\n return {\n layer: 'back',\n x: mix(startX, peakX, phase),\n y: mix(startY, peakY, phase),\n rotation: mix(1.4, 2.8, phase) * DEGREES_TO_RADIANS,\n scale: mix(0.982, 0.994, phase),\n shadowAlpha: mix(maximumShadow * 0.22, maximumShadow, phase),\n shadowOffsetX: mix(8, 24, phase),\n shadowOffsetY: mix(10, 20, phase),\n edgeAlpha: mix(0.42, 0.92, phase),\n };\n }\n\n if (t < SETTLE_PROGRESS) {\n const phase = easeOutCubic((t - CUTOVER_PROGRESS) / (SETTLE_PROGRESS - CUTOVER_PROGRESS));\n return {\n layer: 'front',\n x: mix(peakX, overshootX, phase),\n y: mix(peakY, overshootY, phase),\n rotation: mix(2.8, -0.45, phase) * DEGREES_TO_RADIANS,\n scale: mix(0.994, 1.002, phase),\n shadowAlpha: mix(maximumShadow, maximumShadow * 0.28, phase),\n shadowOffsetX: mix(24, 5, phase),\n shadowOffsetY: mix(20, 7, phase),\n edgeAlpha: mix(0.92, 0.28, phase),\n };\n }\n\n const phase = easeOutCubic((t - SETTLE_PROGRESS) / (1 - SETTLE_PROGRESS));\n return {\n layer: 'front',\n x: mix(overshootX, 0, phase),\n y: mix(overshootY, 0, phase),\n rotation: mix(-0.45, 0, phase) * DEGREES_TO_RADIANS,\n scale: mix(1.002, 1, phase),\n shadowAlpha: mix(maximumShadow * 0.28, 0, phase),\n shadowOffsetX: mix(5, 0, phase),\n shadowOffsetY: mix(7, 0, phase),\n edgeAlpha: mix(0.28, 0, phase),\n };\n};\n\nexport class PixiStoryCardCut {\n readonly node: Container;\n private readonly page: Sprite;\n private readonly backing: Graphics;\n private readonly shadow: Graphics;\n private readonly edge: Graphics;\n private readonly shadowBlur: BlurFilter;\n private activeVersion = 0;\n private progress = 0;\n private boundsResolver: (() => PixiLayoutRect) | null = null;\n private options: StoryCardCutOptions = {\n duration: 0.78,\n travel: 0.18,\n shadowAlpha: 0.42,\n };\n private frontVisible = false;\n private onFrontVisible: (() => void) | null = null;\n private readonly mediaBreathBinding: PixiMediaBreathBinding | null;\n\n constructor(\n private readonly backLayer: Container,\n private readonly frontLayer: Container,\n constructors: Constructors,\n private readonly animation: PixiAnimationDirector,\n private readonly requestRender: () => void,\n private readonly photoColors: { paper: string; shadow: string; paperEdge: string },\n mediaBreath?: PixiMediaBreathRuntime,\n ) {\n this.node = new constructors.Container();\n this.shadow = new constructors.Graphics();\n this.shadowBlur = new constructors.BlurFilter({ strength: 14, quality: 2 });\n this.shadow.filters = [this.shadowBlur];\n this.backing = new constructors.Graphics();\n this.page = new constructors.Sprite();\n this.mediaBreathBinding = mediaBreath?.attach(this.page, 'primary') ?? null;\n this.edge = new constructors.Graphics();\n this.node.addChild(this.shadow, this.backing, this.page, this.edge);\n this.node.visible = false;\n backLayer.addChild(this.node);\n }\n\n async play(\n texture: Texture,\n boundsResolver: () => PixiLayoutRect,\n options: StoryCardCutOptions,\n signal: AbortSignal,\n onFrontVisible: () => void,\n ): Promise<boolean> {\n const version = ++this.activeVersion;\n this.progress = 0;\n this.boundsResolver = boundsResolver;\n this.options = options;\n this.frontVisible = false;\n this.onFrontVisible = onFrontVisible;\n this.page.texture = texture;\n this.backLayer.addChild(this.node);\n this.node.visible = true;\n this.applyFrame();\n const state = { value: 0 };\n\n await this.animation.tween(\n state,\n {\n value: 1,\n duration: options.duration,\n ease: 'none',\n onUpdate: () => {\n if (version !== this.activeVersion || signal.aborted) return;\n this.progress = state.value;\n this.applyFrame();\n this.requestRender();\n },\n },\n signal,\n );\n\n if (version !== this.activeVersion || signal.aborted) return false;\n this.progress = 1;\n this.applyFrame();\n this.requestRender();\n return true;\n }\n\n refresh(): void {\n if (!this.node.visible) return;\n this.applyFrame();\n }\n\n hide(): void {\n const wasVisible = this.node.visible;\n this.activeVersion += 1;\n this.node.visible = false;\n this.boundsResolver = null;\n this.onFrontVisible = null;\n this.node.position.set(0, 0);\n this.node.scale.set(1, 1);\n this.node.rotation = 0;\n this.backLayer.addChild(this.node);\n if (wasVisible) this.requestRender();\n }\n\n destroy(): void {\n this.hide();\n this.shadow.filters = null;\n this.shadowBlur.destroy();\n this.mediaBreathBinding?.release();\n this.node.destroy({ children: true });\n }\n\n private applyFrame(): void {\n const bounds = this.boundsResolver?.();\n if (!bounds) return;\n const frame = resolveStoryCardCutFrame(\n this.progress,\n bounds,\n this.options.travel,\n this.options.shadowAlpha,\n );\n if (frame.layer === 'front' && !this.frontVisible) {\n this.frontVisible = true;\n this.frontLayer.addChild(this.node);\n this.onFrontVisible?.();\n }\n\n const halfWidth = bounds.width / 2;\n const halfHeight = bounds.height / 2;\n this.page.position.set(-halfWidth, -halfHeight);\n this.page.width = bounds.width;\n this.page.height = bounds.height;\n this.backing\n .clear()\n .roundRect(-halfWidth - 2, -halfHeight - 2, bounds.width + 4, bounds.height + 4, 5)\n .fill(this.photoColors.paper);\n this.shadow\n .clear()\n .roundRect(-halfWidth, -halfHeight, bounds.width, bounds.height, 5)\n .fill(this.photoColors.shadow);\n this.edge\n .clear()\n .rect(halfWidth - 3, -halfHeight, 3, bounds.height)\n .rect(-halfWidth, halfHeight - 3, bounds.width, 3)\n .fill(this.photoColors.paperEdge);\n this.node.position.set(bounds.x + halfWidth + frame.x, bounds.y + halfHeight + frame.y);\n this.node.scale.set(frame.scale, frame.scale);\n this.node.rotation = frame.rotation;\n this.shadow.position.set(frame.shadowOffsetX, frame.shadowOffsetY);\n this.shadow.alpha = frame.shadowAlpha;\n this.edge.alpha = frame.edgeAlpha;\n }\n}\n", "import type { Container } from 'pixi.js';\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\n\nimport type { PixiBattleWhipHandle, PixiBattleWhipResources } from './PixiBattleWhipResources.js';\nimport { resolveBattleTokenVisualLayout } from './PixiBattleVisualLayout.js';\nimport type { SessionTuningResolver } from './tuning/SessionTuningResolver.js';\nimport type { SessionTuningPath } from './tuning/SessionTuningTypes.js';\n\ninterface WhipMotionContext {\n resources: PixiBattleWhipResources;\n parent: Container;\n director: PixiAnimationDirector;\n world: {\n getCellSize?(): { width: number; height: number };\n isReducedMotionEnabled?(): boolean;\n getPresentationNode(id: string): { position: { x: number; y: number } } | null;\n };\n style: {\n widthCellRatio: number;\n bendCellRatio: number;\n tipRatio: number;\n alpha: number;\n bodyColor: string;\n edgeColor: string;\n };\n tuning?: SessionTuningResolver;\n attackerId: string;\n from: { x: number; y: number };\n target: { x: number; y: number };\n miss: boolean;\n onStrike?: () => void;\n}\n\n/** A single lease spans approach, contact and return; the caller releases it in finally. */\nexport class PixiBattleWhipMotion {\n private handle: PixiBattleWhipHandle | null = null;\n private generation = 0;\n private readonly pose = { reach: 0.12, bend: 0, phase: 0, alpha: 1 };\n private readonly cell: number;\n private readonly reducedMotion: boolean;\n private readonly settings;\n\n constructor(private readonly context: WhipMotionContext) {\n const cells = context.world.getCellSize?.();\n this.cell = Math.min(cells?.width ?? 96, cells?.height ?? 96);\n this.reducedMotion = context.world.isReducedMotionEnabled?.() ?? false;\n const defaults = this.context.style;\n this.settings = {\n width:\n this.number('visual.battle.actionFx.whipWidthCellRatio', defaults.widthCellRatio) *\n this.cell,\n bend:\n this.number('visual.battle.actionFx.whipBendCellRatio', defaults.bendCellRatio) * this.cell,\n tipRatio: this.number('visual.battle.actionFx.whipTipRatio', defaults.tipRatio),\n alpha: this.number('visual.battle.actionFx.whipAlpha', defaults.alpha),\n linkLength: this.number('visual.battle.actionFx.whipLinkLengthCellRatio', 0.18) * this.cell,\n blur: this.number('visual.battle.actionFx.whipMotionBlurCellRatio', 0.3) * this.cell,\n windupMs: this.number('motion.battle.actionFx.whipWindupMs', 140),\n strikeMs: this.number('motion.battle.actionFx.whipStrikeMs', 220),\n holdMs: this.number('motion.battle.actionFx.whipHoldMs', 60),\n returnMs: this.number('motion.battle.actionFx.whipReturnMs', 260),\n };\n }\n\n get strikeSeconds(): number {\n return Math.max(0, this.settings.strikeMs) / 1000;\n }\n\n async approach(signal: AbortSignal, dodge: () => Promise<void>): Promise<void> {\n if (signal.aborted) return;\n const defaults = this.context.style;\n this.handle = this.context.resources.acquire(\n this.context.parent,\n this.color('visual.battle.actionFx.whipBodyColor', defaults.bodyColor),\n this.color('visual.battle.actionFx.whipEdgeColor', defaults.edgeColor),\n );\n this.generation = this.handle?.generation ?? 0;\n if (this.reducedMotion) {\n this.context.onStrike?.();\n this.pose.reach = 1;\n this.pose.bend = 0;\n this.draw();\n await this.tween({ alpha: 1 }, 70, signal, 'none');\n return;\n }\n this.pose.bend = this.settings.bend * 0.35;\n this.draw();\n await this.tween(\n { reach: 0.08, bend: this.settings.bend, phase: 0.2 },\n this.settings.windupMs,\n signal,\n 'power2.in',\n );\n if (signal.aborted) return;\n this.context.onStrike?.();\n await Promise.all([\n this.tween(\n { reach: 1, bend: this.settings.bend * 0.12, phase: 1 },\n this.settings.strikeMs,\n signal,\n 'power3.in',\n ),\n dodge(),\n ]);\n }\n\n async hold(signal: AbortSignal): Promise<void> {\n await this.tween({ phase: 1.05 }, this.settings.holdMs, signal, 'none');\n }\n\n async retract(signal: AbortSignal): Promise<void> {\n if (this.reducedMotion) {\n await this.tween({ alpha: 0 }, 100, signal, 'none');\n return;\n }\n await this.tween(\n { reach: 0.005, bend: this.settings.bend * 0.22, phase: 2, alpha: 0 },\n this.settings.returnMs,\n signal,\n 'power2.inOut',\n );\n }\n\n release(): void {\n this.context.resources.release(this.handle, this.generation);\n this.handle = null;\n }\n\n private number(path: SessionTuningPath, fallback: number): number {\n const value = this.context.tuning?.get(path);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n }\n\n private color(path: SessionTuningPath, fallback: string): string {\n const value = this.context.tuning?.get(path);\n return typeof value === 'string' ? value : fallback;\n }\n\n private async tween(\n target: Partial<typeof this.pose>,\n durationMs: number,\n signal: AbortSignal,\n ease: string,\n ): Promise<void> {\n if (signal.aborted) return;\n await this.context.director.tween(\n this.pose,\n {\n ...target,\n duration: Math.max(0, durationMs) / 1000,\n reducedMotionDuration: Math.max(0, durationMs) / 1000,\n ease,\n onUpdate: () => {\n if (!signal.aborted) this.draw();\n },\n },\n signal,\n );\n if (!signal.aborted) {\n Object.assign(this.pose, target);\n this.draw();\n }\n }\n\n private draw(): void {\n const handle = this.handle;\n if (!handle || handle.released || handle.generation !== this.generation) return;\n const { from, target, attackerId, world } = this.context;\n const origin = world.getPresentationNode(attackerId)?.position ?? from;\n const dx = target.x - from.x;\n const dy = target.y - from.y;\n const distance = Math.hypot(dx, dy);\n const ux = distance > 0 ? dx / distance : 1;\n const uy = distance > 0 ? dy / distance : 0;\n const radius = resolveBattleTokenVisualLayout(this.cell).ringDiameter / 2;\n const rootX = origin.x + ux * radius;\n const rootY = origin.y + uy * radius;\n const missOffset = this.context.miss ? this.cell * 0.65 : 0;\n const endX = target.x - uy * missOffset;\n const endY = target.y + ux * missOffset;\n const length = Math.max(1, Math.hypot(endX - rootX, endY - rootY));\n handle.mesh.position.set(rootX, rootY);\n handle.mesh.rotation = Math.atan2(endY - rootY, endX - rootX);\n handle.mesh.alpha = this.settings.alpha * this.pose.alpha;\n this.context.resources.update(\n handle,\n {\n length,\n reach: this.pose.reach,\n bend: this.pose.bend,\n phase: this.pose.phase,\n width: this.settings.width,\n tipRatio: this.settings.tipRatio,\n },\n {\n linkLength: this.settings.linkLength,\n blur: this.reducedMotion\n ? 0\n : this.settings.blur * (1 + Math.sin(Math.PI * this.pose.phase) ** 2),\n },\n );\n }\n}\n", "import type { EffectPrimitiveDescriptor } from './primitives.js';\nimport type {\n EffectRecipeDefinition,\n EffectRecipeId,\n EffectRecipeTrackDefinition,\n ResolvedRecipeValue,\n} from './schema.js';\n\nexport type EffectPrimitiveResolvedParams = Record<string, ResolvedRecipeValue>;\nexport interface EffectPrimitiveRuntimeHandle {\n cleanup(): void;\n completed?: Promise<void>;\n cleanupPolicy?: 'track-end' | 'recipe-end';\n}\nexport type EffectPrimitiveCleanup = void | (() => void) | EffectPrimitiveRuntimeHandle;\nexport type EffectPrimitiveExecuteResult = EffectPrimitiveCleanup | Promise<EffectPrimitiveCleanup>;\n\nexport interface EffectPrimitiveExecutionContext<TRuntimeContext = unknown> {\n recipeId: EffectRecipeId;\n recipe: EffectRecipeDefinition;\n track: EffectRecipeTrackDefinition;\n primitive: EffectPrimitiveDescriptor;\n runtimeContext: TRuntimeContext;\n}\n\nexport interface EffectPrimitiveRuntime<TRuntimeContext = unknown> {\n readonly primitiveId: string;\n readonly consumedParams?: readonly string[];\n execute(\n context: EffectPrimitiveExecutionContext<TRuntimeContext>,\n params: EffectPrimitiveResolvedParams,\n signal: AbortSignal,\n ): EffectPrimitiveExecuteResult;\n}\n\nexport class EffectPrimitiveRuntimeRegistry<TRuntimeContext = unknown> {\n private readonly runtimes = new Map<string, EffectPrimitiveRuntime<TRuntimeContext>>();\n\n register(runtime: EffectPrimitiveRuntime<TRuntimeContext>): void {\n if (this.runtimes.has(runtime.primitiveId)) {\n throw new Error(`\u91CD\u590D\u7684 effect primitive runtime: ${runtime.primitiveId}`);\n }\n this.runtimes.set(runtime.primitiveId, runtime);\n }\n\n get(primitiveId: string): EffectPrimitiveRuntime<TRuntimeContext> | null {\n return this.runtimes.get(primitiveId) ?? null;\n }\n\n listIds(): readonly string[] {\n return [...this.runtimes.keys()].sort((left, right) => left.localeCompare(right, 'zh-CN'));\n }\n}\n", "const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport const EFFECT_RECIPE_SCHEMA_VERSION = 4;\nexport const EFFECT_RECIPE_SCOPES = ['story', 'battle'] as const;\nexport const EFFECT_RECIPE_CATEGORIES = ['entrance', 'utility'] as const;\n\nexport const EFFECT_RECIPE_ID_MAX_LENGTH = 80;\nexport const EFFECT_RECIPE_TRACK_ID_MAX_LENGTH = 80;\nexport const EFFECT_RECIPE_PRIMITIVE_ID_MAX_LENGTH = 80;\nexport const EFFECT_RECIPE_NAME_MAX_CODE_POINTS = 80;\nexport const EFFECT_RECIPE_DESCRIPTION_MAX_CODE_POINTS = 240;\nexport const EFFECT_RECIPE_APP_LABEL_MAX_CODE_POINTS = 48;\nexport const EFFECT_RECIPE_APP_SHORT_DESCRIPTION_MAX_CODE_POINTS = 120;\nexport const EFFECT_RECIPE_APP_ICON_ID_MAX_LENGTH = 80;\nexport const EFFECT_RECIPE_MAX_DURATION_MS = 20_000;\nexport const EFFECT_RECIPE_MAX_TRACKS = 24;\nexport const EFFECT_RECIPE_VALUE_MAX_STRING_CODE_POINTS = 240;\nexport const EFFECT_RECIPE_VALUE_MAX_ARRAY_LENGTH = 8;\nexport const EFFECT_RECIPE_TUNING_PATH_MAX_LENGTH = 160;\nexport const EFFECT_RECIPE_APP_ORDER_MAX = 9_999;\n\nexport const EFFECT_RECIPE_STABLE_ID_REGEX = /^[A-Za-z0-9][A-Za-z0-9._:/-]*$/;\nexport const EFFECT_RECIPE_TUNING_PATH_REGEX = /^[A-Za-z][A-Za-z0-9]*(\\.[A-Za-z0-9_-]+)+$/;\n\nconst hasOwn = (value: Record<string, unknown>, key: string): boolean =>\n Object.prototype.hasOwnProperty.call(value, key);\n\nconst codePointLength = (value: string): number => Array.from(value).length;\n\nconst normalizeText = (\n value: unknown,\n maxCodePoints: number,\n allowEmpty = false,\n): string | null => {\n if (typeof value !== 'string') {\n return null;\n }\n\n const normalized = value.trim();\n if ((!allowEmpty && !normalized) || codePointLength(normalized) > maxCodePoints) {\n return null;\n }\n\n return normalized;\n};\n\nconst normalizeNonNegativeInteger = (value: unknown, maxValue: number): number | null => {\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0 || value > maxValue) {\n return null;\n }\n\n return value;\n};\n\nconst createError = (\n code: EffectRecipeValidationErrorCode,\n path: string,\n message: string,\n): EffectRecipeValidationError => ({ code, path, message });\n\nexport type EffectRecipeScope = (typeof EFFECT_RECIPE_SCOPES)[number];\nexport type EffectRecipeCategory = (typeof EFFECT_RECIPE_CATEGORIES)[number];\nexport type EffectRecipeId = string;\nexport type EffectRecipeTrackId = string;\nexport type EffectPrimitiveId = string;\n\nexport interface EffectRecipeTuningPathReference {\n tuningPath: string;\n}\n\nexport type RecipeValue = string | number | boolean | number[] | EffectRecipeTuningPathReference;\nexport type ResolvedRecipeValue = string | number | boolean | number[];\n\nexport interface EffectRecipeAppMetadata {\n label: string;\n shortDescription: string;\n iconId: string;\n order: number;\n}\n\nexport const EFFECT_TARGETS = ['main-content', 'story-workspace', 'full-stage'] as const;\nexport type EffectTarget = (typeof EFFECT_TARGETS)[number];\nexport interface EffectRecipeTrackDefinition {\n target?: EffectTarget;\n id: EffectRecipeTrackId;\n atMs: number;\n durationMs: number;\n primitiveId: EffectPrimitiveId;\n params: Record<string, RecipeValue>;\n enabled: boolean;\n}\n\nexport interface EffectRecipeDefinition {\n schemaVersion: typeof EFFECT_RECIPE_SCHEMA_VERSION;\n id: EffectRecipeId;\n name: string;\n description: string;\n scope: EffectRecipeScope;\n category: EffectRecipeCategory;\n durationMs: number;\n commitAtMs: number;\n app: EffectRecipeAppMetadata;\n tracks: readonly EffectRecipeTrackDefinition[];\n}\n\nexport type EffectRecipeManifestDocument = Readonly<Record<string, unknown>>;\n\nexport type EffectRecipeValidationErrorCode =\n | 'duplicate_recipe_id'\n | 'duplicate_track_id'\n | 'invalid_enum'\n | 'invalid_id'\n | 'invalid_length'\n | 'invalid_param_type'\n | 'invalid_param_value'\n | 'invalid_recipe_value'\n | 'invalid_schema_version'\n | 'invalid_tuning_path'\n | 'invalid_type'\n | 'missing_param'\n | 'out_of_range'\n | 'too_many_items'\n | 'unknown_param'\n | 'unknown_primitive'\n | 'unknown_schema_version'\n | 'unsupported_scope';\n\nexport interface EffectRecipeValidationError {\n code: EffectRecipeValidationErrorCode;\n path: string;\n message: string;\n}\n\nexport interface EffectRecipeMigration {\n schemaVersion: number;\n migrate(definition: EffectRecipeManifestDocument): unknown;\n}\n\nexport interface EffectRecipeMigrationResult {\n document: EffectRecipeManifestDocument | null;\n errors: readonly EffectRecipeValidationError[];\n}\n\nexport interface EffectRecipeDefinitionValidationResult {\n definition: EffectRecipeDefinition | null;\n errors: readonly EffectRecipeValidationError[];\n}\n\nconst v4Migration: EffectRecipeMigration = {\n schemaVersion: 4,\n migrate: (definition) => definition,\n};\n\nexport const EFFECT_RECIPE_MIGRATIONS = [v4Migration] as const;\n\nconst effectRecipeMigrationMap = new Map<number, EffectRecipeMigration>(\n EFFECT_RECIPE_MIGRATIONS.map((migration) => [migration.schemaVersion, migration]),\n);\n\nexport const effectRecipeMigrationRegistry = Object.freeze({\n all: (): readonly EffectRecipeMigration[] => EFFECT_RECIPE_MIGRATIONS,\n get: (schemaVersion: number): EffectRecipeMigration | null =>\n effectRecipeMigrationMap.get(schemaVersion) ?? null,\n});\n\nexport const isEffectRecipeScope = (value: unknown): value is EffectRecipeScope =>\n value === 'story' || value === 'battle';\n\nexport const isEffectRecipeCategory = (value: unknown): value is EffectRecipeCategory =>\n value === 'entrance' || value === 'utility';\n\nexport const isEffectRecipeId = (value: unknown): value is EffectRecipeId => {\n const normalized = normalizeText(value, EFFECT_RECIPE_ID_MAX_LENGTH);\n return normalized !== null && EFFECT_RECIPE_STABLE_ID_REGEX.test(normalized);\n};\n\nexport const isEffectRecipeTrackId = (value: unknown): value is EffectRecipeTrackId => {\n const normalized = normalizeText(value, EFFECT_RECIPE_TRACK_ID_MAX_LENGTH);\n return normalized !== null && EFFECT_RECIPE_STABLE_ID_REGEX.test(normalized);\n};\n\nexport const isEffectPrimitiveId = (value: unknown): value is EffectPrimitiveId => {\n const normalized = normalizeText(value, EFFECT_RECIPE_PRIMITIVE_ID_MAX_LENGTH);\n return normalized !== null && EFFECT_RECIPE_STABLE_ID_REGEX.test(normalized);\n};\n\nexport const isEffectRecipeTuningPath = (value: unknown): value is string => {\n const normalized = normalizeText(value, EFFECT_RECIPE_TUNING_PATH_MAX_LENGTH);\n return normalized !== null && EFFECT_RECIPE_TUNING_PATH_REGEX.test(normalized);\n};\n\nexport const isEffectRecipeTuningPathReference = (\n value: unknown,\n): value is EffectRecipeTuningPathReference =>\n isRecord(value) &&\n Object.keys(value).length === 1 &&\n hasOwn(value, 'tuningPath') &&\n isEffectRecipeTuningPath(value.tuningPath);\n\nexport const isResolvedRecipeValue = (value: unknown): value is ResolvedRecipeValue => {\n if (typeof value === 'string' || typeof value === 'boolean') {\n return true;\n }\n if (typeof value === 'number') {\n return Number.isFinite(value);\n }\n return (\n Array.isArray(value) &&\n value.length <= EFFECT_RECIPE_VALUE_MAX_ARRAY_LENGTH &&\n value.every((entry) => typeof entry === 'number' && Number.isFinite(entry))\n );\n};\n\nconst parseRecipeValue = (\n value: unknown,\n path: string,\n errors: EffectRecipeValidationError[],\n): RecipeValue | null => {\n if (typeof value === 'string') {\n const normalized = normalizeText(value, EFFECT_RECIPE_VALUE_MAX_STRING_CODE_POINTS);\n if (normalized === null) {\n errors.push(\n createError('invalid_length', path, '\u5B57\u7B26\u4E32\u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u4E14\u957F\u5EA6\u5FC5\u987B\u5728\u5141\u8BB8\u8303\u56F4\u5185\u3002'),\n );\n return null;\n }\n return normalized;\n }\n\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n errors.push(createError('invalid_recipe_value', path, '\u6570\u503C\u53C2\u6570\u5FC5\u987B\u662F\u6709\u9650\u6570\u5B57\u3002'));\n return null;\n }\n return value;\n }\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n if (value.length > EFFECT_RECIPE_VALUE_MAX_ARRAY_LENGTH) {\n errors.push(\n createError(\n 'too_many_items',\n path,\n `\u6570\u5B57\u6570\u7EC4\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7 ${EFFECT_RECIPE_VALUE_MAX_ARRAY_LENGTH}\u3002`,\n ),\n );\n return null;\n }\n if (!value.every((entry) => typeof entry === 'number' && Number.isFinite(entry))) {\n errors.push(createError('invalid_recipe_value', path, '\u6570\u5B57\u6570\u7EC4\u53EA\u80FD\u5305\u542B\u6709\u9650\u6570\u5B57\u3002'));\n return null;\n }\n return [...value];\n }\n\n if (isRecord(value)) {\n if (!hasOwn(value, 'tuningPath') || Object.keys(value).length !== 1) {\n errors.push(\n createError('invalid_recipe_value', path, '\u5BF9\u8C61\u53C2\u6570\u53EA\u5141\u8BB8\u4F7F\u7528 tuningPath \u5F15\u7528\u3002'),\n );\n return null;\n }\n if (!isEffectRecipeTuningPath(value.tuningPath)) {\n errors.push(\n createError('invalid_tuning_path', `${path}.tuningPath`, 'tuningPath \u683C\u5F0F\u65E0\u6548\u3002'),\n );\n return null;\n }\n return { tuningPath: value.tuningPath.trim() };\n }\n\n errors.push(\n createError(\n 'invalid_recipe_value',\n path,\n '\u53C2\u6570\u503C\u53EA\u5141\u8BB8 string\u3001number\u3001boolean\u3001number[] \u6216 { tuningPath }\u3002',\n ),\n );\n return null;\n};\n\nexport const migrateEffectRecipeDefinition = (value: unknown): EffectRecipeMigrationResult => {\n if (!isRecord(value)) {\n return {\n document: null,\n errors: [createError('invalid_type', '', 'Recipe \u5B9A\u4E49\u5FC5\u987B\u662F\u5BF9\u8C61\u3002')],\n };\n }\n\n const schemaVersion = value.schemaVersion;\n if (typeof schemaVersion !== 'number' || !Number.isSafeInteger(schemaVersion)) {\n return {\n document: null,\n errors: [\n createError('invalid_schema_version', 'schemaVersion', 'schemaVersion \u5FC5\u987B\u662F\u5B89\u5168\u6574\u6570\u3002'),\n ],\n };\n }\n\n const migration = effectRecipeMigrationMap.get(schemaVersion);\n if (!migration) {\n return {\n document: null,\n errors: [\n createError(\n 'unknown_schema_version',\n 'schemaVersion',\n `\u672A\u6CE8\u518C\u7684 recipe schemaVersion: ${schemaVersion}\u3002`,\n ),\n ],\n };\n }\n\n if (value.category === 'sequence' || value.category === 'horror')\n return {\n document: null,\n errors: [createError('invalid_enum', 'category', '\u8BE5\u7C7B Story \u6F14\u51FA\u5DF2\u9000\u5F79\u3002')],\n };\n const migrated = migration.migrate(value);\n if (!isRecord(migrated)) {\n return {\n document: null,\n errors: [createError('invalid_type', '', '\u8FC1\u79FB\u540E\u7684 Recipe \u5B9A\u4E49\u5FC5\u987B\u662F\u5BF9\u8C61\u3002')],\n };\n }\n\n return { document: migrated, errors: [] };\n};\n\nexport const validateEffectRecipeDefinition = (\n value: unknown,\n): EffectRecipeDefinitionValidationResult => {\n const migrationResult = migrateEffectRecipeDefinition(value);\n if (!migrationResult.document) {\n return { definition: null, errors: migrationResult.errors };\n }\n\n const document = migrationResult.document;\n const errors: EffectRecipeValidationError[] = [];\n const schemaVersion = document.schemaVersion;\n if (schemaVersion !== EFFECT_RECIPE_SCHEMA_VERSION) {\n errors.push(\n createError(\n 'invalid_schema_version',\n 'schemaVersion',\n `schemaVersion \u5FC5\u987B\u4E3A ${EFFECT_RECIPE_SCHEMA_VERSION}\u3002`,\n ),\n );\n }\n\n const id = normalizeText(document.id, EFFECT_RECIPE_ID_MAX_LENGTH);\n if (!id || !EFFECT_RECIPE_STABLE_ID_REGEX.test(id)) {\n errors.push(createError('invalid_id', 'id', 'Recipe id \u5FC5\u987B\u662F\u7A33\u5B9A\u6807\u8BC6\u7B26\u3002'));\n }\n\n const name = normalizeText(document.name, EFFECT_RECIPE_NAME_MAX_CODE_POINTS);\n if (!name) {\n errors.push(\n createError('invalid_length', 'name', 'Recipe name \u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u4E14\u957F\u5EA6\u5FC5\u987B\u5728\u5141\u8BB8\u8303\u56F4\u5185\u3002'),\n );\n }\n\n const description = normalizeText(\n document.description,\n EFFECT_RECIPE_DESCRIPTION_MAX_CODE_POINTS,\n );\n if (!description) {\n errors.push(\n createError(\n 'invalid_length',\n 'description',\n 'Recipe description \u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u4E14\u957F\u5EA6\u5FC5\u987B\u5728\u5141\u8BB8\u8303\u56F4\u5185\u3002',\n ),\n );\n }\n\n const scope = document.scope;\n if (!isEffectRecipeScope(scope)) {\n errors.push(createError('invalid_enum', 'scope', 'scope \u5FC5\u987B\u662F story \u6216 battle\u3002'));\n }\n\n const category = document.category;\n if (!isEffectRecipeCategory(category)) {\n errors.push(createError('invalid_enum', 'category', 'category \u5FC5\u987B\u662F entrance \u6216 utility\u3002'));\n }\n\n const durationMs = normalizeNonNegativeInteger(\n document.durationMs,\n EFFECT_RECIPE_MAX_DURATION_MS,\n );\n if (durationMs === null) {\n errors.push(\n createError(\n 'out_of_range',\n 'durationMs',\n `durationMs \u5FC5\u987B\u662F 0 \u5230 ${EFFECT_RECIPE_MAX_DURATION_MS} \u7684\u5B89\u5168\u6574\u6570\u3002`,\n ),\n );\n }\n\n const commitAtMs = normalizeNonNegativeInteger(\n document.commitAtMs,\n EFFECT_RECIPE_MAX_DURATION_MS,\n );\n if (commitAtMs === null) {\n errors.push(\n createError(\n 'out_of_range',\n 'commitAtMs',\n `commitAtMs \u5FC5\u987B\u662F 0 \u5230 ${EFFECT_RECIPE_MAX_DURATION_MS} \u7684\u5B89\u5168\u6574\u6570\u3002`,\n ),\n );\n } else if (durationMs !== null && commitAtMs > durationMs) {\n errors.push(createError('out_of_range', 'commitAtMs', 'commitAtMs \u4E0D\u80FD\u5927\u4E8E durationMs\u3002'));\n }\n\n let app: EffectRecipeAppMetadata | null = null;\n if (!isRecord(document.app)) {\n errors.push(createError('invalid_type', 'app', 'app \u5143\u6570\u636E\u5FC5\u987B\u662F\u5BF9\u8C61\u3002'));\n } else {\n const label = normalizeText(document.app.label, EFFECT_RECIPE_APP_LABEL_MAX_CODE_POINTS);\n if (!label) {\n errors.push(\n createError('invalid_length', 'app.label', 'app.label \u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u4E14\u957F\u5EA6\u5FC5\u987B\u5728\u5141\u8BB8\u8303\u56F4\u5185\u3002'),\n );\n }\n const shortDescription = normalizeText(\n document.app.shortDescription,\n EFFECT_RECIPE_APP_SHORT_DESCRIPTION_MAX_CODE_POINTS,\n );\n if (!shortDescription) {\n errors.push(\n createError(\n 'invalid_length',\n 'app.shortDescription',\n 'app.shortDescription \u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u4E14\u957F\u5EA6\u5FC5\u987B\u5728\u5141\u8BB8\u8303\u56F4\u5185\u3002',\n ),\n );\n }\n const iconId = normalizeText(document.app.iconId, EFFECT_RECIPE_APP_ICON_ID_MAX_LENGTH);\n if (!iconId || !EFFECT_RECIPE_STABLE_ID_REGEX.test(iconId)) {\n errors.push(createError('invalid_id', 'app.iconId', 'app.iconId \u5FC5\u987B\u662F\u7A33\u5B9A\u6807\u8BC6\u7B26\u3002'));\n }\n const order = normalizeNonNegativeInteger(document.app.order, EFFECT_RECIPE_APP_ORDER_MAX);\n if (order === null) {\n errors.push(\n createError(\n 'out_of_range',\n 'app.order',\n `app.order \u5FC5\u987B\u662F 0 \u5230 ${EFFECT_RECIPE_APP_ORDER_MAX} \u7684\u5B89\u5168\u6574\u6570\u3002`,\n ),\n );\n }\n if (\n label &&\n shortDescription &&\n iconId &&\n EFFECT_RECIPE_STABLE_ID_REGEX.test(iconId) &&\n order !== null\n ) {\n app = {\n label,\n shortDescription,\n iconId,\n order,\n };\n }\n }\n\n const rawTracks = document.tracks;\n const tracks: EffectRecipeTrackDefinition[] = [];\n const seenTrackIds = new Set<string>();\n if (!Array.isArray(rawTracks)) {\n errors.push(createError('invalid_type', 'tracks', 'tracks \u5FC5\u987B\u662F\u6570\u7EC4\u3002'));\n } else if (rawTracks.length === 0) {\n errors.push(createError('invalid_length', 'tracks', 'tracks \u81F3\u5C11\u9700\u8981\u4E00\u4E2A track\u3002'));\n } else if (rawTracks.length > EFFECT_RECIPE_MAX_TRACKS) {\n errors.push(\n createError('too_many_items', 'tracks', `tracks \u6570\u91CF\u4E0D\u80FD\u8D85\u8FC7 ${EFFECT_RECIPE_MAX_TRACKS}\u3002`),\n );\n } else {\n rawTracks.forEach((rawTrack, trackIndex) => {\n const trackPath = `tracks[${trackIndex}]`;\n if (!isRecord(rawTrack)) {\n errors.push(createError('invalid_type', trackPath, 'track \u5FC5\u987B\u662F\u5BF9\u8C61\u3002'));\n return;\n }\n\n const trackId = normalizeText(rawTrack.id, EFFECT_RECIPE_TRACK_ID_MAX_LENGTH);\n if (!trackId || !EFFECT_RECIPE_STABLE_ID_REGEX.test(trackId)) {\n errors.push(createError('invalid_id', `${trackPath}.id`, 'track id \u5FC5\u987B\u662F\u7A33\u5B9A\u6807\u8BC6\u7B26\u3002'));\n } else if (seenTrackIds.has(trackId)) {\n errors.push(\n createError('duplicate_track_id', `${trackPath}.id`, `\u91CD\u590D\u7684 track id: ${trackId}\u3002`),\n );\n } else {\n seenTrackIds.add(trackId);\n }\n\n const atMs = normalizeNonNegativeInteger(rawTrack.atMs, EFFECT_RECIPE_MAX_DURATION_MS);\n if (atMs === null) {\n errors.push(\n createError(\n 'out_of_range',\n `${trackPath}.atMs`,\n `track.atMs \u5FC5\u987B\u662F 0 \u5230 ${EFFECT_RECIPE_MAX_DURATION_MS} \u7684\u5B89\u5168\u6574\u6570\u3002`,\n ),\n );\n }\n\n const trackDurationMs = normalizeNonNegativeInteger(\n rawTrack.durationMs,\n EFFECT_RECIPE_MAX_DURATION_MS,\n );\n if (trackDurationMs === null) {\n errors.push(\n createError(\n 'out_of_range',\n `${trackPath}.durationMs`,\n `track.durationMs \u5FC5\u987B\u662F 0 \u5230 ${EFFECT_RECIPE_MAX_DURATION_MS} \u7684\u5B89\u5168\u6574\u6570\u3002`,\n ),\n );\n }\n\n if (\n durationMs !== null &&\n atMs !== null &&\n trackDurationMs !== null &&\n atMs + trackDurationMs > durationMs\n ) {\n errors.push(\n createError(\n 'out_of_range',\n `${trackPath}.durationMs`,\n 'track \u6267\u884C\u533A\u95F4\u4E0D\u80FD\u8D85\u51FA recipe.durationMs\u3002',\n ),\n );\n }\n\n if (\n rawTrack.target !== undefined &&\n !EFFECT_TARGETS.some((target) => target === rawTrack.target)\n ) {\n errors.push(createError('invalid_enum', 'tracks.target', '\u975E\u6CD5\u7279\u6548\u4F5C\u7528\u76EE\u6807\u3002'));\n }\n const primitiveId = normalizeText(\n rawTrack.primitiveId,\n EFFECT_RECIPE_PRIMITIVE_ID_MAX_LENGTH,\n );\n if (!primitiveId || !EFFECT_RECIPE_STABLE_ID_REGEX.test(primitiveId)) {\n errors.push(\n createError(\n 'invalid_id',\n `${trackPath}.primitiveId`,\n 'track primitiveId \u5FC5\u987B\u662F\u7A33\u5B9A\u6807\u8BC6\u7B26\u3002',\n ),\n );\n }\n\n if (typeof rawTrack.enabled !== 'boolean') {\n errors.push(\n createError('invalid_type', `${trackPath}.enabled`, 'track.enabled \u5FC5\u987B\u662F\u5E03\u5C14\u503C\u3002'),\n );\n }\n\n const params: Record<string, RecipeValue> = {};\n if (!isRecord(rawTrack.params)) {\n errors.push(\n createError('invalid_type', `${trackPath}.params`, 'track.params \u5FC5\u987B\u662F\u5BF9\u8C61\u3002'),\n );\n } else {\n Object.entries(rawTrack.params).forEach(([paramName, paramValue]) => {\n const normalizedValue = parseRecipeValue(\n paramValue,\n `${trackPath}.params.${paramName}`,\n errors,\n );\n if (normalizedValue !== null) {\n params[paramName] = normalizedValue;\n }\n });\n }\n\n if (\n trackId &&\n EFFECT_RECIPE_STABLE_ID_REGEX.test(trackId) &&\n atMs !== null &&\n trackDurationMs !== null &&\n primitiveId &&\n EFFECT_RECIPE_STABLE_ID_REGEX.test(primitiveId) &&\n typeof rawTrack.enabled === 'boolean' &&\n isRecord(rawTrack.params)\n ) {\n tracks.push({\n id: trackId,\n atMs,\n durationMs: trackDurationMs,\n ...(rawTrack.target === undefined ? {} : { target: rawTrack.target as EffectTarget }),\n primitiveId,\n params,\n enabled: rawTrack.enabled,\n });\n }\n });\n }\n\n if (\n errors.length > 0 ||\n !id ||\n !name ||\n !description ||\n !isEffectRecipeScope(scope) ||\n !isEffectRecipeCategory(category) ||\n durationMs === null ||\n commitAtMs === null ||\n !app\n ) {\n return { definition: null, errors };\n }\n\n return {\n definition: {\n schemaVersion: EFFECT_RECIPE_SCHEMA_VERSION,\n id,\n name,\n description,\n scope,\n category,\n durationMs,\n commitAtMs,\n app,\n tracks,\n },\n errors,\n };\n};\n\nexport const createEffectRecipeValidationError = createError;\n", "const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\nimport {\n type EffectPrimitiveDescriptor,\n type EffectPrimitiveParamDescriptor,\n type EffectPrimitiveRegistry,\n} from './primitives.js';\nimport {\n createEffectRecipeValidationError,\n isEffectRecipeTuningPathReference,\n validateEffectRecipeDefinition,\n type EffectRecipeAppMetadata,\n type EffectRecipeCategory,\n type EffectRecipeDefinition,\n type EffectRecipeId,\n type EffectRecipeScope,\n type EffectRecipeTuningPathReference,\n type EffectRecipeValidationError,\n type RecipeValue,\n type ResolvedRecipeValue,\n} from './schema.js';\n\nconst hasOwn = (value: Record<string, unknown>, key: string): boolean =>\n Object.prototype.hasOwnProperty.call(value, key);\n\nconst prefixPath = (prefix: string, path: string): string => {\n if (!prefix) {\n return path;\n }\n if (!path) {\n return prefix;\n }\n if (path.startsWith('[')) {\n return `${prefix}${path}`;\n }\n return `${prefix}.${path}`;\n};\n\nconst normalizeString = (value: string): string => value.trim();\n\nexport type EffectRecipeSource = 'builtin' | 'custom';\n\nexport interface EffectRecipeManifestEntry {\n source: EffectRecipeSource;\n definition: unknown;\n}\n\nexport interface EffectRecipeCatalogEntry {\n id: EffectRecipeId;\n name: string;\n description: string;\n scope: EffectRecipeScope;\n category: EffectRecipeCategory;\n durationMs: number;\n commitAtMs: number;\n source: EffectRecipeSource;\n app: EffectRecipeAppMetadata;\n trackCount: number;\n}\n\nexport interface EffectRecipeRegistration {\n source: EffectRecipeSource;\n definition: EffectRecipeDefinition;\n catalog: EffectRecipeCatalogEntry;\n}\n\nexport interface EffectRecipeManifestValidationResult {\n entries: readonly EffectRecipeRegistration[];\n errors: readonly EffectRecipeValidationError[];\n}\n\nexport interface EffectRecipeSingleValidationResult {\n entry: EffectRecipeRegistration | null;\n errors: readonly EffectRecipeValidationError[];\n}\n\nexport class EffectRecipeRegistryError extends Error {\n constructor(public readonly errors: readonly EffectRecipeValidationError[]) {\n super(errors.map((error) => `${error.path}: ${error.message}`).join('\\n'));\n this.name = 'EffectRecipeRegistryError';\n }\n}\n\nconst buildCatalog = (\n definition: EffectRecipeDefinition,\n source: EffectRecipeSource,\n): EffectRecipeCatalogEntry => ({\n id: definition.id,\n name: definition.name,\n description: definition.description,\n scope: definition.scope,\n category: definition.category,\n durationMs: definition.durationMs,\n commitAtMs: definition.commitAtMs,\n source,\n app: definition.app,\n trackCount: definition.tracks.length,\n});\n\nconst sortRegistrations = (\n entries: readonly EffectRecipeRegistration[],\n): EffectRecipeRegistration[] =>\n [...entries].sort((left, right) => {\n if (left.catalog.app.order !== right.catalog.app.order) {\n return left.catalog.app.order - right.catalog.app.order;\n }\n return left.catalog.id.localeCompare(right.catalog.id, 'zh-CN');\n });\n\ninterface EffectPrimitiveParamValidationOptions {\n allowTuningPath: boolean;\n pathPrefix?: string;\n}\n\ntype PrimitiveParamValidationResult<TValue> = {\n params: Record<string, TValue> | null;\n errors: readonly EffectRecipeValidationError[];\n};\n\nconst validateStringValue = (\n value: string,\n descriptor: EffectPrimitiveParamDescriptor,\n path: string,\n errors: EffectRecipeValidationError[],\n): string | null => {\n const normalized = normalizeString(value);\n if (descriptor.name === 'color' && !/^#[0-9a-f]{6}$/i.test(normalized)) {\n errors.push(\n createEffectRecipeValidationError('invalid_param_value', path, '\u989C\u8272\u5FC5\u987B\u662F #RRGGBB\u3002'),\n );\n return null;\n }\n if (descriptor.minLength !== undefined && normalized.length < descriptor.minLength) {\n errors.push(\n createEffectRecipeValidationError(\n 'invalid_param_value',\n path,\n `${descriptor.name} \u5B57\u7B26\u4E32\u957F\u5EA6\u4E0D\u80FD\u5C0F\u4E8E ${descriptor.minLength}\u3002`,\n ),\n );\n return null;\n }\n if (descriptor.maxLength !== undefined && normalized.length > descriptor.maxLength) {\n errors.push(\n createEffectRecipeValidationError(\n 'invalid_param_value',\n path,\n `${descriptor.name} \u5B57\u7B26\u4E32\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E ${descriptor.maxLength}\u3002`,\n ),\n );\n return null;\n }\n if (descriptor.options && !descriptor.options.includes(normalized)) {\n errors.push(\n createEffectRecipeValidationError(\n 'invalid_param_value',\n path,\n `${descriptor.name} \u5FC5\u987B\u662F ${descriptor.options.join('\u3001')} \u4E4B\u4E00\u3002`,\n ),\n );\n return null;\n }\n return normalized;\n};\n\nconst validateNumberValue = (\n value: number,\n descriptor: EffectPrimitiveParamDescriptor,\n path: string,\n errors: EffectRecipeValidationError[],\n): number | null => {\n if (!Number.isFinite(value)) {\n errors.push(\n createEffectRecipeValidationError(\n 'invalid_param_type',\n path,\n `${descriptor.name} \u5FC5\u987B\u662F\u6709\u9650\u6570\u5B57\u3002`,\n ),\n );\n return null;\n }\n if (descriptor.min !== undefined && value < descriptor.min) {\n errors.push(\n createEffectRecipeValidationError(\n 'invalid_param_value',\n path,\n `${descriptor.name} \u4E0D\u80FD\u5C0F\u4E8E ${descriptor.min}\u3002`,\n ),\n );\n return null;\n }\n if (descriptor.max !== undefined && value > descriptor.max) {\n errors.push(\n createEffectRecipeValidationError(\n 'invalid_param_value',\n path,\n `${descriptor.name} \u4E0D\u80FD\u5927\u4E8E ${descriptor.max}\u3002`,\n ),\n );\n return null;\n }\n if (descriptor.options && !descriptor.options.includes(value)) {\n errors.push(\n createEffectRecipeValidationError(\n 'invalid_param_value',\n path,\n `${descriptor.name} \u4E0D\u5728\u5141\u8BB8\u7684\u679A\u4E3E\u8303\u56F4\u5185\u3002`,\n ),\n );\n return null;\n }\n return value;\n};\n\nconst validateBooleanValue = (\n value: boolean,\n descriptor: EffectPrimitiveParamDescriptor,\n path: string,\n errors: EffectRecipeValidationError[],\n): boolean | null => {\n if (descriptor.options && !descriptor.options.includes(value)) {\n errors.push(\n createEffectRecipeValidationError(\n 'invalid_param_value',\n path,\n `${descriptor.name} \u4E0D\u5728\u5141\u8BB8\u7684\u679A\u4E3E\u8303\u56F4\u5185\u3002`,\n ),\n );\n return null;\n }\n return value;\n};\n\nconst validateNumberArrayValue = (\n value: number[],\n descriptor: EffectPrimitiveParamDescriptor,\n path: string,\n errors: EffectRecipeValidationError[],\n): number[] | null => {\n if (!value.every((entry) => typeof entry === 'number' && Number.isFinite(entry))) {\n errors.push(\n createEffectRecipeValidationError(\n 'invalid_param_type',\n path,\n `${descriptor.name} \u5FC5\u987B\u662F\u6709\u9650\u6570\u5B57\u6570\u7EC4\u3002`,\n ),\n );\n return null;\n }\n if (descriptor.arrayMinLength !== undefined && value.length < descriptor.arrayMinLength) {\n errors.push(\n createEffectRecipeValidationError(\n 'invalid_param_value',\n path,\n `${descriptor.name} \u6570\u7EC4\u957F\u5EA6\u4E0D\u80FD\u5C0F\u4E8E ${descriptor.arrayMinLength}\u3002`,\n ),\n );\n return null;\n }\n if (descriptor.arrayMaxLength !== undefined && value.length > descriptor.arrayMaxLength) {\n errors.push(\n createEffectRecipeValidationError(\n 'invalid_param_value',\n path,\n `${descriptor.name} \u6570\u7EC4\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E ${descriptor.arrayMaxLength}\u3002`,\n ),\n );\n return null;\n }\n if (\n (descriptor.min !== undefined || descriptor.max !== undefined) &&\n value.some(\n (entry) =>\n (descriptor.min !== undefined && entry < descriptor.min) ||\n (descriptor.max !== undefined && entry > descriptor.max),\n )\n ) {\n errors.push(\n createEffectRecipeValidationError(\n 'invalid_param_value',\n path,\n `${descriptor.name} \u6570\u7EC4\u5143\u7D20\u8D85\u51FA\u5141\u8BB8\u8303\u56F4\u3002`,\n ),\n );\n return null;\n }\n return [...value];\n};\n\nconst validateParamValue = <TValue extends RecipeValue | ResolvedRecipeValue>(\n value: TValue,\n descriptor: EffectPrimitiveParamDescriptor,\n path: string,\n errors: EffectRecipeValidationError[],\n options: EffectPrimitiveParamValidationOptions,\n): TValue | null => {\n if (isEffectRecipeTuningPathReference(value)) {\n if (!options.allowTuningPath || descriptor.tuningPathAllowed !== true) {\n errors.push(\n createEffectRecipeValidationError(\n 'invalid_tuning_path',\n path,\n `${descriptor.name} \u4E0D\u5141\u8BB8\u4F7F\u7528 tuningPath \u5F15\u7528\u3002`,\n ),\n );\n return null;\n }\n return { tuningPath: value.tuningPath } as TValue;\n }\n\n switch (descriptor.type) {\n case 'string': {\n if (typeof value !== 'string') {\n errors.push(\n createEffectRecipeValidationError(\n 'invalid_param_type',\n path,\n `${descriptor.name} \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u3002`,\n ),\n );\n return null;\n }\n const normalized = validateStringValue(value, descriptor, path, errors);\n return normalized as TValue | null;\n }\n case 'number': {\n if (typeof value !== 'number') {\n errors.push(\n createEffectRecipeValidationError(\n 'invalid_param_type',\n path,\n `${descriptor.name} \u5FC5\u987B\u662F\u6570\u5B57\u3002`,\n ),\n );\n return null;\n }\n const normalized = validateNumberValue(value, descriptor, path, errors);\n return normalized as TValue | null;\n }\n case 'boolean': {\n if (typeof value !== 'boolean') {\n errors.push(\n createEffectRecipeValidationError(\n 'invalid_param_type',\n path,\n `${descriptor.name} \u5FC5\u987B\u662F\u5E03\u5C14\u503C\u3002`,\n ),\n );\n return null;\n }\n const normalized = validateBooleanValue(value, descriptor, path, errors);\n return normalized as TValue | null;\n }\n case 'number[]': {\n if (!Array.isArray(value)) {\n errors.push(\n createEffectRecipeValidationError(\n 'invalid_param_type',\n path,\n `${descriptor.name} \u5FC5\u987B\u662F\u6570\u5B57\u6570\u7EC4\u3002`,\n ),\n );\n return null;\n }\n const normalized = validateNumberArrayValue(value, descriptor, path, errors);\n return normalized as TValue | null;\n }\n }\n};\n\nconst validatePrimitiveParamsInternal = <TValue extends RecipeValue | ResolvedRecipeValue>(\n descriptor: EffectPrimitiveDescriptor,\n params: unknown,\n options: EffectPrimitiveParamValidationOptions,\n): PrimitiveParamValidationResult<TValue> => {\n const errors: EffectRecipeValidationError[] = [];\n const pathPrefix = options.pathPrefix ?? 'params';\n if (!isRecord(params)) {\n return {\n params: null,\n errors: [\n createEffectRecipeValidationError('invalid_type', pathPrefix, 'params \u5FC5\u987B\u662F\u5BF9\u8C61\u3002'),\n ],\n };\n }\n\n const normalizedParams: Record<string, TValue> = {};\n const descriptorMap = new Map(descriptor.paramsSchema.map((item) => [item.name, item]));\n\n Object.keys(params).forEach((key) => {\n if (!descriptorMap.has(key)) {\n errors.push(\n createEffectRecipeValidationError(\n 'unknown_param',\n `${pathPrefix}.${key}`,\n `\u672A\u77E5\u53C2\u6570: ${key}\u3002`,\n ),\n );\n }\n });\n\n for (const paramDescriptor of descriptor.paramsSchema) {\n const paramPath = `${pathPrefix}.${paramDescriptor.name}`;\n const exists = hasOwn(params, paramDescriptor.name);\n if (!exists) {\n if (paramDescriptor.required) {\n errors.push(\n createEffectRecipeValidationError(\n 'missing_param',\n paramPath,\n `\u7F3A\u5C11\u5FC5\u586B\u53C2\u6570: ${paramDescriptor.name}\u3002`,\n ),\n );\n }\n continue;\n }\n\n const rawValue = params[paramDescriptor.name];\n const normalizedValue = validateParamValue(\n rawValue as TValue,\n paramDescriptor,\n paramPath,\n errors,\n options,\n );\n if (normalizedValue !== null) {\n normalizedParams[paramDescriptor.name] = normalizedValue;\n }\n }\n\n return { params: errors.length === 0 ? normalizedParams : null, errors };\n};\n\nexport const validateEffectRecipeTrackParams = (\n descriptor: EffectPrimitiveDescriptor,\n params: unknown,\n pathPrefix = 'params',\n): PrimitiveParamValidationResult<RecipeValue> =>\n validatePrimitiveParamsInternal<RecipeValue>(descriptor, params, {\n allowTuningPath: true,\n pathPrefix,\n });\n\nexport const validateResolvedEffectRecipeTrackParams = (\n descriptor: EffectPrimitiveDescriptor,\n params: unknown,\n pathPrefix = 'params',\n): PrimitiveParamValidationResult<ResolvedRecipeValue> =>\n validatePrimitiveParamsInternal<ResolvedRecipeValue>(descriptor, params, {\n allowTuningPath: false,\n pathPrefix,\n });\n\nexport const validateEffectRecipeManifest = (\n entries: readonly EffectRecipeManifestEntry[],\n primitiveRegistry: EffectPrimitiveRegistry,\n): EffectRecipeManifestValidationResult => {\n const errors: EffectRecipeValidationError[] = [];\n const provisional: EffectRecipeRegistration[] = [];\n const seenRecipeIds = new Set<string>();\n\n entries.forEach((entry, index) => {\n const definitionResult = validateEffectRecipeDefinition(entry.definition);\n const entryPrefix = `recipes[${index}]`;\n if (!definitionResult.definition) {\n errors.push(\n ...definitionResult.errors.map((error) => ({\n ...error,\n path: prefixPath(entryPrefix, error.path),\n })),\n );\n return;\n }\n\n const definition = definitionResult.definition;\n if (seenRecipeIds.has(definition.id)) {\n errors.push(\n createEffectRecipeValidationError(\n 'duplicate_recipe_id',\n `${entryPrefix}.id`,\n `\u91CD\u590D\u7684 recipe id: ${definition.id}\u3002`,\n ),\n );\n return;\n }\n seenRecipeIds.add(definition.id);\n\n definition.tracks.forEach((track, trackIndex) => {\n const trackPath = `${entryPrefix}.tracks[${trackIndex}]`;\n const descriptor = primitiveRegistry.get(track.primitiveId);\n if (!descriptor) {\n errors.push(\n createEffectRecipeValidationError(\n 'unknown_primitive',\n `${trackPath}.primitiveId`,\n `\u672A\u77E5 primitive: ${track.primitiveId}\u3002`,\n ),\n );\n return;\n }\n\n if (!descriptor.scopes.includes(definition.scope)) {\n errors.push(\n createEffectRecipeValidationError(\n 'unsupported_scope',\n `${trackPath}.primitiveId`,\n `primitive ${track.primitiveId} \u4E0D\u652F\u6301 ${definition.scope} scope\u3002`,\n ),\n );\n }\n\n const paramsResult = validateEffectRecipeTrackParams(\n descriptor,\n track.params,\n `${trackPath}.params`,\n );\n errors.push(...paramsResult.errors);\n });\n\n if (!errors.some((error) => error.path.startsWith(entryPrefix))) {\n provisional.push({\n source: entry.source,\n definition,\n catalog: buildCatalog(definition, entry.source),\n });\n }\n });\n\n return {\n entries: sortRegistrations(provisional),\n errors,\n };\n};\n\nexport class EffectRecipeRegistry {\n private readonly entries: readonly EffectRecipeRegistration[];\n private readonly entryById: ReadonlyMap<string, EffectRecipeRegistration>;\n\n constructor(\n manifestEntries: readonly EffectRecipeManifestEntry[],\n private readonly primitiveRegistry: EffectPrimitiveRegistry,\n ) {\n const result = validateEffectRecipeManifest(manifestEntries, primitiveRegistry);\n if (result.errors.length > 0) {\n throw new EffectRecipeRegistryError(result.errors);\n }\n this.entries = result.entries;\n this.entryById = new Map(result.entries.map((entry) => [entry.definition.id, entry]));\n }\n\n all(): readonly EffectRecipeRegistration[] {\n return this.entries;\n }\n\n catalog(): readonly EffectRecipeCatalogEntry[] {\n return this.entries.map((entry) => entry.catalog);\n }\n\n get(recipeId: EffectRecipeId): EffectRecipeRegistration | null {\n return this.entryById.get(recipeId) ?? null;\n }\n\n listByScope(scope: EffectRecipeScope): readonly EffectRecipeRegistration[] {\n return this.entries.filter((entry) => entry.definition.scope === scope);\n }\n\n listByCategory(category: EffectRecipeCategory): readonly EffectRecipeRegistration[] {\n return this.entries.filter((entry) => entry.definition.category === category);\n }\n\n validate(\n definition: unknown,\n source: EffectRecipeSource = 'custom',\n ): EffectRecipeSingleValidationResult {\n const result = validateEffectRecipeManifest(\n [\n {\n source,\n definition,\n },\n ],\n this.primitiveRegistry,\n );\n\n return {\n entry: result.errors.length === 0 ? (result.entries[0] ?? null) : null,\n errors: result.errors,\n };\n }\n}\n\nexport const resolveEffectRecipePrimitiveDescriptor = (\n recipe: EffectRecipeDefinition,\n trackIndex: number,\n primitiveRegistry: EffectPrimitiveRegistry,\n): EffectPrimitiveDescriptor | null =>\n primitiveRegistry.get(recipe.tracks[trackIndex]?.primitiveId ?? '');\n\nexport type { EffectRecipeTuningPathReference };\n", "import { type EffectPrimitiveDescriptor, type EffectPrimitiveRegistry } from './primitives.js';\nimport { validateResolvedEffectRecipeTrackParams, type EffectRecipeRegistry } from './registry.js';\nimport {\n type EffectRecipeValidationError,\n isEffectRecipeTuningPathReference,\n isResolvedRecipeValue,\n type EffectRecipeDefinition,\n type EffectRecipeId,\n type EffectRecipeTrackDefinition,\n type EffectRecipeTuningPathReference,\n type ResolvedRecipeValue,\n} from './schema.js';\nimport type {\n EffectPrimitiveExecutionContext,\n EffectPrimitiveResolvedParams,\n EffectPrimitiveRuntime,\n} from './EffectPrimitiveRuntimeRegistry.js';\nimport { EffectPrimitiveRuntimeRegistry } from './EffectPrimitiveRuntimeRegistry.js';\n\nexport type EffectRecipeExecutorErrorCode =\n | 'invalid_params'\n | 'runtime_error'\n | 'tuning_resolution_failed'\n | 'unknown_primitive'\n | 'unknown_recipe'\n | 'unknown_runtime';\n\nexport interface EffectRecipeExecutorScheduler {\n setTimeout(callback: () => void, delayMs: number): unknown;\n clearTimeout(handle: unknown): void;\n}\n\nexport interface EffectRecipeTuningResolutionContext<TRuntimeContext> {\n recipe: EffectRecipeDefinition;\n track: EffectRecipeTrackDefinition;\n primitive: EffectPrimitiveDescriptor;\n paramName: string;\n runtimeContext: TRuntimeContext;\n}\n\nexport interface EffectRecipeTrackPlanItem<TRuntimeContext> {\n track: EffectRecipeTrackDefinition;\n primitive: EffectPrimitiveDescriptor;\n runtime: EffectPrimitiveRuntime<TRuntimeContext>;\n params: EffectPrimitiveResolvedParams;\n executionContext: EffectPrimitiveExecutionContext<TRuntimeContext>;\n}\n\nexport interface EffectRecipeExecutionOutcome {\n recipeId: EffectRecipeId;\n status: 'completed' | 'aborted';\n committed: boolean;\n}\n\nexport interface EffectRecipeExecutionHandle {\n recipe: EffectRecipeDefinition;\n signal: AbortSignal;\n done: Promise<EffectRecipeExecutionOutcome>;\n abort(reason?: string): void;\n}\n\nexport interface EffectRecipeExecutorOptions<TRuntimeContext> {\n runtimeRegistry: EffectPrimitiveRuntimeRegistry<TRuntimeContext>;\n resolveTuningPath: (\n reference: EffectRecipeTuningPathReference,\n context: EffectRecipeTuningResolutionContext<TRuntimeContext>,\n ) => ResolvedRecipeValue;\n scheduler: EffectRecipeExecutorScheduler;\n recipeRegistry: Pick<EffectRecipeRegistry, 'get' | 'validate'>;\n primitiveRegistry: EffectPrimitiveRegistry;\n}\n\nexport interface ExecuteEffectRecipeOptions<TRuntimeContext> {\n recipe: EffectRecipeId | EffectRecipeDefinition;\n runtimeContext: TRuntimeContext;\n signal?: AbortSignal;\n onCommit?: (recipe: EffectRecipeDefinition) => void;\n onDone?: (outcome: EffectRecipeExecutionOutcome) => void;\n}\n\nconst compareTracks = (\n left: EffectRecipeTrackDefinition,\n right: EffectRecipeTrackDefinition,\n): number => {\n if (left.atMs !== right.atMs) {\n return left.atMs - right.atMs;\n }\n return left.id.localeCompare(right.id, 'zh-CN');\n};\n\nconst isRecipeDefinition = (\n value: EffectRecipeId | EffectRecipeDefinition,\n): value is EffectRecipeDefinition => typeof value !== 'string';\n\nconst resolveTrackIdFromValidationErrors = (\n recipe: EffectRecipeDefinition,\n errors: readonly EffectRecipeValidationError[],\n): string | undefined => {\n const trackPath = errors.find((error) => /^recipes\\[0\\]\\.tracks\\[\\d+\\]/.test(error.path))?.path;\n if (!trackPath) {\n return undefined;\n }\n\n const match = /^recipes\\[0\\]\\.tracks\\[(\\d+)\\]/.exec(trackPath);\n const trackIndex = match ? Number.parseInt(match[1] ?? '', 10) : Number.NaN;\n if (!Number.isSafeInteger(trackIndex) || trackIndex < 0) {\n return undefined;\n }\n\n return recipe.tracks[trackIndex]?.id;\n};\n\nexport class EffectRecipeExecutorError extends Error {\n readonly cause: unknown;\n\n constructor(\n public readonly code: EffectRecipeExecutorErrorCode,\n public readonly recipeId: EffectRecipeId,\n message: string,\n options: {\n trackId?: string;\n validationErrors?: readonly EffectRecipeValidationError[];\n cause?: unknown;\n } = {},\n ) {\n super(message);\n this.name = 'EffectRecipeExecutorError';\n this.trackId = options.trackId;\n this.validationErrors = options.validationErrors ?? [];\n this.cause = options.cause;\n }\n\n readonly trackId?: string;\n readonly validationErrors: readonly EffectRecipeValidationError[];\n}\n\nexport class EffectRecipeExecutor<TRuntimeContext = unknown> {\n private readonly scheduler: EffectRecipeExecutorScheduler;\n private readonly recipeRegistry: Pick<EffectRecipeRegistry, 'get' | 'validate'>;\n private readonly primitiveRegistry: EffectPrimitiveRegistry;\n\n constructor(private readonly options: EffectRecipeExecutorOptions<TRuntimeContext>) {\n this.scheduler = options.scheduler;\n this.recipeRegistry = options.recipeRegistry;\n this.primitiveRegistry = options.primitiveRegistry;\n }\n\n buildPlan(\n recipeInput: EffectRecipeId | EffectRecipeDefinition,\n runtimeContext: TRuntimeContext,\n ): readonly EffectRecipeTrackPlanItem<TRuntimeContext>[] {\n const recipe = this.resolveRecipe(recipeInput);\n return recipe.tracks\n .filter((track) => track.enabled)\n .slice()\n .sort(compareTracks)\n .map((track) => this.resolveTrackPlanItem(recipe, track, runtimeContext));\n }\n\n execute(runOptions: ExecuteEffectRecipeOptions<TRuntimeContext>): EffectRecipeExecutionHandle {\n const recipe = this.resolveRecipe(runOptions.recipe);\n const plan = this.buildPlan(recipe, runOptions.runtimeContext);\n const controller = new AbortController();\n const timerHandles: unknown[] = [];\n const activeCleanups = new Map<string, () => void>();\n const expiredTracks = new Set<string>();\n const trackControllers = new Map<string, AbortController>();\n const recipeEndTracks = new Set<string>();\n const pendingCleanupPromises = new Set<Promise<void>>();\n\n let committed = false;\n let finished = false;\n let detachExternalSignal: (() => void) | null = null;\n\n let resolveDone!: (outcome: EffectRecipeExecutionOutcome) => void;\n let rejectDone!: (error: EffectRecipeExecutorError) => void;\n const done = new Promise<EffectRecipeExecutionOutcome>((resolve, reject) => {\n resolveDone = resolve;\n rejectDone = reject;\n });\n\n const clearTimers = (): void => {\n while (timerHandles.length > 0) {\n this.scheduler.clearTimeout(timerHandles.pop()!);\n }\n };\n\n const cleanupTrack = (id: string): void => {\n expiredTracks.add(id);\n trackControllers.get(id)?.abort('track-ended');\n trackControllers.delete(id);\n const cleanup = activeCleanups.get(id);\n activeCleanups.delete(id);\n cleanup?.();\n };\n const flushCleanups = (): void => {\n for (const id of [...trackControllers.keys()]) {\n try {\n cleanupTrack(id);\n } catch {\n /* Continue releasing remaining tracks. */\n }\n }\n };\n\n const finalize = (status: 'completed' | 'aborted', error?: EffectRecipeExecutorError): void => {\n if (finished) {\n return;\n }\n\n finished = true;\n clearTimers();\n detachExternalSignal?.();\n if (status === 'aborted' && !controller.signal.aborted) {\n controller.abort(error?.message ?? 'effect-recipe-aborted');\n }\n flushCleanups();\n\n const settle = () => {\n const outcome: EffectRecipeExecutionOutcome = {\n recipeId: recipe.id,\n status,\n committed,\n };\n try {\n runOptions.onDone?.(outcome);\n } catch {\n // onDone callback failures must not corrupt executor lifecycle\n }\n if (error) {\n rejectDone(error);\n return;\n }\n resolveDone(outcome);\n };\n\n if (pendingCleanupPromises.size === 0) {\n settle();\n return;\n }\n\n void Promise.allSettled([...pendingCleanupPromises]).then(() => {\n settle();\n });\n };\n\n const requestAbort = (\n reason = 'effect-recipe-aborted',\n error?: EffectRecipeExecutorError,\n ): void => {\n if (!controller.signal.aborted) {\n controller.abort(reason);\n }\n finalize('aborted', error);\n };\n\n const fail = (\n code: EffectRecipeExecutorErrorCode,\n trackId: string | undefined,\n message: string,\n cause?: unknown,\n ): void => {\n requestAbort(\n message,\n new EffectRecipeExecutorError(\n code,\n recipe.id,\n cause instanceof Error ? `${message}: ${cause.message}` : message,\n {\n trackId,\n cause,\n },\n ),\n );\n };\n\n const registerCleanup = (\n trackId: string,\n result: ReturnType<EffectPrimitiveRuntime<TRuntimeContext>['execute']>,\n ): void => {\n const accept = (handle: Awaited<typeof result>): void => {\n if (!handle) return;\n const cleanup = typeof handle === 'function' ? handle : () => handle.cleanup();\n if (finished || expiredTracks.has(trackId) || controller.signal.aborted) {\n cleanup();\n return;\n }\n activeCleanups.set(trackId, cleanup);\n if (typeof handle !== 'function') {\n if (handle.cleanupPolicy === 'recipe-end') recipeEndTracks.add(trackId);\n void handle.completed?.catch((error: unknown) => {\n if (!finished && !expiredTracks.has(trackId))\n fail('runtime_error', trackId, 'Primitive completion failed', error);\n });\n }\n };\n if (result instanceof Promise) {\n const pending = result.then(accept).catch((error: unknown) => {\n if (!finished) fail('runtime_error', trackId, 'Primitive start failed', error);\n });\n pendingCleanupPromises.add(pending);\n void pending.finally(() => pendingCleanupPromises.delete(pending));\n } else accept(result);\n };\n\n const commit = (): void => {\n if (committed || finished || controller.signal.aborted) {\n return;\n }\n committed = true;\n try {\n runOptions.onCommit?.(recipe);\n } catch (error: unknown) {\n fail('runtime_error', undefined, 'Recipe commit callback failed', error);\n }\n };\n\n const startTrack = (planItem: EffectRecipeTrackPlanItem<TRuntimeContext>): void => {\n if (finished || controller.signal.aborted) {\n return;\n }\n try {\n const trackController = new AbortController();\n trackControllers.set(planItem.track.id, trackController);\n const result = planItem.runtime.execute(\n planItem.executionContext,\n planItem.params,\n trackController.signal,\n );\n registerCleanup(planItem.track.id, result);\n } catch (error) {\n fail(\n 'runtime_error',\n planItem.track.id,\n `Effect primitive \u540C\u6B65\u6267\u884C\u5931\u8D25: ${planItem.track.id}`,\n error,\n );\n }\n };\n\n if (runOptions.signal) {\n const abortFromCaller = (): void => {\n requestAbort(String(runOptions.signal?.reason ?? 'effect-recipe-aborted'));\n };\n if (runOptions.signal.aborted) {\n abortFromCaller();\n } else {\n runOptions.signal.addEventListener('abort', abortFromCaller, { once: true });\n detachExternalSignal = () => {\n runOptions.signal?.removeEventListener('abort', abortFromCaller);\n };\n }\n }\n\n if (!finished) {\n const groupedPlan = new Map<number, EffectRecipeTrackPlanItem<TRuntimeContext>[]>();\n for (const item of plan) {\n const existing = groupedPlan.get(item.track.atMs);\n if (existing) {\n existing.push(item);\n } else {\n groupedPlan.set(item.track.atMs, [item]);\n }\n }\n\n const scheduleTimes = [\n ...new Set([\n ...groupedPlan.keys(),\n ...plan.map((item) => item.track.atMs + item.track.durationMs),\n recipe.commitAtMs,\n ]),\n ].sort((left, right) => left - right);\n\n for (const atMs of scheduleTimes) {\n timerHandles.push(\n this.scheduler.setTimeout(() => {\n if (finished || controller.signal.aborted) {\n return;\n }\n for (const item of groupedPlan.get(atMs) ?? []) startTrack(item);\n if (atMs === recipe.commitAtMs) commit();\n for (const item of plan) {\n if (\n item.track.atMs + item.track.durationMs === atMs &&\n !recipeEndTracks.has(item.track.id)\n ) {\n try {\n cleanupTrack(item.track.id);\n } catch (error) {\n fail('runtime_error', item.track.id, 'Primitive cleanup failed', error);\n }\n }\n }\n }, atMs),\n );\n }\n\n timerHandles.push(\n this.scheduler.setTimeout(() => {\n finalize('completed');\n }, recipe.durationMs),\n );\n }\n\n return {\n recipe,\n signal: controller.signal,\n done,\n abort: (reason?: string) => {\n requestAbort(reason ?? 'effect-recipe-aborted');\n },\n };\n }\n\n private resolveRecipe(\n recipeInput: EffectRecipeId | EffectRecipeDefinition,\n ): EffectRecipeDefinition {\n if (!isRecipeDefinition(recipeInput)) {\n const registration = this.recipeRegistry.get(recipeInput);\n if (!registration) {\n throw new EffectRecipeExecutorError(\n 'unknown_recipe',\n recipeInput,\n `\u672A\u6CE8\u518C\u7684 effect recipe: ${recipeInput}`,\n );\n }\n return registration.definition;\n }\n\n const validation = this.recipeRegistry.validate(recipeInput, 'custom');\n if (validation.entry) {\n return validation.entry.definition;\n }\n\n throw new EffectRecipeExecutorError(\n validation.errors.some((error) => error.code === 'unknown_primitive')\n ? 'unknown_primitive'\n : 'invalid_params',\n recipeInput.id,\n `Effect recipe \u5B9A\u4E49\u65E0\u6548: ${recipeInput.id}`,\n {\n trackId: resolveTrackIdFromValidationErrors(recipeInput, validation.errors),\n validationErrors: validation.errors,\n },\n );\n }\n\n private resolveTrackPlanItem(\n recipe: EffectRecipeDefinition,\n track: EffectRecipeTrackDefinition,\n runtimeContext: TRuntimeContext,\n ): EffectRecipeTrackPlanItem<TRuntimeContext> {\n const primitive = this.primitiveRegistry.get(track.primitiveId);\n if (!primitive) {\n throw new EffectRecipeExecutorError(\n 'unknown_primitive',\n recipe.id,\n `\u672A\u6CE8\u518C\u7684 effect primitive descriptor: ${track.primitiveId}`,\n {\n trackId: track.id,\n },\n );\n }\n\n const runtime = this.options.runtimeRegistry.get(track.primitiveId);\n if (!runtime) {\n throw new EffectRecipeExecutorError(\n 'unknown_runtime',\n recipe.id,\n `\u672A\u6CE8\u518C\u7684 effect primitive runtime: ${track.primitiveId}`,\n {\n trackId: track.id,\n },\n );\n }\n\n const resolvedParams: Record<string, ResolvedRecipeValue> = {};\n for (const [paramName, rawValue] of Object.entries(track.params)) {\n if (isEffectRecipeTuningPathReference(rawValue)) {\n const resolvedValue = this.resolveTuningReference(\n recipe,\n track,\n primitive,\n paramName,\n rawValue,\n runtimeContext,\n );\n resolvedParams[paramName] = resolvedValue;\n continue;\n }\n\n if (!isResolvedRecipeValue(rawValue)) {\n throw new EffectRecipeExecutorError(\n 'invalid_params',\n recipe.id,\n `Track \u53C2\u6570\u672A\u901A\u8FC7\u8FD0\u884C\u65F6\u503C\u6821\u9A8C: ${track.id}.${paramName}`,\n {\n trackId: track.id,\n },\n );\n }\n resolvedParams[paramName] = rawValue;\n }\n\n const validatedParams = validateResolvedEffectRecipeTrackParams(\n primitive,\n resolvedParams,\n `tracks.${track.id}.params`,\n );\n if (!validatedParams.params) {\n throw new EffectRecipeExecutorError(\n 'invalid_params',\n recipe.id,\n `Track \u53C2\u6570\u672A\u901A\u8FC7 descriptor \u6821\u9A8C: ${track.id}`,\n {\n trackId: track.id,\n validationErrors: validatedParams.errors,\n },\n );\n }\n\n return {\n track,\n primitive,\n runtime,\n params: validatedParams.params,\n executionContext: {\n recipeId: recipe.id,\n recipe,\n track,\n primitive,\n runtimeContext,\n },\n };\n }\n\n private resolveTuningReference(\n recipe: EffectRecipeDefinition,\n track: EffectRecipeTrackDefinition,\n primitive: EffectPrimitiveDescriptor,\n paramName: string,\n reference: EffectRecipeTuningPathReference,\n runtimeContext: TRuntimeContext,\n ): ResolvedRecipeValue {\n let resolvedValue: ResolvedRecipeValue;\n try {\n resolvedValue = this.options.resolveTuningPath(reference, {\n recipe,\n track,\n primitive,\n paramName,\n runtimeContext,\n });\n } catch (error) {\n throw new EffectRecipeExecutorError(\n 'tuning_resolution_failed',\n recipe.id,\n `tuningPath \u89E3\u6790\u5931\u8D25: ${reference.tuningPath}`,\n {\n trackId: track.id,\n cause: error,\n },\n );\n }\n\n if (!isResolvedRecipeValue(resolvedValue)) {\n throw new EffectRecipeExecutorError(\n 'tuning_resolution_failed',\n recipe.id,\n `tuningPath \u8FD4\u56DE\u4E86\u65E0\u6548\u503C: ${reference.tuningPath}`,\n {\n trackId: track.id,\n },\n );\n }\n\n return resolvedValue;\n }\n}\n", "import type { RuntimeLogger } from '@bardway/trpg-media';\nimport type {\n EffectPrimitiveRegistry,\n EffectRecipeRegistry,\n ResolvedRecipeValue,\n} from '../recipes.js';\nimport type {\n StoryCueEvent,\n StoryCuePlaybackControls,\n StoryContentSurface,\n PreparedStoryContentTransition,\n} from './StoryContentSurface.js';\nimport type { PixiLayoutRect } from '../PixiSessionLayout.js';\nimport type {\n BlurFilter,\n ColorMatrixFilter,\n Container,\n Filter,\n Graphics,\n Rectangle,\n Sprite,\n Text,\n Texture,\n} from 'pixi.js';\n\nimport type { SessionAudioBus, SessionAudioCuePlayOptions } from '@bardway/trpg-media/audio';\n\nimport type { PixiAnimationDirector } from '../PixiAnimationDirector.js';\nimport type { PixiAnimationActivity } from '../PixiAnimationActivity.js';\nimport type { PixiSceneGraph } from '../PixiSceneGraph.js';\nimport type { PixiShaderRuntime } from '../PixiShaderRuntime.js';\n\nimport type { SessionTuningResolver } from '../tuning/SessionTuningResolver.js';\nimport type { SessionTuningPath } from '../tuning/SessionTuningTypes.js';\n\nimport {\n EffectPrimitiveRuntimeRegistry,\n type EffectPrimitiveExecutionContext,\n type EffectPrimitiveResolvedParams,\n type EffectPrimitiveRuntimeHandle,\n} from '../recipes/EffectPrimitiveRuntimeRegistry.js';\nimport {\n EffectRecipeExecutor,\n type EffectRecipeExecutionHandle,\n type EffectRecipeExecutorScheduler,\n} from '../recipes/EffectRecipeExecutor.js';\nimport type { StoryTimelineClock } from './StoryTimelineClock.js';\nimport {\n createStoryRevealFilter,\n createStoryVignetteFilter,\n type StoryRevealStyle,\n} from './StoryImageFilter.js';\nimport { clamp01, envelope, seededRandom, shakeSample, storySeed } from './StoryVisualMath.js';\n\ninterface Constructors {\n Filter: typeof Filter;\n BlurFilter: typeof BlurFilter;\n ColorMatrixFilter: typeof ColorMatrixFilter;\n Container: typeof Container;\n Graphics: typeof Graphics;\n Rectangle: typeof Rectangle;\n Sprite: typeof Sprite;\n Text: typeof Text;\n Texture: typeof Texture;\n}\nexport interface StoryPresentationAudioControls {\n playCue(id: string, options?: SessionAudioCuePlayOptions): boolean;\n duck(bus: SessionAudioBus, amount: number): () => void;\n setDuck?(id: string, bus: SessionAudioBus, amount: number, rampMs: number): void;\n clearDuck?(id: string): void;\n}\nexport interface StoryPresentationError {\n recipeId: string;\n trackId?: string;\n primitiveId?: string;\n reason: string;\n}\nexport interface PixiStoryPresentationEngineOptions<TContent> {\n scene: PixiSceneGraph;\n story: StoryContentSurface<TContent>;\n logger: RuntimeLogger;\n primitiveRegistry: EffectPrimitiveRegistry;\n recipeRegistry: EffectRecipeRegistry;\n tuningDefaults: Readonly<Record<string, ResolvedRecipeValue>>;\n mediaBounds: PixiLayoutRect;\n particleColors: { ash: string; dust: string };\n resolveAudioCueId: (id: string) => string | null;\n audioBuses: readonly string[];\n directRecipeId?: string;\n directCueId?: string;\n constructors: Constructors;\n animation: PixiAnimationDirector;\n shaderRuntime: PixiShaderRuntime;\n getAudio: () => StoryPresentationAudioControls | null;\n getTuning: () => SessionTuningResolver | undefined;\n requestRender: () => void;\n generateTexture?: (shape: Graphics) => Texture;\n scheduler?: EffectRecipeExecutorScheduler;\n clock?: StoryTimelineClock;\n activity?: PixiAnimationActivity;\n onError?: (error: StoryPresentationError) => void;\n}\ninterface RunContext<TContent> {\n cue: StoryCueEvent<TContent>;\n prepared: PreparedStoryContentTransition | null;\n}\ntype Context<TContent> = EffectPrimitiveExecutionContext<RunContext<TContent>>;\nexport const resolveStoryContentAlpha = (\n elapsedMs: number,\n durationMs: number,\n from: number,\n to: number,\n holdMs = 0,\n): number => {\n const clampedHold = Math.max(0, Math.min(durationMs, holdMs));\n const progress = clamp01((elapsedMs - clampedHold) / Math.max(1, durationMs - clampedHold));\n return from + (to - from) * progress;\n};\nexport const CONSUMED_PARAMS: Readonly<Record<string, readonly string[]>> = {\n 'content.defaultEntrance': [],\n 'content.swap': ['crossfadeMs'],\n 'content.blackReveal': ['contentTarget'],\n 'content.alpha': ['from', 'to', 'contentTarget'],\n 'content.blur': ['from', 'to', 'contentTarget', 'quality'],\n 'content.scale': [\n 'from',\n 'to',\n 'fromMin',\n 'fromMax',\n 'holdMs',\n 'contentTarget',\n 'anchor',\n 'overshoot',\n ],\n 'content.rotate': ['from', 'to', 'fromMin', 'fromMax', 'holdMs', 'contentTarget'],\n 'content.reveal': [\n 'style',\n 'edgeSoftness',\n 'noiseAmount',\n 'noiseScale',\n 'columns',\n 'rows',\n 'fadeMinMs',\n 'fadeMaxMs',\n 'contentTarget',\n ],\n 'content.offset': ['x', 'y', 'attackMs', 'holdMs', 'releaseMs', 'contentTarget'],\n 'screen.fade': ['color', 'peakAlpha', 'attackMs', 'holdMs', 'releaseMs'],\n 'screen.flash': [\n 'color',\n 'peakAlpha',\n 'reducedFlashAlpha',\n 'repeats',\n 'repeatGapMs',\n 'attackMs',\n 'holdMs',\n 'releaseMs',\n ],\n 'screen.vignette': [\n 'strength',\n 'softness',\n 'innerRadius',\n 'outerRadius',\n 'ellipse',\n 'attackMs',\n 'holdMs',\n 'releaseMs',\n 'contentTarget',\n ],\n 'screen.tint': [\n 'color',\n 'amount',\n 'saturation',\n 'contrast',\n 'brightness',\n 'attackMs',\n 'holdMs',\n 'releaseMs',\n 'contentTarget',\n ],\n 'screen.desaturate': ['from', 'to', 'contentTarget'],\n 'camera.shake': ['amplitude', 'frequencyHz', 'axis', 'decay', 'rotationAmount', 'seed'],\n 'camera.slowZoom': ['from', 'to', 'focus', 'attackMs', 'holdMs', 'releaseMs', 'contentTarget'],\n 'particle.dustBurst': ['amount', 'origin', 'spread', 'seed', 'delayMs'],\n 'particle.ashBurst': ['amount', 'origin', 'spread', 'seed', 'delayMs', 'updraft'],\n 'audio.cue': ['cueId', 'volume', 'voiceGroupId'],\n 'audio.duck': ['bus', 'amount', 'attackMs', 'holdMs', 'releaseMs'],\n};\n\nexport class PixiStoryPresentationEngine<TContent> {\n private readonly runtimeRegistry = new EffectPrimitiveRuntimeRegistry<RunContext<TContent>>();\n private readonly executor: EffectRecipeExecutor<RunContext<TContent>>;\n private readonly runs = new Map<\n string,\n { controller: AbortController; handle?: EffectRecipeExecutionHandle }\n >();\n private reducedMotion = false;\n private destroyed = false;\n constructor(private readonly options: PixiStoryPresentationEngineOptions<TContent>) {\n for (const primitive of options.primitiveRegistry.all())\n this.runtimeRegistry.register({\n primitiveId: primitive.id,\n consumedParams: CONSUMED_PARAMS[primitive.id],\n execute: (context, params, signal) => this.executePrimitive(context, params, signal),\n });\n const scheduler = options.clock ?? options.scheduler;\n if (!scheduler) throw new Error('Story Runtime requires a renderer timeline clock');\n this.executor = new EffectRecipeExecutor({\n runtimeRegistry: this.runtimeRegistry,\n recipeRegistry: options.recipeRegistry,\n primitiveRegistry: options.primitiveRegistry,\n scheduler,\n resolveTuningPath: (reference) => {\n const value =\n options.getTuning()?.get(reference.tuningPath as SessionTuningPath) ??\n options.tuningDefaults[reference.tuningPath];\n if (\n typeof value === 'number' ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n (Array.isArray(value) && value.every((item) => typeof item === 'number'))\n )\n return value;\n throw new Error(`\u672A\u77E5\u8C03\u53C2\u8DEF\u5F84\uFF1A${reference.tuningPath}`);\n },\n });\n }\n getRegisteredPrimitiveIds(): readonly string[] {\n return this.runtimeRegistry.listIds();\n }\n applyState(): void {\n this.options.requestRender();\n }\n playCue(cue: StoryCueEvent<TContent>, controls: StoryCuePlaybackControls): void {\n void this.play(cue, controls);\n }\n private async play(\n cue: StoryCueEvent<TContent>,\n controls: StoryCuePlaybackControls,\n ): Promise<void> {\n if (this.destroyed || controls.signal.aborted) {\n controls.done();\n return;\n }\n const controller = new AbortController(),\n abort = () => controller.abort(controls.signal.reason);\n controls.signal.addEventListener('abort', abort, { once: true });\n const run: { controller: AbortController; handle?: EffectRecipeExecutionHandle } = {\n controller,\n };\n this.runs.set(cue.eventId, run);\n let prepared: PreparedStoryContentTransition | null = null,\n release: (() => void) | undefined;\n let failed = false;\n try {\n prepared = await this.options.story.prepareContentTransition(cue.content, controller.signal);\n if (controller.signal.aborted) return;\n if (!prepared) throw new Error('Host did not prepare public content');\n release = this.options.activity?.acquire('story-recipe');\n if (cue.recipeId === this.options.directRecipeId) {\n controls.ready?.();\n if (this.options.directCueId) {\n this.options.getAudio()?.playCue(this.options.directCueId, {\n volume: 1,\n signal: controller.signal,\n voiceGroupId: 'story-direct',\n deterministicSeed: cue.eventId,\n });\n }\n const completed = await prepared.playDefaultEntrance(controller.signal);\n if (!completed && !controller.signal.aborted) throw new Error('\u9ED8\u8BA4\u5185\u5BB9\u5165\u573A\u672A\u5B8C\u6210');\n if (!controller.signal.aborted) {\n prepared.commit();\n controls.commit();\n }\n return;\n }\n prepared.setTopLayerActive(true);\n if (this.reducedMotion && prepared && cue.recipeId !== this.options.directRecipeId) {\n controls.ready?.();\n const frame = { p: 0 };\n await this.options.animation.tween(\n frame,\n {\n p: 1,\n duration: 0.16,\n reducedMotionDuration: 0.16,\n ease: 'power1.out',\n onUpdate: () => {\n prepared!.incoming.alpha = frame.p;\n if (prepared!.outgoing && !prepared!.outgoing.destroyed)\n prepared!.outgoing.alpha = 1 - frame.p;\n this.options.requestRender();\n },\n },\n controller.signal,\n );\n if (!controller.signal.aborted) {\n prepared.commit();\n controls.commit();\n }\n return;\n }\n run.handle = this.executor.execute({\n recipe: cue.recipeId,\n runtimeContext: { cue, prepared },\n signal: controller.signal,\n onCommit: () => {\n prepared?.commit();\n controls.commit();\n },\n });\n controls.ready?.();\n await run.handle.done;\n } catch (error) {\n failed = !prepared;\n if (!controller.signal.aborted) {\n const detail: StoryPresentationError = {\n recipeId: cue.recipeId,\n reason: error instanceof Error ? error.message : String(error),\n ...(error &&\n typeof error === 'object' &&\n 'trackId' in error &&\n typeof error.trackId === 'string'\n ? { trackId: error.trackId }\n : {}),\n };\n if (detail.trackId)\n detail.primitiveId = (\n run.handle?.recipe ?? this.options.recipeRegistry.get(cue.recipeId)?.definition\n )?.tracks.find((track) => track.id === detail.trackId)?.primitiveId;\n this.options.logger.warn('Story presentation failed', detail);\n this.options.onError?.(detail);\n if (prepared) {\n const frame = { p: 0 };\n await this.options.animation.tween(\n frame,\n {\n p: 1,\n duration: 0.14,\n onUpdate: () => {\n prepared!.incoming.alpha = frame.p;\n if (prepared!.outgoing) prepared!.outgoing.alpha = 1 - frame.p;\n },\n },\n controller.signal,\n );\n prepared.commit();\n controls.commit();\n }\n }\n } finally {\n if (controller.signal.aborted) prepared?.cancel();\n else await prepared?.finish();\n controls.signal.removeEventListener('abort', abort);\n if (this.runs.get(cue.eventId) === run) this.runs.delete(cue.eventId);\n release?.();\n controls.done(failed ? 'failed' : undefined);\n }\n }\n setReducedMotion(value: boolean): void {\n this.reducedMotion = value;\n }\n abort(reason = 'story-presentation-aborted', eventIds?: readonly string[]): void {\n for (const [id, run] of this.runs)\n if (!eventIds || eventIds.includes(id)) {\n run.controller.abort(reason);\n run.handle?.abort(reason);\n }\n }\n reset(): void {\n this.abort('story-presentation-reset');\n }\n destroy(): void {\n if (this.destroyed) return;\n this.reset();\n this.destroyed = true;\n for (const texture of this.particleTextures.values()) texture.destroy(true);\n this.particleTextures.clear();\n }\n private roots(context: Context<TContent>, contentTarget = 'current'): Container[] {\n const prepared = context.runtimeContext.prepared;\n if (contentTarget === 'incoming' && prepared) return [prepared.incoming];\n if (contentTarget === 'outgoing') return prepared?.outgoing ? [prepared.outgoing] : [];\n const target =\n context.track.target ??\n (context.recipe.category === 'entrance' ? 'main-content' : 'story-workspace');\n if (target === 'main-content' || contentTarget === 'content-root')\n return [\n contentTarget === 'current'\n ? (this.options.story.getPresentationTargets().currentContent ??\n this.options.story.getPresentationTargets().contentRoot)\n : this.options.story.getPresentationTargets().contentRoot,\n ];\n if (target === 'story-workspace')\n return [this.options.scene.backgroundLayer, this.options.scene.sceneHudLayer].filter(Boolean);\n if (target === 'full-stage')\n return [\n this.options.scene.backgroundLayer,\n this.options.scene.presentationLayer,\n this.options.scene.sceneHudLayer,\n ].filter(Boolean);\n throw new Error(`\u975E\u6CD5\u4F5C\u7528\u76EE\u6807\uFF1A${target}`);\n }\n private animate(\n durationMs: number,\n signal: AbortSignal,\n sample: (ms: number) => void,\n cleanup: () => void,\n ): EffectPrimitiveRuntimeHandle {\n const state = { ms: 0 };\n sample(0);\n const completed = this.options.animation.tween(\n state,\n {\n ms: durationMs,\n duration: durationMs / 1000,\n reducedMotionDuration: durationMs / 1000,\n ease: 'none',\n onUpdate: () => {\n sample(state.ms);\n this.options.requestRender();\n },\n },\n signal,\n );\n return { completed, cleanup };\n }\n private executePrimitive(\n context: Context<TContent>,\n params: EffectPrimitiveResolvedParams,\n signal: AbortSignal,\n ): EffectPrimitiveRuntimeHandle | void {\n const { track, runtimeContext } = context,\n { cue, prepared } = runtimeContext;\n const n = (key: string, fallback: number): number =>\n typeof params[key] === 'number' ? params[key] : fallback;\n const s = (key: string, fallback: string): string =>\n typeof params[key] === 'string' ? params[key] : fallback;\n const point = (key: string, fallback: number[]): number[] =>\n Array.isArray(params[key]) ? params[key] : fallback;\n const duration = track.durationMs,\n attack = n('attackMs', duration * 0.25),\n hold = n('holdMs', duration * 0.25),\n release = n('releaseMs', Math.max(0, duration - attack - hold));\n const env = (ms: number) => envelope(ms, attack, hold, release),\n roots = () =>\n this.roots(\n context,\n s('contentTarget', track.primitiveId.startsWith('content.') ? 'current' : ''),\n );\n const filtered = (\n filter: Filter,\n sample: (ms: number) => void,\n ): EffectPrimitiveRuntimeHandle => {\n const targets = roots();\n for (const root of targets) root.filters = [...(root.filters ?? []), filter];\n return this.animate(duration, signal, sample, () => {\n for (const root of targets)\n if (!root.destroyed)\n root.filters = (root.filters ?? []).filter((item) => item !== filter);\n filter.destroy();\n });\n };\n if (track.primitiveId === 'content.defaultEntrance') {\n if (!prepared) throw new Error('\u9ED8\u8BA4\u5185\u5BB9\u5165\u573A\u672A\u51C6\u5907');\n return {\n completed: prepared.playDefaultEntrance(signal).then((completed) => {\n if (!completed && !signal.aborted) throw new Error('\u9ED8\u8BA4\u5185\u5BB9\u5165\u573A\u672A\u5B8C\u6210');\n }),\n cleanup: () => {},\n };\n }\n if (track.primitiveId === 'content.swap') {\n if (!prepared) throw new Error('\u5185\u5BB9\u5207\u6362\u672A\u51C6\u5907');\n const fade = Math.min(duration, n('crossfadeMs', 140));\n return this.animate(\n duration,\n signal,\n (ms) => {\n const p = fade <= 0 ? 1 : clamp01(ms / fade);\n prepared.incoming.alpha = p;\n if (prepared.outgoing && !prepared.outgoing.destroyed) prepared.outgoing.alpha = 1 - p;\n },\n () => {},\n );\n }\n if (track.primitiveId === 'content.blur') {\n const from = n('from', 0),\n to = n('to', 0),\n filter = new this.options.constructors.BlurFilter({\n strength: from,\n quality: s('quality', 'soft') === 'hard' ? 1 : 2,\n });\n return filtered(filter, (ms) => {\n filter.strength = from + (to - from) * clamp01(ms / Math.max(1, duration));\n });\n }\n if (track.primitiveId === 'content.blackReveal') {\n if (!prepared) throw new Error('\u9ED1\u8272\u7167\u7247\u663E\u73B0\u672A\u51C6\u5907');\n const filter = new this.options.constructors.ColorMatrixFilter();\n filter.brightness(0, false);\n filter.alpha = 1;\n prepared.incoming.alpha = 1;\n return filtered(filter, (ms) => {\n filter.alpha = 1 - clamp01(ms / Math.max(1, duration));\n });\n }\n if (track.primitiveId === 'content.reveal') {\n if (!prepared) throw new Error('\u5185\u5BB9\u663E\u73B0\u672A\u51C6\u5907');\n const style = s('style', 'highlights-first');\n if (style !== 'highlights-first' && style !== 'random-fragments')\n throw new Error(`\u672A\u77E5\u663E\u73B0\u65B9\u5F0F\uFF1A${style}`);\n const fx = createStoryRevealFilter(\n style as StoryRevealStyle,\n this.options.constructors.Filter,\n );\n const fadeMinMs = Math.max(0, n('fadeMinMs', 320));\n const fadeMaxMs = Math.max(fadeMinMs, n('fadeMaxMs', 760));\n fx.reveal[2] = n('edgeSoftness', style === 'highlights-first' ? 0.06 : 0.055);\n fx.reveal[3] = storySeed(cue.eventId) % 10_000;\n fx.detail[0] = n('noiseAmount', 0.18);\n fx.detail[1] = n('noiseScale', 22);\n fx.detail[2] = Math.max(1, Math.round(n('columns', 9)));\n fx.detail[3] = Math.max(1, Math.round(n('rows', 5)));\n fx.fadeRatios[0] = clamp01(fadeMinMs / Math.max(1, duration));\n fx.fadeRatios[1] = clamp01(fadeMaxMs / Math.max(1, duration));\n prepared.incoming.alpha = 1;\n return filtered(fx.filter, (ms) => {\n fx.reveal[1] = clamp01(ms / Math.max(1, duration));\n });\n }\n if (track.primitiveId === 'content.alpha') {\n const targets = roots();\n const from = n('from', 0);\n const to = n('to', 1);\n const holdMs = Math.max(0, Math.min(duration, n('holdMs', 0)));\n return this.animate(\n duration,\n signal,\n (ms) => {\n for (const target of targets)\n target.alpha = resolveStoryContentAlpha(ms, duration, from, to, holdMs);\n },\n () => {},\n );\n }\n if (track.primitiveId === 'screen.desaturate' || track.primitiveId === 'screen.tint') {\n const filter = new this.options.constructors.ColorMatrixFilter();\n if (track.primitiveId === 'screen.desaturate') {\n filter.saturate(-1, false);\n const from = n('from', 0),\n to = n('to', 0);\n return filtered(filter, (ms) => {\n filter.alpha = from + (to - from) * clamp01(ms / Math.max(1, duration));\n });\n }\n const color = s('color', '#808080');\n if (!/^#[0-9a-f]{6}$/i.test(color)) throw new Error(`\u975E\u6CD5\u989C\u8272\uFF1A${color}`);\n const c = [1, 3, 5].map((index) => parseInt(color.slice(index, index + 2), 16) / 255);\n filter.matrix = [\n c[0] * 1.4,\n 0,\n 0,\n 0,\n 0,\n 0,\n c[1] * 1.4,\n 0,\n 0,\n 0,\n 0,\n 0,\n c[2] * 1.4,\n 0,\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n ];\n filter.saturate(n('saturation', 1) - 1, true);\n filter.contrast(n('contrast', 1) - 1, true);\n filter.brightness(n('brightness', 1), true);\n return filtered(filter, (ms) => {\n filter.alpha = clamp01(n('amount', 0.08)) * env(ms);\n });\n }\n if (track.primitiveId === 'screen.vignette') {\n const fx = createStoryVignetteFilter(this.options.constructors.Filter);\n fx.vignette[1] = n('innerRadius', 0.18);\n fx.vignette[2] = n('outerRadius', 0.95);\n fx.vignette[3] = n('softness', 0.45);\n fx.ellipse.set(point('ellipse', [1, 0.85]));\n const strength = n('strength', 1);\n return filtered(fx.filter, (ms) => {\n fx.vignette[0] = clamp01(strength * env(ms));\n });\n }\n if (track.primitiveId === 'screen.fade' || track.primitiveId === 'screen.flash') {\n const flash = track.primitiveId === 'screen.flash',\n color = s('color', flash ? '#f4e4c2' : '#000000');\n if (!/^#[0-9a-f]{6}$/i.test(color)) throw new Error(`\u975E\u6CD5\u989C\u8272\uFF1A${color}`);\n const overlay = new this.options.constructors.Graphics(),\n main =\n (track.target ??\n (context.recipe.category === 'entrance' ? 'main-content' : 'story-workspace')) ===\n 'main-content';\n const rect = main\n ? prepared?.effectOverlayRoot\n ? { x: 0, y: 0, width: prepared.incomingRect.width, height: prepared.incomingRect.height }\n : this.options.mediaBounds\n : { x: 0, y: 0, width: 1920, height: 1080 };\n overlay.rect(rect.x, rect.y, rect.width, rect.height).fill({ color });\n overlay.eventMode = 'none';\n (main\n ? (prepared?.effectOverlayRoot ?? this.options.story.getPresentationTargets().overlayRoot)\n : this.options.scene.screenFxLayer\n ).addChild(overlay);\n const peak = flash\n ? Math.min(\n this.reducedMotion ? 0.18 : 0.45,\n n(this.reducedMotion ? 'reducedFlashAlpha' : 'peakAlpha', 0.24),\n )\n : n('peakAlpha', 1),\n repeats = flash ? Math.round(n('repeats', 1)) : 1,\n gap = flash ? n('repeatGapMs', 120) : 0;\n return this.animate(\n duration,\n signal,\n (ms) => {\n const cycle = attack + hold + release + gap,\n index = cycle > 0 ? Math.floor(ms / cycle) : repeats;\n overlay.alpha = index >= repeats ? 0 : peak * env(ms - index * cycle);\n },\n () => overlay.destroy(),\n );\n }\n if (track.primitiveId.startsWith('particle.')) return this.particles(context, params, signal);\n if (track.primitiveId === 'audio.cue') {\n const id = this.options.resolveAudioCueId(s('cueId', ''));\n if (!id) throw new Error(`\u672A\u77E5\u97F3\u9891 Cue\uFF1A${s('cueId', '')}`);\n this.options.getAudio()?.playCue(id, {\n signal,\n volume: clamp01(n('volume', 0.4)),\n voiceGroupId: s('voiceGroupId', id),\n deterministicSeed: cue.eventId,\n });\n return;\n }\n if (track.primitiveId === 'audio.duck') {\n const bus = s('bus', 'field');\n if (!this.options.audioBuses.includes(bus)) throw new Error('\u975E\u6CD5 audio bus');\n const audio = this.options.getAudio(),\n id = `${cue.eventId}:${track.id}`;\n return this.animate(\n duration,\n signal,\n (ms) =>\n audio?.setDuck?.(id, bus as SessionAudioBus, clamp01(n('amount', 0.25)) * env(ms), 25),\n () => audio?.clearDuck?.(id),\n );\n }\n const wrappers = roots().map((target) => {\n const parent = target.parent,\n root = new this.options.constructors.Container();\n if (parent) {\n const index = parent.getChildIndex(target);\n parent.addChildAt(root, index);\n root.addChild(target);\n }\n return { root, target };\n });\n const randomFromUnit = (storySeed(`${cue.eventId}:${track.id}`) % 10_001) / 10_000,\n configuredFrom = n('from', 1),\n fromMin = n('fromMin', configuredFrom),\n fromMax = n('fromMax', configuredFrom),\n from = fromMin + (fromMax - fromMin) * randomFromUnit,\n to = n('to', 1),\n focus = point(track.primitiveId === 'camera.slowZoom' ? 'focus' : 'anchor', [0.5, 0.5]),\n rect =\n prepared?.incomingRect ??\n this.options.story.getRenderedImageRect() ??\n this.options.mediaBounds;\n const px = rect.x + rect.width * focus[0],\n py = rect.y + rect.height * focus[1],\n amplitude = this.reducedMotion ? 0 : n('amplitude', 4),\n frequency = n('frequencyHz', 11),\n decay = n('decay', 6),\n axis = s('axis', 'xy'),\n rotation = n('rotationAmount', 0),\n seed = n('seed', storySeed(cue.eventId)),\n x = n('x', 0),\n y = n('y', 0),\n overshoot = params.overshoot === true;\n return this.animate(\n duration,\n signal,\n (ms) => {\n const holdMs = Math.max(0, Math.min(duration, n('holdMs', 0)));\n const p = clamp01((ms - holdMs) / Math.max(1, duration - holdMs));\n for (const { root } of wrappers) {\n if (track.primitiveId === 'content.rotate')\n root.rotation = ((from + (to - from) * p) * Math.PI) / 180;\n else if (track.primitiveId === 'camera.shake') {\n root.position.set(\n axis === 'y' ? 0 : amplitude * shakeSample(ms, duration, frequency, decay, seed),\n axis === 'x'\n ? 0\n : amplitude * 0.6 * shakeSample(ms, duration, frequency * 0.83, decay, seed + 31),\n );\n root.rotation = this.reducedMotion\n ? 0\n : rotation * shakeSample(ms, duration, frequency, decay, seed);\n } else if (track.primitiveId === 'content.offset')\n root.position.set(\n this.reducedMotion ? 0 : x * env(ms),\n this.reducedMotion ? 0 : y * env(ms),\n );\n else {\n const eased = overshoot\n ? p >= 1\n ? 1\n : 1 - Math.pow(2, -9 * p) * Math.cos(p * Math.PI * 4.5)\n : p,\n scale = this.reducedMotion\n ? 1\n : from + (to - from) * (track.primitiveId === 'camera.slowZoom' ? env(ms) : eased);\n root.pivot.set(px, py);\n root.position.set(px, py);\n root.scale.set(scale);\n }\n }\n },\n () => {\n for (const { root } of wrappers) {\n if (root.destroyed) continue;\n if (root.parent) {\n const parent = root.parent;\n const index = parent.getChildIndex(root);\n for (const child of [...root.children]) parent.addChildAt(child, index);\n }\n root.destroy();\n }\n },\n );\n }\n private readonly particleTextures = new Map<boolean, Texture>();\n private particleTexture(ash: boolean): Texture {\n const cached = this.particleTextures.get(ash);\n if (cached) return cached;\n if (!this.options.generateTexture) return this.options.constructors.Texture.WHITE;\n const shape = new this.options.constructors.Graphics();\n if (ash) shape.poly([1, 4, 4, 1, 8, 3, 6, 8, 3, 7], true).fill(0xffffff);\n else {\n shape.circle(8, 8, 7).fill({ color: 0xffffff, alpha: 0.12 });\n shape.circle(8, 8, 5).fill({ color: 0xffffff, alpha: 0.22 });\n shape.circle(8, 8, 3).fill({ color: 0xffffff, alpha: 0.5 });\n }\n const texture = this.options.generateTexture(shape);\n shape.destroy();\n this.particleTextures.set(ash, texture);\n return texture;\n }\n private particles(\n context: Context<TContent>,\n params: EffectPrimitiveResolvedParams,\n signal: AbortSignal,\n ): EffectPrimitiveRuntimeHandle {\n const n = (key: string, fallback: number) =>\n typeof params[key] === 'number' ? params[key] : fallback,\n random = seededRandom(n('seed', storySeed(context.runtimeContext.cue.eventId))),\n ash = context.track.primitiveId === 'particle.ashBurst';\n const root = new this.options.constructors.Container();\n root.eventMode = 'none';\n const main = (context.track.target ?? 'main-content') === 'main-content';\n (main\n ? (context.runtimeContext.prepared?.effectOverlayRoot ??\n this.options.story.getPresentationTargets().overlayRoot)\n : this.options.scene.screenFxLayer\n ).addChild(root);\n const rect = main\n ? context.runtimeContext.prepared?.effectOverlayRoot\n ? {\n x: 0,\n y: 0,\n width: context.runtimeContext.prepared.incomingRect.width,\n height: context.runtimeContext.prepared.incomingRect.height,\n }\n : this.options.mediaBounds\n : { x: 0, y: 0, width: 1920, height: 1080 },\n origin = Array.isArray(params.origin) ? params.origin : [0.5, 0.8],\n count = Math.round(n('amount', 16)),\n spread = n('spread', 0.4),\n updraft = ash ? n('updraft', 1) : 1,\n delay = n('delayMs', 100);\n const particles = Array.from({ length: this.reducedMotion ? 0 : Math.min(64, count) }, () => {\n const sprite = new this.options.constructors.Sprite(this.particleTexture(ash)),\n size = 1 + random() * 3;\n sprite.width = size;\n sprite.height = ash ? size * (1.4 + random()) : size * 0.65;\n sprite.tint = ash ? this.options.particleColors.ash : this.options.particleColors.dust;\n root.addChild(sprite);\n return {\n sprite,\n x: rect.x + rect.width * (origin[0] + (random() - 0.5) * spread),\n y: rect.y + rect.height * (origin[1] + (random() - 0.5) * spread * 0.25),\n vx: (random() - 0.5) * 22,\n vy: -(8 + random() * 22) * updraft,\n phase: random() * 6.28,\n spin: (random() - 0.5) * 1.4,\n born: random() * delay,\n life: context.track.durationMs - delay,\n };\n });\n return this.animate(\n context.track.durationMs,\n signal,\n (ms) => {\n for (const p of particles) {\n const t = Math.max(0, ms - p.born) / 1000,\n life = clamp01((ms - p.born) / Math.max(1, p.life));\n p.sprite.position.set(p.x + p.vx * t + Math.sin(t * 1.5 + p.phase) * 4, p.y + p.vy * t);\n p.sprite.rotation = p.phase + p.spin * t;\n p.sprite.alpha = ms < p.born ? 0 : Math.sin(life * Math.PI) * 0.28;\n }\n },\n () => root.destroy({ children: true }),\n );\n }\n}\n", "import type { PresentationEvent, DisplaySnapshot } from '@bardway/trpg-display';\n\n/**\n * Renderer-local effect boundary. Plugins receive only already-adjudicated\n * events and must resolve after abort so the shared display queue can advance.\n */\nexport interface PixiEffectPlugin<TEvent = PresentationEvent, TSnapshot = DisplaySnapshot> {\n readonly id: string;\n canPlay(event: TEvent): boolean;\n play(event: TEvent, signal: AbortSignal): Promise<void>;\n applySnapshot?(snapshot: TSnapshot): void;\n setPaused(paused: boolean): void;\n reset(): void;\n abortSceneTransients?(): void;\n destroy(): void;\n}\n\nexport class PixiEffectRegistry<TEvent = PresentationEvent, TSnapshot = DisplaySnapshot> {\n constructor(private readonly plugins: readonly PixiEffectPlugin<TEvent, TSnapshot>[]) {\n if (new Set(plugins.map((plugin) => plugin.id)).size !== plugins.length)\n throw new Error('Duplicate effect plugin ID');\n }\n\n async play(event: TEvent, signal: AbortSignal): Promise<boolean> {\n const plugin = this.plugins.find((item) => item.canPlay(event));\n if (!plugin) return false;\n await plugin.play(event, signal);\n return true;\n }\n\n setPaused(paused: boolean): void {\n for (const plugin of this.plugins) plugin.setPaused(paused);\n }\n\n applySnapshot(snapshot: TSnapshot): void {\n for (const plugin of this.plugins) plugin.applySnapshot?.(snapshot);\n }\n\n reset(): void {\n for (const plugin of this.plugins) plugin.reset();\n }\n\n abortSceneTransients(): void {\n for (const plugin of this.plugins) plugin.abortSceneTransients?.();\n }\n\n destroy(): void {\n for (const plugin of this.plugins) plugin.destroy();\n }\n}\n", "type SessionDisplayScene = string;\n\nexport type SceneDefinitionTarget =\n | { kind: 'visualVariant'; semanticScene: SessionDisplayScene; visualVariant: string }\n | { kind: 'semanticSceneDraft'; requestedSceneId: string };\n\nexport interface SessionSceneDescriptor {\n id: string;\n semanticScene: SessionDisplayScene;\n structure: 'locked';\n editorSlots: readonly string[];\n requiredBindings: readonly string[];\n transitions: readonly string[];\n}\n\nexport interface SessionVisualVariantDescriptor {\n id: string;\n target: Extract<SceneDefinitionTarget, { kind: 'visualVariant' }>;\n source: 'core' | 'composed';\n requiredBindings: readonly string[];\n}\n\nexport const createSessionSceneRegistry = (scenes: readonly SessionSceneDescriptor[]) => {\n if (\n new Set(scenes.map((scene) => scene.id)).size !== scenes.length ||\n new Set(scenes.map((scene) => scene.semanticScene)).size !== scenes.length\n )\n throw new Error('Duplicate scene ID');\n return {\n all: (): readonly SessionSceneDescriptor[] => scenes,\n get: (scene: SessionDisplayScene): SessionSceneDescriptor => {\n const descriptor = scenes.find((item) => item.semanticScene === scene);\n if (!descriptor) throw new Error(`Unknown Session scene: ${scene}`);\n return descriptor;\n },\n canEnterProductionFlow: (target: SceneDefinitionTarget): boolean =>\n target.kind === 'visualVariant',\n };\n};\n", "/** Retains the last eligible scene; the host chooses transient scene kinds and the initial scene. */\nexport class SessionSceneHistory<TScene extends string> {\n private previous: TScene;\n constructor(\n private readonly initial: TScene,\n private readonly transientScenes: ReadonlySet<TScene>,\n ) {\n this.previous = initial;\n }\n record(scene: TScene): void {\n if (!this.transientScenes.has(scene)) this.previous = scene;\n }\n getPreviousScene(): TScene {\n return this.previous;\n }\n reset(): void {\n this.previous = this.initial;\n }\n}\n", "import type { Sprite, Texture } from 'pixi.js';\nimport { resolveCoverRect } from './PixiMapWorldUtils.js';\nimport { PIXI_LOGICAL_STAGE } from './PixiStageMetrics.js';\nimport type { RuntimeLogger } from '@bardway/trpg-media';\nimport type { PixiAssetManager } from './PixiAssetManager.js';\n\nexport interface PixiSkinEntry<TId extends string> {\n id: TId;\n alias: string;\n uri: string;\n scope: string;\n required: boolean;\n}\n\n/** Preserves parallel scoped loading while the host supplies its complete skin manifest. */\nexport async function preloadPixiSkin<TId extends string>(\n assets: PixiAssetManager,\n entries: readonly PixiSkinEntry<TId>[],\n logger: RuntimeLogger,\n signal?: AbortSignal,\n): Promise<ReadonlyMap<TId, Texture | null>> {\n if (new Set(entries.map((entry) => entry.id)).size !== entries.length)\n throw new Error('Duplicate skin texture ID');\n const textures = new Map<TId, Texture | null>();\n await Promise.all(\n entries.map(async (entry) => {\n try {\n textures.set(\n entry.id,\n await assets.loadTexture(entry.alias, entry.uri, entry.scope, signal),\n );\n } catch (error: unknown) {\n if (signal?.aborted || entry.required) throw error;\n logger.warn('Optional skin texture failed', { id: entry.id, error });\n textures.set(entry.id, null);\n }\n }),\n );\n return textures;\n}\ntype SpriteConstructor = new (texture?: Texture | import('pixi.js').SpriteOptions) => Sprite;\n\nexport const createStageSkinSprite = (\n SpriteConstructor: SpriteConstructor,\n texture: Texture,\n stage: { width: number; height: number } = PIXI_LOGICAL_STAGE,\n): Sprite => {\n const sprite = new SpriteConstructor(texture);\n syncStageSkinSprite(sprite, texture, stage);\n return sprite;\n};\n\nexport const syncStageSkinSprite = (\n sprite: Sprite,\n texture: Texture = sprite.texture,\n stage: { width: number; height: number } = PIXI_LOGICAL_STAGE,\n): void => {\n const rect = resolveCoverRect(\n { width: texture.width, height: texture.height },\n { x: 0, y: 0, width: stage.width, height: stage.height },\n );\n sprite.texture = texture;\n sprite.position.set(rect.x, rect.y);\n sprite.width = rect.width;\n sprite.height = rect.height;\n};\n\nexport interface SessionDisplayPreludeFrameTextures {\n moduleFrame: Texture | null;\n playerFrame: Texture | null;\n}\n\nexport interface SessionDisplayCaseWorkspaceTextures {\n shell: Texture | null;\n panel: Texture | null;\n}\n", "/** Neutral input replacing the source's product snapshot/story/battle wrappers. */\nexport interface FieldEffectState<TEffect extends string, TProfile extends string> {\n owner: string;\n profile: TProfile;\n effectId: TEffect | null;\n hydrate?: boolean;\n}\nexport interface FieldEffectSurface<TEffect extends string, TProfile extends string> {\n setProfile(profile: TProfile): void;\n replace(effect: TEffect | null, signal: AbortSignal, onCommitted: () => void): Promise<void>;\n hydrate(effect: TEffect | null): void;\n setPaused(paused: boolean): void;\n setSuspended(suspended: boolean): void;\n reset(): void;\n destroy(): void;\n}\nexport interface FieldEffectAudio<TEffect extends string> {\n play(effect: TEffect): void;\n pause(): void;\n resume(effect: TEffect): void;\n stop(): void;\n}\n\n/** Retains source owner/request isolation, silent hydration and audio suspension. */\nexport class SessionFieldEffectRuntime<TEffect extends string, TProfile extends string> {\n private desired: FieldEffectState<TEffect, TProfile> | null = null;\n private mounted: FieldEffectState<TEffect, TProfile> | null = null;\n private controller: AbortController | null = null;\n private version = 0;\n private paused = false;\n private suspended = false;\n private audioEffect: TEffect | null = null;\n private destroyed = false;\n\n constructor(\n private readonly surface: FieldEffectSurface<TEffect, TProfile>,\n private readonly getAudio: () => FieldEffectAudio<TEffect> | null,\n private readonly onChanged?: (effect: TEffect | null) => void,\n ) {}\n\n async sync(\n state: FieldEffectState<TEffect, TProfile>,\n externalSignal?: AbortSignal,\n ): Promise<void> {\n if (this.destroyed || externalSignal?.aborted) return;\n if (!state.owner.trim() || !state.profile.trim())\n throw new Error('Field effect requires an owner and profile');\n state = { ...state };\n this.desired = state;\n if (\n this.mounted?.owner === state.owner &&\n this.mounted.profile === state.profile &&\n this.mounted.effectId === state.effectId\n ) {\n this.syncSuspension();\n return;\n }\n const version = ++this.version;\n this.controller?.abort('field-replaced');\n const controller = new AbortController();\n this.controller = controller;\n const abort = () => controller.abort(externalSignal?.reason);\n externalSignal?.addEventListener('abort', abort, { once: true });\n try {\n this.getAudio()?.stop();\n this.audioEffect = null;\n this.surface.setProfile(state.profile);\n let committed = false;\n const commit = () => {\n if (committed || controller.signal.aborted || version !== this.version) return;\n committed = true;\n this.mounted = { ...state };\n this.onChanged?.(state.effectId);\n this.syncSuspension(!state.hydrate);\n };\n if (state.hydrate) {\n this.surface.hydrate(state.effectId);\n commit();\n } else {\n await this.surface.replace(state.effectId, controller.signal, commit);\n commit();\n }\n } finally {\n externalSignal?.removeEventListener('abort', abort);\n if (this.controller === controller) this.controller = null;\n }\n }\n\n getEffectId(): TEffect | null {\n return this.mounted?.effectId ?? null;\n }\n setPaused(paused: boolean): void {\n this.paused = paused;\n this.surface.setPaused(paused);\n this.syncSuspension();\n }\n setGlobalSuspended(suspended: boolean): void {\n this.suspended = suspended;\n this.syncSuspension();\n }\n syncAudio(): void {\n this.syncSuspension();\n }\n reset(): void {\n this.version++;\n this.controller?.abort('field-reset');\n this.controller = null;\n this.desired = null;\n this.mounted = null;\n this.audioEffect = null;\n this.paused = false;\n this.suspended = false;\n this.getAudio()?.stop();\n this.surface.reset();\n this.surface.setPaused(false);\n this.surface.setSuspended(false);\n this.onChanged?.(null);\n }\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.reset();\n this.surface.destroy();\n }\n\n private syncSuspension(allowStart = true): void {\n this.surface.setSuspended(this.suspended);\n const audio = this.getAudio();\n const effect = this.mounted?.effectId;\n if (!audio || !effect) return;\n if (this.audioEffect !== effect) {\n if (!allowStart) return;\n audio.play(effect);\n this.audioEffect = effect;\n }\n if (this.paused || this.suspended) audio.pause();\n else audio.resume(effect);\n }\n}\n", "import type { Graphics } from 'pixi.js';\n\nimport type { BattleViewportGridLayout } from './PixiSessionLayout.js';\n\ntype GridGraphics = Pick<Graphics, 'rect' | 'fill'>;\n\nexport interface BattleGridStyle {\n overlayColor: string;\n overlayAlpha: number;\n lineColor: string;\n lineAlpha: number;\n lineWidth: number;\n}\n/** Draws the single formal battle grid geometry used by both the World and entry transition. */\nexport const drawBattleGrid = <T extends GridGraphics>(\n grid: T,\n layout: BattleViewportGridLayout,\n style: BattleGridStyle,\n): T => {\n grid\n .rect(layout.offsetX, layout.offsetY, layout.renderW, layout.renderH)\n .fill({ color: style.overlayColor, alpha: style.overlayAlpha });\n for (let column = 0; column <= layout.cols; column += 1) {\n const x = layout.offsetX + column * layout.cellW;\n grid.rect(x, layout.offsetY, style.lineWidth, layout.renderH).fill({\n color: style.lineColor,\n alpha: style.lineAlpha,\n });\n }\n for (let row = 0; row <= layout.rows; row += 1) {\n const y = layout.offsetY + row * layout.cellH;\n grid.rect(layout.offsetX, y, layout.renderW, style.lineWidth).fill({\n color: style.lineColor,\n alpha: style.lineAlpha,\n });\n }\n return grid;\n};\n", "import type { StoryCuePlaybackControls } from './story/StoryContentSurface.js';\nexport interface StoryEventCoordinatorScheduler {\n setTimeout(callback: () => void, delayMs: number): unknown;\n clearTimeout(handle: unknown): void;\n}\n\nexport interface StoryPresentationPort<TCue> {\n playCue: (cue: TCue, controls: StoryCuePlaybackControls) => void;\n}\n\nexport interface StoryEventCoordinatorCallbacks<TState, TCue> extends StoryPresentationPort<TCue> {\n applyState: (state: TState) => void;\n}\n\nexport interface StoryEventCoordinatorOptions<TState, TCue> {\n createInitialState: () => TState;\n callbacks: StoryEventCoordinatorCallbacks<TState, TCue>;\n pendingStateTimeoutMs?: number;\n dedupeLimit?: number;\n scheduler?: StoryEventCoordinatorScheduler;\n}\n\nexport interface CoordinatedStoryCue<TState> {\n eventId: string;\n targetRevision: number;\n finalState: TState;\n}\n\nconst DEFAULT_PENDING_STATE_TIMEOUT_MS = 120;\nconst DEFAULT_EVENT_ID_DEDUPE_LIMIT = 128;\n\nconst defaultScheduler: StoryEventCoordinatorScheduler = {\n setTimeout: (callback, delayMs) => globalThis.setTimeout(callback, delayMs),\n clearTimeout: (handle) => {\n globalThis.clearTimeout(handle as ReturnType<typeof setTimeout>);\n },\n};\n\nexport class StoryEventCoordinator<\n TState extends { revision: number },\n TCue extends CoordinatedStoryCue<TState>,\n> {\n private readonly callbacks: StoryEventCoordinatorCallbacks<TState, TCue>;\n private readonly pendingStateTimeoutMs: number;\n private readonly dedupeLimit: number;\n private readonly scheduler: StoryEventCoordinatorScheduler;\n\n private currentState: TState;\n private pendingState: { state: TState; timer: unknown } | null = null;\n private deferredState: TState | null = null;\n private activeBlockingCue: { cue: TCue; controller: AbortController } | null = null;\n private readonly blockingCueQueue: TCue[] = [];\n private readonly activeCueControllers = new Set<AbortController>();\n private readonly seenEventIds = new Set<string>();\n private readonly seenEventOrder: string[] = [];\n\n constructor(private readonly options: StoryEventCoordinatorOptions<TState, TCue>) {\n this.callbacks = options.callbacks;\n this.pendingStateTimeoutMs = options.pendingStateTimeoutMs ?? DEFAULT_PENDING_STATE_TIMEOUT_MS;\n this.dedupeLimit = options.dedupeLimit ?? DEFAULT_EVENT_ID_DEDUPE_LIMIT;\n this.scheduler = options.scheduler ?? defaultScheduler;\n this.currentState = this.options.createInitialState();\n }\n\n replaceSnapshot(state: TState): void {\n this.clearPendingState();\n this.abortActiveCues('story-snapshot-replaced');\n this.applyState(state);\n }\n\n handleState(event: { eventId: string; state: TState }): void {\n if (!this.rememberEventId(event.eventId)) return;\n this.handleIncomingState(event.state);\n }\n\n handleSnapshot(state: TState): void {\n this.handleIncomingState(state);\n }\n\n private handleIncomingState(state: TState): void {\n const revision = state.revision;\n if (revision <= this.currentState.revision) return;\n\n if (this.activeBlockingCue || this.blockingCueQueue.length > 0) {\n if (!this.deferredState || revision >= this.deferredState.revision) {\n this.deferredState = state;\n }\n return;\n }\n\n const pendingRevision = this.pendingState?.state.revision;\n if (pendingRevision !== undefined && revision < pendingRevision) return;\n if (pendingRevision === undefined && revision === this.currentState.revision) return;\n\n this.schedulePendingState(state);\n }\n\n handleCue(cue: TCue): void {\n if (!this.rememberEventId(cue.eventId)) return;\n this.handleBlockingCue(cue);\n }\n\n abort(reason = 'story-aborted'): void {\n this.clearPendingState();\n this.deferredState = null;\n this.blockingCueQueue.length = 0;\n this.abortActiveCues(reason);\n }\n\n reset(reason = 'story-reset'): void {\n this.abort(reason);\n this.currentState = this.options.createInitialState();\n this.seenEventIds.clear();\n this.seenEventOrder.length = 0;\n }\n\n private handleBlockingCue(cue: TCue): void {\n if (cue.targetRevision <= this.currentState.revision) return;\n if (\n this.activeBlockingCue?.cue.targetRevision === cue.targetRevision ||\n this.blockingCueQueue.some((queued) => queued.targetRevision === cue.targetRevision)\n ) {\n return;\n }\n\n const pendingRevision = this.pendingState?.state.revision;\n if (pendingRevision !== undefined) {\n if (\n pendingRevision > cue.targetRevision &&\n (!this.deferredState || pendingRevision >= this.deferredState.revision)\n ) {\n this.deferredState = this.pendingState?.state ?? null;\n }\n this.clearPendingState();\n }\n if (this.deferredState && cue.targetRevision >= this.deferredState.revision) {\n this.deferredState = null;\n }\n\n this.blockingCueQueue.push(cue);\n this.blockingCueQueue.sort((left, right) => left.targetRevision - right.targetRevision);\n this.startNextBlockingCue();\n }\n\n private startNextBlockingCue(): void {\n if (this.activeBlockingCue) return;\n let cue = this.blockingCueQueue.shift();\n while (cue && cue.targetRevision <= this.currentState.revision) {\n cue = this.blockingCueQueue.shift();\n }\n if (!cue) {\n this.flushDeferredState();\n return;\n }\n\n const controller = new AbortController();\n this.activeCueControllers.add(controller);\n this.activeBlockingCue = { cue, controller };\n\n let committed = false;\n let completed = false;\n const commit = () => {\n if (committed || controller.signal.aborted) return;\n committed = true;\n this.clearPendingState();\n if (this.deferredState && this.deferredState.revision <= cue.finalState.revision) {\n this.deferredState = null;\n }\n this.applyState(cue.finalState);\n };\n\n try {\n this.callbacks.playCue(cue, {\n signal: controller.signal,\n commit,\n done: (outcome) => {\n if (completed) return;\n completed = true;\n if (!committed && !controller.signal.aborted && outcome !== 'failed') {\n commit();\n }\n this.releaseCueController(controller);\n this.startNextBlockingCue();\n },\n });\n } catch {\n completed = true;\n this.releaseCueController(controller);\n this.startNextBlockingCue();\n }\n }\n\n private schedulePendingState(state: TState): void {\n this.clearPendingState();\n const timer = this.scheduler.setTimeout(() => {\n if (!this.pendingState || this.pendingState.state !== state) return;\n this.pendingState = null;\n this.applyState(state);\n }, this.pendingStateTimeoutMs);\n this.pendingState = { state, timer };\n }\n\n private applyState(state: TState): void {\n this.currentState = state;\n this.callbacks.applyState(state);\n }\n\n private flushDeferredState(): void {\n const state = this.deferredState;\n this.deferredState = null;\n if (state && state.revision > this.currentState.revision) {\n this.clearPendingState();\n this.applyState(state);\n }\n }\n\n private clearPendingState(): void {\n if (!this.pendingState) return;\n this.scheduler.clearTimeout(this.pendingState.timer);\n this.pendingState = null;\n }\n\n private abortActiveCues(reason: string): void {\n for (const controller of [...this.activeCueControllers]) {\n this.abortCueController(controller, reason);\n }\n this.activeBlockingCue = null;\n }\n\n private abortCueController(controller: AbortController, reason: string): void {\n this.activeCueControllers.delete(controller);\n controller.abort(reason);\n }\n\n private releaseCueController(controller: AbortController): void {\n this.activeCueControllers.delete(controller);\n if (this.activeBlockingCue?.controller === controller) {\n this.activeBlockingCue = null;\n }\n }\n\n private rememberEventId(eventId: string): boolean {\n if (this.seenEventIds.has(eventId)) {\n return false;\n }\n\n this.seenEventIds.add(eventId);\n this.seenEventOrder.push(eventId);\n if (this.seenEventOrder.length > this.dedupeLimit) {\n const evicted = this.seenEventOrder.shift();\n if (evicted) {\n this.seenEventIds.delete(evicted);\n }\n }\n return true;\n }\n}\n", "import type { Container, Graphics, Sprite, Text, BlurFilter, TextStyleOptions } from 'pixi.js';\nimport type { RuntimeLogger } from '@bardway/trpg-media';\nimport type { TokenAvatarCrop } from './PixiMapWorldUtils.js';\nimport { resolveCroppedCoverRect } from './PixiMapWorldUtils.js';\nimport type { BattleViewportGridLayout } from './PixiSessionLayout.js';\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\nimport {\n PixiBattleTokenLifecycleCoordinator,\n type TokenLifecycleLease,\n} from './PixiBattleTokenLifecycleCoordinator.js';\nimport { BattlePresentationPoseRegistry } from './BattlePresentationPoseRegistry.js';\nimport type { PixiAssetManager } from './PixiAssetManager.js';\nimport type { PixiSceneGraph } from './PixiSceneGraph.js';\nimport type { SessionTuningResolver, SessionTuningPath } from '@bardway/trpg-media/tuning';\nexport interface TokenWorldInput {\n id: string;\n gridPosition: { col: number; row: number };\n label?: string;\n avatarUrl?: string;\n avatarCrop?: TokenAvatarCrop;\n avatarOverrideUrl?: string;\n bodyColor: string;\n}\nexport interface TokenFocusTransitionOptions {\n director: PixiAnimationDirector;\n signal: AbortSignal;\n duration: number;\n}\nexport interface TokenWorldDependencies {\n Container: typeof import('pixi.js').Container;\n Graphics: typeof import('pixi.js').Graphics;\n Sprite: typeof import('pixi.js').Sprite;\n Text?: typeof import('pixi.js').Text;\n BlurFilter?: typeof import('pixi.js').BlurFilter;\n ColorMatrixFilter?: typeof import('pixi.js').ColorMatrixFilter;\n Rectangle?: typeof import('pixi.js').Rectangle;\n director: PixiAnimationDirector;\n requestRender(): void;\n logger: RuntimeLogger;\n maskColor: string;\n exitSmokeColor: string;\n vignetteColor: string;\n labelStyle: TextStyleOptions;\n updateDecoration?(node: Container, label: Container, input: TokenWorldInput): void;\n}\n/** Retained neutral world extracted from PixiBattleWorld's node, avatar, motion, focus and lease mechanisms. */\nexport class PixiTokenWorld {\n private readonly tokenNodes = new Map<string, Container>();\n private readonly tokenAvatarLayers = new Map<string, Container>();\n private readonly tokenLabelNodes = new Map<string, { root: Container }>();\n private readonly tokenBodies = new Map<string, Graphics>();\n private readonly tokenNames = new Map<string, Text>();\n private readonly tokenAvatarKeys = new Map<string, string>();\n private readonly tokenAvatarVersions = new Map<string, number>();\n private readonly tokenAvatarMaskSizes = new Map<string, number>();\n private readonly tokenAvatarNodes = new Map<string, Sprite>();\n private readonly tokenAvatarMasks = new Map<string, Graphics>();\n private readonly tokenFallbackNodes = new Map<string, Text>();\n private readonly presentationHolds = new Map<string, Set<symbol>>();\n private readonly pendingDeathTransitions = new Map<string, () => void>();\n private readonly settledActionPositions = new Map<string, { col: number; row: number }>();\n private readonly lifecycle = new PixiBattleTokenLifecycleCoordinator();\n private readonly poses = new BattlePresentationPoseRegistry();\n private readonly ownedMotionBlurFilters = new Set<BlurFilter>();\n private readonly availableMotionBlurFilters: BlurFilter[] = [];\n private layout: BattleViewportGridLayout | null = null;\n private activeResourceScope: string | null = null;\n private owner: string | null = null;\n private generation = 0;\n private readonly focusVignette: Graphics;\n private focusedTokenIds: ReadonlySet<string> | null = null;\n private unfocusedTokenAlpha = 1;\n private labelsSuppressed = false;\n private reducedMotion = false;\n private destroyed = false;\n private lifetime = new AbortController();\n constructor(\n private readonly scene: PixiSceneGraph,\n private readonly assets: PixiAssetManager,\n private readonly dependencies: TokenWorldDependencies,\n private readonly tuning?: SessionTuningResolver,\n ) {\n this.focusVignette = new dependencies.Graphics();\n this.focusVignette.visible = false;\n scene.worldOverlayFxLayer.addChild(this.focusVignette);\n }\n sync(input: {\n owner: string;\n revision: number;\n layout: BattleViewportGridLayout;\n tokens: readonly TokenWorldInput[];\n hydrate?: boolean;\n animateMoves?: boolean;\n }): void {\n if (this.destroyed) return;\n if (!input.owner.trim() || !Number.isSafeInteger(input.revision) || input.revision < 0)\n throw new Error('Invalid token world identity');\n if (new Set(input.tokens.map((token) => token.id)).size !== input.tokens.length)\n throw new Error('Duplicate visual token ID');\n if (this.owner !== input.owner) {\n this.reset();\n this.owner = input.owner;\n this.activeResourceScope = `runtime:token-world:${input.owner}:${++this.generation}`;\n }\n this.layout = input.layout;\n const skip = Boolean(input.hydrate || this.reducedMotion);\n const transition = this.lifecycle.diff(input.revision, input.tokens, skip);\n const diameter = Math.min(input.layout.cellW, input.layout.cellH);\n const active = new Set(input.tokens.map((token) => token.id));\n for (const token of input.tokens) {\n const node = this.tokenNodes.get(token.id) ?? this.createTokenNode(token.id);\n const avatarLayer = this.ensureTokenAvatarLayer(node, token.id);\n let body = this.tokenBodies.get(token.id);\n if (!body) {\n body = new this.dependencies.Graphics();\n node.addChildAt(body, 0);\n this.tokenBodies.set(token.id, body);\n }\n body\n .clear()\n .circle(0, 0, diameter * 0.42)\n .fill(token.bodyColor);\n let label = this.tokenLabelNodes.get(token.id);\n if (!label) {\n label = { root: new this.dependencies.Container() };\n node.addChild(label.root);\n this.tokenLabelNodes.set(token.id, label);\n }\n if (this.dependencies.Text) {\n let name = this.tokenNames.get(token.id);\n if (!name) {\n name = new this.dependencies.Text({ text: '', style: this.dependencies.labelStyle });\n name.anchor.set(0.5);\n label.root.addChild(name);\n this.tokenNames.set(token.id, name);\n }\n name.text = token.label ?? '';\n name.position.set(0, diameter * 0.6);\n }\n const point = this.getCellCenter(token.gridPosition, input.layout);\n this.poses.syncAuthoritative(token.id, point);\n if (!this.poses.isLocked(token.id)) node.position.set(point.x, point.y);\n void this.syncTokenAvatar(\n node,\n avatarLayer,\n token,\n diameter * 0.66,\n token.avatarOverrideUrl ?? null,\n );\n this.dependencies.updateDecoration?.(node, label.root, token);\n }\n for (const removed of transition.removed) {\n const node = this.tokenNodes.get(removed.id);\n if (!node) continue;\n if (skip) this.destroyTokenNode(removed.id, node);\n else void this.playTokenExit(removed.id, node);\n }\n if (!skip) {\n for (const added of transition.added) {\n const node = this.tokenNodes.get(added.id);\n if (node) void this.playTokenEnter(added.id, node, 0);\n }\n if (input.animateMoves)\n for (const moved of transition.moved) {\n const node = this.tokenNodes.get(moved.id);\n if (node) void this.playSnapshotMovement(moved.id, node, moved.from, moved.to);\n }\n }\n this.poses.deleteMissing(active);\n this.focusVignette\n .clear()\n .rect(input.layout.x, input.layout.y, input.layout.width, input.layout.height)\n .fill({ color: this.dependencies.vignetteColor, alpha: 0.4 });\n this.dependencies.requestRender();\n }\n gridToPoint(position: { col: number; row: number }): { x: number; y: number } | null {\n return this.layout ? this.getCellCenter(position, this.layout) : null;\n }\n setReducedMotion(value: boolean): void {\n this.reducedMotion = value;\n }\n isReducedMotionEnabled(): boolean {\n return this.reducedMotion;\n }\n reset(): void {\n this.lifetime.abort('token-world-reset');\n this.lifetime = new AbortController();\n this.generation++;\n this.lifecycle.reset();\n for (const [id, node] of [...this.tokenNodes]) this.destroyTokenNode(id, node);\n this.presentationHolds.clear();\n this.poses.reset();\n this.focusedTokenIds = null;\n this.focusVignette.visible = false;\n if (this.activeResourceScope)\n void this.assets\n .releaseScope(this.activeResourceScope)\n .catch((error) =>\n this.dependencies.logger.warn('Token world scope release failed', { error }),\n );\n this.activeResourceScope = null;\n this.owner = null;\n }\n destroy(): void {\n if (this.destroyed) return;\n this.reset();\n this.lifetime.abort('token-world-destroy');\n this.destroyed = true;\n for (const blur of this.ownedMotionBlurFilters) blur.destroy();\n this.ownedMotionBlurFilters.clear();\n this.availableMotionBlurFilters.length = 0;\n this.focusVignette.destroy();\n }\n private destroyTokenNode(id: string, node: Container): void {\n this.pendingDeathTransitions.get(id)?.();\n this.pendingDeathTransitions.delete(id);\n this.lifecycle.abort(id);\n this.removeTokenAvatar(id);\n this.tokenAvatarLayers.delete(id);\n this.tokenLabelNodes.delete(id);\n this.tokenBodies.delete(id);\n this.tokenNames.delete(id);\n this.tokenNodes.delete(id);\n this.presentationHolds.delete(id);\n this.settledActionPositions.delete(id);\n node.destroy({ children: true });\n }\n private resolveTuningNumber(\n path: SessionTuningPath,\n fallback: number,\n min = -Infinity,\n max = Infinity,\n ): number {\n const value = this.tuning?.get(path);\n return typeof value === 'number' && Number.isFinite(value)\n ? Math.max(min, Math.min(max, value))\n : fallback;\n }\n async playTokenMotion(\n tokenId: string,\n from: { col: number; row: number },\n to: { col: number; row: number },\n director: PixiAnimationDirector,\n signal: AbortSignal,\n options: {\n duration?: number;\n motionBlurStrength?: number;\n settleAtDestination?: boolean;\n startFromCurrent?: boolean;\n holdPresentation?: boolean;\n ease?: string;\n rampMotionBlur?: boolean;\n onProgress?: (progress: number, point: { x: number; y: number }) => void;\n } = {},\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n if (signal.aborted || this.destroyed) return;\n const node = this.tokenNodes.get(tokenId);\n const layout = this.layout;\n if (!node || !layout) return;\n const motion = this.beginMotionLease(tokenId, node, signal);\n signal = motion.signal;\n const fromPoint = this.getCellCenter(from, layout);\n const toPoint = this.getCellCenter(to, layout);\n const previousFilters = node.filters ? [...node.filters] : null;\n const previousFilterArea = node.filterArea;\n const blur = this.acquireMotionBlur(\n toPoint.x - fromPoint.x,\n toPoint.y - fromPoint.y,\n options.motionBlurStrength ?? 0,\n );\n if (blur) {\n node.filters = [...(previousFilters ?? []), blur];\n if (this.dependencies.Rectangle) {\n const padding = Math.max(16, (options.motionBlurStrength ?? 0) * 2);\n const diameter = Math.min(layout.cellW, layout.cellH);\n node.filterArea = new this.dependencies.Rectangle(\n -diameter / 2 - padding,\n -diameter / 2 - padding,\n diameter + padding * 2,\n diameter + padding * 2,\n );\n }\n }\n this.poses?.beginPresentation(tokenId);\n if (!options.startFromCurrent) node.position.set(fromPoint.x, fromPoint.y);\n try {\n const duration = options.duration ?? 0.3;\n if (blur && options.rampMotionBlur) {\n const targetStrengthX = blur.strengthX;\n const targetStrengthY = blur.strengthY;\n blur.strengthX = 0;\n blur.strengthY = 0;\n await Promise.all([\n director.tween(\n node.position,\n { x: toPoint.x, y: toPoint.y, duration, ease: options.ease ?? 'power3.in' },\n signal,\n ),\n director.tween(\n blur,\n {\n keyframes: [\n {\n strengthX: targetStrengthX,\n strengthY: targetStrengthY,\n duration: duration * 0.28,\n },\n {\n strengthX: targetStrengthX,\n strengthY: targetStrengthY,\n duration: duration * 0.47,\n },\n { strengthX: 0, strengthY: 0, duration: duration * 0.25 },\n ],\n },\n signal,\n ),\n ]);\n } else {\n const motionTween: Record<string, unknown> = {\n x: toPoint.x,\n y: toPoint.y,\n duration,\n ease: options.ease ?? 'power2.inOut',\n };\n if (options.onProgress) {\n motionTween.onUpdate = () => {\n if (signal.aborted || !motion.owns()) return;\n const dx = toPoint.x - fromPoint.x;\n const dy = toPoint.y - fromPoint.y;\n const divisor = dx * dx + dy * dy || 1;\n const progress = Math.max(\n 0,\n Math.min(1, ((node.x - fromPoint.x) * dx + (node.y - fromPoint.y) * dy) / divisor),\n );\n options.onProgress?.(progress, { x: node.x, y: node.y });\n };\n }\n await director.tween(node.position, motionTween, signal);\n }\n if (!signal.aborted) options.onProgress?.(1, toPoint);\n if (!signal.aborted && options.settleAtDestination) {\n this.settledActionPositions.set(tokenId, { ...to });\n this.lifecycle.settle(tokenId, to);\n this.poses?.syncAuthoritative(tokenId, toPoint);\n }\n } finally {\n if (blur) {\n if (motion.owns()) {\n node.filters = previousFilters;\n node.filterArea = previousFilterArea;\n }\n this.releaseMotionBlur(blur);\n }\n if (motion.owns() && (!options.holdPresentation || signal.aborted))\n this.reconcilePresentationNode(tokenId, node);\n motion.release();\n }\n }\n\n async playTokenNudge(\n tokenId: string,\n offset: { x: number; y: number },\n director: PixiAnimationDirector,\n signal: AbortSignal,\n durations: { out?: number; hold?: number; back?: number; motionBlurStrength?: number } = {},\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n if (signal.aborted || this.destroyed) return;\n const node = this.tokenNodes.get(tokenId);\n if (!node) return;\n const motion = this.beginMotionLease(tokenId, node, signal);\n signal = motion.signal;\n this.poses?.beginPresentation(tokenId);\n const origin = { x: node.position.x, y: node.position.y };\n const previousFilters = node.filters ? [...node.filters] : null;\n const previousFilterArea = node.filterArea;\n const blur = this.acquireMotionBlur(offset.x, offset.y, durations.motionBlurStrength ?? 0);\n if (blur) {\n node.filters = [...(previousFilters ?? []), blur];\n if (this.dependencies.Rectangle) {\n const padding = Math.max(16, (durations.motionBlurStrength ?? 0) * 2);\n const diameter = this.layout ? Math.min(this.layout.cellW, this.layout.cellH) : 96;\n node.filterArea = new this.dependencies.Rectangle(\n -diameter / 2 - padding,\n -diameter / 2 - padding,\n diameter + padding * 2,\n diameter + padding * 2,\n );\n }\n }\n try {\n await director.tween(\n node.position,\n {\n x: origin.x + offset.x,\n y: origin.y + offset.y,\n duration: durations.out ?? 0.12,\n },\n signal,\n );\n if (!signal.aborted && (durations.hold ?? 0) > 0) {\n await director.tween({}, { duration: durations.hold }, signal);\n }\n if (!signal.aborted)\n await director.tween(\n node.position,\n { ...origin, duration: durations.back ?? 0.16 },\n signal,\n );\n } finally {\n if (blur) {\n if (motion.owns()) {\n node.filters = previousFilters;\n node.filterArea = previousFilterArea;\n }\n this.releaseMotionBlur(blur);\n }\n if (motion.owns()) this.reconcilePresentationNode(tokenId, node);\n motion.release();\n }\n }\n\n async playTokenDodgeExchange(\n attackerId: string,\n targetId: string,\n attackerOffset: { x: number; y: number },\n targetOffset: { x: number; y: number },\n director: PixiAnimationDirector,\n signal: AbortSignal,\n options: { attackerBlurStrength?: number } = {},\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n if (signal.aborted || this.destroyed) return;\n const attacker = this.tokenNodes.get(attackerId);\n const target = this.tokenNodes.get(targetId);\n if (!attacker || !target) return;\n const attackerMotion = this.beginMotionLease(attackerId, attacker, signal);\n const targetMotion = this.beginMotionLease(targetId, target, attackerMotion.signal);\n signal = targetMotion.signal;\n this.poses?.beginPresentation(attackerId);\n this.poses?.beginPresentation(targetId);\n const attackerOrigin = { x: attacker.x, y: attacker.y };\n const targetOrigin = { x: target.x, y: target.y };\n const previousFilters = attacker.filters ? [...attacker.filters] : null;\n const previousFilterArea = attacker.filterArea;\n const blur = this.acquireMotionBlur(\n attackerOffset.x,\n attackerOffset.y,\n options.attackerBlurStrength ?? 0,\n );\n if (blur) attacker.filters = [...(previousFilters ?? []), blur];\n try {\n await director.tween(\n attacker.position,\n {\n x: attackerOrigin.x + attackerOffset.x,\n y: attackerOrigin.y + attackerOffset.y,\n duration: 0.16,\n ease: 'power2.out',\n },\n signal,\n );\n if (!signal.aborted)\n await director.tween(\n target.position,\n {\n x: targetOrigin.x + targetOffset.x,\n y: targetOrigin.y + targetOffset.y,\n duration: 0.14,\n ease: 'power2.out',\n },\n signal,\n );\n if (!signal.aborted)\n await director.tween(\n attacker.position,\n { ...attackerOrigin, duration: 0.14, ease: 'power2.in' },\n signal,\n );\n if (!signal.aborted)\n await director.tween(\n target.position,\n { ...targetOrigin, duration: 0.16, ease: 'power2.inOut' },\n signal,\n );\n } finally {\n if (blur) {\n if (attackerMotion.owns()) {\n attacker.filters = previousFilters;\n attacker.filterArea = previousFilterArea;\n }\n this.releaseMotionBlur(blur);\n }\n if (attackerMotion.owns()) this.reconcilePresentationNode(attackerId, attacker);\n if (targetMotion.owns()) this.reconcilePresentationNode(targetId, target);\n targetMotion.release();\n attackerMotion.release();\n }\n }\n\n async playCoverTransition(\n tokenId: string,\n texture: import('pixi.js').Texture,\n director: PixiAnimationDirector,\n signal: AbortSignal,\n options: {\n coverHold: number;\n entryShake: number;\n grayDuration: number;\n skullScale: number;\n entryScale: number;\n },\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n if (signal.aborted || this.destroyed) return;\n const node = this.tokenNodes.get(tokenId);\n const avatarLayer = this.tokenAvatarLayers.get(tokenId);\n if (!node || !avatarLayer) return;\n this.pendingDeathTransitions.get(tokenId)?.();\n this.pendingDeathTransitions.delete(tokenId);\n const diameter = this.layout ? Math.min(this.layout.cellW, this.layout.cellH) : 96;\n const aperture = diameter * 0.66;\n const cover = new this.dependencies.Sprite(texture);\n cover.anchor.set(0.5);\n cover.width = diameter * options.skullScale;\n cover.height = diameter * options.skullScale;\n cover.alpha = 1;\n cover.eventMode = 'none';\n const label = this.tokenLabelNodes.get(tokenId)?.root;\n if (label?.parent === node) node.addChildAt(cover, node.getChildIndex(label));\n else node.addChild(cover);\n const initialScale = { x: cover.scale.x, y: cover.scale.y };\n const targetScaleRatio = aperture / Math.max(1, diameter * options.skullScale);\n cover.scale.set(initialScale.x * options.entryScale, initialScale.y * options.entryScale);\n const previousFilters = node.filters ? [...node.filters] : null;\n const previousFilterArea = node.filterArea;\n const grayFilter = this.dependencies.ColorMatrixFilter\n ? new this.dependencies.ColorMatrixFilter()\n : null;\n if (grayFilter) {\n grayFilter.saturate(-1, false);\n grayFilter.brightness(0.5, true);\n grayFilter.alpha = 0;\n node.filters = [...(previousFilters ?? []), grayFilter];\n if (this.dependencies.Rectangle) {\n const padding = diameter * 0.7;\n node.filterArea = new this.dependencies.Rectangle(\n -diameter / 2 - padding,\n -diameter / 2 - padding,\n diameter + padding * 2,\n diameter + padding * 2,\n );\n }\n }\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n node.filters = previousFilters;\n node.filterArea = previousFilterArea;\n cover.parent?.removeChild(cover);\n cover.destroy();\n grayFilter?.destroy();\n };\n try {\n const coverOrigin = { x: cover.x, y: cover.y };\n if (options.entryShake > 0)\n await director.tween(\n cover.position,\n {\n keyframes: [\n { x: coverOrigin.x - 5, y: coverOrigin.y + 2, duration: options.entryShake / 4 },\n { x: coverOrigin.x + 4, y: coverOrigin.y - 3, duration: options.entryShake / 4 },\n { x: coverOrigin.x - 2, y: coverOrigin.y + 1, duration: options.entryShake / 4 },\n { ...coverOrigin, duration: options.entryShake / 4 },\n ],\n },\n signal,\n );\n if (!signal.aborted && options.coverHold > 0)\n await director.tween({}, { duration: options.coverHold }, signal);\n if (!signal.aborted) {\n await Promise.all([\n director.tween(\n cover.scale,\n {\n x: initialScale.x * targetScaleRatio,\n y: initialScale.y * targetScaleRatio,\n duration: options.grayDuration,\n ease: 'power2.out',\n },\n signal,\n ),\n grayFilter\n ? director.tween(\n grayFilter,\n { alpha: 1, duration: options.grayDuration, ease: 'power1.inOut' },\n signal,\n )\n : Promise.resolve(),\n ]);\n }\n } catch (error) {\n cleanup();\n throw error;\n }\n if (signal.aborted) cleanup();\n else this.pendingDeathTransitions.set(tokenId, cleanup);\n }\n\n getPresentationNode(tokenId: string): Container | null {\n return this.tokenNodes.get(tokenId) ?? null;\n }\n\n getPresentationLabelNode(tokenId: string): Container | null {\n return this.tokenLabelNodes.get(tokenId)?.root ?? null;\n }\n\n beginTokenPresentation(tokenId: string): void {\n if (!this.tokenNodes.has(tokenId)) return;\n this.lifecycle.abort(tokenId);\n this.poses?.beginPresentation(tokenId);\n }\n\n holdTokenPresentation(tokenId: string): () => void {\n const lease = Symbol(tokenId);\n const leases = this.presentationHolds.get(tokenId) ?? new Set<symbol>();\n leases.add(lease);\n this.presentationHolds.set(tokenId, leases);\n this.beginTokenPresentation(tokenId);\n return () => {\n if (this.presentationHolds.get(tokenId) !== leases || !leases.delete(lease)) return;\n if (leases.size === 0) {\n this.presentationHolds.delete(tokenId);\n this.finishTokenPresentation(tokenId);\n }\n };\n }\n\n finishTokenPresentation(tokenId: string): void {\n const node = this.tokenNodes.get(tokenId);\n if (node) this.reconcilePresentationNode(tokenId, node);\n }\n\n async setFocusTokens(\n tokenIds: readonly string[],\n transition?: TokenFocusTransitionOptions,\n ): Promise<void> {\n if (transition)\n transition = {\n ...transition,\n signal: AbortSignal.any([transition.signal, this.lifetime.signal]),\n };\n if (this.destroyed || transition?.signal.aborted) return;\n const focused = new Set(tokenIds);\n const unfocusedAlpha = this.resolveTuningNumber(\n 'visual.battle.actionFx.unfocusedTokenAlpha',\n 0.14,\n 0,\n 1,\n );\n this.focusedTokenIds = focused;\n this.unfocusedTokenAlpha = unfocusedAlpha;\n this.labelsSuppressed = true;\n for (const item of this.tokenLabelNodes.values()) item.root.renderable = true;\n const vignetteAlpha = this.resolveTuningNumber(\n 'visual.battle.actionFx.cameraVignetteAlpha',\n 0.82,\n 0,\n 1,\n );\n this.focusVignette.visible = true;\n this.dependencies.requestRender?.();\n if (!transition) {\n for (const [id, node] of this.tokenNodes) node.alpha = this.resolveFocusedAlpha(id, 1);\n for (const item of this.tokenLabelNodes.values()) {\n item.root.alpha = 0;\n item.root.renderable = false;\n }\n this.focusVignette.alpha = vignetteAlpha;\n return;\n }\n await Promise.all([\n ...[...this.tokenNodes].map(([id, node]) =>\n transition.director.tween(\n node,\n {\n alpha: this.resolveFocusedAlpha(id, 1),\n duration: transition.duration,\n },\n transition.signal,\n ),\n ),\n ...[...this.tokenLabelNodes.values()].map((item) =>\n transition.director\n .tween(item.root, { alpha: 0, duration: transition.duration }, transition.signal)\n .then(() => {\n if (!transition.signal.aborted && this.labelsSuppressed) item.root.renderable = false;\n }),\n ),\n transition.director.tween(\n this.focusVignette,\n { alpha: vignetteAlpha, duration: transition.duration },\n transition.signal,\n ),\n ]);\n }\n\n async clearFocusTokens(transition?: TokenFocusTransitionOptions): Promise<void> {\n if (transition)\n transition = {\n ...transition,\n signal: AbortSignal.any([transition.signal, this.lifetime.signal]),\n };\n if (this.destroyed || transition?.signal.aborted) return;\n this.labelsSuppressed = false;\n for (const item of this.tokenLabelNodes.values()) item.root.renderable = true;\n if (transition) {\n await Promise.all([\n ...[...this.tokenNodes.values()].map((node) =>\n transition.director.tween(\n node,\n { alpha: 1, duration: transition.duration },\n transition.signal,\n ),\n ),\n ...[...this.tokenLabelNodes.values()].map((item) =>\n transition.director.tween(\n item.root,\n { alpha: 1, duration: transition.duration },\n transition.signal,\n ),\n ),\n transition.director.tween(\n this.focusVignette,\n { alpha: 0, duration: transition.duration },\n transition.signal,\n ),\n ]);\n } else {\n for (const node of this.tokenNodes.values()) node.alpha = 1;\n for (const item of this.tokenLabelNodes.values()) item.root.alpha = 1;\n this.focusVignette.alpha = 0;\n }\n this.focusedTokenIds = null;\n this.unfocusedTokenAlpha = 1;\n if (this.focusVignette.alpha <= 0) this.focusVignette.visible = false;\n this.dependencies.requestRender?.();\n }\n\n getCellSize(): { width: number; height: number } | null {\n return this.layout ? { width: this.layout.cellW, height: this.layout.cellH } : null;\n }\n\n private resolveFocusedAlpha(tokenId: string, baseAlpha: number): number {\n if (!this.focusedTokenIds || this.focusedTokenIds.has(tokenId)) return baseAlpha;\n return baseAlpha * this.unfocusedTokenAlpha;\n }\n\n private acquireMotionBlur(dx: number, dy: number, strength: number): BlurFilter | null {\n if (!this.dependencies.BlurFilter || strength <= 0) return null;\n const blur =\n this.availableMotionBlurFilters.pop() ??\n new this.dependencies.BlurFilter({ strengthX: 0, strengthY: 0, quality: 2, kernelSize: 7 });\n this.ownedMotionBlurFilters.add(blur);\n const distance = Math.hypot(dx, dy) || 1;\n blur.strengthX = Math.max(0.5, (Math.abs(dx) / distance) * strength);\n blur.strengthY = Math.max(0.5, (Math.abs(dy) / distance) * strength);\n blur.enabled = true;\n return blur;\n }\n\n private releaseMotionBlur(blur: BlurFilter): void {\n if (!this.ownedMotionBlurFilters.has(blur)) return;\n blur.enabled = false;\n blur.strengthX = 0;\n blur.strengthY = 0;\n this.availableMotionBlurFilters.push(blur);\n }\n\n private createTokenNode(tokenId: string): Container {\n const node = new this.dependencies.Container({ label: `battle-token:${tokenId}` });\n this.scene.tokenLayer.addChild(node);\n this.tokenNodes.set(tokenId, node);\n return node;\n }\n\n private async playTokenEnter(\n tokenId: string,\n node: Container,\n delaySeconds: number,\n ): Promise<void> {\n const director = this.dependencies.director;\n if (!director) return;\n const lease = this.lifecycle.begin(tokenId);\n this.poses?.beginPresentation(tokenId);\n node.alpha = 0;\n node.scale.set(0.3);\n const enterDuration =\n this.resolveTuningNumber('motion.battle.tokenEnter.enterDurationMs', 466.666, 0, 5000) / 1000;\n const settleDuration =\n this.resolveTuningNumber('motion.battle.tokenEnter.settleDurationMs', 213.334, 0, 5000) /\n 1000;\n try {\n await Promise.all([\n director.tween(\n node,\n { alpha: 1, duration: enterDuration, delay: delaySeconds },\n lease.signal,\n ),\n director.tween(\n node.scale,\n { x: 1.08, y: 1.08, duration: enterDuration, delay: delaySeconds },\n lease.signal,\n ),\n ]);\n if (this.lifecycle.isCurrent(tokenId, lease)) {\n await director.tween(node.scale, { x: 1, y: 1, duration: settleDuration }, lease.signal);\n }\n } finally {\n this.finishLifecyclePose(tokenId, node, lease);\n }\n }\n\n private async playTokenExit(tokenId: string, node: Container): Promise<void> {\n const director = this.dependencies.director;\n if (!director) return;\n const lease = this.lifecycle.begin(tokenId);\n this.poses?.beginPresentation(tokenId);\n const blur = this.dependencies.BlurFilter\n ? new this.dependencies.BlurFilter({ strength: 0, quality: 2 })\n : null;\n if (blur) node.filters = [blur];\n const smoke = Array.from({ length: 8 }, (_, index) => {\n const particle = new this.dependencies.Graphics()\n .circle(0, 0, 5 + (index % 3) * 2)\n .fill({ color: this.dependencies.exitSmokeColor, alpha: 0.26 });\n particle.position.set(node.x + ((index % 4) - 1.5) * 12, node.y + Math.floor(index / 4) * 10);\n this.scene.worldOverlayFxLayer.addChild(particle);\n return particle;\n });\n try {\n await Promise.all([\n director.tween(node, { alpha: 0, duration: 0.405 }, lease.signal),\n director.tween(node.scale, { x: 0.4, y: 0.4, duration: 0.405 }, lease.signal),\n blur\n ? director.tween(blur, { strength: 6, duration: 0.405 }, lease.signal)\n : Promise.resolve(),\n ...smoke.map((particle, index) =>\n director.tween(\n particle,\n { y: particle.y - 54 - index * 3, alpha: 0, duration: 0.9 },\n lease.signal,\n ),\n ),\n ]);\n if (this.lifecycle.isCurrent(tokenId, lease) && this.tokenNodes.get(tokenId) === node) {\n this.destroyTokenNode(tokenId, node);\n }\n } finally {\n smoke.forEach((particle) => {\n particle.parent?.removeChild(particle);\n particle.destroy();\n });\n if (node.destroyed !== true) {\n node.filters = [];\n blur?.destroy();\n this.finishLifecyclePose(tokenId, node, lease);\n } else {\n blur?.destroy();\n this.lifecycle.complete(tokenId, lease);\n }\n }\n }\n\n private async playSnapshotMovement(\n tokenId: string,\n node: Container,\n from: { col: number; row: number },\n to: { col: number; row: number },\n ): Promise<void> {\n const director = this.dependencies.director;\n const layout = this.layout;\n if (!director || !layout) return;\n const lease = this.lifecycle.begin(tokenId);\n const fromPoint = this.getCellCenter(from, layout);\n const toPoint = this.getCellCenter(to, layout);\n this.poses?.beginPresentation(tokenId);\n node.position.set(fromPoint.x, fromPoint.y);\n try {\n await director.tween(\n node.position,\n { x: toPoint.x, y: toPoint.y, duration: 0.3 },\n lease.signal,\n );\n } finally {\n this.finishLifecyclePose(tokenId, node, lease);\n }\n }\n\n private finishLifecyclePose(tokenId: string, node: Container, lease: TokenLifecycleLease): void {\n if (this.tokenNodes.get(tokenId) === node) this.reconcilePresentationNode(tokenId, node);\n this.lifecycle.complete(tokenId, lease);\n this.dependencies.requestRender?.();\n }\n\n private ensureTokenAvatarLayer(node: Container, tokenId: string): Container {\n const existing = this.tokenAvatarLayers.get(tokenId);\n if (existing) return existing;\n const layer = new this.dependencies.Container({ label: `battle-token-avatar:${tokenId}` });\n node.addChild(layer);\n this.tokenAvatarLayers.set(tokenId, layer);\n return layer;\n }\n\n private async syncTokenAvatar(\n node: Container,\n avatarLayer: Container,\n token: TokenWorldInput,\n aperture: number,\n replacement: string | null,\n ): Promise<void> {\n const statusUrl = replacement ?? undefined;\n const source = statusUrl ?? token.avatarUrl;\n const key = source\n ? JSON.stringify([source, statusUrl ? 'status' : (token.avatarCrop ?? null)])\n : null;\n const previousKey = this.tokenAvatarKeys.get(token.id);\n if (!source || !key) {\n if (previousKey !== undefined) this.removeTokenAvatar(token.id);\n return;\n }\n if (previousKey === key) {\n if (this.tokenAvatarMaskSizes.get(token.id) !== aperture)\n this.resizeTokenAvatar(token.id, aperture, statusUrl ? undefined : token.avatarCrop);\n return;\n }\n this.tokenAvatarKeys.set(token.id, key);\n const version = (this.tokenAvatarVersions.get(token.id) ?? 0) + 1;\n this.tokenAvatarVersions.set(token.id, version);\n await this.assets\n .loadTexture(\n `battle-token:${token.id}:${key}`,\n source,\n this.activeResourceScope ?? 'battle-common',\n )\n .then((texture) => {\n if (\n this.tokenAvatarVersions.get(token.id) !== version ||\n this.tokenAvatarKeys.get(token.id) !== key ||\n this.tokenNodes.get(token.id) !== node ||\n this.tokenAvatarLayers.get(token.id) !== avatarLayer\n )\n return;\n const avatar = this.tokenAvatarNodes.get(token.id) ?? new this.dependencies.Sprite(texture);\n const mask = this.tokenAvatarMasks.get(token.id) ?? new this.dependencies.Graphics();\n avatar.texture = texture;\n avatar.mask = mask;\n if (!this.tokenAvatarNodes.has(token.id)) {\n avatarLayer.addChild(avatar, mask);\n this.tokenAvatarNodes.set(token.id, avatar);\n this.tokenAvatarMasks.set(token.id, mask);\n }\n this.resizeTokenAvatar(token.id, aperture, statusUrl ? undefined : token.avatarCrop);\n const fallback = this.tokenFallbackNodes.get(token.id);\n if (fallback) fallback.visible = false;\n this.dependencies.requestRender?.();\n })\n .catch(() => {\n if (this.tokenAvatarVersions.get(token.id) === version)\n this.tokenAvatarKeys.delete(token.id);\n });\n }\n\n private resizeTokenAvatar(\n tokenId: string,\n aperture: number,\n crop?: TokenWorldInput['avatarCrop'],\n ): void {\n const avatar = this.tokenAvatarNodes.get(tokenId);\n const mask = this.tokenAvatarMasks.get(tokenId);\n if (!avatar || !mask) return;\n const rect = resolveCroppedCoverRect(\n {\n width: Number(avatar.texture?.width) || 1,\n height: Number(avatar.texture?.height) || 1,\n },\n { x: -aperture / 2, y: -aperture / 2, width: aperture, height: aperture },\n crop,\n );\n avatar.position.set(rect.x, rect.y);\n avatar.width = rect.width;\n avatar.height = rect.height;\n mask\n .clear()\n .circle(0, 0, aperture / 2)\n .fill(this.dependencies.maskColor);\n this.tokenAvatarMaskSizes.set(tokenId, aperture);\n }\n\n private removeTokenAvatar(tokenId: string): void {\n this.tokenAvatarVersions.set(tokenId, (this.tokenAvatarVersions.get(tokenId) ?? 0) + 1);\n this.tokenAvatarKeys.delete(tokenId);\n this.tokenAvatarMaskSizes.delete(tokenId);\n const avatar = this.tokenAvatarNodes.get(tokenId);\n if (avatar) {\n this.tokenAvatarLayers.get(tokenId)?.removeChild(avatar);\n avatar.destroy();\n this.tokenAvatarNodes.delete(tokenId);\n }\n const mask = this.tokenAvatarMasks.get(tokenId);\n if (mask) {\n this.tokenAvatarLayers.get(tokenId)?.removeChild(mask);\n mask.destroy();\n this.tokenAvatarMasks.delete(tokenId);\n }\n }\n\n private getCellCenter(\n position: { col: number; row: number },\n layout: BattleViewportGridLayout,\n ): { x: number; y: number } {\n return {\n x: layout.offsetX + (position.col + 0.5) * layout.cellW,\n y: layout.offsetY + (position.row + 0.5) * layout.cellH,\n };\n }\n\n private reconcilePresentationNode(tokenId: string, node: Container): void {\n if (node.destroyed || this.tokenNodes.get(tokenId) !== node) return;\n if (this.presentationHolds.has(tokenId)) return;\n if (!this.poses) return;\n this.poses.reconcile(tokenId);\n const resolved = this.poses.resolve(tokenId);\n node.position.set(resolved.authoritativeX, resolved.authoritativeY);\n node.rotation = resolved.rotation;\n node.scale.set(resolved.scale);\n node.alpha = this.resolveFocusedAlpha(tokenId, resolved.alpha);\n }\n private beginMotionLease(tokenId: string, node: Container, externalSignal: AbortSignal) {\n const lease = this.lifecycle.begin(tokenId);\n const controller = new AbortController();\n const abort = () => controller.abort();\n externalSignal.addEventListener('abort', abort, { once: true });\n lease.signal.addEventListener('abort', abort, { once: true });\n if (externalSignal.aborted || lease.signal.aborted) abort();\n return {\n signal: controller.signal,\n owns: () =>\n !node.destroyed &&\n this.tokenNodes.get(tokenId) === node &&\n this.lifecycle.isCurrent(tokenId, lease),\n release: () => {\n externalSignal.removeEventListener('abort', abort);\n lease.signal.removeEventListener('abort', abort);\n this.lifecycle.complete(tokenId, lease);\n },\n };\n }\n}\n", "import type { Sprite, Graphics, Texture } from 'pixi.js';\nimport { waitForSessionMediaReady, type RuntimeLogger } from '@bardway/trpg-media';\nimport type { PixiSceneGraph } from './PixiSceneGraph.js';\nimport type { PixiAssetManager } from './PixiAssetManager.js';\nimport type { PixiMediaBreathBinding, PixiMediaBreathRuntime } from './PixiMediaBreathRuntime.js';\nimport type { PixiVideoBinding, PixiVideoRuntime } from './PixiVideoRuntime.js';\nimport type { PixiBattleMapDissolve } from './PixiBattleMapDissolve.js';\nimport type { BattleViewportGridLayout } from './PixiSessionLayout.js';\nexport interface MapMediaSource {\n id: string;\n revision?: string;\n imageUrl: string;\n videoUrl?: string;\n}\nexport type MapMediaStatus = 'ready' | 'fallback';\ninterface MapMediaPresentation {\n sprite: Sprite;\n mediaBreath: PixiMediaBreathBinding | null;\n videoBinding: PixiVideoBinding | null;\n}\ninterface PendingMapTransition {\n incoming: Sprite;\n outgoing: MapMediaPresentation | null;\n mapSnapshot: MapMediaSource;\n mapKey: string;\n loadVersion: number;\n posterTexture: Texture;\n}\nexport interface MapMediaDependencies {\n Sprite: typeof import('pixi.js').Sprite;\n Graphics: typeof import('pixi.js').Graphics;\n mediaBreath?: PixiMediaBreathRuntime;\n videoRuntime?: PixiVideoRuntime;\n requestRender(): void;\n logger: RuntimeLogger;\n fallbackColor: string;\n}\n/** Exact poster/dissolve/video readiness and replacement mechanics extracted from PixiBattleWorld. */\nexport class PixiMapMediaSurface {\n private mapKey: string | null = null;\n private mapSprite: Sprite | null = null;\n private mapSpriteKey: string | null = null;\n private mapLoadVersion = 0;\n private mapMediaBreath: PixiMediaBreathBinding | null = null;\n private mapVideoBinding: PixiVideoBinding | null = null;\n private mapVideoReady: Promise<boolean> | null = null;\n private mapVideoFailed = false;\n private mapPosterTexture: Texture | null = null;\n private mapReadiness: {\n key: string;\n promise: Promise<MapMediaStatus>;\n resolve: (status: MapMediaStatus) => void;\n settled: boolean;\n } | null = null;\n private pendingMapTransition: PendingMapTransition | null = null;\n private deferredMapVideoUpgrade: PendingMapTransition | null = null;\n private layout: BattleViewportGridLayout | null = null;\n private mapFallbackNode: Graphics | null = null;\n private activeResourceScope: string | null = null;\n private owner: string | null = null;\n private destroyed = false;\n constructor(\n private readonly scene: PixiSceneGraph,\n private readonly assets: PixiAssetManager,\n private readonly dependencies: MapMediaDependencies,\n private readonly mapDissolve: PixiBattleMapDissolve | null = null,\n ) {}\n sync(input: {\n owner: string;\n map: MapMediaSource;\n layout: BattleViewportGridLayout;\n animate?: boolean;\n }): void {\n if (this.destroyed) return;\n if (!input.owner.trim() || !input.map.id.trim() || !input.map.imageUrl.trim())\n throw new Error('Invalid map media identity');\n if (this.owner !== input.owner) {\n this.reset();\n this.owner = input.owner;\n this.activeResourceScope = `runtime:map-media:${input.owner}:${this.mapLoadVersion}`;\n }\n this.layout = input.layout;\n this.syncMap(input.map, input.layout, Boolean(input.animate));\n }\n setReducedMotion(reduced: boolean): void {\n this.mapDissolve?.setReducedMotion(reduced);\n }\n setPaused(paused: boolean): void {\n if (paused) this.mapVideoBinding?.deactivate();\n else void this.mapVideoBinding?.activate(false);\n }\n reset(): void {\n this.mapLoadVersion++;\n this.mapKey = null;\n this.settleMapReadiness('fallback');\n this.destroyMapSprite();\n this.destroyMapFallback();\n if (this.activeResourceScope)\n void this.assets\n .releaseScope(this.activeResourceScope)\n .catch((error) => this.dependencies.logger.warn('Map scope release failed', { error }));\n this.activeResourceScope = null;\n this.owner = null;\n }\n destroy(): void {\n if (this.destroyed) return;\n this.reset();\n this.destroyed = true;\n this.mapDissolve?.destroy();\n }\n async waitForMapReady(\n mapSnapshot: MapMediaSource,\n signal: AbortSignal,\n timeoutMs: number,\n ): Promise<MapMediaStatus> {\n const key = this.resolveMapKey(mapSnapshot);\n const readiness = this.mapReadiness;\n if (this.mapKey !== key || !readiness || readiness.key !== key) return 'fallback';\n if (signal.aborted) return 'fallback';\n return new Promise((resolve) => {\n let settled = false;\n let timeout: ReturnType<typeof setTimeout> | null = null;\n const finish = (status: MapMediaStatus) => {\n if (settled) return;\n settled = true;\n signal.removeEventListener('abort', abort);\n if (timeout) clearTimeout(timeout);\n resolve(status);\n };\n const abort = () => finish('fallback');\n signal.addEventListener('abort', abort, { once: true });\n timeout = setTimeout(\n () => {\n this.dependencies.logger.warn('[PixiBattleWorld] \u6218\u6597\u5730\u56FE\u7B49\u5F85\u8D85\u65F6\uFF0C\u663E\u793A\u5B89\u5168\u5E95\u56FE', {\n mapId: mapSnapshot.id,\n imageUrl: mapSnapshot.imageUrl,\n timeoutMs,\n });\n finish('fallback');\n },\n Math.max(0, timeoutMs),\n );\n void readiness.promise.then(finish);\n });\n }\n\n async waitForVideoReady(map: MapMediaSource, signal: AbortSignal): Promise<boolean> {\n const key = this.resolveMapKey(map);\n if (signal.aborted || this.mapKey !== key || !this.mapSprite || !map.videoUrl) return false;\n if (this.mapVideoBinding) {\n const binding = this.mapVideoBinding;\n const ready = await waitForSessionMediaReady(binding.activate(false), signal);\n if (!ready && !signal.aborted && this.mapVideoBinding === binding) {\n this.mapVideoBinding = null;\n this.mapVideoFailed = true;\n if (this.mapPosterTexture) this.mapSprite.texture = this.mapPosterTexture;\n binding.release();\n this.dependencies.requestRender?.();\n }\n return ready;\n }\n if (!this.mapVideoReady || this.mapVideoFailed) {\n this.mapVideoFailed = false;\n this.mapVideoReady = this.upgradeMapToVideo(\n map,\n key,\n this.mapLoadVersion,\n this.mapSprite,\n this.mapPosterTexture ?? this.mapSprite.texture,\n );\n }\n return waitForSessionMediaReady(this.mapVideoReady, signal);\n }\n\n private syncMap(\n mapSnapshot: MapMediaSource,\n layout: BattleViewportGridLayout,\n animate: boolean,\n ): void {\n const mapKey = this.resolveMapKey(mapSnapshot);\n this.syncMapFallback(layout);\n if (this.mapKey === mapKey) {\n if (this.mapSprite && this.mapSpriteKey === mapKey) {\n this.mapSprite.width = layout.renderW;\n this.mapSprite.height = layout.renderH;\n this.mapSprite.position.set(layout.offsetX, layout.offsetY);\n }\n return;\n }\n this.commitPendingMapTransition();\n this.deferredMapVideoUpgrade = null;\n this.mapKey = mapKey;\n this.mapVideoReady = null;\n this.mapVideoFailed = false;\n this.beginMapReadiness(mapKey);\n const loadVersion = ++this.mapLoadVersion;\n void this.assets\n .loadTexture(\n `battle-map:${mapKey}`,\n mapSnapshot.imageUrl,\n this.activeResourceScope ?? `battle-map:${mapSnapshot.id}`,\n )\n .then((texture) => {\n if (loadVersion !== this.mapLoadVersion) return;\n const currentLayout = this.layout ?? layout;\n const sprite = new this.dependencies.Sprite(texture);\n sprite.width = currentLayout.renderW;\n sprite.height = currentLayout.renderH;\n sprite.position.set(currentLayout.offsetX, currentLayout.offsetY);\n const outgoing = this.mapSprite\n ? {\n sprite: this.mapSprite,\n mediaBreath: this.mapMediaBreath,\n videoBinding: this.mapVideoBinding,\n }\n : null;\n this.mapSprite = sprite;\n this.mapSpriteKey = mapKey;\n this.mapMediaBreath = null;\n this.mapVideoBinding = null;\n this.scene.mapLayer.addChild(sprite);\n this.settleMapReadiness('ready', mapKey);\n const transition: PendingMapTransition = {\n incoming: sprite,\n outgoing,\n mapSnapshot,\n mapKey,\n loadVersion,\n posterTexture: texture,\n };\n this.pendingMapTransition = transition;\n if (!animate || !outgoing || !this.mapDissolve) {\n this.commitPendingMapTransition(transition);\n return;\n }\n void this.mapDissolve\n .play(sprite, this.resolveMapDissolveSeed(mapKey))\n .then(() => this.commitPendingMapTransition(transition));\n })\n .catch((error) => {\n if (loadVersion !== this.mapLoadVersion) return;\n this.dependencies.logger.warn('[PixiBattleWorld] \u6218\u6597\u5730\u56FE\u7EB9\u7406\u52A0\u8F7D\u5931\u8D25\uFF0C\u663E\u793A\u5B89\u5168\u5E95\u56FE', {\n mapId: mapSnapshot.id,\n imageUrl: mapSnapshot.imageUrl,\n error,\n });\n this.destroyMapSprite();\n this.settleMapReadiness('fallback', mapKey);\n this.dependencies.requestRender?.();\n });\n }\n\n private resolveMapKey(mapSnapshot: MapMediaSource): string {\n return `${mapSnapshot.id}:${mapSnapshot.revision ?? ''}:${mapSnapshot.imageUrl}:${mapSnapshot.videoUrl ?? ''}`;\n }\n\n private resolveMapDissolveSeed(mapKey: string): number {\n let hash = 2166136261;\n for (let index = 0; index < mapKey.length; index += 1) {\n hash ^= mapKey.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0) / 0xffffffff;\n }\n\n private commitPendingMapTransition(\n transition: PendingMapTransition | null = this.pendingMapTransition,\n deferVideo = false,\n ): void {\n if (!transition || this.pendingMapTransition !== transition) return;\n this.pendingMapTransition = null;\n this.mapDissolve?.commit();\n if (transition.outgoing) this.destroyMapPresentation(transition.outgoing);\n if (\n this.mapSprite !== transition.incoming ||\n this.mapKey !== transition.mapKey ||\n transition.loadVersion !== this.mapLoadVersion\n ) {\n return;\n }\n this.mapMediaBreath = this.dependencies.mediaBreath?.attach(transition.incoming, 'map') ?? null;\n this.mapPosterTexture = transition.posterTexture;\n this.dependencies.requestRender?.();\n if (transition.mapSnapshot.videoUrl) {\n if (deferVideo) {\n this.deferredMapVideoUpgrade = transition;\n return;\n }\n this.mapVideoReady = this.upgradeMapToVideo(\n transition.mapSnapshot,\n transition.mapKey,\n transition.loadVersion,\n transition.incoming,\n transition.posterTexture,\n );\n }\n }\n\n private destroyMapPresentation(presentation: MapMediaPresentation): void {\n presentation.videoBinding?.release();\n presentation.mediaBreath?.release();\n this.scene.mapLayer.removeChild(presentation.sprite);\n presentation.sprite.destroy();\n }\n\n private async upgradeMapToVideo(\n mapSnapshot: MapMediaSource,\n mapKey: string,\n loadVersion: number,\n sprite: Sprite,\n posterTexture: Texture,\n ): Promise<boolean> {\n const runtime = this.dependencies.videoRuntime;\n const videoUrl = mapSnapshot.videoUrl;\n if (!runtime || !videoUrl) return false;\n try {\n const binding = await runtime.loadBinding({\n alias: `battle-map-video:${mapKey}`,\n videoUrl,\n scope: this.activeResourceScope ?? `battle-map:${mapSnapshot.id}`,\n onPlaybackFailure: () => {\n if (this.mapSprite === sprite) {\n sprite.texture = posterTexture;\n this.mapVideoBinding = null;\n this.mapVideoFailed = true;\n this.dependencies.requestRender?.();\n }\n },\n });\n if (\n loadVersion !== this.mapLoadVersion ||\n this.mapKey !== mapKey ||\n this.mapSprite !== sprite\n ) {\n binding.release();\n return false;\n }\n const activated = await binding.activate(true);\n if (\n !activated ||\n loadVersion !== this.mapLoadVersion ||\n this.mapKey !== mapKey ||\n this.mapSprite !== sprite\n ) {\n binding.release();\n if (this.mapKey === mapKey && this.mapLoadVersion === loadVersion)\n this.mapVideoFailed = true;\n return false;\n }\n this.mapVideoBinding?.release();\n this.mapVideoBinding = binding;\n sprite.texture = binding.texture;\n this.dependencies.requestRender?.();\n return true;\n } catch (error) {\n this.dependencies.logger.warn('[PixiBattleWorld] \u6218\u6597\u5730\u56FE WebM \u52A0\u8F7D\u5931\u8D25\uFF0C\u4FDD\u7559 WebP \u6D77\u62A5', {\n mapId: mapSnapshot.id,\n videoUrl,\n error,\n });\n if (this.mapKey === mapKey && this.mapLoadVersion === loadVersion) this.mapVideoFailed = true;\n return false;\n }\n }\n\n private beginMapReadiness(key: string): void {\n this.settleMapReadiness('fallback');\n let resolve!: (status: MapMediaStatus) => void;\n const promise = new Promise<MapMediaStatus>((settle) => {\n resolve = settle;\n });\n this.mapReadiness = { key, promise, resolve, settled: false };\n }\n\n private settleMapReadiness(status: MapMediaStatus, key?: string): void {\n const readiness = this.mapReadiness;\n if (!readiness || readiness.settled || (key !== undefined && readiness.key !== key)) return;\n readiness.settled = true;\n readiness.resolve(status);\n }\n\n private syncMapFallback(layout: BattleViewportGridLayout): void {\n const fallback = this.mapFallbackNode ?? new this.dependencies.Graphics();\n fallback\n .clear()\n .rect(layout.offsetX, layout.offsetY, layout.renderW, layout.renderH)\n .fill({ color: this.dependencies.fallbackColor, alpha: 1 });\n if (!this.mapFallbackNode) {\n this.scene.mapLayer.addChild(fallback);\n this.mapFallbackNode = fallback;\n }\n }\n\n private destroyMapSprite(): void {\n this.mapDissolve?.commit();\n this.deferredMapVideoUpgrade = null;\n const transition = this.pendingMapTransition;\n this.pendingMapTransition = null;\n if (transition?.outgoing) this.destroyMapPresentation(transition.outgoing);\n this.mapVideoBinding?.release();\n this.mapVideoBinding = null;\n this.mapVideoReady = null;\n this.mapVideoFailed = false;\n this.mapPosterTexture = null;\n if (!this.mapSprite) return;\n this.mapMediaBreath?.release();\n this.mapMediaBreath = null;\n this.scene.mapLayer.removeChild(this.mapSprite);\n this.mapSprite.destroy();\n this.mapSprite = null;\n this.mapSpriteKey = null;\n }\n\n private destroyMapFallback(): void {\n if (!this.mapFallbackNode) return;\n this.scene.mapLayer.removeChild(this.mapFallbackNode);\n this.mapFallbackNode.destroy({ children: true });\n this.mapFallbackNode = null;\n }\n}\n", "import type { RuntimeLogger } from '@bardway/trpg-media';\nimport type { Container, Sprite, BlurFilter, TextStyleOptions } from 'pixi.js';\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\nimport type { PixiAnimationActivity } from './PixiAnimationActivity.js';\nimport type { PixiAssetManager } from './PixiAssetManager.js';\nimport type { PixiSceneGraph } from './PixiSceneGraph.js';\nimport { PixiTokenWorld } from './PixiTokenWorld.js';\nimport {\n PixiBattleFxResourceOwner,\n type PixiBattleFxCapabilities,\n type PixiBattleTrailMode,\n} from './PixiBattleFxResources.js';\nimport { BattlePresentationEngine } from './BattlePresentationEngine.js';\nimport {\n PIXI_BATTLE_ACTION_TIMING,\n resolveAwayDodgeOffset,\n resolveExplosionArcPoint,\n resolveResourceFloatDuration,\n} from './PixiBattleActionRecipes.js';\nimport {\n battleFxRandom,\n resolveBladeSlashAngle,\n resolveBattlePassByPath,\n type BattleFxPoint,\n type BattlePassByPath,\n} from './BattleActionMotionMath.js';\nimport { resolveBattleTokenVisualLayout } from './PixiBattleVisualLayout.js';\nimport type { SessionTuningResolver, SessionTuningPath } from '@bardway/trpg-media/tuning';\nexport interface VisualFloatInstruction {\n id: string;\n tokenId: string;\n text: string;\n color: string;\n delay: number;\n outward: boolean;\n}\nexport interface VisualChargeMotion {\n outcome: 'hit' | 'dodge' | 'miss' | 'blocked';\n attackerFrom: { col: number; row: number };\n attackerTo: { col: number; row: number };\n targetFrom: { col: number; row: number };\n targetTo: { col: number; row: number };\n displacedTokens?: readonly {\n tokenId: string;\n from: { col: number; row: number };\n to: { col: number; row: number };\n }[];\n}\nexport interface VisualAttackInstruction {\n id: string;\n attackerId: string;\n targetId: string;\n actionType: 'shoot' | 'throw' | 'melee' | 'electric' | 'swing' | 'blade' | 'charge' | 'whip';\n evaded: boolean;\n recovering: boolean;\n hitIndex?: number;\n resultFeedback: 'miss' | 'other';\n feedbackText: string;\n damageFloats: readonly VisualFloatInstruction[];\n durations: { line: number };\n chargeMotion?: VisualChargeMotion;\n}\nexport interface CombatMotionContext {\n logger: RuntimeLogger;\n scene: PixiSceneGraph;\n world: PixiTokenWorld;\n assets: PixiAssetManager;\n director: PixiAnimationDirector;\n constructors: Pick<\n typeof import('pixi.js'),\n 'Container' | 'Graphics' | 'Sprite' | 'Text' | 'Rectangle' | 'BlurFilter'\n >;\n fxCapabilities: PixiBattleFxCapabilities;\n getTuning(): SessionTuningResolver | undefined;\n getAudio(): { playCue(id: string): void } | null;\n activity?: PixiAnimationActivity;\n typography: { data: TextStyleOptions; damage: TextStyleOptions };\n projectileImageUrl?: string;\n colors: {\n fx_attackLineColors_blade: string;\n fx_attackLineColors_swing: string;\n fx_attackLineColors_throw: string;\n pixi_effect_attackLine: string;\n pixi_effect_cinematic: string;\n pixi_effect_damage: string;\n pixi_effect_electric: string;\n pixi_effect_miss: string;\n pixi_effect_recover: string;\n pixi_sessionGraybox_transition: string;\n };\n}\nconst removeAndDestroy = (node: Container): void => {\n node.parent?.removeChild(node);\n if (!node.destroyed) node.destroy({ children: true });\n};\ntype CameraImpactShakeProfile = 'hit' | 'explosion';\ninterface ActiveCameraImpactShake {\n promise: Promise<void>;\n abort(): void;\n}\n/** Existing GPU resources and complete visual motions; the host supplies adjudicated instructions. */\nlet nextStatusScope = 0;\nexport class PixiCombatMotion {\n private readonly statusScope = `runtime:combat-status:${++nextStatusScope}`;\n private lifetime = new AbortController();\n private readonly fxResources: PixiBattleFxResourceOwner;\n private readonly presentationEngine: BattlePresentationEngine;\n private readonly cameraImpactShakes = new Map<string, ActiveCameraImpactShake>();\n private readonly heldChargeDodges = new Map<\n string,\n { tokenId: string; origin: { x: number; y: number }; node: Container }\n >();\n private electricGroupActive = false;\n private electricGroupFlashPlayed = false;\n constructor(private readonly context: CombatMotionContext) {\n this.fxResources = new PixiBattleFxResourceOwner(context.fxCapabilities);\n this.presentationEngine = new BattlePresentationEngine(context.constructors.Graphics, {\n recover: context.colors.pixi_effect_recover,\n electric: context.colors.pixi_effect_electric,\n damage: context.colors.pixi_effect_damage,\n cinematic: context.colors.pixi_effect_cinematic,\n });\n }\n setElectricGroup(active: boolean): void {\n this.electricGroupActive = active;\n this.electricGroupFlashPlayed = false;\n }\n reset(): void {\n this.lifetime.abort('combat-motion-reset');\n void this.context.assets\n .releaseScope(this.statusScope)\n .catch((error) => this.context.logger.warn('Status scope release failed', { error }));\n this.lifetime = new AbortController();\n this.resetCameraImpactShake();\n this.resetCamera();\n for (const held of this.heldChargeDodges.values()) {\n held.node.position.set(held.origin.x, held.origin.y);\n this.context.world.finishTokenPresentation(held.tokenId);\n }\n this.heldChargeDodges.clear();\n this.fxResources.reset();\n this.presentationEngine.reset();\n }\n destroy(): void {\n this.reset();\n this.lifetime.abort('combat-motion-destroy');\n this.fxResources.destroy();\n this.presentationEngine.destroy();\n }\n async playShatter(\n tokenId: string,\n target: { x: number; y: number },\n signal: AbortSignal,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n if (signal.aborted) return;\n const cellSize = this.context.world.getCellSize?.();\n const radius = Math.min(cellSize?.width ?? 108, cellSize?.height ?? 108);\n const token = this.context.world.getPresentationNode(tokenId);\n const shakeDuration =\n this.resolveTuningNumber('motion.battle.actionFx.majorWoundShakeDurationMs', 120) / 1000;\n if (token && shakeDuration > 0) {\n const origin = { x: token.x, y: token.y };\n const shakeDistance = this.resolveTuningNumber(\n 'visual.battle.actionFx.majorWoundShakeDistance',\n 5,\n );\n this.context.world.beginTokenPresentation?.(tokenId);\n await this.context.director.tween(\n token.position,\n {\n keyframes: [\n { x: origin.x - shakeDistance, duration: shakeDuration / 6 },\n { x: origin.x + shakeDistance, duration: shakeDuration / 6 },\n { x: origin.x - shakeDistance, duration: shakeDuration / 6 },\n { x: origin.x + shakeDistance, duration: shakeDuration / 6 },\n { x: origin.x - shakeDistance, duration: shakeDuration / 6 },\n { x: origin.x, y: origin.y, duration: shakeDuration / 6 },\n ],\n },\n signal,\n );\n if (!signal.aborted) this.context.world.finishTokenPresentation?.(tokenId);\n }\n if (signal.aborted) return;\n const fragmentCount = Math.max(\n 0,\n Math.round(this.resolveTuningNumber('visual.battle.actionFx.majorWoundFragmentCount', 28)),\n );\n const minSize = this.resolveTuningNumber(\n 'visual.battle.actionFx.majorWoundFragmentMinCellRatio',\n 0.08,\n );\n const maxSize = this.resolveTuningNumber(\n 'visual.battle.actionFx.majorWoundFragmentMaxCellRatio',\n 0.28,\n );\n const seed = this.hashActionId(`major-wound:${tokenId}:${target.x}:${target.y}`);\n const stableRandom = (index: number, salt: number): number =>\n (Math.sin((index + 1) * 91.37 + seed * 817.13 + salt * 37.11) + 1) / 2;\n const shards = Array.from({ length: fragmentCount }, (_, index) => {\n const angle = stableRandom(index, 1) * Math.PI * 2;\n const speed = radius * (0.72 + stableRandom(index, 2) * 0.86);\n const sizeRatio = minSize + stableRandom(index, 3) * Math.max(0, maxSize - minSize);\n return {\n shard: this.fxResources.acquireIrregularDebris(\n this.context.scene.worldOverlayFxLayer,\n target,\n {\n color: this.context.colors.pixi_effect_damage,\n templateIndex: index,\n size: radius * sizeRatio,\n },\n ),\n dx: Math.cos(angle) * speed,\n dy: Math.sin(angle) * speed,\n rotation: (stableRandom(index, 4) * 2 - 1) * Math.PI * 3,\n delay: stableRandom(index, 5) * 0.09,\n };\n });\n const flash = new this.context.constructors.Graphics()\n .circle(target.x, target.y, radius * 0.42)\n .fill({ color: this.context.colors.pixi_effect_damage, alpha: 0.72 });\n this.context.scene.worldOverlayFxLayer.addChild(flash);\n const duration =\n this.resolveTuningNumber('motion.battle.actionFx.majorWoundShatterDurationMs', 1280) / 1000;\n const hold = this.resolveTuningNumber('motion.battle.actionFx.majorWoundHoldMs', 120) / 1000;\n if (hold > 0) await this.context.director.tween({}, { duration: hold }, signal);\n await Promise.all([\n this.context.director.tween(flash, { alpha: 0, duration: duration * 0.42 }, signal),\n ...shards.map(({ shard, dx, dy, rotation, delay }) =>\n shard\n ? Promise.all([\n this.context.director.tween(\n shard,\n {\n keyframes: [\n {\n x: target.x + dx * 0.14,\n y: target.y + dy * 0.14,\n rotation: rotation * 0.14,\n alpha: 1,\n duration: duration * 0.14,\n },\n {\n x: target.x + dx * 0.58,\n y: target.y + dy * 0.58,\n rotation: rotation * 0.58,\n alpha: 0.86,\n duration: duration * 0.44,\n },\n {\n x: target.x + dx * 0.82,\n y: target.y + dy * 0.82,\n rotation: rotation * 0.82,\n alpha: 0.46,\n duration: duration * 0.24,\n },\n {\n x: target.x + dx,\n y: target.y + dy,\n rotation,\n alpha: 0,\n duration: duration * 0.18,\n },\n ],\n delay,\n ease: 'power2.out',\n },\n signal,\n ),\n this.context.director.tween(\n shard.scale,\n { x: shard.scale.x * 0.3, y: shard.scale.y * 0.3, duration, delay },\n signal,\n ),\n ])\n : Promise.resolve(),\n ),\n ]);\n shards.forEach(({ shard }) => this.fxResources.releaseIrregularDebris(shard));\n removeAndDestroy(flash);\n }\n async playIconScatter(\n imageUrl: string,\n target: { x: number; y: number },\n signal: AbortSignal,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n if (signal.aborted) return;\n const texture = await this.context.assets.loadTexture(\n `status-scatter:${imageUrl}`,\n imageUrl,\n this.statusScope,\n signal,\n );\n const seed = this.hashActionId(`${target.x}:${target.y}`);\n const iconCount = Math.max(\n 2,\n Math.round(this.resolveTuningNumber('visual.battle.actionFx.insanityIconCount', 4)),\n );\n const icons = Array.from({ length: iconCount }, (_, index) => {\n const icon = new this.context.constructors.Sprite(texture);\n icon.anchor.set(0.5);\n const angle = ((seed * 19 + index * 0.27) % 1) * Math.PI * 2;\n const distance = 18 + ((seed * 31 + index * 0.41) % 1) * 48;\n icon.position.set(\n target.x + Math.cos(angle) * distance,\n target.y + Math.sin(angle) * distance,\n );\n icon.rotation = ((seed * 11 + index * 0.61) % 1) * Math.PI * 2;\n icon.scale.set(0.28 + ((seed * 17 + index * 0.37) % 1) * 0.2);\n icon.alpha = 0;\n this.context.scene.worldOverlayFxLayer.addChild(icon);\n return { icon, delay: index * 0.08, targetScale: 0.9 + (index % 3) * 0.22 };\n });\n const iconHold =\n this.resolveTuningNumber('motion.battle.actionFx.insanityIconHoldMs', 16) / 1000;\n await Promise.all(\n icons.map(({ icon, delay, targetScale }) =>\n Promise.all([\n this.context.director.tween(\n icon,\n {\n keyframes: [\n { alpha: 0.82, duration: 0.14 },\n { alpha: 0.82, duration: iconHold },\n { alpha: 0, duration: 0.34 },\n ],\n delay,\n },\n signal,\n ),\n this.context.director.tween(\n icon.scale,\n {\n x: targetScale,\n y: targetScale,\n duration: 0.48 + iconHold,\n delay,\n ease: 'power2.out',\n },\n signal,\n ),\n ]),\n ),\n );\n icons.forEach(({ icon }) => removeAndDestroy(icon));\n }\n async playCover(\n imageUrl: string,\n tokenId: string,\n _target: { x: number; y: number },\n signal: AbortSignal,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n if (signal.aborted) return;\n const texture = await this.context.assets.loadTexture(\n `status-cover:${imageUrl}`,\n imageUrl,\n this.statusScope,\n signal,\n );\n await this.context.world.playCoverTransition(tokenId, texture, this.context.director, signal, {\n coverHold: this.resolveTuningNumber('motion.battle.actionFx.deathCoverHoldMs', 100) / 1000,\n entryShake:\n this.resolveTuningNumber('motion.battle.actionFx.deathEntryShakeDurationMs', 80) / 1000,\n grayDuration:\n this.resolveTuningNumber('motion.battle.actionFx.deathGrayDurationMs', 1000) / 1000,\n skullScale: this.resolveTuningNumber('visual.battle.actionFx.deathSkullScale', 1),\n entryScale: this.resolveTuningNumber('visual.battle.actionFx.deathSkullEntryScale', 2),\n });\n }\n private resetCamera(): void {\n this.context.scene.cameraContainer.scale.set(1);\n this.context.scene.cameraContainer.pivot.set(0, 0);\n this.context.scene.cameraContainer.position.set(0, 0);\n }\n\n private resetCameraImpactShake(): void {\n const activeShakes = [...this.cameraImpactShakes.values()];\n this.cameraImpactShakes.clear();\n activeShakes.forEach(({ abort }) => abort());\n this.context.scene.cameraImpactLayer?.position.set(0, 0);\n }\n\n async playCameraImpactShake(\n impactKey: string,\n profile: CameraImpactShakeProfile,\n signal: AbortSignal,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n const layer = this.context.scene.cameraImpactLayer;\n if (!layer || signal.aborted || (this.context.world.isReducedMotionEnabled?.() ?? false))\n return;\n const existing = this.cameraImpactShakes.get(impactKey);\n if (existing) return existing.promise;\n const distance =\n profile === 'explosion'\n ? this.resolveTuningNumber('visual.battle.actionFx.explosionCameraShakeDistance', 7)\n : this.resolveTuningNumber('visual.battle.actionFx.cameraHitShakeDistance', 3);\n const durationMs =\n profile === 'explosion'\n ? this.resolveTuningNumber('motion.battle.actionFx.explosionCameraShakeDurationMs', 200)\n : this.resolveTuningNumber('motion.battle.actionFx.cameraHitShakeDurationMs', 120);\n if (distance === 0 || durationMs <= 0) return;\n const frameDuration = durationMs / 5000;\n const controller = new AbortController();\n const abort = () => controller.abort();\n signal.addEventListener('abort', abort, { once: true });\n if (signal.aborted) abort();\n const active: ActiveCameraImpactShake = {\n promise: Promise.resolve(),\n abort,\n };\n active.promise = (async () => {\n try {\n await this.context.director.tween(\n layer,\n {\n keyframes: [\n { x: -distance, y: (distance * 4) / 7, duration: frameDuration },\n { x: (distance * 6) / 7, y: (-distance * 5) / 7, duration: frameDuration },\n { x: (-distance * 4) / 7, y: (distance * 3) / 7, duration: frameDuration },\n { x: (distance * 3) / 7, y: (-distance * 2) / 7, duration: frameDuration },\n { x: 0, y: 0, duration: frameDuration },\n ],\n },\n controller.signal,\n );\n } finally {\n signal.removeEventListener('abort', abort);\n if (this.cameraImpactShakes.get(impactKey) === active) {\n this.cameraImpactShakes.delete(impactKey);\n if (this.cameraImpactShakes.size === 0) layer.position.set(0, 0);\n }\n }\n })();\n this.cameraImpactShakes.set(impactKey, active);\n await active.promise;\n }\n\n async playVisualDash(\n tokenId: string,\n to: BattleFxPoint,\n signal: AbortSignal,\n returning: boolean,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n const node = this.context.world.getPresentationNode(tokenId);\n if (!node || signal.aborted || this.context.world.isReducedMotionEnabled?.()) return;\n const from = { x: node.position.x, y: node.position.y };\n if (Math.hypot(to.x - from.x, to.y - from.y) < 1) return;\n const trail = this.createChargeTrail(tokenId, from, to);\n try {\n await this.context.director.tween(\n node.position,\n {\n x: to.x,\n y: to.y,\n duration:\n this.resolveTuningNumber(\n returning\n ? 'motion.battle.actionFx.multiTargetReturnDurationMs'\n : 'motion.battle.actionFx.multiTargetDashDurationMs',\n returning ? 300 : 260,\n ) / 1000,\n ease: returning ? 'power2.inOut' : 'power3.in',\n onUpdate: () => {\n if (!signal.aborted) trail.update(node.position);\n },\n },\n signal,\n );\n } finally {\n trail.release();\n }\n }\n\n private createChargeTrail(\n tokenId: string,\n from: BattleFxPoint,\n to: BattleFxPoint,\n ): { update: (point: BattleFxPoint) => void; release: () => void } {\n const attacker = this.context.world.getPresentationNode(tokenId);\n const reduced = this.context.world.isReducedMotionEnabled?.();\n const cellSize = this.context.world.getCellSize?.();\n const cell = Math.min(cellSize?.width ?? 96, cellSize?.height ?? 96);\n const distance = Math.hypot(to.x - from.x, to.y - from.y) || 1;\n const dx = (to.x - from.x) / distance;\n const dy = (to.y - from.y) / distance;\n const count = Math.max(\n 0,\n Math.round(this.resolveTuningNumber('visual.battle.actionFx.chargeAfterimageCount', 2)),\n );\n const spacing =\n cell * this.resolveTuningNumber('visual.battle.actionFx.chargeAfterimageSpacingCells', 0.78);\n const label = this.context.world.getPresentationLabelNode?.(tokenId);\n const visible = label?.visible;\n if (label) label.visible = false;\n const images: Array<{ node: Sprite; blur: BlurFilter | null; index: number }> = [];\n try {\n if (attacker && !reduced)\n for (let index = 0; index <= count; index++) {\n const node = this.fxResources.acquireTokenSnapshot(\n this.context.scene.worldUnderlayFxLayer ?? this.context.scene.worldOverlayFxLayer,\n `charge:${tokenId}`,\n attacker,\n );\n if (!node) continue;\n node.position.set(from.x, from.y);\n node.alpha = index === 0 ? 0.54 : Math.max(0.04, 0.32 - (index - 1) * 0.08);\n const blur = this.fxResources.acquireBlurFilter(\n this.resolveTuningNumber('visual.battle.actionFx.chargeAfterimageBlurStrength', 8),\n );\n if (blur) node.filters = [blur];\n images.push({ node, blur, index });\n }\n } finally {\n if (label) label.visible = visible ?? true;\n }\n let released = false;\n return {\n update: (point) => {\n if (released) return;\n for (const { node, index } of images) {\n const lag = spacing * index;\n node.position.set(point.x - dx * lag, point.y - dy * lag);\n }\n },\n release: () => {\n if (released) return;\n released = true;\n for (const { node, blur } of images) {\n node.filters = [];\n this.fxResources.releaseBlurFilter(blur);\n this.fxResources.releaseTokenSnapshot(node);\n }\n },\n };\n }\n\n playDirectionalRecoil(\n tokenId: string,\n from: { x: number; y: number },\n target: { x: number; y: number },\n signal: AbortSignal,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n const dx = target.x - from.x;\n const dy = target.y - from.y;\n const length = Math.hypot(dx, dy) || 1;\n const distance = this.resolveTuningNumber('visual.battle.actionFx.recoilDistance', 16);\n return this.context.world.playTokenNudge(\n tokenId,\n { x: (dx / length) * distance, y: (dy / length) * distance },\n this.context.director,\n signal,\n { out: 0.06, hold: 0.035, back: 0.12, motionBlurStrength: 3 },\n );\n }\n\n playLocalResourceLossShake(tokenId: string, signal: AbortSignal): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n const distance = this.resolveTuningNumber('visual.battle.actionFx.localShakeDistance', 5);\n return this.context.world.playTokenNudge(\n tokenId,\n { x: distance, y: 0 },\n this.context.director,\n signal,\n { out: 0.045, hold: 0.02, back: 0.07 },\n );\n }\n\n async runSidecarActivity(id: string, run: () => Promise<void>): Promise<void> {\n const release = this.context.activity?.acquire(`battle-sidecar:${id}`);\n try {\n await run();\n } finally {\n release?.();\n }\n }\n\n async playSupportPulse(\n from: { x: number; y: number },\n target: { x: number; y: number },\n durationMs: number,\n firstAid: boolean,\n signal: AbortSignal,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n const duration = Math.max(0.12, durationMs / 1000);\n const impactTarget = target;\n const lineDistance = Math.hypot(impactTarget.x - from.x, impactTarget.y - from.y);\n const mistLine =\n firstAid && lineDistance > 1\n ? this.fxResources.acquireTrail(\n this.context.scene.worldUnderlayFxLayer ?? this.context.scene.worldOverlayFxLayer,\n from,\n impactTarget,\n {\n color: this.context.colors.pixi_effect_recover,\n mode: 'support',\n seed: from.x * 0.013 + from.y * 0.017 + impactTarget.x * 0.019,\n width: this.resolveTuningNumber('visual.battle.actionFx.firstAidMistWidth', 18),\n softness: 0.82,\n initialLengthRatio: 1,\n },\n )\n : null;\n const mistBlur = mistLine\n ? this.fxResources.acquireBlurFilter(\n this.resolveTuningNumber('visual.battle.actionFx.firstAidMistBlurStrength', 6),\n )\n : null;\n if (mistLine && mistBlur) {\n mistLine.mesh.filters = [mistBlur];\n if (this.context.constructors.Rectangle)\n mistLine.mesh.filterArea = new this.context.constructors.Rectangle(-1.25, -2.5, 2.5, 5);\n }\n if (mistLine) {\n mistLine.mesh.alpha = 0;\n await this.context.director.tween(\n mistLine.mesh,\n {\n alpha: 0.92,\n duration: Math.min(0.16, duration * 0.24),\n ease: 'power2.out',\n },\n signal,\n );\n if (!signal.aborted)\n await this.context.director.tween(\n {},\n { duration: Math.max(0, duration * 0.52 - Math.min(0.16, duration * 0.24)) },\n signal,\n );\n }\n if (signal.aborted) {\n if (mistLine) {\n mistLine.mesh.filters = [];\n mistLine.mesh.filterArea = undefined;\n }\n this.fxResources.releaseBlurFilter(mistBlur);\n this.fxResources.release(mistLine);\n return;\n }\n const burstRadius = this.resolveTuningNumber('visual.battle.actionFx.supportRadius', 54);\n const burst = this.fxResources.acquireBurst(\n this.context.scene.worldOverlayFxLayer,\n impactTarget,\n {\n color: this.context.colors.pixi_effect_recover,\n radius: burstRadius,\n seed: impactTarget.x * 0.013 + impactTarget.y * 0.017,\n ring: 0.58,\n },\n );\n const pulse = new this.context.constructors.Graphics()\n .circle(impactTarget.x, impactTarget.y, 24)\n .stroke({ color: this.context.colors.pixi_effect_recover, width: 5, alpha: 0.9 });\n const pulseBlur = firstAid\n ? this.fxResources.acquireBlurFilter(\n this.resolveTuningNumber('visual.battle.actionFx.firstAidPulseBlurStrength', 4),\n )\n : null;\n if (pulseBlur) {\n pulse.filters = [pulseBlur];\n if (this.context.constructors.Rectangle)\n pulse.filterArea = new this.context.constructors.Rectangle(\n impactTarget.x - burstRadius * 1.5,\n impactTarget.y - burstRadius * 1.5,\n burstRadius * 3,\n burstRadius * 3,\n );\n }\n this.context.scene.worldOverlayFxLayer.addChild(pulse);\n const crosses = Array.from(\n {\n length: firstAid\n ? Math.max(\n 1,\n Math.min(\n 4,\n Math.round(\n this.resolveTuningNumber('visual.battle.actionFx.firstAidCrossCount', 4),\n ),\n ),\n )\n : 2,\n },\n (_, index) => {\n const offsets = [\n { x: -24, y: 28, size: 11 },\n { x: 19, y: 38, size: 15 },\n { x: -7, y: 48, size: 19 },\n { x: 31, y: 54, size: 9 },\n ] as const;\n const config = offsets[index]!;\n const cross = new this.context.constructors.Graphics()\n .moveTo(-config.size, 0)\n .lineTo(config.size, 0)\n .moveTo(0, -config.size)\n .lineTo(0, config.size)\n .stroke({\n color: this.context.colors.pixi_effect_recover,\n width: Math.max(4, config.size * 0.36),\n alpha: 0.96,\n });\n cross.position.set(impactTarget.x + config.x, impactTarget.y + config.y);\n cross.alpha = 0;\n cross.scale.set(0.72);\n this.context.scene.worldOverlayFxLayer.addChild(cross);\n return { cross, startY: cross.y, delay: index * 0.065 };\n },\n );\n if (burst) burst.mesh.scale.set(burstRadius * 0.62);\n await Promise.all([\n this.context.director.tween(pulse, { alpha: 0, duration }, signal),\n burst\n ? this.context.director.tween(\n burst.mesh.scale,\n {\n x: burstRadius,\n y: burstRadius,\n duration,\n },\n signal,\n )\n : Promise.resolve(),\n burst\n ? this.context.director.tween(burst.mesh, { alpha: 0, duration }, signal)\n : Promise.resolve(),\n mistLine\n ? this.context.director.tween(\n mistLine.mesh,\n { alpha: 0, duration: duration * 0.45, delay: duration * 0.55, ease: 'power2.in' },\n signal,\n )\n : Promise.resolve(),\n ...crosses.map(({ cross, startY, delay }) =>\n Promise.all([\n this.context.director.tween(\n cross,\n {\n keyframes: [\n { alpha: 0.96, duration: 0.12 },\n { alpha: 0, duration: firstAid ? 0.38 : 0.25 },\n ],\n delay,\n },\n signal,\n ),\n this.context.director.tween(\n cross,\n { y: startY - (firstAid ? 72 : 48), duration: firstAid ? 0.5 : 0.34, delay },\n signal,\n ),\n this.context.director.tween(\n cross.scale,\n { x: 1.08, y: 1.08, duration: firstAid ? 0.5 : 0.34, delay },\n signal,\n ),\n ]),\n ),\n ]);\n pulse.filters = [];\n pulse.filterArea = undefined;\n this.fxResources.releaseBlurFilter(pulseBlur);\n removeAndDestroy(pulse);\n if (mistLine) {\n mistLine.mesh.filters = [];\n mistLine.mesh.filterArea = undefined;\n }\n this.fxResources.releaseBlurFilter(mistBlur);\n this.fxResources.release(mistLine);\n this.fxResources.release(burst);\n crosses.forEach(({ cross }) => removeAndDestroy(cross));\n }\n\n async playExplosion(\n from: { x: number; y: number },\n target: { x: number; y: number },\n signal: AbortSignal,\n coverageRadius?: number,\n impactTokenIds: readonly string[] = [],\n cameraImpactKey = `explosion:${target.x}:${target.y}`,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n const duration = PIXI_BATTLE_ACTION_TIMING.explosionProjectileMs / 1000;\n const radius = Math.max(\n this.resolveTuningNumber('visual.battle.actionFx.explosionRadius', 92),\n coverageRadius ?? 0,\n );\n const debrisCount = Math.max(\n 0,\n Math.round(this.resolveTuningNumber('visual.battle.actionFx.debrisCount', 10)),\n );\n const seed = from.x * 0.011 + from.y * 0.017 + target.x * 0.019 + target.y * 0.023;\n const bombTexture = this.context.projectileImageUrl\n ? await this.context.assets.loadTexture(\n 'battle-action-rolling-bomb',\n this.context.projectileImageUrl,\n 'effect:battle-action-bomb',\n signal,\n )\n : null;\n const projectileBody = bombTexture\n ? new this.context.constructors.Sprite(bombTexture)\n : new this.context.constructors.Graphics()\n .circle(0, 0, 10)\n .fill({ color: this.context.colors.pixi_effect_cinematic, alpha: 0.96 });\n if ('anchor' in projectileBody) projectileBody.anchor.set(0.5);\n const projectileGlow = new this.context.constructors.Graphics()\n .circle(0, 0, 19)\n .fill({ color: 0xff7a18, alpha: 0.28 });\n projectileGlow.blendMode = 'screen';\n const projectileCore = new this.context.constructors.Container();\n projectileCore.addChild(projectileGlow, projectileBody);\n projectileCore.position.set(from.x, from.y);\n projectileBody.tint = 0xb95b2c;\n if ('width' in projectileBody) {\n projectileBody.width = 44;\n projectileBody.height = 44;\n }\n this.context.scene.worldOverlayFxLayer.addChild(projectileCore);\n const projectileProgress = { value: 0 };\n await this.context.director.tween(\n projectileProgress,\n {\n value: 1,\n duration,\n ease: 'none',\n onUpdate: () => {\n const progress = projectileProgress.value;\n const point = resolveExplosionArcPoint(from, target, progress);\n projectileCore.position.set(point.x, point.y);\n projectileCore.rotation = point.rotation;\n },\n },\n signal,\n );\n if (!signal.aborted) {\n removeAndDestroy(projectileCore);\n this.context.getAudio()?.playCue('explosion');\n const centerFlash = this.fxResources.acquireBurst(\n this.context.scene.worldOverlayFxLayer,\n target,\n {\n color: '#fff1a3',\n radius: radius * 0.68,\n seed,\n ring: 0.34,\n },\n );\n const fireRing = this.fxResources.acquireBurst(\n this.context.scene.worldOverlayFxLayer,\n target,\n {\n color: '#ff8a16',\n radius,\n seed: seed + 0.37,\n ring: 0.7,\n },\n );\n const fireRingBlur = fireRing\n ? this.fxResources.acquireBlurFilter(\n this.resolveTuningNumber('visual.battle.actionFx.explosionFireRingBlurStrength', 10),\n )\n : null;\n const fireRingStartScale = this.resolveTuningNumber(\n 'visual.battle.actionFx.explosionFireRingStartScale',\n 0.35,\n );\n const fireRingEndScale = this.resolveTuningNumber(\n 'visual.battle.actionFx.explosionFireRingEndScale',\n 1.45,\n );\n if (fireRing) {\n fireRing.mesh.scale.set(radius * fireRingStartScale);\n if (fireRingBlur) fireRing.mesh.filters = [fireRingBlur];\n }\n const flameLayer = new this.context.constructors.Container();\n flameLayer.position.set(target.x, target.y);\n flameLayer.eventMode = 'none';\n if (this.context.constructors.Rectangle)\n flameLayer.filterArea = new this.context.constructors.Rectangle(\n -radius * 1.6,\n -radius * 1.6,\n radius * 3.2,\n radius * 3.2,\n );\n const flameBlur = this.fxResources.acquireBlurFilter(\n this.resolveTuningNumber('visual.battle.actionFx.explosionFlameBlurStrength', 1),\n );\n if (flameBlur) flameLayer.filters = [flameBlur];\n this.context.scene.worldOverlayFxLayer.addChild(flameLayer);\n const flameCount = Math.max(\n 0,\n Math.round(this.resolveTuningNumber('visual.battle.actionFx.explosionFlameCount', 2)),\n );\n const flames = Array.from({ length: flameCount }, (_, index) => {\n const angle = -Math.PI * (0.15 + index * 0.12) + seed * 0.4;\n const node = new this.context.constructors.Graphics()\n .circle(0, 0, radius * (0.1 + (index % 3) * 0.025))\n .fill({ color: index % 2 === 0 ? 0xff7a0a : 0xffc21a, alpha: 0.9 });\n node.position.set(0, 0);\n node.scale.set(0.55, 1.25 + (index % 2) * 0.35);\n node.rotation = angle + Math.PI / 2;\n node.blendMode = 'screen';\n flameLayer.addChild(node);\n return { node, angle, distance: radius * (0.48 + (index % 3) * 0.13) };\n });\n const smokeCount = Math.max(\n 0,\n Math.round(this.resolveTuningNumber('visual.battle.actionFx.explosionSmokeCount', 2)),\n );\n const smokeLayer = new this.context.constructors.Container();\n smokeLayer.position.set(target.x, target.y);\n smokeLayer.eventMode = 'none';\n if (this.context.constructors.Rectangle)\n smokeLayer.filterArea = new this.context.constructors.Rectangle(\n -radius * 1.6,\n -radius * 1.8,\n radius * 3.2,\n radius * 3.2,\n );\n const smokeBlur = this.fxResources.acquireBlurFilter(\n this.resolveTuningNumber('visual.battle.actionFx.explosionSmokeBlurStrength', 1),\n );\n if (smokeBlur) smokeLayer.filters = [smokeBlur];\n this.context.scene.worldOverlayFxLayer.addChild(smokeLayer);\n const smoke = Array.from({ length: smokeCount }, (_, index) => {\n const angle = -Math.PI * (0.18 + index * 0.15) + seed * 0.2;\n const smokeRadius = radius * (0.15 + (index % 2) * 0.04);\n const node = new this.context.constructors.Graphics()\n .circle(0, 0, smokeRadius)\n .circle(smokeRadius * 0.48, -smokeRadius * 0.18, smokeRadius * 0.7)\n .circle(-smokeRadius * 0.4, -smokeRadius * 0.3, smokeRadius * 0.62)\n .fill({ color: index % 2 === 0 ? 0x241c1a : 0x3a2c29, alpha: 0.68 });\n node.position.set(0, 0);\n node.scale.set(0.55);\n smokeLayer.addChild(node);\n return { node, angle, distance: radius * (0.38 + index * 0.08) };\n });\n const debris = Array.from({ length: debrisCount }, (_, index) => {\n const angle = (index / Math.max(1, debrisCount)) * Math.PI * 2 + seed * 0.13;\n return {\n angle,\n node: this.fxResources.acquireDebris(this.context.scene.worldOverlayFxLayer, target, {\n color:\n index % 3 === 0\n ? this.context.colors.pixi_effect_cinematic\n : this.context.colors.pixi_effect_damage,\n angle,\n length: 7 + (index % 4) * 2,\n thickness: 2 + (index % 2),\n }),\n distance: radius * (0.52 + ((index * 37) % 41) / 100),\n };\n });\n try {\n await Promise.all([\n centerFlash\n ? this.context.director.tween(centerFlash.mesh, { alpha: 0, duration: 0.34 }, signal)\n : Promise.resolve(),\n fireRing\n ? Promise.all([\n this.context.director.tween(\n fireRing.mesh.scale,\n {\n x: radius * fireRingEndScale,\n y: radius * fireRingEndScale,\n duration:\n this.resolveTuningNumber(\n 'motion.battle.actionFx.explosionFireRingDurationMs',\n PIXI_BATTLE_ACTION_TIMING.explosionFireRingMs,\n ) / 1000,\n ease: 'power2.out',\n },\n signal,\n ),\n this.context.director.tween(\n fireRing.mesh,\n {\n alpha: 0,\n duration:\n this.resolveTuningNumber(\n 'motion.battle.actionFx.explosionFireRingDurationMs',\n PIXI_BATTLE_ACTION_TIMING.explosionFireRingMs,\n ) / 1000,\n ease: 'power2.out',\n },\n signal,\n ),\n ])\n : Promise.resolve(),\n ...flames.map(({ node, angle, distance }) =>\n this.context.director.tween(\n node,\n {\n x: Math.cos(angle) * distance,\n y: Math.sin(angle) * distance,\n alpha: 0,\n duration: 0.48,\n },\n signal,\n ),\n ),\n ...smoke.map(({ node, angle, distance }, index) =>\n Promise.all([\n this.context.director.tween(\n node,\n {\n x: Math.cos(angle) * distance,\n y: Math.sin(angle) * distance - radius * 0.32,\n alpha: 0,\n duration: 0.68 + index * 0.035,\n },\n signal,\n ),\n this.context.director.tween(\n node.scale,\n { x: 1.68, y: 1.68, duration: 0.68 + index * 0.035 },\n signal,\n ),\n ]),\n ),\n ...debris.map(({ node, angle, distance }) =>\n node\n ? this.context.director.tween(\n node,\n {\n x: target.x + Math.cos(angle) * distance,\n y: target.y + Math.sin(angle) * distance,\n alpha: 0,\n duration: 0.24,\n },\n signal,\n )\n : Promise.resolve(),\n ),\n this.playCameraImpactShake(cameraImpactKey, 'explosion', signal),\n ...impactTokenIds.map((tokenId) => this.playLocalResourceLossShake(tokenId, signal)),\n ]);\n } finally {\n this.fxResources.release(centerFlash);\n if (fireRing) fireRing.mesh.filters = [];\n this.fxResources.releaseBlurFilter(fireRingBlur);\n this.fxResources.release(fireRing);\n flameLayer.filters = [];\n this.fxResources.releaseBlurFilter(flameBlur);\n removeAndDestroy(flameLayer);\n smokeLayer.filters = [];\n this.fxResources.releaseBlurFilter(smokeBlur);\n removeAndDestroy(smokeLayer);\n debris.forEach(({ node }) => this.fxResources.releaseDebris(node));\n }\n }\n if (projectileCore.destroyed !== true) removeAndDestroy(projectileCore);\n }\n\n async playMeleeMotion(\n action: VisualAttackInstruction,\n attackerPoint: { x: number; y: number },\n targetPoint: { x: number; y: number },\n signal: AbortSignal,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n const dx = targetPoint.x - attackerPoint.x;\n const dy = targetPoint.y - attackerPoint.y;\n const distance = Math.hypot(dx, dy) || 1;\n const cells = this.context.world.getCellSize?.();\n const travel = Math.min(distance, Math.min(cells?.width ?? 96, cells?.height ?? 96) / 2);\n const attackerNode = this.context.world.getPresentationNode(action.attackerId);\n const attackerOffset = { x: (dx / distance) * travel, y: (dy / distance) * travel };\n const meleeBlurStrength = this.resolveTuningNumber(\n 'visual.battle.actionFx.meleeMotionBlurStrength',\n 3,\n );\n const targetOffset = action.evaded\n ? resolveAwayDodgeOffset(\n attackerPoint,\n targetPoint,\n this.hashActionId(action.id),\n Math.min(cells?.width ?? 96, cells?.height ?? 96) / 2,\n )\n : {\n x:\n (dx / distance) * this.resolveTuningNumber('visual.battle.actionFx.recoilDistance', 16),\n y:\n (dy / distance) * this.resolveTuningNumber('visual.battle.actionFx.recoilDistance', 16),\n };\n const positionMotion = this.context.world.playTokenDodgeExchange\n ? this.context.world.playTokenDodgeExchange(\n action.attackerId,\n action.targetId,\n attackerOffset,\n targetOffset,\n this.context.director,\n signal,\n { attackerBlurStrength: meleeBlurStrength },\n )\n : (async () => {\n await this.context.world.playTokenNudge(\n action.attackerId,\n attackerOffset,\n this.context.director,\n signal,\n { out: 0.16, back: 0.14, motionBlurStrength: meleeBlurStrength },\n );\n if (!signal.aborted)\n await this.context.world.playTokenNudge(\n action.targetId,\n targetOffset,\n this.context.director,\n signal,\n { out: 0.14, back: 0.16 },\n );\n })();\n await Promise.all([\n positionMotion,\n attackerNode\n ? this.context.director.sequence(\n [\n () =>\n this.context.director.tween(\n attackerNode.scale,\n { x: 1.08, y: 1.08, duration: 0.2 },\n signal,\n ),\n () =>\n this.context.director.tween(\n attackerNode.scale,\n { x: 1, y: 1, duration: 0.25 },\n signal,\n ),\n ],\n signal,\n )\n : Promise.resolve(),\n ]);\n }\n\n async playRangedApproach(\n action: VisualAttackInstruction,\n from: BattleFxPoint,\n target: BattleFxPoint,\n signal: AbortSignal,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n if (action.resultFeedback !== 'miss') {\n await this.playProjectile(action, from, target, signal);\n return;\n }\n const cell = this.context.world.getCellSize?.();\n const cellSize = Math.min(cell?.width ?? 96, cell?.height ?? 96);\n const radius = resolveBattleTokenVisualLayout(cellSize).ringDiameter / 2;\n const side = battleFxRandom(`${action.id}:pass-by`) < 0.5 ? -1 : 1;\n const isDodge = action.actionType === 'throw' && action.evaded === true;\n const width = this.resolveTuningNumber(\n action.actionType === 'throw'\n ? 'visual.battle.actionFx.throwProjectileWidthPx'\n : 'visual.battle.actionFx.trailWidth',\n 6,\n );\n const path = resolveBattlePassByPath(from, target, {\n radius,\n clearance: width / 2 + cellSize * 0.035,\n behind:\n cellSize *\n this.resolveTuningNumber('visual.battle.actionFx.projectilePassByDistanceCellRatio', 1),\n tailLength:\n cellSize *\n (action.actionType === 'throw'\n ? this.resolveTuningNumber('visual.battle.actionFx.throwProjectileLengthCellRatio', 0.2)\n : 0.45),\n side,\n dodge: isDodge,\n });\n let crossed = false;\n let dodged = false;\n let dodgeMotion = Promise.resolve();\n await this.playProjectile(action, from, path.end, signal, false, {\n path,\n onProgress: (progress) => {\n if (signal.aborted) return;\n if (isDodge && !dodged && progress >= path.dodgeProgress) {\n dodged = true;\n if (!this.context.world.isReducedMotionEnabled?.()) {\n const dx = target.x - from.x;\n const dy = target.y - from.y;\n const length = Math.hypot(dx, dy) || 1;\n const travelSeconds =\n this.resolveTuningNumber('motion.battle.actionFx.throwTravelDurationMs', 260) / 1000;\n dodgeMotion = this.context.world.playTokenNudge(\n action.targetId,\n {\n x: (-dy / length) * cellSize * 0.75 * side,\n y: (dx / length) * cellSize * 0.75 * side,\n },\n this.context.director,\n signal,\n {\n out: Math.max(\n 0.025,\n Math.min(\n 0.11,\n (path.crossingProgress - path.dodgeProgress) * travelSeconds * 0.8,\n ),\n ),\n hold: 0.12,\n back: 0.17,\n },\n );\n }\n }\n if (!crossed && progress >= path.crossingProgress) {\n crossed = true;\n this.startMissFeedback(action, target, signal);\n }\n },\n });\n await dodgeMotion;\n }\n\n async playSwingArc(\n action: VisualAttackInstruction,\n center: { x: number; y: number },\n signal: AbortSignal,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n const cell = this.context.world.getCellSize?.();\n const cellSize = Math.min(cell?.width ?? 96, cell?.height ?? 96);\n const radius =\n cellSize * this.resolveTuningNumber('visual.battle.actionFx.swingRadiusCellRatio', 0.72);\n const span =\n (this.resolveTuningNumber('visual.battle.actionFx.swingArcDegrees', 125) * Math.PI) / 180;\n const sweep =\n (this.resolveTuningNumber('visual.battle.actionFx.swingSweepDegrees', 320) * Math.PI) / 180;\n const thickness = Math.max(\n 2,\n cellSize * this.resolveTuningNumber('visual.battle.actionFx.swingThicknessCellRatio', 0.12),\n );\n const arc = this.fxResources.acquireActionGraphic(this.context.scene.worldOverlayFxLayer);\n if (!arc) return;\n const color = this.context.colors.fx_attackLineColors_swing;\n arc\n .arc(0, 0, radius, -span / 2, span / 2)\n .stroke({ color, width: thickness, alpha: 0.9, cap: 'round' });\n arc.position.set(center.x, center.y);\n arc.rotation = -Math.PI * 0.75;\n arc.alpha = this.resolveTuningNumber('visual.battle.actionFx.swingAlpha', 0.9);\n const blur = this.fxResources.acquireBlurFilter(\n Math.max(\n 1,\n cellSize * 0.04 * this.resolveTuningNumber('visual.battle.actionFx.swingTailBlur', 0.35),\n ),\n );\n if (blur) arc.filters = [blur];\n const duration = this.resolveTuningNumber('motion.battle.actionFx.swingDurationMs', 520) / 1000;\n const impactProgress = Math.max(\n 0,\n Math.min(1, this.resolveTuningNumber('motion.battle.actionFx.swingImpactProgress', 0.5)),\n );\n this.presentationEngine.startSidecar(\n {\n id: `${action.id}:swing-arc`,\n phase: 'approach',\n mode: 'camera-barrier',\n writes: [{ type: 'screen', id: `swing-arc:${action.id}` }],\n run: async (sidecarSignal) => {\n try {\n await this.context.director.tween(\n arc,\n {\n rotation: arc.rotation + sweep,\n alpha: 0,\n duration,\n ease: 'power2.out',\n },\n sidecarSignal,\n );\n } finally {\n arc.filters = [];\n this.fxResources.releaseBlurFilter(blur);\n this.fxResources.releaseActionGraphic(arc);\n }\n },\n },\n signal,\n );\n await this.context.director.tween({}, { duration: duration * impactProgress }, signal);\n }\n\n async playSwingTargetReaction(\n action: VisualAttackInstruction,\n from: { x: number; y: number },\n target: { x: number; y: number },\n signal: AbortSignal,\n impactKey: string,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n if (action.evaded) {\n const cell = this.context.world.getCellSize?.();\n const offset = resolveAwayDodgeOffset(\n from,\n target,\n this.hashActionId(action.id),\n Math.min(cell?.width ?? 96, cell?.height ?? 96) / 2,\n );\n await this.context.world.playTokenNudge(\n action.targetId,\n offset,\n this.context.director,\n signal,\n {\n out: 0.11,\n hold: 0.1,\n back: 0.16,\n },\n );\n return;\n }\n await Promise.all([\n this.playImpact(target, action, signal, impactKey),\n this.playDirectionalRecoil(action.targetId, from, target, signal),\n ]);\n }\n\n async playBladeSlash(\n action: VisualAttackInstruction,\n target: { x: number; y: number },\n signal: AbortSignal,\n impactKey: string,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n const cell = this.context.world.getCellSize?.();\n const cellSize = Math.min(cell?.width ?? 96, cell?.height ?? 96);\n const length =\n cellSize * this.resolveTuningNumber('visual.battle.actionFx.bladeSlashLengthCellRatio', 1.15);\n const width = this.resolveTuningNumber('visual.battle.actionFx.bladeSlashWidthPx', 7);\n const slash = this.fxResources.acquireActionGraphic(this.context.scene.worldOverlayFxLayer);\n if (!slash) {\n await Promise.all([\n this.playLocalResourceLossShake(action.targetId, signal),\n this.playCameraImpactShake(impactKey, 'hit', signal),\n ]);\n return;\n }\n const angle = resolveBladeSlashAngle(\n action.id,\n action.hitIndex ?? 0,\n this.resolveTuningNumber('visual.battle.actionFx.bladeSlashAngleOffsetDeg', 32),\n );\n const halfLength = length / 2;\n const halfWidth = width;\n slash\n .poly(\n [\n -halfLength,\n 0,\n -length * 0.22,\n -halfWidth * 0.72,\n 0,\n -halfWidth,\n length * 0.22,\n -halfWidth * 0.72,\n halfLength,\n 0,\n length * 0.22,\n halfWidth * 0.72,\n 0,\n halfWidth,\n -length * 0.22,\n halfWidth * 0.72,\n ],\n true,\n )\n .fill({ color: this.context.colors.fx_attackLineColors_blade, alpha: 0.92 })\n .moveTo(-length * 0.36, 0)\n .lineTo(length * 0.36, 0)\n .stroke({ color: this.context.colors.pixi_effect_attackLine, width: 1.5, alpha: 0.9 });\n slash.position.set(target.x, target.y);\n slash.rotation = angle;\n slash.alpha = this.resolveTuningNumber('visual.battle.actionFx.bladeSlashAlpha', 1);\n const blur = this.fxResources.acquireBlurFilter(\n this.resolveTuningNumber('visual.battle.actionFx.bladeSlashBlurStrength', 5),\n );\n if (blur) slash.filters = [blur];\n try {\n await Promise.all([\n this.context.director.tween(\n slash,\n {\n alpha: 0,\n duration:\n this.resolveTuningNumber('motion.battle.actionFx.bladeSlashDurationMs', 260) / 1000,\n ease: 'power2.out',\n },\n signal,\n ),\n this.playLocalResourceLossShake(action.targetId, signal),\n this.playCameraImpactShake(impactKey, 'hit', signal),\n ]);\n } finally {\n slash.filters = [];\n this.fxResources.releaseBlurFilter(blur);\n this.fxResources.releaseActionGraphic(slash);\n }\n }\n\n async playProjectile(\n action: Pick<VisualAttackInstruction, 'id' | 'actionType' | 'evaded'>,\n from: { x: number; y: number },\n to: { x: number; y: number },\n signal: AbortSignal,\n shortRange = false,\n passBy?: { path: BattlePassByPath; onProgress: (progress: number) => void },\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n if (signal.aborted) return;\n const color =\n action.actionType === 'throw'\n ? this.context.colors.fx_attackLineColors_throw\n : this.context.colors.pixi_effect_attackLine;\n const mode: PixiBattleTrailMode = shortRange\n ? 'melee'\n : action.actionType === 'charge'\n ? 'charge'\n : 'shoot';\n const duration =\n action.actionType === 'throw'\n ? this.resolveTuningNumber('motion.battle.actionFx.throwTravelDurationMs', 260) / 1000\n : shortRange\n ? PIXI_BATTLE_ACTION_TIMING.meleeLineMs / 1000\n : this.resolveTuningNumber(\n 'motion.battle.actionFx.shootDurationMs',\n PIXI_BATTLE_ACTION_TIMING.shootMs,\n ) / 1000;\n const width =\n action.actionType === 'throw'\n ? this.resolveTuningNumber('visual.battle.actionFx.throwProjectileWidthPx', 3)\n : this.resolveTuningNumber('visual.battle.actionFx.trailWidth', 6) *\n (shortRange ? 1.55 : 1);\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const distance = Math.max(1, Math.hypot(dx, dy));\n const direction = { x: dx / distance, y: dy / distance };\n const tailRatio = Math.max(\n 0.04,\n Math.min(\n 0.8,\n this.resolveTuningNumber(\n action.actionType === 'throw'\n ? 'visual.battle.actionFx.throwProjectileLengthCellRatio'\n : 'visual.battle.actionFx.projectileTailRatio',\n 0.22,\n ),\n ),\n );\n const cell = this.context.world.getCellSize?.();\n const tailDistance = Math.min(\n distance,\n Math.max(\n 12,\n action.actionType === 'throw'\n ? Math.min(cell?.width ?? 96, cell?.height ?? 96) * tailRatio\n : distance * tailRatio,\n ),\n );\n const underlay =\n this.context.scene.worldUnderlayFxLayer ?? this.context.scene.worldOverlayFxLayer;\n const trail = this.fxResources.acquireTrail(underlay, from, to, {\n color,\n mode,\n seed: this.hashActionId(action.id),\n width,\n softness: this.resolveTuningNumber(\n action.actionType === 'throw'\n ? 'visual.battle.actionFx.throwProjectileSoftness'\n : 'visual.battle.actionFx.trailSoftness',\n 0.56,\n ),\n initialLengthRatio: 0,\n tailBlurStrength:\n mode === 'shoot' && action.actionType !== 'throw'\n ? this.resolveTuningNumber('visual.battle.actionFx.projectileTailBlurStrength', 8)\n : 0,\n });\n const animateMovingTrail = async (node: Container): Promise<void> => {\n if (passBy) {\n const progress = { value: 0 };\n const draw = () => {\n if (signal.aborted) return;\n const traveled = distance * progress.value;\n const tail = Math.min(passBy.path.tailLength, traveled);\n node.position.set(\n from.x + direction.x * (traveled - tail / 2),\n from.y + direction.y * (traveled - tail / 2),\n );\n node.scale.x = tail / 2;\n node.alpha =\n progress.value <= passBy.path.fadeProgress\n ? 1\n : Math.max(0, (1 - progress.value) / (1 - passBy.path.fadeProgress));\n passBy.onProgress(progress.value);\n };\n draw();\n await this.context.director.tween(\n progress,\n { value: 1, duration, ease: 'none', onUpdate: draw },\n signal,\n );\n if (!signal.aborted) {\n progress.value = 1;\n draw();\n }\n return;\n }\n const exitDuration =\n action.actionType === 'throw' && action.evaded\n ? this.resolveTuningNumber('motion.battle.actionFx.throwDodgeFadeDurationMs', 140) / 1000\n : duration * 0.2;\n node.position.set(from.x, from.y);\n node.scale.x = 0;\n node.alpha = 1;\n await Promise.all([\n this.context.director.tween(\n node.position,\n {\n x: from.x + direction.x * tailDistance * 0.5,\n y: from.y + direction.y * tailDistance * 0.5,\n duration: duration * 0.2,\n ease: 'power2.in',\n },\n signal,\n ),\n this.context.director.tween(\n node.scale,\n { x: tailDistance / 2, duration: duration * 0.2, ease: 'power2.in' },\n signal,\n ),\n ]);\n if (signal.aborted) return;\n await this.context.director.tween(\n node.position,\n {\n x: to.x - direction.x * tailDistance * 0.5,\n y: to.y - direction.y * tailDistance * 0.5,\n duration: duration * 0.6,\n ease: 'none',\n },\n signal,\n );\n if (signal.aborted) return;\n await Promise.all([\n this.context.director.tween(\n node.position,\n { x: to.x, y: to.y, duration: exitDuration, ease: 'power1.out' },\n signal,\n ),\n this.context.director.tween(\n node.scale,\n { x: 0, duration: exitDuration, ease: 'power1.out' },\n signal,\n ),\n this.context.director.tween(\n node,\n { alpha: 0, duration: exitDuration, ease: 'power1.out' },\n signal,\n ),\n ]);\n };\n if (trail) {\n const muzzleOffset =\n mode === 'shoot' && action.actionType !== 'throw'\n ? Math.min(\n this.context.world.getCellSize?.()?.width ?? 96,\n this.context.world.getCellSize?.()?.height ?? 96,\n ) * this.resolveTuningNumber('visual.battle.actionFx.muzzleEdgeRatio', 0.38)\n : 0;\n const muzzlePoint = {\n x: from.x + (dx / Math.max(1, distance)) * muzzleOffset,\n y: from.y + (dy / Math.max(1, distance)) * muzzleOffset,\n };\n const muzzle =\n mode === 'shoot'\n ? this.fxResources.acquireBurst(this.context.scene.worldOverlayFxLayer, muzzlePoint, {\n color,\n radius: this.resolveTuningNumber(\n 'visual.battle.actionFx.muzzleFlashRadius',\n Math.max(18, width * 2.4),\n ),\n seed: this.hashActionId(action.id) + 0.17,\n ring: 0.46,\n })\n : null;\n const muzzleBlur =\n muzzle && this.context.constructors.BlurFilter\n ? new this.context.constructors.BlurFilter({\n strength: this.resolveTuningNumber('visual.battle.actionFx.muzzleBlurStrength', 5),\n quality: 2,\n })\n : null;\n if (muzzle && muzzleBlur) muzzle.mesh.filters = [muzzleBlur];\n await Promise.all([\n animateMovingTrail(trail.mesh),\n muzzle\n ? this.context.director.tween(\n muzzle.mesh,\n { alpha: 0, duration: PIXI_BATTLE_ACTION_TIMING.muzzleFlashMs / 1000 },\n signal,\n )\n : Promise.resolve(),\n ]);\n this.fxResources.release(trail);\n if (muzzle) muzzle.mesh.filters = [];\n muzzleBlur?.destroy();\n this.fxResources.release(muzzle);\n return;\n }\n const fallback = new this.context.constructors.Graphics()\n .moveTo(-1, 0)\n .lineTo(1, 0)\n .stroke({ color, width, alpha: 0.92 });\n fallback.rotation = Math.atan2(dy, dx);\n underlay.addChild(fallback);\n await animateMovingTrail(fallback);\n removeAndDestroy(fallback);\n }\n\n async playElectric(\n action: Pick<VisualAttackInstruction, 'id'>,\n from: { x: number; y: number },\n to: { x: number; y: number },\n signal: AbortSignal,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n const lightning = this.fxResources.acquireLightning(\n this.context.scene.worldOverlayFxLayer,\n from,\n to,\n {\n color: this.context.colors.pixi_effect_electric,\n seed: this.hashActionId(action.id),\n width: this.resolveTuningNumber('visual.battle.actionFx.electricCoreWidth', 1),\n blurStrength: this.resolveTuningNumber(\n 'visual.battle.actionFx.electricGlowBlurStrength',\n 2,\n ),\n outerGlowRadius: this.resolveTuningNumber(\n 'visual.battle.actionFx.electricOuterGlowRadius',\n 8,\n ),\n outerGlowAlpha: this.resolveTuningNumber(\n 'visual.battle.actionFx.electricOuterGlowAlpha',\n 0.65,\n ),\n },\n );\n if (!lightning) return;\n const lightningGeneration = lightning.generation;\n const shouldPlayFlash = !this.electricGroupActive || !this.electricGroupFlashPlayed;\n if (this.electricGroupActive && shouldPlayFlash) this.electricGroupFlashPlayed = true;\n const flash = shouldPlayFlash\n ? this.fxResources.acquireScreenFlash(\n this.context.scene.globalFxLayer ?? this.context.scene.worldOverlayFxLayer,\n 0xffffff,\n )\n : null;\n const electricClock = { elapsed: 0 };\n const reduced = this.context.world.isReducedMotionEnabled?.();\n const refreshMs = Math.max(\n 1,\n this.resolveTuningNumber('motion.battle.actionFx.electricPathRefreshMs', 40),\n );\n const totalMs =\n this.resolveTuningNumber('motion.battle.actionFx.electricEnterDurationMs', 40) +\n this.resolveTuningNumber('motion.battle.actionFx.electricHoldDurationMs', 80) +\n this.resolveTuningNumber('motion.battle.actionFx.electricExitDurationMs', 120);\n try {\n await Promise.all([\n reduced\n ? Promise.resolve()\n : this.context.director.tween(\n electricClock,\n {\n elapsed: totalMs,\n duration: totalMs / 1000,\n ease: 'none',\n onUpdate: () => {\n if (!signal.aborted)\n this.fxResources.lightning.update(\n lightning,\n Math.floor(electricClock.elapsed / refreshMs),\n lightningGeneration,\n );\n },\n },\n signal,\n ),\n (async () => {\n await this.context.director.tween(\n lightning.root,\n {\n alpha: 1,\n duration:\n this.resolveTuningNumber(\n 'motion.battle.actionFx.electricEnterDurationMs',\n PIXI_BATTLE_ACTION_TIMING.electricEnterMs,\n ) / 1000,\n ease: 'power2.out',\n },\n signal,\n );\n if (!signal.aborted)\n await this.context.director.tween(\n {},\n {\n duration:\n this.resolveTuningNumber(\n 'motion.battle.actionFx.electricHoldDurationMs',\n PIXI_BATTLE_ACTION_TIMING.electricHoldMs,\n ) / 1000,\n },\n signal,\n );\n if (!signal.aborted)\n await this.context.director.tween(\n lightning.root,\n {\n alpha: 0,\n duration:\n this.resolveTuningNumber(\n 'motion.battle.actionFx.electricExitDurationMs',\n PIXI_BATTLE_ACTION_TIMING.electricExitMs,\n ) / 1000,\n ease: 'power2.out',\n },\n signal,\n );\n })(),\n flash\n ? this.context.director.tween(\n flash,\n {\n keyframes: [\n {\n alpha: this.resolveTuningNumber(\n 'visual.battle.actionFx.electricScreenFlashAlpha',\n 0.7,\n ),\n duration: 0.025,\n },\n {\n alpha: 0,\n duration: Math.max(\n 0.025,\n this.resolveTuningNumber(\n 'motion.battle.actionFx.electricScreenFlashDurationMs',\n PIXI_BATTLE_ACTION_TIMING.electricScreenFlashMs,\n ) /\n 1000 -\n 0.025,\n ),\n ease: 'power2.out',\n },\n ],\n },\n signal,\n )\n : Promise.resolve(),\n ]);\n } finally {\n this.fxResources.releaseScreenFlash(flash);\n this.fxResources.releaseLightning(lightning, lightningGeneration);\n }\n }\n\n async playImpact(\n target: { x: number; y: number },\n action: VisualAttackInstruction,\n signal: AbortSignal,\n impactKey: string,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n if (signal.aborted) return;\n const recovering = action.recovering === true;\n const color = recovering\n ? this.context.colors.pixi_effect_recover\n : this.context.colors.pixi_effect_damage;\n const radius = this.resolveTuningNumber('visual.battle.actionFx.impactRadius', 42);\n const impact = this.fxResources.acquireBurst(this.context.scene.worldOverlayFxLayer, target, {\n color,\n radius,\n seed: this.hashActionId(action.id),\n ring: 0.48,\n });\n const fallback = impact\n ? null\n : new this.context.constructors.Graphics()\n .circle(target.x, target.y, 16)\n .fill({ color, alpha: 0.82 });\n if (fallback) this.context.scene.worldOverlayFxLayer.addChild(fallback);\n await Promise.all([\n impact\n ? this.context.director.tween(impact.mesh, { alpha: 0, duration: 0.2 }, signal)\n : this.context.director.tween(fallback!, { alpha: 0, duration: 0.2 }, signal),\n recovering ? Promise.resolve() : this.playCameraImpactShake(impactKey, 'hit', signal),\n ]);\n this.fxResources.release(impact);\n if (fallback) removeAndDestroy(fallback);\n }\n\n async playResourceFloats(\n floats: VisualAttackInstruction['damageFloats'],\n action: VisualAttackInstruction,\n attackerPoint: { x: number; y: number },\n targetPoint: { x: number; y: number },\n signal: AbortSignal,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n await Promise.all(\n floats.map(async (item, index) => {\n const fallbackPoint = item.tokenId === action.attackerId ? attackerPoint : targetPoint;\n const presentationNode = this.context.world.getPresentationNode(item.tokenId);\n const point = presentationNode\n ? { x: presentationNode.position.x, y: presentationNode.position.y }\n : fallbackPoint;\n const isAttackDamage = item.outward;\n let directionX = point.x - attackerPoint.x;\n let directionY = point.y - attackerPoint.y;\n if (Math.hypot(directionX, directionY) < 1) {\n const angle = this.hashActionId(`${action.id}:${item.id}`) * Math.PI * 2;\n directionX = Math.cos(angle);\n directionY = Math.sin(angle);\n }\n const directionLength = Math.hypot(directionX, directionY) || 1;\n const outwardDistance = this.resolveTuningNumber(\n 'visual.battle.actionFx.damageFloatOutDistance',\n 82,\n );\n const upwardDistance = this.resolveTuningNumber(\n 'visual.battle.actionFx.resourceFloatUpDistance',\n 52,\n );\n const text = new this.context.constructors.Text({\n text: item.text,\n style: {\n fill: item.color,\n fontFamily: this.context.typography.data.fontFamily,\n fontSize: this.resolveTuningNumber('visual.battle.actionFx.worldFloatFontSize', 34),\n fontWeight: '700',\n },\n });\n text.anchor.set(0.5);\n text.position.set(point.x, point.y - 12 - index * 20);\n this.context.scene.worldOverlayFxLayer.addChild(text);\n await this.context.director.tween(\n text,\n isAttackDamage\n ? {\n x: text.x + (directionX / directionLength) * outwardDistance,\n y:\n text.y +\n (directionY / directionLength) * outwardDistance -\n Math.min(18, outwardDistance * 0.18),\n alpha: 0,\n duration: resolveResourceFloatDuration(item.text) / 1000,\n delay: item.delay / 1000,\n ease: 'power2.out',\n }\n : {\n y: text.y - upwardDistance,\n alpha: 0,\n duration: resolveResourceFloatDuration(item.text) / 1000,\n delay: item.delay / 1000,\n ease: 'power1.out',\n },\n signal,\n );\n removeAndDestroy(text);\n }),\n );\n }\n\n async playMissFeedback(\n action: VisualAttackInstruction,\n targetPoint: { x: number; y: number },\n signal: AbortSignal,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n if (signal.aborted) return;\n const presentationNode = this.context.world.getPresentationNode(action.targetId);\n const point = presentationNode\n ? { x: presentationNode.position.x, y: presentationNode.position.y }\n : targetPoint;\n const cellSize = this.context.world.getCellSize?.();\n const cell = Math.min(cellSize?.width ?? 96, cellSize?.height ?? 96);\n const headOffset =\n cell * this.resolveTuningNumber('visual.battle.actionFx.missHeadOffsetRatio', 0.62);\n const riseDistance = this.resolveTuningNumber('visual.battle.actionFx.missRiseDistance', 42);\n const startScale = this.resolveTuningNumber('visual.battle.actionFx.missStartScale', 0.86);\n const enterDuration =\n this.resolveTuningNumber('motion.battle.actionFx.missEnterDurationMs', 160) / 1000;\n const holdDuration =\n this.resolveTuningNumber('motion.battle.actionFx.missHoldDurationMs', 180) / 1000;\n const exitDuration =\n this.resolveTuningNumber('motion.battle.actionFx.missExitDurationMs', 420) / 1000;\n const reducedMotion = this.context.world.isReducedMotionEnabled?.() ?? false;\n const text = new this.context.constructors.Text({\n text: action.feedbackText,\n style: {\n ...this.context.typography.damage,\n fill: this.resolveTuningColor(\n 'visual.battle.actionFx.missColor',\n this.context.colors.pixi_effect_miss,\n ),\n fontSize: this.resolveTuningNumber('visual.battle.actionFx.missFontSize', 40),\n stroke: { color: this.context.colors.pixi_sessionGraybox_transition, width: 2 },\n },\n });\n text.anchor.set(0.5);\n text.position.set(point.x, point.y - headOffset);\n text.alpha = 0;\n text.scale.set(reducedMotion ? 1 : startScale);\n this.context.scene.worldOverlayFxLayer.addChild(text);\n try {\n await Promise.all([\n this.context.director.tween(\n text,\n { alpha: 1, duration: enterDuration, ease: 'power2.out' },\n signal,\n ),\n reducedMotion\n ? Promise.resolve()\n : this.context.director.tween(\n text.scale,\n { x: 1, y: 1, duration: enterDuration, ease: 'back.out(1.4)' },\n signal,\n ),\n ]);\n if (signal.aborted) return;\n await this.context.director.tween(\n text,\n {\n ...(reducedMotion ? {} : { y: text.y - riseDistance }),\n alpha: 0,\n duration: exitDuration,\n delay: holdDuration,\n ease: 'power2.out',\n },\n signal,\n );\n } finally {\n removeAndDestroy(text);\n }\n }\n\n private startMissFeedback(\n sequence: VisualAttackInstruction,\n targetPoint: { x: number; y: number },\n signal: AbortSignal,\n ): void {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n if (signal.aborted) return;\n void this.presentationEngine.startSidecar(\n {\n id: `${sequence.id}:result-feedback`,\n phase: 'feedback',\n mode: 'sidecar',\n writes: [{ type: 'screen', id: `result-feedback:${sequence.id}` }],\n run: (sidecarSignal) =>\n this.runSidecarActivity(`${sequence.id}:result-feedback`, () =>\n this.playMissFeedback(sequence, targetPoint, sidecarSignal),\n ),\n },\n signal,\n );\n }\n\n private resolveTuningNumber(path: SessionTuningPath, fallback: number): number {\n const value = this.context.getTuning()?.get(path);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n }\n\n private resolveTuningColor(path: SessionTuningPath, fallback: string | number): string | number {\n const value = this.context.getTuning()?.get(path);\n return typeof value === 'string' || typeof value === 'number' ? value : fallback;\n }\n\n private hashActionId(value: string): number {\n let hash = 2166136261;\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0) / 0xffffffff;\n }\n async playChargeMotion(\n sequence: VisualAttackInstruction,\n attackerPoint: { x: number; y: number },\n targetPoint: { x: number; y: number },\n signal: AbortSignal,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n const motion = sequence.chargeMotion;\n if (!motion) return;\n const legacyMiss =\n motion.outcome === 'miss' &&\n motion.attackerFrom.col === motion.attackerTo.col &&\n motion.attackerFrom.row === motion.attackerTo.row;\n const approachTo = legacyMiss ? motion.targetFrom : motion.attackerTo;\n const attackerTo = this.context.world.gridToPoint(approachTo);\n if (!attackerTo) return;\n const duration = sequence.durations.line / 1000;\n const cellSize = this.context.world.getCellSize?.();\n const cell = Math.min(cellSize?.width ?? 96, cellSize?.height ?? 96);\n const reducedMotion = this.context.world.isReducedMotionEnabled?.() ?? false;\n const attackerNode = this.context.world.getPresentationNode(sequence.attackerId);\n const travelDx = attackerTo.x - attackerPoint.x;\n const travelDy = attackerTo.y - attackerPoint.y;\n const travelLength = Math.hypot(travelDx, travelDy) || 1;\n const direction = { x: travelDx / travelLength, y: travelDy / travelLength };\n const anticipationDuration =\n this.resolveTuningNumber('motion.battle.actionFx.chargeAnticipationDurationMs', 160) / 1000;\n const anticipationDistance =\n cell *\n this.resolveTuningNumber('visual.battle.actionFx.chargeAnticipationDistanceRatio', 0.06);\n const anticipationScale = this.resolveTuningNumber(\n 'visual.battle.actionFx.chargeAnticipationScale',\n 0.96,\n );\n if (!reducedMotion && attackerNode) {\n this.context.world.beginTokenPresentation?.(sequence.attackerId);\n await Promise.all([\n this.context.director.tween(\n attackerNode.position,\n {\n x: attackerPoint.x - direction.x * anticipationDistance,\n y: attackerPoint.y - direction.y * anticipationDistance,\n duration: anticipationDuration,\n ease: 'power2.out',\n },\n signal,\n ),\n this.context.director.tween(\n attackerNode.scale,\n { x: anticipationScale, y: anticipationScale, duration: anticipationDuration },\n signal,\n ),\n ]);\n }\n if (signal.aborted) {\n this.context.world.finishTokenPresentation?.(sequence.attackerId);\n return;\n }\n if (motion.outcome === 'blocked') {\n if (!attackerNode || reducedMotion) return;\n await this.context.director.tween(\n attackerNode.position,\n {\n x: attackerPoint.x + direction.x * cell * 0.12,\n y: attackerPoint.y + direction.y * cell * 0.12,\n duration: Math.max(0.08, duration * 0.18),\n ease: 'power2.in',\n },\n signal,\n );\n if (!signal.aborted)\n await Promise.all([\n this.context.director.tween(\n attackerNode.position,\n { ...attackerPoint, duration: Math.max(0.1, duration * 0.2), ease: 'power2.out' },\n signal,\n ),\n this.context.director.tween(\n attackerNode.scale,\n { x: 1, y: 1, duration: Math.max(0.1, duration * 0.2) },\n signal,\n ),\n ]);\n this.context.world.finishTokenPresentation?.(sequence.attackerId);\n return;\n }\n const targetNode = this.context.world.getPresentationNode(sequence.targetId);\n const startDodge = (): Promise<void> =>\n targetNode && !reducedMotion\n ? (() => {\n const side = this.hashActionId(sequence.id) < 0.5 ? -1 : 1;\n const dx = targetPoint.x - attackerPoint.x;\n const dy = targetPoint.y - attackerPoint.y;\n const length = Math.hypot(dx, dy) || 1;\n const origin = { x: targetNode.x, y: targetNode.y };\n this.context.world.beginTokenPresentation?.(sequence.targetId);\n this.heldChargeDodges.set(sequence.id, {\n tokenId: sequence.targetId,\n origin,\n node: targetNode,\n });\n return this.context.director.tween(\n targetNode.position,\n {\n x: origin.x + (-dy / length) * (cellSize?.width ?? 96) * side,\n y: origin.y + (dx / length) * (cellSize?.height ?? 96) * side,\n duration: 0.12,\n ease: 'power2.out',\n },\n signal,\n );\n })()\n : Promise.resolve();\n let dodgeMotion = motion.outcome === 'dodge' ? startDodge() : Promise.resolve();\n let displacementMotion = Promise.resolve();\n let missStarted = false;\n const startMiss = () => {\n if (missStarted || signal.aborted || motion.outcome !== 'miss') return;\n missStarted = true;\n dodgeMotion = startDodge();\n this.startMissFeedback(sequence, targetPoint, signal);\n displacementMotion = this.playChargeDisplacements(sequence, signal, false);\n };\n // Begin evasion when the token footprints approach contact, using spatial\n // progress rather than elapsed time so easing and charge distance stay in sync.\n const targetProgress =\n ((targetPoint.x - attackerPoint.x) * direction.x +\n (targetPoint.y - attackerPoint.y) * direction.y) /\n travelLength;\n const evasionProgress = Math.max(0, Math.min(1, targetProgress - cell / travelLength));\n const trail = this.createChargeTrail(sequence.attackerId, attackerPoint, attackerTo);\n try {\n await Promise.all([\n this.context.world.playTokenMotion(\n sequence.attackerId,\n motion.attackerFrom,\n approachTo,\n this.context.director,\n signal,\n {\n duration: reducedMotion ? 0 : duration,\n motionBlurStrength: 0,\n settleAtDestination: !legacyMiss,\n holdPresentation: legacyMiss,\n startFromCurrent: !reducedMotion,\n ease: 'power3.in',\n rampMotionBlur: false,\n onProgress: (progress, point) => {\n if (progress >= evasionProgress) startMiss();\n trail.update(point);\n },\n },\n ),\n attackerNode\n ? this.context.director.tween(\n attackerNode.scale,\n { x: 1, y: 1, duration: reducedMotion ? 0 : duration, ease: 'power1.out' },\n signal,\n )\n : Promise.resolve(),\n dodgeMotion,\n ]);\n if (!signal.aborted) startMiss();\n await Promise.all([dodgeMotion, displacementMotion]);\n if (legacyMiss && !signal.aborted) {\n await this.context.world.playTokenMotion(\n sequence.attackerId,\n approachTo,\n motion.attackerTo,\n this.context.director,\n signal,\n {\n duration: reducedMotion ? 0 : duration,\n settleAtDestination: true,\n startFromCurrent: true,\n },\n );\n }\n } finally {\n if (legacyMiss) this.context.world.finishTokenPresentation?.(sequence.attackerId);\n trail.release();\n }\n }\n\n async playChargeImpact(\n sequence: VisualAttackInstruction,\n targetPoint: { x: number; y: number },\n signal: AbortSignal,\n impactKey: string,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n const motion = sequence.chargeMotion;\n if (!motion) return;\n if (motion.outcome === 'dodge' || motion.outcome === 'miss') {\n const held = this.heldChargeDodges.get(sequence.id);\n if (!held) return;\n try {\n await this.context.director.tween(\n held.node.position,\n { ...held.origin, duration: 0.16, ease: 'power2.inOut' },\n signal,\n );\n } finally {\n this.heldChargeDodges.delete(sequence.id);\n this.context.world.finishTokenPresentation?.(held.tokenId);\n }\n return;\n }\n if (motion.outcome !== 'hit') return;\n this.context.getAudio()?.playCue('melee');\n await this.playImpact(targetPoint, sequence, signal, impactKey);\n if (!signal.aborted)\n await this.context.director.tween(\n {},\n {\n duration:\n this.resolveTuningNumber(\n 'motion.battle.actionFx.chargeImpactHoldMs',\n PIXI_BATTLE_ACTION_TIMING.chargeImpactHoldMs,\n ) / 1000,\n },\n signal,\n );\n if (signal.aborted) return;\n await this.playChargeDisplacements(sequence, signal, true);\n }\n\n async playChargeDisplacements(\n sequence: VisualAttackInstruction,\n signal: AbortSignal,\n includeTarget: boolean,\n ): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n const motion = sequence.chargeMotion;\n if (!motion) return;\n const reducedMotion = this.context.world.isReducedMotionEnabled?.() ?? false;\n const duration = reducedMotion ? 0 : Math.max(0.12, (sequence.durations.line / 1000) * 0.48);\n const movements = [\n ...(includeTarget &&\n (motion.targetFrom.col !== motion.targetTo.col ||\n motion.targetFrom.row !== motion.targetTo.row)\n ? [{ tokenId: sequence.targetId, from: motion.targetFrom, to: motion.targetTo }]\n : []),\n ...(motion.displacedTokens ?? []),\n ];\n const stagger =\n this.resolveTuningNumber('motion.battle.actionFx.chargePushStaggerMs', 35) / 1000;\n await Promise.all(\n movements.map(async (movement, index) => {\n if (index > 0 && !reducedMotion)\n await this.context.director.tween({}, { duration: stagger * index }, signal);\n if (signal.aborted) return;\n await this.context.world.playTokenMotion(\n movement.tokenId,\n movement.from,\n movement.to,\n this.context.director,\n signal,\n { duration, motionBlurStrength: reducedMotion ? 0 : 5, settleAtDestination: true },\n );\n }),\n );\n }\n}\n", "import type {\n Container,\n Graphics,\n Mesh,\n MeshGeometry,\n Shader,\n Sprite,\n UniformGroup,\n} from 'pixi.js';\nimport type { RuntimeLogger } from '@bardway/trpg-media';\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\nimport type { PixiAssetManager } from './PixiAssetManager.js';\nimport type { SessionTuningResolver } from './tuning/SessionTuningResolver.js';\nconst BATTLE_PERSISTENT_STATUSES = ['burning', 'poisoned', 'bleeding'] as const;\nexport type TokenPersistentStatus = (typeof BATTLE_PERSISTENT_STATUSES)[number];\nexport interface TokenPersistentStatusConstructors {\n Container: typeof import('pixi.js').Container;\n Sprite: typeof import('pixi.js').Sprite;\n Graphics?: typeof import('pixi.js').Graphics;\n Mesh?: typeof import('pixi.js').Mesh;\n MeshGeometry?: typeof import('pixi.js').MeshGeometry;\n Shader?: typeof import('pixi.js').Shader;\n UniformGroup?: typeof import('pixi.js').UniformGroup;\n}\n\nexport interface TokenPersistentStatusInput {\n flags: Readonly<Partial<Record<TokenPersistentStatus, boolean>>>;\n suppressed?: boolean;\n diameter: number;\n reducedMotion: boolean;\n animate?: boolean;\n director?: PixiAnimationDirector;\n}\n\nconst PARTICLE_COUNTS: Record<TokenPersistentStatus, number> = {\n burning: 4,\n poisoned: 4,\n bleeding: 3,\n};\nconst particleSvg = (body: string): string =>\n `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\">${body}</svg>`)}`;\nconst PARTICLE_TEXTURES: Record<TokenPersistentStatus, string> = {\n burning: particleSvg('<ellipse cx=\"8\" cy=\"8\" rx=\"3\" ry=\"6\" fill=\"white\"/>'),\n poisoned: particleSvg(\n '<circle cx=\"8\" cy=\"8\" r=\"5.5\" fill=\"none\" stroke=\"white\" stroke-width=\"1.5\"/>',\n ),\n bleeding: particleSvg('<path d=\"M8 1C7 5 3 8 3 11a5 5 0 0 0 10 0C13 8 9 5 8 1Z\" fill=\"white\"/>'),\n};\n\nconst VERTEX = `\nprecision highp float;\nattribute vec2 aPosition;\nattribute vec2 aUV;\nuniform mat3 uProjectionMatrix;\nuniform mat3 uWorldTransformMatrix;\nuniform mat3 uTransformMatrix;\nuniform vec4 uWorldColorAlpha;\nuniform vec4 uColor;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\nvoid main(void) {\n vUV = aUV;\n vWorldAlpha = uWorldColorAlpha.a * uColor.a;\n vec3 position = uProjectionMatrix * uWorldTransformMatrix * uTransformMatrix * vec3(aPosition, 1.0);\n gl_Position = vec4(position.xy, 0.0, 1.0);\n}\n`;\n\nconst FRAGMENT_COMMON = `\nprecision highp float;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\nuniform float uTime;\nuniform float uSeed;\nuniform float uAlpha;\nuniform vec3 uPrimary;\nuniform vec3 uSecondary;\nuniform vec4 uTokenClip;\nfloat hash(vec2 p) { return fract(sin(dot(p, vec2(127.1, 311.7)) + uSeed * 71.0) * 43758.5453); }\nfloat noise(vec2 p) {\n vec2 i = floor(p); vec2 f = fract(p); f = f * f * (3.0 - 2.0 * f);\n return mix(mix(hash(i), hash(i + vec2(1.0, 0.0)), f.x),\n mix(hash(i + vec2(0.0, 1.0)), hash(i + vec2(1.0)), f.x), f.y);\n}\nfloat fbm(vec2 p) { return noise(p) * 0.62 + noise(p * 2.03) * 0.27 + noise(p * 4.11) * 0.11; }\nfloat quadEdge(vec2 uv) {\n return smoothstep(0.0, 0.09, uv.x) * smoothstep(0.0, 0.09, 1.0 - uv.x)\n * smoothstep(0.0, 0.09, uv.y) * smoothstep(0.0, 0.09, 1.0 - uv.y);\n}\nfloat tokenAperture(vec2 uv) {\n vec2 tokenLocal = (uv * 2.0 - 1.0) * uTokenClip.xy + uTokenClip.zw;\n return 1.0 - smoothstep(0.94, 1.0, length(tokenLocal));\n}\n`;\n\nexport const TOKEN_BURNING_FRAGMENT = `${FRAGMENT_COMMON}\nvoid main(void) {\n vec2 p = vec2(vUV.x * 2.0 - 1.0, 1.0 - vUV.y);\n float flow = fbm(vec2(p.x * 3.4, p.y * 4.5 - uTime * 1.8));\n float tongue = p.x + (flow - 0.5) * (0.23 + p.y * 0.46);\n float width = mix(0.78, 0.035, p.y);\n float body = 1.0 - smoothstep(width * 0.4, width + 0.1, abs(tongue));\n float tip = 1.0 - smoothstep(0.38 + flow * 0.38, 0.96, p.y);\n float alpha = body * tip * quadEdge(vUV) * tokenAperture(vUV) * uAlpha * vWorldAlpha;\n vec3 color = mix(uPrimary, uSecondary, body * (1.0 - p.y) * 0.75);\n gl_FragColor = vec4(color * alpha, alpha);\n}\n`;\n\nexport const TOKEN_POISONED_FRAGMENT = `${FRAGMENT_COMMON}\nvoid main(void) {\n vec2 p = vUV * 2.0 - 1.0;\n float drift = fbm(p * 2.3 + vec2(uTime * 0.32, -uTime * 0.22));\n float wisps = fbm(p * 4.0 - vec2(uTime * 0.18, uTime * 0.36));\n float cloud = smoothstep(0.23, 0.72, drift * 0.7 + wisps * 0.3);\n float envelope = 1.0 - smoothstep(0.3, 1.0, length(p * vec2(0.9, 0.8)));\n float alpha = cloud * envelope * quadEdge(vUV) * tokenAperture(vUV) * uAlpha * vWorldAlpha;\n vec3 color = mix(uPrimary, uSecondary, wisps * 0.6);\n gl_FragColor = vec4(color * alpha, alpha);\n}\n`;\n\nexport interface NumericSettings {\n iconXRatio: number;\n iconYRatio: number;\n effectXRatio: number;\n effectYRatio: number;\n effectWidthRatio: number;\n effectHeightRatio: number;\n effectAlpha: number;\n particleSizeRatio: number;\n particleSpreadRatio: number;\n particleTravelRatio: number;\n particleAlpha: number;\n periodMs: number;\n speed: number;\n iconPulseRatio: number;\n particlePeriodMs: number;\n}\n\nexport interface StatusSettings extends NumericSettings {\n color: string;\n secondaryColor: string;\n iconTint: string;\n}\n\ntype StatusUniforms = UniformGroup<{\n uTime: { value: number; type: 'f32' };\n uSeed: { value: number; type: 'f32' };\n uAlpha: { value: number; type: 'f32' };\n uPrimary: { value: Float32Array; type: 'vec3<f32>' };\n uSecondary: { value: Float32Array; type: 'vec3<f32>' };\n uTokenClip: { value: Float32Array; type: 'vec4<f32>' };\n}>;\n\ninterface StatusNode {\n root: Container;\n kind: TokenPersistentStatus;\n desiredVisible: boolean;\n settings: StatusSettings;\n icon: Sprite | null;\n particles: Sprite[];\n mesh: Mesh<MeshGeometry, Shader> | null;\n geometry: MeshGeometry | null;\n shader: Shader | null;\n uniforms: StatusUniforms | null;\n controller: AbortController | null;\n loadVersion: number;\n loading: boolean;\n}\n\nconst seedFor = (id: string): number => {\n let hash = 2166136261;\n for (let index = 0; index < id.length; index += 1)\n hash = Math.imul(hash ^ id.charCodeAt(index), 16777619);\n return (hash >>> 0) / 0xffffffff;\n};\nconst rgb = (hex: string): Float32Array => {\n const value = Number.parseInt(hex.slice(1), 16);\n return new Float32Array([\n ((value >> 16) & 255) / 255,\n ((value >> 8) & 255) / 255,\n (value & 255) / 255,\n ]);\n};\nconst period = (value: number): number => (Math.abs(value) > 0.0001 ? value : 0.0001);\nconst fraction = (value: number): number => value - Math.floor(value);\nlet instanceSequence = 0;\n\n/** Retained local status surfaces. The owning World supplies the only animation clock. */\nexport class PixiTokenPersistentStatus {\n readonly root: Container;\n private readonly nodes = new Map<TokenPersistentStatus, StatusNode>();\n private readonly scope: string;\n private readonly phase: number;\n private input: TokenPersistentStatusInput | null = null;\n private elapsedMs = 0;\n private destroyed = false;\n private iconLayer: Container | null = null;\n private iconMask: Graphics | null = null;\n private iconMaskDiameter: number | null = null;\n private iconSizeRatio: number = 0;\n private iconAlpha: number = 0;\n private reducedMotionAlpha: number = 0;\n\n constructor(\n id: string,\n private readonly constructors: TokenPersistentStatusConstructors,\n private readonly assets: Pick<PixiAssetManager, 'loadTexture' | 'releaseScope'>,\n private readonly ports: {\n style: Record<TokenPersistentStatus, StatusSettings> & {\n persistent: {\n iconSizeRatio: number;\n iconAlpha: number;\n reducedMotionAlpha: number;\n fadeInDurationMs: number;\n fadeOutDurationMs: number;\n };\n };\n iconUrl: (status: TokenPersistentStatus) => string;\n logger: RuntimeLogger;\n },\n private tuning?: SessionTuningResolver,\n private readonly requestRender?: () => void,\n private readonly onActivityChange?: () => void,\n ) {\n this.scope = `runtime:token-persistent-status:${id}:${++instanceSequence}`;\n this.phase = seedFor(id);\n this.root = new constructors.Container({ label: `battle-token-persistent-status:${id}` });\n this.root.eventMode = 'none';\n this.root.interactiveChildren = false;\n this.readCommonSettings();\n }\n\n sync(input: TokenPersistentStatusInput): void {\n if (this.destroyed) return;\n this.input = input;\n for (const kind of BATTLE_PERSISTENT_STATUSES) {\n const enabled = input.suppressed !== true && input.flags[kind] === true;\n const existing = this.nodes.get(kind);\n if (!enabled && !existing) continue;\n const state = existing ?? this.createStatus(kind);\n const changed = state.desiredVisible !== enabled;\n state.settings = this.readSettings(kind);\n if (changed || (input.reducedMotion && state.controller))\n this.setVisibility(state, enabled, input.animate === true && input.suppressed !== true);\n if (enabled && (!state.icon || state.particles.length === 0) && !state.loading)\n this.loadSprites(state);\n this.layout(state);\n }\n this.update(this.elapsedMs);\n this.onActivityChange?.();\n }\n\n hasAmbientMotion(): boolean {\n return (\n !this.destroyed &&\n this.input?.reducedMotion !== true &&\n [...this.nodes.values()].some((state) => state.desiredVisible || Boolean(state.controller))\n );\n }\n\n update(elapsedMs: number): void {\n if (this.destroyed || !this.input) return;\n if (Number.isFinite(elapsedMs)) this.elapsedMs = elapsedMs;\n const { diameter, reducedMotion } = this.input;\n for (const state of this.nodes.values()) {\n this.syncIconPresentation(state);\n if (!state.root.visible) continue;\n const settings = state.settings;\n const turns = reducedMotion\n ? this.phase\n : (this.elapsedMs / period(settings.periodMs)) * settings.speed + this.phase;\n if (state.uniforms) state.uniforms.uniforms.uTime = turns;\n if (state.icon) {\n const pulse = reducedMotion\n ? 1\n : 1 + Math.sin(turns * Math.PI * 2) * settings.iconPulseRatio;\n state.icon.width = diameter * this.iconSizeRatio * pulse;\n state.icon.height = diameter * this.iconSizeRatio * pulse;\n }\n for (const [index, sprite] of state.particles.entries()) {\n sprite.visible = !reducedMotion;\n if (reducedMotion) continue;\n const progress = fraction(\n (this.elapsedMs / period(settings.particlePeriodMs)) * settings.speed +\n this.phase +\n index / state.particles.length,\n );\n const spread = Math.sin((index + 1) * 2.399 + this.phase * 6.283);\n const direction = state.kind === 'bleeding' ? 1 : -1;\n const sway = Math.sin(progress * Math.PI * 2 + index) * settings.iconPulseRatio;\n sprite.position.set(\n diameter *\n (settings.effectXRatio +\n spread * settings.particleSpreadRatio * settings.effectWidthRatio * 0.5 +\n sway),\n diameter *\n (settings.effectYRatio +\n direction * progress * settings.particleTravelRatio * settings.effectHeightRatio),\n );\n sprite.alpha =\n Math.sin(progress * Math.PI) *\n settings.particleAlpha *\n (state.kind === 'bleeding' ? settings.effectAlpha : 1);\n const size =\n diameter *\n settings.particleSizeRatio *\n (state.kind === 'poisoned' ? 0.65 + progress * 0.7 : 1);\n sprite.width = size;\n sprite.height = size * (state.kind === 'bleeding' ? 1.7 : 1);\n }\n }\n }\n\n updateTuning(tuning: SessionTuningResolver): void {\n this.tuning = tuning;\n this.readCommonSettings();\n for (const state of this.nodes.values()) {\n state.settings = this.readSettings(state.kind);\n this.layout(state);\n }\n this.update(this.elapsedMs);\n this.requestRender?.();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n for (const state of this.nodes.values()) {\n state.loadVersion += 1;\n state.controller?.abort();\n state.controller = null;\n state.mesh?.removeFromParent();\n state.mesh?.destroy();\n state.shader?.destroy();\n state.geometry?.destroy();\n state.uniforms = null;\n }\n this.nodes.clear();\n if (this.iconLayer) this.iconLayer.mask = null;\n this.root.removeFromParent();\n this.root.destroy({ children: true });\n this.iconLayer = null;\n this.iconMask = null;\n this.iconMaskDiameter = null;\n void this.assets.releaseScope(this.scope).catch((error: unknown) => {\n this.ports.logger.warn('[PixiTokenPersistentStatus] \u72B6\u6001\u7EB9\u7406\u91CA\u653E\u5931\u8D25', {\n scope: this.scope,\n error,\n });\n });\n this.onActivityChange?.();\n }\n\n private createStatus(kind: TokenPersistentStatus): StatusNode {\n const root = new this.constructors.Container({ label: `persistent-status:${kind}` });\n root.eventMode = 'none';\n root.interactiveChildren = false;\n root.visible = false;\n root.alpha = 0;\n this.root.addChild(root);\n if (this.iconLayer) this.root.addChild(this.iconLayer);\n const state: StatusNode = {\n kind,\n root,\n desiredVisible: false,\n settings: this.readSettings(kind),\n icon: null,\n particles: [],\n mesh: null,\n geometry: null,\n shader: null,\n uniforms: null,\n controller: null,\n loadVersion: 0,\n loading: false,\n };\n if (kind !== 'bleeding') this.createMesh(state);\n this.nodes.set(kind, state);\n return state;\n }\n\n private createMesh(state: StatusNode): void {\n const {\n Mesh: MeshConstructor,\n MeshGeometry: GeometryConstructor,\n Shader: ShaderConstructor,\n UniformGroup: UniformConstructor,\n } = this.constructors;\n if (!MeshConstructor || !GeometryConstructor || !ShaderConstructor || !UniformConstructor)\n return;\n const uniforms = new UniformConstructor({\n uTime: { value: 0, type: 'f32' },\n uSeed: { value: this.phase, type: 'f32' },\n uAlpha: { value: state.settings.effectAlpha, type: 'f32' },\n uPrimary: { value: rgb(state.settings.color), type: 'vec3<f32>' },\n uSecondary: { value: rgb(state.settings.secondaryColor), type: 'vec3<f32>' },\n uTokenClip: { value: new Float32Array([1, 1, 0, 0]), type: 'vec4<f32>' },\n });\n const shader = ShaderConstructor.from({\n gl: {\n vertex: VERTEX,\n fragment: state.kind === 'burning' ? TOKEN_BURNING_FRAGMENT : TOKEN_POISONED_FRAGMENT,\n },\n resources: { tokenStatusUniforms: uniforms },\n });\n const geometry = new GeometryConstructor({\n positions: new Float32Array([-1, -1, 1, -1, 1, 1, -1, 1]),\n uvs: new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),\n indices: new Uint32Array([0, 1, 2, 0, 2, 3]),\n topology: 'triangle-list',\n });\n const mesh = new MeshConstructor({ geometry, shader, label: `token-${state.kind}-surface` });\n mesh.eventMode = 'none';\n state.root.addChild(mesh);\n state.mesh = mesh;\n state.geometry = geometry;\n state.shader = shader;\n state.uniforms = uniforms;\n }\n\n private loadSprites(state: StatusNode): void {\n state.loading = true;\n const version = ++state.loadVersion;\n const kind = state.kind;\n void Promise.allSettled([\n state.icon\n ? Promise.resolve(null)\n : this.assets.loadTexture(\n `token-persistent-status:${kind}:icon`,\n this.ports.iconUrl(kind),\n this.scope,\n ),\n state.particles.length > 0\n ? Promise.resolve(null)\n : this.assets.loadTexture(\n `token-persistent-status:${kind}:particle`,\n PARTICLE_TEXTURES[kind],\n this.scope,\n ),\n ]).then(([iconTexture, particleTexture]) => {\n if (this.destroyed || state.loadVersion !== version) return;\n state.loading = false;\n if (!state.desiredVisible) return;\n if (iconTexture.status === 'fulfilled' && iconTexture.value && !state.icon) {\n const icon = new this.constructors.Sprite(iconTexture.value);\n icon.label = `persistent-status-icon:${kind}`;\n icon.anchor.set(0.5);\n icon.eventMode = 'none';\n this.ensureIconLayer().addChild(icon);\n state.icon = icon;\n }\n if (\n particleTexture.status === 'fulfilled' &&\n particleTexture.value &&\n state.particles.length === 0\n ) {\n const texture = particleTexture.value;\n state.particles = Array.from({ length: PARTICLE_COUNTS[kind] }, () => {\n const sprite = new this.constructors.Sprite(texture);\n sprite.anchor.set(0.5);\n sprite.eventMode = 'none';\n state.root.addChild(sprite);\n return sprite;\n });\n }\n this.layout(state);\n this.update(this.elapsedMs);\n this.requestRender?.();\n this.onActivityChange?.();\n if (iconTexture.status === 'rejected' || particleTexture.status === 'rejected') {\n this.ports.logger.warn('[PixiTokenPersistentStatus] \u72B6\u6001\u7EB9\u7406\u52A0\u8F7D\u5931\u8D25\uFF0C\u4FDD\u7559\u53EF\u7528\u56FE\u5C42', {\n kind,\n });\n }\n });\n }\n\n private setVisibility(state: StatusNode, enabled: boolean, animate: boolean): void {\n const previous = state.controller;\n state.controller = null;\n previous?.abort();\n state.desiredVisible = enabled;\n const director = this.input?.director;\n if (!animate || !director || this.input?.reducedMotion) {\n state.root.visible = enabled;\n state.root.alpha = enabled ? 1 : 0;\n this.syncIconPresentation(state);\n return;\n }\n state.root.visible = true;\n this.syncIconPresentation(state);\n const controller = new AbortController();\n state.controller = controller;\n const key = enabled ? 'fadeInDurationMs' : 'fadeOutDurationMs';\n const duration = this.number(\n `motion.battle.tokenStatus.persistent.${key}`,\n this.ports.style.persistent[key],\n );\n void director\n .tween(\n state.root,\n {\n alpha: enabled ? 1 : 0,\n duration: Math.max(0, duration) / 1000,\n onUpdate: () => this.syncIconPresentation(state),\n },\n controller.signal,\n )\n .then(() => {\n if (this.destroyed || state.controller !== controller || controller.signal.aborted) return;\n state.controller = null;\n state.root.alpha = enabled ? 1 : 0;\n state.root.visible = enabled;\n this.syncIconPresentation(state);\n this.requestRender?.();\n this.onActivityChange?.();\n });\n }\n\n private layout(state: StatusNode): void {\n if (!this.input) return;\n const { diameter, reducedMotion } = this.input;\n if (this.iconMask && this.iconMaskDiameter !== diameter) {\n this.iconMask\n .clear()\n .circle(0, 0, diameter / 2)\n .fill();\n this.iconMaskDiameter = diameter;\n }\n const settings = state.settings;\n state.icon?.position.set(diameter * settings.iconXRatio, diameter * settings.iconYRatio);\n if (state.icon) state.icon.tint = settings.iconTint;\n if (state.mesh) {\n state.mesh.position.set(diameter * settings.effectXRatio, diameter * settings.effectYRatio);\n state.mesh.scale.set(\n (diameter * settings.effectWidthRatio) / 2,\n (diameter * settings.effectHeightRatio) / 2,\n );\n }\n if (state.uniforms) {\n state.uniforms.uniforms.uAlpha =\n settings.effectAlpha * (reducedMotion ? this.reducedMotionAlpha : 1);\n state.uniforms.uniforms.uPrimary.set(rgb(settings.color));\n state.uniforms.uniforms.uSecondary.set(rgb(settings.secondaryColor));\n state.uniforms.uniforms.uTokenClip.set([\n settings.effectWidthRatio,\n settings.effectHeightRatio,\n 2 * settings.effectXRatio,\n 2 * settings.effectYRatio,\n ]);\n }\n for (const [index, sprite] of state.particles.entries())\n sprite.tint = index % 2 === 0 ? settings.color : settings.secondaryColor;\n }\n\n private ensureIconMask(): Graphics | null {\n if (this.iconMask || !this.constructors.Graphics) return this.iconMask;\n this.iconMask = new this.constructors.Graphics({ label: 'token-persistent-svg-mask' });\n this.iconMask.eventMode = 'none';\n this.iconMask.interactiveChildren = false;\n this.root.addChild(this.iconMask);\n return this.iconMask;\n }\n\n private ensureIconLayer(): Container {\n if (this.iconLayer) return this.iconLayer;\n const layer = new this.constructors.Container({ label: 'token-persistent-icons' });\n layer.eventMode = 'none';\n layer.interactiveChildren = false;\n layer.visible = false;\n layer.mask = this.ensureIconMask();\n this.root.addChild(layer);\n this.iconLayer = layer;\n return layer;\n }\n\n private syncIconPresentation(state: StatusNode): void {\n if (this.destroyed) return;\n if (state.icon) {\n state.icon.visible = state.root.visible;\n state.icon.alpha =\n (this.input?.reducedMotion ? this.reducedMotionAlpha : this.iconAlpha) * state.root.alpha;\n }\n if (!this.iconLayer) return;\n this.iconLayer.visible = false;\n for (const current of this.nodes.values()) {\n if (current.icon?.visible) {\n this.iconLayer.visible = true;\n break;\n }\n }\n }\n\n private readCommonSettings(): void {\n for (const key of ['iconSizeRatio', 'iconAlpha', 'reducedMotionAlpha'] as const)\n this[key] = this.number(\n `visual.battle.tokenStatus.persistent.${key}`,\n this.ports.style.persistent[key],\n );\n }\n\n private readSettings(kind: TokenPersistentStatus): StatusSettings {\n const fallback = this.ports.style[kind];\n const visual = (key: keyof NumericSettings): number =>\n this.number(`visual.battle.tokenStatus.${kind}.${key}`, fallback[key]);\n const motion = (key: keyof NumericSettings): number =>\n this.number(`motion.battle.tokenStatus.${kind}.${key}`, fallback[key]);\n return {\n color: this.color(`visual.battle.tokenStatus.${kind}.color`, fallback.color),\n secondaryColor: this.color(\n `visual.battle.tokenStatus.${kind}.secondaryColor`,\n fallback.secondaryColor,\n ),\n iconTint: this.color(`visual.battle.tokenStatus.${kind}.iconTint`, fallback.iconTint),\n iconXRatio: visual('iconXRatio'),\n iconYRatio: visual('iconYRatio'),\n effectXRatio: visual('effectXRatio'),\n effectYRatio: visual('effectYRatio'),\n effectWidthRatio: visual('effectWidthRatio'),\n effectHeightRatio: visual('effectHeightRatio'),\n effectAlpha: visual('effectAlpha'),\n particleSizeRatio: visual('particleSizeRatio'),\n particleSpreadRatio: visual('particleSpreadRatio'),\n particleTravelRatio: visual('particleTravelRatio'),\n particleAlpha: visual('particleAlpha'),\n periodMs: motion('periodMs'),\n speed: motion('speed'),\n iconPulseRatio: motion('iconPulseRatio'),\n particlePeriodMs: motion('particlePeriodMs'),\n };\n }\n\n private number(path: Parameters<SessionTuningResolver['get']>[0], fallback: number): number {\n const value = this.tuning?.get(path);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n }\n\n private color(path: Parameters<SessionTuningResolver['get']>[0], fallback: string): string {\n const value = this.tuning?.get(path);\n return typeof value === 'string' && /^#[0-9a-f]{6}$/i.test(value) ? value : fallback;\n }\n}\n", "import type {\n Container,\n Graphics,\n Mesh,\n MeshGeometry,\n Shader,\n Sprite,\n Texture,\n Ticker,\n UniformGroup,\n} from 'pixi.js';\n\nimport type { RuntimeLogger } from '@bardway/trpg-media';\nimport type { PixiAssetManager } from './PixiAssetManager.js';\nimport type { PixiSceneGraph } from './PixiSceneGraph.js';\nimport { resolveCoverRect } from './PixiMapWorldUtils.js';\n\nimport { createStageSkinSprite } from './PixiSessionSkin.js';\nimport type { SessionTuningResolver } from './tuning/SessionTuningResolver.js';\nimport type { SessionTuningPath } from './tuning/SessionTuningTypes.js';\nimport type { PixiAnimationActivity } from './PixiAnimationActivity.js';\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\nimport { PixiLocalGlowMesh } from './PixiLocalGlowMesh.js';\nimport type { PixiMediaBreathBinding, PixiMediaBreathRuntime } from './PixiMediaBreathRuntime.js';\nimport type { PixiVideoBinding, PixiVideoRuntime } from './PixiVideoRuntime.js';\nimport { waitForSessionMediaReady } from '@bardway/trpg-media';\n\ninterface Constructors {\n Container: typeof Container;\n Graphics: typeof Graphics;\n Mesh: typeof Mesh;\n MeshGeometry: typeof MeshGeometry;\n Shader: typeof Shader;\n Sprite: new (texture?: Texture | import('pixi.js').SpriteOptions) => Sprite;\n UniformGroup: typeof UniformGroup;\n}\n\nconst endingPhotoBase = { width: 867, height: 490 };\n\nexport const DEFAULT_ENDING_TIMELINE = {\n veilInDuration: 0.65,\n photoAppearDuration: 0.12,\n fullscreenHoldDuration: 2.77,\n photoSettleDuration: 3.85,\n backgroundRevealDuration: 3.35,\n veilOutDuration: 1.25,\n} as const;\n\ninterface PhotoReadyWaiter {\n readonly key: string;\n readonly settle: (ready: boolean) => void;\n}\n\ninterface EndingPhotoProxy {\n readonly root: Container;\n readonly mediaBreath: PixiMediaBreathBinding | null;\n readonly target: {\n readonly x: number;\n readonly y: number;\n readonly scaleX: number;\n readonly scaleY: number;\n readonly rotation: number;\n };\n}\n\ninterface EndingLayoutRect {\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n}\n\nlet PixiEndingSurfaceScopeSerial = 0;\nexport class PixiEndingSurface {\n private disposed = false;\n private readonly resourceScope = `runtime:PixiEndingSurface:${++PixiEndingSurfaceScopeSerial}`;\n readonly node: Container;\n\n private readonly photoAnchor: Container;\n private readonly photoFrame: Sprite;\n private readonly photoMask: Graphics;\n private readonly photoGlow: PixiLocalGlowMesh;\n private readonly dust: Graphics[] = [];\n private active = false;\n private elapsed = 0;\n private releaseActivity: (() => void) | null = null;\n private photoImage: Sprite | null = null;\n private photoMediaBreath: PixiMediaBreathBinding | null = null;\n private photoVideoBinding: PixiVideoBinding | null = null;\n private photoMediaReady: Promise<boolean> | null = null;\n private photoMediaFailed = false;\n private photoKey: string | null = null;\n private photoVideoUrl: string | null = null;\n private photoReadyKey: string | null = null;\n private readonly photoReadyWaiters = new Set<PhotoReadyWaiter>();\n private photoVersion = 0;\n private timelineActive = false;\n private activeProxy: Container | null = null;\n private activeProxyMediaBreath: PixiMediaBreathBinding | null = null;\n private uiHighlightMultiplier = 1;\n private readonly releaseUiHighlight: (() => void) | null;\n\n constructor(\n scene: PixiSceneGraph,\n private readonly assets: PixiAssetManager,\n private readonly constructors: Constructors,\n skinTexture: Texture | null,\n photoFrameTexture: Texture | null,\n private readonly requestRender: () => void,\n private readonly ports: {\n logger: RuntimeLogger;\n stage: { width: number; height: number };\n layout: { photoFrame: EndingLayoutRect; photoImageRect: EndingLayoutRect };\n stageColor: string;\n paperColor: string;\n paperEdgeColor: string;\n },\n private tuning?: SessionTuningResolver,\n private readonly ticker?: Ticker,\n private readonly activity?: PixiAnimationActivity,\n private readonly mediaBreath?: PixiMediaBreathRuntime,\n private readonly videoRuntime?: PixiVideoRuntime,\n ) {\n this.node = new constructors.Container();\n const background = skinTexture\n ? createStageSkinSprite(constructors.Sprite, skinTexture, this.ports.stage)\n : new constructors.Graphics()\n .rect(0, 0, this.ports.stage.width, this.ports.stage.height)\n .fill(this.ports.stageColor);\n this.photoAnchor = new constructors.Container();\n this.photoAnchor.pivot.set(endingPhotoBase.width / 2, endingPhotoBase.height / 2);\n this.photoFrame = new constructors.Sprite(photoFrameTexture ?? undefined);\n this.photoFrame.visible = Boolean(photoFrameTexture);\n this.photoMask = new constructors.Graphics();\n this.photoGlow = new PixiLocalGlowMesh(constructors, 'ending-closing-photo-glow');\n this.releaseUiHighlight =\n mediaBreath?.subscribeUiHighlight((frame) => {\n this.uiHighlightMultiplier = frame.uiHighlightMultiplier;\n this.configurePhotoGlow();\n }) ?? null;\n this.configurePhotoGlow();\n this.photoAnchor.addChild(this.photoFrame, this.photoMask);\n for (let index = 0; index < 8; index += 1) {\n const dust = new constructors.Graphics()\n .circle(0, 0, 1 + (index % 2) * 0.6)\n .fill({ color: this.ports.paperColor, alpha: 0.12 });\n dust.position.set(260 + ((index * 211) % 1380), 180 + ((index * 137) % 720));\n dust.eventMode = 'none';\n this.dust.push(dust);\n }\n this.node.addChild(background, ...this.dust, this.photoAnchor);\n scene.backgroundLayer.addChild(this.node);\n this.node.visible = false;\n this.syncLayout();\n }\n\n sync(\n imageUrl: string | null,\n videoUrlOrVisible: string | null | boolean,\n visibleValue?: boolean,\n ): void {\n const videoUrl = typeof videoUrlOrVisible === 'boolean' ? null : videoUrlOrVisible;\n const visible =\n typeof videoUrlOrVisible === 'boolean' ? videoUrlOrVisible : Boolean(visibleValue);\n this.node.visible = visible;\n this.active = visible;\n this.syncActivity();\n if (!visible) {\n this.photoVideoBinding?.deactivate(true);\n return;\n }\n this.loadPhoto(imageUrl, videoUrl);\n }\n\n async playTimeline(\n animation: PixiAnimationDirector,\n signal: AbortSignal,\n reducedMotion: boolean,\n overlayLayer: Container,\n ): Promise<void> {\n if (!this.node.visible || signal.aborted) return;\n this.node.alpha = 0;\n this.photoAnchor.alpha = 1;\n this.syncLayout();\n const photoAppearDuration = this.resolveTuningNumber(\n 'motion.ending.photoAppearDuration',\n DEFAULT_ENDING_TIMELINE.photoAppearDuration,\n );\n if (reducedMotion || !this.photoImage) {\n await animation.tween(\n this.node,\n {\n alpha: 1,\n duration: photoAppearDuration,\n reducedMotionDuration: DEFAULT_ENDING_TIMELINE.photoAppearDuration,\n ease: 'power1.out',\n onUpdate: this.requestRender,\n },\n signal,\n );\n return;\n }\n\n this.photoAnchor.alpha = 0;\n this.clearPhotoProxy();\n const proxy = this.createPhotoProxy(this.photoImage.texture);\n this.activeProxy = proxy.root;\n this.activeProxyMediaBreath = proxy.mediaBreath;\n overlayLayer.addChild(proxy.root);\n const fullscreenHoldDuration = this.resolveTuningNumber(\n 'motion.ending.fullscreenHoldDuration',\n DEFAULT_ENDING_TIMELINE.fullscreenHoldDuration,\n );\n const photoSettleDuration = this.resolveTuningNumber(\n 'motion.ending.photoSettleDuration',\n DEFAULT_ENDING_TIMELINE.photoSettleDuration,\n );\n const backgroundRevealDuration = this.resolveTuningNumber(\n 'motion.ending.backgroundRevealDuration',\n DEFAULT_ENDING_TIMELINE.backgroundRevealDuration,\n );\n const handoffDuration = Math.min(photoAppearDuration, photoSettleDuration);\n const handoffDelay = Math.max(\n 0,\n fullscreenHoldDuration + photoSettleDuration - handoffDuration,\n );\n this.timelineActive = true;\n try {\n await Promise.all([\n animation.tween(\n proxy.root,\n {\n alpha: 1,\n duration: photoAppearDuration,\n ease: 'power1.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n animation.tween(\n proxy.root.position,\n {\n x: proxy.target.x,\n y: proxy.target.y,\n duration: photoSettleDuration,\n delay: fullscreenHoldDuration,\n ease: 'power1.inOut',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n animation.tween(\n proxy.root.scale,\n {\n x: proxy.target.scaleX,\n y: proxy.target.scaleY,\n duration: photoSettleDuration,\n delay: fullscreenHoldDuration,\n ease: 'power1.inOut',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n animation.tween(\n proxy.root,\n {\n rotation: proxy.target.rotation,\n duration: photoSettleDuration,\n delay: fullscreenHoldDuration,\n ease: 'power1.inOut',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n animation.tween(\n this.node,\n {\n alpha: 1,\n duration: backgroundRevealDuration,\n delay: fullscreenHoldDuration,\n ease: 'power1.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n animation.tween(\n proxy.root,\n {\n alpha: 0,\n duration: handoffDuration,\n delay: handoffDelay,\n ease: 'power1.inOut',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n animation.tween(\n this.photoAnchor,\n {\n alpha: 1,\n duration: handoffDuration,\n delay: handoffDelay,\n ease: 'power1.inOut',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n ]);\n } finally {\n this.timelineActive = false;\n this.node.alpha = 1;\n this.photoAnchor.alpha = 1;\n this.syncLayout();\n if (this.activeProxy === proxy.root) this.activeProxy = null;\n if (this.activeProxyMediaBreath === proxy.mediaBreath) this.activeProxyMediaBreath = null;\n proxy.mediaBreath?.release();\n if (!proxy.root.destroyed) proxy.root.destroy({ children: true });\n this.requestRender();\n }\n }\n\n waitForPhotoReady(imageUrl: string | null, signal: AbortSignal): Promise<boolean> {\n if (!imageUrl || signal.aborted || this.photoKey !== imageUrl) return Promise.resolve(false);\n if (this.photoReadyKey === imageUrl && this.photoImage) return Promise.resolve(true);\n return new Promise((resolve) => {\n const settle = (ready: boolean) => {\n signal.removeEventListener('abort', abort);\n this.photoReadyWaiters.delete(waiter);\n resolve(ready);\n };\n const abort = () => settle(false);\n const waiter: PhotoReadyWaiter = { key: imageUrl, settle };\n this.photoReadyWaiters.add(waiter);\n signal.addEventListener('abort', abort, { once: true });\n if (signal.aborted) abort();\n });\n }\n\n updateTuning(tuning: SessionTuningResolver | undefined): void {\n this.tuning = tuning;\n this.syncLayout();\n this.requestRender();\n }\n\n reset(): void {\n this.active = false;\n this.timelineActive = false;\n this.node.visible = false;\n this.node.alpha = 1;\n this.photoAnchor.alpha = 1;\n this.syncActivity();\n this.clearPhotoProxy();\n this.clearPhoto();\n }\n\n private loadPhoto(imageUrl: string | null, videoUrl: string | null): void {\n if (this.photoKey === imageUrl && this.photoVideoUrl === videoUrl) {\n void this.photoVideoBinding?.activate(false);\n return;\n }\n this.clearPhoto();\n this.photoKey = imageUrl;\n this.photoVideoUrl = videoUrl;\n this.photoMediaFailed = false;\n if (!imageUrl) return;\n const version = this.photoVersion;\n this.photoMediaReady = this.assets\n .loadTexture(`ending-closing:${imageUrl}`, imageUrl, this.resourceScope)\n .then(async (texture) => {\n if (version !== this.photoVersion || this.photoKey !== imageUrl) return false;\n if (!this.node.visible) {\n this.photoKey = null;\n this.photoReadyKey = null;\n this.settlePhotoReadyWaiters(false, imageUrl);\n return false;\n }\n const image = new this.constructors.Sprite(texture);\n image.mask = this.photoMask;\n this.photoAnchor.addChild(image);\n this.photoImage = image;\n this.photoMediaBreath = this.mediaBreath?.attach(image, 'primary') ?? null;\n this.photoReadyKey = imageUrl;\n this.syncPhotoImageLayout();\n this.settlePhotoReadyWaiters(true, imageUrl);\n this.requestRender();\n return videoUrl ? this.upgradePhotoToVideo(image, imageUrl, videoUrl, version) : true;\n })\n .catch((error) => {\n if (version !== this.photoVersion || this.photoKey !== imageUrl) return false;\n this.photoKey = null;\n this.photoReadyKey = null;\n this.settlePhotoReadyWaiters(false, imageUrl);\n this.ports.logger.warn('[PixiEndingSurface] \u95ED\u5E55\u56FE\u52A0\u8F7D\u5931\u8D25\uFF0C\u4FDD\u7559\u7ED3\u5C40\u5E95\u56FE', {\n imageUrl,\n error,\n });\n return false;\n })\n .then((ready) => {\n if (version === this.photoVersion) this.photoMediaFailed = !ready;\n return ready;\n });\n }\n\n async waitForVideoReady(\n imageUrl: string | null,\n videoUrl: string,\n signal: AbortSignal,\n ): Promise<boolean> {\n if (!this.active || !imageUrl || signal.aborted) return Promise.resolve(false);\n if (this.photoVideoBinding && !this.photoMediaFailed) {\n const binding = this.photoVideoBinding;\n const ready = await waitForSessionMediaReady(binding.activate(false), signal);\n if (!ready && !signal.aborted && this.photoVideoBinding === binding)\n this.photoMediaFailed = true;\n return ready;\n }\n if (this.photoMediaFailed) this.photoKey = null;\n this.loadPhoto(imageUrl, videoUrl);\n return waitForSessionMediaReady(this.photoMediaReady, signal);\n }\n\n private async upgradePhotoToVideo(\n image: Sprite,\n imageUrl: string,\n videoUrl: string,\n version: number,\n ): Promise<boolean> {\n if (!this.videoRuntime) return false;\n const posterTexture = image.texture;\n try {\n const binding = await this.videoRuntime.loadBinding({\n alias: `ending-closing-video:${videoUrl}`,\n videoUrl,\n scope: this.resourceScope,\n onPlaybackFailure: () => {\n if (this.photoImage === image) {\n image.texture = posterTexture;\n this.photoVideoBinding = null;\n this.photoMediaFailed = true;\n this.syncPhotoImageLayout();\n this.requestRender();\n }\n },\n });\n if (\n !this.active ||\n version !== this.photoVersion ||\n this.photoKey !== imageUrl ||\n this.photoVideoUrl !== videoUrl ||\n this.photoImage !== image\n ) {\n binding.release();\n return false;\n }\n const activated = await binding.activate(true);\n if (\n !activated ||\n !this.active ||\n version !== this.photoVersion ||\n this.photoImage !== image\n ) {\n binding.release();\n return false;\n }\n this.photoVideoBinding?.release();\n this.photoVideoBinding = binding;\n image.texture = binding.texture;\n this.syncPhotoImageLayout();\n this.requestRender();\n return true;\n } catch (error) {\n this.ports.logger.warn('[PixiEndingSurface] \u95ED\u5E55 WebM \u52A0\u8F7D\u5931\u8D25\uFF0C\u4FDD\u7559 WebP \u6D77\u62A5', {\n videoUrl,\n error,\n });\n return false;\n }\n }\n\n private clearPhoto(): void {\n this.photoMediaReady = null;\n this.photoVersion += 1;\n this.photoKey = null;\n this.photoVideoUrl = null;\n this.photoReadyKey = null;\n this.settlePhotoReadyWaiters(false);\n this.photoMediaBreath?.release();\n this.photoMediaBreath = null;\n this.photoVideoBinding?.release();\n this.photoVideoBinding = null;\n this.photoImage?.destroy();\n this.photoImage = null;\n }\n\n private clearPhotoProxy(): void {\n const proxy = this.activeProxy;\n this.activeProxy = null;\n this.activeProxyMediaBreath?.release();\n this.activeProxyMediaBreath = null;\n if (proxy && !proxy.destroyed) proxy.destroy({ children: true });\n }\n\n private settlePhotoReadyWaiters(ready: boolean, key?: string): void {\n for (const waiter of [...this.photoReadyWaiters]) {\n if (key !== undefined && waiter.key !== key) continue;\n waiter.settle(ready);\n }\n }\n\n private createPhotoProxy(texture: Texture): EndingPhotoProxy {\n const photoFrameRect = this.resolveTuningRect(\n 'layout.ending.photoFrame',\n this.ports.layout.photoFrame,\n );\n const photoImageRect = this.resolveTuningRect(\n 'layout.ending.photoImageRect',\n this.ports.layout.photoImageRect,\n );\n const root = new this.constructors.Container();\n root.eventMode = 'none';\n root.interactiveChildren = false;\n root.alpha = 0;\n root.pivot.set(endingPhotoBase.width / 2, endingPhotoBase.height / 2);\n\n const frame = new this.constructors.Sprite(this.photoFrame.texture);\n frame.eventMode = 'none';\n frame.visible = this.photoFrame.visible;\n frame.width = endingPhotoBase.width;\n frame.height = endingPhotoBase.height;\n\n const mask = new this.constructors.Graphics()\n .roundRect(photoImageRect.x, photoImageRect.y, photoImageRect.width, photoImageRect.height, 5)\n .fill(this.ports.stageColor);\n mask.eventMode = 'none';\n\n const image = new this.constructors.Sprite(texture);\n image.eventMode = 'none';\n image.mask = mask;\n\n const textureWidth = Math.max(1, texture.width);\n const textureHeight = Math.max(1, texture.height);\n const imageRect = resolveCoverRect(\n { width: textureWidth, height: textureHeight },\n photoImageRect,\n );\n image.position.set(imageRect.x, imageRect.y);\n image.width = imageRect.width;\n image.height = imageRect.height;\n root.addChild(frame, mask, image);\n const mediaBreath = this.mediaBreath?.attach(image, 'primary') ?? null;\n\n const fullscreenScale = Math.max(\n this.ports.stage.width / photoImageRect.width,\n this.ports.stage.height / photoImageRect.height,\n );\n const apertureCenterX = photoImageRect.x + photoImageRect.width / 2;\n const apertureCenterY = photoImageRect.y + photoImageRect.height / 2;\n root.position.set(\n this.ports.stage.width / 2 - (apertureCenterX - endingPhotoBase.width / 2) * fullscreenScale,\n this.ports.stage.height / 2 -\n (apertureCenterY - endingPhotoBase.height / 2) * fullscreenScale,\n );\n root.scale.set(fullscreenScale);\n\n const anchorScaleX = photoFrameRect.width / endingPhotoBase.width;\n const anchorScaleY = photoFrameRect.height / endingPhotoBase.height;\n const rotation =\n (this.resolveTuningNumber('visual.ending.photoRotationDeg', -1.5) * Math.PI) / 180;\n const anchorX = photoFrameRect.x + photoFrameRect.width / 2;\n const anchorY = photoFrameRect.y + photoFrameRect.height / 2;\n\n return {\n root,\n mediaBreath,\n target: {\n x: anchorX,\n y: anchorY,\n scaleX: anchorScaleX,\n scaleY: anchorScaleY,\n rotation,\n },\n };\n }\n\n private syncLayout(): void {\n const photoFrameRect = this.resolveTuningRect(\n 'layout.ending.photoFrame',\n this.ports.layout.photoFrame,\n );\n const photoImageRect = this.resolveTuningRect(\n 'layout.ending.photoImageRect',\n this.ports.layout.photoImageRect,\n );\n this.photoFrame.width = endingPhotoBase.width;\n this.photoFrame.height = endingPhotoBase.height;\n this.photoMask\n .clear()\n .roundRect(photoImageRect.x, photoImageRect.y, photoImageRect.width, photoImageRect.height, 5)\n .fill(this.ports.stageColor);\n this.photoAnchor.scale.set(\n photoFrameRect.width / endingPhotoBase.width,\n photoFrameRect.height / endingPhotoBase.height,\n );\n this.photoAnchor.position.set(\n photoFrameRect.x + photoFrameRect.width / 2,\n photoFrameRect.y + photoFrameRect.height / 2,\n );\n this.photoAnchor.rotation =\n (this.resolveTuningNumber('visual.ending.photoRotationDeg', -1.5) * Math.PI) / 180;\n this.configurePhotoGlow();\n this.syncPhotoImageLayout();\n }\n\n private syncPhotoImageLayout(): void {\n if (!this.photoImage) return;\n const photoImageRect = this.resolveTuningRect(\n 'layout.ending.photoImageRect',\n this.ports.layout.photoImageRect,\n );\n const rect = resolveCoverRect(\n { width: this.photoImage.texture.width, height: this.photoImage.texture.height },\n photoImageRect,\n );\n this.photoImage.position.set(rect.x, rect.y);\n this.photoImage.width = rect.width;\n this.photoImage.height = rect.height;\n }\n\n private resolveTuningNumber(path: SessionTuningPath, fallback: number): number {\n const value = this.tuning?.get(path);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n }\n\n private resolveTuningRect(path: SessionTuningPath, fallback: EndingLayoutRect): EndingLayoutRect {\n return this.tuning?.getRect?.(path) ?? fallback;\n }\n\n private configurePhotoGlow(): void {\n this.photoGlow.configure(this.photoAnchor, {\n x: endingPhotoBase.width / 2,\n y: endingPhotoBase.height / 2,\n width: endingPhotoBase.width + 86,\n height: endingPhotoBase.height + 86,\n color: this.ports.paperEdgeColor,\n intensity:\n this.resolveTuningNumber('visual.ending.photoGlowIntensity', 0.56) *\n this.uiHighlightMultiplier,\n softness: 0.58,\n edge: 0.09,\n shape: 'rounded-rect',\n });\n }\n\n private syncActivity(): void {\n if (this.active && this.ticker && this.activity && !this.releaseActivity) {\n this.releaseActivity = this.activity.acquire('ending-ambient');\n this.ticker.add(this.update);\n } else if (!this.active && this.ticker && this.releaseActivity) {\n this.ticker.remove(this.update);\n this.releaseActivity();\n this.releaseActivity = null;\n }\n }\n\n private update = (ticker: Ticker): void => {\n if (!this.active) return;\n this.elapsed += ticker.deltaMS;\n const dustAlpha = this.resolveTuningNumber('visual.ending.dustAlpha', 0.18);\n this.dust.forEach((dust, index) => {\n dust.y -= ticker.deltaMS * (0.002 + index * 0.0002);\n dust.x += Math.sin(this.elapsed * 0.00018 + index * 1.9) * ticker.deltaMS * 0.00045;\n dust.alpha = dustAlpha * (0.48 + 0.52 * Math.sin(this.elapsed * 0.0007 + index) ** 2);\n if (dust.y < 120) dust.y = 960;\n });\n const baseRotation = this.resolveTuningNumber('visual.ending.photoRotationDeg', -1.5);\n const drift = this.resolveTuningNumber('motion.ending.photoDriftAmplitudeDeg', 0.16);\n if (!this.timelineActive) {\n this.photoAnchor.rotation =\n ((baseRotation + Math.sin(this.elapsed * 0.00023) * drift) * Math.PI) / 180;\n }\n this.photoGlow.setProgress(this.elapsed * 0.00005);\n this.requestRender();\n };\n\n destroy(): void {\n if (this.disposed) return;\n this.disposed = true;\n for (const scope of [this.resourceScope])\n void this.assets\n .releaseScope(scope)\n .catch((error) => this.ports.logger.warn('Surface scope release failed', { error }));\n this.reset();\n this.ticker?.remove(this.update);\n this.clearPhoto();\n this.releaseUiHighlight?.();\n this.photoGlow.destroy();\n this.node.destroy({ children: true });\n }\n}\n", "import type { RuntimeLogger } from '@bardway/trpg-media';\nimport type { PixiLayoutRect } from './PixiSessionLayout.js';\nexport interface PreludeSurfaceLayout {\n participantArea: PixiLayoutRect;\n participantPhoto: { width: number; height: number };\n participantFrame: { width: number; height: number };\n participantImageRect: PixiLayoutRect;\n participantLabel: PixiLayoutRect & { fontSize: number };\n modulePhoto: PixiLayoutRect;\n moduleFrame: PixiLayoutRect;\n moduleImageRect: PixiLayoutRect;\n smokeOrigin: { x: number; y: number };\n lampLightArea: PixiLayoutRect;\n}\nexport interface PreludeSurfacePorts {\n logger: RuntimeLogger;\n stage: { width: number; height: number };\n layout: PreludeSurfaceLayout;\n maxParticipants: number;\n portraitColumns: number;\n portraitGap: number;\n typography: ReturnType<typeof createPixiTypography>;\n colors: { desk: string; mask: string; text: string };\n photoColors: { preludeParticipantLabel: string };\n ambient: {\n lamp: {\n baseAlpha: number;\n color: string;\n flickerBurstGapMaxMs: number;\n flickerBurstGapMinMs: number;\n flickerBurstMaxPulses: number;\n flickerBurstMinPulses: number;\n flickerDimming: number;\n flickerDurationMs: number;\n flickerIntervalMaxMs: number;\n flickerIntervalMinMs: number;\n flickerTransitionMs: number;\n };\n smoke: { blurStrength: number; color: string; fillAlpha: number; riseDistance: number };\n };\n}\nimport type {\n BlurFilter,\n ColorMatrixFilter,\n Container,\n Graphics,\n Mesh,\n MeshGeometry,\n Shader,\n Sprite,\n Text,\n Texture,\n Ticker,\n UniformGroup,\n} from 'pixi.js';\nexport interface PreludeParticipant {\n id: string;\n name: string;\n avatarUrl?: string;\n}\n\nimport type { PixiAnimationActivity } from './PixiAnimationActivity.js';\nimport type { PixiAssetManager } from './PixiAssetManager.js';\nimport {\n resizePixiLayoutRectFromCenter,\n resolvePixiLayoutRectAtCenter,\n stablePortraitRotation,\n stableSeededRotation,\n} from './PixiSessionLayout.js';\nimport type { createPixiTypography } from './PixiTypography.js';\nimport type { PixiSceneGraph } from './PixiSceneGraph.js';\nimport {\n createStageSkinSprite,\n type SessionDisplayPreludeFrameTextures,\n} from './PixiSessionSkin.js';\nimport { resolveCoverRect, resolveTopCoverRect } from './PixiMapWorldUtils.js';\nimport { stableRange } from './effects/PixiStableRandom.js';\nimport type { SessionTuningResolver } from './tuning/SessionTuningResolver.js';\nimport { PixiLocalGlowMesh } from './PixiLocalGlowMesh.js';\nimport { resolvePreludeStoryPortraitOrder } from './PixiPreludeStoryTransition.js';\nimport type { PixiMediaBreathBinding, PixiMediaBreathRuntime } from './PixiMediaBreathRuntime.js';\nimport type { PixiVideoBinding, PixiVideoRuntime } from './PixiVideoRuntime.js';\nimport { waitForSessionMediaReady } from '@bardway/trpg-media';\n\ninterface Constructors {\n BlurFilter: typeof BlurFilter;\n ColorMatrixFilter: typeof ColorMatrixFilter;\n Container: typeof Container;\n Graphics: typeof Graphics;\n Mesh: typeof Mesh;\n MeshGeometry: typeof MeshGeometry;\n Shader: typeof Shader;\n Sprite: new (texture?: Texture | import('pixi.js').SpriteOptions) => Sprite;\n Text: new (options: import('pixi.js').TextOptions) => Text;\n UniformGroup: typeof UniformGroup;\n}\n\ninterface ParticipantPhotoNode {\n readonly root: Container;\n readonly frame: Sprite;\n readonly mask: Graphics;\n readonly initial: Text;\n readonly label: Text;\n avatar: Sprite | null;\n avatarKey: string | null;\n loadVersion: number;\n mediaBreath: PixiMediaBreathBinding | null;\n}\n\nexport interface PreludeStoryPortraitProxy {\n readonly id: string;\n readonly root: Container;\n}\n\nexport interface PreludeStoryTransitionArtwork {\n readonly root: Container;\n readonly module: {\n readonly root: Container;\n readonly image: Sprite | null;\n readonly width: number;\n readonly height: number;\n readonly textureSize: { readonly width: number; readonly height: number } | null;\n readonly targetImagePosition: { readonly x: number; readonly y: number } | null;\n readonly targetImageScale: { readonly x: number; readonly y: number } | null;\n };\n readonly portraits: readonly PreludeStoryPortraitProxy[];\n readonly releaseMediaBreath?: () => void;\n}\n\nconst participantPhotoBase = {\n width: 300,\n height: 355,\n};\n\nlet PixiPreludeSurfaceScopeSerial = 0;\nexport class PixiPreludeSurface {\n private disposed = false;\n private readonly resourceScope = `runtime:PixiPreludeSurface:${++PixiPreludeSurfaceScopeSerial}`;\n readonly node: Container;\n readonly modulePhotoAnchor: Container;\n private readonly photos: Container;\n private readonly photosMask: Graphics;\n private readonly photoLampOverlayLayer: Container;\n private readonly photoNodes = new Map<string, ParticipantPhotoNode>();\n private readonly dust: Graphics[] = [];\n private readonly smoke: Graphics[] = [];\n private readonly smokeLayer: Container;\n private readonly smokeBlur: BlurFilter;\n private readonly lampLayer: Container;\n private readonly lampGlow: PixiLocalGlowMesh;\n private readonly photoLampGlow: PixiLocalGlowMesh;\n private readonly backgroundSprite: Sprite | null;\n private readonly ambientFilter: ColorMatrixFilter | null;\n private readonly moduleMask: Graphics;\n private readonly moduleFrame: Sprite;\n private active = false;\n private elapsed = 0;\n private nextLampBurstAt = 0;\n private nextLampPulseAt: number | null = null;\n private lampDimUntil = 0;\n private lampBurstPulsesRemaining = 0;\n private lampTargetAlpha: number = 0;\n private lampCurrentAlpha: number = 0;\n private ambientRandomStep = 0;\n private releaseActivity: (() => void) | null = null;\n private moduleImage: Sprite | null = null;\n private moduleMediaBreath: PixiMediaBreathBinding | null = null;\n private moduleVideoBinding: PixiVideoBinding | null = null;\n private moduleMediaReady: Promise<boolean> | null = null;\n private moduleMediaFailed = false;\n private moduleKey: string | null = null;\n private moduleVersion = 0;\n private participants: PreludeParticipant[] = [];\n private storyTransitionActive = false;\n private uiHighlightMultiplier = 1;\n private readonly releaseUiHighlight: (() => void) | null;\n\n constructor(\n scene: PixiSceneGraph,\n private readonly assets: PixiAssetManager,\n private readonly constructors: Constructors,\n private readonly ticker: Ticker,\n private readonly activity: PixiAnimationActivity,\n private readonly requestRender: () => void,\n skinTexture: Texture | null,\n private readonly ports: PreludeSurfacePorts,\n private readonly frameTextures: SessionDisplayPreludeFrameTextures = {\n moduleFrame: null,\n playerFrame: null,\n },\n private tuning?: SessionTuningResolver,\n private readonly mediaBreath?: PixiMediaBreathRuntime,\n private readonly videoRuntime?: PixiVideoRuntime,\n ) {\n this.lampTargetAlpha = this.ports.ambient.lamp.baseAlpha;\n this.lampCurrentAlpha = this.lampTargetAlpha;\n this.releaseUiHighlight =\n mediaBreath?.subscribeUiHighlight((frame) => {\n this.uiHighlightMultiplier = frame.uiHighlightMultiplier;\n }) ?? null;\n this.node = new constructors.Container();\n this.backgroundSprite = skinTexture\n ? createStageSkinSprite(constructors.Sprite, skinTexture, this.ports.stage)\n : null;\n this.ambientFilter = this.backgroundSprite ? new constructors.ColorMatrixFilter() : null;\n if (this.backgroundSprite && this.ambientFilter) {\n this.backgroundSprite.filters = [this.ambientFilter];\n }\n const fallback = new constructors.Graphics()\n .rect(0, 0, this.ports.stage.width, this.ports.stage.height)\n .fill(this.ports.colors.desk);\n fallback.visible = !this.backgroundSprite;\n this.photos = new constructors.Container({ sortableChildren: true });\n this.photosMask = new constructors.Graphics();\n this.photos.mask = this.photosMask;\n this.photoLampOverlayLayer = new constructors.Container();\n this.photoLampOverlayLayer.eventMode = 'none';\n this.photoLampOverlayLayer.zIndex = 10_000;\n this.photos.addChild(this.photoLampOverlayLayer);\n this.modulePhotoAnchor = new constructors.Container();\n const moduleFrame = this.resolveModuleFrame();\n this.modulePhotoAnchor.pivot.set(moduleFrame.width / 2, moduleFrame.height / 2);\n this.modulePhotoAnchor.position.set(\n moduleFrame.x + moduleFrame.width / 2,\n moduleFrame.y + moduleFrame.height / 2,\n );\n this.moduleFrame = new constructors.Sprite(frameTextures.moduleFrame ?? undefined);\n this.moduleFrame.visible = Boolean(frameTextures.moduleFrame);\n this.moduleFrame.width = moduleFrame.width;\n this.moduleFrame.height = moduleFrame.height;\n const moduleImageRect = this.resolveModuleImageRect();\n this.moduleMask = new constructors.Graphics()\n .roundRect(\n moduleImageRect.x,\n moduleImageRect.y,\n moduleImageRect.width,\n moduleImageRect.height,\n 3,\n )\n .fill(this.ports.colors.mask);\n this.modulePhotoAnchor.addChild(this.moduleFrame, this.moduleMask);\n this.lampLayer = new constructors.Container();\n this.lampLayer.eventMode = 'none';\n this.lampGlow = new PixiLocalGlowMesh(constructors, 'prelude-local-lamp-glow');\n this.photoLampGlow = new PixiLocalGlowMesh(constructors, 'prelude-photo-lamp-overlay');\n this.lampCurrentAlpha = this.resolveTuningNumber(\n 'visual.prelude.lampAlpha',\n this.ports.ambient.lamp.baseAlpha,\n );\n this.configureLampGlow();\n this.smokeLayer = new constructors.Container();\n this.smokeBlur = new constructors.BlurFilter({\n strength: this.ports.ambient.smoke.blurStrength,\n quality: 2,\n kernelSize: 7,\n });\n this.smokeLayer.filters = [this.smokeBlur];\n for (let index = 0; index < 12; index += 1) {\n const particle = new constructors.Graphics().circle(0, 0, 1 + (index % 2)).fill({\n color: this.ports.colors.text,\n alpha: 0.055 + (index % 3) * 0.014,\n });\n particle.position.set(180 + ((index * 137) % 1380), 110 + ((index * 193) % 760));\n this.dust.push(particle);\n }\n for (let index = 0; index < 4; index += 1) {\n const plume = new constructors.Graphics()\n .ellipse(-10, 4, 14 + index * 2, 22 + index * 3)\n .fill({\n color: this.ports.ambient.smoke.color,\n alpha: this.ports.ambient.smoke.fillAlpha,\n })\n .ellipse(8, -9, 11 + index * 2, 19 + index * 2)\n .fill({\n color: this.ports.ambient.smoke.color,\n alpha: this.ports.ambient.smoke.fillAlpha * 0.82,\n })\n .ellipse(-3, -22, 9 + index, 16 + index * 2)\n .fill({\n color: this.ports.ambient.smoke.color,\n alpha: this.ports.ambient.smoke.fillAlpha * 0.64,\n });\n plume.position.set(\n this.ports.layout.smokeOrigin.x,\n this.ports.layout.smokeOrigin.y + 18 - index * 39,\n );\n this.smoke.push(plume);\n this.smokeLayer.addChild(plume);\n }\n this.node.addChild(\n ...(this.backgroundSprite ? [this.backgroundSprite] : []),\n fallback,\n this.lampLayer,\n this.photos,\n this.photosMask,\n this.modulePhotoAnchor,\n ...this.dust,\n this.smokeLayer,\n );\n scene.backgroundLayer.addChild(this.node);\n this.node.visible = false;\n }\n\n sync(\n participants: PreludeParticipant[],\n moduleImageUrl: string | null,\n moduleVideoUrlOrVisible: string | null | boolean,\n visibleValue?: boolean,\n ): void {\n const moduleVideoUrl =\n typeof moduleVideoUrlOrVisible === 'boolean' ? null : moduleVideoUrlOrVisible;\n const visible =\n typeof moduleVideoUrlOrVisible === 'boolean'\n ? moduleVideoUrlOrVisible\n : Boolean(visibleValue);\n this.participants = participants.slice(0, this.ports.maxParticipants);\n this.syncLayout();\n this.node.visible = visible;\n this.active = visible;\n this.syncActivity();\n if (!visible) {\n this.moduleVideoBinding?.deactivate(true);\n return;\n }\n this.syncParticipants(this.participants);\n this.loadModuleImage(moduleImageUrl, moduleVideoUrl);\n this.requestRender();\n }\n\n updateTuning(tuning: SessionTuningResolver | undefined): void {\n this.tuning = tuning;\n this.lampCurrentAlpha = this.resolveTuningNumber(\n 'visual.prelude.lampAlpha',\n this.ports.ambient.lamp.baseAlpha,\n );\n this.syncLayout();\n this.configureLampGlow();\n if (this.active) this.syncParticipants(this.participants);\n this.requestRender();\n }\n\n previewAmbient(): void {\n if (!this.active) return;\n this.nextLampBurstAt = this.elapsed;\n this.nextLampPulseAt = null;\n this.smoke.forEach((plume, index) =>\n plume.position.set(\n this.ports.layout.smokeOrigin.x,\n this.ports.layout.smokeOrigin.y + 18 - index * 39,\n ),\n );\n this.requestRender();\n }\n\n createStoryTransitionArtwork(): PreludeStoryTransitionArtwork {\n const mediaBreathBindings: PixiMediaBreathBinding[] = [];\n const root = new this.constructors.Container({\n label: 'prelude-story-transition-artwork',\n sortableChildren: true,\n });\n const moduleProxy = new this.constructors.Container({ label: 'prelude-story-module-proxy' });\n moduleProxy.zIndex = 100;\n const moduleImageRect = this.resolveModuleImageRect();\n let imageProxy: Sprite | null = null;\n let textureSize: { width: number; height: number } | null = null;\n let targetImagePosition: { x: number; y: number } | null = null;\n let targetImageScale: { x: number; y: number } | null = null;\n if (this.moduleImage) {\n const image = new this.constructors.Sprite(this.moduleImage.texture);\n image.position.copyFrom(this.moduleImage.position);\n image.width = this.moduleImage.width;\n image.height = this.moduleImage.height;\n const mask = new this.constructors.Graphics()\n .roundRect(\n moduleImageRect.x,\n moduleImageRect.y,\n moduleImageRect.width,\n moduleImageRect.height,\n 3,\n )\n .fill(this.ports.colors.mask);\n image.mask = mask;\n moduleProxy.addChild(mask);\n moduleProxy.addChild(image);\n if (this.mediaBreath) mediaBreathBindings.push(this.mediaBreath.attach(image, 'primary'));\n imageProxy = image;\n textureSize = {\n width: this.moduleImage.texture.width,\n height: this.moduleImage.texture.height,\n };\n targetImagePosition = { x: moduleImageRect.x, y: moduleImageRect.y };\n targetImageScale = {\n x: moduleImageRect.width / Math.max(1, this.moduleImage.texture.width),\n y: moduleImageRect.height / Math.max(1, this.moduleImage.texture.height),\n };\n }\n const apertureCenter = {\n x: moduleImageRect.x + moduleImageRect.width / 2,\n y: moduleImageRect.y + moduleImageRect.height / 2,\n };\n const offsetX =\n (apertureCenter.x - this.modulePhotoAnchor.pivot.x) * this.modulePhotoAnchor.scale.x;\n const offsetY =\n (apertureCenter.y - this.modulePhotoAnchor.pivot.y) * this.modulePhotoAnchor.scale.y;\n const cos = Math.cos(this.modulePhotoAnchor.rotation);\n const sin = Math.sin(this.modulePhotoAnchor.rotation);\n moduleProxy.pivot.set(apertureCenter.x, apertureCenter.y);\n moduleProxy.position.set(\n this.modulePhotoAnchor.position.x + offsetX * cos - offsetY * sin,\n this.modulePhotoAnchor.position.y + offsetX * sin + offsetY * cos,\n );\n moduleProxy.scale.copyFrom(this.modulePhotoAnchor.scale);\n moduleProxy.rotation = this.modulePhotoAnchor.rotation;\n root.addChild(moduleProxy);\n\n const portraits = resolvePreludeStoryPortraitOrder(\n this.participants.flatMap((participant) => {\n const source = this.photoNodes.get(participant.id);\n if (!source) return [];\n const proxy = new this.constructors.Container({\n label: `prelude-story-portrait-${participant.id}`,\n });\n const frame = new this.constructors.Sprite(source.frame.texture);\n frame.position.copyFrom(source.frame.position);\n frame.width = source.frame.width;\n frame.height = source.frame.height;\n frame.visible = source.frame.visible;\n proxy.addChild(frame);\n const aperture = this.ports.layout.participantImageRect;\n const mask = new this.constructors.Graphics()\n .rect(aperture.x, aperture.y, aperture.width, aperture.height)\n .fill(this.ports.colors.mask);\n if (source.avatar) {\n const avatar = new this.constructors.Sprite(source.avatar.texture);\n avatar.position.copyFrom(source.avatar.position);\n avatar.width = source.avatar.width;\n avatar.height = source.avatar.height;\n avatar.mask = mask;\n proxy.addChild(mask, avatar);\n if (this.mediaBreath) mediaBreathBindings.push(this.mediaBreath.attach(avatar, 'avatar'));\n } else {\n const initial = new this.constructors.Text({\n text: source.initial.text,\n style: source.initial.style,\n });\n initial.anchor.copyFrom(source.initial.anchor);\n initial.position.copyFrom(source.initial.position);\n proxy.addChild(initial);\n }\n const label = new this.constructors.Text({\n text: source.label.text,\n style: source.label.style,\n });\n label.anchor.copyFrom(source.label.anchor);\n label.position.copyFrom(source.label.position);\n proxy.addChild(label);\n proxy.pivot.copyFrom(source.root.pivot);\n proxy.position.copyFrom(source.root.position);\n proxy.scale.copyFrom(source.root.scale);\n proxy.rotation = source.root.rotation;\n proxy.zIndex = 0;\n root.addChild(proxy);\n return [{ id: participant.id, root: proxy }];\n }),\n );\n this.modulePhotoAnchor.visible = false;\n this.storyTransitionActive = true;\n this.syncStoryTransitionPortraitSources();\n return {\n root,\n module: {\n root: moduleProxy,\n image: imageProxy,\n width: moduleImageRect.width,\n height: moduleImageRect.height,\n textureSize,\n targetImagePosition,\n targetImageScale,\n },\n portraits,\n releaseMediaBreath: () => mediaBreathBindings.forEach((binding) => binding.release()),\n };\n }\n\n restoreStoryTransitionPose(): void {\n this.storyTransitionActive = false;\n this.node.alpha = 1;\n this.node.visible = this.active;\n this.modulePhotoAnchor.visible = true;\n this.photos.visible = true;\n this.syncParticipants(this.participants);\n this.photoNodes.forEach((photo) => {\n photo.root.alpha = 1;\n });\n }\n\n reset(): void {\n this.active = false;\n this.node.visible = false;\n this.restoreStoryTransitionPose();\n this.moduleVideoBinding?.release();\n this.moduleVideoBinding = null;\n this.moduleKey = null;\n this.moduleVersion += 1;\n this.syncActivity();\n }\n\n destroy(): void {\n if (this.disposed) return;\n this.disposed = true;\n for (const scope of [this.resourceScope])\n void this.assets\n .releaseScope(scope)\n .catch((error) => this.ports.logger.warn('Surface scope release failed', { error }));\n this.reset();\n this.ticker.remove(this.update);\n if (this.backgroundSprite) this.backgroundSprite.filters = null;\n this.ambientFilter?.destroy();\n this.lampGlow.destroy();\n this.photoLampGlow.destroy();\n this.releaseUiHighlight?.();\n this.moduleMediaBreath?.release();\n this.moduleMediaBreath = null;\n this.moduleVideoBinding?.release();\n this.moduleVideoBinding = null;\n for (const photo of this.photoNodes.values()) {\n photo.loadVersion += 1;\n photo.mediaBreath?.release();\n }\n this.photoNodes.clear();\n this.smokeLayer.filters = null;\n this.smokeBlur.destroy();\n this.node.destroy({ children: true });\n }\n\n private syncParticipants(participants: PreludeParticipant[]): void {\n const ids = new Set(participants.map((participant) => participant.id));\n for (const [id, node] of this.photoNodes) {\n if (ids.has(id)) continue;\n node.loadVersion += 1;\n node.mediaBreath?.release();\n node.root.destroy({ children: true });\n this.photoNodes.delete(id);\n }\n const rects = resolvePreludePhotoRects(\n participants.map((participant) => participant.id),\n this.ports.layout,\n {\n maxCount: this.ports.maxParticipants,\n columns: this.ports.portraitColumns,\n gap: this.ports.portraitGap,\n },\n );\n participants.forEach((participant, index) => {\n const node = this.photoNodes.get(participant.id) ?? this.createPhotoNode(participant.id);\n const rect = rects[index]!;\n node.root.pivot.set(participantPhotoBase.width / 2, participantPhotoBase.height / 2);\n node.root.position.set(rect.x + rect.width / 2, rect.y + rect.height / 2);\n node.root.scale.set(\n rect.width / participantPhotoBase.width,\n rect.height / participantPhotoBase.height,\n );\n node.root.rotation = (stablePortraitRotation(participant.id) * Math.PI) / 180;\n node.root.zIndex = index;\n node.label.text = participant.name;\n node.initial.text = participant.name.trim().slice(0, 1) || '?';\n this.syncParticipantAvatar(node, participant);\n });\n this.syncStoryTransitionPortraitSources();\n }\n\n private createPhotoNode(id: string): ParticipantPhotoNode {\n const root = new this.constructors.Container();\n const frame = new this.constructors.Sprite(this.frameTextures.playerFrame ?? undefined);\n frame.visible = Boolean(this.frameTextures.playerFrame);\n frame.width = participantPhotoBase.width;\n frame.height = participantPhotoBase.height;\n const mask = new this.constructors.Graphics()\n .rect(\n this.ports.layout.participantImageRect.x,\n this.ports.layout.participantImageRect.y,\n this.ports.layout.participantImageRect.width,\n this.ports.layout.participantImageRect.height,\n )\n .fill(this.ports.colors.mask);\n const initial = new this.constructors.Text({\n text: '',\n style: this.ports.typography.sceneTitle,\n });\n initial.anchor.set(0.5);\n initial.position.set(\n participantPhotoBase.width / 2,\n this.ports.layout.participantImageRect.y + this.ports.layout.participantImageRect.height / 2,\n );\n const label = new this.constructors.Text({\n text: '',\n style: {\n ...this.ports.typography.caption,\n fill: this.ports.photoColors.preludeParticipantLabel,\n fontSize: 15,\n fontWeight: 'bold',\n },\n });\n label.anchor.set(0.5, 0.5);\n label.position.set(\n this.ports.layout.participantLabel.x + this.ports.layout.participantLabel.width / 2,\n this.ports.layout.participantLabel.y + this.ports.layout.participantLabel.height / 2,\n );\n root.addChild(frame, initial, mask, label);\n this.photos.addChild(root);\n const node = {\n root,\n frame,\n mask,\n initial,\n label,\n avatar: null,\n avatarKey: null,\n loadVersion: 0,\n mediaBreath: null,\n };\n this.photoNodes.set(id, node);\n return node;\n }\n\n private syncParticipantAvatar(node: ParticipantPhotoNode, participant: PreludeParticipant): void {\n const avatarUrl = participant.avatarUrl;\n if (!avatarUrl) {\n node.loadVersion += 1;\n node.mediaBreath?.release();\n node.mediaBreath = null;\n node.avatar?.destroy();\n node.avatar = null;\n node.avatarKey = null;\n node.mask.visible = false;\n node.initial.visible = !this.storyTransitionActive;\n return;\n }\n if (node.avatarKey === avatarUrl && node.avatar) return;\n node.mediaBreath?.release();\n node.mediaBreath = null;\n node.avatar?.destroy();\n node.avatar = null;\n node.mask.visible = false;\n node.initial.visible = !this.storyTransitionActive;\n node.avatarKey = avatarUrl;\n const version = ++node.loadVersion;\n void this.assets\n .loadTexture(\n `prelude-participant:${participant.id}:${avatarUrl}`,\n avatarUrl,\n this.resourceScope,\n )\n .then((texture) => {\n if (\n node.loadVersion !== version ||\n node.avatarKey !== avatarUrl ||\n this.photoNodes.get(participant.id) !== node\n ) {\n return;\n }\n node.mediaBreath?.release();\n node.mediaBreath = null;\n node.avatar?.destroy();\n const avatar = new this.constructors.Sprite(texture);\n const rect = resolveTopCoverRect(\n { width: texture.width, height: texture.height },\n this.ports.layout.participantImageRect,\n );\n avatar.position.set(rect.x, rect.y);\n avatar.width = rect.width;\n avatar.height = rect.height;\n node.mask.visible = !this.storyTransitionActive;\n avatar.mask = node.mask;\n node.root.addChildAt(avatar, 2);\n node.avatar = avatar;\n node.mediaBreath = this.mediaBreath?.attach(avatar, 'avatar') ?? null;\n avatar.visible = !this.storyTransitionActive;\n node.initial.visible = false;\n this.requestRender();\n })\n .catch(() => undefined);\n }\n\n private syncStoryTransitionPortraitSources(): void {\n this.photos.visible = true;\n const contentVisible = !this.storyTransitionActive;\n for (const node of this.photoNodes.values()) {\n node.frame.visible = Boolean(this.frameTextures.playerFrame);\n node.mask.visible = contentVisible && Boolean(node.avatar);\n node.label.visible = true;\n node.initial.visible = contentVisible && !node.avatar;\n if (node.avatar) node.avatar.visible = contentVisible;\n }\n }\n\n private loadModuleImage(imageUrl: string | null, videoUrl: string | null): void {\n const moduleKey = imageUrl ? `${imageUrl}\\u0000${videoUrl ?? ''}` : null;\n if (this.moduleKey === moduleKey) {\n if (this.active) void this.moduleVideoBinding?.activate(false);\n return;\n }\n this.moduleKey = moduleKey;\n const version = ++this.moduleVersion;\n this.moduleMediaFailed = false;\n this.moduleMediaReady = null;\n this.moduleMediaBreath?.release();\n this.moduleMediaBreath = null;\n this.moduleVideoBinding?.release();\n this.moduleVideoBinding = null;\n this.moduleImage?.destroy();\n this.moduleImage = null;\n if (!imageUrl) {\n this.modulePhotoAnchor.rotation = 0;\n return;\n }\n this.modulePhotoAnchor.rotation =\n (stableSeededRotation(imageUrl, 5, 'prelude-module') * Math.PI) / 180;\n this.moduleMediaReady = this.assets\n .loadTexture(`prelude-module:${imageUrl}`, imageUrl, this.resourceScope)\n .then(async (texture) => {\n if (version !== this.moduleVersion || this.moduleKey !== moduleKey) return false;\n if (!this.active) {\n this.moduleKey = null;\n return false;\n }\n const image = new this.constructors.Sprite(texture);\n const contentRect = this.resolveModuleImageRect();\n const rect = resolveCoverRect(\n { width: texture.width, height: texture.height },\n contentRect,\n );\n image.position.set(rect.x, rect.y);\n image.width = rect.width;\n image.height = rect.height;\n image.mask = this.moduleMask;\n this.modulePhotoAnchor.addChild(image);\n this.moduleImage = image;\n this.moduleMediaBreath = this.mediaBreath?.attach(image, 'primary') ?? null;\n this.requestRender();\n return videoUrl\n ? this.upgradeModuleImageToVideo(image, videoUrl, moduleKey ?? imageUrl, version)\n : true;\n })\n .catch(() => {\n if (version === this.moduleVersion) this.moduleKey = null;\n return false;\n })\n .then((ready) => {\n if (version === this.moduleVersion) this.moduleMediaFailed = !ready;\n return ready;\n });\n }\n\n async waitForVideoReady(\n imageUrl: string | null,\n videoUrl: string,\n signal: AbortSignal,\n ): Promise<boolean> {\n if (!this.active || !imageUrl || signal.aborted) return Promise.resolve(false);\n if (this.moduleVideoBinding && !this.moduleMediaFailed) {\n const binding = this.moduleVideoBinding;\n const ready = await waitForSessionMediaReady(binding.activate(false), signal);\n if (!ready && !signal.aborted && this.moduleVideoBinding === binding)\n this.moduleMediaFailed = true;\n return ready;\n }\n if (this.moduleMediaFailed) this.moduleKey = null;\n this.loadModuleImage(imageUrl, videoUrl);\n return waitForSessionMediaReady(this.moduleMediaReady, signal);\n }\n\n private async upgradeModuleImageToVideo(\n image: Sprite,\n videoUrl: string,\n moduleKey: string,\n version: number,\n ): Promise<boolean> {\n if (!this.videoRuntime) return false;\n const posterTexture = image.texture;\n try {\n const binding = await this.videoRuntime.loadBinding({\n alias: `prelude-module-video:${moduleKey}`,\n videoUrl,\n scope: this.resourceScope,\n onPlaybackFailure: () => {\n if (this.moduleImage === image) {\n image.texture = posterTexture;\n this.moduleVideoBinding = null;\n this.moduleMediaFailed = true;\n this.requestRender();\n }\n },\n });\n if (\n !this.active ||\n version !== this.moduleVersion ||\n this.moduleKey !== moduleKey ||\n this.moduleImage !== image\n ) {\n binding.release();\n return false;\n }\n const activated = await binding.activate(true);\n if (\n !activated ||\n !this.active ||\n version !== this.moduleVersion ||\n this.moduleImage !== image\n ) {\n binding.release();\n return false;\n }\n this.moduleVideoBinding?.release();\n this.moduleVideoBinding = binding;\n image.texture = binding.texture;\n this.requestRender();\n return true;\n } catch {\n // The WebP poster remains visible.\n return false;\n }\n }\n\n private syncActivity(): void {\n if (this.active && !this.releaseActivity) {\n this.releaseActivity = this.activity.acquire('prelude-ambient');\n this.ticker.add(this.update);\n } else if (!this.active && this.releaseActivity) {\n this.ticker.remove(this.update);\n this.releaseActivity();\n this.releaseActivity = null;\n }\n }\n\n private update = (ticker: Ticker): void => {\n if (!this.active) return;\n this.elapsed += ticker.deltaMS;\n this.dust.forEach((particle, index) => {\n particle.y -= ticker.deltaMS * (0.0014 + (index % 4) * 0.00045);\n particle.x += Math.sin(this.elapsed * 0.00016 + index) * ticker.deltaMS * 0.00045;\n if (particle.y < 88) particle.y = 920;\n });\n if (this.nextLampBurstAt === 0) {\n this.nextLampBurstAt = this.elapsed + this.resolveLampFlickerInterval();\n } else if (this.nextLampPulseAt !== null && this.elapsed >= this.nextLampPulseAt) {\n this.triggerLampPulse();\n } else if (this.nextLampPulseAt === null && this.elapsed >= this.nextLampBurstAt) {\n const pulseRange =\n this.ports.ambient.lamp.flickerBurstMaxPulses -\n this.ports.ambient.lamp.flickerBurstMinPulses +\n 1;\n this.lampBurstPulsesRemaining =\n this.ports.ambient.lamp.flickerBurstMinPulses +\n Math.floor(this.nextAmbientRandom(0, pulseRange));\n this.triggerLampPulse();\n }\n const lampBaseAlpha = this.resolveTuningNumber(\n 'visual.prelude.lampAlpha',\n this.ports.ambient.lamp.baseAlpha,\n );\n const lampFlickerDimming = this.resolveTuningNumber(\n 'motion.prelude.lampFlickerDimming',\n this.ports.ambient.lamp.flickerDimming,\n );\n this.lampTargetAlpha =\n this.elapsed < this.lampDimUntil ? lampBaseAlpha - lampFlickerDimming : lampBaseAlpha;\n const lampTransition =\n 1 - Math.exp(-ticker.deltaMS / this.ports.ambient.lamp.flickerTransitionMs);\n this.lampCurrentAlpha += (this.lampTargetAlpha - this.lampCurrentAlpha) * lampTransition;\n this.lampGlow.setIntensity(this.lampCurrentAlpha * 3.2 * this.uiHighlightMultiplier);\n this.lampGlow.setProgress(this.elapsed * 0.00008);\n this.photoLampGlow.setIntensity(\n this.lampCurrentAlpha *\n this.resolveTuningNumber('visual.prelude.lampPhotoOverlayStrength', 0.35) *\n this.uiHighlightMultiplier,\n );\n this.photoLampGlow.setProgress(this.elapsed * 0.00008);\n this.ambientFilter?.brightness(0.992 + Math.sin(this.elapsed * 0.000095) * 0.008, false);\n this.smoke.forEach((plume, index) => {\n plume.y -= ticker.deltaMS * (0.016 + index * 0.0015);\n plume.x =\n this.ports.layout.smokeOrigin.x +\n Math.sin(this.elapsed * 0.00125 + index * 1.7) * (7 + index * 2);\n const travel = this.ports.layout.smokeOrigin.y + 18 - plume.y;\n const progress = Math.min(1, Math.max(0, travel / this.ports.ambient.smoke.riseDistance));\n plume.alpha =\n Math.sin(progress * Math.PI) *\n this.resolveTuningNumber('visual.prelude.smokeAlpha', this.ports.ambient.smoke.fillAlpha);\n const scale = 0.72 + progress * 0.48;\n plume.scale.set(scale, scale * (0.92 + index * 0.025));\n plume.rotation = Math.sin(this.elapsed * 0.00086 + index * 1.3) * 0.12;\n if (travel >= this.ports.ambient.smoke.riseDistance) {\n plume.position.set(this.ports.layout.smokeOrigin.x, this.ports.layout.smokeOrigin.y + 18);\n }\n });\n this.requestRender();\n };\n\n private resolveLampFlickerInterval(): number {\n const min = this.resolveTuningNumber(\n 'motion.prelude.lampFlickerIntervalMinMs',\n this.ports.ambient.lamp.flickerIntervalMinMs,\n );\n const max = Math.max(\n min,\n this.resolveTuningNumber(\n 'motion.prelude.lampFlickerIntervalMaxMs',\n this.ports.ambient.lamp.flickerIntervalMaxMs,\n ),\n );\n return this.nextAmbientRandom(min, max);\n }\n\n private syncLayout(): void {\n this.photosMask\n .clear()\n .roundRect(\n this.ports.layout.participantArea.x,\n this.ports.layout.participantArea.y,\n this.ports.layout.participantArea.width,\n this.ports.layout.participantArea.height,\n 5,\n )\n .fill(this.ports.colors.mask);\n const moduleFrame = this.resolveModuleFrame();\n this.moduleFrame.width = moduleFrame.width;\n this.moduleFrame.height = moduleFrame.height;\n const moduleImageRect = this.resolveModuleImageRect();\n this.moduleMask\n .clear()\n .roundRect(\n moduleImageRect.x,\n moduleImageRect.y,\n moduleImageRect.width,\n moduleImageRect.height,\n 3,\n )\n .fill(this.ports.colors.mask);\n if (this.moduleImage) {\n const rect = resolveCoverRect(\n { width: this.moduleImage.texture.width, height: this.moduleImage.texture.height },\n moduleImageRect,\n );\n this.moduleImage.position.set(rect.x, rect.y);\n this.moduleImage.width = rect.width;\n this.moduleImage.height = rect.height;\n }\n this.photoNodes.forEach((node) => {\n node.frame.width = participantPhotoBase.width;\n node.frame.height = participantPhotoBase.height;\n node.mask\n .clear()\n .rect(\n this.ports.layout.participantImageRect.x,\n this.ports.layout.participantImageRect.y,\n this.ports.layout.participantImageRect.width,\n this.ports.layout.participantImageRect.height,\n )\n .fill(this.ports.colors.mask);\n node.initial.position.set(\n participantPhotoBase.width / 2,\n this.ports.layout.participantImageRect.y +\n this.ports.layout.participantImageRect.height / 2,\n );\n node.label.position.set(\n this.ports.layout.participantLabel.x + this.ports.layout.participantLabel.width / 2,\n this.ports.layout.participantLabel.y + this.ports.layout.participantLabel.height / 2,\n );\n node.label.style.fontSize = this.ports.layout.participantLabel.fontSize;\n node.label.style.fill = this.ports.photoColors.preludeParticipantLabel;\n if (node.avatar) {\n const rect = resolveTopCoverRect(\n { width: node.avatar.texture.width, height: node.avatar.texture.height },\n this.ports.layout.participantImageRect,\n );\n node.avatar.position.set(rect.x, rect.y);\n node.avatar.width = rect.width;\n node.avatar.height = rect.height;\n }\n });\n this.modulePhotoAnchor.pivot.set(moduleFrame.width / 2, moduleFrame.height / 2);\n this.modulePhotoAnchor.scale.set(1);\n this.modulePhotoAnchor.position.set(\n moduleFrame.x + moduleFrame.width / 2,\n moduleFrame.y + moduleFrame.height / 2,\n );\n this.configureLampGlow();\n }\n\n private resolveModuleFrame() {\n return this.ports.layout.moduleFrame;\n }\n\n private resolveModuleImageRect() {\n const scale = Math.max(0.01, this.resolveTuningNumber('visual.prelude.moduleImageScale', 1));\n return resizePixiLayoutRectFromCenter(this.ports.layout.moduleImageRect, {\n width: this.ports.layout.moduleImageRect.width * scale,\n height: this.ports.layout.moduleImageRect.height * scale,\n });\n }\n\n private configureLampGlow(): void {\n const lampLightArea = this.resolveLampLightArea();\n const lampAlpha = this.resolveTuningNumber(\n 'visual.prelude.lampAlpha',\n this.ports.ambient.lamp.baseAlpha,\n );\n const softness = this.resolveTuningNumber('visual.prelude.lampSoftness', 0.94);\n this.lampGlow.configure(this.lampLayer, {\n ...lampLightArea,\n color: this.ports.ambient.lamp.color,\n intensity: lampAlpha * 3.2 * this.uiHighlightMultiplier,\n softness,\n edge: 0.16,\n edgeIntensity: 0,\n shape: 'ellipse',\n });\n this.photoLampGlow.configure(this.photoLampOverlayLayer, {\n ...lampLightArea,\n color: this.ports.ambient.lamp.color,\n intensity:\n lampAlpha *\n this.resolveTuningNumber('visual.prelude.lampPhotoOverlayStrength', 0.35) *\n this.uiHighlightMultiplier,\n softness,\n edge: 0.16,\n edgeIntensity: 0,\n shape: 'ellipse',\n });\n }\n\n private resolveLampLightArea(): {\n x: number;\n y: number;\n width: number;\n height: number;\n } {\n const sizeScale = Math.max(0.01, this.resolveTuningNumber('visual.prelude.lampSizeScale', 1));\n const width = this.ports.layout.lampLightArea.width * sizeScale;\n const height = this.ports.layout.lampLightArea.height * sizeScale;\n return {\n x: this.ports.layout.lampLightArea.x + this.ports.layout.lampLightArea.width / 2,\n y: this.ports.layout.lampLightArea.y + this.ports.layout.lampLightArea.height / 2,\n width,\n height,\n };\n }\n\n private resolveTuningNumber(\n path: `visual.${string}` | `motion.${string}`,\n fallback: number,\n ): number {\n const value = this.tuning?.get(path);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n }\n\n private triggerLampPulse(): void {\n this.lampDimUntil = this.elapsed + this.ports.ambient.lamp.flickerDurationMs;\n this.lampBurstPulsesRemaining -= 1;\n if (this.lampBurstPulsesRemaining === 0) {\n this.nextLampPulseAt = null;\n this.nextLampBurstAt = this.elapsed + this.resolveLampFlickerInterval();\n return;\n }\n const gapRange =\n this.ports.ambient.lamp.flickerBurstGapMaxMs - this.ports.ambient.lamp.flickerBurstGapMinMs;\n this.nextLampPulseAt =\n this.lampDimUntil +\n this.ports.ambient.lamp.flickerBurstGapMinMs +\n this.nextAmbientRandom(0, gapRange);\n }\n\n private nextAmbientRandom(min: number, max: number): number {\n const value = stableRange('prelude-ambient', min, max, this.ambientRandomStep);\n this.ambientRandomStep += 1;\n return value;\n }\n}\n\nexport const resolvePreludePhotoRects = (\n participantIds: readonly string[],\n layout: PreludeSurfaceLayout,\n options: { maxCount: number; columns: number; gap: number },\n): PixiLayoutRect[] => {\n const ids = participantIds.slice(0, options.maxCount);\n const safeCount = ids.length;\n if (safeCount === 0) return [];\n const area = layout.participantArea;\n const columns = Math.min(options.columns, safeCount);\n const rows = Math.ceil(safeCount / columns);\n const { width, height } = layout.participantPhoto;\n const anchorStepX = layout.participantPhoto.width + options.gap;\n const anchorStepY = layout.participantPhoto.height + options.gap;\n const anchorTotalWidth = layout.participantPhoto.width + (columns - 1) * anchorStepX;\n const anchorTotalHeight = layout.participantPhoto.height + (rows - 1) * anchorStepY;\n const anchorStartX = area.x + (area.width - anchorTotalWidth) / 2;\n const anchorStartY = area.y + (area.height - anchorTotalHeight) / 2;\n return ids.map((id, index) => {\n const row = Math.floor(index / columns);\n const itemsInRow = Math.min(columns, safeCount - row * columns);\n const rowOffset = itemsInRow < columns ? anchorStepX / 2 : 0;\n const centerX =\n anchorStartX +\n (index % columns) * anchorStepX +\n rowOffset +\n layout.participantPhoto.width / 2 +\n stableSeededRotation(id, 2, 'prelude-photo-x');\n const centerY =\n anchorStartY +\n row * anchorStepY +\n layout.participantPhoto.height / 2 +\n stableSeededRotation(id, 2, 'prelude-photo-y');\n return resolvePixiLayoutRectAtCenter({ x: centerX, y: centerY }, { width, height });\n });\n};\n", "import type { RuntimeLogger } from '@bardway/trpg-media';\nexport interface PortraitCardLayout {\n cardWidth: number;\n cardHeight: number;\n portrait: PixiLayoutRect;\n blood: { x: number; y: number; size: number };\n infoOffset: { x: number; y: number };\n name: { x: number; y: number; maxWidth: number; minFontSize: number; maxFontSize: number };\n resources: {\n labelX: number;\n valueX: number;\n valueYOffset: number;\n rowY: number;\n rowSpacing: number;\n valueFontSize: number;\n barX: number;\n barYOffset: number;\n barWidth: number;\n barHeight: number;\n tickCount: number;\n };\n}\nexport interface PortraitCardPorts {\n logger: RuntimeLogger;\n layout: PortraitCardLayout;\n resourceSlots: number;\n random(): number;\n typography: ReturnType<typeof createPixiTypography>;\n colors: { mask: string; paper: string; paperEdge: string };\n style: {\n barBackground: string;\n insanityTearGap: string;\n name: string;\n resourceDanger: string;\n resourceFlash: string;\n resourceNormal: string;\n tick: string;\n };\n}\nimport type {\n ColorMatrixFilter,\n Container,\n Filter,\n Graphics,\n Sprite,\n Text,\n Texture,\n UniformGroup,\n} from 'pixi.js';\nimport type { TokenAvatarCrop } from './PixiMapWorldUtils.js';\n\nimport { resolveCroppedCoverRect } from './PixiMapWorldUtils.js';\nimport {\n clampResourceRatio,\n stableSeededRotation,\n type PixiLayoutRect,\n} from './PixiSessionLayout.js';\nimport type { createPixiTypography } from './PixiTypography.js';\nimport type { PixiAssetManager } from './PixiAssetManager.js';\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\nimport {\n createDossierInsanityFilter,\n DOSSIER_INSANITY_MODES,\n type DossierInsanityFilter,\n type DossierInsanityMode,\n} from './PixiInvestigatorDossierInsanityFilter.js';\nimport type { SessionTuningResolver } from './tuning/SessionTuningResolver.js';\nimport { PixiRetainedMeterAnimator } from './PixiRetainedMeterAnimator.js';\nimport type { PixiMediaBreathBinding, PixiMediaBreathRuntime } from './PixiMediaBreathRuntime.js';\n\nexport interface PortraitResource {\n id: string;\n label: string;\n current?: number;\n maximum?: number;\n color: string;\n}\nexport interface PixiPartyMemberState {\n id: string;\n name: string;\n avatarUrl?: string;\n avatarCrop?: TokenAvatarCrop;\n resources: readonly PortraitResource[];\n visualState: Partial<InvestigatorDossierStatus>;\n}\nexport interface InvestigatorDossierStatus {\n stain: boolean;\n distorted: boolean;\n grayscale: boolean;\n}\n\nexport type InvestigatorDossierStatusEntry = 'stain' | 'distorted' | 'grayscale';\n\nexport const resolveInvestigatorDossierStatus = (\n state: Partial<InvestigatorDossierStatus>,\n): InvestigatorDossierStatus => ({\n stain: state.stain === true,\n distorted: state.distorted === true,\n grayscale: state.grayscale === true,\n});\nexport const resolveInvestigatorDossierStatusEntry = (\n previous: InvestigatorDossierStatus,\n next: InvestigatorDossierStatus,\n): InvestigatorDossierStatusEntry | null => {\n if (!previous.grayscale && next.grayscale) return 'grayscale';\n if (!previous.distorted && next.distorted) return 'distorted';\n if (!previous.stain && next.stain) return 'stain';\n return null;\n};\n\nconst normalizeHex = (value: string): [number, number, number] => {\n const parsed = Number.parseInt(value.slice(1), 16);\n return [(parsed >> 16) & 0xff, (parsed >> 8) & 0xff, parsed & 0xff];\n};\n\nconst toHex = ([red, green, blue]: readonly number[]): string =>\n `#${[red, green, blue]\n .map((channel) =>\n Math.max(0, Math.min(255, Math.round(channel)))\n .toString(16)\n .padStart(2, '0'),\n )\n .join('')}`;\n\nexport const resolveDossierResourceValueColor = (\n ratio: number,\n normalColor: string,\n dangerColor: string,\n): string => {\n const safeRatio = Math.max(0, Math.min(1, ratio));\n const dangerWeight = 1 - safeRatio;\n const normal = normalizeHex(normalColor);\n const danger = normalizeHex(dangerColor);\n return toHex(normal.map((channel, index) => channel + (danger[index]! - channel) * dangerWeight));\n};\n\nexport const fitDossierName = (name: string, maxCharacters: number): string => {\n const characters = Array.from(name.trim());\n if (characters.length <= maxCharacters) return characters.join('') || '?';\n return `${characters.slice(0, Math.max(1, maxCharacters - 1)).join('')}\u2026`;\n};\n\nexport const resolveDossierTiltDegrees = (id: string): number => {\n const degrees = stableSeededRotation(id, 3, 'party-hud-dossier');\n if (Math.abs(degrees) >= 0.3) return degrees;\n return (degrees < 0 ? -1 : 1) * 0.3;\n};\n\nexport const resolveDossierInsanityMode = (value: unknown): DossierInsanityMode =>\n typeof value === 'string' && (DOSSIER_INSANITY_MODES as readonly string[]).includes(value)\n ? (value as DossierInsanityMode)\n : 'ripple';\n\nexport const resolveDossierBloodRotationRadians = (random = Math.random): number =>\n Math.max(0, Math.min(1, random())) * Math.PI * 2;\n\nexport const resolveDossierBloodDisplaySize = (\n cardWidth: number,\n layout: PortraitCardLayout,\n): number => layout.blood.size * (cardWidth / layout.cardWidth);\n\nexport const resolveDossierInsanitySeed = (random = Math.random): number =>\n Math.max(0, Math.min(1, random()));\n\ninterface Constructors {\n ColorMatrixFilter: typeof ColorMatrixFilter;\n Container: typeof Container;\n Filter: typeof Filter;\n Graphics: typeof Graphics;\n Sprite: new (texture?: Texture | import('pixi.js').SpriteOptions) => Sprite;\n Text: new (options: import('pixi.js').TextOptions) => Text;\n UniformGroup: typeof UniformGroup;\n}\n\nexport interface PortraitCardTextures {\n background: Texture | null;\n overlay: Texture | null;\n}\n\ninterface DossierCardNode {\n root: Container;\n statusMotion: Container;\n content: Container;\n fallback: Graphics;\n background: Sprite;\n avatarMask: Graphics;\n resources: Graphics;\n resourceFills: readonly Graphics[];\n resourceFlashes: readonly Graphics[];\n resourceMeters: readonly PixiRetainedMeterAnimator[];\n name: Text;\n initial: Text;\n values: readonly DossierResourceValueNode[];\n blood: Sprite;\n avatar: Sprite | null;\n avatarMediaBreath: PixiMediaBreathBinding | null;\n avatarKey: string | null;\n loadVersion: number;\n grayscaleFilter: ColorMatrixFilter;\n insanityFilter: DossierInsanityFilter;\n insanityActive: boolean;\n insanitySeed: number;\n status: InvestigatorDossierStatus;\n statusInitialized: boolean;\n statusAbort: AbortController | null;\n rect: PixiLayoutRect;\n}\n\ninterface DossierResourceValueNode {\n current: Text;\n divider: Text;\n max: Text;\n}\n\nconst hexToUnitRgb = (color: string): Float32Array => {\n const value = Number.parseInt(color.slice(1), 16);\n return new Float32Array([\n ((value >> 16) & 0xff) / 255,\n ((value >> 8) & 0xff) / 255,\n (value & 0xff) / 255,\n ]);\n};\n\nconst numberValue = (\n tuning: SessionTuningResolver | undefined,\n path: Parameters<SessionTuningResolver['get']>[0],\n fallback: number,\n): number => {\n const value = tuning?.get(path);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n};\n\nconst colorValue = (\n tuning: SessionTuningResolver | undefined,\n path: Parameters<SessionTuningResolver['get']>[0],\n fallback: string,\n): string => {\n const value = tuning?.get(path);\n return typeof value === 'string' && /^#[0-9a-f]{6}$/i.test(value) ? value : fallback;\n};\n\nexport const resolveDossierNameColor = (\n tuning: SessionTuningResolver | undefined,\n fallback: string,\n): string => colorValue(tuning, 'visual.partyHud.nameColor', fallback);\n\nlet PixiPortraitResourceCardScopeSerial = 0;\nexport class PixiPortraitResourceCard {\n private disposed = false;\n private readonly resourceScope = `runtime:PixiPortraitResourceCard:${++PixiPortraitResourceCardScopeSerial}`;\n readonly root: Container;\n private readonly node: DossierCardNode;\n private tuning: SessionTuningResolver | undefined;\n private reducedMotion = false;\n\n constructor(\n private readonly id: string,\n private readonly assets: PixiAssetManager,\n private readonly constructors: Constructors,\n private readonly textures: PortraitCardTextures,\n private readonly animation: PixiAnimationDirector,\n private readonly requestRender: () => void,\n private readonly ports: PortraitCardPorts,\n private readonly mediaBreath?: PixiMediaBreathRuntime,\n ) {\n const root = new constructors.Container();\n const statusMotion = new constructors.Container();\n const content = new constructors.Container();\n const fallback = new constructors.Graphics();\n const background = new constructors.Sprite(textures.background ?? undefined);\n const avatarMask = new constructors.Graphics();\n const resources = new constructors.Graphics();\n const resourceFills = Array.from(\n { length: this.ports.resourceSlots },\n () => new constructors.Graphics(),\n );\n const resourceFlashes = Array.from(\n { length: this.ports.resourceSlots },\n () => new constructors.Graphics(),\n );\n const blood = new constructors.Sprite(textures.overlay ?? undefined);\n const name = new constructors.Text({\n text: '',\n style: { ...this.ports.typography.hudSecondary },\n });\n const initial = new constructors.Text({\n text: '',\n style: { ...this.ports.typography.sceneTitle },\n });\n const values = Array.from({ length: this.ports.resourceSlots }).map(() => ({\n current: new constructors.Text({ text: '', style: { ...this.ports.typography.data } }),\n divider: new constructors.Text({ text: ' / ', style: { ...this.ports.typography.data } }),\n max: new constructors.Text({ text: '', style: { ...this.ports.typography.data } }),\n })) as DossierResourceValueNode[];\n const grayscaleFilter = new constructors.ColorMatrixFilter();\n const insanityFilter = createDossierInsanityFilter({\n Filter: constructors.Filter,\n UniformGroup: constructors.UniformGroup,\n tearGapColor: hexToUnitRgb(this.ports.style.insanityTearGap),\n });\n grayscaleFilter.saturate(-1, false);\n grayscaleFilter.enabled = false;\n name.anchor.set(0, 0.5);\n initial.anchor.set(0.5);\n values.forEach((value) => {\n value.current.anchor.set(0, 0.5);\n value.divider.anchor.set(0, 0.5);\n value.max.anchor.set(0, 0.5);\n });\n background.visible = Boolean(textures.background);\n blood.visible = false;\n blood.anchor.set(0.5);\n blood.blendMode = 'multiply';\n content.addChild(\n initial,\n avatarMask,\n resources,\n ...resourceFills,\n ...resourceFlashes,\n ...values.flatMap((value) => [value.current, value.divider, value.max]),\n name,\n );\n // The outer card remains intact during shatter; the wound overlay stays above every card detail.\n statusMotion.addChild(fallback, background, content, blood);\n root.addChild(statusMotion);\n statusMotion.filters = [grayscaleFilter];\n content.filters = [insanityFilter.filter];\n insanityFilter.filter.enabled = false;\n const resourceMeters = resourceFills.map(\n (fill, index) =>\n new PixiRetainedMeterAnimator(\n animation,\n {\n setRatio: (ratio) => {\n fill.scale.x = ratio;\n resourceFlashes[index]!.scale.x = ratio;\n },\n setFlashAlpha: (alpha) => {\n resourceFlashes[index]!.alpha = alpha;\n },\n },\n requestRender,\n ),\n );\n this.root = root;\n this.node = {\n root,\n statusMotion,\n content,\n fallback,\n background,\n avatarMask,\n resources,\n resourceFills,\n resourceFlashes,\n resourceMeters,\n name,\n initial,\n values,\n blood,\n avatar: null,\n avatarMediaBreath: null,\n avatarKey: null,\n loadVersion: 0,\n grayscaleFilter,\n insanityFilter,\n insanityActive: false,\n insanitySeed: 0,\n status: { stain: false, distorted: false, grayscale: false },\n statusInitialized: false,\n statusAbort: null,\n rect: {\n x: 0,\n y: 0,\n width: this.ports.layout.cardWidth,\n height: this.ports.layout.cardHeight,\n },\n };\n }\n\n sync(\n member: PixiPartyMemberState,\n rect: PixiLayoutRect,\n tuning: SessionTuningResolver | undefined,\n ): void {\n const card = this.node;\n this.tuning = tuning;\n const scale = rect.width / this.ports.layout.cardWidth;\n const verticalScale = scale;\n card.rect = rect;\n card.root.pivot.set(rect.width / 2, rect.height / 2);\n card.root.position.set(rect.x + rect.width / 2, rect.y + rect.height / 2);\n card.root.rotation = (resolveDossierTiltDegrees(this.id) * Math.PI) / 180;\n this.drawFallback(rect.width, rect.height);\n card.background.position.set(0, 0);\n card.background.width = rect.width;\n card.background.height = rect.height;\n const portrait = this.ports.layout.portrait;\n const portraitRect = {\n x: portrait.x * scale,\n y: portrait.y * verticalScale,\n width: portrait.width * scale,\n height: portrait.height * verticalScale,\n };\n card.avatarMask\n .clear()\n .roundRect(portraitRect.x, portraitRect.y, portraitRect.width, portraitRect.height, 5)\n .fill(this.ports.colors.mask);\n this.syncName(member.name, scale, verticalScale, tuning);\n this.syncResources(member, scale, verticalScale, tuning);\n const nextStatus = resolveInvestigatorDossierStatus(member.visualState);\n const statusEntry = card.statusInitialized\n ? resolveInvestigatorDossierStatusEntry(card.status, nextStatus)\n : null;\n const removedStatus =\n (card.status.stain && !nextStatus.stain) ||\n (card.status.distorted && !nextStatus.distorted) ||\n (card.status.grayscale && !nextStatus.grayscale);\n card.status = nextStatus;\n card.statusInitialized = true;\n if (removedStatus) this.cancelStatusMotion();\n if (!card.statusAbort || removedStatus || statusEntry) {\n this.syncBlood(rect, tuning);\n this.syncDeath(tuning);\n this.syncInsanity(tuning);\n }\n this.syncAvatar(member, portraitRect);\n if (statusEntry && !this.reducedMotion) this.playStatusEntry(statusEntry);\n }\n\n setReducedMotion(reducedMotion: boolean): void {\n this.reducedMotion = reducedMotion;\n this.node.resourceMeters.forEach((meter) => meter.setReducedMotion(reducedMotion));\n if (reducedMotion) this.cancelStatusMotion();\n }\n\n resetMotion(): void {\n this.cancelStatusMotion();\n this.node.resourceMeters.forEach((meter) => meter.settle());\n }\n\n previewResourceChange(): void {\n const meter = this.node.resourceMeters[0];\n if (!meter) return;\n const target = meter.getSnapshot().targetRatio;\n const previewRatio = target >= 0.4 ? target - 0.35 : Math.min(1, target + 0.35);\n meter.settle(previewRatio);\n meter.sync(target);\n }\n\n previewStatus(status: InvestigatorDossierStatusEntry): void {\n if (!this.reducedMotion) this.playStatusEntry(status);\n }\n\n destroy(): void {\n if (this.disposed) return;\n this.disposed = true;\n for (const scope of [this.resourceScope])\n void this.assets\n .releaseScope(scope)\n .catch((error) => this.ports.logger.warn('Surface scope release failed', { error }));\n this.node.loadVersion += 1;\n this.cancelStatusMotion();\n this.node.resourceMeters.forEach((meter) => meter.destroy());\n this.node.grayscaleFilter.destroy();\n this.node.insanityFilter.destroy();\n this.node.avatarMediaBreath?.release();\n this.root.destroy({ children: true });\n }\n\n private drawFallback(width: number, height: number): void {\n this.node.fallback\n .clear()\n .roundRect(0, 0, width, height, 5)\n .fill({ color: this.ports.colors.paper, alpha: 0.92 })\n .stroke({ color: this.ports.colors.paperEdge, width: 1, alpha: 0.8 });\n this.node.fallback.visible = !this.node.background.visible;\n }\n\n private syncName(\n name: string,\n scale: number,\n verticalScale: number,\n tuning: SessionTuningResolver | undefined,\n ): void {\n const settings = this.ports.layout.name;\n const text = this.node.name;\n const maxWidth = settings.maxWidth * scale;\n let fontSize = settings.maxFontSize * Math.min(scale, verticalScale);\n text.text = name.trim() || '?';\n while (\n text.width > maxWidth &&\n fontSize > settings.minFontSize * Math.min(scale, verticalScale)\n ) {\n fontSize -= 1;\n text.style.fontSize = fontSize;\n }\n if (text.width > maxWidth) {\n const approximateCharacters = Math.max(\n 2,\n Math.floor((maxWidth / text.width) * text.text.length),\n );\n text.text = fitDossierName(text.text, approximateCharacters);\n }\n text.style.fontSize = fontSize;\n text.style.fill = resolveDossierNameColor(tuning, this.ports.style.name);\n text.position.set(\n (settings.x + this.ports.layout.infoOffset.x) * scale,\n (settings.y + this.ports.layout.infoOffset.y) * verticalScale,\n );\n }\n\n private syncResources(\n member: PixiPartyMemberState,\n scale: number,\n verticalScale: number,\n tuning: SessionTuningResolver | undefined,\n ): void {\n if (member.resources.length > this.ports.resourceSlots)\n throw new Error('Resource rows exceed configured portrait card slots');\n const resources = member.resources.map((row) => ({\n current: row.current,\n max: row.maximum,\n color: row.color,\n }));\n for (let index = resources.length; index < this.node.resourceFills.length; index++) {\n this.node.resourceFills[index]!.visible = false;\n this.node.resourceFlashes[index]!.visible = false;\n const value = this.node.values[index]!;\n value.current.visible = false;\n value.divider.visible = false;\n value.max.visible = false;\n }\n const settings = this.ports.layout.resources;\n const background = colorValue(\n tuning,\n 'visual.partyHud.barBackground',\n this.ports.style.barBackground,\n );\n const tick = colorValue(tuning, 'visual.partyHud.tick', this.ports.style.tick);\n const normal = colorValue(\n tuning,\n 'visual.partyHud.normalColor',\n this.ports.style.resourceNormal,\n );\n const danger = colorValue(\n tuning,\n 'visual.partyHud.dangerColor',\n this.ports.style.resourceDanger,\n );\n const flashAlpha = numberValue(tuning, 'visual.partyHud.resourceFlashAlpha', 0.82);\n const meterOptions = {\n flashDuration: Math.max(\n 0,\n numberValue(tuning, 'motion.partyHud.resourceFlashDuration', 0.12),\n ),\n transitionDuration: Math.max(\n 0,\n numberValue(tuning, 'motion.partyHud.resourceTransitionDuration', 0.36),\n ),\n };\n const graphics = this.node.resources.clear();\n resources.forEach((resource, index) => {\n const ratio = clampResourceRatio(resource.current, resource.max);\n const rowY =\n (settings.rowY + index * settings.rowSpacing + this.ports.layout.infoOffset.y) *\n verticalScale;\n const barX = (settings.barX + this.ports.layout.infoOffset.x) * scale;\n const barY = rowY + settings.barYOffset * verticalScale;\n const barWidth = settings.barWidth * scale;\n const barHeight = settings.barHeight * verticalScale;\n graphics\n .roundRect(barX, barY, barWidth, barHeight, 1)\n .fill({ color: background, alpha: 0.72 });\n const fill = this.node.resourceFills[index]!;\n fill.visible = true;\n fill\n .clear()\n .roundRect(0, 0, barWidth, barHeight, 1)\n .fill({ color: resource.color, alpha: 0.92 });\n fill.position.set(barX, barY);\n const flash = this.node.resourceFlashes[index]!;\n flash\n .clear()\n .roundRect(0, 0, barWidth, barHeight, 1)\n .fill({ color: this.ports.style.resourceFlash, alpha: flashAlpha });\n flash.position.set(barX, barY);\n for (let tickIndex = 1; tickIndex < settings.tickCount; tickIndex += 1) {\n const tickX = barX + (barWidth * tickIndex) / settings.tickCount;\n graphics.rect(tickX, barY, 1, barHeight).fill({ color: tick, alpha: 0.42 });\n }\n const value = this.node.values[index]!;\n value.current.visible = true;\n value.divider.visible = true;\n value.max.visible = true;\n const fontSize = settings.valueFontSize * Math.min(scale, verticalScale);\n const valueX = (settings.valueX + this.ports.layout.infoOffset.x) * scale;\n const valueY = rowY + settings.valueYOffset * verticalScale;\n value.current.text = String(resource.current ?? 0);\n value.current.style.fontSize = fontSize;\n value.current.style.fill = resolveDossierResourceValueColor(ratio, normal, danger);\n value.current.position.set(valueX, valueY);\n value.divider.style.fontSize = fontSize;\n value.divider.style.fill = normal;\n value.divider.position.set(valueX + value.current.width, valueY);\n value.max.text = String(resource.max ?? 0);\n value.max.style.fontSize = fontSize;\n value.max.style.fill = normal;\n value.max.position.set(value.divider.x + value.divider.width, valueY);\n const meter = this.node.resourceMeters[index]!;\n meter.updateOptions(meterOptions);\n meter.sync(ratio);\n });\n }\n\n private syncBlood(rect: PixiLayoutRect, tuning: SessionTuningResolver | undefined): void {\n const status = this.node.status;\n const blood = this.node.blood;\n const wasVisible = blood.visible;\n blood.visible = status.stain && !status.grayscale && Boolean(this.textures.overlay);\n if (!blood.visible) return;\n const strength = numberValue(tuning, 'visual.partyHud.blood.strength', 0.78);\n blood.alpha = numberValue(tuning, 'visual.partyHud.blood.opacity', 0.42) * strength;\n const size = resolveDossierBloodDisplaySize(rect.width, this.ports.layout);\n blood.width = size;\n blood.height = size;\n blood.position.set(\n this.ports.layout.blood.x * (rect.width / this.ports.layout.cardWidth) + size / 2,\n this.ports.layout.blood.y * (rect.height / this.ports.layout.cardHeight) + size / 2,\n );\n if (!wasVisible) blood.rotation = resolveDossierBloodRotationRadians(this.ports.random);\n }\n\n private syncAvatar(member: PixiPartyMemberState, portraitRect: PixiLayoutRect): void {\n const card = this.node;\n card.initial.position.set(\n portraitRect.x + portraitRect.width / 2,\n portraitRect.y + portraitRect.height / 2,\n );\n card.initial.text = member.name.trim().slice(0, 1) || '?';\n if (!member.avatarUrl) {\n card.loadVersion += 1;\n card.avatarMediaBreath?.release();\n card.avatarMediaBreath = null;\n card.avatar?.destroy();\n card.avatar = null;\n card.avatarKey = null;\n card.avatarMask.visible = false;\n card.initial.visible = true;\n return;\n }\n const avatarKey = JSON.stringify([member.avatarUrl, member.avatarCrop ?? null]);\n if (card.avatarKey === avatarKey && card.avatar) {\n this.applyAvatarGeometry(card.avatar, member, portraitRect);\n return;\n }\n card.avatarMediaBreath?.release();\n card.avatarMediaBreath = null;\n card.avatar?.destroy();\n card.avatar = null;\n card.avatarMask.visible = false;\n card.initial.visible = true;\n card.avatarKey = avatarKey;\n const version = ++card.loadVersion;\n void this.assets\n .loadTexture(`party:${this.id}:${member.avatarUrl}`, member.avatarUrl, this.resourceScope)\n .then((texture) => {\n if (card.loadVersion !== version || card.avatarKey !== avatarKey) return;\n card.avatarMediaBreath?.release();\n card.avatarMediaBreath = null;\n card.avatar?.destroy();\n const avatar = new this.constructors.Sprite(texture);\n this.applyAvatarGeometry(avatar, member, portraitRect);\n card.avatarMask.visible = true;\n avatar.mask = card.avatarMask;\n card.content.addChildAt(avatar, 4);\n card.avatar = avatar;\n card.avatarMediaBreath = this.mediaBreath?.attach(avatar, 'avatar') ?? null;\n card.initial.visible = false;\n this.requestRender();\n })\n .catch(() => {\n if (card.loadVersion === version) card.avatarKey = null;\n });\n }\n\n private applyAvatarGeometry(\n avatar: Sprite,\n member: PixiPartyMemberState,\n portraitRect: PixiLayoutRect,\n ): void {\n const rect = resolveCroppedCoverRect(\n { width: avatar.texture.width, height: avatar.texture.height },\n portraitRect,\n member.avatarCrop,\n );\n avatar.position.set(rect.x, rect.y);\n avatar.width = rect.width;\n avatar.height = rect.height;\n }\n\n private syncInsanity(tuning: SessionTuningResolver | undefined): void {\n const card = this.node;\n const filter = card.insanityFilter.filter;\n const enabled = card.status.distorted && !card.status.grayscale;\n filter.enabled = enabled;\n if (enabled && !card.insanityActive)\n card.insanitySeed = resolveDossierInsanitySeed(this.ports.random);\n card.insanityActive = enabled;\n if (!enabled) return;\n card.insanityFilter.update(\n resolveDossierInsanityMode(tuning?.get('visual.partyHud.distorted.mode')),\n numberValue(tuning, 'visual.partyHud.distorted.intensity', 0.65),\n card.insanitySeed,\n );\n }\n\n private syncDeath(tuning: SessionTuningResolver | undefined): void {\n const filter = this.node.grayscaleFilter;\n filter.reset();\n filter.saturate(-1, false);\n filter.brightness(numberValue(tuning, 'visual.partyHud.grayscale.brightness', 0.62), true);\n filter.enabled = this.node.status.grayscale;\n filter.alpha = numberValue(tuning, 'visual.partyHud.grayscale.grayscale', 0.9);\n }\n\n private playStatusEntry(status: InvestigatorDossierStatusEntry): void {\n this.cancelStatusMotion();\n const controller = new AbortController();\n this.node.statusAbort = controller;\n const task =\n status === 'grayscale'\n ? this.playDeathEntry(controller.signal)\n : status === 'distorted'\n ? this.playInsanityEntry(controller.signal)\n : this.playMajorWoundEntry(controller.signal);\n void task.finally(() => {\n if (this.node.statusAbort !== controller) return;\n this.node.statusAbort = null;\n this.restoreStatusVisuals();\n this.requestRender();\n });\n }\n\n private async playMajorWoundEntry(signal: AbortSignal): Promise<void> {\n const intensity = numberValue(this.tuning, 'visual.partyHud.status.stainIntensity', 1);\n const duration = Math.max(\n 0,\n numberValue(this.tuning, 'motion.partyHud.status.stainDuration', 0.52),\n );\n const direction = resolveDossierTiltDegrees(this.id) < 0 ? -1 : 1;\n const motion = this.node.statusMotion;\n const blood = this.node.blood;\n const finalBloodAlpha =\n numberValue(this.tuning, 'visual.partyHud.blood.opacity', 0.42) *\n numberValue(this.tuning, 'visual.partyHud.blood.strength', 0.78);\n motion.position.set(direction * 8 * intensity, 0);\n motion.rotation = (direction * 1.2 * intensity * Math.PI) / 180;\n if (this.textures.overlay) {\n blood.visible = true;\n blood.alpha = finalBloodAlpha * 0.2;\n }\n await Promise.all([\n this.animation.tween(\n motion.position,\n { x: 0, duration, ease: 'power3.out', onUpdate: this.requestRender },\n signal,\n ),\n this.animation.tween(\n motion,\n { rotation: 0, duration, ease: 'power3.out', onUpdate: this.requestRender },\n signal,\n ),\n blood.visible\n ? this.animation.tween(\n blood,\n { alpha: finalBloodAlpha, duration, ease: 'power2.out', onUpdate: this.requestRender },\n signal,\n )\n : Promise.resolve(),\n ]);\n }\n\n private async playInsanityEntry(signal: AbortSignal): Promise<void> {\n const intensity = numberValue(this.tuning, 'visual.partyHud.status.distortedIntensity', 1);\n const duration = Math.max(\n 0,\n numberValue(this.tuning, 'motion.partyHud.status.distortedDuration', 0.48),\n );\n const motion = this.node.statusMotion;\n const filter = this.node.insanityFilter.filter;\n const mode = resolveDossierInsanityMode(this.tuning?.get('visual.partyHud.distorted.mode'));\n const baseIntensity = numberValue(this.tuning, 'visual.partyHud.distorted.intensity', 0.65);\n const filterState = { intensity: baseIntensity * (1 + 0.35 * intensity) };\n filter.enabled = true;\n this.node.insanityFilter.update(mode, filterState.intensity, this.node.insanitySeed);\n motion.position.set(0, 0);\n await this.animation.tween(\n filterState,\n {\n intensity: baseIntensity,\n duration,\n ease: 'power2.out',\n onUpdate: () => {\n this.node.insanityFilter.update(mode, filterState.intensity, this.node.insanitySeed);\n this.requestRender();\n },\n },\n signal,\n );\n }\n\n private async playDeathEntry(signal: AbortSignal): Promise<void> {\n const intensity = numberValue(this.tuning, 'visual.partyHud.status.grayscaleIntensity', 1);\n const duration = Math.max(\n 0,\n numberValue(this.tuning, 'motion.partyHud.status.grayscaleDuration', 0.64),\n );\n const motion = this.node.statusMotion;\n const filter = this.node.grayscaleFilter;\n const finalAlpha = numberValue(this.tuning, 'visual.partyHud.grayscale.grayscale', 0.9);\n const filterState = { alpha: 0 };\n filter.enabled = true;\n filter.alpha = 0;\n motion.position.set(0, 0);\n motion.scale.set(1 + 0.015 * intensity);\n await Promise.all([\n this.animation.sequence(\n [\n () =>\n this.animation.tween(\n motion.position,\n {\n y: 10 * intensity,\n duration: duration * 0.375,\n ease: 'power2.in',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n () =>\n this.animation.tween(\n motion.position,\n {\n y: 0,\n duration: duration * 0.625,\n ease: 'power3.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n ],\n signal,\n ),\n this.animation.tween(\n motion.scale,\n {\n x: 1,\n y: 1,\n duration,\n ease: 'power3.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.animation.tween(\n filterState,\n {\n alpha: finalAlpha,\n duration,\n ease: 'power2.out',\n onUpdate: () => {\n filter.alpha = filterState.alpha;\n this.requestRender();\n },\n },\n signal,\n ),\n ]);\n }\n\n private cancelStatusMotion(): void {\n this.node.statusAbort?.abort();\n this.node.statusAbort = null;\n this.restoreStatusVisuals();\n }\n\n private restoreStatusVisuals(): void {\n const motion = this.node.statusMotion;\n motion.position.set(0, 0);\n motion.scale.set(1);\n motion.rotation = 0;\n motion.alpha = 1;\n this.syncBlood(this.node.rect, this.tuning);\n this.syncDeath(this.tuning);\n this.syncInsanity(this.tuning);\n }\n}\n", "import type {\n ColorMatrixFilter,\n Container,\n Filter,\n Graphics,\n Sprite,\n Text,\n Texture,\n UniformGroup,\n} from 'pixi.js';\nimport type { PixiAssetManager } from './PixiAssetManager.js';\nimport {\n PixiPortraitResourceCard,\n type PortraitCardTextures,\n type InvestigatorDossierStatusEntry,\n type PixiPartyMemberState,\n} from './PixiPortraitResourceCard.js';\nimport type { PixiLayoutRect } from './PixiSessionLayout.js';\nimport type { PortraitCardPorts } from './PixiPortraitResourceCard.js';\nimport { PIXI_STAGE_METRICS } from './PixiStageMetrics.js';\nimport type { PixiSceneGraph } from './PixiSceneGraph.js';\nimport type { SessionTuningResolver } from './tuning/SessionTuningResolver.js';\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\nimport type { PixiMediaBreathRuntime } from './PixiMediaBreathRuntime.js';\n\nexport type { PixiPartyMemberState } from './PixiPortraitResourceCard.js';\n\nexport interface PreludeStoryPartyHudEntry {\n readonly id: string;\n readonly root: Container;\n readonly targetX: number;\n readonly targetY: number;\n}\n\ninterface Constructors {\n ColorMatrixFilter: typeof ColorMatrixFilter;\n Container: typeof Container;\n Filter: typeof Filter;\n Graphics: typeof Graphics;\n Sprite: new (texture?: Texture | import('pixi.js').SpriteOptions) => Sprite;\n Text: new (options: import('pixi.js').TextOptions) => Text;\n UniformGroup: typeof UniformGroup;\n}\n\nexport class PixiPartyHudSurface {\n readonly node: Container;\n private readonly cards = new Map<string, PixiPortraitResourceCard>();\n private readonly preludeStoryEntries = new Map<string, PreludeStoryPartyHudEntry>();\n private preludeStoryEntryActive = false;\n private tuning: SessionTuningResolver | undefined;\n private reducedMotion = false;\n\n constructor(\n scene: PixiSceneGraph,\n private readonly assets: PixiAssetManager,\n private readonly constructors: Constructors,\n private readonly textures: PortraitCardTextures,\n private readonly requestRender: () => void,\n tuning: SessionTuningResolver | undefined,\n private readonly animation: PixiAnimationDirector,\n private readonly ports: {\n card: PortraitCardPorts;\n maxMembers: number;\n resolveRects: (count: number) => readonly PixiLayoutRect[];\n },\n private readonly mediaBreath?: PixiMediaBreathRuntime,\n ) {\n this.node = new constructors.Container();\n this.tuning = tuning;\n scene.sceneHudLayer.addChild(this.node);\n }\n\n sync(members: PixiPartyMemberState[], visible: boolean): void {\n this.node.visible = visible;\n const selected = members.slice(0, this.ports.maxMembers);\n const activeIds = new Set(selected.map((member) => member.id));\n for (const [id, card] of this.cards) {\n if (activeIds.has(id)) continue;\n card.destroy();\n this.cards.delete(id);\n this.preludeStoryEntries.delete(id);\n }\n const rects = this.ports.resolveRects(selected.length);\n selected.forEach((member, index) => {\n const card = this.cards.get(member.id) ?? this.createCard(member.id);\n card.sync(member, rects[index]!, this.tuning);\n if (this.preludeStoryEntryActive) this.stagePreludeStoryCard(member.id, card);\n });\n this.requestRender();\n }\n\n updateTuning(tuning: SessionTuningResolver | undefined): void {\n this.tuning = tuning;\n }\n\n setReducedMotion(reducedMotion: boolean): void {\n this.reducedMotion = reducedMotion;\n for (const card of this.cards.values()) card.setReducedMotion(reducedMotion);\n }\n\n setEarthquakeTransform(x: number, y: number, rotation: number, scale: number): void {\n this.node.position.set(x, y);\n this.node.rotation = rotation;\n this.node.scale.set(scale);\n this.requestRender();\n }\n\n previewResourceChange(): void {\n this.cards.values().next().value?.previewResourceChange();\n }\n\n previewStatus(status: InvestigatorDossierStatusEntry): void {\n this.cards.values().next().value?.previewStatus(status);\n }\n\n preparePreludeStoryEntry(): void {\n this.preludeStoryEntryActive = true;\n this.preludeStoryEntries.clear();\n this.node.visible = true;\n this.node.alpha = 1;\n this.node.position.set(0, 0);\n for (const [id, card] of this.cards) this.stagePreludeStoryCard(id, card);\n }\n\n getPreludeStoryEntries(): readonly PreludeStoryPartyHudEntry[] {\n return [...this.preludeStoryEntries.values()];\n }\n\n restorePreludeStoryEntry(visible: boolean): void {\n this.preludeStoryEntryActive = false;\n for (const entry of this.preludeStoryEntries.values()) {\n entry.root.position.set(entry.targetX, entry.targetY);\n entry.root.alpha = 1;\n }\n this.preludeStoryEntries.clear();\n this.node.visible = visible;\n this.node.alpha = 1;\n this.node.position.set(0, 0);\n }\n\n reset(): void {\n for (const card of this.cards.values()) card.destroy();\n this.cards.clear();\n this.preludeStoryEntries.clear();\n this.preludeStoryEntryActive = false;\n this.node.visible = false;\n this.node.alpha = 1;\n this.node.position.set(0, 0);\n }\n\n destroy(): void {\n this.reset();\n this.node.destroy({ children: true });\n }\n\n private createCard(id: string): PixiPortraitResourceCard {\n const card = new PixiPortraitResourceCard(\n id,\n this.assets,\n this.constructors,\n this.textures,\n this.animation,\n this.requestRender,\n this.ports.card,\n this.mediaBreath,\n );\n card.setReducedMotion(this.reducedMotion);\n this.cards.set(id, card);\n this.node.addChild(card.root);\n return card;\n }\n\n private stagePreludeStoryCard(id: string, card: PixiPortraitResourceCard): void {\n const targetX = card.root.position.x;\n const targetY = card.root.position.y;\n this.preludeStoryEntries.set(id, { id, root: card.root, targetX, targetY });\n card.root.position.set(targetX, PIXI_STAGE_METRICS.height + PIXI_STAGE_METRICS.edgeInset);\n card.root.alpha = 0;\n }\n}\n", "import type { BlurFilter, Container, Graphics, Rectangle, Sprite, Texture } from 'pixi.js';\n\nimport type { PixiLayoutRect } from './PixiSessionLayout.js';\nimport type { PixiSceneGraph } from './PixiSceneGraph.js';\nimport type { SessionDisplayCaseWorkspaceTextures } from './PixiSessionSkin.js';\nimport type { SessionTuningResolver } from './tuning/SessionTuningResolver.js';\n\ninterface Constructors {\n BlurFilter: typeof BlurFilter;\n Container: typeof Container;\n Graphics: typeof Graphics;\n Rectangle: typeof Rectangle;\n Sprite: new (texture?: Texture | import('pixi.js').SpriteOptions) => Sprite;\n}\n\ntype StoryWorkspaceTransition = 'idle' | 'preludeStory';\n\nconst fitSprite = (\n sprite: Sprite,\n texture: Texture,\n rect: PixiLayoutRect,\n mirrored = false,\n stretchToRect = false,\n): void => {\n const scaleX = rect.width / Math.max(1, texture.width);\n const scaleY = rect.height / Math.max(1, texture.height);\n const scale = Math.min(scaleX, scaleY);\n sprite.texture = texture;\n sprite.anchor.set(0.5);\n sprite.position.set(rect.x + rect.width / 2, rect.y + rect.height / 2);\n sprite.scale.set(\n mirrored ? -(stretchToRect ? scaleX : scale) : stretchToRect ? scaleX : scale,\n stretchToRect ? scaleY : scale,\n );\n sprite.visible = true;\n};\n\n/** Stable Story shell with retained side panels and legacy case-workspace tuning keys. */\nexport class PixiStoryWorkspaceSurface {\n readonly node: Container;\n readonly leftPanelGroup: Container;\n readonly rightPanelGroup: Container;\n private readonly shellShadow: Sprite;\n private readonly shellShadowMask: Graphics;\n private readonly shellShadowBlur: BlurFilter;\n private readonly shell: Sprite;\n private readonly leftPanelShadow: Sprite;\n private readonly rightPanelShadow: Sprite;\n private readonly panelShadowBlur: BlurFilter;\n private readonly leftPanel: Sprite;\n private readonly rightPanel: Sprite;\n private storyCluePanel: Container | null = null;\n private storyPeoplePanel: Container | null = null;\n private transition: StoryWorkspaceTransition = 'idle';\n\n constructor(\n scene: PixiSceneGraph,\n private readonly constructors: Constructors,\n private readonly textures: SessionDisplayCaseWorkspaceTextures,\n private readonly requestRender: () => void,\n private readonly ports: {\n layout: {\n shell: PixiLayoutRect;\n leftPanelFrame: PixiLayoutRect;\n rightPanelFrame: PixiLayoutRect;\n };\n hudTop: number;\n shadowColor: string;\n maskColor: string;\n stage: { width: number; height: number };\n },\n private tuning?: SessionTuningResolver,\n ) {\n this.node = new constructors.Container({ label: 'case-workspace' });\n this.shellShadow = new constructors.Sprite(textures.shell ?? undefined);\n this.shellShadowMask = new constructors.Graphics();\n this.shellShadowBlur = new constructors.BlurFilter({ strength: 12, quality: 2 });\n this.shellShadowBlur.padding = 32;\n this.shell = new constructors.Sprite(textures.shell ?? undefined);\n this.leftPanelShadow = new constructors.Sprite(textures.panel ?? undefined);\n this.rightPanelShadow = new constructors.Sprite(textures.panel ?? undefined);\n this.panelShadowBlur = new constructors.BlurFilter({ strength: 10, quality: 2 });\n this.panelShadowBlur.padding = 32;\n this.leftPanel = new constructors.Sprite(textures.panel ?? undefined);\n this.rightPanel = new constructors.Sprite(textures.panel ?? undefined);\n this.leftPanelGroup = new constructors.Container({ label: 'case-workspace-left-panel' });\n this.rightPanelGroup = new constructors.Container({ label: 'case-workspace-right-panel' });\n this.shellShadow.visible = Boolean(textures.shell);\n this.shellShadow.tint = this.ports.shadowColor;\n this.shellShadow.filters = [this.shellShadowBlur];\n this.shellShadow.mask = this.shellShadowMask;\n this.leftPanelShadow.visible = Boolean(textures.panel);\n this.rightPanelShadow.visible = Boolean(textures.panel);\n this.leftPanelShadow.tint = this.ports.shadowColor;\n this.rightPanelShadow.tint = this.ports.shadowColor;\n this.leftPanelShadow.filters = [this.panelShadowBlur];\n this.rightPanelShadow.filters = [this.panelShadowBlur];\n this.leftPanel.visible = Boolean(textures.panel);\n this.rightPanel.visible = Boolean(textures.panel);\n this.shell.visible = Boolean(textures.shell);\n this.leftPanelGroup.addChild(this.leftPanelShadow, this.leftPanel);\n this.rightPanelGroup.addChild(this.rightPanelShadow, this.rightPanel);\n this.node.addChild(\n this.shellShadow,\n this.shellShadowMask,\n this.shell,\n this.leftPanelGroup,\n this.rightPanelGroup,\n );\n scene.sceneHudLayer.addChild(this.node);\n this.syncLayout();\n }\n\n attachStoryPanels(\n cluePanel: Container,\n clueMask: Graphics,\n peoplePanel: Container,\n peopleMask: Graphics,\n ): void {\n this.storyCluePanel = cluePanel;\n this.storyPeoplePanel = peoplePanel;\n this.leftPanelGroup.addChild(clueMask, cluePanel);\n this.rightPanelGroup.addChild(peopleMask, peoplePanel);\n }\n\n sync(): void {\n this.syncLayout();\n this.node.visible = true;\n if (this.transition === 'idle') {\n this.restoreStaticStoryPose(true);\n }\n this.requestRender();\n }\n\n setVisible(visible: boolean): void {\n this.node.visible = visible;\n }\n\n updateTuning(tuning: SessionTuningResolver | undefined): void {\n this.tuning = tuning;\n this.syncLayout();\n }\n\n preparePreludeStoryBase(): void {\n this.transition = 'preludeStory';\n this.sync();\n this.node.alpha = 0;\n if (this.storyCluePanel) {\n this.storyCluePanel.visible = false;\n this.storyCluePanel.alpha = 0;\n }\n if (this.storyPeoplePanel) {\n this.storyPeoplePanel.visible = false;\n this.storyPeoplePanel.alpha = 0;\n }\n }\n\n preparePreludeStoryHandoff(): void {\n if (this.storyCluePanel) {\n this.storyCluePanel.visible = true;\n this.storyCluePanel.alpha = 0;\n }\n if (this.storyPeoplePanel) {\n this.storyPeoplePanel.visible = true;\n this.storyPeoplePanel.alpha = 0;\n }\n }\n\n restorePreludeStoryTransition(visible: boolean): void {\n this.transition = 'idle';\n this.restoreStaticStoryPose(visible);\n if (this.storyCluePanel) {\n this.storyCluePanel.visible = visible;\n this.storyCluePanel.alpha = 1;\n }\n if (this.storyPeoplePanel) {\n this.storyPeoplePanel.visible = visible;\n this.storyPeoplePanel.alpha = 1;\n }\n }\n\n destroy(): void {\n this.shellShadow.filters = null;\n this.leftPanelShadow.filters = null;\n this.rightPanelShadow.filters = null;\n this.shellShadowBlur.destroy();\n this.panelShadowBlur.destroy();\n this.node.destroy({ children: true });\n }\n\n private syncLayout(): void {\n if (this.textures.shell) {\n fitSprite(this.shellShadow, this.textures.shell, this.ports.layout.shell, false, true);\n fitSprite(this.shell, this.textures.shell, this.ports.layout.shell, false, true);\n const blurStrength = Math.max(\n 0,\n this.visualNumber('visual.caseWorkspace.shellBottomShadowBlurStrength', 12),\n );\n this.shellShadowBlur.strength = blurStrength;\n this.shellShadow.alpha = this.visualNumber(\n 'visual.caseWorkspace.shellBottomShadowAlpha',\n 0.22,\n );\n this.shellShadow.position.y += this.visualNumber(\n 'visual.caseWorkspace.shellBottomShadowOffsetY',\n 12,\n );\n const maskTop = this.ports.hudTop - 24;\n this.shellShadowMask\n .clear()\n .rect(0, maskTop, this.ports.stage.width, Math.max(1, this.ports.stage.height - maskTop))\n .fill(this.ports.maskColor);\n this.shellShadow.filterArea = new this.constructors.Rectangle(\n -this.textures.shell.width / 2 - 48,\n -this.textures.shell.height / 2 - 48,\n this.textures.shell.width + 96,\n this.textures.shell.height + 96,\n );\n }\n if (this.textures.panel) {\n fitSprite(this.leftPanelShadow, this.textures.panel, this.ports.layout.leftPanelFrame);\n fitSprite(\n this.rightPanelShadow,\n this.textures.panel,\n this.ports.layout.rightPanelFrame,\n true,\n );\n fitSprite(this.leftPanel, this.textures.panel, this.ports.layout.leftPanelFrame);\n fitSprite(this.rightPanel, this.textures.panel, this.ports.layout.rightPanelFrame, true);\n const offsetX = this.visualNumber('visual.caseWorkspace.panelShadowOffsetX', 8);\n const offsetY = this.visualNumber('visual.caseWorkspace.panelShadowOffsetY', 10);\n this.leftPanelShadow.position.x -= offsetX;\n this.rightPanelShadow.position.x += offsetX;\n this.leftPanelShadow.position.y += offsetY;\n this.rightPanelShadow.position.y += offsetY;\n const alpha = this.visualNumber('visual.caseWorkspace.panelShadowAlpha', 0.26);\n this.leftPanelShadow.alpha = alpha;\n this.rightPanelShadow.alpha = alpha;\n this.panelShadowBlur.strength = Math.max(\n 0,\n this.visualNumber('visual.caseWorkspace.panelShadowBlurStrength', 10),\n );\n const panelArea = new this.constructors.Rectangle(\n -this.textures.panel.width / 2 - 40,\n -this.textures.panel.height / 2 - 40,\n this.textures.panel.width + 80,\n this.textures.panel.height + 80,\n );\n this.leftPanelShadow.filterArea = panelArea;\n this.rightPanelShadow.filterArea = panelArea.clone();\n }\n }\n\n private restoreStaticStoryPose(visible: boolean): void {\n this.node.visible = visible;\n this.node.alpha = 1;\n this.leftPanelGroup.position.set(0, 0);\n this.rightPanelGroup.position.set(0, 0);\n this.leftPanelGroup.alpha = 1;\n this.rightPanelGroup.alpha = 1;\n this.leftPanelGroup.visible = visible;\n this.rightPanelGroup.visible = visible;\n }\n\n getMotionNumber(key: string, fallback: number): number {\n return this.motionNumber(`motion.caseWorkspace.${key}`, fallback);\n }\n\n getMotionString(key: string, fallback: string): string {\n const value = this.tuning?.get(`motion.caseWorkspace.${key}` as never);\n return typeof value === 'string' ? value : fallback;\n }\n\n private motionNumber(path: string, fallback: number): number {\n const value = this.tuning?.get(path as never);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n }\n\n private visualNumber(path: string, fallback: number): number {\n const value = this.tuning?.get(path as never);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n }\n}\n", "export interface StoryMediaContent {\n key: string;\n kind: 'portrait' | 'card' | 'image';\n sourceId: string;\n title: string;\n imageUrl: string;\n videoUrl?: string;\n}\nexport interface GalleryEntry {\n id: string;\n kind: 'portrait' | 'card';\n sourceType?: 'portrait' | 'card';\n sourceId?: string;\n title: string;\n imageUrl: string;\n thumbUrl?: string;\n enterRotationDeg: number;\n stackRotationDeg: number;\n}\nexport interface GalleryDisplayState {\n current: GalleryEntry | null;\n phase: 'enter' | 'display' | 'exit' | 'idle';\n stackedImages: GalleryEntry[];\n}\nexport interface StorySurfaceLayout {\n media: PixiLayoutRect;\n leftPanel: PixiLayoutRect;\n rightPanel: PixiLayoutRect;\n revealCard: PixiLayoutRect;\n thumbnailGrid: {\n capacity: number;\n padding: number;\n gapX: number;\n leftScale: number;\n rightScale: number;\n columns: number;\n rows: number;\n aspectRatio: number;\n };\n}\nexport interface StorySurfacePorts {\n logger: RuntimeLogger;\n stage: { width: number; height: number };\n layout: StorySurfaceLayout;\n displayDurationMs: (scene: string) => number;\n colors: { mask: string; transition: string };\n photo: {\n thumbnailInset: number;\n revealFramePadding: number;\n shadow: string;\n shadowWarm: string;\n paper: string;\n paperEdge: string;\n thumbnailBorder: string;\n thumbnailBorderWidth: number;\n thumbnailBorderAlpha: number;\n revealBorderWidth: number;\n };\n media: {\n backdrop: { blurStrength: number; alpha: number };\n frame: {\n shadowOffsetFar: { x: number; y: number };\n shadowOffsetNear: { x: number; y: number };\n borderColor: string;\n borderWidth: number;\n borderAlpha: number;\n };\n };\n}\nimport type { PreparedStoryContentTransition } from './story/StoryContentSurface.js';\nimport type {\n BlurFilter,\n Container,\n Filter,\n Graphics,\n Rectangle,\n Sprite,\n Text,\n Texture,\n} from 'pixi.js';\n\nimport type { RuntimeLogger } from '@bardway/trpg-media';\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\nimport type { PixiAssetManager } from './PixiAssetManager.js';\nimport {\n stableSeededPixelOffset,\n resolvePixiLayoutRectAtCenter,\n stableSeededRotation,\n type PixiLayoutRect,\n} from './PixiSessionLayout.js';\nimport type { PixiSceneGraph } from './PixiSceneGraph.js';\nimport type { SessionTuningResolver } from './tuning/SessionTuningResolver.js';\nimport type { SessionTuningPath } from './tuning/SessionTuningTypes.js';\nimport { resolveContainRect, resolveCoverRect } from './PixiMapWorldUtils.js';\nimport { PixiStoryCardCut, type StoryCardCutOptions } from './PixiStoryCardCut.js';\nimport {\n createPixiStoryArchiveMotionFilter,\n writeStoryArchiveMotionFrame,\n type PixiStoryArchiveMotionFilter,\n type StoryArchiveMotionFrame,\n type StoryArchiveMotionPose,\n} from './PixiStoryArchiveMotion.js';\nimport type { PixiMediaBreathBinding, PixiMediaBreathRuntime } from './PixiMediaBreathRuntime.js';\nimport type { PixiVideoBinding, PixiVideoRuntime } from './PixiVideoRuntime.js';\n\ninterface Constructors {\n BlurFilter: typeof BlurFilter;\n Container: typeof Container;\n Filter?: typeof Filter;\n Graphics: typeof Graphics;\n Rectangle?: typeof Rectangle;\n Sprite: new (texture?: Texture | import('pixi.js').SpriteOptions) => Sprite;\n Text: new (options: import('pixi.js').TextOptions) => Text;\n}\n\ninterface ThumbnailNode {\n readonly root: Container;\n readonly frame: Graphics;\n readonly mask: Graphics;\n readonly kind: GalleryEntry['kind'];\n image: Sprite | null;\n imageSourceKey: string | null;\n requestKey: string | null;\n loadVersion: number;\n loadAbort: AbortController | null;\n}\n\ninterface StoryArchivePlacement {\n readonly rect: PixiLayoutRect;\n readonly rotation: number;\n readonly scaleX: number;\n readonly scaleY: number;\n}\n\ninterface StoryMainPhotoNode {\n readonly root: Container;\n readonly image: Sprite;\n readonly effectOverlay: Container;\n readonly frame: Graphics;\n readonly posterTexture: Texture;\n videoBinding: PixiVideoBinding | null;\n videoController: AbortController | null;\n videoLoadPromise: Promise<boolean> | null;\n videoActivationPromise: Promise<boolean> | null;\n}\n\nexport interface PixiStoryPresentationContent {\n readonly key: string;\n readonly imageUrl: string;\n readonly videoUrl?: string;\n readonly kind?: StoryMediaContent['kind'];\n readonly sourceId?: string;\n readonly title?: string;\n}\n\nexport type PixiStorySurfaceMode = 'story' | 'battle' | 'hidden';\n\nexport interface PixiStoryPresentationTargets {\n currentContent?: Container | null;\n readonly contentRoot: Container;\n readonly overlayRoot: Container;\n readonly backdropSprite: Sprite;\n readonly backdropBlur: BlurFilter;\n readonly shadowBlur: BlurFilter;\n}\n\ninterface MainImageReadyWaiter {\n readonly matches: (\n content: PixiStoryPresentationContent | null,\n requestKey: string | null,\n ) => boolean;\n readonly settle: (ready: boolean) => void;\n}\n\ninterface PublishedEntryWaiter {\n readonly content: StoryMediaContent;\n settle(entry: GalleryEntry | null): void;\n}\n\nconst MAIN_MEDIA_SHADOW_FILTER_PADDING = 32;\n\nconst isAbortError = (error: unknown): boolean =>\n error instanceof DOMException && error.name === 'AbortError';\n\nconst waitForAbortableDelay = (durationMs: number, signal: AbortSignal): Promise<boolean> => {\n if (signal.aborted) return Promise.resolve(false);\n return new Promise((resolve) => {\n let settled = false;\n let timeoutId: ReturnType<typeof globalThis.setTimeout> | null = null;\n const finish = (completed: boolean) => {\n if (settled) return;\n settled = true;\n if (timeoutId !== null) globalThis.clearTimeout(timeoutId);\n signal.removeEventListener('abort', abort);\n resolve(completed);\n };\n const abort = () => finish(false);\n timeoutId = globalThis.setTimeout(() => finish(true), durationMs);\n signal.addEventListener('abort', abort, { once: true });\n });\n};\n\nconst normalizePresentationContent = (\n content: StoryMediaContent | PixiStoryPresentationContent | string | null,\n): PixiStoryPresentationContent | null => {\n if (!content) return null;\n if (typeof content === 'string') {\n const imageUrl = content.trim();\n return imageUrl ? { key: imageUrl, imageUrl } : null;\n }\n const key = content.key?.trim();\n const imageUrl = content.imageUrl?.trim();\n if (!key || !imageUrl) return null;\n return {\n key,\n imageUrl,\n ...('videoUrl' in content && content.videoUrl?.trim()\n ? { videoUrl: content.videoUrl.trim() }\n : {}),\n ...('kind' in content ? { kind: content.kind } : {}),\n ...('sourceId' in content ? { sourceId: content.sourceId } : {}),\n ...('title' in content ? { title: content.title } : {}),\n };\n};\n\nconst getPresentationRequestKey = (content: PixiStoryPresentationContent | null): string | null =>\n content ? `${content.key}\\u0000${content.imageUrl}\\u0000${content.videoUrl ?? ''}` : null;\n\nlet PixiStorySurfaceScopeSerial = 0;\nexport class PixiStorySurface {\n private disposed = false;\n private readonly resourceScope = `runtime:PixiStorySurface:${++PixiStorySurfaceScopeSerial}`;\n readonly node: Container;\n private readonly mainVisualShakeLayer: Container;\n readonly mainImageAnchor: Container;\n readonly mainImageOverlay: Container;\n readonly leftPanelNode: Container;\n readonly rightPanelNode: Container;\n readonly mainBackdrop: Sprite;\n private readonly mainBackdropMask: Graphics;\n private readonly mainBackdropBlur: BlurFilter;\n private readonly mainMediaShadow: Graphics;\n private readonly mainMediaShadowBlur: BlurFilter;\n private readonly mainMediaShadowFilterArea: Rectangle | null;\n private readonly cardCutBackLayer: Container;\n private readonly cardCutFrontLayer: Container;\n private readonly cardCut: PixiStoryCardCut;\n private readonly mainImageContentLayer: Container;\n private readonly presentationTargets: PixiStoryPresentationTargets;\n readonly leftPanelMask: Graphics;\n readonly rightPanelMask: Graphics;\n private readonly reveal: Container;\n private readonly revealShade: Graphics;\n private readonly revealCard: Container;\n private readonly revealShadow: Graphics;\n private readonly revealShadowBlur: BlurFilter;\n private readonly revealShadowFilterArea: Rectangle | null;\n private readonly revealContent: Container;\n private readonly archiveMotionFilter: PixiStoryArchiveMotionFilter | null;\n private readonly archiveMotionFilterArea: Rectangle | null;\n private readonly archiveMotionFrame: StoryArchiveMotionFrame = {\n x: 0,\n y: 0,\n scaleX: 1,\n scaleY: 1,\n rotation: 0,\n shadeAlpha: 1,\n blurX: 0,\n blurY: 0,\n };\n private readonly revealFrame: Graphics;\n private readonly revealMask: Graphics;\n private readonly clueThumbnails = new Map<string, ThumbnailNode>();\n private readonly peopleThumbnails = new Map<string, ThumbnailNode>();\n private mainPhoto: StoryMainPhotoNode | null = null;\n private pendingMainPhoto: StoryMainPhotoNode | null = null;\n private mainImage: Sprite | null = null;\n private mainPosterTexture: Texture | null = null;\n private mainPreparedTransition: PreparedStoryContentTransition | null = null;\n private revealPreparedTransition: PreparedStoryContentTransition | null = null;\n private mainImageContent: PixiStoryPresentationContent | null = null;\n private mainImageKey: string | null = null;\n private mainImageReadyKey: string | null = null;\n private mainImageLoadingKey: string | null = null;\n private renderedImageRect: PixiLayoutRect | null = null;\n private readonly mainImageReadyWaiters = new Set<MainImageReadyWaiter>();\n private revealImage: Sprite | null = null;\n private revealKind: GalleryEntry['kind'] = 'card';\n private revealKey: string | null = null;\n private revealExitingKey: string | null = null;\n private archiveHandoffComplete = false;\n private lifecycleVersion = 0;\n private mainVersion = 0;\n private revealVersion = 0;\n private mainImageAbort: AbortController | null = null;\n private reducedMotion = false;\n private revealAttempt = 0;\n private revealAbort: AbortController | null = null;\n private mode: PixiStorySurfaceMode = 'hidden';\n private readonly mediaBreathBindings = new Map<Sprite, PixiMediaBreathBinding>();\n private lastClueState: GalleryDisplayState = {\n current: null,\n phase: 'idle',\n stackedImages: [],\n };\n private readonly publishedEntryWaiters = new Set<PublishedEntryWaiter>();\n private readonly reservedPublishedSources = new Map<string, number>();\n private readonly manualArchivedEntries = new Map<string, GalleryEntry>();\n\n constructor(\n private readonly scene: PixiSceneGraph,\n private readonly assets: PixiAssetManager,\n private readonly constructors: Constructors,\n private readonly animation: PixiAnimationDirector,\n private readonly requestRender: () => void,\n private readonly ports: StorySurfacePorts,\n private tuning?: SessionTuningResolver,\n private readonly mediaBreath?: PixiMediaBreathRuntime,\n private readonly setStoryEntranceActive: (active: boolean) => void = () => {},\n private readonly videoRuntime?: PixiVideoRuntime,\n ) {\n this.node = new constructors.Container();\n this.mainVisualShakeLayer = new constructors.Container({ label: 'story-main-visual-shake' });\n this.mainBackdrop = new constructors.Sprite();\n this.mainBackdropMask = new constructors.Graphics()\n .rect(0, 0, this.ports.stage.width, this.ports.stage.height)\n .fill(this.ports.colors.mask);\n this.mainBackdropBlur = new constructors.BlurFilter({\n strength: this.ports.media.backdrop.blurStrength,\n quality: 2,\n kernelSize: 9,\n });\n this.mainBackdrop.filters = [this.mainBackdropBlur];\n if (constructors.Rectangle) {\n this.mainBackdrop.filterArea = new constructors.Rectangle(0, 0, 1920, 1080);\n }\n this.mainBackdrop.mask = this.mainBackdropMask;\n this.mainBackdrop.alpha = this.ports.media.backdrop.alpha;\n this.mainBackdrop.visible = false;\n const mainMediaShadowAlpha = this.resolveTuningNumber('visual.story.mainMediaShadowAlpha', 0.2);\n this.mainMediaShadow = new constructors.Graphics()\n .roundRect(\n this.ports.layout.media.x + this.ports.media.frame.shadowOffsetFar.x,\n this.ports.layout.media.y + this.ports.media.frame.shadowOffsetFar.y,\n this.ports.layout.media.width,\n this.ports.layout.media.height,\n 5,\n )\n .fill({ color: this.ports.photo.shadow, alpha: mainMediaShadowAlpha })\n .roundRect(\n this.ports.layout.media.x + this.ports.media.frame.shadowOffsetNear.x,\n this.ports.layout.media.y + this.ports.media.frame.shadowOffsetNear.y,\n this.ports.layout.media.width,\n this.ports.layout.media.height,\n 5,\n )\n .fill({ color: this.ports.photo.shadowWarm, alpha: mainMediaShadowAlpha * 0.82 });\n this.mainMediaShadowBlur = new constructors.BlurFilter({\n strength: Math.max(\n 0,\n this.resolveTuningNumber('visual.story.mainMediaShadowBlurStrength', 10),\n ),\n quality: 2,\n });\n this.mainMediaShadowBlur.padding = MAIN_MEDIA_SHADOW_FILTER_PADDING;\n this.mainMediaShadow.filters = [this.mainMediaShadowBlur];\n this.mainMediaShadowFilterArea = constructors.Rectangle\n ? new constructors.Rectangle(\n this.ports.layout.media.x - MAIN_MEDIA_SHADOW_FILTER_PADDING,\n this.ports.layout.media.y - MAIN_MEDIA_SHADOW_FILTER_PADDING,\n this.ports.layout.media.width + MAIN_MEDIA_SHADOW_FILTER_PADDING * 2,\n this.ports.layout.media.height + MAIN_MEDIA_SHADOW_FILTER_PADDING * 2,\n )\n : null;\n if (this.mainMediaShadowFilterArea) {\n this.mainMediaShadow.filterArea = this.mainMediaShadowFilterArea;\n }\n this.mainImageAnchor = new constructors.Container();\n this.mainImageContentLayer = new constructors.Container();\n this.mainImageOverlay = new constructors.Container();\n this.cardCutBackLayer = new constructors.Container();\n this.cardCutFrontLayer = new constructors.Container();\n this.mainImageAnchor.addChild(this.mainImageContentLayer, this.mainImageOverlay);\n this.cardCut = new PixiStoryCardCut(\n this.cardCutBackLayer,\n this.cardCutFrontLayer,\n constructors,\n animation,\n requestRender,\n this.ports.photo,\n mediaBreath,\n );\n this.leftPanelNode = new constructors.Container({ sortableChildren: true });\n this.rightPanelNode = new constructors.Container({ sortableChildren: true });\n this.leftPanelMask = new constructors.Graphics();\n this.rightPanelMask = new constructors.Graphics();\n this.leftPanelNode.mask = this.leftPanelMask;\n this.rightPanelNode.mask = this.rightPanelMask;\n this.reveal = new constructors.Container();\n this.revealShade = new constructors.Graphics()\n .rect(0, 0, this.ports.stage.width, this.ports.stage.height)\n .fill({ color: this.ports.colors.transition, alpha: 0.58 });\n this.revealCard = new constructors.Container();\n this.revealShadow = new constructors.Graphics();\n this.revealShadowBlur = new constructors.BlurFilter({ strength: 8, quality: 2 });\n this.revealShadowBlur.padding = 16;\n this.revealShadow.filters = [this.revealShadowBlur];\n this.revealShadowFilterArea = constructors.Rectangle ? new constructors.Rectangle() : null;\n if (this.revealShadowFilterArea) this.revealShadow.filterArea = this.revealShadowFilterArea;\n this.revealContent = new constructors.Container();\n this.archiveMotionFilter = constructors.Filter\n ? createPixiStoryArchiveMotionFilter(constructors.Filter)\n : null;\n this.archiveMotionFilterArea = constructors.Rectangle ? new constructors.Rectangle() : null;\n if (this.archiveMotionFilter) this.revealContent.filters = [this.archiveMotionFilter.filter];\n if (this.archiveMotionFilterArea) this.revealContent.filterArea = this.archiveMotionFilterArea;\n this.revealFrame = new constructors.Graphics();\n this.revealMask = new constructors.Graphics();\n this.syncRevealCardGeometry();\n this.revealContent.addChild(this.revealFrame, this.revealMask);\n this.revealCard.addChild(this.revealShadow, this.revealContent);\n this.reveal.addChild(this.revealShade, this.revealCard);\n this.reveal.visible = false;\n this.mainVisualShakeLayer.addChild(\n this.mainBackdrop,\n this.mainMediaShadow,\n this.cardCutBackLayer,\n this.mainImageAnchor,\n this.cardCutFrontLayer,\n );\n this.node.addChild(this.mainVisualShakeLayer, this.mainBackdropMask);\n this.presentationTargets = {\n contentRoot: this.mainImageContentLayer,\n overlayRoot: this.mainImageOverlay,\n backdropSprite: this.mainBackdrop,\n backdropBlur: this.mainBackdropBlur,\n shadowBlur: this.mainMediaShadowBlur,\n };\n this.scene.backgroundLayer.addChild(this.node);\n this.scene.modalLayer.addChild(this.reveal);\n this.node.visible = false;\n }\n\n sync(\n content: StoryMediaContent | PixiStoryPresentationContent | string | null,\n clueState: GalleryDisplayState,\n mode: PixiStorySurfaceMode,\n ): void {\n this.syncLayout();\n const previousMode = this.mode;\n this.mode = mode;\n this.node.visible = mode === 'story';\n if (previousMode === 'battle' && mode === 'story') this.restorePreludeStoryTransition(true);\n if (mode !== 'story' && this.mainPhoto) {\n this.mainPhoto.videoActivationPromise = null;\n this.mainPhoto.videoBinding?.deactivate(true);\n }\n this.lastClueState = clueState;\n this.settlePublishedEntryWaiters(clueState);\n const normalizedContent = normalizePresentationContent(content);\n const nextContent =\n normalizedContent?.kind && normalizedContent.kind !== 'image'\n ? this.mainImageContent\n : normalizedContent;\n if (previousMode !== mode && previousMode !== 'hidden') {\n this.cancelMainImageTransition();\n this.cancelRevealTransition();\n this.revealAbort?.abort();\n this.revealAbort = null;\n this.completeArchiveThumbnail(this.revealExitingKey);\n this.reveal.visible = false;\n this.revealKey = null;\n this.revealExitingKey = null;\n this.archiveHandoffComplete = false;\n this.restoreRevealCardPose();\n }\n if (mode === 'hidden') {\n this.mainVersion += 1;\n this.revealVersion += 1;\n this.cancelMainImageTransition();\n this.cancelRevealTransition();\n this.revealAbort?.abort();\n this.revealAbort = null;\n this.invalidateThumbnailLoads();\n this.completeArchiveThumbnail(this.revealExitingKey);\n this.reveal.visible = false;\n this.revealKey = null;\n this.revealExitingKey = null;\n this.archiveHandoffComplete = false;\n this.restoreRevealCardPose();\n void this.setPresentationContent(nextContent, { animate: false });\n return;\n }\n void this.setPresentationContent(nextContent, { animate: mode === 'story' });\n if (mode === 'battle') {\n this.requestRender();\n return;\n }\n const exitingEntry = clueState.current && clueState.phase === 'exit' ? clueState.current : null;\n const archivedEntries = this.resolveArchivedEntries(clueState.stackedImages);\n const clueEntries = archivedEntries.filter((entry) => entry.kind === 'card');\n const peopleEntries = archivedEntries.filter((entry) => entry.kind === 'portrait');\n if (\n exitingEntry?.kind === 'card' &&\n !clueEntries.some((entry) => entry.id === exitingEntry.id)\n ) {\n clueEntries.push(exitingEntry);\n }\n if (\n exitingEntry?.kind === 'portrait' &&\n !peopleEntries.some((entry) => entry.id === exitingEntry.id)\n ) {\n peopleEntries.push(exitingEntry);\n }\n const handoffEntryId = this.archiveHandoffComplete\n ? null\n : (exitingEntry?.id ?? this.revealExitingKey);\n this.syncRail(\n this.leftPanelNode,\n this.clueThumbnails,\n clueEntries,\n this.ports.layout.leftPanel,\n 4,\n 'top-down-left-to-right',\n this.ports.layout.thumbnailGrid.leftScale,\n handoffEntryId,\n );\n this.syncRail(\n this.rightPanelNode,\n this.peopleThumbnails,\n peopleEntries,\n this.ports.layout.rightPanel,\n 3,\n 'top-down-right-to-left',\n this.ports.layout.thumbnailGrid.rightScale,\n handoffEntryId,\n );\n this.hideReservedArchiveThumbnails(archivedEntries);\n const currentReserved = clueState.current\n ? this.reservedPublishedSources.has(this.entrySourceKey(clueState.current))\n : false;\n const currentAlreadyArchived = clueState.current\n ? this.manualArchivedEntries.has(clueState.current.id)\n : false;\n if (\n clueState.current &&\n clueState.phase === 'exit' &&\n !currentReserved &&\n !currentAlreadyArchived\n ) {\n if (\n this.revealKey === clueState.current.id &&\n this.revealExitingKey !== clueState.current.id\n ) {\n this.revealExitingKey = clueState.current.id;\n this.archiveHandoffComplete = false;\n void this.archiveReveal(clueState.current, archivedEntries);\n }\n } else if (\n clueState.current &&\n !currentReserved &&\n !currentAlreadyArchived &&\n clueState.current.id !== this.revealKey\n ) {\n this.completeArchiveThumbnail(this.revealExitingKey);\n this.revealKey = clueState.current.id;\n this.revealExitingKey = null;\n this.archiveHandoffComplete = false;\n void this.playReveal(clueState.current);\n } else if (!clueState.current && this.archiveHandoffComplete) {\n this.revealKey = null;\n this.revealExitingKey = null;\n this.archiveHandoffComplete = false;\n this.restoreRevealCardPose();\n } else if (!clueState.current && !this.revealExitingKey && !this.revealPreparedTransition) {\n this.reveal.visible = false;\n this.revealKey = null;\n }\n this.requestRender();\n }\n\n resetTransitionPose(): void {\n this.setEarthquakeTransform(0, 0, 0, 1);\n this.leftPanelNode.position.set(0, 0);\n this.rightPanelNode.position.set(0, 0);\n this.leftPanelNode.alpha = 1;\n this.rightPanelNode.alpha = 1;\n this.mainImageAnchor.alpha = 1;\n this.mainBackdrop.alpha = this.ports.media.backdrop.alpha;\n }\n\n setEarthquakeTransform(x: number, y: number, rotation: number, scale: number): void {\n this.mainVisualShakeLayer.position.set(x, y);\n this.mainVisualShakeLayer.rotation = rotation;\n this.mainVisualShakeLayer.scale.set(scale);\n this.requestRender();\n }\n\n isPlayerShareReserved(sourceType: 'portrait' | 'card', sourceId: string): boolean {\n return this.reservedPublishedSources.has(`${sourceType}:${sourceId}`);\n }\n\n preparePreludeStoryBase(\n content: StoryMediaContent | PixiStoryPresentationContent | string | null,\n ): void {\n this.syncLayout();\n this.node.visible = true;\n this.node.alpha = 0;\n this.mainImageAnchor.alpha = 0;\n this.mainBackdrop.alpha = 0;\n void this.setPresentationContent(content, { animate: false });\n }\n\n preparePreludeStoryHandoff(): void {\n this.mainImageAnchor.alpha = 0;\n this.mainBackdrop.alpha = 0;\n }\n\n restorePreludeStoryTransition(visible: boolean): void {\n this.node.visible = visible;\n this.node.alpha = 1;\n this.resetTransitionPose();\n }\n\n getMainBackdropTargetAlpha(): number {\n return this.ports.media.backdrop.alpha;\n }\n\n getRenderedImageRect(): PixiLayoutRect | null {\n return this.renderedImageRect ? { ...this.renderedImageRect } : null;\n }\n\n getPresentationTargets(): PixiStoryPresentationTargets {\n return { ...this.presentationTargets, currentContent: this.mainPhoto?.root ?? null };\n }\n\n async prepareContentTransition(\n content: StoryMediaContent | PixiStoryPresentationContent,\n signal: AbortSignal,\n ): Promise<PreparedStoryContentTransition | null> {\n if (content.kind === 'portrait' || content.kind === 'card') {\n if (this.mode === 'hidden') return null;\n return this.preparePublishedContentTransition(\n content as StoryMediaContent,\n signal,\n this.mode,\n );\n }\n if (this.mode === 'battle') return null;\n this.cancelMainImageTransition();\n const version = ++this.mainVersion;\n const texture = await this.assets.loadTexture(\n `story-main:${content.key}:${content.imageUrl}`,\n content.imageUrl,\n this.resourceScope,\n signal,\n );\n if (signal.aborted || version !== this.mainVersion) return null;\n const outgoingPhoto = this.mainPhoto;\n const incomingPhoto = this.createMainPhotoNode(texture);\n const outgoing = outgoingPhoto?.root ?? null;\n const incoming = incomingPhoto.root;\n incoming.alpha = 0;\n (this.scene.storyEntranceLayer ?? this.scene.modalLayer).addChild(incoming);\n let committed = false;\n let finished = false;\n let topLayerActive = false;\n const setTopLayerActive = (active: boolean) => {\n if (topLayerActive === active) return;\n topLayerActive = active;\n this.setStoryEntranceActive(active);\n };\n const dispose = () => {\n if (finished) return;\n finished = true;\n signal.removeEventListener('abort', cancel);\n if (this.mainPreparedTransition === transition) this.mainPreparedTransition = null;\n this.cardCut.hide();\n if (committed) {\n this.normalizeMainPhotoNode(incomingPhoto);\n this.mainImageContentLayer.addChild(incomingPhoto.root);\n this.destroyMainPhotoNode(outgoingPhoto);\n } else {\n this.destroyMainPhotoNode(incomingPhoto);\n if (outgoing && !outgoing.destroyed) outgoing.alpha = 1;\n }\n setTopLayerActive(false);\n this.requestRender();\n };\n const cancel = () => dispose();\n const transition: PreparedStoryContentTransition = {\n outgoing,\n incoming,\n incomingImage: incomingPhoto.image,\n incomingRect: { ...this.ports.layout.media },\n effectOverlayRoot: incomingPhoto.effectOverlay,\n setTopLayerActive,\n playDefaultEntrance: async (entranceSignal) => {\n if (finished || entranceSignal.aborted || version !== this.mainVersion) return false;\n incomingPhoto.root.visible = false;\n if (this.reducedMotion) {\n incomingPhoto.root.visible = true;\n incomingPhoto.root.alpha = 0;\n const frame = { alpha: 0 };\n await this.animation.tween(\n frame,\n {\n alpha: 1,\n duration: 0.12,\n reducedMotionDuration: 0.12,\n ease: 'power1.out',\n onUpdate: () => {\n incomingPhoto.root.alpha = frame.alpha;\n if (outgoing && !outgoing.destroyed) outgoing.alpha = 1 - frame.alpha;\n this.requestRender();\n },\n },\n entranceSignal,\n );\n return !entranceSignal.aborted;\n }\n const completed = await this.cardCut.play(\n texture,\n () => this.resolveMainImageRect(texture),\n this.resolveMainImageCutOptions(),\n entranceSignal,\n () => {\n if (!entranceSignal.aborted && version === this.mainVersion) {\n this.syncMainBackdrop(texture);\n }\n },\n );\n return completed && !entranceSignal.aborted;\n },\n commit: () => {\n if (finished || committed || signal.aborted || version !== this.mainVersion) return;\n committed = true;\n this.mainPhoto = incomingPhoto;\n this.mainImage = incomingPhoto.image;\n this.mainPosterTexture = texture;\n this.mainImageContent = content;\n this.mainImageKey = getPresentationRequestKey(content);\n this.mainImageReadyKey = this.mainImageKey;\n this.mainImageLoadingKey = null;\n this.renderedImageRect = this.resolveMainImageRect(texture);\n this.syncMainBackdrop(texture);\n this.settleMainImageReadyWaiters(true, content, this.mainImageKey);\n if (content.videoUrl) {\n void this.startMainPhotoVideoUpgrade(incomingPhoto, content);\n }\n },\n finish: dispose,\n cancel,\n };\n this.mainPreparedTransition = transition;\n signal.addEventListener('abort', cancel, { once: true });\n return transition;\n }\n\n private async preparePublishedContentTransition(\n content: StoryMediaContent,\n signal: AbortSignal,\n presentationMode: Exclude<PixiStorySurfaceMode, 'hidden'>,\n ): Promise<PreparedStoryContentTransition | null> {\n this.cancelRevealTransition();\n const version = ++this.revealVersion;\n const sourceKey = this.contentSourceKey(content);\n this.reservePublishedSource(sourceKey);\n const entry = await this.waitForPublishedEntry(content, signal, 5_000);\n if (!entry || signal.aborted || version !== this.revealVersion) {\n this.releasePublishedSource(sourceKey);\n return null;\n }\n\n let texture: Texture;\n try {\n texture = await this.assets.loadTexture(\n `story-recipe-reveal:${entry.id}:${entry.imageUrl}`,\n entry.imageUrl,\n `${this.resourceScope}:reveal`,\n signal,\n );\n } catch (error) {\n this.releasePublishedSource(sourceKey);\n throw error;\n }\n if (signal.aborted || version !== this.revealVersion) {\n this.releasePublishedSource(sourceKey);\n return null;\n }\n\n this.revealAbort?.abort();\n this.destroyMediaSprite(this.revealImage);\n const sprite = new this.constructors.Sprite(texture);\n const padding = entry.kind === 'portrait' ? 0 : this.ports.photo.revealFramePadding;\n const contentBounds = {\n x: padding,\n y: padding,\n width: this.ports.layout.revealCard.width - padding * 2,\n height: this.ports.layout.revealCard.height - padding * 2,\n };\n const imageRect = resolveCoverRect(\n { width: texture.width, height: texture.height },\n contentBounds,\n );\n sprite.position.set(imageRect.x, imageRect.y);\n sprite.width = imageRect.width;\n sprite.height = imageRect.height;\n sprite.mask = this.revealMask;\n this.revealContent.addChild(sprite);\n this.revealImage = sprite;\n this.revealKind = entry.kind;\n this.attachMediaBreath(sprite, 'primary');\n this.restoreRevealCardPose();\n this.revealKey = entry.id;\n this.revealExitingKey = null;\n this.archiveHandoffComplete = false;\n this.reveal.visible = true;\n this.reveal.alpha = 1;\n this.revealShade.alpha = 1;\n this.revealCard.alpha = 0;\n this.completeArchiveThumbnail(entry.id);\n const existingThumbnail =\n this.clueThumbnails.get(entry.id) ?? this.peopleThumbnails.get(entry.id);\n if (existingThumbnail) existingThumbnail.root.alpha = 0;\n this.requestRender();\n\n let committed = false;\n let finished = false;\n let cancelled = false;\n let finishPromise: Promise<void> | null = null;\n const finishController = new AbortController();\n const abortFinish = () => finishController.abort(signal.reason);\n signal.addEventListener('abort', abortFinish, { once: true });\n const dispose = async (): Promise<void> => {\n if (finished) return;\n finished = true;\n try {\n const ownsReveal = () => version === this.revealVersion && this.revealKey === entry.id;\n const shouldHold = committed && !signal.aborted && !cancelled;\n const holdCompleted = shouldHold\n ? await waitForAbortableDelay(\n this.ports.displayDurationMs(presentationMode === 'battle' ? 'battle' : 'story'),\n finishController.signal,\n )\n : false;\n if (holdCompleted && !signal.aborted && !cancelled) {\n if (!ownsReveal()) return;\n if (presentationMode === 'story') {\n this.manualArchivedEntries.set(entry.id, entry);\n this.revealExitingKey = entry.id;\n this.archiveHandoffComplete = false;\n const archivedEntries = this.resolveArchivedEntries(this.lastClueState.stackedImages);\n this.syncArchiveRails(archivedEntries, entry.id);\n await this.archiveReveal(entry, archivedEntries);\n } else {\n await this.animation.tween(\n this.reveal,\n {\n alpha: 0,\n duration: this.resolveArchiveDuration(),\n reducedMotionDuration: 0.12,\n ease: 'power1.in',\n onUpdate: this.requestRender,\n },\n finishController.signal,\n );\n if (!finishController.signal.aborted && ownsReveal()) {\n this.reveal.visible = false;\n this.revealKey = null;\n this.revealExitingKey = null;\n this.archiveHandoffComplete = false;\n this.restoreRevealCardPose();\n }\n }\n if (\n presentationMode === 'story' &&\n !signal.aborted &&\n !cancelled &&\n ownsReveal() &&\n this.archiveHandoffComplete\n ) {\n this.revealKey = null;\n this.revealExitingKey = null;\n this.archiveHandoffComplete = false;\n this.restoreRevealCardPose();\n }\n if ((signal.aborted || cancelled) && ownsReveal()) {\n this.completeArchiveThumbnail(entry.id);\n this.reveal.visible = false;\n this.revealKey = null;\n this.revealExitingKey = null;\n this.restoreRevealCardPose();\n }\n } else if (ownsReveal()) {\n this.completeArchiveThumbnail(entry.id);\n this.reveal.visible = false;\n this.revealKey = null;\n this.revealExitingKey = null;\n this.restoreRevealCardPose();\n }\n } finally {\n this.releasePublishedSource(sourceKey);\n signal.removeEventListener('abort', cancel);\n signal.removeEventListener('abort', abortFinish);\n if (this.revealPreparedTransition === transition) this.revealPreparedTransition = null;\n if (presentationMode === 'story') {\n const archivedEntries = this.resolveArchivedEntries(this.lastClueState.stackedImages);\n this.syncArchiveRails(archivedEntries, null);\n this.hideReservedArchiveThumbnails(archivedEntries);\n }\n this.requestRender();\n }\n };\n const cancel = () => {\n cancelled = true;\n finishController.abort('story-content-transition-cancelled');\n if (this.revealExitingKey === entry.id) this.revealAbort?.abort();\n finishPromise ??= dispose();\n };\n const transition: PreparedStoryContentTransition = {\n outgoing: null,\n incoming: this.revealCard,\n incomingImage: sprite,\n incomingRect: { ...this.ports.layout.revealCard },\n setTopLayerActive: () => {},\n playDefaultEntrance: (entranceSignal) =>\n this.animateRevealCardEntrance(entry, entranceSignal),\n commit: () => {\n if (finished || signal.aborted || version !== this.revealVersion) return;\n committed = true;\n },\n finish: () => {\n finishPromise ??= dispose();\n return finishPromise;\n },\n cancel,\n };\n this.revealPreparedTransition = transition;\n signal.addEventListener('abort', cancel, { once: true });\n return transition;\n }\n\n async setPresentationContent(\n content: StoryMediaContent | PixiStoryPresentationContent | string | null,\n options: { animate?: boolean; signal?: AbortSignal } = {},\n ): Promise<boolean> {\n const normalized = normalizePresentationContent(content);\n if (options.signal?.aborted) return false;\n this.syncMainImage(normalized, options.animate ?? true, options.signal);\n return this.waitForPresentationContentReady(normalized, options.signal ?? null);\n }\n\n async primePresentationVideo(\n content: StoryMediaContent | PixiStoryPresentationContent,\n signal: AbortSignal,\n ): Promise<boolean> {\n if (!content.videoUrl || signal.aborted) return false;\n const ready = await this.setPresentationContent(content, { animate: false, signal });\n if (!ready || signal.aborted) return false;\n const requestKey = getPresentationRequestKey(normalizePresentationContent(content));\n if (requestKey === null || this.mainImageKey !== requestKey) return false;\n const photo = this.mainPhoto;\n const normalized = normalizePresentationContent(content);\n if (!photo || !normalized) return false;\n const loading = this.startMainPhotoVideoUpgrade(photo, normalized);\n return new Promise<boolean>((resolve) => {\n const finish = (ready: boolean) => {\n signal.removeEventListener('abort', abort);\n resolve(ready);\n };\n const abort = () => finish(false);\n signal.addEventListener('abort', abort, { once: true });\n if (signal.aborted) abort();\n else void loading.then(finish);\n });\n }\n\n waitForMainImageReady(imageUrl: string | null, signal: AbortSignal): Promise<boolean> {\n return this.waitForPresentationContentReady(imageUrl, signal);\n }\n\n waitForPresentationContentReady(\n content: StoryMediaContent | PixiStoryPresentationContent | string | null,\n signal: AbortSignal | null,\n ): Promise<boolean> {\n const normalized = normalizePresentationContent(content);\n const requestKey = getPresentationRequestKey(normalized);\n if (!normalized || signal?.aborted) return Promise.resolve(false);\n if (\n this.mainImage &&\n ((requestKey !== null && this.mainImageReadyKey === requestKey) ||\n this.mainImageContent?.imageUrl === normalized.imageUrl)\n ) {\n return Promise.resolve(true);\n }\n return new Promise((resolve) => {\n const settle = (ready: boolean) => {\n signal?.removeEventListener('abort', abort);\n this.mainImageReadyWaiters.delete(waiter);\n resolve(ready);\n };\n const abort = () => settle(false);\n const waiter: MainImageReadyWaiter = {\n matches: (currentContent, currentRequestKey) =>\n currentRequestKey === requestKey || currentContent?.imageUrl === normalized.imageUrl,\n settle,\n };\n this.mainImageReadyWaiters.add(waiter);\n signal?.addEventListener('abort', abort, { once: true });\n });\n }\n\n setReducedMotion(reducedMotion: boolean): void {\n this.reducedMotion = reducedMotion;\n if (reducedMotion) this.archiveMotionFilter?.reset();\n }\n\n reset(): void {\n this.mode = 'hidden';\n this.lifecycleVersion += 1;\n this.mainVersion += 1;\n this.revealVersion += 1;\n this.cancelMainImageTransition();\n this.cancelRevealTransition();\n this.destroyMainPhotoNode(this.mainPhoto);\n this.mainPhoto = null;\n this.mainImage = null;\n this.mainPosterTexture = null;\n this.mainBackdrop.visible = false;\n this.mainBackdrop.position.set(0, 0);\n this.mainBackdrop.width = 0;\n this.mainBackdrop.height = 0;\n this.mainImageLoadingKey = null;\n this.mainImageReadyKey = null;\n this.mainImageKey = null;\n this.mainImageContent = null;\n this.renderedImageRect = null;\n this.settleMainImageReadyWaiters(false);\n for (const waiter of [...this.publishedEntryWaiters]) waiter.settle(null);\n this.publishedEntryWaiters.clear();\n this.reservedPublishedSources.clear();\n this.manualArchivedEntries.clear();\n this.lastClueState = { current: null, phase: 'idle', stackedImages: [] };\n this.revealAbort?.abort();\n this.revealAbort = null;\n this.invalidateThumbnailLoads();\n this.node.visible = false;\n this.node.alpha = 1;\n this.reveal.visible = false;\n this.revealKey = null;\n this.revealExitingKey = null;\n this.archiveHandoffComplete = false;\n this.revealShadow.filters = [this.revealShadowBlur];\n this.archiveMotionFilter?.reset();\n this.revealShade.alpha = 1;\n this.reveal.alpha = 1;\n this.revealCard.alpha = 1;\n this.restoreRevealCardPose();\n this.resetTransitionPose();\n }\n\n destroy(): void {\n if (this.disposed) return;\n this.disposed = true;\n for (const scope of [this.resourceScope, `${this.resourceScope}:reveal`])\n void this.assets\n .releaseScope(scope)\n .catch((error) => this.ports.logger.warn('Surface scope release failed', { error }));\n this.reset();\n this.cardCut.destroy();\n this.mainBackdrop.filters = null;\n this.mainBackdrop.filterArea = undefined;\n this.mainBackdropBlur.destroy();\n this.mainMediaShadow.filters = null;\n this.mainMediaShadow.filterArea = undefined;\n this.mainMediaShadowBlur.destroy();\n this.revealShadow.filters = null;\n this.revealShadow.filterArea = undefined;\n this.revealShadowBlur.destroy();\n this.revealContent.filters = null;\n this.revealContent.filterArea = undefined;\n this.archiveMotionFilter?.destroy();\n for (const binding of this.mediaBreathBindings.values()) binding.release();\n this.mediaBreathBindings.clear();\n this.node.destroy({ children: true });\n this.reveal.destroy({ children: true });\n }\n\n updateTuning(tuning: SessionTuningResolver | undefined): void {\n this.tuning = tuning;\n this.syncLayout();\n this.cardCut.refresh();\n this.requestRender();\n }\n\n private syncMainImage(\n content: PixiStoryPresentationContent | null,\n animate = true,\n signal?: AbortSignal,\n ): void {\n const requestKey = getPresentationRequestKey(content);\n if (signal?.aborted) return;\n if (this.mainImageKey === requestKey && requestKey === null) return;\n if (\n this.mainImageKey === requestKey &&\n this.mainImageReadyKey === requestKey &&\n this.mainImage\n ) {\n if (this.mainPhoto && content?.videoUrl) {\n void this.startMainPhotoVideoUpgrade(this.mainPhoto, content);\n }\n this.syncMainImageGeometry();\n return;\n }\n if (this.mainImageKey === requestKey && this.mainImageLoadingKey === requestKey) return;\n if (this.mainImageKey !== requestKey) {\n this.settleMainImageReadyWaiters(false, this.mainImageContent, this.mainImageKey);\n this.cancelMainImageTransition();\n this.mainImageKey = requestKey;\n this.mainImageContent = content;\n }\n const version = ++this.mainVersion;\n const previousPhoto = this.mainPhoto;\n const previous = previousPhoto?.root ?? null;\n if (!content) {\n this.destroyMainPhotoNode(previousPhoto);\n this.mainPhoto = null;\n this.mainImage = null;\n this.mainPosterTexture = null;\n this.mainImageContent = null;\n this.mainBackdrop.visible = false;\n this.mainImageReadyKey = null;\n this.mainImageLoadingKey = null;\n this.renderedImageRect = null;\n return;\n }\n this.mainImageLoadingKey = requestKey;\n void this.assets\n .loadTexture(\n `story-main:${content.key}:${content.imageUrl}`,\n content.imageUrl,\n this.resourceScope,\n signal,\n )\n .then((texture) => {\n if (\n signal?.aborted ||\n version !== this.mainVersion ||\n this.mainImageKey !== requestKey ||\n this.mainImageContent?.imageUrl !== content.imageUrl ||\n this.mainImageContent?.key !== content.key\n ) {\n return;\n }\n const controller = new AbortController();\n signal?.addEventListener('abort', () => controller.abort(), { once: true });\n this.mainImageAbort?.abort();\n this.mainImageAbort = controller;\n const photo = this.createMainPhotoNode(texture);\n const photoRoot = photo.root;\n this.pendingMainPhoto = photo;\n this.mainImageContentLayer.addChild(photoRoot);\n this.requestRender();\n if (!previous || !animate) {\n this.commitMainImage(photo, previousPhoto, content, requestKey, version, controller);\n return;\n }\n photoRoot.visible = false;\n if (this.reducedMotion) {\n photoRoot.visible = true;\n photoRoot.alpha = 0;\n this.syncMainBackdrop(texture);\n void Promise.all([\n this.animation.tween(\n previous,\n {\n alpha: 0,\n duration: 0.12,\n ease: 'power1.in',\n onUpdate: this.requestRender,\n },\n controller.signal,\n ),\n this.animation.tween(\n photoRoot,\n {\n alpha: 1,\n duration: 0.12,\n ease: 'power1.out',\n onUpdate: this.requestRender,\n },\n controller.signal,\n ),\n ]).then(() => {\n this.commitMainImage(photo, previousPhoto, content, requestKey, version, controller);\n });\n return;\n }\n void this.cardCut\n .play(\n texture,\n () => this.resolveMainImageRect(texture),\n this.resolveMainImageCutOptions(),\n controller.signal,\n () => {\n if (version === this.mainVersion && this.mainImageKey === requestKey) {\n this.syncMainBackdrop(texture);\n }\n },\n )\n .then((completed) => {\n if (!completed) return;\n this.commitMainImage(photo, previousPhoto, content, requestKey, version, controller);\n });\n })\n .catch(() => {\n if (version === this.mainVersion && this.mainImageKey === requestKey) {\n this.mainImageLoadingKey = null;\n this.settleMainImageReadyWaiters(false, content, requestKey);\n }\n });\n }\n\n private cancelMainImageTransition(): void {\n this.mainPreparedTransition?.cancel();\n this.mainPreparedTransition = null;\n this.mainImageAbort?.abort();\n this.mainImageAbort = null;\n this.cardCut.hide();\n this.destroyMainPhotoNode(this.pendingMainPhoto);\n this.pendingMainPhoto = null;\n if (this.mainPhoto && this.mainImage) {\n this.mainPhoto.root.alpha = 1;\n this.syncMainBackdrop(this.mainPosterTexture ?? this.mainImage.texture);\n }\n this.mainImageLoadingKey = null;\n }\n\n private cancelRevealTransition(): void {\n this.revealPreparedTransition?.cancel();\n this.revealPreparedTransition = null;\n }\n\n private commitMainImage(\n photo: StoryMainPhotoNode,\n previous: StoryMainPhotoNode | null,\n content: PixiStoryPresentationContent,\n requestKey: string | null,\n version: number,\n controller: AbortController,\n ): void {\n if (\n controller.signal.aborted ||\n version !== this.mainVersion ||\n this.mainImageKey !== requestKey ||\n this.mainImageContent?.key !== content.key ||\n this.mainImageContent?.imageUrl !== content.imageUrl ||\n this.pendingMainPhoto !== photo\n )\n return;\n this.normalizeMainPhotoNode(photo);\n this.mainPhoto = photo;\n this.mainImage = photo.image;\n this.mainPosterTexture = photo.image.texture;\n this.pendingMainPhoto = null;\n this.mainImageLoadingKey = null;\n this.mainImageReadyKey = requestKey;\n this.syncMainImageGeometry();\n this.cardCut.hide();\n this.destroyMainPhotoNode(previous);\n if (this.mainImageAbort === controller) this.mainImageAbort = null;\n this.settleMainImageReadyWaiters(true, content, requestKey);\n this.requestRender();\n if (content.videoUrl) {\n void this.startMainPhotoVideoUpgrade(photo, content);\n }\n }\n\n private startMainPhotoVideoUpgrade(\n photo: StoryMainPhotoNode,\n content: PixiStoryPresentationContent,\n ): Promise<boolean> {\n if (!this.videoRuntime || !content.videoUrl || !this.ownsMainPhotoVideo(photo, content)) {\n return Promise.resolve(false);\n }\n if (photo.videoBinding) return this.activateMainPhotoVideo(photo, content, false);\n if (photo.videoLoadPromise) return photo.videoLoadPromise;\n const controller = new AbortController();\n photo.videoController = controller;\n const loadPromise: Promise<boolean> = this.upgradeMainPhotoToVideo(\n photo,\n content,\n controller.signal,\n ).finally(() => {\n if (photo.videoLoadPromise === loadPromise) photo.videoLoadPromise = null;\n if (!photo.videoBinding && photo.videoController === controller) {\n controller.abort();\n photo.videoController = null;\n }\n });\n photo.videoLoadPromise = loadPromise;\n return loadPromise;\n }\n\n private async upgradeMainPhotoToVideo(\n photo: StoryMainPhotoNode,\n content: PixiStoryPresentationContent,\n signal: AbortSignal,\n ): Promise<boolean> {\n const videoUrl = content.videoUrl;\n if (!this.videoRuntime || !videoUrl || signal.aborted) return false;\n let loadedBinding: PixiVideoBinding | null = null;\n let playbackFailed = false;\n try {\n const binding = await this.videoRuntime.loadBinding({\n alias: `story-main-video:${content.key}:${videoUrl}`,\n videoUrl,\n scope: this.resourceScope,\n signal,\n onPlaybackFailure: () => {\n playbackFailed = true;\n if (loadedBinding && photo.videoBinding === loadedBinding) {\n photo.videoBinding = null;\n photo.videoActivationPromise = null;\n loadedBinding.release();\n photo.videoController?.abort();\n photo.videoController = null;\n }\n this.restoreMainPhotoPoster(photo);\n },\n });\n loadedBinding = binding;\n if (signal.aborted || playbackFailed || !this.ownsMainPhotoVideo(photo, content)) {\n binding.release();\n return false;\n }\n photo.videoBinding = binding;\n return this.activateMainPhotoVideo(photo, content, true);\n } catch (error) {\n if (signal.aborted || isAbortError(error)) return false;\n this.ports.logger.warn('[PixiStorySurface] Story WebM \u52A0\u8F7D\u5931\u8D25\uFF0C\u4FDD\u7559 WebP \u6D77\u62A5', {\n videoUrl,\n error,\n });\n return false;\n }\n }\n\n private ownsMainPhotoVideo(\n photo: StoryMainPhotoNode,\n content: PixiStoryPresentationContent,\n ): boolean {\n return this.mainPhoto === photo && this.mainImageKey === getPresentationRequestKey(content);\n }\n\n private activateMainPhotoVideo(\n photo: StoryMainPhotoNode,\n content: PixiStoryPresentationContent,\n restart: boolean,\n ): Promise<boolean> {\n const binding = photo.videoBinding;\n if (!binding || !this.ownsMainPhotoVideo(photo, content)) return Promise.resolve(false);\n if (this.mode !== 'story') {\n photo.videoActivationPromise = null;\n binding.deactivate(true);\n photo.image.texture = binding.texture;\n this.syncMainImageGeometry();\n this.requestRender();\n return Promise.resolve(true);\n }\n if (photo.videoActivationPromise) return photo.videoActivationPromise;\n const activationPromise: Promise<boolean> = binding\n .activate(restart)\n .then((activated) => {\n if (!this.ownsMainPhotoVideo(photo, content) || photo.videoBinding !== binding)\n return false;\n if (photo.videoActivationPromise !== activationPromise) {\n return photo.videoActivationPromise ?? true;\n }\n if (this.mode !== 'story') binding.deactivate(true);\n else if (!activated) {\n photo.videoBinding = null;\n binding.release();\n photo.videoController?.abort();\n photo.videoController = null;\n this.restoreMainPhotoPoster(photo);\n return false;\n }\n photo.image.texture = binding.texture;\n this.syncMainImageGeometry();\n this.requestRender();\n return true;\n })\n .finally(() => {\n if (photo.videoActivationPromise === activationPromise) photo.videoActivationPromise = null;\n });\n photo.videoActivationPromise = activationPromise;\n return activationPromise;\n }\n\n private restoreMainPhotoPoster(photo: StoryMainPhotoNode): void {\n if (this.mainPhoto !== photo) return;\n photo.image.texture = photo.posterTexture;\n this.syncMainImageGeometry();\n this.requestRender();\n }\n\n private settleMainImageReadyWaiters(\n ready: boolean,\n content?: PixiStoryPresentationContent | null,\n requestKey?: string | null,\n ): void {\n for (const waiter of [...this.mainImageReadyWaiters]) {\n if (!waiter.matches(content ?? null, requestKey ?? null)) continue;\n waiter.settle(ready);\n }\n }\n\n private syncRail(\n target: Container,\n nodes: Map<string, ThumbnailNode>,\n entries: GalleryEntry[],\n panel: PixiLayoutRect,\n maxRotation: number,\n flow: StoryThumbnailFlow,\n itemScale: number,\n handoffEntryId: string | null,\n ): void {\n const grid = resolveStoryThumbnailGrid(\n panel,\n entries.length,\n flow,\n itemScale,\n this.ports.layout.thumbnailGrid,\n );\n const visible = entries.slice(-grid.capacity);\n const activeIds = new Set(visible.map((entry) => entry.id));\n for (const [id, node] of nodes) {\n if (activeIds.has(id)) continue;\n node.loadAbort?.abort();\n node.loadVersion += 1;\n node.root.destroy({ children: true });\n nodes.delete(id);\n }\n visible.forEach((entry, index) => {\n const rect = grid.rects[index]!;\n const casuallyPlacedRect = {\n ...rect,\n x: rect.x + stableSeededPixelOffset(entry.id, 1, 3, `story-${entry.kind}-x`),\n y: rect.y + stableSeededPixelOffset(entry.id, 1, 3, `story-${entry.kind}-y`),\n };\n const node = nodes.get(entry.id) ?? this.createThumbnailNode(target, nodes, entry);\n this.syncThumbnailGeometry(node, casuallyPlacedRect);\n node.root.rotation =\n (stableSeededRotation(entry.id, maxRotation, `story-${entry.kind}`) * Math.PI) / 180;\n node.root.zIndex = index;\n const revealTexture =\n entry.id === handoffEntryId && this.revealKey === entry.id\n ? this.revealImage?.texture\n : undefined;\n this.syncThumbnailImage(node, entry, casuallyPlacedRect, revealTexture);\n node.root.alpha = entry.id === handoffEntryId ? 0 : 1;\n });\n }\n\n private syncArchiveRails(entries: readonly GalleryEntry[], handoffEntryId: string | null): void {\n this.syncRail(\n this.leftPanelNode,\n this.clueThumbnails,\n entries.filter((entry) => entry.kind === 'card'),\n this.ports.layout.leftPanel,\n 4,\n 'top-down-left-to-right',\n this.ports.layout.thumbnailGrid.leftScale,\n handoffEntryId,\n );\n this.syncRail(\n this.rightPanelNode,\n this.peopleThumbnails,\n entries.filter((entry) => entry.kind === 'portrait'),\n this.ports.layout.rightPanel,\n 3,\n 'top-down-right-to-left',\n this.ports.layout.thumbnailGrid.rightScale,\n handoffEntryId,\n );\n }\n\n private hideReservedArchiveThumbnails(entries: readonly GalleryEntry[]): void {\n for (const entry of entries) {\n if (!this.reservedPublishedSources.has(this.entrySourceKey(entry))) continue;\n const node = this.clueThumbnails.get(entry.id) ?? this.peopleThumbnails.get(entry.id);\n if (node) node.root.alpha = 0;\n }\n }\n\n private contentSourceKey(content: StoryMediaContent): string {\n return `${content.kind}:${content.sourceId}`;\n }\n\n private reservePublishedSource(sourceKey: string): void {\n this.reservedPublishedSources.set(\n sourceKey,\n (this.reservedPublishedSources.get(sourceKey) ?? 0) + 1,\n );\n }\n\n private releasePublishedSource(sourceKey: string): void {\n const count = this.reservedPublishedSources.get(sourceKey) ?? 0;\n if (count <= 1) {\n this.reservedPublishedSources.delete(sourceKey);\n } else {\n this.reservedPublishedSources.set(sourceKey, count - 1);\n }\n const archivedEntries = this.resolveArchivedEntries(this.lastClueState.stackedImages);\n this.syncArchiveRails(archivedEntries, null);\n this.hideReservedArchiveThumbnails(archivedEntries);\n }\n\n private entrySourceKey(entry: GalleryEntry): string {\n const sourceType = entry.sourceType ?? (entry.kind === 'portrait' ? 'portrait' : 'card');\n return `${sourceType}:${entry.sourceId ?? entry.id}`;\n }\n\n private entryMatchesContent(entry: GalleryEntry, content: StoryMediaContent): boolean {\n const expectedKind = content.kind === 'portrait' ? 'portrait' : 'card';\n return (\n entry.kind === expectedKind &&\n (this.entrySourceKey(entry) === this.contentSourceKey(content) ||\n entry.id === content.sourceId ||\n entry.id === content.key)\n );\n }\n\n private findPublishedEntry(\n content: StoryMediaContent,\n clueState: GalleryDisplayState,\n ): GalleryEntry | null {\n if (clueState.current && this.entryMatchesContent(clueState.current, content)) {\n return clueState.current;\n }\n return (\n clueState.stackedImages.find((entry) => this.entryMatchesContent(entry, content)) ?? null\n );\n }\n\n private waitForPublishedEntry(\n content: StoryMediaContent,\n signal: AbortSignal,\n timeoutMs: number,\n ): Promise<GalleryEntry | null> {\n const current = this.findPublishedEntry(content, this.lastClueState);\n if (current) return Promise.resolve(current);\n if (signal.aborted) return Promise.resolve(null);\n\n return new Promise((resolve) => {\n let settled = false;\n const timeoutId = globalThis.setTimeout(() => settle(null), timeoutMs);\n const abort = () => settle(null);\n const settle = (entry: GalleryEntry | null): void => {\n if (settled) return;\n settled = true;\n globalThis.clearTimeout(timeoutId);\n signal.removeEventListener('abort', abort);\n this.publishedEntryWaiters.delete(waiter);\n resolve(entry);\n };\n const waiter: PublishedEntryWaiter = { content, settle };\n this.publishedEntryWaiters.add(waiter);\n signal.addEventListener('abort', abort, { once: true });\n });\n }\n\n private settlePublishedEntryWaiters(clueState: GalleryDisplayState): void {\n for (const waiter of [...this.publishedEntryWaiters]) {\n const entry = this.findPublishedEntry(waiter.content, clueState);\n if (entry) waiter.settle(entry);\n }\n }\n\n private resolveArchivedEntries(stackedImages: readonly GalleryEntry[]): GalleryEntry[] {\n const stackedSourceKeys = new Set(stackedImages.map((entry) => this.entrySourceKey(entry)));\n for (const [id, entry] of this.manualArchivedEntries) {\n if (\n stackedImages.some((stacked) => stacked.id === id) ||\n stackedSourceKeys.has(this.entrySourceKey(entry))\n ) {\n this.manualArchivedEntries.delete(id);\n }\n }\n const entries = [...stackedImages];\n const activeSourceKeys = new Set(stackedSourceKeys);\n for (const entry of this.manualArchivedEntries.values()) {\n const sourceKey = this.entrySourceKey(entry);\n if (activeSourceKeys.has(sourceKey)) continue;\n activeSourceKeys.add(sourceKey);\n entries.push(entry);\n }\n return entries;\n }\n\n private createThumbnailNode(\n target: Container,\n nodes: Map<string, ThumbnailNode>,\n entry: GalleryEntry,\n ): ThumbnailNode {\n const root = new this.constructors.Container();\n const frame = new this.constructors.Graphics();\n const mask = new this.constructors.Graphics();\n root.addChild(frame, mask);\n target.addChild(root);\n const node = {\n root,\n frame,\n mask,\n kind: entry.kind,\n image: null,\n imageSourceKey: null,\n requestKey: null,\n loadVersion: 0,\n loadAbort: null,\n };\n nodes.set(entry.id, node);\n return node;\n }\n\n private syncThumbnailGeometry(node: ThumbnailNode, rect: PixiLayoutRect): void {\n const inset = node.kind === 'portrait' ? 0 : this.ports.photo.thumbnailInset;\n node.root.pivot.set(rect.width / 2, rect.height / 2);\n node.root.position.set(rect.x + rect.width / 2, rect.y + rect.height / 2);\n node.frame\n .clear()\n .roundRect(8, 12, rect.width, rect.height, 5)\n .fill({ color: this.ports.photo.shadow, alpha: 0.52 })\n .roundRect(4, 7, rect.width, rect.height, 5)\n .fill({ color: this.ports.photo.shadowWarm, alpha: 0.46 });\n if (node.kind !== 'portrait') {\n node.frame\n .roundRect(0, 0, rect.width, rect.height, 5)\n .fill({ color: this.ports.photo.paper, alpha: 0.99 })\n .stroke({\n color: this.ports.photo.thumbnailBorder,\n width: this.ports.photo.thumbnailBorderWidth,\n alpha: this.ports.photo.thumbnailBorderAlpha,\n });\n }\n node.mask\n .clear()\n .roundRect(inset, inset, rect.width - inset * 2, rect.height - inset * 2, 2)\n .fill(this.ports.colors.mask);\n if (node.image) this.applyThumbnailImageGeometry(node.image, node, rect);\n }\n\n private syncThumbnailImage(\n node: ThumbnailNode,\n entry: GalleryEntry,\n rect: PixiLayoutRect,\n seedTexture?: Texture,\n ): void {\n if (seedTexture && !node.image) {\n this.commitThumbnailTexture(node, seedTexture, rect, entry.imageUrl);\n }\n const preferredUrl = entry.thumbUrl ?? entry.imageUrl;\n const requestKey = `${preferredUrl}\\u0000${entry.imageUrl}`;\n if (node.requestKey === requestKey) return;\n if (node.imageSourceKey === preferredUrl) {\n node.requestKey = requestKey;\n return;\n }\n node.loadAbort?.abort();\n const controller = new AbortController();\n node.loadAbort = controller;\n node.requestKey = requestKey;\n const version = ++node.loadVersion;\n void this.assets\n .loadTexture(\n `story-thumbnail:${entry.id}:preferred:${version}`,\n preferredUrl,\n this.resourceScope,\n controller.signal,\n )\n .then((texture) => {\n if (node.loadVersion !== version || node.requestKey !== requestKey) return;\n this.commitThumbnailTexture(node, texture, rect, preferredUrl);\n if (node.loadAbort === controller) node.loadAbort = null;\n })\n .catch(async () => {\n if (node.loadVersion !== version || node.requestKey !== requestKey) return;\n if (preferredUrl === entry.imageUrl || node.imageSourceKey === entry.imageUrl) {\n if (!node.image) node.requestKey = null;\n if (node.loadAbort === controller) node.loadAbort = null;\n return;\n }\n try {\n const texture = await this.assets.loadTexture(\n `story-thumbnail:${entry.id}:fallback:${version}`,\n entry.imageUrl,\n this.resourceScope,\n controller.signal,\n );\n if (node.loadVersion !== version || node.requestKey !== requestKey) return;\n this.commitThumbnailTexture(node, texture, rect, entry.imageUrl);\n if (node.loadAbort === controller) node.loadAbort = null;\n } catch {\n if (node.loadVersion === version && node.requestKey === requestKey && !node.image) {\n node.requestKey = null;\n }\n if (node.loadAbort === controller) node.loadAbort = null;\n }\n });\n }\n\n private invalidateThumbnailLoads(): void {\n for (const node of [...this.clueThumbnails.values(), ...this.peopleThumbnails.values()]) {\n node.loadAbort?.abort();\n node.loadAbort = null;\n node.loadVersion += 1;\n node.requestKey = null;\n node.root.alpha = 1;\n }\n }\n\n private commitThumbnailTexture(\n node: ThumbnailNode,\n texture: Texture,\n rect: PixiLayoutRect,\n sourceKey: string,\n ): void {\n node.image?.destroy();\n const image = new this.constructors.Sprite(texture);\n this.applyThumbnailImageGeometry(image, node, rect);\n node.root.addChild(image);\n node.image = image;\n node.imageSourceKey = sourceKey;\n this.requestRender();\n }\n\n private applyThumbnailImageGeometry(\n image: Sprite,\n node: ThumbnailNode,\n rect: PixiLayoutRect,\n ): void {\n const inset = node.kind === 'portrait' ? 0 : this.ports.photo.thumbnailInset;\n const imageRect = resolveCoverRect(\n { width: image.texture.width, height: image.texture.height },\n {\n x: inset,\n y: inset,\n width: rect.width - inset * 2,\n height: rect.height - inset * 2,\n },\n );\n image.position.set(imageRect.x, imageRect.y);\n image.width = imageRect.width;\n image.height = imageRect.height;\n image.mask = node.mask;\n }\n\n private async playReveal(entry: GalleryEntry): Promise<void> {\n this.revealAbort?.abort();\n const controller = new AbortController();\n this.revealAbort = controller;\n const lifecycleVersion = this.lifecycleVersion;\n const attempt = ++this.revealAttempt;\n try {\n const texture = await this.assets.loadTexture(\n `story-reveal:${entry.id}:${entry.imageUrl}:attempt:${attempt}`,\n entry.imageUrl,\n `${this.resourceScope}:reveal`,\n controller.signal,\n );\n if (\n controller.signal.aborted ||\n lifecycleVersion !== this.lifecycleVersion ||\n this.revealKey !== entry.id ||\n !this.node.visible\n ) {\n return;\n }\n this.destroyMediaSprite(this.revealImage);\n const sprite = new this.constructors.Sprite(texture);\n const padding = entry.kind === 'portrait' ? 0 : this.ports.photo.revealFramePadding;\n const contentBounds = {\n x: padding,\n y: padding,\n width: this.ports.layout.revealCard.width - padding * 2,\n height: this.ports.layout.revealCard.height - padding * 2,\n };\n const imageRect = resolveCoverRect(\n { width: texture.width, height: texture.height },\n contentBounds,\n );\n sprite.position.set(imageRect.x, imageRect.y);\n sprite.width = imageRect.width;\n sprite.height = imageRect.height;\n sprite.mask = this.revealMask;\n this.revealContent.addChild(sprite);\n this.revealImage = sprite;\n this.revealKind = entry.kind;\n this.attachMediaBreath(sprite, 'primary');\n await this.animateRevealCardEntrance(entry, controller.signal);\n } catch {\n if (!controller.signal.aborted && this.revealKey === entry.id) {\n this.reveal.visible = false;\n this.revealKey = null;\n }\n }\n }\n\n private async animateRevealCardEntrance(\n entry: GalleryEntry,\n signal: AbortSignal,\n ): Promise<boolean> {\n const enterRotation = stableSeededRotation(entry.id, 5, 'story-reveal-enter');\n const restRotation = stableSeededRotation(entry.id, 5, 'story-reveal-rest');\n this.restoreRevealCardPose();\n this.reveal.visible = true;\n this.revealShade.alpha = 1;\n this.reveal.alpha = 0;\n this.revealCard.alpha = 0;\n this.revealCard.scale.set(0.85);\n this.revealCard.rotation = (enterRotation * Math.PI) / 180;\n this.requestRender();\n const renderFrame = () => this.requestRender();\n const duration = this.resolveRevealDuration();\n await Promise.all([\n this.animation.tween(\n this.reveal,\n { alpha: 1, duration, ease: 'power2.out', onUpdate: renderFrame },\n signal,\n ),\n this.animation.tween(\n this.revealCard,\n { alpha: 1, duration, ease: 'power2.out', onUpdate: renderFrame },\n signal,\n ),\n this.animation.tween(\n this.revealCard.scale,\n { x: 1, y: 1, duration, ease: 'power2.out', onUpdate: renderFrame },\n signal,\n ),\n this.animation.tween(\n this.revealCard,\n {\n rotation: (restRotation * Math.PI) / 180,\n duration,\n ease: 'power2.out',\n onUpdate: renderFrame,\n },\n signal,\n ),\n ]);\n return !signal.aborted && this.revealKey === entry.id;\n }\n\n private async archiveReveal(\n entry: GalleryEntry,\n stackedImages: readonly GalleryEntry[],\n ): Promise<void> {\n this.revealAbort?.abort();\n const controller = new AbortController();\n this.revealAbort = controller;\n const renderFrame = () => this.requestRender();\n const placement = this.resolveArchivePlacement(entry, stackedImages);\n const start: StoryArchiveMotionPose = {\n x: this.revealCard.position.x,\n y: this.revealCard.position.y,\n scaleX: this.revealCard.scale.x,\n scaleY: this.revealCard.scale.y,\n rotation: this.revealCard.rotation,\n };\n const end: StoryArchiveMotionPose = {\n x: placement.rect.x + placement.rect.width / 2,\n y: placement.rect.y + placement.rect.height / 2,\n scaleX: placement.scaleX,\n scaleY: placement.scaleY,\n rotation: placement.rotation,\n };\n const progress = { value: 0 };\n const maxBlurStrength = this.reducedMotion\n ? 0\n : Math.max(0, this.resolveTuningNumber('visual.story.archiveMotionBlurStrength', 18));\n this.reveal.alpha = 1;\n this.revealCard.alpha = 1;\n this.applyArchiveMotionFrame(start, end, 0, maxBlurStrength);\n const duration = this.reducedMotion ? 0.12 : this.resolveArchiveDuration();\n await this.animation.tween(\n progress,\n {\n value: 1,\n duration,\n ease: 'none',\n onUpdate: () => {\n this.applyArchiveMotionFrame(start, end, progress.value, maxBlurStrength);\n renderFrame();\n },\n },\n controller.signal,\n );\n if (!controller.signal.aborted && this.revealExitingKey === entry.id) {\n this.applyArchiveMotionFrame(start, end, 1, 0);\n this.archiveMotionFilter?.reset();\n this.completeArchiveThumbnail(entry.id);\n this.reveal.visible = false;\n this.archiveHandoffComplete = true;\n this.restoreRevealCardPose();\n this.requestRender();\n } else if (this.revealAbort === controller) {\n this.archiveMotionFilter?.reset();\n }\n }\n\n private applyArchiveMotionFrame(\n start: StoryArchiveMotionPose,\n end: StoryArchiveMotionPose,\n progress: number,\n maxBlurStrength: number,\n ): void {\n writeStoryArchiveMotionFrame(start, end, progress, maxBlurStrength, this.archiveMotionFrame);\n const frame = this.archiveMotionFrame;\n this.revealCard.position.set(frame.x, frame.y);\n this.revealCard.scale.set(frame.scaleX, frame.scaleY);\n this.revealCard.rotation = frame.rotation;\n this.revealShade.alpha = frame.shadeAlpha;\n this.syncArchiveMotionFilterArea(frame.scaleX, frame.scaleY);\n this.archiveMotionFilter?.update(frame.blurX, frame.blurY);\n }\n\n private syncArchiveMotionFilterArea(scaleX: number, scaleY: number): void {\n const rect = this.ports.layout.revealCard;\n const safeScaleX = Math.max(0.05, Math.abs(scaleX));\n const safeScaleY = Math.max(0.05, Math.abs(scaleY));\n if (this.archiveMotionFilterArea) {\n const baseWidth = rect.width + 64;\n const baseHeight = rect.height + 64;\n this.archiveMotionFilterArea.width = baseWidth / safeScaleX;\n this.archiveMotionFilterArea.height = baseHeight / safeScaleY;\n this.archiveMotionFilterArea.x = rect.width / 2 - this.archiveMotionFilterArea.width / 2;\n this.archiveMotionFilterArea.y = rect.height / 2 - this.archiveMotionFilterArea.height / 2;\n }\n if (this.revealShadowFilterArea) {\n const baseWidth = rect.width + 22;\n const baseHeight = rect.height + 30;\n this.revealShadowFilterArea.width = baseWidth / safeScaleX;\n this.revealShadowFilterArea.height = baseHeight / safeScaleY;\n this.revealShadowFilterArea.x = baseWidth / 2 - this.revealShadowFilterArea.width / 2;\n this.revealShadowFilterArea.y = baseHeight / 2 - this.revealShadowFilterArea.height / 2;\n }\n }\n\n private resolveArchivePlacement(\n entry: GalleryEntry,\n stackedImages: readonly GalleryEntry[],\n ): StoryArchivePlacement {\n const panel =\n entry.kind === 'card' ? this.ports.layout.leftPanel : this.ports.layout.rightPanel;\n const flow: StoryThumbnailFlow =\n entry.kind === 'card' ? 'top-down-left-to-right' : 'top-down-right-to-left';\n const itemScale =\n entry.kind === 'card'\n ? this.ports.layout.thumbnailGrid.leftScale\n : this.ports.layout.thumbnailGrid.rightScale;\n const maxRotation = entry.kind === 'card' ? 4 : 3;\n const entries = stackedImages.filter((candidate) => candidate.kind === entry.kind);\n if (!entries.some((candidate) => candidate.id === entry.id)) entries.push(entry);\n const visible = entries.slice(-this.ports.layout.thumbnailGrid.capacity);\n const index = Math.max(\n 0,\n visible.findIndex((candidate) => candidate.id === entry.id),\n );\n const grid = resolveStoryThumbnailGrid(\n panel,\n visible.length,\n flow,\n itemScale,\n this.ports.layout.thumbnailGrid,\n );\n const baseRect = grid.rects[index] ?? {\n x: panel.x + panel.width / 2,\n y: panel.y + panel.height / 2,\n width: grid.thumbnailWidth,\n height: grid.thumbnailHeight,\n };\n const rect = {\n ...baseRect,\n x: baseRect.x + stableSeededPixelOffset(entry.id, 1, 3, `story-${entry.kind}-x`),\n y: baseRect.y + stableSeededPixelOffset(entry.id, 1, 3, `story-${entry.kind}-y`),\n };\n return {\n rect,\n rotation:\n (stableSeededRotation(entry.id, maxRotation, `story-${entry.kind}`) * Math.PI) / 180,\n scaleX: rect.width / this.ports.layout.revealCard.width,\n scaleY: rect.height / this.ports.layout.revealCard.height,\n };\n }\n\n private completeArchiveThumbnail(entryId: string | null): void {\n if (!entryId) return;\n const node = this.clueThumbnails.get(entryId) ?? this.peopleThumbnails.get(entryId);\n if (node) node.root.alpha = 1;\n }\n\n private resolveRevealDuration(): number {\n const value = this.tuning?.get('motion.story.revealDuration');\n return typeof value === 'number' && Number.isFinite(value) ? Math.max(0, value) : 0.4;\n }\n\n private resolveArchiveDuration(): number {\n return Math.max(0, this.resolveTuningNumber('motion.story.archiveDuration', 0.5));\n }\n\n private resolveMainImageCutOptions(): StoryCardCutOptions {\n return {\n duration: Math.max(0, this.resolveTuningNumber('motion.story.mainImageCutDuration', 0.78)),\n travel: Math.max(0, this.resolveTuningNumber('visual.story.mainImageCutTravel', 0.18)),\n shadowAlpha: Math.max(\n 0,\n this.resolveTuningNumber('visual.story.mainImageCutShadowAlpha', 0.42),\n ),\n };\n }\n\n private resolveMainImageRect(texture: Texture): PixiLayoutRect {\n return resolveContainRect(\n { width: texture.width, height: texture.height },\n this.ports.layout.media,\n );\n }\n\n private createMainPhotoNode(texture: Texture): StoryMainPhotoNode {\n const root = new this.constructors.Container({ label: 'story-main-photo' });\n const image = new this.constructors.Sprite(texture);\n const effectOverlay = new this.constructors.Container({ label: 'story-main-photo-effects' });\n const frame = new this.constructors.Graphics();\n root.eventMode = 'none';\n effectOverlay.eventMode = 'none';\n root.addChild(image, effectOverlay, frame);\n const photo: StoryMainPhotoNode = {\n root,\n image,\n effectOverlay,\n frame,\n posterTexture: texture,\n videoBinding: null,\n videoController: null,\n videoLoadPromise: null,\n videoActivationPromise: null,\n };\n this.attachMediaBreath(image, 'primary');\n this.syncMainPhotoGeometry(photo);\n return photo;\n }\n\n private syncMainPhotoGeometry(photo: StoryMainPhotoNode): void {\n const localBounds = {\n x: 0,\n y: 0,\n width: this.ports.layout.media.width,\n height: this.ports.layout.media.height,\n };\n const imageRect = resolveContainRect(\n { width: photo.image.texture.width, height: photo.image.texture.height },\n localBounds,\n );\n photo.root.position.set(this.ports.layout.media.x, this.ports.layout.media.y);\n photo.image.position.set(imageRect.x, imageRect.y);\n photo.image.width = imageRect.width;\n photo.image.height = imageRect.height;\n photo.frame\n .clear()\n .roundRect(0, 0, this.ports.layout.media.width, this.ports.layout.media.height, 5)\n .stroke({\n color: this.ports.media.frame.borderColor,\n width: this.ports.media.frame.borderWidth,\n alpha: this.ports.media.frame.borderAlpha,\n });\n }\n\n private normalizeMainPhotoNode(photo: StoryMainPhotoNode): void {\n this.syncMainPhotoGeometry(photo);\n photo.root.pivot.set(0, 0);\n photo.root.scale.set(1);\n photo.root.rotation = 0;\n photo.root.visible = true;\n photo.root.alpha = 1;\n }\n\n private destroyMainPhotoNode(photo: StoryMainPhotoNode | null | undefined): void {\n if (!photo || photo.root.destroyed) return;\n photo.videoController?.abort();\n photo.videoController = null;\n photo.videoActivationPromise = null;\n photo.videoBinding?.release();\n photo.videoBinding = null;\n this.mediaBreathBindings.get(photo.image)?.release();\n this.mediaBreathBindings.delete(photo.image);\n photo.root.destroy({ children: true });\n }\n\n private attachMediaBreath(sprite: Sprite, category: 'primary'): void {\n if (!this.mediaBreath || this.mediaBreathBindings.has(sprite)) return;\n this.mediaBreathBindings.set(sprite, this.mediaBreath.attach(sprite, category));\n }\n\n private destroyMediaSprite(sprite: Sprite | null | undefined): void {\n if (!sprite) return;\n this.mediaBreathBindings.get(sprite)?.release();\n this.mediaBreathBindings.delete(sprite);\n sprite.destroy();\n }\n\n private syncMainBackdrop(texture: Texture): void {\n const rect = resolveCoverRect(\n { width: texture.width, height: texture.height },\n { x: 0, y: 0, width: 1920, height: 1080 },\n );\n this.mainBackdrop.texture = texture;\n this.mainBackdrop.position.set(rect.x, rect.y);\n this.mainBackdrop.width = rect.width;\n this.mainBackdrop.height = rect.height;\n this.mainBackdrop.visible = true;\n }\n\n private syncMainImageGeometry(): void {\n if (!this.mainPhoto || !this.mainImage) {\n this.renderedImageRect = null;\n return;\n }\n const rect = this.resolveMainImageRect(this.mainImage.texture);\n this.renderedImageRect = { ...rect };\n this.syncMainPhotoGeometry(this.mainPhoto);\n this.syncMainBackdrop(this.mainPosterTexture ?? this.mainImage.texture);\n this.cardCut.refresh();\n }\n\n private syncLayout(): void {\n const mainMediaShadowAlpha = this.resolveTuningNumber('visual.story.mainMediaShadowAlpha', 0.2);\n this.mainMediaShadowBlur.strength = Math.max(\n 0,\n this.resolveTuningNumber('visual.story.mainMediaShadowBlurStrength', 10),\n );\n this.mainMediaShadowBlur.padding = MAIN_MEDIA_SHADOW_FILTER_PADDING;\n if (this.mainMediaShadowFilterArea) {\n this.mainMediaShadowFilterArea.x =\n this.ports.layout.media.x - MAIN_MEDIA_SHADOW_FILTER_PADDING;\n this.mainMediaShadowFilterArea.y =\n this.ports.layout.media.y - MAIN_MEDIA_SHADOW_FILTER_PADDING;\n this.mainMediaShadowFilterArea.width =\n this.ports.layout.media.width + MAIN_MEDIA_SHADOW_FILTER_PADDING * 2;\n this.mainMediaShadowFilterArea.height =\n this.ports.layout.media.height + MAIN_MEDIA_SHADOW_FILTER_PADDING * 2;\n }\n this.mainBackdropBlur.strength = Math.max(\n 0,\n this.resolveTuningNumber(\n 'visual.story.mainBackdrop.blurStrength',\n this.ports.media.backdrop.blurStrength,\n ),\n );\n this.mainBackdropMask\n .clear()\n .rect(0, 0, this.ports.stage.width, this.ports.stage.height)\n .fill(this.ports.colors.mask);\n this.mainMediaShadow\n .clear()\n .roundRect(\n this.ports.layout.media.x + this.ports.media.frame.shadowOffsetFar.x,\n this.ports.layout.media.y + this.ports.media.frame.shadowOffsetFar.y,\n this.ports.layout.media.width,\n this.ports.layout.media.height,\n 5,\n )\n .fill({ color: this.ports.photo.shadow, alpha: mainMediaShadowAlpha })\n .roundRect(\n this.ports.layout.media.x + this.ports.media.frame.shadowOffsetNear.x,\n this.ports.layout.media.y + this.ports.media.frame.shadowOffsetNear.y,\n this.ports.layout.media.width,\n this.ports.layout.media.height,\n 5,\n )\n .fill({ color: this.ports.photo.shadowWarm, alpha: mainMediaShadowAlpha * 0.82 });\n this.syncMainImageGeometry();\n this.leftPanelMask\n .clear()\n .roundRect(\n this.ports.layout.leftPanel.x,\n this.ports.layout.leftPanel.y,\n this.ports.layout.leftPanel.width,\n this.ports.layout.leftPanel.height,\n 5,\n )\n .fill(this.ports.colors.mask);\n this.rightPanelMask\n .clear()\n .roundRect(\n this.ports.layout.rightPanel.x,\n this.ports.layout.rightPanel.y,\n this.ports.layout.rightPanel.width,\n this.ports.layout.rightPanel.height,\n 5,\n )\n .fill(this.ports.colors.mask);\n this.syncRevealCardGeometry();\n }\n\n private syncRevealCardGeometry(resetTransform = this.revealExitingKey === null): void {\n const rect = this.ports.layout.revealCard;\n const padding = this.revealKind === 'portrait' ? 0 : this.ports.photo.revealFramePadding;\n if (resetTransform) {\n this.revealCard.pivot.set(rect.width / 2, rect.height / 2);\n this.revealCard.position.set(rect.x + rect.width / 2, rect.y + rect.height / 2);\n }\n this.revealShadowBlur.strength = Math.max(\n 0,\n this.resolveTuningNumber('visual.story.revealShadowBlurStrength', 8),\n );\n this.revealShadowBlur.padding = 16;\n this.syncArchiveMotionFilterArea(1, 1);\n this.revealShadow\n .clear()\n .roundRect(22, 30, rect.width, rect.height, 5)\n .fill({ color: this.ports.photo.shadow, alpha: 0.6 })\n .roundRect(12, 17, rect.width, rect.height, 5)\n .fill({ color: this.ports.photo.shadowWarm, alpha: 0.58 });\n this.revealFrame.visible = this.revealKind !== 'portrait';\n this.revealFrame\n .clear()\n .roundRect(0, 0, rect.width, rect.height, 5)\n .fill({ color: this.ports.photo.paper, alpha: 1 })\n .stroke({\n color: this.ports.photo.paperEdge,\n width: this.ports.photo.revealBorderWidth,\n alpha: 0.94,\n });\n this.revealMask\n .clear()\n .roundRect(\n padding,\n padding,\n Math.max(1, rect.width - padding * 2),\n Math.max(1, rect.height - padding * 2),\n 3,\n )\n .fill(this.ports.colors.mask);\n if (!this.revealImage) return;\n const imageRect = resolveCoverRect(\n { width: this.revealImage.texture.width, height: this.revealImage.texture.height },\n {\n x: padding,\n y: padding,\n width: Math.max(1, rect.width - padding * 2),\n height: Math.max(1, rect.height - padding * 2),\n },\n );\n this.revealImage.position.set(imageRect.x, imageRect.y);\n this.revealImage.width = imageRect.width;\n this.revealImage.height = imageRect.height;\n }\n\n private restoreRevealCardPose(): void {\n this.archiveMotionFilter?.reset();\n this.reveal.alpha = 1;\n this.revealShade.alpha = 1;\n this.revealCard.alpha = 1;\n this.revealCard.scale.set(1);\n this.revealCard.rotation = 0;\n this.syncRevealCardGeometry(true);\n }\n\n private resolveTuningNumber(path: SessionTuningPath, fallback: number): number {\n const value = this.tuning?.get(path);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n }\n}\n\nexport interface StoryThumbnailGridLayout {\n columns: number;\n rows: number;\n gapX: number;\n gapY: number;\n thumbnailWidth: number;\n thumbnailHeight: number;\n capacity: number;\n rects: PixiLayoutRect[];\n}\n\nexport type StoryThumbnailFlow = 'top-down-left-to-right' | 'top-down-right-to-left';\n\nexport const resolveStoryThumbnailGrid = (\n panel: PixiLayoutRect,\n count: number,\n flow: StoryThumbnailFlow = 'top-down-left-to-right',\n itemScale = 1,\n options: StorySurfaceLayout['thumbnailGrid'],\n): StoryThumbnailGridLayout => {\n const { capacity, padding, gapX, columns, rows } = options;\n const visibleCount = Math.max(0, Math.min(capacity, Math.floor(count)));\n const innerWidth = panel.width - padding * 2;\n const innerHeight = panel.height - padding * 2;\n const availableWidth = (innerWidth - gapX * (columns - 1)) / columns;\n const baseThumbnailWidth = availableWidth;\n const baseThumbnailHeight = baseThumbnailWidth * options.aspectRatio;\n const thumbnailWidth = Math.max(32, baseThumbnailWidth * Math.max(0.2, itemScale));\n const thumbnailHeight = thumbnailWidth * options.aspectRatio;\n const baseStepY = (innerHeight - baseThumbnailHeight) / (rows - 1);\n const gapY = baseStepY - thumbnailHeight;\n const baseGridWidth = baseThumbnailWidth * columns + gapX * (columns - 1);\n const baseStartX = panel.x + padding + (innerWidth - baseGridWidth) / 2;\n return {\n columns,\n rows,\n gapX,\n gapY,\n thumbnailWidth,\n thumbnailHeight,\n capacity,\n rects: Array.from({ length: visibleCount }, (_, index) => {\n const column = Math.floor(index / rows);\n const row = index % rows;\n const visualColumn = flow === 'top-down-left-to-right' ? column : columns - 1 - column;\n const centerX =\n baseStartX + visualColumn * (baseThumbnailWidth + gapX) + baseThumbnailWidth / 2;\n const centerY = panel.y + padding + row * baseStepY + baseThumbnailHeight / 2;\n return resolvePixiLayoutRectAtCenter(\n { x: centerX, y: centerY },\n { width: thumbnailWidth, height: thumbnailHeight },\n );\n }),\n };\n};\n", "export type FieldVisualId =\n | 'heavyRain'\n | 'fire'\n | 'thunderstorm'\n | 'earthquake'\n | 'arcaneVeil'\n | 'denseFog'\n | 'dark';\nimport type {\n BlurFilter,\n Container,\n Graphics,\n Particle,\n ParticleContainer,\n Rectangle,\n Sprite,\n Texture,\n Ticker,\n} from 'pixi.js';\nimport type { PixiAnimationActivity } from './PixiAnimationActivity.js';\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\nimport { PixiPersistentEffectTransition } from './PixiPersistentEffectTransition.js';\nimport type { PixiSceneGraph } from './PixiSceneGraph.js';\nimport type { PixiShaderRuntime } from './PixiShaderRuntime.js';\nimport { stableRange, stableUnit } from './effects/PixiStableRandom.js';\nimport type { SessionTuningResolver } from './tuning/SessionTuningResolver.js';\nimport type { SessionTuningPath } from './tuning/SessionTuningTypes.js';\n\ninterface Constructors {\n BlurFilter: typeof BlurFilter;\n Container: new (options?: { label?: string }) => Container;\n Graphics: new (options?: { label?: string }) => Graphics;\n Particle: new (options: ConstructorParameters<typeof Particle>[0]) => Particle;\n ParticleContainer: new (\n options: ConstructorParameters<typeof ParticleContainer>[0],\n ) => ParticleContainer;\n Rectangle: typeof Rectangle;\n Texture: typeof Texture;\n}\n\ninterface ParticleState {\n readonly particle: Particle;\n readonly speed: number;\n readonly drift: number;\n readonly phase: number;\n readonly baseAlpha: number;\n readonly resetY: number;\n readonly vanishY: number;\n}\n\ninterface ActiveField {\n readonly generation: number;\n readonly id: FieldVisualId;\n readonly root: Container;\n readonly shader: Sprite | null;\n readonly particles: readonly ParticleState[];\n readonly lightning: Graphics | null;\n readonly flash: Graphics | null;\n readonly rainLayer: Container | null;\n readonly rainBlur: BlurFilter | null;\n}\n\nexport interface PixiBattleFieldSurfaceOptions {\n readonly stage: { width: number; height: number };\n readonly intensity: number;\n readonly colors: {\n rainOverlay: string;\n rainColor: string;\n lightningOverlay: string;\n lightningColor: string;\n emberColor: string;\n ashColor: string;\n };\n readonly scene: PixiSceneGraph;\n readonly shaderRuntime: PixiShaderRuntime;\n readonly director: PixiAnimationDirector;\n readonly ticker: Ticker;\n readonly activity: PixiAnimationActivity;\n readonly constructors: Constructors;\n readonly getTuning: () => SessionTuningResolver | undefined;\n readonly requestRender: () => void;\n readonly setRosterShake: (x: number, y: number, rotation: number, scale: number) => void;\n readonly setStoryShake: (\n transforms: readonly [\n StoryShakeTransform,\n StoryShakeTransform,\n StoryShakeTransform,\n StoryShakeTransform,\n ],\n ) => void;\n}\n\nexport interface StoryShakeTransform {\n readonly x: number;\n readonly y: number;\n readonly rotation: number;\n readonly scale: number;\n}\n\nconst colorNumber = (value: string): number => Number.parseInt(value.replace('#', ''), 16);\n\nexport class PixiBattleFieldSurface {\n private profile: 'story' | 'battle' = 'battle';\n setProfile(profile: 'story' | 'battle'): void {\n if (this.profile !== profile) this.resetEarthquakeTransform();\n this.profile = profile;\n }\n diagnostics(): string {\n const mounted = this.active ?? this.exitingField;\n return `Field ${mounted?.id ?? 'none'} \u00B7 alpha ${mounted?.root.alpha ?? 0} \u00B7 Shader Filter ${mounted?.shader?.filters?.length ?? 0}`;\n }\n private active: ActiveField | null = null;\n private exitingField: ActiveField | null = null;\n private exitPromise: Promise<boolean> | null = null;\n private readonly releasedFields = new WeakSet<ActiveField>();\n private readonly persistentTransition: PixiPersistentEffectTransition;\n private suspended = false;\n private motionSuspended = false;\n private paused = false;\n private reducedMotion = false;\n private elapsedMs = 0;\n private lightningStep = 0;\n private lightningAtMs = 0;\n private lightningVisibleUntilMs = 0;\n private lightningFadeDurationMs = 1;\n private lightningSecondFlashAtMs = 0;\n private lightningSecondFlashUntilMs = 0;\n private rainGustStep = 0;\n private rainGustStartsAtMs = 0;\n private rainGustEndsAtMs = 0;\n private rainGustAddedSpeed = 0;\n private rainNextGustAtMs = 0;\n private rainAngleFromRad = Math.PI / 6;\n private rainAngleToRad = Math.PI / 6;\n private rainCurrentAngleRad = Math.PI / 6;\n private rainCurrentAddedSpeed = 0;\n private rainCurrentGustRatio = 0;\n private releaseActivity: (() => void) | null = null;\n private generation = 0;\n\n constructor(private readonly options: PixiBattleFieldSurfaceOptions) {\n this.persistentTransition = new PixiPersistentEffectTransition({\n director: options.director,\n getTuning: options.getTuning,\n requestRender: options.requestRender,\n });\n }\n\n async replace(\n effectId: FieldVisualId | null,\n signal: AbortSignal,\n onMounted?: () => void,\n ): Promise<void> {\n await this.replaceEffect(effectId, signal, onMounted, false);\n }\n\n /** Snapshot restore has no outgoing fade or effect entrance. Called only at the scene commit. */\n hydrate(effectId: FieldVisualId | null): void {\n this.reset();\n if (!effectId) return;\n const active = this.createActive(effectId, ++this.generation);\n this.active = active;\n active.root.alpha = 1;\n active.root.visible = !this.suspended;\n this.motionSuspended = this.suspended;\n if (active.shader) this.options.shaderRuntime.setSuspended(active.shader, this.suspended);\n this.options.scene.fieldFxLayer.addChild(active.root);\n this.elapsedMs = 0;\n this.lightningStep = 0;\n this.lightningAtMs =\n effectId === 'thunderstorm'\n ? this.number('motion.battle.fieldFx.thunder.firstDelayMinMs', 800)\n : 0;\n this.lightningVisibleUntilMs = 0;\n this.lightningSecondFlashAtMs = 0;\n this.lightningSecondFlashUntilMs = 0;\n this.startTicker();\n this.options.requestRender();\n }\n\n private async replaceEffect(\n effectId: FieldVisualId | null,\n signal: AbortSignal,\n onMounted: (() => void) | undefined,\n forceRecreate: boolean,\n ): Promise<void> {\n const generation = ++this.generation;\n if (this.exitPromise) await this.exitPromise;\n if (signal.aborted || generation !== this.generation) return;\n const retained = this.active;\n if (!forceRecreate && effectId && retained?.id === effectId) {\n retained.root.visible = !this.suspended;\n this.motionSuspended = this.suspended;\n if (retained.shader) this.options.shaderRuntime.setSuspended(retained.shader, this.suspended);\n onMounted?.();\n if (!this.suspended) await this.persistentTransition.fadeIn(retained.root, 1, signal);\n return;\n }\n await this.releaseActive(signal, !this.suspended);\n if (!effectId || signal.aborted || generation !== this.generation) return;\n const active = this.createActive(effectId, generation);\n this.active = active;\n active.root.alpha = 0;\n active.root.visible = !this.suspended;\n this.motionSuspended = this.suspended;\n if (active.shader) this.options.shaderRuntime.setSuspended(active.shader, this.suspended);\n this.options.scene.fieldFxLayer.addChild(active.root);\n this.elapsedMs = 0;\n this.lightningStep = 0;\n this.lightningAtMs = 0;\n this.lightningVisibleUntilMs = 0;\n this.lightningSecondFlashAtMs = 0;\n this.lightningSecondFlashUntilMs = 0;\n this.rainGustStep = 0;\n this.rainGustStartsAtMs = 0;\n this.rainGustEndsAtMs = 0;\n this.rainGustAddedSpeed = 0;\n this.rainNextGustAtMs = 0;\n this.rainAngleFromRad = Math.PI / 6;\n this.rainAngleToRad = Math.PI / 6;\n this.rainCurrentAngleRad = Math.PI / 6;\n this.rainCurrentAddedSpeed = 0;\n this.rainCurrentGustRatio = 0;\n if (effectId === 'thunderstorm') {\n this.lightningAtMs = stableRange(\n 'battle-field:thunder:first',\n this.number('motion.battle.fieldFx.thunder.firstDelayMinMs', 800),\n this.number('motion.battle.fieldFx.thunder.firstDelayMaxMs', 1800),\n );\n }\n this.startTicker();\n onMounted?.();\n if (!this.suspended) {\n await this.persistentTransition.fadeIn(active.root, 1, signal);\n }\n if (signal.aborted && this.active === active) await this.releaseActive(signal, false);\n }\n\n setPaused(paused: boolean): void {\n this.paused = paused;\n if (paused) this.resetRainBlur();\n }\n\n setSuspended(suspended: boolean): void {\n if (this.suspended === suspended) return;\n this.suspended = suspended;\n const active = this.active;\n if (!active) return;\n if (!suspended) {\n this.motionSuspended = false;\n active.root.visible = true;\n if (active.shader) this.options.shaderRuntime.setSuspended(active.shader, false);\n }\n const transition = suspended\n ? this.persistentTransition.fadeOut(active.root, 1, new AbortController().signal)\n : this.persistentTransition.fadeIn(active.root, 1, new AbortController().signal);\n void transition.then((completed) => {\n if (!completed || this.active !== active || this.suspended !== suspended) return;\n if (suspended) {\n this.motionSuspended = true;\n active.root.visible = false;\n if (active.shader) this.options.shaderRuntime.setSuspended(active.shader, true);\n this.resetEarthquakeTransform();\n this.resetRainBlur();\n }\n this.options.requestRender();\n });\n this.options.requestRender();\n }\n\n setReducedMotion(reducedMotion: boolean): void {\n this.reducedMotion = reducedMotion;\n this.persistentTransition.setReducedMotion(reducedMotion);\n if (reducedMotion) {\n if (this.active) {\n this.active.root.alpha = this.suspended ? 0 : 1;\n this.active.root.visible = !this.suspended;\n if (this.active.shader)\n this.options.shaderRuntime.setSuspended(this.active.shader, this.suspended);\n }\n this.motionSuspended = this.suspended;\n this.resetEarthquakeTransform();\n this.resetRainBlur();\n }\n }\n\n reset(): void {\n this.generation += 1;\n this.persistentTransition.cancel('field-effect-reset');\n const active = this.active;\n const exiting = this.exitingField;\n this.active = null;\n this.exitingField = null;\n this.motionSuspended = false;\n if (active) this.destroyActive(active);\n if (exiting) this.destroyActive(exiting);\n this.stopTicker();\n }\n\n destroy(): void {\n this.reset();\n }\n\n refreshTuning(): void {\n const id = this.active?.id;\n if (!id) return;\n void this.replaceEffect(id, new AbortController().signal, undefined, true);\n }\n\n private createActive(id: FieldVisualId, generation: number): ActiveField {\n const root = new this.options.constructors.Container({ label: `battle-field:${id}` });\n root.eventMode = 'none';\n let shader: Sprite | null = null;\n let particles: ParticleState[] = [];\n let lightning: Graphics | null = null;\n let flash: Graphics | null = null;\n let rainLayer: Container | null = null;\n let rainBlur: BlurFilter | null = null;\n if (id === 'heavyRain') {\n this.createOverlay(\n root,\n 'battle-field:rain-veil',\n this.options.colors.rainOverlay,\n 'visual.battle.fieldFx.rain.overlayAlpha',\n 0.12,\n );\n const rain = this.createRain(root);\n particles = rain.particles;\n rainLayer = rain.layer;\n rainBlur = rain.blur;\n } else if (id === 'fire') {\n shader = this.options.shaderRuntime.create('fire', this.options.intensity, {\n uFireSmokeOpacity: {\n value: this.number('visual.battle.fieldFx.fire.smokeOpacity', 0.42),\n type: 'f32',\n },\n uFirelightIntensity: {\n value: this.number('visual.battle.fieldFx.fire.firelightIntensity', 0.24),\n type: 'f32',\n },\n });\n root.addChild(shader);\n particles = [...this.createEmbers(root), ...this.createAsh(root)];\n } else if (id === 'thunderstorm') {\n this.createOverlay(\n root,\n 'battle-field:thunder-veil',\n this.options.colors.lightningOverlay,\n 'visual.battle.fieldFx.thunder.overlayAlpha',\n 0.1,\n );\n flash = new this.options.constructors.Graphics({ label: 'battle-field:thunder-flash' });\n flash.rect(0, 0, this.options.stage.width, this.options.stage.height).fill({\n color: colorNumber(this.options.colors.lightningColor),\n alpha: 1,\n });\n flash.alpha = 0;\n lightning = new this.options.constructors.Graphics({ label: 'battle-field:lightning' });\n lightning.alpha = 0;\n root.addChild(flash, lightning);\n } else if (id !== 'earthquake') {\n const intensity =\n id === 'dark'\n ? this.options.intensity * this.number('visual.battle.fieldFx.dark.opacity', 1)\n : this.options.intensity;\n shader = this.options.shaderRuntime.create(id, intensity);\n root.addChild(shader);\n }\n return { generation, id, root, shader, particles, lightning, flash, rainLayer, rainBlur };\n }\n\n private createRain(root: Container): {\n particles: ParticleState[];\n layer: Container;\n blur: BlurFilter;\n } {\n const count = Math.round(this.number('visual.battle.fieldFx.rain.count', 108));\n const minWidth = this.number('visual.battle.fieldFx.rain.sizeMinPx', 1);\n const maxWidth = this.number('visual.battle.fieldFx.rain.sizeMaxPx', 2.4);\n const minLength = this.number('visual.battle.fieldFx.rain.lengthMinPx', 22);\n const maxLength = this.number('visual.battle.fieldFx.rain.lengthMaxPx', 48);\n const minAlpha = this.number('visual.battle.fieldFx.rain.alphaMin', 0.22);\n const maxAlpha = this.number('visual.battle.fieldFx.rain.alphaMax', 0.68);\n const particles = Array.from({ length: count }, (_, index) => {\n const seed = `battle-field:rain:${index}`;\n const width = stableRange(seed, minWidth, maxWidth, 1);\n const length = stableRange(seed, minLength, maxLength, 2);\n const baseAlpha = stableRange(seed, minAlpha, maxAlpha, 4);\n const particle = new this.options.constructors.Particle({\n texture: this.options.constructors.Texture.WHITE,\n x: stableRange(seed, 0, this.options.stage.width, 3),\n y: stableRange(seed, -this.options.stage.height, this.options.stage.height, 6),\n scaleX: width / Math.max(1, this.options.constructors.Texture.WHITE.width),\n scaleY: length / Math.max(1, this.options.constructors.Texture.WHITE.height),\n anchorX: 0.5,\n anchorY: 0.5,\n tint: colorNumber(this.options.colors.rainColor),\n alpha: baseAlpha,\n });\n return {\n particle,\n speed: stableRange(\n seed,\n this.number('motion.battle.fieldFx.rain.speedMinPxPerSecond', 1560),\n this.number('motion.battle.fieldFx.rain.speedMaxPxPerSecond', 2700),\n 5,\n ),\n drift: 0,\n phase: 0,\n baseAlpha,\n resetY: -length,\n vanishY: Number.POSITIVE_INFINITY,\n };\n });\n const layer = new this.options.constructors.Container({ label: 'battle-field:rain-lines' });\n const blur = new this.options.constructors.BlurFilter({\n strength: 0,\n quality: 1,\n kernelSize: 5,\n resolution: 0.5,\n });\n blur.repeatEdgePixels = true;\n blur.enabled = false;\n layer.filters = [blur];\n layer.filterArea = new this.options.constructors.Rectangle(\n 0,\n 0,\n this.options.stage.width,\n this.options.stage.height,\n );\n root.addChild(layer);\n this.addParticleContainer(layer, particles, false, true);\n return { particles, layer, blur };\n }\n\n private createEmbers(root: Container): ParticleState[] {\n return this.createRisingParticles(root, {\n key: 'ember',\n count: Math.round(this.number('visual.battle.fieldFx.fire.emberCount', 48)),\n color: colorNumber(this.options.colors.emberColor),\n sizeMin: 2,\n sizeMax: 6.5,\n alphaMin: 0.42,\n alphaMax: 0.94,\n speedMin: this.number('motion.battle.fieldFx.fire.emberSpeedMinPxPerSecond', 300),\n speedMax: this.number('motion.battle.fieldFx.fire.emberSpeedMaxPxPerSecond', 500),\n driftMin: 8,\n driftMax: 23,\n });\n }\n\n private createAsh(root: Container): ParticleState[] {\n return this.createRisingParticles(root, {\n key: 'ash',\n count: Math.round(this.number('visual.battle.fieldFx.fire.ashCount', 64)),\n color: colorNumber(this.options.colors.ashColor),\n sizeMin: 1.5,\n sizeMax: 4.5,\n alphaMin: 0.12,\n alphaMax: 0.38,\n speedMin: this.number('motion.battle.fieldFx.fire.ashSpeedMinPxPerSecond', 180),\n speedMax: this.number('motion.battle.fieldFx.fire.ashSpeedMaxPxPerSecond', 440),\n driftMin: 18,\n driftMax: 55,\n });\n }\n\n private createRisingParticles(\n root: Container,\n config: {\n key: string;\n count: number;\n color: number;\n sizeMin: number;\n sizeMax: number;\n alphaMin: number;\n alphaMax: number;\n speedMin: number;\n speedMax: number;\n driftMin: number;\n driftMax: number;\n },\n ): ParticleState[] {\n const particles = Array.from({ length: config.count }, (_, index) => {\n const seed = `battle-field:${config.key}:${index}`;\n const size = stableRange(seed, config.sizeMin, config.sizeMax, 1);\n const vanishY = stableRange(\n seed,\n this.options.stage.height * 0.42,\n this.options.stage.height * 0.58,\n 9,\n );\n const resetY = this.options.stage.height + size + 10;\n const baseAlpha = stableRange(seed, config.alphaMin, config.alphaMax, 4);\n const particle = new this.options.constructors.Particle({\n texture: this.options.constructors.Texture.WHITE,\n x: stableRange(seed, 0, this.options.stage.width, 2),\n y: stableRange(seed, vanishY, resetY, 3),\n scaleX: size / Math.max(1, this.options.constructors.Texture.WHITE.width),\n scaleY: size / Math.max(1, this.options.constructors.Texture.WHITE.height),\n tint: config.color,\n alpha: baseAlpha,\n });\n const direction = stableUnit(seed, 5) > 0.5 ? 1 : -1;\n return {\n particle,\n speed: stableRange(seed, config.speedMin, config.speedMax, 6),\n drift: direction * stableRange(seed, config.driftMin, config.driftMax, 7),\n phase: stableRange(seed, 0, Math.PI * 2, 8),\n baseAlpha,\n resetY,\n vanishY,\n };\n });\n this.addParticleContainer(root, particles, true, false);\n return particles;\n }\n\n private addParticleContainer(\n root: Container,\n states: readonly ParticleState[],\n dynamicColor: boolean,\n dynamicRotation: boolean,\n ): void {\n const container = new this.options.constructors.ParticleContainer({\n texture: this.options.constructors.Texture.WHITE,\n particles: states.map((state) => state.particle),\n dynamicProperties: {\n position: true,\n rotation: dynamicRotation,\n vertex: false,\n uvs: false,\n color: dynamicColor,\n },\n });\n container.boundsArea = new this.options.constructors.Rectangle(\n 0,\n 0,\n this.options.stage.width,\n this.options.stage.height,\n );\n container.update();\n root.addChild(container);\n }\n\n private startTicker(): void {\n if (this.releaseActivity) return;\n this.options.ticker.add(this.tick);\n this.releaseActivity = this.options.activity.acquire('battle-field-surface');\n }\n\n private stopTicker(): void {\n this.options.ticker.remove(this.tick);\n this.releaseActivity?.();\n this.releaseActivity = null;\n }\n\n private tick = (ticker: { deltaMS: number }): void => {\n const active = this.active ?? this.exitingField;\n if (!active || this.paused || this.motionSuspended || this.reducedMotion) return;\n const deltaMs = Math.max(0, Math.min(50, ticker.deltaMS));\n this.elapsedMs += deltaMs;\n if (active.id === 'heavyRain') this.tickRain(active, deltaMs / 1000);\n else if (active.id === 'fire') this.tickRising(active.particles, deltaMs / 1000);\n else if (active.id === 'thunderstorm') this.tickThunder(active);\n else if (active.id === 'earthquake') this.tickEarthquake(active);\n this.options.requestRender();\n };\n\n private tickRain(active: ActiveField, deltaSeconds: number): void {\n this.updateRainWind();\n this.updateRainBlur(active.rainBlur, this.rainCurrentGustRatio);\n const angle = this.rainCurrentAngleRad;\n const angleCos = Math.max(0.01, Math.cos(angle));\n const angleSin = Math.sin(angle);\n for (const state of active.particles) {\n const totalSpeed = state.speed / angleCos + this.rainCurrentAddedSpeed;\n state.particle.x -= totalSpeed * angleSin * deltaSeconds;\n state.particle.y += totalSpeed * angleCos * deltaSeconds;\n state.particle.rotation = angle;\n if (state.particle.y > this.options.stage.height - state.resetY)\n state.particle.y = state.resetY;\n if (state.particle.x < -80) state.particle.x = this.options.stage.width + 80;\n else if (state.particle.x > this.options.stage.width + 80) state.particle.x = -80;\n }\n }\n\n private updateRainBlur(blur: BlurFilter | null, gustRatio: number): void {\n if (!blur) return;\n const strength = this.number('visual.battle.fieldFx.rain.motionBlurStrength', 2.5) * gustRatio;\n blur.strengthX = strength * 0.55;\n blur.strengthY = strength;\n blur.enabled = strength >= 0.05;\n }\n\n private resetRainBlur(): void {\n const blur = (this.active ?? this.exitingField)?.rainBlur;\n if (!blur) return;\n blur.strengthX = 0;\n blur.strengthY = 0;\n blur.enabled = false;\n }\n\n private updateRainWind(): void {\n if (this.elapsedMs >= this.rainNextGustAtMs && this.elapsedMs >= this.rainGustEndsAtMs) {\n const seed = `battle-field:rain-gust:${this.rainGustStep}`;\n const duration = stableRange(\n seed,\n this.number('motion.battle.fieldFx.rain.gustDurationMinMs', 700),\n this.number('motion.battle.fieldFx.rain.gustDurationMaxMs', 1600),\n 1,\n );\n const angleMinDeg = this.number('motion.battle.fieldFx.rain.angleMinDeg', 30);\n const angleMaxDeg = this.number('motion.battle.fieldFx.rain.angleMaxDeg', 35);\n const angleMinRad = (Math.min(angleMinDeg, angleMaxDeg) * Math.PI) / 180;\n const angleMaxRad = (Math.max(angleMinDeg, angleMaxDeg) * Math.PI) / 180;\n const targetAngle = stableRange(seed, angleMinRad, angleMaxRad, 2);\n this.rainGustStartsAtMs = this.elapsedMs;\n this.rainGustEndsAtMs = this.elapsedMs + duration;\n this.rainAngleFromRad = this.rainGustStep === 0 ? targetAngle : this.rainCurrentAngleRad;\n this.rainAngleToRad = targetAngle;\n this.rainGustAddedSpeed = stableRange(\n seed,\n this.number('motion.battle.fieldFx.rain.gustSpeedMinPxPerSecond', 520),\n this.number('motion.battle.fieldFx.rain.gustSpeedMaxPxPerSecond', 1100),\n 3,\n );\n this.rainNextGustAtMs =\n this.rainGustEndsAtMs +\n stableRange(\n seed,\n this.number('motion.battle.fieldFx.rain.gustGapMinMs', 180),\n this.number('motion.battle.fieldFx.rain.gustGapMaxMs', 700),\n 4,\n );\n this.rainGustStep += 1;\n }\n if (this.elapsedMs >= this.rainGustEndsAtMs) {\n this.rainCurrentAngleRad = this.rainAngleToRad;\n this.rainCurrentAddedSpeed = 0;\n this.rainCurrentGustRatio = 0;\n return;\n }\n const duration = Math.max(1, this.rainGustEndsAtMs - this.rainGustStartsAtMs);\n const progress = Math.max(\n 0,\n Math.min(1, (this.elapsedMs - this.rainGustStartsAtMs) / duration),\n );\n const angleProgress = progress * progress * (3 - 2 * progress);\n this.rainCurrentAngleRad =\n this.rainAngleFromRad + (this.rainAngleToRad - this.rainAngleFromRad) * angleProgress;\n const envelope = Math.sin(progress * Math.PI);\n const flutter = 0.86 + Math.sin(this.elapsedMs / 115 + this.rainGustStep) * 0.14;\n const gustStrength = envelope * flutter;\n this.rainCurrentAddedSpeed = this.rainGustAddedSpeed * gustStrength;\n this.rainCurrentGustRatio = Math.max(\n 0,\n Math.min(\n 1,\n this.rainCurrentAddedSpeed /\n Math.max(1, this.number('motion.battle.fieldFx.rain.gustSpeedMaxPxPerSecond', 1100)),\n ),\n );\n }\n\n private tickRising(states: readonly ParticleState[], deltaSeconds: number): void {\n for (const state of states) {\n state.particle.y -= state.speed * deltaSeconds;\n const heatWave = Math.sin(this.elapsedMs / 760 + state.phase) * Math.abs(state.drift) * 0.55;\n state.particle.x += (state.drift + heatWave) * deltaSeconds;\n const travel = Math.max(1, state.resetY - state.vanishY);\n const remaining = Math.max(0, Math.min(1, (state.particle.y - state.vanishY) / travel));\n state.particle.alpha = state.baseAlpha * Math.min(1, remaining / 0.35);\n if (state.particle.y <= state.vanishY) {\n state.particle.y = state.resetY;\n state.particle.x =\n (state.particle.x + this.options.stage.width * 0.31 + state.phase * 37) %\n this.options.stage.width;\n state.particle.alpha = state.baseAlpha;\n }\n if (state.particle.x < -10) state.particle.x = this.options.stage.width + 10;\n else if (state.particle.x > this.options.stage.width + 10) state.particle.x = -10;\n }\n }\n\n private tickThunder(active: ActiveField): void {\n if (!active.lightning || !active.flash) return;\n if (this.elapsedMs >= this.lightningAtMs) this.beginLightning(active.lightning);\n const primaryAlpha = Math.max(\n 0,\n Math.min(\n 1,\n (this.lightningVisibleUntilMs - this.elapsedMs) / Math.max(1, this.lightningFadeDurationMs),\n ),\n );\n const secondAlpha =\n this.lightningSecondFlashAtMs > 0 &&\n this.elapsedMs >= this.lightningSecondFlashAtMs &&\n this.elapsedMs < this.lightningSecondFlashUntilMs\n ? (this.lightningSecondFlashUntilMs - this.elapsedMs) /\n Math.max(1, this.lightningSecondFlashUntilMs - this.lightningSecondFlashAtMs)\n : 0;\n active.lightning.alpha = Math.max(primaryAlpha, secondAlpha * 0.72);\n active.flash.alpha =\n this.number('visual.battle.fieldFx.thunder.flashAlpha', 0.24) *\n Math.max(primaryAlpha, secondAlpha * 0.55);\n }\n\n private beginLightning(graphics: Graphics): void {\n const seed = `battle-field:thunder:${this.lightningStep}`;\n const startX = stableRange(\n seed,\n this.options.stage.width * 0.12,\n this.options.stage.width * 0.88,\n 1,\n );\n const endY = stableRange(\n seed,\n this.options.stage.height * 0.62,\n this.options.stage.height * 0.98,\n 2,\n );\n const segments = Math.round(\n stableRange(\n seed,\n this.number('visual.battle.fieldFx.thunder.segmentMin', 9),\n this.number('visual.battle.fieldFx.thunder.segmentMax', 17),\n 3,\n ),\n );\n const pathTrend = stableRange(\n seed,\n -this.options.stage.width * 0.12,\n this.options.stage.width * 0.12,\n 4,\n );\n const points = Array.from({ length: segments + 1 }, (_, index) => {\n const progress = index / segments;\n let y =\n endY * progress + stableRange(seed, -endY / segments / 3, endY / segments / 3, 30 + index);\n if (index === 0) y = 0;\n else if (index === segments) y = endY;\n return {\n x:\n startX +\n pathTrend * progress +\n stableRange(\n seed,\n -this.options.stage.width * 0.065,\n this.options.stage.width * 0.065,\n 10 + index,\n ) *\n Math.sin(progress * Math.PI),\n y,\n };\n });\n graphics.clear().moveTo(points[0]!.x, points[0]!.y);\n points.slice(1).forEach((point) => graphics.lineTo(point.x, point.y));\n graphics.stroke({\n color: colorNumber(this.options.colors.lightningColor),\n width: stableRange(\n seed,\n this.number('visual.battle.fieldFx.thunder.mainWidthMinPx', 3.2),\n this.number('visual.battle.fieldFx.thunder.mainWidthMaxPx', 5.4),\n 5,\n ),\n alpha: 0.98,\n cap: 'round',\n join: 'round',\n });\n for (let index = 2; index < segments - 1; index += 2) {\n if (stableUnit(seed, 50 + index) < 0.48) continue;\n const point = points[index]!;\n const direction = stableUnit(seed, 70 + index) > 0.5 ? 1 : -1;\n const branchLength = stableRange(seed, 55, 190, 80 + index);\n const branchDrop = stableRange(seed, 45, 155, 100 + index);\n const branchMidX =\n point.x + direction * branchLength * stableRange(seed, 0.3, 0.65, 120 + index);\n const branchMidY = point.y + branchDrop * stableRange(seed, 0.25, 0.6, 140 + index);\n graphics\n .moveTo(point.x, point.y)\n .lineTo(branchMidX, branchMidY)\n .lineTo(point.x + direction * branchLength, point.y + branchDrop)\n .stroke({\n color: colorNumber(this.options.colors.lightningColor),\n width: stableRange(\n seed,\n this.number('visual.battle.fieldFx.thunder.branchWidthMinPx', 1),\n this.number('visual.battle.fieldFx.thunder.branchWidthMaxPx', 2.2),\n 160 + index,\n ),\n alpha: 0.72,\n cap: 'round',\n join: 'round',\n });\n }\n this.lightningFadeDurationMs = stableRange(\n seed,\n this.number('motion.battle.fieldFx.thunder.fadeDurationMinMs', 180),\n this.number('motion.battle.fieldFx.thunder.fadeDurationMaxMs', 280),\n 180,\n );\n this.lightningVisibleUntilMs = this.elapsedMs + this.lightningFadeDurationMs;\n this.lightningSecondFlashAtMs =\n stableUnit(seed, 90) < this.number('visual.battle.fieldFx.thunder.doubleFlashChance', 0.28)\n ? this.elapsedMs + 145\n : 0;\n this.lightningSecondFlashUntilMs = this.lightningSecondFlashAtMs\n ? this.lightningSecondFlashAtMs +\n stableRange(\n seed,\n this.number('motion.battle.fieldFx.thunder.secondFadeDurationMinMs', 130),\n this.number('motion.battle.fieldFx.thunder.secondFadeDurationMaxMs', 190),\n 181,\n )\n : 0;\n this.lightningStep += 1;\n const gap = stableRange(\n seed,\n this.number('motion.battle.fieldFx.thunder.gapMinMs', 2500),\n this.number('motion.battle.fieldFx.thunder.gapMaxMs', 5000),\n 91,\n );\n this.lightningAtMs = this.elapsedMs + gap;\n }\n\n private tickEarthquake(active: ActiveField): void {\n const presence = active.root.alpha;\n const keyframes = [\n [-2, 1.4, -0.07],\n [2, -1.2, 0.07],\n [-1.4, -2, -0.05],\n [1.6, 1.5, 0.05],\n [0, 0, 0],\n ] as const;\n const frameMs = this.number('motion.battle.fieldFx.earthquake.frameDurationMs', 80);\n const frameIndex = Math.floor(this.elapsedMs / Math.max(1, frameMs));\n const toTransform = (phase: number, strength: number): StoryShakeTransform => {\n const frame = keyframes[(frameIndex + phase) % keyframes.length]!;\n return {\n x: frame[0] * strength,\n y: frame[1] * strength,\n rotation: ((frame[2] * Math.PI) / 180) * strength,\n scale: frame === keyframes[4] ? 1 : 1 + 0.004 * strength,\n };\n };\n if (this.profile === 'story') {\n this.options.setStoryShake([\n toTransform(0, presence),\n toTransform(1, 0.78 * presence),\n toTransform(3, 0.86 * presence),\n toTransform(2, 0.68 * presence),\n ]);\n } else {\n const frame = keyframes[frameIndex % keyframes.length]!;\n const rotation = ((frame[2] * Math.PI) / 180) * presence;\n const scale = frame === keyframes[4] ? 1 : 1 + 0.004 * presence;\n this.options.scene.worldShakeLayer.position.set(frame[0] * presence, frame[1] * presence);\n this.options.scene.worldShakeLayer.rotation = rotation;\n this.options.scene.worldShakeLayer.scale.set(scale);\n this.options.setRosterShake(frame[0] * presence, frame[1] * presence, rotation, scale);\n }\n }\n\n private resetEarthquakeTransform(): void {\n const rest = { x: 0, y: 0, rotation: 0, scale: 1 } as const;\n this.options.setStoryShake([rest, rest, rest, rest]);\n this.options.scene.worldShakeLayer.position.set(0, 0);\n this.options.scene.worldShakeLayer.rotation = 0;\n this.options.scene.worldShakeLayer.scale.set(1);\n this.options.setRosterShake(0, 0, 0, 1);\n }\n\n private createOverlay(\n root: Container,\n label: string,\n color: string,\n alphaPath: SessionTuningPath,\n fallbackAlpha: number,\n ): void {\n const overlay = new this.options.constructors.Graphics({ label });\n overlay.rect(0, 0, this.options.stage.width, this.options.stage.height).fill({\n color: colorNumber(color),\n alpha: this.number(alphaPath, fallbackAlpha),\n });\n root.addChild(overlay);\n }\n\n private async releaseActive(signal: AbortSignal, fade: boolean): Promise<void> {\n if (this.exitPromise) await this.exitPromise;\n const active = this.active;\n if (!active) return;\n this.active = null;\n this.exitingField = active;\n const exitPromise = this.releaseField(active, signal, fade);\n this.exitPromise = exitPromise;\n let released = false;\n try {\n released = await exitPromise;\n } finally {\n if (this.exitingField === active) {\n this.exitingField = null;\n if (!released && !this.active) this.active = active;\n }\n if (this.exitPromise === exitPromise) this.exitPromise = null;\n if (!this.active && !this.exitingField) this.stopTicker();\n }\n }\n\n private async releaseField(\n active: ActiveField,\n signal: AbortSignal,\n fade: boolean,\n ): Promise<boolean> {\n if (fade && active.root.visible && !signal.aborted) {\n const completed = await this.persistentTransition.fadeOut(active.root, 1, signal);\n if (!completed) return false;\n } else {\n this.persistentTransition.cancel('field-effect-released-immediately');\n }\n this.destroyActive(active);\n return true;\n }\n\n private destroyActive(active: ActiveField): void {\n if (this.releasedFields.has(active)) return;\n this.releasedFields.add(active);\n active.root.parent?.removeChild(active.root);\n this.options.requestRender();\n if (active.shader) this.options.shaderRuntime.release(active.shader);\n if (active.rainLayer) {\n active.rainLayer.filters = null;\n active.rainLayer.filterArea = undefined;\n }\n active.rainBlur?.destroy();\n active.root.destroy({ children: true });\n if (active.id === 'earthquake' && this.active?.id !== 'earthquake') {\n this.resetEarthquakeTransform();\n }\n }\n\n private number(path: SessionTuningPath, fallback: number): number {\n const tuning = this.options.getTuning();\n const value = tuning?.get(path);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n }\n}\n", "import type { Container, Mesh, MeshGeometry, Shader, Sprite, Texture, UniformGroup } from 'pixi.js';\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\nimport type { PixiAssetManager } from './PixiAssetManager.js';\nimport type { RuntimeLogger } from '@bardway/trpg-media';\nimport { assertUniformFields } from './uniforms.js';\nexport interface ResultLandingPoint {\n id: string;\n x: number;\n y: number;\n}\nimport { type ResultEffectTuning, type VisualResultEffect } from './ResultEffectTuning.js';\n\ntype PixiShaderMesh = Mesh<MeshGeometry, Shader>;\n\nexport interface PixiResultEffectConstructors {\n readonly Container: typeof import('pixi.js').Container;\n readonly Mesh: typeof import('pixi.js').Mesh;\n readonly MeshGeometry: typeof import('pixi.js').MeshGeometry;\n readonly Shader: typeof import('pixi.js').Shader;\n readonly Sprite: typeof import('pixi.js').Sprite;\n readonly UniformGroup: typeof import('pixi.js').UniformGroup;\n}\n\nexport interface PixiResultEffectSurfaceOptions {\n readonly parent: Container;\n readonly constructors: PixiResultEffectConstructors;\n readonly director: PixiAnimationDirector;\n readonly assets: PixiAssetManager;\n readonly requestRender: () => void;\n readonly tuning: ResultEffectTuning;\n readonly stage: { width: number; height: number };\n readonly imageUrl: string;\n readonly scope: string;\n readonly targetCount: number;\n readonly logger: RuntimeLogger;\n}\n\nexport interface ResultEffectDiagnostics {\n readonly activeEffect: VisualResultEffect | null;\n readonly objectCount: number;\n readonly estimatedDrawCalls: number;\n readonly pixelCoverageRatio: number;\n}\n\ninterface EdgeUniforms {\n uFxColor: Float32Array;\n uAlpha: number;\n uEdgeDepthPx: number;\n uSoftnessPx: number;\n uNoiseScale: number;\n uDistortion: number;\n uTime: number;\n uSeed: number;\n uMode: number;\n uBreathAmplitude: number;\n}\n\ninterface BurstUniforms {\n uFxColor: Float32Array;\n uAlpha: number;\n uCoreRatio: number;\n uRayCount: number;\n uIntensity: number;\n uRotation: number;\n uVariationSeed: number;\n}\n\nconst QUAD_VERTEX = `\nprecision highp float;\nattribute vec2 aPosition;\nattribute vec2 aUV;\nuniform mat3 uProjectionMatrix;\nuniform mat3 uWorldTransformMatrix;\nuniform mat3 uTransformMatrix;\nuniform vec4 uWorldColorAlpha;\nuniform vec4 uColor;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\n\nvoid main(void) {\n vUV = aUV;\n vWorldAlpha = uWorldColorAlpha.a * uColor.a;\n vec3 position = uProjectionMatrix * uWorldTransformMatrix * uTransformMatrix * vec3(aPosition, 1.0);\n gl_Position = vec4(position.xy, 0.0, 1.0);\n}\n`;\n\nconst edgeFragment = (width: number, height: number) => `\nprecision highp float;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\nuniform vec3 uFxColor;\nuniform float uAlpha;\nuniform float uEdgeDepthPx;\nuniform float uSoftnessPx;\nuniform float uNoiseScale;\nuniform float uDistortion;\nuniform float uTime;\nuniform float uSeed;\nuniform float uMode;\nuniform float uBreathAmplitude;\n\nfloat hash21(vec2 p) {\n p = fract(p * vec2(123.34, 456.21));\n p += dot(p, p + 45.32 + uSeed);\n return fract(p.x * p.y);\n}\n\nfloat valueNoise(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n f = f * f * (3.0 - 2.0 * f);\n return mix(mix(hash21(i), hash21(i + vec2(1.0, 0.0)), f.x),\n mix(hash21(i + vec2(0.0, 1.0)), hash21(i + 1.0), f.x), f.y);\n}\n\nvoid main(void) {\n vec2 pixel = vUV * vec2(${width.toFixed(1)}, ${height.toFixed(1)});\n float edgeDistance = min(min(pixel.x, ${width.toFixed(1)} - pixel.x),\n min(pixel.y, ${height.toFixed(1)} - pixel.y));\n float noise = valueNoise(vUV * uNoiseScale + vec2(uTime * 0.71, -uTime * 0.43));\n noise = noise * 2.0 - 1.0;\n float isOmen = 1.0 - step(0.5, uMode);\n float isLight = step(0.5, uMode);\n float warpedDistance = edgeDistance + noise * uEdgeDepthPx * uDistortion * isOmen;\n float noiseEdgeEdge = 1.0 - smoothstep(uEdgeDepthPx - uSoftnessPx,\n uEdgeDepthPx + uSoftnessPx,\n warpedDistance);\n float lightDecay = exp(-edgeDistance / max(1.0, uEdgeDepthPx * 0.28));\n float lightFeather = 1.0 - smoothstep(max(1.0, uEdgeDepthPx - uSoftnessPx * 0.35),\n uEdgeDepthPx + uSoftnessPx * 0.65,\n edgeDistance);\n float edge = mix(noiseEdgeEdge, lightDecay * lightFeather, isLight);\n float innerCut = 1.0 - smoothstep(uEdgeDepthPx * 1.45, uEdgeDepthPx * 2.15, edgeDistance);\n float breath = 1.0 + sin(uTime * 6.283185) * uBreathAmplitude * step(1.5, uMode);\n float dither = (hash21(gl_FragCoord.xy + uTime) - 0.5) / 255.0;\n float alpha = clamp((edge * innerCut * breath + dither * edge) * uAlpha * vWorldAlpha, 0.0, 1.0);\n float whiteCore = exp(-edgeDistance / max(1.0, min(uEdgeDepthPx * 0.12, uSoftnessPx * 0.28)));\n vec3 lightColor = mix(uFxColor, vec3(1.0), whiteCore * 0.96 * isLight);\n gl_FragColor = vec4(lightColor * alpha, alpha);\n}\n`;\n\nconst BURST_FRAGMENT = `\nprecision highp float;\nvarying vec2 vUV;\nvarying float vWorldAlpha;\nuniform vec3 uFxColor;\nuniform float uAlpha;\nuniform float uCoreRatio;\nuniform float uRayCount;\nuniform float uIntensity;\nuniform float uRotation;\nuniform float uVariationSeed;\n\nfloat hash11(float value) {\n return fract(sin(value * 91.3458) * 47453.5453);\n}\n\nvoid main(void) {\n vec2 p = vUV * 2.0 - 1.0;\n float radius = length(p);\n float angle = atan(p.y, p.x) + uRotation;\n float core = exp(-pow(radius / max(0.001, uCoreRatio), 2.0));\n float halo = exp(-pow(radius * 1.72, 2.0));\n float rayCoordinate = angle / 6.283185 * uRayCount + 0.5;\n float rayIndex = floor(rayCoordinate);\n float sector = abs(fract(rayCoordinate) - 0.5) * 2.0;\n float rayRandom = hash11(rayIndex + 32.0 + uVariationSeed);\n float rayLength = mix(0.42, 1.0, pow(rayRandom, 0.72));\n float raySoftness = mix(0.38, 0.62, hash11(rayIndex + 79.0 + uVariationSeed));\n float angularGlow = exp(-pow(sector / raySoftness, 2.0) * 1.65);\n float radialStart = smoothstep(0.035, 0.16, radius);\n float radialEnd = 1.0 - smoothstep(rayLength * 0.48, rayLength, radius);\n float rayEnergy = mix(0.58, 1.0, rayRandom);\n float rays = angularGlow * radialStart * radialEnd * rayEnergy;\n float energy = core * 1.3 + halo * 0.72 + rays * 0.92;\n float alpha = clamp(energy * uIntensity * uAlpha * vWorldAlpha, 0.0, 1.0);\n gl_FragColor = vec4(uFxColor * alpha, alpha);\n}\n`;\n\nconst parseColor = (value: string): Float32Array => {\n const parsed = Number.parseInt(value.slice(1), 16);\n return new Float32Array([\n ((parsed >> 16) & 0xff) / 255,\n ((parsed >> 8) & 0xff) / 255,\n (parsed & 0xff) / 255,\n ]);\n};\n\nexport const hashResultEffectSeed = (seed: string): number => {\n let hash = 2166136261;\n for (let index = 0; index < seed.length; index += 1) {\n hash ^= seed.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0) / 0xffffffff;\n};\n\nexport const sampleRectangularEdgeAlpha = (\n x: number,\n y: number,\n edgeDepthPx: number,\n softnessPx: number,\n stage: { width: number; height: number },\n): number => {\n const distance = Math.min(x, stage.width - x, y, stage.height - y);\n const start = edgeDepthPx - softnessPx;\n const end = edgeDepthPx + softnessPx;\n const t = Math.max(0, Math.min(1, (distance - start) / Math.max(0.001, end - start)));\n const smooth = t * t * (3 - 2 * t);\n return 1 - smooth;\n};\n\nexport const sampleImageBurstUnfold = (\n elapsedMs: number,\n revealMs: number,\n expandMs: number,\n endScale: number,\n): { envelope: number; rotation: number; scale: number } => {\n const safeRevealMs = Math.max(0, revealMs);\n const safeExpandMs = Math.max(0, expandMs);\n const totalDurationMs = safeRevealMs + safeExpandMs;\n if (totalDurationMs <= 0) {\n return { envelope: 0, rotation: Math.PI * 1.25, scale: Math.max(0, endScale) };\n }\n const totalMs = Math.max(1, totalDurationMs);\n const elapsed = Math.max(0, Math.min(totalMs, elapsedMs));\n const progress = elapsed / totalMs;\n const revealProgress = Math.min(1, elapsed / Math.max(1, safeRevealMs));\n const fadeProgress = Math.max(\n 0,\n Math.min(1, (elapsed - safeRevealMs) / Math.max(1, safeExpandMs)),\n );\n const envelope =\n safeRevealMs <= 0\n ? 1 - fadeProgress * fadeProgress * (3 - 2 * fadeProgress)\n : elapsed <= safeRevealMs\n ? 1 - (1 - revealProgress) * (1 - revealProgress)\n : 1 - fadeProgress * fadeProgress * (3 - 2 * fadeProgress);\n return {\n envelope,\n rotation: progress * Math.PI * 1.25,\n scale: Math.max(0, endScale) * (1 - (1 - progress) * (1 - progress)),\n };\n};\n\nexport const normalizeResultLandingPoints = (\n points: readonly ResultLandingPoint[],\n tuning: ResultEffectTuning,\n count: number,\n): readonly ResultLandingPoint[] => {\n const valid = points.filter((point) => Number.isFinite(point.x) && Number.isFinite(point.y));\n return Array.from(\n { length: count },\n (_, index) =>\n valid[index] ?? {\n id: `fallback-${index}`,\n x:\n tuning.layout.fallbackCenterX +\n (index - (count - 1) / 2) * tuning.layout.fallbackSpacingPx,\n y: tuning.layout.fallbackCenterY,\n },\n );\n};\n\n/** Retained Pixi result FX placed below the Three dice canvas and system HUD. */\nexport class PixiResultEffectSurface {\n private readonly root: Container;\n private readonly edgeMesh: PixiShaderMesh;\n private readonly edgeGeometry: MeshGeometry;\n private readonly edgeShader: Shader;\n private readonly edgeUniformGroup: UniformGroup;\n private readonly burstMeshes: readonly PixiShaderMesh[];\n private readonly burstGeometries: readonly MeshGeometry[];\n private readonly burstShaders: readonly Shader[];\n private readonly burstUniformGroups: readonly UniformGroup[];\n private failureSprites: readonly Sprite[] = [];\n private failureTexture: Texture | null = null;\n private failureTexturePromise: Promise<Texture | null> | null = null;\n private assetWarningLogged = false;\n private activeController: AbortController | null = null;\n private activeEffect: VisualResultEffect | null = null;\n private activeLandingPoints: readonly ResultLandingPoint[] = [];\n private sourceLandingPoints: readonly ResultLandingPoint[] = [];\n private edgeEnvelope = 0;\n private failureEnvelope = 0;\n private failureScaleFactor = 1;\n private failureRotation = 0;\n private reducedMotion = false;\n private destroyed = false;\n private tuning: ResultEffectTuning;\n\n constructor(private readonly options: PixiResultEffectSurfaceOptions) {\n if (\n ![options.stage.width, options.stage.height].every(\n (value) => Number.isFinite(value) && value > 0,\n ) ||\n !Number.isInteger(options.targetCount) ||\n options.targetCount < 1 ||\n !options.scope.trim()\n )\n throw new Error('Invalid result effect stage, count or scope');\n this.tuning = options.tuning;\n const { Container: ContainerConstructor } = options.constructors;\n this.root = new ContainerConstructor();\n this.root.label = 'story-dice-result-fx';\n this.root.eventMode = 'none';\n this.root.interactiveChildren = false;\n this.root.visible = false;\n const edge = this.createEdgeMesh();\n this.edgeMesh = edge.mesh;\n this.edgeGeometry = edge.geometry;\n this.edgeShader = edge.shader;\n this.edgeUniformGroup = edge.uniforms;\n const bursts = Array.from({ length: options.targetCount }, (_, index) =>\n this.createBurstMesh(index),\n );\n this.burstMeshes = bursts.map((burst) => burst.mesh);\n this.burstGeometries = bursts.map((burst) => burst.geometry);\n this.burstShaders = bursts.map((burst) => burst.shader);\n this.burstUniformGroups = bursts.map((burst) => burst.uniforms);\n this.root.addChild(this.edgeMesh, ...this.burstMeshes);\n options.parent.addChild(this.root);\n }\n\n prewarm(): Promise<void> {\n if (this.destroyed) return Promise.resolve();\n if (!this.failureTexturePromise) {\n this.failureTexturePromise = this.options.assets\n .loadTexture(\n `result-effect:${this.options.scope}:${this.options.imageUrl}`,\n this.options.imageUrl,\n this.options.scope,\n )\n .then((texture) => {\n if (!this.destroyed) {\n this.failureTexture = texture;\n this.ensureFailureSprites(texture);\n }\n return texture;\n })\n .catch((error) => {\n if (!this.assetWarningLogged) {\n this.assetWarningLogged = true;\n this.options.logger.warn('[PixiResultEffectSurface] \u5927\u5931\u8D25 SVG \u52A0\u8F7D\u5931\u8D25\uFF0C\u8DF3\u8FC7\u56FE\u6848', {\n error,\n });\n }\n return null;\n });\n }\n return this.failureTexturePromise.then(() => undefined);\n }\n\n async play(\n effect: VisualResultEffect,\n landingPoints: readonly ResultLandingPoint[],\n seed: string,\n signal: AbortSignal,\n ): Promise<void> {\n this.reset();\n if (this.destroyed || signal.aborted) return;\n const controller = new AbortController();\n const abort = () => controller.abort(signal.reason);\n signal.addEventListener('abort', abort, { once: true });\n this.activeController = controller;\n this.activeEffect = effect;\n this.root.visible = true;\n try {\n if (effect === 'imageBurst') {\n await this.playCriticalFailure(landingPoints, controller.signal);\n } else if (effect === 'radialBurst') {\n await this.playCriticalSuccess(landingPoints, controller.signal);\n } else {\n await this.playEdge(effect, seed, controller.signal);\n }\n } finally {\n signal.removeEventListener('abort', abort);\n if (this.activeController === controller) {\n this.hideAll();\n this.activeController = null;\n this.activeEffect = null;\n }\n }\n }\n\n updateTuning(tuning: ResultEffectTuning): void {\n this.tuning = tuning;\n if (!this.activeEffect) return;\n if (this.activeEffect === 'imageBurst') {\n this.applyFailureLayout();\n this.applyFailureVisuals();\n } else if (this.activeEffect === 'radialBurst') this.applyBurstVisuals();\n else {\n this.applyEdgeVisuals(this.activeEffect);\n readEdgeUniforms(this.edgeUniformGroup.uniforms).uAlpha =\n this.edgeEnvelope * this.tuning.visual.edge[this.activeEffect].intensity;\n }\n this.options.requestRender();\n }\n\n setReducedMotion(reducedMotion: boolean): void {\n if (this.reducedMotion === reducedMotion) return;\n this.reducedMotion = reducedMotion;\n this.reset();\n }\n\n reset(): void {\n this.activeController?.abort('story-dice-result-reset');\n this.activeController = null;\n this.activeEffect = null;\n this.activeLandingPoints = [];\n this.sourceLandingPoints = [];\n this.edgeEnvelope = 0;\n this.failureEnvelope = 0;\n this.failureScaleFactor = 1;\n this.failureRotation = 0;\n this.hideAll();\n }\n\n diagnostics(): ResultEffectDiagnostics {\n if (!this.activeEffect) {\n return { activeEffect: null, objectCount: 0, estimatedDrawCalls: 0, pixelCoverageRatio: 0 };\n }\n if (this.activeEffect === 'imageBurst') {\n return {\n activeEffect: this.activeEffect,\n objectCount: this.failureSprites.filter((sprite) => sprite.visible).length,\n estimatedDrawCalls: this.failureSprites.some((sprite) => sprite.visible) ? 1 : 0,\n pixelCoverageRatio: this.failureSprites.reduce(\n (sum, sprite) =>\n sum +\n (sprite.visible\n ? (sprite.width * sprite.height) /\n (this.options.stage.width * this.options.stage.height)\n : 0),\n 0,\n ),\n };\n }\n if (this.activeEffect === 'radialBurst') {\n const diameter = this.tuning.visual.radialBurst.haloRadiusPx * 2;\n return {\n activeEffect: this.activeEffect,\n objectCount: this.burstMeshes.length,\n estimatedDrawCalls: this.burstMeshes.length,\n pixelCoverageRatio:\n (this.burstMeshes.length * diameter * diameter) /\n (this.options.stage.width * this.options.stage.height),\n };\n }\n return {\n activeEffect: this.activeEffect,\n objectCount: 1,\n estimatedDrawCalls: 1,\n pixelCoverageRatio: 1,\n };\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.reset();\n this.root.parent?.removeChild(this.root);\n this.failureSprites.forEach((sprite) => sprite.destroy());\n this.edgeMesh.destroy();\n this.edgeShader.destroy();\n this.edgeGeometry.destroy();\n this.burstMeshes.forEach((mesh) => mesh.destroy());\n this.burstShaders.forEach((shader) => shader.destroy());\n this.burstGeometries.forEach((geometry) => geometry.destroy());\n this.root.destroy();\n this.failureSprites = [];\n this.failureTexture = null;\n void this.options.assets\n .releaseScope(this.options.scope)\n .catch((error) => this.options.logger.warn('Result FX scope release failed', { error }));\n }\n\n private async playEdge(\n effect: 'noiseEdge' | 'lightEdge' | 'pulseEdge',\n seed: string,\n signal: AbortSignal,\n ): Promise<void> {\n this.edgeMesh.visible = true;\n this.edgeMesh.blendMode = effect === 'noiseEdge' ? 'normal' : 'screen';\n const uniforms = readEdgeUniforms(this.edgeUniformGroup.uniforms);\n uniforms.uSeed = hashResultEffectSeed(seed) * 100;\n this.applyEdgeVisuals(effect);\n if (this.reducedMotion) {\n this.edgeEnvelope = 1;\n uniforms.uAlpha = this.tuning.visual.edge[effect].intensity;\n this.options.requestRender();\n await this.wait(2000, signal, true);\n return;\n }\n const state = { envelope: 0, time: 0 };\n const sync = () => {\n this.edgeEnvelope = state.envelope;\n uniforms.uAlpha = state.envelope * this.tuning.visual.edge[effect].intensity;\n uniforms.uTime = state.time;\n this.options.requestRender();\n };\n const timing = this.tuning.motion.edge[effect];\n await this.options.director.tween(\n state,\n {\n envelope: 1,\n duration: timing.enterMs / 1000,\n ease: 'power2.out',\n onUpdate: sync,\n },\n signal,\n );\n await this.options.director.tween(\n state,\n {\n time: effect === 'noiseEdge' ? timing.driftSpeed * 2 : 2,\n duration: timing.holdMs / 1000,\n ease: 'none',\n onUpdate: sync,\n },\n signal,\n );\n await this.options.director.tween(\n state,\n { envelope: 0, duration: timing.exitMs / 1000, ease: 'power2.in', onUpdate: sync },\n signal,\n );\n }\n\n private async playCriticalFailure(\n points: readonly ResultLandingPoint[],\n signal: AbortSignal,\n ): Promise<void> {\n const texture = this.failureTexture ?? (await this.waitForFailureTexture(signal));\n if (!texture || signal.aborted) return;\n this.ensureFailureSprites(texture);\n this.sourceLandingPoints = points;\n const normalized = normalizeResultLandingPoints(points, this.tuning, this.options.targetCount);\n this.activeLandingPoints = normalized;\n this.failureSprites.forEach((sprite) => {\n sprite.visible = true;\n });\n this.failureEnvelope = this.reducedMotion ? 1 : 0;\n this.failureScaleFactor = this.reducedMotion ? 1.5 : 0;\n this.failureRotation = 0;\n this.applyFailureLayout();\n this.applyFailureVisuals();\n if (this.reducedMotion) {\n this.options.requestRender();\n await this.wait(2000, signal, true);\n return;\n }\n const motion = this.tuning.motion.imageBurst;\n const totalMs = motion.revealMs + motion.expandMs;\n const state = { elapsedMs: 0 };\n const sync = () => {\n const sample = sampleImageBurstUnfold(\n state.elapsedMs,\n motion.revealMs,\n motion.expandMs,\n motion.endScale,\n );\n this.failureEnvelope = sample.envelope;\n this.failureScaleFactor = sample.scale;\n this.failureRotation = sample.rotation;\n this.applyFailureLayout();\n this.applyFailureVisuals();\n this.options.requestRender();\n };\n await this.options.director.tween(\n state,\n {\n elapsedMs: totalMs,\n duration: totalMs / 1000,\n ease: 'none',\n onUpdate: sync,\n },\n signal,\n );\n }\n\n private async playCriticalSuccess(\n points: readonly ResultLandingPoint[],\n signal: AbortSignal,\n ): Promise<void> {\n this.sourceLandingPoints = points;\n const normalized = normalizeResultLandingPoints(points, this.tuning, this.options.targetCount);\n this.activeLandingPoints = normalized;\n this.burstMeshes.forEach((mesh) => {\n mesh.visible = true;\n mesh.alpha = this.reducedMotion ? 1 : 0;\n });\n this.applyBurstVisuals();\n if (this.reducedMotion) {\n this.options.requestRender();\n await this.wait(2000, signal, true);\n return;\n }\n const motion = this.tuning.motion.radialBurst;\n await Promise.all(\n this.burstMeshes.map((mesh) =>\n this.options.director.tween(\n mesh,\n {\n alpha: 1,\n duration: motion.enterMs / 1000,\n ease: 'power3.out',\n onUpdate: this.options.requestRender,\n },\n signal,\n ),\n ),\n );\n const state = { rotation: 0 };\n await this.options.director.tween(\n state,\n {\n rotation: motion.rotationSpeed * motion.holdMs * 0.001 * Math.PI * 2,\n duration: motion.holdMs / 1000,\n ease: 'none',\n onUpdate: () => {\n this.burstUniformGroups.forEach((group) => {\n readBurstUniforms(group.uniforms).uRotation = state.rotation;\n });\n this.options.requestRender();\n },\n },\n signal,\n );\n await Promise.all(\n this.burstMeshes.map((mesh) =>\n this.options.director.tween(\n mesh,\n {\n alpha: 0,\n duration: motion.exitMs / 1000,\n ease: 'power2.in',\n onUpdate: this.options.requestRender,\n },\n signal,\n ),\n ),\n );\n }\n\n private wait(durationMs: number, signal: AbortSignal, preserveDuration = false): Promise<void> {\n return this.options.director.tween(\n {},\n {\n duration: durationMs / 1000,\n reducedMotionDuration: preserveDuration ? durationMs / 1000 : undefined,\n },\n signal,\n );\n }\n\n private waitForFailureTexture(signal: AbortSignal): Promise<Texture | null> {\n const load = this.prewarm().then(() => this.failureTexture);\n if (signal.aborted) return Promise.resolve(null);\n return new Promise((resolve) => {\n const abort = () => settle(null);\n const settle = (texture: Texture | null) => {\n signal.removeEventListener('abort', abort);\n resolve(texture);\n };\n signal.addEventListener('abort', abort, { once: true });\n void load.then(settle);\n });\n }\n\n private applyEdgeVisuals(effect: 'noiseEdge' | 'lightEdge' | 'pulseEdge'): void {\n const uniforms = readEdgeUniforms(this.edgeUniformGroup.uniforms);\n const visual = this.tuning.visual.edge[effect];\n uniforms.uFxColor = parseColor(visual.color);\n uniforms.uEdgeDepthPx = visual.edgeDepthPx;\n uniforms.uSoftnessPx = visual.softnessPx;\n uniforms.uNoiseScale = this.tuning.visual.noiseEdge.noiseScale;\n uniforms.uDistortion = this.tuning.visual.noiseEdge.distortion;\n uniforms.uMode = effect === 'noiseEdge' ? 0 : effect === 'lightEdge' ? 1 : 2;\n uniforms.uBreathAmplitude =\n effect === 'pulseEdge' ? this.tuning.visual.pulseEdge.breathAmplitude : 0;\n }\n\n private applyFailureLayout(): void {\n const layout = this.tuning.layout.imageBurst;\n this.activeLandingPoints = normalizeResultLandingPoints(\n this.sourceLandingPoints,\n this.tuning,\n this.options.targetCount,\n );\n const baseScale = this.failureBaseScale();\n this.failureSprites.forEach((sprite, index) => {\n const point = this.activeLandingPoints[index];\n if (point) sprite.position.set(point.x + layout.offsetX, point.y + layout.offsetY);\n sprite.scale.set(baseScale * this.failureScaleFactor);\n sprite.rotation = this.failureRotation;\n });\n }\n\n private applyFailureVisuals(): void {\n const alpha = this.failureEnvelope * this.tuning.visual.imageBurst.peakAlpha;\n this.failureSprites.forEach((sprite) => {\n sprite.alpha = alpha;\n });\n }\n\n private failureBaseScale(): number {\n const textureWidth = Math.max(1, this.failureTexture?.width ?? 512);\n return this.tuning.layout.imageBurst.diameterPx / textureWidth;\n }\n\n private applyBurstVisuals(): void {\n const visual = this.tuning.visual.radialBurst;\n this.activeLandingPoints = normalizeResultLandingPoints(\n this.sourceLandingPoints,\n this.tuning,\n this.options.targetCount,\n );\n const diameter = visual.haloRadiusPx * 2;\n this.burstMeshes.forEach((mesh, index) => {\n const point = this.activeLandingPoints[index];\n if (point) mesh.position.set(point.x, point.y);\n mesh.scale.set(diameter / 2);\n const uniforms = readBurstUniforms(this.burstUniformGroups[index]!.uniforms);\n uniforms.uFxColor = parseColor(visual.color);\n uniforms.uCoreRatio = Math.min(1, visual.coreRadiusPx / visual.haloRadiusPx);\n uniforms.uRayCount = visual.rayCount;\n uniforms.uIntensity = visual.intensity;\n uniforms.uAlpha = 1;\n });\n }\n\n private ensureFailureSprites(texture: Texture): void {\n if (this.failureSprites.length > 0) return;\n const sprites = Array.from({ length: this.options.targetCount }, (_, index) => {\n const sprite = new this.options.constructors.Sprite(texture);\n sprite.label = `story-dice-critical-failure:${index}`;\n sprite.anchor.set(0.5);\n sprite.eventMode = 'none';\n sprite.visible = false;\n return sprite;\n });\n this.failureSprites = sprites;\n sprites.forEach((sprite, index) => this.root.addChildAt(sprite, index));\n }\n\n private hideAll(): void {\n this.root.visible = false;\n this.edgeMesh.visible = false;\n this.edgeMesh.alpha = 1;\n this.burstMeshes.forEach((mesh) => {\n mesh.visible = false;\n mesh.alpha = 1;\n });\n this.failureSprites.forEach((sprite) => {\n sprite.visible = false;\n sprite.alpha = 0;\n sprite.scale.set(1);\n sprite.rotation = 0;\n });\n this.options.requestRender();\n }\n\n private createEdgeMesh(): {\n mesh: PixiShaderMesh;\n geometry: MeshGeometry;\n shader: Shader;\n uniforms: UniformGroup;\n } {\n const { Mesh, MeshGeometry, Shader, UniformGroup } = this.options.constructors;\n const uniforms = new UniformGroup({\n uFxColor: { value: new Float32Array([0, 0, 0]), type: 'vec3<f32>' },\n uAlpha: { value: 0, type: 'f32' },\n uEdgeDepthPx: { value: 190, type: 'f32' },\n uSoftnessPx: { value: 110, type: 'f32' },\n uNoiseScale: { value: 3.2, type: 'f32' },\n uDistortion: { value: 0.42, type: 'f32' },\n uTime: { value: 0, type: 'f32' },\n uSeed: { value: 0, type: 'f32' },\n uMode: { value: 0, type: 'f32' },\n uBreathAmplitude: { value: 0.08, type: 'f32' },\n });\n const shader = Shader.from({\n gl: {\n vertex: QUAD_VERTEX,\n fragment: edgeFragment(this.options.stage.width, this.options.stage.height),\n },\n resources: { diceEdgeUniforms: uniforms },\n });\n const geometry = new MeshGeometry({\n positions: new Float32Array([\n 0,\n 0,\n this.options.stage.width,\n 0,\n this.options.stage.width,\n this.options.stage.height,\n 0,\n this.options.stage.height,\n ]),\n uvs: new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),\n indices: new Uint32Array([0, 1, 2, 0, 2, 3]),\n topology: 'triangle-list',\n });\n const mesh = new Mesh({ geometry, shader, label: 'story-dice-edge-result' });\n mesh.eventMode = 'none';\n mesh.visible = false;\n return { mesh, geometry, shader, uniforms };\n }\n\n private createBurstMesh(index: number): {\n mesh: PixiShaderMesh;\n geometry: MeshGeometry;\n shader: Shader;\n uniforms: UniformGroup;\n } {\n const { Mesh, MeshGeometry, Shader, UniformGroup } = this.options.constructors;\n const uniforms = new UniformGroup({\n uFxColor: { value: new Float32Array([1, 0.965, 0.835]), type: 'vec3<f32>' },\n uAlpha: { value: 1, type: 'f32' },\n uCoreRatio: { value: 0.216, type: 'f32' },\n uRayCount: { value: 12, type: 'f32' },\n uIntensity: { value: 1.35, type: 'f32' },\n uRotation: { value: 0, type: 'f32' },\n uVariationSeed: { value: index * 17.31, type: 'f32' },\n });\n const shader = Shader.from({\n gl: { vertex: QUAD_VERTEX, fragment: BURST_FRAGMENT },\n resources: { diceBurstUniforms: uniforms },\n });\n const geometry = new MeshGeometry({\n positions: new Float32Array([-1, -1, 1, -1, 1, 1, -1, 1]),\n uvs: new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),\n indices: new Uint32Array([0, 1, 2, 0, 2, 3]),\n topology: 'triangle-list',\n });\n const mesh = new Mesh({ geometry, shader, label: `story-dice-critical-success:${index}` });\n mesh.blendMode = 'add';\n mesh.eventMode = 'none';\n mesh.visible = false;\n return { mesh, geometry, shader, uniforms };\n }\n}\n\nfunction readEdgeUniforms(value: unknown): EdgeUniforms {\n assertUniformFields(\n value,\n [\n 'uAlpha',\n 'uEdgeDepthPx',\n 'uSoftnessPx',\n 'uNoiseScale',\n 'uDistortion',\n 'uTime',\n 'uSeed',\n 'uMode',\n 'uBreathAmplitude',\n ],\n ['uFxColor'],\n );\n return value;\n}\n\nfunction readBurstUniforms(value: unknown): BurstUniforms {\n assertUniformFields(\n value,\n ['uAlpha', 'uCoreRatio', 'uRayCount', 'uIntensity', 'uRotation', 'uVariationSeed'],\n ['uFxColor'],\n );\n return value;\n}\n", "import type { Container, Graphics, Sprite, Text, Texture } from 'pixi.js';\nimport type { RuntimeLogger } from '@bardway/trpg-media';\nimport type { TokenAvatarCrop } from './PixiMapWorldUtils.js';\nimport type { PixiAssetManager } from './PixiAssetManager.js';\nexport interface SummaryBoardParticipant {\n id: string;\n name: string;\n avatarUrl?: string;\n avatarCrop?: TokenAvatarCrop;\n}\nexport interface SummaryBoardRankingEntry extends SummaryBoardParticipant {\n value: string;\n}\nexport interface SummaryBoardData {\n owner: string;\n primaryValue: string;\n secondaryValue: string;\n ranking: readonly SummaryBoardRankingEntry[];\n participants: readonly SummaryBoardParticipant[];\n}\n\nimport { resolveCroppedCoverRect } from './PixiMapWorldUtils.js';\nimport type { PixiSceneGraph } from './PixiSceneGraph.js';\nimport type { TextStyleOptions } from 'pixi.js';\nimport type { SessionTuningResolver, SessionTuningPath } from '@bardway/trpg-media/tuning';\n\ninterface Constructors {\n Container: typeof Container;\n Graphics: typeof Graphics;\n Sprite?: new (texture?: Texture | import('pixi.js').SpriteOptions) => Sprite;\n Text: new (options: import('pixi.js').TextOptions) => Text;\n}\n\ninterface SummaryAvatarRow {\n readonly root: Container;\n readonly avatarRoot: Container;\n readonly placeholder: Graphics;\n readonly glyph: Text;\n readonly name: Text;\n readonly rank: Text | null;\n readonly value: Text | null;\n avatar: Sprite | null;\n mask: Graphics | null;\n avatarKey: string | null;\n avatarCrop?: SummaryBoardParticipant['avatarCrop'];\n loadVersion: number;\n}\n\ninterface LayoutRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface SummaryBoardPorts {\n scope: string;\n logger: RuntimeLogger;\n boardSize: { width: number; height: number };\n rankCapacity: number;\n participantCapacity: number;\n participantColumns: number;\n layout: {\n board: LayoutRect;\n primaryValue: LayoutRect;\n secondaryValue: LayoutRect;\n rankingArea: LayoutRect;\n participantArea: LayoutRect;\n rankingAvatarSize: number;\n participantAvatarSize: number;\n rankingRowGap: number;\n participantRowGap: number;\n statFontSize: number;\n rankingNameFontSize: number;\n rankingValueFontSize: number;\n participantNameFontSize: number;\n };\n typography: {\n damage: TextStyleOptions;\n data: TextStyleOptions;\n caption: TextStyleOptions;\n sectionTitle: TextStyleOptions;\n };\n colors: {\n panel: string;\n border: string;\n mask: string;\n primaryValue: string;\n secondaryValue: string;\n primaryText: string;\n secondaryText: string;\n rankColors: readonly string[];\n avatarFallback: string;\n avatarBorder: string;\n avatarGlyph: string;\n };\n}\nconst colorValue = (\n tuning: SessionTuningResolver | undefined,\n path: SessionTuningPath,\n fallback: string,\n): string => {\n const value = tuning?.get(path);\n return typeof value === 'string' ? value : fallback;\n};\n\nconst numberValue = (\n tuning: SessionTuningResolver | undefined,\n path: SessionTuningPath,\n fallback: number,\n): number => {\n const value = tuning?.get(path);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n};\n\nconst rectValue = (\n tuning: SessionTuningResolver | undefined,\n path: SessionTuningPath,\n fallback: LayoutRect,\n): LayoutRect => tuning?.getRect(path) ?? fallback;\n\nconst firstGlyph = (name: string): string => [...name.trim()][0] ?? '?';\n\nconst shorten = (name: string, limit: number): string => {\n const chars = [...name.trim()];\n return chars.length <= limit\n ? chars.join('')\n : `${chars.slice(0, Math.max(1, limit - 1)).join('')}\u2026`;\n};\n\nconst setTextStyle = (\n text: Text,\n base: import('pixi.js').TextStyleOptions,\n fontSize: number,\n fill: string,\n): void => {\n text.style = { ...base, fontSize, fill };\n};\n\nexport class PixiSummaryBoardSurface {\n readonly node: Container;\n private readonly boardRoot: Container;\n private readonly primaryValue: Text;\n private readonly secondaryValue: Text;\n private readonly rankingRows: SummaryAvatarRow[];\n private readonly participantRows: SummaryAvatarRow[];\n private avatarScope: string | null = null;\n private tuning: SessionTuningResolver | undefined;\n\n constructor(\n scene: PixiSceneGraph,\n private readonly constructors: Constructors,\n private readonly ports: SummaryBoardPorts,\n private readonly assets?: PixiAssetManager,\n boardTexture?: Texture | null,\n tuning?: SessionTuningResolver,\n private readonly requestRender?: () => void,\n ) {\n if (\n !Number.isInteger(ports.rankCapacity) ||\n ports.rankCapacity < 0 ||\n !Number.isInteger(ports.participantCapacity) ||\n ports.participantCapacity < 0 ||\n !ports.scope.trim()\n )\n throw new Error('Invalid summary board capacity or scope');\n this.tuning = tuning;\n this.node = new constructors.Container();\n this.boardRoot = new constructors.Container();\n if (boardTexture && constructors.Sprite) {\n const board = new constructors.Sprite(boardTexture);\n board.width = this.ports.boardSize.width;\n board.height = this.ports.boardSize.height;\n this.boardRoot.addChild(board);\n } else {\n const fallback = new constructors.Graphics()\n .roundRect(0, 0, this.ports.boardSize.width, this.ports.boardSize.height, 5)\n .fill(this.ports.colors.panel)\n .stroke({\n color: this.ports.colors.border,\n width: 3,\n alpha: 0.82,\n });\n this.boardRoot.addChild(fallback);\n }\n\n this.primaryValue = new constructors.Text({ text: '0', style: this.ports.typography.damage });\n this.secondaryValue = new constructors.Text({ text: '0', style: this.ports.typography.data });\n this.primaryValue.anchor.set(0.5);\n this.secondaryValue.anchor.set(0.5);\n this.rankingRows = Array.from({ length: this.ports.rankCapacity }, (_, index) =>\n this.createRow(String(index + 1), true),\n );\n this.participantRows = Array.from({ length: this.ports.participantCapacity }, () =>\n this.createRow('', false),\n );\n this.boardRoot.addChild(\n this.primaryValue,\n this.secondaryValue,\n ...this.rankingRows.map((row) => row.root),\n ...this.participantRows.map((row) => row.root),\n );\n this.node.addChild(this.boardRoot);\n scene.modalLayer.addChild(this.node);\n this.node.visible = false;\n this.syncLayout();\n }\n\n sync(summary: SummaryBoardData): void {\n const nextScope = `${this.ports.scope}:${summary.owner}`;\n if (this.avatarScope !== nextScope) {\n if (this.avatarScope)\n void this.assets\n ?.releaseScope(this.avatarScope)\n .catch((error) =>\n this.ports.logger.warn('Summary avatar scope release failed', { error }),\n );\n this.avatarScope = nextScope;\n [...this.rankingRows, ...this.participantRows].forEach((row) => this.clearAvatar(row));\n }\n this.syncLayout();\n this.primaryValue.text = summary.primaryValue;\n this.secondaryValue.text = summary.secondaryValue;\n this.rankingRows.forEach((row, index) =>\n this.syncRankingRow(row, summary.ranking[index] ?? null, index),\n );\n this.participantRows.forEach((row, index) =>\n this.syncParticipantRow(row, summary.participants[index] ?? null),\n );\n this.requestRender?.();\n }\n\n updateTuning(tuning: SessionTuningResolver): void {\n this.tuning = tuning;\n this.syncLayout();\n this.requestRender?.();\n }\n\n setVisible(visible: boolean): void {\n this.node.visible = visible;\n }\n\n destroy(): void {\n if (this.avatarScope)\n void this.assets\n ?.releaseScope(this.avatarScope)\n .catch((error) => this.ports.logger.warn('Summary avatar scope release failed', { error }));\n this.avatarScope = null;\n this.node.destroy({ children: true });\n }\n\n private createRow(rank: string, showValue: boolean): SummaryAvatarRow {\n const root = new this.constructors.Container();\n const avatarRoot = new this.constructors.Container();\n const placeholder = new this.constructors.Graphics();\n const glyph = new this.constructors.Text({ text: '?', style: this.ports.typography.caption });\n const name = new this.constructors.Text({ text: '', style: this.ports.typography.caption });\n const rankText = rank\n ? new this.constructors.Text({ text: rank, style: this.ports.typography.sectionTitle })\n : null;\n const value = showValue\n ? new this.constructors.Text({ text: '', style: this.ports.typography.data })\n : null;\n glyph.anchor.set(0.5);\n name.anchor.set(0, 0.5);\n rankText?.anchor.set(0.5);\n value?.anchor.set(1, 0.5);\n avatarRoot.addChild(placeholder, glyph);\n root.addChild(...([rankText, avatarRoot, name, value].filter(Boolean) as Container[]));\n return {\n root,\n avatarRoot,\n placeholder,\n glyph,\n name,\n rank: rankText,\n value,\n avatar: null,\n mask: null,\n avatarKey: null,\n avatarCrop: undefined,\n loadVersion: 0,\n };\n }\n\n private syncLayout(): void {\n const board = rectValue(this.tuning, 'layout.battleSummary.board', this.ports.layout.board);\n const scale = Math.min(\n board.width / this.ports.boardSize.width,\n board.height / this.ports.boardSize.height,\n );\n this.boardRoot.scale.set(scale);\n this.boardRoot.position.set(\n board.x + (board.width - this.ports.boardSize.width * scale) / 2,\n board.y + (board.height - this.ports.boardSize.height * scale) / 2,\n );\n\n const primaryValueBox = rectValue(\n this.tuning,\n 'layout.battleSummary.primaryValue',\n this.ports.layout.primaryValue,\n );\n const secondaryValueBox = rectValue(\n this.tuning,\n 'layout.battleSummary.secondaryValue',\n this.ports.layout.secondaryValue,\n );\n this.primaryValue.position.set(\n primaryValueBox.x + primaryValueBox.width / 2,\n primaryValueBox.y + primaryValueBox.height / 2,\n );\n this.secondaryValue.position.set(\n secondaryValueBox.x + secondaryValueBox.width / 2,\n secondaryValueBox.y + secondaryValueBox.height / 2,\n );\n const statFontSize = numberValue(\n this.tuning,\n 'layout.battleSummary.typography.statFontSize',\n this.ports.layout.statFontSize,\n );\n setTextStyle(\n this.primaryValue,\n this.ports.typography.damage,\n statFontSize,\n colorValue(this.tuning, 'visual.battleSummary.damageValue', this.ports.colors.primaryValue),\n );\n setTextStyle(\n this.secondaryValue,\n this.ports.typography.data,\n statFontSize,\n colorValue(\n this.tuning,\n 'visual.battleSummary.participantValue',\n this.ports.colors.secondaryValue,\n ),\n );\n this.syncRankingLayout();\n this.syncParticipantLayout();\n }\n\n private syncRankingLayout(): void {\n const area = rectValue(\n this.tuning,\n 'layout.battleSummary.rankingArea',\n this.ports.layout.rankingArea,\n );\n const avatarSize = this.resolveRankingAvatarSize();\n const gap = numberValue(\n this.tuning,\n 'layout.battleSummary.rankingRowGap',\n this.ports.layout.rankingRowGap,\n );\n const rowHeight = (area.height - gap * 2) / 3;\n const nameFontSize = numberValue(\n this.tuning,\n 'layout.battleSummary.typography.rankingNameFontSize',\n this.ports.layout.rankingNameFontSize,\n );\n const valueFontSize = numberValue(\n this.tuning,\n 'layout.battleSummary.typography.rankingValueFontSize',\n this.ports.layout.rankingValueFontSize,\n );\n const primary = colorValue(\n this.tuning,\n 'visual.battleSummary.primaryText',\n this.ports.colors.primaryText,\n );\n const rankColors = this.ports.colors.rankColors;\n this.rankingRows.forEach((row, index) => {\n const centerY = area.y + index * (rowHeight + gap) + rowHeight / 2;\n row.root.position.set(area.x, centerY);\n row.rank?.position.set(24, 0);\n row.avatarRoot.position.set(76, 0);\n row.name.position.set(76 + avatarSize / 2 + 20, 0);\n row.value?.position.set(area.width - 12, 0);\n this.drawAvatarPlaceholder(row, avatarSize);\n setTextStyle(\n row.rank!,\n this.ports.typography.sectionTitle,\n 34,\n rankColors[index % rankColors.length] ?? this.ports.colors.primaryText,\n );\n setTextStyle(row.name, this.ports.typography.caption, nameFontSize, primary);\n if (row.value)\n setTextStyle(\n row.value,\n this.ports.typography.data,\n valueFontSize,\n rankColors[index % rankColors.length] ?? this.ports.colors.primaryText,\n );\n });\n }\n\n private syncParticipantLayout(): void {\n const area = rectValue(\n this.tuning,\n 'layout.battleSummary.participantArea',\n this.ports.layout.participantArea,\n );\n const avatarSize = this.resolveParticipantAvatarSize();\n const gap = numberValue(\n this.tuning,\n 'layout.battleSummary.participantRowGap',\n this.ports.layout.participantRowGap,\n );\n const columns = Math.max(1, this.ports.participantColumns);\n const rows = Math.max(1, Math.ceil(this.ports.participantCapacity / columns));\n const columnWidth = area.width / columns;\n const rowHeight = (area.height - gap * (rows - 1)) / rows;\n const fontSize = numberValue(\n this.tuning,\n 'layout.battleSummary.typography.participantNameFontSize',\n this.ports.layout.participantNameFontSize,\n );\n const secondary = colorValue(\n this.tuning,\n 'visual.battleSummary.secondaryText',\n this.ports.colors.secondaryText,\n );\n this.participantRows.forEach((row, index) => {\n const column = Math.floor(index / rows);\n const rowIndex = index % rows;\n row.root.position.set(\n area.x + column * columnWidth,\n area.y + rowIndex * (rowHeight + gap) + rowHeight / 2,\n );\n row.avatarRoot.position.set(avatarSize / 2 + 4, 0);\n row.name.position.set(avatarSize + 16, 0);\n this.drawAvatarPlaceholder(row, avatarSize);\n setTextStyle(row.name, this.ports.typography.caption, fontSize, secondary);\n });\n }\n\n private syncRankingRow(\n row: SummaryAvatarRow,\n entry: SummaryBoardRankingEntry | null,\n index: number,\n ): void {\n row.root.visible = entry !== null;\n if (!entry) {\n this.clearAvatar(row);\n return;\n }\n row.rank!.text = String(index + 1);\n row.name.text = shorten(entry.name, 15);\n if (row.value) row.value.text = entry.value;\n this.syncAvatar(row, entry, this.resolveRankingAvatarSize());\n }\n\n private syncParticipantRow(row: SummaryAvatarRow, entry: SummaryBoardParticipant | null): void {\n row.root.visible = entry !== null;\n if (!entry) {\n this.clearAvatar(row);\n return;\n }\n row.name.text = shorten(entry.name, 9);\n this.syncAvatar(row, entry, this.resolveParticipantAvatarSize());\n }\n\n private syncAvatar(\n row: SummaryAvatarRow,\n participant: SummaryBoardParticipant,\n size: number,\n ): void {\n row.glyph.text = firstGlyph(participant.name);\n row.avatarCrop = participant.avatarCrop;\n const source = participant.avatarUrl;\n const key = source ? JSON.stringify([source, participant.avatarCrop ?? null]) : null;\n if (!source || !key || !this.assets || !this.constructors.Sprite || !this.avatarScope) {\n this.clearAvatar(row, false);\n return;\n }\n if (row.avatarKey === key) {\n if (row.avatar) this.resizeAvatar(row, size, participant.avatarCrop);\n return;\n }\n this.clearAvatar(row, false);\n row.avatarKey = key;\n const version = ++row.loadVersion;\n void this.assets\n .loadTexture(`battle-summary-avatar:${participant.id}:${key}`, source, this.avatarScope)\n .then((texture) => {\n if (row.loadVersion !== version || row.avatarKey !== key || !this.constructors.Sprite)\n return;\n const avatar = new this.constructors.Sprite(texture);\n const mask = new this.constructors.Graphics();\n avatar.mask = mask;\n row.avatarRoot.addChild(avatar, mask);\n row.avatar = avatar;\n row.mask = mask;\n row.placeholder.visible = false;\n row.glyph.visible = false;\n this.resizeAvatar(row, size, participant.avatarCrop);\n this.requestRender?.();\n })\n .catch(() => {\n if (row.loadVersion === version) row.avatarKey = null;\n });\n }\n\n private resizeAvatar(\n row: SummaryAvatarRow,\n size: number,\n crop?: SummaryBoardParticipant['avatarCrop'],\n ): void {\n if (!row.avatar || !row.mask) return;\n const rect = resolveCroppedCoverRect(\n {\n width: Number(row.avatar.texture?.width) || 1,\n height: Number(row.avatar.texture?.height) || 1,\n },\n { x: -size / 2, y: -size / 2, width: size, height: size },\n crop,\n );\n row.avatar.position.set(rect.x, rect.y);\n row.avatar.width = rect.width;\n row.avatar.height = rect.height;\n row.mask\n .clear()\n .circle(0, 0, size / 2)\n .fill(this.ports.colors.mask);\n }\n\n private drawAvatarPlaceholder(row: SummaryAvatarRow, size: number): void {\n row.placeholder\n .clear()\n .circle(0, 0, size / 2)\n .fill({\n color: colorValue(\n this.tuning,\n 'visual.battleSummary.avatarFallback',\n this.ports.colors.avatarFallback,\n ),\n alpha: 1,\n })\n .stroke({\n color: colorValue(\n this.tuning,\n 'visual.battleSummary.avatarBorder',\n this.ports.colors.avatarBorder,\n ),\n width: 2,\n alpha: 0.9,\n });\n setTextStyle(\n row.glyph,\n this.ports.typography.caption,\n Math.max(14, size * 0.4),\n colorValue(this.tuning, 'visual.battleSummary.avatarGlyph', this.ports.colors.avatarGlyph),\n );\n if (row.avatar) this.resizeAvatar(row, size, row.avatarCrop);\n }\n\n private clearAvatar(row: SummaryAvatarRow, clearKey = true): void {\n row.loadVersion += 1;\n if (row.avatar) {\n row.avatarRoot.removeChild(row.avatar);\n row.avatar.destroy();\n row.avatar = null;\n }\n if (row.mask) {\n row.avatarRoot.removeChild(row.mask);\n row.mask.destroy();\n row.mask = null;\n }\n if (clearKey) {\n row.avatarKey = null;\n row.avatarCrop = undefined;\n }\n row.placeholder.visible = true;\n row.glyph.visible = true;\n }\n\n private resolveRankingAvatarSize(): number {\n return numberValue(\n this.tuning,\n 'layout.battleSummary.rankingAvatarSize',\n this.ports.layout.rankingAvatarSize,\n );\n }\n\n private resolveParticipantAvatarSize(): number {\n return numberValue(\n this.tuning,\n 'layout.battleSummary.participantAvatarSize',\n this.ports.layout.participantAvatarSize,\n );\n }\n}\n", "import type { Texture } from 'pixi.js';\nimport type { TokenAvatarCrop } from './PixiMapWorldUtils.js';\nimport type { createPixiTypography } from './PixiTypography.js';\nimport type {\n BattleTypographyTuning,\n OBJECTIVE_LAYOUT,\n OBJECTIVE_PROGRESS_STYLE,\n} from './PixiBattleVisualLayout.js';\nimport type { PixiLayoutRect } from './PixiSessionLayout.js';\ntype Widen<T> = T extends number\n ? number\n : T extends string\n ? string\n : T extends readonly (infer V)[]\n ? readonly Widen<V>[]\n : T extends object\n ? { readonly [K in keyof T]: Widen<T[K]> }\n : T;\nexport interface HudRosterView {\n id: string;\n name: string;\n avatarUrl?: string;\n avatarCrop?: TokenAvatarCrop;\n order: string | number;\n gray: boolean;\n tint: string;\n meter?: { label: string; ratio: number; color: string };\n statuses: readonly string[];\n visualState: { distorted?: boolean; stained?: boolean; tilted?: boolean };\n}\nexport interface HudObjectiveView {\n id: string;\n name: string;\n progress: number;\n progressLabel: string;\n}\nexport interface HudIconView {\n id: string;\n}\nexport interface BattleHudSyncInput {\n scopeKey: string;\n hydrate?: boolean;\n title: string;\n roundLabel: string;\n roster: readonly HudRosterView[];\n objectives: readonly HudObjectiveView[];\n icons: readonly HudIconView[];\n currentActorTokenId: string | null;\n visible: boolean;\n animateLifecycle?: boolean;\n}\nexport interface HudStatusStyle {\n label: string;\n surface: string;\n inset: string;\n border: string;\n text: string;\n}\nexport interface HudResourceFeedbackStyle {\n lane: number;\n negative: string;\n positive: string;\n shakeOnDecrease: boolean;\n}\nexport interface HudVisualStyle {\n disabled: string;\n disabledBorder: string;\n disabledSurface: string;\n disabledText: string;\n distortionTearGap: string;\n assetUi: Record<\n | 'objectiveFill'\n | 'objectiveFillHighlight'\n | 'objectiveFillShadow'\n | 'objectiveMarker'\n | 'objectivePercent'\n | 'objectiveTick'\n | 'objectiveTitle'\n | 'objectiveTrack'\n | 'objectiveTrackBorder'\n | 'rosterActive'\n | 'rosterName'\n | 'rosterOrder',\n string\n >;\n metal: { shadow: string };\n roster: { resourceHighlight: string; resourceTrack: string };\n rosterStatus: {\n distortionIntensity: number;\n stainOpacity: number;\n stainStrength: number;\n tiltDegrees: number;\n };\n statusPill: { surface: string; inset: string; border: string; text: string };\n teamCheckStatus: {\n blurStrength: number;\n cycleDurationMs: number;\n driftAmplitude: number;\n gap: number;\n glowColor: string;\n glowIntensity: number;\n iconHeight: number;\n silhouetteScale: number;\n plumes: readonly { x: number; y: number; radiusX: number; radiusY: number; alpha: number }[];\n };\n}\nexport interface HudUnitCardLayout {\n source: { width: number; height: number };\n rowGap: number;\n maxVisibleRows: number;\n avatar: PixiLayoutRect;\n name: { fontSize: number; rightPadding: number };\n activeOutline: { inset: number; width: number };\n}\nexport interface HudTypographyLayout {\n round: { fontSize: number };\n roster: {\n order: BattleTypographyTuning['roster']['order'];\n name: BattleTypographyTuning['roster']['name'];\n resource: BattleTypographyTuning['roster']['hp'];\n status: BattleTypographyTuning['roster']['status'];\n };\n objective: BattleTypographyTuning['objective'];\n}\nexport interface BattleHudPorts {\n defaultAvatarUrl: string;\n typography: ReturnType<typeof createPixiTypography>;\n colors: { panel: string; border: string; mask: string; transition: string };\n style: HudVisualStyle;\n statuses: Readonly<Record<string, HudStatusStyle>>;\n resources: Readonly<Record<string, HudResourceFeedbackStyle>>;\n layout: {\n header: PixiLayoutRect;\n headerRoundCell: PixiLayoutRect;\n headerMapName: PixiLayoutRect;\n headerTeamChecks: PixiLayoutRect;\n roster: PixiLayoutRect;\n objective: PixiLayoutRect;\n typography: HudTypographyLayout;\n unitCard: { maxVisibleRows: number; rowGap: number; resourceBar: PixiLayoutRect };\n };\n unitCardLayout: HudUnitCardLayout;\n objectiveLayout: Widen<typeof OBJECTIVE_LAYOUT>;\n objectiveProgressStyle: Widen<typeof OBJECTIVE_PROGRESS_STYLE>;\n textures: { unitCard: Texture | null; objective: Texture | null; teamCheckIcon: Texture | null };\n partyTextures: { dossierCard: Texture | null; dossierBlood: Texture | null };\n}\nexport function resolveHudStatusVisibility<T>(\n statuses: readonly T[],\n availableWidth: number,\n getWidth: (status: T) => number,\n overflowWidth: number,\n gap = 4,\n): { visible: readonly T[]; hiddenCount: number } {\n const totalWidth = statuses.reduce(\n (total, status, index) => total + getWidth(status) + (index > 0 ? gap : 0),\n 0,\n );\n if (totalWidth <= availableWidth) return { visible: statuses, hiddenCount: 0 };\n const visible: T[] = [];\n let width = overflowWidth;\n for (const status of statuses) {\n const nextWidth = gap + getWidth(status);\n if (width + nextWidth > availableWidth) break;\n visible.push(status);\n width += nextWidth;\n }\n return { visible, hiddenCount: Math.max(0, statuses.length - visible.length) };\n}\nexport function resolveHudObjectiveCardWidth(\n count: number,\n laneWidth: number,\n maxWidth = 380,\n gap = 8,\n): number {\n if (count <= 0) return 0;\n return Math.max(1, Math.min(maxWidth, (laneWidth - gap * (count - 1)) / count));\n}\nexport function validateBattleHudInput(\n input: BattleHudSyncInput,\n ports: Pick<BattleHudPorts, 'statuses'>,\n): void {\n if (\n typeof input.scopeKey !== 'string' ||\n !input.scopeKey ||\n typeof input.title !== 'string' ||\n typeof input.roundLabel !== 'string'\n )\n throw new Error('Invalid HUD identity/header');\n for (const list of [input.roster, input.objectives, input.icons]) {\n if (\n !Array.isArray(list) ||\n list.some((item) => !item || typeof item.id !== 'string' || !item.id) ||\n new Set(list.map((item) => item.id)).size !== list.length\n )\n throw new Error('Invalid HUD item identities');\n }\n for (const roster of input.roster) {\n if (typeof roster.name !== 'string' || !Array.isArray(roster.statuses) || !roster.visualState)\n throw new Error('Invalid HUD roster view');\n if (\n roster.meter &&\n (!Number.isFinite(roster.meter.ratio) || roster.meter.ratio < 0 || roster.meter.ratio > 1)\n )\n throw new Error('Invalid HUD meter ratio');\n for (const status of roster.statuses)\n if (!Object.hasOwn(ports.statuses, status)) throw new Error('Unknown HUD status');\n }\n for (const objective of input.objectives)\n if (!Number.isFinite(objective.progress) || objective.progress < 0 || objective.progress > 1)\n throw new Error('Invalid HUD objective ratio');\n}\n/** Retains the source fitting algorithm while making row capacity a host choice. */\nexport function resolveHudRosterCardLayout(\n availableWidth: number,\n availableHeight: number,\n textureWidth: number,\n textureHeight: number,\n options: { maxVisibleRows: number; rowGap: number },\n) {\n const safeWidth = Math.max(1, textureWidth),\n safeHeight = Math.max(1, textureHeight);\n const count = Math.max(1, Math.floor(options.maxVisibleRows));\n const gap = Math.max(0, options.rowGap);\n const scale = Math.max(\n 0,\n Math.min(\n availableWidth / safeWidth,\n (availableHeight - gap * (count - 1)) / (count * safeHeight),\n ),\n );\n return {\n scale,\n width: safeWidth * scale,\n height: safeHeight * scale,\n gap,\n pitch: safeHeight * scale + gap,\n };\n}\n", "import {\n validateBattleHudInput,\n resolveHudStatusVisibility,\n resolveHudObjectiveCardWidth,\n resolveHudRosterCardLayout,\n type BattleHudSyncInput,\n type BattleHudPorts,\n type HudRosterView,\n type HudObjectiveView,\n type HudIconView,\n} from './PixiBattleHudPorts.js';\nimport type {\n BlurFilter,\n ColorMatrixFilter,\n Container,\n Filter,\n Graphics,\n Mesh,\n MeshGeometry,\n Rectangle,\n Shader,\n Sprite,\n Text,\n Texture,\n Ticker,\n UniformGroup,\n} from 'pixi.js';\nimport type { PixiAssetManager } from './PixiAssetManager.js';\nimport type { PixiAnimationActivity } from './PixiAnimationActivity.js';\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\nimport { PixiRetainedMeterAnimator } from './PixiRetainedMeterAnimator.js';\nimport { PixiCurrentActorCardGlow } from './PixiCurrentActorCardGlow.js';\nimport { PixiObjectiveBreathingGlow } from './PixiObjectiveBreathingGlow.js';\nimport { createStableBattleEntryOrder } from './PixiBattleEntryTransition.js';\nimport { resolveCroppedCoverRect } from './PixiMapWorldUtils.js';\nimport {\n resolveDossierBloodRotationRadians,\n resolveDossierInsanityMode,\n} from './PixiPortraitResourceCard.js';\nimport {\n createDossierInsanityFilter,\n type DossierInsanityFilter,\n} from './PixiInvestigatorDossierInsanityFilter.js';\nimport { stableSeededRotation } from './PixiSessionLayout.js';\nimport type { SessionTuningResolver } from './tuning/SessionTuningResolver.js';\nimport type { SessionTuningPath } from './tuning/SessionTuningTypes.js';\nimport {\n clampProgress,\n resolveBattleStatusPillLayout,\n resolveBattleTeamCheckIconLayouts,\n resolveUnitCardHpGradientAlpha,\n} from './PixiBattleVisualLayout.js';\nimport type { PixiMediaBreathRuntime } from './PixiMediaBreathRuntime.js';\n\ninterface StatusPillNode {\n readonly root: Container;\n readonly frame: Graphics;\n readonly label: Text;\n layout: ReturnType<typeof resolveBattleStatusPillLayout> | null;\n}\n\ninterface Constructors {\n BlurFilter: typeof BlurFilter;\n ColorMatrixFilter: typeof ColorMatrixFilter;\n Container: typeof Container;\n Filter: typeof Filter;\n Graphics: typeof Graphics;\n Mesh: typeof Mesh;\n MeshGeometry: typeof MeshGeometry;\n Rectangle: typeof Rectangle;\n Shader: typeof Shader;\n Sprite: new (texture?: Texture | import('pixi.js').SpriteOptions) => Sprite;\n Text: new (options: import('pixi.js').TextOptions) => Text;\n UniformGroup: typeof UniformGroup;\n}\n\ninterface RosterNode {\n readonly root: Container;\n readonly shadow: Graphics;\n readonly content: Container;\n readonly blood: Sprite | null;\n readonly background: Sprite | null;\n readonly frame: Graphics;\n readonly resourceBar: Graphics;\n readonly resourceFill: Graphics;\n readonly resourceFlash: Graphics;\n readonly resourceMeter: PixiRetainedMeterAnimator | null;\n readonly avatarMask: Graphics;\n readonly order: Text;\n readonly nameViewport: Container;\n readonly nameMask: Graphics;\n readonly name: Text;\n readonly stats: Text;\n readonly statusPills: Map<string, StatusPillNode>;\n readonly overflowStatusPill: StatusPillNode;\n readonly resourceFeedback: Record<BattleRosterResource, readonly Text[]>;\n feedbackController: AbortController | null;\n shakeOriginX: number | null;\n avatar: Sprite | null;\n grayFilter: ColorMatrixFilter | null;\n grayFilterBrightness: number | null;\n readonly insanityFilter: DossierInsanityFilter;\n stainActive: boolean;\n avatarKey: string | null;\n loadVersion: number;\n baseX: number;\n baseY: number;\n nameOverflow: boolean;\n nameScrollWidth: number;\n shadowGeometryKey: string | null;\n}\n\nexport type BattleRosterResource = string;\n\nexport interface BattleRosterResourceFeedback {\n tokenId: string;\n resource: BattleRosterResource;\n value: number;\n hitIndex?: number;\n emphasis?: boolean;\n}\n\nexport interface BattleRosterEntryNode {\n readonly id: string;\n readonly root: Container;\n readonly targetX: number;\n readonly targetY: number;\n}\n\ninterface ObjectiveNode {\n readonly id: string;\n readonly root: Container;\n readonly fogRoot: Container;\n readonly motionRoot: Container;\n readonly background: Sprite | null;\n readonly track: Graphics;\n readonly fill: Graphics;\n readonly glow: PixiObjectiveBreathingGlow;\n readonly segments: Graphics;\n readonly name: Text;\n readonly percent: Text;\n readonly meter: PixiRetainedMeterAnimator | null;\n progress: number | null;\n glowActive: boolean;\n glowElapsedMs: number;\n glowController: AbortController | null;\n entryGlowMultiplier: number;\n lifecycle: 'entering' | 'stable' | 'exiting';\n lifecycleController: AbortController | null;\n}\n\ninterface TeamCheckNode {\n readonly id: string;\n readonly fogRoot: Container;\n readonly glow: Sprite;\n readonly plumes: Graphics[];\n readonly iconRoot: Container;\n readonly icon: Sprite;\n plumeBases: Array<{ x: number; y: number; alpha: number }>;\n baseGlowWidth: number;\n baseGlowHeight: number;\n glowIntensity: number;\n phaseOffset: number;\n entryGlowMultiplier: number;\n lifecycle: 'entering' | 'stable' | 'exiting';\n lifecycleController: AbortController | null;\n}\n\nconst hexToUnitRgb = (value: string): Float32Array => {\n const parsed = Number.parseInt(value.slice(1), 16);\n return new Float32Array([\n ((parsed >> 16) & 0xff) / 255,\n ((parsed >> 8) & 0xff) / 255,\n (parsed & 0xff) / 255,\n ]);\n};\nexport class PixiBattleHudSurface {\n readonly node: Container;\n private readonly headerFrame: Graphics;\n private readonly roundFrame: Graphics;\n private readonly mapName: Text;\n private readonly round: Text;\n private readonly teamChecksRoot: Container;\n private readonly teamCheckFogRoot: Container;\n private readonly teamCheckIconRoot: Container;\n private readonly teamCheckFogBlur: BlurFilter;\n private readonly teamCheckFogFilterArea: Rectangle;\n private readonly currentActorShadowBlur: BlurFilter;\n private currentActorShadowBlurStrength: number;\n private readonly teamCheckNodes = new Map<string, TeamCheckNode>();\n private readonly rosterHeader: Text;\n private readonly rosterCount: Text;\n private readonly rosterMask: Graphics;\n private readonly rosterContent: Container;\n private readonly rosterNodes = new Map<string, RosterNode>();\n private readonly currentActorCardGlow: PixiCurrentActorCardGlow;\n private readonly objectiveRoot: Container;\n private readonly objectiveMask: Graphics;\n private readonly objectiveNodes = new Map<string, ObjectiveNode>();\n private stopObjectiveGlowAnimation: (() => void) | null = null;\n private visible = false;\n private reducedMotion = false;\n private activeRosterId: string | null = null;\n private activeRosterCanPulse = false;\n private returningRosterId: string | null = null;\n private rosterPulsePhase = 0;\n private rosterEntryElapsedMs = 0;\n private rosterReturnElapsedMs = 0;\n private stopRosterPulse: (() => void) | null = null;\n private battleEntryActive = false;\n private stopRosterNameMarquee: (() => void) | null = null;\n private rosterNameScrollPhase = 0;\n private teamCheckFogElapsedMs = 0;\n private stopTeamCheckFog: (() => void) | null = null;\n private lastInput: BattleHudSyncInput | null = null;\n private tuning: SessionTuningResolver | undefined;\n private uiHighlightMultiplier = 1;\n private readonly releaseUiHighlight: (() => void) | null;\n private readonly feedbackControllers = new Set<AbortController>();\n\n constructor(\n private readonly ports: BattleHudPorts,\n scene: import('./PixiSceneGraph.js').PixiSceneGraph,\n private readonly assets: PixiAssetManager,\n private readonly constructors: Constructors,\n private readonly ticker: Ticker,\n private readonly activity: PixiAnimationActivity,\n private readonly requestRender: () => void,\n private readonly battleTextures: BattleHudPorts['textures'],\n tuning?: SessionTuningResolver,\n private readonly partyTextures: BattleHudPorts['partyTextures'] = {\n dossierCard: null,\n dossierBlood: null,\n },\n private readonly animation?: PixiAnimationDirector,\n mediaBreath?: PixiMediaBreathRuntime,\n ) {\n this.tuning = tuning;\n this.currentActorCardGlow = new PixiCurrentActorCardGlow(constructors);\n this.node = new constructors.Container({ label: 'battle-hud-surface' });\n this.headerFrame = new constructors.Graphics();\n this.roundFrame = new constructors.Graphics();\n this.mapName = new constructors.Text({ text: '', style: this.ports.typography.sectionTitle });\n this.round = new constructors.Text({ text: '', style: this.ports.typography.battleRound });\n this.teamChecksRoot = new constructors.Container({ label: 'battle-team-checks' });\n this.teamCheckFogRoot = new constructors.Container({ label: 'battle-team-check-fog' });\n this.teamCheckIconRoot = new constructors.Container({ label: 'battle-team-check-icons' });\n this.teamCheckFogBlur = new constructors.BlurFilter({\n strength: this.ports.style.teamCheckStatus.blurStrength,\n quality: 2,\n kernelSize: 7,\n });\n this.teamCheckFogFilterArea = new constructors.Rectangle();\n this.teamCheckFogRoot.filters = [this.teamCheckFogBlur];\n this.teamCheckFogRoot.filterArea = this.teamCheckFogFilterArea;\n this.currentActorShadowBlurStrength = Math.max(\n 0,\n this.resolveCurrentActorNumber('visual.battle.currentActor.shadowBlurStrength', 5),\n );\n this.currentActorShadowBlur = new constructors.BlurFilter({\n strength: this.currentActorShadowBlurStrength,\n quality: 2,\n kernelSize: 7,\n });\n this.currentActorShadowBlur.enabled = this.currentActorShadowBlurStrength > 0;\n this.teamChecksRoot.addChild(this.teamCheckFogRoot, this.teamCheckIconRoot);\n this.rosterHeader = new constructors.Text({\n text: '',\n style: { ...this.ports.typography.sectionTitle, fontSize: 20 },\n });\n this.rosterCount = new constructors.Text({\n text: '0',\n style: { ...this.ports.typography.data, fontSize: 17 },\n });\n this.rosterMask = new constructors.Graphics();\n this.rosterContent = new constructors.Container({ label: 'battle-roster-content' });\n this.rosterContent.sortableChildren = true;\n this.objectiveRoot = new constructors.Container({ label: 'battle-objectives' });\n this.objectiveMask = new constructors.Graphics();\n this.mapName.anchor.set(0.5);\n this.round.anchor.set(0.5);\n this.rosterCount.anchor.set(1, 0.5);\n this.rosterHeader.visible = false;\n this.node.addChild(\n this.headerFrame,\n this.roundFrame,\n this.mapName,\n this.round,\n this.teamChecksRoot,\n this.rosterHeader,\n this.rosterCount,\n this.rosterContent,\n this.objectiveRoot,\n this.rosterMask,\n this.objectiveMask,\n );\n this.rosterMask.visible = true;\n this.objectiveMask.visible = true;\n this.rosterContent.mask = this.rosterMask;\n this.objectiveRoot.mask = this.objectiveMask;\n scene.sceneHudLayer.addChild(this.node);\n this.node.visible = false;\n this.releaseUiHighlight =\n mediaBreath?.subscribeUiHighlight((frame) => {\n this.uiHighlightMultiplier = frame.uiHighlightMultiplier;\n for (const item of this.objectiveNodes.values())\n item.glow.setHighlightMultiplier(this.uiHighlightMultiplier * item.entryGlowMultiplier);\n this.applyTeamCheckFogFrame(this.reducedMotion);\n }) ?? null;\n }\n\n sync(input: BattleHudSyncInput): void {\n validateBattleHudInput(input, this.ports);\n if (this.lastInput && this.lastInput.scopeKey !== input.scopeKey) this.reset();\n this.lastInput = input;\n this.visible = input.visible;\n this.node.visible = input.visible;\n if (!input.visible) {\n this.syncRosterPulse(null, false, true);\n this.syncTeamCheckFogAnimation();\n this.syncObjectiveGlowAnimation();\n return;\n }\n this.syncLayout();\n const mapName = input.title;\n const round = input.roundLabel;\n if (this.mapName.text !== mapName) this.mapName.text = mapName;\n if (this.round.text !== round) this.round.text = round;\n this.syncTeamChecks(input.icons, input.animateLifecycle === true);\n const rosterItems = input.roster;\n this.rosterCount.text = String(rosterItems.length);\n this.syncRoster(rosterItems, input.currentActorTokenId);\n const current = rosterItems.find((item) => item.id === input.currentActorTokenId);\n if (!this.battleEntryActive)\n this.syncRosterPulse(current?.id ?? null, Boolean(current && !current.gray));\n this.syncObjectives(input.objectives, input.animateLifecycle === true);\n this.requestRender();\n }\n\n updateTuning(tuning: SessionTuningResolver | undefined): void {\n this.tuning = tuning;\n if (this.lastInput) this.sync(this.lastInput);\n }\n\n setEarthquakeTransform(x: number, y: number, rotation: number, scale: number): void {\n this.rosterContent.position.set(x, y);\n this.rosterContent.rotation = rotation;\n this.rosterContent.scale.set(scale);\n this.requestRender();\n }\n\n setReducedMotion(reducedMotion: boolean): void {\n this.reducedMotion = reducedMotion;\n for (const item of this.rosterNodes.values())\n item.resourceMeter?.setReducedMotion(reducedMotion);\n for (const item of this.objectiveNodes.values()) item.meter?.setReducedMotion(reducedMotion);\n this.syncRosterPulse(this.activeRosterId, this.activeRosterCanPulse, true);\n this.syncRosterNameMarquee();\n this.syncTeamCheckFogAnimation();\n for (const item of this.objectiveNodes.values()) {\n if (item.glowActive) this.playObjectiveGlow(item);\n if (item.lifecycle === 'entering') this.settleObjectiveLifecycle(item);\n else if (item.lifecycle === 'exiting') this.restartObjectiveExit(item);\n }\n for (const item of this.teamCheckNodes.values()) {\n if (item.lifecycle === 'entering') this.settleTeamCheckLifecycle(item);\n else if (item.lifecycle === 'exiting') this.restartTeamCheckExit(item);\n }\n this.syncObjectiveGlowAnimation();\n }\n\n async playResourceFeedback(\n feedback: readonly BattleRosterResourceFeedback[],\n signal: AbortSignal,\n ): Promise<void> {\n for (const item of feedback) {\n if (!Object.hasOwn(this.ports.resources, item.resource))\n throw new Error('HUD resource feedback descriptor missing');\n if (\n !Number.isFinite(item.value) ||\n (item.hitIndex !== undefined && (!Number.isInteger(item.hitIndex) || item.hitIndex < 0))\n )\n throw new Error('Invalid HUD resource feedback');\n }\n if (!this.animation || signal.aborted || feedback.length === 0) return;\n const runs = new Map<\n string,\n { item: RosterNode; controller: AbortController; abort: () => void }\n >();\n for (const tokenId of new Set(feedback.map((item) => item.tokenId))) {\n const item = this.rosterNodes.get(tokenId);\n if (!item || item.root.destroyed) continue;\n item.feedbackController?.abort();\n if (item.shakeOriginX !== null) item.root.x = item.shakeOriginX;\n item.shakeOriginX = null;\n for (const lane of Object.values(item.resourceFeedback))\n for (const text of lane) {\n text.alpha = 0;\n text.visible = false;\n }\n const controller = new AbortController();\n const abort = () => controller.abort(signal.reason);\n signal.addEventListener('abort', abort, { once: true });\n item.feedbackController = controller;\n this.feedbackControllers.add(controller);\n runs.set(tokenId, { item, controller, abort });\n }\n const shakeTokenIds = new Set(\n feedback\n .filter(\n (item) => this.ports.resources[item.resource]?.shakeOnDecrease === true && item.value < 0,\n )\n .map((item) => item.tokenId),\n );\n try {\n await Promise.all([\n ...feedback.map((item) => {\n const run = runs.get(item.tokenId);\n return run\n ? this.playRosterResourceValue(item, run.controller.signal)\n : Promise.resolve();\n }),\n ...[...shakeTokenIds].map((tokenId) => {\n const run = runs.get(tokenId);\n return run\n ? this.playRosterDamageShake(tokenId, run.controller.signal)\n : Promise.resolve();\n }),\n ]);\n } finally {\n for (const { item, controller, abort } of runs.values()) {\n signal.removeEventListener('abort', abort);\n this.feedbackControllers.delete(controller);\n if (item.feedbackController === controller) item.feedbackController = null;\n }\n }\n }\n\n prepareBattleEntry(seed: string, offsetX: number): readonly BattleRosterEntryNode[] {\n this.battleEntryActive = true;\n this.syncRosterPulse(null, false, true);\n this.currentActorCardGlow.detachFrom();\n const orderedIds = createStableBattleEntryOrder([...this.rosterNodes.keys()], seed);\n return orderedIds.map((id) => {\n const item = this.rosterNodes.get(id)!;\n item.root.alpha = 0;\n item.root.position.set(item.baseX - Math.abs(offsetX), item.baseY);\n item.shadow.alpha = 0;\n return { id, root: item.root, targetX: item.baseX, targetY: item.baseY };\n });\n }\n\n finishBattleEntry(): void {\n this.restoreBattleEntryPose(true);\n }\n\n cancelBattleEntry(): void {\n this.restoreBattleEntryPose(true);\n }\n\n reset(): void {\n for (const controller of this.feedbackControllers) controller.abort();\n this.feedbackControllers.clear();\n this.restoreBattleEntryPose(false);\n this.syncRosterPulse(null, false, true);\n this.currentActorCardGlow.detachFrom();\n this.stopTeamCheckFogAnimation();\n this.stopObjectiveGlowAnimation?.();\n this.stopObjectiveGlowAnimation = null;\n this.stopRosterNameMarquee?.();\n this.stopRosterNameMarquee = null;\n this.node.visible = false;\n this.visible = false;\n for (const item of this.rosterNodes.values()) {\n item.feedbackController?.abort();\n item.feedbackController = null;\n item.loadVersion += 1;\n item.resourceMeter?.destroy();\n item.insanityFilter.destroy();\n item.shadow.filters = null;\n item.shadow.destroy();\n item.root.destroy({ children: true });\n }\n this.rosterNodes.clear();\n this.lastInput = null;\n this.clearNodes(this.objectiveNodes);\n this.clearTeamCheckNodes();\n }\n\n destroy(): void {\n this.reset();\n this.currentActorCardGlow.destroy();\n this.teamCheckFogRoot.filters = null;\n this.teamCheckFogBlur.destroy();\n this.currentActorShadowBlur.destroy();\n this.releaseUiHighlight?.();\n this.node.destroy({ children: true });\n }\n\n private syncLayout(): void {\n const { header, headerRoundCell, headerMapName, headerTeamChecks, roster, objective } =\n this.ports.layout;\n this.headerFrame\n .clear()\n .roundRect(header.x, header.y, header.width, header.height, 5)\n .fill({ color: this.ports.colors.panel, alpha: 0.74 })\n .stroke({ color: this.ports.colors.border, width: 1, alpha: 0.72 });\n this.roundFrame.clear();\n this.mapName.position.set(\n headerMapName.x + headerMapName.width / 2,\n headerMapName.y + headerMapName.height / 2,\n );\n this.round.position.set(\n headerRoundCell.x + headerRoundCell.width / 2,\n headerRoundCell.y + headerRoundCell.height / 2,\n );\n this.round.style = {\n ...this.ports.typography.battleRound,\n fontSize: this.ports.layout.typography.round.fontSize,\n };\n this.rosterHeader.position.set(roster.x + 14, roster.y + 14);\n this.rosterCount.position.set(roster.x + roster.width - 16, roster.y + 26);\n const cardOffsetX = this.resolveCurrentActorNumber(\n 'visual.battle.currentActor.cardOffsetX',\n 24,\n );\n const cardLiftY = this.resolveCurrentActorNumber('visual.battle.currentActor.cardLiftY', 1);\n const shadowOffsetX = this.resolveCurrentActorNumber(\n 'visual.battle.currentActor.shadowOffsetX',\n -8,\n );\n const shadowOffsetY = this.resolveCurrentActorNumber(\n 'visual.battle.currentActor.shadowOffsetY',\n 2,\n );\n const shadowBlurPadding =\n Math.max(\n 0,\n this.resolveCurrentActorNumber('visual.battle.currentActor.shadowBlurStrength', 5),\n ) * 2;\n const shadowSpread = Math.max(\n 0,\n this.resolveCurrentActorNumber('visual.battle.currentActor.shadowSpread', 2),\n );\n const shadowEffectExtent = shadowBlurPadding + shadowSpread;\n const activeCardX = cardOffsetX;\n const activeCardY = -cardLiftY;\n const activeShadowX = activeCardX + shadowOffsetX;\n const activeShadowY = activeCardY + shadowOffsetY;\n const rosterMaskLeft = shadowEffectExtent + Math.max(0, -activeCardX, -activeShadowX);\n const rosterMaskRight = shadowEffectExtent + Math.max(0, activeCardX, activeShadowX);\n const rosterMaskTop = shadowEffectExtent + Math.max(0, -activeCardY, -activeShadowY);\n const rosterMaskBottom = shadowEffectExtent + Math.max(0, activeCardY, activeShadowY);\n this.rosterMask\n .clear()\n .rect(\n roster.x - rosterMaskLeft,\n roster.y + 36 - rosterMaskTop,\n roster.width + 36 + rosterMaskLeft + rosterMaskRight,\n roster.height - 20 + rosterMaskTop + rosterMaskBottom,\n )\n .fill(this.ports.colors.mask);\n const objectiveGlowExtent =\n this.resolveFiniteTuningNumber('visual.battle.objectiveFeedback.paddingPx', 8) +\n this.resolveFiniteTuningNumber('visual.battle.objectiveFeedback.blurStrength', 14) * 3;\n this.objectiveMask\n .clear()\n .rect(\n objective.x - objectiveGlowExtent,\n objective.y - objectiveGlowExtent,\n objective.width + objectiveGlowExtent * 2,\n objective.height + objectiveGlowExtent * 2,\n )\n .fill(this.ports.colors.mask);\n this.teamChecksRoot.position.set(headerTeamChecks.x, headerTeamChecks.y);\n const filterPadding = this.ports.style.teamCheckStatus.blurStrength * 3;\n this.teamCheckFogFilterArea.x = -filterPadding;\n this.teamCheckFogFilterArea.y = -filterPadding;\n this.teamCheckFogFilterArea.width = headerTeamChecks.width + filterPadding * 2;\n this.teamCheckFogFilterArea.height = headerTeamChecks.height + filterPadding * 2;\n }\n\n private syncRoster(items: readonly HudRosterView[], currentActorTokenId: string | null): void {\n const visibleItems = items.slice(0, this.resolveUnitCardMaxVisibleRows());\n const ids = new Set(visibleItems.map((item) => item.id));\n for (const [id, item] of this.rosterNodes) {\n if (ids.has(id)) continue;\n item.feedbackController?.abort();\n item.feedbackController = null;\n item.loadVersion += 1;\n item.resourceMeter?.destroy();\n item.insanityFilter.destroy();\n this.currentActorCardGlow.detachFrom(item.root);\n item.shadow.filters = null;\n item.shadow.destroy();\n item.root.destroy({ children: true });\n this.rosterNodes.delete(id);\n }\n visibleItems.forEach((item, index) =>\n this.syncRosterNode(item, index, item.id === currentActorTokenId),\n );\n this.syncRosterNameMarquee();\n }\n\n private syncRosterNode(itemData: HudRosterView, index: number, current: boolean): void {\n const item = this.rosterNodes.get(itemData.id) ?? this.createRosterNode(itemData.id);\n const { roster } = this.ports.layout;\n const cardLayout = resolveHudRosterCardLayout(\n roster.width - 20,\n roster.height - 52,\n Number(this.battleTextures.unitCard?.width) || this.ports.unitCardLayout.source.width,\n Number(this.battleTextures.unitCard?.height) || this.ports.unitCardLayout.source.height,\n {\n maxVisibleRows: this.resolveUnitCardMaxVisibleRows(),\n rowGap: this.resolveUnitCardRowGap(),\n },\n );\n const x = roster.x + 10;\n const y = roster.y + 54 + index * cardLayout.pitch;\n const width = this.ports.unitCardLayout.source.width;\n const height = this.ports.unitCardLayout.source.height;\n const typography = this.ports.layout.typography;\n const token = itemData;\n const disabled = itemData.gray;\n const tint = disabled ? this.ports.style.disabledText : token.tint;\n const hasAvatar = true;\n const avatarX = this.ports.unitCardLayout.avatar.x;\n const avatarY = this.ports.unitCardLayout.avatar.y;\n\n item.baseX = x;\n item.baseY = y;\n item.root.scale.set(cardLayout.scale);\n item.shadow.scale.set(cardLayout.scale);\n item.shadow.position.set(x, y);\n const preservesMotion =\n this.battleEntryActive ||\n itemData.id === this.activeRosterId ||\n itemData.id === this.returningRosterId;\n if (!preservesMotion) item.root.position.set(x, y);\n this.syncRosterGray(item, disabled);\n item.frame\n .clear()\n .roundRect(\n this.ports.unitCardLayout.activeOutline.inset,\n this.ports.unitCardLayout.activeOutline.inset,\n width - this.ports.unitCardLayout.activeOutline.inset * 2,\n height - this.ports.unitCardLayout.activeOutline.inset * 2,\n 5,\n )\n .stroke({\n color: this.ports.style.assetUi.rosterActive,\n width: this.ports.unitCardLayout.activeOutline.width,\n alpha: 0.78,\n alignment: 1,\n });\n item.frame.visible = current && !disabled;\n item.frame.alpha = current && !disabled ? 1 : 0;\n item.root.zIndex = current && !disabled ? 3 : 1;\n item.shadow.zIndex = current && !disabled ? 2 : 0;\n item.order.text = String(itemData.order);\n item.order.style = {\n ...this.ports.typography.battleOrder,\n fontSize: typography.roster.order.fontSize,\n };\n item.order.tint =\n current && !disabled\n ? this.ports.style.assetUi.rosterActive\n : this.ports.style.assetUi.rosterOrder;\n item.order.alpha = current && !disabled ? 0.95 : 0.9;\n item.order.position.set(typography.roster.order.x, typography.roster.order.y);\n item.avatarMask\n .clear()\n .roundRect(\n avatarX,\n avatarY,\n this.ports.unitCardLayout.avatar.width,\n this.ports.unitCardLayout.avatar.height,\n 5,\n )\n .fill(this.ports.colors.mask);\n item.avatarMask.visible = hasAvatar;\n item.name.text = token.name;\n item.name.tint = tint;\n item.name.position.set(typography.roster.name.x, typography.roster.name.y);\n item.stats.text = itemData.meter?.label ?? '';\n item.stats.tint = disabled\n ? this.ports.style.disabledText\n : this.ports.style.assetUi.rosterName;\n item.stats.style = {\n ...this.ports.typography.data,\n fontSize: typography.roster.resource.fontSize,\n };\n item.stats.position.set(typography.roster.resource.x, typography.roster.resource.y);\n this.syncRosterName(item);\n this.syncRosterHpBar(item, itemData);\n this.syncStatusPills(item, itemData.statuses, disabled);\n this.syncRosterStatusEffects(item, itemData, disabled);\n this.syncAvatar(\n item,\n itemData,\n avatarX,\n avatarY,\n hasAvatar,\n this.ports.unitCardLayout.avatar.width,\n this.ports.unitCardLayout.avatar.height,\n );\n this.syncRosterCurrentActorVisuals(item, current && !disabled, width, height, cardLayout.scale);\n }\n\n private createRosterNode(id: string): RosterNode {\n const root = new this.constructors.Container({ label: `battle-roster:${id}` });\n const shadow = new this.constructors.Graphics();\n shadow.filters = [this.currentActorShadowBlur];\n shadow.filterArea = new this.constructors.Rectangle();\n const content = new this.constructors.Container({ label: `battle-roster-content:${id}` });\n const background = this.battleTextures.unitCard\n ? new this.constructors.Sprite(this.battleTextures.unitCard)\n : null;\n const blood = this.partyTextures.dossierBlood\n ? new this.constructors.Sprite(this.partyTextures.dossierBlood)\n : null;\n const frame = new this.constructors.Graphics();\n const resourceBar = new this.constructors.Graphics();\n const resourceFill = new this.constructors.Graphics();\n const resourceFlash = new this.constructors.Graphics();\n const avatarMask = new this.constructors.Graphics();\n const order = new this.constructors.Text({\n text: '',\n style: this.ports.typography.battleOrder,\n });\n const name = new this.constructors.Text({\n text: '',\n style: {\n ...this.ports.typography.caption,\n fontSize: this.ports.unitCardLayout.name.fontSize,\n },\n });\n const stats = new this.constructors.Text({\n text: '',\n style: { ...this.ports.typography.data, fontSize: 14 },\n });\n const createFeedbackLane = (resource: BattleRosterResource): Text[] =>\n Array.from({ length: 4 }, (_, index) => {\n const text = new this.constructors.Text({\n text: '',\n style: { ...this.ports.typography.data, fontSize: 22, fontWeight: '700' },\n });\n text.anchor.set(0.5);\n text.alpha = 0;\n text.visible = false;\n text.label = `battle-roster-resource-feedback:${id}:${resource}:${index}`;\n return text;\n });\n const resourceFeedback: Record<string, readonly Text[]> = {};\n for (const resource of Object.keys(this.ports.resources))\n resourceFeedback[resource] = createFeedbackLane(resource);\n const nameViewport = new this.constructors.Container({ label: 'battle-roster-name-viewport' });\n const nameMask = new this.constructors.Graphics();\n const insanityFilter = createDossierInsanityFilter({\n Filter: this.constructors.Filter,\n UniformGroup: this.constructors.UniformGroup,\n tearGapColor: hexToUnitRgb(this.ports.style.distortionTearGap),\n });\n insanityFilter.filter.enabled = false;\n nameViewport.addChild(name);\n if (background) root.addChild(background);\n content.addChild(\n resourceBar,\n resourceFill,\n resourceFlash,\n avatarMask,\n order,\n nameViewport,\n nameMask,\n stats,\n ...Object.values(resourceFeedback).flat(),\n );\n content.filters = [insanityFilter.filter];\n root.addChild(content, frame);\n if (blood) {\n blood.anchor.set(0.5);\n blood.blendMode = 'multiply';\n blood.visible = false;\n root.addChild(blood);\n }\n order.anchor.set(0.5);\n name.anchor.set(0, 0.5);\n stats.anchor.set(1, 0.5);\n this.rosterContent.addChild(shadow, root);\n const resourceMeter = this.animation\n ? new PixiRetainedMeterAnimator(\n this.animation,\n {\n setRatio: (ratio) => {\n resourceFill.scale.x = ratio;\n resourceFlash.scale.x = ratio;\n },\n setFlashAlpha: (alpha) => {\n resourceFlash.alpha = alpha;\n },\n },\n this.requestRender,\n )\n : null;\n resourceMeter?.setReducedMotion(this.reducedMotion);\n const item = {\n root,\n shadow,\n content,\n background,\n blood,\n frame,\n resourceBar,\n resourceFill,\n resourceFlash,\n resourceMeter,\n avatarMask,\n order,\n nameViewport,\n nameMask,\n name,\n stats,\n statusPills: new Map<string, StatusPillNode>(),\n overflowStatusPill: this.createStatusPill(content, null),\n resourceFeedback,\n feedbackController: null,\n shakeOriginX: null,\n avatar: null,\n grayFilter: null,\n grayFilterBrightness: null,\n insanityFilter,\n stainActive: false,\n avatarKey: null,\n loadVersion: 0,\n baseX: 0,\n baseY: 0,\n nameOverflow: false,\n nameScrollWidth: 0,\n shadowGeometryKey: null,\n };\n this.rosterNodes.set(id, item);\n return item;\n }\n\n private async playRosterResourceValue(\n feedback: BattleRosterResourceFeedback,\n signal: AbortSignal,\n ): Promise<void> {\n const item = this.rosterNodes.get(feedback.tokenId);\n if (!item || !this.animation) return;\n const hitIndex = Math.max(0, Math.floor(feedback.hitIndex ?? 0));\n const resource = this.ports.resources[feedback.resource];\n if (!resource) throw new Error('HUD resource feedback descriptor missing');\n const lane = item.resourceFeedback[feedback.resource];\n const text = lane[hitIndex % lane.length]!;\n const laneIndex = resource.lane;\n const color = feedback.value < 0 ? resource.negative : resource.positive;\n text.text = `${feedback.value > 0 ? '+' : ''}${feedback.value}`;\n const isAttackDamage = feedback.emphasis === true && feedback.value < 0;\n const attackDamageOffsetX = isAttackDamage\n ? this.resolveFiniteTuningNumber('visual.battle.roster.attackDamageOffsetX', 0)\n : 0;\n const attackDamageOffsetY = isAttackDamage\n ? this.resolveFiniteTuningNumber('visual.battle.roster.attackDamageOffsetY', 0)\n : 0;\n text.style = {\n ...this.ports.typography.data,\n fill: color,\n fontSize: isAttackDamage\n ? this.resolveFiniteTuningNumber('visual.battle.roster.attackDamageFontSize', 30)\n : 22,\n fontWeight: '700',\n };\n text.position.set(\n this.ports.unitCardLayout.avatar.x +\n this.ports.unitCardLayout.avatar.width / 2 +\n ((hitIndex % 3) - 1) * 12 +\n attackDamageOffsetX,\n this.ports.unitCardLayout.avatar.y +\n this.ports.unitCardLayout.avatar.height / 2 +\n (laneIndex - 1) * 21 +\n attackDamageOffsetY,\n );\n text.alpha = 0;\n text.visible = true;\n const delay =\n (hitIndex *\n this.resolveFiniteTuningNumber('motion.battle.roster.resourceSameKindStaggerMs', 60)) /\n 1000;\n const duration = Math.max(\n 0.1,\n this.resolveFiniteTuningNumber('motion.battle.roster.resourceFeedbackDurationMs', 500) / 1000,\n );\n try {\n await this.animation.sequence(\n [\n () =>\n this.animation!.tween(\n text,\n { alpha: 1, duration: Math.min(0.1, duration * 0.2), delay },\n signal,\n ),\n () => this.animation!.tween({}, { duration: duration * 0.4 }, signal),\n () => this.animation!.tween(text, { alpha: 0, duration: duration * 0.4 }, signal),\n ],\n signal,\n );\n } finally {\n if (\n this.rosterNodes.get(feedback.tokenId) === item &&\n !item.root.destroyed &&\n item.feedbackController?.signal === signal\n ) {\n text.alpha = 0;\n text.visible = false;\n this.requestRender();\n }\n }\n }\n\n private async playRosterDamageShake(tokenId: string, signal: AbortSignal): Promise<void> {\n const item = this.rosterNodes.get(tokenId);\n if (!item || !this.animation) return;\n const originX = item.root.x;\n item.shakeOriginX = originX;\n const duration =\n this.resolveFiniteTuningNumber('motion.battle.roster.resourceDamageShakeDurationMs', 100) /\n 1000;\n try {\n await this.animation.tween(\n item.root,\n {\n keyframes: [\n { x: originX - 5, duration: duration * 0.25 },\n { x: originX + 5, duration: duration * 0.25 },\n { x: originX - 3, duration: duration * 0.25 },\n { x: originX, duration: duration * 0.25 },\n ],\n },\n signal,\n );\n } finally {\n if (\n this.rosterNodes.get(tokenId) === item &&\n !item.root.destroyed &&\n item.feedbackController?.signal === signal\n ) {\n item.root.x = originX;\n item.shakeOriginX = null;\n this.requestRender();\n }\n }\n }\n\n private syncRosterName(item: RosterNode): void {\n const typography = this.ports.layout.typography.roster;\n const maxWidth = Math.max(\n 1,\n typography.resource.x -\n item.stats.width -\n this.ports.unitCardLayout.name.rightPadding -\n typography.name.x,\n );\n let fontSize = typography.name.fontSize;\n item.name.style = { ...this.ports.typography.caption, fontSize };\n while (fontSize > typography.name.minFontSize && item.name.width > maxWidth) {\n fontSize -= 1;\n item.name.style = { ...this.ports.typography.caption, fontSize };\n }\n item.name.position.set(typography.name.x, typography.name.y);\n const maskHeight = Math.max(36, Math.ceil(fontSize * 1.6));\n item.nameMask\n .clear()\n .rect(typography.name.x, typography.name.y - maskHeight / 2, maxWidth, maskHeight)\n .fill(this.ports.colors.mask);\n item.nameOverflow = item.name.width > maxWidth;\n item.nameScrollWidth = Math.max(0, item.name.width - maxWidth);\n item.nameViewport.mask = item.nameMask;\n }\n\n private syncRosterNameMarquee(): void {\n this.stopRosterNameMarquee?.();\n this.stopRosterNameMarquee = null;\n const overflowing = [...this.rosterNodes.values()].filter((item) => item.nameOverflow);\n if (overflowing.length === 0 || this.reducedMotion) return;\n this.rosterNameScrollPhase = 0;\n const release = this.activity.acquire('battle-roster-name-marquee');\n const update = (ticker: Ticker) => {\n this.rosterNameScrollPhase = (this.rosterNameScrollPhase + ticker.deltaMS * 0.016) % 1;\n for (const item of overflowing) {\n const travel = item.nameScrollWidth + 28;\n item.name.position.x =\n this.ports.layout.typography.roster.name.x - travel * this.rosterNameScrollPhase;\n }\n };\n this.ticker.add(update);\n this.stopRosterNameMarquee = () => {\n this.ticker.remove(update);\n release();\n };\n }\n\n private syncRosterHpBar(item: RosterNode, data: HudRosterView): void {\n if (!data.meter) {\n item.resourceBar.clear();\n item.resourceFill.clear();\n item.resourceFlash.clear();\n item.resourceMeter?.settle(0);\n item.resourceBar.visible = false;\n item.resourceFill.visible = false;\n item.resourceFlash.visible = false;\n return;\n }\n const {\n x: barX,\n y: barY,\n height: barHeight,\n width: barWidth,\n } = this.ports.layout.unitCard.resourceBar;\n const fillColor = data.meter.color;\n const gradientSegments = 12;\n item.resourceBar\n .clear()\n .rect(barX, barY, barWidth, barHeight)\n .fill({ color: this.ports.style.roster.resourceTrack, alpha: 0.98 });\n item.resourceFill.clear();\n for (let segmentIndex = 0; segmentIndex < gradientSegments; segmentIndex += 1) {\n const segmentLeft = (barWidth * segmentIndex) / gradientSegments;\n const segmentRight = (barWidth * (segmentIndex + 1)) / gradientSegments;\n item.resourceFill.rect(segmentLeft, 0, segmentRight - segmentLeft, barHeight).fill({\n color: fillColor,\n alpha: resolveUnitCardHpGradientAlpha(segmentIndex, gradientSegments),\n });\n }\n item.resourceFill\n .rect(0, 0, barWidth, 1)\n .fill({ color: this.ports.style.roster.resourceHighlight, alpha: 0.42 });\n item.resourceFill.position.set(barX, barY);\n item.resourceFlash\n .clear()\n .rect(0, 0, barWidth, barHeight)\n .fill({ color: 0xffffff, alpha: 0.82 });\n item.resourceFlash.position.set(barX, barY);\n item.resourceFlash.alpha = 0;\n item.resourceBar\n .rect(barX, barY, barWidth, barHeight)\n .stroke({ color: this.ports.style.metal.shadow, width: 1, alpha: 0.96 });\n if (item.resourceMeter) {\n if (this.lastInput?.hydrate) item.resourceMeter.settle(data.meter.ratio);\n else item.resourceMeter.sync(data.meter.ratio);\n } else item.resourceFill.scale.x = clampProgress(data.meter.ratio);\n item.resourceBar.visible = true;\n item.resourceFill.visible = true;\n item.resourceFlash.visible = true;\n }\n\n private syncAvatar(\n item: RosterNode,\n data: HudRosterView,\n avatarX: number,\n avatarY: number,\n visible: boolean,\n avatarWidth: number,\n avatarHeight: number,\n ): void {\n const avatarUrl = data.avatarUrl || this.ports.defaultAvatarUrl;\n const avatarCrop = data.avatarUrl ? data.avatarCrop : undefined;\n const key = JSON.stringify([avatarUrl, avatarCrop ?? null]);\n if (!visible) {\n item.loadVersion += 1;\n item.avatar?.destroy();\n item.avatar = null;\n item.avatarKey = null;\n return;\n }\n if (item.avatarKey === key && item.avatar) return;\n item.avatarKey = key;\n const version = ++item.loadVersion;\n void this.assets\n .loadTexture(`battle-roster:${data.id}:${key}`, avatarUrl, 'battle-common')\n .then((texture) => {\n if (item.loadVersion !== version || item.avatarKey !== key) return;\n const avatar = item.avatar ?? new this.constructors.Sprite(texture);\n avatar.texture = texture;\n const rect = resolveCroppedCoverRect(\n { width: Number(texture.width) || 1, height: Number(texture.height) || 1 },\n { x: avatarX, y: avatarY, width: avatarWidth, height: avatarHeight },\n avatarCrop,\n );\n avatar.position.set(rect.x, rect.y);\n avatar.width = rect.width;\n avatar.height = rect.height;\n avatar.mask = item.avatarMask;\n if (!item.avatar) item.content.addChildAt(avatar, 0);\n item.avatar = avatar;\n this.requestRender();\n })\n .catch(() => {\n if (item.loadVersion === version && item.avatarKey === key) item.avatarKey = null;\n });\n }\n\n private syncStatusPills(item: RosterNode, statuses: readonly string[], disabled: boolean): void {\n for (const pill of item.statusPills.values()) pill.root.visible = false;\n item.overflowStatusPill.root.visible = false;\n if (statuses.length === 0) return;\n\n const style = this.ports.layout.typography.roster.status;\n const gap = 4;\n const statusLayouts = new Map<string, ReturnType<typeof resolveBattleStatusPillLayout>>();\n for (const status of statuses) {\n const pill = this.ensureStatusPill(item, status);\n pill.label.text = this.ports.statuses[status]!.label;\n pill.label.style = { ...this.ports.typography.data, fontSize: style.fontSize };\n const layout = resolveBattleStatusPillLayout(style, {\n hasIcon: false,\n labelWidth: pill.label.width,\n labelHeight: pill.label.height,\n });\n pill.layout = layout;\n statusLayouts.set(status, layout);\n }\n\n const overflowPill = item.overflowStatusPill;\n overflowPill.label.text = `+${statuses.length}`;\n overflowPill.label.style = { ...this.ports.typography.data, fontSize: style.fontSize };\n const overflowLayout = resolveBattleStatusPillLayout(style, {\n hasIcon: false,\n labelWidth: overflowPill.label.width,\n labelHeight: overflowPill.label.height,\n });\n const avatarSafeLeft =\n this.ports.unitCardLayout.avatar.x + this.ports.unitCardLayout.avatar.width + gap;\n const visibility = resolveHudStatusVisibility(\n statuses,\n Math.max(0, style.right - avatarSafeLeft),\n (status) => statusLayouts.get(status)?.width ?? 0,\n overflowLayout.width,\n gap,\n );\n\n let right = style.right;\n visibility.visible.forEach((status, index) => {\n const pill = item.statusPills.get(status);\n const layout = statusLayouts.get(status);\n if (!pill || !layout) return;\n right -= layout.width;\n this.drawStatusPill(pill, status, disabled, layout);\n pill.root.position.set(right, style.y - layout.height / 2);\n pill.root.visible = true;\n if (index < visibility.visible.length - 1 || visibility.hiddenCount > 0) right -= gap;\n });\n\n if (visibility.hiddenCount === 0) return;\n overflowPill.label.text = `+${visibility.hiddenCount}`;\n const finalOverflowLayout = resolveBattleStatusPillLayout(style, {\n hasIcon: false,\n labelWidth: overflowPill.label.width,\n labelHeight: overflowPill.label.height,\n });\n overflowPill.layout = finalOverflowLayout;\n this.drawStatusPill(overflowPill, null, disabled, finalOverflowLayout, overflowPill.label.text);\n overflowPill.root.position.set(\n right - finalOverflowLayout.width,\n style.y - finalOverflowLayout.height / 2,\n );\n overflowPill.root.visible = true;\n }\n\n private ensureStatusPill(item: RosterNode, status: string): StatusPillNode {\n const existing = item.statusPills.get(status);\n if (existing) return existing;\n const pill = this.createStatusPill(item.content, status);\n item.statusPills.set(status, pill);\n return pill;\n }\n\n private createStatusPill(parent: Container, status: string | null): StatusPillNode {\n const root = new this.constructors.Container({\n label: status ? `battle-roster-status:${status}` : 'battle-roster-status-overflow',\n });\n if (status === null) root.eventMode = 'none';\n const frame = new this.constructors.Graphics();\n const label = new this.constructors.Text({\n text: '',\n style: { ...this.ports.typography.data, fontSize: 10 },\n });\n label.anchor.set(0, 0.5);\n root.addChild(frame, label);\n parent.addChild(root);\n return {\n root,\n frame,\n label,\n layout: null,\n };\n }\n\n private drawStatusPill(\n pill: StatusPillNode,\n status: string | null,\n disabled: boolean,\n layout: ReturnType<typeof resolveBattleStatusPillLayout>,\n text = status ? this.ports.statuses[status]!.label : '',\n ): void {\n const style = this.ports.layout.typography.roster.status;\n const palette = status ? this.ports.statuses[status]! : this.ports.style.statusPill;\n pill.frame\n .clear()\n .roundRect(0, 0, layout.width, layout.height, 5)\n .fill({ color: disabled ? this.ports.style.disabledSurface : palette.surface, alpha: 0.98 })\n .roundRect(1, 1, Math.max(1, layout.width - 2), Math.max(1, layout.height - 2), 5)\n .fill({ color: disabled ? this.ports.style.disabled : palette.inset, alpha: 0.45 })\n .stroke({\n color: disabled ? this.ports.style.disabledBorder : palette.border,\n width: 1,\n alpha: 0.9,\n });\n pill.label.text = text;\n pill.label.style = { ...this.ports.typography.data, fontSize: style.fontSize };\n pill.label.tint = disabled ? this.ports.style.disabledText : palette.text;\n pill.label.position.set(layout.label.x, layout.label.y);\n }\n\n private syncObjectives(objectives: readonly HudObjectiveView[], animateLifecycle: boolean): void {\n const ids = new Set(objectives.map((item) => item.id));\n for (const [, item] of this.objectiveNodes) {\n if (ids.has(item.id)) continue;\n if (item.lifecycle === 'exiting') continue;\n if (animateLifecycle) this.startObjectiveExit(item);\n else this.destroyObjectiveNode(item);\n }\n const rect = this.ports.layout.objective;\n const gap = this.ports.objectiveLayout.gap;\n const tabWidth = resolveHudObjectiveCardWidth(\n objectives.length,\n rect.width,\n this.ports.objectiveLayout.maxWidth,\n gap,\n );\n const textureWidth =\n Number(this.battleTextures.objective?.width) || this.ports.objectiveLayout.source.width;\n const textureHeight =\n Number(this.battleTextures.objective?.height) || this.ports.objectiveLayout.source.height;\n const scale = tabWidth / textureWidth;\n const cardY = rect.y + (rect.height - textureHeight * scale) / 2;\n objectives.forEach((objective, index) => {\n let item = this.objectiveNodes.get(objective.id);\n const shouldEnter = !item || item.lifecycle === 'exiting';\n if (!item) item = this.createObjectiveNode(objective.id);\n else if (item.lifecycle === 'exiting') item.lifecycleController?.abort();\n\n item.root.position.set(rect.x + index * (tabWidth + gap), cardY);\n item.root.scale.set(scale);\n this.configureObjectiveGlow(item);\n const progress = clampProgress(objective.progress);\n this.drawObjectiveProgress(item, progress);\n if (\n !this.lastInput?.hydrate &&\n !shouldEnter &&\n item.lifecycle === 'stable' &&\n item.progress !== null &&\n Math.abs(item.progress - progress) > 0.0001\n ) {\n this.playObjectiveGlow(item);\n }\n item.progress = progress;\n item.name.text = objective.name;\n item.name.style = {\n ...this.ports.typography.caption,\n fontSize: this.ports.layout.typography.objective.title.fontSize,\n fontWeight: '700',\n };\n item.name.position.set(\n this.ports.layout.typography.objective.title.x,\n this.ports.layout.typography.objective.title.y,\n );\n item.name.tint = this.ports.style.assetUi.objectiveTitle;\n item.percent.text = objective.progressLabel;\n item.percent.style = {\n ...this.ports.typography.data,\n fontSize: this.ports.layout.typography.objective.percent.fontSize,\n fontWeight: '700',\n };\n item.percent.position.set(\n this.ports.layout.typography.objective.percent.x,\n this.ports.layout.typography.objective.percent.y,\n );\n item.percent.tint = this.ports.style.assetUi.objectivePercent;\n if (shouldEnter) {\n if (animateLifecycle) this.playObjectiveEntrance(item);\n else this.settleObjectiveLifecycle(item);\n }\n });\n this.syncObjectiveGlowAnimation();\n }\n\n private drawObjectiveProgress(item: ObjectiveNode, progress: number): void {\n const { x, y, width, height, radius } = this.ports.objectiveLayout.track;\n item.track\n .clear()\n .roundRect(x, y, width, height, radius)\n .fill({ color: this.ports.style.assetUi.objectiveTrack, alpha: 0.9 })\n .roundRect(x, y, width, height, radius)\n .stroke({\n color: this.ports.style.assetUi.objectiveTrackBorder,\n width: 1,\n alpha: 0.7,\n alignment: 1,\n });\n item.fill\n .clear()\n .rect(0, 0, width, height)\n .fill({ color: this.ports.style.assetUi.objectiveFill, alpha: 0.9 })\n .rect(0, 0, width, this.ports.objectiveProgressStyle.highlightHeight)\n .fill({ color: this.ports.style.assetUi.objectiveFillHighlight, alpha: 0.5 })\n .rect(\n 0,\n height - this.ports.objectiveProgressStyle.shadowHeight,\n width,\n this.ports.objectiveProgressStyle.shadowHeight,\n )\n .fill({ color: this.ports.style.assetUi.objectiveFillShadow, alpha: 0.7 })\n .rect(\n width - this.ports.objectiveProgressStyle.endMarkerWidth / 2,\n 0,\n this.ports.objectiveProgressStyle.endMarkerWidth,\n height,\n )\n .fill({ color: this.ports.style.assetUi.objectiveMarker, alpha: 0.85 });\n item.fill.position.set(x, y);\n if (item.meter) {\n if (this.lastInput?.hydrate) item.meter.settle(progress);\n else item.meter.sync(progress);\n } else item.fill.scale.x = progress;\n item.segments.clear();\n for (\n let value = this.ports.objectiveProgressStyle.smallTickEvery;\n value < 1;\n value += this.ports.objectiveProgressStyle.smallTickEvery\n ) {\n const isMajor = this.ports.objectiveProgressStyle.majorTicks.some(\n (major) => Math.abs(major - value) < 0.001,\n );\n const tickHeight = isMajor\n ? this.ports.objectiveProgressStyle.majorTickHeight\n : this.ports.objectiveProgressStyle.smallTickHeight;\n item.segments\n .rect(x + width * value, y + height - tickHeight, 1, tickHeight)\n .fill({ color: this.ports.style.assetUi.objectiveTick, alpha: isMajor ? 0.8 : 0.65 });\n }\n for (const value of [0, 1])\n item.segments\n .rect(\n x + width * value,\n y + height - this.ports.objectiveProgressStyle.majorTickHeight,\n 1,\n this.ports.objectiveProgressStyle.majorTickHeight,\n )\n .fill({ color: this.ports.style.assetUi.objectiveTick, alpha: 0.8 });\n }\n\n private createObjectiveNode(id: string): ObjectiveNode {\n const root = new this.constructors.Container({ label: `battle-objective:${id}` });\n const fogRoot = new this.constructors.Container({\n label: `battle-objective-fog:${id}`,\n });\n const motionRoot = new this.constructors.Container({\n label: `battle-objective-motion:${id}`,\n });\n const centerX = this.ports.objectiveLayout.source.width / 2;\n const centerY = this.ports.objectiveLayout.source.height / 2;\n fogRoot.position.set(centerX, centerY);\n fogRoot.pivot.set(centerX, centerY);\n motionRoot.position.set(centerX, centerY);\n motionRoot.pivot.set(centerX, centerY);\n const background = this.battleTextures.objective\n ? new this.constructors.Sprite(this.battleTextures.objective)\n : null;\n const track = new this.constructors.Graphics();\n const fill = new this.constructors.Graphics();\n const glow = new PixiObjectiveBreathingGlow(this.constructors);\n glow.setHighlightMultiplier(this.uiHighlightMultiplier);\n const segments = new this.constructors.Graphics();\n const name = new this.constructors.Text({\n text: '',\n style: {\n ...this.ports.typography.caption,\n fontSize: this.ports.objectiveLayout.title.fontSize,\n fontWeight: '700',\n },\n });\n const percent = new this.constructors.Text({\n text: '',\n style: {\n ...this.ports.typography.data,\n fontSize: this.ports.objectiveLayout.percent.fontSize,\n fontWeight: '700',\n },\n });\n name.anchor.set(0, 0.5);\n percent.anchor.set(1, 0.5);\n name.position.set(this.ports.objectiveLayout.title.x, this.ports.objectiveLayout.title.y);\n percent.position.set(\n this.ports.objectiveLayout.percent.x,\n this.ports.objectiveLayout.percent.y,\n );\n if (background) motionRoot.addChild(background);\n motionRoot.addChild(track, fill, segments, name, percent);\n root.addChild(fogRoot, motionRoot);\n this.objectiveRoot.addChild(root);\n const meter = this.animation\n ? new PixiRetainedMeterAnimator(\n this.animation,\n {\n setRatio: (ratio) => {\n fill.scale.x = ratio;\n },\n setFlashAlpha: () => undefined,\n },\n this.requestRender,\n )\n : null;\n meter?.setReducedMotion(this.reducedMotion);\n const item = {\n id,\n root,\n fogRoot,\n motionRoot,\n background,\n track,\n fill,\n glow,\n segments,\n name,\n percent,\n meter,\n progress: null,\n glowActive: false,\n glowElapsedMs: 0,\n glowController: null,\n entryGlowMultiplier: 1,\n lifecycle: 'stable' as const,\n lifecycleController: null,\n };\n this.configureObjectiveGlow(item);\n this.objectiveNodes.set(id, item);\n return item;\n }\n\n private playObjectiveGlow(item: ObjectiveNode): void {\n item.glowController?.abort();\n item.glowActive = true;\n item.glowElapsedMs = 0;\n const controller = new AbortController();\n item.glowController = controller;\n if (this.reducedMotion) {\n item.glow.setFrame(1, true);\n const holdMs = this.resolveFiniteTuningNumber(\n 'motion.battle.objectiveFeedback.reducedMotionHoldMs',\n 240,\n );\n void this.animation?.tween({}, { duration: holdMs / 1000 }, controller.signal).finally(() => {\n if (\n this.objectiveNodes.get(item.id) !== item ||\n item.root.destroyed ||\n item.glowController !== controller\n )\n return;\n item.glow.hide();\n item.glowActive = false;\n if (item.glowController === controller) item.glowController = null;\n });\n return;\n }\n item.glowController = null;\n item.glow.setFrame(0);\n this.syncObjectiveGlowAnimation();\n }\n\n private configureObjectiveGlow(item: ObjectiveNode): void {\n item.glow.configure(item.fogRoot, {\n width: this.ports.objectiveLayout.source.width,\n height: this.ports.objectiveLayout.source.height,\n cornerRadius: 5,\n padding: this.resolveFiniteTuningNumber('visual.battle.objectiveFeedback.paddingPx', 8),\n coreWidth: this.resolveFiniteTuningNumber(\n 'visual.battle.objectiveFeedback.outlineWidthPx',\n 2,\n ),\n softness: this.resolveFiniteTuningNumber('visual.battle.objectiveFeedback.blurStrength', 14),\n maxAlpha: this.resolveFiniteTuningNumber('visual.battle.objectiveFeedback.maxAlpha', 0.68),\n maxScale: this.resolveFiniteTuningNumber('visual.battle.objectiveFeedback.maxScale', 1.03),\n color: this.resolveTuningColor('visual.battle.objectiveFeedback.color', '#d5b56e'),\n });\n }\n\n private playObjectiveEntrance(item: ObjectiveNode): void {\n item.lifecycleController?.abort();\n if (!this.animation) {\n this.settleObjectiveLifecycle(item);\n return;\n }\n const controller = new AbortController();\n item.lifecycleController = controller;\n item.lifecycle = 'entering';\n item.glowController?.abort();\n item.glowController = null;\n item.glowActive = false;\n item.glow.hide();\n item.root.alpha = 1;\n item.fogRoot.alpha = 0;\n item.fogRoot.scale.set(1);\n item.motionRoot.alpha = 1;\n item.motionRoot.scale.set(1);\n item.motionRoot.rotation = 0;\n item.entryGlowMultiplier = 1;\n item.glow.setHighlightMultiplier(this.uiHighlightMultiplier);\n\n const complete = () => {\n if (controller.signal.aborted || item.lifecycleController !== controller) return;\n this.settleObjectiveLifecycle(item);\n this.playObjectiveGlow(item);\n this.requestRender();\n };\n\n if (this.reducedMotion) {\n item.root.alpha = 0;\n void this.animation\n .tween(\n item.root,\n {\n alpha: 1,\n duration: 0.2,\n reducedMotionDuration: 0.2,\n ease: 'power1.out',\n },\n controller.signal,\n )\n .then(complete);\n return;\n }\n\n const gatherLead =\n Math.max(\n 0,\n this.resolveFiniteTuningNumber('motion.battle.objectiveLifecycle.gatherLeadMs', 80),\n ) / 1000;\n const enterDuration =\n Math.max(\n 0,\n this.resolveFiniteTuningNumber('motion.battle.objectiveLifecycle.enterDurationMs', 520),\n ) / 1000;\n const settleDuration =\n Math.max(\n 0,\n this.resolveFiniteTuningNumber('motion.battle.objectiveLifecycle.settleDurationMs', 180),\n ) / 1000;\n const startScale = Math.max(\n 0,\n this.resolveFiniteTuningNumber('motion.battle.objectiveLifecycle.startScale', 0.72),\n );\n const overshootScale = Math.max(\n 0,\n this.resolveFiniteTuningNumber('motion.battle.objectiveLifecycle.overshootScale', 1.06),\n );\n const startRotation =\n (this.resolveFiniteTuningNumber('motion.battle.objectiveLifecycle.startRotationDegrees', -4) *\n Math.PI) /\n 180;\n const entryGlowMultiplier = Math.max(\n 0,\n this.resolveFiniteTuningNumber('visual.battle.objectiveLifecycle.entryGlowMultiplier', 1.25),\n );\n const syncEntryGlow = () => {\n item.glow.setHighlightMultiplier(this.uiHighlightMultiplier * item.entryGlowMultiplier);\n item.glow.setFrame(1, true);\n this.requestRender();\n };\n item.fogRoot.scale.set(1.12);\n item.motionRoot.alpha = 0;\n item.motionRoot.scale.set(startScale);\n item.motionRoot.rotation = startRotation;\n syncEntryGlow();\n\n const fogGather = Promise.all([\n this.animation.tween(\n item.fogRoot,\n { alpha: 1, duration: gatherLead + enterDuration, ease: 'power2.out' },\n controller.signal,\n ),\n this.animation.tween(\n item.fogRoot.scale,\n { x: 1, y: 1, duration: gatherLead + enterDuration, ease: 'power2.out' },\n controller.signal,\n ),\n ]);\n const cardReveal = this.animation\n .tween({}, { duration: gatherLead }, controller.signal)\n .then(() =>\n Promise.all([\n this.animation!.tween(\n item.motionRoot,\n { alpha: 1, rotation: 0, duration: enterDuration, ease: 'power3.out' },\n controller.signal,\n ),\n this.animation!.tween(\n item.motionRoot.scale,\n {\n x: overshootScale,\n y: overshootScale,\n duration: enterDuration,\n ease: 'power3.out',\n },\n controller.signal,\n ),\n this.animation!.tween(\n item,\n {\n entryGlowMultiplier,\n duration: enterDuration,\n ease: 'power2.out',\n onUpdate: syncEntryGlow,\n },\n controller.signal,\n ),\n ]),\n )\n .then(() =>\n Promise.all([\n this.animation!.tween(\n item.motionRoot.scale,\n { x: 1, y: 1, duration: settleDuration, ease: 'power2.inOut' },\n controller.signal,\n ),\n this.animation!.tween(\n item,\n {\n entryGlowMultiplier: 1,\n duration: settleDuration,\n ease: 'power1.out',\n onUpdate: syncEntryGlow,\n },\n controller.signal,\n ),\n ]),\n );\n void Promise.all([fogGather, cardReveal]).then(complete);\n }\n\n private settleObjectiveLifecycle(item: ObjectiveNode): void {\n item.lifecycleController?.abort();\n item.lifecycleController = null;\n item.lifecycle = 'stable';\n item.root.alpha = 1;\n item.fogRoot.alpha = 1;\n item.fogRoot.scale.set(1);\n item.motionRoot.alpha = 1;\n item.motionRoot.scale.set(1);\n item.motionRoot.rotation = 0;\n item.entryGlowMultiplier = 1;\n item.glow.setHighlightMultiplier(this.uiHighlightMultiplier);\n item.glow.hide();\n }\n\n private startObjectiveExit(item: ObjectiveNode): void {\n if (item.lifecycle === 'exiting') return;\n item.lifecycleController?.abort();\n item.glowController?.abort();\n item.glowController = null;\n item.glowActive = false;\n item.glow.hide();\n item.lifecycle = 'exiting';\n this.restartObjectiveExit(item);\n }\n\n private restartObjectiveExit(item: ObjectiveNode): void {\n item.lifecycleController?.abort();\n if (item.lifecycle !== 'exiting') return;\n if (!this.animation) {\n this.destroyObjectiveNode(item);\n return;\n }\n const controller = new AbortController();\n item.lifecycleController = controller;\n const duration =\n Math.max(\n 0,\n this.resolveFiniteTuningNumber('motion.battle.objectiveLifecycle.exitDurationMs', 500),\n ) / 1000;\n void this.animation\n .tween(\n item.root,\n { alpha: 0, duration, reducedMotionDuration: duration, ease: 'none' },\n controller.signal,\n )\n .then(() => {\n if (\n controller.signal.aborted ||\n item.lifecycleController !== controller ||\n item.lifecycle !== 'exiting' ||\n this.objectiveNodes.get(item.id) !== item\n )\n return;\n this.destroyObjectiveNode(item);\n this.syncObjectiveGlowAnimation();\n this.requestRender();\n });\n }\n\n private destroyObjectiveNode(item: ObjectiveNode): void {\n item.lifecycleController?.abort();\n item.glowController?.abort();\n item.meter?.destroy();\n item.glow.destroy();\n item.root.destroy({ children: true });\n if (this.objectiveNodes.get(item.id) === item) this.objectiveNodes.delete(item.id);\n }\n\n private syncObjectiveGlowAnimation(): void {\n const shouldAnimate =\n this.visible &&\n !this.reducedMotion &&\n [...this.objectiveNodes.values()].some((item) => item.glowActive);\n if (!shouldAnimate) {\n this.stopObjectiveGlowAnimation?.();\n this.stopObjectiveGlowAnimation = null;\n return;\n }\n if (this.stopObjectiveGlowAnimation) return;\n const release = this.activity.acquire('battle-objective-breathing-glow');\n const update = () => {\n const durationMs = Math.max(\n 1,\n this.resolveFiniteTuningNumber('motion.battle.objectiveFeedback.durationMs', 900),\n );\n let hasActiveGlow = false;\n for (const item of this.objectiveNodes.values()) {\n if (!item.glowActive) continue;\n item.glowElapsedMs += this.ticker.deltaMS;\n const progress = Math.min(1, item.glowElapsedMs / durationMs);\n if (progress >= 1) {\n item.glow.hide();\n item.glowActive = false;\n continue;\n }\n item.glow.setFrame(Math.sin(progress * Math.PI));\n hasActiveGlow = true;\n }\n this.requestRender();\n if (!hasActiveGlow) {\n const stop = this.stopObjectiveGlowAnimation;\n this.stopObjectiveGlowAnimation = null;\n stop?.();\n }\n };\n this.ticker.add(update);\n this.stopObjectiveGlowAnimation = () => {\n this.ticker.remove(update);\n release();\n };\n }\n\n private syncTeamChecks(checks: readonly HudIconView[], animateLifecycle: boolean): void {\n const texture = this.battleTextures.teamCheckIcon;\n if (!texture) {\n this.clearTeamCheckNodes();\n this.syncTeamCheckFogAnimation();\n return;\n }\n\n const ids = new Set(checks.map((item) => item.id));\n for (const [, item] of this.teamCheckNodes) {\n if (ids.has(item.id)) continue;\n if (item.lifecycle === 'exiting') continue;\n if (animateLifecycle) this.startTeamCheckExit(item);\n else this.destroyTeamCheckNode(item);\n }\n\n const rect = this.ports.layout.headerTeamChecks;\n const textureWidth = Math.max(1, Number(texture.width) || 1);\n const textureHeight = Math.max(1, Number(texture.height) || 1);\n const layouts = resolveBattleTeamCheckIconLayouts(checks.length, {\n areaWidth: rect.width,\n areaHeight: rect.height,\n iconHeight: this.resolveTeamCheckIconHeight(),\n gap: this.resolveTeamCheckIconGap(),\n textureAspectRatio: textureWidth / textureHeight,\n });\n const glowColor = this.resolveTeamCheckGlowColor();\n const glowIntensity = this.resolveTeamCheckGlowIntensity();\n const style = this.ports.style.teamCheckStatus;\n\n checks.forEach((token, index) => {\n const layout = layouts[index];\n if (!layout) return;\n let item = this.teamCheckNodes.get(token.id);\n const shouldEnter = !item || item.lifecycle === 'exiting';\n if (!item) item = this.createTeamCheckNode(token.id, texture);\n else if (item.lifecycle === 'exiting') item.lifecycleController?.abort();\n const centerX = layout.x + layout.width / 2;\n const centerY = layout.y + layout.height / 2;\n item.iconRoot.position.set(centerX, centerY);\n item.icon.position.set(0, 0);\n item.icon.width = layout.width;\n item.icon.height = layout.height;\n item.fogRoot.position.set(centerX, centerY);\n item.glow.position.set(0, 0);\n item.baseGlowWidth = layout.width * style.silhouetteScale;\n item.baseGlowHeight = layout.height * style.silhouetteScale;\n item.glow.width = item.baseGlowWidth;\n item.glow.height = item.baseGlowHeight;\n item.glow.tint = glowColor;\n item.glowIntensity = glowIntensity;\n item.phaseOffset = index * 0.83;\n item.plumeBases = style.plumes.map((plume, plumeIndex) => {\n const graphic = item.plumes[plumeIndex];\n graphic\n ?.clear()\n .ellipse(0, 0, layout.width * plume.radiusX, layout.height * plume.radiusY)\n .fill({ color: glowColor, alpha: 1 });\n const base = {\n x: layout.width * plume.x,\n y: layout.height * plume.y,\n alpha: glowIntensity * plume.alpha,\n };\n graphic?.position.set(base.x, base.y);\n return base;\n });\n if (shouldEnter) {\n if (animateLifecycle) this.playTeamCheckEntrance(item);\n else this.settleTeamCheckLifecycle(item);\n }\n });\n\n this.applyTeamCheckFogFrame(this.reducedMotion);\n this.syncTeamCheckFogAnimation();\n }\n\n private createTeamCheckNode(id: string, texture: Texture): TeamCheckNode {\n const fogRoot = new this.constructors.Container({ label: `battle-team-check-fog:${id}` });\n const glow = new this.constructors.Sprite(texture);\n const plumes = this.ports.style.teamCheckStatus.plumes.map(\n () => new this.constructors.Graphics(),\n );\n const iconRoot = new this.constructors.Container({ label: `battle-team-check-motion:${id}` });\n const icon = new this.constructors.Sprite(texture);\n glow.anchor.set(0.5);\n icon.anchor.set(0.5);\n fogRoot.addChild(glow, ...plumes);\n iconRoot.addChild(icon);\n this.teamCheckFogRoot.addChild(fogRoot);\n this.teamCheckIconRoot.addChild(iconRoot);\n const item: TeamCheckNode = {\n id,\n fogRoot,\n glow,\n plumes,\n iconRoot,\n icon,\n plumeBases: [],\n baseGlowWidth: 0,\n baseGlowHeight: 0,\n glowIntensity: 0,\n phaseOffset: 0,\n entryGlowMultiplier: 1,\n lifecycle: 'stable',\n lifecycleController: null,\n };\n this.teamCheckNodes.set(id, item);\n return item;\n }\n\n private syncRosterGray(item: RosterNode, disabled: boolean): void {\n if (!disabled) {\n item.root.filters = null;\n return;\n }\n const brightness = this.resolveDeadCardBrightness();\n if (!item.grayFilter || item.grayFilterBrightness !== brightness) {\n item.grayFilter?.destroy();\n const filter = new this.constructors.ColorMatrixFilter();\n filter.saturate(-1, false);\n filter.brightness(brightness, true);\n filter.alpha = 1;\n item.grayFilter = filter;\n item.grayFilterBrightness = brightness;\n }\n item.root.filters = [item.grayFilter];\n }\n\n private syncRosterStatusEffects(item: RosterNode, token: HudRosterView, dead: boolean): void {\n const insane = !dead && token.visualState.distorted === true;\n item.insanityFilter.filter.enabled = insane;\n if (insane) {\n item.insanityFilter.update(\n resolveDossierInsanityMode(this.tuning?.get('visual.battle.roster.distortion.mode')),\n this.resolveTuningNumber(\n 'visual.battle.roster.distortion.intensity',\n this.ports.style.rosterStatus.distortionIntensity,\n 0,\n 1,\n ),\n this.seedFor(token.id),\n );\n }\n item.content.filters = [item.insanityFilter.filter];\n\n const majorWound = !dead && token.visualState.stained === true && Boolean(item.blood);\n if (item.blood) {\n const wasVisible = item.blood.visible;\n item.blood.visible = majorWound;\n if (majorWound) {\n const size =\n Math.max(\n this.ports.unitCardLayout.avatar.width,\n this.ports.unitCardLayout.avatar.height,\n ) * 1.18;\n item.blood.alpha =\n this.resolveTuningNumber(\n 'visual.battle.roster.stain.opacity',\n this.ports.style.rosterStatus.stainOpacity,\n 0,\n 1,\n ) *\n this.resolveTuningNumber(\n 'visual.battle.roster.stain.strength',\n this.ports.style.rosterStatus.stainStrength,\n 0,\n 1,\n );\n item.blood.width = size;\n item.blood.height = size;\n item.blood.position.set(\n this.ports.unitCardLayout.avatar.x + this.ports.unitCardLayout.avatar.width / 2,\n this.ports.unitCardLayout.avatar.y + this.ports.unitCardLayout.avatar.height / 2,\n );\n if (!wasVisible)\n item.blood.rotation = resolveDossierBloodRotationRadians(() => this.seedFor(token.id));\n }\n }\n item.stainActive = majorWound;\n\n const unconscious = !dead && token.visualState.tilted === true;\n const maxDegrees = this.resolveTuningNumber(\n 'visual.battle.roster.tilt.maxTiltDegrees',\n this.ports.style.rosterStatus.tiltDegrees,\n 0,\n 4,\n );\n item.root.rotation = unconscious\n ? (stableSeededRotation(token.id, maxDegrees, 'battle-roster-unconscious') * Math.PI) / 180\n : 0;\n }\n\n private syncRosterCurrentActorVisuals(\n item: RosterNode,\n active: boolean,\n width: number,\n height: number,\n scale: number,\n ): void {\n const blurStrength = Math.max(\n 0,\n this.resolveCurrentActorNumber('visual.battle.currentActor.shadowBlurStrength', 5),\n );\n if (blurStrength !== this.currentActorShadowBlurStrength) {\n this.currentActorShadowBlurStrength = blurStrength;\n this.currentActorShadowBlur.strength = blurStrength;\n this.currentActorShadowBlur.enabled = blurStrength > 0;\n }\n const safeScale = Math.max(0.0001, Math.abs(scale));\n const requestedSpread = this.resolveCurrentActorNumber(\n 'visual.battle.currentActor.shadowSpread',\n 2,\n );\n const minimumSpread = -(Math.min(width, height) * safeScale) / 2 + 0.5;\n const spread = Math.max(requestedSpread, minimumSpread);\n const localSpread = spread / safeScale;\n const localBlurPadding = (blurStrength * 2) / safeScale;\n const shadowGeometryKey = [width, height, safeScale, spread, blurStrength].join('|');\n if (item.shadowGeometryKey !== shadowGeometryKey) {\n item.shadowGeometryKey = shadowGeometryKey;\n item.shadow\n .clear()\n .roundRect(-localSpread, -localSpread, width + localSpread * 2, height + localSpread * 2, 5)\n .fill({ color: this.ports.colors.transition, alpha: 1 });\n const filterArea = item.shadow.filterArea;\n if (filterArea) {\n filterArea.x = -localSpread - localBlurPadding;\n filterArea.y = -localSpread - localBlurPadding;\n filterArea.width = width + (localSpread + localBlurPadding) * 2;\n filterArea.height = height + (localSpread + localBlurPadding) * 2;\n }\n }\n const innerGlowIntensity = this.resolveCurrentActorNumber(\n 'visual.battle.currentActor.innerGlowIntensity',\n 0.78,\n );\n const innerGlowSoftness = this.resolveCurrentActorNumber(\n 'visual.battle.currentActor.innerGlowSoftness',\n 8,\n );\n if (active) {\n this.currentActorCardGlow.configure(item.root, item.content, {\n width,\n height,\n intensity: innerGlowIntensity,\n softness: innerGlowSoftness,\n color: this.ports.style.assetUi.rosterActive,\n });\n } else this.currentActorCardGlow.hideIfAttachedTo(item.root);\n if (active) {\n this.positionCurrentActorShadow(item);\n item.shadow.alpha = this.resolveCurrentActorNumber(\n 'visual.battle.currentActor.shadowAlpha',\n 1,\n );\n }\n item.shadow.visible = active;\n }\n\n private positionCurrentActorShadow(item: RosterNode): void {\n item.shadow.position.set(\n item.root.position.x +\n this.resolveCurrentActorNumber('visual.battle.currentActor.shadowOffsetX', -8),\n item.root.position.y +\n this.resolveCurrentActorNumber('visual.battle.currentActor.shadowOffsetY', 2),\n );\n }\n\n private resolveCurrentActorNumber(path: SessionTuningPath, fallback: number): number {\n const value = this.tuning?.get(path);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n }\n\n private applyCurrentRosterFrame(item: RosterNode, progress: number, staticFrame: boolean): void {\n const offsetX = this.resolveCurrentActorNumber('visual.battle.currentActor.cardOffsetX', 24);\n const liftY = this.resolveCurrentActorNumber('visual.battle.currentActor.cardLiftY', 1);\n const shadowAlpha = this.resolveCurrentActorNumber('visual.battle.currentActor.shadowAlpha', 1);\n const overshootProgress = 0.72;\n const eased = (value: number): number => 1 - (1 - value) ** 3;\n let x = offsetX;\n let y = -liftY;\n if (progress < 1) {\n if (progress <= overshootProgress) {\n const amount = eased(progress / overshootProgress);\n x = (offsetX + 4) * amount;\n y = -(liftY + 1) * amount;\n } else {\n const amount = eased((progress - overshootProgress) / (1 - overshootProgress));\n x = offsetX + 4 + (offsetX - (offsetX + 4)) * amount;\n y = -(liftY + 1) + (-liftY - -(liftY + 1)) * amount;\n }\n }\n item.root.position.set(item.baseX + x, item.baseY + y);\n this.positionCurrentActorShadow(item);\n item.shadow.alpha = shadowAlpha;\n item.shadow.visible = true;\n const phase = staticFrame ? 1 : this.rosterPulsePhase;\n item.frame.visible = true;\n item.frame.alpha = 0.72;\n this.currentActorCardGlow.setFrame(staticFrame ? 0.62 : phase, staticFrame);\n }\n\n private applyReturningRosterFrame(item: RosterNode, progress: number): void {\n const offsetX = this.resolveCurrentActorNumber('visual.battle.currentActor.cardOffsetX', 24);\n const liftY = this.resolveCurrentActorNumber('visual.battle.currentActor.cardLiftY', 1);\n const shadowAlpha = this.resolveCurrentActorNumber('visual.battle.currentActor.shadowAlpha', 1);\n const eased = 1 - (1 - progress) ** 3;\n const remaining = 1 - eased;\n item.root.position.set(item.baseX + offsetX * remaining, item.baseY - liftY * remaining);\n this.positionCurrentActorShadow(item);\n item.shadow.alpha = shadowAlpha * remaining;\n item.frame.visible = true;\n item.frame.alpha = 0.8 * remaining;\n item.shadow.visible = remaining > 0;\n }\n\n private seedFor(value: string): number {\n let hash = 2166136261;\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0) / 0xffffffff;\n }\n\n private resolveUnitCardMaxVisibleRows(): number {\n const value = this.ports.layout.unitCard.maxVisibleRows;\n return Number.isFinite(value)\n ? Math.max(1, Math.min(this.ports.unitCardLayout.maxVisibleRows, Math.floor(value)))\n : this.ports.unitCardLayout.maxVisibleRows;\n }\n\n private resolveUnitCardRowGap(): number {\n const value = this.ports.layout.unitCard.rowGap;\n return Number.isFinite(value) ? Math.max(0, value) : this.ports.unitCardLayout.rowGap;\n }\n\n private resolveDeadCardBrightness(): number {\n const value = this.tuning?.get('visual.battle.roster.disabled.brightness');\n return typeof value === 'number' && Number.isFinite(value) ? Math.max(0, value) : 0.5;\n }\n\n private resolveTeamCheckIconHeight(): number {\n return this.resolveTuningNumber(\n 'layout.battle.teamCheckStatus.iconHeight',\n this.ports.style.teamCheckStatus.iconHeight,\n 1,\n Math.max(1, this.ports.layout.headerTeamChecks.height),\n );\n }\n\n private resolveTeamCheckIconGap(): number {\n return this.resolveTuningNumber(\n 'layout.battle.teamCheckStatus.gap',\n this.ports.style.teamCheckStatus.gap,\n 0,\n Math.max(0, this.ports.layout.headerTeamChecks.width),\n );\n }\n\n private resolveTeamCheckGlowColor(): string {\n const value = this.tuning?.get('visual.battle.teamCheckStatus.glowColor');\n return typeof value === 'string' ? value : this.ports.style.teamCheckStatus.glowColor;\n }\n\n private resolveTeamCheckGlowIntensity(): number {\n return this.resolveTuningNumber(\n 'visual.battle.teamCheckStatus.glowIntensity',\n this.ports.style.teamCheckStatus.glowIntensity,\n 0,\n 1,\n );\n }\n\n private resolveTeamCheckFogSpeed(): number {\n return this.resolveTuningNumber('motion.battle.teamCheckStatus.fogSpeed', 1, 0, 3);\n }\n\n private playTeamCheckEntrance(item: TeamCheckNode): void {\n item.lifecycleController?.abort();\n if (!this.animation) {\n this.settleTeamCheckLifecycle(item);\n return;\n }\n const controller = new AbortController();\n item.lifecycleController = controller;\n item.lifecycle = 'entering';\n item.fogRoot.alpha = 0;\n item.iconRoot.alpha = 0;\n item.entryGlowMultiplier = 1;\n item.fogRoot.scale.set(1);\n item.iconRoot.scale.set(1);\n item.iconRoot.rotation = 0;\n\n const complete = () => {\n if (controller.signal.aborted || item.lifecycleController !== controller) return;\n this.settleTeamCheckLifecycle(item);\n this.requestRender();\n };\n\n if (this.reducedMotion) {\n void Promise.all([\n this.animation.tween(\n item.fogRoot,\n { alpha: 1, duration: 0.2, reducedMotionDuration: 0.2, ease: 'power1.out' },\n controller.signal,\n ),\n this.animation.tween(\n item.iconRoot,\n { alpha: 1, duration: 0.2, reducedMotionDuration: 0.2, ease: 'power1.out' },\n controller.signal,\n ),\n ]).then(complete);\n return;\n }\n\n const gatherLead =\n Math.max(\n 0,\n this.resolveFiniteTuningNumber('motion.battle.teamCheckStatus.gatherLeadMs', 80),\n ) / 1000;\n const enterDuration =\n Math.max(\n 0,\n this.resolveFiniteTuningNumber('motion.battle.teamCheckStatus.enterDurationMs', 520),\n ) / 1000;\n const settleDuration =\n Math.max(\n 0,\n this.resolveFiniteTuningNumber('motion.battle.teamCheckStatus.settleDurationMs', 180),\n ) / 1000;\n const startScale = Math.max(\n 0,\n this.resolveFiniteTuningNumber('motion.battle.teamCheckStatus.startScale', 0.72),\n );\n const overshootScale = Math.max(\n 0,\n this.resolveFiniteTuningNumber('motion.battle.teamCheckStatus.overshootScale', 1.06),\n );\n const startRotation =\n (this.resolveFiniteTuningNumber('motion.battle.teamCheckStatus.startRotationDegrees', -4) *\n Math.PI) /\n 180;\n const entryGlowMultiplier = Math.max(\n 0,\n this.resolveFiniteTuningNumber('visual.battle.teamCheckStatus.entryGlowMultiplier', 1.25),\n );\n item.fogRoot.scale.set(1.12);\n item.iconRoot.scale.set(startScale);\n item.iconRoot.rotation = startRotation;\n\n const fogGather = Promise.all([\n this.animation.tween(\n item.fogRoot,\n { alpha: 1, duration: gatherLead + enterDuration, ease: 'power2.out' },\n controller.signal,\n ),\n this.animation.tween(\n item.fogRoot.scale,\n { x: 1, y: 1, duration: gatherLead + enterDuration, ease: 'power2.out' },\n controller.signal,\n ),\n ]);\n const iconReveal = this.animation\n .tween({}, { duration: gatherLead }, controller.signal)\n .then(() =>\n Promise.all([\n this.animation!.tween(\n item.iconRoot,\n { alpha: 1, rotation: 0, duration: enterDuration, ease: 'power3.out' },\n controller.signal,\n ),\n this.animation!.tween(\n item.iconRoot.scale,\n {\n x: overshootScale,\n y: overshootScale,\n duration: enterDuration,\n ease: 'power3.out',\n },\n controller.signal,\n ),\n this.animation!.tween(\n item,\n {\n entryGlowMultiplier,\n duration: enterDuration,\n ease: 'power2.out',\n },\n controller.signal,\n ),\n ]),\n )\n .then(() =>\n Promise.all([\n this.animation!.tween(\n item.iconRoot.scale,\n { x: 1, y: 1, duration: settleDuration, ease: 'power2.inOut' },\n controller.signal,\n ),\n this.animation!.tween(\n item,\n { entryGlowMultiplier: 1, duration: settleDuration, ease: 'power1.out' },\n controller.signal,\n ),\n ]),\n );\n void Promise.all([fogGather, iconReveal]).then(complete);\n }\n\n private settleTeamCheckLifecycle(item: TeamCheckNode): void {\n item.lifecycleController?.abort();\n item.lifecycleController = null;\n item.lifecycle = 'stable';\n item.fogRoot.alpha = 1;\n item.fogRoot.scale.set(1);\n item.iconRoot.alpha = 1;\n item.iconRoot.scale.set(1);\n item.iconRoot.rotation = 0;\n item.entryGlowMultiplier = 1;\n }\n\n private startTeamCheckExit(item: TeamCheckNode): void {\n if (item.lifecycle === 'exiting') return;\n item.lifecycleController?.abort();\n item.lifecycle = 'exiting';\n this.restartTeamCheckExit(item);\n }\n\n private restartTeamCheckExit(item: TeamCheckNode): void {\n item.lifecycleController?.abort();\n if (item.lifecycle !== 'exiting') return;\n if (!this.animation) {\n this.destroyTeamCheckNode(item);\n return;\n }\n const controller = new AbortController();\n item.lifecycleController = controller;\n const duration =\n Math.max(\n 0,\n this.resolveFiniteTuningNumber('motion.battle.teamCheckStatus.exitDurationMs', 500),\n ) / 1000;\n void Promise.all([\n this.animation.tween(\n item.fogRoot,\n { alpha: 0, duration, reducedMotionDuration: duration, ease: 'none' },\n controller.signal,\n ),\n this.animation.tween(\n item.iconRoot,\n { alpha: 0, duration, reducedMotionDuration: duration, ease: 'none' },\n controller.signal,\n ),\n ]).then(() => {\n if (\n controller.signal.aborted ||\n item.lifecycleController !== controller ||\n item.lifecycle !== 'exiting' ||\n this.teamCheckNodes.get(item.id) !== item\n )\n return;\n this.destroyTeamCheckNode(item);\n this.syncTeamCheckFogAnimation();\n this.requestRender();\n });\n }\n\n private resolveTuningNumber(\n path: SessionTuningPath,\n fallback: number,\n min: number,\n max: number,\n ): number {\n const value = this.tuning?.get(path);\n const resolved = typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n return Math.max(min, Math.min(max, resolved));\n }\n\n private resolveFiniteTuningNumber(path: SessionTuningPath, fallback: number): number {\n const value = this.tuning?.get(path);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n }\n\n private resolveTuningColor(path: SessionTuningPath, fallback: string): string {\n const value = this.tuning?.get(path);\n return typeof value === 'string' && value.trim() ? value : fallback;\n }\n\n private destroyTeamCheckNode(item: TeamCheckNode): void {\n item.lifecycleController?.abort();\n this.teamCheckFogRoot.removeChild(item.fogRoot);\n this.teamCheckIconRoot.removeChild(item.iconRoot);\n item.fogRoot.destroy({ children: true });\n item.iconRoot.destroy({ children: true });\n if (this.teamCheckNodes.get(item.id) === item) this.teamCheckNodes.delete(item.id);\n }\n\n private clearTeamCheckNodes(): void {\n for (const item of this.teamCheckNodes.values()) this.destroyTeamCheckNode(item);\n this.teamCheckNodes.clear();\n }\n\n private syncTeamCheckFogAnimation(): void {\n const shouldAnimate =\n this.visible &&\n !this.reducedMotion &&\n [...this.teamCheckNodes.values()].some((item) => item.lifecycle !== 'exiting') &&\n this.resolveTeamCheckFogSpeed() > 0;\n if (shouldAnimate === Boolean(this.stopTeamCheckFog)) return;\n if (!shouldAnimate) {\n this.stopTeamCheckFogAnimation();\n this.applyTeamCheckFogFrame(true);\n return;\n }\n\n const release = this.activity.acquire('battle-team-check-fog');\n this.ticker.add(this.updateTeamCheckFog);\n this.stopTeamCheckFog = () => {\n this.ticker.remove(this.updateTeamCheckFog);\n release();\n };\n }\n\n private stopTeamCheckFogAnimation(): void {\n this.stopTeamCheckFog?.();\n this.stopTeamCheckFog = null;\n }\n\n private readonly updateTeamCheckFog = (ticker: Ticker): void => {\n const speed = this.resolveTeamCheckFogSpeed();\n this.teamCheckFogElapsedMs =\n (this.teamCheckFogElapsedMs + ticker.deltaMS * speed) %\n this.ports.style.teamCheckStatus.cycleDurationMs;\n this.applyTeamCheckFogFrame(false);\n };\n\n private applyTeamCheckFogFrame(staticFrame: boolean): void {\n const style = this.ports.style.teamCheckStatus;\n const basePhase = (this.teamCheckFogElapsedMs / style.cycleDurationMs) * Math.PI * 2;\n for (const item of this.teamCheckNodes.values()) {\n if (item.lifecycle === 'exiting') continue;\n const phase = basePhase + item.phaseOffset;\n const breathe = staticFrame ? 1 : 1 + Math.sin(phase) * 0.035;\n item.glow.width = item.baseGlowWidth * breathe;\n item.glow.height = item.baseGlowHeight * breathe;\n item.glow.alpha =\n item.glowIntensity *\n (staticFrame ? 0.9 : 0.78 + 0.22 * Math.sin(phase)) *\n this.uiHighlightMultiplier *\n item.entryGlowMultiplier;\n item.plumes.forEach((plume, plumeIndex) => {\n const base = item.plumeBases[plumeIndex];\n if (!base) return;\n if (staticFrame) {\n plume.position.set(base.x, base.y);\n plume.scale.set(1);\n plume.alpha = base.alpha;\n return;\n }\n const plumePhase = phase + plumeIndex * 1.37;\n plume.position.set(\n base.x + Math.sin(plumePhase) * style.driftAmplitude,\n base.y + Math.cos(plumePhase * 0.83) * style.driftAmplitude * 0.7,\n );\n const plumeWave = (Math.sin(plumePhase * 1.13) + 1) / 2;\n plume.scale.set(0.92 + plumeWave * 0.16);\n plume.alpha = base.alpha * (0.68 + plumeWave * 0.32);\n });\n }\n }\n\n private clearNodes<T extends { readonly root: Container }>(nodes: Map<string, T>): void {\n for (const item of nodes.values()) {\n (item as Partial<RosterNode>).insanityFilter?.destroy();\n (item as Partial<RosterNode>).resourceMeter?.destroy();\n (item as Partial<ObjectiveNode>).meter?.destroy();\n (item as Partial<ObjectiveNode>).glowController?.abort();\n (item as Partial<ObjectiveNode>).lifecycleController?.abort();\n const objective = item as Partial<ObjectiveNode>;\n objective.glow?.destroy();\n if (objective.motionRoot) objective.motionRoot.mask = null;\n item.root.destroy({ children: true });\n }\n nodes.clear();\n }\n\n private restoreBattleEntryPose(resumeCurrentActor: boolean): void {\n if (!this.battleEntryActive) return;\n this.battleEntryActive = false;\n for (const item of this.rosterNodes.values()) {\n item.root.alpha = 1;\n item.root.position.set(item.baseX, item.baseY);\n item.shadow.alpha = this.resolveCurrentActorNumber(\n 'visual.battle.currentActor.shadowAlpha',\n 1,\n );\n }\n if (!resumeCurrentActor || !this.lastInput || !this.visible) return;\n const current = this.lastInput.roster.find(\n (item) => item.id === this.lastInput?.currentActorTokenId,\n );\n this.syncRosterPulse(current?.id ?? null, Boolean(current && !current.gray), true);\n this.requestRender();\n }\n\n private syncRosterPulse(tokenId: string | null, active: boolean, force = false): void {\n if (\n !force &&\n tokenId === this.activeRosterId &&\n active === this.activeRosterCanPulse &&\n (this.stopRosterPulse !== null || !active || this.reducedMotion)\n )\n return;\n const previousId = this.activeRosterId;\n this.stopRosterPulse?.();\n this.stopRosterPulse = null;\n if (force) this.returningRosterId = null;\n else if (previousId && previousId !== tokenId) this.returningRosterId = previousId;\n this.activeRosterId = tokenId;\n this.activeRosterCanPulse = active;\n this.rosterPulsePhase = 0;\n this.rosterEntryElapsedMs = 0;\n this.rosterReturnElapsedMs = 0;\n\n if (!tokenId || !active) {\n this.returningRosterId = null;\n for (const item of this.rosterNodes.values()) {\n item.root.position.set(item.baseX, item.baseY);\n item.frame.alpha = 0;\n item.frame.visible = false;\n item.shadow.visible = false;\n }\n this.currentActorCardGlow.hide();\n return;\n }\n\n const current = this.rosterNodes.get(tokenId);\n if (!current) return;\n current.root.zIndex = 3;\n current.shadow.zIndex = 2;\n this.currentActorCardGlow.setFrame(0);\n if (this.reducedMotion) {\n this.applyCurrentRosterFrame(current, 1, true);\n this.returningRosterId = null;\n return;\n }\n\n const release = this.activity.acquire('battle-current-roster-emphasis');\n const update = (ticker: Ticker) => {\n const currentItem = this.rosterNodes.get(tokenId);\n if (!currentItem) return;\n const entryDurationMs = this.resolveCurrentActorNumber(\n 'motion.battle.currentActor.cardActivateDurationMs',\n 360,\n );\n const returnDurationMs = this.resolveCurrentActorNumber(\n 'motion.battle.currentActor.cardReturnDurationMs',\n 180,\n );\n this.rosterEntryElapsedMs = Math.min(\n Math.max(1, entryDurationMs),\n this.rosterEntryElapsedMs + ticker.deltaMS,\n );\n this.rosterPulsePhase =\n (this.rosterPulsePhase +\n ticker.deltaMS /\n Math.max(\n 1,\n this.resolveCurrentActorNumber(\n 'motion.battle.currentActor.cardInnerGlowDurationMs',\n 3200,\n ),\n )) %\n 1;\n this.applyCurrentRosterFrame(\n currentItem,\n this.rosterEntryElapsedMs / Math.max(1, entryDurationMs),\n false,\n );\n if (this.returningRosterId) {\n const returning = this.rosterNodes.get(this.returningRosterId);\n if (returning) {\n this.rosterReturnElapsedMs = Math.min(\n Math.max(1, returnDurationMs),\n this.rosterReturnElapsedMs + ticker.deltaMS,\n );\n const progress = this.rosterReturnElapsedMs / Math.max(1, returnDurationMs);\n this.applyReturningRosterFrame(returning, progress);\n if (progress >= 1) {\n returning.root.position.set(returning.baseX, returning.baseY);\n returning.frame.visible = false;\n returning.shadow.visible = false;\n this.returningRosterId = null;\n }\n } else this.returningRosterId = null;\n }\n this.requestRender();\n };\n this.ticker.add(update);\n this.stopRosterPulse = () => {\n this.ticker.remove(update);\n release();\n };\n }\n}\n", "import type {\n BlurFilter,\n Container,\n Filter,\n Graphics,\n Particle,\n ParticleContainer,\n Rectangle,\n Sprite,\n Text,\n Texture,\n} from 'pixi.js';\nimport type { PixiAnimationActivity } from './PixiAnimationActivity.js';\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\nimport type { PixiSummaryBoardSurface, SummaryBoardData } from './PixiSummaryBoardSurface.js';\nimport type { PixiPreludeSurface } from './PixiPreludeSurface.js';\nimport type { PixiStorySurface, StoryMediaContent } from './PixiStorySurface.js';\nimport type { PixiEndingSurface } from './PixiEndingSurface.js';\nimport type { PixiPartyHudSurface } from './PixiPartyHudSurface.js';\nimport type { PixiBattleHudSurface } from './PixiBattleHudSurface.js';\nimport type { PixiStoryWorkspaceSurface } from './PixiStoryWorkspaceSurface.js';\nimport type { PixiSceneGraph } from './PixiSceneGraph.js';\nimport type { BattleViewportGridLayout, PixiLayoutRect } from './PixiSessionLayout.js';\nimport {\n DEFAULT_PRELUDE_STORY_TRANSITION_TIMING,\n resolvePreludeStoryModuleTarget,\n resolvePreludeStoryPartyHudDelay,\n type PreludeStoryTransitionTiming,\n} from './PixiPreludeStoryTransition.js';\nimport {\n PixiBattleEntryTransition,\n applyBattleRosterEntryProgress,\n} from './PixiBattleEntryTransition.js';\nimport type { SessionTuningResolver, SessionTuningPath } from '@bardway/trpg-media/tuning';\nimport { DEFAULT_ENDING_TIMELINE } from './PixiEndingSurface.js';\n\ninterface Constructors {\n BlurFilter: typeof BlurFilter;\n Filter?: typeof Filter;\n Container: typeof Container;\n Graphics: typeof Graphics;\n Particle: typeof Particle;\n ParticleContainer: typeof ParticleContainer;\n Rectangle: typeof Rectangle;\n Sprite?: new (texture?: Texture | import('pixi.js').SpriteOptions) => Sprite;\n Text: typeof Text;\n Texture: typeof Texture;\n}\n\nexport interface ScenePresentationFrame {\n owner: string;\n revision: number;\n scene: 'prelude' | 'story' | 'battle' | 'ending';\n hydrate: boolean;\n map?: { layout: BattleViewportGridLayout; imageUrl: string; videoUrl?: string };\n storyContent: StoryMediaContent | null;\n endingImageUrl: string | null;\n endPresentation: 'direct' | 'summary';\n}\nexport interface ScenePresentationSurfaces {\n prelude: Pick<PixiPreludeSurface, 'node' | 'createStoryTransitionArtwork'>;\n story: Pick<\n PixiStorySurface,\n | 'node'\n | 'mainImageAnchor'\n | 'mainBackdrop'\n | 'leftPanelNode'\n | 'rightPanelNode'\n | 'waitForPresentationContentReady'\n | 'getMainBackdropTargetAlpha'\n | 'resetTransitionPose'\n >;\n ending: Pick<PixiEndingSurface, 'waitForPhotoReady' | 'playTimeline'>;\n partyHud: Pick<PixiPartyHudSurface, 'getPreludeStoryEntries'>;\n battleHud?: Pick<\n PixiBattleHudSurface,\n 'prepareBattleEntry' | 'finishBattleEntry' | 'cancelBattleEntry'\n >;\n caseWorkspace: Pick<PixiStoryWorkspaceSurface, 'node'>;\n preparePreludeToStory(frame: ScenePresentationFrame): void;\n preparePreludeToStoryHandoff(): void;\n restorePreludeToStoryTransition(story: boolean): void;\n sync(frame: ScenePresentationFrame): void;\n reset(): void;\n getTransitionNumber(key: string, fallback: number): number;\n getTransitionString(key: string, fallback: string): string;\n}\nexport interface ScenePresentationDirectorOptions {\n summary: PixiSummaryBoardSurface;\n summaryData(frame: ScenePresentationFrame): SummaryBoardData;\n stage: { width: number; height: number };\n mediaRect: PixiLayoutRect;\n colors: { transition: string; mask: string; gridLine: string };\n tuning?: SessionTuningResolver;\n resolveExitTarget(frame: ScenePresentationFrame): ScenePresentationFrame;\n waitForMapReady(\n frame: ScenePresentationFrame,\n signal: AbortSignal,\n timeoutMs: number,\n ): Promise<'ready' | 'fallback'>;\n onTransitionStarted?(frame: ScenePresentationFrame, signal: AbortSignal): void;\n onCommitted?(frame: ScenePresentationFrame): void;\n}\ninterface ActiveBattleTransition {\n readonly kind: 'entry' | 'exit';\n latestSnapshot: ScenePresentationFrame;\n snapshotUpdated?: () => void;\n}\n\ninterface ActiveBattleExitVisuals {\n readonly dimVeil: Graphics;\n blackVeil: Graphics | null;\n}\n\n/** Owns scene commits and every cross-scene transition. Surfaces never call each other. */\nexport class PixiScenePresentationDirector {\n private committed: ScenePresentationFrame | null = null;\n private transitionAbort: AbortController | null = null;\n private activeBattleTransition: ActiveBattleTransition | null = null;\n private reducedMotion = false;\n private preludeStoryTransitionActive = false;\n private readonly summary: PixiSummaryBoardSurface;\n private activeBattleEntryVisuals: PixiBattleEntryTransition | null = null;\n private activeBattleExitVisuals: ActiveBattleExitVisuals | null = null;\n private tuning: SessionTuningResolver | undefined;\n private readonly waitForBattleMapReady: ScenePresentationDirectorOptions['waitForMapReady'];\n constructor(\n private readonly scene: PixiSceneGraph,\n private readonly surfaces: ScenePresentationSurfaces,\n private readonly animation: PixiAnimationDirector,\n private readonly activity: PixiAnimationActivity,\n private readonly constructors: Constructors,\n private readonly requestRender: () => void,\n private readonly commit: (snapshot: ScenePresentationFrame) => void,\n private readonly options: ScenePresentationDirectorOptions,\n ) {\n this.tuning = options.tuning;\n this.waitForBattleMapReady = options.waitForMapReady;\n this.summary = options.summary;\n }\n\n async sync(next: ScenePresentationFrame): Promise<void> {\n const previous = this.committed;\n const activeBattleTransition = this.activeBattleTransition;\n if (\n activeBattleTransition?.kind === 'entry' &&\n next.scene === 'battle' &&\n !next.hydrate &&\n next.owner === activeBattleTransition.latestSnapshot.owner\n ) {\n activeBattleTransition.latestSnapshot = next;\n activeBattleTransition.snapshotUpdated?.();\n return;\n }\n if (activeBattleTransition?.kind === 'exit' && next.scene !== 'battle' && !next.hydrate) {\n activeBattleTransition.latestSnapshot = next;\n return;\n }\n this.cancelTransition();\n if (next.hydrate) {\n this.commitSnapshot(next);\n return;\n }\n if (!previous || previous.scene === next.scene) {\n this.commitSnapshot(next);\n return;\n }\n if (previous.scene === 'prelude' && next.scene === 'story') {\n await this.playPreludeToStory(next);\n } else if (previous.scene === 'story' && next.scene === 'battle') {\n await this.playBattleEntry(next, 'story');\n } else if (previous.scene === 'battle' && next.scene !== 'battle') {\n await this.playBattleExit(next);\n } else if (next.scene === 'ending') {\n await this.playEnding(next);\n } else {\n this.commitSnapshot(next);\n }\n }\n\n setReducedMotion(reducedMotion: boolean): void {\n this.reducedMotion = reducedMotion;\n }\n\n updateTuning(tuning: SessionTuningResolver): void {\n this.tuning = tuning;\n this.summary.updateTuning(tuning);\n }\n\n reset(): void {\n this.cancelTransition();\n this.committed = null;\n this.summary.setVisible(false);\n this.restoreSceneTransitionPose();\n this.surfaces.reset();\n }\n\n destroy(): void {\n this.reset();\n this.summary.destroy();\n }\n\n private commitSnapshot(snapshot: ScenePresentationFrame): void {\n this.committed = snapshot;\n this.commit(snapshot);\n this.surfaces.sync(snapshot);\n this.options.onCommitted?.(snapshot);\n this.requestRender();\n }\n\n private commitBattleSnapshotIfNew(snapshot: ScenePresentationFrame): void {\n if (this.committed === snapshot) return;\n this.commitSnapshot(snapshot);\n }\n\n private waitForBattleEntryMapSnapshot(\n transition: ActiveBattleTransition,\n signal: AbortSignal,\n timeoutMs: number,\n ): Promise<void> {\n if (transition.latestSnapshot.map || signal.aborted || timeoutMs <= 0) {\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n let settled = false;\n let timeout: ReturnType<typeof setTimeout> | null = null;\n const finish = () => {\n if (settled) return;\n settled = true;\n signal.removeEventListener('abort', finish);\n if (timeout) clearTimeout(timeout);\n if (transition.snapshotUpdated === inspect) transition.snapshotUpdated = undefined;\n resolve();\n };\n const inspect = () => {\n if (transition.latestSnapshot.map) finish();\n };\n transition.snapshotUpdated = inspect;\n signal.addEventListener('abort', finish, { once: true });\n timeout = setTimeout(finish, Math.max(0, timeoutMs));\n inspect();\n });\n }\n\n private async playPreludeToStory(next: ScenePresentationFrame): Promise<void> {\n const signal = this.beginTransition();\n const release = this.activity.acquire('transition:prelude-story');\n if (this.reducedMotion) {\n this.commitSnapshot(next);\n release();\n return;\n }\n const timing = this.resolvePreludeStoryTiming();\n const veil = new this.constructors.Graphics()\n .rect(0, 0, this.options.stage.width, this.options.stage.height)\n .fill({ color: this.options.colors.transition, alpha: 1 });\n veil.alpha = 0;\n const artwork = this.surfaces.prelude.createStoryTransitionArtwork();\n const moduleProxy = artwork.module.root;\n const moduleTarget = resolvePreludeStoryModuleTarget(\n artwork.module,\n artwork.module.textureSize,\n this.options.mediaRect,\n );\n this.preludeStoryTransitionActive = true;\n this.surfaces.preparePreludeToStory(next);\n const storyImageReadyTask = this.surfaces.story.waitForPresentationContentReady(\n next.storyContent,\n signal,\n );\n this.scene.presentationLayer.addChild(veil, artwork.root);\n try {\n const backgroundTask = Promise.all([\n this.animation.tween(\n veil,\n {\n alpha: 1,\n duration: timing.backgroundDarkenDuration,\n ease: 'power2.inOut',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.animation.tween(\n this.scene.systemHudLayer,\n {\n alpha: 0,\n duration: timing.backgroundDarkenDuration,\n ease: 'power2.inOut',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n ]).then(() => {\n if (!signal.aborted) this.surfaces.prelude.node.visible = false;\n });\n const moduleTask = Promise.all([\n this.animation.tween(\n moduleProxy.position,\n {\n x: moduleTarget.x,\n y: moduleTarget.y,\n duration: timing.moduleTravelDuration,\n delay: timing.moduleTravelDelay,\n ease: timing.moduleTravelEase,\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.animation.tween(\n moduleProxy.scale,\n {\n x: moduleTarget.scaleX,\n y: moduleTarget.scaleY,\n duration: timing.moduleTravelDuration,\n delay: timing.moduleTravelDelay,\n ease: timing.moduleTravelEase,\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.animation.tween(\n moduleProxy,\n {\n rotation: 0,\n duration: timing.moduleTravelDuration,\n delay: timing.moduleTravelDelay,\n ease: timing.moduleTravelEase,\n onUpdate: this.requestRender,\n },\n signal,\n ),\n ...(artwork.module.image && artwork.module.targetImagePosition\n ? [\n this.animation.tween(\n artwork.module.image.position,\n {\n ...artwork.module.targetImagePosition,\n duration: timing.moduleTravelDuration,\n delay: timing.moduleTravelDelay,\n ease: timing.moduleTravelEase,\n onUpdate: this.requestRender,\n },\n signal,\n ),\n ]\n : []),\n ...(artwork.module.image && artwork.module.targetImageScale\n ? [\n this.animation.tween(\n artwork.module.image.scale,\n {\n ...artwork.module.targetImageScale,\n duration: timing.moduleTravelDuration,\n delay: timing.moduleTravelDelay,\n ease: timing.moduleTravelEase,\n onUpdate: this.requestRender,\n },\n signal,\n ),\n ]\n : []),\n ]);\n await moduleTask;\n if (signal.aborted) return;\n artwork.portraits.forEach((portrait) => portrait.root.destroy({ children: true }));\n this.requestRender();\n this.commitSnapshot(next);\n this.surfaces.preparePreludeToStoryHandoff();\n const imageHandoffTask = (async () => {\n const ready = await storyImageReadyTask;\n if (!ready || signal.aborted) return;\n const releaseHandoff = this.activity.acquire('transition:prelude-story-image-handoff');\n const storyBaseRevealDuration = Math.min(\n timing.storyBaseRevealDuration,\n timing.finalHandoffDuration,\n );\n try {\n await Promise.all([\n this.animation.tween(\n veil,\n {\n alpha: 0,\n duration: storyBaseRevealDuration,\n ease: 'power1.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.animation.tween(\n this.surfaces.story.node,\n {\n alpha: 1,\n duration: storyBaseRevealDuration,\n ease: 'power1.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.animation.tween(\n this.surfaces.caseWorkspace.node,\n {\n alpha: 1,\n duration: storyBaseRevealDuration,\n ease: 'power1.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.animation.tween(\n moduleProxy,\n {\n alpha: 0,\n duration: timing.finalHandoffDuration,\n ease: 'power1.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.animation.tween(\n this.surfaces.story.mainImageAnchor,\n {\n alpha: 1,\n duration: timing.finalHandoffDuration,\n ease: 'power1.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.animation.tween(\n this.surfaces.story.mainBackdrop,\n {\n alpha: this.surfaces.story.getMainBackdropTargetAlpha(),\n duration: timing.finalHandoffDuration,\n ease: 'power1.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.animation.tween(\n this.surfaces.story.leftPanelNode,\n {\n alpha: 1,\n duration: timing.finalHandoffDuration,\n ease: 'power1.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.animation.tween(\n this.surfaces.story.rightPanelNode,\n {\n alpha: 1,\n duration: timing.finalHandoffDuration,\n ease: 'power1.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n ]);\n } finally {\n releaseHandoff();\n }\n })();\n const partyHudDuration = Math.min(timing.partyHudEnterDuration, timing.finalHandoffDuration);\n const partyHudMaxDelay = Math.min(\n timing.partyHudMaxStagger,\n Math.max(0, timing.finalHandoffDuration - partyHudDuration),\n );\n const partyHudTasks = this.surfaces.partyHud.getPreludeStoryEntries().flatMap((entry) => {\n const delay = resolvePreludeStoryPartyHudDelay(entry.id, partyHudMaxDelay);\n return [\n this.animation.tween(\n entry.root.position,\n {\n x: entry.targetX,\n y: entry.targetY,\n delay,\n duration: partyHudDuration,\n ease: timing.hudEnterEase,\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.animation.tween(\n entry.root,\n {\n alpha: 1,\n delay,\n duration: partyHudDuration,\n ease: 'power1.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n ];\n });\n await Promise.all([\n backgroundTask,\n ...partyHudTasks,\n this.animation.tween(\n this.scene.systemHudLayer,\n {\n alpha: 1,\n duration: timing.finalHandoffDuration,\n ease: 'power1.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n ]);\n release();\n await imageHandoffTask;\n } finally {\n if (!signal.aborted && this.preludeStoryTransitionActive) {\n this.preludeStoryTransitionActive = false;\n this.surfaces.restorePreludeToStoryTransition(this.committed?.scene === 'story');\n this.scene.systemHudLayer.alpha = 1;\n }\n artwork.releaseMediaBreath?.();\n if (!artwork.root.destroyed) artwork.root.destroy({ children: true });\n if (!veil.destroyed) veil.destroy();\n release();\n }\n }\n\n private async playBattleEntry(next: ScenePresentationFrame, source: 'story'): Promise<void> {\n const signal = this.beginTransition();\n const transition: ActiveBattleTransition = {\n kind: 'entry',\n latestSnapshot: next,\n };\n this.activeBattleTransition = transition;\n const release = this.activity.acquire(`transition:${source}-battle`);\n let visuals = this.createBattleEntryVisuals(null, transition.latestSnapshot);\n const whiteInDuration = this.transitionNumber(\n 'motion.transition.toBattle.whiteInDuration',\n 0.1,\n );\n const whiteOutDuration = this.transitionNumber(\n 'motion.transition.toBattle.whiteOutDuration',\n 0.32,\n );\n const whiteHoldDuration = this.transitionNumber(\n 'motion.transition.toBattle.whiteHoldDuration',\n 0.5,\n );\n const verticalGridDuration = this.transitionNumber(\n 'motion.transition.toBattle.verticalGridDuration',\n 0.25,\n );\n const horizontalGridDuration = this.transitionNumber(\n 'motion.transition.toBattle.horizontalGridDuration',\n 0.25,\n );\n const frameRevealDuration = this.transitionNumber(\n 'motion.transition.toBattle.frameRevealDuration',\n 0.12,\n );\n const cellFadeDuration = this.transitionNumber(\n 'motion.transition.toBattle.cellFadeDuration',\n 0.2,\n );\n const cellRevealDuration = this.transitionNumber(\n 'motion.transition.toBattle.cellRevealDuration',\n 1,\n );\n const gridFadeStartProgress = this.transitionNumber(\n 'motion.transition.toBattle.gridFadeStartProgress',\n 0.5,\n );\n const cellGlowPeakProgress = this.transitionNumber(\n 'motion.transition.toBattle.cellGlowPeakProgress',\n 0.3,\n );\n const rosterOffsetX = this.transitionNumber('motion.transition.toBattle.rosterOffsetX', 5);\n const rosterEnterDuration = this.transitionNumber(\n 'motion.transition.toBattle.rosterEnterDuration',\n 0.28,\n );\n const rosterMaxStagger = this.transitionNumber(\n 'motion.transition.toBattle.rosterMaxStagger',\n 0.36,\n );\n const mapReadyTimeoutMs = this.transitionNumber(\n 'motion.transition.toBattle.mapReadyTimeoutMs',\n 8000,\n );\n let transitionStarted = false;\n const startTransition = () => {\n if (transitionStarted || signal.aborted) return;\n transitionStarted = true;\n this.options.onTransitionStarted?.(transition.latestSnapshot, signal);\n };\n try {\n await Promise.all([\n this.animation.tween(\n visuals.whiteVeil,\n {\n alpha: 1,\n duration: whiteInDuration,\n reducedMotionDuration: 0.12,\n ease: 'power2.out',\n onStart: startTransition,\n onUpdate: () => {\n startTransition();\n this.requestRender();\n },\n },\n signal,\n ),\n this.animation.tween(\n this.scene.systemHudLayer,\n {\n alpha: 0,\n duration: whiteInDuration,\n reducedMotionDuration: 0.12,\n ease: 'power2.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n ]);\n if (!signal.aborted && transition.latestSnapshot.map) {\n this.commitBattleSnapshotIfNew(transition.latestSnapshot);\n }\n await this.animation.tween(\n visuals.whiteVeil,\n { alpha: 1, duration: 0, delay: Math.max(0, whiteHoldDuration) },\n signal,\n );\n if (signal.aborted) return;\n\n const mapReadyDeadline = Date.now() + Math.max(0, mapReadyTimeoutMs);\n await this.waitForBattleEntryMapSnapshot(\n transition,\n signal,\n Math.max(0, mapReadyDeadline - Date.now()),\n );\n if (signal.aborted) return;\n this.commitBattleSnapshotIfNew(transition.latestSnapshot);\n if (transition.latestSnapshot.map) {\n await this.waitForBattleMapReady(\n transition.latestSnapshot,\n signal,\n Math.max(0, mapReadyDeadline - Date.now()),\n ).catch(() => 'fallback' as const);\n }\n if (signal.aborted) return;\n this.commitBattleSnapshotIfNew(transition.latestSnapshot);\n\n const mapSnapshot = transition.latestSnapshot.map;\n const layout = mapSnapshot?.layout ?? null;\n const replacement = this.createBattleEntryVisuals(layout, transition.latestSnapshot, 1);\n visuals.destroy();\n visuals = replacement;\n const seed = `${transition.latestSnapshot.owner ?? 'battle'}:${transition.latestSnapshot.revision}`;\n const rosterEntries = this.surfaces.battleHud?.prepareBattleEntry(seed, rosterOffsetX) ?? [];\n\n await this.animation.tween(\n visuals.whiteVeil,\n {\n alpha: this.transitionNumber('visual.transition.toBattle.cellFillAlpha', 0.5),\n duration: whiteOutDuration,\n reducedMotionDuration: 0.12,\n ease: 'power2.out',\n onUpdate: this.requestRender,\n },\n signal,\n );\n if (signal.aborted) return;\n\n if (this.reducedMotion) {\n visuals.verticalLines.scale.y = 1;\n visuals.horizontalLines.scale.x = 1;\n } else {\n await this.animation.tween(\n visuals.verticalLines.scale,\n {\n y: 1,\n duration: verticalGridDuration,\n ease: 'power2.out',\n onUpdate: this.requestRender,\n },\n signal,\n );\n await this.animation.tween(\n visuals.horizontalLines.scale,\n {\n x: 1,\n duration: horizontalGridDuration,\n ease: 'power2.out',\n onUpdate: this.requestRender,\n },\n signal,\n );\n }\n if (signal.aborted) return;\n\n const handoffDriver = { progress: 0 };\n const updateHandoff = () => {\n visuals.setHandoffProgress(handoffDriver.progress);\n this.scene.systemHudLayer.alpha = handoffDriver.progress;\n this.requestRender();\n };\n updateHandoff();\n await this.animation.tween(\n handoffDriver,\n {\n progress: 1,\n duration: frameRevealDuration,\n reducedMotionDuration: 0.12,\n ease: 'power2.out',\n onUpdate: updateHandoff,\n },\n signal,\n );\n handoffDriver.progress = 1;\n updateHandoff();\n if (signal.aborted) return;\n\n const cellDriver = { progress: 0 };\n const resolvedCellDuration = this.reducedMotion ? 0.12 : Math.max(0, cellRevealDuration);\n const resolvedCellFade = this.reducedMotion ? 0.12 : Math.max(0, cellFadeDuration);\n const glowIntensityScale = this.reducedMotion ? 0.55 : 1;\n visuals.setRevealProgress(\n 0,\n resolvedCellDuration,\n resolvedCellFade,\n gridFadeStartProgress,\n cellGlowPeakProgress,\n glowIntensityScale,\n );\n await this.animation.tween(\n cellDriver,\n {\n progress: 1,\n duration: resolvedCellDuration,\n reducedMotionDuration: 0.12,\n ease: 'none',\n onUpdate: () => {\n visuals.setRevealProgress(\n cellDriver.progress,\n resolvedCellDuration,\n resolvedCellFade,\n gridFadeStartProgress,\n cellGlowPeakProgress,\n glowIntensityScale,\n );\n this.requestRender();\n },\n },\n signal,\n );\n visuals.setRevealProgress(\n 1,\n resolvedCellDuration,\n resolvedCellFade,\n gridFadeStartProgress,\n cellGlowPeakProgress,\n glowIntensityScale,\n );\n visuals.hideGridLines();\n if (this.activeBattleEntryVisuals === visuals) this.activeBattleEntryVisuals = null;\n visuals.destroy();\n if (signal.aborted) return;\n\n if (rosterEntries.length > 0) {\n const rosterDriver = { progress: 0 };\n const entryDuration = this.reducedMotion ? 0.12 : Math.max(0.0001, rosterEnterDuration);\n const staggerWindow = this.reducedMotion ? 0 : Math.max(0, rosterMaxStagger);\n const totalRosterDuration = entryDuration + staggerWindow;\n const updateRoster = () => {\n applyBattleRosterEntryProgress(\n rosterEntries,\n rosterDriver.progress,\n rosterOffsetX,\n entryDuration,\n staggerWindow,\n );\n this.requestRender();\n };\n updateRoster();\n await this.animation.tween(\n rosterDriver,\n {\n progress: 1,\n duration: totalRosterDuration,\n reducedMotionDuration: 0.12,\n ease: 'none',\n onUpdate: updateRoster,\n },\n signal,\n );\n rosterDriver.progress = 1;\n updateRoster();\n }\n if (!signal.aborted) {\n this.surfaces.battleHud?.finishBattleEntry();\n this.commitBattleSnapshotIfNew(transition.latestSnapshot);\n }\n } finally {\n const ownsTransition = this.activeBattleTransition === transition;\n if (ownsTransition) this.activeBattleTransition = null;\n if (this.activeBattleEntryVisuals === visuals) this.activeBattleEntryVisuals = null;\n visuals.destroy();\n if (ownsTransition) {\n this.surfaces.battleHud?.cancelBattleEntry();\n this.scene.systemHudLayer.alpha = 1;\n }\n release();\n }\n }\n\n private async playBattleExit(next: ScenePresentationFrame): Promise<void> {\n const target = this.resolveBattleExitTarget(next);\n const direct = next.endPresentation === 'direct';\n if (direct) {\n if (target.scene === 'ending') await this.playEnding(target);\n else {\n const signal = this.beginTransition();\n this.options.onTransitionStarted?.(target, signal);\n this.commitSnapshot(target);\n }\n return;\n }\n const signal = this.beginTransition();\n const transition: ActiveBattleTransition = {\n kind: 'exit',\n latestSnapshot: next,\n };\n this.activeBattleTransition = transition;\n const release = this.activity.acquire('transition:battle-summary');\n this.summary.sync(this.options.summaryData(next));\n this.summary.node.alpha = 0;\n const boardInitialScale = this.transitionNumber(\n 'motion.transition.battleSummary.boardInitialScale',\n 0.9,\n );\n this.summary.node.pivot.set(this.options.stage.width / 2, this.options.stage.height / 2);\n this.summary.node.position.set(this.options.stage.width / 2, this.options.stage.height / 2);\n this.summary.node.scale.set(boardInitialScale);\n this.summary.setVisible(true);\n const dimVeil = this.createModalVeil(0);\n this.scene.modalLayer.addChild(this.summary.node);\n const exitVisuals: ActiveBattleExitVisuals = { dimVeil, blackVeil: null };\n this.activeBattleExitVisuals = exitVisuals;\n const dimAlpha = this.transitionNumber('visual.battleSummary.dimAlpha', 0.82);\n const dimDuration = this.transitionNumber('motion.transition.battleSummary.dimDuration', 0.8);\n const boardEnterDuration = this.transitionNumber(\n 'motion.transition.battleSummary.boardEnterDuration',\n 1.6,\n );\n const boardHoldDuration = this.transitionNumber(\n 'motion.transition.battleSummary.boardHoldDuration',\n 5,\n );\n const blackDuration = this.transitionNumber(\n 'motion.transition.battleSummary.blackDuration',\n 0.5,\n );\n const returnRevealDuration = this.transitionNumber(\n 'motion.transition.battleSummary.returnRevealDuration',\n 0.5,\n );\n let transitionStarted = false;\n const startTransition = () => {\n if (transitionStarted || signal.aborted) return;\n transitionStarted = true;\n this.options.onTransitionStarted?.(transition.latestSnapshot, signal);\n };\n try {\n await Promise.all([\n this.animation.tween(\n dimVeil,\n {\n alpha: dimAlpha,\n duration: dimDuration,\n reducedMotionDuration: 0.12,\n ease: 'power2.out',\n onStart: startTransition,\n onUpdate: () => {\n startTransition();\n this.requestRender();\n },\n },\n signal,\n ),\n this.animation.tween(\n this.summary.node,\n {\n alpha: 1,\n duration: boardEnterDuration,\n reducedMotionDuration: 0.12,\n ease: 'power2.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.animation.tween(\n this.summary.node.scale,\n {\n x: 1,\n y: 1,\n duration: boardEnterDuration,\n reducedMotionDuration: 0.12,\n ease: 'power2.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.animation.tween(\n this.scene.systemHudLayer,\n {\n alpha: Math.max(0, 1 - dimAlpha),\n duration: dimDuration,\n reducedMotionDuration: 0.12,\n ease: 'power2.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n ]);\n await this.animation.tween(\n this.summary.node,\n { alpha: 1, duration: 0, delay: boardHoldDuration },\n signal,\n );\n if (signal.aborted) return;\n const targetBeforeBlack = this.resolveBattleExitTarget(transition.latestSnapshot);\n const resolvedBlackDuration =\n targetBeforeBlack.scene === 'ending'\n ? this.transitionNumber(\n 'motion.ending.veilInDuration',\n DEFAULT_ENDING_TIMELINE.veilInDuration,\n )\n : blackDuration;\n const blackVeil = this.createModalVeil(0);\n exitVisuals.blackVeil = blackVeil;\n await Promise.all([\n this.animation.tween(\n blackVeil,\n {\n alpha: 1,\n duration: resolvedBlackDuration,\n reducedMotionDuration: 0.12,\n ease: 'power2.in',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.animation.tween(\n this.scene.systemHudLayer,\n {\n alpha: 0,\n duration: resolvedBlackDuration,\n reducedMotionDuration: 0.12,\n ease: 'power2.in',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n ]);\n const finalTarget = this.resolveBattleExitTarget(transition.latestSnapshot);\n if (signal.aborted) return;\n this.summary.setVisible(false);\n this.summary.node.alpha = 1;\n this.summary.node.scale.set(1);\n dimVeil.destroy();\n if (finalTarget.scene === 'ending') {\n await this.revealEndingFromBlack(finalTarget, blackVeil, this.scene.modalLayer, signal);\n } else {\n this.commitSnapshot(finalTarget);\n await Promise.all([\n this.animation.tween(\n blackVeil,\n {\n alpha: 0,\n duration: returnRevealDuration,\n reducedMotionDuration: 0.12,\n ease: 'power2.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.animation.tween(\n this.scene.systemHudLayer,\n {\n alpha: 1,\n duration: returnRevealDuration,\n reducedMotionDuration: 0.12,\n ease: 'power2.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n ]);\n }\n } finally {\n const ownsTransition = this.activeBattleTransition === transition;\n if (ownsTransition) this.activeBattleTransition = null;\n if (this.activeBattleExitVisuals === exitVisuals) this.activeBattleExitVisuals = null;\n if (!dimVeil.destroyed) dimVeil.destroy();\n if (exitVisuals.blackVeil && !exitVisuals.blackVeil.destroyed)\n exitVisuals.blackVeil.destroy();\n if (ownsTransition) {\n this.summary.setVisible(false);\n this.summary.node.alpha = 1;\n this.summary.node.scale.set(1);\n this.scene.systemHudLayer.alpha = 1;\n }\n release();\n }\n }\n\n private async playEnding(next: ScenePresentationFrame): Promise<void> {\n const signal = this.beginTransition();\n const release = this.activity.acquire('transition:ending');\n const veil = this.createVeil(0);\n const veilInDuration = this.transitionNumber(\n 'motion.ending.veilInDuration',\n DEFAULT_ENDING_TIMELINE.veilInDuration,\n );\n try {\n await Promise.all([\n this.animation.tween(\n veil,\n {\n alpha: 1,\n duration: veilInDuration,\n reducedMotionDuration: DEFAULT_ENDING_TIMELINE.photoAppearDuration,\n ease: 'power2.in',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.animation.tween(\n this.scene.systemHudLayer,\n {\n alpha: 0,\n duration: veilInDuration,\n reducedMotionDuration: DEFAULT_ENDING_TIMELINE.photoAppearDuration,\n ease: 'power2.in',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n ]);\n if (signal.aborted) return;\n await this.revealEndingFromBlack(next, veil, this.scene.screenFxLayer, signal);\n } finally {\n if (!veil.destroyed) veil.destroy();\n this.scene.systemHudLayer.alpha = 1;\n release();\n }\n }\n\n private async revealEndingFromBlack(\n next: ScenePresentationFrame,\n veil: Graphics,\n overlayLayer: Container,\n signal: AbortSignal,\n ): Promise<void> {\n this.commitSnapshot(next);\n const imageUrl = next.endingImageUrl;\n const photoReady = await this.surfaces.ending.waitForPhotoReady(imageUrl, signal);\n if (signal.aborted) return;\n\n const reducedTimeline = this.reducedMotion || !photoReady;\n const revealDelay = reducedTimeline\n ? 0\n : this.transitionNumber(\n 'motion.ending.fullscreenHoldDuration',\n DEFAULT_ENDING_TIMELINE.fullscreenHoldDuration,\n );\n const revealDuration = reducedTimeline\n ? this.transitionNumber(\n 'motion.ending.photoAppearDuration',\n DEFAULT_ENDING_TIMELINE.photoAppearDuration,\n )\n : this.transitionNumber(\n 'motion.ending.veilOutDuration',\n DEFAULT_ENDING_TIMELINE.veilOutDuration,\n );\n await Promise.all([\n this.animation.tween(\n veil,\n {\n alpha: 0,\n duration: revealDuration,\n delay: revealDelay,\n reducedMotionDuration: DEFAULT_ENDING_TIMELINE.photoAppearDuration,\n ease: 'power2.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.animation.tween(\n this.scene.systemHudLayer,\n {\n alpha: 1,\n duration: revealDuration,\n delay: revealDelay,\n reducedMotionDuration: DEFAULT_ENDING_TIMELINE.photoAppearDuration,\n ease: 'power2.out',\n onUpdate: this.requestRender,\n },\n signal,\n ),\n this.surfaces.ending.playTimeline(this.animation, signal, reducedTimeline, overlayLayer),\n ]);\n }\n\n private createBattleEntryVisuals(\n layout: BattleViewportGridLayout | null,\n snapshot: ScenePresentationFrame,\n whiteAlpha = 0,\n ): PixiBattleEntryTransition {\n const seed = `${snapshot.owner ?? 'battle'}:${snapshot.revision}`;\n const visuals = new PixiBattleEntryTransition(\n this.constructors,\n layout,\n seed,\n {\n lineColor: this.options.colors.gridLine,\n lineWidth: this.transitionNumber('visual.transition.toBattle.gridLineWidth', 2),\n lineAlpha: this.transitionNumber('visual.transition.toBattle.gridLineAlpha', 0.72),\n cellFillAlpha: this.transitionNumber('visual.transition.toBattle.cellFillAlpha', 0.5),\n cellEdgeAlpha: this.transitionNumber('visual.transition.toBattle.cellEdgeAlpha', 0.9),\n cellEdgeWidth: this.transitionNumber('visual.transition.toBattle.cellEdgeWidth', 2),\n cellEdgeGlowAlpha: this.transitionNumber(\n 'visual.transition.toBattle.cellEdgeGlowAlpha',\n 0.8,\n ),\n cellEdgeGlowWidth: this.transitionNumber('visual.transition.toBattle.cellEdgeGlowWidth', 3),\n cellEdgeGlowBlurStrength: this.transitionNumber(\n 'visual.transition.toBattle.cellEdgeGlowBlurStrength',\n 8,\n ),\n },\n { mask: this.options.colors.mask },\n this.options.stage,\n );\n visuals.whiteVeil.alpha = whiteAlpha;\n this.scene.modalLayer.addChild(visuals.node);\n this.activeBattleEntryVisuals = visuals;\n return visuals;\n }\n\n private createModalVeil(alpha: number): Graphics {\n const veil = new this.constructors.Graphics()\n .rect(0, 0, this.options.stage.width, this.options.stage.height)\n .fill({ color: this.options.colors.transition, alpha: 1 });\n veil.alpha = alpha;\n veil.eventMode = 'none';\n this.scene.modalLayer.addChild(veil);\n return veil;\n }\n\n private createVeil(alpha: number): Graphics {\n const veil = new this.constructors.Graphics()\n .rect(0, 0, this.options.stage.width, this.options.stage.height)\n .fill({ color: this.options.colors.transition, alpha: 1 });\n veil.alpha = alpha;\n this.scene.screenFxLayer.addChild(veil);\n return veil;\n }\n\n private beginTransition(): AbortSignal {\n this.cancelTransition();\n const controller = new AbortController();\n this.transitionAbort = controller;\n return controller.signal;\n }\n\n private cancelTransition(): void {\n this.transitionAbort?.abort();\n this.transitionAbort = null;\n this.activeBattleEntryVisuals?.destroy();\n this.activeBattleEntryVisuals = null;\n this.surfaces.battleHud?.cancelBattleEntry();\n if (this.activeBattleExitVisuals) {\n const { dimVeil, blackVeil } = this.activeBattleExitVisuals;\n if (!dimVeil.destroyed) dimVeil.destroy();\n if (blackVeil && !blackVeil.destroyed) blackVeil.destroy();\n this.activeBattleExitVisuals = null;\n }\n this.activeBattleTransition = null;\n this.summary.setVisible(false);\n if (this.preludeStoryTransitionActive) {\n this.preludeStoryTransitionActive = false;\n this.surfaces.restorePreludeToStoryTransition(this.committed?.scene === 'story');\n }\n this.scene.systemHudLayer.alpha = 1;\n this.scene.presentationLayer\n .removeChildren()\n .forEach((node) => node.destroy({ children: true }));\n this.scene.screenFxLayer.removeChildren().forEach((node) => node.destroy({ children: true }));\n }\n\n private restoreSceneTransitionPose(): void {\n this.surfaces.story.node.alpha = 1;\n this.surfaces.story.resetTransitionPose();\n this.scene.cameraContainer.alpha = 1;\n this.scene.cameraContainer.scale.set(1);\n this.scene.cameraContainer.pivot.set(0, 0);\n this.scene.cameraContainer.position.set(0, 0);\n }\n\n private transitionNumber(path: SessionTuningPath, fallback: number): number {\n const value = this.tuning?.get(path);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n }\n\n private resolveBattleExitTarget(next: ScenePresentationFrame): ScenePresentationFrame {\n return this.options.resolveExitTarget(next);\n }\n\n private resolvePreludeStoryTiming(): PreludeStoryTransitionTiming {\n const defaults = DEFAULT_PRELUDE_STORY_TRANSITION_TIMING;\n return {\n backgroundDarkenDuration: this.surfaces.getTransitionNumber(\n 'backgroundDarkenDuration',\n defaults.backgroundDarkenDuration,\n ),\n moduleTravelDelay: this.surfaces.getTransitionNumber(\n 'moduleTravelDelay',\n defaults.moduleTravelDelay,\n ),\n moduleTravelDuration: this.surfaces.getTransitionNumber(\n 'moduleTravelDuration',\n defaults.moduleTravelDuration,\n ),\n storyBaseRevealDuration: this.surfaces.getTransitionNumber(\n 'storyBaseRevealDuration',\n defaults.storyBaseRevealDuration,\n ),\n finalHandoffDuration: this.surfaces.getTransitionNumber(\n 'finalHandoffDuration',\n defaults.finalHandoffDuration,\n ),\n partyHudEnterDuration: this.surfaces.getTransitionNumber(\n 'partyHudEnterDuration',\n defaults.partyHudEnterDuration,\n ),\n partyHudMaxStagger: this.surfaces.getTransitionNumber(\n 'partyHudMaxStagger',\n defaults.partyHudMaxStagger,\n ),\n moduleTravelEase: this.surfaces.getTransitionString(\n 'moduleTravelEase',\n defaults.moduleTravelEase,\n ),\n hudEnterEase: this.surfaces.getTransitionString('hudEnterEase', defaults.hudEnterEase),\n };\n }\n}\n", "import type { Container, Graphics, Sprite, Texture, Ticker } from 'pixi.js';\nexport type HudConnectionState = 'live' | 'offline' | 'connecting' | 'degraded';\ntype SessionDisplayScene = string;\n\nimport type { DisplayAudioState } from '@bardway/trpg-media';\nimport type { PixiAnimationActivity } from './PixiAnimationActivity.js';\nimport type { PixiSceneGraph } from './PixiSceneGraph.js';\nexport interface SystemHudPorts {\n layout: { iconSize: number; gap: number; padding: number };\n rectForScene(scene: string): { x: number; y: number; width: number; height: number };\n colors: {\n panel: string;\n border: string;\n text: string;\n live: string;\n offline: string;\n connecting: string;\n };\n}\nexport interface SystemHudTextures {\n networkBars?: Texture | null;\n speaker?: Texture | null;\n speakerOff?: Texture | null;\n}\n\ninterface PixiSystemHudConstructors {\n Container: typeof Container;\n Graphics: typeof Graphics;\n Sprite: new (texture?: Texture | import('pixi.js').SpriteOptions) => Sprite;\n}\n\nexport interface PixiSystemHudState {\n scene: SessionDisplayScene;\n connectionState: HudConnectionState;\n audioState: DisplayAudioState;\n onEnableAudio: () => void;\n}\n\nexport class PixiSystemHudSurface {\n private readonly node: Container;\n private readonly groupFrame: Graphics;\n private readonly connectionSlot: Container;\n private readonly audioSlot: Container;\n private readonly connectionIcon: Sprite | Graphics;\n private readonly speakerIcon: Sprite | Graphics;\n private readonly speakerOffIcon: Sprite | null;\n private onEnableAudio: (() => void) | null = null;\n private stopPulse: (() => void) | null = null;\n private pulseDirection = 1;\n\n constructor(\n scene: PixiSceneGraph,\n constructors: PixiSystemHudConstructors,\n private readonly ticker: Ticker,\n private readonly activity: PixiAnimationActivity,\n private readonly requestRender: () => void,\n private readonly ports: SystemHudPorts,\n textures: SystemHudTextures,\n ) {\n const { iconSize, gap, padding } = this.ports.layout;\n const groupWidth = iconSize * 2 + gap + padding * 2;\n const groupHeight = iconSize + padding * 2;\n this.node = new constructors.Container();\n this.node.position.set(1820, 1016);\n this.groupFrame = new constructors.Graphics()\n .roundRect(0, 0, groupWidth, groupHeight, 5)\n .fill({ color: this.ports.colors.panel, alpha: 0.74 })\n .stroke({ color: this.ports.colors.border, width: 1, alpha: 0.4 });\n this.connectionSlot = new constructors.Container();\n this.audioSlot = new constructors.Container();\n this.connectionSlot.position.set(padding, padding);\n this.audioSlot.position.set(padding + iconSize + gap, padding);\n this.connectionIcon = textures.networkBars\n ? this.createSprite(constructors, textures.networkBars)\n : this.createConnectionFallback(constructors);\n this.speakerIcon = textures.speaker\n ? this.createSprite(constructors, textures.speaker)\n : this.createSpeakerFallback(constructors, true);\n this.speakerOffIcon = textures.speakerOff\n ? this.createSprite(constructors, textures.speakerOff)\n : null;\n this.connectionSlot.addChild(this.connectionIcon);\n this.audioSlot.addChild(this.speakerIcon);\n if (this.speakerOffIcon) this.audioSlot.addChild(this.speakerOffIcon);\n this.audioSlot.eventMode = 'static';\n this.audioSlot.cursor = 'pointer';\n this.audioSlot.on('pointertap', () => this.onEnableAudio?.());\n this.node.addChild(this.groupFrame, this.connectionSlot, this.audioSlot);\n scene.systemHudLayer.addChild(this.node);\n }\n\n sync(state: PixiSystemHudState): void {\n this.syncLayout(state.scene);\n this.onEnableAudio = state.onEnableAudio;\n this.drawConnection(state.connectionState);\n this.drawAudio(state.audioState);\n this.syncPulse(state.connectionState === 'connecting' || state.connectionState === 'degraded');\n this.requestRender();\n }\n\n activateAudio(): void {\n this.onEnableAudio?.();\n }\n\n updateTuning(): void {\n this.syncLayout('story');\n this.requestRender();\n }\n\n reset(): void {\n this.syncPulse(false);\n this.connectionIcon.alpha = 1;\n }\n\n destroy(): void {\n this.reset();\n this.node.destroy({ children: true });\n this.onEnableAudio = null;\n }\n\n private createSprite(constructors: PixiSystemHudConstructors, texture: Texture): Sprite {\n const sprite = new constructors.Sprite(texture);\n const inset = 4;\n const available = this.ports.layout.iconSize - inset * 2;\n const ratio = Math.min(available / texture.width, available / texture.height);\n sprite.width = texture.width * ratio;\n sprite.height = texture.height * ratio;\n sprite.position.set(\n (this.ports.layout.iconSize - sprite.width) / 2,\n (this.ports.layout.iconSize - sprite.height) / 2,\n );\n return sprite;\n }\n\n private syncLayout(scene: SessionDisplayScene): void {\n const { iconSize, gap, padding } = this.ports.layout;\n const baseWidth = iconSize * 2 + gap + padding * 2;\n const baseHeight = iconSize + padding * 2;\n const layout = this.ports.rectForScene(scene);\n this.node.position.set(layout.x, layout.y);\n this.node.scale.set(\n Math.max(0.1, layout.width / baseWidth),\n Math.max(0.1, layout.height / baseHeight),\n );\n }\n\n private createConnectionFallback(constructors: PixiSystemHudConstructors): Graphics {\n return new constructors.Graphics()\n .rect(5, 19, 4, 6)\n .rect(11, 15, 4, 10)\n .rect(17, 10, 4, 15)\n .rect(23, 5, 4, 20)\n .fill(this.ports.colors.text);\n }\n\n private createSpeakerFallback(\n constructors: PixiSystemHudConstructors,\n enabled: boolean,\n ): Graphics {\n const icon = new constructors.Graphics()\n .poly([5, 12, 11, 12, 19, 6, 19, 24, 11, 18, 5, 18], true)\n .fill(enabled ? this.ports.colors.live : this.ports.colors.offline);\n if (enabled) {\n icon.arc(18, 15, 7, -0.8, 0.8).stroke({ color: this.ports.colors.live, width: 2 });\n } else {\n icon.moveTo(21, 9).lineTo(27, 21).stroke({ color: this.ports.colors.offline, width: 2 });\n }\n return icon;\n }\n\n private drawConnection(state: HudConnectionState): void {\n this.connectionIcon.tint =\n state === 'live'\n ? this.ports.colors.live\n : state === 'offline'\n ? this.ports.colors.offline\n : this.ports.colors.connecting;\n }\n\n private drawAudio(state: DisplayAudioState): void {\n const enabled = state === 'ready';\n if (this.speakerOffIcon) {\n this.speakerIcon.visible = enabled;\n this.speakerOffIcon.visible = !enabled;\n return;\n }\n this.speakerIcon.tint = enabled ? this.ports.colors.live : this.ports.colors.offline;\n }\n\n private syncPulse(active: boolean): void {\n if (!active) {\n this.stopPulse?.();\n this.stopPulse = null;\n this.connectionIcon.alpha = 1;\n return;\n }\n if (this.stopPulse) return;\n const release = this.activity.acquire('system-connection-pulse');\n const update = (ticker: Ticker) => {\n this.connectionIcon.alpha += this.pulseDirection * ticker.deltaMS * 0.00025;\n if (this.connectionIcon.alpha >= 1 || this.connectionIcon.alpha <= 0.68) {\n this.pulseDirection *= -1;\n }\n };\n this.ticker.add(update);\n this.stopPulse = () => {\n this.ticker.remove(update);\n release();\n };\n }\n}\n", "import type { PixiSceneGraph } from './PixiSceneGraph.js';\nimport type { PixiTokenWorld } from './PixiTokenWorld.js';\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\nimport type { BattleViewportGridLayout } from './PixiSessionLayout.js';\nimport type { SessionTuningResolver, SessionTuningPath } from '@bardway/trpg-media/tuning';\nexport interface CameraFocusInput {\n participantIds: readonly string[];\n layout: BattleViewportGridLayout;\n landingPoints?: readonly { x: number; y: number }[];\n animateCamera: boolean;\n signal: AbortSignal;\n run(signal: AbortSignal): Promise<void>;\n waitForBarriers?(): Promise<void>;\n}\nexport const resolveConfinedCameraAxis = (\n focus: number,\n scale: number,\n viewportStart: number,\n viewportSize: number,\n mapStart: number,\n mapSize: number,\n): number => {\n const viewportEnd = viewportStart + viewportSize;\n const mapEnd = mapStart + mapSize;\n const minimumPosition = viewportEnd - (mapEnd - focus) * scale;\n const maximumPosition = viewportStart - (mapStart - focus) * scale;\n const desiredPosition = viewportStart + viewportSize / 2;\n if (minimumPosition <= maximumPosition) {\n return Math.max(minimumPosition, Math.min(maximumPosition, desiredPosition));\n }\n return desiredPosition + (focus - (mapStart + mapSize / 2)) * scale;\n};\n\nexport const resolveCameraFocusPosition = (\n layout: BattleViewportGridLayout,\n focusPivot: { x: number; y: number },\n focusScale: { x: number; y: number },\n): { x: number; y: number } => {\n return {\n x: resolveConfinedCameraAxis(\n focusPivot.x,\n focusScale.x,\n layout.x,\n layout.width,\n layout.offsetX,\n layout.renderW,\n ),\n y: resolveConfinedCameraAxis(\n focusPivot.y,\n focusScale.y,\n layout.y,\n layout.height,\n layout.offsetY,\n layout.renderH,\n ),\n };\n};\n\nexport class PixiCameraFocusController {\n private active: { controller: AbortController; restore(): void } | null = null;\n constructor(\n private readonly scene: PixiSceneGraph,\n private readonly world: PixiTokenWorld,\n private readonly director: PixiAnimationDirector,\n private readonly getTuning: () => SessionTuningResolver | undefined,\n ) {}\n reset(): void {\n const active = this.active;\n if (!active) return;\n this.active = null;\n active.controller.abort();\n active.restore();\n void this.world.clearFocusTokens();\n }\n destroy(): void {\n this.reset();\n }\n async play(input: CameraFocusInput): Promise<void> {\n this.reset();\n if (input.signal.aborted) return;\n const controller = new AbortController();\n const abort = () => controller.abort();\n input.signal.addEventListener('abort', abort, { once: true });\n const signal = controller.signal;\n const { participantIds, layout, animateCamera } = input;\n const camera = this.scene.cameraContainer;\n const origin = {\n x: camera.position.x,\n y: camera.position.y,\n pivotX: camera.pivot.x,\n pivotY: camera.pivot.y,\n scaleX: camera.scale.x,\n scaleY: camera.scale.y,\n };\n this.active = {\n controller,\n restore: () => {\n camera.scale.set(origin.scaleX, origin.scaleY);\n camera.pivot.set(origin.pivotX, origin.pivotY);\n camera.position.set(origin.x, origin.y);\n input.signal.removeEventListener('abort', abort);\n },\n };\n const focusScale = this.resolveTuningNumber('visual.battle.actionFx.cameraFocusScale', 1.12);\n const focusedCameraScale = {\n x: origin.scaleX * focusScale,\n y: origin.scaleY * focusScale,\n };\n const chargeLandingPoints = input.landingPoints ?? [];\n const participantPoints = participantIds.flatMap((id) => {\n const point = this.world.getPresentationNode(id)?.position;\n return point && Number.isFinite(point.x) && Number.isFinite(point.y)\n ? [{ x: point.x, y: point.y }]\n : [];\n });\n const xs = participantPoints.map((point) => point.x),\n ys = participantPoints.map((point) => point.y);\n let focusPivot = participantPoints.length\n ? { x: (Math.min(...xs) + Math.max(...xs)) / 2, y: (Math.min(...ys) + Math.max(...ys)) / 2 }\n : { x: layout.x + layout.width / 2, y: layout.y + layout.height / 2 };\n if (chargeLandingPoints.length > 0) {\n const participantPoints = participantIds.flatMap((id) => {\n const point = this.world.getPresentationNode(id)?.position;\n return point ? [{ x: point.x, y: point.y }] : [];\n });\n const points = [...participantPoints, ...chargeLandingPoints];\n const paddingRatio = this.resolveTuningNumber(\n 'visual.battle.actionFx.cameraFocusPaddingCellRatio',\n 0.75,\n );\n const minX = Math.min(...points.map((point) => point.x)) - layout.cellW * paddingRatio;\n const maxX = Math.max(...points.map((point) => point.x)) + layout.cellW * paddingRatio;\n const minY = Math.min(...points.map((point) => point.y)) - layout.cellH * paddingRatio;\n const maxY = Math.max(...points.map((point) => point.y)) + layout.cellH * paddingRatio;\n focusPivot = { x: (minX + maxX) / 2, y: (minY + maxY) / 2 };\n const fitScale = Math.min(layout.width / (maxX - minX), layout.height / (maxY - minY));\n focusedCameraScale.x = Math.max(origin.scaleX, Math.min(focusedCameraScale.x, fitScale));\n focusedCameraScale.y = Math.max(origin.scaleY, Math.min(focusedCameraScale.y, fitScale));\n }\n const compensatedOriginPosition = {\n x: origin.x + (focusPivot.x - origin.pivotX) * origin.scaleX,\n y: origin.y + (focusPivot.y - origin.pivotY) * origin.scaleY,\n };\n const focusPosition = resolveCameraFocusPosition(layout, focusPivot, focusedCameraScale);\n if (animateCamera) {\n camera.pivot.set(focusPivot.x, focusPivot.y);\n camera.position.set(compensatedOriginPosition.x, compensatedOriginPosition.y);\n }\n const focusDuration =\n this.resolveTuningNumber('motion.battle.actionFx.cameraFocusDurationMs', 300) / 1000;\n let focusRestored = false;\n try {\n await Promise.all([\n animateCamera\n ? this.director.tween(\n camera.scale,\n {\n x: focusedCameraScale.x,\n y: focusedCameraScale.y,\n duration: focusDuration,\n },\n signal,\n )\n : Promise.resolve(),\n animateCamera\n ? this.director.tween(\n camera.position,\n { x: focusPosition.x, y: focusPosition.y, duration: focusDuration },\n signal,\n )\n : Promise.resolve(),\n this.world.setFocusTokens(participantIds, {\n director: this.director,\n signal,\n duration: focusDuration,\n }),\n ]);\n if (!signal.aborted) await input.run(signal);\n if (!signal.aborted) {\n await input.waitForBarriers?.();\n if (signal.aborted) return;\n await Promise.all([\n animateCamera\n ? this.director.tween(\n camera.scale,\n { x: origin.scaleX, y: origin.scaleY, duration: focusDuration },\n signal,\n )\n : Promise.resolve(),\n animateCamera\n ? this.director.tween(\n camera.position,\n {\n x: compensatedOriginPosition.x,\n y: compensatedOriginPosition.y,\n duration: focusDuration,\n },\n signal,\n )\n : Promise.resolve(),\n this.world.clearFocusTokens({\n director: this.director,\n signal,\n duration: focusDuration,\n }),\n ]);\n if (signal.aborted) return;\n focusRestored = true;\n }\n } finally {\n if (this.active?.controller === controller) {\n this.active = null;\n input.signal.removeEventListener('abort', abort);\n if (!focusRestored) void this.world.clearFocusTokens();\n if (animateCamera) {\n camera.scale.set(origin.scaleX, origin.scaleY);\n camera.pivot.set(origin.pivotX, origin.pivotY);\n camera.position.set(origin.x, origin.y);\n }\n }\n }\n }\n private resolveTuningNumber(path: SessionTuningPath, fallback: number): number {\n const value = this.getTuning()?.get(path);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n }\n}\n", "import type { Container, Sprite, Graphics, Text, BlurFilter, Texture } from 'pixi.js';\nimport type { PixiSceneGraph } from './PixiSceneGraph.js';\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\nimport { PixiTeamCheckCinematic } from './PixiTeamCheckCinematic.js';\nimport type { SessionTuningResolver, SessionTuningPath } from '@bardway/trpg-media/tuning';\nexport interface ProgressCinematicInstruction {\n id: string;\n label: string;\n kind: 'start' | 'progress' | 'success' | 'failure';\n totalCount: number;\n fromCount: number;\n toCount: number;\n}\ninterface TeamCheckLampNode {\n root: Container;\n glow: Graphics;\n onBulb: Graphics;\n}\nexport interface ProgressCinematicContext {\n scene: PixiSceneGraph;\n director: PixiAnimationDirector;\n constructors: Pick<\n typeof import('pixi.js'),\n 'Container' | 'Sprite' | 'Graphics' | 'Text' | 'BlurFilter' | 'Rectangle'\n >;\n getTuning(): SessionTuningResolver | undefined;\n stage: { width: number; height: number };\n maxCount: number;\n defaultLabel: string;\n fontFamily: string;\n titleColor: string;\n panelColor: string;\n borderColor: string;\n panel: { x: number; y: number; width: number; height: number };\n frameTexture: Texture | null;\n createBackdrop(): Container;\n releaseBackdrop(node: Container): void;\n playCue(kind: 'start' | 'increment' | 'decrement' | 'success' | 'failure'): void;\n resolveColor(path: SessionTuningPath, fallback: string | number): string | number;\n}\nconst removeAndDestroy = (node: Container): void => {\n node.parent?.removeChild(node);\n if (!node.destroyed) node.destroy({ children: true });\n};\nexport class PixiProgressCinematic {\n private lifetime = new AbortController();\n private teamCheckRoot: Container | null = null;\n private teamCheckStrands: Container | null = null;\n private teamCheckGlowLayer: Container | null = null;\n private teamCheckGlowFilter: BlurFilter | null = null;\n private teamCheckOwnerKey: string | null = null;\n private teamCheckTitle: Text | null = null;\n private teamCheckLights: TeamCheckLampNode[] = [];\n private uiHighlightMultiplier = 1;\n constructor(private readonly context: ProgressCinematicContext) {\n if (!Number.isSafeInteger(context.maxCount) || context.maxCount < 1)\n throw new Error('Invalid progress maximum');\n }\n setHighlightMultiplier(value: number): void {\n this.uiHighlightMultiplier = value;\n this.syncTeamCheckLights(this.teamCheckLights.filter((lamp) => lamp.onBulb.alpha > 0).length);\n }\n reset(): void {\n this.lifetime.abort();\n this.lifetime = new AbortController();\n this.releaseTeamCheck();\n }\n destroy(): void {\n this.reset();\n this.lifetime.abort();\n }\n async play(event: ProgressCinematicInstruction, signal: AbortSignal): Promise<void> {\n signal = AbortSignal.any([signal, this.lifetime.signal]);\n if (signal.aborted) return;\n if (\n !event.id.trim() ||\n ![event.totalCount, event.fromCount, event.toCount].every(Number.isFinite) ||\n !Number.isInteger(event.totalCount) ||\n event.totalCount < 1 ||\n event.totalCount > this.context.maxCount\n )\n throw new Error('Invalid progress cinematic input');\n const initialLitLights = event.kind === 'progress' ? event.fromCount : event.toCount;\n const root = this.ensureTeamCheck(event.id, event.totalCount, event.label, initialLitLights);\n const enterDuration = this.resolveTuningNumber(\n 'motion.battle.teamCheckCinematic.enterDuration',\n PixiTeamCheckCinematic.enterMs / 1000,\n );\n if (event.kind === 'start') {\n root.visible = true;\n root.alpha = 0;\n root.position.y =\n this.context.stage.height / 2 +\n this.resolveTuningNumber('motion.battle.teamCheckCinematic.enterOffsetY', 18);\n root.scale.set(this.resolveTuningNumber('motion.battle.teamCheckCinematic.enterScale', 0.92));\n await Promise.all([\n this.context.director.tween(\n root,\n { alpha: 1, y: this.context.stage.height / 2, duration: enterDuration },\n signal,\n ),\n this.context.director.tween(root.scale, { x: 1, y: 1, duration: enterDuration }, signal),\n ]);\n if (!signal.aborted) this.context.playCue('start');\n return;\n }\n if (event.kind === 'progress') {\n const next = Math.max(0, Math.min(event.toCount, event.totalCount));\n const previous = Math.max(0, Math.min(event.fromCount, event.totalCount));\n this.syncTeamCheckLights(next);\n if (next === previous) return;\n this.context.playCue(next > previous ? 'increment' : 'decrement');\n const changed = this.teamCheckLights.slice(\n Math.min(previous, next),\n Math.max(previous, next),\n );\n await Promise.all(\n changed.map((lamp, index) => {\n lamp.root.scale.set(\n this.resolveTuningNumber('motion.battle.teamCheckCinematic.lampStartScale', 0.82),\n );\n return this.context.director.tween(\n lamp.root.scale,\n {\n x: 1,\n y: 1,\n duration: this.resolveTuningNumber(\n 'motion.battle.teamCheckCinematic.lampDuration',\n PixiTeamCheckCinematic.lampMs / 1000,\n ),\n delay:\n index *\n this.resolveTuningNumber('motion.battle.teamCheckCinematic.lampStagger', 0.04),\n ease: 'back.out(1.8)',\n },\n signal,\n );\n }),\n );\n return;\n }\n if (event.kind === 'success') {\n this.context.playCue('success');\n await this.context.director.tween(\n root.scale,\n {\n x: this.resolveTuningNumber('motion.battle.teamCheckCinematic.successScale', 1.08),\n y: this.resolveTuningNumber('motion.battle.teamCheckCinematic.successScale', 1.08),\n duration: this.resolveTuningNumber(\n 'motion.battle.teamCheckCinematic.successInDuration',\n PixiTeamCheckCinematic.successInMs / 1000,\n ),\n },\n signal,\n );\n await this.context.director.tween(\n root,\n {\n alpha: 0,\n duration: this.resolveTuningNumber(\n 'motion.battle.teamCheckCinematic.successOutDuration',\n PixiTeamCheckCinematic.successOutMs / 1000,\n ),\n },\n signal,\n );\n if (!signal.aborted && this.teamCheckRoot === root) this.releaseTeamCheck();\n return;\n }\n this.context.playCue('failure');\n await this.context.director.tween(\n root,\n {\n keyframes: [...this.resolveTeamCheckFailureKeyframes()],\n },\n signal,\n );\n await this.context.director.tween(\n root,\n {\n alpha: 0,\n duration: this.resolveTuningNumber(\n 'motion.battle.teamCheckCinematic.failureOutDuration',\n PixiTeamCheckCinematic.failureOutMs / 1000,\n ),\n },\n signal,\n );\n if (!signal.aborted && this.teamCheckRoot === root) this.releaseTeamCheck();\n }\n private ensureTeamCheck(\n id: string,\n totalCount: number,\n label: string,\n litLights: number,\n ): Container {\n const total = Math.max(1, Math.min(this.context.maxCount, Math.floor(totalCount)));\n const ownerKey = `${id}:${total}`;\n if (this.teamCheckRoot && this.teamCheckOwnerKey === ownerKey) {\n if (this.teamCheckTitle) this.teamCheckTitle.text = label || this.context.defaultLabel;\n this.syncTeamCheckLights(litLights);\n return this.teamCheckRoot;\n }\n this.releaseTeamCheck();\n const root = new this.context.constructors.Container();\n root.label = 'battle-team-check-root';\n root.eventMode = 'none';\n root.pivot.set(this.context.stage.width / 2, this.context.stage.height / 2);\n root.position.set(this.context.stage.width / 2, this.context.stage.height / 2);\n const shade = new this.context.constructors.Graphics()\n .rect(0, 0, this.context.stage.width, this.context.stage.height)\n .fill({\n color: this.resolveTuningColor('visual.battle.teamCheckCinematic.shadeColor', 0x020308),\n alpha: this.resolveTuningNumber('visual.battle.teamCheckCinematic.shadeAlpha', 0.65),\n });\n shade.label = 'battle-team-check-shade';\n const panelLayout =\n this.context.getTuning()?.getRect('layout.battle.teamCheckCinematic.panel') ??\n this.context.panel;\n const frameTexture = this.context.frameTexture;\n const strands = this.context.createBackdrop();\n strands.label = 'battle-team-check-strands-backdrop';\n strands.alpha = this.resolveTuningNumber('visual.battle.teamCheckCinematic.strandsAlpha', 1);\n const panel = frameTexture\n ? this.createTeamCheckFrame(frameTexture, panelLayout)\n : this.createTeamCheckFallbackPanel(panelLayout);\n const title = new this.context.constructors.Text({\n text: label || this.context.defaultLabel,\n style: {\n fill: this.resolveTuningColor(\n 'visual.battle.teamCheckCinematic.titleColor',\n this.context.titleColor,\n ),\n fontFamily: this.context.fontFamily,\n fontSize: this.resolveTuningNumber('layout.battle.teamCheckCinematic.title.fontSize', 32),\n fontWeight: '700',\n letterSpacing: 5,\n },\n });\n title.label = 'battle-team-check-title-text';\n title.anchor.set(0.5);\n const titleRoot = new this.context.constructors.Container();\n titleRoot.label = 'battle-team-check-title';\n titleRoot.position.set(\n this.resolveTuningNumber('layout.battle.teamCheckCinematic.title.x', 960),\n this.resolveTuningNumber('layout.battle.teamCheckCinematic.title.y', 463),\n );\n const titlePlate = new this.context.constructors.Graphics()\n .roundRect(\n -Math.max(180, title.width + 40) / 2,\n -(title.height + 16) / 2,\n Math.max(180, title.width + 40),\n title.height + 16,\n 5,\n )\n .fill({\n color: this.resolveTuningColor(\n 'visual.battle.teamCheckCinematic.titlePlateColor',\n 0x160e08,\n ),\n alpha: this.resolveTuningNumber('visual.battle.teamCheckCinematic.titlePlateAlpha', 0.74),\n })\n .stroke({\n color: this.resolveTuningColor(\n 'visual.battle.teamCheckCinematic.titlePlateBorderColor',\n 0xb4873c,\n ),\n width: 1,\n });\n titleRoot.addChild(titlePlate, title);\n const lampLayouts = PixiTeamCheckCinematic.resolveLampLayout(total, {\n centerX: this.resolveTuningNumber('layout.battle.teamCheckCinematic.lampRow.centerX', 960),\n width: this.resolveTuningNumber('layout.battle.teamCheckCinematic.lampRow.width', 653),\n y: this.resolveTuningNumber('layout.battle.teamCheckCinematic.lampRow.y', 584),\n minSize: this.resolveTuningNumber('layout.battle.teamCheckCinematic.lampRow.minSize', 42),\n maxSize: this.resolveTuningNumber('layout.battle.teamCheckCinematic.lampRow.maxSize', 68),\n maxGap: this.resolveTuningNumber('layout.battle.teamCheckCinematic.lampRow.maxGap', 26),\n });\n const glowBlurStrength = Math.max(\n 0,\n this.resolveTuningNumber('visual.battle.teamCheckCinematic.lampGlowBlurStrength', 12),\n );\n const glowRadiusScale = Math.max(\n 0,\n this.resolveTuningNumber('visual.battle.teamCheckCinematic.lampGlowRadiusScale', 0.5),\n );\n const glowPadding = Math.max(4, glowBlurStrength * 3);\n const glowBounds = lampLayouts.reduce(\n (bounds, layout) => {\n const radius = layout.size * glowRadiusScale;\n return {\n left: Math.min(bounds.left, layout.x - radius),\n top: Math.min(bounds.top, layout.y - radius),\n right: Math.max(bounds.right, layout.x + radius),\n bottom: Math.max(bounds.bottom, layout.y + radius),\n };\n },\n { left: Infinity, top: Infinity, right: -Infinity, bottom: -Infinity },\n );\n const glowLayer = new this.context.constructors.Container();\n glowLayer.label = 'battle-team-check-lamp-glow-layer';\n glowLayer.eventMode = 'none';\n glowLayer.interactiveChildren = false;\n glowLayer.blendMode = 'add';\n const glowFilter = new this.context.constructors.BlurFilter({\n strength: glowBlurStrength,\n quality: 2,\n kernelSize: 7,\n });\n glowFilter.enabled = glowBlurStrength > 0;\n glowFilter.padding = glowPadding;\n glowLayer.filters = [glowFilter];\n glowLayer.filterArea = new this.context.constructors.Rectangle(\n glowBounds.left - glowPadding,\n glowBounds.top - glowPadding,\n glowBounds.right - glowBounds.left + glowPadding * 2,\n glowBounds.bottom - glowBounds.top + glowPadding * 2,\n );\n root.addChild(shade, strands, panel);\n this.teamCheckLights = lampLayouts.map((layout, index) => {\n const lamp = this.createTeamCheckLamp(index, layout.size, glowRadiusScale);\n lamp.root.position.set(layout.x, layout.y);\n lamp.glow.position.set(layout.x, layout.y);\n glowLayer.addChild(lamp.glow);\n root.addChild(lamp.root);\n return lamp;\n });\n root.addChild(glowLayer, titleRoot);\n this.syncTeamCheckLights(litLights);\n this.context.scene.cinematicLayer.addChild(root);\n this.teamCheckRoot = root;\n this.teamCheckStrands = strands;\n this.teamCheckGlowLayer = glowLayer;\n this.teamCheckGlowFilter = glowFilter;\n this.teamCheckOwnerKey = ownerKey;\n this.teamCheckTitle = title;\n return root;\n }\n private createTeamCheckFrame(\n texture: import('pixi.js').Texture,\n panelLayout: { x: number; y: number; width: number; height: number },\n ): Sprite {\n const rect = PixiTeamCheckCinematic.resolveFrameRect(texture, panelLayout);\n const frame = new this.context.constructors.Sprite(texture);\n frame.label = 'battle-team-check-frame';\n frame.position.set(rect.x, rect.y);\n frame.width = rect.width;\n frame.height = rect.height;\n frame.alpha = this.resolveTuningNumber('visual.battle.teamCheckCinematic.panelAlpha', 1);\n return frame;\n }\n private createTeamCheckFallbackPanel(panelLayout: {\n x: number;\n y: number;\n width: number;\n height: number;\n }): Graphics {\n const panel = new this.context.constructors.Graphics()\n .roundRect(panelLayout.x, panelLayout.y, panelLayout.width, panelLayout.height, 5)\n .fill({\n color: this.resolveTuningColor(\n 'visual.battle.teamCheckCinematic.panelColor',\n this.context.panelColor,\n ),\n alpha: this.resolveTuningNumber('visual.battle.teamCheckCinematic.panelAlpha', 0.94),\n })\n .stroke({\n color: this.resolveTuningColor(\n 'visual.battle.teamCheckCinematic.borderColor',\n this.context.borderColor,\n ),\n width: this.resolveTuningNumber('visual.battle.teamCheckCinematic.borderWidth', 3),\n });\n panel.label = 'battle-team-check-fallback-panel';\n return panel;\n }\n private createTeamCheckLamp(\n index: number,\n size: number,\n glowRadiusScale: number,\n ): TeamCheckLampNode {\n const root = new this.context.constructors.Container();\n root.label = `battle-team-check-lamp-${index}`;\n const shellColor = this.resolveTuningColor(\n 'visual.battle.teamCheckCinematic.lampOffColor',\n 0x4c3516,\n );\n const borderColor = this.resolveTuningColor(\n 'visual.battle.teamCheckCinematic.lampBorderColor',\n 0xc09543,\n );\n const shell = new this.context.constructors.Graphics()\n .roundRect(-size / 2, -size / 2, size, size, 5)\n .fill({ color: shellColor, alpha: 1 })\n .stroke({ color: borderColor, width: 3 })\n .roundRect(-size / 2 + 6, -size / 2 + 6, size - 12, size - 12, 5)\n .stroke({\n color: this.resolveTuningColor('visual.battle.teamCheckCinematic.lampInsetColor', 0x2a1d0c),\n width: 4,\n });\n const bulbRadius = size * 0.295;\n const offBulb = new this.context.constructors.Graphics()\n .circle(0, 0, bulbRadius)\n .fill({\n color: this.resolveTuningColor(\n 'visual.battle.teamCheckCinematic.lampFailureColor',\n 0x393329,\n ),\n alpha: this.resolveTuningNumber('visual.battle.teamCheckCinematic.lampOffAlpha', 1),\n })\n .stroke({ color: borderColor, width: 2 });\n const onColor = this.resolveTuningColor(\n 'visual.battle.teamCheckCinematic.lampSuccessColor',\n 0x61d98d,\n );\n const glow = new this.context.constructors.Graphics()\n .circle(0, 0, size * glowRadiusScale)\n .fill({ color: onColor, alpha: 1 });\n glow.label = `battle-team-check-lamp-glow-${index}`;\n const onBulb = new this.context.constructors.Graphics()\n .circle(0, 0, bulbRadius)\n .fill({ color: onColor, alpha: 1 })\n .stroke({\n color: this.resolveTuningColor(\n 'visual.battle.teamCheckCinematic.lampOnBorderColor',\n 0xc8ffd9,\n ),\n width: 2,\n });\n onBulb.label = `battle-team-check-lamp-on-${index}`;\n root.addChild(shell, offBulb, onBulb);\n return { root, glow, onBulb };\n }\n private syncTeamCheckLights(litLights: number): void {\n const lit = Math.max(0, Math.min(this.teamCheckLights.length, Math.round(litLights)));\n const glowAlpha = this.resolveTuningNumber(\n 'visual.battle.teamCheckCinematic.lampGlowAlpha',\n 0.48,\n );\n this.teamCheckLights.forEach((lamp, index) => {\n const on = index < lit;\n lamp.onBulb.alpha = on ? 1 : 0;\n lamp.glow.alpha = on ? glowAlpha * this.uiHighlightMultiplier : 0;\n });\n }\n private resolveTeamCheckFailureKeyframes(): Array<{ x: number; duration: number }> {\n const offset = this.resolveTuningNumber('motion.battle.teamCheckCinematic.failureOffsetX', 8);\n const duration = this.resolveTuningNumber(\n 'motion.battle.teamCheckCinematic.failureStepDuration',\n PixiTeamCheckCinematic.failureStepMs / 1000,\n );\n return [-offset, offset, -offset, offset, 0].map((delta) => ({\n x: this.context.stage.width / 2 + delta,\n duration,\n }));\n }\n private resolveTuningNumber(path: SessionTuningPath, fallback: number): number {\n const value = this.context.getTuning?.()?.get(path);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n }\n private resolveTuningColor(path: SessionTuningPath, fallback: string | number): string | number {\n return this.context.resolveColor(path, fallback);\n }\n private releaseTeamCheck(): void {\n const root = this.teamCheckRoot;\n const strands = this.teamCheckStrands;\n const glowLayer = this.teamCheckGlowLayer;\n const glowFilter = this.teamCheckGlowFilter;\n this.teamCheckRoot = null;\n this.teamCheckStrands = null;\n this.teamCheckGlowLayer = null;\n this.teamCheckGlowFilter = null;\n this.teamCheckOwnerKey = null;\n this.teamCheckTitle = null;\n this.teamCheckLights = [];\n if (strands) this.context.releaseBackdrop(strands);\n if (glowLayer) glowLayer.filters = null;\n glowFilter?.destroy();\n if (root) removeAndDestroy(root);\n }\n}\n", "import type { BlurFilter } from 'pixi.js';\nimport type { PixiBattleFxHandle } from './PixiBattleFxResources.js';\nimport type { PixiMediaBreathBinding } from './PixiMediaBreathRuntime.js';\nimport type { PixiVideoBinding } from './PixiVideoRuntime.js';\nimport type { SessionTuningPath } from './tuning/SessionTuningTypes.js';\nimport { createComboSlashRegions } from './PixiSessionLayout.js';\nimport { resolveContainRect } from './PixiMapWorldUtils.js';\nimport type {\n ScenePictureInstruction,\n ImageBurstInstruction,\n PixiSceneMotionContext,\n PixiSceneMotionPorts,\n} from './PixiSceneMotionPorts.js';\ntype PixiContainer = import('pixi.js').Container;\ntype PixiGraphics = import('pixi.js').Graphics;\ntype PixiSprite = import('pixi.js').Sprite;\nconst removeAndDestroy = (node: PixiContainer) => {\n node.parent?.removeChild(node);\n node.destroy({ children: true });\n};\nexport function resolveScenePictureLayout(\n stage: { width: number; height: number },\n source: { width: number; height: number },\n direction: -1 | 1,\n bounds: { maxWidth: number; maxHeight: number; allowUpscale?: boolean },\n) {\n const scale = Math.min(\n bounds.maxWidth / source.width,\n bounds.maxHeight / source.height,\n bounds.allowUpscale ? Infinity : 1,\n );\n return {\n width: source.width * scale,\n height: source.height * scale,\n centerX: stage.width / 2,\n centerY: stage.height / 2,\n entryX: stage.width / 2 + direction * stage.width * 0.78,\n driftX: stage.width / 2 - direction * stage.width * 0.03,\n exitX: stage.width / 2 - direction * stage.width * 0.78,\n };\n}\nexport class PixiSceneMotion {\n private readonly active = new Set<AbortController>();\n private closed = false;\n private scopeSequence = 0;\n private readonly fxResources: PixiSceneMotionContext['fxResources'];\n constructor(\n private readonly context: PixiSceneMotionContext,\n private readonly ports: PixiSceneMotionPorts,\n ) {\n if (\n !ports.assetScopePrefix ||\n ![ports.stage.width, ports.stage.height].every((value) => Number.isFinite(value) && value > 0)\n )\n throw new Error('Invalid scene motion stage/asset identity');\n this.fxResources = context.fxResources;\n }\n playPicture(event: ScenePictureInstruction, signal: AbortSignal): Promise<void> {\n event = { ...event };\n if (\n !event.id ||\n !event.imageUrl ||\n !Number.isFinite(event.rotationRadians) ||\n !Number.isFinite(event.seed) ||\n event.seed < 0 ||\n event.seed > 1 ||\n (event.direction !== -1 && event.direction !== 1) ||\n (event.mediaKind !== 'image' && event.mediaKind !== 'video') ||\n (event.mediaKind === 'video' && !event.videoUrl)\n )\n return Promise.reject(new Error('Invalid scene picture instruction'));\n return this.run(signal, (child) => this.playBattlePicture(event, child));\n }\n playImageBurst(event: ImageBurstInstruction, signal: AbortSignal): Promise<void> {\n event = {\n ...event,\n participants: event.participants.map((participant) => ({ ...participant })),\n };\n if (\n !event.id ||\n !Number.isFinite(event.seed) ||\n event.seed < 0 ||\n event.seed > 1 ||\n new Set(event.participants.map((item) => item.id)).size !== event.participants.length ||\n event.participants.some((item) => !item.id)\n )\n return Promise.reject(new Error('Invalid image burst instruction'));\n return this.run(signal, (child) => this.playBurst(event, child));\n }\n playTitle(label: string, signal: AbortSignal): Promise<void> {\n return this.run(signal, (child) => this.playCinematicTitle(label, child));\n }\n playCounter(label: string, signal: AbortSignal): Promise<void> {\n return this.run(signal, (child) => this.playRoundFlip(label, child));\n }\n reset(): void {\n for (const controller of this.active) controller.abort();\n this.active.clear();\n }\n destroy(): void {\n this.closed = true;\n this.reset();\n }\n private async run(\n parent: AbortSignal,\n task: (signal: AbortSignal) => Promise<void>,\n ): Promise<void> {\n if (this.closed) throw new Error('Scene motion is destroyed');\n if (parent.aborted) return;\n const controller = new AbortController();\n const abort = () => controller.abort();\n parent.addEventListener('abort', abort, { once: true });\n this.active.add(controller);\n try {\n await task(controller.signal);\n } finally {\n controller.abort();\n this.active.delete(controller);\n parent.removeEventListener('abort', abort);\n }\n }\n private resolveTuningNumber(path: SessionTuningPath, fallback: number): number {\n const value = this.ports.number?.(path);\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n }\n private async playBattlePicture(\n event: ScenePictureInstruction,\n parentSignal: AbortSignal,\n ): Promise<void> {\n const controller = new AbortController();\n const signal = controller.signal;\n const scope = `cinematic:${this.ports.assetScopePrefix}:picture:${event.id}:${++this.scopeSequence}`;\n const isVideo = event.mediaKind === 'video';\n const reducedMotion = this.ports.reducedMotion();\n const layer = this.context.scene.battlePictureFxLayer ?? this.context.scene.cinematicLayer;\n let composition: PixiContainer | null = null;\n let shadow: PixiSprite | null = null;\n let sprite: PixiSprite | null = null;\n let shadowBlur: BlurFilter | null = null;\n let speedLines: PixiBattleFxHandle | null = null;\n let veil: PixiGraphics | null = null;\n let mediaBreath: PixiMediaBreathBinding | null = null;\n let video: PixiVideoBinding | null = null;\n let poster: import('pixi.js').Texture | null = null;\n const cancel = () => {\n controller.abort();\n video?.release();\n };\n parentSignal.addEventListener('abort', cancel, { once: true });\n if (parentSignal.aborted) cancel();\n const restorePoster = () => {\n if (signal.aborted) return;\n if (!poster) {\n cancel();\n return;\n }\n for (const node of [sprite, shadow]) {\n if (!node) continue;\n const { width, height } = node;\n node.texture = poster;\n node.width = width;\n node.height = height;\n }\n this.context.requestRender?.();\n };\n try {\n poster = await this.context.assets\n .loadTexture(`battle-picture:${event.imageUrl}`, event.imageUrl, scope, signal)\n .catch(() => null);\n if (signal.aborted) return;\n let texture = poster;\n if (isVideo && !reducedMotion && event.videoUrl && this.context.videoRuntime) {\n try {\n video = await this.context.videoRuntime.loadBinding({\n alias: `battle-picture-video:${event.id}:${event.videoUrl}`,\n videoUrl: event.videoUrl,\n scope,\n signal,\n muted: false,\n onPlaybackFailure: restorePoster,\n });\n if (signal.aborted) return;\n video.deactivate(true);\n texture = video.texture;\n } catch {\n // Keep the poster when decoding or playback is unavailable.\n }\n }\n if (signal.aborted || !texture) return;\n sprite = new this.context.constructors.Sprite(texture);\n shadow = new this.context.constructors.Sprite(texture);\n composition = new this.context.constructors.Container();\n composition.label = 'battle-picture-composition';\n const artwork = new this.context.constructors.Container();\n artwork.label = 'battle-picture-artwork';\n const layout = resolveScenePictureLayout(this.ports.stage, texture, event.direction, {\n maxWidth: this.resolveTuningNumber(\n isVideo\n ? 'visual.battle.actionFx.battleVideoMaxWidth'\n : 'visual.battle.actionFx.battlePictureMaxWidth',\n isVideo ? 1568 : 1280,\n ),\n maxHeight: this.resolveTuningNumber(\n isVideo\n ? 'visual.battle.actionFx.battleVideoMaxHeight'\n : 'visual.battle.actionFx.battlePictureMaxHeight',\n isVideo ? 882 : 720,\n ),\n allowUpscale: isVideo,\n });\n for (const node of [sprite, shadow]) {\n node.anchor.set(0.5);\n node.width = layout.width;\n node.height = layout.height;\n node.eventMode = 'none';\n }\n shadow.position.set(\n this.resolveTuningNumber('visual.battle.actionFx.battlePictureShadowOffsetX', 18),\n this.resolveTuningNumber('visual.battle.actionFx.battlePictureShadowOffsetY', 22),\n );\n shadow.tint = this.ports.colors.shadow;\n shadow.alpha = this.resolveTuningNumber(\n 'visual.battle.actionFx.battlePictureShadowAlpha',\n 0.5,\n );\n shadowBlur = this.fxResources.acquireBlurFilter(\n this.resolveTuningNumber('visual.battle.actionFx.battlePictureShadowBlurStrength', 16),\n );\n if (shadowBlur) shadow.filters = [shadowBlur];\n sprite.alpha = isVideo ? 1 : 0.96;\n if (!isVideo) mediaBreath = this.context.mediaBreath?.attach(sprite, 'primary') ?? null;\n artwork.addChild(shadow, sprite);\n const rotation = isVideo ? 0 : event.rotationRadians;\n artwork.rotation = rotation;\n artwork.alpha = 0;\n artwork.position.set(\n isVideo ? layout.centerX : layout.entryX,\n layout.centerY +\n (isVideo && !reducedMotion\n ? this.resolveTuningNumber('visual.battle.actionFx.battleVideoJumpOffsetY', 48)\n : 0),\n );\n artwork.scale.set(\n isVideo && !reducedMotion\n ? this.resolveTuningNumber('visual.battle.actionFx.battleVideoEnterScale', 0.85)\n : 1,\n );\n veil = new this.context.constructors.Graphics()\n .rect(0, 0, this.ports.stage.width, this.ports.stage.height)\n .fill({\n color: this.ports.colors.pictureVeil,\n alpha: this.resolveTuningNumber('visual.battle.actionFx.battlePictureVeilAlpha', 0.72),\n });\n veil.alpha = 0;\n speedLines =\n isVideo || reducedMotion\n ? null\n : this.fxResources.acquireSpeedLines(\n composition,\n this.ports.colors.cinematic,\n [\n this.resolveTuningNumber(\n 'motion.battle.actionFx.battlePictureSpeedLineSlowCycleMs',\n 350,\n ) / 1000,\n this.resolveTuningNumber(\n 'motion.battle.actionFx.battlePictureSpeedLineMediumCycleMs',\n 250,\n ) / 1000,\n this.resolveTuningNumber(\n 'motion.battle.actionFx.battlePictureSpeedLineFastCycleMs',\n 175,\n ) / 1000,\n ],\n {\n seed: event.seed,\n density: this.resolveTuningNumber(\n 'visual.battle.actionFx.battlePictureSpeedLineDensity',\n 1 / 3,\n ),\n minLength: this.resolveTuningNumber(\n 'visual.battle.actionFx.battlePictureSpeedLineMinLength',\n 0.24,\n ),\n maxLength: this.resolveTuningNumber(\n 'visual.battle.actionFx.battlePictureSpeedLineMaxLength',\n 0.62,\n ),\n motionBlur: this.resolveTuningNumber(\n 'visual.battle.actionFx.battlePictureSpeedLineMotionBlur',\n 0.12,\n ),\n thicknessScale: this.resolveTuningNumber(\n 'visual.battle.actionFx.battlePictureSpeedLineThicknessScale',\n 1 / 3,\n ),\n },\n );\n if (speedLines) {\n speedLines.mesh.alpha = 0;\n speedLines.mesh.position.set(this.ports.stage.width / 2, this.ports.stage.height / 2);\n speedLines.mesh.scale.set(this.ports.stage.width / 2, this.ports.stage.height / 2);\n }\n composition.addChild(artwork);\n layer.addChild(veil);\n layer.addChild(composition);\n if (!isVideo) this.ports.playPictureSound?.();\n const enter = reducedMotion\n ? 0.12\n : isVideo\n ? this.resolveTuningNumber('motion.battle.actionFx.battleVideoEnterDurationMs', 320) /\n 1000\n : 0.24;\n await Promise.all([\n this.context.director.tween(\n artwork,\n {\n x: layout.centerX,\n y: layout.centerY,\n alpha: 1,\n rotation,\n duration: enter,\n ...(isVideo ? { reducedMotionDuration: enter } : {}),\n ...(isVideo ? { ease: 'back.out(1.4)' } : {}),\n },\n signal,\n ),\n this.context.director.tween(\n veil,\n { alpha: 1, duration: enter, ...(isVideo ? { reducedMotionDuration: enter } : {}) },\n signal,\n ),\n ...(speedLines\n ? [\n this.context.director.tween(\n speedLines.mesh,\n {\n alpha: this.resolveTuningNumber(\n 'visual.battle.actionFx.battlePictureSpeedLineAlpha',\n 0.82,\n ),\n duration: 0.12,\n },\n signal,\n ),\n ]\n : []),\n ...(isVideo\n ? [\n this.context.director.tween(\n artwork.scale,\n {\n x: 1,\n y: 1,\n duration: enter,\n ease: 'back.out(1.4)',\n ...(isVideo ? { reducedMotionDuration: enter } : {}),\n },\n signal,\n ),\n ]\n : []),\n ]);\n if (signal.aborted) return;\n if (isVideo) {\n const completed = video ? await video.playOnce() : false;\n if (signal.aborted) return;\n if (!completed) {\n restorePoster();\n if (signal.aborted) return;\n const hold =\n this.resolveTuningNumber('motion.battle.actionFx.battleVideoHoldDurationMs', 5000) /\n 1000;\n // Only static poster fallback uses a fixed hold; videos exit on their ended event.\n await this.context.director.tween(\n artwork,\n { alpha: 1, duration: hold, reducedMotionDuration: hold },\n signal,\n );\n }\n } else if (!reducedMotion) {\n await Promise.all([\n this.context.director.tween(\n artwork,\n { x: layout.driftX, duration: 3, ease: 'none' },\n signal,\n ),\n ...(speedLines\n ? [\n this.context.director.tween(\n this.fxResources.getSpeedLineUniforms(speedLines),\n { uTime: 3, duration: 3, ease: 'none' },\n signal,\n ),\n ]\n : []),\n ]);\n }\n if (signal.aborted) return;\n const exit = isVideo\n ? this.resolveTuningNumber('motion.battle.actionFx.battleVideoExitDurationMs', 500) / 1000\n : reducedMotion\n ? 0.12\n : 0.26;\n await Promise.all([\n this.context.director.tween(\n artwork,\n {\n ...(isVideo ? {} : { x: layout.exitX }),\n alpha: 0,\n duration: exit,\n ...(isVideo ? { reducedMotionDuration: exit } : {}),\n },\n signal,\n ),\n this.context.director.tween(\n veil,\n { alpha: 0, duration: exit, ...(isVideo ? { reducedMotionDuration: exit } : {}) },\n signal,\n ),\n ...(speedLines\n ? [this.context.director.tween(speedLines.mesh, { alpha: 0, duration: 0.26 }, signal)]\n : []),\n ]);\n } catch {\n // Asset failures must not block the display queue.\n } finally {\n parentSignal.removeEventListener('abort', cancel);\n controller.abort();\n video?.release();\n composition?.parent?.removeChild(composition);\n veil?.parent?.removeChild(veil);\n this.context.requestRender?.();\n mediaBreath?.release();\n if (shadow) shadow.filters = [];\n this.fxResources.releaseBlurFilter(shadowBlur);\n this.fxResources.release(speedLines);\n if (composition) removeAndDestroy(composition);\n if (veil) removeAndDestroy(veil);\n await this.context.assets.releaseScope(scope);\n }\n }\n\n private async playBurst(event: ImageBurstInstruction, signal: AbortSignal): Promise<void> {\n const comboFxLayer = this.context.scene.comboFxLayer ?? this.context.scene.cinematicLayer;\n const participants = event.participants;\n if (participants.length === 0) return;\n this.ports.playBurstSound?.();\n const scope = `cinematic:${this.ports.assetScopePrefix}:image-burst:${event.id}:${++this.scopeSequence}`;\n const reducedMotion = this.ports.reducedMotion();\n const enterDuration = reducedMotion\n ? 0.12\n : this.resolveTuningNumber('motion.battle.actionFx.comboEnterDurationMs', 480) / 1000;\n const holdDuration =\n this.resolveTuningNumber('motion.battle.actionFx.comboHoldDurationMs', 3000) / 1000;\n const holdDriftSpeed = reducedMotion\n ? 0\n : this.resolveTuningNumber('motion.battle.actionFx.comboHoldDriftSpeedPxPerSecond', 12);\n const exitDuration = reducedMotion\n ? 0.12\n : this.resolveTuningNumber('motion.battle.actionFx.comboExitDurationMs', 320) / 1000;\n const node = new this.context.constructors.Container();\n let speedLines: PixiBattleFxHandle | null = null;\n let lightning: PixiSprite | null = null;\n const panelNodes: Array<{ root: PixiContainer; entryY: number; holdY: number; exitY: number }> =\n [];\n try {\n const dim = new this.context.constructors.Graphics()\n .rect(0, 0, this.ports.stage.width, this.ports.stage.height)\n .fill({ color: this.ports.colors.transition, alpha: 0.76 });\n dim.alpha = 0;\n node.addChild(dim);\n const comboSpeedLineSpeed = Math.max(\n 0.01,\n this.resolveTuningNumber('motion.battle.actionFx.comboSpeedLineSpeed', 1),\n );\n speedLines = reducedMotion\n ? null\n : this.fxResources.acquireSpeedLines(\n node,\n this.ports.colors.cinematic,\n [0.35 / comboSpeedLineSpeed, 0.25 / comboSpeedLineSpeed, 0.175 / comboSpeedLineSpeed],\n {\n seed: event.seed,\n density: this.resolveTuningNumber(\n 'visual.battle.actionFx.comboSpeedLineDensity',\n 0.18,\n ),\n minLength: this.resolveTuningNumber(\n 'visual.battle.actionFx.comboSpeedLineMinLength',\n 0.24,\n ),\n maxLength: this.resolveTuningNumber(\n 'visual.battle.actionFx.comboSpeedLineMaxLength',\n 0.62,\n ),\n motionBlur: this.resolveTuningNumber(\n 'visual.battle.actionFx.comboSpeedLineMotionBlur',\n 0.08,\n ),\n thicknessScale: this.resolveTuningNumber(\n 'visual.battle.actionFx.comboSpeedLineThicknessScale',\n 0.33,\n ),\n },\n );\n if (speedLines) {\n speedLines.mesh.position.set(this.ports.stage.width / 2, this.ports.stage.height / 2);\n const diagonalRadius = Math.hypot(this.ports.stage.width, this.ports.stage.height) / 2;\n speedLines.mesh.alpha = 0;\n speedLines.mesh.rotation =\n (this.resolveTuningNumber('visual.battle.actionFx.comboSpeedLineAngleDeg', 30) *\n Math.PI) /\n 180;\n speedLines.mesh.scale.set(diagonalRadius);\n }\n const flash = new this.context.constructors.Graphics()\n .rect(0, 0, this.ports.stage.width, this.ports.stage.height)\n .fill({ color: this.ports.colors.cinematic, alpha: 1 });\n flash.alpha = 0;\n node.addChild(flash);\n const panelGroup = new this.context.constructors.Container();\n panelGroup.pivot.set(this.ports.stage.width / 2, this.ports.stage.height / 2);\n panelGroup.position.set(this.ports.stage.width / 2, this.ports.stage.height / 2);\n panelGroup.scale.set(this.resolveTuningNumber('visual.battle.actionFx.comboAvatarScale', 1));\n node.addChild(panelGroup);\n const regions = createComboSlashRegions(participants.length, this.ports.burstBounds);\n await Promise.all(\n regions.map(async (region, index) => {\n const token = participants[index]!;\n const panelRoot = new this.context.constructors.Container();\n const fromTop = index % 2 === 0;\n const entryY = fromTop\n ? -(region.bounds.y + region.bounds.height + this.ports.burstEntryMargin)\n : this.ports.stage.height - region.bounds.y + this.ports.burstEntryMargin;\n const exitY = fromTop\n ? this.ports.stage.height - region.bounds.y + this.ports.burstEntryMargin\n : entryY * -1;\n const holdY = (fromTop ? 1 : -1) * holdDriftSpeed * holdDuration;\n panelRoot.position.y = reducedMotion ? 0 : entryY;\n panelRoot.alpha = 0;\n panelNodes.push({ root: panelRoot, entryY, holdY, exitY });\n panelGroup.addChild(panelRoot);\n const panel = new this.context.constructors.Graphics()\n .poly(region.points, true)\n .fill({\n color: token.tint,\n alpha: 0.88,\n })\n .stroke({ color: this.ports.colors.borderStrong, width: 3 });\n panelRoot.addChild(panel);\n try {\n const loadedAvatar = await (async () => {\n if (token.imageUrl) {\n try {\n return {\n texture: await this.context.assets.loadTexture(\n `combo-character:${token.id}:${token.imageUrl}`,\n token.imageUrl,\n scope,\n signal,\n ),\n };\n } catch {\n // Retry with the shared silhouette below.\n }\n }\n return {\n texture: await this.context.assets.loadTexture(\n 'combo-character:default-silhouette',\n this.ports.defaultImageUrl,\n scope,\n signal,\n ),\n };\n })();\n if (signal.aborted) return;\n const sprite = new this.context.constructors.Sprite(loadedAvatar.texture);\n const rect = resolveContainRect(\n {\n width: Number(loadedAvatar.texture.width) || 1,\n height: Number(loadedAvatar.texture.height) || 1,\n },\n region.bounds,\n );\n sprite.position.set(rect.x, rect.y);\n sprite.width = rect.width;\n sprite.height = rect.height;\n const mask = new this.context.constructors.Graphics()\n .poly(region.points, true)\n .fill(this.ports.colors.mask);\n sprite.mask = mask;\n panelRoot.addChild(sprite, mask);\n } catch {\n // Colored polygon remains as the asset-missing fallback.\n }\n }),\n );\n if (signal.aborted) return;\n if (!reducedMotion) {\n const defaults = this.ports.lightning;\n const offsetY = this.resolveTuningNumber(\n 'visual.battle.actionFx.comboLightningOffsetY',\n defaults.offsetY,\n );\n lightning = this.context.shaderRuntime.create('lightning', 1, {\n uLightningHorizontal: { value: 1, type: 'f32' },\n uLightningAmplitude: {\n value: this.resolveTuningNumber(\n 'visual.battle.actionFx.comboLightningAmplitude',\n defaults.amplitude,\n ),\n type: 'f32',\n },\n uLightningHue: {\n value: this.resolveTuningNumber(\n 'visual.battle.actionFx.comboLightningHue',\n defaults.hue,\n ),\n type: 'f32',\n },\n // Horizontal coordinates use the stage width as their aspect-corrected unit.\n uLightningXOffset: { value: (-2 * offsetY) / this.ports.stage.width, type: 'f32' },\n uLightningSpeed: {\n value: this.resolveTuningNumber(\n 'motion.battle.actionFx.comboLightningSpeed',\n defaults.speed,\n ),\n type: 'f32',\n },\n uLightningIntensity: {\n value: this.resolveTuningNumber(\n 'visual.battle.actionFx.comboLightningIntensity',\n defaults.intensity,\n ),\n type: 'f32',\n },\n uLightningSize: {\n value: this.resolveTuningNumber(\n 'visual.battle.actionFx.comboLightningSize',\n defaults.size,\n ),\n type: 'f32',\n },\n });\n lightning.label = 'battle-combo-lightning';\n lightning.alpha = 0;\n // Keep the existing flash and portrait panels above both background effects.\n node.addChildAt(lightning, speedLines ? 2 : 1);\n }\n comboFxLayer.addChild(node);\n await this.context.director.tween(\n flash,\n { alpha: 0.72, duration: 0.06, yoyo: true, repeat: 1 },\n signal,\n );\n await Promise.all([\n ...panelNodes.map(({ root }) =>\n this.context.director.tween(\n root,\n {\n alpha: 1,\n y: 0,\n duration: enterDuration,\n ease: reducedMotion ? 'none' : 'power3.out',\n },\n signal,\n ),\n ),\n this.context.director.tween(dim, { alpha: 1, duration: enterDuration }, signal),\n lightning\n ? this.context.director.tween(\n lightning,\n {\n alpha: this.resolveTuningNumber(\n 'visual.battle.actionFx.comboLightningAlpha',\n this.ports.lightning.alpha,\n ),\n duration: enterDuration,\n },\n signal,\n )\n : Promise.resolve(),\n speedLines\n ? this.context.director.tween(\n speedLines.mesh,\n {\n alpha: this.resolveTuningNumber('visual.battle.actionFx.comboSpeedLineAlpha', 0.58),\n duration: enterDuration,\n },\n signal,\n )\n : Promise.resolve(),\n speedLines\n ? this.context.director.tween(\n this.fxResources.getSpeedLineUniforms(speedLines),\n { uTime: enterDuration, duration: enterDuration, ease: 'none' },\n signal,\n )\n : Promise.resolve(),\n ]);\n await Promise.all([\n ...panelNodes.map(({ root, holdY }) =>\n this.context.director.tween(\n root,\n {\n y: reducedMotion ? 0 : holdY,\n duration: holdDuration,\n ease: 'none',\n },\n signal,\n ),\n ),\n speedLines\n ? this.context.director.tween(\n this.fxResources.getSpeedLineUniforms(speedLines),\n {\n uTime: enterDuration + holdDuration,\n duration: holdDuration,\n ease: 'none',\n },\n signal,\n )\n : Promise.resolve(),\n ]);\n await Promise.all([\n ...panelNodes.map(({ root, exitY }) =>\n this.context.director.tween(\n root,\n {\n alpha: 0,\n y: reducedMotion ? 0 : exitY,\n duration: exitDuration,\n ease: reducedMotion ? 'none' : 'power3.in',\n },\n signal,\n ),\n ),\n this.context.director.tween(dim, { alpha: 0, duration: exitDuration }, signal),\n lightning\n ? this.context.director.tween(lightning, { alpha: 0, duration: exitDuration }, signal)\n : Promise.resolve(),\n speedLines\n ? this.context.director.tween(\n speedLines.mesh,\n { alpha: 0, duration: exitDuration },\n signal,\n )\n : Promise.resolve(),\n ]);\n } finally {\n for (const { root, entryY } of panelNodes) {\n root.position.y = entryY;\n root.alpha = 0;\n }\n if (lightning) this.context.shaderRuntime.release(lightning);\n this.fxResources.release(speedLines);\n removeAndDestroy(node);\n await this.context.assets.releaseScope(scope);\n this.context.requestRender();\n }\n }\n\n private async playCinematicTitle(label: string, signal: AbortSignal): Promise<void> {\n const release = this.context.activity?.acquire(`cinematic-title:${label}`);\n const node = new this.context.constructors.Text({\n text: label,\n style: {\n ...this.ports.typography.title,\n fill: this.ports.colors.cinematic,\n fontFamily: this.ports.typography.title.fontFamily,\n fontSize: this.ports.typography.title.fontSize ?? 78,\n fontWeight: this.ports.typography.title.fontWeight ?? '700',\n },\n });\n node.anchor.set(0.5);\n node.position.set(this.ports.stage.width / 2, this.ports.stage.height / 2);\n node.alpha = 0;\n this.context.scene.cinematicLayer.addChild(node);\n try {\n await this.context.director.tween(node, { alpha: 1, duration: 0.18 }, signal);\n await this.context.director.tween(node, { alpha: 0, duration: 0.28, delay: 0.4 }, signal);\n } finally {\n removeAndDestroy(node);\n release?.();\n }\n }\n\n private async playRoundFlip(round: string, signal: AbortSignal): Promise<void> {\n const release = this.context.activity?.acquire(`counter-flip:${round}`);\n const root = new this.context.constructors.Container();\n const fontSize = this.resolveTuningNumber('visual.battle.actionFx.roundNumberFontSize', 240);\n const bottomShade = new this.context.constructors.Graphics()\n .rect(\n this.ports.roundShade.x,\n this.ports.roundShade.y,\n this.ports.roundShade.width,\n this.ports.roundShade.height,\n )\n .fill({ color: this.ports.colors.roundShade, alpha: 1 });\n bottomShade.alpha = 0;\n const bottomShadeBlur = new this.context.constructors.BlurFilter({\n strength: this.resolveTuningNumber('visual.battle.actionFx.roundBottomShadeBlurStrength', 80),\n quality: 2,\n resolution: 0.5,\n });\n bottomShade.filters = [bottomShadeBlur];\n bottomShade.filterArea = new this.context.constructors.Rectangle(\n 0,\n 0,\n this.ports.stage.width,\n this.ports.stage.height,\n );\n const number = new this.context.constructors.Text({\n text: round,\n style: {\n ...this.ports.typography.round,\n fill: this.ports.colors.cinematic,\n fontSize,\n },\n });\n const glow = new this.context.constructors.Text({\n text: round,\n style: {\n ...this.ports.typography.round,\n fill: this.ports.colors.cinematic,\n fontSize,\n },\n });\n const depthShadow = new this.context.constructors.Text({\n text: round,\n style: {\n ...this.ports.typography.round,\n fill: this.ports.colors.roundDepth,\n fontSize,\n },\n });\n const depthOffsetX = this.resolveTuningNumber(\n 'visual.battle.actionFx.roundDepthShadowOffsetX',\n 18,\n );\n const depthOffsetY = this.resolveTuningNumber(\n 'visual.battle.actionFx.roundDepthShadowOffsetY',\n 24,\n );\n number.anchor.set(0.5);\n glow.anchor.set(0.5);\n depthShadow.anchor.set(0.5);\n number.position.set(this.ports.stage.width / 2, this.ports.roundEntryY);\n glow.position.set(number.x, number.y);\n depthShadow.position.set(number.x + depthOffsetX, number.y + depthOffsetY);\n number.alpha = 0;\n glow.alpha = 0;\n depthShadow.alpha = 0;\n const glowBlur = new this.context.constructors.BlurFilter({\n strength: this.resolveTuningNumber('visual.battle.actionFx.roundGlowBlurStrength', 14),\n quality: 2,\n resolution: 0.75,\n });\n glow.filters = [glowBlur];\n glow.blendMode = 'screen';\n const depthBlur = new this.context.constructors.BlurFilter({\n strength: this.resolveTuningNumber('visual.battle.actionFx.roundDepthShadowBlurStrength', 5),\n quality: 2,\n resolution: 0.75,\n });\n depthShadow.filters = [depthBlur];\n root.addChild(bottomShade, depthShadow, glow, number);\n this.context.scene.cinematicLayer.addChild(root);\n try {\n const enterDuration =\n this.resolveTuningNumber('motion.battle.actionFx.roundEnterDurationMs', 420) / 1000;\n await Promise.all([\n this.context.director.tween(\n number,\n { alpha: 1, y: this.ports.stage.height / 2, duration: enterDuration, ease: 'power3.out' },\n signal,\n ),\n this.context.director.tween(\n glow,\n {\n alpha: 0.74,\n y: this.ports.stage.height / 2,\n duration: enterDuration,\n ease: 'power3.out',\n },\n signal,\n ),\n this.context.director.tween(\n depthShadow,\n {\n alpha: this.resolveTuningNumber('visual.battle.actionFx.roundDepthShadowAlpha', 0.82),\n y: this.ports.stage.height / 2 + depthOffsetY,\n duration: enterDuration,\n ease: 'power3.out',\n },\n signal,\n ),\n this.context.director.tween(\n bottomShade,\n {\n alpha: this.resolveTuningNumber('visual.battle.actionFx.roundBottomShadeAlpha', 0.72),\n duration: enterDuration,\n },\n signal,\n ),\n ]);\n await this.context.director.tween(\n {},\n {\n duration:\n this.resolveTuningNumber('motion.battle.actionFx.roundHoldDurationMs', 1000) / 1000,\n },\n signal,\n );\n const exitDuration =\n this.resolveTuningNumber('motion.battle.actionFx.roundExitDurationMs', 340) / 1000;\n await Promise.all([\n this.context.director.tween(\n number,\n { alpha: 0, y: this.ports.roundExitY, duration: exitDuration, ease: 'power2.in' },\n signal,\n ),\n this.context.director.tween(\n glow,\n { alpha: 0, y: this.ports.roundExitY, duration: exitDuration, ease: 'power2.in' },\n signal,\n ),\n this.context.director.tween(\n depthShadow,\n {\n alpha: 0,\n y: this.ports.roundExitY + depthOffsetY,\n duration: exitDuration,\n ease: 'power2.in',\n },\n signal,\n ),\n this.context.director.tween(\n bottomShade,\n { alpha: 0, duration: exitDuration, ease: 'power2.in' },\n signal,\n ),\n ]);\n } finally {\n bottomShade.filters = [];\n bottomShadeBlur.destroy();\n depthShadow.filters = [];\n depthBlur.destroy();\n glow.filters = [];\n glowBlur.destroy();\n removeAndDestroy(root);\n release?.();\n }\n }\n}\n", "import {\n Container,\n Filter,\n Particle,\n ParticleContainer,\n ParticleShader,\n Rectangle,\n Sprite,\n Text,\n Texture,\n UniformGroup,\n type Renderer,\n} from 'pixi.js';\nimport type { PixiAnimationActivity } from './PixiAnimationActivity.js';\nimport type { PixiAnimationDirector } from './PixiAnimationDirector.js';\n\n/** Host-owned visual limits and timing. No content or identity policy is embedded. */\nexport interface PixiTextTransitionSettings {\n readonly durationMs: number;\n readonly holdMs: number;\n readonly incomingStartMs: number;\n readonly incomingDurationMs: number;\n readonly reducedMotionMs: number;\n readonly maxTextureWidth: number;\n readonly maxTextureHeight: number;\n readonly maxParticles: number;\n readonly grainSize: number;\n readonly driftX: number;\n readonly driftY: number;\n readonly dustColor: string;\n readonly edgeSoftness: number;\n}\n\nexport interface PixiTextTransitionTarget {\n readonly id: string;\n readonly text: Text;\n readonly overlay: Container;\n readonly isCurrent: () => boolean;\n readonly reserveWidth?: (fromText: string, toText: string) => () => void;\n}\n\nexport interface PreparedPixiTextTransition {\n play(signal: AbortSignal, onStarted?: () => void): Promise<void>;\n cancel(): void;\n}\n\nexport interface PixiTextTransitionEffectOptions {\n readonly settings: PixiTextTransitionSettings;\n readonly renderer: Pick<Renderer, 'generateTexture'>;\n readonly director: PixiAnimationDirector;\n readonly requestRender: () => void;\n readonly activity?: PixiAnimationActivity;\n}\n\nconst VERTEX = `\nprecision highp float;\nin vec2 aPosition;\nout vec2 vTextureCoord;\nuniform vec4 uInputSize;\nuniform vec4 uOutputFrame;\nuniform vec4 uOutputTexture;\nvoid main() {\n vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;\n position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;\n gl_Position = vec4(position, 0.0, 1.0);\n vTextureCoord = aPosition * (uOutputFrame.zw * uInputSize.zw);\n}`;\n\nexport const TEXT_TRANSITION_FRAGMENT = `\nprecision highp float;\nin vec2 vTextureCoord;\nout vec4 finalColor;\nuniform sampler2D uTexture;\nuniform vec4 uInputSize;\nuniform float uProgress;\nuniform float uSeed;\nuniform float uGrain;\nuniform float uSoftness;\nfloat noise(vec2 cell) {\n return fract(sin(dot(cell, vec2(127.1, 311.7)) + uSeed) * 43758.5453);\n}\nvoid main() {\n vec4 source = texture(uTexture, vTextureCoord);\n vec2 cell = floor(vTextureCoord * uInputSize.xy / uGrain);\n float threshold = 0.08 + noise(cell) * 0.84;\n float keep = 1.0 - smoothstep(threshold - uSoftness, threshold + uSoftness, uProgress);\n finalColor = source * keep;\n}`;\n\ninterface Grain {\n readonly particle: Particle;\n readonly x: number;\n readonly y: number;\n readonly delay: number;\n readonly speed: number;\n}\n\ninterface Surface {\n readonly target: PixiTextTransitionTarget;\n readonly root: Container;\n readonly incoming: Text;\n readonly outgoing: Sprite;\n readonly texture: Texture;\n readonly dustTexture: Texture | null;\n readonly grains: readonly Grain[];\n readonly grainTextures: readonly Texture[];\n readonly filter: Filter | null;\n readonly uniforms: UniformGroup | null;\n readonly wasRenderable: boolean;\n readonly releaseWidth?: () => void;\n}\n\nconst owners = new WeakMap<Text, symbol>();\nconst clamp = (value: number): number => Math.max(0, Math.min(1, value));\nconst smooth = (value: number): number => {\n const t = clamp(value);\n return t * t * (3 - 2 * t);\n};\nconst seedOf = (value: string): number => {\n let result = 2166136261;\n for (const character of value) result = Math.imul(result ^ character.codePointAt(0)!, 16777619);\n return result >>> 0;\n};\nconst randomAt = (seed: number, index: number): number => {\n let value = Math.imul(seed ^ index, 1597334677);\n value = Math.imul(value ^ (value >>> 16), 2246822507);\n return ((value ^ (value >>> 13)) >>> 0) / 4294967296;\n};\n\n/** Shared clock, two small glyph snapshots, bounded glyph-derived sand; no GPU readback or RAF. */\nexport class PixiTextTransitionEffect {\n private readonly runs = new Set<PreparedPixiTextTransition>();\n private reducedMotion = false;\n private destroyed = false;\n\n private readonly settings: PixiTextTransitionSettings;\n\n constructor(private readonly options: PixiTextTransitionEffectOptions) {\n const settings = { ...options.settings };\n const numbers = [\n settings.durationMs,\n settings.holdMs,\n settings.incomingStartMs,\n settings.incomingDurationMs,\n settings.reducedMotionMs,\n settings.maxTextureWidth,\n settings.maxTextureHeight,\n settings.maxParticles,\n settings.grainSize,\n settings.driftX,\n settings.driftY,\n settings.edgeSoftness,\n ];\n if (\n !numbers.every((value) => Number.isFinite(value) && value >= 0) ||\n settings.durationMs <= settings.holdMs ||\n settings.incomingDurationMs <= 0 ||\n settings.reducedMotionMs <= 0 ||\n settings.grainSize <= 0 ||\n settings.edgeSoftness <= 0 ||\n ![settings.maxTextureWidth, settings.maxTextureHeight].every(\n (value) => Number.isSafeInteger(value) && value > 0,\n ) ||\n !Number.isSafeInteger(settings.maxParticles) ||\n typeof settings.dustColor !== 'string' ||\n !settings.dustColor.trim()\n ) {\n throw new TypeError('Invalid text transition settings');\n }\n this.settings = Object.freeze(settings);\n }\n\n setReducedMotion(reducedMotion: boolean): void {\n this.reducedMotion = reducedMotion;\n if (reducedMotion) this.reset();\n }\n\n prepare(\n targets: readonly PixiTextTransitionTarget[],\n fromText: string,\n toText: string,\n seed: string,\n ): PreparedPixiTextTransition | null {\n if (this.destroyed || fromText === toText) return null;\n const owner = Symbol(seed);\n const surfaces: Surface[] = [];\n try {\n for (const target of targets) {\n if (\n !target.isCurrent() ||\n target.text.destroyed ||\n target.overlay.destroyed ||\n owners.has(target.text)\n )\n continue;\n const releaseWidth = target.reserveWidth?.(fromText, toText);\n let created: Surface | null;\n try {\n created = this.createSurface(target, fromText, toText, seedOf(`${seed}:${target.id}`));\n } catch (error) {\n releaseWidth?.();\n throw error;\n }\n if (!created) {\n releaseWidth?.();\n continue;\n }\n const surface = { ...created, releaseWidth };\n surfaces.push(surface);\n owners.set(target.text, owner);\n target.text.renderable = false;\n target.overlay.addChild(surface.root);\n }\n } catch {\n for (const surface of surfaces) this.releaseSurface(surface, owner);\n return null;\n }\n if (surfaces.length === 0) return null;\n const controller = new AbortController();\n let cleaned = false;\n let started = false;\n let releaseActivity: (() => void) | undefined;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n this.runs.delete(prepared);\n for (const surface of surfaces) this.releaseSurface(surface, owner);\n releaseActivity?.();\n this.options.requestRender();\n };\n const prepared: PreparedPixiTextTransition = {\n play: async (signal, onStarted) => {\n if (started || cleaned) return;\n started = true;\n const abort = () => controller.abort(signal.reason);\n signal.addEventListener('abort', abort, { once: true });\n if (signal.aborted) abort();\n try {\n if (controller.signal.aborted || this.destroyed) return;\n for (const surface of surfaces) {\n if (!surface.target.isCurrent()) continue;\n // Canonical sync may resize/reposition the retained Text after prepare().\n surface.root.position.copyFrom(surface.target.text.position);\n surface.root.scale.copyFrom(surface.target.text.scale);\n surface.incoming.style = surface.target.text.style.clone();\n surface.incoming.tint = surface.target.text.tint;\n }\n if (surfaces.every((surface) => !surface.target.isCurrent())) return;\n releaseActivity = this.options.activity?.acquire('text-transition');\n onStarted?.();\n const frame = { elapsed: 0 };\n const duration = this.reducedMotion\n ? this.settings.reducedMotionMs\n : this.settings.durationMs;\n await this.options.director.tween(\n frame,\n {\n elapsed: duration,\n duration: duration / 1000,\n reducedMotionDuration: this.settings.reducedMotionMs / 1000,\n ease: 'none',\n onUpdate: () => {\n if (cleaned || controller.signal.aborted) return;\n for (const surface of surfaces)\n this.updateSurface(surface, frame.elapsed, duration);\n this.options.requestRender();\n },\n },\n controller.signal,\n );\n } finally {\n signal.removeEventListener('abort', abort);\n cleanup();\n }\n },\n cancel: () => {\n controller.abort('text-transition-cancelled');\n cleanup();\n },\n };\n this.runs.add(prepared);\n return prepared;\n }\n\n reset(): void {\n for (const run of [...this.runs]) run.cancel();\n }\n\n destroy(): void {\n this.destroyed = true;\n this.reset();\n }\n\n private createSurface(\n target: PixiTextTransitionTarget,\n fromText: string,\n toText: string,\n seed: number,\n ): Surface | null {\n const source = target.text;\n const capture = new Text({ text: fromText, style: source.style.clone() });\n capture.tint = source.tint;\n // Bound allocation before generateTexture; oversized text uses static canonical rendering.\n if (\n capture.width > this.settings.maxTextureWidth ||\n capture.height > this.settings.maxTextureHeight ||\n capture.width < 1\n ) {\n capture.destroy();\n return null;\n }\n let texture: Texture | null = null;\n let dustTexture: Texture | null = null;\n try {\n texture = this.options.renderer.generateTexture({ target: capture, resolution: 1 });\n if (!this.reducedMotion) {\n capture.style.fill = this.settings.dustColor;\n dustTexture = this.options.renderer.generateTexture({ target: capture, resolution: 1 });\n }\n } catch (error) {\n texture?.destroy(true);\n throw error;\n } finally {\n capture.destroy();\n }\n const root = new Container({ label: `text-transition:${target.id}`, eventMode: 'none' });\n root.position.copyFrom(source.position);\n root.scale.copyFrom(source.scale);\n const outgoing = new Sprite(texture);\n outgoing.anchor.copyFrom(source.anchor);\n const incoming = new Text({ text: toText, style: source.style.clone() });\n incoming.anchor.copyFrom(source.anchor);\n incoming.tint = source.tint;\n incoming.alpha = 0;\n root.addChild(incoming, outgoing);\n const grains: Grain[] = [];\n const grainTextures: Texture[] = [];\n let uniforms: UniformGroup | null = null;\n let filter: Filter | null = null;\n try {\n if (!this.reducedMotion) {\n uniforms = new UniformGroup({\n uProgress: { value: 0, type: 'f32' },\n uSeed: { value: seed % 65536, type: 'f32' },\n uGrain: { value: this.settings.grainSize, type: 'f32' },\n uSoftness: { value: this.settings.edgeSoftness, type: 'f32' },\n });\n filter = Filter.from({\n gl: { vertex: VERTEX, fragment: TEXT_TRANSITION_FRAGMENT, name: 'text-glyph-dissolve' },\n resources: { textTransitionUniforms: uniforms },\n padding: 0,\n resolution: 1,\n });\n outgoing.filters = [filter];\n const count = Math.min(\n this.settings.maxParticles,\n Math.max(1, Math.ceil((texture.width * texture.height) / 12)),\n );\n const dust = new ParticleContainer({\n texture: dustTexture ?? texture,\n // The default particle shader belongs to the renderer. Its bind group would\n // retain this temporary texture source and be invalidated when the RT dies.\n // ParticleContainer destroys this owned shader before we release the RT.\n shader: new ParticleShader(),\n dynamicProperties: { position: true, color: true, rotation: false, vertex: false },\n boundsArea: new Rectangle(\n -texture.width,\n -texture.height - this.settings.driftY,\n texture.width * 2 + this.settings.driftX,\n texture.height * 2 + this.settings.driftY,\n ),\n });\n root.addChild(dust);\n for (let index = 0; index < count; index += 1) {\n const size = this.settings.grainSize;\n const x = Math.floor(randomAt(seed, index * 3) * Math.max(1, texture.width - size));\n const y = Math.floor(randomAt(seed, index * 3 + 1) * Math.max(1, texture.height - size));\n const tile = new Texture({\n source: (dustTexture ?? texture).source,\n frame: new Rectangle(\n x,\n y,\n Math.min(size, texture.width - x),\n Math.min(size, texture.height - y),\n ),\n });\n grainTextures.push(tile);\n const originX = x - texture.width * source.anchor.x;\n const originY = y - texture.height * source.anchor.y;\n const particle = new Particle({\n texture: tile,\n x: originX,\n y: originY,\n alpha: 0,\n });\n grains.push({\n particle,\n x: originX,\n y: originY,\n delay: randomAt(seed, index * 3 + 2) * 0.36,\n speed: 0.65 + randomAt(seed, index + count) * 0.7,\n });\n dust.addParticle(particle);\n }\n }\n return {\n target,\n root,\n incoming,\n outgoing,\n texture,\n dustTexture,\n grains,\n grainTextures,\n filter,\n uniforms,\n wasRenderable: source.renderable,\n };\n } catch (error) {\n root.destroy({ children: true });\n filter?.destroy();\n for (const tile of grainTextures) tile.destroy();\n texture.destroy(true);\n dustTexture?.destroy(true);\n throw error;\n }\n }\n\n private updateSurface(surface: Surface, elapsed: number, duration: number): void {\n if (!surface.target.isCurrent() || surface.root.destroyed) return;\n if (this.reducedMotion) {\n const progress = clamp(elapsed / duration);\n surface.outgoing.alpha = 1 - progress;\n surface.incoming.alpha = progress;\n return;\n }\n const dissolve = clamp(\n (elapsed - this.settings.holdMs) / (this.settings.durationMs - this.settings.holdMs),\n );\n if (surface.uniforms) surface.uniforms.uniforms.uProgress = dissolve;\n surface.incoming.alpha = smooth(\n (elapsed - this.settings.incomingStartMs) / this.settings.incomingDurationMs,\n );\n for (const grain of surface.grains) {\n const age = clamp((dissolve - grain.delay) / (1 - grain.delay));\n grain.particle.x = grain.x + this.settings.driftX * grain.speed * age;\n grain.particle.y = grain.y - this.settings.driftY * grain.speed * age;\n grain.particle.alpha = Math.sin(age * Math.PI) * (1 - age);\n }\n }\n\n private releaseSurface(surface: Surface, owner: symbol): void {\n if (owners.get(surface.target.text) === owner) {\n owners.delete(surface.target.text);\n // Never write toText here: a newer canonical update may already have hidden the name again.\n if (!surface.target.text.destroyed) surface.target.text.renderable = surface.wasRenderable;\n }\n if (!surface.root.destroyed) surface.root.destroy({ children: true });\n surface.filter?.destroy();\n for (const texture of surface.grainTextures) texture.destroy();\n surface.texture.destroy(true);\n surface.dustTexture?.destroy(true);\n surface.releaseWidth?.();\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["hash", "envelope", "UniformGroup", "VERTEX", "FRAGMENT", "UniformGroup", "Texture", "VERTEX", "FRAGMENT", "clampProgress", "parseHexColor", "Filter", "UniformGroup", "parseColor", "VERTEX", "FRAGMENT", "parseColor", "UniformGroup", "VERTEX", "FRAGMENT", "parseColor", "UniformGroup", "clamp01", "done", "retrySessionDisplayResource", "Container", "Sprite", "Text", "hash", "clampProgress", "transitionHash", "hash", "clamp01", "phase", "isRecord", "hasOwn", "isRecord", "hasOwn", "clamp01", "from", "to", "rect", "hash", "hash", "VERTEX", "hash", "waitForSessionMediaReady", "waitForSessionMediaReady", "imageUrl", "ready", "duration", "envelope", "BURST_FRAGMENT", "parseColor", "hash", "smooth", "envelope", "readBurstUniforms", "UniformGroup", "colorValue", "numberValue", "hexToUnitRgb", "clampProgress", "hash", "signal", "participantPoints", "removeAndDestroy", "removeAndDestroy", "VERTEX", "clamp", "smooth"]
7
+ }