namespace Luneraria.Core { /// /// Every tunable number of Champions of Luneraria (reference: lune_balance.gd with /// data/luneraria/balance_default.tres). Tests may use variants; bots never get extras. /// public sealed class LuneBalance { // Simulation /// Fixed combat step in seconds (20 steps per second of combat time). public double SimStep = 0.05; /// Ends only the current combat phase, never the match. public double CombatTimeLimit = 180.0; public double MarchSpeedFactor = 1.6; public double AggroRadius = 7.0; /// Targets further away than this are dropped and re-acquired. public double LeashRadius = 10.0; public double LaneHalfWidth = 2.6; // Economy public int StartGold = 220; public int BaseIncome = 70; public int IncomePerRound = 4; public int IncomeGrowthCap = 80; public int SupplyCap = 12; public double SellRefund = 0.75; /// Share of lane kill gold for the lane player; the rest splits evenly in the team. public double LaneShare = 0.5; // Waves public int WaveBaseCount = 3; /// One more monster per lane every N rounds, up to WaveMaxCount. public int WaveCountEvery = 3; public int WaveMaxCount = 7; public double WaveHpGrowth = 0.11; public double WaveDamageGrowth = 0.07; public double WaveGrowthQuadratic = 0.0015; public double MonsterBountyScale = 2.0; public double BountyGrowth = 0.04; /// Monster types in rotation order; later indices unlock later. public string[] MonsterPool = { "e01", "e02", "e04", "e03", "e06", "e05" }; // Buildings public double TowerOuterHp = 6000.0; public double TowerInnerHp = 7500.0; public double BaseTowerHp = 9000.0; public double CoreHp = 12000.0; public double TowerDamage = 90.0; public double BaseTowerDamage = 120.0; /// Must exceed the longest unit reach (6.5 m + building radius). public double TowerRange = 8.6; public double TowerAttackInterval = 1.0; public double BuildingRadius = 1.3; public int BountyOuterTower = 150; public int BountyInnerTower = 210; public int BountyBaseTower = 270; // Map public double InnerTowerFraction = 0.17; public double OuterTowerFraction = 0.35; public double TowerSideOffset = 3.4; // S1: extended rules (MatchOptions.Extended; the reference rules ignore all of these). /// Legion TD 2: a booked attack champion raises the booker's income by cost / this, for good. public int ChampionIncomeDivisor = 12; /// S3: share of a champion's bounty the defenders get under the extended rules (Legion TD 2: less than the send costs). public double ChampionBountyShare = 0.5; /// Dota 2 barracks: waves of a team on a lane whose enemy inner tower fell get stronger. public double BarracksBoost = 0.25; public int BarracksExtraMonsters = 1; /// Dota 2 buyback, adapted: a fallen hero starts the next combat exhausted, unless bought back. public double ExhaustedHp = 0.6; public int BuybackBase = 60; public int BuybackPerLevel = 20; /// League of Legends dragon souls: each grotto victory blesses the team, up to the soul. public double BlessingStep = 0.04; public int BlessingMax = 4; /// Moon soul (all stacks): heroes regenerate this share of their health per second. public double SoulRegen = 0.01; // S2: extended rules. /// Dota 2 glyph: a planned lane's towers turn invulnerable for this long once one falls below half health. public double GlyphSeconds = 5.0; public double GlyphThreshold = 0.5; public int GlyphCooldown = 4; /// Legion TD 2 king: Ancient levels bought by the team's players; price per level, attack and repair per level. public int CoreLevelMax = 3; public int CoreLevelPrice = 150; public double[] CoreDamage = { 0.0, 45.0, 75.0, 110.0 }; public double CoreRange = 7.5; public double CoreRepair = 1000.0; public static LuneBalance Default() { return new LuneBalance(); } public int CoreUpgradeCost(int level) { return CoreLevelPrice * (level + 1); } public int BuybackCost(int level) { return BuybackBase + BuybackPerLevel * level; } public int RoundIncome(int roundNumber) { return BaseIncome + GdMath.Min(IncomeGrowthCap, IncomePerRound * GdMath.Max(0, roundNumber - 1)); } } }