Commit Graph
3 Commits
Author SHA1 Message Date
joywayerandClaude Opus 5 7884e43147 fix(attr): 补齐属性页最后两条静默改写数据的诊断,并订正两处注释
1. 条目缺失时无任何诊断(上一轮 `and not d.is_empty()` 引入的回归)。
   attributes.json 格式良好但少了 hp_max 时,_loaded 仍为 true、保存照常,
   _collect 写出 {"base":0,"soft":0,"hard":0,"combine":"hybrid"}。更糟的是这个键
   从此「存在」,player_stats.gd 的「缺少属性」报错也不再触发,hp_max=0 完全静默
   进游戏;而 hard=0 在 hybrid 下意味着不钳制,连兜底都没有,玩家瞬死。
   改为 if d.is_empty() 单独 push_warning,与 combine 那条对称。

2. min=0.0 引入的负值静默钳制同样无诊断("move_speed":{"base":-50} → 写回 0)。
   运行时本就把生效值钳到 ≥0,但静默改写权威数据正是 combine 警告要防的事,
   并入同一警告块保持处理对称。

3. _clean 的注释末句由描述改为禁令。原文「当前 12 个值并不依赖本函数」是事实,
   但读起来像绿灯,而删掉它一直无害——直到有人放宽 min,也就是它存在的唯一场景。

4. _collect 的注释夸大了:未知键只有是对象时才存活,顶层标量键会让 _load 整体
   拒绝加载。改为「保留未知属性条目」。

实测:缺 hp_max 与 base=-1234.5 两条警告均如实发出;未改动的 attributes.json
连建三次零警告零报错(误报比不报更糟,已专门验证)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 12:35:12 +08:00
joywayerandClaude Opus 5 36c4f79f10 fix(attr): 属性页提示自动换行、加载失败拒绝写回、收紧 SpinBox 下限
三处评审必修:

1. 提示 Label 未换行,在 dock 里被裁掉。该 Label 最小宽度 786px,autowrap 为
   AUTOWRAP_OFF,而 designer_panel 的 ScrollContainer 禁用横向滚动、同侪分页实际
   宽度 337–887px —— 被裁的正是「inverse 的 hard 是下限」这半句,即这条提示存在的
   全部理由。加 AUTOWRAP_WORD_SMART,最小宽度降到 17px,337px 下 4 行全可见。
   同时补两处内容缺漏:add_int 下 hard=0 同样表示不钳制(cpu_limit 就是 add_int,
   还是第一行);soft 本期无消费方,注明「留给货架 C」。

2. 加载失败后保存会写出打砖游戏的文件。_data 为空时 _collect 产出四条全 0、无
   display_name 的合法 JSON,PlayerStats 照单全收 → move_speed.base=0、hp_max.base=0
   直接进游戏,玩家不能移动/瞬间死亡且零诊断。加 _loaded 标志:加载失败 push_error,
   _save 开头守卫拒绝写回。并按 player_stats.gd 的既有做法加逐条 is Dictionary 守卫
   (畸形条目如 "hp_max": 5 原会硬崩、dock 停在半构建状态)。

3. SpinBox 下限收紧到 0.0,并订正上一版注释里的误诊。噪声不是「按 step 吸附」的
   普遍现象,而是 Range 的 round((v-min)/step)*step+min 在 |min| 远大于 |v| 时的抵消
   误差(min=-99999 与 step=0.01 相差七个数量级)。实测:min=-99999 且不用 _clean 时
   漂移 2 处,min=0 且不用 _clean 时漂移 0 —— 收紧 min 才是真解法,_clean 并非必需。
   四个属性按定义均非负,故 min=0 也更贴语义。_clean 保留作宽区间属性的廉价保险。

另:无法识别的 combine 改为 push_warning 后回落 hybrid(打字错误不该硬拒)。
按评审裁决不给 COMBINE_KEYS[selected] 加 clampi(UI.opt 已 clamp,不可达),改留注释记依赖。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 12:26:09 +08:00
joywayerandClaude Opus 5 a0e205a031 feat(attr): 游戏设计器新增「属性」页,字段化编辑 attributes.json
按 CLAUDE.md 编辑器插件规范:控件经 designer_ui 工厂创建、标签中英双语中文在前、
combine 下拉存 key 不存显示串、_save 合并式写回防丢键、UI 在 _ready 而非 _init 构建。

另修:SpinBox 按 step 吸附会引入双精度噪声(0.01 → 0.00999999999476),
直接写回会把噪声固化进 JSON;_collect 用 snappedf(v, 1e-6) 抹平,
使「不改任何值就保存」得到逐位一致的 attributes.json。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 12:05:50 +08:00