# 《星穹对撞》游戏设计文档（GDD）

> 版本 v1.0 · 作者：DSH 游戏组 · 状态：可开发
> 本文档是开发权威规格：代码常量、数值、UI 文案以此为准。

---

## 1. 一句话定义

**《星穹对撞》是一款"一机双人、上下互怼"的同屏对战小游戏**：一台手机竖屏分上下两半，两位玩家各操控一艘星舰，把能量球拍向对方半场，先得 5 分者胜；也支持单人挑战 AI。

平台：微信小游戏（竖屏、双指/单指、面对面同屏对战场景）。单局 1~2 分钟。

## 2. 玩法模式

| 模式 | 对手 | 说明 |
|---|---|---|
| 双人同屏 | 同桌真人 | 上下分屏，各玩各的半场，第一局最快上手 |
| 单人挑战 | AI（简单/普通/困难） | 玩家在下方半场，AI 在上方；三档追踪速度 0.55/0.9/1.25 |

## 3. 核心机制（Core Loop）

**回合循环**：接球反弹 → 命中涨能量与回合数 → 球速上升 → 抢道具/放引力井 → 得分 → 发球 → … → 先到 5 分获胜。

### 3.1 操作（同屏双指）

- **拖动**（自己半场内任意处）：星舰水平跟随手指移动（限速 1000 px/s）。
- **长按**（0.3 秒内没拖动）：在自己半场该位置生成**引力井**（消耗满格能量，见 3.5）。
- 半场归属按**按下时的位置**判定，双方互不干扰。

### 3.2 反弹物理（权威数值）

| 参数 | 值 |
|---|---|
| 场地 | 设计宽 750；高 = 真机设计高（约 1334~1624） |
| 能量球半径 | 12 px |
| 星舰尺寸 | 150 × 18 px，贴本方底线 60 px |
| 初始球速 | 420 px/s |
| 回合加速 | 每次命中 +6%（`420 × (1 + 0.06×回合数)`） |
| 球速上限 | 1400 px/s |
| 反弹角度 | `命中偏移/半舰宽 × 70°`（中央=直弹，边缘=大斜角） |
| 左右壁 | 弹性反弹（水平速度反向） |
| 得分线 | 球整体越过上/下边界 |

### 3.3 连击与发球

- **回合数**：双方连续命中数；中央显示；得分清零。
- **得分**：球越过对方底线 → 己方 +1；**得分方发球**（球放本方星舰，1 秒倒计时后发射，发射角度随机 ±25°，偏向对方）。
- **胜利**：先到 5 分 → 终局；统计：回合数最高纪录（maxRallies）、总命中数。

### 3.4 道具：双球分裂

- 每 8~16 秒（随机）在中央带掉落一枚金色菱形**分裂道具**（存在 8 秒）。
- 星舰接住道具：场上球数 < 2 → **分裂出第二颗球**（速度镜像）；已有 2 球 → 直接 +1 分。
- 分裂后两球同场，节奏瞬间爆炸——这是本作的"引爆点"。

### 3.5 主动技能：引力井

| 参数 | 值 |
|---|---|
| 能量获取 | 每次命中 +0.18；每次得分 +0.3（上限 1） |
| 释放 | 长按自己半场 0.3s（满能量且不在冷却） |
| 效果 | 半径 95px 紫色漩涡，持续 2 秒；范围内对球施加 **1500 px/s² 恒定向心加速度**（扭曲弹道） |
| 冷却 | 3 秒 |

引力井让"对拍"变成"变道博弈"：放得早被绕开，放得准直接截胡——策略层复用自《星环弹弓》的引力手感。

### 3.6 AI（单人模式）

- 仅当球朝 AI 半场运动时预测：`t = (舰线y - 球y)/vy`，落点 `x + vx×t`（限幅到墙内）。
- 追踪速度 = 舰速上限 × 档位系数（0.55/0.9/1.25），普通/困难带轻微确定性噪声（固定种子，可复测）。

## 4. 美术风格

- 与《星环弹弓》同宇宙：深空星海渐变 + 三层视差星点 + 星云光晕（复用背景管线）。
- **中央分隔线**：流动能量环 + 回合数大字。
- **星舰**：上蓝下橙发光滑块 + 尾焰（随速度抖动）；命中瞬间闪光。
- **能量球**：青色发光球 + 拖尾粒子；双球时不同色相。
- **引力井**：紫色双层反向旋转漩涡 + 中心暗核。
- **分裂道具**：金色菱形脉冲 + 光环。
- **比分**：半场外侧大字；能量条：星舰内侧细条。

## 5. 音效（全部程序化生成）

| 文件 | 用途 | 特征 |
|---|---|---|
| hit.wav | 星舰接球 | 短促脉冲（音高随回合数切 3 档：hit_lo/hit_mid/hit_hi） |
| wall.wav | 撞左右壁 | 低频闷响 |
| score.wav | 得分 | 上扬双音 |
| powerup.wav | 接住分裂道具 | 琶音闪光 |
| well.wav | 引力井释放 | 低频漩涡声 |
| serve.wav | 发球 | 短哨 |
| win.wav | 终局胜利 | 上行琶音 |
| lose.wav | 终局失败 | 下行琶音 |
| click.wav | UI | 短 blip |

震动：命中轻震（`wx.vibrateShort`，异常静默）。

## 6. UI 流程

```
菜单(标题/双人同屏/单人挑战/难度循环/玩法说明/排行榜/音效)
  └→ 对局(半场比分·回合数·能量条·倒计时)
        └→ 结算(胜者/统计/再来一局/分享/排行榜)
```

- 对局中顶部/底部各显示该侧玩家比分；中央显示回合数与发球倒计时。
- 结算页：胜方大字 + 败方鼓励语；统计：回合数纪录/总命中；按钮：再来一局、分享战绩、排行榜。

## 7. 排行榜与分享

- 开放数据域提交：`{maxrallies(回合纪录), wins(胜场), bestscore}`，排行榜按 **maxrallies** 排序（"最长对打回合"是社会货币）。
- 分享：轮换文案 + 战绩卡分享图（`share.png`，结算时生成感即可，V1 用固定图）。

## 8. 可测试性要求

- world 模块零 wx 依赖，确定性种子 RNG；单测覆盖：反弹角度数学、回合加速与封顶、得分与发球、双球分裂、引力井弯曲弹道、AI 落点预测与限速、五局终局、同种子同输入一致性。
- 冒烟测试：mock canvas（CTM 记录器）+ mock wx，驱动双人/AI 完整一局到终局，覆盖菜单/对局/结算三态绘制与像素铺满断言。

## 9. 版本路线（V1 后）

1. V1.1 皮肤（星舰涂装/球颜色，胜场解锁）
2. V1.2 每日挑战（固定种子目标回合数）
3. V1.3 特殊球（分裂/追踪/慢速球）道具池扩展
4. V1.4 异地联机（房间码，接入微信云开发）
