# Design · Stack Up

## 为什么选堆叠这种 action

- 已有 13 种 action 全部不是「裁切堆叠」
- Stack（Ketchapp 2016）证明此机制 8 年长青，全球亿级下载
- 2026 hypercasual 趋势分析仍把 Stack/Tower 列为主流（gameboard.online）

## 为什么 input 选「时机点击」而不是「位置点击」

- 已有点击都是「位置」型（点击物体破坏、染色按钮、放置塔、旋转管道）
- 「时机点击」是新维度：玩家不决定 X 位置（自动扫动），只决定 WHEN 锁定
- 单按 SPACE 也支持，照顾不喜欢鼠标的玩家

## 核心机制锚

### 扫动逻辑
- 每层平台从随机一侧（左或右）以 `speed = min(8, 3 + layer × 0.15)` 像素/帧 进入
- 撞到「可下落区域」边界后反弹（保证总在玩家瞄准范围内）
- 玩家锁定 → 进入裁切判定

### 裁切判定
```
overlap = max(0, min(R1, R2) - max(L1, L2))
if (overlap == 0) → GAME_OVER
else:
  offset = |movingBlock.x - lastLayer.x|
  if (offset ≤ PERFECT_EPS):
    newW = lastLayer.w     // 宽度恢复
    perfectCount++
    PERFECT!
  else:
    newW = overlap
    cutW = movingBlock.w - overlap
    spawn 碎片（下落 + 渐隐）
stack.push(new layer)
```

### 摄像机
- 每帧线性插值 `cameraY += (desired - cameraY) × 0.08`
- 让塔顶永远靠近 `TOP_Y_FOCUS = 360`（屏幕中间偏上）

## 失败设计：偏离归零

- 这是**全新 failure 类型**：不是计数（次数耗尽）也不是时间（时间到）也不是位置（越界），是「单次空间结算 = 重叠 = 0」
- 与 09 容器溢出相似（都是空间）但 09 是边界，11 是相对位置

## PERFECT 设计

- 阈值 5px，是给玩家「正反馈」而不是「无聊归零」
- 完美 = 宽度恢复 → 玩家想连 PERFECT
- 实际成就：连 5 个 PERFECT 后塔仍全宽 = 长期游戏目标

## 数值挑战曲线

| 层 | 速度 | 难度 |
|---|---|---|
| 0-9 | 3-4.5 | 易 |
| 10-29 | 4.5-7.5 | 中 |
| 30+ | 7.5-8（上限） | 难 + 平台已被裁窄 |
| 50+ | 8（上限）+ 平台 MIN_W | 神 |

## 视觉哲学

- 渐变背景：星空色（深紫到深蓝），强化「越叠越高」氛围
- HSL +17° 循环：相邻两层颜色明显但和谐
- 顶部高光 + 底部暗影：模拟 3D 块
- PERFECT 文字：黄白色 + 双层 glow，醒目

## 性能预算

- 单层渲染 3 个 fillRect = 60 层时 180 操作/帧
- 摄像机平移只影响 translate，无额外开销
- 60fps 稳定

## 数据结构

```
stack[i] = { x, w, y, color }
movingBlock = { x, w, y, vx, color }
chips[] = { x, y, w, h, vx, vy, color, life }
```
