docs: 订正归航手感论证的运动学错误 + 记录定价越权与用户决策
【spec §2.0】原论证只算转弯半径就断言「急转的敌人能甩掉」,从未拿它对照敌人 实际速度 —— 明写此错,并补上缺的那一步运动学核算:跟踪横向速度 v、距离 d 的 目标所需角速度 ω≈v/d,故跟丢条件是 d < v/ω_max(近距离判据)。代入实际数值 (敌 45~140 px/s、弹 ~350 px/s) 重列强度表,标出发版值 1.5、给出各档对最快敌人 的跟丢距离。说明中远距离不是区分点(1.5 与 3.0 余量分别近 5 倍/10 倍,都能可靠 命中),真实失手方式是【近距离过冲】——目标坐进转弯圈内、几何上无法收敛, 而这正是 1.5 想要的手感。叠加表按 1.5 递增重列,堆到必中仍是合法 build 收益。 【spec §2.8】承认原「与 pierce/bounce 对齐」的论证绕过了权威:那两个词条本身 就不在定价表里,拿两个未定价条目互相对齐等于自建平行标准。而 numerical_design.md 确实给 homing 定过价(Tier 3 / Mana 40),且该表是活的权威—— 其 Mana 列与 spells.json 每个已实现条目精确吻合,仅 homing 一行偏离。记录用户 决策及其取舍:这个词条能卖同族价,是因为它被调到了同族强度。 【numerical_design.md】homing 行按 P6-N2/N25 同样风格标注:原行删除线保留可 追溯(不抹掉「曾判定为 Tier 3」这个记录),表下补注说明 Homing Force 语义已废 (实现为最大转向角速度 rad/s,与 5.0 不同量纲不可比)、Mana 40 被同族标准取代、 实际发版 homing 1.5 / Mana 8 / 商店 18,并链接 spec。 【architecture_design.md】§4.2 冷数据注释的示例值 3.0 → 1.5(含转弯半径 233px)。 【plan】Task 1 Step 5/6 的 JSON 与断言期望值同步为 1.5;验收⑧(Step 6/6b)重跑 并更新为 folded=3.00 / e2e_2stack=3.000 / e2e_1stack=1.500;Step 8b 补设计器 往返与 SpinBox 格点确认输出。新增顶部醒目段落说明【机制测试①②③④⑦里的 3.0 是测试局部值、与发版值刻意解耦】——平衡调整不应导致机制测试失败,不要为了 数字一致去改它们;唯一应随发版值走的是⑧。Step 7 注明平衡调整不影响性能守卫 (强度只进转向数学,不参与决定 query_circle 频率的任何分支),未重跑。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -20,19 +20,29 @@
|
||||
|
||||
### 2.0 手感定位
|
||||
|
||||
**中度制导**:明显画弧追踪,但有最大转向角速度上限 —— 追不上贴脸急转的目标,会「甩尾」绕过去再回头。
|
||||
**中度制导**:明显画弧追踪,但有最大转向角速度上限 —— 贴脸时会过冲、绕过去再回头。
|
||||
反面:不做「轻度辅助瞄准」(玩家感知不到花了 8 蓝买了什么),也不做「每帧速度矢量直指目标」的强锁定(近乎必中,会让手瞄与闪避设计同时失效)。
|
||||
|
||||
转弯半径 = 速度 ÷ 角速度。主流子弹速度 ~350(`spark_bolt` 350 / `fire_bolt` 320 / `frost_bolt` 360):
|
||||
> **⚠️ 原论证有错,已订正(2026-07-30,发版前平衡复核)**:本节初稿只算了转弯半径,就断言 3.0 rad/s「急转的敌人能甩掉」—— **算了转弯半径,却从未拿它对照敌人的实际速度**。补做运动学核算后结论反转:3.0 rad/s 实际接近「稳定命中」。单层词条值因此由 **3.0 降为 1.5 rad/s**,详见下方核算与 §2.8 定价说明。
|
||||
|
||||
| 角速度 | 350 速度下转弯半径 | 手感 |
|
||||
| :-- | :-- | :-- |
|
||||
| 2 rad/s | 175 px | 偏弱,大圆弧 |
|
||||
| **3 rad/s(单层词条)** | **117 px** | **明显制导,急转的敌人能甩掉** |
|
||||
| 6 rad/s(叠 2 层) | 58 px | 很难甩掉 |
|
||||
| 12 rad/s(叠 4 层) | 29 px | 接近必中 |
|
||||
### 运动学核算(原论证缺的那一步)
|
||||
|
||||
不设叠加上限 —— 堆到必中是合法 build 收益,与 bounce 堆叠同理。
|
||||
跟踪一个相对子弹横向速度为 `v`、距离为 `d` 的目标,所需角速度约为 **`ω ≈ v / d`**。子弹能提供的上限是 `homing_strength`,故**跟丢的条件是 `d < v / ω_max`** —— 注意这是个**近距离**判据:距离越近,同样的横向速度要求越高的角速度。
|
||||
|
||||
代入本工程实际数值(`data/enemies.json` 敌人速度 **45 ~ 140 px/s**;主流子弹速度 **~350 px/s**:`spark_bolt` 350 / `fire_bolt` 320 / `frost_bolt` 360):
|
||||
|
||||
| 角速度 | 转弯半径(350 速度) | 对最快敌人(140 px/s)的跟丢距离 `v/ω` | 手感 |
|
||||
| :-- | --: | --: | :-- |
|
||||
| 1.0 rad/s | 350 px | 140 px | 偏弱,大圆弧 |
|
||||
| **1.5 rad/s(单层词条·发版值)** | **233 px** | **93 px** | **中度制导:中远距可靠修正,贴脸急转能甩掉** |
|
||||
| 3.0 rad/s(叠 2 层) | 117 px | 47 px | 很难甩掉,接近稳定命中 |
|
||||
| 6.0 rad/s(叠 4 层) | 58 px | 23 px | 已在碰撞半径量级,接近必中 |
|
||||
|
||||
**远距离拦截不是区分点。** 400 px 接近过程耗时约 `400/350 ≈ 1.14 s`,其间最快敌人横移约 160 px,所需航向修正仅约 `atan(160/400) ≈ 0.38 rad`;而 1.5 rad/s 在同样时间内可转 **1.71 rad**,余量近 5 倍。3.0 rad/s 的余量则接近 10 倍 —— 两者在中远距**都**能可靠命中,差别根本体现不出来。这正是原论证失效的地方:它比较的是两个都远超需求的数字。
|
||||
|
||||
**真实的失手方式是近距离过冲**,不是「被甩掉」。目标进入子弹的转弯圈(半径 233 px)以内时,子弹的最小转弯半径大于它到目标的距离,几何上无法收敛 —— 会从目标旁掠过、绕一个大弧再回头。1.5 rad/s 把这个「过冲区」放大到有意义的尺度(93 px 内对最快敌人必然跟丢,233 px 转弯圈使贴身缠斗时反复过冲),**这正是本节想要的手感**:远处放心开火,近身仍需走位与手瞄。3.0 rad/s 下过冲区只有 47 px,已小到玩家感知不到。
|
||||
|
||||
不设叠加上限 —— 堆到必中是合法 build 收益,与 bounce 堆叠同理;叠 2 层即回到 3.0、叠 4 层 6.0,正是玩家用词条位换来的强度。
|
||||
|
||||
### 2.1 冷数据字段(子弹 `_bullet_contexts[idx]`)
|
||||
|
||||
@@ -133,11 +143,23 @@ bounce 现有行为一行不改(仍是命中瞬间硬重定向),homing 只
|
||||
### 2.8 修饰器数据(`data/spells.json`)
|
||||
|
||||
```json
|
||||
"modifier_homing": { "type": 1, "display_name": "Homing", "description": "后续法术获得归航(飞行中以受限角速度转向锁定的敌人)。", "element_tags": [], "meta": { "homing": 3.0, "mana_cost": 8, "shop_cost": 18 } }
|
||||
"modifier_homing": { "type": 1, "display_name": "Homing", "description": "后续法术获得归航(飞行中以受限角速度转向锁定的敌人)。", "element_tags": [], "meta": { "homing": 1.5, "mana_cost": 8, "shop_cost": 18 } }
|
||||
```
|
||||
|
||||
`mana_cost` / `shop_cost` 与 `modifier_pierce_plus`、`modifier_bounce` 完全对齐。`shop_cost>0` → 自动进商店池。
|
||||
|
||||
> **⚠️ 定价论证的订正与用户决策(2026-07-30,发版前平衡复核)**
|
||||
>
|
||||
> **原论证绕过了权威。** 本节初稿的理由是「与 pierce/bounce 对齐」,但那两个词条**根本不在定价权威表里** —— 拿两个同样未被该表定过价的条目互相对齐,等于自建了一套平行标准。而 `docs/design/numerical_design.md` 的法术数据库**确实给 homing 定过价**:**Tier 3(史诗/质变)· Mana 40**,备注「只有这一个修正就够改变玩法」。
|
||||
>
|
||||
> 该表是**活的定价权威**,不是过时草案 —— 复核确认它的 Mana 列与 `spells.json` 里**每一个**已实现条目精确吻合(`double_cast` 2 / `spread_mod` 0 / `damage_plus` 15 / `trigger_hit` 10 / `heavy_cost` 0 / `chain_bolt` 60 / `energy_orb` 20),**只有 homing 这一行对不上**。所以这是一处真实的越权定价,不是表本身失准。
|
||||
>
|
||||
> **用户决策:降强度到 1.5 rad/s,保持 8 蓝 / 18 金。** 三个选项中(① 抬价到 40 蓝 Tier 3;② 保持 8 蓝但承认越权;③ 降强度使 8 蓝名副其实),选 ③。理由:它是唯一**同时**兑现 §2.0 原批准的设计意图(中度制导、可被甩掉)又**不需要连带复核蓝耗曲线**的选项 —— 抬到 40 蓝会牵动整条 Tier 3 定价与玩家蓝池预算,属另一次立项。
|
||||
>
|
||||
> 换言之:**这个词条之所以能卖同族价,是因为它被调到了同族强度**,而不是因为「和 pierce/bounce 对齐」这条论证本身成立。§2.0 的运动学核算证明 3.0 rad/s 确实值 Tier 3 的评价(接近稳定命中),原表的判断是对的。
|
||||
>
|
||||
> `numerical_design.md` 对应行已在同日标注:原 `Homing Force: 5.0` / Mana 40 保留可追溯,并注明实际发版为 `homing 1.5` / Mana 8。
|
||||
|
||||
**不新增自带归航的 ACTION 法术** —— 只出 `modifier_homing` 一个词条,与 bounce 当期只加修饰器的做法一致。
|
||||
|
||||
### 2.9 设计器字段(`addons/game_designer/spell_tab.gd`)
|
||||
@@ -166,7 +188,8 @@ MODIFIER(`type 1`)的 meta schema 加:
|
||||
|
||||
全部经 Godot MCP 运行时实测,断言确定性数值而非目测:
|
||||
|
||||
1. **归航生效**:`homing=3.0` 子弹朝偏移目标画弧并命中;`homing=0` 对照组直线飞过。断言速度矢量方向随帧变化(对照组不变)。
|
||||
1. **归航生效**:归航子弹朝偏移目标画弧并命中;`homing=0` 对照组直线飞过。断言速度矢量方向随帧变化(对照组不变)。
|
||||
> 机制类验收(①②③④⑦)的测试脚本直接构造冷数据、**不读 `spells.json`**,固定用**测试局部值 `homing_strength = 3.0`**(`3.0/60 = 0.05` 是个干净的单帧判据数)。该值与 `modifier_homing` 的**发版值(现 1.5,见 §2.0)刻意解耦** —— 平衡调整不应导致机制测试失败。唯一随发版值走的是 ⑧。
|
||||
2. **角速度上限**:单帧转角 ≤ `homing_strength * delta`(浮点容差内)。
|
||||
3. **速率守恒**:转向前后 `Vector2(vx,vy).length()` 不变。
|
||||
4. **最短转向**:目标位于子弹正后方偏一侧时,转向方向为夹角较小的一侧(验证 `wrapf`)。
|
||||
@@ -182,7 +205,7 @@ MODIFIER(`type 1`)的 meta schema 加:
|
||||
>
|
||||
> 论证对被限定后的命题成立,但**它是状态推断而非对调用次数的直接观测** —— 如实标注,不宣称为直接测量。
|
||||
7. **bounce 协同**:`homing + bounce` 子弹弹跳后 `homing_target_id == ` bounce 选中的 `next_id`。
|
||||
8. **修饰器折叠**:两层 `modifier_homing` → `ctx.stats.homing_add == 6.0`。
|
||||
8. **修饰器折叠**:两层 `modifier_homing` → `ctx.stats.homing_add == 2 ×` 发版值(现 `1.5 × 2 = 3.0`)。**本条有意耦合发版值**,测的正是「JSON → 折叠 → 冷数据」这条数据驱动链路,平衡调整时须同步更新期望值。
|
||||
9. **商店与设计器**:`modifier_homing` 可在商店买到;设计器 `homing`/`bounce` 字段回读往返一致(对真实 `data/spells.json`)。
|
||||
10. `validate_script` 通过;纯数据驱动;无目标时不崩。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user