IEnumerator AIUnitAttack(Unit unit) { while (isInAction) { yield return(null); } isInAction = true; //simulate thinking yield return(new WaitForSeconds(1f)); UnitAttack dattack = unit.GetComponent <UnitAttack>(); GameObject unitPos = BoardManager.Instance.GetPositionOfUnit(unit); List <GameObject> attackFields = dattack.GetAttackTiles(unitPos, true, BoardManager.TileType.Attack) .OrderBy(i => Vector3.Distance(i.transform.position, unitPos.transform.position)).ToList(); while (GameController.Instance.State == GameController.GameState.PerformingAction) { yield return(null); } if (attackFields.Count > 0) { //simulate thinking yield return(new WaitForSeconds(1f)); Unit closestEnemy = Unit.UnitsList.Where(i => BoardManager.Instance.GetPositionOfUnit(i) == attackFields[0]).ToList()[0]; if (unit.CanAttack) { dattack.Attack(closestEnemy); } } unit.CanAttack = false; //simulate thinking yield return(new WaitForSeconds(0.5f)); isInAction = false; }
GameObject FindSafestField(GameObject startPosField, List <GameObject> availableFields) { GameObject safestF = startPosField; //add the current field as first to check if it is the best place availableFields.Insert(0, startPosField); foreach (GameObject field in availableFields) { if (!isInDangerField(field)) { safestF = field; break; } } //find the weakest enemy in case all fields are endangered if (safestF == startPosField && isInDangerField(safestF)) { List <Unit> enemyList = Unit.UnitsList.Where(i => i.IsPlayerControlled).OrderBy(i => i.AttackPower).ToList(); List <GameObject> allAttFields = new List <GameObject>(); foreach (Unit enemy in enemyList) { UnitAttack enemy_attack = enemy.GetComponent <UnitAttack>(); allAttFields.Concat(enemy_attack.GetAttackTiles(BoardManager.Instance.GetPositionOfUnit(enemy), true, BoardManager.TileType.Attack)); } //sort by least endangered field (one field can be endangered from more than one unit) allAttFields = allAttFields.Distinct().ToList(); for (int i = allAttFields.Count; i >= 0; i--) { if (availableFields.Contains(allAttFields[i - 1])) { safestF = allAttFields[i - 1]; break; } } } return(safestF); }