批末修复: 类缓存陈旧暴露的解析错九处清偿——meta_progression六处Variant推断显式类型化/ battle_orchestrator:683 last_round_end属性→方法调用(K5漏网消费点,卡面实查只记minesweeper_rules:495)/ui_kit _paint_beams静态化/_build_curio括号配平+gp_summary lambda提_gp_summary_cb承载/curio_interact_controller补ctx成员+_init垃圾行清除+八处旧成员读点改ctx束地址/curio_pick_overlay _build_body重复段删除/board_zone_view悬空调用删+vb传参/board_cell_unit treasure_mark改st.前缀;根因=T2a-T4改写期套件停跑+editor扫描被main_ui_build解析错级联遮蔽,gdstyle宽松解析不拦;--editor --quit全量扫描0错
This commit is contained in:
1 parent
7beb9bfdd5
commit
078979410a
17 files changed
+40
-57
No files matched your search
@@ -680,7 +680,7 @@ func _roll_round_actions() -> void:
|
||||
# 容器内直读主角行)
|
||||
var facts := {
|
||||
"round_index": round_index,
|
||||
"last_round_end": "none" if (action_economy.last_round_end as Dictionary).is_empty() else String((action_economy.last_round_end as Dictionary).get("path_tag", "none")),
|
||||
"last_round_end": "none" if action_economy.last_round_end().is_empty() else String(action_economy.last_round_end().get("path_tag", "none")),
|
||||
"mines_hit_last": int(_mines_hits["last"]),
|
||||
"mines_hit_total": int(_mines_hits["total"]),
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
uid://dpy0a6fcggbwe
|
||||
@@ -0,0 +1 @@
|
||||
uid://du0gxv0lnrxnp
|
||||
@@ -0,0 +1 @@
|
||||
uid://jaxlqd8ml3co
|
||||
@@ -145,7 +145,7 @@ func forge_buy_level(route_id: String) -> bool:
|
||||
var row: Dictionary[Variant, Variant] = db.crossrun.forge.route(route_id)
|
||||
if row.is_empty() or not _forge_route_unlocked(route_id):
|
||||
return false
|
||||
var lvl := meta_state.forge_state().levels.get(route_id, 0)
|
||||
var lvl: int = meta_state.forge_state().levels.get(route_id, 0)
|
||||
if lvl >= int(row.get("cap", 0)):
|
||||
return false
|
||||
var price := ForgeTable.level_price(row, lvl)
|
||||
@@ -206,13 +206,13 @@ func forge_shop_status() -> Array:
|
||||
var out: Array[Dictionary] = []
|
||||
for row in db.crossrun.forge.route_rows():
|
||||
var rid := String(row.get("route_id", ""))
|
||||
var lvl := meta_state.forge_state().levels.get(rid, 0)
|
||||
var lvl: int = meta_state.forge_state().levels.get(rid, 0)
|
||||
var cap_v := int(row.get("cap", 0))
|
||||
var unlocked := _forge_route_unlocked(rid)
|
||||
var prereq := String(row.get("prereq_route", ""))
|
||||
var plvl := meta_state.forge_state().levels.get(prereq, 0) if prereq != "" else 0
|
||||
var plvl: int = meta_state.forge_state().levels.get(prereq, 0) if prereq != "" else 0
|
||||
var pcap := int(db.crossrun.forge.route(prereq).get("cap", 0)) if prereq != "" else 0
|
||||
var selected := (String(row.get("kind", "")) == "weapon" and meta_state.forge_state().weapon == rid) \
|
||||
var selected: bool = (String(row.get("kind", "")) == "weapon" and meta_state.forge_state().weapon == rid) \
|
||||
or (String(row.get("kind", "")) == "armor" and meta_state.forge_state().armor == rid)
|
||||
out.append({
|
||||
"route_id": rid,
|
||||
@@ -362,7 +362,7 @@ func tree_buy(node_id: String) -> bool:
|
||||
func tree_toggle_fork(group: String, side: String) -> bool:
|
||||
if not db.crossrun.meta_tree.FORK_GROUPS.has(group) or not (side == "a" or side == "b"):
|
||||
return false
|
||||
var cur := meta_state.tree_state().fork_sides.get(group, "")
|
||||
var cur: String = meta_state.tree_state().fork_sides.get(group, "")
|
||||
if cur == "" or cur == side:
|
||||
return false # 未解锁走购买面;同态零操作
|
||||
meta_state.set_fork_side(group, side)
|
||||
@@ -521,7 +521,7 @@ func attune_camp_status() -> Dictionary:
|
||||
"equipped": equipped.has(iid),
|
||||
"unlocked": meta_state.item_unlocked(iid),
|
||||
})
|
||||
var lvl := meta_state.attune_state().refresh_level
|
||||
var lvl: int = meta_state.attune_state().refresh_level
|
||||
var next_row: Dictionary[Variant, Variant] = db.crossrun.meta.attune_refresh_row(lvl + 1)
|
||||
return {
|
||||
"slots": Attunement.slots(db, save),
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
uid://bc5perm32w2yp
|
||||
@@ -0,0 +1 @@
|
||||
uid://dylsba7whx5ql
|
||||
@@ -0,0 +1 @@
|
||||
uid://b88nnsq53mium
|
||||
@@ -0,0 +1 @@
|
||||
uid://bi52mqsld3mpc
|
||||
@@ -0,0 +1 @@
|
||||
uid://c0y3hcpqyv1li
|
||||
@@ -8,18 +8,16 @@ extends RefCounted
|
||||
const Narrator := preload("res://presentation/battle_narrator.gd")
|
||||
|
||||
var db
|
||||
# u13 引用束注入:16 个 _init 抄写成员删除——正文读点改址 ctx 束(u20 三束键名;
|
||||
# _pending_curio/_curio_context 纯内部态保持宿主)
|
||||
var ctx: CurioFlowContext # u13 引用束注入:构造注入 context 活引用(views/getters/flow 三束键名)
|
||||
# _pending_curio/_curio_context 纯内部态保持宿主
|
||||
|
||||
var _pending_curio := {} # 三选一停点载荷暂存(战斗总结结算确认后开三选一面;续玩停点复用)
|
||||
var _curio_context := "level_clear" # 三选一面上下文(level_clear=关卡完成停点→推进下一关 / reward_node=奖励节点→回图选路)
|
||||
|
||||
|
||||
func _init(ctx: CurioFlowContext) -> void:
|
||||
# 构造参数收拢 context 对象(16 参长签名收一处命名面)
|
||||
func _init(ctx_ref: CurioFlowContext) -> void:
|
||||
ctx = ctx_ref
|
||||
db = ctx.db
|
||||
ctx.flow.fatal_screen = ctx.fatal_screen
|
||||
ctx.flow.gp_summary = ctx.gp_summary
|
||||
|
||||
|
||||
# 停点在途判据(组合根 _on_battle_end_continue 分派面——战斗总结确认后开三选一)
|
||||
@@ -41,7 +39,7 @@ func resume_if_pending() -> bool:
|
||||
#(continue_to_next_level 的「停点未兑付拒推进」守卫因此放行)。
|
||||
func _skip_empty_stop() -> bool:
|
||||
ctx.views.toast.show_toast("可用战利品为空——本次三选一跳过", "info")
|
||||
var adventure = _adventure_get.call()
|
||||
var adventure = ctx.getters.adventure_get.call()
|
||||
if adventure != null:
|
||||
adventure.stop().skip_empty_curio() # core 停点消化(其守卫=仅空候选放行)
|
||||
if _curio_context == "reward_node":
|
||||
@@ -88,7 +86,7 @@ func on_presented(payload: Dictionary) -> void:
|
||||
# 奖励节点三选一(与关卡完成三选一共享同池同权重同上限;CurioPickOverlay 共用面)。
|
||||
# 无替换子交互(同调装配不可变,见类头)。
|
||||
func present_node_curio() -> void:
|
||||
var adventure = _adventure_get.call()
|
||||
var adventure = ctx.getters.adventure_get.call()
|
||||
_curio_context = "reward_node"
|
||||
var node_draw: Dictionary[Variant, Variant] = adventure.stop().node_curio_candidates()
|
||||
var node_cands: Array[Variant] = node_draw.get("candidates", []) as Array
|
||||
@@ -111,7 +109,7 @@ func show_pick() -> void:
|
||||
var payload: Dictionary[Variant, Variant] = _pending_curio
|
||||
ctx.flow.open_modal.call(ctx.views.curio_overlay)
|
||||
ctx.views.curio_overlay.open_pick(Narrator.curio_pick_header(payload), _curio_card_texts(payload.get("candidates", []) as Array))
|
||||
var adventure = _adventure_get.call()
|
||||
var adventure = ctx.getters.adventure_get.call()
|
||||
if adventure != null:
|
||||
_feed_refresh_display(adventure) # 刷新面投喂单点
|
||||
ctx.flow.refresh_presentations.call()
|
||||
@@ -119,7 +117,7 @@ func show_pick() -> void:
|
||||
|
||||
# 刷新呈现投喂单点(免费余量 X/Y + GP 付费价 + 冒险钱包可付——读数与商店 set_refresh_display 同构)
|
||||
func _feed_refresh_display(adventure: AdventureRunner) -> void:
|
||||
var runner = _runner_get.call()
|
||||
var runner = ctx.getters.runner_get.call()
|
||||
var gp := int(runner.gp) if runner != null else 0
|
||||
var cost: int = adventure.refresh_bank().gp_cost()
|
||||
ctx.views.curio_overlay.set_refresh_display(adventure.refresh_bank().free_left(), cost, gp >= cost)
|
||||
@@ -154,10 +152,10 @@ func _curio_card_texts(candidates: Array) -> Array:
|
||||
# 同 shop_refresh_cost_base/curve 旋钮、同冒险钱包 runner.gp;关卡完成停点经重发 curio_choice_presented 直落
|
||||
# 选择面,节点停点在此读在途态重 present——零自动推进契约不破,停点仍在途)
|
||||
func on_refresh() -> void:
|
||||
var adventure = _adventure_get.call()
|
||||
var adventure = ctx.getters.adventure_get.call()
|
||||
if adventure == null or not adventure.stop().curio_stop_pending():
|
||||
return
|
||||
var runner = _runner_get.call()
|
||||
var runner = ctx.getters.runner_get.call()
|
||||
var refreshed: bool = adventure.stop().refresh_curio()
|
||||
if not refreshed:
|
||||
# 免费位(X/Y)已穷——GP 付费档(先扣钱包后重抽,余额不足拒绝零副作用)
|
||||
@@ -176,7 +174,7 @@ func on_refresh() -> void:
|
||||
|
||||
|
||||
func on_pick_confirmed(item_id: String) -> void:
|
||||
var adventure = _adventure_get.call()
|
||||
var adventure = ctx.getters.adventure_get.call()
|
||||
if adventure == null:
|
||||
return
|
||||
# TP0 令牌池——卡片 id "kind|tier|feat_id" 拆键(缺 | = 旧载荷防御归普通档;relic 三段)
|
||||
@@ -206,7 +204,7 @@ func on_resolved(result: Dictionary) -> void:
|
||||
func on_continue() -> void:
|
||||
ctx.flow.close_modal.call(ctx.views.curio_overlay)
|
||||
ctx.views.curio_overlay.close_pick()
|
||||
var adventure = _adventure_get.call()
|
||||
var adventure = ctx.getters.adventure_get.call()
|
||||
if _curio_context == "feat_ticket":
|
||||
return # T5 店内专长凭证面——专长兑付完成后关面回店(无推进/无回图)
|
||||
if _curio_context == "reward_node":
|
||||
@@ -223,7 +221,7 @@ func on_continue() -> void:
|
||||
# 数据源=treasure 装配词表 12 件
|
||||
func item_name_lookup() -> Dictionary:
|
||||
var lookup := {}
|
||||
var meta = _meta_get.call()
|
||||
var meta = ctx.getters.meta_get.call()
|
||||
if meta != null:
|
||||
for row in db.crossrun.treasure_items.attunement_rows():
|
||||
lookup[String(row.get("item_id", ""))] = String(row.get("display_name", ""))
|
||||
|
||||
@@ -144,7 +144,7 @@ static func _build_curio(root: Variant) -> void:
|
||||
{"open_modal": root._open_modal, "open_modal_after_playback": root._open_modal_after_playback,
|
||||
"close_modal": root._close_modal, "refresh_presentations": root._refresh_presentations,
|
||||
"fatal_screen": root._fatal_screen,
|
||||
"gp_summary": func() -> String: return root._gp_summary_text({"gp_dropped": root.run_scope.last_gain_amount}}))) # 构造参数收拢 context(u20 三束)
|
||||
"gp_summary": _gp_summary_cb(root)})) # 构造参数收拢 context(u20 三束)
|
||||
root.curio_overlay.pick_confirmed.connect(root._bonus.on_pick_confirmed)
|
||||
root.curio_overlay.continue_pressed.connect(root._bonus.on_continue)
|
||||
root.curio_overlay.refresh_requested.connect(root._bonus.on_refresh)
|
||||
@@ -251,3 +251,8 @@ static func fatal_screen(root: Variant, msg: String) -> void:
|
||||
var l := UiKit.label(msg,UiKit.FS_SUB, true, UiKit.RED_ALERT)
|
||||
l.set_anchors_preset(Control.PRESET_CENTER)
|
||||
root.add_child(l)
|
||||
|
||||
|
||||
# GP 总结行回调(gp_summary 束键——单行 lambda 内嵌字典实参收尾歧义,提函数承载)
|
||||
static func _gp_summary_cb(root: Variant) -> Callable:
|
||||
return func() -> String: return root._gp_summary_text({"gp_dropped": root.run_scope.last_gain_amount})
|
||||
@@ -271,12 +271,7 @@ func _spawn_seal_dot(i: int, base: Vector2) -> void:
|
||||
tw.tween_callback(dot.queue_free)
|
||||
|
||||
|
||||
# ---- 演出密度(程序化 tween,确定性散布,零新帧资产) ----
|
||||
|
||||
var st._crest_bricks: Array[ColorRect] = [] # 纹章碎砖驻留面(close 时回收)
|
||||
var st._fx_crest_shards := 0
|
||||
var st._fx_dust_motes := 0
|
||||
var st._fx_seal_dots := 0
|
||||
# ---- 演出密度(程序化 tween,确定性散布,零新帧资产;计数与碎砖驻留面在 _EndOverlayState) ----
|
||||
|
||||
|
||||
# 碎砖拼纹章(胜利 §2.4——蜡封落定后十枚碎砖自四周向蜡封外环收拢拼成纹章环,驻留至 close)
|
||||
|
||||
@@ -323,7 +323,7 @@ func _draw_bevel() -> void:
|
||||
|
||||
## 变异标记域:真视格=危险红内缩框/未开格伤害型变异=左下角危险红三角
|
||||
func _draw_mutation_marks() -> void:
|
||||
if treasure_mark == "mine_reveal":
|
||||
if st.treasure_mark == "mine_reveal":
|
||||
var inset := st.edge * 0.14
|
||||
draw_rect(Rect2(inset, inset, st.edge - inset * 2.0, st.edge - inset * 2.0),
|
||||
Color(UiKit.RED_MINE, 0.9), false, 2.0)
|
||||
|
||||
@@ -24,7 +24,6 @@ func _init() -> void:
|
||||
vb.add_theme_constant_override("separation", 4)
|
||||
add_child(vb)
|
||||
_build_views(vb)
|
||||
_build_status_corner()
|
||||
|
||||
|
||||
## 视图三件域:AP 条+棋盘区(含动效与 toast 叠层)
|
||||
@@ -37,11 +36,11 @@ func _build_views(vb: VBoxContainer) -> void:
|
||||
vb.add_child(board_area)
|
||||
_board_area = board_area
|
||||
board_area.resized.connect(_on_board_area_resized)
|
||||
_build_board_children(board_area)
|
||||
_build_board_children(board_area, vb)
|
||||
|
||||
|
||||
## 棋盘子件域:视图+动效+toast 三叠层挂接
|
||||
func _build_board_children(board_area: Control) -> void:
|
||||
## 棋盘子件域:视图+动效+toast 三叠层挂接+状态角标+操作提示条(hint 回挂 vb——树序与拆分前一致)
|
||||
func _build_board_children(board_area: Control, vb: VBoxContainer) -> void:
|
||||
board_view = BoardView.new()
|
||||
board_view.set_anchors_preset(Control.PRESET_FULL_RECT)
|
||||
board_area.add_child(board_view)
|
||||
|
||||
@@ -62,28 +62,6 @@ func _build_top_row(top: HBoxContainer) -> void:
|
||||
|
||||
## 主体域:入账信息行+三竖卡列+底部确认/继续钮与免费选择注记
|
||||
func _build_body(box: VBoxContainer) -> void:
|
||||
_label = UiKit.label("",UiKit.FS_BODY, false, UiKit.WARM_SOFT)
|
||||
_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
||||
box.add_child(_label)
|
||||
_choice_box = HBoxContainer.new()
|
||||
_choice_box.add_theme_constant_override("separation", 26) # demo .cards gap 26(T7 对齐)
|
||||
_choice_box.alignment = BoxContainer.ALIGNMENT_CENTER
|
||||
_choice_box.size_flags_vertical = Control.SIZE_EXPAND_FILL
|
||||
box.add_child(_choice_box)
|
||||
var foot := HBoxContainer.new()
|
||||
foot.alignment = BoxContainer.ALIGNMENT_CENTER
|
||||
foot.add_theme_constant_override("separation", 16)
|
||||
box.add_child(foot)
|
||||
_confirm_btn = UiKit.primary_button("确认选择")
|
||||
_confirm_btn.pressed.connect(_on_confirm_pressed)
|
||||
_confirm_btn.visible = false
|
||||
foot.add_child(_confirm_btn)
|
||||
_continue_btn = UiKit.button("继续")
|
||||
_continue_btn.pressed.connect(_emit_continue_pressed)
|
||||
_continue_btn.visible = false
|
||||
foot.add_child(_continue_btn)
|
||||
_foot_hint = UiKit.label("免费选择 · 刷新不消耗 AP",UiKit.FS_HINT, false, UiKit.WARM_FAINT)
|
||||
foot.add_child(_foot_hint)
|
||||
_label = UiKit.label("",UiKit.FS_BODY, false, UiKit.WARM_SOFT)
|
||||
_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
||||
box.add_child(_label)
|
||||
|
||||
@@ -351,7 +351,7 @@ const BEAMS_PEAK := 0.05
|
||||
|
||||
|
||||
## 光带像素域(循环体提函数——12° 斜向光带双三角衰减:带内峰值×纵向衰减逐像素着色)
|
||||
func _paint_beams(img: Image) -> void:
|
||||
static func _paint_beams(img: Image) -> void:
|
||||
var ca := BEAMS_TILT_CA
|
||||
var sa := BEAMS_TILT_SA
|
||||
var beam_col := Color(1.0, 236.0 / 255.0, 200.0 / 255.0)
|
||||
|
||||
Reference in new issue
Block a user