using UnityEngine;
namespace Vanguard.Battle
{
///
/// Длительности боевых анимаций и блокировки ввода. Ассет лежит в
/// Resources/AnimationConfig; если его нет, используются значения по умолчанию.
///
[CreateAssetMenu(menuName = "Vanguard/Animation Config", fileName = "AnimationConfig")]
public sealed class AnimationConfig : ScriptableObject
{
[Header("Карты")]
public float cardMoveSpeed = 14f;
public float cardRotateSpeed = 12f;
public float cardMoveDuration = 0.45f;
public float cardFlipDuration = 0.3f;
public float callMoveDuration = 0.55f;
public float retireDuration = 0.8f;
[Header("3D UX: движение")]
public float moveDuration = 0.8f;
public float importantMoveDuration = 1.3f;
public float moveDelayBetweenCards = 0.22f;
public float arcHeight = 0.45f;
[Header("Старт боя")]
public float introOverheadHold = 1.5f;
public float introCameraMoveDuration = 1f;
public float introMainHold = 1.5f;
public float introDrawDuration = 0.6f;
[Header("3D UX: камера")]
public float cameraZoomDuration = 0.5f;
public float vanguardRevealDuration = 0.8f;
public float triggerRevealDuration = 0.35f;
public float triggerRevealHold = 0.75f;
public float cameraReturnDuration = 0.5f;
public float cameraRezoomDuration = 0.3f;
[Header("3D UX: стрелки")]
public float growDuration = 0.35f;
public float dashScrollSpeed = 1.5f;
public float boostGrowDuration = 0.3f;
public float boostThickness = 0.8f;
public float arrowFadeDuration = 0.2f;
[Header("Бой")]
public float attackDeclare = 1.2f;
public float guard = 1.9f;
public float driveCheck = 1.5f;
public float trigger = 1.4f;
public float battleResolved = 1.3f;
public float damage = 1.6f;
public float heal = 1.4f;
public float intercept = 1.9f;
public float perfectGuard = 2.0f;
[Header("Ввод")]
public float inputLockTail = 0.15f;
[Header("Боевые паузы")]
public float eventPause = 1.5f;
public float postDrivePause = 1.5f;
public float postTriggerPause = 1.5f;
public float postDamagePause = 1.5f;
[Header("Стрелка атаки")]
public float arrowShowDuration = 0.25f;
public float arrowHideDuration = 0.2f;
private static AnimationConfig _default;
public static AnimationConfig Default
{
get
{
if (_default == null)
{
_default = CreateInstance();
_default.name = "AnimationConfig (runtime)";
_default.hideFlags = HideFlags.DontSave;
}
return _default;
}
}
public static AnimationConfig LoadOrDefault()
{
var loaded = Resources.Load("AnimationConfig");
return loaded != null ? loaded : Default;
}
private void OnValidate()
{
cardMoveSpeed = Mathf.Max(1f, cardMoveSpeed);
cardRotateSpeed = Mathf.Max(1f, cardRotateSpeed);
cardMoveDuration = Mathf.Max(0.05f, cardMoveDuration);
cardFlipDuration = Mathf.Max(0.05f, cardFlipDuration);
callMoveDuration = Mathf.Max(0.05f, callMoveDuration);
retireDuration = Mathf.Max(0.05f, retireDuration);
moveDuration = Mathf.Max(0.05f, moveDuration);
importantMoveDuration = Mathf.Max(0.05f, importantMoveDuration);
moveDelayBetweenCards = Mathf.Max(0f, moveDelayBetweenCards);
arcHeight = Mathf.Max(0f, arcHeight);
introOverheadHold = Mathf.Max(0f, introOverheadHold);
introCameraMoveDuration = Mathf.Max(0.05f, introCameraMoveDuration);
introMainHold = Mathf.Max(0f, introMainHold);
introDrawDuration = Mathf.Max(0.05f, introDrawDuration);
cameraZoomDuration = Mathf.Max(0.05f, cameraZoomDuration);
vanguardRevealDuration = Mathf.Max(0.05f, vanguardRevealDuration);
triggerRevealDuration = Mathf.Max(0.05f, triggerRevealDuration);
triggerRevealHold = Mathf.Max(0f, triggerRevealHold);
cameraReturnDuration = Mathf.Max(0.05f, cameraReturnDuration);
cameraRezoomDuration = Mathf.Max(0.05f, cameraRezoomDuration);
growDuration = Mathf.Max(0.05f, growDuration);
dashScrollSpeed = Mathf.Max(0f, dashScrollSpeed);
boostGrowDuration = Mathf.Max(0.05f, boostGrowDuration);
boostThickness = Mathf.Max(0.01f, boostThickness);
arrowFadeDuration = Mathf.Max(0.05f, arrowFadeDuration);
attackDeclare = Mathf.Max(0.05f, attackDeclare);
guard = Mathf.Max(0.05f, guard);
driveCheck = Mathf.Max(0.05f, driveCheck);
trigger = Mathf.Max(0.05f, trigger);
battleResolved = Mathf.Max(0.05f, battleResolved);
damage = Mathf.Max(0.05f, damage);
heal = Mathf.Max(0.05f, heal);
intercept = Mathf.Max(0.05f, intercept);
perfectGuard = Mathf.Max(0.05f, perfectGuard);
inputLockTail = Mathf.Max(0f, inputLockTail);
eventPause = Mathf.Max(0f, eventPause);
postDrivePause = Mathf.Max(0f, postDrivePause);
postTriggerPause = Mathf.Max(0f, postTriggerPause);
postDamagePause = Mathf.Max(0f, postDamagePause);
arrowShowDuration = Mathf.Max(0.05f, arrowShowDuration);
arrowHideDuration = Mathf.Max(0.05f, arrowHideDuration);
}
}
}