NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Character/CharacterManager.cs

136 lines
3.8 KiB
C#

using System;
using System.Collections.Generic;
using Gameplay.Unit;
namespace Gameplay.Character
{
public class CharacterManager
{
private readonly Dictionary<int, Troops> _troopDict = new Dictionary<int, Troops>();
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<GameUnit> 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))
{
enemyList.AddRange(team.Value.characters);
}
}
}
public void SearchFriends(GameUnit self,
List<GameUnit> 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))
{
friendList.AddRange(team.Value.characters);
}
}
}
public void ForEach(Action<Character> action)
{
foreach (var unit in GameUnitManager.instance.infightUnits.unitList)
{
var charactor = unit as Character;
if (charactor != null)
{
action(charactor);
}
}
}
public List<Character> FindAll(Func<Character, bool> conditions)
{
List<Character> result = new List<Character>();
foreach (var unit in GameUnitManager.instance.infightUnits.unitList)
{
var charactor = unit as Character;
if (conditions(charactor))
{
result.Add(charactor);
}
}
return result;
}
public Character FindOne(Func<Character, bool> conditions)
{
foreach (var unit in GameUnitManager.instance.infightUnits.unitList)
{
var charactor = unit as Character;
if (conditions(charactor))
{
return charactor;
}
}
return null;
}
}
}