1
0
mirror of https://github.com/brues-code/TwitchEmotes.git synced 2026-09-23 16:16:58 +00:00

20 Commits

Author SHA1 Message Date
Brues 3f1e198e4e Add DisGonBGud 2026-09-16 19:36:22 -05:00
Brues 87147d61ac Add DIESOFCRINGE 2026-09-16 19:33:40 -05:00
Brues 110d8c3002 add YouTried 2026-09-16 19:32:09 -05:00
Brues 9cd7911c73 add SpeedLaugh 2026-09-16 19:30:53 -05:00
Brues 0f20f91466 Add TheVoices
https://betterttv.com/emotes/63e4728a7b3e63779e666353
2026-09-16 19:27:15 -05:00
Brues b466f0b2a5 Add Tssk 2026-09-16 19:24:51 -05:00
Brues 83c1c1f0a7 Add Maaaaan
A single frame - the CDN serves it as a PNG - so a plain 32x32 texture with
no crop spec and no animation metadata.
2026-09-04 03:17:37 -05:00
Brues 34a0a2d5c9 Add DONOTCUM, :Awkward: and catKISS
DONOTCUM is 46 frames at 25fps, catKISS 60 at 17fps, both keeping their
source duration. :Awkward: is 76 frames at 10fps - a 7.6s loop, by far the
longest here, but that is the rate its zero-delay frames play at in a
browser. It takes the token form because Awkward is an ordinary word.
2026-09-04 03:14:31 -05:00
Brues 0515d796af Add lebronJAM; rebuild RIPBOZO at its real speed
lebronJAM is 121 frames at 13fps, resampled down from 232 source frames over
9.28s - the first emote to hit the 128-frame ceiling for length rather than
speed. The loop keeps its duration.

RIPBOZO was 28 frames at 13fps, a 2.15s loop, against a source of 81 frames
over 5.06s: a third of the frames playing 2.4x too fast. Rebuilt from that
source as 86 frames at 17fps, so it runs at its real speed with every source
frame kept. Its sheet grows from 64x512 to 128x1024 to hold them.
2026-09-04 02:48:45 -05:00
Brues 6d43915fd9 Animate COGGERS; add PepePls, AlienPls, omgBruh, AINTNOWAY, :Cinema:
COGGERS replaces its static art with the animated original: 36 frames at
30fps, a 1.20s loop. Its source is 60 frames at 50fps, so resampling to the
animator's ceiling keeps the duration and drops what could not be shown.

New: PepePls (21 frames, 14fps), AlienPls (128 at 20fps - the tool's frame
ceiling exactly), omgBruh (60 at 10fps), AINTNOWAY (122 of 200 source frames
at 20fps), and :Cinema:, a still.

:Cinema: takes the token form because Cinema is an ordinary English word and
would fire mid-sentence. Its texture stays Cinema.tga, the way :copium:
points at needcopium.tga.
2026-09-04 02:44:43 -05:00
Brues f5e1ab506a Add ricardoFlick and popCat
ricardoFlick keeps all 127 source frames at 25fps in a 128x1024 sheet, four
columns wide - the tool's 128-frame ceiling, and at 512KB the largest
texture here. popCat is two frames at 10fps in 32x64.

popCat duplicates the existing CatPop, which is the same emote under a
transposed name with its frames in the opposite order. Both kept, since
popCat is the spelling people type.
2026-09-04 02:27:12 -05:00
Brues d8143801fd Add HyperMpreg
Single frame, so a plain 32x32 texture with no crop spec and no animation
metadata. Listed in the Custom pack.
2026-09-04 02:25:03 -05:00
Brues 96fb7091fc Add peepoTalk
16 frames at 10fps in a 32x512 sheet, a 1.6s loop matching the source with
no frames dropped. Listed in the peepo pack alongside its siblings.
2026-09-04 02:22:45 -05:00
Brues fc6e9f125b Animate peepoClap
Replaces the static art with the animated original: two frames at 10fps in
a 32x64 sheet, matching the source's 0.2s loop. The trigger word and menu
listing are unchanged, so only the texture spec and a metadata row move.
2026-09-04 02:18:18 -05:00
Brues 311359dcc8 Repack sheets the client is too skinny to sample; add blobDance
A texture skinnier than 16:1 draws nothing at all. Confirmed in-game with
one crop shape across two sheets: ratJAM (32x512) renders, modCheck
(32x1024) is blank. The earlier 2048 repack fixed those sheets by accident
- two columns took them from 64:1 to 16:1, not by getting under the 1024
cap as its commit message claimed.

Twenty-seven sheets were still at 32:1 and had never rendered: modCheck,
meow, BOOBA, rooRave, Aware, Thinkge, alert and the rest. All repacked to
64x512, same frames in the same order, with their crops and metadata
updated. Verified across all 112 animated sheets: none over 1024 or
skinnier than 16:1, declared sizes match the files, frame counts fit their
grids, and every repacked frame still matches what its sheet held at that
index.

add_emote.py learns the same limit, and resamples the source timeline at a
constant rate instead of expanding holds into repeats: a hold repeats, a
source faster than the ~30fps ticker drops frames, and the loop keeps its
duration either way. blobDance is 50fps at source, so the old code stretched
its 0.74s loop to 1.23s.

Also drops the atoi note from BuildFrameString - ParseField uses atof and
tolerates decimals, so that was never the failure it described.
2026-09-04 01:17:26 -05:00
Brues 94777ecbc4 Add an emote installer, animate Nerdge
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.
2026-09-03 16:00:41 -05:00
Brues 879ab2918c Slow catJAM to its source speed, emit integer texcoords
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.
2026-09-03 14:54:07 -05:00
Brues c08c89ebb9 Repack over-tall emote sheets into a 2-column grid
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.
2026-09-03 14:14:27 -05:00
Brues fdff71922e Add animated emote support
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.
2026-09-02 16:30:12 -05:00
Brues b074b3207c Initial commit 2026-08-31 20:32:24 -05:00