public override void Fire() { UtilityFunctions.DebugMessage("Fire"); Transform unit = (Transform)Instantiate(Attacker, transform.position, Quaternion.identity); unit.GetComponent <CreepScript>().Target = GetSpawnLocation(); }
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 }); }
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); }
public override void Fire() { UtilityFunctions.DebugMessage("Fire"); foreach (var target in Targets) { target.GetComponent <CreepScript>().TakeDamage(AttackDamage); } }
private void Attack() { if (Time.time >= NextAttackTime) { UtilityFunctions.DebugMessage("Attacking..."); FightingTarget.GetComponent <CreepScript>().TakeDamage(AttackDamage); NextAttackTime = Time.time + AttackCooldown; } }
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); } }
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); }
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; } }
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); }); }
public void TakeDamage(float damage) { CurrentHitPoints -= damage; if (CurrentHitPoints <= 0) { Destroy(transform.gameObject); UtilityFunctions.DebugMessage("Enemy Killed"); GameObject.FindObjectOfType <PlayerScript>().AddGold(GoldAwarded); } }
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); }); }
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; } }
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); }
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); } } }
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."); }
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; } }
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); }
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); } }
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()); }
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); }
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; }
// 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); }
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; } }