## 刷新账件:三选一刷新三源账唯一所有者(X 刷新件每碰三选一重给/优先消耗不结转、Y 营地升级行 ## 冒险周期池/用完即无、刷新券存量账/冒险级跨停点持久)+GP 付费刷计数与报价公式 ## (ceil(商店基价×曲线^本次停点已付费刷)——与商店货架刷新同两个调参旋钮,单点调参)。 ## 零停点态依赖:免费/付费支出的编排归 CurioStop(查停点态→本件支出→重抽重发),本件只记账。 ## 断点自交片段(refresh_stock/attune_refresh_y 两键,Y 缺键回退参数面)——拼盘落盘归冒险应用层。 ## Core 层零 UI;随机零消费。 class_name RefreshBank extends RefCounted var db: ConfigDb var _refresh_x := 0 # 刷新件余量(每碰三选一重置=X 表值;优先消耗、不结转) var _refresh_y := 0 # Y 冒险周期池(开局参数面注入,用完即无——营地升级行表值) var _paid_refreshes := 0 # 本次停点已付费刷新次数(对齐商店 MC-1——GP 刷新价曲线输入,随停点创建清零=与商店进店清零同构) var _refresh_stock := 0 # 刷新存量账(冒险级——刷新券加仓;**不经 _refresh_x**:X 每停点重置会吞存量=写错账缺陷 F-1) var _refresh_x_cap := 0 # 刷新件余量基数(装配集 effect_kinds 含 bonus_refresh 的行 magnitude 合计—— # 宿主冒险开始时预算注入;装配集冒险期间锁死〔契约 8〕故预算与逐停点查询等价) func _init(db_ref: ConfigDb) -> void: db = db_ref # 刷新件基数注入(宿主 start_adventure/resume 时点计算——X 每碰三选一重置回此基数) func set_refresh_x_cap(total: int) -> void: _refresh_x_cap = maxi(0, total) # X 每碰三选一重置回基数(不结转——宿主停点开启时点调用) func reset_x() -> void: _refresh_x = _refresh_x_cap # Y 池注入(冒险开始/续玩参数面——宿主单写) func set_refresh_y(v: int) -> void: _refresh_y = maxi(0, v) func refresh_y() -> int: return _refresh_y # 刷新存量账加仓(refresh_stock_grant 装配即得一次性加仓——只入存量账、临时账不动=V8 契约) func add_refresh_stock(n: int) -> void: _refresh_stock += n # 刷新存量账读数(T4——刷新券加仓余量单独读面;呈现层与断点消费) func refresh_stock() -> int: return _refresh_stock # 当前可刷新次数(X 优先 + Y 池 + 刷新存量账——呈现层余量读数口) func free_left() -> int: return _refresh_x + _refresh_y + _refresh_stock # 免费位消耗(X→Y→存量消耗序逐字;三源全空 false 零副作用) func spend_free() -> bool: # 免费位消耗序:X(刷新件每停点重给,优先消耗)→ Y(营地冒险周期池)→ 存量账(刷新券加仓, # 跨停点持久) if _refresh_x <= 0 and _refresh_y <= 0 and _refresh_stock <= 0: return false if _refresh_x > 0: _refresh_x -= 1 elif _refresh_y > 0: _refresh_y -= 1 else: _refresh_stock -= 1 return true # 付费刷计数递增(对齐商店 MC-1——免费位 X/Y 用尽后转付费,同旋钮同曲线同钱包) func charge_paid() -> void: _paid_refreshes += 1 # 付费刷计数随停点清零(对齐商店进店清零) func reset_paid() -> void: _paid_refreshes = 0 # 本次 GP 付费刷新价(与商店货架刷新同源:ceil(基价 × 曲线^本次停点已付费刷)) func gp_cost() -> int: return int(ceil(float(db.adventure.shop_refresh_cost_base) * pow(db.adventure.shop_refresh_cost_curve, float(_paid_refreshes)))) # 冒险级复位(宿主 reset_adventure_state 调用——刷新三源与付费计数全零) func reset_all() -> void: _refresh_x = 0 _refresh_y = 0 _paid_refreshes = 0 _refresh_stock = 0 # ---- 断点自交片段(应用层拼盘口收件——本件只交自己的账)---- # 片段键:refresh_stock/attune_refresh_y func breakpoint_fragment() -> Dictionary[Variant, Variant]: return { "refresh_stock": _refresh_stock, "attune_refresh_y": _refresh_y, } # 片段回填(刷新存量/Y 池。存量缺键缺省 0(clamp 类);Y 余量优先读断点(花掉不回血=堵 # 「用完退菜单再续玩满血复活」可利用漏洞);缺键=旧版断点,回退参数面整额注入(旧档行为零变化) # ——params_fallback 类) func restore_fragment(frag: Dictionary, params: Dictionary) -> void: _refresh_stock = maxi(0, int(frag.get("refresh_stock", 0))) # 旧档缺键缺省 0(clamp 类) _refresh_y = maxi(0, int(frag.get("attune_refresh_y", int(params.get("attune_refresh_y", 0)))))