diff --git a/IMPLEMENTATION_CHECKLIST.md b/IMPLEMENTATION_CHECKLIST.md index 3eb2279..607f5e1 100644 --- a/IMPLEMENTATION_CHECKLIST.md +++ b/IMPLEMENTATION_CHECKLIST.md @@ -275,9 +275,13 @@ drive/damage-анимации и звук — следующие. Финальн - [x] Поле: `R V R` / `R R R` у каждого игрока, damage/soul слева, колода/дроп справа, зеркально у противника, зона защиты между полями. -- [x] Карты: реальный арт из `imageKey`, рамка клана, рубашка, имя, ранг, - триггер, сила/крит, REST/скрытая карта; процедурный fallback. -- [x] Старт: маллиган (сервер пока даёт только «закончить маллиган»). +- [x] Карты: реальный арт на всю карту, рамка клана, рубашка, имя, ранг, + триггер, сила/крит; REST поворачивает карту на бок; процедурный fallback. +- [x] Старт: маллиган с выбором карт в руке, возвратом в колоду, + перемешиванием и добиром до пяти. +- [x] Зона урона: видимые карты на боку; heal и Counter Blast выбирают + карту урона кликом. +- [x] Позванные rear-guard'ы входят стоящими; rest — после атаки/буста. - [x] Ввод: кнопки легальных интентов; клик по картам/зонам, подсветка целей, группировка действий, выбор силы/эффекта триггера и журнал боя. diff --git a/README.md b/README.md index af322e6..789934e 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ | CI (Forgejo Actions) | готово: `ci.yml` проходит на `home-runner` | | EF-миграции | готово (`InitialCreate`) | | Orleans | готово: silo + `MatchActorGrain`, включается `Orleans:Enabled` | -| Клиент | Unity 6.6: 3D-сцены, логин, онбординг, коллекция, декбилдер, магазин, история/реплей, очередь, тренировка с ботом, бой с реальными артами, анимациями и RU/EN | +| Клиент | Unity 6.6: 3D-сцены, логин, онбординг, коллекция, декбилдер, магазин, история/реплей, очередь, тренировка с ботом, бой с артами, маллиганом, зоной урона, анимациями и RU/EN | | Лаунчер | не начато | ## Требования diff --git a/client/Assets/Plugins/Vanguard.Shared/Vanguard.Shared.dll b/client/Assets/Plugins/Vanguard.Shared/Vanguard.Shared.dll index de5fb59..1599495 100644 Binary files a/client/Assets/Plugins/Vanguard.Shared/Vanguard.Shared.dll and b/client/Assets/Plugins/Vanguard.Shared/Vanguard.Shared.dll differ diff --git a/client/Assets/Vanguard/Runtime/UI/BattleView.cs b/client/Assets/Vanguard/Runtime/UI/BattleView.cs index e9f2ae1..57bca08 100644 --- a/client/Assets/Vanguard/Runtime/UI/BattleView.cs +++ b/client/Assets/Vanguard/Runtime/UI/BattleView.cs @@ -72,6 +72,7 @@ namespace Vanguard.UI private int _pendingBoosterSlot = -1; private int? _triggerPowerSlot; private readonly HashSet _mulliganSelected = new HashSet(); + private int _abilityDamageIndex = -1; private readonly Dictionary _cardPanels = new Dictionary(StringComparer.Ordinal); private readonly List _cardAnimations = new List(); @@ -207,6 +208,7 @@ namespace Vanguard.UI _pendingIntents.Clear(); _highlightKeys.Clear(); _mulliganSelected.Clear(); + _abilityDamageIndex = -1; _pendingBoosterSlot = -1; _triggerPowerSlot = null; _showAllIntents = false; @@ -963,6 +965,15 @@ namespace Vanguard.UI if (_sending || _connection == null || _cts == null || _view == null) return; + if (_abilityDamageIndex >= 0) + { + if (intent is ActivateAbilityIntent activate) + activate.DamageIndex = _abilityDamageIndex; + else if (intent is ResolveAbilityIntent resolve) + resolve.DamageIndex = _abilityDamageIndex; + } + + _abilityDamageIndex = -1; _pendingIntents.Clear(); _highlightKeys.Clear(); _pendingBoosterSlot = -1; @@ -1215,16 +1226,17 @@ namespace Vanguard.UI gridElement.preferredHeight = 176f; var damageChoice = IsDamageChoice(); + var abilityTargeting = IsAbilityDamageTargeting(); var displayIndex = 0; for (var i = 0; i < player.FaceDownDamage; i++, displayIndex++) { - AddDamageCard(grid, displayIndex, null, false, damageChoice); + AddDamageCard(grid, displayIndex, null, false, damageChoice, abilityTargeting); } foreach (var card in player.FaceUpDamage) { - AddDamageCard(grid, displayIndex, card, true, damageChoice); + AddDamageCard(grid, displayIndex, card, true, damageChoice, abilityTargeting: false); displayIndex++; } } @@ -1234,7 +1246,8 @@ namespace Vanguard.UI int displayIndex, CardView card, bool faceUp, - bool damageChoice) + bool damageChoice, + bool abilityTargeting) { var panel = UiKit.CreatePanel(parent, "Damage_" + displayIndex, Color.white); var rect = panel; @@ -1267,19 +1280,23 @@ namespace Vanguard.UI image.color = Color.white; } + var canClick = damageChoice || abilityTargeting; + var selected = abilityTargeting && _abilityDamageIndex == displayIndex; var outline = panel.gameObject.AddComponent(); - outline.effectColor = damageChoice - ? new Color(0.98f, 0.82f, 0.42f) - : new Color(0.42f, 0.18f, 0.18f); - outline.effectDistance = damageChoice - ? new Vector2(3f, -3f) + outline.effectColor = selected + ? new Color(0.45f, 0.95f, 0.62f) + : canClick + ? new Color(0.98f, 0.82f, 0.42f) + : new Color(0.42f, 0.18f, 0.18f); + outline.effectDistance = canClick + ? new Vector2(selected ? 4f : 3f, selected ? -4f : -3f) : new Vector2(1f, -1f); var button = panel.gameObject.AddComponent