The source emote is 158 frames at 25fps, a 6.32s loop; this sheet holds 60
of those frames but kept a framerate of 15, running the loop in 4.0s.
A fractional rate would have matched it exactly, but the engine splits the
|T payload on ':' and atoi's each field, so a coordinate carrying a decimal
point truncates and crops the wrong rect - the emote renders as the whole
sheet squeezed into its box. The animator now formats the payload with %d
so the frame math can never leak a float into it, and the rate stays a
whole number: 10fps, a 6.0s loop.
The client caps a texture at 1024px in either dimension - nothing in its
own art exceeds it - and squeezes anything larger on load, so every 32px
crop of a 32x2048 sheet landed between frames and the emote rendered as a
stretched smear scrolling vertically. catJAM, pedro, goinginsane, HUHH,
Kiss and Awoken are now 64x1024, the same frames laid out row-major
across two columns.
The animator derives the column count from imageWidth / frameWidth, so
single-column sheets produce the same crop they did before. Fixed the
frame-0 crops in the autocomplete popup and the stats screen, which
hardcoded the full texture width.
Also: HACKERMANS is a single 32x32 frame on disk but was declared as 11
frames of 32x512, which rendered it as the same kind of sliver; it is now
a static icon. Dropped the shadowed duplicate RIPBOZO metadata entry.
Animate multi-frame sprite-sheet emotes (e.g. :meow:) using ClassicAPI's
extended |T texcoord-crop escape, across every context.
- TwitchEmotes_animation_metadata (per-sheet frame layout) added to
Emotes.lua; animated emotes' base entries cropped to frame 0 so any
un-animated context shows a clean first frame, not the whole sheet.
- TwitchEmotesAnimator.lua: ~30fps ticker advancing the current frame in
chat lines, the autocomplete popup, dropdown menus, chat bubbles, and
the stats screen (featured icons + ranked lists).
- Re-converted sprite sheets to uncompressed, unflipped, native
dimensions (1.12 cannot decode RLE TGA); fixed Clap.tga which was a
single 32x32 frame.