using Framework; using Gameplay.Character; namespace Gameplay.Level { public partial class Level { public interface IOnCharacterBorn { void OnCharacterBorn(Character.Character character); void OnBattleBegin(CharacterManager characterManager); } public interface IOnCharacterDead { void OnCharacterDeadRemove(Character.Character character); } public interface IManualUpdate { void ManualUpdate(Level level); } public abstract class StarGoalRuntimeData { public enum StarGoalState { None, Success, Fail, } public StarGoalState State; public int value; public LevelData.StarGoal cfg; public abstract bool IsSuccess(); } public class StarGoalAllAliveRuntimeData : StarGoalRuntimeData,IOnCharacterDead { public override bool IsSuccess() { return State != StarGoalState.Fail; } public void OnCharacterDeadRemove(Character.Character character) { if (State == StarGoalState.None) { if (character.troopId == ETroopsId.Self) { State = StarGoalState.Fail; EventManager.Instance.Send(EventManager.EventName.LevelStarGoalFail, this); DebugUtil.LogY($"StarGoal {cfg.starGoalType} failed"); } } } } public class StarGoalLeastJobRuntimeData : StarGoalRuntimeData,IOnCharacterBorn { public override bool IsSuccess() { return value >= cfg.count; } public void OnCharacterBorn(Character.Character character) { if (character.troopId == ETroopsId.Self && cfg.job == character.runtimeData.configData.job) { value++; if (State == StarGoalState.None && value >= cfg.count) { State = StarGoalState.Success; EventManager.Instance.Send(EventManager.EventName.LevelStarGoalComplete, this); DebugUtil.LogY($"StarGoal {cfg.starGoalType} complete"); } } } public void OnBattleBegin(CharacterManager characterManager) { characterManager?.ForEach(OnCharacterBorn); } } public class StarGoalLeastFactionRuntimeData : StarGoalRuntimeData,IOnCharacterBorn { public override bool IsSuccess() { return value >= cfg.count; } public void OnCharacterBorn(Character.Character character) { if (character.troopId == ETroopsId.Self && cfg.faction == character.runtimeData.configData.faction) { value++; if (State == StarGoalState.None && value >= cfg.count) { State = StarGoalState.Success; EventManager.Instance.Send(EventManager.EventName.LevelStarGoalComplete, this); DebugUtil.LogY($"StarGoal {cfg.starGoalType} complete"); } } } public void OnBattleBegin(CharacterManager characterManager) { characterManager?.ForEach(OnCharacterBorn); } } public class StarGoalLeastRarityRuntimeData : StarGoalRuntimeData,IOnCharacterBorn { public override bool IsSuccess() { return value >= cfg.count; } public void OnCharacterBorn(Character.Character character) { if (character.troopId == ETroopsId.Self && cfg.rarity == character.runtimeData.configData.rarity) { value++; if (State == StarGoalState.None && value >= cfg.count) { State = StarGoalState.Success; EventManager.Instance.Send(EventManager.EventName.LevelStarGoalComplete, this); DebugUtil.LogY($"StarGoal {cfg.starGoalType} complete"); } } } public void OnBattleBegin(CharacterManager characterManager) { characterManager?.ForEach(OnCharacterBorn); } } public class StarGoalLeastTimeRuntimeData : StarGoalRuntimeData,IManualUpdate { public override bool IsSuccess() { return value <= cfg.time; } public void ManualUpdate(Level level) { value = (int)level.LevelTime; if (State == StarGoalState.None && value >= cfg.time) { State = StarGoalState.Fail; EventManager.Instance.Send(EventManager.EventName.LevelStarGoalFail, this); DebugUtil.LogY($"StarGoal {cfg.starGoalType} failed"); } } } } }