状态
状态分四组,下面全部是实时运行的,共用同一个舞台。在默认的 cute 脸下,每个状态有自己的眼型、嘴型和腮红,部分还带着特效(见表情);在线条脸模式下,每个状态会戴上 STATE_MOUTH 里对应的嘴形。
静息(Resting)
处理中(Attending)
情绪(Feeling)
提示(Signalling)
一个状态定义了什么
身体运动
一个 behaviour 每帧返回四个数——tilt、x、y、squash——由弹簧去追。因为平滑交给弹簧处理,behaviour 可以让目标值直接跳变而不会产生可见的突兀。
idle 最值得读:
三个频率互不相关的正弦波。由于周期永远对不齐,这段运动不存在可感知的循环——这正是一个角色在侧边栏里待十分钟仍然像活的、而不像一段循环 GIF 的原因。
脉冲
有些状态需要的是离散事件而非连续曲线。angry 每 1.8 到 3.2 秒踢一次竖直方向的弹簧,listening 会点头。它们直接给速度加值,而不是移动目标:
弹簧吸收这一下并自行收敛,产生的回弹感如果要用曲线手写会非常繁琐。
弹簧通道
所有连续量都是阻尼弹簧,以固定 120 Hz 子步积分,与显示器刷新率无关。
固定子步正是 144 Hz 与 60 Hz 显示器收敛到同一结果的原因。若直接用帧间隔积分,角色在高刷屏上会收敛得更快。
腰带状态在 cute 脸下的样子
在 eyes 和 line 脸下,有 16 个状态把身体交给腰带覆盖动效(STATE_BELT):身体先形变成圆,再收缩成核心,含义由围绕它运动的元素来说。在默认的 cute 脸下这样做会丢掉脸,所以它们不收缩身体:整个角色连同脸都留着,同样的含义改由身旁的特效来说(STATE_FX)——thinking 是升起的点,progress 是右上角逐渐填满的小进度条,writing 是一支铅笔。powering-down 让身体变暗,bouncing 让身体自己弹跳。
特效和情绪特效一样是时间的纯函数,随快照的 fx 字段交给渲染器,向量、像素、颜文字三个系列自动一致。cute 脸下 snapshot.belt 恒为 null。
腰带
eyes 和 line 脸用腰带画这些状态:身体被收成核心,腰带接管。过渡如何发生、每条腰带如何绘制,见腰带与粒子。下面的演示用 face="eyes" 让腰带本身可见。
腰带是时间的纯函数,内部不累积任何状态,因此可以在任意时刻暂停、拖动、恢复而依然正确——这正是能冻结上百个角色、恢复时又不失同步的原因。
总表
所有状态放在一张表里:轮播的眼型序列、嘴形、特效(cute 脸)或交出身体的腰带(eyes / line 脸)、能到达它的协议编号,以及一个通常与之搭配的 HUD 表盘。除最后一列外,每一列都在渲染时从引擎的表里读出;HUD 一列只是建议——表盘是宿主手里的数据,状态是智能体正在做的事,引擎有意让两者彼此独立。
静息
| 状态 | 眼睛 | 嘴 | 特效 | 编号 | HUD | |
|---|---|---|---|---|---|---|
idle空闲 | dot → dot → dot → dotLeft → dot → dotRight | none | — | 02 | — | |
sleeping睡眠 | curve | none | zz | 00 | clock | |
drowsy困倦 | curveSleepy → dotHalf → curveSleepy | none | zz | 0615 | — | |
bored无聊 | dotHalf → dotLeft → dotHalf → dotRight | flat | — | 04 | — | |
waking唤醒 | curve → dotHalf → dot | dot | — | 0107 | — | |
powering-down休眠中 | dot → dotHalf → curve | none | — | 41 | — |
处理中
| 状态 | 眼睛 | 嘴 | 特效 | 编号 | HUD | |
|---|---|---|---|---|---|---|
listening聆听 | dotLeft → dot → dotLeft | none | — | 3537 | — | |
thinking思考 | dotLook → dotUp → dotLook | flat | dots | 30 | context | |
searching搜索 | dotLeft → dotRight → dotUp → dot | dot | — | 40 | — | |
reading阅读 | dotLeft → dotRight | none | — | 42 | — | |
writing书写 | dotDown → dot | none | pencil | 43 | — | |
working工作 | dotDown → dot → dotDown | none | arc | 1632 | gauge | |
loading加载 | dot → dotLook | none | spinner | 0536 | — | |
progress进度 | dot | none | progress | 47 | progress | |
radar扫描 | dot → dotLeft → dotRight | none | ripple | 51 | — | |
orbit环绕 | dot → dotLook | none | orbit | 49 | — | |
dictating听写 | dotLeft → dot | o | waves | 46 | voice | |
uploading上传 | dotUp → dot | none | rise | 45 | sync | |
sending发送 | dot → arch | smile | send | 44 | — | |
receiving接收 | dotWide → dot | dot | fall | 31 | — | |
messaging消息 | dot → arch | cat | bubbles | 52 | notify | |
waiting等待 | dot → dotLeft → dot → dotRight | none | ellipsis | 48 | timer | |
spawning启动 | dotWide → dot | dot | gather | 08 | — | |
composing编排 | dotDown → dot | cat | — | 39 | — | |
dragging拖动 | dotRight → dot → dotRight | o | — | 09 | — |
情绪
| 状态 | 眼睛 | 嘴 | 特效 | 编号 | HUD | |
|---|---|---|---|---|---|---|
happy开心 | arch → archWide → arch | cat | heart | 10 | — | |
excited兴奋 | dotWide → archWide | grin | — | 22 | — | |
laughing大笑 | archWide → arch | laugh | — | 23 | — | |
playful顽皮 | arch → wink → archWide → dot | smirk | — | 24 | — | |
proud骄傲 | dotUp → arch | smile | sparkle | 19 | — | |
celebrate庆祝 | star → archWide → wink → arch | grin | sparkle | 2533 | kpi | |
bouncing弹跳 | arch → dotWide | smile | — | 26 | — | |
shy害羞 | dotDown → dotHalf | cat | — | 14 | — | |
sad难过 | sad | frown | tear | 12 | — | |
angry生气 | mad | frown | — | 21 | — | |
confused困惑 | dotSuspicious → dotLook → dotHalf | wavy | — | 1120 | — | |
suspicious怀疑 | dotSuspicious → dotHalf | flat | — | 18 | — | |
surprised惊讶 | dotWide | o | strokes | 13 | — | |
scared害怕 | dotWide → dotSmall | wavy | strokes | 17 | — | |
curious好奇 | dotWide → dotLeft → dotWide → dotRight | dot | — | 03 | — | |
humming哼歌 | curve → dotHalf → curve → dot | smile | — | 27 | — |
提示
| 状态 | 眼睛 | 嘴 | 特效 | 编号 | HUD | |
|---|---|---|---|---|---|---|
alerting警示 | dotWide → dot | o | bang | 34 | — | |
notifying通知 | dotWide → arch → dot | dot | — | 50 | notify | |
refusing拒绝 | cross → dotHalf | wavy | bang | 38 | — |
映射应用状态
大多数应用不会用这些词思考。两个辅助函数负责翻译。
| 工具 | 状态 |
|---|---|
search | searching |
web_search | searching |
grep | searching |
glob | searching |
browse | reading |
fetch | reading |
read_file | reading |
read | reading |
write_file | writing |
write | writing |
edit | writing |
str_replace | writing |
run | working |
shell | working |
bash | working |
terminal | working |
upload | uploading |
think | thinking |
plan | thinking |
ask | listening |
wait | waiting |
{ awaitingUser: true } | waiting |
{ running: true } | working |