Exemple #1
0
    public void SetDroneOwner(DroneBase drone, OWNERS owner)
    {
        Color droneColor = Color.yellow;

        switch (owner)
        {
        case OWNERS.PLAYER:
            droneColor = Color.green;
            break;

        case OWNERS.RAIDER:
            droneColor = Color.red;
            break;

        case OWNERS.NEUTRAL:
            droneColor = Color.white;
            break;
        }

        foreach (Image image in images)
        {
            image.color = droneColor;
        }

        idText.color = droneColor;

        UserDrone uDrone = drone.GetComponent <UserDrone>();

        if (uDrone != null)
        {
            idText.text = uDrone.GetStringIdentifier();
        }
    }
    public void Tick(DroneBase drone)
    {
        rotateCommand.SetTarget(drone.transform.position - drone.GetVelocity());

        if (!rotateCommand.IsFinished(drone))
        {
            drone.FireThrusters(0.0f);
            rotateCommand.Tick(drone);
            return;
        }

        if (drone.velocity != Vector3.zero)
        {
            drone.FireThrusters(drone.thrusterForce);

            // Zero velocity to avoid dealing with "drifting".
            // This will lead to unexpected stops, but is far simpler to deal with.
            if (Mathf.Abs(drone.velocity.magnitude) < 0.15)
            {
                drone.FireThrusters(0.0f);
                drone.velocity     = Vector3.zero;
                drone.acceleration = Vector3.zero;
            }
        }
    }
 void Awake()
 {
     droneBase = GetComponent <DroneBase>();
     droneBase.SetOwner(OWNERS.PLAYER);
     minedResources = new ResourceSet();
     id             = nextId++;
 }
    public void Tick(DroneBase drone)
    {
        if (target == null)
        {
            return;
        }

        rotateCommand.SetTarget(target.transform.position);

        Vector3 positionDiff    = target.transform.position - drone.transform.position;
        float   positionDiffMag = positionDiff.magnitude;

        if (!rotateCommand.IsFinished(drone))
        {
            rotateCommand.Tick(drone);
            return;
        }

        float velocityMag     = drone.velocity.magnitude;
        float timeToIntercept = positionDiffMag / velocityMag;
        float maxAcceleration = drone.thrusterForce / drone.weight;
        float timeToSlow      = drone.velocity.magnitude / maxAcceleration;
        float timeToTarget    = (positionDiffMag + radius + 10.0f) / drone.velocity.magnitude;

        if (timeToSlow < timeToTarget)
        {
            drone.FireThrusters(drone.thrusterForce);
        }
        else
        {
            drone.FireThrusters(0.0f);
        }
    }
    void updateTargetRotation(DroneBase drone)
    {
        Vector3 positionDiff = target - drone.transform.position;

        // Update rotation
        // https://answers.unity.com/questions/254130/how-do-i-rotate-an-object-towards-a-vector3-point.html
        drone.targetRotation = Quaternion.LookRotation(positionDiff.normalized);
    }
 public void Tick(DroneBase drone)
 {
     if (command == 0)
     {
         command1.Tick(drone);
     }
     if (command == 1)
     {
         command2.Tick(drone);
     }
 }
    /// Perform a tick
    public void Tick(DroneBase drone)
    {
        if (uDrone == null)
        {
            return;
        }

        if (drone.HasStorageAvailable())
        {
            target.Mine(drone.damage, drone, uDrone);
        }
    }
 public bool IsFinished(DroneBase drone)
 {
     if (command == 0 && command1.IsFinished(drone))
     {
         command += 1;
     }
     if (command == 1 && command2.IsFinished(drone))
     {
         command += 1;
     }
     return(command == 2);
 }
    public bool IsFinished(DroneBase drone)
    {
        if (target == null)
        {
            return(true);
        }

        Vector3 positionDiff    = drone.transform.position - target.position;
        float   maxAcceleration = drone.thrusterForce / drone.weight;

        return(Mathf.Abs(positionDiff.magnitude) < radius);
    }
Exemple #10
0
    // Start is called before the first frame update
    void Start()
    {
        DroneMgr.inst.RaiderDroneSpawned(this);

        DroneBase drone = GetComponent <DroneBase>();

        if (drone != null)
        {
            drone.SetOwner(OWNERS.RAIDER);
        }

        DroneStatSet droneStats = new DroneStatSet();

        droneStats.Health = 100;

        drone.SetDroneStats(droneStats);
    }
Exemple #11
0
    public void RaiderDroneDestroyed(RaiderDrone destroyed)
    {
        raiderDrones.Remove(destroyed);

        DroneBase db = destroyed.GetComponent <DroneBase>();

        if (db != null)
        {
            allDrones.Remove(db);
        }

        if (raiderWarning && raiderDrones.Count <= 0)
        {
            raiderWarning = false;
            raiderAlarm.Stop();
        }
    }
Exemple #12
0
    public void RaiderDroneSpawned(RaiderDrone newDrone)
    {
        if (!raiderDrones.Contains(newDrone))
        {
            raiderDrones.Add(newDrone);

            DroneBase db = newDrone.GetComponent <DroneBase>();
            if (db != null)
            {
                allDrones.Add(db);
            }

            if (!raiderWarning)
            {
                raiderWarning = true;
                raiderAlarm.Play();
            }
        }
    }
Exemple #13
0
    public void UserDroneSpawned(UserDrone newDrone)
    {
        if (!userDrones.Contains(newDrone))
        {
            userDrones.Add(newDrone);
            droneList.DroneSpawned(newDrone);

            DroneBase db = newDrone.GetComponent <DroneBase>();
            if (db != null)
            {
                allDrones.Add(db);
            }

            if (offeringEscape)
            {
                offeringEscape = false;
                quickEscape.gameObject.SetActive(false);
            }
        }
    }
Exemple #14
0
    /// Try to mine this asteroid
    public void Mine(float power, DroneBase drone, UserDrone uDrone)
    {
        if (uDrone == null)
        {
            return;
        }

        if (Resources.Iron > 0.0f || Resources.Copper > 0.0f || Resources.Uranium > 0.0f || Resources.Copper > 0.0f)
        {
            float ironMined    = Mathf.Clamp(power * resourceRatios.Iron, 0.0f, Resources.Iron);
            float copperMined  = Mathf.Clamp(power * resourceRatios.Copper, 0.0f, Resources.Copper);
            float uraniumMined = Mathf.Clamp(power * resourceRatios.Uranium, 0.0f, Resources.Uranium);
            float iceMined     = Mathf.Clamp(power * resourceRatios.Ice, 0.0f, Resources.Ice);

            // TODO: The player currently gains some extra resources from each "mine" op
            // since the iron levels in an asteroid can go below zero. Fix this.

            /*GameMgr.inst.Resources.Iron += ironMined;
             * GameMgr.inst.Resources.Copper += copperMined;
             * GameMgr.inst.Resources.Uranium += uraniumMined;
             * GameMgr.inst.Resources.Ice += iceMined;*/

            uDrone.minedResources.Iron    += ironMined;
            uDrone.minedResources.Copper  += copperMined;
            uDrone.minedResources.Uranium += uraniumMined;
            uDrone.minedResources.Ice     += iceMined;

            drone.AddResourcesStored(ironMined + copperMined + uraniumMined + iceMined);

            Resources.Iron    -= ironMined;
            Resources.Copper  -= copperMined;
            Resources.Uranium -= uraniumMined;
            Resources.Ice     -= iceMined;
        }

        if (IsEmpty())
        {
            AsteroidMgr.inst.AsteroidDestroyed(this);
            gameObject.GetComponent <Fracture>().FractureObject();
        }
    }
Exemple #15
0
    public void DroneDestroyed(DroneBase drone)
    {
        UserDrone   userDrone   = drone.GetComponent <UserDrone>();
        RaiderDrone raiderDrone = drone.GetComponent <RaiderDrone>();

        if (userDrone != null && raiderDrone != null)
        {
            Debug.LogWarning("A drone was destroyed with both a UserDrone and RaiderDrone script.");
        }

        if (userDrone != null)
        {
            UserDroneDestroyed(userDrone);
        }
        else if (raiderDrone != null)
        {
            RaiderDroneDestroyed(raiderDrone);
        }
        else
        {
            Debug.LogWarning("A drone was destroyed without a UserDrone and RaiderDrone script.");
        }
    }
Exemple #16
0
    public void UserDroneDestroyed(UserDrone destroyed)
    {
        if (userDrones.Contains(destroyed))
        {
            userDrones.Remove(destroyed);
            droneList.DroneDestroyed(destroyed);

            DroneBase db = destroyed.GetComponent <DroneBase>();
            if (db != null)
            {
                allDrones.Remove(db);
            }

            if (userDrones.Count <= 0)
            {
                if (quickEscape != null)
                {
                    quickEscape.gameObject.SetActive(true);
                }
                offeringEscape = true;
            }
        }
    }
    void FixedUpdate()
    {
        List <DroneBase> activeDrones = DroneMgr.inst.GetAllDrones();
        List <Asteroid>  activeRoids  = AsteroidMgr.inst.GetAsteroids();

        if (droneIcons.Count != activeDrones.Count)
        {
            while (droneIcons.Count < activeDrones.Count)
            {
                GameObject obj = Instantiate(droneBogie);
                obj.transform.SetParent(radarPanel);
                RectTransform rectTransform = obj.GetComponent <RectTransform>();
                rectTransform.localPosition = Vector3.zero;
                obj.transform.localScale    = Vector3.one;

                droneIcons.Add(obj.GetComponent <Bogie>());
            }

            if (droneIcons.Count > activeDrones.Count)
            {
                for (int i = activeDrones.Count; i < droneIcons.Count; i++)
                {
                    Destroy(droneIcons[i].gameObject);
                }

                droneIcons.RemoveRange(activeDrones.Count, (droneIcons.Count - activeDrones.Count));
            }

            for (int i = 0; i < droneIcons.Count; i++)
            {
                DroneBase drone = activeDrones[i];
                Bogie     bogie = droneIcons[i];

                bogie.SetDroneOwner(drone, drone.GetOwner());
            }
        }

        if (roidIcons.Count != activeRoids.Count)
        {
            while (roidIcons.Count < activeRoids.Count)
            {
                GameObject obj = Instantiate(asteroidBogie);
                obj.transform.SetParent(radarPanel);
                RectTransform rectTransform = obj.GetComponent <RectTransform>();
                rectTransform.localPosition = Vector3.zero;
                obj.transform.localScale    = Vector3.one / 2.0f;

                roidIcons.Add(obj);
            }

            if (roidIcons.Count > activeRoids.Count)
            {
                for (int i = activeRoids.Count; i < roidIcons.Count; i++)
                {
                    Destroy(roidIcons[i].gameObject);
                }
                roidIcons.RemoveRange(activeRoids.Count, (roidIcons.Count - activeRoids.Count));
            }
        }

        for (int i = 0; i < droneIcons.Count; i++)
        {
            DroneBase drone = activeDrones[i];
            Bogie     bogie = droneIcons[i];

            float distance = Vector3.Distance(drone.transform.position, sensor.transform.position);
            distance = Mathf.Clamp((distance / radarRange), 0.0f, 1.0f);

            // -90 to 90 on the XZ axis, relative to the "reverse" direction (-Z)
            Vector3 toVector = sensor.transform.InverseTransformPoint(drone.transform.position);
            toVector.y = 0;
            float angle = Vector3.SignedAngle(-Vector3.forward, toVector, Vector3.up);
            angle = Mathf.Clamp(angle, -90, 90);

            angle *= Mathf.Deg2Rad;

            RectTransform rect = bogie.GetComponent <RectTransform>();
            float         posX = Mathf.Sin(angle) * distance * (width / 2);
            float         posY = Mathf.Cos(angle) * distance * height;

            rect.anchoredPosition = new Vector2(posX, posY);

            Vector3 relVector = sensor.transform.InverseTransformDirection(drone.transform.forward);
            bogie.UpdateDroneDirection(-Vector3.SignedAngle(-Vector3.forward, relVector, Vector3.up));
        }

        for (int i = 0; i < roidIcons.Count; i++)
        {
            Asteroid   asteroid = activeRoids[i];
            GameObject roid     = roidIcons[i];

            float distance = Vector3.Distance(asteroid.transform.position, sensor.transform.position);
            distance = Mathf.Clamp((distance / radarRange), 0.0f, 1.0f);

            Vector3 toVector = sensor.transform.InverseTransformPoint(asteroid.transform.position);
            toVector.y = 0;
            float angle = Vector3.SignedAngle(-Vector3.forward, toVector, Vector3.up);
            angle = Mathf.Clamp(angle, -90, 90);

            angle *= Mathf.Deg2Rad;

            RectTransform rect = roid.GetComponent <RectTransform>();
            float         posX = Mathf.Sin(angle) * distance * (width * 4);
            float         posY = Mathf.Cos(angle) * distance * height;

            posX = Mathf.Clamp(posX, -width / 2, width / 2);

            rect.anchoredPosition = new Vector2(posX, posY);
        }
    }
 public bool IsFinished(DroneBase drone)
 {
     return(command1.IsFinished(drone) && command2.IsFinished(drone));
 }
 public void Tick(DroneBase drone)
 {
     command1.Tick(drone);
     command2.Tick(drone);
 }
 /// Whether this is done executing.
 public bool IsFinished(DroneBase drone)
 {
     updateTargetRotation(drone);
     return(drone.isAtTargetRotation());
 }
 public PursueTargetToRadiusCommand(DroneBase target)
 {
     this.target   = target;
     rotateCommand = new RotateToPointCommand(target.transform.position);
 }
 /// Whether this is done executing.
 public bool IsFinished(DroneBase drone)
 {
     return(target.IsEmpty());
 }
 /// Perform a tick
 public void Tick(DroneBase drone)
 {
     updateTargetRotation(drone);
 }
 public bool IsFinished(DroneBase drone)
 {
     return(drone.velocity == Vector3.zero);
 }
Exemple #25
0
 void Awake()
 {
     droneBase = GetComponent <DroneBase>();
 }
 public bool IsFinished(DroneBase drone)
 {
     return(target == null);
 }
 public ZeroVelocityCommand(DroneBase drone)
 {
     rotateCommand = new RotateToPointCommand(drone.transform.position - drone.GetVelocity());
 }