Skip to content

第十五部分 · 15.3 Buddy Pet System — BUDDY 旗标与 18 种宠物宇宙 ​

导航:← 15.2 Undercover · 15.4 反作弊 →


学习目标 ​

完成本节学习后,你应该能够:

  1. 解释 BUDDY Feature Flag 如何门控整个宠物子系统,以及它在 UI/状态行中的典型呈现位置(版本相关)。
  2. 枚举 18 种宠物角色:duck、goose、blob、cat、dragon、octopus、owl、penguin、turtle、snail、ghost、axolotl、capybara、cactus、robot、rabbit、mushroom、chonk。
  3. 复述 五档稀有度及基准概率:Common 60%、Uncommon 25%、Rare 10%、Epic 4%、Legendary 1%,以及独立 1%「闪光」层。
  4. 理解 以 userId 为种子的 Mulberry32 PRNG 如何实现跨会话稳定的宠物身份。
  5. 描述 五维属性 DEBUGGING / PATIENCE / CHAOS / WISDOM / SNARK 及稀有度对属性下限的约束意义。

生活类比:固定星座 versus 每日抽签 ​

把 Buddy 系统想象成「出生证上写死的守护动物」:

  • 不是你的心情每天抽一次盲盒,而是身份证号(userId)决定你终身对应的那个小生灵。
  • 稀有度像血统证书上的品级:传说级并不改变你写代码的能力,但影响文案趣味与属性条起点。
  • 闪光像 Pokémon 的异色:基础角色不变,多一层极低概率的视觉/标签修饰。

因此 Buddy 是确定性娱乐系统,不是竞技排行榜。


18 宠物角色速查表 ​

英文名中文昵称(教学)气质联想
duck小鸭划水但可爱
goose大鹅攻击性幽默
blob软泥情绪容器
cat猫高冷监工
dragon龙架构师脾气
octopus章鱼多线程触手
owl猫头鹰夜猫子 review
penguin企鹅冷静排队 debug
turtle龟慢速稳健
snail蜗牛渐进式交付
ghost幽灵隐式依赖猎手
axolotl美西螈再生力(重写模块)
capybara水豚情绪稳定
cactus仙人掌扎人的直评
robot机器人规则至上
rabbit兔子快速迭代
mushroom蘑菇在阴暗角落找 bug
chonk圆滚滚重量级 refactor

稀有度与概率(教学口径) ​

稀有度基准概率属性下限倾向(概念)
Common60%下限较低,方差小
Uncommon25%略抬升
Rare10%明显抬升
Epic4%高起步
Legendary1%顶配起点
Shiny(闪光)独立 1%(与上表正交叠加语义,教学模型)视觉层,不改变种子的主物种

说明:「独立 1% 闪光」在实现上可建模为二次掷骰或高位掩码;本节强调与主稀有度滚动分离的趣味层。


Mermaid:BUDDY 功能门控 ​


Mermaid:种子确定性管线 ​


源码片段:Mulberry32 与滚动(示意) ​

typescript
// mulberry32.ts(示意)
export function mulberry32(seed: number) {
  return function () {
    let t = (seed += 0x6d2b79f5);
    t = Math.imul(t ^ (t >>> 15), t | 1);
    t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
    return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
  };
}
typescript
// buddy-roll.ts(示意)
import { hashUserIdToSeed } from './hash';
import { mulberry32 } from './mulberry32';

export type Rarity = 'common' | 'uncommon' | 'rare' | 'epic' | 'legendary';

const SPECIES = [
  'duck',
  'goose',
  'blob',
  'cat',
  'dragon',
  'octopus',
  'owl',
  'penguin',
  'turtle',
  'snail',
  'ghost',
  'axolotl',
  'capybara',
  'cactus',
  'robot',
  'rabbit',
  'mushroom',
  'chonk',
] as const;

export function rollBuddy(userId: string) {
  const rng = mulberry32(hashUserIdToSeed(userId));
  const rarity = rollRarity(rng); // 60/25/10/4/1
  const speciesIndex = Math.floor(rng() * SPECIES.length);
  const species = SPECIES[speciesIndex];
  const shiny = rng() < 0.01; // 独立 1% 闪光
  const attrs = rollAttributes(rng, rarity);
  return { species, rarity, shiny, attrs };
}
typescript
// attributes.ts(示意)
export type BuddyAttrs = {
  debugging: number;
  patience: number;
  chaos: number;
  wisdom: number;
  snark: number;
};

const RARITY_FLOORS: Record<Rarity, number> = {
  common: 10,
  uncommon: 18,
  rare: 28,
  epic: 40,
  legendary: 55,
};

export function rollAttributes(
  rng: () => number,
  rarity: Rarity
): BuddyAttrs {
  const floor = RARITY_FLOORS[rarity];
  const pick = () => floor + Math.floor(rng() * (100 - floor));
  return {
    debugging: pick(),
    patience: pick(),
    chaos: pick(),
    wisdom: pick(),
    snark: pick(),
  };
}

五维属性与文案钩子 ​

属性含义(教学)UI 可能用法
DEBUGGING找 bug 积极性失败重试提示语气
PATIENCE对长任务的容忍进度条旁白
CHAOS随机玩梗频率彩蛋密度
WISDOM「架构师腔」浓度建议条风格
SNARK吐槽锋利度代码 smell 评论

外观系统预告(与 15.4 联动) ​

组件规模备注
眼睛样式6 种与种子派生索引
帽子8 种Common 稀有度无帽(教学口径)
闪光二元独立 1%

具体会话级重算防篡改逻辑见 15.4。


产品伦理与体验边界 ​

话题建议
儿童向?默认终端受众为开发者;仍应避免过度干扰主任务流。
付费墙?教学上视为纯客户端彩蛋,不与 API 配额挂钩。
隐私userId 仅客户端派生展示,不应上传敏感画像(以正式隐私政策为准)。

调试开关建议 ​

操作目的
固定测试 userId验证同一用户跨机器一致
切换 BUDDY off/on确认门控与降级路径
快照 UI回归眼睛/帽子贴图资源路径

常见问题 FAQ ​

问题回答方向
换账号会变吗?会,种子来自 userId。
能「刷」传说宠吗?确定性种子下不能靠重 Roll;除非换身份或实现变更。
宠物影响模型能力吗?不应影响;属娱乐与 UI。

小结 ​

  • BUDDY 门控一整个确定性宠物宇宙:18 物种 × 稀有度 × 独立闪光 × 外观组件。
  • Mulberry32(userId) 保证「你是谁,就养哪只」。
  • 五维属性服务文案与个性,稀有度主要抬升下限,不是 PVP 数值。

课后自测 ​

  1. 手写伪代码:给定固定 seed,连续调用 mulberry32 10 次,输出应可复现。
  2. 解释「闪光 1%」与「Legendary 1%」在概率论上的独立性含义。
  3. 列出 Common 无帽对 UI 资源组织的两点工程影响(条件渲染、资产打包)。

上一节:15.2 Undercover Mode
下一节:15.4 外观反作弊与会话重算

本项目仅用于教育学习目的。Claude Code 源码版权归 Anthropic, PBC 所有。