diff --git a/game/presentation/views/battle_stage_view.gd b/game/presentation/views/battle_stage_view.gd index e1108690..daf77336 100644 --- a/game/presentation/views/battle_stage_view.gd +++ b/game/presentation/views/battle_stage_view.gd @@ -41,15 +41,25 @@ var world: Node2D # StageWorld(preload 脚本实例——Node2D 世 func _init(db_ref) -> void: custom_minimum_size = Vector2(0, 252) - # 面板底(PanelContainer 面板样式等价平移——Control 壳不自绘 stylebox,Panel 子面承载; - # 石板皮 = 样张 v2 冻结批 T2——缺位回退 PANEL_DATA flat,渲染观感不变) + # 面板底(圣经 v3.5 批 B4 2026-09-30——§6.1 舞台正面目标落码:B 区=地窟看台,世界底层暗背景 + # Color8(62,52,42)=方向稿 render_battle_screen 取值——替换原浅石板皮〔实测 L0.027 旧深底与 + # 上半米黄割裂的 opposite 端——v3.5 定暖暗中档〕;描边=PANEL_BORDER 同方向稿) var bg := Panel.new() - var sb := UiKit.panel_skinned(Vector4(6, 4, 6, 4), Color(0.956, 0.952, 0.945)) # tint=PANEL_STAGE 对 PANEL_DATA 比值 + var sb := UiKit.panel_flat(Color8(62, 52, 42), UiKit.PANEL_BORDER, 0, 1) bg.add_theme_stylebox_override("panel", sb) bg.set_anchors_preset(Control.PRESET_FULL_RECT) bg.mouse_filter = Control.MOUSE_FILTER_IGNORE add_child(bg) + # 顶光柱氛围层(§6.1 光源氛围——方向稿四柱:x 基准 110/900/1055/1210@1280,暖光 (255,236,200) + # 自顶向下 60 段渐宽窄渐隐〔顶 α26→0〕;绘制在暗底之上/世界站桩之下——层序=bg < 光柱 < 世界) + var beams := Control.new() + beams.set_anchors_preset(Control.PRESET_FULL_RECT) + beams.mouse_filter = Control.MOUSE_FILTER_IGNORE + beams.draw.connect(_draw_light_beams.bind(beams)) + beams.resized.connect(beams.queue_redraw) + add_child(beams) + # ── Node2D 舞台半区(ADR-0006 Phase B 同构;stretch 1:1 无缩放系数——C2/C5)── _svp_container = SubViewportContainer.new() _svp_container.stretch = true # 容器尺寸 = 视口逻辑分辨率,恒 1:1 @@ -78,6 +88,7 @@ func _init(db_ref) -> void: round_label = UiKit.label("第 — 轮 · —", 15, true) round_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER + round_label.add_theme_color_override("font_color", UiKit.WARM) # 暗底双色墨制(v3.5 批 B4——原深墨对暗底不可读) vb.add_child(round_label) _row = HBoxContainer.new() @@ -93,7 +104,7 @@ func _init(db_ref) -> void: center_col.alignment = BoxContainer.ALIGNMENT_CENTER center.add_child(center_col) stage_center = UiKit.label("兑现演出区\n(结算期:光带 → 弹道 → 受击)", 13, false) - stage_center.add_theme_color_override("font_color", UiKit.STONE_FAINT) + stage_center.add_theme_color_override("font_color", UiKit.WARM_SOFT) # 暗底双色墨制(原 STONE_FAINT 对暗底不可读) stage_center.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER center_col.add_child(stage_center) _row.add_child(center) @@ -123,6 +134,21 @@ func _init(db_ref) -> void: hero_standee.slot_row = _make_slot_companion(_companion_layer) +# 顶光柱绘制(§6.1——方向稿同构:每柱 60 段叠层矩形,宽度 ±46px 随 i//3 收窄、高度 40+3i 向下延伸、 +# α 26→0 渐隐;同柱相邻段重叠区 α 自然叠加=顶部亮下部渐隐的光井观感;位置随层宽等比例) +func _draw_light_beams(c: Control) -> void: + var w := c.size.x + if w <= 0.0: + return + for bx: float in [110.0, 900.0, 1055.0, 1210.0]: + var x0: float = bx / 1280.0 * w + for i in 60: + var a := int(26.0 * (1.0 - float(i) / 60.0)) + var half := 46.0 - float(i) / 3.0 + c.draw_rect(Rect2(x0 - half, 0.0, half * 2.0, 40.0 + float(i) * 3.0), + Color8(255, 236, 200, a), true) + + func _make_slot_companion(parent: Control) -> StatusSlotRow: # 状态效果唯一展示面(2026-09-26 C 区精简批迁入站桩)——compact 档伴随件,tooltip 全明细 var comp := StatusSlotRow.new() diff --git a/game/presentation/views/standee_body.gd b/game/presentation/views/standee_body.gd index 20643d3a..e43c2ee4 100644 --- a/game/presentation/views/standee_body.gd +++ b/game/presentation/views/standee_body.gd @@ -408,9 +408,21 @@ func _portrait_rect() -> Rect2: func _draw() -> void: var f := _efont() - # 底座(旧 panel_flat(STONE.darkened(0.35), STONE.darkened(0.1), 6, 1) 等价——BOTTOM_WIDE 26/-26, -18/-8) - var plat := UiKit.panel_flat(UiKit.STONE.darkened(0.35), UiKit.STONE.darkened(0.1), 6, 1) - plat.draw(get_canvas_item(), Rect2(26, box.y - 18.0, box.x - 52.0, 10.0)) + # 椭圆落影(圣经 v3.5 批 B4 2026-09-30——§6.1 地台落影压脚:方向稿椭圆 (0,0,0,70),压在地台 + # 上缘周围;24 段多边形近似椭圆,中心=台面上方 6px、横半径=台宽一半) + var sh_center := Vector2(box.x * 0.5, box.y - 24.0) + var sh_rx := (box.x - 36.0) * 0.5 + var sh_ry := 9.0 + var pts := PackedVector2Array() + for i in 24: + var ang := TAU * float(i) / 24.0 + pts.append(sh_center + Vector2(cos(ang) * sh_rx, sin(ang) * sh_ry)) + draw_colored_polygon(pts, Color(0, 0, 0, 0.27)) + # 石板地台(v3.5——方向稿取色:板身 (150,130,100)/描边 (90,76,58)/顶缘受光线 2px (196,172,132); + # 几何沿用现行底座位〔margin 26/高 10→方向稿 18/12——按方向稿对齐〕) + draw_rect(Rect2(18.0, box.y - 18.0, box.x - 36.0, 12.0), Color8(150, 130, 100), true) + draw_rect(Rect2(18.0, box.y - 18.0, box.x - 36.0, 12.0), Color8(90, 76, 58), false, 1.0) + draw_rect(Rect2(18.0, box.y - 18.0, box.x - 36.0, 2.0), Color8(196, 172, 132), true) # 血条(直角递减):敌附顺位徽标(GOLD_DEEP ①②③)——旧 top VBox 几何等价(左 8 / 右 -8) var bar_x := 8.0 @@ -458,7 +470,7 @@ func _draw() -> void: # 底座下 护甲类型图标+名字 常驻行(敌 only——2026-09-26 用户终裁:AC 数值不展示,类型图标化) if _kind == "enemy": var armor_txt := String(ARMOR_ICONS.get(_armor, "◇")) - var col: Color = UiKit.STONE # 轻甲 = 灰石(中性轻薄) + var col: Color = UiKit.WARM_FAINT # 轻甲 = 暖白弱化(v3.5 暗底双色墨制——原灰石对暗底不可读) match _armor: "ward": col = UiKit.HERO_BLUE # 魔法护甲 = 小人蓝 @@ -470,4 +482,4 @@ func _draw() -> void: var baseline := Vector2((box.x - total_w) * 0.5, box.y - 1.0) f.draw_string(get_canvas_item(), baseline, armor_txt, HORIZONTAL_ALIGNMENT_LEFT, -1, 12, col) f.draw_string(get_canvas_item(), baseline + Vector2(armor_w + 3.0, 0), _display_name, - HORIZONTAL_ALIGNMENT_LEFT, -1, 12, UiKit.INK_TITLE) + HORIZONTAL_ALIGNMENT_LEFT, -1, 12, UiKit.WARM) # v3.5 暗底双色墨制(原 INK_TITLE 深墨对暗底不可读)