From 1c0cb4ecb0b208843d68d35622e98b52cfed221c Mon Sep 17 00:00:00 2001 From: MpakobecEx Date: Fri, 23 Oct 2026 16:47:47 +0500 Subject: [PATCH] Move mulligan control to phase panel, shift battle UI, mirror trigger zone --- .../Runtime/Board3D/Logic/PlaymatLayout.cs | 4 +- .../Assets/Vanguard/Runtime/UI/BattleView.cs | 53 +++++++++---------- .../Vanguard/Tests/Editor/ClientSmokeTests.cs | 12 +++++ .../Tests/Editor/PlaymatLayoutTests.cs | 5 ++ docs/HANDOFF.md | 7 ++- docs/SESSION-STATE.md | 5 ++ 6 files changed, 56 insertions(+), 30 deletions(-) diff --git a/client/Assets/Vanguard/Runtime/Board3D/Logic/PlaymatLayout.cs b/client/Assets/Vanguard/Runtime/Board3D/Logic/PlaymatLayout.cs index 70a40db..6fdf510 100644 --- a/client/Assets/Vanguard/Runtime/Board3D/Logic/PlaymatLayout.cs +++ b/client/Assets/Vanguard/Runtime/Board3D/Logic/PlaymatLayout.cs @@ -93,8 +93,8 @@ namespace Vanguard.Board3D var x = (localSeat == 0 ? 1f : -1f) * _config.pileX; var offset = index - (Mathf.Max(1, count) - 1) * 0.5f; var sideSign = localSeat == 0 ? 1f : -1f; - // «Над колодой» — дальше от камеры, то есть выше на экране. - var z = (ZSign(localSeat) * _config.frontRowZ) + 1.0f; + // «Над колодой» — к центру стола на половине владельца. + var z = ZSign(localSeat) * Mathf.Max(0.25f, _config.frontRowZ - 1.0f); return new Vector3(x + offset * 0.42f * sideSign, _config.cardLift, z); } diff --git a/client/Assets/Vanguard/Runtime/UI/BattleView.cs b/client/Assets/Vanguard/Runtime/UI/BattleView.cs index c8d41a2..a1ca21b 100644 --- a/client/Assets/Vanguard/Runtime/UI/BattleView.cs +++ b/client/Assets/Vanguard/Runtime/UI/BattleView.cs @@ -26,6 +26,7 @@ namespace Vanguard.UI private static readonly Color Card = new Color(0.10f, 0.13f, 0.18f, 1f); private static readonly Color Muted = new Color(0.62f, 0.68f, 0.82f); private static readonly Color Accent = new Color(0.20f, 0.42f, 0.78f, 1f); + private const float IntentPanelShift = 456f; private readonly MetaService _meta; private readonly Action _onExit; @@ -259,6 +260,7 @@ namespace Vanguard.UI _intentPanelToggleLabel.text = "Скрыть панель"; UiKit.MakeLiteral(_intentPanelToggleLabel); } + ApplyIntentPanelLayout(); _inputLock.ReleaseAll(); _feedbackLockHeld = false; _logLines.Clear(); @@ -882,6 +884,17 @@ namespace Vanguard.UI : "Показать панель"; UiKit.MakeLiteral(_intentPanelToggleLabel); } + + ApplyIntentPanelLayout(); + } + + private void ApplyIntentPanelLayout() + { + var shift = _intentPanelVisible ? 0f : IntentPanelShift; + if (_phasePanel != null) + _phasePanel.anchoredPosition = new Vector2(-468f + shift, 0f); + if (_opponentZones?.Root != null) + _opponentZones.Root.anchoredPosition = new Vector2(-488f + shift, -108f); } private void OnConcedeClicked() @@ -1689,6 +1702,19 @@ namespace Vanguard.UI foreach (var intent in intents) { var captured = intent; + if (captured is FinishMulliganIntent && _mulliganSelected.Count > 0) + { + var exchange = UiKit.CreateButton( + _phasePanel, + "Phase_MulliganExchange", + "Заменить " + _mulliganSelected.Count + " карт", + SendMulligan, + 14); + exchange.interactable = !_inputLock.IsLocked; + UiKit.SetPreferredHeight(exchange, 40f); + continue; + } + var button = UiKit.CreateButton( _phasePanel, "Phase_" + captured.GetType().Name, @@ -2368,33 +2394,6 @@ namespace Vanguard.UI TextAnchor.UpperLeft); mulliganHint.horizontalOverflow = HorizontalWrapMode.Wrap; UiKit.SetPreferredHeight(mulliganHint, 34f); - - if (_mulliganSelected.Count > 0) - { - var exchange = UiKit.CreateButton( - _intents, - "MulliganExchange", - "Заменить " + _mulliganSelected.Count + " карт", - SendMulligan, - 16); - UiKit.SetPreferredHeight(exchange, 44f); - } - else - { - var finishMulligan = (view.LegalIntents ?? new List()) - .OfType() - .FirstOrDefault(); - if (finishMulligan != null) - { - var finishButton = UiKit.CreateButton( - _intents, - "MulliganFinish", - "Закончить муллиган", - () => OnIntentClicked(finishMulligan), - 16); - UiKit.SetPreferredHeight(finishButton, 44f); - } - } } if (IsAbilityDamageTargeting()) diff --git a/client/Assets/Vanguard/Tests/Editor/ClientSmokeTests.cs b/client/Assets/Vanguard/Tests/Editor/ClientSmokeTests.cs index 1f75bb1..c60c47e 100644 --- a/client/Assets/Vanguard/Tests/Editor/ClientSmokeTests.cs +++ b/client/Assets/Vanguard/Tests/Editor/ClientSmokeTests.cs @@ -176,6 +176,18 @@ namespace Vanguard.Tests Assert.IsFalse(opponent.Overlaps(phase)); Assert.IsFalse(opponent.Overlaps(stats)); Assert.IsFalse(phase.Overlaps(stats)); + + var toggle = Resources.FindObjectsOfTypeAll