这个项目能做什么
singedTerra 是一款基于浏览器的回合制炮击游戏,使用 TypeScript 从零编写,旨在向 Wendell Hicken 的 Scorched Earth (1991) 致敬。它保留了经典的游戏循环:选择角度、观察风向、设定威力并开火,而地形则记录下破坏的结果。玩家可以在单个浏览器中进行 2-4 人的本地对战(hot-seat),或通过 Supabase 的公共和私有房间进行在线对战。
核心机制:地形采用像素级位图,爆炸会挖掘出真实的孔洞,失去支撑的地面会坍塌,坦克会掉入弹坑,而土质武器可以构建新的掩体。每一轮游戏都有随机种子,每回合都会获得一个确定性的风向量,因此每个客户端计算出的飞行路径完全一致。16 种武器涵盖了直射、空中爆破、跳跃爆炸物、凝固汽油弹、地形构建、隧道挖掘和防御。移动会消耗燃料,造成伤害可获得积分,在多轮比赛中,积分必须分配给弹药、护盾、电池和燃料。视觉呈现包括自定义坦克、黄昏战场、弹道仪器、冲击光效、屏幕震动和合成音频。
坦克车库:每个席位都有一个车库。玩家可以从 Foundry、Ranger、Bulwark 或 Jackal 底盘开始,将机动性、车体、炮塔和炮管部件组合成自定义轮廓,该轮廓将出现在名册预览中并带入比赛。
模式与网络代码:计算机控制的席位使用与人类玩家相同的确定性物理引擎,本地对战和在线模式不区分物理逻辑。本地对战通过 HotSeatClient 直接在浏览器中运行共享引擎。对于在线对战,每个浏览器运行相同引擎的副本:Supabase 验证房间操作,分配序列号,存储有序日志,并通过 Realtime 广播已提交的行。在线比赛的权威定义是“种子 + 有序操作日志”;游戏状态在本地重建而非从滴答服务器流式传输,这使得固定时间步长、种子随机性和回放一致性成为设计契约的一部分。
控制方式:方向键用于瞄准炮管及调整威力;A 和 D 键用于移动并消耗燃料;Q 键循环选择武器;空格或回车键开火或激活选定护盾;G 键切换弹道引导;M 键静音或恢复合成音频;按住 F 键可在本地快进当前射击。触摸布局使用分组的 Command Deck(涵盖瞄准、威力及驱动)取代键盘,而 Weapon 和 Menu 为实用工具,Fire、Store、fuel 和 Arsenal 保留在战术栏中。在桌面端,从当前坦克向外拖拽可设置角度和威力而无需开火。
运行与验证:项目需要 Node 24.15 或更新的 Node 24 LTS 版本以及 npm。执行 npm install 后运行 npm run dev 即可在 localhost:5173 启动 Vite 客户端,本地对战无需后端配置。在线对战需要在 client/.env 中配置 VITE_SUPABASE_URL 和 VITE_SUPABASE_ANON_KEY;anon 密钥随公共客户端发布,而行级安全性(RLS)和 Edge Function 验证则保护服务端数据。验证命令包括 npm run check(类型检查及确定性引擎测试)、npm run test:client(Vitest 客户端和 DOM 测试)、npm run check:edge(Supabase Edge Functions 的 Deno 测试)、npm run test:e2e(生产环境 Chromium 布局和游戏玩法检查)以及 npm run build。CI 在每个拉取请求上运行相同的核心门禁,且 shared/src/engine/ 下的更改必须保持确定性回放。
仓库布局与文档:client/ 包含 Vite 应用、Canvas 渲染器、HTML HUD、输入和大厅;shared/ 包含确定性引擎、回放逻辑和共享类型;supabase/ 包含 Postgres 迁移和无状态 Edge Function 裁判;scripts/checks/ 包含确定性引擎和契约测试;e2e/ 包含生产浏览器游戏玩法和布局保障;docs/ 包含玩家、架构、开发和项目记录。文档涵盖了玩法、架构、开发与运维、UI 系统及当前规范。本项目采用 MIT 许可证发布,与原版 Scorched Earth 的作者无任何关联或背书。
评论
0 评分人数达到10人后显示
登录后参与讨论。