diff --git a/Core/Options.cs b/Core/Options.cs index 796344f..fdd9f46 100644 --- a/Core/Options.cs +++ b/Core/Options.cs @@ -91,6 +91,8 @@ public static class Options new("nerf_chaos", "Nerf Chaos", new() { { 1, "Enable" }, { 0, "Disable" } }, 0, "Halve Chaos' HP and reduce his Intelligence and Attack Power by 25%."), new("boss_minions", "Boss Minions", new() { { 0, "None" }, { 1, "Weak Minions" }, { 2, "Strong Minions" }, { 3, "Weak-Strong Minions" } }, 0, "Add Minions to Bosses and Extend some Minibosses party.\n\nNone: Original Parties are maintained.\n\nWeak Minions: Add relatively weak minions to Bosses and extend Minibosses by 1-2 members.\n\nStrong Minions: Add relatively strong minions to Bosses and extend Minibosses by 2-3 members.\n\nWeak-Strong Minions: Minions can be weak or strong."), + new("chaos_minion_warmech_chance", "Chaos Minion Warmech Chance", new() { { 0, "Disabled" }, { 1, "Unleashed" }, { 2, "Risky" }, { 3, "Guaranteed" } }, 0, "The chance that Warmech will be Chaos's minion.\n\nDisabled: 0% chance.\n\nUnleashed: 20% chance.\n\nRisky: 50% chance.\n\nGuaranteed: 100% chance."), + new("fiend_minion_warmech_chance", "Fiend Minion Warmech Chance", new() { { 0, "Disabled" }, { 1, "Unleashed" }, { 2, "Risky" }, { 3, "Guaranteed" } }, 0, "The chance that Warmech will be a Fiend's minion in the Chaos Shrine.\n\nDisabled: 0% chance.\n\nUnleashed: 5% chance.\n\nRisky: 20% chance.\n\nGuaranteed: 100% chance."), new("monster_parties", "Monster Parties", new() { { 0, "Standard" }, { 1, "Random No Variance" }, { 2, "Random Low Variance" }, { 3, "Random High Variance" } }, 0, "Randomize Monster Parties.\n\nStandard: Original Parties are maintained.\n\nNo Variance: Monsters will be replaced by Monsters of roughly the same power.\n\nLow Variance: Monsters can be replaced by slightly weaker or slightly stronger Monsters.\n\nHigh Variance: Monsters can be replaced by much weaker or much stronger Monsters."), new("monsters_cap", "Variance Cap", new() { { 0, "None" }, { 1, "Upper Bound" }, { 2, "Lower Bound" } }, 0, "If Monster Parties are randomized, bound Power Variance. This option doesn't do anything for Standard and No Variance choices.\n\nNone: Variance is unbounded, Randomized Monster Parties can be weaker or stronger.\n\nUpper Bound: Randomized Monsters cannot be more powerful than the replaced Monsters, but they can be weaker.\n\nLower Bound: Randomized Monsters cannot be weaker than the replaced Monsters, but they can be more powerful."), diff --git a/Randomizer/MonsterParties.cs b/Randomizer/MonsterParties.cs index db7ded9..103bd81 100644 --- a/Randomizer/MonsterParties.cs +++ b/Randomizer/MonsterParties.cs @@ -162,6 +162,13 @@ public enum MinionsRangeModes Strong, WeakStrong } + public enum WarmechChance + { + None, + Unleashed, + Risky, + Guaranteed + } public enum MinionGroupSizes { Small, @@ -467,7 +474,7 @@ public static Dictionary> RandomizeMonsterParti return newMonsterParties; } - public static Dictionary> AddBossMinions(bool enable, MinionsRangeModes rangemode, MT19337 rng) + public static Dictionary> AddBossMinions(bool enable, MinionsRangeModes rangemode, WarmechChance chaoswarmech, WarmechChance fiendwarmech, MT19337 rng) { if (!enable) { @@ -475,6 +482,40 @@ public static Dictionary> AddBossMinions(bool e } Dictionary> newMonsterParties = new(); + + // Set Chaos and Fiend Warmech Chances + int chaoschance = 0; + switch (chaoswarmech) + { + case WarmechChance.None: + chaoschance = 0; + break; + case WarmechChance.Unleashed: + chaoschance = 20; + break; + case WarmechChance.Risky: + chaoschance = 50; + break; + case WarmechChance.Guaranteed: + chaoschance = 100; + break; + } + int fiendchance = 0; + switch (fiendwarmech) + { + case WarmechChance.None: + fiendchance = 0; + break; + case WarmechChance.Unleashed: + fiendchance = 5; + break; + case WarmechChance.Risky: + fiendchance = 20; + break; + case WarmechChance.Guaranteed: + fiendchance = 100; + break; + } // Do Bosses Minions first foreach (var boss in BossMinionConfigs) @@ -548,6 +589,31 @@ public static Dictionary> AddBossMinions(bool e var qty = rng.Between(4, 6); if (boss.Key == 350) qty /= 2; // garland special condition var monster = rng.PickFrom(PowerGroupToMonsters[power]); + bool mech = false; + + switch (boss.Key) + { + case 346: // chaos + if (rng.Between(0, 99) < chaoschance) + mech = true; + break; + case 338: // lich2 + case 339: // marilith2 + case 340: // kraken2 + case 341: // tiamat2 + if (rng.Between(0, 99) < fiendchance) + mech = true; + break; + case 342: // tiamat + // 80% chance if fiends2 are 100%, otherwise 1/5 of fiends2 chance + if (rng.Between(0, 499) < fiendchance ^ fiendchance == 100) + mech = true; + break; + default: + break; + + } + Dictionary newmonsters = new(); @@ -556,6 +622,10 @@ public static Dictionary> AddBossMinions(bool e var position = rng.TakeFrom(positions); newmonsters.Add(position, monster); } + if (mech) + { + newmonsters[1] = MonsterIds.Warmech; + } newMonsterParties.Add(boss.Key, newmonsters); } else @@ -567,9 +637,32 @@ public static Dictionary> AddBossMinions(bool e var monster1 = rng.PickFrom(PowerGroupToMonsters[power]); var monster2 = rng.PickFrom(PowerGroupToMonsters[power]); - if (boss.Key == 346) + if (boss.Key == 346) // chaos special condition + { + monster1 = rng.PickFrom(new List { MonsterIds.Lich, MonsterIds.Marilith, MonsterIds.Kraken, MonsterIds.Tiamat }); + } + + switch (boss.Key) { - monster1 = rng.PickFrom(new List { MonsterIds.Lich, MonsterIds.Marilith, MonsterIds.Kraken, MonsterIds.Tiamat, MonsterIds.Warmech }); + case 346: // chaos + if (rng.Between(0, 99) < chaoschance) + monster1 = MonsterIds.Warmech; + break; + case 338: // lich2 + case 339: // marilith2 + case 340: // kraken2 + case 341: // tiamat2 + if (rng.Between(0, 99) < fiendchance) + monster1 = MonsterIds.Warmech; + break; + case 342: // tiamat + // 80% chance if fiends2 are 100%, otherwise 1/5 of fiends2 chance + if (rng.Between(0, 499) < fiendchance ^ fiendchance == 100) + monster1 = MonsterIds.Warmech; + break; + default: + break; + } Dictionary newmonsters = new(); diff --git a/Randomizer/Randomizer.cs b/Randomizer/Randomizer.cs index ac5212a..6fefda7 100644 --- a/Randomizer/Randomizer.cs +++ b/Randomizer/Randomizer.cs @@ -143,7 +143,7 @@ public static void Randomize() // This is ugly but it'll do for now randoData.MonsterParties = RandomizeMonsterParties(SessionManager.Options["monster_parties"] != Options.Disable, (MonsterPartyRangeModes)SessionManager.Options["monster_parties"], (MonsterPartyCapModes)SessionManager.Options["monsters_cap"], rng) - .Concat(AddBossMinions(SessionManager.Options["boss_minions"] != Options.Disable, (MinionsRangeModes)SessionManager.Options["boss_minions"], rng)) + .Concat(AddBossMinions(SessionManager.Options["boss_minions"] != Options.Disable, (MinionsRangeModes)SessionManager.Options["boss_minions"], (WarmechChance)SessionManager.Options["chaos_minion_warmech_chance"], (WarmechChance)SessionManager.Options["fiend_minion_warmech_chance"], rng)) .ToDictionary(x => x.Key, x => x.Value); randoData.SmittThingy = rng.PickFrom(new List() { "thingy", "thingamajigger", "gizmo", "whatchamacallit", "gewgaw", "doohickey", "thingumabob", "widget", "whatsit", "hootenanny", "MacGuffin", "doodad" }); diff --git a/UI/SettingsWindow.cs b/UI/SettingsWindow.cs index aa60f69..dadd38a 100644 --- a/UI/SettingsWindow.cs +++ b/UI/SettingsWindow.cs @@ -894,6 +894,8 @@ private static void AddRandoOptions() CreateDropdown(Options.Dict["boss_minions"].Display, Options.Dict["boss_minions"]); CreateDropdown(Options.Dict["monster_parties"].Display, Options.Dict["monster_parties"]); CreateDropdown(Options.Dict["monsters_cap"].Display, Options.Dict["monsters_cap"]); + CreateDropdown(Options.Dict["monsters_cap"].Display, Options.Dict["chaos_minion_warmech_chance"]); + CreateDropdown(Options.Dict["monsters_cap"].Display, Options.Dict["fiend_minion_warmech_chance"]); apHeight += 20f * guiScale; GUI.Label(ScaledRect(0, GetApHeight(40f), 300f, 30f), "Scaling");