Brunhild (held_brunhild): Heldenjägerin (+25 % gegen Helden/Champions), Speerwurf markiert (+15 % erlittener Schaden), Walkürensturz (Sprung, 200 % in 3 m, 1 s Betäubung, Bosse immun, Walkürenschild 30 %), Talente, Auslöser, Skin-Eintrag Eiswalküre, Bot-Profil walkuere (nur erweitert). Neue Effektarten vulnerable und stun wirken nur durch Brunhild; Golden 0. Probe-Vergleich 50 % wie die übrigen Helden; h2 22/22. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
194 lines
27 KiB
C#
194 lines
27 KiB
C#
// <auto-generated once> by tools/port/gen_content.py from the Godot reference (luneraria/g3, 1b540f2).
|
||
// Since the port this file is the maintained source of the rule tables; ContentTests compares it
|
||
// with the exported reference in Assets/Luneraria/Tests/Core/Golden/content.json.
|
||
using System.Collections.Generic;
|
||
|
||
namespace Luneraria.Core
|
||
{
|
||
/// <summary>Rule tables of Champions of Luneraria: troops, monsters, sends, heroes, items, champions, bots.</summary>
|
||
public static partial class ContentData
|
||
{
|
||
public static readonly OrderedMap<string, UnitDef> Units = Map(
|
||
new UnitDef { Id = "g01", DisplayName = "Kohlenbeißer", Cost = 45, UpgradeId = "g02", MaxHp = 260.0, Damage = 17.0, AttackType = 0, ArmorType = 0, AttackRange = 1.1, Speed = 2.4, Ability = "g01", LeakValue = 0, Bounty = 0, AbilityDescription = "Jeder 3. Treffer: Brand, 4 Schaden/s für 3 s." },
|
||
new UnitDef { Id = "g02", DisplayName = "Schlackenklaue", Cost = 90, UpgradeId = "", MaxHp = 690.0, Damage = 44.0, AttackType = 0, ArmorType = 1, AttackRange = 1.2, Speed = 2.4, Ability = "g02", LeakValue = 0, Bounty = 0, AbilityDescription = "Jeder 3. Treffer: Brand, 12 Schaden/s für 3 s." },
|
||
new UnitDef { Id = "g03", DisplayName = "Schlackenwacht", Cost = 70, UpgradeId = "g04", MaxHp = 650.0, Damage = 11.0, AttackType = 0, ArmorType = 1, AttackRange = 1.2, Speed = 2.4, Ability = "g03", LeakValue = 0, Bounty = 0, AbilityDescription = "Erste 8 s: 15 % weniger erlittener Schaden." },
|
||
new UnitDef { Id = "g04", DisplayName = "Basaltbastion", Cost = 150, UpgradeId = "", MaxHp = 1650.0, Damage = 27.0, AttackType = 0, ArmorType = 1, AttackRange = 1.4, Speed = 2.4, Ability = "g04", LeakValue = 0, Bounty = 0, AbilityDescription = "Erste 10 s: 25 % weniger Schaden, danach 10 %." },
|
||
new UnitDef { Id = "g05", DisplayName = "Funkenlanze", Cost = 65, UpgradeId = "g06", MaxHp = 240.0, Damage = 24.0, AttackType = 1, ArmorType = 0, AttackRange = 5.5, Speed = 2.0, Ability = "g05", LeakValue = 0, Bounty = 0, AbilityDescription = "Jeder 4. Treffer: 50 % zusätzlicher Grundschaden." },
|
||
new UnitDef { Id = "g06", DisplayName = "Glasballiste", Cost = 140, UpgradeId = "", MaxHp = 640.0, Damage = 65.0, AttackType = 1, ArmorType = 0, AttackRange = 6.5, Speed = 2.0, Ability = "g06", LeakValue = 0, Bounty = 0, AbilityDescription = "Jeder 4. Treffer: 75 % zusätzlicher Grundschaden." },
|
||
new UnitDef { Id = "g07", DisplayName = "Aschenwerfer", Cost = 95, UpgradeId = "g08", MaxHp = 310.0, Damage = 23.0, AttackType = 2, ArmorType = 0, AttackRange = 4.5, Speed = 2.0, Ability = "g07", LeakValue = 0, Bounty = 0, AbilityDescription = "Jeder Treffer: 30 % Flächenschaden an bis zu 3 weiteren Zielen in 1,5 m." },
|
||
new UnitDef { Id = "g08", DisplayName = "Kraterrufer", Cost = 190, UpgradeId = "", MaxHp = 820.0, Damage = 58.0, AttackType = 2, ArmorType = 1, AttackRange = 5.0, Speed = 2.0, Ability = "g08", LeakValue = 0, Bounty = 0, AbilityDescription = "Jeder Treffer: 40 % Flächenschaden an bis zu 4 weiteren Zielen in 2 m." },
|
||
new UnitDef { Id = "g09", DisplayName = "Herdhüter", Cost = 85, UpgradeId = "g10", MaxHp = 420.0, Damage = 12.0, AttackType = 2, ArmorType = 2, AttackRange = 3.5, Speed = 2.0, Ability = "g09", LeakValue = 0, Bounty = 0, AbilityDescription = "Alle 6 s: bis zu 3 Verbündete in 3 m erhalten für 4 s +10 % Grundangriffsschaden." },
|
||
new UnitDef { Id = "g10", DisplayName = "Sonnenesse", Cost = 170, UpgradeId = "", MaxHp = 1080.0, Damage = 30.0, AttackType = 2, ArmorType = 2, AttackRange = 4.0, Speed = 2.0, Ability = "g10", LeakValue = 0, Bounty = 0, AbilityDescription = "Alle 6 s: bis zu 4 Verbündete in 4 m erhalten für 4 s +15 % Grundangriffsschaden und 45 Heilung." },
|
||
new UnitDef { Id = "w01", DisplayName = "Dornhopser", Cost = 50, UpgradeId = "w02", MaxHp = 290.0, Damage = 18.0, AttackType = 0, ArmorType = 0, AttackRange = 1.1, Speed = 2.4, Ability = "w01", LeakValue = 0, Bounty = 0, AbilityDescription = "Jeder 3. Treffer: −20 % Bewegung für 2 s." },
|
||
new UnitDef { Id = "w02", DisplayName = "Rankenschnapper", Cost = 100, UpgradeId = "", MaxHp = 800.0, Damage = 47.0, AttackType = 0, ArmorType = 1, AttackRange = 1.3, Speed = 2.4, Ability = "w02", LeakValue = 0, Bounty = 0, AbilityDescription = "Jeder 3. Treffer: −30 % Bewegung und −10 % Angriffstempo für 3 s." },
|
||
new UnitDef { Id = "w03", DisplayName = "Korkrücken", Cost = 75, UpgradeId = "w04", MaxHp = 620.0, Damage = 12.0, AttackType = 1, ArmorType = 1, AttackRange = 1.2, Speed = 2.4, Ability = "w03", LeakValue = 0, Bounty = 0, AbilityDescription = "Heilt sich alle 5 s um 35 HP, sobald er verwundet ist." },
|
||
new UnitDef { Id = "w04", DisplayName = "Ringborke", Cost = 155, UpgradeId = "", MaxHp = 1560.0, Damage = 31.0, AttackType = 1, ArmorType = 1, AttackRange = 1.4, Speed = 2.4, Ability = "w04", LeakValue = 0, Bounty = 0, AbilityDescription = "Heilt sich alle 5 s um 100 HP, sobald er verwundet ist." },
|
||
new UnitDef { Id = "w05", DisplayName = "Samenschleuder", Cost = 60, UpgradeId = "w06", MaxHp = 230.0, Damage = 23.0, AttackType = 1, ArmorType = 0, AttackRange = 5.5, Speed = 2.0, Ability = "w05", LeakValue = 0, Bounty = 0, AbilityDescription = "Jeder 4. Treffer: Keimbrand, 3 Schaden/s für 4 s." },
|
||
new UnitDef { Id = "w06", DisplayName = "Zapfenkrone", Cost = 135, UpgradeId = "", MaxHp = 630.0, Damage = 61.0, AttackType = 1, ArmorType = 0, AttackRange = 6.0, Speed = 2.0, Ability = "w06", LeakValue = 0, Bounty = 0, AbilityDescription = "Jeder 4. Treffer: Keimbrand, 10 Schaden/s für 4 s." },
|
||
new UnitDef { Id = "w07", DisplayName = "Sporenkelch", Cost = 100, UpgradeId = "w08", MaxHp = 370.0, Damage = 22.0, AttackType = 2, ArmorType = 2, AttackRange = 4.0, Speed = 2.0, Ability = "w07", LeakValue = 0, Bounty = 0, AbilityDescription = "Jeder 3. Treffer: 60 % Grundschaden an bis zu 3 weiteren Zielen in 2 m." },
|
||
new UnitDef { Id = "w08", DisplayName = "Pilzkathedrale", Cost = 195, UpgradeId = "", MaxHp = 940.0, Damage = 59.0, AttackType = 2, ArmorType = 2, AttackRange = 4.5, Speed = 2.0, Ability = "w08", LeakValue = 0, Bounty = 0, AbilityDescription = "Jeder 3. Treffer: 80 % Grundschaden an bis zu 4 weiteren Zielen in 2,5 m." },
|
||
new UnitDef { Id = "w09", DisplayName = "Tauhüter", Cost = 90, UpgradeId = "w10", MaxHp = 390.0, Damage = 10.0, AttackType = 2, ArmorType = 0, AttackRange = 4.0, Speed = 2.0, Ability = "w09", LeakValue = 0, Bounty = 0, AbilityDescription = "Alle 4 s: heilt den am stärksten verwundeten Verbündeten in 4 m um 65 HP." },
|
||
new UnitDef { Id = "w10", DisplayName = "Quellgeflecht", Cost = 180, UpgradeId = "", MaxHp = 1000.0, Damage = 27.0, AttackType = 2, ArmorType = 2, AttackRange = 4.5, Speed = 2.0, Ability = "w10", LeakValue = 0, Bounty = 0, AbilityDescription = "Alle 4 s: heilt bis zu 3 verwundete Verbündete in 4,5 m um je 80 HP." }
|
||
);
|
||
|
||
public static readonly OrderedMap<string, UnitDef> Enemies = Map(
|
||
new UnitDef { Id = "e01", DisplayName = "Splitterling", MaxHp = 90.0, Damage = 6.0, AttackType = 0, ArmorType = 0, AttackRange = 1.0, Speed = 3.0, Ability = "e01", LeakValue = 25, Bounty = 3 },
|
||
new UnitDef { Id = "e02", DisplayName = "Schalenläufer", MaxHp = 240.0, Damage = 9.0, AttackType = 1, ArmorType = 1, AttackRange = 1.2, Speed = 2.0, Ability = "e02", LeakValue = 55, Bounty = 6 },
|
||
new UnitDef { Id = "e03", DisplayName = "Nebelrest", MaxHp = 150.0, Damage = 11.0, AttackType = 2, ArmorType = 2, AttackRange = 3.5, Speed = 2.2, Ability = "e03", LeakValue = 40, Bounty = 5 },
|
||
new UnitDef { Id = "e04", DisplayName = "Fadenschütze", MaxHp = 130.0, Damage = 12.0, AttackType = 1, ArmorType = 0, AttackRange = 6.0, Speed = 2.4, Ability = "e04", LeakValue = 35, Bounty = 5 },
|
||
new UnitDef { Id = "e05", DisplayName = "Bruchstampfer", MaxHp = 480.0, Damage = 16.0, AttackType = 0, ArmorType = 1, AttackRange = 1.4, Speed = 1.6, Ability = "e05", LeakValue = 90, Bounty = 10 },
|
||
new UnitDef { Id = "e06", DisplayName = "Knotenrufer", MaxHp = 190.0, Damage = 7.0, AttackType = 2, ArmorType = 2, AttackRange = 4.0, Speed = 2.0, Ability = "e06", LeakValue = 45, Bounty = 6 },
|
||
new UnitDef { Id = "e07", DisplayName = "Bruchhirsch", MaxHp = 1100.0, Damage = 28.0, AttackType = 0, ArmorType = 0, AttackRange = 1.4, Speed = 1.8, Ability = "e07", LeakValue = 250, Bounty = 30, IsBoss = true },
|
||
new UnitDef { Id = "e08", DisplayName = "Riegelkoloss", MaxHp = 1400.0, Damage = 30.0, AttackType = 1, ArmorType = 1, AttackRange = 1.5, Speed = 1.5, Ability = "e08", LeakValue = 330, Bounty = 40, IsBoss = true },
|
||
new UnitDef { Id = "e09", DisplayName = "Maskenrichter", MaxHp = 1800.0, Damage = 34.0, AttackType = 2, ArmorType = 2, AttackRange = 5.0, Speed = 1.8, Ability = "e09", LeakValue = 400, Bounty = 50, IsBoss = true },
|
||
new UnitDef { Id = "e10", DisplayName = "Schlundkrone", MaxHp = 3000.0, Damage = 50.0, AttackType = 1, ArmorType = 1, AttackRange = 1.5, Speed = 1.3, Ability = "e10", LeakValue = 600, Bounty = 70, IsBoss = true }
|
||
);
|
||
|
||
public static readonly OrderedMap<string, UnitDef> Sends = Map(
|
||
new UnitDef { Id = "s01", DisplayName = "Nadelspäher", Cost = 20, MaxHp = 100.0, Damage = 8.0, AttackType = 1, ArmorType = 0, AttackRange = 4.5, Speed = 2.8, Ability = "s01", LeakValue = 30, Bounty = 3, IncomeGain = 3 },
|
||
new UnitDef { Id = "s02", DisplayName = "Rostschieber", Cost = 40, MaxHp = 240.0, Damage = 8.0, AttackType = 0, ArmorType = 1, AttackRange = 1.2, Speed = 1.8, Ability = "s02", LeakValue = 55, Bounty = 6, IncomeGain = 5 },
|
||
new UnitDef { Id = "s03", DisplayName = "Dunstsänger", Cost = 80, MaxHp = 320.0, Damage = 10.0, AttackType = 2, ArmorType = 2, AttackRange = 5.0, Speed = 2.0, Ability = "s03", LeakValue = 70, Bounty = 9, IncomeGain = 9 },
|
||
new UnitDef { Id = "s04", DisplayName = "Keilbrecher", Cost = 130, MaxHp = 650.0, Damage = 20.0, AttackType = 1, ArmorType = 1, AttackRange = 1.3, Speed = 1.6, Ability = "s04", LeakValue = 120, Bounty = 14, IncomeGain = 12 },
|
||
new UnitDef { Id = "s05", DisplayName = "Risszehrer", Cost = 200, MaxHp = 1000.0, Damage = 30.0, AttackType = 2, ArmorType = 2, AttackRange = 4.0, Speed = 1.7, Ability = "s05", LeakValue = 180, Bounty = 20, IncomeGain = 17 }
|
||
);
|
||
|
||
public static readonly OrderedMap<string, HeroSpec> Heroes = Ordered(
|
||
new HeroSpec { Id = "held_ringborke", Name = "Ringborke", Title = "Wächterin der Wurzeln", Model = "w04", Cost = 260, RoleText = "Front / Schutz", Provisional = true, Summary = "Hält die Front, heilt sich selbst und schützt nahe Verbündete.", Base = new UnitDef { MaxHp = 2200.0, Damage = 34.0, AttackType = 1, ArmorType = 1, AttackRange = 1.4, Speed = 2.4, Ability = "w04" } },
|
||
new HeroSpec { Id = "held_quellgeflecht", Name = "Quellgeflecht", Title = "Hüterin der Quelle", Model = "w10", Cost = 260, RoleText = "Unterstützung / Heilung", Provisional = true, Summary = "Heilt Verbündete in 4,5 m und stärkt die Armee im Gefecht.", Base = new UnitDef { MaxHp = 1300.0, Damage = 28.0, AttackType = 2, ArmorType = 2, AttackRange = 4.5, Speed = 2.0, Ability = "w10" } },
|
||
new HeroSpec { Id = "held_funkenlanze", Name = "Funkenlanze", Title = "Schützin des Glutpakts", Model = "g05", Cost = 260, RoleText = "Fernkampf / Schaden", Provisional = true, Summary = "Hoher Einzelschaden aus der zweiten Reihe.", Base = new UnitDef { MaxHp = 950.0, Damage = 46.0, AttackType = 1, ArmorType = 0, AttackRange = 6.0, Speed = 2.0, Ability = "g05" } },
|
||
// H1 (not in the Godot reference): first hero of the champions concept, docs/luneraria/CHAMPIONS-KONZEPT.md.
|
||
new HeroSpec { Id = "held_sylvara", Name = "Sylvara", Title = "Die Mondklinge", Model = "sylvara", Cost = 260, RoleText = "Assassine / Nahkampf", Provisional = false, Summary = "Springt in die zweite Reihe, wirft Sicheln und wirbelt mit dem Mondsicheltanz durch Gruppen.",
|
||
PassiveText = "Mondsprung: einmal pro Kampf auf den nächsten Fernkämpfer oder Unterstützer in 8 m, der höchstens 2 Begleiter in 3 m hat. Der erste Treffer danach macht 150 % Schaden; Mondschleier schützt 4 s mit 25 % ihrer Lebenspunkte.",
|
||
AbilityText = "Sichelwurf: ab 4 s alle 6 s 90 % Schaden an ihrem Ziel und bis zu 2 weiteren Gegnern in 2,5 m.",
|
||
UltimateName = "Mondsicheltanz", UltimateText = "Einmal pro Kampf, frühestens nach 2 s: 220 % Schaden an bis zu 5 Gegnern in 5 m, die 2 s um 30 % verlangsamt werden; danach Mondschleier. Wann er ausgelöst wird, legst du in der Planung fest.", Base = new UnitDef { MaxHp = 1450.0, Damage = 42.0, AttackType = 0, ArmorType = 0, AttackRange = 1.2, Speed = 2.8, Ability = "sylvara", AbilityDescription = "Mondsprung auf ungeschützte Fernkämpfer · Sichelwurf alle 6 s · Ultimate Mondsicheltanz nach Planungsregel." } },
|
||
// H2: Brunhild, the second hero of the champions concept.
|
||
new HeroSpec { Id = "held_brunhild", Name = "Brunhild", Title = "Die Walküre", Model = "brunhild", Cost = 260, RoleText = "Heldenjägerin / Nahkampf", Provisional = false, Summary = "Markiert mit dem Speer, stürzt sich auf Helden und betäubt mit dem Walkürensturz.",
|
||
PassiveText = "Heldenjägerin: +25 % Schaden gegen Helden und Angriffschampions.",
|
||
AbilityText = "Speerwurf: ab 3 s alle 6 s 120 % Schaden am fernsten Gegner in 7 m; er ist 4 s markiert und nimmt 15 % mehr Schaden.",
|
||
UltimateName = "Walkürensturz", UltimateText = "Einmal pro Kampf, frühestens nach 2 s: Sprung auf ihr Ziel (ein Held oder der markierte Gegner zuerst), 200 % Schaden an allen Gegnern in 3 m und 1 s Betäubung (Bosse sind immun); danach Walkürenschild (30 % ihrer Lebenspunkte, 5 s). Wann sie springt, legst du in der Planung fest.",
|
||
Base = new UnitDef { MaxHp = 2000.0, Damage = 42.0, AttackType = 1, ArmorType = 1, AttackRange = 2.0, Speed = 2.4, Ability = "brunhild", AbilityDescription = "Heldenjägerin · Speerwurf markiert alle 6 s · Ultimate Walkürensturz nach Planungsregel." } }
|
||
);
|
||
|
||
/// <summary>Heroes of the Godot reference; ContentTests compares exactly these, later heroes follow them.</summary>
|
||
public static readonly string[] ReferenceHeroes = { "held_ringborke", "held_quellgeflecht", "held_funkenlanze" };
|
||
|
||
public static readonly int[] LevelXp = { 0, 120, 280, 480, 720, 1000, 1320, 1680, 2080, 2520 };
|
||
public static readonly int[] TalentLevels = { 3, 6 };
|
||
|
||
/// <summary>Per hero: tiers of two mutually exclusive choices.</summary>
|
||
public static readonly Dictionary<string, TalentOption[][]> Talents = new Dictionary<string, TalentOption[][]>
|
||
{
|
||
{ "held_ringborke", new[]
|
||
{
|
||
new[] { new TalentOption("borkenhaut", "Borkenhaut", "Eigenschutz: +15 % Schadensminderung für die Heldin."), new TalentOption("schutzwurzeln", "Schutzwurzeln", "Gruppenschutz: alle 4 s erhalten bis zu 4 Verbündete in 4 m 10 % Schadensminderung für 4,5 s.") },
|
||
new[] { new TalentOption("stammschlag", "Stammschlag", "Einzelziel: jeder 3. Treffer +60 % Schaden."), new TalentOption("wurzelbeben", "Wurzelbeben", "Fläche: jeder 3. Treffer 50 % Schaden an bis zu 3 Gegner in 2 m.") }
|
||
} },
|
||
{ "held_quellgeflecht", new[]
|
||
{
|
||
new[] { new TalentOption("tiefe_quelle", "Tiefe Quelle", "Einzelziel: heilt den schwächsten Verbündeten um 190 statt drei um je 80."), new TalentOption("weite_quelle", "Weite Quelle", "Fläche: heilt bis zu 5 Verbündete in 5,5 m um je 65.") },
|
||
new[] { new TalentOption("quellschild", "Quellschild", "Schutz: Geheilte erhalten 4 s lang einen Schild von 70."), new TalentOption("keimsaat", "Keimsaat", "Druck: jeder 2. Treffer setzt Keimbrand, 9 Schaden/s für 4 s.") }
|
||
} },
|
||
{ "held_funkenlanze", new[]
|
||
{
|
||
new[] { new TalentOption("durchschlag", "Durchschlag", "Einzelziel: jeder 4. Treffer ×2,1 statt ×1,5."), new TalentOption("splitterschuss", "Splitterschuss", "Fläche: jeder 4. Treffer zusätzlich 45 % an bis zu 3 Gegner in 2 m.") },
|
||
new[] { new TalentOption("fernsicht", "Fernsicht", "+1,5 m Reichweite."), new TalentOption("glutsalve", "Glutsalve", "+20 % Angriffstempo.") }
|
||
} },
|
||
{ "held_sylvara", new[]
|
||
{
|
||
new[] { new TalentOption("mondsilber", "Mondsilber", "Einzelziel: Der Sichelwurf trifft nur das Ziel, dafür mit 200 % statt 90 % Schaden."), new TalentOption("sichelsturm", "Sichelsturm", "Fläche: Der Sichelwurf trifft bis zu 5 statt 3 Gegner in 3,5 m.") },
|
||
new[] { new TalentOption("neumond", "Neumond", "+20 % Angriffstempo."), new TalentOption("vollmond", "Vollmond", "Mondsicheltanz: bis zu 7 statt 5 Ziele, 280 % statt 220 % Schaden.") }
|
||
} },
|
||
{ "held_brunhild", new[]
|
||
{
|
||
new[] { new TalentOption("walkuerenblut", "Walkürenblut", "Einzelziel: Der Speerwurf macht gegen Helden und Champions doppelten Schaden."), new TalentOption("speerregen", "Speerregen", "Fläche: Der Speerwurf trifft die drei fernsten Gegner in 7 m.") },
|
||
new[] { new TalentOption("rabenschwinge", "Rabenschwinge", "+20 % Angriffstempo."), new TalentOption("goetterdaemmerung", "Götterdämmerung", "Walkürensturz: 2 s Betäubung in 4 m statt 1 s in 3 m.") }
|
||
} }
|
||
};
|
||
|
||
/// <summary>
|
||
/// H1: cosmetic skins per hero (docs/luneraria/CHAMPIONS-KONZEPT.md, skin system). The
|
||
/// standard look is "" and not listed. A skin swaps materials (AI_Sylvara -> AI_Sylvara_Blutmond);
|
||
/// silhouette, weapon type and team accent stay, the rules never read it.
|
||
/// </summary>
|
||
public static readonly Dictionary<string, TalentOption[]> HeroSkins = new Dictionary<string, TalentOption[]>
|
||
{
|
||
{ "held_sylvara", new[] { new TalentOption("blutmond", "Blutmond", "Variante: rote Klingen und Runen, dunkelrotes Tuch, nachgedunkeltes Silber.") } },
|
||
{ "held_brunhild", new[] { new TalentOption("eiswalkuere", "Eiswalküre", "Variante: eisblauer Umhang und Federn statt Rot, frostiges Gold.") } },
|
||
};
|
||
|
||
/// <summary>
|
||
/// H1: trigger rules of a hero's ultimate, chosen in planning; the first is the default.
|
||
/// Heroes without an entry have no ultimate. The rule decides when the single charge per
|
||
/// combat phase is released; the combat itself stays automatic.
|
||
/// </summary>
|
||
public static readonly Dictionary<string, TalentOption[]> UltimateRules = new Dictionary<string, TalentOption[]>
|
||
{
|
||
{ "held_sylvara", new[]
|
||
{
|
||
new TalentOption("gruppe", "Gruppe", "Sobald mindestens 3 Gegner in 4 m stehen."),
|
||
new TalentOption("zweite_reihe", "Zweite Reihe", "Sobald ein Fernkämpfer oder Unterstützer in 5 m steht."),
|
||
new TalentOption("notfall", "Notfall", "Wenn Sylvara unter 40 % Leben fällt und ein Gegner in 4 m steht."),
|
||
new TalentOption("sofort", "Sofort", "Beim ersten Gegner in 4 m."),
|
||
} },
|
||
{ "held_brunhild", new[]
|
||
{
|
||
new TalentOption("gruppe", "Gruppe", "Sobald mindestens 3 Gegner in 4 m um ihr Ziel stehen."),
|
||
new TalentOption("held", "Heldenjagd", "Sobald ein gegnerischer Held oder Angriffschampion in 7 m steht."),
|
||
new TalentOption("notfall", "Notfall", "Wenn Brunhild unter 40 % Leben fällt und ein Gegner in 7 m steht."),
|
||
new TalentOption("sofort", "Sofort", "Beim ersten Gegner in 7 m."),
|
||
} },
|
||
};
|
||
|
||
public static readonly OrderedMap<string, ItemSpec> Items = Ordered(
|
||
new ItemSpec { Id = "basaltschild", Name = "Basaltschild", Cost = 180, Text = "+350 Lebenspunkte", HpFlat = 350.0 },
|
||
new ItemSpec { Id = "glutklinge", Name = "Glutklinge", Cost = 180, Text = "+18 % Schaden", Damage = 0.18 },
|
||
new ItemSpec { Id = "rankenmantel", Name = "Rankenmantel", Cost = 200, Text = "+10 % Schadensminderung", Reduction = 0.1 },
|
||
new ItemSpec { Id = "funkenfokus", Name = "Funkenfokus", Cost = 200, Text = "+15 % Angriffstempo", AttackSpeed = 0.15 },
|
||
new ItemSpec { Id = "quellamulett", Name = "Quellamulett", Cost = 220, Text = "Regeneriert 1,5 % der Lebenspunkte pro Sekunde", Regen = 0.015 },
|
||
new ItemSpec { Id = "kristallsplitter", Name = "Kristallsplitter", Cost = 260, Text = "Jeder Treffer: 25 % an bis zu 2 Gegner in 1,5 m · ab Stufe 3", Splash = 0.25, MinLevel = 3 },
|
||
// S2 recipes (extended rules only; Dota 2 / League of Legends): two items plus a fee become one stronger item.
|
||
new ItemSpec { Id = "bollwerk", Name = "Bollwerk", Cost = 500, Text = "Rezept: Basaltschild + Rankenmantel + 120 · +600 Lebenspunkte, +15 % Schadensminderung", HpFlat = 600.0, Reduction = 0.15, Parts = new[] { "basaltschild", "rankenmantel" }, RecipeFee = 120 },
|
||
new ItemSpec { Id = "glutsturm", Name = "Glutsturm", Cost = 520, Text = "Rezept: Glutklinge + Funkenfokus + 140 · +25 % Schaden, +22 % Angriffstempo", Damage = 0.25, AttackSpeed = 0.22, Parts = new[] { "glutklinge", "funkenfokus" }, RecipeFee = 140 },
|
||
new ItemSpec { Id = "quellherz", Name = "Quellherz", Cost = 520, Text = "Rezept: Quellamulett + Basaltschild + 120 · +450 Lebenspunkte, regeneriert 2,2 % pro Sekunde", HpFlat = 450.0, Regen = 0.022, Parts = new[] { "quellamulett", "basaltschild" }, RecipeFee = 120 },
|
||
new ItemSpec { Id = "splitterkrone", Name = "Splitterkrone", Cost = 600, Text = "Rezept: Kristallsplitter + Glutklinge + 160 · +20 % Schaden; jeder Treffer 35 % an bis zu 2 Gegner in 1,5 m · ab Stufe 5", Damage = 0.20, Splash = 0.35, MinLevel = 5, Parts = new[] { "kristallsplitter", "glutklinge" }, RecipeFee = 160 }
|
||
);
|
||
|
||
/// <summary>Items of the Godot reference; ContentTests compares exactly these, the S2 recipes follow them.</summary>
|
||
public static readonly string[] ReferenceItems = { "basaltschild", "glutklinge", "rankenmantel", "funkenfokus", "quellamulett", "kristallsplitter" };
|
||
|
||
public static readonly OrderedMap<string, ChampionSpec> Champions = Ordered(
|
||
new ChampionSpec { Id = "ch_schutz", Name = "Rostschieber", RoleText = "Schutz", Model = "s02", Cost = 150, Base = "s02", Text = "Schildträger: startet mit Schild, gibt alle 6 s bis zu 4 Verbündeten in 4 m einen Schild von 120.", ViewScale = 1.25 },
|
||
new ChampionSpec { Id = "ch_druck", Name = "Dunstsänger", RoleText = "Druck auf Unterstützer", Model = "s03", Cost = 150, Base = "s03", Text = "Sucht Unterstützer und Fernkämpfer und verlangsamt deren Angriffe.", ViewScale = 1.25, Priority = "support" },
|
||
new ChampionSpec { Id = "ch_belagerung", Name = "Keilbrecher", RoleText = "Belagerung", Model = "s04", Cost = 180, Base = "s04", Text = "Greift bevorzugt Gebäude an und verursacht dort ×1,8 Schaden.", ViewScale = 1.3, Priority = "building", SiegeFactor = 1.8 }
|
||
);
|
||
|
||
/// <summary>Base troop id to role; iteration order matters for RoleOf (first match).</summary>
|
||
public static readonly OrderedMap<string, string> MatchRoles = Pairs("g01", "melee", "g03", "front", "g05", "ranged", "g07", "splash", "g09", "support", "w01", "melee", "w03", "front", "w05", "ranged", "w07", "splash", "w09", "support");
|
||
public static readonly OrderedMap<string, string> HeroRoles = Pairs("held_ringborke", "front", "held_quellgeflecht", "support", "held_funkenlanze", "ranged", "held_sylvara", "melee", "held_brunhild", "melee");
|
||
public static readonly string[] RowOrder = { "front", "melee", "splash", "ranged", "support" };
|
||
public static readonly string[] BotNames = { "Eichrufer", "Aschenzunge", "Quellwächter", "Glutfaust", "Moosauge", "Basaltherz", "Rindenkrone", "Funkenschritt" };
|
||
public static readonly string[] WavesMelee = { "e01", "e02", "e05" };
|
||
public static readonly string[] ArmorNames = { "Leicht", "Schwer", "Ätherisch" };
|
||
public static readonly string[] DamageNames = { "Klinge", "Durchschlag", "Impuls" };
|
||
public static readonly OrderedMap<string, string> FactionNames = Pairs("glutpakt", "Glutpakt", "wurzelbund", "Wurzelbund");
|
||
|
||
/// <summary>Bot profiles in the reference order (the seed rotation depends on it).</summary>
|
||
public static readonly OrderedMap<string, BotProfile> BotProfiles = Ordered(
|
||
new BotProfile { Name = "ausgewogen", Front = 0.3, Melee = 0.25, Ranged = 0.25, Splash = 0.1, Support = 0.1, UpgradeFrom = 6, SupportLane = 0.0, Hero = "held_ringborke", HeroRound = 4, Items = new[] { "basaltschild", "glutklinge", "rankenmantel" }, TalentChoices = new[] { 0, 1 }, Champion = "" },
|
||
new BotProfile { Name = "verteidigung", Front = 0.35, Melee = 0.2, Ranged = 0.25, Splash = 0.1, Support = 0.1, UpgradeFrom = 7, SupportLane = 0.15, Hero = "held_ringborke", HeroRound = 3, Items = new[] { "basaltschild", "rankenmantel", "glutklinge" }, TalentChoices = new[] { 1, 1 }, Champion = "ch_schutz" },
|
||
new BotProfile { Name = "druck", Front = 0.2, Melee = 0.35, Ranged = 0.25, Splash = 0.15, Support = 0.05, UpgradeFrom = 8, SupportLane = 0.0, Hero = "held_funkenlanze", HeroRound = 3, Items = new[] { "glutklinge", "funkenfokus", "kristallsplitter" }, TalentChoices = new[] { 1, 1 }, Champion = "ch_belagerung" },
|
||
new BotProfile { Name = "fernkampf", Front = 0.25, Melee = 0.1, Ranged = 0.4, Splash = 0.15, Support = 0.1, UpgradeFrom = 6, SupportLane = 0.0, Hero = "held_funkenlanze", HeroRound = 4, Items = new[] { "funkenfokus", "glutklinge", "kristallsplitter" }, TalentChoices = new[] { 0, 0 }, Champion = "ch_druck" },
|
||
new BotProfile { Name = "teamhilfe", Front = 0.3, Melee = 0.2, Ranged = 0.25, Splash = 0.1, Support = 0.15, UpgradeFrom = 6, SupportLane = 0.22, Hero = "held_quellgeflecht", HeroRound = 4, Items = new[] { "quellamulett", "rankenmantel", "basaltschild" }, TalentChoices = new[] { 1, 0 }, Champion = "ch_schutz" },
|
||
new BotProfile { Name = "bossjagd", Front = 0.35, Melee = 0.25, Ranged = 0.2, Splash = 0.1, Support = 0.1, UpgradeFrom = 6, SupportLane = 0.1, Hero = "held_ringborke", HeroRound = 3, Items = new[] { "glutklinge", "basaltschild", "rankenmantel" }, TalentChoices = new[] { 1, 1 }, Champion = "ch_belagerung", BossFrom = 5, BossTroops = 5 }
|
||
);
|
||
|
||
/// <summary>
|
||
/// H1: profiles outside the seed rotation (adding them there would change every reference
|
||
/// bot match). Usable as a fixed profile per slot (MatchOptions.Profiles, balance runs).
|
||
/// </summary>
|
||
public static readonly OrderedMap<string, BotProfile> ExtraBotProfiles = Ordered(
|
||
new BotProfile { Name = "assassine", Front = 0.3, Melee = 0.25, Ranged = 0.25, Splash = 0.1, Support = 0.1, UpgradeFrom = 6, SupportLane = 0.0, Hero = "held_sylvara", HeroRound = 3, Items = new[] { "glutklinge", "funkenfokus", "basaltschild" }, TalentChoices = new[] { 1, 0 }, Champion = "" },
|
||
new BotProfile { Name = "walkuere", Front = 0.3, Melee = 0.25, Ranged = 0.25, Splash = 0.1, Support = 0.1, UpgradeFrom = 6, SupportLane = 0.0, Hero = "held_brunhild", HeroRound = 3, Items = new[] { "glutklinge", "basaltschild", "funkenfokus" }, TalentChoices = new[] { 0, 1 }, Champion = "" }
|
||
);
|
||
}
|
||
}
|