COC 480 购点角色卡
本 skill 是一个轻量操作指南:它不内置 Python 源码,而是指导 code agent 从 GitHub 获取并调用 coc-cardwright Python CLI。模型负责人物编辑、角色弧光、数值取向和背景写作;点数预算、本职技能、上限、衍生值和渲染必须交给 CLI 校验。
引擎仓库
先读取本目录的 ENGINE_REPO.txt 获取 Python CLI 仓库地址。默认是:
https://github.com/tanis90/coc-cardwright.git
如果 ENGINE_REPO.txt 不存在或仓库地址不可用,向用户确认仓库地址;不要猜一个新的 GitHub URL。
安装或复用 CLI
优先复用当前工作区已有的 coc-cardwright / coc_generator 项目。如果没有,就从 ENGINE_REPO.txt 指向的仓库 clone。
推荐放在当前工作区的工具目录,例如:
git clone <ENGINE_REPO> .coc-cardwright
python -m pip install -e .coc-cardwright
如果用户不希望全局安装,创建项目内虚拟环境再安装:
python -m venv .coc-cardwright-venv
.coc-cardwright-venv/Scripts/python -m pip install -e .coc-cardwright
Windows 也可以使用:
py -3 -m pip install -e .coc-cardwright
安装后优先调用 coc 命令;如果 PATH 没刷新或找不到 coc,进入仓库后用 Python 模块方式调用:
python -m coc_generator --help
CLI 能做什么
CLI 是本 skill 的规则入口。它能做四类事情:
jobs:列出所有可用中文职业名,返回 JSON 数组。job "<职业名>":查看某个职业的职业点公式、信用评级范围、本职技能和技能说明。verify <json>:校验角色 JSON,返回valid/errors/warnings/derived。这是生成角色卡前必须通过的步骤。render <json> -o <html>:在 JSON 校验通过后渲染双面 A4 可打印 HTML 角色卡,默认彩色模式。render <json> --style mono -o <html>:渲染纯黑白打印模式,适合低墨量或不需要彩色的打印场景。render <json> --blank-luck -o <html>:渲染时留空卡面幸运值,适合玩家现场掷幸运;JSON 仍然必须包含合法luck并通过校验。
不确定命令或参数时,先调用 CLI 自带 help,而不是猜参数:
coc --help
coc verify --help
coc render --help
coc job --help
如果 coc 不可用,就在 Python 仓库目录下调用:
python -m coc_generator --help
python -m coc_generator verify --help
python -m coc_generator render --help
python -m coc_generator job --help
常用例子:
coc jobs
coc job "私家侦探"
coc verify character.json
coc render character.json -o character_card.html
coc render character.json --style mono -o character_card_mono.html
coc render character.json --blank-luck -o character_card_blank_luck.html
角色编辑目标
一张好卡不是“职业 + 点数 + 背景段落”的拼接,而是一个可被玩家立刻拿去扮演的人。生成时先建立人物的内在张力,再把张力翻译成数值和卡面字段。
每张卡至少要有下面四层:
- 表层身份:他现在看起来是谁,靠什么谋生,别人如何称呼他。
- 欲望:他主动想得到什么,例如名誉、赎罪、真相、自由、家人的安全。
- 伤口或恐惧:他为什么会卡在原地,例如羞耻、亏欠、阶级焦虑、幸存者内疚、对失控的恐惧。
- 弧光问题:模组里最可能逼他回答的问题,例如“他会为了真相牺牲无辜者吗?”或“他能不能承认自己并不总是正确?”
写作要具体,避免泛泛的“冷静理性但内心善良”“背负神秘过去”“命运让他卷入事件”。每个重要设定都尽量落到可见物、具体人、具体地点、可扮演习惯或可检验的选择上。
苏格拉底式角色访谈
当用户只给出宽泛概念,或说“你来发挥”时,不要立刻写完整角色。先用苏格拉底式追问帮用户发现角色核心。每轮问 3 到 5 个短问题,问题要迫使用户做选择,而不是填写设定表。
提问顺序按编剧逻辑推进:
- 外在目标:角色现在想要什么?
- 内在缺口:他为什么非要这个不可?
- 错误信念:他一直相信什么,导致自己被困住?
- 关系压力:谁最能逼他暴露真实自我?
- 代价选择:他为了目标愿意牺牲什么,又绝不愿牺牲什么?
- 弧光问题:故事会逼他改变哪一个判断?
第一轮:抓住角色种子
用户概念很模糊时,优先问这些:
- 他现在最想保住、得到或证明的东西是什么?
- 他最害怕别人发现自己哪一点?
- 如果这张卡只服务一个调查风格,是偏向侦查、社交、战斗、学术、医疗、技术,还是生存?
- 你希望他在故事开始时更像“主动追索真相的人”,还是“被过去拖进事件的人”?
第二轮:制造内在矛盾
有了身份和目标后,追问矛盾:
- 他嘴上相信什么,但行动里经常背叛这个信念?
- 他最擅长的能力,曾经害过谁或让他失去过什么?
- 他会为了重要之人隐瞒真相吗?如果会,他会对自己怎么解释?
- 他最看不起哪类人?他自己身上是否也有一点这种特质?
第三轮:建立背面字段
背面字段比数值更影响扮演,要用问题把它们问出来:
important_person:谁的一句话最容易让他失去冷静?这个人对他有什么索取权?important_place:哪里一旦被毁、被卖掉或被污染,他会做出不理性的事?important_item:他身上哪件东西不是最贵的,却最不能丢?它证明了什么,也掩盖了什么?belief:他在危险时会用哪句话说服自己继续前进?trait:桌上玩家能反复演出来的小动作或习惯是什么?scar:哪次失败或伤害让他现在仍然付账?madness:压力到来时,他是控制、逃避、讨好、攻击、麻木,还是反复确认某件事?
第四轮:把弧光压成选择
在写卡前,用一个选择题确认弧光:
- 如果真相会伤害重要之人,他会公开真相、修改真相,还是毁掉证据?
- 如果宝贵之物被证明来自谎言,他会保留它、归还它,还是亲手毁掉它?
- 如果意义非凡之地藏着神话污染,他会保护地点、保护人、还是保护自己的名声?
- 如果他的强项失效,他会向队友求助,还是加倍使用旧方法?
提问方式
- 不要一次问超过 5 个问题。
- 用户回答少时,主动给 2 到 3 个可选方向,但保留用户自定义空间。
- 用户不想互动时,可以自问自答,但要在最终摘要中说明“我采用的角色核心是……”
- 每个问题都要能影响至少一个字段或数值;如果一个问题不会改变卡,就不要问。
数值与叙事对齐
先决定人物弧光,再决定数值,而不是先堆强项。属性和技能要成为人物的证据。
- 高 EDU/INT:说明他如何获得知识,以及知识带来的盲点。高智力不等于永远正确,可以表现为过度解释、无法信任直觉、习惯把人当问题处理。
- 高 POW:说明他靠什么信念撑住自己。信念越强,越要设计会动摇它的东西。
- 高 APP/信用评级:说明他在社会中如何被看见,也说明他害怕失去哪种体面。
- 高 DEX/STR/CON/SIZ:把身体优势写进职业、伤痕、习惯或战斗风格,不要让体能数值悬空。
- 低属性同样要有戏:低 STR 可能让他依赖工具和谈判;低 APP 可能让他习惯被低估;低 POW 可能让他在恐惧中发展出一套精密的回避策略。
- 职业技能体现“他靠什么吃饭”;兴趣技能体现“他真正把时间花在哪里”。两者之间的差异通常就是人物张力。
- 信用评级不是纯点数税。它要反映阶层、可支配资源、社交门槛和他面对权威时的底气。
- 武器、随身物品和资产要服务人物,不要只列通用装备。一个物件最好能同时说明职业、关系或心理防线。
如果数值和叙事冲突,优先修改其一,让它们对上。例如背景写“笨拙的书斋学者”,就不应给出毫无解释的高 DEX 和大量近战技能;如果确实需要高 DEX,就写清楚它来自装订、制图、外科、魔术或别的具体训练。
字段写作要求
角色卡里可写的部分默认都要填,不要留下空字符串、空数组或只有占位语的字段,除非用户明确要求空白卡。
必须完整写入:
basic:姓名、玩家、职业、年龄、性别、故乡、时代。玩家未知时用用户给出的称呼;仍未知可用“玩家”。weapons:至少给出与人物相符的一种攻击或自卫手段。非战斗角色也可以是手杖、小刀、拳击、随身工具;不要强塞不合身份的枪。items:写 5 到 8 件随身物品,每件都要像这个人会带的东西。assets:现金、消费水平、总资产、资产详情都要填,并与信用评级一致。friends:写 2 到 4 个联系人,最好包含至少一种可被 KP 使用的关系张力。experienced_modules:新角色可写“尚未经历正式模组”;老角色则写具体经历。background的 9 个字段全部要写:形象描述、思想与信念、重要之人、意义非凡之地、宝贵之物、特质、伤口与疤痕、精神症状、个人介绍。
背面字段是扮演引擎
背面的背景字段不是装饰文本,它们是玩家在桌上做选择的按钮。写这些字段时,优先考虑“玩家看见这一项后会怎么演”,而不是“这段话是否好看”。
每个关键背景项都要承担一个桌面功能:
belief思想与信念:给玩家一个做决定的原则。它必须能在危机中被挑战,例如“证词比血缘可靠”会在亲人撒谎时变成冲突。important_person重要之人:给 KP 一个可施压的关系。写清爱、亏欠、竞争、误解或控制,避免只写“很重要的朋友”。important_place意义非凡之地:给角色一个归属或软肋。地点应该能被污染、夺走、烧毁、出售或揭开秘密。important_item宝贵之物:给玩家一个可触摸的心理锚点。物件最好能在场景中被拿出、隐藏、交换、损坏或误认。trait特质:给玩家一个可重复表演的小动作、说话方式或决策偏好。它要能影响调查方式,而不只是形容词。scar伤口与疤痕:给角色一个过去仍在索债的痕迹。它可以是身体伤痕、职业污点、家庭裂痕、公开羞辱或失败案件。madness精神症状:给恐惧状态一个可演的表现。新角色不必已经疯狂,但要写出压力下的反应模式,例如失眠、洁癖式整理、反复确认门锁、听到某类声音时僵住。appearance形象描述:给其他玩家第一眼能抓住的表演线索,包括姿态、衣物磨损、说话停顿、随身气味、手部习惯。description个人介绍:把上述项目串成一个可跑团的人,而不是另写一份简历。
设计背面字段时先做“关系压力测试”:
- 如果重要之人出事、背叛或求助,角色会牺牲什么?
- 如果重要地点暴露神话痕迹,角色会保护它、毁掉它,还是逃避?
- 如果宝贵之物被证明来自谎言,角色会承认真相还是维护自我叙事?
- 如果信念与求生冲突,角色会坚持到什么程度?
- 如果特质在调查中制造麻烦,它会让队友怎么看他?
至少让 3 个背面字段彼此牵连,形成可玩的三角关系。例如:重要之人送的宝贵之物来自意义非凡之地,而伤疤正是为了保护那个人留下的。这样玩家每次触碰物件、回到地点或见到联系人,都会重新面对同一个弧光问题。
背面字段要反向约束数值:
- 重要之人是上流赞助人,信用评级、取悦/说服/心理学或资产应有所体现。
- 重要地点是图书馆、报社、诊所、码头、剧院、教堂或警局,职业和核心技能应能解释他为什么属于那里。
- 宝贵之物是武器、工具、病例、底片、账本、护符或旧钥匙时,对应技能、物品或调查钩子要出现。
- 伤疤来自暴力,就解释战斗技能、低 POW、谨慎特质或特定武器;伤疤来自失败案件,就解释法律、心理学、侦查、信用变化或联系人。
- 精神症状不能只写氛围,它要影响玩家如何调查、社交、逃跑、战斗或独处。
如果背面字段和数值冲突,不要只改文字糊过去。要么调整数值,要么写出冲突的合理来源,并把它变成弧光的一部分。
背景字段的质量标准:
appearance:写可被画出来的外观、姿态、衣着或小动作。belief:写能指导选择的信念,不写抽象口号。important_person:写清关系、亏欠或冲突。important_place:写为什么这个地方不能失去。important_item:写物件的来历和情感功能。trait:写可扮演的习惯或缺陷。scar:可以是身体伤疤,也可以是社会性伤口,但要具体。madness:新角色也要填,可写潜在压力反应或“尚无明确症状,但在……时会……”,不要空着。description:用一段 120 到 220 字的中文概述人物,交代身份、欲望、伤口、弧光问题和进入调查的钩子。
写作风格要克制、可扮演、带细节。不要把每个字段都写成小说独白;角色卡需要的是能被玩家和 KP 快速抓住的线索。
工作流程
- 收集或合理补全调查员概念:姓名、时代、职业、年龄、性格、背景和玩法定位。
- 信息不足时先做苏格拉底式角色访谈,每轮问 3 到 5 个能产生选择压力的问题;用户不想互动时才自问自答。
- 写一份简短的编辑提案:表层身份、欲望、伤口或恐惧、错误信念、弧光问题、背面字段三角关系、数值取向。除非用户只要机械生成,否则不要跳过这一步。
- 安装或定位
coc-cardwrightCLI,然后先跑coc --help确认命令可用。 - 选择职业时运行
coc jobs;分配职业点前运行coc job "<职业名>"查询职业公式、信用评级范围和本职技能。 - 把编辑提案翻译成属性、信用评级、职业技能、兴趣技能、武器、物品和资产。职业名和技能名必须使用 CLI 返回的中文名称,避免英文名或自造译名。
- 按下方结构起草 JSON 角色文件。所有可写字段都要填完整,并检查每个背景条目是否能回扣人物弧光。
- 运行
coc verify <json>。如果valid不是true,根据错误信息修改 JSON 后再次校验;修正数值时不要破坏已经建立的人物逻辑。 - 只有校验通过后才运行
coc render <json> -o <html>,生成双面 A4 可打印 HTML。默认用彩色模式;用户要求黑白、纯黑白、低墨量或适合普通打印机时,使用coc render <json> --style mono -o <html>;用户要求现场摇幸运、幸运留空或开局再掷幸运时,使用--blank-luck。用户明确要求两套时分别输出彩色和黑白两个 HTML。 - 回复用户时给出 JSON 路径、HTML 路径、渲染样式、人物弧光摘要、数值如何支撑人物,以及点数使用情况。
规则提醒
- 八项属性总和必须严格等于 480。
- 每项属性必须是 20 到 80 之间的整数。
- 幸运不计入 480 购点,范围为 15 到 90。
- 职业点只能投入该职业的本职技能,并且信用评级也计入职业点消耗。
- 兴趣点可以投入任意技能,但不能投入克苏鲁神话。
- 职业技能最终值不能超过 80。
- 兴趣技能最终值不能超过 60。
- 信用评级必须落在职业允许范围内。
- 克苏鲁神话不能通过正常分配点数提升。
这些提醒只是辅助记忆;最终规则以 coc verify 的结果为准。
JSON 结构
使用下面结构作为文件契约:
{
"basic": {
"name": "角色姓名",
"player": "玩家名",
"job": "职业名",
"age": 32,
"gender": "男",
"hometown": "故乡",
"era": "1920s"
},
"attributes": {
"str": 50,
"con": 50,
"dex": 60,
"app": 55,
"pow": 50,
"siz": 65,
"edu": 70,
"int": 80
},
"luck": 60,
"credit_rating": 25,
"skill_allocations": {
"pro": {},
"interest": {}
},
"weapons": [],
"items": [],
"assets": {
"cash": "",
"consumption": "",
"assets": "",
"items": ""
},
"mythos": 0,
"friends": "",
"experienced_modules": "",
"background": {
"appearance": "",
"belief": "",
"important_person": "",
"important_place": "",
"important_item": "",
"trait": "",
"scar": "",
"madness": "",
"description": ""
}
}
输出要求
用户要求生成角色卡时,默认在当前工作区创建文件;如果用户指定目录,则写入指定目录。文件名应清晰可读,例如 investigator.json 和 investigator_card.html。
如果用户只要角色数据,生成并校验 JSON 后即可停止;如果用户要求可打印角色卡,还要渲染 HTML。未指定样式时输出默认彩色 HTML;用户提到黑白打印、纯黑白、省墨、复印友好或普通激光打印机时,输出 --style mono 黑白 HTML;用户提到现场摇幸运、幸运留空、幸运开局再定时,渲染时加 --blank-luck,但 JSON 里的 luck 仍需合法以通过校验;用户要求“彩色和黑白都要”时,同一份 JSON 渲染两份 HTML。
验收清单
完成前逐项检查:
coc verify返回valid: true。- 可打印 HTML 的渲染样式符合用户要求:默认彩色,黑白需求使用
--style mono,双版本需求输出两份。 - 用户要求现场掷幸运时,HTML 使用
--blank-luck留空幸运;校验规则仍要求 JSON 中有合法luck。 - 角色卡中所有可写字段都已填充,没有无意义空白、模板占位或泛泛套话。
description能在一段内说明身份、欲望、伤口和弧光问题。- 至少 3 个数值选择能从背景中找到证据,例如高 EDU、低 POW、信用评级、核心技能或武器选择。
- 至少 3 个背景条目能从数值或物品中得到反证,例如宝贵之物、重要之人、伤疤、兴趣技能、资产详情。
- 职业技能像谋生方式,兴趣技能像私人执念,两者不要完全同质化。
- 物品、资产、联系人能给 KP 提供可用钩子。
- 人物有可以在模组中发生变化的问题,而不是已经完成的静态人设。