ShopManager.reset() 此前从未被任何地方调用(grep 零命中):PlayerStats.reset_for_run() 只清 _modifiers,_attr_purchases 不清,两份状态跨局错开——新局价格从已购价起算、 UI 显示「已购 N 次」却生效值是基准值,且买任意一件属性会把整份旧 _attr_purchases 重新套用回 PlayerStats(复现:hp_max 购买 2 次后重开局,加成消失但计数还在; 再买一次 hp_max 后旧的两次加成随之复活)。在 start_game() 内 PlayerStats.reset_for_run() 之后调用 ShopManager.reset()——顺序不能反,reset() 会撤销 shop_c 加成,须晚于 reset_for_run() 清空 _modifiers 之后才不会把两处清理搅乱。