Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Coding The World

一个云端永生的模拟世界:一粒种子生成的确定性宇宙,在服务器上 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,进程重启后从沉睡中醒来,历史一笔不丢。

创世纪 · 全 11 章

名称 这一章让世界拥有了……
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 打开它,看看它又走到了哪个纪元。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages