refactor: 스킬 트리거 효과를 그룹 구조로 변경 — 하나의 애니메이션 이벤트로 여러 effect 발동 가능

- SkillGemTriggeredEffectEntry를 공용 타입 SkillTriggeredEffectEntry로 승격

- SkillData.effects를 List<SkillTriggeredEffectEntry>로 변경 (기존 flat list는 OnValidate에서 자동 마이그레이션)

- SkillLoadoutEntry, PlayerSkillInput 등 소비자 코드 그룹 구조 대응

- 기존 스킬 에셋 마이그레이션 완료

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-04-03 08:26:08 +09:00
parent ee8f4a5701
commit 40e3252901
70 changed files with 1373 additions and 36 deletions

View File

@@ -321,15 +321,22 @@ namespace Colosseum.Skills
if (destination == null)
return;
if (baseSkill != null && baseSkill.Effects != null)
if (baseSkill != null && baseSkill.TriggeredEffects != null)
{
for (int i = 0; i < baseSkill.Effects.Count; i++)
for (int i = 0; i < baseSkill.TriggeredEffects.Count; i++)
{
SkillEffect effect = baseSkill.Effects[i];
if (effect == null)
SkillTriggeredEffectEntry entry = baseSkill.TriggeredEffects[i];
if (entry == null || entry.Effects == null)
continue;
AddTriggeredEffect(destination, i, effect);
for (int j = 0; j < entry.Effects.Count; j++)
{
SkillEffect effect = entry.Effects[j];
if (effect == null)
continue;
AddTriggeredEffect(destination, entry.TriggerIndex, effect);
}
}
}
@@ -344,7 +351,7 @@ namespace Colosseum.Skills
for (int j = 0; j < gem.TriggeredEffects.Count; j++)
{
SkillGemTriggeredEffectEntry entry = gem.TriggeredEffects[j];
SkillTriggeredEffectEntry entry = gem.TriggeredEffects[j];
if (entry == null || entry.Effects == null)
continue;
@@ -499,7 +506,7 @@ namespace Colosseum.Skills
{
if (baseSkill.CastStartEffects != null && CheckEffectsForTargetType(baseSkill.CastStartEffects, type))
return true;
if (baseSkill.Effects != null && CheckEffectsForTargetType(baseSkill.Effects, type))
if (baseSkill.TriggeredEffects != null && CheckTriggeredEntriesForTargetType(baseSkill.TriggeredEffects, type))
return true;
}
@@ -514,17 +521,22 @@ namespace Colosseum.Skills
if (gem.CastStartEffects != null && CheckEffectsForTargetType(gem.CastStartEffects, type))
return true;
if (gem.TriggeredEffects != null)
{
for (int j = 0; j < gem.TriggeredEffects.Count; j++)
{
SkillGemTriggeredEffectEntry entry = gem.TriggeredEffects[j];
if (entry == null || entry.Effects == null) continue;
if (gem.TriggeredEffects != null && CheckTriggeredEntriesForTargetType(gem.TriggeredEffects, type))
return true;
}
if (CheckEffectsForTargetType(entry.Effects, type))
return true;
}
}
return false;
}
private static bool CheckTriggeredEntriesForTargetType(IReadOnlyList<SkillTriggeredEffectEntry> entries, TargetType type)
{
if (entries == null) return false;
for (int i = 0; i < entries.Count; i++)
{
SkillTriggeredEffectEntry entry = entries[i];
if (entry != null && CheckEffectsForTargetType(entry.Effects, type))
return true;
}
return false;