void Update()
    {
        if (attackTimer > 0f)
        {
            attackTimer -= Time.deltaTime;
        }
        timer -= Time.deltaTime;

        hunger -= Time.deltaTime * HUNGER_LOSS_PER_SECOND;

        // Lerp colour back to normal (for when hit).
        spriteRenderer.color = Color.Lerp(spriteRenderer.color, Color.white, Time.deltaTime * 5f);

        // Pick new target?
        if (timer <= 0f)
        {
            timer = Random.Range(0f, MAX_TIME_BETWEEN_TARGETS);
            PickNewTarget();
        }

        // Can attack when in range, long enough since last attack, and either hungry or always attacks this target.
        bool targetInRange = targetAnimal != null && (targetAnimal.transform.position - transform.position).sqrMagnitude < animalType.attackRange * animalType.attackRange;

        if (targetInRange && attackTimer <= 0 && (Hungry() || animalType.alwaysAttacks.Find(x => x == targetAnimal.animalType) != null))
        {
            // Can attack.
            attackTimer = animalType.attackCooldown;
            targetAnimal.TakeDamage(animalType.attackStrength);
            if (targetAnimal.GetHealth() <= 0)
            {
                hunger += targetAnimal.animalType.foodValue;
            }

            // If run after hit.
            if (animalType.runAfterHitDistance > 0f)
            {
                var randomDir = Random.onUnitSphere;
                randomDir.z = 0;
                randomDir   = randomDir.normalized;
                target      = transform.position + randomDir * animalType.runAfterHitDistance;
                timer       = animalType.runAfterHitDistance / (animalType.moveSpeed * health / animalType.health);
            }
        }


        bool targetDefsInRange = targetInRange &&
                                 targetAnimal != null &&
                                 (targetAnimal.transform.position - transform.position).sqrMagnitude < (animalType.attackRange * animalType.attackRange / 4f);


        // Don't move if target is halfway to move distance.
        if (!targetDefsInRange)
        {
            // Move towards target.
            // Vector3 delta = (target - transform.position).normalized * animalType.moveSpeed * Time.deltaTime;
            // delta.z = 0;
            // transform.position += delta;

            // var direction = target - transform.position;
            // var angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg - 90;
            // transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
            if (target != null)
            {
                Vector3 delta = (target - transform.position).normalized * animalType.moveSpeed * Time.deltaTime * ((float)health) / animalType.health;
                delta.z             = 0;
                transform.position += delta;

                Vector3 direction = (target - transform.position);
                if (direction.sqrMagnitude > 0.1f)
                {
                    faceMovement(direction.normalized);
                }
            }
        }

        UpdateMouseOverText();
    }
Esempio n. 2
0
    void Update()
    {
        treeTimer += Time.deltaTime;
        dayTimer  += Time.deltaTime;

        while (treeTimer > TREE_UPDATE_PERIOD)
        {
            foreach (var tree in trees)
            {
                tree.Grow();
            }
            treeTimer -= TREE_UPDATE_PERIOD;
        }

        if (dayTimer > DAY_LENGTH)
        {
            if (daysTillNextHunter == 0)
            {
                // Remove last hunter.
                if (hunter != null)
                {
                    hunter.TakeDamage(100 * hunter.GetHealth());
                }
                CalculateDaysTillNextHunter();
            }

            dayTimer = 0;
            daysSurvived++;

            daysTillNextHunter -= 1;
            if (daysTillNextHunter == 0)
            {
                // Add hunter.
                hunter = SpawnAnimal(AnimalType.animalTypes.Find(x => x.name == "Hunter"), 20f, 30f);
                Debug.Log("A hunter arrives!");
            }

            for (int i = 0; i < trees.Count; i++)
            {
                trees[i].beingChoppedDown = false;
            }
        }

        animalAdjustmentTimer -= Time.deltaTime;
        if (animalAdjustmentTimer < 0f)
        {
            ResetAnimalAdjustTimer();
            foreach (var animalType in AnimalType.animalTypes)
            {
                var   animalsOfThisType = animals.FindAll(x => x.animalType == animalType);
                float diff = animalType.GetHabitability(trees, animals) - animalsOfThisType.Count;
                if (diff > 0 && Random.Range(0f, 3f) < diff)
                {
                    SpawnAnimal(animalType, 20f, 30f);
                }
                else if (diff < 0 && Random.Range(0f, 3f) < -diff && animalsOfThisType.Count > 0)
                {
                    AnimalController a = animalsOfThisType[Random.Range(0, animalsOfThisType.Count)];
                    a.TakeDamage(a.GetHealth() * 100);
                }
            }
        }

        timeOfDay = dayTimer / DAY_LENGTH;
        UIController.instance.OnDaysSurvived();
    }