tools/add_emote.py downloads a BetterTTV emote, converts it to a texture
the 1.12 client decodes, and registers it in defaultpack, emoticons, the
animation table and the minimap pack list.
Two client limits shape the conversion. Textures cap at 1024px per side,
so anything longer than 32 frames packs row-major across several 32px
columns. And the animator plays one constant rate while a GIF holds
individual frames for different lengths, so uneven delays expand into
repeated frames at the integer rate that reproduces the source timing with
the fewest frames - a faster rate always matches the duration more exactly
but pays for it in texture size.
Nerdge is the first emote through it, replacing the static art with the
animated original: 17 source frames over 3.12s become 36 frames at 11fps
(3.27s) in a 64x1024 sheet, keeping its hold, push, hold shape.
.pkgmeta is tracked now so the release packager honours its ignore list
and leaves tools out of the zip.
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.