pk3DS/pk3DS.Core/Randomizers/EvolutionRandomizer.cs
2024-06-02 18:26:00 -05:00

116 lines
3.2 KiB
C#

using pk3DS.Core.Structures;
namespace pk3DS.Core.Randomizers;
public class EvolutionRandomizer : IRandomizer
{
private readonly EvolutionSet[] Evolutions;
private readonly GameConfig Config;
public readonly SpeciesRandomizer Randomizer;
public readonly FormRandomizer FormRandomizer;
public EvolutionRandomizer(GameConfig config, EvolutionSet[] evolutions)
{
Config = config;
Evolutions = evolutions;
Randomizer = new SpeciesRandomizer(Config);
FormRandomizer = new FormRandomizer(config);
}
public void Execute()
{
for (var i = 0; i < Evolutions.Length; i++)
{
var evo = Evolutions[i];
Randomize(evo, i);
}
}
public void ExecuteTrade()
{
for (var i = 0; i < Evolutions.Length; i++)
{
var evo = Evolutions[i];
Trade(evo, i);
}
}
public void ExecuteEvolveEveryLevel()
{
foreach (var evo in Evolutions)
MakeEvolveEveryLevel(evo);
}
private void Randomize(EvolutionSet evo, int i)
{
var evos = evo.PossibleEvolutions;
foreach (EvolutionMethod v in evos)
{
if (v.Method > 0)
{
v.Species = Randomizer.GetRandomSpecies(v.Species, i);
v.Form = FormRandomizer.GetRandomForme(v.Species);
}
}
}
private void Trade(EvolutionSet evo, int i)
{
var evos = evo.PossibleEvolutions;
foreach (EvolutionMethod v in evos)
{
if (Config.Generation == 6 && v.Method == 5) // Gen 6 uses Argument rather than Level
{
v.Argument = 30;
v.Method = 4; // trade -> level up
}
else if (Config.Generation == 7 && v.Method == 5)
{
v.Level = 30;
v.Method = 4; // trade -> level up
}
if (v.Method == 6) // trade with held item -> level up with held item
v.Method = 19;
if (v.Method == 7) // trade for opposite -> level up with party
{
if (i == 588)
v.Argument = 616; // Karrablast with Shelmet
if (i == 616)
v.Argument = 588; // Shelmet with Karrablast
v.Method = 22;
}
}
}
private void MakeEvolveEveryLevel(EvolutionSet evo)
{
var evos = evo.PossibleEvolutions;
foreach (EvolutionMethod v in evos)
{
switch (Config.Generation)
{
case 6:
v.Argument = 1;
v.Method = 4;
v.Species = 1;
break;
default:
v.Argument = 0;
v.Form = 0;
v.Level = 1;
v.Method = 4;
v.Species = 1; // will be randomized after
break;
}
}
if (evos[1].Species != 0) // has other branched evolutions; remove them
{
for (int i = 1; i < evos.Length; i++)
evos[i] = new EvolutionMethod();
}
}
}