职业
小镇里的每一份工作,谁在做,以及它如何融入 Tick Pipeline。
职业不是"职业"——它是一个确定性时间表 + 行为原型的组合。
职业表(v1)
| 职业 | 人数 | 示例 NPC | 主要地点 | 时间表 |
|---|---|---|---|---|
| 面包师 | 1 | Anna Schmidt | 面包店 | 06:00–14:00 |
| 酒馆老板 | 1 | Sam O'Brien | 酒馆 | 14:00–01:00 |
| 咖啡馆老板 | 1 | Lila Wong | 咖啡馆 | 07:00–18:00 |
| 杂货店老板 | 1 | Henry Lawson | 杂货店 | 08:00–19:00 |
| 菜贩 | 1 | Maria Esposito | 市场 | 07:00–14:00 |
| 花贩 | 1 | Yuki Tanaka | 市场 | 07:00–14:00 |
| 鱼贩 | 1 | 老 Jack | 市场 | 07:00–14:00 |
| 药剂师 | 1 | Sarah Kim | 药房 | 09:00–18:00 |
| 主治医生 | 1 | Michael Chen | 医院 | 09:00–17:00 |
| 外科医生 | 1 | Aisha Patel | 医院 | 09:00–17:00 |
| 护士 | 2 | Daniel Park、Carla Reyes | 医院 | 轮班制 |
| 医院杂工 | 1 | Tom Whitfield | 医院 | 22:00–06:00 |
| 警官 | 2 | Ben Foster、Priya Singh | 警察局 | 轮班制 |
| 警长 | 1 | Joe Williams | 警察局 | 09:00–17:00 |
| 镇长 | 1 | Patricia Holloway | 镇公所 | 09:00–17:00 |
| 职员 | 1 | Robert Ng | 镇公所 | 09:00–17:00 |
| 牧师 | 1 | Marcus 神父 | 教堂 | 08:00–18:00 |
| 教师 | 1 | James Carter | 学校 | 08:00–15:00 |
| 校长 | 1 | Helen Walker | 学校 | 08:00–17:00 |
| 列车员 | 1 | Frank Miller | 火车站 | 06:00–18:00 |
| 退休(各色人等) | 6 | Eleanor、Margaret 等 | 家/小镇 | 松散 |
| 儿童(学生) | 5 | Tommy、Sophie 等 | 学校 | 08:00–15:00 |
总计:30 个 NPC。
职业如何驱动行为
职业不仅仅是"你在哪里上班"。它定义了:
1. 默认时间表
每个职业有一个工作窗口。窗口之外,NPC 可以自由做出自主决策(受性格约束)。
2. 需求优先级
不同职业关注不同的事情:
- 🍞 面包师 → 关注面粉库存、天气(下雨影响客流)
- 👮 警官 → 关注小镇安全、犯罪事件
- 🍻 酒馆老板 → 关注晚间客流、啤酒库存
- 👨⚕️ 医生 → 关注患者健康、医院容量
3. 话题
NPC 聊他们了解的事。医生聊患者,面包师聊面包,酒馆老板聊昨晚的闹腾人群。
4. 社交网络
某些职业会聚集在一起:
- 医院工作人员下班后扎堆
- 市场商贩为摊位位置争吵
- 夜班工人形成自己的社交圈
5. 日记风格
LLM 的 prompt 中包含 NPC 的职业作为上下文。这会微妙地影响日记风格——面包师写面粉,医生写患者。
轮班制
两个地点有轮班:
医院
- 白班: 09:00–17:00 —— Michael、Aisha、Sarah(兼职)
- 中班: 17:00–22:00 —— Daniel、Carla
- 夜班: 22:00–06:00 —— Tom,一名护士轮换
警察局
- 白班: 09:00–17:00 —— Joe + 一名警官
- 中班: 17:00–01:00 —— 一名警官
- 夜班: 01:00–09:00 —— 一名警官
轮班按每周确定性排定,确保 NPC 有稳定的日常。
儿童与非工作者
- 儿童(8-16 岁): 必须上学,08:00–15:00。其余时间自由支配。
- 退休人员: 没有固定时间表。白天在家、散步、去酒馆等。他们是涌现故事的主力军,因为时间完全自由。
多职 NPC
有一个 NPC —— Sarah Kim —— 同时在药房和医院工作。她的时间表把一天切成两段:
- 09:00–13:00 —— 药房
- 14:00–18:00 —— 医院
这种多地点工作在 v1 中很少见,但数据模型支持。
职业数据模型
ts
interface Profession {
id: string;
name: string;
defaultLocationId: string;
workWindows: TimeWindow[]; // when they're "supposed" to be at work
needPriorities: Record<NeedType, number>; // 0-1 weight
conversationTopics: string[];
socialAffinity: Record<ProfessionId, number>; // -1 to 1
diaryToneHints: string[];
}完整定义见运行时 NPC 数据库。