Orient attack rest clockwise and damage counter-clockwise
CI / test (push) Successful in 3m56s Details

This commit is contained in:
MpakobecEx 2026-10-22 17:08:05 +05:00
parent 657859fec1
commit c2489b5452
6 changed files with 30 additions and 8 deletions

View File

@ -126,13 +126,19 @@ namespace Vanguard.Board3D
_front.SetPropertyBlock(_block);
}
public void SetState(Quaternion baseRotation, bool faceUp, bool rested)
public void SetState(
Quaternion baseRotation,
bool faceUp,
bool rested,
bool damageLayout = false)
{
_baseRotation = baseRotation;
_faceUp = faceUp;
_rested = rested;
var rest = Quaternion.Euler(0f, rested ? 90f : 0f, 0f);
// Атака/Rest — по часовой стрелке (+90°), урон лежит против (-90°).
var restYaw = rested ? (damageLayout ? -90f : 90f) : 0f;
var rest = Quaternion.Euler(0f, restYaw, 0f);
var flip = Quaternion.Euler(faceUp ? 0f : 180f, 0f, 0f);
_targetRotation = rest * baseRotation * flip;
}
@ -142,9 +148,10 @@ namespace Vanguard.Board3D
Quaternion baseRotation,
bool faceUp,
bool rested,
bool immediate)
bool immediate,
bool damageLayout = false)
{
SetState(baseRotation, faceUp, rested);
SetState(baseRotation, faceUp, rested, damageLayout);
_targetPosition = position;
_targetScale = Vector3.one;
_immediate = immediate;

View File

@ -202,7 +202,8 @@ namespace Vanguard.Board3D
spec.BaseRotation,
spec.FaceUp,
spec.Rested,
immediateAll || changed);
immediateAll || changed,
spec.DamageLayout);
card.SetHighlight(spec.Highlight);
}
@ -563,6 +564,7 @@ namespace Vanguard.Board3D
BaseRotation = Quaternion.Euler(0f, _layout.BaseYaw(localSeat), 0f),
FaceUp = isUp,
Rested = true,
DamageLayout = true,
Highlight = highlight,
});
}
@ -1127,6 +1129,7 @@ namespace Vanguard.Board3D
public Quaternion BaseRotation;
public bool FaceUp;
public bool Rested;
public bool DamageLayout;
public Color? Highlight;
}
}

View File

@ -224,6 +224,11 @@ namespace Vanguard.Tests
&& card.Ref.Player == 0).ToList();
Assert.AreEqual(3, damage.Count);
Assert.IsFalse(damage.Single(card => card.Ref.Index == 2).IsFaceUp);
Assert.AreEqual(
-90f,
Mathf.DeltaAngle(0f, damage.Single(card => card.Ref.Index == 0).TargetYaw),
0.1f,
"Damage cards must be turned counter-clockwise");
Assert.IsTrue(cards.Any(card =>
card.Ref.Zone == BoardZone.Guardian

View File

@ -55,6 +55,11 @@ namespace Vanguard.Tests
&& card.Ref.Player == 0
&& card.Ref.Index == 0);
Assert.IsTrue(visibleDamage.IsFaceUp);
Assert.AreEqual(
-90f,
Mathf.DeltaAngle(0f, visibleDamage.TargetYaw),
0.1f,
"Damage cards must rest counter-clockwise");
}
finally
{

View File

@ -848,8 +848,9 @@ Battle; Boot и общие сервисы остаются персистент
— Ride только на V, Call только на пустой RC, Move только в своей колонке
(0↔3, 2↔4, занятый круг меняется местами), Guard — в общий круг.
- `Card3D` — тонкая коробка: отдельные лицо/рубашка/торец, коллайдер, арт из
`CardImageService`, переворот вокруг X, Rest вокруг Y, плавный снап.
Карты пулятся (`GameBoard3D`), материалы общие, instancing включён.
`CardImageService`, переворот вокруг X, Rest вокруг Y по часовой стрелке,
урон — против часовой, плавный снап. Карты пулятся (`GameBoard3D`),
материалы общие, instancing включён.
- `GameBoard3D` строит стол, круги, зоны, стопки и веер руки; raycast-клики,
drag&drop на плоскость стола с подъёмом, подсветкой допустимых кругов и
индикатором точки броска. Ошибка интента возвращает карту на место.

View File

@ -63,7 +63,8 @@
без истории, MMR и наград.
- Боевой экран: поле, рука и стопки — **3D** (`GameBoard3D`), HUD/кнопки
остаются uGUI. Карты — тонкие 3D-объекты с артом, рубашкой, торцом и
коллайдером. Rest — поворот вокруг Y, закрытость — переворот вокруг X.
коллайдером. Rest (атака/поддержка) — поворот по часовой стрелке вокруг Y,
урон лежит на боку против часовой; закрытость — переворот вокруг X.
Драг-н-дроп на плоскость стола с подсветкой целей и плавным снапом.
- Поле: у каждого игрока два ряда `R V R` / `R R R` (V + 5 RC), у
противника зеркально; между полями общий круг защиты; душа — стопка под