2022-06-18 18:04:24 +00:00
|
|
|
using System;
|
2021-05-27 19:20:00 +00:00
|
|
|
|
2022-06-18 18:04:24 +00:00
|
|
|
namespace PKHeX.Core;
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Modifications using <see cref="BatchInfo"/> legality.
|
|
|
|
/// </summary>
|
|
|
|
internal static class BatchModifications
|
2021-05-27 19:20:00 +00:00
|
|
|
{
|
2022-06-18 18:04:24 +00:00
|
|
|
private static bool IsAll(string p) => p.EndsWith("All", StringComparison.OrdinalIgnoreCase);
|
|
|
|
private static bool IsNone(string p) => p.EndsWith("None", StringComparison.OrdinalIgnoreCase);
|
2021-05-27 19:20:00 +00:00
|
|
|
|
2022-06-18 18:04:24 +00:00
|
|
|
public static ModifyResult SetSuggestedRelearnData(BatchInfo info, string propValue)
|
|
|
|
{
|
|
|
|
var pk = info.Entity;
|
|
|
|
if (pk is ITechRecord8 t)
|
2021-05-27 19:20:00 +00:00
|
|
|
{
|
2022-06-18 18:04:24 +00:00
|
|
|
t.ClearRecordFlags();
|
|
|
|
if (IsAll(propValue))
|
2022-06-26 06:08:28 +00:00
|
|
|
{
|
2022-06-18 18:04:24 +00:00
|
|
|
t.SetRecordFlags(); // all
|
2022-06-26 06:08:28 +00:00
|
|
|
}
|
2022-06-18 18:04:24 +00:00
|
|
|
else if (!IsNone(propValue))
|
2022-06-26 06:08:28 +00:00
|
|
|
{
|
|
|
|
Span<int> moves = stackalloc int[4];
|
|
|
|
pk.GetMoves(moves);
|
|
|
|
t.SetRecordFlags(moves); // whatever fit the current moves
|
|
|
|
}
|
2021-05-27 19:20:00 +00:00
|
|
|
}
|
2022-02-05 04:04:57 +00:00
|
|
|
|
2022-06-18 18:04:24 +00:00
|
|
|
pk.SetRelearnMoves(info.SuggestedRelearn);
|
|
|
|
return ModifyResult.Modified;
|
|
|
|
}
|
2022-05-03 06:48:25 +00:00
|
|
|
|
2022-06-18 18:04:24 +00:00
|
|
|
public static ModifyResult SetSuggestedMasteryData(BatchInfo info, string propValue)
|
|
|
|
{
|
|
|
|
var pk = info.Entity;
|
|
|
|
if (pk is not IMoveShop8Mastery t)
|
|
|
|
return ModifyResult.Invalid;
|
2022-05-08 17:28:22 +00:00
|
|
|
|
2022-06-18 18:04:24 +00:00
|
|
|
t.ClearMoveShopFlags();
|
|
|
|
if (IsNone(propValue))
|
2022-05-03 06:48:25 +00:00
|
|
|
return ModifyResult.Modified;
|
2021-05-27 19:20:00 +00:00
|
|
|
|
2022-06-18 18:04:24 +00:00
|
|
|
var e = info.Legality.EncounterMatch;
|
|
|
|
if (e is IMasteryInitialMoveShop8 enc)
|
|
|
|
enc.SetInitialMastery(pk);
|
|
|
|
if (IsAll(propValue))
|
|
|
|
t.SetMoveShopFlagsAll(pk);
|
|
|
|
else
|
|
|
|
t.SetMoveShopFlags(pk);
|
|
|
|
return ModifyResult.Modified;
|
|
|
|
}
|
2021-05-27 19:20:00 +00:00
|
|
|
|
2022-06-18 18:04:24 +00:00
|
|
|
public static ModifyResult SetSuggestedRibbons(BatchInfo info, string value)
|
|
|
|
{
|
|
|
|
var pk = info.Entity;
|
|
|
|
if (IsNone(value))
|
|
|
|
RibbonApplicator.RemoveAllValidRibbons(pk);
|
|
|
|
else // All
|
|
|
|
RibbonApplicator.SetAllValidRibbons(pk);
|
|
|
|
return ModifyResult.Modified;
|
|
|
|
}
|
2021-05-27 19:20:00 +00:00
|
|
|
|
2022-06-18 18:04:24 +00:00
|
|
|
public static ModifyResult SetSuggestedMetData(BatchInfo info)
|
|
|
|
{
|
|
|
|
var pk = info.Entity;
|
|
|
|
var encounter = EncounterSuggestion.GetSuggestedMetInfo(pk);
|
|
|
|
if (encounter == null)
|
|
|
|
return ModifyResult.Error;
|
2021-05-27 19:20:00 +00:00
|
|
|
|
2022-06-18 18:04:24 +00:00
|
|
|
int level = encounter.LevelMin;
|
|
|
|
int location = encounter.Location;
|
|
|
|
int minimumLevel = EncounterSuggestion.GetLowestLevel(pk, encounter.LevelMin);
|
2021-05-27 19:20:00 +00:00
|
|
|
|
2022-06-18 18:04:24 +00:00
|
|
|
pk.Met_Level = level;
|
|
|
|
pk.Met_Location = location;
|
|
|
|
pk.CurrentLevel = Math.Max(minimumLevel, level);
|
2021-05-27 19:20:00 +00:00
|
|
|
|
2022-06-18 18:04:24 +00:00
|
|
|
return ModifyResult.Modified;
|
|
|
|
}
|
2022-03-05 06:33:53 +00:00
|
|
|
|
2022-06-18 18:04:24 +00:00
|
|
|
public static ModifyResult SetMinimumCurrentLevel(BatchInfo info)
|
|
|
|
{
|
|
|
|
var result = EncounterSuggestion.IterateMinimumCurrentLevel(info.Entity, info.Legal);
|
|
|
|
return result ? ModifyResult.Modified : ModifyResult.Filtered;
|
|
|
|
}
|
2021-12-21 03:16:23 +00:00
|
|
|
|
2022-06-18 18:04:24 +00:00
|
|
|
/// <summary>
|
|
|
|
/// Sets the provided moves in a random order.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="pk">Pokémon to modify.</param>
|
|
|
|
/// <param name="moves">Moves to apply.</param>
|
|
|
|
public static ModifyResult SetMoves(PKM pk, ReadOnlySpan<int> moves)
|
|
|
|
{
|
|
|
|
pk.SetMoves(moves);
|
|
|
|
pk.HealPP();
|
|
|
|
return ModifyResult.Modified;
|
|
|
|
}
|
2022-05-06 22:47:54 +00:00
|
|
|
|
2022-06-18 18:04:24 +00:00
|
|
|
public static ModifyResult SetEVs(PKM pk)
|
|
|
|
{
|
|
|
|
Span<int> evs = stackalloc int[6];
|
|
|
|
EffortValues.SetMax(evs, pk);
|
|
|
|
pk.SetEVs(evs);
|
|
|
|
return ModifyResult.Modified;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Sets the contests stats as requested.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="pk">Pokémon to modify.</param>
|
|
|
|
/// <param name="la">Legality Information matched to.</param>
|
|
|
|
/// <param name="option">Option to apply with</param>
|
|
|
|
public static ModifyResult SetContestStats(PKM pk, LegalityAnalysis la, string option)
|
|
|
|
{
|
|
|
|
if (option.Length != 0 && option[BatchEditing.CONST_SUGGEST.Length..] is not "0")
|
|
|
|
pk.SetMaxContestStats(la.EncounterMatch, la.Info.EvoChainsAllGens);
|
|
|
|
else
|
|
|
|
pk.SetSuggestedContestStats(la.EncounterMatch, la.Info.EvoChainsAllGens);
|
|
|
|
return ModifyResult.Modified;
|
2021-05-27 19:20:00 +00:00
|
|
|
}
|
|
|
|
}
|