Pawcast v0.1 · DRAFT

计票器

对标 MCAStar 的核心模块。5 种玩法引擎(Sticker Dance / Duel Dance / Multi-PK / Solo Stage / Freedom)+ 礼物绑定 + 互动投票 + 整场榜 + 单轮榜。所有挂件以 URL 形式输出到 OBS / Live Studio。

v0.1 · spec 5 种玩法 14 屏 + 6 弹窗
00 · PRESET

预设管理 · 12 个 Default 槽

每个预设独立保存一套完整玩法配置(玩法类型、主播、礼物绑定、挂件设置)。可在直播过程中无缝切换(开场 → PK1 → PK2 → Solo → 收尾)。预设和直播间双向绑定,切换直播间会自动加载该房间最近用过的预设。

Pawcast · Team Settingv0.1.0
直播间预设 · @link8_kr
Default 1Saved · 开场暖场
Default 2Collecting · PK 第 1 轮
Default 3Saved · PK 第 2 轮
Default 4Saved · Solo 阶段
Default 5Saved · 收尾福利
Default 6— 空
Default 7— 空
Default 8— 空
Default 9-12— 空

PK 第 1 轮

Default 2 · 玩法:Sticker Dance · 计票模式:Vote Recording

预设元数据

预设名(环节)
玩法
计票模式
💡 预设切换技巧:开播前把整场所有环节预设都准备好(开场 → PK 1 → PK 2 → Solo → 收尾)。直播过程中只需点一下左侧 rail 的下个预设,即可无缝切换玩法 + 重置计数。
最近修改:2026-05-02 21:14 ✓ 已自动保存
12 个预设槽每直播间最多 12 个预设。前 8 个高频使用,9-12 留给特殊场次(节日/活动)。命名建议按环节:开场 / PK1 / PK2 / Solo / 收尾福利 等,方便临场切换识别。
状态指示Saved(绿)= 已保存;Collecting(红 + 心跳)= 当前正在采集运行;空 = 未配置过。当前激活预设左侧有紫橙渐变竖条。
预设元数据预设名 + 玩法类型 + 计票模式三项决定本预设的全部运行规则。Vote Recording 启用计票(默认),Normal 仅展示送礼不计分。
复制 / 重命名 / 删除常见操作。复制场景:今晚的"PK 第 1 轮"和上周配置一样,从 Default 3 一键复制。重命名场景:把 Default 5 改名"圣诞特别"。
实现说明预设保存到 SQLite presets 表,按 (room_id, slot) 唯一索引。切换预设时主进程发 IPC 给挂件页面,挂件 reload URL(preset 参数变化)。所有预设变更自动保存,无显式保存按钮。
01 · STICKER DANCE

贴纸舞 · 配置态

主打玩法。N×M 网格(默认 6×3),每格绑定一个礼物 + 一段舞名标签。观众送对应礼物即点亮格子。支持 A/B 双页轮播 + 衰减机制 + Gameplay Gift(特殊礼物触发全屏特效)。

Pawcast · Team Setting / Sticker Dance · 配置v0.1.0

主播配置 (4/7)

1 🎮 Y Yoochan ⋮⋮
2 🍦 S Sian
3 🎵 R Rohan
4 🌹 Z Zero
5+ 添加主播
玩法触发礼物
🪄
Glow Stick
→ Group Dance · 300s
🌌
Galaxy
→ Confetti FX · 60s
网格大小
页数
RT (s)
对齐
Anim Icon
🎮42Yoochan
🍦18Sian
🎵07Rohan
🌹28Zero
🌟02Star Hit
💖14Heart Me
🪄01Glow Stick
🧁06Cupcake
衰减机制
无新礼物 25s 后该格归零
s
A/B 页轮播
A 页 5s → B 页 5s 自动切换
s
分数显示
互动投票(评论 + 点赞 → 票)
评论 1 条 = 5 点赞 100 个 = 1 冷却 3s 关键词匹配 on
主播 + 触发礼物每位主播绑定专属礼物(Yoochan → 🎮)。Glow Stick 等"玩法触发礼物"是特殊存在,送出后触发 Group Dance 全屏特效持续 300 秒,期间所有礼物加倍计入。
6×3 网格18 格,每格 1 个礼物 + 1 个标签。已填 9 格,剩余 9 格可继续添加。点击 + 弹出礼物选择器(按礼物价值排序)。
RT 倒计时本轮时长(默认 120s)。倒计时归零自动结算 + 开下一轮。0 = 不限时(手动 End)。
衰减机制对应单格在 25 秒内无新礼物 → 计数归零。鼓励观众持续送礼,避免一开局送完后场面冷下来。
A/B 双页轮播礼物多于 18 个时启用 B 页。挂件每 5 秒自动切换显示。适合大型团播 6+ 主播 + 多礼物种类。
互动投票内嵌展开后可配置评论 / 点赞兑换比例。默认 5 票/评论 + 1 票/100 赞 + 3s 冷却。
实现说明礼物 cell 用 React 渲染,订阅 WebSocket gift_event。每个事件触发对应 cell 的脉冲动画 + 数字增量动画(react-spring tween 0.4s)。衰减用 setTimeout 重置,每次新礼物刷新 timer。
01.2 · STICKER DANCE

贴纸舞 · 运行态(采集中)

点击 Start Collecting 后进入本态。Pawcast 主进程通过 WebSocket 接 TikTok WebCast 协议拉实时礼物事件,每个 cell 实时跳数 + 触发脉冲动画。底部 actionbar 显示已采集时长 + 状态 + Stop 按钮。

Pawcast · Home Page · Sticker Dance Runningv0.1.0
Default 2 · PK 第 1 轮 · Sticker Dance RT 01:38 normal

A 页 · 本轮分数

总票数 2,184 已采集 02:14 / 共 04:00
🎮240Yoochan
🍦86Sian
🎵42Rohan
🌹156Zero
🌟12Star Hit
💖784Heart Me
🪄3Glow Stick
🧁28Cupcake
🪄
Group Dance 触发中 · @kawaii_jin 送出 Glow Stick · 剩余 02:18
×2 加倍
Gift Data Member Rankings User Rankings
礼物送礼者×
🎮 Joystick@taro_pop×242,400
🌹 Rose@silent_fan_42×156156
💖 Heart Me@uchan_×680680
🍦 Ice Cream@mochi_88×86860
🌌 Galaxy@taro_pop×11,000
🪄 Glow Stick@kawaii_jin×3300
显示 6 / 共 87 条 · 滚动加载更多
LIVE · 8.4k
已采集 02:14:32 connected · 128ms
状态条顶部条显示当前预设 + 玩法 + 倒计时 + 状态 pill。倒计时 ≤ 10s 时变橙色 + 微脉冲。
实时礼物 cell有新礼物的 cell 边框红色 + 内发光(class .live)。脉冲动画 0.4s 一次。数字字体增大到 14px 突出显示。
Group Dance BannerGlow Stick 触发期间顶部 banner 显示触发用户 + 倒计时 + 加倍标签。期间所有礼物 ×2 计入。
右侧数据视图Gift Data / Member Rankings / User Rankings 三 Tab。按礼物视图查看每条送礼记录,按主播视图查看主播票数榜,按用户视图查看送礼者贡献榜。
底部状态左:采集账号 + 直播间状态。中:累计采集时长 + 连接状态 + WS 延迟。右:暂停 / 停止 操作。
实现说明右侧表格用虚拟滚动(react-window),支持 1 万条数据无卡顿。每个 gift_event 通过 IPC 推到渲染层 → zustand store → 表格自动 re-render。Group Dance trigger 用 setInterval 每秒更新倒计时。
02 · DUEL DANCE

攻守擂 · 配置态

守 vs 攻,1v1 PK,胜者连胜留场,负者下台。判定模式:守方优先 / 攻方优先 / 允许平局。礼物按比例分配或胜者全得。中线特效 + 满屏特效随分差强度变化。

Pawcast · Team Setting / Duel Dance · 配置v0.1.0

Cast Setting

1🌹Doe
2🐱Joe
3Mee

PK Rules

判定模式
礼物分配

Workstation

Round Time
1 Gift Binding Mode
ExGift Follow(礼物跟随主播)
连胜被打断时救场动画

Display Elements

Skin · 视觉皮肤

4 种
MCA
Dark
Fire
Frost

Effects

中线样式 Divider
Indent Up%
Indent Down%
满屏特效(分差悬殊触发)

礼物分配

Defender 守 🌹💖
Attacker 攻 🐱🪐
判定模式守方优先(默认):观众心理预期是"挑战者要明显赢才行"。攻方优先适合鼓励观众下注挑战者。允许平局会让某些场次过于胶着。
礼物分配按比例 = 双方都加票,赢家加得多(推荐,体感公平)。胜者全得 = 输家归零,戏剧效果强但容易让小金额送礼者觉得"白送了"。
1 Gift Binding Mode启用单礼物绑定 — 观众首次送出代表礼物即建立用户绑定,后续所有礼物自动归该方。
ExGift Follow主播切换上场时,绑定到该主播的用户也跟着上场。让"老粉跟人不跟战队"。
Skin 视觉4 种内置:MCA(兼容老用户)/ Dark(克制)/ Fire(火热)/ Frost(清冷)。后续 v0.3 开放 CSS 注入自定义。
Effects 中线守方与攻方之间的分隔线样式 + 上下缩进 0-49%。Indent 控制中线在画面中的高度。
实现说明本配置面板纯 React 表单,所有字段双向绑定到 zustand store。改任何值实时通过 WebSocket 推送到挂件页面 hot-reload,OBS 端无需重新加载源即可生效。
02.2 · DUEL DANCE

攻守擂 · 运行态

主持点 Ready 显示候选 → Start 开始本轮 → 双方进度条实时跳动 → 倒计时归零或主持点 End 结算 → 自动开下一轮(胜者留场)。

Pawcast · Home Page · Duel Dance Runningv0.1.0
Default 1 · Duel Dance 第 6 轮 · RT 00:23

Operation Area

Wins x2 · x0 · 守方连胜 2 轮
🌹Doe
Round 6
Joe🐱
12,840 差 1,080 · ↗ 攻方反超 13,920
登场顺序(拖动调整)
1🌹Doe (守)2 胜本轮中
2🐱Joe (攻)0 胜本轮中
3Mee1 胜⋮⋮
候补 Standby
🌟Ace0 胜 · 待登台
Round Data Ranking Top Users
Defender · Doe12,840
🌹 Rose×1421,420
💖 Heart Me×980980
🌌 Galaxy×33,000
🎂 Cake×247,440
Attacker · Joe13,920
🐱 Cat×199
💐 Bouquet×8800
🪐 Planet×66,000
🎁 Gift Box×177,021

未分配 (待手动绑定)

7 笔
? @silent_fan_42 🌹 Rose ×3
? @mochi.cat 💖 Heart Me ×120
? @oneshot 🎵 TikTok ×1

本场总数据

守方礼物
2
攻方礼物
0
未分配
24
送礼者
18
已采集 00:22:14 normal
状态机Stand by → Ready (候选公示) → Start (本轮开始) → Running (进行中) → End (结束本轮) → 自动开下一轮(胜者留场,下家上)。
双色进度条守方 Cyan 蓝 → 攻方 Magenta 粉。中间数字显示分差 + 趋势箭头(↗ 攻方反超 / ↘ 守方拉开)。
登场顺序左侧条带(Cyan)= 守方 / Magenta = 攻方 / 无 = 候补。可拖动调整下场顺序。手动调整会暂停连胜计算(避免人为操控)。
未分配处理送礼者还没绑定到守 / 攻任一方时进未分配。主持快速点"分给守 / 分给攻"完成手动归属。每条记录独立操作,避免误判。
救场机制守方连胜 ≥3 时被打断,开启全屏"救场动画"(紫橙光波 + 鼓点)让观众情绪重置,然后开下一轮。
实现说明双色进度条的宽度计算:left% = score_left / (score_left + score_right) × 100。每 200ms 平滑动画到目标位置。倒计时用 RAF 循环每秒更新。所有状态变更(Ready→Start→End)通过 IPC 广播给挂件页面同步刷新。
03 · MULTI-PK

多人 PK · 配置 + 运行

3-5 主播同时登台。多色进度条横向并列。≥4 人时自动隐藏头像/昵称简化布局。候补区可拖拽换人。

Pawcast · Multi-PKv0.1.0

3 Players · Round 2

collecting RT 02:14
かれんじゃん 38,420
ももじゃん 42,180
みかじゃん 11,200
候补区 Standby
あちゃん ⋮⋮
+ 加候补
配置 / Configuration
玩家数
Round Time
Layout Rules
头像/昵称隐藏阈值
玩家 ≥ 人时简化
Display Elements
3-5 人3 人布局最舒展(每条 33%)。4-5 人会自动隐藏头像/昵称腾出空间。Multi-PK 适合"大乱斗"场次,比 Duel 戏剧化稍弱但参与感强。
每人独立颜色3 种主色:粉 / 青 / 橙。4-5 人时增加紫 / 绿。颜色和主播绑定,下场再上来仍是同色(视觉一致性)。
候补区支持任意数量候补。轮次结束时主持手动选下一组上场(也可设自动按胜率轮换)。
头像隐藏阈值≥4 人自动简化(默认)。某些屏幕分辨率较低时可改为 ≥3 也隐藏。
实现3-5 进度条 grid 布局自适应。每条进度宽度 = score / total × 100%。新礼物到来 0.4s 缓动到目标位置。颜色用 oklch 色空间确保色差均匀。
04 · SOLO STAGE

Solo 舞台 · 配置 + 运行

单人轮换上台。Stage 子模式:明确分阶段目标(如 10000 / 30000 / 60000),达成进入下一阶段。Free 子模式:颜色阶段反映分数(无明确终点)。Fever Time 加成。

Pawcast · Solo Stagev0.1.0

Solo · Stage Mode · Yoochan 在台

Stage 2 / 4 02:48 倒计时
Stage 1 · 阶段目标 10,000 ✓ 已达成 12,840
Stage 2 · 阶段目标 30,000 22,180 / 30,000 · 73.9%
Stage 3 · 阶段目标 60,000 — 待解锁
Final Stage · 终极目标 100,000 + Fever Time — 待解锁
💡 Fever Time:Final Stage 达成后开启 120 秒额外冲刺时段,期间所有礼物 ×3 计入。Yoochan 当前距离最终目标还需 77,820
Solo Stage 配置
子模式
阶段目标 Stages
1
2
3
F
Fever Time
达成最终目标后冲刺 120s
10s 倒计时自动触发
RT 剩余 10s 时挂件浮起紧迫提示
用户头像特效阈值
单礼物 ≥ 金币
触发该用户头像放大特效
多阶段进度从下到上叠加(已达成 / 进行中 / 待解锁)。每个 Stage 一条独立进度条,已达成的常亮(紫橙渐变),进行中的有 shimmer 动画。
Stage Mode主播一上台目标明确,观众有"奔向下一阶段"的方向感。每达成一阶段挂件触发庆祝动画(confetti + 鼓点),刺激持续送礼。
Final Stage + Fever Time终极目标特殊样式(橙色边框 + 高度更大)。达成后自动进入 120 秒 Fever Time,期间礼物 ×3 计入。这是 Solo 场次的高潮。
10s 倒计时剩余 10 秒时挂件浮起紧迫提示(橙色脉冲 + 倒数数字)。让观众在最后 10 秒疯狂送礼推过阈值。
用户头像特效单礼物 ≥ 5000 金币时触发该送礼者头像放大 3 秒 + 紫橙光环。强化"大佬刷礼物"的视觉冲击。
实现阶段切换用 react-spring 做平滑过渡。Fever Time 用单独 useEffect 计时器,期间所有 gift_event handler 把 score *= 3 后再写入 store。
05 · FREEDOM

Freedom · 自由模式

最简规则。单主播轮换,所有礼物直接计票。可选目标分数 / 无目标。适合新团首播 / 暖场 / 不需要复杂玩法的场次。

Pawcast · Freedomv0.1.0
Y

Yoochan

Solo on stage · 04:32 已用
RT 02:28
目标 30,000 19,420 / 30,000
64.7%

本轮礼物 (最近 5 笔)

🌌 Galaxy@taro_pop×11,000
🌹 Rose@silent_fan_42×120120
💖 Heart Me@uni_fan×500500
🎂 Cake@kawaii_jin×82,480
🍦 Ice Cream@mochi_88×24240
Freedom 配置
目标分数
达成后倒计时是否继续
是 · 允许超额
每位主播时长
轮换方式
极简设计没有 PK 战、没有阵列、没有阶段。只有一位主播 + 一条进度条 + 一个目标。视觉冲击力最弱但理解成本零。
无目标模式不设目标分数 → 进度条变为单纯计票(不显示百分比)。适合"看每位主播能拿多少"的暖场场次。
达成后继续达成目标 30,000 后,倒计时不结束 → 继续累计礼物 → 显示超额(如 124%)。让送礼观众有"我推动了超额完成"的成就感。
实现Freedom 共用 Sticker Dance 的 ScoringEngine,仅 UI 层不同(一条进度条代替网格)。代码复用率 ~80%。
06 · MODALS

关键弹窗 · Modals

所有计票器场景下的关键弹窗。设计上倾向"内嵌式抽屉" + "modal-card 浮层"两种风格搭配。

团员库跨预设共享的主播库。同一位主播只需配置一次(昵称 + TikTok @ + 专属礼物 + 头像),所有预设引用同一份。
分组筛选"核心 / 候补 / 新人"分组方便大型团队管理。可在创建主播时打标签。
实现团员库存到 broadcasters 表(status: signed)。预设只引用 broadcaster_id,不复制数据。改昵称时所有预设自动更新。
Special Gift玩法触发礼物 ≠ 普通绑定礼物。送出后触发全屏特效 + 期间礼物加倍。挂件页面会全屏播一段动画。
×2 加倍常用 ×2(适度刺激)。×3 仅推荐 Solo 阶段 Final + Fever Time 联用。
4 种特效素材SPEED 1-4 视觉风格递进。后续 v0.3 开放上传自定义。
实现挂件 WS 收到 gameplay_gift_triggered 事件后调用专属 fullscreen FX 组件,挂件 main loop 暂停 300s 倒计时显示。
未分配场景观众送出非"代表礼物"且未建立绑定时进未分配池。主持点击逐条手动分配,避免误判。
建立绑定 vs 仅本次建立绑定让该用户后续所有礼物自动归该方(一劳永逸)。仅本次适合"观众明显站错队"的场景(送对方礼物送错了)。
实现建立绑定 = 写入 user_bindings 表 + 这次礼物归属。仅本次 = 仅写这次礼物归属。两种都更新 gift_events.bound_to + binding_type 字段。
本地端口17777 是默认本地端口。挂件通过 WebSocket 连主进程,OBS 加载挂件 URL 实际是同机内通信。
不要手动改URL 含 preset / ws / skin 等参数,主进程靠这些参数路由数据流。改了就失联。建议用 OBS 的 source size 控件调整大小,不动 URL。
实现主进程内嵌 Hono on Bun,启动时 listen 17777,serve 挂件 HTML + 提供 WS endpoint。挂件页面是构建好的静态资源。