一个云端永生的模拟世界:一粒种子生成的确定性宇宙,在服务器上 7×24 不停演化,你透过「上帝之眼」俯瞰它、窥视其中一个个体的一生、拖动历史长河回望任意纪元,而它又与真实地球血脉相连。
这个项目把「用代码创造世界」的三种读法焊成了一个整体:
- ⚙️ 模拟核心(The Kernel) —— 纯逻辑的世界引擎:时间、空间、实体、规则、因果。
- 👁 上帝视角(The Observer) —— Three.js 3D 俯瞰,不干预、只观察与回望。
- 🌍 章节式创世(The Journey) —— 世界不是一次做完的,而是按章节逐步「创世」,仓库的提交史就是这个世界的创世纪。
┌─────────────────────────────────────────────┐
│ 👁 上帝视角层 · apps/client │
│ Three.js 3D 俯瞰 · React HUD · 历史长河 · 神谕 │
├─────────────────────────────────────────────┤
│ 📜 神谕协议 · packages/protocol │
│ 服务器 ⇄ 客户端的全部类型化消息契约 │
├─────────────────────────────────────────────┤
│ 🌍 永生世界宿主 · apps/server │
│ 7×24 权威演化 · SQLite 持久化 · WebSocket 广播 │
├─────────────────────────────────────────────┤
│ ⚙️ 世界引擎 · packages/engine │
│ 确定性模拟核心(零环境依赖,可跑在任何地方) │
└─────────────────────────────────────────────┘
- 种子即世界:地形永不通过网络传输——只传创世种子,客户端用同一份引擎确定性重建大地。
- 服务器权威:世界在服务器上演化,浏览器关掉,它照样活着;重新连上只是接回「上帝之眼」。
- 确定性内核:同一粒种子必产出逐比特一致的世界,由 Vitest 守护。外部输入(神谕)是显式的旁路层,默认偏置为 0,不破坏这一契约。
- 永生演化 + 持久化:世界状态(元信息、生命快照、部落、编年史、逐年统计)落进 SQLite,进程重启后从沉睡中醒来,历史一笔不丢。
| 章 | 名称 | 这一章让世界拥有了…… |
|---|---|---|
| 0 | 虚空 | 世界引擎:tick 时序、ECS 实体、编年史、种子随机 |
| 1 | 大地 | 单纯形噪声 + 域扭曲的程序化地形,海拔/湿度划分生物群系 |
| 2 | 气候 | 历法四季、暖流曲线、纬度×海拔×季节的温度场 |
| 3 | 生命 | 植被场:随气候生长、随严冬凋零、被啃食 |
| 4 | 走兽 | SoA 存储的食草兽 / 掠食者,觅食·狩猎·繁衍·灭绝(logistic 软上限 + 拯救效应稳定生态) |
| 5 | 演化 | 基因(敏捷/感知/体型)遗传与突变,自然选择雕刻物种,基因色彩可见 |
| 6 | 智人 | 有记忆与目标的智能体:找水/觅食/逃离状态机;点选追随一个个体的一生 |
| 7 | 部落 | 相邻智人聚成部落、划分领地、共享记忆(一人发现水源全族皆知)、离群另立 |
| 8 | 文明 | 部落定居、开垦农田、积攒存粮度荒、沿技术树点亮 用火→农耕→制陶→建筑→文字 |
| 9 | 历史 | 可缩放、可拖拽、可回望的「历史长河」时间轴,分类里程碑事件标注 |
| 10 | 神谕 | 把现实地球的真实天气与地震注入模拟世界,接上一根通往现实的脐带 |
全栈 TypeScript · npm workspaces Monorepo
| 层 | 技术 |
|---|---|
世界引擎 @ctw/engine |
纯 TypeScript,零环境依赖;Vitest 测试 |
协议 @ctw/protocol |
共享类型化消息契约 |
服务器 @ctw/server |
Fastify · ws(WebSocket)· Node 内置 node:sqlite |
客户端 @ctw/client |
Three.js · React 18 · Zustand · Vite |
运行环境:Node.js 22+(需内置 node:sqlite)、TypeScript 5.6。
# 安装依赖
npm install
# 同时启动「永生世界」与「上帝之眼」
npm run dev- 世界宿主(服务器):
http://localhost:8422 - 上帝之眼(客户端):
http://localhost:5173(若端口被占用,Vite 会自动顺延到 5174/5175,看终端输出)
也可分开启动:
npm run dev:server # 只启动世界宿主
npm run dev:client # 只启动上帝之眼其他脚本:
npm test # 引擎确定性 / 生态 / 演化 / 文明 / 神谕 测试(Vitest)
npm run typecheck # 全工作区类型检查打开上帝之眼后:
- 拖拽平移镜头,右键拖拽旋转,滚轮俯冲缩放,◎ 一键归位。
- 悬停任意地块 → 窥视其群系、海拔、气温、湿度、植被。
- 点击青白色的智人 → 追随它的一生:右下「个体档案」显示状态/年龄/世代/部落/温饱/渴意,头顶亮起金色光柱并拖出移动轨迹。
- 底部时间之轮:暂停 / 1× 4× 16× 64× 变速;输入一粒种子「天地重开」。
- 「史」按钮 → 展开「历史长河」时间轴:滚轮缩放、拖拽平移、点击回望任意纪元的种群与文明状态。
- 顶部「神谕」面板:实时显示正在注入世界的现实数据(真实天气、地震)。
提示:世界是服务器权威的——多个浏览器打开的是同一个世界,时间控制彼此共享。
Coding The World/
├── packages/
│ ├── engine/ # ⚙️ 世界引擎(确定性内核)
│ │ ├── src/
│ │ │ ├── world.ts # 世界本体:时间/大地/众生/历史容器
│ │ │ ├── rng.ts # 种子随机(mulberry32)
│ │ │ ├── terrain/ # 噪声与地形生成
│ │ │ ├── calendar.ts # 历法与四季暖流
│ │ │ ├── climate.ts # 温度场与生长气候
│ │ │ └── life/ # 植被 / 走兽 / 基因 / 智人 / 部落 / 快照
│ │ └── test/ # Vitest 确定性与生态守卫
│ └── protocol/ # 📜 服务器⇄客户端消息契约
├── apps/
│ ├── server/ # 🌍 永生世界宿主(Fastify + ws + SQLite + 神谕)
│ └── client/ # 👁 上帝之眼(Three.js + React + 历史长河)
└── package.json # Monorepo 根(npm workspaces)
- 生态平衡:捕食者-猎物系统用 logistic 软上限抑制过冲、捕食者高代谢先行崩溃避免赶尽杀绝、低位「拯救效应」散布幸存者破解空间聚集陷阱——让种群长期健康振荡而非灭绝。
- 神谕与确定性:现实数据是显式外部输入,只由服务器宿主注入
world.oracle偏置;引擎默认偏置为 0,测试全部在无神谕的确定性世界下运行。现实 API 全部免密钥(Open-Meteo 天气、USGS 地震),不可达时优雅回退到本机实时钟摆。 - 性能布局:走兽用 SoA(Structure of Arrays)+ swap-remove 致密存储,为未来的百万实体与 WASM 替换预留数据布局;渲染用 InstancedMesh 承载兽群与智人。
这个世界不会停下。随时 npm run dev 打开它,看看它又走到了哪个纪元。