PKHeX/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonIndex3.cs
Kurt 26b1453002 Narrow ribbon count type from int->byte, split interface
Fix RibbonVerifier4 not checking gen4 contest ribbons correctly
Split IRibbonCommon6 to have memory ribbons separate, as they are not implemented in mystery gifts. Also, we can add the boolean flags to the interface, and check that the boolean is set if count is nonzero.
Fix adding ribbons to Gen8 gift templates
Improve Gen8 template ribbon fetch (no closure, faster IndexOf)
2022-08-23 21:25:22 -07:00

129 lines
4.4 KiB
C#

using System;
using static PKHeX.Core.RibbonIndex3;
namespace PKHeX.Core;
/// <summary>
/// Ribbons from Generation 3 that were not carried forward to future formats.
/// </summary>
public enum RibbonIndex3 : byte
{
// Battle: Gen3
Winning,
Victory,
// Contest: Gen3
Cool,
CoolSuper,
CoolHyper,
CoolMaster,
Beauty,
BeautySuper,
BeautyHyper,
BeautyMaster,
Cute,
CuteSuper,
CuteHyper,
CuteMaster,
Smart,
SmartSuper,
SmartHyper,
SmartMaster,
Tough,
ToughSuper,
ToughHyper,
ToughMaster,
MAX_COUNT,
}
public static class RibbonIndex3Extensions
{
public static void Fix(this RibbonIndex3 r, RibbonVerifierArguments args, bool state)
{
var pk = args.Entity;
if (r is Victory or Winning)
{
if (pk is not IRibbonSetUnique3 u3)
return;
if (r is Victory)
u3.RibbonVictory = state;
else
u3.RibbonWinning = state;
return;
}
if (pk is IRibbonSetOnly3 o3)
{
const byte max = 4;
const byte min = 0;
byte value = state ? max : min;
if (r is Cool)
o3.RibbonCountG3Cool = value;
else if (r is Beauty)
o3.RibbonCountG3Beauty = value;
else if (r is Cute)
o3.RibbonCountG3Cute = value;
else if (r is Smart)
o3.RibbonCountG3Smart = value;
else if (r is Tough)
o3.RibbonCountG3Tough = value;
return;
}
if (pk is not IRibbonSetUnique4 u4)
return;
_ = r switch
{
Cool => u4.RibbonG3Cool = state,
CoolSuper => u4.RibbonG3CoolSuper = state,
CoolHyper => u4.RibbonG3CoolHyper = state,
CoolMaster => u4.RibbonG3CoolMaster = state,
Beauty => u4.RibbonG3Beauty = state,
BeautySuper => u4.RibbonG3BeautySuper = state,
BeautyHyper => u4.RibbonG3BeautyHyper = state,
BeautyMaster => u4.RibbonG3BeautyMaster = state,
Cute => u4.RibbonG3Cute = state,
CuteSuper => u4.RibbonG3CuteSuper = state,
CuteHyper => u4.RibbonG3CuteHyper = state,
CuteMaster => u4.RibbonG3CuteMaster = state,
Smart => u4.RibbonG3Smart = state,
SmartSuper => u4.RibbonG3SmartSuper = state,
SmartHyper => u4.RibbonG3SmartHyper = state,
SmartMaster => u4.RibbonG3SmartMaster = state,
Tough => u4.RibbonG3Tough = state,
ToughSuper => u4.RibbonG3ToughSuper = state,
ToughHyper => u4.RibbonG3ToughHyper = state,
ToughMaster => u4.RibbonG3ToughMaster = state,
_ => throw new ArgumentOutOfRangeException(nameof(r), r, null),
};
}
public static string GetPropertyName(this RibbonIndex3 r) => r switch
{
Winning => nameof(IRibbonSetUnique3.RibbonWinning),
Victory => nameof(IRibbonSetUnique3.RibbonVictory),
Cool => nameof(IRibbonSetUnique4.RibbonG3Cool),
CoolSuper => nameof(IRibbonSetUnique4.RibbonG3CoolSuper),
CoolHyper => nameof(IRibbonSetUnique4.RibbonG3CoolHyper),
CoolMaster => nameof(IRibbonSetUnique4.RibbonG3CoolMaster),
Beauty => nameof(IRibbonSetUnique4.RibbonG3Beauty),
BeautySuper => nameof(IRibbonSetUnique4.RibbonG3BeautySuper),
BeautyHyper => nameof(IRibbonSetUnique4.RibbonG3BeautyHyper),
BeautyMaster => nameof(IRibbonSetUnique4.RibbonG3BeautyMaster),
Cute => nameof(IRibbonSetUnique4.RibbonG3Cute),
CuteSuper => nameof(IRibbonSetUnique4.RibbonG3CuteSuper),
CuteHyper => nameof(IRibbonSetUnique4.RibbonG3CuteHyper),
CuteMaster => nameof(IRibbonSetUnique4.RibbonG3CuteMaster),
Smart => nameof(IRibbonSetUnique4.RibbonG3Smart),
SmartSuper => nameof(IRibbonSetUnique4.RibbonG3SmartSuper),
SmartHyper => nameof(IRibbonSetUnique4.RibbonG3SmartHyper),
SmartMaster => nameof(IRibbonSetUnique4.RibbonG3SmartMaster),
Tough => nameof(IRibbonSetUnique4.RibbonG3Tough),
ToughSuper => nameof(IRibbonSetUnique4.RibbonG3ToughSuper),
ToughHyper => nameof(IRibbonSetUnique4.RibbonG3ToughHyper),
ToughMaster => nameof(IRibbonSetUnique4.RibbonG3ToughMaster),
_ => throw new ArgumentOutOfRangeException(nameof(r), r, null),
};
}