Ejemplo n.º 1
0
    public override void Fire()
    {
        UtilityFunctions.DebugMessage("Fire");
        Transform unit = (Transform)Instantiate(Attacker, transform.position, Quaternion.identity);

        unit.GetComponent <CreepScript>().Target = GetSpawnLocation();
    }
Ejemplo n.º 2
0
 public void AddAffliction(AfflictionTypes afflictionType, float duration, float affectAmount)
 {
     UtilityFunctions.DebugMessage("Current Time: " + Time.time + ", Duration: " + duration + ", EndTime: " + (Time.time + duration));
     Afflictions.Add(new Affliction {
         AfflictionType = afflictionType, EndTime = (Time.time + duration), AffectAmount = affectAmount
     });
 }
Ejemplo n.º 3
0
    public List <TowerSettings> GetUpgradeOptions(TowerTypes towerType)
    {
        UtilityFunctions.DebugMessage("TreeList Key Count: " + TreeLists.Count);
        List <TreeNode> children = null;

        Debug.Log(towerType);
        if (towerType != TowerTypes.Unknown)
        {
            Debug.Log(TreeLists.First(x => x.Value.Any(y => y.TowerType == towerType)).Value);
            //Debug.Log();
            children = TreeLists.First(x => x.Value.Any(y => y.TowerType == towerType)).Value.First(z => z.TowerType == towerType).Children;
        }
        else
        {
            children = new List <TreeNode>();
            foreach (var towerTree in TreeLists)
            {
                children.Add(towerTree.Value.ElementAt(0));
            }
        }
        return((children != null)
            ? children.Select(x => new TowerSettings {
            TowerType = x.TowerType, GoldCost = x.GoldCost, Description = x.Description
        }).ToList()
            : null);
    }
Ejemplo n.º 4
0
 public override void Fire()
 {
     UtilityFunctions.DebugMessage("Fire");
     foreach (var target in Targets)
     {
         target.GetComponent <CreepScript>().TakeDamage(AttackDamage);
     }
 }
Ejemplo n.º 5
0
 private void Attack()
 {
     if (Time.time >= NextAttackTime)
     {
         UtilityFunctions.DebugMessage("Attacking...");
         FightingTarget.GetComponent <CreepScript>().TakeDamage(AttackDamage);
         NextAttackTime = Time.time + AttackCooldown;
     }
 }
Ejemplo n.º 6
0
 public virtual void OnTriggerEnter2D(Collider2D collider)
 {
     if (collider.tag == "Enemy" && collider is BoxCollider2D)
     {
         UtilityFunctions.DebugMessage("Projectile Hit");
         collider.GetComponent <CreepScript>().TakeDamage(Damage);
         Destroy(this.gameObject);
     }
 }
Ejemplo n.º 7
0
    public Queue <Wave> GetLevelWaves()
    {
        var       waves    = new Queue <Wave>();
        XDocument levelXml = XDocument.Parse(LevelWaveConfiguration.text);

        GameObject.FindObjectOfType <PlayerScript>().Gold = int.Parse(levelXml.Element("Level").Attribute("StartingGold").Value);
        IEnumerable <XElement> waveElements = levelXml.Descendants("Level").Descendants("Waves").Descendants("Wave");
        int waveNumber = 0;

        foreach (XElement waveNode in waveElements)
        {
            Wave wave = new Wave();
            wave.Swarms = new Queue <Swarm>();
            IEnumerable <XElement> swarms = waveNode.Descendants("Swarms").Descendants("Swarm");
            UtilityFunctions.DebugMessage(swarms.Count() + " of swarms in xml");
            foreach (XElement swarmNode in swarms)
            {
                string    creepType = swarmNode.Descendants("Creep").First().Value;
                Transform creep;
                try
                {
                    creep = Resources.Load <Transform>(creepType);
                }
                catch
                {
                    throw new Exception("Unable to find prefab - " + creepType);
                }
                int    quantity            = int.Parse(swarmNode.Descendants("Quantity").First().Value);
                float  timeInBetweenCreeps = float.Parse(swarmNode.Descendants("TimeInBetweenCreeps").First().Value);
                int    spawnLocation       = int.Parse(swarmNode.Descendants("SpawnLocation").First().Value);
                float  timeToNextSwarm     = float.Parse(swarmNode.Descendants("TimeToNextSwarm").First().Value);
                bool   showUnitDescription = swarmNode.Descendants("ShowUnitDescription").Any() ? bool.Parse(swarmNode.Descendants("ShowUnitDescription").First().Value) : false;
                string unitDescription     = swarmNode.Descendants("UnitDescription").Any() ? swarmNode.Descendants("UnitDescription").First().Value : String.Empty;

                wave.Swarms.Enqueue(new Swarm
                {
                    CreepLoadOut = new CreepLoadout
                    {
                        Creep         = creep,
                        SpawnLocation = GetSpawnPoint(spawnLocation),
                    },
                    Quantity            = quantity,
                    TimeInBetweenCreeps = timeInBetweenCreeps,
                    TimeToNextSwarm     = timeToNextSwarm,
                    ShowUnitDescription = showUnitDescription,
                    UnitDescription     = unitDescription
                });
            }
            wave.WaveNumber = waveNumber;
            waveNumber++;
            wave.TimeInBetweenNextWave = float.Parse(waveNode.Descendants("TimeInBetweenNextWave").First().Value);
            waves.Enqueue(wave);
        }

        return(waves);
    }
Ejemplo n.º 8
0
 void OnTriggerExit2D(Collider2D collider)
 {
     if (collider.gameObject.tag == "Enemy" && collider is BoxCollider2D)
     {
         Targets.Remove(collider.transform);
         UtilityFunctions.DebugMessage("Searching for target through exit trigger");
         List <Transform> targets = FindClosestTargetsToBase(1);
         Target = targets.Any() ? targets[0] : null;
     }
 }
Ejemplo n.º 9
0
    private void HealUnits()
    {
        Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, HealRange);

        colliders.Where(x => x.tag == transform.tag && x.transform != transform && x is BoxCollider2D).ToList().ForEach(x =>
        {
            UtilityFunctions.DebugMessage("Healing - " + x.name);
            x.GetComponent <CreepScript>().Heal(HealAmount);
        });
    }
Ejemplo n.º 10
0
 public void TakeDamage(float damage)
 {
     CurrentHitPoints -= damage;
     if (CurrentHitPoints <= 0)
     {
         Destroy(transform.gameObject);
         UtilityFunctions.DebugMessage("Enemy Killed");
         GameObject.FindObjectOfType <PlayerScript>().AddGold(GoldAwarded);
     }
 }
Ejemplo n.º 11
0
    private void SpeedBoostUnits()
    {
        Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, SpeedBoostRange);

        colliders.Where(x => x.tag == transform.tag && x is BoxCollider2D).ToList().ForEach(x =>
        {
            UtilityFunctions.DebugMessage("SpeedBoost - " + x.name);
            x.GetComponent <CreepScript>().AddAffliction(AfflictionTypes.SpeedBoost, Duration, SpeedBoostAmount);
        });
    }
Ejemplo n.º 12
0
 void OnTriggerEnter2D(Collider2D collider)
 {
     if (collider is BoxCollider2D && collider.GetComponent <CreepScript>() != null && collider.GetComponent <CreepScript>().WayPointTarget == transform)
     {
         UtilityFunctions.DebugMessage("Finding waypoint through collider - " + collider.name);
         Transform wayPointTarget = collider.GetComponent <CreepScript>().WayPointTarget;
         Transform target         = collider.GetComponent <CreepScript>().Target;
         wayPointTarget = PathingScript.FindClosestWayPointToSelfAndTarget(transform, wayPointTarget, target);
         collider.GetComponent <CreepScript>().WayPointTarget = wayPointTarget ?? target;
     }
 }
Ejemplo n.º 13
0
    public override void Fire()
    {
        UtilityFunctions.DebugMessage("Projectile fire");
        var cannonPosition = transform.FindChild("ProjectileCannon").position;

        cannonPosition.z = 0;
        Transform bullet = (Transform)Instantiate(Projectile, cannonPosition, Quaternion.identity);

        bullet.GetComponent <Rigidbody2D>().velocity = (Target.position - bullet.position).normalized * bullet.GetComponent <ProjectileScript>().ProjectileSpeed;
        UtilityFunctions.DebugMessage("Projectile velocity: " + (Target.position - bullet.position).normalized * bullet.GetComponent <ProjectileScript>().ProjectileSpeed);
    }
Ejemplo n.º 14
0
    void Update()
    {
        if (NeedToCalculateProjectilePath)
        {
            CalculateProjectilePath();
        }
        ActualFramesToTarget += 1;

        Vector3 unitPositionZeroZ = new Vector3(transform.position.x, transform.position.y, 0);

        if (IsMoving && (GuessedTargetLocation - unitPositionZeroZ).sqrMagnitude >= MidPointDistance)
        {
            float distanceToMidPoint = Vector3.Distance(MidPoint, unitPositionZeroZ);
            float newScale           = 1f + ((MidPointDistance - distanceToMidPoint) / MidPointDistance * MaxAdditionalScale);
            transform.localScale = new Vector3(newScale, newScale, 0);
            transform.position   = new Vector3(transform.position.x, transform.position.y, newScale);
        }
        // going down
        else if (IsMoving)
        {
            float distanceAwayFromMidPoint = Vector3.Distance(unitPositionZeroZ, MidPoint);
            float newScale = 1f + ((MidPointDistance - distanceAwayFromMidPoint) / MidPointDistance * MaxAdditionalScale);
            transform.localScale = new Vector3(newScale, newScale, 0);
            transform.position   = new Vector3(transform.position.x, transform.position.y, newScale);
            if (newScale <= 1)
            {
                //UtilityFunctions.DebugMessage("Actual Target Location: " + Target != null ? Target.position.ToString() : "");
                UtilityFunctions.DebugMessage("Actual Frames to Target: " + ActualFramesToTarget);
                IsMoving = false;
                transform.GetComponent <Rigidbody2D>().velocity = Vector2.zero;
                RemoveProjectileTime = Time.time + ProjectileAliveTime;
                transform.position   = new Vector3(transform.position.x, transform.position.y, 0);
                UtilityFunctions.DebugMessage("Actual projectile hit: " + transform.position);

                // hit anything?
                RaycastHit2D[] hits = Physics2D.RaycastAll(transform.position, Vector2.zero);
                if (hits != null)
                {
                    foreach (RaycastHit2D hit in hits.Where(x => x.transform.tag == "Enemy"))
                    {
                        hit.transform.GetComponent <CreepScript>().TakeDamage(Damage);
                    }
                }
                Destroy(gameObject);
            }
        }
        else
        {
            if (Time.time >= RemoveProjectileTime)
            {
                Destroy(this.gameObject);
            }
        }
    }
Ejemplo n.º 15
0
    private void LoadTreeLists()
    {
        XDocument document = XDocument.Parse(TowerTreeConfiguration.text);

        foreach (var baseTower in document.Descendants("Base"))
        {
            List <TreeNode> treeNodes = new List <TreeNode>();
            AddRootAndChildren(baseTower, treeNodes);
            TreeLists.Add((TowerTreeTypes)Enum.Parse(typeof(TowerTreeTypes), baseTower.Attribute("Type").Value, true), treeNodes);
        }
        UtilityFunctions.DebugMessage(TreeLists.Count() + " base towers found.");
    }
Ejemplo n.º 16
0
 private Transform GetSpawnLocation()
 {
     if (LastTargetedLocation == null || LastTargetedLocation.GetValueOrDefault() + 1 >= SpawnLocations.Count())
     {
         LastTargetedLocation = 0;
     }
     else
     {
         LastTargetedLocation++;
     }
     UtilityFunctions.DebugMessage("Spawn Location: " + SpawnLocations[LastTargetedLocation.GetValueOrDefault()].name);
     return(SpawnLocations[LastTargetedLocation.GetValueOrDefault()].transform);
 }
    public override void Fire()
    {
        var targetsToFireAt = FindClosestTargetsToBase(ProjectilesPerFire);

        foreach (var target in targetsToFireAt)
        {
            UtilityFunctions.DebugMessage("Arcing Projectile fire");
            var cannonPosition = transform.FindChild("ProjectileCannon").position;
            cannonPosition.z = 0;
            Transform bullet = (Transform)Instantiate(Projectile, cannonPosition, Quaternion.identity);
            bullet.GetComponent <ArcingProjectile>().Target = target;
        }
    }
Ejemplo n.º 18
0
    public override void Fire()
    {
        UtilityFunctions.DebugMessage("Fire");
        var cannonPosition = transform.FindChild("ProjectileCannon").position;

        cannonPosition.z = 0;
        Transform bullet = (Transform)Instantiate(Projectile, cannonPosition, Quaternion.identity);

        bullet.GetComponent <HomingProjectileScript>().Target         = Target;
        bullet.GetComponent <HomingProjectileScript>().TowerFiredFrom = transform;
        bullet.LookAt(Target);
        bullet.GetComponent <Rigidbody2D>().AddForce((Target.position - bullet.position).normalized * Force);
    }
Ejemplo n.º 19
0
    public static Transform FindClosestWayPointToSelfAndTarget(Transform unit, Transform wayPointTarget, Transform target)
    {
        GameObject[] wayPoints;
        wayPoints = GameObject.FindGameObjectsWithTag("WayPoint");
        GameObject closest              = null;
        GameObject secondClosest        = null;
        var        distanceToSelf       = Mathf.Infinity;
        var        secondDistanceToSelf = Mathf.Infinity;
        var        position             = UtilityFunctions.UseUnitZPosition(unit, unit.position);

        // Iterate through them and find the two closest ones
        foreach (GameObject wayPoint in wayPoints)
        {
            if (wayPointTarget == null || wayPoint.transform != wayPointTarget)
            {
                var diff        = (UtilityFunctions.UseUnitZPosition(unit, wayPoint.transform.position) - UtilityFunctions.UseUnitZPosition(unit, position));
                var curDistance = diff.sqrMagnitude;
                if (curDistance < distanceToSelf)
                {
                    if (closest != null)
                    {
                        secondClosest        = closest;
                        secondDistanceToSelf = distanceToSelf;
                    }
                    closest        = wayPoint;
                    distanceToSelf = curDistance;
                }
                else if (curDistance < secondDistanceToSelf)
                {
                    secondClosest        = wayPoint;
                    secondDistanceToSelf = curDistance;
                }
            }
        }
        UtilityFunctions.DebugMessage(closest.name + "s distance to target: " + (UtilityFunctions.UseUnitZPosition(unit, closest.transform.position) - UtilityFunctions.UseUnitZPosition(unit, target.position)).sqrMagnitude);
        UtilityFunctions.DebugMessage(secondClosest.name + "s distance to target: " + (UtilityFunctions.UseUnitZPosition(unit, secondClosest.transform.position) - UtilityFunctions.UseUnitZPosition(unit, target.position)).sqrMagnitude);
        UtilityFunctions.DebugMessage("Units distance to target: " + ((UtilityFunctions.UseUnitZPosition(unit, unit.position) - UtilityFunctions.UseUnitZPosition(unit, target.position)).sqrMagnitude));

        // use waypoint closest to target
        if ((UtilityFunctions.UseUnitZPosition(unit, closest.transform.position) - UtilityFunctions.UseUnitZPosition(unit, target.position)).sqrMagnitude <
            (UtilityFunctions.UseUnitZPosition(unit, secondClosest.transform.position) - UtilityFunctions.UseUnitZPosition(unit, target.position)).sqrMagnitude)
        {
            UtilityFunctions.DebugMessage(closest.name + " chosen.");
            return(closest.transform);
        }
        else
        {
            UtilityFunctions.DebugMessage(secondClosest.name + " chosen.");
            return(secondClosest.transform);
        }
    }
Ejemplo n.º 20
0
    protected List <Transform> FindClosestTargetsToBase(int targets)
    {
        RemoveNullTargets();
        UtilityFunctions.DebugMessage("Targets: " + Targets.Count);
        var basePosition = UseUnitZPosition(GameObject.FindGameObjectsWithTag("Base")[0].transform.position);
        // Iterate through them and find the closest to base
        List <Creep> creeps = Targets.Select(x =>
                                             new Creep
        {
            Transform = x,
            Distance  = (UseUnitZPosition(x.transform.position) - basePosition).sqrMagnitude
        }).ToList();

        return(creeps.OrderBy(x => x.Distance).Take(targets).Select(x => x.Transform).ToList());
    }
Ejemplo n.º 21
0
    private bool SaveLevelComplete(int starLevel)
    {
        if (PlayerPrefs.HasKey("Level" + LevelNumber))
        {
            if (starLevel > PlayerPrefs.GetInt("Level" + LevelNumber))
            {
                PlayerPrefs.SetInt("Level" + LevelNumber, starLevel);
            }
        }
        else
        {
            PlayerPrefs.SetInt("Level" + LevelNumber, starLevel);
        }
        UtilityFunctions.DebugMessage(PlayerPrefs.GetInt("Level" + LevelNumber).ToString());

        return(true);
    }
Ejemplo n.º 22
0
    private void CalculateProjectilePath()
    {
        Vector3 targetLocation   = Target.position;
        Vector3 distanceToTarget = targetLocation - transform.position;

        // Guess location when reaching target
        float     anticipatedFramesToTarget = distanceToTarget.magnitude / (ProjectileSpeed * Time.deltaTime * 2);
        Transform targetsTarget             = Target.GetComponent <CreepScript>().WayPointTarget;
        bool      IsFighting            = Target.GetComponent <CreepScript>().IsFighting;
        bool      IsMovingTowardUnit    = Target.GetComponent <CreepScript>().IsMovingTowardFighter;
        float     TargetSpeed           = Target.GetComponent <CreepScript>().UnitSpeed;
        Transform targetsFightingTarget = Target.GetComponent <CreepScript>().FightingTarget;

        if (!IsFighting)
        {
            targetLocation = (UtilityFunctions.UseUnitZPosition(Target, targetsTarget.position) - targetLocation).normalized * anticipatedFramesToTarget * TargetSpeed * Time.deltaTime + targetLocation;
            // adjust by time off due to not knowing location of target after time
            Vector3 newDistanceToTarget          = targetLocation - transform.position;
            float   newAnticipatedFramesToTarget = newDistanceToTarget.magnitude / (ProjectileSpeed * Time.deltaTime * 2);
            targetLocation = (UtilityFunctions.UseUnitZPosition(Target, targetsTarget.position) - targetLocation).normalized * newAnticipatedFramesToTarget * TargetSpeed * Time.deltaTime + targetLocation;
            UtilityFunctions.DebugMessage("Anticipated Frames to target: " + newAnticipatedFramesToTarget);
        }
        else if (IsFighting && IsMovingTowardUnit)
        {
            targetLocation = (UtilityFunctions.UseUnitZPosition(Target, targetsFightingTarget.position) - targetLocation).normalized * anticipatedFramesToTarget * TargetSpeed * Time.deltaTime + targetLocation;
            // adjust by time off due to not knowing location of target after time
            Vector3 newDistanceToTarget          = targetLocation - transform.position;
            float   newAnticipatedFramesToTarget = newDistanceToTarget.magnitude / (ProjectileSpeed * Time.deltaTime * 2);
            targetLocation = (UtilityFunctions.UseUnitZPosition(Target, targetsFightingTarget.position) - targetLocation).normalized * newAnticipatedFramesToTarget * TargetSpeed * Time.deltaTime + targetLocation;
            UtilityFunctions.DebugMessage("Anticipated Frames to target: " + newAnticipatedFramesToTarget);
        }
        GuessedTargetLocation = targetLocation;

        UtilityFunctions.DebugMessage("Guessed Target Location: " + targetLocation);

        // adjust direction on new location
        distanceToTarget = targetLocation - transform.position;

        MidPoint         = distanceToTarget * .5f + transform.position;
        MidPointDistance = Vector3.Distance(targetLocation, transform.position) / 2f;

        transform.GetComponent <Rigidbody2D>().velocity = (targetLocation - transform.position).normalized * ProjectileSpeed;
        IsMoving = true;
        NeedToCalculateProjectilePath = false;
    }
Ejemplo n.º 23
0
 // Update is called once per frame
 void Update()
 {
     if (WayPointTarget == null)
     {
         UtilityFunctions.DebugMessage("Finding waypoint through update");
         WayPointTarget = PathingScript.FindClosestWayPointToSelfAndTarget(transform, WayPointTarget, Target);
         if (WayPointTarget == null)
         {
             WayPointTarget = Target;
         }
     }
     if (!Afflictions.Any(x => x.AfflictionType == AfflictionTypes.Stun))
     {
         if (IsFighting && FightingTarget != null)
         {
             if ((UtilityFunctions.UseUnitZPosition(transform, transform.position) - UtilityFunctions.UseUnitZPosition(transform, FightingTarget.position)).sqrMagnitude > DistanceBetweenMeleeFighters)
             {
                 UtilityFunctions.DebugMessage("Moving towards melee target.");
                 IsMovingTowardFighter = true;
                 float unitSpeedAdjustment = GetUnitSpeedAdjustment();
                 float newUnitSpeed        = unitSpeedAdjustment * UnitSpeed;
                 transform.position += (UseUnitZPosition(FightingTarget.position) - transform.position).normalized * Time.deltaTime * newUnitSpeed;
             }
             else
             {
                 IsMovingTowardFighter = false;
                 Attack();
             }
         }
         else if (IsFighting)
         {
             IsMovingTowardFighter = false;
             IsFighting            = false;
         }
         else
         {
             float unitSpeedAdjustment = GetUnitSpeedAdjustment();
             float newUnitSpeed        = unitSpeedAdjustment * UnitSpeed;
             transform.position += (UseUnitZPosition(WayPointTarget.transform.position) - transform.position).normalized * Time.deltaTime * newUnitSpeed;
         }
     }
     Afflictions.RemoveAll(x => x.EndTime <= Time.time);
 }
Ejemplo n.º 24
0
    public virtual void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit2D[] hit = Physics2D.RaycastAll(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);

            if (hit.Any(x => x.collider is BoxCollider2D && x.transform == transform))
            {
                UtilityFunctions.DebugMessage("Tower selector hit");
                if (IsTowerSelected)
                {
                    IsTowerSelected = false;
                }
                else
                {
                    CloseOtherWindows();
                    IsTowerSelected = true;
                    TowerChoices    = GameObject.FindObjectOfType <TowerTreeScript>().GetUpgradeOptions(TowerType);
                    UtilityFunctions.DebugMessage("TowerChoices: " + TowerChoices.Count);
                }
            }
        }
        if (Target != null)
        {
            if (Time.time >= NextFireTime)
            {
                Fire();
                NextFireTime = Time.time + AttackCooldown;
            }
        }
        else if (Targets.Count > 0)
        {
            Targets.Remove(Target);
        }
        if (Target == null && Targets.Count > 0)
        {
            UtilityFunctions.DebugMessage("Searching for target through update");
            List <Transform> targets = FindClosestTargetsToBase(1);
            Target = targets.Any() ? targets[0] : null;
        }
    }