// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    //override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
    //
    //}

    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        AI_StateMachine_Helper helper = animator.GetComponent <AI_StateMachine_Helper>();
        Movement    movement          = helper.getMovement();
        AI_Movement aiMovement        = helper.getAIMovement();
        Orient      orient            = helper.getOrient();
        AI_Memory   aiMemory          = helper.getMemory();

        List <Memory> memoryCache = aiMemory.getMemoryCache();

        if (memoryCache.Count == 0)
        {
            Debug.LogWarning("flee target not found");
            return;
        }

        // Go to last combat location
        Vector2 lastSeenEnemyPos = memoryCache[0].lastSeenPosition;

        orient.lookAtStep(lastSeenEnemyPos);
        aiMovement.Move(lastSeenEnemyPos);

        // Combat point reach
        bool positionReached = movement.positionReached(lastSeenEnemyPos);

        if (positionReached)
        {
            memoryCache.RemoveAt(0);
            animator.SetTrigger("CombatPointReached");
        }
    }
    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        AI_StateMachine_Helper helper = animator.GetComponent <AI_StateMachine_Helper>();
        Movement    movement          = helper.getMovement();
        AI_Movement aiMovement        = helper.getAIMovement();
        Orient      orient            = helper.getOrient();
        int         patrolIndex       = animator.GetInteger("PatrolLocationIndex");

        // Patrol if location available
        if (patrolIndex > 0)
        {
            Transform randomPatrolSpot = Navigation_manual.getPatrolLocation(patrolIndex);
            Vector2   visitPos         = randomPatrolSpot.position;
            orient.lookAtStep(visitPos);
            aiMovement.Move(visitPos);

            // Patrol point reach
            bool positionReached = movement.positionReached(visitPos);
            if (positionReached)
            {
                animator.SetTrigger("PatrolPointReached");
            }
        }
        else
        {
            Debug.LogWarning("Patrol location not found");
            animator.SetTrigger("PatrolPointReached");
        }
    }
示例#3
0
    public void ChangeAIToAppropriateOne(int ID)
    {
        if (ID > 1)
        {
            Debug.LogError("Wrong ID! Too high!");
            return;
        }

        if ((GameStateManager.Instance.GameState == GameStates.IdleState || GameStateManager.Instance.GameState == GameStates.AttackState) && TurnManager.Instance.CurrentPhase == TurnPhases.Attack && TurnManager.Instance.PlayerHavingTurn == TurnManager.Instance.PlayerToMove && IsCurrentTurnHuman() == false)
        {
            PlayerAIs[ID] = new AI_Attack(ID);
            return;
        }

        if ((GameStateManager.Instance.GameState == GameStates.IdleState || GameStateManager.Instance.GameState == GameStates.ShootingState) && TurnManager.Instance.CurrentPhase == TurnPhases.Shooting)
        {
            PlayerAIs[ID] = new AI_Shooting(ID);
            return;
        }

        if ((GameStateManager.Instance.GameState == GameStates.IdleState || GameStateManager.Instance.GameState == GameStates.MoveState) && TurnManager.Instance.CurrentPhase == TurnPhases.Movement)
        {
            if (!didAllTheQCDecisionsHappen)
            {
                PlayerAIs[ID] = new AI_QuitCombat(ID);
            }
            else
            {
                PlayerAIs[ID] = new AI_Movement(ID);
            }
            return;
        }
    }
示例#4
0
            public static bool Prefix(
                // ReSharper disable InconsistentNaming
                AI_Movement __instance,
                ref float target,
                ref float speed
                // ReSharper restore InconsistentNaming
                )
            {
                var aiNetworkBehaviourDomestic = __instance.GetComponentInParent(typeof(AI_NetworkBehaviour_Domestic)) as AI_NetworkBehaviour_Domestic;

                if (aiNetworkBehaviourDomestic == null)
                {
                    return(true);
                }

                var speedFactor            = aiNetworkBehaviourDomestic.scaledSize;
                var aiStateMachineDomestic = __instance.GetComponentInParent(typeof(AI_StateMachine_Domestic)) as AI_StateMachine_Domestic;

                // is running
                const int stateRunning = 1;

                if (aiStateMachineDomestic != null &&
                    aiStateMachineDomestic.currentState != null &&
                    aiStateMachineDomestic.currentState.stateIndex == stateRunning &&
                    speedFactor > 3)
                {
                    speedFactor = 3;
                }

                target *= speedFactor;
                speed  *= speedFactor;
                return(true);
            }
 public NavRequest(AI_Movement who, Vector2 whereTo, Vector2 fromWhere, float yourSize)
 {
     subject         = who;
     destineLocation = whereTo;
     currLocation    = fromWhere;
     agentSize       = yourSize;
 }
    //Need optimization
    //Initialize every subject seekers' surrounding nodes as startnodes; spreading from target and pickup start node and assign to according subject's path
    void Update()
    {
        int process_count = process_thredshold;

        while (pathRequestQueue.Count > 0 && process_count > 0)//something missing here?
        {
            process_count -= 1;
            for (int i = 0; i < area_dict.Count; i++)
            {
                area_dict[i].initialize();
            }

            NavRequest navRequest = pathRequestQueue[0];
            pathRequestQueue.RemoveAt(0);

            if (navRequest.subject != null)
            {
                AI_Movement ai = navRequest.subject;

                //Navigate

                List <Vector2> solution = Astar_Algorithm_pathVector2(navRequest.currLocation, navRequest.destineLocation, navRequest.agentSize);
                ai.setNavigationPath(solution);
            }
        }
    }
示例#7
0
    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    //override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    //{
    //    Vector2 enemyPos = aiEnemyFinder.getClosestEnemy().position;
    //    Vector2 thisPos = movement.getPosition();
    //    movement.SetDirectionVector(thisPos - enemyPos);
    //}

    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        AI_StateMachine_Helper helper = animator.GetComponent <AI_StateMachine_Helper>();
        Movement    movement          = helper.getMovement();
        AI_Movement aiMovement        = helper.getAIMovement();
        Orient      orient            = helper.getOrient();
        AI_Memory   aiMemory          = helper.getMemory();
        Vector2     thisPos           = movement.getPosition();

        List <Memory> memoryCache = aiMemory.getMemoryCache();

        if (memoryCache.Count == 0)
        {
            Debug.LogWarning("flee target not found");
            return;
        }

        // Get closest
        Vector2 tmp               = memoryCache[0].lastSeenPosition;
        Vector2 enemyPos          = tmp;
        float   closestDistSqrTmp = (tmp - thisPos).sqrMagnitude;
        float   closestDistSqr    = closestDistSqrTmp;

        for (int i = 1; i < memoryCache.Count; i++)
        {
            tmp = memoryCache[i].lastSeenPosition;
            closestDistSqrTmp = (tmp - thisPos).sqrMagnitude;
            if (closestDistSqr > closestDistSqrTmp)
            {
                closestDistSqr = closestDistSqrTmp;
                enemyPos       = tmp;
            }
        }

        // Get hiding spot
        Transform hidingSpot = Navigation_manual.nearest_cover(thisPos, enemyPos);

        // Flee to hiding spot
        if (hidingSpot != null)
        {
            orient.lookAtStep(hidingSpot.position);
            aiMovement.Move(hidingSpot.position);

            // Combat point reach
            bool positionReached = movement.positionReached(hidingSpot.position);
            if (positionReached)
            {
                animator.SetTrigger("CoverPointReached");
            }
        }
        // Flee from enemy
        else
        {
            Vector2 moveDir = thisPos - enemyPos;
            orient.lookAtStep(enemyPos);
            movement.Move(moveDir);
        }
    }
示例#8
0
    // Use this for initialization
    void Start()
    {
        anim       = GetComponent <Animator>();
        ai         = GetComponent <AI_Movement>();
        controller = GetComponent <AI_Controller>();

        state     = animationState.IDLE;
        prevState = state;
    }
    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    //override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
    //
    //}

    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        AI_StateMachine_Helper helper = animator.GetComponent <AI_StateMachine_Helper>();
        Movement    movement          = helper.getMovement();
        AI_Movement aiMovement        = helper.getAIMovement();
        Orient      orient            = helper.getOrient();
        Equipment   equipment         = helper.getEquipment();
        AI_Finder   aiEnemyFinder     = helper.getEnemyFinder();
        Vector2     thisPos           = movement.getPosition();

        List <Transform> memoryCache = aiEnemyFinder.getSightCache();

        if (memoryCache.Count == 0)
        {
            Debug.LogWarning("attack target not found");
            return;
        }

        // Get closest
        Vector2 tmp               = memoryCache[0].position;
        Vector2 closestPos        = tmp;
        float   closestDistSqrTmp = (tmp - thisPos).sqrMagnitude;
        float   closestDistSqr    = closestDistSqrTmp;

        for (int i = 1; i < memoryCache.Count; i++)
        {
            tmp = memoryCache[i].position;
            closestDistSqrTmp = (tmp - thisPos).sqrMagnitude;
            if (closestDistSqr > closestDistSqrTmp)
            {
                closestDistSqr = closestDistSqrTmp;
                closestPos     = tmp;
            }
        }

        // Engage
        orient.lookAtStep(closestPos);
        aiMovement.Move(closestPos);

        // Attack when close
        AI_Weapon_Helper weaponAIHelper = equipment.getWeapon().GetComponent <AI_Weapon_Helper>();

        Assert.IsNotNull(weaponAIHelper);
        float meleeRange   = weaponAIHelper.getAttackRange();
        float enemyDistSqr = (closestPos - thisPos).sqrMagnitude;

        if (enemyDistSqr < meleeRange * meleeRange)
        {
            equipment.initPrimaryAttack();
        }
    }
示例#10
0
    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    //override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
    //
    //}

    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        AI_StateMachine_Helper helper = animator.GetComponent <AI_StateMachine_Helper>();
        Movement    movement          = helper.getMovement();
        AI_Movement aiMovement        = helper.getAIMovement();
        Orient      orient            = helper.getOrient();
        Equipment   equipment         = helper.getEquipment();
        AI_Finder   weaponFinder      = helper.getWeaponFinder();

        List <Transform> sightCache = weaponFinder.getSightCache();

        if (sightCache.Count == 0)
        {
            Debug.LogWarning("Weapon not found");
            return;
        }

        // Find closest weapon
        Vector2   thisPos           = movement.getPosition();
        Transform tmp               = sightCache[0];
        Transform weaponClosest     = tmp;
        float     closestDistSqrTmp = ((Vector2)tmp.position - thisPos).sqrMagnitude;
        float     closestDistSqr    = closestDistSqrTmp;

        for (int i = 1; i < sightCache.Count; i++)
        {
            tmp = sightCache[i];
            closestDistSqrTmp = ((Vector2)tmp.position - thisPos).sqrMagnitude;
            if (closestDistSqr > closestDistSqrTmp)
            {
                closestDistSqr = closestDistSqrTmp;
                weaponClosest  = tmp;
            }
        }

        // Move & Face enemy
        Vector2 enemyPos = weaponClosest.position;

        orient.lookAtStep(enemyPos);
        aiMovement.Move(enemyPos);

        // Fetch when close
        float pickupRadius = equipment.getPickUpRadius();
        float enemyDistSqr = (enemyPos - thisPos).sqrMagnitude;

        if (enemyDistSqr < pickupRadius * pickupRadius)
        {
            equipment.pickUp();
        }
    }
示例#11
0
    public override GameObject AI_ChooseTarget()
    {
        // I admit this is some HORRIBLE code down there. Maybe i should have just made this random, since my AI code is in general SICKly bad.. It should just generally work as follows in final version (as it does now):
        // Just take the normal movement AI and make it find the best move from legal tiles for this ability.

        AI_Movement TemporaryMovementAI = new AI_Movement(myUnit.PlayerID);
        var         dictionary          = new Dictionary <Tile, float>();

        foreach (Tile tile in AI_GetTheLegalMoves())
        {
            dictionary.Add(tile, TemporaryMovementAI.EvaluateTile(myUnit, tile, TemporaryMovementAI.FindDirectionOfEnemies(myUnit), TemporaryMovementAI.GetAllEnemyMoves()));
        }
        return(TemporaryMovementAI.GetTheMove(myUnit, dictionary).Key.gameObject);
    }
示例#12
0
    // How the enemy think
    IEnumerator Brain()
    {
        do
        {
            float waitTime = atb.MinimumTimeOnAction;

            // decide if will shoot/punch
            if (atb.AtkPriority > atb.FleePriority)
            {
                _attack = false;
            }
            else
            {
                _attack = true;
            }

            // random action
            int action = UnityEngine.Random.Range(0, 3);
            switch (action)
            {
            case 0:
                myMovement = AI_Movement.flee;
                if (atb.Classe == 1)
                {
                    waitTime += UnityEngine.Random.Range(0, atb.MaxTimeOnFlee);
                }
                break;

            case 1:
                myMovement = AI_Movement.stand;
                if (atb.Classe == 1)
                {
                    waitTime += UnityEngine.Random.Range(0, atb.MaxTimeOnStand);
                }
                break;

            default:
                myMovement = AI_Movement.followPlayer;
                _attack    = true;
                if (atb.Classe == 0)
                {
                    waitTime += UnityEngine.Random.Range(0, atb.MaxTimeFollowingPlayer);
                }
                break;
            }

            yield return(new WaitForSeconds(waitTime));
        } while (_isAlive);
    }
示例#13
0
    private void Start()
    {
        //base.Initialize();

        BlackBoard.b_AIs.Add(this);
        m_Movement = GetComponent <AI_Movement>();
        m_Eyes     = GetComponent <AI_Eyes>();
        if (BlackBoard.b_player == null)
        {
            BlackBoard.Init();
        }

        PrevPos = BlackBoard.b_player.transform.position;
        NewPos  = PrevPos;

        CanBeAlertedByAI = true;
    }
示例#14
0
    public override float EvaluateTile(UnitScript currentUnit, Tile tile, int enemiesDirection, Dictionary <UnitMovement, List <Tile> > EnemyMovementRange)
    {
        // we want to evaluate if a tile is a proper "end" tile for a unit to QC into
        float Evaluation = 0f;

        // first lets check if a unit WANTS to QC at all! If not lets give a -infinity
        if (DoesUnitWantToQC(currentUnit) == false)
        {
            Evaluation = -Mathf.Infinity;
        }
        else
        {
            // lets see if the tile is good for QC in a NORMAL way we would do it in movement!
            AI_Movement tempAI = new AI_Movement(ID);
            Evaluation = tempAI.EvaluateTile(currentUnit, tile, enemiesDirection, EnemyMovementRange);
        }
        return(Evaluation);
    }
    private bool ableToSpawn = false; // True if respawnTimer == 0 (except by default as AI already loaded)

    // Use this for initialization
    void Start()
    {
        if (GetComponent <AI_Animation_Controller>() != null)
        {
            animController = GetComponent <AI_Animation_Controller>();
        }
        else
        {
            Debug.LogError("You need to add an animation controller to this AI");
        }
        if (GetComponent <AI_Movement>() != null)
        {
            movement = GetComponent <AI_Movement>();
        }
        else
        {
            Debug.LogError("You need to add an AI_Movement script to this AI");
        }

        player = GameObject.FindGameObjectWithTag("Player");
        state  = aiState.ALIVE;
    }
    public static void CancelRequestPath(AI_Movement subject)
    {
        NavRequest request = Singleton.pathRequestQueue.Find(x => x.subject == subject);

        Singleton.pathRequestQueue.Remove(request);
    }