Пример #1
0
    private void CalculateNextBestSequence()
    {
        ActionSequence.allPreconditions playerHealth   = isHealthLow();
        ActionSequence.allPreconditions playerAmmo     = isAmmoLow();
        ActionSequence.allPreconditions enemyCloseness = isEnemyClose();


        List <ActionSequence.allPreconditions> currentConditions = new List <ActionSequence.allPreconditions> ();

        currentConditions.Add(playerHealth);
        currentConditions.Add(playerAmmo);
        currentConditions.Add(enemyCloseness);

        List <ActionSequence> suitableSequences = new List <ActionSequence> ();
        List <float>          scores            = new List <float> ();
        int i = 0;

        foreach (var x in sequenceList)
        {
            float score = 0;
            int   satisfiedConditions = 0;

            foreach (var y in currentConditions)
            {
                if (x.IsConditionValid(y))
                {
                    score += CalculateConditionScore(y, x);
                    satisfiedConditions++;
                }
                else if (x.IsConditionValidForBonus(y))
                {
                    score += CalculateConditionScore(y, x) / 2f;
                }
            }

            if (satisfiedConditions == x.preconditions.Count)
            {
                suitableSequences.Add(x);
                scores.Add(score);
            }
        }

        ActionSequence resultingSequence = suitableSequences [FindHighestScore(scores)];

        SequenceGoapText.text = resultingSequence.sequenceName;

        pa.ExecuteSequence(resultingSequence);
    }
Пример #2
0
    private float CalculateConditionScore(ActionSequence.allPreconditions condition, ActionSequence currentSequence)
    {
        switch (condition)
        {
        case ActionSequence.allPreconditions.enemyClose: return((2f / (enemyDistanceLimit)) * closestEnemy());

        case ActionSequence.allPreconditions.enemyFar:   return(CalculateEnemyFarCondition(currentSequence));

        case ActionSequence.allPreconditions.lowAmmo: return(CalculateLowAmmoCondition(currentSequence));

        case ActionSequence.allPreconditions.highAmmo: return((1f / startingAmmo) * ps.currentAmmo);

        case ActionSequence.allPreconditions.lowHealth: return(CalculateLowHealthCondition(currentSequence));

        case ActionSequence.allPreconditions.highHealth: return((1f / ph.startingHealth) * ph.currentHealth);

        case ActionSequence.allPreconditions.noEnemy: return(2f + (healthPickups.transform.childCount + ammoPickups.transform.childCount) * 0.1f);

        default: return(0f);
        }
    }