using UnityEngine;
using System.Collections.Generic;
using Colosseum.Skills;
namespace Colosseum.AI
{
///
/// 패턴의 대분류. grace period 판단에 사용됩니다.
///
public enum PatternCategory
{
/// 기본 패턴 — grace period 제한 없음
Basic,
/// 대형 패턴 — basicLoopCount 이후 사용 가능
Big,
/// 징벌 패턴 — 항상 허용, bigPattern 카운터 리셋
Punish,
}
///
/// 패턴의 타겟 해석 방식
///
public enum TargetResolveMode
{
/// 타겟 해석 불필요 (시그니처 등 내부 처리)
None,
/// 가장 위협도가 높은 근접 대상
HighestThreat,
/// 기동 패턴 전용 타겟
Mobility,
/// 유틸리티 패턴 전용 타겟
Utility,
}
public enum PatternStepType { Skill, Wait }
[System.Serializable]
public class PatternStep
{
public PatternStepType Type = PatternStepType.Skill;
public SkillData Skill;
[Min(0f)] public float Duration = 0.5f;
}
///
/// 보스 패턴 데이터. 순서대로 실행할 스텝(스킬 또는 대기) 목록과 쿨타임을 정의합니다.
///
[CreateAssetMenu(fileName = "NewBossPattern", menuName = "Colosseum/Boss Pattern")]
public class BossPatternData : ScriptableObject
{
[Header("패턴 정보")]
[SerializeField] private string patternName;
[Header("패턴 특성")]
[Tooltip("패턴 분류 — grace period 판단에 사용")]
[SerializeField] private PatternCategory category = PatternCategory.Basic;
[Tooltip("시그니처 패턴 여부 — 전용 실행 경로 사용")]
[SerializeField] private bool isSignature;
[Tooltip("근접 패턴 여부 — meleePatternCounter 갱신")]
[SerializeField] private bool isMelee;
[Tooltip("타겟 해석 방식")]
[SerializeField] private TargetResolveMode targetMode = TargetResolveMode.HighestThreat;
[Header("스텝 순서")]
[SerializeField] private List steps = new List();
[Header("쿨타임")]
[Min(0f)]
[Tooltip("패턴 완료 후 다시 사용 가능해지기까지의 시간")]
[SerializeField] private float cooldown = 5f;
[Header("페이즈 제한")]
[Min(1)]
[Tooltip("이 패턴을 사용하기 시작하는 최소 페이즈 (1=Phase 1부터)")]
[SerializeField] private int minPhase = 1;
[Header("조건부 점프")]
[Tooltip("점프 스텝에서 대상을 찾지 못하면 해당 스텝을 스킵하고 패턴을 종료합니다 (조합 패턴용)")]
[SerializeField] private bool skipJumpStepOnNoTarget = false;
public string PatternName => patternName;
public PatternCategory Category => category;
public bool IsSignature => isSignature;
public bool IsMelee => isMelee;
public TargetResolveMode TargetMode => targetMode;
public IReadOnlyList Steps => steps;
public float Cooldown => cooldown;
public int MinPhase => minPhase;
public bool SkipJumpStepOnNoTarget => skipJumpStepOnNoTarget;
///
/// Big 패턴인지 반환합니다 (grace period 대상).
///
public bool IsBigPattern => category == PatternCategory.Big;
}
}