using System.Collections.Generic; using Gameplay.Character; namespace Gameplay.Level { public partial class Level { private readonly Dictionary _starGoalRuntimeDatas = new Dictionary(4); public StarGoalRuntimeData GetStarGoalRuntimeData(LevelData.StarGoal.StarGoalType type) { return _starGoalRuntimeDatas[type]; } public List GetAllStarGoalRuntimeData() { List result = new List(_starGoalRuntimeDatas.Count); for (int i = 0; i < _levelData.starGoals.Count; i++) { if (_starGoalRuntimeDatas.TryGetValue(_levelData.starGoals[i].starGoalType, out var data)) { result.Add(data); } } return result; } private void InitStarGoalRuntimeData() { _levelData.starGoals.ForEach(goal => { StarGoalRuntimeData data = null; switch (goal.starGoalType) { case LevelData.StarGoal.StarGoalType.AllAlive: data = new StarGoalAllAliveRuntimeData(); break; case LevelData.StarGoal.StarGoalType.LeastJob: data = new StarGoalLeastJobRuntimeData(); break; case LevelData.StarGoal.StarGoalType.LeastFaction: data = new StarGoalLeastFactionRuntimeData(); break; case LevelData.StarGoal.StarGoalType.LeastRarity: data = new StarGoalLeastRarityRuntimeData(); break; case LevelData.StarGoal.StarGoalType.LeastTime: data = new StarGoalLeastTimeRuntimeData(); break; default: break; } if (data != null) { data.cfg = goal; _starGoalRuntimeDatas[goal.starGoalType] = data; } }); } private void StarGoalOnCharacterDeadRemove(Character.Character character) { if (!IsInBattle()) { return; } foreach (var data in _starGoalRuntimeDatas) { if (data.Value is IOnCharacterDead handle) { handle.OnCharacterDeadRemove(character); } } } private void StarGoalOnCharacterBorn(Character.Character character) { if (!IsInBattle()) { return; } foreach (var data in _starGoalRuntimeDatas) { if (data.Value is IOnCharacterBorn handle) { handle.OnCharacterBorn(character); } } } public void StarGoalOnBattleBegin() { if (!IsInBattle()) { return; } foreach (var data in _starGoalRuntimeDatas) { if (data.Value is IOnCharacterBorn handle) { handle.OnBattleBegin(_characterManager); } } } private void StarGoalManualUpdate() { foreach (var data in _starGoalRuntimeDatas) { if (data.Value is IManualUpdate handle) { handle.ManualUpdate(this); } } } } }