using System;
using System.Collections.Generic;
using System.ComponentModel;
namespace pkNX.Randomization;
///
/// Randomization settings when randomizing a personal info instance.
///
[Serializable]
[TypeConverter(typeof(ExpandableObjectConverter))]
public class PersonalRandSettings : RandSettings
{
private const string Moves = nameof(Moves);
private const string Types = nameof(Types);
private const string Stats = nameof(Stats);
private const string Abilities = nameof(Abilities);
private const string Misc = nameof(Misc);
private const string Evolutions = nameof(Evolutions);
/// Toggle to use Evolution data for inherited personal info instance properties.
[Category("A1"), Description("Evolution Chain Species Randomization instead of Pure Random. Refer to the Evolutions settings when using this mode.")]
public bool ModifyByEvolutions { get; set; } = true;
#region Moves
/// Permits randomizing the TM learn permission flags.
[Category(Moves), Description("Enables randomizing the TM (Technical Machine) compatibility flags.")]
public bool ModifyLearnsetTM { get; set; } = true;
/// Permits randomizing the HM learn permission flags.
[Category(Moves), Description("Enables randomizing the HM (Hidden Machine) compatibility flags.")]
public bool ModifyLearnsetHM { get; set; } = true;
/// Permits randomizing the move tutor permission flags.
[Category(Moves), Description("Enables randomizing the move tutor compatibility flags.")]
public bool ModifyLearnsetMoveTutors { get; set; } = true;
/// Permits randomizing the type tutor permission flags.
[Category(Moves), Description("Enables randomizing the type tutor compatibility flags.")]
public bool ModifyLearnsetTypeTutors { get; set; }
/// Percent chance to learn a TMHM move (0-100).
/// Average Learnable TMs is 35.260.
[Category(Moves), Description("Percentage chance to learn a given TM move.")]
public float LearnTMPercent { get; set; } = 35;
/// Percent chance to learn a type tutor move (0-100).
/// 136 special tutor moves learnable by species in Untouched ORAS.
[Category(Moves), Description("Percentage chance to learn a given special Type Tutor move.")]
public float LearnTypeTutorPercent { get; set; } = 2;
/// Percent chance to learn a tutor move (0-100).
/// 10001 tutor moves learnable by 826 species in Untouched ORAS.
[Category(Moves), Description("Percentage chance to learn a given Move Tutor move.")]
public float LearnMoveTutorPercent { get; set; } = 30;
#endregion
#region Types
/// Permits modification of elemental types.
[Category(Types), Description("Enables a PKM's Type to be modified.")]
public bool ModifyTypes { get; set; } = true;
/// Option to modify the elemental types.
[Category(Types), Description("Option to modify the Types depending on the specified setting.")]
public ModifyState Type { get; set; } = ModifyState.All;
/// Chance that both types are the same.
[Category(Types), Description("Chance that both types are the same.")]
public float SameTypeChance { get; set; } = 50;
#endregion
#region Ability
/// Toggle to permit modification of abilities.
[Category(Abilities), Description("Enables a PKM's Abilities to be modified.")]
public bool ModifyAbility { get; set; } = true;
/// Permits Wonder Guard as a random ability.
[Category(Abilities), Description("Permits Wonder Guard as a random ability.")]
public Permissive WonderGuard { get; set; } = Permissive.No;
/// Option to modify the abilities.
[Category(Abilities), Description("Option to modify the Abilities depending on the specified setting.")]
public ModifyState Ability { get; set; } = ModifyState.All;
/// Chance that both abilities are the same.
[Category(Abilities), Description("Chance that both abilities are the same.")]
public float SameAbilityChance { get; set; } = 100;
#endregion
#region Stats
/// Permits modification of Base Stats.
[Category(Stats), Description("Enables a PKM's base stats to be modified.")]
public bool ModifyStats { get; set; } = true;
/// Amount a Base Stat is amplified as a low bound.
[Category(Stats), Description("Minimum Percentage bound a Base Stat is after randomizing. 100 corresponds to an unchanged minimum.")]
public int StatDeviationMin { get; set; } = 75;
/// Amount a Base Stat is amplified as a high bound.
[Category(Stats), Description("Maximum Percentage bound a Base Stat is after randomizing. 100 corresponds to an unchanged maximum.")]
public int StatDeviationMax { get; set; } = 125;
/// Toggle to permit shuffling of Base Stats.
[Category(Stats), Description("Shuffles the PKM's base stats after any modifications have been made.")]
public bool ShuffleStats { get; set; } = true;
/// Permits randomizing the HP stat.
[Category(Stats), Description("Permits randomizing the HP base stat.")]
public bool HP { get; set; } = true;
/// Permits randomizing the Attack stat.
[Category(Stats), Description("Permits randomizing the Attack base stat.")]
public bool ATK { get; set; } = true;
/// Permits randomizing the Defense stat.
[Category(Stats), Description("Permits randomizing the Defense base stat.")]
public bool DEF { get; set; } = true;
/// Permits randomizing the Special Attack stat.
[Category(Stats), Description("Permits randomizing the Special Attack base stat.")]
public bool SPA { get; set; } = true;
/// Permits randomizing the Special Defense stat.
[Category(Stats), Description("Permits randomizing the Special Defense base stat.")]
public bool SPD { get; set; } = true;
/// Permits randomizing the Speed stat.
[Category(Stats), Description("Permits randomizing the Speed base stat.")]
public bool SPE { get; set; } = true;
///
/// Flags to edit the stats when randomizing.
///
public IReadOnlyList StatsToRandomize => new[] {HP, ATK, DEF, SPE, SPA, SPD};
#endregion
#region Misc
/// Option permitting modification of Catch Rate.
[Category(Misc), Description("Enables a PKM's catch rate to be modified. Can inversely scale off BST.")]
public CatchRate CatchRate { get; set; } = CatchRate.Unchanged;
/// Permits modification of Held Items.
[Category(Misc), Description("Enables a PKM's held items to be modified.")]
public bool ModifyHeldItems { get; set; } = true;
/// Chance all held items are the same.
[Category(Misc), Description("Percentage chance that all Held Items are the same, resulting in a 100% chance of having the held item.")]
public float AlwaysHeldItemChance { get; set; } = 20;
/// Permits modification of Egg Groups.
[Category(Misc), Description("Enables a PKM's egg groups to be modified.")]
public bool ModifyEgg { get; set; }
/// Chance both egg groups are the same.
[Category(Misc), Description("Percentage chance that both egg groups will be the same.")]
public float SameEggGroupChance { get; set; } = 50;
#endregion
#region Evolutions
/// Toggles inheriting types from the pre-evolution that evolves into this species/form.
[Category(Evolutions), Description("Toggles inheriting types from the pre-evolution that evolves into this species/form.")]
public bool InheritType { get; set; } = true;
/// Maximum amount of Types that can be different from the pre-evolution.
[Category(Evolutions), Description("Maximum amount of Types that can be different from the pre-evolution.")]
public ModifyState InheritTypeSetting { get; set; } = ModifyState.One;
/// Percentage chance that only one type will be inherited, and a new random one will replace the other.
[Category(Evolutions), Description("Percentage chance that only one type will be inherited, and a new random one will replace the other.")]
public float InheritTypeOnlyOneChance { get; set; } = 65;
/// Percentage chance that neither one type will be inherited, and new random ones will replace the others.
[Category(Evolutions), Description("Percentage chance that neither type will be inherited, and new random ones will replace the others.")]
public float InheritTypeNeitherChance { get; set; } = 30;
/// Toggles chance that neither one type will be inherited, and new random ones will replace the others.
[Category(Evolutions), Description("Amount of abilities that will be inherited, and new random ones will replace the others.")]
public ModifyState InheritAbilitySetting { get; set; } = ModifyState.One;
/// Toggles inheriting abilities from the pre-evolution that evolves into this species/form.
[Category(Evolutions), Description("Toggles inheriting abilities from the pre-evolution that evolves into this species/form.")]
public bool InheritAbility { get; set; } = true;
/// Percentage chance that only one ability will be inherited, and a new random one will replace the other.
[Category(Evolutions), Description("Percentage chance that only one ability will be inherited, and a new random one will replace the other.")]
public float InheritAbilityOnlyOneChance { get; set; } = 45;
/// Percentage chance that neither one ability will be inherited, and new random ones will replace the others.
[Category(Evolutions), Description("Percentage chance that neither ability will be inherited, and new random ones will replace the others.")]
public float InheritAbilityNeitherChance { get; set; } = 20;
/// Inherit the held item values from the pre-evolution.
[Category(Evolutions), Description("Inherit the held item values from the pre-evolution.")]
public bool InheritHeldItem { get; set; } = true;
/// Inherit the TM/HM compatibility from the pre-evolution.
[Category(Evolutions), Description("Inherit the TM/HM compatibility values from the pre-evolution.")]
public bool InheritChildTM { get; set; } = true;
/// Inherit the Tutor compatibility from the pre-evolution.
[Category(Evolutions), Description("Inherit the Tutor compatibility values from the pre-evolution.")]
public bool InheritChildTutor { get; set; } = true;
/// Inherit the Type Tutor values from the pre-evolution.
[Category(Evolutions), Description("Inherit the Type Tutor compatibility values from the pre-evolution.")]
public bool InheritChildSpecial { get; set; } = true;
#endregion
}