diff options
| -rw-r--r-- | .gitignore | 8 | ||||
| -rw-r--r-- | README.md | 8 | ||||
| -rw-r--r-- | docs/design/living-village-design.md | 85 | ||||
| -rw-r--r-- | opencode.json | 60 |
4 files changed, 161 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e42919b --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +bin/ +obj/ +.vs/ +.idea/ +*.user +artifacts/ +TestResults/ +*.DotSettings.user diff --git a/README.md b/README.md new file mode 100644 index 0000000..414bda1 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# Living Village 《活着的村庄》 + +NPC 社会涌现沙盘:扮演村庄 30 人中的一员过日子,底层是完整模拟的 NPC 社会。 + +- 设计文档:`docs/design/living-village-design.md` +- 技术栈:F# + MonoGame + Mibo(MVU) +- 开发协议:全部编码由 OpenCode 执行(ark-plan/glm-5.3-flash);Hermes 只做需求派发与验收 +- 里程碑 M0-M6 见设计文档第六节 diff --git a/docs/design/living-village-design.md b/docs/design/living-village-design.md new file mode 100644 index 0000000..04c8cc0 --- /dev/null +++ b/docs/design/living-village-design.md @@ -0,0 +1,85 @@ +# 《活着的村庄》设计文档(暂名 Living Village) + +日期:2026-09-18 状态:设计已逐节过目确认 开发:OpenCode(模型 ark-plan/glm-5.3-flash) Hermes:需求派发+验收 + +## 一、定位 + +NPC 社会涌现沙盘。设计顺序与常规游戏相反:先造模拟,玩法从观察中长出,设计者也不知道会长出什么。 + +- 核心体验:系统涌现(玩家体验排第二) +- 模拟原子:单个 NPC(完整心智,非统计模拟) +- 玩家角色:化身,扮演村庄 30 人中的一员 +- 核心循环:生活流(吃饭、干活、闲逛、串门),无任务无成就 +- 规模:约 30 个完整 NPC,彼此全认识 +- 时间:连续流,可暂停可加速(1x/2x/5x) +- 失败条件:无。化身不死,纯沙盘 +- 终点:完整独立游戏,发 Steam。demo 先验证涌现 + +商业风险备案:无失败纯沙盘 + 商业发售是独立游戏最难卖组合。对策:NPC 社会历史会积累(老 NPC 死去、新一代长大、村庄形态漂移),"看五十年后的村子"本身是长线理由。demo 阶段不处理。 + +## 二、模拟器内核 + +- 纯函数核心:`step : World → TimeStep → World`,World 不可变,持久化数据结构。渲染层只读 +- 事件驱动涟漪:NPC 交互产生事件(交易/争吵/闲聊),事件队列按时间戳回放给相关 NPC 更新记忆。谣言、关系、物价全部由事件派生 +- 固定步长 60 tick/秒 + 渲染插值;暂停 = 停 step 不停渲染 +- 存档 = 序列化 World。未来功能:回放、时光倒流 +- 确定性:可播种 RNG,同存档同操作必同结果 +- 模拟与渲染完全分离,内核可 headless 运行 + +## 三、NPC 心智模型 + +Mind 四层: + +- 需求层(驱动):饥饿/精力/社交/金钱,随时间衰减产生目标 +- 性格层(滤镜):5 维向量(进取/好斗/外向/诚实/贪婪,0-1)。性格改手段选择权重,不改目标。重大事件可长期漂移 +- 记忆层:事件列表(对象、类型、情绪值、时间),带衰减,检索取最近最重 +- 决策层:每 tick 评估 需求×行动×性格权重 → 最高分行动。行动是通用原语(去某地/做某事/与某人互动) + +**化身对 NPC 透明**:NPC 眼里没有玩家,化身是普通 NPC,干预走完全相同的代码路径。 + +派生系统(不单独建模): + +- 关系网:30×30 矩阵,从记忆加权派生 +- 谣言:闲聊传递最新鲜记忆,传播即再叙述 +- 经济:无全局物价。价格 = 交易时按需求紧迫度+性格+近期成交记忆现场喊出,物价是统计结果 + +刻意不做:对话语义生成(闲聊产出抽象事件+气泡图标)、职业/阶层系统(从需求与技能自发生长)、独立情绪状态机。 + +核心断言:行为 = 需求×性格×记忆,其余一切是副产品。 + +## 四、玩家交互 + +- 操控:WASD 移动、E 互动、Tab 需求面板。化身需求与 NPC 同规则衰减 +- 唯一信息优势:按 Q 观察,看视野内 NPC 的需求排名与最近记忆摘要 +- 对话:选意图不选台词。4-6 个动词(闲聊/求助/交易/玩笑/道歉/挑衅),NPC 回应由心智算出,产出事件进双方记忆 +- 生活流支撑:家(可升级)、物品、钱。无任务系统。村庄年鉴自动记录大事(结仇/结亲/死亡/新生/物价剧变) +- 社会学视图:暂停后全村缩放,关系网连线(粗细=强度)、谣言传播路径回放。demo 必须有简版 + +## 五、渲染与美术 + +- 2D 俯视瓦片地图,SpriteBatch 直绘,32×32 瓦片 +- demo 用 Kenney CC 资产包占位,正式版再定风格 +- 镜头跟随化身,滚轮缩放;昼夜季节光照 +- UI 五件套:时钟、需求面板、对话转盘、年鉴、社会学视图 + +## 六、技术栈与里程碑 + +栈:F# + MonoGame + Mibo(MVU/Elmish 架构,`update : State → Input → State`)。Linux 为第一开发平台。 + +| 里程碑 | 内容 | 验收 | +|---|---|---| +| M0 | F# 解决方案+游戏循环+瓦片地图+化身移动 | Linux dotnet run,60fps | +| M1 | World+step 纯函数+确定性 RNG,headless | 1000 天内存平稳、无 NaN、同种子逐帧一致 | +| M2 | 单 NPC:需求+决策+日程 | 游戏内活一天,行为可用需求×性格解释 | +| M3 | 30 NPC+事件队列+记忆+关系网+社会学视图 v1 | headless 30 天关系矩阵非均匀分布 | +| M4 | 现场喊价交易+闲聊传记忆 | 物价时间序列有波动;谣言 2-5 天传遍全村且路径可回放 | +| M5 | 玩家操控+对话转盘+Q 观察+年鉴 | 干预涟漪经 3 手绕回,事件链可追溯 | +| M6 | 存档+变速+昼夜+占位美术统一 | 完整玩 2 小时不崩,存档往返一致 | + +验收协议:M3 起涌现类验收一律 headless 批量模拟(50 世界×100 天)看统计分布,不靠肉眼。 + +## 七、开发协议 + +- 全部编码由 OpenCode 执行(dev.somhairle.bid 会话可见),模型 `ark-plan/glm-5.3-flash` +- Hermes 只做:需求拆解、派发、监控、独立验收(跑 headless 统计、对设计目标核对) +- 每里程碑一次派发,附本节验收标准;验收不过退回重做,不合并 diff --git a/opencode.json b/opencode.json new file mode 100644 index 0000000..7d8f9dc --- /dev/null +++ b/opencode.json @@ -0,0 +1,60 @@ +{ + "$schema": "https://opencode.ai/config.json", + "model": "ark-plan/glm-5.3-flash", + "small_model": "ark-plan/glm-5.3-flash", + "enabled_providers": [ + "strategy-go", + "ark-plan" + ], + "share": "disabled", + "autoupdate": false, + "provider": { + "strategy-go": { + "npm": "@ai-sdk/openai-compatible", + "name": "OpenCode Go (Hermes credential)", + "options": { + "baseURL": "https://opencode.ai/zen/go/v1", + "apiKey": "{env:OPENCODE_GO_API_KEY}" + }, + "models": { + "glm-5.3-flash": { + "name": "GLM-5.3-Flash", + "tool_call": true, + "limit": { + "context": 1000000, + "input": 1000000, + "output": 16000 + } + } + } + }, + "ark-plan": { + "npm": "@ai-sdk/openai-compatible", + "name": "Volcano Ark Coding Plan", + "options": { + "baseURL": "https://ark.cn-beijing.volces.com/api/plan/v3", + "apiKey": "{env:ARK_PLAN_API_KEY}" + }, + "models": { + "glm-5.3-flash": { + "name": "GLM-5.3-Flash (Ark Plan)", + "tool_call": true, + "limit": { + "context": 262144, + "input": 262144, + "output": 32000 + } + } + } + } + }, + "compaction": { + "auto": true, + "prune": true, + "reserved": 192000 + }, + "permission": { + "*": "allow", + "external_directory": "deny" + } +} |
