Files
gplan-2/game/core/refresh_bank.gd

112 lines
4.7 KiB
GDScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 刷新账件:三选一刷新三源账唯一所有者(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)))))