示例#1
0
    } //call when attack lands by demon on player (in demonHit.cs)

    void Update()
    {
        //state stimuli region
        //checking for demon health (every frame) PERPETUAL
        if (DemonBeenHit.demonHealth < 45 && !lowHealth)
        {
            lowHealth = true; //when demon is at 1/4th health
            demonBehavior.stateChange();
        }
        else if (!lowHealth)
        {
            //checking damage taken (once a second) LONG TERM
            damageTakenTimer += Time.deltaTime;
            if (damageTakenTimer >= 1f)
            {
                damageTakenTimer = 0f;
                int totalDamage    = 0;
                int dequeueCounter = 0;
                foreach (ArrayList damageTimePair in attacksQueue)
                {
                    totalDamage += (int)damageTimePair[0];
                    TimeSpan gap = DateTime.Now - (DateTime)damageTimePair[1];
                    if (gap.TotalSeconds >= 5f)
                    {
                        dequeueCounter++;
                    }
                }
                while (dequeueCounter != 0)
                {
                    attacksQueue.Dequeue();
                    dequeueCounter--;
                }
                if (totalDamage >= 25 && !highDamageBeingTaken)
                {
                    highDamageBeingTaken = true; //cause, short term
                    if (!highDamageTakenEffect)
                    {
                        highDamageTakenEffect = true; //effect, long term
                        demonBehavior.stateChange();
                    }
                }
                else if (totalDamage < 25 && highDamageBeingTaken)
                {
                    highDamageBeingTaken = false;
                }
                //counting down damage effect
                if (highDamageTakenEffect)
                {
                    highDamageEffectTimer++;
                }
                //effect complete
                if (highDamageEffectTimer > 20)
                {
                    highDamageTakenEffect = false;
                    highDamageEffectTimer = 0;
                    demonBehavior.stateChange();
                }
            }

            //player terrified? (once a second) LONG TERM
            terrorCheckTimer += Time.deltaTime;
            if (terrorCheckTimer >= 1f)
            {
                terrorCheckTimer = 0;
                if (Input.GetAxisRaw("Horizontal") != 0f || Input.GetAxisRaw("Vertical") != 0f || Input.GetAxisRaw("Fly") != 0f) //and move = chase and player is spirit
                {
                    Vector3 line1 = demonBody.position - playerManager.targetForTheRest.position;
                    Vector3 line2 = new Vector3(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Fly"), Input.GetAxisRaw("Vertical"));
                    if (Vector3.Dot(line1, line2) <= 0)
                    {
                        runawayCounter++;
                    }
                    else
                    {
                        runawayCounter = 0;
                    }
                }
                else
                {
                    runawayCounter = 0;
                }
                if (runawayCounter >= 5 && !playerTerrified)
                {
                    playerTerrified = true;
                    if (!playerTerrifiedEffect)
                    {
                        playerTerrifiedEffect = true;
                        demonBehavior.stateChange();
                    }
                }
                else if (runawayCounter < 5 && playerTerrified)
                {
                    playerTerrified = false;
                }
                //effect calculation
                if (playerTerrifiedEffect)
                {
                    playerTerrifiedEffectTimer++;
                }
                if (playerTerrifiedEffectTimer > 20)
                {
                    playerTerrifiedEffect      = false;
                    playerTerrifiedEffectTimer = 0;
                    demonBehavior.stateChange();
                }
            }

            //health gap (once in 2 seconds)  SHORT TERM
            healthGapTimer += Time.deltaTime;
            if (healthGapTimer >= 2f)
            {
                healthGapTimer = 0f;
                float demonHealthP  = (DemonBeenHit.demonHealth / 180f) * 100;
                float playerHealthP = (playerManager.playerHealth / 100f) * 100;
                if (playerHealthP - demonHealthP >= gapThreshhold && !healthGapHigh)
                {
                    healthGapHigh = true;
                    demonBehavior.stateChange();
                }
                else if (playerHealthP - demonHealthP < gapThreshhold && healthGapHigh)
                {
                    healthGapHigh = false;
                    demonBehavior.stateChange();
                }
            }

            //state in the last minute (once a second) LONG TERM
            stateCheckTimer += Time.deltaTime;
            if (stateCheckTimer >= 1f)
            {
                stateCheckTimer = 0;
                //state checker code
                if (DemonBehavior.demonState != 0) //state is not in balanced state
                {
                    notInBalancedStateTimer++;
                }
                else
                {
                    notInBalancedStateTimer = 0;
                }
                //variable assigner code
                if (notInBalancedStateTimer >= 60 && !goToBalanced)
                {
                    goToBalanced = true;
                    if (!beBalancedEffect)
                    {
                        beBalancedEffect = true;
                        demonBehavior.stateChange();
                    }
                }
                else if (notInBalancedStateTimer < 60 && goToBalanced)
                {
                    goToBalanced = false;
                }
                //counting down balance effect
                if (beBalancedEffect)
                {
                    beBalancedTimer++;
                }
                //effect complete
                if (beBalancedTimer > 20)
                {
                    beBalancedEffect = false;
                    beBalancedTimer  = 0;
                    demonBehavior.stateChange();
                }
            }

            //player state (once a second) SHORT TERM
            playerStateTimer += Time.deltaTime;
            if (playerStateTimer >= 1f)
            {
                playerStateTimer = 0f;
                if (!playerManager.isSpirit && !isHuman)
                {
                    isHuman = true;
                    demonBehavior.stateChange();
                }
                else if (playerManager.isSpirit && isHuman)
                {
                    isHuman = false;
                    demonBehavior.stateChange();
                }
            }
        }

        //behavior stimuli region
        //distance updation (once every frame)
        setDistanceAndState();

        //consecutive disappearances calculated (once a second)
        disappearancesTimer += Time.deltaTime;
        if (disappearancesTimer >= 1f)
        {
            disappearancesTimer = 0f;
            int dequeueCounter = 0;
            //count over 20 sec ones
            foreach (DateTime disappearanceTime in disappearancesQueue)
            {
                TimeSpan gap = DateTime.Now - disappearanceTime;
                if (gap.TotalSeconds >= 20f)
                {
                    dequeueCounter++;
                }
            }
            //remove over 20 sec ones
            while (dequeueCounter != 0)
            {
                disappearancesQueue.Dequeue();
                dequeueCounter--;
            }
            consecutiveDisappearances = disappearancesQueue.Count;
        }

        //consecutive evades calculated (once a second)
        evadesTimer += Time.deltaTime;
        if (evadesTimer >= 1f)
        {
            evadesTimer = 0f;
            int dequeueCounter = 0;
            //count over 10 sec ones
            foreach (DateTime evadeTime in evadesQueue)
            {
                TimeSpan gap = DateTime.Now - evadeTime;
                if (gap.TotalSeconds > 10f)
                {
                    dequeueCounter++;
                }
            }
            //remove over 10 sec ones
            while (dequeueCounter != 0)
            {
                evadesQueue.Dequeue();
                dequeueCounter--;
            }
            consecutiveEvades = evadesQueue.Count;
        }
    }