private List<Unit> _enemyUnits;//List<IUnit> _enemyUnits; public void MoveUnit(Unit unit, int newPosition) { if ((_map.Location[unit.Position].IsAvailableVertex(newPosition)) && (unit.AP > 0)) { _map.Location[unit.Position].AmountOfUnits--; int tempPosition = unit.Position; unit.Move(newPosition); ChengeStateOfVertex(tempPosition); _map.Location[unit.Position].AmountOfUnits++; ChengeStateOfVertex(unit.Position); //если юнит ассасин, то проверить освещение if (unit.Type == UnitType.Assassin) { if (_map.Location[unit.Position].Light) { unit.Visible = true; } else { unit.Visible = false; } } //var temp = _enemyUnits.Where(item => item.Type == 3 && item.Fraction == 2); //var temp = _unitsEnemy.Where(item => item.Type == 3); //foreach (var singleUnit in temp) //{ //} //если есть враги, то юнит их заметил //смотрим кто есть на соседних вершинах List<int> tempVertex = _map.Location[unit.Position].GetAvailebleVertex(); foreach (var numVertex in tempVertex) { if (unit.Fraction == UnitFraction.Player) { //делаем врагов видимыми var temp = _enemyUnits.Where(item => item.Position == numVertex); foreach (var curUnit in temp) { curUnit.NeedDraw = true; } } else { var temp = _playerUnits.Where(item => item.Position == numVertex); foreach (var curUnit in temp) { curUnit.Seen = true; } } } } }
public void EnemyMovement(Unit enemyUnit) { //найти врага, если есть, то идти к нему и бить, иначе идти куда-то рандомно while (enemyUnit.AP > 0) { Pathfinder path = new Pathfinder(enemyUnit.Position, _map); var unitList = _playerUnits.Where(item => item.Seen && path.DistanceBetweenVertex(item.Position) < 3); if (unitList.Any()) { var targetUnit = unitList.First(); while (enemyUnit.AP > 0) { if ((path.DistanceBetweenVertex(targetUnit.Position) <= enemyUnit.RangeOfAttack) && (enemyUnit.AP > 0)) { AttackUnit(enemyUnit, targetUnit); --enemyUnit.AP; } else if (enemyUnit.AP > 0) { MoveUnit(enemyUnit, path.PathToVertex(targetUnit.Position).First()); --enemyUnit.AP; } } } else { List<int> vertex = _map.Location[enemyUnit.Position].GetAvailebleVertex(); MoveUnit(enemyUnit, vertex[new Random().Next(0, vertex.Count)]); --enemyUnit.AP; } } }
public void AttackUnit(Unit aggressiveUnit, Unit defendingUnit) { Pathfinder tempPath = new Pathfinder(aggressiveUnit.Position, _map); if (tempPath.DistanceBetweenVertex(defendingUnit.Position) <= aggressiveUnit.RangeOfAttack)//если атакующий может достать до цели { if (defendingUnit.SetDamage(aggressiveUnit.Damage))//получение урона и проверка жизнь/смерть { _map.Location[defendingUnit.Position].AmountOfUnits--; int tempPosition = defendingUnit.Position; if (defendingUnit.Fraction == UnitFraction.Player) { _playerUnits.Remove(defendingUnit); } else { _enemyUnits.Remove(defendingUnit); } ChengeStateOfVertex(tempPosition); } } }