public BaseUnitBehaviour GetTarget(BaseUnitBehaviour unit, BaseUnitBehaviour currentTarget, ArrayRO <BaseUnitBehaviour> possibleUnits) { UnitPlace currentTargetPlace = currentTarget != null ? currentTarget.Place : new UnitPlace() { Range = EUnitRange.None, Position = EUnitPosition.Middle }; UnitPlace nextTargetPlace = GetNextTargetPlace(unit.Place, currentTargetPlace); while (!nextTargetPlace.Equals(currentTargetPlace)) { if (nextTargetPlace.Range != EUnitRange.None || nextTargetPlace.Position != EUnitPosition.None) { BaseUnitBehaviour nextUnit = GetPlaceBaseUnitBehaviour(possibleUnits, nextTargetPlace); if (nextUnit != null && !nextUnit.UnitData.IsDead) { return(nextUnit); } } nextTargetPlace = GetNextTargetPlace(unit.Place, nextTargetPlace); } if (currentTarget != null) { return(currentTarget); } else { BaseUnitBehaviour nextUnit = GetPlaceBaseUnitBehaviour(possibleUnits, currentTargetPlace); return(nextUnit != null && !nextUnit.UnitData.IsDead ? nextUnit : null); } }
private void SetupLoot(ArrayRO<ItemDropChance> loot) { float lootImageWidth = _imgLoot.transform.GetChild(0).GetComponent<RectTransform>().rect.width; if (loot.Length == 0) { _imgLoot.gameObject.SetActive(false); } else { _lootItems = new EItemKey[loot.Length]; _lootItemImages = new Image[loot.Length]; _lootItemImages[0] = _imgLoot; for (int i = 0; i < loot.Length; i++) { _lootItems[i] = loot[i].ItemKey; if (i > 0) { _lootItemImages[i] = (GameObject.Instantiate(_imgLoot.gameObject) as GameObject).GetComponent<Image>(); _lootItemImages[i].transform.SetParent(_imgLoot.transform.parent, false); _lootItemImages[i].rectTransform.anchoredPosition = _imgLoot.rectTransform.anchoredPosition + new Vector2(i * (lootImageWidth + _offsetImageLoot), 0f); } Image lootIcon = _lootItemImages[i]; Sprite lootIconResource = UIResourcesManager.Instance.GetResource<Sprite>(GameConstants.Paths.GetLootIconResourcePath(loot[i].ItemKey)); if (lootIconResource != null) { lootIcon.sprite = lootIconResource; } } } }
private void SetupLoot(ArrayRO <ItemDropChance> loot) { float lootImageWidth = _imgLoot.transform.GetChild(0).GetComponent <RectTransform>().rect.width; if (loot.Length == 0) { _imgLoot.gameObject.SetActive(false); } else { _lootItems = new EItemKey[loot.Length]; _lootItemImages = new Image[loot.Length]; _lootItemImages[0] = _imgLoot; for (int i = 0; i < loot.Length; i++) { _lootItems[i] = loot[i].ItemKey; if (i > 0) { _lootItemImages[i] = (GameObject.Instantiate(_imgLoot.gameObject) as GameObject).GetComponent <Image>(); _lootItemImages[i].transform.SetParent(_imgLoot.transform.parent, false); _lootItemImages[i].rectTransform.anchoredPosition = _imgLoot.rectTransform.anchoredPosition + new Vector2(i * (lootImageWidth + _offsetImageLoot), 0f); } Image lootIcon = _lootItemImages[i]; Sprite lootIconResource = UIResourcesManager.Instance.GetResource <Sprite>(GameConstants.Paths.GetLootIconResourcePath(loot[i].ItemKey)); if (lootIconResource != null) { lootIcon.sprite = lootIconResource; } } } }
public void FindTarget(BaseUnitBehaviour unit, BaseUnitBehaviour currentTarget, ArrayRO <BaseUnitBehaviour> possibleUnits, Action <BaseUnitBehaviour> onTargetFound, Action onTargetAttacked) { Reset(false); //UnitSet.Instance.SetUnitPositions(); _onTargetFound = onTargetFound; _onTargetAttacked = onTargetAttacked; _target = UnitSet.Instance.GetTarget(unit, currentTarget, possibleUnits); if (_target != null) { _targetTransform = _target.transform; } if (_targetTransform == null) { Reset(false); State = EUnitAttackState.NoTarget; return; } onTargetFound(_targetTransform.gameObject.GetComponent <BaseUnitBehaviour>()); if (State == EUnitAttackState.None || State == EUnitAttackState.NoAttack || State == EUnitAttackState.WatchTarget) { StartTargetAttack(_target); } }
public void FindTarget(BaseUnitBehaviour unit, BaseUnitBehaviour currentTarget, ArrayRO<BaseUnitBehaviour> possibleUnits, Action<BaseUnitBehaviour> onTargetFound, Action onTargetAttacked) { Reset(false); //UnitSet.Instance.SetUnitPositions(); _onTargetFound = onTargetFound; _onTargetAttacked = onTargetAttacked; _target = UnitSet.Instance.GetTarget(unit, currentTarget, possibleUnits); if (_target != null) { _targetTransform = _target.transform; } if (_targetTransform == null) { Reset(false); State = EUnitAttackState.NoTarget; return; } onTargetFound(_targetTransform.gameObject.GetComponent<BaseUnitBehaviour>()); if (State == EUnitAttackState.None || State == EUnitAttackState.NoAttack || State == EUnitAttackState.WatchTarget) { StartTargetAttack(_target); } }
public void Clear() { PlanetKey = EPlanetKey.None; MissionKey = EMissionKey.None; SelectedSoldiers = null; }
protected virtual Dictionary <EUnitEqupmentSlot, EItemType[]> CreateSlotsData() { Dictionary <EUnitEqupmentSlot, EItemType[]> slotsData = new Dictionary <EUnitEqupmentSlot, EItemType[]>(); ArrayRO <EUnitEqupmentSlot> availableSlots = UnitsConfig.Instance.GetUnitEquipmentSlots(this); for (int i = 0; i < availableSlots.Length; i++) { slotsData.Add(availableSlots[i], new EItemType[0]); } return(slotsData); }
public void AddHeroes(BaseHero[] heroesList) { if(_heroes == null) { _heroes = heroesList; } else if(heroesList.Length > 0) { BaseHero[] newHeroes = new BaseHero[_heroes.Length + heroesList.Length]; Array.Copy(_heroes, newHeroes, _heroes.Length); for (int i = _heroes.Length, j = 0; i < newHeroes.Length; i++, j++) { newHeroes[i] = heroesList[j]; } _heroes = newHeroes; } _heroesRO = new ArrayRO<BaseHero>(_heroes); }
/// <summary> /// C'tor /// </summary> /// <param name="_slotsData">Data about slot: slot key && available item types for the slot</param> /// <param name="onEquipmentUpdate"></param> public UnitInventory(Dictionary<EUnitEqupmentSlot, EItemType[]> _slotsData, ArrayRO<ItemSlot> _initialItems, Action<EUnitEqupmentSlot, EItemKey, EItemKey> onEquipmentUpdate) { _slotsConfig = _slotsData; _equipment = new ItemSlot[_slotsConfig.Count]; int i = 0; foreach(KeyValuePair<EUnitEqupmentSlot, EItemType[]> kvp in _slotsConfig) { _equipment[i] = new ItemSlot(kvp.Key, EItemKey.None); i++; } for (i = 0; i < _initialItems.Length; i++) { Equip(_initialItems[i].SlotName, _initialItems[i].ItemKey); } _onEquipmentUpdate = onEquipmentUpdate; }
private void OnGrenadeTargetReached(Vector3 position) { ArrayRO <BaseUnitBehaviour> opposedUnits = _caster.IsAlly ? FightManager.SceneInstance.EnemyUnits : FightManager.SceneInstance.AllyUnits; for (int i = 0; i < opposedUnits.Length; i++) { if (opposedUnits[i] != null && !opposedUnits[i].UnitData.IsDead) { if (Vector3.Distance(position, opposedUnits[i].CachedTransform.position) <= _skillParameters.Radius) { opposedUnits[i].Stun(_skillParameters.Duration); } } } EndUsage(); }
private void LoadAllyUnitsResources() { //check if this is first map if (_allyUnitsGraphicsResources.Count > 0) { return; } ArrayRO <BaseSoldier> playerSoldiersList = Global.Instance.CurrentMission.SelectedSoldiers; BaseUnitData bud = null; BaseUnitBehaviour bub = null; //load unique soldiers for (int i = 0; i < playerSoldiersList.Length; i++) { if (_allyUnitsGraphicsResources.ContainsKey(playerSoldiersList[i].Data.Key)) { continue; } bud = UnitsConfig.Instance.GetSoldierData(playerSoldiersList[i].Data.Key); if (bud != null && !bud.PrefabName.Equals(string.Empty)) { bub = LoadUnitResource <BaseUnitBehaviour>(string.Format("{0}/{1}", GameConstants.Paths.UNIT_RESOURCES, bud.PrefabName)); _allyUnitsGraphicsResources.Add(playerSoldiersList[i].Data.Key, bub); } else { Debug.LogError("Can't load unit graphics: " + playerSoldiersList[i].Data.Key); } } //load hero BaseHero playerHero = Global.Instance.Player.Heroes.Current; if (playerHero == null || playerHero.Data.PrefabName.Equals(string.Empty)) { Debug.LogError("Can't load unit graphics for player hero"); } bub = LoadUnitResource <BaseUnitBehaviour>(string.Format("{0}/{1}", GameConstants.Paths.UNIT_RESOURCES, playerHero.Data.PrefabName)); _allyUnitsGraphicsResources.Add(playerHero.Data.Key, bub); }
public ArrayRO <EUnitEqupmentSlot> GetUnitEquipmentSlots(BaseUnit unit) { if (_heroEquipmentSlotsRO == null) { _heroEquipmentSlotsRO = new ArrayRO <EUnitEqupmentSlot>(_heroEquipmentSlots); _heroEquipmentSlots = null; } if (_soldierEquipmentSlotsRO == null) { _soldierEquipmentSlotsRO = new ArrayRO <EUnitEqupmentSlot>(_soldierEquipmentSlots); _soldierEquipmentSlots = null; } if (unit is BaseHero) { return(_heroEquipmentSlotsRO); } return(_soldierEquipmentSlotsRO); }
private void InstantiateAllyUnits() { //check if this is first map if (_allyUnits != null) { return; } //TODO: setup inventory ArrayRO <BaseSoldier> playerSoldiersList = Global.Instance.CurrentMission.SelectedSoldiers; BaseUnitBehaviour[] unitsList = new BaseUnitBehaviour[playerSoldiersList.Length + 1]; BaseUnitBehaviour bub = null; //instantiate soldiers for (int i = 0; i < playerSoldiersList.Length; i++) { if (!playerSoldiersList[i].IsDead) { bub = (GameObject.Instantiate(_allyUnitsGraphicsResources[playerSoldiersList[i].Data.Key].gameObject) as GameObject).GetComponent <BaseUnitBehaviour>(); bub.gameObject.name = "Ally_" + playerSoldiersList[i] + " (" + i + ")"; unitsList[i] = bub; LoadItemsResources(_allyItemsGraphicsResources, playerSoldiersList[i].Data.Key, bub.ModelView, playerSoldiersList[i].Inventory.GetItemInSlot(EUnitEqupmentSlot.Weapon_RHand), playerSoldiersList[i].Inventory.GetItemInSlot(EUnitEqupmentSlot.Weapon_LHand), playerSoldiersList[i].Inventory.GetItemInSlot(EUnitEqupmentSlot.Armor)); } } //instantiate player BaseHero playerHero = Global.Instance.Player.Heroes.Current; if (!playerHero.IsDead) { bub = (GameObject.Instantiate(_allyUnitsGraphicsResources[playerHero.Data.Key].gameObject) as GameObject).GetComponent <BaseUnitBehaviour>(); bub.gameObject.name = "Ally_" + playerHero.Data.Key; unitsList[unitsList.Length - 1] = bub; LoadItemsResources(_allyItemsGraphicsResources, playerHero.Data.Key, bub.ModelView, playerHero.Inventory.GetItemInSlot(EUnitEqupmentSlot.Weapon_RHand), playerHero.Inventory.GetItemInSlot(EUnitEqupmentSlot.Weapon_LHand), playerHero.Inventory.GetItemInSlot(EUnitEqupmentSlot.Armor)); } //save _allyUnits = new ArrayRO <BaseUnitBehaviour>(unitsList); }
public void AddHeroes(BaseHero[] heroesList) { if (_heroes == null) { _heroes = heroesList; } else if (heroesList.Length > 0) { BaseHero[] newHeroes = new BaseHero[_heroes.Length + heroesList.Length]; Array.Copy(_heroes, newHeroes, _heroes.Length); for (int i = _heroes.Length, j = 0; i < newHeroes.Length; i++, j++) { newHeroes[i] = heroesList[j]; } _heroes = newHeroes; } _heroesRO = new ArrayRO <BaseHero>(_heroes); }
protected virtual void RecalculateParamsInternal() { HealthPoints = _data.BaseHealthPoints; Damage = _data.BaseDamage; //AR = _data.BaseAR; //AttackSpeed = _data.BaseAttackSpeed; //Armor = _data.BaseArmor; //CritChance = _data.BaseCritChance; //CritDamageMultiplier = _data.BaseCritDamageMultiplier; //levels bonuses SoldierUpgrade soldierUpgradesData = UnitsConfig.Instance.GetSoldierUpgrades(_data.Key); if (soldierUpgradesData != null) { SoldierUpgradeLevel upgradesLevelData = UnitsConfig.Instance.GetSoldierUpgrades(_data.Key).GetTotalLevelUpgrades(_level); Damage += upgradesLevelData.ModifierDamage; } //equipment bonuses ArrayRO <EUnitEqupmentSlot> equipmentSlots = UnitsConfig.Instance.GetUnitEquipmentSlots(this); BaseItem itemData = null; for (int i = 0; i < equipmentSlots.Length; i++) { itemData = ItemsConfig.Instance.GetItem(Inventory.GetItemInSlot(i)); if (itemData != null) { HealthPoints += itemData.ModHealth; Damage += itemData.ModDamage; //Armor += itemData.ModArmor; //AttackRange += itemData.ModDamageRange; //AttackSpeed += itemData.ModDamageSpeed; //CritChance += itemData.ModCritChance; //CritDamageMultiplier = itemData.ModCritDamageMultiplier; } } //ArmorDamageAbsorb = Mathf.CeilToInt(UnitsConfig.Instance.DamageReducePerOneArmor * Armor); }
protected override Dictionary <EUnitEqupmentSlot, EItemType[]> CreateSlotsData() { BaseHeroData heroData = base._data as BaseHeroData; Dictionary <EUnitEqupmentSlot, EItemType[]> slotsData = new Dictionary <EUnitEqupmentSlot, EItemType[]>(); ArrayRO <EUnitEqupmentSlot> availableSlots = UnitsConfig.Instance.GetUnitEquipmentSlots(this); for (int i = 0; i < availableSlots.Length; i++) { slotsData.Add(availableSlots[i], new EItemType[0]); for (int j = 0; j < heroData.AvailableItemTypes.Length; j++) { if (heroData.AvailableItemTypes[j].SlotKey == availableSlots[i]) { slotsData[availableSlots[i]] = heroData.AvailableItemTypes[j].AvailableItemTypes.DataCopy; break; } } } return(slotsData); }
/// <summary> /// C'tor /// </summary> /// <param name="_slotsData">Data about slot: slot key && available item types for the slot</param> /// <param name="onEquipmentUpdate"></param> public UnitInventory(Dictionary <EUnitEqupmentSlot, EItemType[]> _slotsData, ArrayRO <ItemSlot> _initialItems, Action <EUnitEqupmentSlot, EItemKey, EItemKey> onEquipmentUpdate) { _slotsConfig = _slotsData; _equipment = new ItemSlot[_slotsConfig.Count]; int i = 0; foreach (KeyValuePair <EUnitEqupmentSlot, EItemType[]> kvp in _slotsConfig) { _equipment[i] = new ItemSlot(kvp.Key, EItemKey.None); i++; } for (i = 0; i < _initialItems.Length; i++) { Equip(_initialItems[i].SlotName, _initialItems[i].ItemKey); } _onEquipmentUpdate = onEquipmentUpdate; }
private BaseUnitBehaviour GetFarthestOpponent() { BaseUnitBehaviour result = null; ArrayRO <BaseUnitBehaviour> opposedUnits = _caster.IsAlly ? FightManager.SceneInstance.EnemyUnits : FightManager.SceneInstance.AllyUnits; for (int i = 0; i < opposedUnits.Length; i++) { if (opposedUnits[i] != null && !opposedUnits[i].UnitData.IsDead) { if (result == null) { result = opposedUnits[i]; } else if (Vector3.Distance(_caster.CachedTransform.position, opposedUnits[i].CachedTransform.position) > Vector3.Distance(_caster.CachedTransform.position, result.CachedTransform.position)) { result = opposedUnits[i]; } } } return(result); }
private void OnUnitAttack(BaseUnitBehaviour attacker, BaseUnitBehaviour target) { if (attacker == _caster) { AttackInfo attackInfo = _caster.UnitData.GetAttackInfo(true); //, false); //aoe damage ArrayRO <BaseUnitBehaviour> opposedUnits = _caster.IsAlly ? FightManager.SceneInstance.EnemyUnits : FightManager.SceneInstance.AllyUnits; for (int i = 0; i < opposedUnits.Length; i++) { if (opposedUnits[i] != null && !opposedUnits[i].UnitData.IsDead && Vector3.Distance(_caster.CachedTransform.position, opposedUnits[i].CachedTransform.position) <= _skillParameters.Radius) { opposedUnits[i].UnitData.ApplyDamage(attackInfo); } } _shotsLeft--; if (_shotsLeft == 0) { EndUsage(); } } }
private void InstantiateEnemyUnits(MissionMapData mapData) { //TODO: setup inventory BaseUnitBehaviour[] unitsList = new BaseUnitBehaviour[mapData.Units.Length]; BaseUnitData bud = null; BaseUnitBehaviour bub = null; //instantiate soldiers for (int i = 0; i < mapData.Units.Length; i++) { bub = (GameObject.Instantiate(_enemyUnitsGraphicsResources[mapData.Units[i]].gameObject) as GameObject).GetComponent <BaseUnitBehaviour>(); bub.gameObject.name = "Enemy_" + mapData.Units[i] + " (" + i + ")"; unitsList[i] = bub; bud = UnitsConfig.Instance.GetUnitData(mapData.Units[i]); //LoadItemsResources(_enemyItemsGraphicsResources, mapData.Units[i], bub.ModelView, bud.GetBaseItemInSlot(EUnitEqupmentSlot.Weapon_RHand), bud.GetBaseItemInSlot(EUnitEqupmentSlot.Weapon_LHand), bud.GetBaseItemInSlot(EUnitEqupmentSlot.Armor)); } //save _enemyUnits = new ArrayRO <BaseUnitBehaviour>(unitsList); }
private void DestroyInstances(bool fullUnload) { //destroy ally units if (fullUnload && _allyUnits != null) { for (int i = 0; i < _allyUnits.Length; i++) { if (_allyUnits[i] != null) { GameObject.Destroy(_allyUnits[i].gameObject); } } _allyUnits = null; } //destroy enemy units if (_enemyUnits != null) { for (int i = 0; i < _enemyUnits.Length; i++) { if (_enemyUnits[i] != null) { GameObject.Destroy(_enemyUnits[i].gameObject); } } _enemyUnits = null; } if (_backgroundResource != null) { if (FightManager.SceneInstance != null && FightManager.SceneInstance.UI != null && FightManager.SceneInstance.UI.ImgMapBackground != null) { FightManager.SceneInstance.UI.ImgMapBackground.sprite = null; } } }
List<BaseUnitBehaviour>[] GetRangeUnits(ArrayRO<BaseUnitBehaviour> units) { List<BaseUnitBehaviour>[] rangeUnits = new List<BaseUnitBehaviour>[3] { new List<BaseUnitBehaviour>(), new List<BaseUnitBehaviour>(), new List<BaseUnitBehaviour>() }; List<BaseUnitBehaviour> heroes = rangeUnits[FirstZoneIndex]; List<BaseUnitBehaviour> remoteUnits = rangeUnits[SecondZoneIndex]; List<BaseUnitBehaviour> nearUnits = rangeUnits[ThirdZoneIndex]; for (int i = 0; i < units.Length; i++) { BaseUnitBehaviour unit = units[i]; if (unit != null && unit.UnitData != null) { EUnitPosition position = unit.Place.Position; if (UnitsConfig.Instance.IsHero(unit.UnitData.Data.Key)) { if (heroes.Count < 3) heroes.Add(unit); else if (remoteUnits.Count < 3) { unit.Place = new UnitPlace() { Range = EUnitRange.Ranged, Position = position }; remoteUnits.Add(unit); } else if (nearUnits.Count < 3) { unit.Place = new UnitPlace() { Range = EUnitRange.Melee, Position = position }; nearUnits.Add(unit); } } else { EUnitRange range = unit.UnitData.TemplatePlace.Range != EUnitRange.None ? unit.UnitData.TemplatePlace.Range : unit.UnitData.Data.BaseRange; if (range == EUnitRange.Ranged) { if (remoteUnits.Count < 3) { unit.Place = new UnitPlace() { Range = EUnitRange.Ranged, Position = position }; remoteUnits.Add(unit); } else if (nearUnits.Count < 3) { unit.Place = new UnitPlace() { Range = EUnitRange.Melee, Position = position }; nearUnits.Add(unit); } } else if (range == EUnitRange.Melee) { if (nearUnits.Count < 3) { unit.Place = new UnitPlace() { Range = EUnitRange.Melee, Position = position }; nearUnits.Add(unit); } else if (remoteUnits.Count < 3) { unit.Place = new UnitPlace() { Range = EUnitRange.Ranged, Position = position }; remoteUnits.Add(unit); } } } } } return rangeUnits; }
public BaseUnitBehaviour GetTarget(BaseUnitBehaviour unit, BaseUnitBehaviour currentTarget, ArrayRO<BaseUnitBehaviour> possibleUnits) { UnitPlace currentTargetPlace = currentTarget != null ? currentTarget.Place : new UnitPlace() { Range = EUnitRange.None, Position = EUnitPosition.Middle }; UnitPlace nextTargetPlace = GetNextTargetPlace(unit.Place, currentTargetPlace); while (!nextTargetPlace.Equals(currentTargetPlace)) { if (nextTargetPlace.Range != EUnitRange.None || nextTargetPlace.Position != EUnitPosition.None) { BaseUnitBehaviour nextUnit = GetPlaceBaseUnitBehaviour(possibleUnits, nextTargetPlace); if (nextUnit != null && !nextUnit.UnitData.IsDead) return nextUnit; } nextTargetPlace = GetNextTargetPlace(unit.Place, nextTargetPlace); } if (currentTarget != null) return currentTarget; else { BaseUnitBehaviour nextUnit = GetPlaceBaseUnitBehaviour(possibleUnits, currentTargetPlace); return nextUnit != null && !nextUnit.UnitData.IsDead ? nextUnit : null; } }
BaseUnitBehaviour GetPlaceBaseUnitBehaviour(ArrayRO<BaseUnitBehaviour> units, UnitPlace place) { for (int i = 0; i < units.Length; i++) { BaseUnitBehaviour possibleUnit = units[i]; if (possibleUnit.Place.Range == place.Range && possibleUnit.Place.Position == place.Position) return possibleUnit; } return null; }
public ItemSlotConfig() { _availableItemTypesRO = new ArrayRO <EItemType>(_availableItemTypes); _availableItemTypes = null; }
public ItemSlotConfig() { _availableItemTypesRO = new ArrayRO<EItemType>(_availableItemTypes); _availableItemTypes = null; }
List <BaseUnitBehaviour>[] GetRangeUnits(ArrayRO <BaseUnitBehaviour> units) { List <BaseUnitBehaviour>[] rangeUnits = new List <BaseUnitBehaviour>[3] { new List <BaseUnitBehaviour>(), new List <BaseUnitBehaviour>(), new List <BaseUnitBehaviour>() }; List <BaseUnitBehaviour> heroes = rangeUnits[FirstZoneIndex]; List <BaseUnitBehaviour> remoteUnits = rangeUnits[SecondZoneIndex]; List <BaseUnitBehaviour> nearUnits = rangeUnits[ThirdZoneIndex]; for (int i = 0; i < units.Length; i++) { BaseUnitBehaviour unit = units[i]; if (unit != null && unit.UnitData != null) { EUnitPosition position = unit.Place.Position; if (UnitsConfig.Instance.IsHero(unit.UnitData.Data.Key)) { if (heroes.Count < 3) { heroes.Add(unit); } else if (remoteUnits.Count < 3) { unit.Place = new UnitPlace() { Range = EUnitRange.Ranged, Position = position }; remoteUnits.Add(unit); } else if (nearUnits.Count < 3) { unit.Place = new UnitPlace() { Range = EUnitRange.Melee, Position = position }; nearUnits.Add(unit); } } else { EUnitRange range = unit.UnitData.TemplatePlace.Range != EUnitRange.None ? unit.UnitData.TemplatePlace.Range : unit.UnitData.Data.BaseRange; if (range == EUnitRange.Ranged) { if (remoteUnits.Count < 3) { unit.Place = new UnitPlace() { Range = EUnitRange.Ranged, Position = position }; remoteUnits.Add(unit); } else if (nearUnits.Count < 3) { unit.Place = new UnitPlace() { Range = EUnitRange.Melee, Position = position }; nearUnits.Add(unit); } } else if (range == EUnitRange.Melee) { if (nearUnits.Count < 3) { unit.Place = new UnitPlace() { Range = EUnitRange.Melee, Position = position }; nearUnits.Add(unit); } else if (remoteUnits.Count < 3) { unit.Place = new UnitPlace() { Range = EUnitRange.Ranged, Position = position }; remoteUnits.Add(unit); } } } } } return(rangeUnits); }