Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions models/claude-opus-5-5-cc-max.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"label": "Claude Opus 5.5",
"vendor": "Anthropic",
"harness": "Claude Code",
"effort": "Max",
"artifactDir": "claude-opus-5-5/claude-code-max",
"order": 8.3,
"runs": {
"pelican-cycling": {
"note": {
"zh": "在本地通过 Claude Code CLI 以 claude-opus-5-5(max)一次生成,未经修改,耗时 46 分 1 秒。空 workspace,关闭全部 skill(含 claude.ai 同步与内置 skill)、插件(含内置插件)与 MCP/连接器,禁用 WebFetch/WebSearch,无自定义系统提示。模型输出文件名为 pelican-bicycle.svg,此处按仓库规范无内容改动地重命名为 pelican-cycling.svg。",
"en": "One-shot by claude-opus-5-5 (max) in Claude Code CLI, unmodified, 46 minutes 1 second. Empty workspace, all skills (including claude.ai-synced and bundled ones), plugins (including built-in ones) and MCP servers/connectors disabled, WebFetch/WebSearch denied, no custom system prompt. The model wrote pelican-bicycle.svg; it was renamed to pelican-cycling.svg per repo convention with no content changes."
},
"contributor": "HearTFireJ"
},
"skeleton-watch": {
"note": {
"zh": "在本地通过 Claude Code CLI 以 claude-opus-5-5(max)一次生成,未经修改,耗时 1 小时 30 分 23 秒。空 workspace,关闭全部 skill(含 claude.ai 同步与内置 skill)、插件(含内置插件)与 MCP/连接器,禁用 WebFetch/WebSearch,无自定义系统提示。披露:shell 未断网,模型在运行中用 curl 从 jsDelivr 获取了 three.js 的版本列表及 0.169.0/0.170.0 的源码(three.module.js 与部分 examples/jsm 模块)用于核对 API,未访问其他网站。运行中触发过一次 Claude Code 内置的输出上限自动续写,全程无人工输入。",
"en": "One-shot by claude-opus-5-5 (max) in Claude Code CLI, unmodified, 1 hour 30 minutes 23 seconds. Empty workspace, all skills (including claude.ai-synced and bundled ones), plugins (including built-in ones) and MCP servers/connectors disabled, WebFetch/WebSearch denied, no custom system prompt. Disclosure: the shell was not network-isolated; during the run the model used curl to fetch the three.js version list and the 0.169.0/0.170.0 sources (three.module.js and some examples/jsm modules) from jsDelivr to check APIs, and accessed no other sites. Claude Code's built-in output-limit auto-continue fired once; there was no human input during the run."
},
"contributor": "HearTFireJ"
},
"mythos-craft": {
"note": {
"zh": "在本地通过 Claude Code CLI 以 claude-opus-5-5(max)一次生成,未经修改,耗时 1 小时 43 分 9 秒。空 workspace,关闭全部 skill(含 claude.ai 同步与内置 skill)、插件(含内置插件)与 MCP/连接器,禁用 WebFetch/WebSearch,无自定义系统提示;运行中未联网(仅在本机启动静态服务器做无头浏览器测试),全程无人工输入。模型输出文件名为 index.html,此处按仓库规范无内容改动地重命名为 mythos-craft.html。",
"en": "One-shot by claude-opus-5-5 (max) in Claude Code CLI, unmodified, 1 hour 43 minutes 9 seconds. Empty workspace, all skills (including claude.ai-synced and bundled ones), plugins (including built-in ones) and MCP servers/connectors disabled, WebFetch/WebSearch denied, no custom system prompt; no network access during the run (only a local static server for headless-browser testing), no human input. The model wrote index.html; it was renamed to mythos-craft.html per repo convention with no content changes."
},
"contributor": "HearTFireJ"
},
"cs-dust2": {
"note": {
"zh": "在本地通过 Claude Code CLI 以 claude-opus-5-5(max)一次生成,未经修改,耗时 1 小时 37 分 23 秒。空 workspace,关闭全部 skill(含 claude.ai 同步与内置 skill)、插件(含内置插件)与 MCP/连接器,禁用 WebFetch/WebSearch,无自定义系统提示,全程无人工输入。按提示词允许,模型用 npm 查询版本并安装了项目依赖(react、react-dom、three 及 Vite/TypeScript 工具链),另在其临时目录中安装了 puppeteer-core,调用本机 Edge 做无头浏览器测试;未访问其他网站。运行结束时未保留 dist/,此处提交其完整源码工程(不含 node_modules,未改动任何文件)。",
"en": "One-shot by claude-opus-5-5 (max) in Claude Code CLI, unmodified, 1 hour 37 minutes 23 seconds. Empty workspace, all skills (including claude.ai-synced and bundled ones), plugins (including built-in ones) and MCP servers/connectors disabled, WebFetch/WebSearch denied, no custom system prompt, no human input. As the prompt allows, the model used npm to query versions and install the project dependencies (react, react-dom, three and the Vite/TypeScript toolchain), and installed puppeteer-core in its scratch directory to drive the local Edge for headless-browser testing; no other sites were accessed. No dist/ was kept at the end of the run; the full source project is submitted (without node_modules, no files changed)."
},
"contributor": "HearTFireJ"
}
}
}
3 changes: 3 additions & 0 deletions outputs/claude-opus-5-5/claude-code-max/cs-dust2/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
node_modules/
dist/
*.log
140 changes: 140 additions & 0 deletions outputs/claude-opus-5-5/claude-code-max/cs-dust2/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
# Dust2 · 5v5 浏览器 FPS 原型

用 **React 18 + TypeScript + three.js** 从零实现的 3D 第一人称射击原型:在程序化生成的 Dust2 核心区域里进行 5v5 爆破模式对战(1 名玩家 + 4 名 AI 队友 vs 5 名 AI 敌人)。

- **零外部资产**:地图、角色、武器、贴图全部由代码生成(几何体 + Canvas 程序化纹理),所有音效由 Web Audio API 实时合成。
- **零游戏引擎依赖**:运行时依赖只有 `three` / `react` / `react-dom`。碰撞、寻路、AI 状态机、固定步长模拟、渲染插值全部自研。

## 快速开始

```bash
npm install
npm run dev # 打开 http://localhost:5173
```

其他脚本:

| 命令 | 说明 |
| --- | --- |
| `npm run build` | 类型检查 + 生产构建(输出到 `dist/`) |
| `npm run preview` | 预览生产构建 |
| `npm run typecheck` | 仅做 TypeScript 类型检查 |
| `npm run sim -- [seed] [easy\|normal\|hard] [胜局数] [--verbose]` | **无渲染的整场 10 BOT 对战模拟**(规则 + AI 的集成/压力测试,约 200 倍实时速度) |

进入游戏后点击画面锁定鼠标;`Esc` 暂停(可调灵敏度/音量、退出到主菜单)。

## 操作

| 按键 | 功能 |
| --- | --- |
| `W A S D` / 鼠标 | 移动 / 视角(Pointer Lock) |
| `空格` | 跳跃(需重新按下,无自动连跳) |
| `Shift` | 静步(无脚步声) |
| `C` | 下蹲(不绑定 Ctrl,避免 Ctrl+W 关闭标签页) |
| 鼠标左键 | 开火 / 刀轻击 |
| 鼠标右键 | AWP 开镜(两级)/ 刀重击 |
| `R` | 换弹 |
| `1` `2` `3` `5`(`4`)、`Q`、滚轮 | 主武器 / 副武器 / 刀 / C4、上一把武器、循环切换 |
| `E` | 安放炸弹(在 A/B 区按住)· 拆除炸弹(CT 在炸弹旁按住)· 交换地上的武器 · **观战时接管队友 BOT** |
| `G` | 丢弃当前武器 / C4 |
| `B` | 购买菜单(冻结时间及回合开始 20 秒内,数字键购买) |
| `Tab` | 计分板 |
| 死亡后 左/右键、`←` `→` | 切换观察的存活队友 |

## 需求实现对照

### 1. Dust2 地图(`src/game/world/MapData.ts`)
- 以米为单位、按经典雷达方位(T 南 / CT 北 / B 西北 / A 东北)搭建,约 108 × 104 m,跑图时间接近原作(如 CT→A 约 4 s、T→A 大约 18 s)。
- 完整包含:**T 出生点、CT 出生点、A 大(含 A 大门、A 坑、A 斜坡)、A 点(含 A 平台/“鹅点”、车、箱子)、中路、中门(两扇门体:一扇关闭、一扇开启,留出可穿过的门缝)、猫道 + A 小、B 洞(上/下 B 洞)、B 点(含 B 门、B 窗、后平台、车)**,并按原作走位连通:
- T → A 门外 → A 大门 → A 大 → A 斜坡 → A 点
- T → 中路 → 猫道楼梯 → 猫道 → A 小 → A 点
- T → 中路 → 中门 → CT 中路 → B 门 → B 点
- T → B 洞外 → 上 B 洞 → B 点;中路 ↔ 下 B 洞 ↔ 上 B 洞
- CT 出生点 ↔ CT 斜坡 ↔ A 点;CT 出生点 ↔ 中门区域 ↔ B 门
- 地面以“地板矩形(平地/坡道/楼梯)”描述,地图边界内其余部分自动栅格化为实心建筑并贪心合并成碰撞盒,**保证所有区域都被墙体封闭**。墙、箱子、门板、车、桶全部有碰撞(玩家与 AI 共用同一套碰撞)。

### 2. 角色(`src/game/gfx/CharacterModel.ts`)
- 独立的头、躯干(腹部/胸部)、骨盆、双臂(上臂/前臂/手)、双腿(大腿/小腿/脚),层级骨骼 + 双骨 IK:双手实时贴合所持武器的握把与护木。
- CT:深蓝制服 + 防弹背心 + 头盔护目镜;T:卡其外套 + 黑色头套 + 红色头巾/臂章——一眼可辨。
- 默认持枪姿态,上半身随俯仰瞄准,武器随朝向移动;行走步态、下蹲、换弹动作、死亡倒地。
- 每个肢体网格同时就是命中盒(在网格局部空间做射线-OBB 检测),命中判定与所见完全一致。

### 3. 武器系统(`src/game/weapons/WeaponDefs.ts`、`src/game/sim/Combat.ts`)
- 数据驱动:伤害、护甲穿透、射程衰减、射速、全/半自动、弹匣/备弹、换弹/切枪时间、移速、散布模型(站立/蹲/移动/空中/每发扩散/恢复)、后坐力弹道表、瞄准镜参数。新增武器只需添加一条定义 + 一个程序化模型。
- 主武器 / 副武器 / 近战 / C4 槽位切换,均有第一人称手持模型(独立渲染通道,不穿墙)与第三人称模型。

| 武器 | 基础伤害(胸) | 爆头 | 射速 | 弹匣 | 特点 |
| --- | --- | --- | --- | --- | --- |
| AK-47 | 50 | 100 | 600 RPM | 30 | 高伤害,剧烈后坐:准星大幅扩散 + 视角明显上扬 |
| M4A4 | 38 | 76 | 667 RPM | 30 | 中等伤害,后坐力约为 AK 一半,射速更高 |
| AWP | 125 | 250 | 41 RPM | 10 | 单发致命;右键开镜(3D 视野 30°/9° 拉近 + 2D 瞄准镜遮罩),开枪后自动退镜、拉栓后恢复 |
| Glock-18 | 24 | 48 | 半自动 | 20 | T 默认手枪 |
| USP-S | 32 | 64 | 半自动 | 12 | CT 默认手枪(消音) |
| Desert Eagle | 46 | 92 | 半自动 | 7 | 伤害介于手枪与步枪之间,弹匣小、后坐大 |
| 刀 | 34 / 65 | ×2 | — | — | 轻击/重击,背刺加成 |

- **Hitbox 分区伤害倍率**(`HITGROUP_MULTIPLIER`):头 ×2.0、胸 ×1.0(身体基准)、腹 ×1.25、手臂 ×0.8、腿 ×0.65 —— **爆头恰为身体伤害的两倍**。
- **护甲**:头盔保护头部,防弹衣保护胸/腹/手臂,腿部不受保护;受保护部位只有 `armorPen` 比例的伤害进入生命值,其余损耗护甲(CS 规则)。

### 4. 手枪局
- 默认第 1 回合为手枪局:全员只有默认手枪(T: Glock-18 / CT: USP-S)+ 刀,无主武器,护甲按“手枪局护甲”配置(主菜单可选:无护甲 / 防弹衣无头盔),购买菜单只允许手枪。之后的回合为长枪局(全甲、CT 拆弹器、主武器;每回合每队有一定概率由一名 BOT 改用 AWP)。

### 5. C4 与回合胜负(`src/game/sim/World.ts`)
- 回合开始随机交给一名 T;持包者阵亡后炸弹掉落,T 走近自动拾取(BOT 会主动去捡)。
- 持包者在 A/B 安放区按住 `E`(或切到 C4 按住左键)3.2 s 安放,期间不能移动;安放后 40 s 倒计时,蜂鸣频率逐渐加快。
- CT 在炸弹旁按住 `E` 拆除:无拆弹器 10 s,有拆弹器 5 s;松开或离开即中断。
- 结算:T 消灭全部 CT 或 C4 爆炸 → T 胜;CT 消灭全部 T(且未安放)、拆弹成功或时间耗尽 → CT 胜。爆炸按距离造成伤害。
- 玩家阵亡后:约 2.5 s 第三人称死亡镜头 → 自动切到存活队友第一人称视角(含其武器模型),可切换观察对象,按 `E` **接管该队友 BOT** 继续作战;下一回合恢复为自己的角色。

### 6. 5v5 AI(`src/game/ai/`)
- **导航**:0.5 m 栅格 NavGrid,按玩家碰撞体(半径 + 半格)膨胀后可走,A*(八方向、靠墙代价)+ 拉直路径;行进中持续校验直线可达性,偏离后就地重新规划;队友避让、离网回正与卡住脱困。
- **感知**:视野角(按难度 100°–130°)+ 视线射线(头/胸/腿三点,墙体遮挡即不可见),听觉(枪声/脚步)与受击方向;全队共享敌人情报(同时驱动小地图“被发现的敌人”)。
- **单兵状态机**(`BotBrain`):交战(反应延迟 → 受转速限制的瞄准 + 递减的瞄准误差 + 后坐补偿 → 按武器与距离点射/连射/AWP 开镜单发 → 急停反向键/左右横移)> 安放/拆弹 > 任务执行(沿路线推进、驻守与巡逻、拾包、搜索)> 观察(预瞄最后目击点、响应声音和队友情报)。
- **团队战术**(`TeamAI`):T 随机选 A/B,按真实路线分组(A 大 / 猫道 / 中路摸中门 / B 洞),在集结点会合后统一进攻,持包者安放,安放后各自卡点防守;包掉落派最近队友回收;回合后期强攻。CT 按多套默认站位分守 A/中/B 并巡逻,根据情报回防,下包后回防并指派拆弹手。
- 难度:简单 / 普通 / 困难(反应、转速、准度、爆头倾向、压枪、横移)。

### 7. 操作与 HUD(`src/ui/`)
- 动态十字准星(随实际散布实时扩散)、命中标记(爆头/击杀区分)、受击方向指示与红色暗角。
- 生命值 / 护甲(头盔、拆弹器、C4 标签),动态弹药面板(开火递减、换弹恢复、弹匣子弹条),武器槽位。
- 右上角实时击杀播报(武器 + 爆头标记,与玩家相关的高亮)。
- 顶部比分、回合计时(下包后变为炸弹图标)、双方存活指示;回合横幅、事件提示、安放/拆除进度条、计分板、购买菜单、暂停与比赛结束界面。
- **小地图**:常驻显示 Dust2 俯视轮廓(由关卡栅格预渲染,含区域名称与 A/B 标记),实时标出自己(箭头 + 视野锥)、队友、当前被己方看见的敌人、阵亡队友位置与 C4(携带/掉落/已安放闪烁)。下方显示当前所在区域名。

### 8. 声音(`src/game/audio/AudioEngine.ts`)
全部由 Web Audio 节点图实时合成(噪声 + 滤波 + 扫频振荡器 + 包络 + 合成卷积混响),并带 3D 声像、距离低通与遮挡衰减:
- 开火:AK(低沉有力)、M4(更清脆)、AWP(巨响 + 长尾)、Glock(短促)、USP-S(消音“噗”声)、沙鹰(厚重)各自不同的配方。
- 换弹(按武器换弹时长排程的卸弹匣/上弹匣/拉栓声)、切枪、空仓、脚步(3D)、落地、AWP 开镜咔哒声。
- 命中反馈(身体“噗” / 爆头金属“叮”)、击杀提示音、受伤闷响。
- C4:安放时的键盘按键音、已安放提示、逐渐加速的蜂鸣、拆除声、拆除成功、爆炸(低频轰鸣 + 滚雷尾音)、回合胜负提示。

## 架构

```
src/
├─ main.tsx / App.tsx React 入口:菜单 ↔ 对局,设置持久化
├─ ui/ React HUD 与界面(只读引擎状态)
│ ├─ GameView.tsx 挂载/销毁引擎(生命周期由 React 管理)
│ ├─ Hud.tsx, Overlays.tsx 各 HUD 面板、购买/计分板/暂停/结束
│ ├─ Crosshair.tsx, Minimap.tsx 每帧绘制的高频组件(直接读 FastHud,不触发 React 渲染)
│ └─ radar.ts 小地图底图预渲染
└─ game/
├─ core/ 数学、随机数、类型、常量、类型安全事件总线
├─ world/ Collision(AABB/斜坡楔体、网格加速、角色移动与射线)、Level(栅格化建图)、NavGrid(A*)、MapData(Dust2)
├─ sim/ World(权威游戏状态 + 固定步长 tick)、Actor、Movement(Source 风格移动)、Combat(武器/命中/伤害)、Events、headless
├─ ai/ BotBrain(单兵状态机)、TeamAI(团队战术)
├─ weapons/ 武器数据定义
├─ gfx/ Renderer(场景/天空/阳光阴影/插值/双通道渲染)、MapMeshes、CharacterModel、WeaponModels、ViewModel、Effects、Textures、GeoBuilder
├─ audio/ AudioEngine(程序化音效)
└─ engine/ GameEngine(主循环与系统编排)、Input、Store(外部状态仓库)、HudState
```

### 三条更新链路的同步
1. **物理/规则帧(固定 64 Hz)**:`GameEngine` 用累加器驱动 `World.tick(1/64)`(每帧最多追赶 8 步)。所有规则、AI、碰撞、命中、回合与 C4 都只在这里推进,是唯一的权威状态。
2. **渲染循环(requestAnimationFrame)**:每帧先把鼠标增量直接作用到玩家视角(零额外延迟),再按 `alpha = 累加余量 / 步长` 在上一 tick 与当前 tick 之间插值所有角色位置/朝向;世界通道渲染后清深度,再渲染第一人称武器通道。
3. **React 状态**:引擎每 50 ms 生成一次不可变 HUD 快照写入 `Store`,组件通过 `useSyncExternalStore` + 选择器订阅各自切片,只有变化的切片重渲染;准星、命中标记、受击方向、小地图等每帧变化的数据走可变的 `FastHud` / 直接读取,在各自的 rAF 中绘制,不经过 React。
4. 模拟层通过 **EventBus** 广播(开火、命中、击杀、换弹、脚步、C4…),音频、特效、HUD、AI 听觉各自订阅,模拟层不依赖任何表现层 —— 因此 `npm run sim` 可在 Node 中无 DOM 运行整场比赛。

## 已知的原型取舍
- 无经济系统(购买免费,仅受回合类型/时间限制)、无投掷物、无穿墙射击、不切换攻守。
- 半开的 A 大门门板碰撞由一串小 AABB 近似(视觉为旋转的门板)。
- 角色是方块风格的程序化模型,非蒙皮网格。
14 changes: 14 additions & 0 deletions outputs/claude-opus-5-5/claude-code-max/cs-dust2/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="theme-color" content="#0d1117" />
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Crect width='64' height='64' rx='12' fill='%23d8a242'/%3E%3Ctext x='32' y='44' font-size='34' font-family='Arial' font-weight='900' text-anchor='middle' fill='%231b1307'%3ED2%3C/text%3E%3C/svg%3E" />
<title>Dust2 · 5v5 FPS 原型</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
Loading
Loading