aboutsummaryrefslogtreecommitdiff
path: root/webAO/client
diff options
context:
space:
mode:
authorDavid Skoland <davidskoland@gmail.com>2026-04-01 13:59:13 +0200
committerDavid Skoland <davidskoland@gmail.com>2026-04-01 13:59:13 +0200
commit10b413c0f0a31bc9476eed86812b6bb90f82caed (patch)
tree94ac6676fcad76dc76e901e2889a30f7ba611d8d /webAO/client
parentd6163543f483c35737da52b7e307cf6f65828f82 (diff)
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) <noreply@anthropic.com>
Diffstat (limited to 'webAO/client')
-rw-r--r--webAO/client/setEmoteFromUrl.ts21
1 files changed, 21 insertions, 0 deletions
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 <img> 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;