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();
        }
    }
    private GameObject m_CanvasGameObject;                  // Used to disable the world space UI during the Starting and Ending phases of each round.


    public void Setup()
    {
        // Get references to the components.
        m_CanvasGameObject = m_Instance.GetComponentInChildren <Canvas> ().gameObject;

        m_Thinker       = m_Instance.GetComponent <TankThinker>();
        m_Thinker.brain = m_Brain;

        // Create a string using the correct color that says 'PLAYER 1' etc based on the tank's color and the player's number.
        m_ColoredPlayerText = "<color=#" + ColorUtility.ToHtmlStringRGB(m_PlayerColor) + ">PLAYER " + m_PlayerNumber + "</color>";

        // Get all of the renderers of the tank.
        MeshRenderer[] renderers = m_Instance.GetComponentsInChildren <MeshRenderer> ();

        // Go through all the renderers...
        for (int i = 0; i < renderers.Length; i++)
        {
            // ... set their material color to the color specific to this tank.
            renderers[i].material.color = m_PlayerColor;
        }
    }
Exemple #4
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());
        }
    }
 public PlayerState this[TankThinker thinker]
 {
     get { return(players.FirstOrDefault(p => p.Tank == thinker)); }
 }
Exemple #6
0
 public override void Initialize(TankThinker tank)
 {
 }
Exemple #7
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));
            }
        }
    }
 // Returns a string message to display at the end of each round.
 private string EndMessage(TankThinker winner)
 {
     return(winner != null?winner.player.PlayerInfo.GetColoredName() + " WINS THE ROUND!" : "DRAW!");
 }
 public abstract void Think(TankThinker tank);
 public virtual void Initialize(TankThinker tank)
 {
 }
Exemple #11
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));
            }
        }
    }
 public override void Initialize(TankThinker tank)
 {
     tank.Remember("state", States.Idle);
     tank.Remember("stateTimeout", Random.Range(idleTime.minValue, idleTime.maxValue));
 }