112 lines
4.7 KiB
GDScript
112 lines
4.7 KiB
GDScript
## 刷新账件:三选一刷新三源账唯一所有者(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.run.adventure.shop_refresh_cost_base)
|
||
* pow(db.run.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)))))
|