英文原文正文为项目原始 README(英文),本站后续会翻译为中文,当前仅剔除图片与无关章节并统一排版。
CORO SOLTO:至高纷争
AI 生成 & AI 友好 — 与 AI 代理配合构建,每次提交都会说明是谁写的(预告片 Agent:,规范见 CONTRIBUTING.md):
基于 Three.js 的免费浏览器 FPS:5 个夸张的巴西派系,44 个原创角色,5 张讽刺地图和 26 种武器——与机器人进行回合制和夺旗模式,直接在浏览器标签页中玩。无下载,无安装,无注册。
| 什么 | 多少 | 哪里检查 |
|---|---|---|
| 游戏代码 | 113 个文件中的 57,826 行 | git ls-files public/js/*.js \| xargs wc -l |
game.js |
8,314 行 | wc -l public/js/game.js |
main.js |
4,218 行 | wc -l public/js/main.js |
| 配备GLB的武器 | 27 | git ls-files 'public/models/weapons/*.glb' \| wc -l |
| 角色 GLB 文件 | 64 | git ls-files 'public/models/characters/*.glb' \| wc -l |
| GLB 道具 | 204 | git ls-files 'public/models/props/*.glb' \| wc -l |
| 版本化动画片段 | 777 | git ls-files public/models/anims \| wc -l |
| 可玩角色 | 53 人,分 6 个派系 | characters.js 中的 CHARACTERS 数组 |
| 地图在注册 | 18 | maps.js 的对象 MAPS |
| HTML中的视觉辅助 | 22 | git ls-files 'public/*.html' \| wc -l |
| 安全带脚本 | 631 | git ls-files 'tools/eval/*.mjs' 'tools/eval/*.py' \| wc -l |
| 流水线脚本 | 100 | git ls-files 'tools/*.mjs' \| wc -l |
| 书面输入任务 | 26 | git ls-files 'docs/issues/[0-9]*.md' \| wc -l |
| 版本 | 2.1.0-alpha.32 |
public/js/version.js 和 package.json(一致) |
由
node tools/gen-docs.mjs生成的区块。来源:o comando da coluna direita de cada linha
今天游戏只能对抗机器人。 没有人类之间的多人模式:一个
grep RTCPeerConnection在仓库里返回零,并且在
public/js/和src/中没有网络代码。通过 WebRTC 的多人模式是该项目最大的开放领域 —— 当它存在时,这一行会随着代码一起改变,而不是之前。
▶ 游玩: https://www.csbrasil.online
这个游戏曾经叫做 CS BRASIL。 这是同一个游戏 —— 域名保持不变,旧名称仍然注册为备用名称,以便寻找它的人使用。
这个游戏是由 AI 根据一个提示生成的 ——
原始提示在docs/historico/PROMPT.md。
从这里开始
| 你是… | 读 |
|---|---|
| 好奇 | 这个页面,然后 https://www.csbrasil.online |
| 新开发者(或代理) | docs/README.md → CONTRIBUTING.md |
| 想了解技术栈 | docs/docs/stack.md — Three.js, Astro, Supabase, 资产生成, 技能 |
| 今天想贡献 | docs/issues/ — 入门任务及文件和验收标准 |
| 想知道哪些坏了 | 未解决问题 |
文档网站(Docusaurus,带有AI工具,质量门和架构):cd docs && npm install && npm start → http://localhost:3000/docs/.
堆栈
| 层 | 工具 | 版本 |
|---|---|---|
| 电机 3D (WebGL) | Three.js,已供应 | r160 |
| 游戏 | ES 模块原生,零构建 | 113 个文件 |
| 网站 | Astro 带 SSR | ^7.1.1 |
| 托管 | 适配器 Vercel | ^11.0.6 |
| 数据库 | 托管 Postgres (RLS;私有 schema,仓库外) | ^2.110.7 |
| 浏览器测试 | Playwright | ^1.62.1 |
| GLB 管道 | gltf-transform | ^4.4.1 |
| 网格压缩 | meshoptimizer | ^1.2.0 |
| 图像(构建和 API) | sharp · resvg | ^0.35.3 · ^2.6.2 |
| 本文档 | Docusaurus | 3.6.3 |
| CI 运行时 | Node | 22 |
Three.js 来自 public/vendor/three.module.js (无 CDN,运行时不使用 npm)。Astro 和 Vercel 来自 package.json astro.config.mjs vercel.json。在 tools/ 脚本中,231 个导入 Playwright,113 个导入 gltf-transform,10 个导入 meshoptimizer。
由
node tools/gen-docs.mjs生成的区块。来源:dependencies/devDependencies do package.json · REVISION de public/vendor/three.module.js
每一项的细节——为什么游戏没有构建,资产是如何生成的(mint.gg、Tripo3D、Meshy、OpenRouter),Playwright 和 gltf-transform 在这里的作用,以及代理技能是什么——都在 Stack 和工具 中。
架构
一个仓库,两种规则不同的区域:
- 游戏 —
public/· 使用 ES 模块的原生 JavaScript,Three.js 放在public/vendor/(版本在上方堆栈表中),零构建。从未使用框架。没有public/index.html: 游戏的 HTML 在src/pages/index.astro,通过/路由提供。(这个 README 已经错误地声明了相反的内容好几个月,并让每个新开发者去错误的文件。) - 网站 —
src/· Astro 在 Vercel 上 SSR。Landing 页、全球排名、公共档案、内容页面以及/api/*路由。这里可以使用框架 — 但游戏保持不变。
排名和遥测数据存在一个托管 Postgres中(私有 schema,仓库外)——今天排名通过标志关闭,采集没有停止(见下方部分)。service_role key 仅在服务器上;anon key 设计上是公开的,安全性来自策略和按列授予的权限。
下面树状图中没有计数 — 数字存在上面生成的块中。手动写的数字索引在第一次提交就会过时;这就是 tools/eval/ARCH.md 被生成的原因。
STATUS.md estado de hoje (leia primeiro)
astro.config.mjs Astro + adapter Vercel · `site` COM www (canonical)
vercel.json build, headers de segurança (CSP…) e cache
src/
layouts/Layout.astro shell do site: nav, footer, CSS global, JSON-LD base
lib/site.ts nome, host, descrições e @id de JSON-LD (fonte única)
lib/supabase.ts client admin (service_role, só no servidor)
lib/safe-url.ts allowlist de avatar + fetch com trava de SSRF
lib/ratelimit.ts rate limit durável (contado no Postgres)
data/jogo.ts armas/mapas/personagens em forma de dado, pro site
pages/index.astro O JOGO, na rota `/`
pages/ranking.astro leaderboard (SSR, com cache de CDN)
pages/u/[...path] perfil público por jogador + badge PNG
pages/sitemap.xml.ts sitemap dinâmico, cobre os perfis
pages/api/* register, submit-match, leaderboard, badge, avatar…
public/ O JOGO (vanilla, zero build)
js/ vendor/ models/ style.css robots.txt llms.txt og-image.png
audio/ ⚠ NÃO versionado — ver "Áudio" abaixo
tools/ pipeline de asset (gen-asset, gen-image, otimização de GLB)
gen-arch.mjs GERA tools/eval/ARCH.md (índice + tabela de conflito)
gen-docs.mjs GERA os blocos numéricos deste README e de docs/
tools/eval/ o arnês de medição e os quality gates de qualidade
docs/ documentação para devs (Docusaurus) + as issues de entrada
.agents/skills/ skills de agente (.claude/skills/ são symlinks pra cá)
有两个文件夹不会包含在克隆中,这是已经记录的决定:public/audio/(版权不确定)和 references/(UI 目标屏幕和参考帧,仅保存在拥有者的机器上)。references/ 中幸存下来的都是 测量的数字:tools/eval/ref_ui.json 和 tools/eval/ref_viewmodel.json,这些文件是有版本控制的。需要在 CI 中运行的工具读取的是 JSON,而不是 PNG。
本地运行
完整网站(这是你想要的方式——包括游戏):
git clone https://github.com/corosolto/client.git
cd csbrasil
npm install
cp .env.example .env # opcional: sem envs, o ranking responde 503 e o resto roda
npm run fetch-audio # opcional: sem o pacote, o jogo usa sons sintetizados
npm run dev # http://localhost:4321 — o jogo está em /
构建预览:
npm run build # gera dist/ (client + server)
npm run preview # serve dist/client estaticamente
python3 -m http.server -d public 只提供游戏的 资源文件 — HTML 不在其中。使用 npm run dev。
质量门
当前质量门命令:请查看 AGENTS.md 和 docs/docs/comecando.md 中生成的区块。
npm run arch # regenera tools/eval/ARCH.md (índice + tabela de conflito)
npm run docs # regenera os blocos numéricos deste README e de docs/
Nada 提交了一个红色不变式。安全带目录在 tools/eval/README.md。
载入编号的文档是生成的。 npm run docs:check(在 check:fast 内)当生成块与代码不符时会失败——这就是为什么一行声明“game.js 有 3.234 行”能够存活直到文件大小翻倍。
npm run check会读取public/models/下的 GLB 文件。在没有下载资产的树中,eval:invariants和eval:vm会因ENOENT失败——这是环境问题,不是回归。
使用 Graphify 的知识图谱
该仓库现在包括针对多个适配器的 Graphify 项目范围集成:
- 克劳德代码
- 法典
- 开放代码
- 清美
- 通过
.agents/与agent skills兼容的适配器
主要文件:
AGENTS.md和CLAUDE.md:图使用说明.codex/、.claude/、.opencode/、.kimi/、.agents/:每个适配器的技能/配置graphify-out/graph.json:可查询图graphify-out/GRAPH_REPORT.md:可导航摘要graphify-out/graph.html:图的本地可视化
图的初始构建:
- 以
code-only模式生成,本地且确定性 - 包括 SQL(
supabase/schema.sql和迁移) - 不使用外部 API
代码变更后更新:
./scripts/graphify update .
./scripts/graphify cluster-only . --graph ./graphify-out/graph.json --no-label
从零开始再生:
./scripts/graphify extract . --code-only --out . --force
./scripts/graphify cluster-only . --graph ./graphify-out/graph.json --no-label
注意:Graphify 的当前版本能够很好地提取这个仓库中的 JS/TS/SQL,但在 .astro 文件中仍然报告部分解析。这是当前提取器的限制,而不是项目的问题。
控制
| 键 | 动作 |
|---|---|
| W A S D | 移动 |
| 鼠标 | 看 |
| Shift | 跑 |
| Ctrl 或 C | 蹲下 — 瞄准更稳定 |
| 空格 | 跳 |
| 左键点击 | 射击 |
| 右键点击 | 瞄准镜 / ADS |
| R | 装填 |
| 1 / 2 / 3 | 主要武器 / 手枪 / 刀 |
| Z / X / V | CS 风格的无线电(语音命令) |
| M | 随时切换队伍 |
| Tab | 计分板 |
| Esc | 暂停 |
规则,从 public/js/game.js 常量中读取:
| 规则 | 值 | 常量 |
|---|---|---|
| 派系 · 角色 | 6 · 53 (B 9 · C 9 · E 8 · F 9 · M 9 · U 9) | CHARACTERS |
| 菜单中的地图 | 18 — 2 在回合中打开,16 在夺旗模式 | MAPS / ctfMode |
| 重生 | 2,2 秒 | RESPAWN_DELAY |
| 回合 | 99 秒,3 胜利 | ROUND_TIME / ROUNDS_TO_WIN |
| 夺旗 | 目标 = 地图上的所有旗帜,2 回合(安全网络 480 秒) | capsToWin = ctfPts.length / CTF_ROUNDS_TO_WIN |
| 生命再生 | 关闭 — ?regen=1 可重新开启 |
REGEN |
排行榜 / /u/ 页面 |
关闭 — 这是一个标志,恢复在一行 | RANKING_ON 于 src/lib/site.ts |
由
node tools/gen-docs.mjs生成的区块。来源:constantes de public/js/game.js · RANKING_ON de src/lib/site.ts
该菜单每方允许 1 到 8 个机器人(settings.bots);默认是 4×4。击杀数更多的队伍赢得回合。AWP 无论击中身体的任何部位都能一击致命。多重击杀会触发类似 Unreal Tournament 风格的公告。
生命回复已关闭(管理员决定,2026/08/05):生命只能通过重生恢复。?regen=1 可以重新开启旧规则——完整的玩家↔机器人对称规则。它被关闭是因为原规则不可见:没有图标、没有声音、设置里也没有行,且玩家感知不到的规则与缺陷无法区分。
已注册的地图,以及每个地图的开启模式:
| Id | 菜单名称 | 打开于 | 文件在 public/js/ |
行数 |
|---|---|---|---|---|
campomorro |
Morro小营地 | 占领 | map_campomorro.js |
815 |
mansao |
Joá豪宅 | 占领 | map_mansao.js |
1.395 |
amazonia |
亚马逊冲突 | 占领 | map_amazonia.js |
1.202 |
escadao |
Escadão(山坡) | 占领 | map_escadao.js |
1.409 |
praca_poderes |
三权广场 | 回合制 | map_brasilia.js |
1.978 |
piscina_treta |
冲突泳池 | 回合制 | map_piscina.js |
1.097 |
loja_h |
H商店(停车场) | 占领 | map_havan.js |
2.064 |
ferro_velho |
Zé废铁场 | 占领 | map_ferrovelho.js |
2.026 |
quebrada |
区域(舞会街) | 占领 | map_quebrada.js |
1.709 |
corrego |
小溪(圣保罗贫民区) | 占领 | map_corrego.js |
1.772 |
lajes |
Lajes(社区) | 占领 | map_lajes_authored.js |
419 |
posto_treta |
冲突加油站 | 占领 | map_posto.js |
757 |
upa_24h |
冲突24小时急救中心 | 占领 | map_upa.js |
338 |
obras_prefeitura |
市政工程 | 占领 | map_obras.js |
485 |
atacadao_treta |
冲突大卖场 | 占领 | map_atacadao.js |
792 |
parque_treta |
冲突公园 | 占领 | map_parque.js |
981 |
velho_oeste |
冲突荒原 | 占领 | map_velho_oeste.js |
1.061 |
penitenciaria |
卡兰迪鲁 | 占领 | map_penitenciaria.js |
1.009 |
已登记18张地图 — 其中2张为回合制模式,16张为占领模式。ctfMode 在占领模式下打开地图,不会锁定:玩家在菜单中切换(这是MOD1)。在public/js/目录下有24个 map_*.js 文件 — 磁盘上的文件 不表示 地图可玩。
由
node tools/gen-docs.mjs生成的区块。来源:objeto MAPS de public/js/maps.js
全球排名 — 关闭
在 src/lib/site.ts 中设置 RANKING_ON = false。2026年08月04日由负责人决定:“我们暂时禁用排行榜,之后再调整。” 原因一如既往——模型是客户端权威,分数可以被伪造,发布伪造的排名就是发布错误的数字。
这是标志,不是移除。 设置为 false:
/ranking和/u/*返回 200 状态,并带noindex提示——不是 404。URL 已被索引,将会在相同地址恢复;- 链接从网站导航栏和页脚中消失;
/api/leaderboard返回{disabled:true};客户端不知道这个标志,它根据 API 响应进行处理。服务器是唯一的真实来源。
未停止的内容:收集数据。 submit_match 继续记录(验证 token、按昵称/IP/每日限制频率、绝对上限和物理一致性),新的遥测继续测量。当排行榜恢复时,历史数据仍在。
- Schema 和迁移:
supabase/(计数在顶部生成的区块中) - 预发布版本加强的内容:
docs/seguranca.md
最终修复方案是游戏服务器使用 service_role 写入,RLS 阻止客户端;该方案与多人游戏功能在同一排队中。
音频 (public/audio/)
此文件夹不进行版本控制:语音和表情包版权不确定,公共仓库只保留代码。没有音频包时,游戏使用合成音正常运行。
npm run fetch-audio # ou: AUDIO_PACK_URL=<zip> bash scripts/fetch-audio.sh
游戏加载 audio/manifest.json(参见 audio/manifest.example.json,这个是有版本控制的)。CS 1.6 的原始音频样本归 Valve 所有,不会在此分发。
搜索引擎优化/应用引擎优化
- 在
astro.config.mjs中的site使用www—— 所有 canonical 都从这里生成 /sitemap.xml动态生成,为每个玩家覆盖一个 URLpublic/robots.txt和public/llms.txt- JSON-LD:单个
VideoGame节点具有稳定的@id,以及每页的ItemList、ProfilePage/Person、HowTo、FAQPage和BreadcrumbList /ranking、/u/*和/mapa的 CDNCache-Control
许可证 / 版权
该代码受 AGPL-3.0(GNU Affero 通用公共许可证,第3版)保护 —— 这是当前适用的许可,源码位于仓库根目录下的 LICENSE 文件。没有其他文件对此有权威性。
由
node tools/gen-docs.mjs生成的区块。来源:título lido do texto do LICENSE, conferido contra o campo license do package.json
于2026年08月07日从MIT迁移至AGPL-3.0。 在更换之前的贡献适用于MIT——一种宽松且与AGPL兼容的许可:它们在整体中仍为MIT许可,并且整个项目以AGPL-3.0分发。在此之前的贡献者不会失去任何权利,也不需要重新同意(不兼容的方向是相反的)。
- Three.js r160 — MIT(© Three.js 作者),位于
public/vendor/。 - 代码、纹理、角色和标志:原创。
- 音频:由用户提供;商业使用前请核查版权。CS 1.6 的声音 不包括(Valve)。
- 独立恶搞,与Valve无任何关联。Counter-Strike 是 Valve Corporation 的商标。
制作是为了娱乐,而不是争吵。
- 本文标题:client - 讽刺风格的网页FPS:5个夸张的巴西派系
- 本文链接:https://cn121.com/h5game/corosolto-client.html
- 原项目:corosolto/client 版权归原作者 corosolto 及贡献者所有
- 收录信息:本站于 2026-10-04 收录本项目,本页所列协议与仓库指标均为收录当时的状态;该日期之后原项目的版本更新与协议变更,本页不作同步。
- 开源协议:收录时本项目采用 AGPL-3.0(查看 LICENSE 原文),本站转载其原始文档(未改动文字,仅剔除图片与无关章节);使用、修改、分发请以该仓库 LICENSE 原文为准。基于本页内容形成的衍生作品, 须同样以该协议发布。
- 站点出处:本文首发于 OneTwoOne,收录自 GitHub 开源项目 corosolto/client。
- 内容说明:本页正文为原项目 README 原文(英文),本站后续会翻译为中文(当前尚未译出,仅将二级标题译为中文,便于按栏目定位;标题原文可在下方原仓库中查看),仅剔除了图片与赞助等无关章节、并把相对链接改为绝对地址;页首简介为机器翻译自仓库描述。
- 引用声明:商业转载、第三方聚合或 AI 检索训练引用时,请务必保留以上来源出处、本文永久链接,以及原项目的版权声明与许可信息。
- 下架通道:若原项目此后变更或收紧了许可协议、或作者/权利人认为本站的收录方式(译文、排版适配、简介翻译等)超出其授权范围,请通过 xyd3302001@163.com 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。