Ejemplo n.º 1
0
    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;
    }
Ejemplo n.º 2
0
    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);
    }