 joywayerandClaude Opus 5
|
4b09cd1064
|
fix(homing): 抖动公式的整数除法加 @warning_ignore,消掉 INTEGER_DIVISION 告警
(bullet_idx * HOMING_RETRY_MS) / maxi(1, _active_count) 的截断是有意的 ——
抖动只需毫秒粒度的偏移,小数部分丢弃即所需语义。加注解让编辑器面板对
项目文件保持零告警,使验收标准⑩「无告警」真正成立。
行为不变(注解为编译期),复测:①②③ FAILS=0 / ah=0.25000 / max_step=0.050000
/ 速率 350.0000;1500 弹同帧集体失败的到期时刻跨度 223ms、222 个互异值,抖动照常生效。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 17:32:43 +08:00 |
|
 joywayerandClaude Opus 5
|
14136b1223
|
docs: 退役 P6-N2/P6-N25 并订正 §4.2 归航设计——删除快照的连带订正
E1-③ 归航实现删除了 _enemy_pos_snapshot 与 EnemyManager.fill_pos_snapshot
(锁定式目标需 entity_id,快照按槽位存位置不含 id),权威文档随之失准,一并订正:
- docs/README.md:P6-N25(快照须为类成员)与 P6-N2(Homing 弹共用快照)双双失去
约束对象,改为删除线 + ⚠️ 已退役(2026-07-30) 并指向 spec §2.4/§2.7。不删条目,
避免编号规范留下悬空引用。
- architecture_design.md §4.2:homing 伪代码整段改写为实际算法——冷数据
homing_strength(弧度/秒)/homing_range/homing_target_id、发射不解析目标首帧惰性
锁定、仅目标失效时经 _find_nearest_unvisited 重选、wrapf 最短转向 + clampf 限
角速度 + rotated() 保速率、空场守卫、失败退避+抖动、bounce 协同改写目标并撤销
退避键。性能数字一律指向 spec §5,不另起一套。
- 冷数据字段表 homing_force → homing_strength/homing_range/homing_target_id。
- EnemyManager API:fill_pos_snapshot 换成实际存在的 get_pos_by_id(含哨兵约定);
get_nearest_pos 与自动瞄准改为「直接扫描 SoA」,原文称与 homing 快照共用属误述。
- S0 性能表 EnemyManagerCs 行标注该实测含已删除的 fill_pos_snapshot(保留历史数字)。
- MinionManager.fill_pos_snapshot 标注为未实现提案,并纠正其「供 homing 用」的注释。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 17:01:56 +08:00 |
|
 joywayerandClaude Opus 5
|
d498097005
|
docs(roadmap): E1-③ 子弹归航完成,勾除现状项 + 记录快照删除这一有意偏离
「现状」归航行与切分列表第 3 项改为完成态,格式对齐已完成的 ①②。
显式记录与本文档原方案的偏离:未消费 _enemy_pos_snapshot 而是删除之 ——
锁定式目标需 entity_id,而快照按槽位存位置、不含 id,结构上支撑不了该语义。
另记退避 + 抖动这一同期落地的性能措施(详见 spec §5)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 16:54:13 +08:00 |
|
 joywayerandClaude Opus 5
|
df81e9eafa
|
style(homing): 设计器 homing 标签补单位提示「弧度/秒」
3.0 这个值形似 0~1 的强度系数,不标单位易被误读为「归航强度」而调错量级。
文件内已有括号提示先例(如「n(每 n 次)」)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 16:40:11 +08:00 |
|
 joywayerandClaude Opus 5
|
55f96e1a1c
|
feat(homing): 设计器 MODIFIER 表单加 homing 字段,并补上期遗漏的 bounce 字段
bounce 自上期起一直掉在「其它(JSON)」逃生舱,违反 CLAUDE.md 字段化规范,
与 homing 同处 schema,一并补上。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 16:30:10 +08:00 |
|
 joywayerandClaude Opus 5
|
ffc75acead
|
docs(spec): §5.6 触发条件改为弹数阈值 + 新增 §5.7 退避墙钟不免疫时间缩放
§5.6:把重新立项的触发条件从场景描述改为可直接计算的弹数阈值 —— 成本严格线性于
「同帧创建且首次选目标全部失败的归航弹数」约 9.5µs/颗,附 200/500/1000/1750 颗的
对照表,约 1750 颗为理论击穿点(MAX_BULLETS=2048 故容量内可达)。并注明 visited
类场景因 visited_targets 线性扫描,实测高于线性外推,实际击穿点更低。
§5.7 新增潜在项(休眠,不修):退避基于 Time.get_ticks_msec() 是墙钟,不受
Engine.time_scale 影响,而 TimeManager 正是为慢动作/冻结时间 Core 驱动 time_scale 的。
grep 确认 set_time_scale 当前零调用方,故今日无害;若落地 0.2× 慢动作,200ms 只跨
约 2.4 个物理帧而非 12,抖动摊薄失效,且表现为慢动作期间掉帧。
记录替代方案(触发时再实施):改用物理帧计数 HOMING_RETRY_FRAMES=12,免疫时间缩放、
略便宜、消除 ms↔帧量纲错配;项目已有现成的 TimeManager.game_tick 且注释明写不受
time_scale 影响,正合用。触发条件为 set_time_scale 出现第一个调用方。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 16:26:36 +08:00 |
|
 joywayerandClaude Opus 5
|
28f4047096
|
fix(homing): bounce 协同路径遗留过期退避键,使子弹对着尸体转向且拒绝重新锁定
homing_target_id 有两个写入方,不变式「homing_retry_at 只在目标无效时才有意义」
只在其中一方成立:_apply_homing 重选成功时会 erase 该键,bounce 那行不会。
后果是一颗 bounce+homing 子弹若先经历过一次重选失败、再弹跳到 next_id、而 next_id
随即死亡(弹跳目标是刚打过的敌人,随即死亡是常态),它会对着尸体继续转向,并在
残留退避窗口内(最多 400ms ≈ 24 帧)拒绝重新锁定,哪怕 50px 外就有活敌人。
这恰好废掉了那行 bounce 协同代码存在的意义。
修法与重选成功路径对称,补一行 cold.erase("homing_retry_at")。运行时复现确认:
阶段1 重选失败 -> retry_at 存在=true, tgt=-1
F bounce 后: tgt=3 (expect 3) retry_key_still_present=false (修前 true)
F 目标死亡后能否立刻重选: tgt=4 重选成功=true (修前被残留退避压住停在 3)
另两处:
- 调用方守卫注释的「省约 87%」改为 64% —— 87% 出自代理微基准推算,已被真实
端到端实测(2.107→1.812ms)推翻,热路径里挂陈旧乐观数字会误导后来人判断该守卫去留。
- jitter 取模的 6 行不可达性论证压缩为一行(运算保留作索引越界兜底,成本为零)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 16:26:17 +08:00 |
|
 joywayerandClaude Opus 5
|
4ef8012b6e
|
docs: 首帧锁定尖峰决策为「接受」+ Task4 Step7 改为两场景单帧峰值回归守卫
spec §5.6:残余的首帧尖峰(1500 弹同帧创建且首次选目标全失败时 16~22ms)
决策接受不处理——触发条件是三个苛刻条件的合取属合成最坏情况、一次性不复发、
压下它需牺牲「首次锁定即时」的手感或改变归航/bounce 语义。附重新立项触发条件。
plan Task4 Step7:原只测「敌人全在射程外」,补上评审发现的更严重场景
「射程内全在 visited」(visited 只增不减故为永久状态);指标由 60 帧均值
改为单帧峰值——退避把成本摊成 1 重选帧 + 11 退避帧,均值会掩盖尖峰,
而帧预算 16.67ms 下尖峰才是玩家可见的。性质由决策关卡降级为回归守卫。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 16:15:01 +08:00 |
|
 joywayerandClaude Opus 5
|
5cc40e72e8
|
docs(spec): §5 补「朴素退避会同步而非打散」二次发现 + 抖动方案 + 单帧峰值对比
新增 §5.4「二次发现」:固定退避下尖峰每 12 帧复发(附逐帧耗时序列证据),
根因是同帧失败的子弹到期时刻相同、被退避锁进同相;这与「退避能摊薄尖峰」的
直觉相反,且摊薄均值会掩盖它 —— 后来人写类似退避/重试逻辑会踩同一个坑,故写清。
含抖动实现、为何用占比式而非 bullet_idx % 窗口宽度、HOMING_RETRY_MS 一值两用的理由。
§5.5 抖动前后单帧峰值对比表(稳态峰值全部回到帧预算内,超预算帧数 0/39)。
§5.6 记录残余:初次锁定帧(1500 弹 16.2/22.0ms)非退避问题,而是「首次锁定即时」
手感属性的直接结果,压下它需牺牲手感,属设计决策,未擅自处理。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 16:13:00 +08:00 |
|
 joywayerandClaude Opus 5
|
71240931af
|
perf(homing): 退避到期时刻加抖动,消除每 12 帧复发的集体重试尖峰
二次发现:固定 200ms 退避并没有消除尖峰,只是让它变成周期性复发。按真实 60fps
起搏复测,1500 弹 visited 场景逐帧耗时在第 1/13/25/37 帧稳定出现 ~21ms,永不衰减:
21.9 2.8 2.9 ... 3.1 | 21.8 2.8 ... | 21.0 2.9 ... | 20.9 3.7 3.9 3.8
根因是朴素退避会把子弹锁进同相而非打散 —— 同帧失败的子弹拿到同一个 now,到期时刻
完全相同,一个退避周期后又整齐地一起重试;同波齐射本就天然同相,此后再无机会错开。
摊薄后的均值数字恰恰掩盖了这一点。
修法是抖动到期时刻,铺满 [200,400) ms ≈ 恰好一个退避周期 ≈ 12 帧。
用「bullet_idx 在活跃弹数中的占比」而非 bullet_idx % HOMING_RETRY_MS:后者在弹数少于
窗口宽度时只铺开 _active_count 毫秒(20 颗弹 → 20ms ≈ 1.2 帧,等于没打散)。
实测打散质量:1500 颗同帧集体失败 → 互异到期值 1493 个、覆盖 14 帧、单帧最多 120 颗
(理想 125)。
单帧峰值(60fps 起搏 40 帧,稳态即排除初次锁定帧):
① 全射程外 1500 13.6~15.7ms 复发 → 4.40ms 300 3.2ms → 0.92ms
② 全 visited 1500 20.9~21.9ms 复发 → 5.61ms 300 4.6ms → 1.15ms
稳态超 16.67ms 的帧数均为 0/39。
首次锁定即时的行为未受影响(抖动只作用于失败后的重试),速率守恒、单帧转角上限、
退避窗口内零查询、到期后重试成功并 erase 键,断言全绿。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 16:12:40 +08:00 |
|
 joywayerandClaude Opus 5
|
3bf04c9fc0
|
docs(spec): R-H1 由「暂不实现」改为「已实测触发并启用」,补两种病态状态实测数据
如实记录:
- 原风险分析只预见「敌人全在射程外」,漏掉「射程内敌人全在 visited_targets 里」——
后者经 bounce+homing 组合是该子弹的永久状态而非瞬态,且成本更高,是本次发现;
原文把 R-H1 定性为瞬态尖峰不准确。
- 实测两种场景在 300 弹规模已达 3.14 / 4.34 ms,越过本节自定的 2.0 ms 触发线,
故方案 3(0.2s 退避)随 Task 2 落地,摊薄约 12×。
- 残余未收敛项另立 §5.4:1500 弹摊薄后仍 3.9 / 4.5 ms,且退避会使同波齐射的
子弹同步重试、留下 15.9 / 22.2 ms 单帧尖峰;错帧方案待决策,本次未擅自扩大范围。
§2.4 补一句指向 §5,避免「一生只查 1–2 次」与失败路径重试自相矛盾。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 16:04:03 +08:00 |
|
 joywayerandClaude Opus 5
|
c9786eba50
|
fix(bullet): _swap_and_pop 回收末尾子弹时遗留冷数据,被下一颗复用槽位的子弹继承
pre-existing bug(非本期归航引入):冷数据的搬移与擦除都写在 if idx != last 分支内,
故 idx == last(回收最后一颗子弹)时它的 _bullet_contexts[idx] 被原样留在该 key 上,
下一颗复用该槽位的普通子弹会继承整份冷数据。运行时已复现:
after recycle: active=0 ctx_keys=[0]
plain bullet idx=0 inherits_cold=true cold={"homing_strength":3.0,...,"pierce_remaining":7}
归航之前症状只是一次隐形的多余穿透,故长期未被发现;归航把它放大成肉眼可见的
「普通子弹拐弯追敌」,且继承 homing 的幽灵弹会持续走重选路径付出查询开销。
修法是把 erase 移出该 if(缺键时 erase 为安全 no-op),idx != last 的搬移行为一行不改。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 16:02:39 +08:00 |
|
 joywayerandClaude Opus 5
|
2f9cb76308
|
perf(homing): 重选失败退避 0.2s + homing 判别提到调用方
评审实测发现两种病态状态下重选会每帧无限重试,query_circle(r=400) 进入热路径:
① 敌人在场但全在 homing_range 外;② 射程内敌人全在 visited_targets 里
(bounce+homing 打空小簇后是该子弹的永久状态,原 spec 风险分析漏掉了这种)。
1500 弹实测 15.8ms / 22.0ms,300 弹 3.1ms / 4.3ms,均越过 spec §5 的 2.0ms 触发线,
故 spec §5 记录的逃生方案(方案 3)提前落地:重选失败写 homing_retry_at 时间戳,
HOMING_RETRY_MS(200ms) 内直行不再查询,60fps 下摊薄约 12×。
首次锁定不受影响(无该键时 get 返回 0 必小于 now),手感不回退;
重选成功即 erase 该键,恢复零查询稳态。
homing 判别 _bullet_contexts[i].has("homing_strength") 提到 _gd_integrate 调用方:
带冷数据但不归航的子弹(纯 pierce/bounce/状态/荷载,真实 build 里占多数)不再
为发现自己不归航而付一次完整函数调用 —— 1500 纯 pierce 弹实测 2.107→1.812ms。
_apply_homing 内的 strength <= 0.0 早退保留作防御性下限。
同步订正两处失准注释:_find_nearest_unvisited 现也是归航选目标器;
_apply_homing 文档注释补齐失败路径的重试/退避策略。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 16:01:31 +08:00 |
|
 joywayerandClaude Opus 5
|
b3b04fcbda
|
feat(homing): bullet_manager 受限角速度转向 + 锁定式目标重选 + bounce 协同; 删除无人消费的位置快照
_apply_homing 在位置积分前把速度矢量朝目标旋转,单帧转角上限 strength*delta,
rotated() 保持速率不变;wrapf 取最短转向方向。
目标仅在失效或首帧时经 _find_nearest_unvisited 重选,配 get_active_count()==0
空场守卫,避免 query_circle(r=400) 进入每帧热路径。
bounce 命中重定向时改写 homing_target_id,由 bounce 选目标 homing 追上去。
删除 _enemy_pos_snapshot 及 EnemyManager.fill_pos_snapshot(全项目唯一调用方)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 15:40:55 +08:00 |
|
 joywayerandClaude Opus 5
|
0a6f0e95d5
|
style(homing): 评审抛光——JSON 列对齐 + 注释精度(无行为变更)
1. spells.json: modifier_homing 的 description 补一空格对齐到第 72 列,
与相邻 type 1 条目一致,避免错位被复制传播。
2. cast_stats.gd: homing_add 注释改用全角括号与相邻行统一;措辞明确为
「最大转向角速度」——按 spec §2.1 该值是 clampf 上界而非实际角速度,
原措辞可能误导调平衡的人设错值。
3. spell_evaluator.gd: 分支快照注释点明 pierce_add 是已知 pre-existing
遗漏而非笔误,防止后来人把「10 字段」误读为「全部字段」。
4. spell_evaluator.gd: 归航冷数据块加注 homing_range 同 bounce_range/
bounce_decay 仅从 ACTION meta 读取,MODIFIER 覆盖静默失效(一致行为,
非回归),省掉后来人一次 debug。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 15:35:56 +08:00 |
|
 joywayerandClaude Opus 5
|
5663dedc12
|
feat(homing): CastStats.homing_add + 修饰器折叠 + 发射写归航冷数据 + 分支快照; modifier_homing 词条
homing_add 为 float(角速度,弧度/秒),镜像 bounce_add 的 int 累加路径。
发射时不解析目标,homing_target_id 留 -1 由 bullet_manager 首帧惰性获取,
使 spell_evaluator 不必接触 SpatialGrid。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 15:24:17 +08:00 |
|
 joywayerandClaude Opus 5
|
364ebe4c62
|
docs(plan): E1-③ 子弹归航逐任务实现计划(5 任务 · 含 wrapf 跨 ±π 判据与 R-H1 性能守卫)
Task0 建分支 / Task1 法术 VM 侧 / Task2 bullet_manager 转向+删死快照 /
Task3 设计器字段(含补漏的 bounce)/ Task4 MCP 运行时验收。
验收脚本全部用确定性数值断言:单帧转角上限、速率守恒、跨 ±π 的最短转向
(该摆位下有无 wrapf 会给出符号相反的结果,是有效判据)、目标失效重选、
空场直行、bounce 协同改写 homing_target_id、两层折叠 6.0。
Task4 Step7 实测 spec R-H1 病态场景(50 敌全在射程外 + 300 归航弹),
超 2ms/帧则按 spec §5 启用失败退避逃生方案。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 13:51:18 +08:00 |
|
 joywayerandClaude Opus 5
|
049d1dda1b
|
docs(spec): E1-③ 子弹归航设计——受限角速度中度制导 + 锁定式目标 + 删除无人消费的位置快照
手感定位为中度制导:homing_strength 即最大转向角速度(rad/s),
单层词条 3.0(350 速度下转弯半径 117px),rotated() 保持速率不变。
目标策略为发射后锁定,仅在目标死亡(get_pos_by_id 返回哨兵)或首帧时
经 _find_nearest_unvisited 重选,配 get_active_count()==0 空场守卫,
避免 query_circle(r=400, 约196格且每次新建数组)进入每帧热路径。
与 bounce 协同:bounce 命中重定向时改写 homing_target_id,
由 bounce 选目标、homing 追上去;复用 visited 过滤规避"绕已命中敌打转"死循环。
偏离路线图原文:锁定语义需 entity_id,而 _enemy_pos_snapshot 按槽位存位置
不含 id,无法支撑,故快照连同 EnemyManager.fill_pos_snapshot 一并删除
(全项目唯一调用方),净减每帧 O(敌人数) 开销。
顺带补设计器 MODIFIER schema 遗漏的 bounce 字段(现掉在 JSON 逃生舱里)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-07-30 13:36:42 +08:00 |
|
joywayer
|
d6061d0f50
|
更新mcp client
|
2026-07-30 11:41:08 +08:00 |
|
 joywayerandClaude Opus 4.8
|
04e8cf9c09
|
docs(spec): 明确 bounce+pierce 组合语义——visited 持续使每敌至多命中一次(刻意,非bug)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-24 15:28:31 +08:00 |
|
 joywayerandClaude Opus 4.8
|
bf9bea78d8
|
docs(roadmap): E1-② 子弹弹跳完成,勾除现状项 + 修正 Step3 为确定性速度判据
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-24 15:21:26 +08:00 |
|
 joywayerandClaude Opus 4.8
|
3eb6049b39
|
feat(bounce): bullet_manager 命中弹跳分支(优先于pierce)+跳过已访问+_find_nearest_unvisited 寻的
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-24 15:11:16 +08:00 |
|
 joywayerandClaude Opus 4.8
|
6b910697a9
|
feat(bounce): CastStats.bounce_add + 修饰器折叠 + 发射写弹跳冷数据 + 分支快照; modifier_bounce 词条
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-24 15:00:27 +08:00 |
|
joywayer
|
e5cf6089ed
|
docs(spec): 弹跳补充——命中循环跳过已访问敌人(防密集群重复命中)
|
2026-07-24 14:56:49 +08:00 |
|
joywayer
|
9403f80aa4
|
docs(plan): E1-② 子弹弹跳逐任务实现计划(3 任务·含密集群跳过已访问·SpatialGrid.insert 实测)
|
2026-07-24 14:56:37 +08:00 |
|
 joywayerandClaude Opus 4.8
|
4a86ffb2c4
|
docs(spec): E1-② 子弹弹跳设计——镜像 pierce 管线 + 命中弹向最近未命中敌+伤害递减
缺失功能路线图 E1 子计划②。冷数据 bounce_remaining/visited_targets/decay/range;
CastStats.bounce_add + _apply_modifier 折叠 + _push_projectile 写 cold(含分支快照);
_check_collision 弹跳分支(bounce优先于pierce)+_find_nearest_unvisited;modifier_bounce 词条。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-24 14:44:53 +08:00 |
|
 joywayerandClaude Opus 4.8
|
cd5f4d5892
|
docs(roadmap): E1-① 元素抗性完成,勾除现状项(含 DOT 抗性已知限制→E2)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-24 12:12:32 +08:00 |
|
 joywayerandClaude Opus 4.8
|
a17e3aa2af
|
feat(resist): 设计器敌人页增元素抗性网格(6×5) + _save 写 resistances(全0省略)
主表下方加 6原型×5元素(火/冰/雷/毒/奥) SpinBox 网格(-0.9~0.9);_save 汇总
非零抗性写入 resistances,全0则省略键。读写往返 MCP 实测 FAILS=0
(读种子 fire0.5/ice-0.5,写非零、零值省略、负值保留)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-24 12:08:11 +08:00 |
|
 joywayerandClaude Opus 4.8
|
fe1d1f690f
|
feat(resist): EnemyManager 元素抗性加载+命中查表;enemies.json Fast 种子抗火弱冰
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-24 11:51:53 +08:00 |
|
joywayer
|
abe057edf8
|
docs(plan): E1-① 元素抗性逐任务实现计划(3 任务 · lambda-MCP 实测)
|
2026-07-24 11:49:51 +08:00 |
|
 joywayerandClaude Opus 4.8
|
e87e453abf
|
docs(spec): E1-① 元素抗性设计——apply_damage_from_context 查表 + enemies.json resistances + 弱点(负抗)
缺失功能路线图 E1 子计划①。元素链路已通,仅补敌人抗性数据+命中查表:
enemies.json 每型可选 resistances{元素名:-0.9~0.9},EnemyManager 按 ctx.damage_type
查表传入 calc_damage(0,res);护甲不动;物理无抗性;设计器加抗性网格。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-24 11:45:28 +08:00 |
|
 joywayerandClaude Opus 4.8
|
83dc1196ae
|
docs(roadmap): E6-a 玩家无敌帧完成,勾除现状项
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-24 09:32:02 +08:00 |
|
 joywayerandClaude Opus 4.8
|
e490e6075a
|
feat(iframe): 设计器平衡页增 player_iframe_sec 栏;_save 改合并式修复丢键
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-24 09:27:28 +08:00 |
|
 joywayerandClaude Opus 4.8
|
f204b919ff
|
feat(iframe): 无敌期间玩家节点 8Hz 方波闪烁反馈
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-24 09:23:01 +08:00 |
|
 joywayerandClaude Opus 4.8
|
23644bb40b
|
feat(iframe): PlayerStats.take_damage 时间戳门控无敌窗口 + 复活 PLAYER_DAMAGED emit;移除死订阅
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-24 09:18:54 +08:00 |
|
 joywayerandClaude Opus 4.8
|
daf34ac1bb
|
feat(iframe): balance.json 增 player_iframe_sec 键 + SettingsManager 访问器(默认0.5s)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-24 09:15:48 +08:00 |
|
joywayer
|
c756423d57
|
docs(plan): E6-a 玩家无敌帧逐任务实现计划(5 任务 · TDD-MCP 实测)
|
2026-07-24 09:11:33 +08:00 |
|
 joywayerandClaude Opus 4.8
|
383791db14
|
docs(spec): E6-a 玩家无敌帧设计——take_damage 单点门控 + 复活 hurt 反馈 + 数据驱动时长
缺失功能路线图 E6-a 先行小项。受击后 0.5s 无敌窗口(时间戳门控,
杜绝多弹同帧连扣血);顺带复活当前死代码的 PLAYER_DAMAGED emit 与
hurt 音效;spend_hp_cost 自伤不受影响;时长入 balance.json + 设计器。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-24 09:08:04 +08:00 |
|
 joywayerandClaude Opus 4.8
|
0fb2cf6646
|
chore(gdextension): 停止跟踪编辑器 ~ 临时交换 DLL 与 .obj.import 边车
aa69c0e 误将构建生成物纳入版本控制,其中编辑器 ~ 前缀临时交换 DLL 会被运行中的
Godot 锁定,导致切分支/合并时反复冲突(本次合并即因它中断)。改为:
- .gitignore 新增 gdextension/**/~* 与 gdextension/**/*.obj.import 规则;
- git rm --cached 三个生成物(保留本地文件):
bin/~libspellforge_native...dll、src/*.obj.import ×2。
保留已构建的 debug .dll(bin/libspellforge_native...dll)——按原 .gitignore 注释
「开箱即用」的既定意图,其内容稳定、不引发反复冲突。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-23 16:51:00 +08:00 |
|
 joywayerandClaude Opus 4.8
|
1215b08e88
|
docs(dev): 新增原生迁移笔记——GDScript 别名陷阱 + C#/C++ 激活期接缝一致性项
沉淀两类内容并登记 docs_dev 索引:
① GDScript 陷阱:PackedArray 返回值是活引用别名(非 CoW 副本),复用成员缓冲后 return
会被调用方遍历期间的嵌套调用就地覆写(query_circle 复用优化翻车、已回退的教训),
附实测证据 + 通用规则(默认每次新建;省分配用 out 参数+各调用点独立缓冲)。
② C#/C++ 激活期接缝一致性项:SpatialGridCs 网格常量已对齐(已修);
EnemyManager 原型字典 _SPEED/_ARMOR 内循环逐敌查,迁移期须在 C# 侧从 enemies.json
自建原生数组以守 ADR-L1 铁律(a),现在不改(避免投机 churn)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-23 16:38:55 +08:00 |
|
 joywayerandClaude Opus 4.8
|
2a7658e0e3
|
fix(hot-path): 回退 query_circle 复用缓冲优化——存在重入覆写 bug
上个提交 35c1742 让 query_circle 复用成员 _query_result 缓冲,实测有重入缺陷:
GDScript 的 PackedArray 返回值是活引用别名(非写时复制副本),当调用方遍历返回
的 hits 期间触发嵌套 query_circle(命中→SpellEvaluator.execute_sub 的区域法术),
嵌套调用的 clear()+append 会就地覆写外层正在遍历的同一缓冲,导致碰撞遍历读到错误
实体 ID。编辑器内已复现:外层期望 [10,20,30],重入后实得 [10,88]。
原优化仅省约 0.064ms/帧(帧预算 ~0.4%),不值得为其做跨 4 处调用点的 out 参数
+ 各自持久缓冲的重入安全改造,故回退为每次新建数组。
BulletManager 无冷数据命中快路径无重入问题,保留。
并加注释说明此处禁止复用缓冲的原因。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-23 16:35:31 +08:00 |
|
 joywayerandClaude Opus 4.8
|
7038505880
|
fix(csharp): SpatialGridCs 网格常量/坐标偏移对齐 GDScript 外壳(激活陷阱)
休眠的 C# 内核 SpatialGridCs 与权威外壳 spatial_grid.gd 三处不一致,
一旦按 ADR-L1 激活即塌:
- 网格尺寸 64×64 → 128×128(覆盖 4096²→8192²,与 GDScript 一致)
- 补 GridOffset=4096:Insert / QueryCircle 的格映射改为 (coord±radius+4096)/64,
修复负坐标实体全塌到 0 格、覆盖范围减半的问题。
两骨架 BulletManagerCs/EnemyManagerCs 仅读 _active_count 打计时,无 SoA 常量对齐问题。
dotnet build 通过(0 警告 0 错误)。保持休眠(_cs_node 仍恒 null,GDScript fallback 运行)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-23 16:32:39 +08:00 |
|
 joywayerandClaude Opus 4.8
|
35c1742b4c
|
perf(hot-path): SpatialGrid.query_circle 复用结果缓冲 + BulletManager 无冷数据命中快路径
纯 GDScript 层零成本优化(不引入 C#/C++,遵循「先测量后优化」):
- spatial_grid.gd: query_circle 改用持久成员 _query_result(clear()+append 就地填充后返回),
避免每次调用(每帧 1500+ 次)新建 PackedInt32Array。经引擎实测 ~11% 提速、逐点校验
2000 次查询结果与原实现完全一致;CoW 语义保证嵌套查询(命中→SpellEvaluator 区域查询)
不破坏调用方正在遍历的旧结果。
- bullet_manager.gd: _check_collision 命中处理为无冷数据的普通子弹加快路径,
避免 _bullet_contexts.get(bullet_idx, {}) 每次命中都分配空字典默认值 + 5 次字典查。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-23 16:13:33 +08:00 |
|
joywayer
|
74c86b3431
|
c# c++的可行性
|
2026-07-23 16:03:10 +08:00 |
|
 joywayerandClaude Opus 4.8
|
aa69c0e2d4
|
chore(build): 搭建并验证 C# / C++(GDExtension) 原生构建环境(4.7.1 Mono)
为「GDScript→C#→C++」性能逃生梯备好可随时启用的工具链,运行时仍 100% GDScript。
C#:新增根 Rogue.csproj(Godot.NET.Sdk/4.7.1,net8.0,程序集名 Rogue);
csharp/ 下既有 3 个骨架 .cs 现可编译,dotnet build 与编辑器 --build-solutions 均 0 错通过。
C++:gdextension/ 下加 godot-cpp 子模块(master,因无 4.6/4.7 分支,配合本工程 dump 的
4.7.1 extension_api.json + gdextension_interface.h 经 custom_api_file 精确匹配 ABI);
SConstruct + 示例扩展 SpellforgeNative(含 PackedFloat32Array 零拷贝热路径写法);
SCons 自动探测 MSVC 构建出 debug .dll,headless 冒烟验证类注册/调用通过
(CLASS_EXISTS=true / multiply=42 / scale_inplace 正确)。
配套:.gitignore 忽略编译中间产物、保留 debug .dll 开箱即用;gdextension/README.md 记录构建/激活/升级流程;
CLAUDE.md 修正引擎版本 4.6→4.7.1 并更新「环境已就绪但休眠」现状。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-23 15:53:39 +08:00 |
|
 joywayerandClaude Opus 4.8
|
0561377492
|
docs(claude): 编程语言规范新增 C++(GDExtension)极限内核一级
将性能优化定义为逐级逃生梯 GDScript→C#→C++,仅当上一级 profile 证明不够才下探;
C++ 用于连 C# 都不够的 SIMD/手工内存密集内核,代价最高须实测背书;接口壳+原生内核回退模式与验证要求统一覆盖 C#/C++。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-23 15:25:50 +08:00 |
|
 joywayerandClaude Opus 4.8
|
2da6d6e94e
|
docs(claude): 新增编程语言规范(GDScript/C#)—— GDScript 为主力、C# 仅热路径逃生舱
明确双语定位与「用对语言而非用多语言」原则:记录运行时现状(100% GDScript、csharp/ 为死骨架)、
GDScript 性能纪律、C# 引入门槛(profile + .csproj + ADR-L1 三铁律)、跨界成本 R-08、两层回退模式。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-23 15:23:42 +08:00 |
|
 joywayerandClaude Opus 4.8
|
09b2e1dd1d
|
docs(roadmap): 缺失功能路线图 —— 7 史诗分组+优先级+切分+验收(战斗深度/经济/循环/Boss深化 为 P0/P1)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-23 15:11:10 +08:00 |
|
joywayer
|
95e5587049
|
fix(boss): HUD 阶段提示改 tr(STATUS_BOSS_PHASE)+4语言 .po;register_boss 未知 boss_type push_error
|
2026-07-23 11:07:52 +08:00 |
|
joywayer
|
f8efdc639d
|
fix(boss): 防玩家死亡致命一击重入 —— EnemyBulletManager._swap_and_pop 负数守卫 + BossManager 循环内失效键跳过
|
2026-07-23 10:54:29 +08:00 |
|
joywayer
|
ef83e8191a
|
chore(boss): Boss 阶段+攻击模式系统验收通过(7 招式+敌弹+阶段/召唤/事件运行时实测)
|
2026-07-23 10:44:44 +08:00 |
|
joywayer
|
e06cdf8948
|
feat(boss): HUD Boss 阶段提示 + boss_design.md 现状更新为已实现
|
2026-07-23 10:32:27 +08:00 |
|
joywayer
|
3480255a5a
|
feat(boss): 游戏设计器 Boss 分页(类型/阶段/招式三级字段化表单,双语,禁手写JSON)
|
2026-07-23 10:27:57 +08:00 |
|
joywayer
|
aa516bcb50
|
feat(boss): wave_manager 接入 BossManager(移除旧内联阶段逻辑)+ combat_manager 重置敌弹/Boss
|
2026-07-23 10:22:25 +08:00 |
|
joywayer
|
af535f1ed0
|
feat(boss): 位移/蓄力/近战招式 dash/charge_up/melee(三段式+前摇预警+接管移动)
|
2026-07-23 10:17:18 +08:00 |
|
joywayer
|
c566eb16a0
|
feat(boss): 瞬时远程弹幕招式 ring/spread/aimed/spiral(经 EnemyBulletManager 发射)
|
2026-07-23 10:12:21 +08:00 |
|
joywayer
|
f8b05551e2
|
feat(boss): BossManager 阶段状态机+漂移移动+进阶召唤+BOSS_PHASE_CHANGED/KILLED(招式骨架)
|
2026-07-23 10:06:28 +08:00 |
|
joywayer
|
2ed7b625bb
|
feat(boss): data/bosses.json — Mini(4)/Final(5) 三阶段招式配置(7 种 kind 全覆盖)
|
2026-07-23 10:03:24 +08:00 |
|
joywayer
|
531706ba62
|
feat(boss): EnemyManager 外部驱动移动接口(register/unregister_external_mover + set_entity_pos + 跳过)
|
2026-07-23 10:00:14 +08:00 |
|
joywayer
|
d4291722e8
|
feat(boss): combat_s2 敌方子弹 MultiMesh 渲染层(红粉区分玩家弹)
|
2026-07-23 09:55:22 +08:00 |
|
joywayer
|
f5d94a52f0
|
feat(boss): 新增 EnemyBulletManager 敌方子弹子系统(SoA 池 + vs 玩家碰撞)
|
2026-07-23 09:49:32 +08:00 |
|
 joywayerandClaude Opus 4.8
|
f4b8afed8a
|
docs(boss): 标注 §2.1 旧草案 Boss 事件编号(15/16/17)已被 29/30 取代/未实现
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-23 09:47:28 +08:00 |
|
joywayer
|
29d387aebc
|
feat(boss): 事件常量 BOSS_PHASE_CHANGED=29 / BOSS_KILLED=30 + 目录同步
|
2026-07-23 09:43:44 +08:00 |
|
 joywayerandClaude Opus 4.8
|
fb90e13dd7
|
docs(plan): Boss 阶段+攻击模式系统实现计划(12 任务,MCP 运行时验证)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-23 09:39:25 +08:00 |
|
 joywayerandClaude Opus 4.8
|
049e5930d6
|
docs(spec): Boss 招式增加近战 melee(原地近身范围打击)
区别于 dash 横穿冲撞,melee 为原地劈砍/砸地:前摇预警→melee_radius
内判定扣血→后摇。同步更新范围/设计器 kind 列表/验证项。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-23 09:29:50 +08:00 |
|
 joywayerandClaude Opus 4.8
|
7989d8d0fd
|
docs(spec): Boss 阶段+弹幕/位移攻击模式系统设计
阶段状态机 + 攻击模式注册表(环/扇/瞄准/旋转 + 冲刺/蓄力)+ 新建
EnemyBulletManager 敌方子弹 + 保留召唤援军 + 事件 29/30 + bosses.json
与设计器 Boss 分页。范围外:场地机制/通关演出/无敌帧/.tres。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-23 09:17:40 +08:00 |
|
joywayer
|
ef65cba162
|
docs(handbook): 07 游戏设计器同步字段化表单/双语/行编辑器现状
|
2026-07-22 15:52:52 +08:00 |
|
joywayer
|
17f6ce2ff0
|
docs: CLAUDE.md 新增编辑器插件/游戏设计器开发规范(字段化、撑满、双语、验证)
|
2026-07-22 15:40:27 +08:00 |
|
joywayer
|
831bb8d2a5
|
merge(designer): edges/aether_thresholds 改整数元组行编辑器(去 JSON)
|
2026-07-22 13:41:10 +08:00 |
|
joywayer
|
3b36c6e20a
|
chore(designer): 追踪 tuple_list_editor.gd.uid(与其它组件一致)
|
2026-07-22 12:27:24 +08:00 |
|
joywayer
|
04b6781678
|
feat(designer): 平衡碎片阈值改行编辑器(去 JSON)
|
2026-07-22 12:17:33 +08:00 |
|
joywayer
|
3b4a5f674c
|
feat(designer): Core 电路边改行编辑器(去 JSON)
|
2026-07-22 12:15:19 +08:00 |
|
joywayer
|
0d6d511c86
|
feat(designer): 新增整数元组列表行编辑器组件
|
2026-07-22 12:09:47 +08:00 |
|
joywayer
|
064b225e0b
|
docs(designer): 修正计划 — 行编辑器成员变量不标注类型
|
2026-07-22 12:08:15 +08:00 |
|
joywayer
|
4fee708287
|
docs(designer): 整数元组列表编辑器实现计划
|
2026-07-22 12:05:56 +08:00 |
|
joywayer
|
0967b3f10b
|
docs(designer): 整数元组列表编辑器设计(edges/aether 去 JSON)
|
2026-07-22 12:02:46 +08:00 |
|
joywayer
|
2e9b4be702
|
merge(designer): UI 优化(输入框撑满 + 元素复选框 + 双语标签 + 共鸣元素下拉)
|
2026-07-22 11:59:40 +08:00 |
|
joywayer
|
f8e810a2c0
|
docs(spell-editor): 元素标签改复选框说明
|
2026-07-22 11:14:42 +08:00 |
|
joywayer
|
c08d526a18
|
feat(designer): 波次/Core/状态 枚举标签归一为中英双语
|
2026-07-22 11:13:54 +08:00 |
|
joywayer
|
d17a4579d5
|
feat(designer): 共鸣配方元素 A/B 改下拉 + 匹配方式双语
|
2026-07-22 11:12:51 +08:00 |
|
joywayer
|
95af2e1db6
|
feat(spell-editor): 元素标签改复选框 + 选项双语显示
|
2026-07-22 11:11:27 +08:00 |
|
joywayer
|
1f00720f44
|
feat(designer): 输入框撑满面板 + 共享元素词表常量
|
2026-07-22 11:01:22 +08:00 |
|
joywayer
|
7b0843d8a9
|
docs(designer): UI 优化实现计划
|
2026-07-22 10:57:43 +08:00 |
|
joywayer
|
48d417d049
|
docs(designer): 既有双语标签归一为「中文 English」序
|
2026-07-22 10:54:14 +08:00 |
|
joywayer
|
d95ed67e63
|
docs(designer): UI 优化设计(布局撑满 + 元素复选框 + 双语标签)
|
2026-07-22 10:39:52 +08:00 |
|
joywayer
|
fffacf35c5
|
4.7版本打开
|
2026-07-22 10:15:27 +08:00 |
|
joywayer
|
b05e5c1f35
|
项目设置
|
2026-07-22 10:07:11 +08:00 |
|
joywayer
|
ce54998cdb
|
merge(spell-editor): 法术编辑器并入 game_designer + 字段化表单
|
2026-07-21 16:17:06 +08:00 |
|
joywayer
|
ac8a4e4392
|
docs(spell-editor): 清理对已删除 spell_editor 目录的悬挂引用
|
2026-07-21 16:15:06 +08:00 |
|
joywayer
|
ed89387f2e
|
docs(spell-editor): 手册改为字段化表单 + game_designer 入口
|
2026-07-21 16:09:33 +08:00 |
|
joywayer
|
29efa986c5
|
chore(spell-editor): 追踪 spell_tab.gd.uid(与其它 tab 一致)
|
2026-07-21 16:08:13 +08:00 |
|
 joywayerandClaude Opus 4.8
|
3e189206d5
|
refactor(spell-editor): 并入 game_designer tab,移除独立 spell_editor 插件
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-21 16:07:26 +08:00 |
|
joywayer
|
d7e051ffde
|
feat(spell-editor): 新增 game_designer 法术 tab(字段化表单)
|
2026-07-21 16:04:53 +08:00 |
|
joywayer
|
1a86757a77
|
docs(spell-editor): 字段化表单实现计划
|
2026-07-21 16:00:14 +08:00 |
|
joywayer
|
c7b6c9c0fa
|
docs(spell-editor): 法术编辑器并入 game_designer + 字段化表单设计
|
2026-07-21 15:54:09 +08:00 |
|
 joywayerandClaude Opus 4.8
|
93dffd71e1
|
merge(mana): Mana 系统完整化(递增蓝耗+infinite卖血+多来源魔力虹吸+HUD+平衡)
11 任务全绿:balance/PlayerStats/PlayerManager/SpellEvaluator 统一扣蓝门控、
魔力虹吸多来源重算、wand_eternal/heavy_cost/mana_leech 数据、Core 编辑器可调、
HUD 蓝条数字+低蓝+过热、平衡调数值、docs 现状更新、复审 heat 覆盖 LOOP/CIRCUIT+死亡防重入。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-21 15:37:03 +08:00 |
|
 joywayerandClaude Opus 4.8
|
4725c57c72
|
fix(mana): heat 依真实扣蓝(ctx标记)覆盖 LOOP/CIRCUIT 子路径+卖血不升热;死亡防重入
复审 nit:
- heat 之前仅在主循环 cast_fired 记录,LOOP 体/CIRCUIT 分支扣蓝漏记 → 递增蓝耗对这两类拓扑失效。
改为 _charge_mana 真实 spend_mana 成功时置 ctx.mana_spent_this_cast,施法末据此升 heat。
- 顺带修正 infinite 卖血(未真实扣蓝)也升 heat 的问题:卖血不升热。
- combat_manager._on_player_died 加 GAME_OVER 防重入(子弹命中+卖血同帧双死不重复结算)。
MCP 实测:LOOP heat 0.010(修复前0)、卖血 heat 0、线性回归 0.010。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-21 15:35:11 +08:00 |
|
 joywayerandClaude Opus 4.8
|
0fd01caebb
|
chore(mana): 完整化验收通过(Godot 4.6 运行时实测各机制+回归全绿)
递增蓝耗 heat/95.5、infinite 扣血 hp99、heavy_cost hp90、
持久内存回归 [0,0,1,0]、击杀回蓝 +10、多来源 leech 重算 999→0、HUD 蓝条数字均实测通过。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-21 15:29:16 +08:00 |
|
joywayer
|
a3ab2aa6cd
|
docs(mana): §4.1/§5.A 现状更新为 Mana 完整化已实现
|
2026-07-21 15:27:08 +08:00 |
|
joywayer
|
81f53e9435
|
balance(mana): 提高基础回蓝(+3)+降 spark 蓝耗(→3),基础杖能持续突突
|
2026-07-21 15:23:04 +08:00 |
|