From 10b413c0f0a31bc9476eed86812b6bb90f82caed Mon Sep 17 00:00:00 2001 From: David Skoland Date: Wed, 1 Apr 2026 13:59:13 +0200 Subject: Add asset preloading system for IC message rendering Fix rendering race conditions where character sprites, pre-animations, and paired character assets were displayed before being downloaded. All assets referenced in an MS packet are now resolved and preloaded into the browser cache before the animation timeline starts. - Add unified assetCache module with session-wide promise caching - Add preloadMessageAssets orchestrator for parallel asset resolution - Cache fileExists HEAD requests so missing files aren't re-probed - Preload all SFX (emote, shout, realization, stab) alongside sprites - Use synchronous setEmoteFromUrl at all render transition points - Graceful fallback to legacy setEmote if preloading times out Co-Authored-By: Claude Opus 4.6 (1M context) --- webAO/client/setEmoteFromUrl.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 webAO/client/setEmoteFromUrl.ts (limited to 'webAO/client/setEmoteFromUrl.ts') diff --git a/webAO/client/setEmoteFromUrl.ts b/webAO/client/setEmoteFromUrl.ts new file mode 100644 index 0000000..8075bbd --- /dev/null +++ b/webAO/client/setEmoteFromUrl.ts @@ -0,0 +1,21 @@ +import transparentPng from "../constants/transparentPng"; + +/** + * Sets a pre-resolved emote URL on the correct DOM element. + * This is synchronous because the image should already be in the browser cache + * from preloading. + */ +const setEmoteFromUrl = (url: string, pair: boolean, side: string): void => { + const pairID = pair ? "pair" : "char"; + const acceptedPositions = ["def", "pro", "wit"]; + const position = acceptedPositions.includes(side) ? `${side}_` : ""; + const emoteSelector = document.getElementById( + `client_${position}${pairID}_img`, + ) as HTMLImageElement; + + if (emoteSelector) { + emoteSelector.src = url || transparentPng; + } +}; + +export default setEmoteFromUrl; -- cgit