PKHeX/PKHeX.Core/Saves/Substructures/OPower/OPower6.cs
Kurt b280ffcfef style updates
should be pretty much it
2018-09-14 22:37:47 -07:00

101 lines
3.5 KiB
C#

using System;
using static PKHeX.Core.OPower6Type;
namespace PKHeX.Core
{
public class OPower6
{
private static readonly OPowerFlagSet[] Mapping =
{
new OPowerFlagSet(5, Hatching),
new OPowerFlagSet(5, Bargain),
new OPowerFlagSet(5, Prize_Money),
new OPowerFlagSet(5, Exp_Point),
new OPowerFlagSet(5, Capture),
new OPowerFlagSet(3, Encounter),
new OPowerFlagSet(3, Stealth),
new OPowerFlagSet(3, HP_Restoring),
new OPowerFlagSet(3, PP_Restoring),
new OPowerFlagSet(1, Full_Recovery),
new OPowerFlagSet(5, Befriending),
new OPowerFlagSet(3, Attack),
new OPowerFlagSet(3, Defense),
new OPowerFlagSet(3, Sp_Attack),
new OPowerFlagSet(3, Sp_Defense),
new OPowerFlagSet(3, Speed),
new OPowerFlagSet(3, Critical),
new OPowerFlagSet(3, Accuracy),
};
static OPower6()
{
int index = 1; // Skip unused byte
foreach (var m in Mapping)
{
m.Offset = index;
index += m.Count;
}
}
private readonly byte[] Data;
private readonly int Offset;
public OPower6(byte[] data, int offset)
{
Offset = offset;
Data = data;
}
private OPowerFlagSet this[OPower6Type type] => Array.Find(Mapping, t => t.Identifier == type);
public int GetOPowerCount(OPower6Type type) => this[type].BaseCount;
public int GetOPowerLevel(OPower6Type type) => this[type].GetOPowerLevel(Data, Offset);
public bool GetHasOPowerS(OPower6Type type) => this[type].HasOPowerS;
public bool GetHasOPowerMAX(OPower6Type type) => this[type].HasOPowerMAX;
public bool GetOPowerS(OPower6Type type) => this[type].GetOPowerS(Data, Offset);
public bool GetOPowerMAX(OPower6Type type) => this[type].GetOPowerMAX(Data, Offset);
public void SetOPowerLevel(OPower6Type type, int lvl) => this[type].SetOPowerLevel(Data, Offset, lvl);
public void SetOPowerS(OPower6Type type, bool value) => this[type].SetOPowerS(Data, Offset, value);
public void SetOPowerMAX(OPower6Type type, bool value) => this[type].SetOPowerMAX(Data, Offset, value);
public bool MasterFlag
{
get => Data[Offset] == 1;
set => Data[Offset] = (byte) (value ? OPowerFlagState.Unlocked : OPowerFlagState.Locked);
}
public void UnlockAll() => ToggleFlags(allEvents: true);
public void UnlockRegular() => ToggleFlags();
public void ClearAll() => ToggleFlags(clearOnly: true);
private void ToggleFlags(bool allEvents = false, bool clearOnly = false)
{
foreach (var m in Mapping)
{
// Clear before applying new value
m.SetOPowerLevel(Data, Offset, 0);
m.SetOPowerS(Data, Offset, false);
m.SetOPowerMAX(Data, Offset, false);
if (clearOnly)
continue;
int lvl = allEvents ? m.BaseCount : (m.BaseCount != 1 ? 3 : 0); // Full_Recovery is ORAS/event only @ 1 level
m.SetOPowerLevel(Data, Offset, lvl);
if (!allEvents)
continue;
m.SetOPowerS(Data, Offset, true);
m.SetOPowerMAX(Data, Offset, true);
}
}
public byte[] Write() => Data;
}
}