From b45e22c164fa364263b00ce82842999f8e5976b2 Mon Sep 17 00:00:00 2001 From: chai <215380520@qq.com> Date: Sun, 26 Nov 2023 23:54:38 +0800 Subject: *move --- .../17664ead-e194-4b38-a89e-7675af6baeed.vsidx | Bin 99302 -> 0 bytes .../5b9c92ca-d942-40f9-9cc4-b06c69736287.vsidx | Bin 102533 -> 0 bytes .../61c5dbcc-e7d6-47e0-88d3-815371600b57.vsidx | Bin 0 -> 98387 bytes .../8769e304-966a-4f20-8edb-b49794ec629b.vsidx | Bin 0 -> 98583 bytes .../ad200304-eaba-4a00-8c5f-1f54dd8b9cd6.vsidx | Bin 97873 -> 0 bytes .../b3819db5-cc71-4f36-af5c-f0fadf36299a.vsidx | Bin 0 -> 100747 bytes .../cec62ca3-88ed-436c-bab0-a2148ebcc7fb.vsidx | Bin 97875 -> 0 bytes .../d9f30e7c-84a7-43ea-ba2d-6d8db0296461.vsidx | Bin 0 -> 101045 bytes Assembly_CSharp/.vs/RogueTower/v17/.suo | Bin 16384 -> 17408 bytes Assembly_CSharp/Building/TeslaCoil.cs | 45 - Assembly_CSharp/GamePlay/Dropper.cs | 126 -- Assembly_CSharp/GamePlay/FlameThrower.cs | 68 - Assembly_CSharp/GamePlay/Lookout.cs | 97 -- Assembly_CSharp/GamePlay/Morter.cs | 39 - Assembly_CSharp/GamePlay/MorterShell.cs | 81 -- Assembly_CSharp/GamePlay/Obelisk.cs | 99 -- Assembly_CSharp/GamePlay/RadarTower.cs | 71 - Assembly_CSharp/GamePlay/Tower.cs | 509 ------- Assembly_CSharp/GamePlay/TowerFlyweight.cs | 279 ---- Assembly_CSharp/GamePlay/TowerManager.cs | 1386 -------------------- Assembly_CSharp/GamePlay/TowerType.cs | 18 - Assembly_CSharp/Tower/Dropper.cs | 126 ++ Assembly_CSharp/Tower/FlameThrower.cs | 68 + Assembly_CSharp/Tower/Lookout.cs | 97 ++ Assembly_CSharp/Tower/Morter.cs | 39 + Assembly_CSharp/Tower/MorterShell.cs | 81 ++ Assembly_CSharp/Tower/Obelisk.cs | 99 ++ Assembly_CSharp/Tower/RadarTower.cs | 71 + Assembly_CSharp/Tower/TeslaCoil.cs | 45 + Assembly_CSharp/Tower/Tower.cs | 509 +++++++ Assembly_CSharp/Tower/TowerFlyweight.cs | 279 ++++ Assembly_CSharp/Tower/TowerManager.cs | 1386 ++++++++++++++++++++ Assembly_CSharp/Tower/TowerType.cs | 18 + 33 files changed, 2818 insertions(+), 2818 deletions(-) delete mode 100644 Assembly_CSharp/.vs/RogueTower/FileContentIndex/17664ead-e194-4b38-a89e-7675af6baeed.vsidx delete mode 100644 Assembly_CSharp/.vs/RogueTower/FileContentIndex/5b9c92ca-d942-40f9-9cc4-b06c69736287.vsidx create mode 100644 Assembly_CSharp/.vs/RogueTower/FileContentIndex/61c5dbcc-e7d6-47e0-88d3-815371600b57.vsidx create mode 100644 Assembly_CSharp/.vs/RogueTower/FileContentIndex/8769e304-966a-4f20-8edb-b49794ec629b.vsidx delete mode 100644 Assembly_CSharp/.vs/RogueTower/FileContentIndex/ad200304-eaba-4a00-8c5f-1f54dd8b9cd6.vsidx create mode 100644 Assembly_CSharp/.vs/RogueTower/FileContentIndex/b3819db5-cc71-4f36-af5c-f0fadf36299a.vsidx delete mode 100644 Assembly_CSharp/.vs/RogueTower/FileContentIndex/cec62ca3-88ed-436c-bab0-a2148ebcc7fb.vsidx create mode 100644 Assembly_CSharp/.vs/RogueTower/FileContentIndex/d9f30e7c-84a7-43ea-ba2d-6d8db0296461.vsidx delete mode 100644 Assembly_CSharp/Building/TeslaCoil.cs delete mode 100644 Assembly_CSharp/GamePlay/Dropper.cs delete mode 100644 Assembly_CSharp/GamePlay/FlameThrower.cs delete mode 100644 Assembly_CSharp/GamePlay/Lookout.cs delete mode 100644 Assembly_CSharp/GamePlay/Morter.cs delete mode 100644 Assembly_CSharp/GamePlay/MorterShell.cs delete mode 100644 Assembly_CSharp/GamePlay/Obelisk.cs delete mode 100644 Assembly_CSharp/GamePlay/RadarTower.cs delete mode 100644 Assembly_CSharp/GamePlay/Tower.cs delete mode 100644 Assembly_CSharp/GamePlay/TowerFlyweight.cs delete mode 100644 Assembly_CSharp/GamePlay/TowerManager.cs delete mode 100644 Assembly_CSharp/GamePlay/TowerType.cs create mode 100644 Assembly_CSharp/Tower/Dropper.cs create mode 100644 Assembly_CSharp/Tower/FlameThrower.cs create mode 100644 Assembly_CSharp/Tower/Lookout.cs create mode 100644 Assembly_CSharp/Tower/Morter.cs create mode 100644 Assembly_CSharp/Tower/MorterShell.cs create mode 100644 Assembly_CSharp/Tower/Obelisk.cs create mode 100644 Assembly_CSharp/Tower/RadarTower.cs create mode 100644 Assembly_CSharp/Tower/TeslaCoil.cs create mode 100644 Assembly_CSharp/Tower/Tower.cs create mode 100644 Assembly_CSharp/Tower/TowerFlyweight.cs create mode 100644 Assembly_CSharp/Tower/TowerManager.cs create mode 100644 Assembly_CSharp/Tower/TowerType.cs (limited to 'Assembly_CSharp') diff --git a/Assembly_CSharp/.vs/RogueTower/FileContentIndex/17664ead-e194-4b38-a89e-7675af6baeed.vsidx b/Assembly_CSharp/.vs/RogueTower/FileContentIndex/17664ead-e194-4b38-a89e-7675af6baeed.vsidx deleted file mode 100644 index 645265a..0000000 Binary files a/Assembly_CSharp/.vs/RogueTower/FileContentIndex/17664ead-e194-4b38-a89e-7675af6baeed.vsidx and /dev/null differ diff --git a/Assembly_CSharp/.vs/RogueTower/FileContentIndex/5b9c92ca-d942-40f9-9cc4-b06c69736287.vsidx b/Assembly_CSharp/.vs/RogueTower/FileContentIndex/5b9c92ca-d942-40f9-9cc4-b06c69736287.vsidx deleted file mode 100644 index 6c647f4..0000000 Binary files a/Assembly_CSharp/.vs/RogueTower/FileContentIndex/5b9c92ca-d942-40f9-9cc4-b06c69736287.vsidx and /dev/null differ diff --git a/Assembly_CSharp/.vs/RogueTower/FileContentIndex/61c5dbcc-e7d6-47e0-88d3-815371600b57.vsidx b/Assembly_CSharp/.vs/RogueTower/FileContentIndex/61c5dbcc-e7d6-47e0-88d3-815371600b57.vsidx new file mode 100644 index 0000000..5f20522 Binary files /dev/null and b/Assembly_CSharp/.vs/RogueTower/FileContentIndex/61c5dbcc-e7d6-47e0-88d3-815371600b57.vsidx differ diff --git a/Assembly_CSharp/.vs/RogueTower/FileContentIndex/8769e304-966a-4f20-8edb-b49794ec629b.vsidx b/Assembly_CSharp/.vs/RogueTower/FileContentIndex/8769e304-966a-4f20-8edb-b49794ec629b.vsidx new file mode 100644 index 0000000..bd7a68e Binary files /dev/null and b/Assembly_CSharp/.vs/RogueTower/FileContentIndex/8769e304-966a-4f20-8edb-b49794ec629b.vsidx differ diff --git a/Assembly_CSharp/.vs/RogueTower/FileContentIndex/ad200304-eaba-4a00-8c5f-1f54dd8b9cd6.vsidx b/Assembly_CSharp/.vs/RogueTower/FileContentIndex/ad200304-eaba-4a00-8c5f-1f54dd8b9cd6.vsidx deleted file mode 100644 index a852974..0000000 Binary files a/Assembly_CSharp/.vs/RogueTower/FileContentIndex/ad200304-eaba-4a00-8c5f-1f54dd8b9cd6.vsidx and /dev/null differ diff --git a/Assembly_CSharp/.vs/RogueTower/FileContentIndex/b3819db5-cc71-4f36-af5c-f0fadf36299a.vsidx b/Assembly_CSharp/.vs/RogueTower/FileContentIndex/b3819db5-cc71-4f36-af5c-f0fadf36299a.vsidx new file mode 100644 index 0000000..a3e4157 Binary files /dev/null and b/Assembly_CSharp/.vs/RogueTower/FileContentIndex/b3819db5-cc71-4f36-af5c-f0fadf36299a.vsidx differ diff --git a/Assembly_CSharp/.vs/RogueTower/FileContentIndex/cec62ca3-88ed-436c-bab0-a2148ebcc7fb.vsidx b/Assembly_CSharp/.vs/RogueTower/FileContentIndex/cec62ca3-88ed-436c-bab0-a2148ebcc7fb.vsidx deleted file mode 100644 index 0cb00fc..0000000 Binary files a/Assembly_CSharp/.vs/RogueTower/FileContentIndex/cec62ca3-88ed-436c-bab0-a2148ebcc7fb.vsidx and /dev/null differ diff --git a/Assembly_CSharp/.vs/RogueTower/FileContentIndex/d9f30e7c-84a7-43ea-ba2d-6d8db0296461.vsidx b/Assembly_CSharp/.vs/RogueTower/FileContentIndex/d9f30e7c-84a7-43ea-ba2d-6d8db0296461.vsidx new file mode 100644 index 0000000..87358ed Binary files /dev/null and b/Assembly_CSharp/.vs/RogueTower/FileContentIndex/d9f30e7c-84a7-43ea-ba2d-6d8db0296461.vsidx differ diff --git a/Assembly_CSharp/.vs/RogueTower/v17/.suo b/Assembly_CSharp/.vs/RogueTower/v17/.suo index 1048afb..9774c05 100644 Binary files a/Assembly_CSharp/.vs/RogueTower/v17/.suo and b/Assembly_CSharp/.vs/RogueTower/v17/.suo differ diff --git a/Assembly_CSharp/Building/TeslaCoil.cs b/Assembly_CSharp/Building/TeslaCoil.cs deleted file mode 100644 index 97954e7..0000000 --- a/Assembly_CSharp/Building/TeslaCoil.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections; -using UnityEngine; - -public class TeslaCoil : Tower -{ - [SerializeField] - private GameObject lightningTrail; - - protected override void AimTurret() - { - } - - protected override void Fire() - { - if (consumesMana) - { - int manaCost = (int)((float)base.damage * manaConsumptionRate); - if (!ResourceManager.instance.CheckMana(manaCost)) - { - return; - } - ResourceManager.instance.SpendMana(manaCost); - } - Vector3 position = base.transform.position; - position.y = 0f; - Collider[] array = Physics.OverlapSphere(position, base.range, enemyLayerMask, QueryTriggerInteraction.Collide); - for (int i = 0; i < array.Length; i++) - { - array[i].GetComponent()?.TakeDamage(towerType, base.damage, base.healthDamage, base.armorDamage, base.shieldDamage, base.slowPercent, base.bleedPercent, base.burnPercent, base.poisonPercent, base.critChance, base.stunChance); - } - SFXManager.instance.PlaySound(Sound.TeslaZap, base.transform.position); - StartCoroutine(DrawLightning()); - } - - private IEnumerator DrawLightning() - { - for (float i = 0f; i <= (float)Math.PI * 2f; i += 0.5f) - { - Vector3 vector = new Vector3(UnityEngine.Random.Range(-0.5f, 0.5f), UnityEngine.Random.Range(-0.5f, 0.5f), UnityEngine.Random.Range(-0.5f, 0.5f)); - lightningTrail.transform.position = vector + new Vector3(base.transform.position.x + Mathf.Sin(i) * base.range, 0.75f, base.transform.position.z + Mathf.Cos(i) * base.range); - yield return new WaitForEndOfFrame(); - } - } -} diff --git a/Assembly_CSharp/GamePlay/Dropper.cs b/Assembly_CSharp/GamePlay/Dropper.cs deleted file mode 100644 index 0dc7a10..0000000 --- a/Assembly_CSharp/GamePlay/Dropper.cs +++ /dev/null @@ -1,126 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; - -public class Dropper : Tower -{ - [SerializeField] - private int manaPerSecond; - - [SerializeField] - private float dropHeight = 3f; - - [SerializeField] - private LayerMask dropSetMask; - - [SerializeField] - protected Vector2[] dropPoints; - - [SerializeField] - private bool requireTargetToDrop; - - private int currentLevel; - - public float dropperRPMdisplay; - - private float timeOfNextManaCheck; - - private bool canFire = true; - - protected override void Start() - { - base.Start(); - SetDropPoints(); - } - - public override void SetStats() - { - base.SetStats(); - rps = 60f / rpm * (10f / (10f + (float)dropPoints.Length)); - dropperRPMdisplay = rpm * (10f + (float)dropPoints.Length) / 10f; - } - - private void SetDropPoints() - { - List list = new List(); - for (int i = -(int)base.range; (float)i <= base.range; i++) - { - for (int j = -(int)base.range; (float)j <= base.range; j++) - { - if (Physics.Raycast(new Vector3(base.transform.position.x + (float)i, dropHeight, base.transform.position.z + (float)j), Vector3.down, out var hitInfo, 1.5f * dropHeight, dropSetMask, QueryTriggerInteraction.Ignore) && hitInfo.transform.gameObject.layer == LayerMask.NameToLayer("Path")) - { - list.Add(new Vector2(i, j)); - } - } - } - dropPoints = list.ToArray(); - rps = 60f / rpm * (10f / (10f + (float)dropPoints.Length)); - dropperRPMdisplay = rpm * (10f + (float)dropPoints.Length) / 10f; - } - - protected override void Update() - { - if (SpawnManager.instance.level != currentLevel) - { - SetDropPoints(); - currentLevel = SpawnManager.instance.level; - } - if (currentTarget != null) - { - if (turret != null) - { - AimTurret(); - } - GainXP(); - } - if (manaPerSecond > 0 && Time.time >= timeOfNextManaCheck && SpawnManager.instance.combat) - { - timeOfNextManaCheck = Time.time + 1f; - if (ResourceManager.instance.CheckMana(manaPerSecond)) - { - ResourceManager.instance.SpendMana(manaPerSecond); - canFire = true; - } - else - { - canFire = false; - } - } - timeSinceLastShot += Time.deltaTime; - if (canFire && TargetingCheck() && timeSinceLastShot > rps && SpawnManager.instance.combat) - { - Fire(); - timeSinceLastShot = 0f; - } - } - - private bool TargetingCheck() - { - if (requireTargetToDrop) - { - if (currentTarget != null) - { - return true; - } - return false; - } - return true; - } - - protected override void Fire() - { - if (consumesMana) - { - int manaCost = (int)((float)base.damage * manaConsumptionRate); - if (!ResourceManager.instance.CheckMana(manaCost)) - { - return; - } - ResourceManager.instance.SpendMana(manaCost); - } - if (dropPoints.Length != 0) - { - Vector2 vector = dropPoints[Random.Range(0, dropPoints.Length)]; - Object.Instantiate(projectile, new Vector3(vector.x, dropHeight, vector.y) + base.transform.position, Quaternion.identity).GetComponent().SetStats(towerType, null, projectileSpeed, base.damage, base.healthDamage, base.armorDamage, base.shieldDamage, base.slowPercent, base.bleedPercent, base.burnPercent, base.poisonPercent, base.critChance, base.stunChance); - } - } -} diff --git a/Assembly_CSharp/GamePlay/FlameThrower.cs b/Assembly_CSharp/GamePlay/FlameThrower.cs deleted file mode 100644 index d415d88..0000000 --- a/Assembly_CSharp/GamePlay/FlameThrower.cs +++ /dev/null @@ -1,68 +0,0 @@ -using UnityEngine; - -public class FlameThrower : Tower -{ - [SerializeField] - private ParticleSystem flames; - - public bool flaming; - - private bool hasMana = true; - - [SerializeField] - private AudioSource audioS; - - private bool soundPlaying; - - protected override void Update() - { - if (hasMana && currentTarget != null && !flaming) - { - flames.Play(); - PlaySound(onOff: true); - flaming = true; - } - else if (!hasMana || (currentTarget == null && flaming)) - { - flames.Stop(); - PlaySound(onOff: false); - flaming = false; - } - base.Update(); - } - - protected override void Fire() - { - if (consumesMana) - { - int manaCost = (int)((float)base.damage * manaConsumptionRate); - if (!ResourceManager.instance.CheckMana(manaCost)) - { - hasMana = false; - return; - } - ResourceManager.instance.SpendMana(manaCost); - hasMana = true; - } - RaycastHit[] array = Physics.SphereCastAll(muzzle.position, base.range / 6f, muzzle.transform.forward, base.range * 1.5f, enemyLayerMask, QueryTriggerInteraction.Collide); - foreach (RaycastHit raycastHit in array) - { - raycastHit.collider.GetComponent()?.TakeDamage(towerType, base.damage, base.healthDamage, base.armorDamage, base.shieldDamage, base.slowPercent, base.bleedPercent, base.burnPercent, base.poisonPercent, base.critChance, base.stunChance); - } - } - - private void PlaySound(bool onOff) - { - if (onOff && !soundPlaying) - { - audioS.volume = OptionsMenu.instance.masterVolume * OptionsMenu.instance.sfxVolume; - audioS.Play(); - soundPlaying = true; - } - else if (!onOff && soundPlaying) - { - audioS.Stop(); - soundPlaying = false; - } - } -} diff --git a/Assembly_CSharp/GamePlay/Lookout.cs b/Assembly_CSharp/GamePlay/Lookout.cs deleted file mode 100644 index 3abd55b..0000000 --- a/Assembly_CSharp/GamePlay/Lookout.cs +++ /dev/null @@ -1,97 +0,0 @@ -using UnityEngine; - -public class Lookout : Tower -{ - [SerializeField] - private GameObject markIcon; - - private GameObject currentMark; - - protected override void Update() - { - if (currentTarget != null) - { - markIcon.SetActive(value: true); - UpdateMark(); - GainXP(); - } - else - { - markIcon.SetActive(value: false); - } - } - - private void UpdateMark() - { - if (currentTarget != currentMark) - { - if (currentMark != null) - { - currentMark.GetComponent().mark = null; - } - currentMark = currentTarget; - currentMark.GetComponent().mark = this; - } - markIcon.transform.position = currentMark.transform.position; - } - - protected override GameObject SelectEnemy(Collider[] possibleTargets) - { - GameObject result = null; - float num = -1f; - for (int i = 0; i < possibleTargets.Length; i++) - { - float num2 = 1f; - Enemy component = possibleTargets[i].GetComponent(); - if (!(component.mark != this) || !(component.mark != null)) - { - if (CheckPriority(Priority.Progress)) - { - num2 /= Mathf.Max(0.001f, possibleTargets[i].GetComponent().distanceFromEnd); - } - if (CheckPriority(Priority.NearDeath)) - { - num2 /= Mathf.Max(0.001f, component.CurrentHealth()); - } - if (CheckPriority(Priority.MostHealth)) - { - num2 *= (float)Mathf.Max(1, component.health); - } - if (CheckPriority(Priority.MostArmor)) - { - num2 *= (float)Mathf.Max(1, component.armor); - } - if (CheckPriority(Priority.MostShield)) - { - num2 *= (float)Mathf.Max(1, component.shield); - } - if (CheckPriority(Priority.LeastHealth)) - { - num2 /= (float)Mathf.Max(1, component.health); - } - if (CheckPriority(Priority.LeastArmor)) - { - num2 /= (float)Mathf.Max(1, component.armor); - } - if (CheckPriority(Priority.LeastShield)) - { - num2 /= (float)Mathf.Max(1, component.shield); - } - if (CheckPriority(Priority.Fastest)) - { - num2 *= Mathf.Max(0.001f, possibleTargets[i].GetComponent().speed); - } - if (CheckPriority(Priority.Slowest)) - { - num2 /= Mathf.Max(0.001f, possibleTargets[i].GetComponent().speed); - } - if (num2 > num) - { - result = component.gameObject; - num = num2; - } - } - } - return result; - } -} diff --git a/Assembly_CSharp/GamePlay/Morter.cs b/Assembly_CSharp/GamePlay/Morter.cs deleted file mode 100644 index 2170da3..0000000 --- a/Assembly_CSharp/GamePlay/Morter.cs +++ /dev/null @@ -1,39 +0,0 @@ -using UnityEngine; - -public class Morter : Tower -{ - protected override void AimTurret() - { - } - - protected override void Fire() - { - if (consumesMana) - { - int manaCost = (int)((float)base.damage * finalManaConsumption); - if (!ResourceManager.instance.CheckMana(manaCost)) - { - return; - } - ResourceManager.instance.SpendMana(manaCost); - } - float num = projectileSpeed * Mathf.Clamp(Vector3.SqrMagnitude(currentTarget.transform.position - base.transform.position) / (2f * baseRange * baseRange), 1f, float.MaxValue); - Vector3 vector = currentTarget.GetComponent().GetFuturePosition(num) - turret.transform.position; - GameObject gameObject = Object.Instantiate(rotation: Quaternion.LookRotation(new Vector3(vector.x, 0f, vector.z), Vector3.up), original: projectile, position: muzzle.position); - gameObject.GetComponent().SetStats(towerType, currentTarget, num, base.damage, base.healthDamage, base.armorDamage, base.shieldDamage, base.slowPercent, base.bleedPercent, base.burnPercent, base.poisonPercent, base.critChance, base.stunChance); - gameObject.GetComponent().SetMorterPhysics(currentTarget.GetComponent().GetFuturePosition(num)); - gameObject.GetComponent().blastRadius = base.blastRadius; - if (extraProjectileFX != null) - { - GameObject gameObject2 = Object.Instantiate(extraProjectileFX, gameObject.transform.position, gameObject.transform.rotation); - gameObject2.transform.SetParent(gameObject.transform); - gameObject2.GetComponent().SetFX(base.bleedPercent, base.burnPercent, base.poisonPercent, base.slowPercent, consumesMana); - Projectile component = gameObject.GetComponent(); - if (component.detachOnDestruction == null) - { - component.detachOnDestruction = gameObject2; - component.extraFX = gameObject2.GetComponent(); - } - } - } -} diff --git a/Assembly_CSharp/GamePlay/MorterShell.cs b/Assembly_CSharp/GamePlay/MorterShell.cs deleted file mode 100644 index ce93441..0000000 --- a/Assembly_CSharp/GamePlay/MorterShell.cs +++ /dev/null @@ -1,81 +0,0 @@ -using UnityEngine; - -public class MorterShell : Projectile -{ - [SerializeField] - private GameObject artObject; - - [SerializeField] - private LayerMask layersAffectedByBlast; - - public float blastRadius = 1f; - - private Vector3 destination; - - private float timeOfFlight; - - [SerializeField] - private float vSpeed; - - [SerializeField] - private float hSpeed; - - [SerializeField] - private float gravity = 5f; - - [SerializeField] - private GameObject explosion; - - private float lookAhead; - - private Vector3 previousPos; - - public void SetMorterPhysics(Vector3 pos) - { - destination = pos; - timeOfFlight = speed; - vSpeed = gravity * timeOfFlight / 2f; - hSpeed = Vector3.Magnitude(base.transform.position - destination) / timeOfFlight; - lookAhead = vSpeed + hSpeed; - } - - protected override void MoveProjectile() - { - previousPos = base.transform.position; - base.transform.Translate(Vector3.forward * hSpeed * Time.fixedDeltaTime); - base.transform.Translate(Vector3.up * vSpeed * Time.fixedDeltaTime); - vSpeed -= gravity * Time.fixedDeltaTime; - artObject.transform.rotation = Quaternion.LookRotation(base.transform.position - previousPos, Vector3.up); - } - - protected override void CheckForHits() - { - if (!(vSpeed > 0f) && Physics.Raycast(artObject.transform.position, artObject.transform.forward, out var hitInfo, lookAhead * Time.fixedDeltaTime, layermask, QueryTriggerInteraction.Collide)) - { - OnHit(hitInfo); - } - } - - protected override void OnHit(RaycastHit hit) - { - Collider[] array = Physics.OverlapSphere(base.transform.position, blastRadius, layersAffectedByBlast, QueryTriggerInteraction.Collide); - for (int i = 0; i < array.Length; i++) - { - IDamageable component = array[i].GetComponent(); - if (component != null) - { - DealDamage(component); - } - } - if (detachOnDestruction != null) - { - detachOnDestruction.transform.parent = null; - } - if (extraFX != null) - { - extraFX.OnDetach(); - } - Object.Instantiate(explosion, base.transform.position, Quaternion.identity); - Object.Destroy(base.gameObject); - } -} diff --git a/Assembly_CSharp/GamePlay/Obelisk.cs b/Assembly_CSharp/GamePlay/Obelisk.cs deleted file mode 100644 index 549f3b4..0000000 --- a/Assembly_CSharp/GamePlay/Obelisk.cs +++ /dev/null @@ -1,99 +0,0 @@ -using UnityEngine; - -public class Obelisk : Tower -{ - [SerializeField] - private GameObject beam; - - [SerializeField] - private AudioSource audioS; - - private bool soundPlaying; - - private IDamageable lastThingIHit; - - private float timeOnTarget; - - protected override void Update() - { - if (currentTarget != null) - { - if (turret != null) - { - AimTurret(); - } - GainXP(); - } - else - { - beam.SetActive(value: false); - PlaySound(onOff: false); - } - timeSinceLastShot += Time.deltaTime; - if (currentTarget != null && timeSinceLastShot > rps) - { - Fire(); - timeSinceLastShot = 0f; - } - } - - protected override void Fire() - { - if (consumesMana) - { - int manaCost = (int)((float)base.damage * manaConsumptionRate); - if (!ResourceManager.instance.CheckMana(manaCost)) - { - beam.SetActive(value: false); - PlaySound(onOff: false); - return; - } - ResourceManager.instance.SpendMana(manaCost); - } - DealDamage(); - } - - protected override void AimTurret() - { - Vector3 forward = currentTarget.transform.position - turret.transform.position + Vector3.up * 0.5f; - Quaternion rotation = Quaternion.LookRotation(forward, Vector3.up); - turret.transform.rotation = rotation; - beam.transform.localScale = new Vector3(1f, 1f, forward.magnitude); - } - - private void DealDamage() - { - IDamageable component = currentTarget.GetComponent(); - if (component != null) - { - if (component == lastThingIHit) - { - timeOnTarget += rps; - } - else - { - timeOnTarget = 0f; - lastThingIHit = component; - } - int num = Mathf.Clamp(Mathf.FloorToInt(timeOnTarget * TowerManager.instance.obeliskTimeOnTargetMultiplier), 0, base.damage); - component.TakeDamage(towerType, base.damage + num, base.healthDamage, base.armorDamage, base.shieldDamage, base.slowPercent, base.bleedPercent, base.burnPercent, base.poisonPercent, base.critChance, base.stunChance); - beam.SetActive(value: true); - PlaySound(onOff: true); - } - } - - private void PlaySound(bool onOff) - { - if (onOff && !soundPlaying) - { - audioS.volume = OptionsMenu.instance.masterVolume * OptionsMenu.instance.sfxVolume; - audioS.Play(); - soundPlaying = true; - } - else if (!onOff && soundPlaying) - { - audioS.Stop(); - soundPlaying = false; - } - } -} diff --git a/Assembly_CSharp/GamePlay/RadarTower.cs b/Assembly_CSharp/GamePlay/RadarTower.cs deleted file mode 100644 index e0d8d1d..0000000 --- a/Assembly_CSharp/GamePlay/RadarTower.cs +++ /dev/null @@ -1,71 +0,0 @@ -using UnityEngine; - -public class RadarTower : Tower -{ - [SerializeField] - private GameObject biPlanePrefab; - - [SerializeField] - private BiPlane myPlane; - - protected override void Start() - { - if (myPlane == null) - { - myPlane = Object.Instantiate(biPlanePrefab, base.transform.position + new Vector3(-50f, 5f, 0f), Quaternion.identity).GetComponent(); - } - base.Start(); - } - - public override void SetStats() - { - base.SetStats(); - if (myPlane == null) - { - myPlane = Object.Instantiate(biPlanePrefab, base.transform.position + new Vector3(-50f, 5f, 0f), Quaternion.identity).GetComponent(); - } - myPlane.damage = base.damage; - myPlane.healthDamage = base.healthDamage; - myPlane.armorDamage = base.armorDamage; - myPlane.shieldDamage = base.shieldDamage; - myPlane.rps = rps; - myPlane.slowPercent = base.slowPercent; - myPlane.bleedPercent = base.bleedPercent; - myPlane.burnPercent = base.burnPercent; - myPlane.poisonPercent = base.poisonPercent; - myPlane.critChance = base.critChance; - myPlane.stunChance = base.stunChance; - } - - protected override void Update() - { - if (currentTarget != null) - { - if (turret != null) - { - AimTurret(); - } - GainXP(); - } - timeSinceLastShot += Time.deltaTime; - if (currentTarget != null && timeSinceLastShot > 3f) - { - SendTargetInfo(currentTarget); - timeSinceLastShot = 0f; - } - } - - private void SendTargetInfo(GameObject target) - { - if (myPlane.target == null) - { - myPlane.target = target; - } - } - - public override void Demolish() - { - Object.Destroy(myPlane.gameObject); - base.Demolish(); - } -} diff --git a/Assembly_CSharp/GamePlay/Tower.cs b/Assembly_CSharp/GamePlay/Tower.cs deleted file mode 100644 index 4098bd6..0000000 --- a/Assembly_CSharp/GamePlay/Tower.cs +++ /dev/null @@ -1,509 +0,0 @@ -using UnityEngine; - -public class Tower : MonoBehaviour, IBuildable -{ - public enum Priority - { - Progress, - NearDeath, - MostHealth, - MostArmor, - MostShield, - LeastHealth, - LeastArmor, - LeastShield, - Fastest, - Slowest, - Marked - } - - public TowerType towerType; - - public bool squareUI; - - [SerializeField] - protected GameObject towerUI; - - public Priority[] priorities = new Priority[3]; - - [SerializeField] - protected GameObject turret; - - [SerializeField] - protected bool towerVerticalyAims = true; - - [SerializeField] - protected Transform muzzle; - - [SerializeField] - protected GameObject projectile; - - [SerializeField] - protected float projectileSpeed = 10f; - - [SerializeField] - protected GameObject extraProjectileFX; - - [SerializeField] - protected int baseDamage; - - [SerializeField] - protected int baseHealthDamage; - - [SerializeField] - protected int baseArmorDamage; - - [SerializeField] - protected int baseShieldDamage; - - public float rpm; - - protected float rps; - - [SerializeField] - protected float baseRange; - - [SerializeField] - protected float baseSlowPercentage; - - [SerializeField] - protected float baseBleedPercentage; - - [SerializeField] - protected float baseBurnPercentage; - - [SerializeField] - protected float basePoisonPercentage; - - [SerializeField] - protected LayerMask enemyLayerMask; - - [SerializeField] - protected LayerMask buildingLayerMask; - - public bool consumesMana; - - public float manaConsumptionRate; - - public float finalManaConsumption; - - public int upgradeCostMultiplier = 1; - - private int damageUpgrade; - - private int healthDamageUpgrade; - - private int armorDamageUpgrade; - - private int shieldDamageUpgrade; - - private int heightBonus; - - protected float timeSinceLastShot; - - private float lastTargetUpdate = 1f; - - protected GameObject currentTarget; - - [SerializeField] - protected float baseBlastRadius; - - public int level { get; private set; } - - public float healthXP { get; private set; } - - public float armorXP { get; private set; } - - public float shieldXP { get; private set; } - - public int damage { get; private set; } - - public int healthDamage { get; private set; } - - public int armorDamage { get; private set; } - - public int shieldDamage { get; private set; } - - public float range { get; private set; } - - public float slowPercent { get; private set; } - - public float bleedPercent { get; private set; } - - public float burnPercent { get; private set; } - - public float poisonPercent { get; private set; } - - public float critChance { get; private set; } - - public float stunChance { get; private set; } - - public float blastRadius { get; private set; } - - protected virtual void Start() - { - level = 1; - SetStats(); - TowerManager.instance.AddNewTower(this, towerType); - DetectHouses(); - priorities[0] = (priorities[1] = (priorities[2] = Priority.Progress)); - } - - public virtual void SetStats() - { - heightBonus = (int)Mathf.Round(base.transform.position.y * 3f - 1f); - damage = Mathf.Max(baseDamage + heightBonus + damageUpgrade + TowerManager.instance.GetBonusBaseDamage(towerType), 0); - healthDamage = baseHealthDamage + healthDamageUpgrade + TowerManager.instance.GetBonusHealthDamage(towerType); - armorDamage = baseArmorDamage + armorDamageUpgrade + TowerManager.instance.GetBonusArmorDamage(towerType); - shieldDamage = baseShieldDamage + shieldDamageUpgrade + TowerManager.instance.GetBonusShieldDamage(towerType); - rps = 60f / rpm; - range = baseRange + (float)heightBonus / 2f + TowerManager.instance.GetBonusRange(towerType); - slowPercent = baseSlowPercentage + TowerManager.instance.GetBonusSlow(towerType); - bleedPercent = baseBleedPercentage + TowerManager.instance.GetBonusBleed(towerType); - burnPercent = baseBurnPercentage + TowerManager.instance.GetBonusBurn(towerType); - poisonPercent = basePoisonPercentage + TowerManager.instance.GetBonusPoison(towerType); - blastRadius = baseBlastRadius + TowerManager.instance.GetBonusBlast(towerType); - finalManaConsumption = manaConsumptionRate + TowerManager.instance.GetManaConsumptionBonus(towerType); - if (TowerManager.instance.GetManaConsumptionBonus(towerType) > 0f) - { - consumesMana = true; - } - critChance = TowerManager.instance.GetCritChance(towerType) + TowerManager.instance.GetCritChanceLevelMultiplier(towerType) * (float)level / 100f; - stunChance = TowerManager.instance.GetStunChance(towerType); - } - - private void FixedUpdate() - { - if (lastTargetUpdate <= 0f) - { - DetectEnemies(); - } - else - { - lastTargetUpdate -= Time.fixedDeltaTime; - } - } - - protected virtual void Update() - { - if (currentTarget != null) - { - if (turret != null) - { - AimTurret(); - } - GainXP(); - } - timeSinceLastShot += Time.deltaTime; - if (currentTarget != null && timeSinceLastShot > rps) - { - Fire(); - timeSinceLastShot = 0f; - } - } - - private void DetectHouses() - { - if (Physics.Raycast(base.transform.position + new Vector3(1f, 1f, 0f), -base.transform.up, out var hitInfo, 1f, buildingLayerMask, QueryTriggerInteraction.Ignore)) - { - CheckForHouse(hitInfo); - } - if (Physics.Raycast(base.transform.position + new Vector3(-1f, 1f, 0f), -base.transform.up, out hitInfo, 1f, buildingLayerMask, QueryTriggerInteraction.Ignore)) - { - CheckForHouse(hitInfo); - } - if (Physics.Raycast(base.transform.position + new Vector3(0f, 1f, 1f), -base.transform.up, out hitInfo, 1f, buildingLayerMask, QueryTriggerInteraction.Ignore)) - { - CheckForHouse(hitInfo); - } - if (Physics.Raycast(base.transform.position + new Vector3(0f, 1f, -1f), -base.transform.up, out hitInfo, 1f, buildingLayerMask, QueryTriggerInteraction.Ignore)) - { - CheckForHouse(hitInfo); - } - } - - private void CheckForHouse(RaycastHit hit) - { - if (hit.collider.GetComponent() != null && (double)Mathf.Abs(hit.collider.transform.position.y - base.transform.position.y) <= 0.001) - { - hit.collider.GetComponent().AddDefender(this); - } - } - - public void TogglePriority(int index, int direction) - { - priorities[index] = (Priority)(((int)(priorities[index] + direction) % 11 + 11) % 11); - } - - protected virtual void Fire() - { - if (consumesMana) - { - int manaCost = (int)((float)damage * finalManaConsumption); - if (!ResourceManager.instance.CheckMana(manaCost)) - { - return; - } - ResourceManager.instance.SpendMana(manaCost); - } - GameObject gameObject = Object.Instantiate(projectile, muzzle.position, muzzle.rotation); - gameObject.GetComponent().SetStats(towerType, currentTarget, projectileSpeed, damage, healthDamage, armorDamage, shieldDamage, slowPercent, bleedPercent, burnPercent, poisonPercent, critChance, stunChance); - if (extraProjectileFX != null) - { - GameObject gameObject2 = Object.Instantiate(extraProjectileFX, gameObject.transform.position, gameObject.transform.rotation); - gameObject2.transform.SetParent(gameObject.transform); - gameObject2.GetComponent().SetFX(bleedPercent, burnPercent, poisonPercent, slowPercent, consumesMana); - Projectile component = gameObject.GetComponent(); - if (component.detachOnDestruction == null) - { - component.detachOnDestruction = gameObject2; - component.extraFX = gameObject2.GetComponent(); - } - } - } - - protected virtual void AimTurret() - { - Vector3 forward = currentTarget.transform.position - turret.transform.position; - if (!towerVerticalyAims) - { - forward.y = 0f; - } - Quaternion rotation = Quaternion.LookRotation(forward, Vector3.up); - turret.transform.rotation = rotation; - } - - protected void GainXP() - { - Enemy component = currentTarget.GetComponent(); - if (component != null) - { - if (component.shield > 0) - { - shieldXP += Time.deltaTime / (2f * range) + Time.deltaTime / 2f; - } - else if (component.armor > 0) - { - armorXP += Time.deltaTime / (2f * range) + Time.deltaTime / 2f; - } - else - { - healthXP += Time.deltaTime / (2f * range) + Time.deltaTime / 2f; - } - CheckXPAndLevelUp(); - } - } - - private void CheckXPAndLevelUp() - { - if (healthXP >= (float)(10 * level)) - { - healthXP -= 10 * level; - level++; - damageUpgrade++; - healthDamageUpgrade++; - SetStats(); - LevelUpText(); - } - if (armorXP >= (float)(10 * level)) - { - armorXP -= 10 * level; - level++; - damageUpgrade++; - armorDamageUpgrade++; - SetStats(); - LevelUpText(); - } - if (shieldXP >= (float)(10 * level)) - { - shieldXP -= 10 * level; - level++; - damageUpgrade++; - shieldDamageUpgrade++; - SetStats(); - LevelUpText(); - } - } - - private void LevelUpText() - { - Object.Instantiate(BuildingManager.instance.levelUpFX, base.transform.position, Quaternion.identity); - DamageNumber component = ObjectPool.instance.SpawnObject(ObjectPool.ObjectType.DamageNumber, base.transform.position, Quaternion.identity).GetComponent(); - component.SetText("LEVEL UP!", "Grey", 1f); - component.SetHoldTime(1f); - AchievementManager.instance.TowerLevel(level); - } - - public void BuyHealthLevel() - { - int num = (10 * level - (int)healthXP) * upgradeCostMultiplier; - if (ResourceManager.instance.CheckMoney(num)) - { - ResourceManager.instance.Spend(num); - DamageTracker.instance.AddCost(towerType, num); - healthXP -= 10 * level - num / upgradeCostMultiplier; - level++; - damageUpgrade++; - healthDamageUpgrade++; - SetStats(); - LevelUpText(); - } - } - - public void BuyArmorLevel() - { - int num = (10 * level - (int)armorXP) * upgradeCostMultiplier; - if (ResourceManager.instance.CheckMoney(num)) - { - ResourceManager.instance.Spend(num); - DamageTracker.instance.AddCost(towerType, num); - armorXP -= 10 * level - num / upgradeCostMultiplier; - level++; - damageUpgrade++; - armorDamageUpgrade++; - SetStats(); - LevelUpText(); - } - } - - public void BuyShieldLevel() - { - int num = (10 * level - (int)shieldXP) * upgradeCostMultiplier; - if (ResourceManager.instance.CheckMoney(num)) - { - ResourceManager.instance.Spend(num); - DamageTracker.instance.AddCost(towerType, num); - shieldXP -= 10 * level - num / upgradeCostMultiplier; - level++; - damageUpgrade++; - shieldDamageUpgrade++; - SetStats(); - LevelUpText(); - } - } - - private void DetectEnemies() - { - Collider[] array = Physics.OverlapSphere(base.transform.position, range, enemyLayerMask, QueryTriggerInteraction.Collide); - if (array.Length != 0) - { - currentTarget = SelectEnemy(array); - } - else - { - currentTarget = null; - } - lastTargetUpdate = Random.Range(0.25f, 1f); - } - - protected bool CheckPriority(Priority check) - { - for (int i = 0; i < priorities.Length; i++) - { - if (check == priorities[i]) - { - return true; - } - } - return false; - } - - protected int PriorityScale(Priority check) - { - for (int i = 0; i < priorities.Length; i++) - { - if (check == priorities[i]) - { - return Mathf.Clamp(3 - i, 1, 3); - } - } - return 1; - } - - protected virtual GameObject SelectEnemy(Collider[] possibleTargets) - { - GameObject result = null; - float num = -1f; - for (int i = 0; i < possibleTargets.Length; i++) - { - float num2 = 1f; - Enemy component = possibleTargets[i].GetComponent(); - if (CheckPriority(Priority.Progress)) - { - float f = Mathf.Max(0.001f, possibleTargets[i].GetComponent().distanceFromEnd); - num2 /= Mathf.Pow(f, PriorityScale(Priority.Progress)); - } - if (CheckPriority(Priority.NearDeath)) - { - float f2 = Mathf.Max(0.001f, component.CurrentHealth()); - num2 /= Mathf.Pow(f2, PriorityScale(Priority.NearDeath)); - } - if (CheckPriority(Priority.MostHealth)) - { - float f3 = (float)Mathf.Max(1, component.health) / 1000f; - num2 *= Mathf.Pow(f3, PriorityScale(Priority.MostHealth)); - } - if (CheckPriority(Priority.MostArmor)) - { - float f4 = (float)Mathf.Max(1, component.armor) / 1000f; - num2 *= Mathf.Pow(f4, PriorityScale(Priority.MostArmor)); - } - if (CheckPriority(Priority.MostShield)) - { - float f5 = (float)Mathf.Max(1, component.shield) / 1000f; - num2 *= Mathf.Pow(f5, PriorityScale(Priority.MostShield)); - } - if (CheckPriority(Priority.LeastHealth)) - { - float f6 = Mathf.Max(1, component.health); - num2 /= Mathf.Pow(f6, PriorityScale(Priority.LeastHealth)); - } - if (CheckPriority(Priority.LeastArmor)) - { - float f7 = Mathf.Max(1, component.armor); - num2 /= Mathf.Pow(f7, PriorityScale(Priority.LeastArmor)); - } - if (CheckPriority(Priority.LeastShield)) - { - float f8 = Mathf.Max(1, component.shield); - num2 /= Mathf.Pow(f8, PriorityScale(Priority.LeastShield)); - } - if (CheckPriority(Priority.Fastest)) - { - float f9 = Mathf.Max(0.001f, possibleTargets[i].GetComponent().speed); - num2 *= Mathf.Pow(f9, PriorityScale(Priority.Fastest)); - } - if (CheckPriority(Priority.Slowest)) - { - float f10 = Mathf.Max(0.001f, possibleTargets[i].GetComponent().speed); - num2 /= Mathf.Pow(f10, PriorityScale(Priority.Slowest)); - } - if (CheckPriority(Priority.Marked)) - { - float f11 = 1f; - if (component.mark != null) - { - f11 = (float)(component.mark.damage * (component.mark.healthDamage + component.mark.armorDamage + component.mark.shieldDamage)) * (1f + component.mark.critChance); - } - num2 *= Mathf.Pow(f11, PriorityScale(Priority.Marked)); - } - if (num2 > num) - { - result = component.gameObject; - num = num2; - } - } - return result; - } - - public void SpawnUI() - { - Object.Instantiate(towerUI, base.transform.position, Quaternion.identity).GetComponent().SetStats(this); - } - - public virtual void Demolish() - { - TowerManager.instance.RemoveTower(this, towerType); - Object.Destroy(base.gameObject); - } -} diff --git a/Assembly_CSharp/GamePlay/TowerFlyweight.cs b/Assembly_CSharp/GamePlay/TowerFlyweight.cs deleted file mode 100644 index b63f8b4..0000000 --- a/Assembly_CSharp/GamePlay/TowerFlyweight.cs +++ /dev/null @@ -1,279 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; - -public class TowerFlyweight : MonoBehaviour -{ - private HashSet towers = new HashSet(); - - [SerializeField] - private BuildButtonUI myBuildButton; - - [SerializeField] - private int basePrice; - - [SerializeField] - public int priceIncrease; - - [SerializeField] - public int currentPrice; - - [SerializeField] - public int sellPrice; - - [SerializeField] - public float bonusRange; - - [SerializeField] - public int bonusBaseDamage; - - [SerializeField] - public int bonusHealthDamage; - - [SerializeField] - public int bonusArmorDamage; - - [SerializeField] - public int bonusShieldDamage; - - [SerializeField] - public float bonusSlow; - - [SerializeField] - public float bonusBleed; - - [SerializeField] - public float bonusBurn; - - [SerializeField] - public float bonusPoison; - - [SerializeField] - public float bonusBlast; - - [SerializeField] - public float critChance; - - [SerializeField] - public float critChanceLevelMultiplier; - - [SerializeField] - public float stunChance; - - [SerializeField] - public float manaConsumptionAddition; - - [SerializeField] - private TowerType towerTypeForDamageTracker; - - public void AddNewTower(Tower newTower) - { - towers.Add(newTower); - currentPrice = basePrice + towers.Count * priceIncrease; - sellPrice = basePrice + (towers.Count - 1) * priceIncrease; - myBuildButton.UpdatePriceText(); - } - - public void RemoveTower(Tower newTower) - { - towers.Remove(newTower); - currentPrice = basePrice + towers.Count * priceIncrease; - sellPrice = basePrice + (towers.Count - 1) * priceIncrease; - myBuildButton.UpdatePriceText(); - ResourceManager.instance.AddMoney(basePrice + towers.Count * priceIncrease); - DamageTracker.instance.AddCost(towerTypeForDamageTracker, -(basePrice + towers.Count * priceIncrease)); - } - - public void UpdateTowerStats() - { - foreach (Tower tower in towers) - { - tower.SetStats(); - } - if (myBuildButton != null) - { - myBuildButton.UpdateModifiersText(); - } - } - - public void AddManaAddition(float bonus) - { - manaConsumptionAddition += bonus; - foreach (Tower tower in towers) - { - tower.SetStats(); - } - if (myBuildButton != null) - { - myBuildButton.UpdateModifiersText(); - } - } - - public void AddStunChance(float bonus) - { - stunChance += bonus; - foreach (Tower tower in towers) - { - tower.SetStats(); - } - if (myBuildButton != null) - { - myBuildButton.UpdateModifiersText(); - } - } - - public void AddCritChance(float bonus) - { - critChance += bonus; - foreach (Tower tower in towers) - { - tower.SetStats(); - } - if (myBuildButton != null) - { - myBuildButton.UpdateModifiersText(); - } - } - - public void AddCritChanceLevelMultiplier(float bonus) - { - critChanceLevelMultiplier += bonus; - foreach (Tower tower in towers) - { - tower.SetStats(); - } - if (myBuildButton != null) - { - myBuildButton.UpdateModifiersText(); - } - } - - public void AddBonusRange(float bonus) - { - bonusRange += bonus; - foreach (Tower tower in towers) - { - tower.SetStats(); - } - if (myBuildButton != null) - { - myBuildButton.UpdateModifiersText(); - } - } - - public void AddBonusBaseDamage(int bonus) - { - bonusBaseDamage += bonus; - foreach (Tower tower in towers) - { - tower.SetStats(); - } - if (myBuildButton != null) - { - myBuildButton.UpdateModifiersText(); - } - } - - public void AddBonusHealthDamage(int bonus) - { - bonusHealthDamage += bonus; - foreach (Tower tower in towers) - { - tower.SetStats(); - } - if (myBuildButton != null) - { - myBuildButton.UpdateModifiersText(); - } - } - - public void AddBonusArmorDamage(int bonus) - { - bonusArmorDamage += bonus; - foreach (Tower tower in towers) - { - tower.SetStats(); - } - if (myBuildButton != null) - { - myBuildButton.UpdateModifiersText(); - } - } - - public void AddBonusShieldDamage(int bonus) - { - bonusShieldDamage += bonus; - foreach (Tower tower in towers) - { - tower.SetStats(); - } - if (myBuildButton != null) - { - myBuildButton.UpdateModifiersText(); - } - } - - public void AddBonusSlow(float bonus) - { - bonusSlow += bonus; - foreach (Tower tower in towers) - { - tower.SetStats(); - } - if (myBuildButton != null) - { - myBuildButton.UpdateModifiersText(); - } - } - - public void AddBonusBleed(float bonus) - { - bonusBleed += bonus; - foreach (Tower tower in towers) - { - tower.SetStats(); - } - if (myBuildButton != null) - { - myBuildButton.UpdateModifiersText(); - } - } - - public void AddBonusBurn(float bonus) - { - bonusBurn += bonus; - foreach (Tower tower in towers) - { - tower.SetStats(); - } - if (myBuildButton != null) - { - myBuildButton.UpdateModifiersText(); - } - } - - public void AddBonusPoison(float bonus) - { - bonusPoison += bonus; - foreach (Tower tower in towers) - { - tower.SetStats(); - } - if (myBuildButton != null) - { - myBuildButton.UpdateModifiersText(); - } - } - - public void AddBonusBlast(float bonus) - { - bonusBlast += bonus; - foreach (Tower tower in towers) - { - tower.SetStats(); - } - if (myBuildButton != null) - { - myBuildButton.UpdateModifiersText(); - } - } -} diff --git a/Assembly_CSharp/GamePlay/TowerManager.cs b/Assembly_CSharp/GamePlay/TowerManager.cs deleted file mode 100644 index abdca52..0000000 --- a/Assembly_CSharp/GamePlay/TowerManager.cs +++ /dev/null @@ -1,1386 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; - -public class TowerManager : MonoBehaviour -{ - public static TowerManager instance; - - [SerializeField] - private TowerFlyweight global; - - [SerializeField] - private TowerFlyweight crossbow; - - [SerializeField] - private TowerFlyweight morter; - - [SerializeField] - private TowerFlyweight teslaCoil; - - [SerializeField] - private TowerFlyweight flameThrower; - - [SerializeField] - private TowerFlyweight poisonSprayer; - - [SerializeField] - private TowerFlyweight frostKeep; - - [SerializeField] - private TowerFlyweight radar; - - [SerializeField] - private TowerFlyweight obelisk; - - [SerializeField] - private TowerFlyweight particleCannon; - - [SerializeField] - private TowerFlyweight shredder; - - [SerializeField] - private TowerFlyweight encampment; - - [SerializeField] - private TowerFlyweight lookout; - - [SerializeField] - private TowerFlyweight siphon; - - public HashSet towersUsed = new HashSet(); - - private bool usedAllTowers; - - public float obeliskTimeOnTargetMultiplier; - - private void Awake() - { - instance = this; - } - - public void AddNewTower(Tower t, TowerType type) - { - if (type != TowerType.Siphon) - { - towersUsed.Add(type); - } - if (!usedAllTowers) - { - usedAllTowers = AchievementManager.instance.CheckAllTowers(); - } - switch (type) - { - case TowerType.Crossbow: - crossbow.AddNewTower(t); - break; - case TowerType.Morter: - morter.AddNewTower(t); - break; - case TowerType.TeslaCoil: - teslaCoil.AddNewTower(t); - break; - case TowerType.FlameThrower: - flameThrower.AddNewTower(t); - break; - case TowerType.PoisonSprayer: - poisonSprayer.AddNewTower(t); - break; - case TowerType.Frost: - frostKeep.AddNewTower(t); - break; - case TowerType.Radar: - radar.AddNewTower(t); - break; - case TowerType.Obelisk: - obelisk.AddNewTower(t); - break; - case TowerType.ParticleCannon: - particleCannon.AddNewTower(t); - break; - case TowerType.Shredder: - shredder.AddNewTower(t); - break; - case TowerType.Encampment: - encampment.AddNewTower(t); - break; - case TowerType.Lookout: - lookout.AddNewTower(t); - break; - default: - Debug.LogError("Failed to add tower to flyweight"); - break; - } - } - - public void RemoveTower(Tower t, TowerType type) - { - switch (type) - { - case TowerType.Crossbow: - crossbow.RemoveTower(t); - break; - case TowerType.Morter: - morter.RemoveTower(t); - break; - case TowerType.TeslaCoil: - teslaCoil.RemoveTower(t); - break; - case TowerType.FlameThrower: - flameThrower.RemoveTower(t); - break; - case TowerType.PoisonSprayer: - poisonSprayer.RemoveTower(t); - break; - case TowerType.Frost: - frostKeep.RemoveTower(t); - break; - case TowerType.Obelisk: - obelisk.RemoveTower(t); - break; - case TowerType.Radar: - radar.RemoveTower(t); - break; - case TowerType.ParticleCannon: - particleCannon.RemoveTower(t); - break; - case TowerType.Shredder: - shredder.RemoveTower(t); - break; - case TowerType.Encampment: - encampment.RemoveTower(t); - break; - case TowerType.Lookout: - lookout.RemoveTower(t); - break; - default: - Debug.LogError("Failed to add tower to flyweight"); - break; - } - } - - public void UpdateAllTowers() - { - crossbow.UpdateTowerStats(); - morter.UpdateTowerStats(); - teslaCoil.UpdateTowerStats(); - flameThrower.UpdateTowerStats(); - poisonSprayer.UpdateTowerStats(); - frostKeep.UpdateTowerStats(); - radar.UpdateTowerStats(); - obelisk.UpdateTowerStats(); - particleCannon.UpdateTowerStats(); - shredder.UpdateTowerStats(); - encampment.UpdateTowerStats(); - lookout.UpdateTowerStats(); - } - - public int GetSellPrice(TowerType type) - { - switch (type) - { - case TowerType.Crossbow: - return crossbow.sellPrice; - case TowerType.Morter: - return morter.sellPrice; - case TowerType.TeslaCoil: - return teslaCoil.sellPrice; - case TowerType.FlameThrower: - return flameThrower.sellPrice; - case TowerType.PoisonSprayer: - return poisonSprayer.sellPrice; - case TowerType.Frost: - return frostKeep.sellPrice; - case TowerType.Obelisk: - return obelisk.sellPrice; - case TowerType.Radar: - return radar.sellPrice; - case TowerType.ParticleCannon: - return particleCannon.sellPrice; - case TowerType.Shredder: - return shredder.sellPrice; - case TowerType.Encampment: - return encampment.sellPrice; - case TowerType.Lookout: - return lookout.sellPrice; - default: - Debug.LogError("Failed to add tower to flyweight"); - return -1; - } - } - - public float GetManaConsumptionBonus(TowerType type) - { - switch (type) - { - case TowerType.Crossbow: - return global.manaConsumptionAddition + crossbow.manaConsumptionAddition; - case TowerType.Morter: - return global.manaConsumptionAddition + morter.manaConsumptionAddition; - case TowerType.TeslaCoil: - return global.manaConsumptionAddition + teslaCoil.manaConsumptionAddition; - case TowerType.FlameThrower: - return global.manaConsumptionAddition + flameThrower.manaConsumptionAddition; - case TowerType.PoisonSprayer: - return global.manaConsumptionAddition + poisonSprayer.manaConsumptionAddition; - case TowerType.Frost: - return global.manaConsumptionAddition + frostKeep.manaConsumptionAddition; - case TowerType.Radar: - return global.manaConsumptionAddition + radar.manaConsumptionAddition; - case TowerType.Obelisk: - return global.manaConsumptionAddition + obelisk.manaConsumptionAddition; - case TowerType.ParticleCannon: - return global.manaConsumptionAddition + particleCannon.manaConsumptionAddition; - case TowerType.Shredder: - return global.manaConsumptionAddition + shredder.manaConsumptionAddition; - case TowerType.Encampment: - return global.manaConsumptionAddition + encampment.manaConsumptionAddition; - case TowerType.Lookout: - return global.manaConsumptionAddition + lookout.manaConsumptionAddition; - default: - Debug.Log("Failed to get global bonus"); - return 0f; - } - } - - public float GetCritChance(TowerType type) - { - switch (type) - { - case TowerType.Crossbow: - return global.critChance + crossbow.critChance; - case TowerType.Morter: - return global.critChance + morter.critChance; - case TowerType.TeslaCoil: - return global.critChance + teslaCoil.critChance; - case TowerType.FlameThrower: - return global.critChance + flameThrower.critChance; - case TowerType.PoisonSprayer: - return global.critChance + poisonSprayer.critChance; - case TowerType.Frost: - return global.critChance + frostKeep.critChance; - case TowerType.Radar: - return global.critChance + radar.critChance; - case TowerType.Obelisk: - return global.critChance + obelisk.critChance; - case TowerType.ParticleCannon: - return global.critChance + particleCannon.critChance; - case TowerType.Shredder: - return global.critChance + shredder.critChance; - case TowerType.Encampment: - return global.critChance + encampment.critChance; - case TowerType.Lookout: - return global.critChance + lookout.critChance; - default: - Debug.Log("Failed to get global bonus"); - return 0f; - } - } - - public float GetStunChance(TowerType type) - { - switch (type) - { - case TowerType.Crossbow: - return global.stunChance + crossbow.stunChance; - case TowerType.Morter: - return global.stunChance + morter.stunChance; - case TowerType.TeslaCoil: - return global.stunChance + teslaCoil.stunChance; - case TowerType.FlameThrower: - return global.stunChance + flameThrower.stunChance; - case TowerType.PoisonSprayer: - return global.stunChance + poisonSprayer.stunChance; - case TowerType.Frost: - return global.stunChance + frostKeep.stunChance; - case TowerType.Radar: - return global.stunChance + radar.stunChance; - case TowerType.Obelisk: - return global.stunChance + obelisk.stunChance; - case TowerType.ParticleCannon: - return global.stunChance + particleCannon.stunChance; - case TowerType.Shredder: - return global.stunChance + shredder.stunChance; - case TowerType.Encampment: - return global.stunChance + encampment.stunChance; - case TowerType.Lookout: - return global.stunChance + lookout.stunChance; - default: - Debug.Log("Failed to get global bonus"); - return 0f; - } - } - - public float GetCritChanceLevelMultiplier(TowerType type) - { - switch (type) - { - case TowerType.Crossbow: - return global.critChanceLevelMultiplier + crossbow.critChanceLevelMultiplier; - case TowerType.Morter: - return global.critChanceLevelMultiplier + morter.critChanceLevelMultiplier; - case TowerType.TeslaCoil: - return global.critChanceLevelMultiplier + teslaCoil.critChanceLevelMultiplier; - case TowerType.FlameThrower: - return global.critChanceLevelMultiplier + flameThrower.critChanceLevelMultiplier; - case TowerType.PoisonSprayer: - return global.critChanceLevelMultiplier + poisonSprayer.critChanceLevelMultiplier; - case TowerType.Frost: - return global.critChanceLevelMultiplier + frostKeep.critChanceLevelMultiplier; - case TowerType.Radar: - return global.critChanceLevelMultiplier + radar.critChanceLevelMultiplier; - case TowerType.Obelisk: - return global.critChanceLevelMultiplier + obelisk.critChanceLevelMultiplier; - case TowerType.ParticleCannon: - return global.critChanceLevelMultiplier + particleCannon.critChanceLevelMultiplier; - case TowerType.Shredder: - return global.critChanceLevelMultiplier + shredder.critChanceLevelMultiplier; - case TowerType.Encampment: - return global.critChanceLevelMultiplier + encampment.critChanceLevelMultiplier; - case TowerType.Lookout: - return global.critChanceLevelMultiplier + lookout.critChanceLevelMultiplier; - default: - Debug.Log("Failed to get global bonus"); - return 0f; - } - } - - public float GetBonusRange(TowerType type) - { - switch (type) - { - case TowerType.Crossbow: - return global.bonusRange + crossbow.bonusRange; - case TowerType.Morter: - return global.bonusRange + morter.bonusRange; - case TowerType.TeslaCoil: - return global.bonusRange + teslaCoil.bonusRange; - case TowerType.FlameThrower: - return global.bonusRange + flameThrower.bonusRange; - case TowerType.PoisonSprayer: - return global.bonusRange + poisonSprayer.bonusRange; - case TowerType.Frost: - return global.bonusRange + frostKeep.bonusRange; - case TowerType.Radar: - return global.bonusRange + radar.bonusRange; - case TowerType.Obelisk: - return global.bonusRange + obelisk.bonusRange; - case TowerType.ParticleCannon: - return global.bonusRange + particleCannon.bonusRange; - case TowerType.Shredder: - return global.bonusRange + shredder.bonusRange; - case TowerType.Encampment: - return global.bonusRange + encampment.bonusRange; - case TowerType.Lookout: - return global.bonusRange + lookout.bonusRange; - default: - Debug.Log("Failed to get global bonus"); - return 0f; - } - } - - public int GetBonusBaseDamage(TowerType type) - { - switch (type) - { - case TowerType.Crossbow: - return global.bonusBaseDamage + crossbow.bonusBaseDamage; - case TowerType.Morter: - return global.bonusBaseDamage + morter.bonusBaseDamage; - case TowerType.TeslaCoil: - return global.bonusBaseDamage + teslaCoil.bonusBaseDamage; - case TowerType.FlameThrower: - return global.bonusBaseDamage + flameThrower.bonusBaseDamage; - case TowerType.PoisonSprayer: - return global.bonusBaseDamage + poisonSprayer.bonusBaseDamage; - case TowerType.Frost: - return global.bonusBaseDamage + frostKeep.bonusBaseDamage; - case TowerType.Radar: - return global.bonusBaseDamage + radar.bonusBaseDamage; - case TowerType.Obelisk: - return global.bonusBaseDamage + obelisk.bonusBaseDamage; - case TowerType.ParticleCannon: - return global.bonusBaseDamage + particleCannon.bonusBaseDamage; - case TowerType.Shredder: - return global.bonusBaseDamage + shredder.bonusBaseDamage; - case TowerType.Encampment: - return global.bonusBaseDamage + encampment.bonusBaseDamage; - case TowerType.Lookout: - return global.bonusBaseDamage + lookout.bonusBaseDamage; - default: - Debug.Log("Failed to get global bonus"); - return 0; - } - } - - public int GetBonusHealthDamage(TowerType type) - { - switch (type) - { - case TowerType.Crossbow: - return global.bonusHealthDamage + crossbow.bonusHealthDamage; - case TowerType.Morter: - return global.bonusHealthDamage + morter.bonusHealthDamage; - case TowerType.TeslaCoil: - return global.bonusHealthDamage + teslaCoil.bonusHealthDamage; - case TowerType.FlameThrower: - return global.bonusHealthDamage + flameThrower.bonusHealthDamage; - case TowerType.PoisonSprayer: - return global.bonusHealthDamage + poisonSprayer.bonusHealthDamage; - case TowerType.Frost: - return global.bonusHealthDamage + frostKeep.bonusHealthDamage; - case TowerType.Radar: - return global.bonusHealthDamage + radar.bonusHealthDamage; - case TowerType.Obelisk: - return global.bonusHealthDamage + obelisk.bonusHealthDamage; - case TowerType.ParticleCannon: - return global.bonusHealthDamage + particleCannon.bonusHealthDamage; - case TowerType.Shredder: - return global.bonusHealthDamage + shredder.bonusHealthDamage; - case TowerType.Encampment: - return global.bonusHealthDamage + encampment.bonusHealthDamage; - case TowerType.Lookout: - return global.bonusHealthDamage + lookout.bonusHealthDamage; - default: - Debug.Log("Failed to get global bonus"); - return 0; - } - } - - public int GetBonusArmorDamage(TowerType type) - { - switch (type) - { - case TowerType.Crossbow: - return global.bonusArmorDamage + crossbow.bonusArmorDamage; - case TowerType.Morter: - return global.bonusArmorDamage + morter.bonusArmorDamage; - case TowerType.TeslaCoil: - return global.bonusArmorDamage + teslaCoil.bonusArmorDamage; - case TowerType.FlameThrower: - return global.bonusArmorDamage + flameThrower.bonusArmorDamage; - case TowerType.PoisonSprayer: - return global.bonusArmorDamage + poisonSprayer.bonusArmorDamage; - case TowerType.Frost: - return global.bonusArmorDamage + frostKeep.bonusArmorDamage; - case TowerType.Radar: - return global.bonusArmorDamage + radar.bonusArmorDamage; - case TowerType.Obelisk: - return global.bonusArmorDamage + obelisk.bonusArmorDamage; - case TowerType.ParticleCannon: - return global.bonusArmorDamage + particleCannon.bonusArmorDamage; - case TowerType.Shredder: - return global.bonusArmorDamage + shredder.bonusArmorDamage; - case TowerType.Encampment: - return global.bonusArmorDamage + encampment.bonusArmorDamage; - case TowerType.Lookout: - return global.bonusArmorDamage + lookout.bonusArmorDamage; - default: - Debug.Log("Failed to get global bonus"); - return 0; - } - } - - public int GetBonusShieldDamage(TowerType type) - { - switch (type) - { - case TowerType.Crossbow: - return global.bonusShieldDamage + crossbow.bonusShieldDamage; - case TowerType.Morter: - return global.bonusShieldDamage + morter.bonusShieldDamage; - case TowerType.TeslaCoil: - return global.bonusShieldDamage + teslaCoil.bonusShieldDamage; - case TowerType.FlameThrower: - return global.bonusShieldDamage + flameThrower.bonusShieldDamage; - case TowerType.PoisonSprayer: - return global.bonusShieldDamage + poisonSprayer.bonusShieldDamage; - case TowerType.Frost: - return global.bonusShieldDamage + frostKeep.bonusShieldDamage; - case TowerType.Radar: - return global.bonusShieldDamage + radar.bonusShieldDamage; - case TowerType.Obelisk: - return global.bonusShieldDamage + obelisk.bonusShieldDamage; - case TowerType.ParticleCannon: - return global.bonusShieldDamage + particleCannon.bonusShieldDamage; - case TowerType.Shredder: - return global.bonusShieldDamage + shredder.bonusShieldDamage; - case TowerType.Encampment: - return global.bonusShieldDamage + encampment.bonusShieldDamage; - case TowerType.Lookout: - return global.bonusShieldDamage + lookout.bonusShieldDamage; - default: - Debug.Log("Failed to get global bonus"); - return 0; - } - } - - public float GetBonusSlow(TowerType type) - { - switch (type) - { - case TowerType.Crossbow: - return global.bonusSlow + crossbow.bonusSlow; - case TowerType.Morter: - return global.bonusSlow + morter.bonusSlow; - case TowerType.TeslaCoil: - return global.bonusSlow + teslaCoil.bonusSlow; - case TowerType.FlameThrower: - return global.bonusSlow + flameThrower.bonusSlow; - case TowerType.PoisonSprayer: - return global.bonusSlow + poisonSprayer.bonusSlow; - case TowerType.Frost: - return global.bonusSlow + frostKeep.bonusSlow; - case TowerType.Radar: - return global.bonusSlow + radar.bonusSlow; - case TowerType.Obelisk: - return global.bonusSlow + obelisk.bonusSlow; - case TowerType.ParticleCannon: - return global.bonusSlow + particleCannon.bonusSlow; - case TowerType.Shredder: - return global.bonusSlow + shredder.bonusSlow; - case TowerType.Encampment: - return global.bonusSlow + encampment.bonusSlow; - case TowerType.Lookout: - return global.bonusSlow + lookout.bonusSlow; - default: - Debug.Log("Failed to get global bonus"); - return 0f; - } - } - - public float GetBonusBleed(TowerType type) - { - switch (type) - { - case TowerType.Crossbow: - return global.bonusBleed + crossbow.bonusBleed; - case TowerType.Morter: - return global.bonusBleed + morter.bonusBleed; - case TowerType.TeslaCoil: - return global.bonusBleed + teslaCoil.bonusBleed; - case TowerType.FlameThrower: - return global.bonusBleed + flameThrower.bonusBleed; - case TowerType.PoisonSprayer: - return global.bonusBleed + poisonSprayer.bonusBleed; - case TowerType.Frost: - return global.bonusBleed + frostKeep.bonusBleed; - case TowerType.Radar: - return global.bonusBleed + radar.bonusBleed; - case TowerType.Obelisk: - return global.bonusBleed + obelisk.bonusBleed; - case TowerType.ParticleCannon: - return global.bonusBleed + particleCannon.bonusBleed; - case TowerType.Shredder: - return global.bonusBleed + shredder.bonusBleed; - case TowerType.Encampment: - return global.bonusBleed + encampment.bonusBleed; - case TowerType.Lookout: - return global.bonusBleed + lookout.bonusBleed; - default: - Debug.Log("Failed to get global bonus"); - return 0f; - } - } - - public float GetBonusBurn(TowerType type) - { - switch (type) - { - case TowerType.Crossbow: - return global.bonusBurn + crossbow.bonusBurn; - case TowerType.Morter: - return global.bonusBurn + morter.bonusBurn; - case TowerType.TeslaCoil: - return global.bonusBurn + teslaCoil.bonusBurn; - case TowerType.FlameThrower: - return global.bonusBurn + flameThrower.bonusBurn; - case TowerType.PoisonSprayer: - return global.bonusBurn + poisonSprayer.bonusBurn; - case TowerType.Frost: - return global.bonusBurn + frostKeep.bonusBurn; - case TowerType.Radar: - return global.bonusBurn + radar.bonusBurn; - case TowerType.Obelisk: - return global.bonusBurn + obelisk.bonusBurn; - case TowerType.ParticleCannon: - return global.bonusBurn + particleCannon.bonusBurn; - case TowerType.Shredder: - return global.bonusBurn + shredder.bonusBurn; - case TowerType.Encampment: - return global.bonusBurn + encampment.bonusBurn; - case TowerType.Lookout: - return global.bonusBurn + lookout.bonusBurn; - default: - Debug.Log("Failed to get global bonus"); - return 0f; - } - } - - public float GetBonusPoison(TowerType type) - { - switch (type) - { - case TowerType.Crossbow: - return global.bonusPoison + crossbow.bonusPoison; - case TowerType.Morter: - return global.bonusPoison + morter.bonusPoison; - case TowerType.TeslaCoil: - return global.bonusPoison + teslaCoil.bonusPoison; - case TowerType.FlameThrower: - return global.bonusPoison + flameThrower.bonusPoison; - case TowerType.PoisonSprayer: - return global.bonusPoison + poisonSprayer.bonusPoison; - case TowerType.Frost: - return global.bonusPoison + frostKeep.bonusPoison; - case TowerType.Radar: - return global.bonusPoison + radar.bonusPoison; - case TowerType.Obelisk: - return global.bonusPoison + obelisk.bonusPoison; - case TowerType.ParticleCannon: - return global.bonusPoison + particleCannon.bonusPoison; - case TowerType.Shredder: - return global.bonusPoison + shredder.bonusPoison; - case TowerType.Encampment: - return global.bonusPoison + encampment.bonusPoison; - case TowerType.Lookout: - return global.bonusPoison + lookout.bonusPoison; - default: - Debug.Log("Failed to get global bonus"); - return 0f; - } - } - - public float GetBonusBlast(TowerType type) - { - switch (type) - { - case TowerType.Crossbow: - return global.bonusBlast + crossbow.bonusBlast; - case TowerType.Morter: - return global.bonusBlast + morter.bonusBlast; - case TowerType.TeslaCoil: - return global.bonusBlast + teslaCoil.bonusBlast; - case TowerType.FlameThrower: - return global.bonusBlast + flameThrower.bonusBlast; - case TowerType.PoisonSprayer: - return global.bonusBlast + poisonSprayer.bonusBlast; - case TowerType.Frost: - return global.bonusBlast + frostKeep.bonusBlast; - case TowerType.Radar: - return global.bonusBlast + radar.bonusBlast; - case TowerType.Obelisk: - return global.bonusBlast + obelisk.bonusBlast; - case TowerType.ParticleCannon: - return global.bonusBlast + particleCannon.bonusBlast; - case TowerType.Shredder: - return global.bonusBlast + shredder.bonusBlast; - case TowerType.Encampment: - return global.bonusBlast + encampment.bonusBlast; - case TowerType.Lookout: - return global.bonusBlast + lookout.bonusBlast; - default: - Debug.Log("Failed to get global bonus"); - return 0f; - } - } - - public void AddManaConsumption(TowerType type, float value) - { - switch (type) - { - case TowerType.Crossbow: - crossbow.AddManaAddition(value); - break; - case TowerType.Morter: - morter.AddManaAddition(value); - break; - case TowerType.TeslaCoil: - teslaCoil.AddManaAddition(value); - break; - case TowerType.FlameThrower: - flameThrower.AddManaAddition(value); - break; - case TowerType.PoisonSprayer: - poisonSprayer.AddManaAddition(value); - break; - case TowerType.Frost: - frostKeep.AddManaAddition(value); - break; - case TowerType.Radar: - radar.AddManaAddition(value); - break; - case TowerType.Obelisk: - obelisk.AddManaAddition(value); - break; - case TowerType.ParticleCannon: - particleCannon.AddManaAddition(value); - break; - case TowerType.Shredder: - shredder.AddManaAddition(value); - break; - case TowerType.Encampment: - encampment.AddManaAddition(value); - break; - case TowerType.Lookout: - lookout.AddManaAddition(value); - break; - case TowerType.Global: - global.AddManaAddition(value); - UpdateAllTowers(); - break; - default: - Debug.Log("Failed to set global bonus"); - break; - } - } - - public void AddCritChance(TowerType type, float value) - { - switch (type) - { - case TowerType.Crossbow: - crossbow.AddCritChance(value); - break; - case TowerType.Morter: - morter.AddCritChance(value); - break; - case TowerType.TeslaCoil: - teslaCoil.AddCritChance(value); - break; - case TowerType.FlameThrower: - flameThrower.AddCritChance(value); - break; - case TowerType.PoisonSprayer: - poisonSprayer.AddCritChance(value); - break; - case TowerType.Frost: - frostKeep.AddCritChance(value); - break; - case TowerType.Radar: - radar.AddCritChance(value); - break; - case TowerType.Obelisk: - obelisk.AddCritChance(value); - break; - case TowerType.ParticleCannon: - particleCannon.AddCritChance(value); - break; - case TowerType.Shredder: - shredder.AddCritChance(value); - break; - case TowerType.Encampment: - encampment.AddCritChance(value); - break; - case TowerType.Lookout: - lookout.AddCritChance(value); - break; - case TowerType.Global: - global.AddCritChance(value); - UpdateAllTowers(); - break; - default: - Debug.Log("Failed to set global bonus"); - break; - } - } - - public void AddStunChance(TowerType type, float value) - { - switch (type) - { - case TowerType.Crossbow: - crossbow.AddStunChance(value); - break; - case TowerType.Morter: - morter.AddStunChance(value); - break; - case TowerType.TeslaCoil: - teslaCoil.AddStunChance(value); - break; - case TowerType.FlameThrower: - flameThrower.AddStunChance(value); - break; - case TowerType.PoisonSprayer: - poisonSprayer.AddStunChance(value); - break; - case TowerType.Frost: - frostKeep.AddStunChance(value); - break; - case TowerType.Radar: - radar.AddStunChance(value); - break; - case TowerType.Obelisk: - obelisk.AddStunChance(value); - break; - case TowerType.ParticleCannon: - particleCannon.AddStunChance(value); - break; - case TowerType.Shredder: - shredder.AddStunChance(value); - break; - case TowerType.Encampment: - encampment.AddStunChance(value); - break; - case TowerType.Lookout: - lookout.AddStunChance(value); - break; - case TowerType.Global: - global.AddStunChance(value); - UpdateAllTowers(); - break; - default: - Debug.Log("Failed to set global bonus"); - break; - } - } - - public void AddCritChanceLevelMultiplier(TowerType type, float value) - { - switch (type) - { - case TowerType.Crossbow: - crossbow.AddCritChanceLevelMultiplier(value); - break; - case TowerType.Morter: - morter.AddCritChanceLevelMultiplier(value); - break; - case TowerType.TeslaCoil: - teslaCoil.AddCritChanceLevelMultiplier(value); - break; - case TowerType.FlameThrower: - flameThrower.AddCritChanceLevelMultiplier(value); - break; - case TowerType.PoisonSprayer: - poisonSprayer.AddCritChanceLevelMultiplier(value); - break; - case TowerType.Frost: - frostKeep.AddCritChanceLevelMultiplier(value); - break; - case TowerType.Radar: - radar.AddCritChanceLevelMultiplier(value); - break; - case TowerType.Obelisk: - obelisk.AddCritChanceLevelMultiplier(value); - break; - case TowerType.ParticleCannon: - particleCannon.AddCritChanceLevelMultiplier(value); - break; - case TowerType.Shredder: - shredder.AddCritChanceLevelMultiplier(value); - break; - case TowerType.Encampment: - encampment.AddCritChanceLevelMultiplier(value); - break; - case TowerType.Lookout: - lookout.AddCritChanceLevelMultiplier(value); - break; - case TowerType.Global: - global.AddCritChanceLevelMultiplier(value); - UpdateAllTowers(); - break; - default: - Debug.Log("Failed to set global bonus"); - break; - } - } - - public void AddBonusRange(TowerType type, float value) - { - switch (type) - { - case TowerType.Crossbow: - crossbow.AddBonusRange(value); - break; - case TowerType.Morter: - morter.AddBonusRange(value); - break; - case TowerType.TeslaCoil: - teslaCoil.AddBonusRange(value); - break; - case TowerType.FlameThrower: - flameThrower.AddBonusRange(value); - break; - case TowerType.PoisonSprayer: - poisonSprayer.AddBonusRange(value); - break; - case TowerType.Frost: - frostKeep.AddBonusRange(value); - break; - case TowerType.Radar: - radar.AddBonusRange(value); - break; - case TowerType.Obelisk: - obelisk.AddBonusRange(value); - break; - case TowerType.ParticleCannon: - particleCannon.AddBonusRange(value); - break; - case TowerType.Shredder: - shredder.AddBonusRange(value); - break; - case TowerType.Encampment: - encampment.AddBonusRange(value); - break; - case TowerType.Lookout: - lookout.AddBonusRange(value); - break; - case TowerType.Global: - global.AddBonusRange(value); - UpdateAllTowers(); - break; - default: - Debug.Log("Failed to set global bonus"); - break; - } - } - - public void AddBonusBaseDamage(TowerType type, int value) - { - switch (type) - { - case TowerType.Crossbow: - crossbow.AddBonusBaseDamage(value); - break; - case TowerType.Morter: - morter.AddBonusBaseDamage(value); - break; - case TowerType.TeslaCoil: - teslaCoil.AddBonusBaseDamage(value); - break; - case TowerType.FlameThrower: - flameThrower.AddBonusBaseDamage(value); - break; - case TowerType.PoisonSprayer: - poisonSprayer.AddBonusBaseDamage(value); - break; - case TowerType.Frost: - frostKeep.AddBonusBaseDamage(value); - break; - case TowerType.Radar: - radar.AddBonusBaseDamage(value); - break; - case TowerType.Obelisk: - obelisk.AddBonusBaseDamage(value); - break; - case TowerType.ParticleCannon: - particleCannon.AddBonusBaseDamage(value); - break; - case TowerType.Shredder: - shredder.AddBonusBaseDamage(value); - break; - case TowerType.Encampment: - encampment.AddBonusBaseDamage(value); - break; - case TowerType.Lookout: - lookout.AddBonusBaseDamage(value); - break; - case TowerType.Global: - global.AddBonusBaseDamage(value); - UpdateAllTowers(); - break; - default: - Debug.Log("Failed to set global bonus"); - break; - } - } - - public void AddBonusHealthDamage(TowerType type, int value) - { - switch (type) - { - case TowerType.Crossbow: - crossbow.AddBonusHealthDamage(value); - break; - case TowerType.Morter: - morter.AddBonusHealthDamage(value); - break; - case TowerType.TeslaCoil: - teslaCoil.AddBonusHealthDamage(value); - break; - case TowerType.FlameThrower: - flameThrower.AddBonusHealthDamage(value); - break; - case TowerType.PoisonSprayer: - poisonSprayer.AddBonusHealthDamage(value); - break; - case TowerType.Frost: - frostKeep.AddBonusHealthDamage(value); - break; - case TowerType.Radar: - radar.AddBonusHealthDamage(value); - break; - case TowerType.Obelisk: - obelisk.AddBonusHealthDamage(value); - break; - case TowerType.ParticleCannon: - particleCannon.AddBonusHealthDamage(value); - break; - case TowerType.Shredder: - shredder.AddBonusHealthDamage(value); - break; - case TowerType.Encampment: - encampment.AddBonusHealthDamage(value); - break; - case TowerType.Lookout: - lookout.AddBonusHealthDamage(value); - break; - case TowerType.Global: - global.AddBonusHealthDamage(value); - UpdateAllTowers(); - break; - default: - Debug.Log("Failed to set global bonus"); - break; - } - } - - public void AddBonusArmorDamage(TowerType type, int value) - { - switch (type) - { - case TowerType.Crossbow: - crossbow.AddBonusArmorDamage(value); - break; - case TowerType.Morter: - morter.AddBonusArmorDamage(value); - break; - case TowerType.TeslaCoil: - teslaCoil.AddBonusArmorDamage(value); - break; - case TowerType.FlameThrower: - flameThrower.AddBonusArmorDamage(value); - break; - case TowerType.PoisonSprayer: - poisonSprayer.AddBonusArmorDamage(value); - break; - case TowerType.Frost: - frostKeep.AddBonusArmorDamage(value); - break; - case TowerType.Radar: - radar.AddBonusArmorDamage(value); - break; - case TowerType.Obelisk: - obelisk.AddBonusArmorDamage(value); - break; - case TowerType.ParticleCannon: - particleCannon.AddBonusArmorDamage(value); - break; - case TowerType.Shredder: - shredder.AddBonusArmorDamage(value); - break; - case TowerType.Encampment: - encampment.AddBonusArmorDamage(value); - break; - case TowerType.Lookout: - lookout.AddBonusArmorDamage(value); - break; - case TowerType.Global: - global.AddBonusArmorDamage(value); - UpdateAllTowers(); - break; - default: - Debug.Log("Failed to set global bonus"); - break; - } - } - - public void AddBonusShieldDamage(TowerType type, int value) - { - switch (type) - { - case TowerType.Crossbow: - crossbow.AddBonusShieldDamage(value); - break; - case TowerType.Morter: - morter.AddBonusShieldDamage(value); - break; - case TowerType.TeslaCoil: - teslaCoil.AddBonusShieldDamage(value); - break; - case TowerType.FlameThrower: - flameThrower.AddBonusShieldDamage(value); - break; - case TowerType.PoisonSprayer: - poisonSprayer.AddBonusShieldDamage(value); - break; - case TowerType.Frost: - frostKeep.AddBonusShieldDamage(value); - break; - case TowerType.Radar: - radar.AddBonusShieldDamage(value); - break; - case TowerType.Obelisk: - obelisk.AddBonusShieldDamage(value); - break; - case TowerType.ParticleCannon: - particleCannon.AddBonusShieldDamage(value); - break; - case TowerType.Shredder: - shredder.AddBonusShieldDamage(value); - break; - case TowerType.Encampment: - encampment.AddBonusShieldDamage(value); - break; - case TowerType.Lookout: - lookout.AddBonusShieldDamage(value); - break; - case TowerType.Global: - global.AddBonusShieldDamage(value); - UpdateAllTowers(); - break; - default: - Debug.Log("Failed to set global bonus"); - break; - } - } - - public void AddBonusSlow(TowerType type, float value) - { - switch (type) - { - case TowerType.Crossbow: - crossbow.AddBonusSlow(value); - break; - case TowerType.Morter: - morter.AddBonusSlow(value); - break; - case TowerType.TeslaCoil: - teslaCoil.AddBonusSlow(value); - break; - case TowerType.FlameThrower: - flameThrower.AddBonusSlow(value); - break; - case TowerType.PoisonSprayer: - poisonSprayer.AddBonusSlow(value); - break; - case TowerType.Frost: - frostKeep.AddBonusSlow(value); - break; - case TowerType.Radar: - radar.AddBonusSlow(value); - break; - case TowerType.Obelisk: - obelisk.AddBonusSlow(value); - break; - case TowerType.ParticleCannon: - particleCannon.AddBonusSlow(value); - break; - case TowerType.Shredder: - shredder.AddBonusSlow(value); - break; - case TowerType.Encampment: - encampment.AddBonusSlow(value); - break; - case TowerType.Lookout: - lookout.AddBonusSlow(value); - break; - case TowerType.Global: - global.AddBonusSlow(value); - UpdateAllTowers(); - break; - default: - Debug.Log("Failed to set global bonus"); - break; - } - } - - public void AddBonusBleed(TowerType type, float value) - { - switch (type) - { - case TowerType.Crossbow: - crossbow.AddBonusBleed(value); - break; - case TowerType.Morter: - morter.AddBonusBleed(value); - break; - case TowerType.TeslaCoil: - teslaCoil.AddBonusBleed(value); - break; - case TowerType.FlameThrower: - flameThrower.AddBonusBleed(value); - break; - case TowerType.PoisonSprayer: - poisonSprayer.AddBonusBleed(value); - break; - case TowerType.Frost: - frostKeep.AddBonusBleed(value); - break; - case TowerType.Radar: - radar.AddBonusBleed(value); - break; - case TowerType.Obelisk: - obelisk.AddBonusBleed(value); - break; - case TowerType.ParticleCannon: - particleCannon.AddBonusBleed(value); - break; - case TowerType.Shredder: - shredder.AddBonusBleed(value); - break; - case TowerType.Encampment: - encampment.AddBonusBleed(value); - break; - case TowerType.Lookout: - lookout.AddBonusBleed(value); - break; - case TowerType.Global: - global.AddBonusBleed(value); - UpdateAllTowers(); - break; - default: - Debug.Log("Failed to set global bonus"); - break; - } - } - - public void AddBonusBurn(TowerType type, float value) - { - switch (type) - { - case TowerType.Crossbow: - crossbow.AddBonusBurn(value); - break; - case TowerType.Morter: - morter.AddBonusBurn(value); - break; - case TowerType.TeslaCoil: - teslaCoil.AddBonusBurn(value); - break; - case TowerType.FlameThrower: - flameThrower.AddBonusBurn(value); - break; - case TowerType.PoisonSprayer: - poisonSprayer.AddBonusBurn(value); - break; - case TowerType.Frost: - frostKeep.AddBonusBurn(value); - break; - case TowerType.Radar: - radar.AddBonusBurn(value); - break; - case TowerType.Obelisk: - obelisk.AddBonusBurn(value); - break; - case TowerType.ParticleCannon: - particleCannon.AddBonusBurn(value); - break; - case TowerType.Shredder: - shredder.AddBonusBurn(value); - break; - case TowerType.Encampment: - encampment.AddBonusBurn(value); - break; - case TowerType.Lookout: - lookout.AddBonusBurn(value); - break; - case TowerType.Global: - global.AddBonusBurn(value); - UpdateAllTowers(); - break; - default: - Debug.Log("Failed to set global bonus"); - break; - } - } - - public void AddBonusPoison(TowerType type, float value) - { - switch (type) - { - case TowerType.Crossbow: - crossbow.AddBonusPoison(value); - break; - case TowerType.Morter: - morter.AddBonusPoison(value); - break; - case TowerType.TeslaCoil: - teslaCoil.AddBonusPoison(value); - break; - case TowerType.FlameThrower: - flameThrower.AddBonusPoison(value); - break; - case TowerType.PoisonSprayer: - poisonSprayer.AddBonusPoison(value); - break; - case TowerType.Frost: - frostKeep.AddBonusPoison(value); - break; - case TowerType.Radar: - radar.AddBonusPoison(value); - break; - case TowerType.Obelisk: - obelisk.AddBonusPoison(value); - break; - case TowerType.ParticleCannon: - particleCannon.AddBonusPoison(value); - break; - case TowerType.Shredder: - shredder.AddBonusPoison(value); - break; - case TowerType.Encampment: - encampment.AddBonusPoison(value); - break; - case TowerType.Lookout: - lookout.AddBonusPoison(value); - break; - case TowerType.Global: - global.AddBonusPoison(value); - UpdateAllTowers(); - break; - default: - Debug.Log("Failed to set global bonus"); - break; - } - } - - public void AddBonusBlast(TowerType type, float value) - { - switch (type) - { - case TowerType.Crossbow: - crossbow.AddBonusBlast(value); - break; - case TowerType.Morter: - morter.AddBonusBlast(value); - break; - case TowerType.TeslaCoil: - teslaCoil.AddBonusBlast(value); - break; - case TowerType.FlameThrower: - flameThrower.AddBonusBlast(value); - break; - case TowerType.PoisonSprayer: - poisonSprayer.AddBonusBlast(value); - break; - case TowerType.Frost: - frostKeep.AddBonusBlast(value); - break; - case TowerType.Radar: - radar.AddBonusBlast(value); - break; - case TowerType.Obelisk: - obelisk.AddBonusBlast(value); - break; - case TowerType.ParticleCannon: - particleCannon.AddBonusBlast(value); - break; - case TowerType.Shredder: - shredder.AddBonusBlast(value); - break; - case TowerType.Encampment: - encampment.AddBonusBlast(value); - break; - case TowerType.Lookout: - lookout.AddBonusBlast(value); - break; - case TowerType.Global: - global.AddBonusBlast(value); - UpdateAllTowers(); - break; - default: - Debug.Log("Failed to set global bonus"); - break; - } - } -} diff --git a/Assembly_CSharp/GamePlay/TowerType.cs b/Assembly_CSharp/GamePlay/TowerType.cs deleted file mode 100644 index 9bbc242..0000000 --- a/Assembly_CSharp/GamePlay/TowerType.cs +++ /dev/null @@ -1,18 +0,0 @@ -public enum TowerType -{ - Crossbow, - Morter, - TeslaCoil, - Frost, - Obelisk, - FlameThrower, - PoisonSprayer, - Siphon, - Radar, - ParticleCannon, - DOT, - Global, - Shredder, - Encampment, - Lookout -} diff --git a/Assembly_CSharp/Tower/Dropper.cs b/Assembly_CSharp/Tower/Dropper.cs new file mode 100644 index 0000000..0dc7a10 --- /dev/null +++ b/Assembly_CSharp/Tower/Dropper.cs @@ -0,0 +1,126 @@ +using System.Collections.Generic; +using UnityEngine; + +public class Dropper : Tower +{ + [SerializeField] + private int manaPerSecond; + + [SerializeField] + private float dropHeight = 3f; + + [SerializeField] + private LayerMask dropSetMask; + + [SerializeField] + protected Vector2[] dropPoints; + + [SerializeField] + private bool requireTargetToDrop; + + private int currentLevel; + + public float dropperRPMdisplay; + + private float timeOfNextManaCheck; + + private bool canFire = true; + + protected override void Start() + { + base.Start(); + SetDropPoints(); + } + + public override void SetStats() + { + base.SetStats(); + rps = 60f / rpm * (10f / (10f + (float)dropPoints.Length)); + dropperRPMdisplay = rpm * (10f + (float)dropPoints.Length) / 10f; + } + + private void SetDropPoints() + { + List list = new List(); + for (int i = -(int)base.range; (float)i <= base.range; i++) + { + for (int j = -(int)base.range; (float)j <= base.range; j++) + { + if (Physics.Raycast(new Vector3(base.transform.position.x + (float)i, dropHeight, base.transform.position.z + (float)j), Vector3.down, out var hitInfo, 1.5f * dropHeight, dropSetMask, QueryTriggerInteraction.Ignore) && hitInfo.transform.gameObject.layer == LayerMask.NameToLayer("Path")) + { + list.Add(new Vector2(i, j)); + } + } + } + dropPoints = list.ToArray(); + rps = 60f / rpm * (10f / (10f + (float)dropPoints.Length)); + dropperRPMdisplay = rpm * (10f + (float)dropPoints.Length) / 10f; + } + + protected override void Update() + { + if (SpawnManager.instance.level != currentLevel) + { + SetDropPoints(); + currentLevel = SpawnManager.instance.level; + } + if (currentTarget != null) + { + if (turret != null) + { + AimTurret(); + } + GainXP(); + } + if (manaPerSecond > 0 && Time.time >= timeOfNextManaCheck && SpawnManager.instance.combat) + { + timeOfNextManaCheck = Time.time + 1f; + if (ResourceManager.instance.CheckMana(manaPerSecond)) + { + ResourceManager.instance.SpendMana(manaPerSecond); + canFire = true; + } + else + { + canFire = false; + } + } + timeSinceLastShot += Time.deltaTime; + if (canFire && TargetingCheck() && timeSinceLastShot > rps && SpawnManager.instance.combat) + { + Fire(); + timeSinceLastShot = 0f; + } + } + + private bool TargetingCheck() + { + if (requireTargetToDrop) + { + if (currentTarget != null) + { + return true; + } + return false; + } + return true; + } + + protected override void Fire() + { + if (consumesMana) + { + int manaCost = (int)((float)base.damage * manaConsumptionRate); + if (!ResourceManager.instance.CheckMana(manaCost)) + { + return; + } + ResourceManager.instance.SpendMana(manaCost); + } + if (dropPoints.Length != 0) + { + Vector2 vector = dropPoints[Random.Range(0, dropPoints.Length)]; + Object.Instantiate(projectile, new Vector3(vector.x, dropHeight, vector.y) + base.transform.position, Quaternion.identity).GetComponent().SetStats(towerType, null, projectileSpeed, base.damage, base.healthDamage, base.armorDamage, base.shieldDamage, base.slowPercent, base.bleedPercent, base.burnPercent, base.poisonPercent, base.critChance, base.stunChance); + } + } +} diff --git a/Assembly_CSharp/Tower/FlameThrower.cs b/Assembly_CSharp/Tower/FlameThrower.cs new file mode 100644 index 0000000..d415d88 --- /dev/null +++ b/Assembly_CSharp/Tower/FlameThrower.cs @@ -0,0 +1,68 @@ +using UnityEngine; + +public class FlameThrower : Tower +{ + [SerializeField] + private ParticleSystem flames; + + public bool flaming; + + private bool hasMana = true; + + [SerializeField] + private AudioSource audioS; + + private bool soundPlaying; + + protected override void Update() + { + if (hasMana && currentTarget != null && !flaming) + { + flames.Play(); + PlaySound(onOff: true); + flaming = true; + } + else if (!hasMana || (currentTarget == null && flaming)) + { + flames.Stop(); + PlaySound(onOff: false); + flaming = false; + } + base.Update(); + } + + protected override void Fire() + { + if (consumesMana) + { + int manaCost = (int)((float)base.damage * manaConsumptionRate); + if (!ResourceManager.instance.CheckMana(manaCost)) + { + hasMana = false; + return; + } + ResourceManager.instance.SpendMana(manaCost); + hasMana = true; + } + RaycastHit[] array = Physics.SphereCastAll(muzzle.position, base.range / 6f, muzzle.transform.forward, base.range * 1.5f, enemyLayerMask, QueryTriggerInteraction.Collide); + foreach (RaycastHit raycastHit in array) + { + raycastHit.collider.GetComponent()?.TakeDamage(towerType, base.damage, base.healthDamage, base.armorDamage, base.shieldDamage, base.slowPercent, base.bleedPercent, base.burnPercent, base.poisonPercent, base.critChance, base.stunChance); + } + } + + private void PlaySound(bool onOff) + { + if (onOff && !soundPlaying) + { + audioS.volume = OptionsMenu.instance.masterVolume * OptionsMenu.instance.sfxVolume; + audioS.Play(); + soundPlaying = true; + } + else if (!onOff && soundPlaying) + { + audioS.Stop(); + soundPlaying = false; + } + } +} diff --git a/Assembly_CSharp/Tower/Lookout.cs b/Assembly_CSharp/Tower/Lookout.cs new file mode 100644 index 0000000..3abd55b --- /dev/null +++ b/Assembly_CSharp/Tower/Lookout.cs @@ -0,0 +1,97 @@ +using UnityEngine; + +public class Lookout : Tower +{ + [SerializeField] + private GameObject markIcon; + + private GameObject currentMark; + + protected override void Update() + { + if (currentTarget != null) + { + markIcon.SetActive(value: true); + UpdateMark(); + GainXP(); + } + else + { + markIcon.SetActive(value: false); + } + } + + private void UpdateMark() + { + if (currentTarget != currentMark) + { + if (currentMark != null) + { + currentMark.GetComponent().mark = null; + } + currentMark = currentTarget; + currentMark.GetComponent().mark = this; + } + markIcon.transform.position = currentMark.transform.position; + } + + protected override GameObject SelectEnemy(Collider[] possibleTargets) + { + GameObject result = null; + float num = -1f; + for (int i = 0; i < possibleTargets.Length; i++) + { + float num2 = 1f; + Enemy component = possibleTargets[i].GetComponent(); + if (!(component.mark != this) || !(component.mark != null)) + { + if (CheckPriority(Priority.Progress)) + { + num2 /= Mathf.Max(0.001f, possibleTargets[i].GetComponent().distanceFromEnd); + } + if (CheckPriority(Priority.NearDeath)) + { + num2 /= Mathf.Max(0.001f, component.CurrentHealth()); + } + if (CheckPriority(Priority.MostHealth)) + { + num2 *= (float)Mathf.Max(1, component.health); + } + if (CheckPriority(Priority.MostArmor)) + { + num2 *= (float)Mathf.Max(1, component.armor); + } + if (CheckPriority(Priority.MostShield)) + { + num2 *= (float)Mathf.Max(1, component.shield); + } + if (CheckPriority(Priority.LeastHealth)) + { + num2 /= (float)Mathf.Max(1, component.health); + } + if (CheckPriority(Priority.LeastArmor)) + { + num2 /= (float)Mathf.Max(1, component.armor); + } + if (CheckPriority(Priority.LeastShield)) + { + num2 /= (float)Mathf.Max(1, component.shield); + } + if (CheckPriority(Priority.Fastest)) + { + num2 *= Mathf.Max(0.001f, possibleTargets[i].GetComponent().speed); + } + if (CheckPriority(Priority.Slowest)) + { + num2 /= Mathf.Max(0.001f, possibleTargets[i].GetComponent().speed); + } + if (num2 > num) + { + result = component.gameObject; + num = num2; + } + } + } + return result; + } +} diff --git a/Assembly_CSharp/Tower/Morter.cs b/Assembly_CSharp/Tower/Morter.cs new file mode 100644 index 0000000..2170da3 --- /dev/null +++ b/Assembly_CSharp/Tower/Morter.cs @@ -0,0 +1,39 @@ +using UnityEngine; + +public class Morter : Tower +{ + protected override void AimTurret() + { + } + + protected override void Fire() + { + if (consumesMana) + { + int manaCost = (int)((float)base.damage * finalManaConsumption); + if (!ResourceManager.instance.CheckMana(manaCost)) + { + return; + } + ResourceManager.instance.SpendMana(manaCost); + } + float num = projectileSpeed * Mathf.Clamp(Vector3.SqrMagnitude(currentTarget.transform.position - base.transform.position) / (2f * baseRange * baseRange), 1f, float.MaxValue); + Vector3 vector = currentTarget.GetComponent().GetFuturePosition(num) - turret.transform.position; + GameObject gameObject = Object.Instantiate(rotation: Quaternion.LookRotation(new Vector3(vector.x, 0f, vector.z), Vector3.up), original: projectile, position: muzzle.position); + gameObject.GetComponent().SetStats(towerType, currentTarget, num, base.damage, base.healthDamage, base.armorDamage, base.shieldDamage, base.slowPercent, base.bleedPercent, base.burnPercent, base.poisonPercent, base.critChance, base.stunChance); + gameObject.GetComponent().SetMorterPhysics(currentTarget.GetComponent().GetFuturePosition(num)); + gameObject.GetComponent().blastRadius = base.blastRadius; + if (extraProjectileFX != null) + { + GameObject gameObject2 = Object.Instantiate(extraProjectileFX, gameObject.transform.position, gameObject.transform.rotation); + gameObject2.transform.SetParent(gameObject.transform); + gameObject2.GetComponent().SetFX(base.bleedPercent, base.burnPercent, base.poisonPercent, base.slowPercent, consumesMana); + Projectile component = gameObject.GetComponent(); + if (component.detachOnDestruction == null) + { + component.detachOnDestruction = gameObject2; + component.extraFX = gameObject2.GetComponent(); + } + } + } +} diff --git a/Assembly_CSharp/Tower/MorterShell.cs b/Assembly_CSharp/Tower/MorterShell.cs new file mode 100644 index 0000000..ce93441 --- /dev/null +++ b/Assembly_CSharp/Tower/MorterShell.cs @@ -0,0 +1,81 @@ +using UnityEngine; + +public class MorterShell : Projectile +{ + [SerializeField] + private GameObject artObject; + + [SerializeField] + private LayerMask layersAffectedByBlast; + + public float blastRadius = 1f; + + private Vector3 destination; + + private float timeOfFlight; + + [SerializeField] + private float vSpeed; + + [SerializeField] + private float hSpeed; + + [SerializeField] + private float gravity = 5f; + + [SerializeField] + private GameObject explosion; + + private float lookAhead; + + private Vector3 previousPos; + + public void SetMorterPhysics(Vector3 pos) + { + destination = pos; + timeOfFlight = speed; + vSpeed = gravity * timeOfFlight / 2f; + hSpeed = Vector3.Magnitude(base.transform.position - destination) / timeOfFlight; + lookAhead = vSpeed + hSpeed; + } + + protected override void MoveProjectile() + { + previousPos = base.transform.position; + base.transform.Translate(Vector3.forward * hSpeed * Time.fixedDeltaTime); + base.transform.Translate(Vector3.up * vSpeed * Time.fixedDeltaTime); + vSpeed -= gravity * Time.fixedDeltaTime; + artObject.transform.rotation = Quaternion.LookRotation(base.transform.position - previousPos, Vector3.up); + } + + protected override void CheckForHits() + { + if (!(vSpeed > 0f) && Physics.Raycast(artObject.transform.position, artObject.transform.forward, out var hitInfo, lookAhead * Time.fixedDeltaTime, layermask, QueryTriggerInteraction.Collide)) + { + OnHit(hitInfo); + } + } + + protected override void OnHit(RaycastHit hit) + { + Collider[] array = Physics.OverlapSphere(base.transform.position, blastRadius, layersAffectedByBlast, QueryTriggerInteraction.Collide); + for (int i = 0; i < array.Length; i++) + { + IDamageable component = array[i].GetComponent(); + if (component != null) + { + DealDamage(component); + } + } + if (detachOnDestruction != null) + { + detachOnDestruction.transform.parent = null; + } + if (extraFX != null) + { + extraFX.OnDetach(); + } + Object.Instantiate(explosion, base.transform.position, Quaternion.identity); + Object.Destroy(base.gameObject); + } +} diff --git a/Assembly_CSharp/Tower/Obelisk.cs b/Assembly_CSharp/Tower/Obelisk.cs new file mode 100644 index 0000000..549f3b4 --- /dev/null +++ b/Assembly_CSharp/Tower/Obelisk.cs @@ -0,0 +1,99 @@ +using UnityEngine; + +public class Obelisk : Tower +{ + [SerializeField] + private GameObject beam; + + [SerializeField] + private AudioSource audioS; + + private bool soundPlaying; + + private IDamageable lastThingIHit; + + private float timeOnTarget; + + protected override void Update() + { + if (currentTarget != null) + { + if (turret != null) + { + AimTurret(); + } + GainXP(); + } + else + { + beam.SetActive(value: false); + PlaySound(onOff: false); + } + timeSinceLastShot += Time.deltaTime; + if (currentTarget != null && timeSinceLastShot > rps) + { + Fire(); + timeSinceLastShot = 0f; + } + } + + protected override void Fire() + { + if (consumesMana) + { + int manaCost = (int)((float)base.damage * manaConsumptionRate); + if (!ResourceManager.instance.CheckMana(manaCost)) + { + beam.SetActive(value: false); + PlaySound(onOff: false); + return; + } + ResourceManager.instance.SpendMana(manaCost); + } + DealDamage(); + } + + protected override void AimTurret() + { + Vector3 forward = currentTarget.transform.position - turret.transform.position + Vector3.up * 0.5f; + Quaternion rotation = Quaternion.LookRotation(forward, Vector3.up); + turret.transform.rotation = rotation; + beam.transform.localScale = new Vector3(1f, 1f, forward.magnitude); + } + + private void DealDamage() + { + IDamageable component = currentTarget.GetComponent(); + if (component != null) + { + if (component == lastThingIHit) + { + timeOnTarget += rps; + } + else + { + timeOnTarget = 0f; + lastThingIHit = component; + } + int num = Mathf.Clamp(Mathf.FloorToInt(timeOnTarget * TowerManager.instance.obeliskTimeOnTargetMultiplier), 0, base.damage); + component.TakeDamage(towerType, base.damage + num, base.healthDamage, base.armorDamage, base.shieldDamage, base.slowPercent, base.bleedPercent, base.burnPercent, base.poisonPercent, base.critChance, base.stunChance); + beam.SetActive(value: true); + PlaySound(onOff: true); + } + } + + private void PlaySound(bool onOff) + { + if (onOff && !soundPlaying) + { + audioS.volume = OptionsMenu.instance.masterVolume * OptionsMenu.instance.sfxVolume; + audioS.Play(); + soundPlaying = true; + } + else if (!onOff && soundPlaying) + { + audioS.Stop(); + soundPlaying = false; + } + } +} diff --git a/Assembly_CSharp/Tower/RadarTower.cs b/Assembly_CSharp/Tower/RadarTower.cs new file mode 100644 index 0000000..e0d8d1d --- /dev/null +++ b/Assembly_CSharp/Tower/RadarTower.cs @@ -0,0 +1,71 @@ +using UnityEngine; + +public class RadarTower : Tower +{ + [SerializeField] + private GameObject biPlanePrefab; + + [SerializeField] + private BiPlane myPlane; + + protected override void Start() + { + if (myPlane == null) + { + myPlane = Object.Instantiate(biPlanePrefab, base.transform.position + new Vector3(-50f, 5f, 0f), Quaternion.identity).GetComponent(); + } + base.Start(); + } + + public override void SetStats() + { + base.SetStats(); + if (myPlane == null) + { + myPlane = Object.Instantiate(biPlanePrefab, base.transform.position + new Vector3(-50f, 5f, 0f), Quaternion.identity).GetComponent(); + } + myPlane.damage = base.damage; + myPlane.healthDamage = base.healthDamage; + myPlane.armorDamage = base.armorDamage; + myPlane.shieldDamage = base.shieldDamage; + myPlane.rps = rps; + myPlane.slowPercent = base.slowPercent; + myPlane.bleedPercent = base.bleedPercent; + myPlane.burnPercent = base.burnPercent; + myPlane.poisonPercent = base.poisonPercent; + myPlane.critChance = base.critChance; + myPlane.stunChance = base.stunChance; + } + + protected override void Update() + { + if (currentTarget != null) + { + if (turret != null) + { + AimTurret(); + } + GainXP(); + } + timeSinceLastShot += Time.deltaTime; + if (currentTarget != null && timeSinceLastShot > 3f) + { + SendTargetInfo(currentTarget); + timeSinceLastShot = 0f; + } + } + + private void SendTargetInfo(GameObject target) + { + if (myPlane.target == null) + { + myPlane.target = target; + } + } + + public override void Demolish() + { + Object.Destroy(myPlane.gameObject); + base.Demolish(); + } +} diff --git a/Assembly_CSharp/Tower/TeslaCoil.cs b/Assembly_CSharp/Tower/TeslaCoil.cs new file mode 100644 index 0000000..97954e7 --- /dev/null +++ b/Assembly_CSharp/Tower/TeslaCoil.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections; +using UnityEngine; + +public class TeslaCoil : Tower +{ + [SerializeField] + private GameObject lightningTrail; + + protected override void AimTurret() + { + } + + protected override void Fire() + { + if (consumesMana) + { + int manaCost = (int)((float)base.damage * manaConsumptionRate); + if (!ResourceManager.instance.CheckMana(manaCost)) + { + return; + } + ResourceManager.instance.SpendMana(manaCost); + } + Vector3 position = base.transform.position; + position.y = 0f; + Collider[] array = Physics.OverlapSphere(position, base.range, enemyLayerMask, QueryTriggerInteraction.Collide); + for (int i = 0; i < array.Length; i++) + { + array[i].GetComponent()?.TakeDamage(towerType, base.damage, base.healthDamage, base.armorDamage, base.shieldDamage, base.slowPercent, base.bleedPercent, base.burnPercent, base.poisonPercent, base.critChance, base.stunChance); + } + SFXManager.instance.PlaySound(Sound.TeslaZap, base.transform.position); + StartCoroutine(DrawLightning()); + } + + private IEnumerator DrawLightning() + { + for (float i = 0f; i <= (float)Math.PI * 2f; i += 0.5f) + { + Vector3 vector = new Vector3(UnityEngine.Random.Range(-0.5f, 0.5f), UnityEngine.Random.Range(-0.5f, 0.5f), UnityEngine.Random.Range(-0.5f, 0.5f)); + lightningTrail.transform.position = vector + new Vector3(base.transform.position.x + Mathf.Sin(i) * base.range, 0.75f, base.transform.position.z + Mathf.Cos(i) * base.range); + yield return new WaitForEndOfFrame(); + } + } +} diff --git a/Assembly_CSharp/Tower/Tower.cs b/Assembly_CSharp/Tower/Tower.cs new file mode 100644 index 0000000..4098bd6 --- /dev/null +++ b/Assembly_CSharp/Tower/Tower.cs @@ -0,0 +1,509 @@ +using UnityEngine; + +public class Tower : MonoBehaviour, IBuildable +{ + public enum Priority + { + Progress, + NearDeath, + MostHealth, + MostArmor, + MostShield, + LeastHealth, + LeastArmor, + LeastShield, + Fastest, + Slowest, + Marked + } + + public TowerType towerType; + + public bool squareUI; + + [SerializeField] + protected GameObject towerUI; + + public Priority[] priorities = new Priority[3]; + + [SerializeField] + protected GameObject turret; + + [SerializeField] + protected bool towerVerticalyAims = true; + + [SerializeField] + protected Transform muzzle; + + [SerializeField] + protected GameObject projectile; + + [SerializeField] + protected float projectileSpeed = 10f; + + [SerializeField] + protected GameObject extraProjectileFX; + + [SerializeField] + protected int baseDamage; + + [SerializeField] + protected int baseHealthDamage; + + [SerializeField] + protected int baseArmorDamage; + + [SerializeField] + protected int baseShieldDamage; + + public float rpm; + + protected float rps; + + [SerializeField] + protected float baseRange; + + [SerializeField] + protected float baseSlowPercentage; + + [SerializeField] + protected float baseBleedPercentage; + + [SerializeField] + protected float baseBurnPercentage; + + [SerializeField] + protected float basePoisonPercentage; + + [SerializeField] + protected LayerMask enemyLayerMask; + + [SerializeField] + protected LayerMask buildingLayerMask; + + public bool consumesMana; + + public float manaConsumptionRate; + + public float finalManaConsumption; + + public int upgradeCostMultiplier = 1; + + private int damageUpgrade; + + private int healthDamageUpgrade; + + private int armorDamageUpgrade; + + private int shieldDamageUpgrade; + + private int heightBonus; + + protected float timeSinceLastShot; + + private float lastTargetUpdate = 1f; + + protected GameObject currentTarget; + + [SerializeField] + protected float baseBlastRadius; + + public int level { get; private set; } + + public float healthXP { get; private set; } + + public float armorXP { get; private set; } + + public float shieldXP { get; private set; } + + public int damage { get; private set; } + + public int healthDamage { get; private set; } + + public int armorDamage { get; private set; } + + public int shieldDamage { get; private set; } + + public float range { get; private set; } + + public float slowPercent { get; private set; } + + public float bleedPercent { get; private set; } + + public float burnPercent { get; private set; } + + public float poisonPercent { get; private set; } + + public float critChance { get; private set; } + + public float stunChance { get; private set; } + + public float blastRadius { get; private set; } + + protected virtual void Start() + { + level = 1; + SetStats(); + TowerManager.instance.AddNewTower(this, towerType); + DetectHouses(); + priorities[0] = (priorities[1] = (priorities[2] = Priority.Progress)); + } + + public virtual void SetStats() + { + heightBonus = (int)Mathf.Round(base.transform.position.y * 3f - 1f); + damage = Mathf.Max(baseDamage + heightBonus + damageUpgrade + TowerManager.instance.GetBonusBaseDamage(towerType), 0); + healthDamage = baseHealthDamage + healthDamageUpgrade + TowerManager.instance.GetBonusHealthDamage(towerType); + armorDamage = baseArmorDamage + armorDamageUpgrade + TowerManager.instance.GetBonusArmorDamage(towerType); + shieldDamage = baseShieldDamage + shieldDamageUpgrade + TowerManager.instance.GetBonusShieldDamage(towerType); + rps = 60f / rpm; + range = baseRange + (float)heightBonus / 2f + TowerManager.instance.GetBonusRange(towerType); + slowPercent = baseSlowPercentage + TowerManager.instance.GetBonusSlow(towerType); + bleedPercent = baseBleedPercentage + TowerManager.instance.GetBonusBleed(towerType); + burnPercent = baseBurnPercentage + TowerManager.instance.GetBonusBurn(towerType); + poisonPercent = basePoisonPercentage + TowerManager.instance.GetBonusPoison(towerType); + blastRadius = baseBlastRadius + TowerManager.instance.GetBonusBlast(towerType); + finalManaConsumption = manaConsumptionRate + TowerManager.instance.GetManaConsumptionBonus(towerType); + if (TowerManager.instance.GetManaConsumptionBonus(towerType) > 0f) + { + consumesMana = true; + } + critChance = TowerManager.instance.GetCritChance(towerType) + TowerManager.instance.GetCritChanceLevelMultiplier(towerType) * (float)level / 100f; + stunChance = TowerManager.instance.GetStunChance(towerType); + } + + private void FixedUpdate() + { + if (lastTargetUpdate <= 0f) + { + DetectEnemies(); + } + else + { + lastTargetUpdate -= Time.fixedDeltaTime; + } + } + + protected virtual void Update() + { + if (currentTarget != null) + { + if (turret != null) + { + AimTurret(); + } + GainXP(); + } + timeSinceLastShot += Time.deltaTime; + if (currentTarget != null && timeSinceLastShot > rps) + { + Fire(); + timeSinceLastShot = 0f; + } + } + + private void DetectHouses() + { + if (Physics.Raycast(base.transform.position + new Vector3(1f, 1f, 0f), -base.transform.up, out var hitInfo, 1f, buildingLayerMask, QueryTriggerInteraction.Ignore)) + { + CheckForHouse(hitInfo); + } + if (Physics.Raycast(base.transform.position + new Vector3(-1f, 1f, 0f), -base.transform.up, out hitInfo, 1f, buildingLayerMask, QueryTriggerInteraction.Ignore)) + { + CheckForHouse(hitInfo); + } + if (Physics.Raycast(base.transform.position + new Vector3(0f, 1f, 1f), -base.transform.up, out hitInfo, 1f, buildingLayerMask, QueryTriggerInteraction.Ignore)) + { + CheckForHouse(hitInfo); + } + if (Physics.Raycast(base.transform.position + new Vector3(0f, 1f, -1f), -base.transform.up, out hitInfo, 1f, buildingLayerMask, QueryTriggerInteraction.Ignore)) + { + CheckForHouse(hitInfo); + } + } + + private void CheckForHouse(RaycastHit hit) + { + if (hit.collider.GetComponent() != null && (double)Mathf.Abs(hit.collider.transform.position.y - base.transform.position.y) <= 0.001) + { + hit.collider.GetComponent().AddDefender(this); + } + } + + public void TogglePriority(int index, int direction) + { + priorities[index] = (Priority)(((int)(priorities[index] + direction) % 11 + 11) % 11); + } + + protected virtual void Fire() + { + if (consumesMana) + { + int manaCost = (int)((float)damage * finalManaConsumption); + if (!ResourceManager.instance.CheckMana(manaCost)) + { + return; + } + ResourceManager.instance.SpendMana(manaCost); + } + GameObject gameObject = Object.Instantiate(projectile, muzzle.position, muzzle.rotation); + gameObject.GetComponent().SetStats(towerType, currentTarget, projectileSpeed, damage, healthDamage, armorDamage, shieldDamage, slowPercent, bleedPercent, burnPercent, poisonPercent, critChance, stunChance); + if (extraProjectileFX != null) + { + GameObject gameObject2 = Object.Instantiate(extraProjectileFX, gameObject.transform.position, gameObject.transform.rotation); + gameObject2.transform.SetParent(gameObject.transform); + gameObject2.GetComponent().SetFX(bleedPercent, burnPercent, poisonPercent, slowPercent, consumesMana); + Projectile component = gameObject.GetComponent(); + if (component.detachOnDestruction == null) + { + component.detachOnDestruction = gameObject2; + component.extraFX = gameObject2.GetComponent(); + } + } + } + + protected virtual void AimTurret() + { + Vector3 forward = currentTarget.transform.position - turret.transform.position; + if (!towerVerticalyAims) + { + forward.y = 0f; + } + Quaternion rotation = Quaternion.LookRotation(forward, Vector3.up); + turret.transform.rotation = rotation; + } + + protected void GainXP() + { + Enemy component = currentTarget.GetComponent(); + if (component != null) + { + if (component.shield > 0) + { + shieldXP += Time.deltaTime / (2f * range) + Time.deltaTime / 2f; + } + else if (component.armor > 0) + { + armorXP += Time.deltaTime / (2f * range) + Time.deltaTime / 2f; + } + else + { + healthXP += Time.deltaTime / (2f * range) + Time.deltaTime / 2f; + } + CheckXPAndLevelUp(); + } + } + + private void CheckXPAndLevelUp() + { + if (healthXP >= (float)(10 * level)) + { + healthXP -= 10 * level; + level++; + damageUpgrade++; + healthDamageUpgrade++; + SetStats(); + LevelUpText(); + } + if (armorXP >= (float)(10 * level)) + { + armorXP -= 10 * level; + level++; + damageUpgrade++; + armorDamageUpgrade++; + SetStats(); + LevelUpText(); + } + if (shieldXP >= (float)(10 * level)) + { + shieldXP -= 10 * level; + level++; + damageUpgrade++; + shieldDamageUpgrade++; + SetStats(); + LevelUpText(); + } + } + + private void LevelUpText() + { + Object.Instantiate(BuildingManager.instance.levelUpFX, base.transform.position, Quaternion.identity); + DamageNumber component = ObjectPool.instance.SpawnObject(ObjectPool.ObjectType.DamageNumber, base.transform.position, Quaternion.identity).GetComponent(); + component.SetText("LEVEL UP!", "Grey", 1f); + component.SetHoldTime(1f); + AchievementManager.instance.TowerLevel(level); + } + + public void BuyHealthLevel() + { + int num = (10 * level - (int)healthXP) * upgradeCostMultiplier; + if (ResourceManager.instance.CheckMoney(num)) + { + ResourceManager.instance.Spend(num); + DamageTracker.instance.AddCost(towerType, num); + healthXP -= 10 * level - num / upgradeCostMultiplier; + level++; + damageUpgrade++; + healthDamageUpgrade++; + SetStats(); + LevelUpText(); + } + } + + public void BuyArmorLevel() + { + int num = (10 * level - (int)armorXP) * upgradeCostMultiplier; + if (ResourceManager.instance.CheckMoney(num)) + { + ResourceManager.instance.Spend(num); + DamageTracker.instance.AddCost(towerType, num); + armorXP -= 10 * level - num / upgradeCostMultiplier; + level++; + damageUpgrade++; + armorDamageUpgrade++; + SetStats(); + LevelUpText(); + } + } + + public void BuyShieldLevel() + { + int num = (10 * level - (int)shieldXP) * upgradeCostMultiplier; + if (ResourceManager.instance.CheckMoney(num)) + { + ResourceManager.instance.Spend(num); + DamageTracker.instance.AddCost(towerType, num); + shieldXP -= 10 * level - num / upgradeCostMultiplier; + level++; + damageUpgrade++; + shieldDamageUpgrade++; + SetStats(); + LevelUpText(); + } + } + + private void DetectEnemies() + { + Collider[] array = Physics.OverlapSphere(base.transform.position, range, enemyLayerMask, QueryTriggerInteraction.Collide); + if (array.Length != 0) + { + currentTarget = SelectEnemy(array); + } + else + { + currentTarget = null; + } + lastTargetUpdate = Random.Range(0.25f, 1f); + } + + protected bool CheckPriority(Priority check) + { + for (int i = 0; i < priorities.Length; i++) + { + if (check == priorities[i]) + { + return true; + } + } + return false; + } + + protected int PriorityScale(Priority check) + { + for (int i = 0; i < priorities.Length; i++) + { + if (check == priorities[i]) + { + return Mathf.Clamp(3 - i, 1, 3); + } + } + return 1; + } + + protected virtual GameObject SelectEnemy(Collider[] possibleTargets) + { + GameObject result = null; + float num = -1f; + for (int i = 0; i < possibleTargets.Length; i++) + { + float num2 = 1f; + Enemy component = possibleTargets[i].GetComponent(); + if (CheckPriority(Priority.Progress)) + { + float f = Mathf.Max(0.001f, possibleTargets[i].GetComponent().distanceFromEnd); + num2 /= Mathf.Pow(f, PriorityScale(Priority.Progress)); + } + if (CheckPriority(Priority.NearDeath)) + { + float f2 = Mathf.Max(0.001f, component.CurrentHealth()); + num2 /= Mathf.Pow(f2, PriorityScale(Priority.NearDeath)); + } + if (CheckPriority(Priority.MostHealth)) + { + float f3 = (float)Mathf.Max(1, component.health) / 1000f; + num2 *= Mathf.Pow(f3, PriorityScale(Priority.MostHealth)); + } + if (CheckPriority(Priority.MostArmor)) + { + float f4 = (float)Mathf.Max(1, component.armor) / 1000f; + num2 *= Mathf.Pow(f4, PriorityScale(Priority.MostArmor)); + } + if (CheckPriority(Priority.MostShield)) + { + float f5 = (float)Mathf.Max(1, component.shield) / 1000f; + num2 *= Mathf.Pow(f5, PriorityScale(Priority.MostShield)); + } + if (CheckPriority(Priority.LeastHealth)) + { + float f6 = Mathf.Max(1, component.health); + num2 /= Mathf.Pow(f6, PriorityScale(Priority.LeastHealth)); + } + if (CheckPriority(Priority.LeastArmor)) + { + float f7 = Mathf.Max(1, component.armor); + num2 /= Mathf.Pow(f7, PriorityScale(Priority.LeastArmor)); + } + if (CheckPriority(Priority.LeastShield)) + { + float f8 = Mathf.Max(1, component.shield); + num2 /= Mathf.Pow(f8, PriorityScale(Priority.LeastShield)); + } + if (CheckPriority(Priority.Fastest)) + { + float f9 = Mathf.Max(0.001f, possibleTargets[i].GetComponent().speed); + num2 *= Mathf.Pow(f9, PriorityScale(Priority.Fastest)); + } + if (CheckPriority(Priority.Slowest)) + { + float f10 = Mathf.Max(0.001f, possibleTargets[i].GetComponent().speed); + num2 /= Mathf.Pow(f10, PriorityScale(Priority.Slowest)); + } + if (CheckPriority(Priority.Marked)) + { + float f11 = 1f; + if (component.mark != null) + { + f11 = (float)(component.mark.damage * (component.mark.healthDamage + component.mark.armorDamage + component.mark.shieldDamage)) * (1f + component.mark.critChance); + } + num2 *= Mathf.Pow(f11, PriorityScale(Priority.Marked)); + } + if (num2 > num) + { + result = component.gameObject; + num = num2; + } + } + return result; + } + + public void SpawnUI() + { + Object.Instantiate(towerUI, base.transform.position, Quaternion.identity).GetComponent().SetStats(this); + } + + public virtual void Demolish() + { + TowerManager.instance.RemoveTower(this, towerType); + Object.Destroy(base.gameObject); + } +} diff --git a/Assembly_CSharp/Tower/TowerFlyweight.cs b/Assembly_CSharp/Tower/TowerFlyweight.cs new file mode 100644 index 0000000..b63f8b4 --- /dev/null +++ b/Assembly_CSharp/Tower/TowerFlyweight.cs @@ -0,0 +1,279 @@ +using System.Collections.Generic; +using UnityEngine; + +public class TowerFlyweight : MonoBehaviour +{ + private HashSet towers = new HashSet(); + + [SerializeField] + private BuildButtonUI myBuildButton; + + [SerializeField] + private int basePrice; + + [SerializeField] + public int priceIncrease; + + [SerializeField] + public int currentPrice; + + [SerializeField] + public int sellPrice; + + [SerializeField] + public float bonusRange; + + [SerializeField] + public int bonusBaseDamage; + + [SerializeField] + public int bonusHealthDamage; + + [SerializeField] + public int bonusArmorDamage; + + [SerializeField] + public int bonusShieldDamage; + + [SerializeField] + public float bonusSlow; + + [SerializeField] + public float bonusBleed; + + [SerializeField] + public float bonusBurn; + + [SerializeField] + public float bonusPoison; + + [SerializeField] + public float bonusBlast; + + [SerializeField] + public float critChance; + + [SerializeField] + public float critChanceLevelMultiplier; + + [SerializeField] + public float stunChance; + + [SerializeField] + public float manaConsumptionAddition; + + [SerializeField] + private TowerType towerTypeForDamageTracker; + + public void AddNewTower(Tower newTower) + { + towers.Add(newTower); + currentPrice = basePrice + towers.Count * priceIncrease; + sellPrice = basePrice + (towers.Count - 1) * priceIncrease; + myBuildButton.UpdatePriceText(); + } + + public void RemoveTower(Tower newTower) + { + towers.Remove(newTower); + currentPrice = basePrice + towers.Count * priceIncrease; + sellPrice = basePrice + (towers.Count - 1) * priceIncrease; + myBuildButton.UpdatePriceText(); + ResourceManager.instance.AddMoney(basePrice + towers.Count * priceIncrease); + DamageTracker.instance.AddCost(towerTypeForDamageTracker, -(basePrice + towers.Count * priceIncrease)); + } + + public void UpdateTowerStats() + { + foreach (Tower tower in towers) + { + tower.SetStats(); + } + if (myBuildButton != null) + { + myBuildButton.UpdateModifiersText(); + } + } + + public void AddManaAddition(float bonus) + { + manaConsumptionAddition += bonus; + foreach (Tower tower in towers) + { + tower.SetStats(); + } + if (myBuildButton != null) + { + myBuildButton.UpdateModifiersText(); + } + } + + public void AddStunChance(float bonus) + { + stunChance += bonus; + foreach (Tower tower in towers) + { + tower.SetStats(); + } + if (myBuildButton != null) + { + myBuildButton.UpdateModifiersText(); + } + } + + public void AddCritChance(float bonus) + { + critChance += bonus; + foreach (Tower tower in towers) + { + tower.SetStats(); + } + if (myBuildButton != null) + { + myBuildButton.UpdateModifiersText(); + } + } + + public void AddCritChanceLevelMultiplier(float bonus) + { + critChanceLevelMultiplier += bonus; + foreach (Tower tower in towers) + { + tower.SetStats(); + } + if (myBuildButton != null) + { + myBuildButton.UpdateModifiersText(); + } + } + + public void AddBonusRange(float bonus) + { + bonusRange += bonus; + foreach (Tower tower in towers) + { + tower.SetStats(); + } + if (myBuildButton != null) + { + myBuildButton.UpdateModifiersText(); + } + } + + public void AddBonusBaseDamage(int bonus) + { + bonusBaseDamage += bonus; + foreach (Tower tower in towers) + { + tower.SetStats(); + } + if (myBuildButton != null) + { + myBuildButton.UpdateModifiersText(); + } + } + + public void AddBonusHealthDamage(int bonus) + { + bonusHealthDamage += bonus; + foreach (Tower tower in towers) + { + tower.SetStats(); + } + if (myBuildButton != null) + { + myBuildButton.UpdateModifiersText(); + } + } + + public void AddBonusArmorDamage(int bonus) + { + bonusArmorDamage += bonus; + foreach (Tower tower in towers) + { + tower.SetStats(); + } + if (myBuildButton != null) + { + myBuildButton.UpdateModifiersText(); + } + } + + public void AddBonusShieldDamage(int bonus) + { + bonusShieldDamage += bonus; + foreach (Tower tower in towers) + { + tower.SetStats(); + } + if (myBuildButton != null) + { + myBuildButton.UpdateModifiersText(); + } + } + + public void AddBonusSlow(float bonus) + { + bonusSlow += bonus; + foreach (Tower tower in towers) + { + tower.SetStats(); + } + if (myBuildButton != null) + { + myBuildButton.UpdateModifiersText(); + } + } + + public void AddBonusBleed(float bonus) + { + bonusBleed += bonus; + foreach (Tower tower in towers) + { + tower.SetStats(); + } + if (myBuildButton != null) + { + myBuildButton.UpdateModifiersText(); + } + } + + public void AddBonusBurn(float bonus) + { + bonusBurn += bonus; + foreach (Tower tower in towers) + { + tower.SetStats(); + } + if (myBuildButton != null) + { + myBuildButton.UpdateModifiersText(); + } + } + + public void AddBonusPoison(float bonus) + { + bonusPoison += bonus; + foreach (Tower tower in towers) + { + tower.SetStats(); + } + if (myBuildButton != null) + { + myBuildButton.UpdateModifiersText(); + } + } + + public void AddBonusBlast(float bonus) + { + bonusBlast += bonus; + foreach (Tower tower in towers) + { + tower.SetStats(); + } + if (myBuildButton != null) + { + myBuildButton.UpdateModifiersText(); + } + } +} diff --git a/Assembly_CSharp/Tower/TowerManager.cs b/Assembly_CSharp/Tower/TowerManager.cs new file mode 100644 index 0000000..abdca52 --- /dev/null +++ b/Assembly_CSharp/Tower/TowerManager.cs @@ -0,0 +1,1386 @@ +using System.Collections.Generic; +using UnityEngine; + +public class TowerManager : MonoBehaviour +{ + public static TowerManager instance; + + [SerializeField] + private TowerFlyweight global; + + [SerializeField] + private TowerFlyweight crossbow; + + [SerializeField] + private TowerFlyweight morter; + + [SerializeField] + private TowerFlyweight teslaCoil; + + [SerializeField] + private TowerFlyweight flameThrower; + + [SerializeField] + private TowerFlyweight poisonSprayer; + + [SerializeField] + private TowerFlyweight frostKeep; + + [SerializeField] + private TowerFlyweight radar; + + [SerializeField] + private TowerFlyweight obelisk; + + [SerializeField] + private TowerFlyweight particleCannon; + + [SerializeField] + private TowerFlyweight shredder; + + [SerializeField] + private TowerFlyweight encampment; + + [SerializeField] + private TowerFlyweight lookout; + + [SerializeField] + private TowerFlyweight siphon; + + public HashSet towersUsed = new HashSet(); + + private bool usedAllTowers; + + public float obeliskTimeOnTargetMultiplier; + + private void Awake() + { + instance = this; + } + + public void AddNewTower(Tower t, TowerType type) + { + if (type != TowerType.Siphon) + { + towersUsed.Add(type); + } + if (!usedAllTowers) + { + usedAllTowers = AchievementManager.instance.CheckAllTowers(); + } + switch (type) + { + case TowerType.Crossbow: + crossbow.AddNewTower(t); + break; + case TowerType.Morter: + morter.AddNewTower(t); + break; + case TowerType.TeslaCoil: + teslaCoil.AddNewTower(t); + break; + case TowerType.FlameThrower: + flameThrower.AddNewTower(t); + break; + case TowerType.PoisonSprayer: + poisonSprayer.AddNewTower(t); + break; + case TowerType.Frost: + frostKeep.AddNewTower(t); + break; + case TowerType.Radar: + radar.AddNewTower(t); + break; + case TowerType.Obelisk: + obelisk.AddNewTower(t); + break; + case TowerType.ParticleCannon: + particleCannon.AddNewTower(t); + break; + case TowerType.Shredder: + shredder.AddNewTower(t); + break; + case TowerType.Encampment: + encampment.AddNewTower(t); + break; + case TowerType.Lookout: + lookout.AddNewTower(t); + break; + default: + Debug.LogError("Failed to add tower to flyweight"); + break; + } + } + + public void RemoveTower(Tower t, TowerType type) + { + switch (type) + { + case TowerType.Crossbow: + crossbow.RemoveTower(t); + break; + case TowerType.Morter: + morter.RemoveTower(t); + break; + case TowerType.TeslaCoil: + teslaCoil.RemoveTower(t); + break; + case TowerType.FlameThrower: + flameThrower.RemoveTower(t); + break; + case TowerType.PoisonSprayer: + poisonSprayer.RemoveTower(t); + break; + case TowerType.Frost: + frostKeep.RemoveTower(t); + break; + case TowerType.Obelisk: + obelisk.RemoveTower(t); + break; + case TowerType.Radar: + radar.RemoveTower(t); + break; + case TowerType.ParticleCannon: + particleCannon.RemoveTower(t); + break; + case TowerType.Shredder: + shredder.RemoveTower(t); + break; + case TowerType.Encampment: + encampment.RemoveTower(t); + break; + case TowerType.Lookout: + lookout.RemoveTower(t); + break; + default: + Debug.LogError("Failed to add tower to flyweight"); + break; + } + } + + public void UpdateAllTowers() + { + crossbow.UpdateTowerStats(); + morter.UpdateTowerStats(); + teslaCoil.UpdateTowerStats(); + flameThrower.UpdateTowerStats(); + poisonSprayer.UpdateTowerStats(); + frostKeep.UpdateTowerStats(); + radar.UpdateTowerStats(); + obelisk.UpdateTowerStats(); + particleCannon.UpdateTowerStats(); + shredder.UpdateTowerStats(); + encampment.UpdateTowerStats(); + lookout.UpdateTowerStats(); + } + + public int GetSellPrice(TowerType type) + { + switch (type) + { + case TowerType.Crossbow: + return crossbow.sellPrice; + case TowerType.Morter: + return morter.sellPrice; + case TowerType.TeslaCoil: + return teslaCoil.sellPrice; + case TowerType.FlameThrower: + return flameThrower.sellPrice; + case TowerType.PoisonSprayer: + return poisonSprayer.sellPrice; + case TowerType.Frost: + return frostKeep.sellPrice; + case TowerType.Obelisk: + return obelisk.sellPrice; + case TowerType.Radar: + return radar.sellPrice; + case TowerType.ParticleCannon: + return particleCannon.sellPrice; + case TowerType.Shredder: + return shredder.sellPrice; + case TowerType.Encampment: + return encampment.sellPrice; + case TowerType.Lookout: + return lookout.sellPrice; + default: + Debug.LogError("Failed to add tower to flyweight"); + return -1; + } + } + + public float GetManaConsumptionBonus(TowerType type) + { + switch (type) + { + case TowerType.Crossbow: + return global.manaConsumptionAddition + crossbow.manaConsumptionAddition; + case TowerType.Morter: + return global.manaConsumptionAddition + morter.manaConsumptionAddition; + case TowerType.TeslaCoil: + return global.manaConsumptionAddition + teslaCoil.manaConsumptionAddition; + case TowerType.FlameThrower: + return global.manaConsumptionAddition + flameThrower.manaConsumptionAddition; + case TowerType.PoisonSprayer: + return global.manaConsumptionAddition + poisonSprayer.manaConsumptionAddition; + case TowerType.Frost: + return global.manaConsumptionAddition + frostKeep.manaConsumptionAddition; + case TowerType.Radar: + return global.manaConsumptionAddition + radar.manaConsumptionAddition; + case TowerType.Obelisk: + return global.manaConsumptionAddition + obelisk.manaConsumptionAddition; + case TowerType.ParticleCannon: + return global.manaConsumptionAddition + particleCannon.manaConsumptionAddition; + case TowerType.Shredder: + return global.manaConsumptionAddition + shredder.manaConsumptionAddition; + case TowerType.Encampment: + return global.manaConsumptionAddition + encampment.manaConsumptionAddition; + case TowerType.Lookout: + return global.manaConsumptionAddition + lookout.manaConsumptionAddition; + default: + Debug.Log("Failed to get global bonus"); + return 0f; + } + } + + public float GetCritChance(TowerType type) + { + switch (type) + { + case TowerType.Crossbow: + return global.critChance + crossbow.critChance; + case TowerType.Morter: + return global.critChance + morter.critChance; + case TowerType.TeslaCoil: + return global.critChance + teslaCoil.critChance; + case TowerType.FlameThrower: + return global.critChance + flameThrower.critChance; + case TowerType.PoisonSprayer: + return global.critChance + poisonSprayer.critChance; + case TowerType.Frost: + return global.critChance + frostKeep.critChance; + case TowerType.Radar: + return global.critChance + radar.critChance; + case TowerType.Obelisk: + return global.critChance + obelisk.critChance; + case TowerType.ParticleCannon: + return global.critChance + particleCannon.critChance; + case TowerType.Shredder: + return global.critChance + shredder.critChance; + case TowerType.Encampment: + return global.critChance + encampment.critChance; + case TowerType.Lookout: + return global.critChance + lookout.critChance; + default: + Debug.Log("Failed to get global bonus"); + return 0f; + } + } + + public float GetStunChance(TowerType type) + { + switch (type) + { + case TowerType.Crossbow: + return global.stunChance + crossbow.stunChance; + case TowerType.Morter: + return global.stunChance + morter.stunChance; + case TowerType.TeslaCoil: + return global.stunChance + teslaCoil.stunChance; + case TowerType.FlameThrower: + return global.stunChance + flameThrower.stunChance; + case TowerType.PoisonSprayer: + return global.stunChance + poisonSprayer.stunChance; + case TowerType.Frost: + return global.stunChance + frostKeep.stunChance; + case TowerType.Radar: + return global.stunChance + radar.stunChance; + case TowerType.Obelisk: + return global.stunChance + obelisk.stunChance; + case TowerType.ParticleCannon: + return global.stunChance + particleCannon.stunChance; + case TowerType.Shredder: + return global.stunChance + shredder.stunChance; + case TowerType.Encampment: + return global.stunChance + encampment.stunChance; + case TowerType.Lookout: + return global.stunChance + lookout.stunChance; + default: + Debug.Log("Failed to get global bonus"); + return 0f; + } + } + + public float GetCritChanceLevelMultiplier(TowerType type) + { + switch (type) + { + case TowerType.Crossbow: + return global.critChanceLevelMultiplier + crossbow.critChanceLevelMultiplier; + case TowerType.Morter: + return global.critChanceLevelMultiplier + morter.critChanceLevelMultiplier; + case TowerType.TeslaCoil: + return global.critChanceLevelMultiplier + teslaCoil.critChanceLevelMultiplier; + case TowerType.FlameThrower: + return global.critChanceLevelMultiplier + flameThrower.critChanceLevelMultiplier; + case TowerType.PoisonSprayer: + return global.critChanceLevelMultiplier + poisonSprayer.critChanceLevelMultiplier; + case TowerType.Frost: + return global.critChanceLevelMultiplier + frostKeep.critChanceLevelMultiplier; + case TowerType.Radar: + return global.critChanceLevelMultiplier + radar.critChanceLevelMultiplier; + case TowerType.Obelisk: + return global.critChanceLevelMultiplier + obelisk.critChanceLevelMultiplier; + case TowerType.ParticleCannon: + return global.critChanceLevelMultiplier + particleCannon.critChanceLevelMultiplier; + case TowerType.Shredder: + return global.critChanceLevelMultiplier + shredder.critChanceLevelMultiplier; + case TowerType.Encampment: + return global.critChanceLevelMultiplier + encampment.critChanceLevelMultiplier; + case TowerType.Lookout: + return global.critChanceLevelMultiplier + lookout.critChanceLevelMultiplier; + default: + Debug.Log("Failed to get global bonus"); + return 0f; + } + } + + public float GetBonusRange(TowerType type) + { + switch (type) + { + case TowerType.Crossbow: + return global.bonusRange + crossbow.bonusRange; + case TowerType.Morter: + return global.bonusRange + morter.bonusRange; + case TowerType.TeslaCoil: + return global.bonusRange + teslaCoil.bonusRange; + case TowerType.FlameThrower: + return global.bonusRange + flameThrower.bonusRange; + case TowerType.PoisonSprayer: + return global.bonusRange + poisonSprayer.bonusRange; + case TowerType.Frost: + return global.bonusRange + frostKeep.bonusRange; + case TowerType.Radar: + return global.bonusRange + radar.bonusRange; + case TowerType.Obelisk: + return global.bonusRange + obelisk.bonusRange; + case TowerType.ParticleCannon: + return global.bonusRange + particleCannon.bonusRange; + case TowerType.Shredder: + return global.bonusRange + shredder.bonusRange; + case TowerType.Encampment: + return global.bonusRange + encampment.bonusRange; + case TowerType.Lookout: + return global.bonusRange + lookout.bonusRange; + default: + Debug.Log("Failed to get global bonus"); + return 0f; + } + } + + public int GetBonusBaseDamage(TowerType type) + { + switch (type) + { + case TowerType.Crossbow: + return global.bonusBaseDamage + crossbow.bonusBaseDamage; + case TowerType.Morter: + return global.bonusBaseDamage + morter.bonusBaseDamage; + case TowerType.TeslaCoil: + return global.bonusBaseDamage + teslaCoil.bonusBaseDamage; + case TowerType.FlameThrower: + return global.bonusBaseDamage + flameThrower.bonusBaseDamage; + case TowerType.PoisonSprayer: + return global.bonusBaseDamage + poisonSprayer.bonusBaseDamage; + case TowerType.Frost: + return global.bonusBaseDamage + frostKeep.bonusBaseDamage; + case TowerType.Radar: + return global.bonusBaseDamage + radar.bonusBaseDamage; + case TowerType.Obelisk: + return global.bonusBaseDamage + obelisk.bonusBaseDamage; + case TowerType.ParticleCannon: + return global.bonusBaseDamage + particleCannon.bonusBaseDamage; + case TowerType.Shredder: + return global.bonusBaseDamage + shredder.bonusBaseDamage; + case TowerType.Encampment: + return global.bonusBaseDamage + encampment.bonusBaseDamage; + case TowerType.Lookout: + return global.bonusBaseDamage + lookout.bonusBaseDamage; + default: + Debug.Log("Failed to get global bonus"); + return 0; + } + } + + public int GetBonusHealthDamage(TowerType type) + { + switch (type) + { + case TowerType.Crossbow: + return global.bonusHealthDamage + crossbow.bonusHealthDamage; + case TowerType.Morter: + return global.bonusHealthDamage + morter.bonusHealthDamage; + case TowerType.TeslaCoil: + return global.bonusHealthDamage + teslaCoil.bonusHealthDamage; + case TowerType.FlameThrower: + return global.bonusHealthDamage + flameThrower.bonusHealthDamage; + case TowerType.PoisonSprayer: + return global.bonusHealthDamage + poisonSprayer.bonusHealthDamage; + case TowerType.Frost: + return global.bonusHealthDamage + frostKeep.bonusHealthDamage; + case TowerType.Radar: + return global.bonusHealthDamage + radar.bonusHealthDamage; + case TowerType.Obelisk: + return global.bonusHealthDamage + obelisk.bonusHealthDamage; + case TowerType.ParticleCannon: + return global.bonusHealthDamage + particleCannon.bonusHealthDamage; + case TowerType.Shredder: + return global.bonusHealthDamage + shredder.bonusHealthDamage; + case TowerType.Encampment: + return global.bonusHealthDamage + encampment.bonusHealthDamage; + case TowerType.Lookout: + return global.bonusHealthDamage + lookout.bonusHealthDamage; + default: + Debug.Log("Failed to get global bonus"); + return 0; + } + } + + public int GetBonusArmorDamage(TowerType type) + { + switch (type) + { + case TowerType.Crossbow: + return global.bonusArmorDamage + crossbow.bonusArmorDamage; + case TowerType.Morter: + return global.bonusArmorDamage + morter.bonusArmorDamage; + case TowerType.TeslaCoil: + return global.bonusArmorDamage + teslaCoil.bonusArmorDamage; + case TowerType.FlameThrower: + return global.bonusArmorDamage + flameThrower.bonusArmorDamage; + case TowerType.PoisonSprayer: + return global.bonusArmorDamage + poisonSprayer.bonusArmorDamage; + case TowerType.Frost: + return global.bonusArmorDamage + frostKeep.bonusArmorDamage; + case TowerType.Radar: + return global.bonusArmorDamage + radar.bonusArmorDamage; + case TowerType.Obelisk: + return global.bonusArmorDamage + obelisk.bonusArmorDamage; + case TowerType.ParticleCannon: + return global.bonusArmorDamage + particleCannon.bonusArmorDamage; + case TowerType.Shredder: + return global.bonusArmorDamage + shredder.bonusArmorDamage; + case TowerType.Encampment: + return global.bonusArmorDamage + encampment.bonusArmorDamage; + case TowerType.Lookout: + return global.bonusArmorDamage + lookout.bonusArmorDamage; + default: + Debug.Log("Failed to get global bonus"); + return 0; + } + } + + public int GetBonusShieldDamage(TowerType type) + { + switch (type) + { + case TowerType.Crossbow: + return global.bonusShieldDamage + crossbow.bonusShieldDamage; + case TowerType.Morter: + return global.bonusShieldDamage + morter.bonusShieldDamage; + case TowerType.TeslaCoil: + return global.bonusShieldDamage + teslaCoil.bonusShieldDamage; + case TowerType.FlameThrower: + return global.bonusShieldDamage + flameThrower.bonusShieldDamage; + case TowerType.PoisonSprayer: + return global.bonusShieldDamage + poisonSprayer.bonusShieldDamage; + case TowerType.Frost: + return global.bonusShieldDamage + frostKeep.bonusShieldDamage; + case TowerType.Radar: + return global.bonusShieldDamage + radar.bonusShieldDamage; + case TowerType.Obelisk: + return global.bonusShieldDamage + obelisk.bonusShieldDamage; + case TowerType.ParticleCannon: + return global.bonusShieldDamage + particleCannon.bonusShieldDamage; + case TowerType.Shredder: + return global.bonusShieldDamage + shredder.bonusShieldDamage; + case TowerType.Encampment: + return global.bonusShieldDamage + encampment.bonusShieldDamage; + case TowerType.Lookout: + return global.bonusShieldDamage + lookout.bonusShieldDamage; + default: + Debug.Log("Failed to get global bonus"); + return 0; + } + } + + public float GetBonusSlow(TowerType type) + { + switch (type) + { + case TowerType.Crossbow: + return global.bonusSlow + crossbow.bonusSlow; + case TowerType.Morter: + return global.bonusSlow + morter.bonusSlow; + case TowerType.TeslaCoil: + return global.bonusSlow + teslaCoil.bonusSlow; + case TowerType.FlameThrower: + return global.bonusSlow + flameThrower.bonusSlow; + case TowerType.PoisonSprayer: + return global.bonusSlow + poisonSprayer.bonusSlow; + case TowerType.Frost: + return global.bonusSlow + frostKeep.bonusSlow; + case TowerType.Radar: + return global.bonusSlow + radar.bonusSlow; + case TowerType.Obelisk: + return global.bonusSlow + obelisk.bonusSlow; + case TowerType.ParticleCannon: + return global.bonusSlow + particleCannon.bonusSlow; + case TowerType.Shredder: + return global.bonusSlow + shredder.bonusSlow; + case TowerType.Encampment: + return global.bonusSlow + encampment.bonusSlow; + case TowerType.Lookout: + return global.bonusSlow + lookout.bonusSlow; + default: + Debug.Log("Failed to get global bonus"); + return 0f; + } + } + + public float GetBonusBleed(TowerType type) + { + switch (type) + { + case TowerType.Crossbow: + return global.bonusBleed + crossbow.bonusBleed; + case TowerType.Morter: + return global.bonusBleed + morter.bonusBleed; + case TowerType.TeslaCoil: + return global.bonusBleed + teslaCoil.bonusBleed; + case TowerType.FlameThrower: + return global.bonusBleed + flameThrower.bonusBleed; + case TowerType.PoisonSprayer: + return global.bonusBleed + poisonSprayer.bonusBleed; + case TowerType.Frost: + return global.bonusBleed + frostKeep.bonusBleed; + case TowerType.Radar: + return global.bonusBleed + radar.bonusBleed; + case TowerType.Obelisk: + return global.bonusBleed + obelisk.bonusBleed; + case TowerType.ParticleCannon: + return global.bonusBleed + particleCannon.bonusBleed; + case TowerType.Shredder: + return global.bonusBleed + shredder.bonusBleed; + case TowerType.Encampment: + return global.bonusBleed + encampment.bonusBleed; + case TowerType.Lookout: + return global.bonusBleed + lookout.bonusBleed; + default: + Debug.Log("Failed to get global bonus"); + return 0f; + } + } + + public float GetBonusBurn(TowerType type) + { + switch (type) + { + case TowerType.Crossbow: + return global.bonusBurn + crossbow.bonusBurn; + case TowerType.Morter: + return global.bonusBurn + morter.bonusBurn; + case TowerType.TeslaCoil: + return global.bonusBurn + teslaCoil.bonusBurn; + case TowerType.FlameThrower: + return global.bonusBurn + flameThrower.bonusBurn; + case TowerType.PoisonSprayer: + return global.bonusBurn + poisonSprayer.bonusBurn; + case TowerType.Frost: + return global.bonusBurn + frostKeep.bonusBurn; + case TowerType.Radar: + return global.bonusBurn + radar.bonusBurn; + case TowerType.Obelisk: + return global.bonusBurn + obelisk.bonusBurn; + case TowerType.ParticleCannon: + return global.bonusBurn + particleCannon.bonusBurn; + case TowerType.Shredder: + return global.bonusBurn + shredder.bonusBurn; + case TowerType.Encampment: + return global.bonusBurn + encampment.bonusBurn; + case TowerType.Lookout: + return global.bonusBurn + lookout.bonusBurn; + default: + Debug.Log("Failed to get global bonus"); + return 0f; + } + } + + public float GetBonusPoison(TowerType type) + { + switch (type) + { + case TowerType.Crossbow: + return global.bonusPoison + crossbow.bonusPoison; + case TowerType.Morter: + return global.bonusPoison + morter.bonusPoison; + case TowerType.TeslaCoil: + return global.bonusPoison + teslaCoil.bonusPoison; + case TowerType.FlameThrower: + return global.bonusPoison + flameThrower.bonusPoison; + case TowerType.PoisonSprayer: + return global.bonusPoison + poisonSprayer.bonusPoison; + case TowerType.Frost: + return global.bonusPoison + frostKeep.bonusPoison; + case TowerType.Radar: + return global.bonusPoison + radar.bonusPoison; + case TowerType.Obelisk: + return global.bonusPoison + obelisk.bonusPoison; + case TowerType.ParticleCannon: + return global.bonusPoison + particleCannon.bonusPoison; + case TowerType.Shredder: + return global.bonusPoison + shredder.bonusPoison; + case TowerType.Encampment: + return global.bonusPoison + encampment.bonusPoison; + case TowerType.Lookout: + return global.bonusPoison + lookout.bonusPoison; + default: + Debug.Log("Failed to get global bonus"); + return 0f; + } + } + + public float GetBonusBlast(TowerType type) + { + switch (type) + { + case TowerType.Crossbow: + return global.bonusBlast + crossbow.bonusBlast; + case TowerType.Morter: + return global.bonusBlast + morter.bonusBlast; + case TowerType.TeslaCoil: + return global.bonusBlast + teslaCoil.bonusBlast; + case TowerType.FlameThrower: + return global.bonusBlast + flameThrower.bonusBlast; + case TowerType.PoisonSprayer: + return global.bonusBlast + poisonSprayer.bonusBlast; + case TowerType.Frost: + return global.bonusBlast + frostKeep.bonusBlast; + case TowerType.Radar: + return global.bonusBlast + radar.bonusBlast; + case TowerType.Obelisk: + return global.bonusBlast + obelisk.bonusBlast; + case TowerType.ParticleCannon: + return global.bonusBlast + particleCannon.bonusBlast; + case TowerType.Shredder: + return global.bonusBlast + shredder.bonusBlast; + case TowerType.Encampment: + return global.bonusBlast + encampment.bonusBlast; + case TowerType.Lookout: + return global.bonusBlast + lookout.bonusBlast; + default: + Debug.Log("Failed to get global bonus"); + return 0f; + } + } + + public void AddManaConsumption(TowerType type, float value) + { + switch (type) + { + case TowerType.Crossbow: + crossbow.AddManaAddition(value); + break; + case TowerType.Morter: + morter.AddManaAddition(value); + break; + case TowerType.TeslaCoil: + teslaCoil.AddManaAddition(value); + break; + case TowerType.FlameThrower: + flameThrower.AddManaAddition(value); + break; + case TowerType.PoisonSprayer: + poisonSprayer.AddManaAddition(value); + break; + case TowerType.Frost: + frostKeep.AddManaAddition(value); + break; + case TowerType.Radar: + radar.AddManaAddition(value); + break; + case TowerType.Obelisk: + obelisk.AddManaAddition(value); + break; + case TowerType.ParticleCannon: + particleCannon.AddManaAddition(value); + break; + case TowerType.Shredder: + shredder.AddManaAddition(value); + break; + case TowerType.Encampment: + encampment.AddManaAddition(value); + break; + case TowerType.Lookout: + lookout.AddManaAddition(value); + break; + case TowerType.Global: + global.AddManaAddition(value); + UpdateAllTowers(); + break; + default: + Debug.Log("Failed to set global bonus"); + break; + } + } + + public void AddCritChance(TowerType type, float value) + { + switch (type) + { + case TowerType.Crossbow: + crossbow.AddCritChance(value); + break; + case TowerType.Morter: + morter.AddCritChance(value); + break; + case TowerType.TeslaCoil: + teslaCoil.AddCritChance(value); + break; + case TowerType.FlameThrower: + flameThrower.AddCritChance(value); + break; + case TowerType.PoisonSprayer: + poisonSprayer.AddCritChance(value); + break; + case TowerType.Frost: + frostKeep.AddCritChance(value); + break; + case TowerType.Radar: + radar.AddCritChance(value); + break; + case TowerType.Obelisk: + obelisk.AddCritChance(value); + break; + case TowerType.ParticleCannon: + particleCannon.AddCritChance(value); + break; + case TowerType.Shredder: + shredder.AddCritChance(value); + break; + case TowerType.Encampment: + encampment.AddCritChance(value); + break; + case TowerType.Lookout: + lookout.AddCritChance(value); + break; + case TowerType.Global: + global.AddCritChance(value); + UpdateAllTowers(); + break; + default: + Debug.Log("Failed to set global bonus"); + break; + } + } + + public void AddStunChance(TowerType type, float value) + { + switch (type) + { + case TowerType.Crossbow: + crossbow.AddStunChance(value); + break; + case TowerType.Morter: + morter.AddStunChance(value); + break; + case TowerType.TeslaCoil: + teslaCoil.AddStunChance(value); + break; + case TowerType.FlameThrower: + flameThrower.AddStunChance(value); + break; + case TowerType.PoisonSprayer: + poisonSprayer.AddStunChance(value); + break; + case TowerType.Frost: + frostKeep.AddStunChance(value); + break; + case TowerType.Radar: + radar.AddStunChance(value); + break; + case TowerType.Obelisk: + obelisk.AddStunChance(value); + break; + case TowerType.ParticleCannon: + particleCannon.AddStunChance(value); + break; + case TowerType.Shredder: + shredder.AddStunChance(value); + break; + case TowerType.Encampment: + encampment.AddStunChance(value); + break; + case TowerType.Lookout: + lookout.AddStunChance(value); + break; + case TowerType.Global: + global.AddStunChance(value); + UpdateAllTowers(); + break; + default: + Debug.Log("Failed to set global bonus"); + break; + } + } + + public void AddCritChanceLevelMultiplier(TowerType type, float value) + { + switch (type) + { + case TowerType.Crossbow: + crossbow.AddCritChanceLevelMultiplier(value); + break; + case TowerType.Morter: + morter.AddCritChanceLevelMultiplier(value); + break; + case TowerType.TeslaCoil: + teslaCoil.AddCritChanceLevelMultiplier(value); + break; + case TowerType.FlameThrower: + flameThrower.AddCritChanceLevelMultiplier(value); + break; + case TowerType.PoisonSprayer: + poisonSprayer.AddCritChanceLevelMultiplier(value); + break; + case TowerType.Frost: + frostKeep.AddCritChanceLevelMultiplier(value); + break; + case TowerType.Radar: + radar.AddCritChanceLevelMultiplier(value); + break; + case TowerType.Obelisk: + obelisk.AddCritChanceLevelMultiplier(value); + break; + case TowerType.ParticleCannon: + particleCannon.AddCritChanceLevelMultiplier(value); + break; + case TowerType.Shredder: + shredder.AddCritChanceLevelMultiplier(value); + break; + case TowerType.Encampment: + encampment.AddCritChanceLevelMultiplier(value); + break; + case TowerType.Lookout: + lookout.AddCritChanceLevelMultiplier(value); + break; + case TowerType.Global: + global.AddCritChanceLevelMultiplier(value); + UpdateAllTowers(); + break; + default: + Debug.Log("Failed to set global bonus"); + break; + } + } + + public void AddBonusRange(TowerType type, float value) + { + switch (type) + { + case TowerType.Crossbow: + crossbow.AddBonusRange(value); + break; + case TowerType.Morter: + morter.AddBonusRange(value); + break; + case TowerType.TeslaCoil: + teslaCoil.AddBonusRange(value); + break; + case TowerType.FlameThrower: + flameThrower.AddBonusRange(value); + break; + case TowerType.PoisonSprayer: + poisonSprayer.AddBonusRange(value); + break; + case TowerType.Frost: + frostKeep.AddBonusRange(value); + break; + case TowerType.Radar: + radar.AddBonusRange(value); + break; + case TowerType.Obelisk: + obelisk.AddBonusRange(value); + break; + case TowerType.ParticleCannon: + particleCannon.AddBonusRange(value); + break; + case TowerType.Shredder: + shredder.AddBonusRange(value); + break; + case TowerType.Encampment: + encampment.AddBonusRange(value); + break; + case TowerType.Lookout: + lookout.AddBonusRange(value); + break; + case TowerType.Global: + global.AddBonusRange(value); + UpdateAllTowers(); + break; + default: + Debug.Log("Failed to set global bonus"); + break; + } + } + + public void AddBonusBaseDamage(TowerType type, int value) + { + switch (type) + { + case TowerType.Crossbow: + crossbow.AddBonusBaseDamage(value); + break; + case TowerType.Morter: + morter.AddBonusBaseDamage(value); + break; + case TowerType.TeslaCoil: + teslaCoil.AddBonusBaseDamage(value); + break; + case TowerType.FlameThrower: + flameThrower.AddBonusBaseDamage(value); + break; + case TowerType.PoisonSprayer: + poisonSprayer.AddBonusBaseDamage(value); + break; + case TowerType.Frost: + frostKeep.AddBonusBaseDamage(value); + break; + case TowerType.Radar: + radar.AddBonusBaseDamage(value); + break; + case TowerType.Obelisk: + obelisk.AddBonusBaseDamage(value); + break; + case TowerType.ParticleCannon: + particleCannon.AddBonusBaseDamage(value); + break; + case TowerType.Shredder: + shredder.AddBonusBaseDamage(value); + break; + case TowerType.Encampment: + encampment.AddBonusBaseDamage(value); + break; + case TowerType.Lookout: + lookout.AddBonusBaseDamage(value); + break; + case TowerType.Global: + global.AddBonusBaseDamage(value); + UpdateAllTowers(); + break; + default: + Debug.Log("Failed to set global bonus"); + break; + } + } + + public void AddBonusHealthDamage(TowerType type, int value) + { + switch (type) + { + case TowerType.Crossbow: + crossbow.AddBonusHealthDamage(value); + break; + case TowerType.Morter: + morter.AddBonusHealthDamage(value); + break; + case TowerType.TeslaCoil: + teslaCoil.AddBonusHealthDamage(value); + break; + case TowerType.FlameThrower: + flameThrower.AddBonusHealthDamage(value); + break; + case TowerType.PoisonSprayer: + poisonSprayer.AddBonusHealthDamage(value); + break; + case TowerType.Frost: + frostKeep.AddBonusHealthDamage(value); + break; + case TowerType.Radar: + radar.AddBonusHealthDamage(value); + break; + case TowerType.Obelisk: + obelisk.AddBonusHealthDamage(value); + break; + case TowerType.ParticleCannon: + particleCannon.AddBonusHealthDamage(value); + break; + case TowerType.Shredder: + shredder.AddBonusHealthDamage(value); + break; + case TowerType.Encampment: + encampment.AddBonusHealthDamage(value); + break; + case TowerType.Lookout: + lookout.AddBonusHealthDamage(value); + break; + case TowerType.Global: + global.AddBonusHealthDamage(value); + UpdateAllTowers(); + break; + default: + Debug.Log("Failed to set global bonus"); + break; + } + } + + public void AddBonusArmorDamage(TowerType type, int value) + { + switch (type) + { + case TowerType.Crossbow: + crossbow.AddBonusArmorDamage(value); + break; + case TowerType.Morter: + morter.AddBonusArmorDamage(value); + break; + case TowerType.TeslaCoil: + teslaCoil.AddBonusArmorDamage(value); + break; + case TowerType.FlameThrower: + flameThrower.AddBonusArmorDamage(value); + break; + case TowerType.PoisonSprayer: + poisonSprayer.AddBonusArmorDamage(value); + break; + case TowerType.Frost: + frostKeep.AddBonusArmorDamage(value); + break; + case TowerType.Radar: + radar.AddBonusArmorDamage(value); + break; + case TowerType.Obelisk: + obelisk.AddBonusArmorDamage(value); + break; + case TowerType.ParticleCannon: + particleCannon.AddBonusArmorDamage(value); + break; + case TowerType.Shredder: + shredder.AddBonusArmorDamage(value); + break; + case TowerType.Encampment: + encampment.AddBonusArmorDamage(value); + break; + case TowerType.Lookout: + lookout.AddBonusArmorDamage(value); + break; + case TowerType.Global: + global.AddBonusArmorDamage(value); + UpdateAllTowers(); + break; + default: + Debug.Log("Failed to set global bonus"); + break; + } + } + + public void AddBonusShieldDamage(TowerType type, int value) + { + switch (type) + { + case TowerType.Crossbow: + crossbow.AddBonusShieldDamage(value); + break; + case TowerType.Morter: + morter.AddBonusShieldDamage(value); + break; + case TowerType.TeslaCoil: + teslaCoil.AddBonusShieldDamage(value); + break; + case TowerType.FlameThrower: + flameThrower.AddBonusShieldDamage(value); + break; + case TowerType.PoisonSprayer: + poisonSprayer.AddBonusShieldDamage(value); + break; + case TowerType.Frost: + frostKeep.AddBonusShieldDamage(value); + break; + case TowerType.Radar: + radar.AddBonusShieldDamage(value); + break; + case TowerType.Obelisk: + obelisk.AddBonusShieldDamage(value); + break; + case TowerType.ParticleCannon: + particleCannon.AddBonusShieldDamage(value); + break; + case TowerType.Shredder: + shredder.AddBonusShieldDamage(value); + break; + case TowerType.Encampment: + encampment.AddBonusShieldDamage(value); + break; + case TowerType.Lookout: + lookout.AddBonusShieldDamage(value); + break; + case TowerType.Global: + global.AddBonusShieldDamage(value); + UpdateAllTowers(); + break; + default: + Debug.Log("Failed to set global bonus"); + break; + } + } + + public void AddBonusSlow(TowerType type, float value) + { + switch (type) + { + case TowerType.Crossbow: + crossbow.AddBonusSlow(value); + break; + case TowerType.Morter: + morter.AddBonusSlow(value); + break; + case TowerType.TeslaCoil: + teslaCoil.AddBonusSlow(value); + break; + case TowerType.FlameThrower: + flameThrower.AddBonusSlow(value); + break; + case TowerType.PoisonSprayer: + poisonSprayer.AddBonusSlow(value); + break; + case TowerType.Frost: + frostKeep.AddBonusSlow(value); + break; + case TowerType.Radar: + radar.AddBonusSlow(value); + break; + case TowerType.Obelisk: + obelisk.AddBonusSlow(value); + break; + case TowerType.ParticleCannon: + particleCannon.AddBonusSlow(value); + break; + case TowerType.Shredder: + shredder.AddBonusSlow(value); + break; + case TowerType.Encampment: + encampment.AddBonusSlow(value); + break; + case TowerType.Lookout: + lookout.AddBonusSlow(value); + break; + case TowerType.Global: + global.AddBonusSlow(value); + UpdateAllTowers(); + break; + default: + Debug.Log("Failed to set global bonus"); + break; + } + } + + public void AddBonusBleed(TowerType type, float value) + { + switch (type) + { + case TowerType.Crossbow: + crossbow.AddBonusBleed(value); + break; + case TowerType.Morter: + morter.AddBonusBleed(value); + break; + case TowerType.TeslaCoil: + teslaCoil.AddBonusBleed(value); + break; + case TowerType.FlameThrower: + flameThrower.AddBonusBleed(value); + break; + case TowerType.PoisonSprayer: + poisonSprayer.AddBonusBleed(value); + break; + case TowerType.Frost: + frostKeep.AddBonusBleed(value); + break; + case TowerType.Radar: + radar.AddBonusBleed(value); + break; + case TowerType.Obelisk: + obelisk.AddBonusBleed(value); + break; + case TowerType.ParticleCannon: + particleCannon.AddBonusBleed(value); + break; + case TowerType.Shredder: + shredder.AddBonusBleed(value); + break; + case TowerType.Encampment: + encampment.AddBonusBleed(value); + break; + case TowerType.Lookout: + lookout.AddBonusBleed(value); + break; + case TowerType.Global: + global.AddBonusBleed(value); + UpdateAllTowers(); + break; + default: + Debug.Log("Failed to set global bonus"); + break; + } + } + + public void AddBonusBurn(TowerType type, float value) + { + switch (type) + { + case TowerType.Crossbow: + crossbow.AddBonusBurn(value); + break; + case TowerType.Morter: + morter.AddBonusBurn(value); + break; + case TowerType.TeslaCoil: + teslaCoil.AddBonusBurn(value); + break; + case TowerType.FlameThrower: + flameThrower.AddBonusBurn(value); + break; + case TowerType.PoisonSprayer: + poisonSprayer.AddBonusBurn(value); + break; + case TowerType.Frost: + frostKeep.AddBonusBurn(value); + break; + case TowerType.Radar: + radar.AddBonusBurn(value); + break; + case TowerType.Obelisk: + obelisk.AddBonusBurn(value); + break; + case TowerType.ParticleCannon: + particleCannon.AddBonusBurn(value); + break; + case TowerType.Shredder: + shredder.AddBonusBurn(value); + break; + case TowerType.Encampment: + encampment.AddBonusBurn(value); + break; + case TowerType.Lookout: + lookout.AddBonusBurn(value); + break; + case TowerType.Global: + global.AddBonusBurn(value); + UpdateAllTowers(); + break; + default: + Debug.Log("Failed to set global bonus"); + break; + } + } + + public void AddBonusPoison(TowerType type, float value) + { + switch (type) + { + case TowerType.Crossbow: + crossbow.AddBonusPoison(value); + break; + case TowerType.Morter: + morter.AddBonusPoison(value); + break; + case TowerType.TeslaCoil: + teslaCoil.AddBonusPoison(value); + break; + case TowerType.FlameThrower: + flameThrower.AddBonusPoison(value); + break; + case TowerType.PoisonSprayer: + poisonSprayer.AddBonusPoison(value); + break; + case TowerType.Frost: + frostKeep.AddBonusPoison(value); + break; + case TowerType.Radar: + radar.AddBonusPoison(value); + break; + case TowerType.Obelisk: + obelisk.AddBonusPoison(value); + break; + case TowerType.ParticleCannon: + particleCannon.AddBonusPoison(value); + break; + case TowerType.Shredder: + shredder.AddBonusPoison(value); + break; + case TowerType.Encampment: + encampment.AddBonusPoison(value); + break; + case TowerType.Lookout: + lookout.AddBonusPoison(value); + break; + case TowerType.Global: + global.AddBonusPoison(value); + UpdateAllTowers(); + break; + default: + Debug.Log("Failed to set global bonus"); + break; + } + } + + public void AddBonusBlast(TowerType type, float value) + { + switch (type) + { + case TowerType.Crossbow: + crossbow.AddBonusBlast(value); + break; + case TowerType.Morter: + morter.AddBonusBlast(value); + break; + case TowerType.TeslaCoil: + teslaCoil.AddBonusBlast(value); + break; + case TowerType.FlameThrower: + flameThrower.AddBonusBlast(value); + break; + case TowerType.PoisonSprayer: + poisonSprayer.AddBonusBlast(value); + break; + case TowerType.Frost: + frostKeep.AddBonusBlast(value); + break; + case TowerType.Radar: + radar.AddBonusBlast(value); + break; + case TowerType.Obelisk: + obelisk.AddBonusBlast(value); + break; + case TowerType.ParticleCannon: + particleCannon.AddBonusBlast(value); + break; + case TowerType.Shredder: + shredder.AddBonusBlast(value); + break; + case TowerType.Encampment: + encampment.AddBonusBlast(value); + break; + case TowerType.Lookout: + lookout.AddBonusBlast(value); + break; + case TowerType.Global: + global.AddBonusBlast(value); + UpdateAllTowers(); + break; + default: + Debug.Log("Failed to set global bonus"); + break; + } + } +} diff --git a/Assembly_CSharp/Tower/TowerType.cs b/Assembly_CSharp/Tower/TowerType.cs new file mode 100644 index 0000000..9bbc242 --- /dev/null +++ b/Assembly_CSharp/Tower/TowerType.cs @@ -0,0 +1,18 @@ +public enum TowerType +{ + Crossbow, + Morter, + TeslaCoil, + Frost, + Obelisk, + FlameThrower, + PoisonSprayer, + Siphon, + Radar, + ParticleCannon, + DOT, + Global, + Shredder, + Encampment, + Lookout +} -- cgit v1.1-26-g67d0