H5小游戏 活跃维护

client

corosolto/client

讽刺风格的网页FPS:5个夸张的巴西派系,44个角色,5张地图和26种武器——与机器人进行回合制和夺旗比赛,直接在标签页中,无需安装任何东西。Three.js 纯JS,无需构建。与AI代理(Claude, Kimi, Codex/GPT, GLM)共同生成——AI生成且AI友好。

253
Stars 标星
37
Forks 分支
4
Watchers 关注
42
Open Issues
JavaScript
主要语言
AGPL-3.0
开源协议
1.62 GB
仓库大小
16 小时前
最后推送
一键安装扩展 / 插件指令
dsh plugin --profile web add github:corosolto/client
git clone https://github.com/corosolto/client.git
git clone git@github.com:corosolto/client.git
README.md main

英文原文正文为项目原始 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/每日限制频率、绝对上限和物理一致性),新的遥测继续测量。当排行榜恢复时,历史数据仍在。

最终修复方案是游戏服务器使用 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 动态生成,为每个玩家覆盖一个 URL
  • public/robots.txt 和 public/llms.txt
  • JSON-LD:单个 VideoGame 节点具有稳定的 @id,以及每页的 ItemList、ProfilePage/Person、HowTo、FAQPage 和 BreadcrumbList
  • /ranking、/u/* 和 /mapa 的 CDN Cache-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://www.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 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。