champions-of-luneraria/Assets/Luneraria/Core/Content/ContentData.cs
Martin Stickelbroeck 60992f1091 H1A Sylvara: Kernregeln, Ultimate-Auslöser, Netz, Bot-Profil, Prüfsuite
Sylvara (held_sylvara) als vierter Held nach der Referenz: Mondsprung,
Sichelwurf, Mondsicheltanz mit in der Planung gewählter Auslöseregel,
Mondschleier-Schild, Talente Mondsilber/Sichelsturm und Neumond/Vollmond.
Befehl ultimate_rule, HeroState.Ultimate und UnitDef.UltimateRule im Netz,
Sprung-/Ultimate-Zähler in den Flag-Bits des Kampf-Frames. Bot-Profil
assassine außerhalb der Seed-Rotation. Golden 0 Abweichungen, h1 35/35.

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

153 lines
22 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// <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.", Base = new UnitDef { MaxHp = 1450.0, Damage = 42.0, AttackType = 0, ArmorType = 0, AttackRange = 1.2, Speed = 2.8, Ability = "sylvara" } }
);
/// <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.") }
} }
};
/// <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."),
} },
};
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 }
);
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");
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 = "ch_druck" }
);
}
}