get_sellable_attrs() 此前只看 attributes.json 是否有 shop 段,不看 PlayerStats 是否真的实现了该属性。运行时实测:给一个合成属性加 shop 段(不改任何代码)会被列出、 可买、扣钱、购买计数增加,但 get_attr_value 永远读到 0.00——玩家买到的是空气, 且 _at_soft_cap 因为 0.0 < soft 永远不封顶,变相无限花钱买无效果。 PlayerStats 新增 has_attr(attr_id) 谓词(查 _attr_effective,只有 _recompute_attrs 真正算过的属性才算数,不是查 _attr_def 有没有这一节);get_sellable_attrs 用它做 第二道过滤。诊断特意拆进独立函数 _report_unwired_shop_attrs 才调用 push_error+assert—— 实测 assert(false) 在本项目运行环境下会让「当前函数」提前返回声明类型的默认值:若诊断写 在收集循环里,一旦命中就会让 get_sellable_attrs 本身连同已收集好的合法属性一起返回空数组, 比原来的「静默卖空气」更糟(整个货架消失);拆成独立函数调用后,中断只发生在诊断函数 自己的调用帧内,调用方(get_sellable_attrs)仍会正常继续并返回过滤后的正确列表。 已注入未接线属性验证:4 个合法属性照常出现,注入项被排除,无一致性问题。 顺带订正路线图 docs_dev/plans/2026-07-23-missing-features-roadmap.md 里「加 shop 段 即可上架、零代码」的表述——该结论只在属性已先接入 PlayerStats 框架(player_stats.gd 的裸字段 + _recompute_attrs 分支 + _attr_effective 条目,以及 attribute_tab.gd 的 ATTR_ORDER)之后才成立,E3-① 延后的 7 个属性都还没有这一步;同时记录商店属性子面板 当前坐标最多容纳 6 行的限制,供后续实现者提前规划。
docs_dev —— 开发过程 / 归档文档
本目录存放开发过程中产生的计划、追踪与历史归档类文档,与
docs/(面向产品的设计规范与架构参考)区分开。产品文档索引见
../docs/README.md。
| 文档 | 类型 | 内容简述 |
|---|---|---|
| doc_code_audit_2026-07-20.md | 审计 | 文档 vs 代码交叉审计:三大结构性分歧、更优/偏离/未实现分类清单、潜在 bug、文档内部矛盾(2026-07-20) |
| 2026-07-23-native-migration-notes.md | 笔记 / 迁移备忘 | ① GDScript 陷阱:PackedArray 返回值是活引用别名,复用缓冲会被重入覆写(query_circle 优化翻车教训);② C#/C++ 激活期接缝一致性项:SpatialGridCs 常量对齐(已修)、EnemyManager 原型字典需 C# 侧自建原生数组(待办·迁移期) |
| development_plan.md | 计划 / 追踪 | S0–S6 骨架垂直切片开发计划、技术风险登记表、各切片验收与出口检查、P-S* 任务勾选 |
| certification_checklist.md | 计划 / 追踪 | Steam / Nintendo Switch 平台发行认证清单,映射到对应切片,含状态列 |
| archived_cocos_architecture_draft.md | 归档(已废弃) | 早期基于 Cocos Creator 3.x / TypeScript 的架构草案。项目已迁移至 Godot 4.6,权威架构见 ../docs/technical/architecture_design.md |
说明:这些文档中以文件名(如
architecture_design.md §4.5)方式引用的权威架构/实现文档,均位于../docs/technical/下。