implement additional tower

This commit is contained in:
2026-05-27 20:42:44 +02:00
parent 432dd57d07
commit d1a90e498f
17 changed files with 1569 additions and 3922 deletions
+131 -3
View File
@@ -6,6 +6,9 @@ using UnityEngine.UI;
public class UpgradeManager : MonoBehaviour
{
const string SelectedTowerKey = "SelectedTower";
const string TeslaTowerId = "tesla";
enum FreeUpgradeType
{
KillBonus,
@@ -77,6 +80,35 @@ public class UpgradeManager : MonoBehaviour
Card(UpgradeCard.UpgradeType.ApocalypseRound, "APOCALYPSE ROUND", "Every 20th shot fires an enormous extreme-damage shell.", "Legendary", 1, 14),
};
static readonly CardDefinition[] TeslaCards =
{
Card(UpgradeCard.UpgradeType.HighVoltageCoils, "HIGH VOLTAGE COILS", "Lightning Damage +12%.", "Common", 8, 3),
Card(UpgradeCard.UpgradeType.RapidCapacitors, "RAPID CAPACITORS", "Attack Speed +10%.", "Common", 8, 3),
Card(UpgradeCard.UpgradeType.ConductiveReach, "CONDUCTIVE REACH", "Tower Range +15%.", "Common", 5, 3),
Card(UpgradeCard.UpgradeType.ArcStability, "ARC STABILITY", "Chain damage falloff reduced.", "Uncommon", 5, 5),
Card(UpgradeCard.UpgradeType.OverclockedWiring, "OVERCLOCKED WIRING", "Attack Speed +18%, Range -8%.", "Uncommon", 4, 5),
Card(UpgradeCard.UpgradeType.ExtendedArc, "EXTENDED ARC", "Lightning chains to +1 additional enemy.", "Rare", 6, 7),
Card(UpgradeCard.UpgradeType.ForkedLightning, "FORKED LIGHTNING", "Each chain has a 20% chance to split into another nearby enemy.", "Rare", 4, 7),
Card(UpgradeCard.UpgradeType.ArcBounce, "ARC BOUNCE", "Chains can bounce back to previously hit enemies for reduced damage.", "Epic", 2, 10),
Card(UpgradeCard.UpgradeType.StormCurrent, "STORM CURRENT", "Chain distance increased significantly.", "Uncommon", 4, 5),
Card(UpgradeCard.UpgradeType.Superconductor, "SUPERCONDUCTOR", "If only one enemy is hit, damage massively increases.", "Epic", 3, 10),
Card(UpgradeCard.UpgradeType.StaticCharge, "STATIC CHARGE", "Hit enemies are slowed by 10%.", "Common", 5, 3),
Card(UpgradeCard.UpgradeType.ParalysisField, "PARALYSIS FIELD", "Repeated hits briefly stun enemies.", "Epic", 2, 10),
Card(UpgradeCard.UpgradeType.IonizedArmor, "IONIZED ARMOR", "Shocked enemies take increased damage from all sources.", "Rare", 4, 7),
Card(UpgradeCard.UpgradeType.ResidualCurrent, "RESIDUAL CURRENT", "Enemies continue taking electrical damage over time after being shocked.", "Rare", 5, 7),
Card(UpgradeCard.UpgradeType.EmpSurge, "EMP SURGE", "Every 20 attacks emits a large pulse damaging all nearby enemies.", "Epic", 3, 10),
Card(UpgradeCard.UpgradeType.CapacitorBanks, "CAPACITOR BANKS", "Consecutive attacks without interruption gain stacking damage.", "Rare", 4, 7),
Card(UpgradeCard.UpgradeType.EnergyOverflow, "ENERGY OVERFLOW", "Excess damage from kills transfers into the next chain.", "Rare", 3, 7),
Card(UpgradeCard.UpgradeType.FeedbackLoop, "FEEDBACK LOOP", "Each chained enemy slightly reduces reload time for the next shot.", "Rare", 5, 7),
Card(UpgradeCard.UpgradeType.UnstablePlasma, "UNSTABLE PLASMA", "Critical strikes create mini lightning explosions.", "Epic", 3, 10),
Card(UpgradeCard.UpgradeType.TeslaField, "TESLA FIELD", "Creates a passive electric field around the tower damaging nearby enemies.", "Epic", 3, 10),
Card(UpgradeCard.UpgradeType.MagneticStorm, "MAGNETIC STORM", "Shocked enemies slightly pull nearby enemies toward them.", "Epic", 2, 10),
Card(UpgradeCard.UpgradeType.VoltageCollapse, "VOLTAGE COLLAPSE", "Enemies killed by lightning explode in a small electrical burst.", "Rare", 4, 7),
Card(UpgradeCard.UpgradeType.MeltdownCore, "MELTDOWN CORE", "Massive damage increase, but occasional self-stun after firing.", "Legendary", 2, 14),
Card(UpgradeCard.UpgradeType.InfiniteArc, "INFINITE ARC", "Chains no longer have a maximum target count while damage keeps decaying.", "Legendary", 1, 14),
Card(UpgradeCard.UpgradeType.StormbringerProtocol, "STORMBRINGER PROTOCOL", "During high enemy density, attack speed ramps up dramatically.", "Legendary", 1, 14),
};
void Start()
{
InitializeUpgrades();
@@ -142,7 +174,7 @@ public class UpgradeManager : MonoBehaviour
void InitializeUpgrades()
{
foreach (CardDefinition card in CannonCards)
foreach (CardDefinition card in GetActiveCards())
{
if (!upgradeLevels.ContainsKey(card.type))
upgradeLevels[card.type] = 0;
@@ -154,7 +186,7 @@ public class UpgradeManager : MonoBehaviour
List<UpgradeOffer> BuildOffers(bool guaranteeEpicOrHigher)
{
List<UpgradeOffer> paidOffers = new List<UpgradeOffer>();
foreach (CardDefinition card in CannonCards)
foreach (CardDefinition card in GetActiveCards())
{
int cost = upgradeCosts[card.type];
if (bits < cost || IsAtMaxStacks(card.type))
@@ -518,6 +550,86 @@ public class UpgradeManager : MonoBehaviour
case UpgradeCard.UpgradeType.ApocalypseRound:
tower.apocalypseRound = true;
break;
case UpgradeCard.UpgradeType.HighVoltageCoils:
tower.teslaDamageMultiplier *= 1.12f;
break;
case UpgradeCard.UpgradeType.RapidCapacitors:
tower.fireRate *= 0.9f;
break;
case UpgradeCard.UpgradeType.ConductiveReach:
tower.attackRange *= 1.15f;
break;
case UpgradeCard.UpgradeType.ArcStability:
tower.teslaChainFalloff = Mathf.Min(0.94f, tower.teslaChainFalloff + 0.045f);
break;
case UpgradeCard.UpgradeType.OverclockedWiring:
tower.fireRate *= 0.82f;
tower.attackRange *= 0.92f;
break;
case UpgradeCard.UpgradeType.ExtendedArc:
tower.teslaChainCount++;
break;
case UpgradeCard.UpgradeType.ForkedLightning:
tower.teslaForkChance += 0.2f;
break;
case UpgradeCard.UpgradeType.ArcBounce:
tower.teslaArcBounce = true;
tower.teslaChainFalloff = Mathf.Min(0.96f, tower.teslaChainFalloff + 0.04f);
break;
case UpgradeCard.UpgradeType.StormCurrent:
tower.teslaChainRange *= 1.28f;
break;
case UpgradeCard.UpgradeType.Superconductor:
tower.teslaSuperconductorStacks++;
break;
case UpgradeCard.UpgradeType.StaticCharge:
tower.teslaSlowMultiplier = Mathf.Min(tower.teslaSlowMultiplier, Mathf.Max(0.45f, 0.9f - 0.06f * upgradeLevels[type]));
tower.teslaSlowDuration = Mathf.Max(tower.teslaSlowDuration, 1.5f);
break;
case UpgradeCard.UpgradeType.ParalysisField:
tower.teslaParalysisStacks++;
break;
case UpgradeCard.UpgradeType.IonizedArmor:
tower.teslaIonizedBonus += 0.12f;
break;
case UpgradeCard.UpgradeType.ResidualCurrent:
tower.teslaResidualDamageMultiplier += 0.14f;
break;
case UpgradeCard.UpgradeType.EmpSurge:
tower.teslaEmpSurgeStacks++;
break;
case UpgradeCard.UpgradeType.CapacitorBanks:
tower.teslaCapacitorBankStacks++;
break;
case UpgradeCard.UpgradeType.EnergyOverflow:
tower.teslaEnergyOverflow = true;
tower.teslaDamageMultiplier *= 1.06f;
break;
case UpgradeCard.UpgradeType.FeedbackLoop:
tower.teslaFeedbackLoopMultiplier += 0.025f;
break;
case UpgradeCard.UpgradeType.UnstablePlasma:
tower.teslaCriticalExplosionChance += 0.12f;
break;
case UpgradeCard.UpgradeType.TeslaField:
tower.teslaFieldStacks++;
break;
case UpgradeCard.UpgradeType.MagneticStorm:
tower.teslaMagneticPull += 0.08f;
break;
case UpgradeCard.UpgradeType.VoltageCollapse:
tower.teslaVoltageCollapseMultiplier += 0.22f;
break;
case UpgradeCard.UpgradeType.MeltdownCore:
tower.teslaMeltdownStacks++;
tower.teslaDamageMultiplier *= 1.55f;
break;
case UpgradeCard.UpgradeType.InfiniteArc:
tower.teslaInfiniteArc = true;
break;
case UpgradeCard.UpgradeType.StormbringerProtocol:
tower.teslaStormbringerProtocol = true;
break;
}
}
@@ -640,7 +752,7 @@ public class UpgradeManager : MonoBehaviour
image.color = new Color(0f, 0f, 0f, 0.74f);
image.raycastTarget = true;
string titleText = freeFallback ? "LOW BITS: CHOOSE SUPPLY BOOST" : "CHOOSE CANNON UPGRADE";
string titleText = freeFallback ? "LOW BITS: CHOOSE SUPPLY BOOST" : IsTeslaTowerSelected() ? "CHOOSE TESLA UPGRADE" : "CHOOSE CANNON UPGRADE";
TextMeshProUGUI title = CreateText("Title", rect, titleText, 28f, FontStyles.Bold, TextAlignmentOptions.Center);
RectTransform titleRect = title.rectTransform;
titleRect.anchorMin = new Vector2(0.5f, 0.5f);
@@ -682,9 +794,25 @@ public class UpgradeManager : MonoBehaviour
return card;
}
foreach (CardDefinition card in TeslaCards)
{
if (card.type == type)
return card;
}
return CannonCards[0];
}
static CardDefinition[] GetActiveCards()
{
return IsTeslaTowerSelected() ? TeslaCards : CannonCards;
}
static bool IsTeslaTowerSelected()
{
return PlayerPrefs.GetString(SelectedTowerKey, "cannon") == TeslaTowerId;
}
static RectTransform CreateRect(string name, Transform parent)
{
GameObject obj = new GameObject(name, typeof(RectTransform));