diff --git a/PKHeX.Core/Saves/Access/ISaveBlock6Main.cs b/PKHeX.Core/Saves/Access/ISaveBlock6Main.cs index 09c90a061..7c07ac2e2 100644 --- a/PKHeX.Core/Saves/Access/ISaveBlock6Main.cs +++ b/PKHeX.Core/Saves/Access/ISaveBlock6Main.cs @@ -4,6 +4,7 @@ public interface ISaveBlock6Main : ISaveBlock6Core, IPokePuff, IOPower, ILink { BoxLayout6 BoxLayout { get; } BattleBox6 BattleBox { get; } + ConfigSave6 Config { get; } MysteryBlock6 MysteryGift { get; } SuperTrainBlock SuperTrain { get; } MaisonBlock Maison { get; } diff --git a/PKHeX.Core/Saves/Access/SaveBlockAccessor6AO.cs b/PKHeX.Core/Saves/Access/SaveBlockAccessor6AO.cs index 7eb1e96a4..b4e5868b5 100644 --- a/PKHeX.Core/Saves/Access/SaveBlockAccessor6AO.cs +++ b/PKHeX.Core/Saves/Access/SaveBlockAccessor6AO.cs @@ -89,6 +89,7 @@ public class SaveBlockAccessor6AO : ISaveBlockAccessor, ISaveBlock6M public SuperTrainBlock SuperTrain { get; } public MaisonBlock Maison { get; } public SubEventLog6 SUBE { get; } + public ConfigSave6 Config { get; } public SaveBlockAccessor6AO(SAV6AO sav) { @@ -103,6 +104,7 @@ public SaveBlockAccessor6AO(SAV6AO sav) BattleBox = new BattleBox6(sav, 0x04A00); Status = new MyStatus6(sav, 0x14000); Zukan = new Zukan6AO(sav, 0x15000, 0x400); + Config = new ConfigSave6(sav, 0x16C00); OPower = new OPower6(sav, 0x17400); Maison = new MaisonBlock(sav, 0x1BA00); MysteryGift = new MysteryBlock6(sav, 0x1CC00); diff --git a/PKHeX.Core/Saves/Access/SaveBlockAccessor6XY.cs b/PKHeX.Core/Saves/Access/SaveBlockAccessor6XY.cs index 95c5e2d38..7b2a9cb48 100644 --- a/PKHeX.Core/Saves/Access/SaveBlockAccessor6XY.cs +++ b/PKHeX.Core/Saves/Access/SaveBlockAccessor6XY.cs @@ -74,6 +74,7 @@ public class SaveBlockAccessor6XY : ISaveBlockAccessor, ISaveBlock6X public MyStatus6 Status { get; } public RecordBlock6 Records { get; } public SubEventLog6 SUBE { get; } + public ConfigSave6 Config { get; } public SaveBlockAccessor6XY(SAV6XY sav) { @@ -89,6 +90,7 @@ public SaveBlockAccessor6XY(SAV6XY sav) BattleBox = new BattleBox6(sav, 0x04A00); Status = new MyStatus6XY(sav, 0x14000); Zukan = new Zukan6XY(sav, 0x15000, 0x3C8); + Config = new ConfigSave6(sav, 0x16200); OPower = new OPower6(sav, 0x16A00); MysteryGift = new MysteryBlock6(sav, 0x1BC00); SUBE = new SubEventLog6XY(sav, 0x1D800); diff --git a/PKHeX.Core/Saves/SAV6AO.cs b/PKHeX.Core/Saves/SAV6AO.cs index e80bbb07e..78b6b9822 100644 --- a/PKHeX.Core/Saves/SAV6AO.cs +++ b/PKHeX.Core/Saves/SAV6AO.cs @@ -83,6 +83,7 @@ private void Initialize() public SuperTrainBlock SuperTrain => Blocks.SuperTrain; public MaisonBlock Maison => Blocks.Maison; public SubEventLog6 SUBE => Blocks.SUBE; + public ConfigSave6 Config => Blocks.Config; public Misc6AO Misc => Blocks.Misc; public Zukan6AO Zukan => Blocks.Zukan; diff --git a/PKHeX.Core/Saves/SAV6XY.cs b/PKHeX.Core/Saves/SAV6XY.cs index fdebb5f1d..eef5751a8 100644 --- a/PKHeX.Core/Saves/SAV6XY.cs +++ b/PKHeX.Core/Saves/SAV6XY.cs @@ -80,6 +80,7 @@ private void Initialize() public Misc6XY Misc => Blocks.Misc; public Fashion6XY Fashion => Blocks.Fashion; public SubEventLog6 SUBE => Blocks.SUBE; + public ConfigSave6 Config => Blocks.Config; #endregion protected override void SetDex(PKM pkm) => Blocks.Zukan.SetDex(pkm); diff --git a/PKHeX.Core/Saves/Substructures/Gen7/ConfigSave6.cs b/PKHeX.Core/Saves/Substructures/Gen7/ConfigSave6.cs new file mode 100644 index 000000000..01c1da6ba --- /dev/null +++ b/PKHeX.Core/Saves/Substructures/Gen7/ConfigSave6.cs @@ -0,0 +1,115 @@ +using System; + +namespace PKHeX.Core +{ + public sealed class ConfigSave6 : SaveBlock + { + /* ===32 bits=== + * talkSpeed:2 0,1 + * battleAnim:1 2 + * battleStyle:1 3 + * unknown:4 4..7 + * battleBG:5 8..12 + * buttonMode:2 13,14 + * forcedSave:1 15 + * flag1:1 16 + * enablePSS:1 17 + * enablePR:1 18 + * unknown:14 19..31 + */ + + public ConfigSave6(SAV6XY sav, int offset) : base(sav) => Offset = offset; + public ConfigSave6(SAV6AO sav, int offset) : base(sav) => Offset = offset; + + public int ConfigValue + { + get => BitConverter.ToInt32(Data, Offset); + set => BitConverter.GetBytes(value).CopyTo(Data, Offset); + } + + public int TalkingSpeed + { + get => ConfigValue & 3; + set => ConfigValue = (ConfigValue & ~3) | (value & 3); + } + + public BattleAnimationSetting BattleAnimation + { + // Effects OFF = 1, Effects ON = 0 + get => (BattleAnimationSetting)((ConfigValue >> 2) & 1); + set => ConfigValue = (ConfigValue & ~(1 << 2)) | ((byte)value << 2); + } + + public BattleStyleSetting BattleStyle + { + // SET = 1, SWITCH = 0 + get => (BattleStyleSetting)((ConfigValue >> 3) & 1); + set => ConfigValue = (ConfigValue & ~(1 << 3)) | ((byte)value << 3); + } + + // UNKNOWN? + + public int BattleBackground + { + // Only values 0-14 are used. + get => (ConfigValue >> 8) & 0x1F; + set => ConfigValue = (ConfigValue & ~(0x1F << 8)) | (value << 8); + } + + public int ButtonMode + { + get => (ConfigValue >> 13) & 3; + set => ConfigValue = (ConfigValue & ~(1 << 13)) | (value << 13); + } + + public int ForceSaveBeforeOnline + { + get => (ConfigValue >> 15) & 1; + set => ConfigValue = (ConfigValue & ~(1 << 15)) | (value << 15); + } + + public int EnableFlag1 + { + get => (ConfigValue >> 16) & 1; + set => ConfigValue = (ConfigValue & ~(1 << 16)) | (value << 16); + } + + public int EnablePSSFlag + { + get => (ConfigValue >> 17) & 1; + set => ConfigValue = (ConfigValue & ~(1 << 17)) | (value << 17); + } + + public int EnableTrainerPRFlag + { + get => (ConfigValue >> 18) & 1; + set => ConfigValue = (ConfigValue & ~(1 << 18)) | (value << 18); + } + + // NOTE: BELOW COMES FROM LGPE. MAYBE THIS IS WHAT THEY USE THE FLAGS FOR? + + /// + /// for messages, stored with skipped in the enumeration. + /// + public int Language + { + get => GetLanguageID((ConfigValue >> 4) & 0xF); + set => ConfigValue = ((ConfigValue & ~0xF0) | SetLanguageID(value) << 4); + } + + private static int GetLanguageID(int i) => i >= (int)LanguageID.UNUSED_6 ? i + 1 : i; // sets langBank to LanguageID + private static int SetLanguageID(int i) => i > (int)LanguageID.UNUSED_6 ? i - 1 : i; // sets LanguageID to langBank + + public enum BattleAnimationSetting + { + EffectsON, + EffectsOFF, + } + + public enum BattleStyleSetting + { + SWITCH, + SET, + } + } +} diff --git a/PKHeX.Core/Saves/Substructures/Gen7/ConfigSave7.cs b/PKHeX.Core/Saves/Substructures/Gen7/ConfigSave7.cs index e76e3e45e..66e333c49 100644 --- a/PKHeX.Core/Saves/Substructures/Gen7/ConfigSave7.cs +++ b/PKHeX.Core/Saves/Substructures/Gen7/ConfigSave7.cs @@ -29,18 +29,18 @@ public int TalkingSpeed set => ConfigValue = (ConfigValue & ~3) | (value & 3); } - public int BattleAnimation + public BattleAnimationSetting BattleAnimation { // Effects OFF = 1, Effects ON = 0 - get => (ConfigValue >> 2) & 1; - set => ConfigValue = (ConfigValue & ~(1 << 2)) | (value << 2); + get => (BattleAnimationSetting)((ConfigValue >> 2) & 1); + set => ConfigValue = (ConfigValue & ~(1 << 2)) | ((byte)value << 2); } - public int BattleStyle + public BattleStyleSetting BattleStyle { // SET = 1, SWITCH = 0 - get => (ConfigValue >> 3) & 1; - set => ConfigValue = (ConfigValue & ~(1 << 3)) | (value << 3); + get => (BattleStyleSetting)((ConfigValue >> 3) & 1); + set => ConfigValue = (ConfigValue & ~(1 << 3)) | ((byte)value << 3); } // UNKNOWN? @@ -80,8 +80,8 @@ public enum BattleAnimationSetting public enum BattleStyleSetting { - SET, SWITCH, + SET, } } -} \ No newline at end of file +} diff --git a/PKHeX.Core/Saves/Substructures/Gen7/ConfigSave7b.cs b/PKHeX.Core/Saves/Substructures/Gen7/ConfigSave7b.cs index 26f3953dc..a590e5cde 100644 --- a/PKHeX.Core/Saves/Substructures/Gen7/ConfigSave7b.cs +++ b/PKHeX.Core/Saves/Substructures/Gen7/ConfigSave7b.cs @@ -61,8 +61,8 @@ public enum BattleAnimationSetting public enum BattleStyleSetting { - SET, SWITCH, + SET, } } } \ No newline at end of file