public override void Think(TankThinker tank)
    {
        float stateTimeout = tank.Remember <float>("stateTimeout");

        stateTimeout -= Time.deltaTime;
        tank.Remember("stateTimeout", stateTimeout);

        var state = tank.Remember <States>("state");

        var move = tank.GetComponent <TankMovement>();

        if (state == States.Moving)
        {
            move.Steer(tank.Remember <float>("moveForwardBack"), tank.Remember <float>("moveLeftRight"));
        }
        else
        {
            move.Steer(0, 0);
        }

        if (stateTimeout < 0)
        {
            switch (state)
            {
            case States.Idle:
            {
                tank.Remember("state", States.Moving);
                tank.Remember("stateTimeout", Random.Range(moveTime.minValue, moveTime.maxValue));
                tank.Remember("moveForwardBack", Random.Range(-1f, 1f));
                tank.Remember("moveLeftRight", Random.Range(-1f, 1f));
                break;
            }

            case States.Moving:
            {
                tank.Remember("state", States.Firing);
                tank.Remember("stateTimeout", Random.Range(fireTime.minValue, fireTime.maxValue));

                var tankFire = tank.GetComponent <TankShooting>();
                tankFire.BeginChargingShot();

                break;
            }

            case States.Firing:
            {
                var tankFire = tank.GetComponent <TankShooting>();
                tankFire.FireChargedShot();

                tank.Remember("state", States.Idle);
                tank.Remember("stateTimeout", Random.Range(idleTime.minValue, idleTime.maxValue));

                break;
            }
            }
        }
    }
    public override void Think(TankThinker tank)
    {
        var movement = tank.GetComponent <TankMovement>();

        movement.Steer(Input.GetAxis(m_MovementAxisName), Input.GetAxis(m_TurnAxisName));

        var shooting = tank.GetComponent <TankShooting>();

        if (Input.GetButton(m_FireButton))
        {
            shooting.BeginChargingShot();
        }
        else
        {
            shooting.FireChargedShot();
        }
    }
Exemple #3
0
    public override void Think(TankThinker tank)
    {
        var movement = tank.GetComponent <TankMovement>();

        movement.Steer(Input.GetAxis(m_MovementAxisName), Input.GetAxis(m_TurnAxisName));

        var shooting = tank.GetComponent <TankShooting>();

        if (Input.GetButton(m_FireButton))
        {
            shooting.BeginChargingShot();
        }
        else
        {
            shooting.FireChargedShot();
        }

        //Setup player vs enemy awareness.

        if (PlayerControlledTankMovement == null)
        {
            PlayerControlledTankMovement = tank.GetComponent <TankMovement>();
        }

        if (PlayerControlledTankHealth == null)
        {
            PlayerControlledTankHealth = tank.GetComponent <TankHealth>();
        }

        if (TankRigidBody == null || TankRigidBody.GetHashCode() == 0)
        {
            Instance = this;
            //Saving a reference to the Rigid Body of this Tank, so that we can later check against it.
            //Used for damage-related tasks.
            TankRigidBody = tank.GetComponent <Rigidbody>();
            //L.D("TankRigidBody created for PlayerControlledTank with Hash: " + GetHashCode());
        }
    }
Exemple #4
0
    public override void Think(TankThinker tank)
    {
        var shooting = tank.GetComponent <TankShooting>();

        var cooldown = shooting.m_ShellStatsEnemy.ShotCooldown.CurrentValue + shooting.m_ShellStatsEnemy.CurrentShotCooldownBuff;

        //Cooldown is set from Shell Stats.
        timeBetweenShots.minValue = cooldown;
        timeBetweenShots.maxValue = cooldown + 1;

        GameObject target   = tank.Remember <GameObject>("target");
        var        movement = tank.GetComponent <TankMovement>();

        if (!target)
        {
            // Find the nearest tank that isn't me
            target =
                GameObject
                .FindGameObjectsWithTag("Player")
                .OrderBy(go => Vector3.Distance(go.transform.position, tank.transform.position))
                .FirstOrDefault(go => go != tank.gameObject);

            tank.Remember <GameObject>("target");
        }

        if (!target)
        {
            // No targets left - drive in a victory circle
            movement.Steer(0.5f, 1f);
            return;
        }

        // aim at the target
        Vector3 desiredForward = (target.transform.position - tank.transform.position).normalized;

        if (Vector3.Angle(desiredForward, tank.transform.forward) > aimAngleThreshold)
        {
            bool clockwise = Vector3.Cross(desiredForward, tank.transform.forward).y > 0;
            movement.Steer(0f, clockwise ? -1 : 1);
        }
        // Chasing tank advances slowly towards player.
        else
        {
            //But only close enough to kill.
            var distanceToTarget = Vector3.Distance(target.transform.position, tank.transform.position);
            if (distanceToTarget > 20)
            {
                movement.Steer(0.01f * (enemyTankStats.Speed.CurrentValue + enemyTankStats.CurrentSpeedBuff), 0f);
            }
            else if (distanceToTarget < 15)
            {
                movement.Steer(-0.01f * (enemyTankStats.Speed.CurrentValue + enemyTankStats.CurrentSpeedBuff), 0f);
            }
            //Reached target. Freeze!
            else
            {
                movement.Steer(0, 0);
            }
        }

        // Fire at the target
        if (!shooting.IsCharging)
        {
            if (Time.time > tank.Remember <float>("nextShotAllowedAfter"))
            {
                float distanceToTarget = Vector3.Distance(target.transform.position, tank.transform.position);
                float timeToCharge     = distanceToTarget * Random.Range(chargeTimePerDistance.minValue, chargeTimePerDistance.maxValue);
                tank.Remember("fireAt", Time.time + timeToCharge);
                shooting.BeginChargingShot();
            }
        }
        else
        {
            float fireAt = tank.Remember <float>("fireAt");
            if (Time.time > fireAt)
            {
                shooting.FireChargedShot();
                tank.Remember("nextShotAllowedAfter", Time.time + Random.Range(timeBetweenShots.minValue, timeBetweenShots.maxValue));
            }
        }
    }
Exemple #5
0
    public override void Think(TankThinker tank)
    {
        GameObject target   = tank.Remember <GameObject>("target");
        var        movement = tank.GetComponent <TankMovement>();

        if (!target)
        {
            // Find the nearest tank that isn't me
            target =
                GameObject
                .FindGameObjectsWithTag("Player")
                .OrderBy(go => Vector3.Distance(go.transform.position, tank.transform.position))
                .FirstOrDefault(go => go != tank.gameObject);

            tank.Remember <GameObject>("target");
        }

        if (!target)
        {
            // No targets left - drive in a victory circles
            movement.Steer(0.5f, 1f);
            return;
        }

        // aim at the target
        Vector3 desiredForward = (target.transform.position - tank.transform.position).normalized;

        if (Vector3.Angle(desiredForward, tank.transform.forward) > aimAngleThreshold)
        {
            bool clockwise = Vector3.Cross(desiredForward, tank.transform.forward).y > 0;
            movement.Steer(0f, clockwise ? -1 : 1);
        }
        else
        {
            // Stop
            movement.Steer(0f, 0f);
        }

        // Fire at the target
        var shooting = tank.GetComponent <TankShooting>();

        if (!shooting.IsCharging)
        {
            if (Time.time > tank.Remember <float>("nextShotAllowedAfter"))
            {
                float distanceToTarget = Vector3.Distance(target.transform.position, tank.transform.position);
                float timeToCharge     = distanceToTarget * Random.Range(chargeTimePerDistance.minValue, chargeTimePerDistance.maxValue);
                tank.Remember("fireAt", Time.time + timeToCharge);
                shooting.BeginChargingShot();
            }
        }
        else
        {
            float fireAt = tank.Remember <float>("fireAt");
            if (Time.time > fireAt)
            {
                shooting.FireChargedShot();
                tank.Remember("nextShotAllowedAfter", Time.time + Random.Range(timeBetweenShots.minValue, timeBetweenShots.maxValue));
            }
        }
    }