using System; using System.Collections.Generic; using Gameplay.Unit; namespace Gameplay.Character { public class CharacterManager { private readonly Dictionary _troopDict = new Dictionary(); public void AddCharacter(Character character) { _AddToTroop(character); } public void RemoveCharacter(Character c) { _RemoveFromTroop(c); } private void _RemoveFromTroop(Character c) { var teamId = c.commonData.troopId; if (_troopDict.TryGetValue(teamId, out Troops team)) { team.characters.Remove(c); } } private void _AddToTroop(Character c) { var teamId = c.commonData.troopId; if (_troopDict.TryGetValue(teamId, out Troops team)) { team.characters.Add(c); } else { team = new Troops(teamId); team.characters.Add(c); _troopDict.Add(teamId, team); } } public bool Contains(uint id) { return GameUnitManager.instance.infightUnits.Contains(id); } public Character Get(uint id) { var c = GameUnitManager.instance.infightUnits.Search(id) as Character; return c; } public void SearchEnemies(GameUnit self, List enemyList) { if (self == null) return; if (self.controlData.followUnit != null && Level.Level.IsEnemy(self.controlData.followUnit.commonData.troopId, self.commonData.troopId)) { enemyList.Add(self.controlData.followUnit); } foreach (var team in _troopDict) { if (Level.Level.IsEnemy(team.Key, self.commonData.troopId)) { var characterList = team.Value.characters; for (int i = 0; i < characterList.Count; i++) { enemyList.Add(characterList[i]); } } } } public void SearchFriends(GameUnit self, List friendList) { if (self == null) return; if (self.controlData.followUnit != null && !Level.Level.IsEnemy(self.controlData.followUnit.commonData.troopId, self.commonData.troopId)) { friendList.Add(self.controlData.followUnit); } foreach (var team in _troopDict) { if (!Level.Level.IsEnemy(team.Key, self.commonData.troopId)) { var characterList = team.Value.characters; for (int i = 0; i < characterList.Count; i++) { friendList.Add(characterList[i]); } } } } public void ForEach(Action action) { foreach (var unit in GameUnitManager.instance.infightUnits.unitList) { if (unit is Character charactor) { action(charactor); } } } public List FindAll(Func conditions) { List result = new List(); foreach (var unit in GameUnitManager.instance.infightUnits.unitList) { var charactor = unit as Character; if (charactor == null) continue; if (conditions(charactor)) { result.Add(charactor); } } return result; } public Character FindOne(Func conditions) { foreach (var unit in GameUnitManager.instance.infightUnits.unitList) { var charactor = unit as Character; if (charactor == null) continue; if (conditions(charactor)) { return charactor; } } return null; } } }