1
0
mirror of https://github.com/brues-code/TwitchEmotes.git synced 2026-09-25 00:56:04 +00:00
  • v6 3fe9ed86b8

    v6 Stable

    brues released this 2026-09-14 19:21:34 +00:00 | 7 commits to main since this release

    TwitchEmotes

    v6 (2026-09-14)

    Full Changelog Previous Releases

    • Mirror releases to the Gitea instance, by hand
      A Gitea pull mirror replicates commits and tags only, so the mirror's Releases
      page shows bare tags with nothing to download. ClassicAPI's mirror-release
      workflow pushes the notes and attachments over through Gitea's API; this is
      that workflow pointed at brues/TwitchEmotes.
      Manual only: workflow_call is dropped, so a release does not trigger it and
      nothing else calls it. Run it from the Actions UI with a tag, or with the tag
      blank to backfill every release.
      Needs its own MIRROR_TOKEN secret on this repo before the first run.
    • Draw the stats window with art 1.12 actually ships
      Neither texture it asked for exists on this client, and ClassicAPI ships no
      art of its own. UI-DialogBox-Background-Dark is a later addition -- 1.12 has
      only the un-suffixed UI-DialogBox-Background -- and ItemSocketingFrame is TBC,
      so the featured emotes' border was cropped out of a sheet whose folder isn't
      there at all.
      UI-Quickslot2 is the obvious stand-in for that border, but its hole is ~55% of
      the texture, so a 70px emote needs a 128px ring and runs into the title above
      and the caption below. It is a small backdrop frame instead, styled like the
      autocomplete popup, which keeps the 86/70 sizing. The emote moves onto that
      frame to draw above the backdrop; topSentTex/topSeenTex keep their names, so
      the animator still finds them.
    • Add a README
    • Pack animation sheets as tall strips
      ClassicAPI's texture dimension gate lifts the two limits the sheet layout was
      built around. A sheet skinnier than 16:1 drawing nothing was never a client
      rule -- VanillaHelpers grew the texture recycle pool to 6x6 but left the index
      stride at 5, so a 32x1024 strip collided with a 64x32 bucket and was handed
      back the wrong texture. And power-of-two is no longer required, since the gate
      grows the decode scratch to fit.
      So a run wraps into columns only when it outgrows the scratch at 32 frames, and
      a sheet is sized to its frames exactly: 20 frames is a 32x640 strip rather than
      64x1024. The 128 frame budget is unchanged, and older sheets still play -- the
      animator reads the column count off the sheet.
    • Set changelog-title
    Downloads
  • v5 83c1c1f0a7

    v5 Stable

    brues released this 2026-09-04 08:18:16 +00:00 | 12 commits to main since this release

    TwitchEmotes

    v5 (2026-09-04)

    Full Changelog Previous Releases

    • 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.
    • 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.
    • Treat a zero GIF delay as 100ms
      A GIF frame delay under 20ms means "as fast as possible", and browsers clamp
      it to 100ms - the speed the emote actually plays at where people see it.
      Summed literally, :Awkward: reported 76 frames lasting 0.1s and collapsed to
      a single still. Any emote authored that way would have silently become a
      static image.
    • 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.
    • 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.
    • Fit wide emotes to their own aspect
      A source wider than it is tall was squeezed into a square 32x32 cell, so it
      rendered as a letterboxed sliver in a 28x28 box. The frame cell now follows
      the source - 32 tall, as wide as its aspect wants - and the payload carries
      a matching display size. Cinema (298x112) goes from a 32x12 strip with
      transparent bands to an 85x32 cell filling a 28x74 box.
      Notes on the payload: it reads HEIGHT first then width, per ParseIcon in
      ClassicAPI's InlineTexture.cpp. A square still frame keeps its bare :28:28
      with no crop; anything else needs one to pick its cell out of the texture.
      Non-square cells stay single-column, since the animator derives its column
      count as imageWidth / frameWidth, which only holds when the cell tiles the
      texture width exactly. layout() also checks the 16:1 limit both ways now - a
      very wide sheet can bust it as easily as a tall one.
      --file decouples the texture basename from the trigger word, so a :token:
      emote is possible at all: ':Cinema:.tga' is not a legal filename.
    • 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.
    • Add HyperMpreg
      Single frame, so a plain 32x32 texture with no crop spec and no animation
      metadata. Listed in the Custom pack.
    • 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.
    • 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.
    • 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.
    • Warn instead of loading when ClassicAPI is missing
      The addon needs the ClassicAPI DLL - without it the inline |T markup the
      emotes are built from renders as literal text, title included. Move the
      real load order into TwitchEmotes_ClassicAPI.toc, which the DLL picks up
      in preference, and leave the base TOC loading nothing but CAPI_Warning.lua:
      a popup and a chat line pointing at the latest release, with the download
      URL in a preselected edit box. Its title drops the inline-texture markup
      for the same reason.
      Also list CreateFrame among the globals in .luarc.json.
    • 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.
    • Correct the payload form in the animator's header
      The crop args became left:right:top:bottom when frames gained columns; the
      comment still described the single-column 0:frameW form.
    • use brues-code/packager@vCAPI
    • 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.
    • 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.
    Downloads
  • v4 2e87a84450

    v4 Stable

    brues released this 2026-09-03 14:30:09 +00:00 | 29 commits to main since this release

    Twitch Emotes

    v4 (2026-09-03)

    Full Changelog Previous Releases

    • Added luarc and pkgmeta
    • Keep emote dropdown menus on screen
      ToggleDropDownMenu tests only the bottom and right edges, flips a list
      once and never re-measures, so a flipped page overflows the top instead,
      and its off-right test compares list coordinates against pixel widths so
      submenus flip leftward past the left edge. Clamp our own lists back
      inside the screen after it positions them.
    Downloads
  • v3 fdff71922e

    v3 Stable

    brues released this 2026-09-02 21:32:05 +00:00 | 31 commits to main since this release

    Twitch Emotes

    v3 (2026-09-02)

    Full Changelog Previous Releases

    • 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.
    Downloads
  • v2 197a1a1c4b

    v2 Stable

    brues released this 2026-09-01 01:43:19 +00:00 | 32 commits to main since this release

    Twitch Emotes

    v2 (2026-09-01)

    Full Changelog Previous Releases

    • unused
    Downloads
  • v1 706f17c470

    v1 Stable

    brues released this 2026-09-01 01:41:21 +00:00 | 33 commits to main since this release

    Twitch Emotes

    v1 (2026-09-01)

    Full Changelog Previous Releases

    • Dynamic version
    • big wigs
    • Initial commit
    Downloads