champions-of-luneraria/Assets/Luneraria/Core/Content/LuneBalance.cs
Martin Stickelbroeck 8e4b52f4ab S1 Strategie-Regeln nach Legion TD 2, Dota 2 und League of Legends
Hinter MatchOptions.Extended (Standard im Spiel, Schalter im Startbildschirm):
Söldner-Einkommen (Angriffschampion +Preis/12 Einkommen dauerhaft), Kasernen
(gefallener innerer Turm: Gegnerwellen +25 % und ein Monster mehr), Erschöpfung
und Rückkauf (60 % Leben, Rückkauf 60 + 20 x Stufe), Mondsegen (Grottensieg
+4 % je Stapel, Mondseele bei 4). Bots wählen mit erweiterten Regeln auch
Sylvara und kaufen Helden zurück. Netz überträgt Regeln und neue Zustände.
HUD: Einkommen, Kasernen-Symbol, Rückkauf, Segen im Teamkopf.
Kern 531/531 (s1 31), EditMode 31/31, PlayMode 16/16, Verify 718/0,
Selbsttest 30/30, Golden 0 Abweichungen, Fingerabdruck unverändert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 12:18:47 +02:00

88 lines
4 KiB
C#

namespace Luneraria.Core
{
/// <summary>
/// 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.
/// </summary>
public sealed class LuneBalance
{
// Simulation
/// <summary>Fixed combat step in seconds (20 steps per second of combat time).</summary>
public double SimStep = 0.05;
/// <summary>Ends only the current combat phase, never the match.</summary>
public double CombatTimeLimit = 180.0;
public double MarchSpeedFactor = 1.6;
public double AggroRadius = 7.0;
/// <summary>Targets further away than this are dropped and re-acquired.</summary>
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;
/// <summary>Share of lane kill gold for the lane player; the rest splits evenly in the team.</summary>
public double LaneShare = 0.5;
// Waves
public int WaveBaseCount = 3;
/// <summary>One more monster per lane every N rounds, up to WaveMaxCount.</summary>
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;
/// <summary>Monster types in rotation order; later indices unlock later.</summary>
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;
/// <summary>Must exceed the longest unit reach (6.5 m + building radius).</summary>
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).
/// <summary>Legion TD 2: a booked attack champion raises the booker's income by cost / this, for good.</summary>
public int ChampionIncomeDivisor = 12;
/// <summary>Dota 2 barracks: waves of a team on a lane whose enemy inner tower fell get stronger.</summary>
public double BarracksBoost = 0.25;
public int BarracksExtraMonsters = 1;
/// <summary>Dota 2 buyback, adapted: a fallen hero starts the next combat exhausted, unless bought back.</summary>
public double ExhaustedHp = 0.6;
public int BuybackBase = 60;
public int BuybackPerLevel = 20;
/// <summary>League of Legends dragon souls: each grotto victory blesses the team, up to the soul.</summary>
public double BlessingStep = 0.04;
public int BlessingMax = 4;
/// <summary>Moon soul (all stacks): heroes regenerate this share of their health per second.</summary>
public double SoulRegen = 0.01;
public static LuneBalance Default() { return new LuneBalance(); }
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));
}
}
}