mirror of
https://github.com/kwsch/PKHeX
synced 2024-12-23 19:03:11 +00:00
88830e0d00
Updates from net46->net7, dropping support for mono in favor of using the latest runtime (along with the performance/API improvements). Releases will be posted as 64bit only for now. Refactors a good amount of internal API methods to be more performant and more customizable for future updates & fixes. Adds functionality for Batch Editor commands to `>`, `<` and <=/>= TID/SID properties renamed to TID16/SID16 for clarity; other properties exposed for Gen7 / display variants. Main window has a new layout to account for DPI scaling (8 point grid) Fixed: Tatsugiri and Paldean Tauros now output Showdown form names as Showdown expects Changed: Gen9 species now interact based on the confirmed National Dex IDs (closes #3724) Fixed: Pokedex set all no longer clears species with unavailable non-base forms (closes #3720) Changed: Hyper Training suggestions now apply for level 50 in SV. (closes #3714) Fixed: B2/W2 hatched egg met locations exclusive to specific versions are now explicitly checked (closes #3691) Added: Properties for ribbon/mark count (closes #3659) Fixed: Traded SV eggs are now checked correctly (closes #3692)
201 lines
13 KiB
C#
201 lines
13 KiB
C#
using System.Collections.Generic;
|
|
|
|
namespace PKHeX.Core;
|
|
|
|
// ReSharper disable UnusedMember.Local
|
|
#pragma warning disable IDE0051, RCS1213 // Remove unused private members
|
|
public sealed class SaveBlockAccessor8LA : SCBlockAccessor, ISaveBlock8LA
|
|
{
|
|
public override IReadOnlyList<SCBlock> BlockInfo { get; }
|
|
public Party8a PartyInfo { get; }
|
|
public Box8 BoxInfo { get; }
|
|
public MyStatus8a MyStatus { get; }
|
|
public PokedexSave8a PokedexSave { get; }
|
|
public BoxLayout8a BoxLayout { get; }
|
|
public MyItem8a Items { get; }
|
|
public Epoch1970Value AdventureStart { get; }
|
|
public Coordinates8a Coordinates { get; }
|
|
public LastSaved8a LastSaved { get; }
|
|
public PlayerFashion8a FashionPlayer { get; }
|
|
public PlayTime8a Played { get; }
|
|
|
|
public SaveBlockAccessor8LA(SAV8LA sav)
|
|
{
|
|
BlockInfo = sav.AllBlocks;
|
|
BoxInfo = new Box8(sav, GetBlock(KBox));
|
|
PokedexSave = new PokedexSave8a(sav, GetBlock(KZukan));
|
|
BoxLayout = new BoxLayout8a(sav, GetBlock(KBoxLayout));
|
|
PartyInfo = new Party8a(sav, GetBlock(KParty));
|
|
MyStatus = new MyStatus8a(sav, GetBlock(KMyStatus));
|
|
Items = new MyItem8a(sav, GetBlock(KItemRegular));
|
|
AdventureStart = new Epoch1970Value(GetBlock(KAdventureStart));
|
|
LastSaved = new LastSaved8a(sav, GetBlock(KLastSaved));
|
|
Played = new PlayTime8a(sav, GetBlock(KPlayTime));
|
|
Coordinates = new Coordinates8a(sav, GetBlock(KCoordinates));
|
|
FashionPlayer = new PlayerFashion8a(sav, GetBlock(KFashionPlayer));
|
|
}
|
|
|
|
public int DetectRevision() => HasBlock(0x8184EFB4) ? 1 : 0;
|
|
|
|
// Arrays (Blocks)
|
|
private const uint KBoxLayout = 0x19722c89; // Box Names
|
|
public const uint KBoxWallpapersUnused = 0x2EB1B190; // Box Wallpapers
|
|
public const uint KItemFavorite = 0x00EF4BAE; // Favorite Item ID bitflags
|
|
|
|
// Objects (Blocks)
|
|
private const uint KBox = 0x47E1CEAB; // Box Data
|
|
public const uint KItemRegular = 0x9FE2790A;
|
|
public const uint KItemKey = 0x59A4D0C3;
|
|
public const uint KItemStored = 0x8E434F0D;
|
|
public const uint KItemRecipe = 0xF5D9F4A5;
|
|
private const uint KMysteryGift = 0x99E1625E;
|
|
private const uint KZukan = 0x02168706;
|
|
private const uint KAdventureStart = 0xAEE903A2; // Save File Started
|
|
private const uint KParty = 0x2985fe5d; // Party Data
|
|
private const uint KPlayTime = 0xC4FA7C8C; // Time Played
|
|
private const uint KMyStatus = 0xf25c070e; // Trainer Details
|
|
private const uint KLastSaved = 0x1B1E3D8B; // Last Saved
|
|
private const uint KCoordinates = 0x267DD9DA; // Coordinates
|
|
internal const uint KSpawners = 0x511622B3; // Spawner data
|
|
private const uint KFashionPlayer = 0x6B35BADB; // Player's Current Fashion
|
|
private const uint KFashionUnlockedHat = 0x3ADB8A98;
|
|
private const uint KFashionUnlockedTop = 0x82D57F17;
|
|
private const uint KFashionUnlockedBottoms = 0x11B37EC9;
|
|
private const uint KFashionUnlockedOverall = 0x45851092;
|
|
private const uint KFashionUnlockedShoes = 0x636A5ABD;
|
|
private const uint KFashionUnlockedGlasses = 0x58AB6233;
|
|
public const uint KMassOutbreak = 0x1E0F1BA3;
|
|
public const uint KMassiveMassOutbreak = 0x7799EB86;
|
|
private const uint KCaptureRecords = 0x6506EE96; // 1000 entries, 0x1C each
|
|
private const uint KPlayRecords = 0x549B6033; // 0x18 per entry, first 8 bytes always 01, u64 fnv hash of entry, last 8 bytes value.
|
|
private const uint KOtherPlayerLostSatchels = 0x05E7EBEB;
|
|
private const uint KMyLostSatchels = 0xC5D7112B;
|
|
private const uint KNobleRematchRecords = 0xB9252862; // Best times of Noble rematches
|
|
|
|
// Values
|
|
public const uint KCurrentBox = 0x017C3CBB; // U8 Box Index
|
|
public const uint KBoxesUnlocked = 0x71825204; // U8
|
|
|
|
private const uint KVolumeBGM = 0xF8154AC9; // U32 Background Music volume control (0-10)
|
|
private const uint KVolumeSFX = 0x62F05895; // U32 Sound Effects volume control (0-10)
|
|
private const uint KVolumeCry = 0x1D482A63; // U32 Pokémon Cries volume control (0-10)
|
|
|
|
private const uint KOptionTextSpeed = 0x92EB0306; // U32 text speed (0 = Slow, 1 = Normal, 2 = Fast, 3 = Instant)
|
|
private const uint KOptionCameraVertical = 0x2846B7DB; // U32 vertical camera controls (0 = Normal, 1 = Inverted)
|
|
private const uint KOptionCameraHorizontal = 0x7D249649; // U32 horizontal camera controls (0 = Normal, 1 = Inverted)
|
|
private const uint KOptionCameraSensitivity = 0x22DEF108; // U32 camera sensitivity (0-4)
|
|
private const uint KOptionMotionSensitivity = 0x82AD5F84; // U32 motion sensitivity (0-3)
|
|
private const uint KOptionAutosave = 0xB027F396; // U32 Autosave (0 = Enabled, 1 = Disabled)
|
|
private const uint KOptionToggleHUD = 0xF62D79D3; // U32 HUD Toggling (0 = Enabled, 1 = Disabled)
|
|
private const uint KOptionZRButtonConfirmation = 0x4D7EADDD; // U32 ZR Button confirmation (0 = Enabled, 1 = Disabled)
|
|
private const uint KOptionDynamicRange = 0xA4317061; // U32 Dynamic Range (0 = Wide, 1 = Narrow)
|
|
|
|
public const uint KGameLanguage = 0x0BFDEBA1; // U32 Game Language
|
|
public const uint KMoney = 0x3279D927; // U32 Money
|
|
public const uint KMeritCurrent = 0x9D5D1CA5; // U32 Current Merit Points
|
|
public const uint KMeritEarnedTotal = 0xC25B0D5A; // U32 Merit Points Earned
|
|
public const uint KSatchelUpgrades = 0x75CE2CF6; // U32 Satchel Upgrades (0-39)
|
|
public const uint KExpeditionTeamRank = 0x50FE632A; // U32 Galaxy Expedition Team Rank (0-10)
|
|
private const uint KTotalUnownCaptured = 0x3EBEE1A7; // U32 Unown Captured (0-28)
|
|
private const uint KStealthSpray = 0x385F9860; // U32 time remaining on active Stealth Spray (0-60000 in milliseconds)
|
|
|
|
private const uint KRepelUnused = 0x9ec079da; // U16 Repel Steps remaining
|
|
|
|
private const uint KWispsFoundArea00 = 0x8B18ADE5; // U32 Wisps obtained in Jubilife Village (0-7)
|
|
private const uint KWispsFoundArea01 = 0x8B18AC32; // U32 Wisps obtained in Obsidian Fieldlands (0-20)
|
|
private const uint KWispsFoundArea02 = 0x8B18AA7F; // U32 Wisps obtained in Crimson Mirelands (0-20)
|
|
private const uint KWispsFoundArea03 = 0x8B18A8CC; // U32 Wisps obtained in Cobalt Coastlands (0-20)
|
|
private const uint KWispsFoundArea04 = 0x8B18A719; // U32 Wisps obtained in Coronet Highlands (0-20)
|
|
private const uint KWispsFoundArea05 = 0x8B18A566; // U32 Wisps obtained in Alabaster Icelands (0-20)
|
|
private const uint KWispsFoundTotal = 0xB79EF1FE; // U32 total Wisps obtained (0-107)
|
|
private const uint KWispsReported = 0x8F0D8720; // U32 Wisps reported to Vessa (0-107)
|
|
private const uint KRecordTargetPractice = 0xA69E079B; // U32 High score for Target Practice minigame (Practice Field)
|
|
private const uint KRecordLostSatchelsFound = 0x4AAF7FBE; // U32 Satchels retrieved for NPCs and other players
|
|
private const uint KRecordOwnSatchelsRetrieved = 0x8C46768E; // U32 Satchels other players retrieved for you
|
|
private const uint KStarterChoice = 0x6960C6EF; // U32 0=Rowlet, 1=Cyndaquil, 2=Oshawott
|
|
|
|
private const uint KRecordEternalBattleReverie = 0xEB550C12; // U32 Highest streak for Eternal Battle Reverie
|
|
|
|
// Flags
|
|
private const uint KEnableSpawnerSpiritomb = 0x2DC7E4CC; // FSYS_MKRG_100_SPAWN
|
|
private const uint KEnableSpawnerUxie = 0x9EC1F2C4; // FEVE_YUKUSII_ENCOUNT_ENABLE
|
|
private const uint KEnableSpawnerMesprit = 0xEF5C95D8; // FEVE_EMURITTO_ENCOUNT_ENABLE
|
|
private const uint KEnableSpawnerAzelf = 0xD038BD89; // FEVE_AGUNOMU_ENCOUNT_ENABLE
|
|
private const uint KEnableSpawnerHeatran = 0x3F6301AC; // FEVE_HIIDORAN__ENCOUNT_ENABLE
|
|
private const uint KEnableSpawnerCresselia = 0x85134D02; // FEVE_KURESERIA_ENCOUNT_ENABLE
|
|
private const uint KEnableSpawnerDarkrai = 0xEE027506; // FSYS_SPAWN_START_DARKRAI
|
|
private const uint KEnableSpawnerShaymin = 0x0DCE6659; // FSYS_SPAWN_START_SHAYMIN
|
|
private const uint KEnableSpawnerTornadus = 0x07D8EC38; // FSYS_SPAWN_START_TORNELOS
|
|
private const uint KEnableSpawnerThundurus = 0x136D3D88; // FSYS_SPAWN_START_VOLTOLOS
|
|
private const uint KEnableSpawnerLandorus = 0xE079071B; // FSYS_SPAWN_START_LANDLOS
|
|
private const uint KEnableSpawnerEnamorus = 0x3AA64045; // FSYS_SPAWN_START_FAIRTOLOS
|
|
|
|
private const uint KDisableSpawnerSpiritomb = 0x0AB16F69; // FSYS_MKRG_VALID_SPAWN
|
|
private const uint KDisableSpawnerGiratina = 0x40B908EC; // FMAP_CANNOT_RESPAWN_GIRATINA
|
|
private const uint KDisableSpawnerPhione01 = 0x3C4DB3BE; // FMAP_CANNOT_RESPAWN_PHIONE
|
|
private const uint KDisableSpawnerPhione02 = 0xF6B469D3; // FMAP_CANNOT_RESPAWN_PHIONE_2
|
|
private const uint KDisableSpawnerPhione03 = 0xF6B46820; // FMAP_CANNOT_RESPAWN_PHIONE_3
|
|
private const uint KDisableSpawnerManaphy = 0xBBE677C7; // FMAP_CANNOT_RESPAWN_MANAPHY
|
|
private const uint KDisableSpawnerDarkrai = 0x8AE49E85; // FMAP_CANNOT_RESPAWN_DARKRAI
|
|
private const uint KDisableSpawnerShaymin = 0xF873BBFA; // FMAP_CANNOT_RESPAWN_SHAYMIN
|
|
private const uint KDisableSpawnerTornadus = 0xC8AA3D69; // FMAP_CANNOT_RESPAWN_TORNELOS
|
|
private const uint KDisableSpawnerThundurus = 0x79E259CD; // FMAP_CANNOT_RESPAWN_VOLTOLOS
|
|
private const uint KDisableSpawnerLandorus = 0xD613F320; // FMAP_CANNOT_RESPAWN_LANDLOS
|
|
private const uint KDisableSpawnerEnamorus = 0xE50F4B4E; // FMAP_CANNOT_RESPAWN_FAIRTOLOS
|
|
|
|
private const uint KReceivedAlolanVulpix = 0xAC90C782; // FEVE_POKE_SUB092_GET
|
|
|
|
private const uint KCanRideWyrdeer = 0x47365FE8; // FSYS_RIDE_OPEN_01
|
|
//private const uint KCanRideUnused02 = 0x47366501; // FSYS_RIDE_OPEN_02
|
|
private const uint KCanRideUrsaluna = 0x4736634E; // FSYS_RIDE_OPEN_03
|
|
//private const uint KCanRideUnused04 = 0x47366867; // FSYS_RIDE_OPEN_04
|
|
private const uint KCanRideBasculegion = 0x473666B4; // FSYS_RIDE_OPEN_05
|
|
//private const uint KCanRideUnused06 = 0x47366BCD; // FSYS_RIDE_OPEN_06
|
|
private const uint KCanRideSneasler = 0x47366A1A; // FSYS_RIDE_OPEN_07
|
|
//private const uint KCanRideUnused08 = 0x47365403; // FSYS_RIDE_OPEN_08
|
|
//private const uint KCanRideUnused09 = 0x47365250; // FSYS_RIDE_OPEN_09
|
|
private const uint KCanRideBraviary = 0x47334812; // FSYS_RIDE_OPEN_10
|
|
|
|
private const uint KDefeatedLordKleavor = 0x96774421; // FSYS_NS_01_CLEARED
|
|
private const uint KDefeatedLadyLilligant = 0x3A50000C; // FSYS_NS_02_CLEARED
|
|
private const uint KDefeatedLordArcanine = 0xA5981A37; // FSYS_NS_03_CLEARED
|
|
private const uint KDefeatedLordElectrode = 0x6EF3C712; // FSYS_NS_04_CLEARED
|
|
private const uint KDefeatedLordAvalugg = 0x424E9F0D; // FSYS_NS_05_CLEARED
|
|
private const uint KDefeatedOriginDialga = 0x5185ADC0; // FSYS_NS_D_CLEARED
|
|
private const uint KDefeatedOriginPalkia = 0x5E5BFD94; // FSYS_NS_P_CLEARED
|
|
private const uint KDefeatedArceus = 0x2F91EFD3; // FSYS_SCENARIO_CLEARED_URA
|
|
private const uint KCompletedPokedex = 0xD985E1C2; // FEVE_EV110100_END (Enables using Azure Flute to reach Arceus)
|
|
private const uint KPerfectedPokedex = 0x98ED661E; // FSYS_POKEDEX_COMPLETE_WITHOUT_EXCEPTION
|
|
private const uint KUnlockedUnownNotes = 0xC9127B4E; // FSYS_UNNN_ENABLE_PLACEMENT
|
|
private const uint KUnlockedLostAndFound = 0xFE837926; // FSYS_LOSTBAG_SEARCH_REQUEST_ENABLE
|
|
private const uint KUnlockedMassRelease = 0x0C16BEF4; // FSYS_APP_BOX_SUMFREE_ENABLE
|
|
private const uint KUnlockedDistortions = 0x7611BFC3; // FSYS_WORMHOLE_OPEN
|
|
private const uint KCanFastTravel = 0xFE98F73F; // FSYS_CAN_USE_FAST_TRAVEL
|
|
private const uint KUnlockedArea01 = 0x24C0252D; // FSYS_AREA_01_OPEN
|
|
private const uint KUnlockedArea02 = 0x1599C206; // FSYS_AREA_02_OPEN
|
|
private const uint KUnlockedArea03 = 0x408DE1D3; // FSYS_AREA_03_OPEN
|
|
private const uint KUnlockedArea04 = 0x8C062C9C; // FSYS_AREA_04_OPEN
|
|
private const uint KUnlockedArea05 = 0xC08D4C69; // FSYS_AREA_05_OPEN
|
|
private const uint KUnlockedArea06 = 0x76350E52; // FSYS_AREA_06_OPEN
|
|
private const uint KAutoConnectInternet = 0xAFA034A5;
|
|
private const uint KCompletedEternalBattleReverie = 0xD6BD5654; // Mark displayed on save card; achieved by a 50 streak
|
|
|
|
private const uint KHasPlayRecordsBDSP = 0x52CE2052; // FSYS_SAVEDATA_LINKAGE_DEL_01
|
|
private const uint KHasPlayRecordsSWSH = 0x530EF0B9; // FSYS_SAVEDATA_LINKAGE_ORI_01
|
|
private const uint KHasPlayRecordsLGPE = 0x6CFA9468; // FSYS_SAVEDATA_LINKAGE_BEL_01
|
|
|
|
private const uint KChoseDiamondClanLeader = 0x669B325F; // Choice of Adaman over Irida
|
|
private const uint KHasApplianceElectricFan = 0xC734C80F; // Access to Fan-Rotom
|
|
private const uint KHasApplianceWashingMachine = 0x62872639; // Access to Wash-Rotom
|
|
private const uint KHasApplianceLawnMower = 0xFB87E941; // Access to Mow-Rotom
|
|
private const uint KHasApplianceMicrowaveOven = 0xD9A315A0; // Access to Heat-Rotom
|
|
private const uint KHasApplianceRefrigerator = 0xAE868040; // Access to Frost-Rotom
|
|
private const uint KReceivedRemainderStarters = 0x8D45EB90; // Got Starters that weren't chosen
|
|
private const uint KReceivedRemainderStarterRowlet = 0x4570A16B; // Combine with other 2 and KReceivedRemainderStarers to re-activate
|
|
private const uint KReceivedRemainderStarterCyndaquil = 0x602C2CD6; // Combine with other 2 and KReceivedRemainderStarers to re-activate
|
|
private const uint KReceivedRemainderStarterOshawott = 0xAFCE7320; // Combine with other 2 and KReceivedRemainderStarers to re-activate
|
|
|
|
public const uint KUnlockedSecretBox01 = 0xF224CA8E; // FSYS_SECRET_BOX_01_OPEN
|
|
public const uint KUnlockedSecretBox02 = 0x06924515; // FSYS_SECRET_BOX_02_OPEN
|
|
public const uint KUnlockedSecretBox03 = 0xF67C6DC8; // FSYS_SECRET_BOX_03_OPEN
|
|
}
|