Back to Chat Toys

Chat Toys

One overlay. Follows, subs, and the other stream events either put an animated character on the bottom of the screen, toss an emote into a bouncing wall, or do both. A chat message puts a speech bubble on a walker who is already there. Chat can dress their own walker, and that look is kept for the next stream.

Setup

  1. In Streamer.bot, turn on the WebSocket Server. YouTube and Kick only arrive as Streamer.bot events, so those platforms have to be connected there.
  2. Open the customizer, copy the import string, then Streamer.bot → Actions → Import. The action is “ZeMaxi - Chat Toys”.
  3. Set the mode, platforms, lifetimes, and the toss reward. Click Generate and copy the overlay URL.
  4. In OBS, add a Browser Source at 1920×1080 with a transparent background. Paste the URL.
  5. Optional: add the dock URL as another browser source, or open it on a second screen.

Modes

The URL carries mode=walk, mode=wall, or mode=both.

Speech bubbles

A chat message puts a pixel speech bubble over that person’s walker when they are already on screen. The bubble follows them, jumps with them, starts small, and pops up to full size. Emotes in the line show as pictures, so “Hello there zemaxiCool” keeps the words and the emote. It stays for the number of seconds you set, then shrinks away. A newer message from the same person replaces it. Commands such as !skin do not get a bubble. Wall-only mode has no walkers, so it has no bubbles. Colours: white, sky, pink, gold, mint, lilac, and ink. White is the pixel bubble with a blue edge.

Chat commands

Each command can be turned off in the customizer. !jump is always accepted alongside whatever you type in the jump-command box. !colour works the same as !color.

The choice is stored on that person’s platform id inside the persisted global zmx.chat-toys.state, under looks. It survives the walker leaving and the overlay closing. A copy is also kept in this browser’s localStorage, and the two are merged, newest edit first. Nothing is sent to a database. Chat replies need the Streamer.bot websocket password, the same as the other tools. Turn replies off in the customizer if you want the change with no message.

Mods still clear the wall with !clearwall (or the command you set).

Skins and groups

The customizer lists skins in sections. Pixel Frog is the bundled cast. Higgsfield Originals is the ten characters made for this overlay (wizard, knight, robot, cat, astro, wisp, goo, bones, shroom, dragon), and further custom sheets go in that same group. A pack name under Pixel Frog (Pixel Adventure 1, Pixel Adventure 2, Kings and Pigs, Pirate Bomb, Treasure Hunters) is only a heading. Turn a whole group off, or one skin, and click Generate. !skin random and !walker random use whatever is still on. A look someone already saved keeps working when that skin is still on, including the original frog, dude, pink, and guy names. shroom is Shroom Kid. The Pixel Adventure 2 mushroom is mush.

Adding a sprite sheet

Skins are listed in sprites/manifest.json. Every sheet uses the manifest frame size, which is 32×32. A strip is a horizontal row of that many square cells, left to right, no padding between cells. The character faces right. The feet stand on the bottom row of the cell so every skin shares one floor line. walk is required. idle, jump, fall, and wave are optional and fall back to the walk strip. Put the files under sprites/, add the skin, and reload the overlay. Hats are separate images; the manifest lift value drops or raises one on the head. Art credits and licences are in CREDITS.md.

A custom Higgsfield sheet uses the same fields. group can be higgsfield or Higgsfield Originals. fps is per animation. The ten included sheets use idle at 2 fps (2 frames), walk at 10 fps (6 frames; Shroom Kid is 5 frames at 9 fps), jump as one frame, and wave at 4 fps (2 frames). Optional motion is float (a small bob above the ground while walking or idling; Wisp) or squash (alternate walk frames flatten, feet staying down; Goo). This is the whole entry:

{
  "id": "mio",
  "name": "Mio",
  "group": "higgsfield",
  "pack": "Higgsfield Originals",
  "aliases": ["mio"],
  "motion": "float",
  "animations": {
    "idle": {"file": "sprites/higgsfield/mio/idle.png", "frames": 8, "fps": 10},
    "walk": {"file": "sprites/higgsfield/mio/walk.png", "frames": 8, "fps": 12},
    "jump": {"file": "sprites/higgsfield/mio/jump.png", "frames": 1, "fps": 1},
    "fall": {"file": "sprites/higgsfield/mio/fall.png", "frames": 1, "fps": 1},
    "wave": {"file": "sprites/higgsfield/mio/wave.png", "frames": 6, "fps": 12}
  }
}

The group itself is already in the manifest:

{ "id": "higgsfield", "name": "Higgsfield Originals" }

Platforms

Choose All, one platform, or any pair. A Twitch simulcast that is not allowed to show other platforms on screen can be set to Twitch only. Walkers are the sprite characters, not profile photos. The wall still uses an emote from the message when there is one. Chat Toys does not call the Twitch API.

Events

Follows, subs, gift subs, Kick subs, Kicks, Super Chats, Super Stickers, Jewels, memberships, and Twitch channel-point or Kick reward redemptions. Each one can be turned off. A chat message does not spawn a toy. The toss command and the named reward still jump a walker when reward spawn is off.

Dock

Clear wall, pause spawn, and test toss. Pause stops new toys from events. Toys already on screen finish their lifetime. Test toss still jumps a walker so you can see the overlay without waiting for chat.

Where it is saved

The overlay and the dock share one persisted Streamer.bot global, zmx.chat-toys.state, written by the imported action with CPH.SetGlobalVar(..., true) and broadcast with CPH.WebsocketBroadcastJson. Walker looks live in that same global. You do not need a new import if “ZeMaxi - Chat Toys” is already there. Nothing is stored in an outside database. The customizer remembers the form in this browser only. That form is not the show.

Preview

The customizer preview uses ?preview=1. It does not connect to Streamer.bot. It keeps a demo cast walking and listens for the test buttons. Live overlays still despawn idle chatters on the timer you set. The real overlay shows “Streamer.bot disconnected” and hides that note after 5 seconds.