summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore8
-rw-r--r--README.md8
-rw-r--r--docs/design/living-village-design.md85
-rw-r--r--opencode.json60
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"
+ }
+}