Replace MC->MemoryCard

Simplify some interactions to be more clear
This commit is contained in:
Kurt 2021-07-05 14:32:09 -07:00
parent 5a769312fd
commit de8e855116
8 changed files with 45 additions and 46 deletions

View file

@ -14,8 +14,7 @@ namespace PKHeX.Core
public override string Extension => this.GCExtension(); public override string Extension => this.GCExtension();
public override PersonalTable Personal => PersonalTable.RS; public override PersonalTable Personal => PersonalTable.RS;
public override IReadOnlyList<ushort> HeldItems => Legal.HeldItems_COLO; public override IReadOnlyList<ushort> HeldItems => Legal.HeldItems_COLO;
public bool IsMemoryCardSave => MC != null; public SAV3GCMemoryCard? MemoryCard { get; }
private readonly SAV3GCMemoryCard? MC;
// 3 Save files are stored // 3 Save files are stored
// 0x0000-0x6000 contains memory card data // 0x0000-0x6000 contains memory card data
@ -34,7 +33,7 @@ namespace PKHeX.Core
private readonly StrategyMemo StrategyMemo; private readonly StrategyMemo StrategyMemo;
public const int MaxShadowID = 0x80; // 128 public const int MaxShadowID = 0x80; // 128
private int Memo; private int Memo;
public SAV3Colosseum(byte[] data, SAV3GCMemoryCard MC) : this(data, MC.Data) { this.MC = MC; } public SAV3Colosseum(byte[] data, SAV3GCMemoryCard memCard) : this(data, memCard.Data) => MemoryCard = memCard;
public SAV3Colosseum(byte[] data) : this(data, (byte[])data.Clone()) { } public SAV3Colosseum(byte[] data) : this(data, (byte[])data.Clone()) { }
public SAV3Colosseum() : base(SaveUtil.SIZE_G3COLO) public SAV3Colosseum() : base(SaveUtil.SIZE_G3COLO)
@ -102,11 +101,11 @@ namespace PKHeX.Core
var newFile = GetInnerData(); var newFile = GetInnerData();
// Return the gci if Memory Card is not being exported // Return the gci if Memory Card is not being exported
if (!IsMemoryCardSave) if (MemoryCard is null)
return newFile; return newFile;
MC!.SelectedSaveData = newFile; MemoryCard.WriteSaveGameData(newFile);
return MC.Data; return MemoryCard.Data;
} }
private byte[] GetInnerData() private byte[] GetInnerData()
@ -119,7 +118,7 @@ namespace PKHeX.Core
byte[] newSAV = EncryptColosseum(Data, digest); byte[] newSAV = EncryptColosseum(Data, digest);
// Put save slot back in original save data // Put save slot back in original save data
byte[] newFile = MC != null ? MC.SelectedSaveData : (byte[]) State.BAK.Clone(); byte[] newFile = MemoryCard != null ? MemoryCard.ReadSaveGameData() : (byte[]) State.BAK.Clone();
Array.Copy(newSAV, 0, newFile, SLOT_START + (SaveIndex * SLOT_SIZE), newSAV.Length); Array.Copy(newSAV, 0, newFile, SLOT_START + (SaveIndex * SLOT_SIZE), newSAV.Length);
return newFile; return newFile;
} }
@ -128,7 +127,7 @@ namespace PKHeX.Core
protected override SaveFile CloneInternal() protected override SaveFile CloneInternal()
{ {
var data = GetInnerData(); var data = GetInnerData();
var sav = IsMemoryCardSave ? new SAV3Colosseum(data, MC!) : new SAV3Colosseum(data); var sav = MemoryCard is not null ? new SAV3Colosseum(data, MemoryCard) : new SAV3Colosseum(data);
return sav; return sav;
} }

View file

@ -304,7 +304,6 @@ namespace PKHeX.Core
} }
public string GCISaveName => GCISaveGameName(); public string GCISaveName => GCISaveGameName();
public byte[] SelectedSaveData { get => ReadSaveGameData(); set => WriteSaveGameData(value); }
public readonly byte[] Data; public readonly byte[] Data;
private string GCISaveGameName() private string GCISaveGameName()
@ -317,7 +316,7 @@ namespace PKHeX.Core
return $"{Makercode}-{GameCode}-{Util.TrimFromZero(FileName)}.gci"; return $"{Makercode}-{GameCode}-{Util.TrimFromZero(FileName)}.gci";
} }
private byte[] ReadSaveGameData() public byte[] ReadSaveGameData()
{ {
if (EntrySelected < 0) if (EntrySelected < 0)
return Array.Empty<byte>(); // No entry selected return Array.Empty<byte>(); // No entry selected
@ -332,7 +331,7 @@ namespace PKHeX.Core
return SaveData; return SaveData;
} }
private void WriteSaveGameData(byte[] SaveData) public void WriteSaveGameData(byte[] SaveData)
{ {
if (EntrySelected < 0) // Can't write anywhere if (EntrySelected < 0) // Can't write anywhere
return; return;

View file

@ -13,11 +13,10 @@ namespace PKHeX.Core
public override string Extension => this.GCExtension(); public override string Extension => this.GCExtension();
public override PersonalTable Personal => PersonalTable.RS; public override PersonalTable Personal => PersonalTable.RS;
public override IReadOnlyList<ushort> HeldItems => Legal.HeldItems_RS; public override IReadOnlyList<ushort> HeldItems => Legal.HeldItems_RS;
public bool IsMemoryCardSave => MC != null; public SAV3GCMemoryCard? MemoryCard { get; }
private readonly SAV3GCMemoryCard? MC;
public readonly bool Japanese = false; // todo? public readonly bool Japanese = false; // todo?
public SAV3RSBox(byte[] data, SAV3GCMemoryCard MC) : this(data, MC.Data) { this.MC = MC; } public SAV3RSBox(byte[] data, SAV3GCMemoryCard memCard) : this(data, memCard.Data) => MemoryCard = memCard;
public SAV3RSBox(byte[] data) : this(data, (byte[])data.Clone()) { } public SAV3RSBox(byte[] data) : this(data, (byte[])data.Clone()) { }
public SAV3RSBox() : base(SaveUtil.SIZE_G3BOX) public SAV3RSBox() : base(SaveUtil.SIZE_G3BOX)
@ -74,11 +73,11 @@ namespace PKHeX.Core
var newFile = GetInnerData(); var newFile = GetInnerData();
// Return the gci if Memory Card is not being exported // Return the gci if Memory Card is not being exported
if (!IsMemoryCardSave) if (MemoryCard is null)
return newFile; return newFile;
MC!.SelectedSaveData = newFile; MemoryCard.WriteSaveGameData(newFile);
return MC.Data; return MemoryCard.Data;
} }
private byte[] GetInnerData() private byte[] GetInnerData()
@ -97,7 +96,7 @@ namespace PKHeX.Core
protected override SaveFile CloneInternal() protected override SaveFile CloneInternal()
{ {
var data = GetInnerData(); var data = GetInnerData();
var sav = IsMemoryCardSave ? new SAV3RSBox(data, MC!) : new SAV3RSBox(data); var sav = MemoryCard is not null ? new SAV3RSBox(data, MemoryCard) : new SAV3RSBox(data);
return sav; return sav;
} }

View file

@ -10,8 +10,7 @@ namespace PKHeX.Core
{ {
protected internal override string ShortSummary => $"{OT} ({Version}) #{SaveCount:0000}"; protected internal override string ShortSummary => $"{OT} ({Version}) #{SaveCount:0000}";
public override string Extension => this.GCExtension(); public override string Extension => this.GCExtension();
public bool IsMemoryCardSave => MC != null; public SAV3GCMemoryCard? MemoryCard { get; }
private readonly SAV3GCMemoryCard? MC;
private const int SLOT_SIZE = 0x28000; private const int SLOT_SIZE = 0x28000;
private const int SLOT_START = 0x6000; private const int SLOT_START = 0x6000;
@ -27,7 +26,7 @@ namespace PKHeX.Core
public int MaxShadowID => ShadowInfo.Count; public int MaxShadowID => ShadowInfo.Count;
private int OFS_PouchHeldItem, OFS_PouchKeyItem, OFS_PouchBalls, OFS_PouchTMHM, OFS_PouchBerry, OFS_PouchCologne, OFS_PouchDisc; private int OFS_PouchHeldItem, OFS_PouchKeyItem, OFS_PouchBalls, OFS_PouchTMHM, OFS_PouchBerry, OFS_PouchCologne, OFS_PouchDisc;
private readonly int[] subOffsets = new int[16]; private readonly int[] subOffsets = new int[16];
public SAV3XD(byte[] data, SAV3GCMemoryCard MC) : this(data, MC.Data) { this.MC = MC; } public SAV3XD(byte[] data, SAV3GCMemoryCard memCard) : this(data, memCard.Data) => MemoryCard = memCard;
public SAV3XD(byte[] data) : this(data, (byte[])data.Clone()) { } public SAV3XD(byte[] data) : this(data, (byte[])data.Clone()) { }
public SAV3XD() : base(SaveUtil.SIZE_G3XD) public SAV3XD() : base(SaveUtil.SIZE_G3XD)
@ -121,11 +120,11 @@ namespace PKHeX.Core
var newFile = GetInnerData(); var newFile = GetInnerData();
// Return the gci if Memory Card is not being exported // Return the gci if Memory Card is not being exported
if (!IsMemoryCardSave) if (MemoryCard is null)
return newFile; return newFile;
MC!.SelectedSaveData = newFile; MemoryCard.WriteSaveGameData(newFile);
return MC.Data; return MemoryCard.Data;
} }
private byte[] GetInnerData() private byte[] GetInnerData()
@ -142,7 +141,7 @@ namespace PKHeX.Core
byte[] newSAV = GeniusCrypto.Encrypt(Data, 0x10, 0x27FD8, keys); byte[] newSAV = GeniusCrypto.Encrypt(Data, 0x10, 0x27FD8, keys);
// Put save slot back in original save data // Put save slot back in original save data
byte[] newFile = MC != null ? MC.SelectedSaveData : (byte[]) State.BAK.Clone(); byte[] newFile = MemoryCard != null ? MemoryCard.ReadSaveGameData() : (byte[]) State.BAK.Clone();
Array.Copy(newSAV, 0, newFile, SLOT_START + (SaveIndex * SLOT_SIZE), newSAV.Length); Array.Copy(newSAV, 0, newFile, SLOT_START + (SaveIndex * SLOT_SIZE), newSAV.Length);
return newFile; return newFile;
} }
@ -151,7 +150,7 @@ namespace PKHeX.Core
protected override SaveFile CloneInternal() protected override SaveFile CloneInternal()
{ {
var data = GetInnerData(); var data = GetInnerData();
var sav = IsMemoryCardSave ? new SAV3XD(data, MC!) : new SAV3XD(data); var sav = MemoryCard is not null ? new SAV3XD(data, MemoryCard) : new SAV3XD(data);
return sav; return sav;
} }

View file

@ -130,7 +130,7 @@ namespace PKHeX.Core
var flags = ExportFlags.None; var flags = ExportFlags.None;
if (ext == ".dsv") if (ext == ".dsv")
flags |= ExportFlags.IncludeFooter; flags |= ExportFlags.IncludeFooter;
if (ext == ".gci" || SAV is IGCSaveFile {IsMemoryCardSave: false}) if (ext == ".gci" || SAV is IGCSaveFile {MemoryCard: null})
flags |= ExportFlags.IncludeHeader; flags |= ExportFlags.IncludeHeader;
return flags; return flags;
} }

View file

@ -5,7 +5,10 @@
/// </summary> /// </summary>
public interface IGCSaveFile public interface IGCSaveFile
{ {
bool IsMemoryCardSave { get; } /// <summary>
/// GameCube Memory Card the save file was read from.
/// </summary>
SAV3GCMemoryCard? MemoryCard { get; }
} }
public static class GCSaveExtensions public static class GCSaveExtensions
@ -17,12 +20,12 @@
{ {
const string regular = "GameCube Save File|*.gci|All Files|*.*"; const string regular = "GameCube Save File|*.gci|All Files|*.*";
const string memcard = "Memory Card Raw File|*.raw|Memory Card Binary File|*.bin|"; const string memcard = "Memory Card Raw File|*.raw|Memory Card Binary File|*.bin|";
return gc.IsMemoryCardSave ? memcard + regular : regular; return gc.MemoryCard is not null ? memcard + regular : regular;
} }
/// <summary> /// <summary>
/// Gets the export extension for a GameCube file. /// Gets the export extension for a GameCube file.
/// </summary> /// </summary>
public static string GCExtension(this IGCSaveFile gc) => gc.IsMemoryCardSave ? ".raw" : ".gci"; public static string GCExtension(this IGCSaveFile gc) => gc.MemoryCard is not null ? ".raw" : ".gci";
} }
} }

View file

@ -607,7 +607,7 @@ namespace PKHeX.Core
public static SaveFile? GetVariantSAV(SAV3GCMemoryCard memCard) public static SaveFile? GetVariantSAV(SAV3GCMemoryCard memCard)
{ {
// Pre-check for header/footer signatures // Pre-check for header/footer signatures
byte[] data = memCard.SelectedSaveData; byte[] data = memCard.ReadSaveGameData();
if (data.Length == 0) if (data.Length == 0)
return null; return null;

View file

@ -676,24 +676,24 @@ namespace PKHeX.WinForms
return true; return true;
} }
private static GameVersion SelectMemoryCardSaveGame(SAV3GCMemoryCard MC) private static GameVersion SelectMemoryCardSaveGame(SAV3GCMemoryCard memCard)
{ {
if (MC.SaveGameCount == 1) if (memCard.SaveGameCount == 1)
return MC.SelectedGameVersion; return memCard.SelectedGameVersion;
var games = new List<ComboItem>(); var games = new List<ComboItem>();
if (MC.HasCOLO) games.Add(new ComboItem(MsgGameColosseum, (int)GameVersion.COLO)); if (memCard.HasCOLO) games.Add(new ComboItem(MsgGameColosseum, (int)GameVersion.COLO));
if (MC.HasXD) games.Add(new ComboItem(MsgGameXD, (int)GameVersion.XD)); if (memCard.HasXD) games.Add(new ComboItem(MsgGameXD, (int)GameVersion.XD));
if (MC.HasRSBOX) games.Add(new ComboItem(MsgGameRSBOX, (int)GameVersion.RSBOX)); if (memCard.HasRSBOX) games.Add(new ComboItem(MsgGameRSBOX, (int)GameVersion.RSBOX));
var dialog = new SAV_GameSelect(games, MsgFileLoadSaveMultiple, MsgFileLoadSaveSelectGame); var dialog = new SAV_GameSelect(games, MsgFileLoadSaveMultiple, MsgFileLoadSaveSelectGame);
dialog.ShowDialog(); dialog.ShowDialog();
return dialog.Result; return dialog.Result;
} }
private static bool CheckGCMemoryCard(SAV3GCMemoryCard MC, string path) private static bool CheckGCMemoryCard(SAV3GCMemoryCard memCard, string path)
{ {
var state = MC.GetMemoryCardState(); var state = memCard.GetMemoryCardState();
switch (state) switch (state)
{ {
case GCMemoryCardState.NoPkmSaveGame: case GCMemoryCardState.NoPkmSaveGame:
@ -708,18 +708,18 @@ namespace PKHeX.WinForms
case GCMemoryCardState.MultipleSaveGame: case GCMemoryCardState.MultipleSaveGame:
{ {
GameVersion Game = SelectMemoryCardSaveGame(MC); GameVersion game = SelectMemoryCardSaveGame(memCard);
if (Game == GameVersion.Invalid) //Cancel if (game == GameVersion.Invalid) //Cancel
return false; return false;
MC.SelectSaveGame(Game); memCard.SelectSaveGame(game);
break; break;
} }
case GCMemoryCardState.SaveGameCOLO: MC.SelectSaveGame(GameVersion.COLO); break; case GCMemoryCardState.SaveGameCOLO: memCard.SelectSaveGame(GameVersion.COLO); break;
case GCMemoryCardState.SaveGameXD: MC.SelectSaveGame(GameVersion.XD); break; case GCMemoryCardState.SaveGameXD: memCard.SelectSaveGame(GameVersion.XD); break;
case GCMemoryCardState.SaveGameRSBOX: MC.SelectSaveGame(GameVersion.RSBOX); break; case GCMemoryCardState.SaveGameRSBOX: memCard.SelectSaveGame(GameVersion.RSBOX); break;
default: default:
WinFormsUtil.Error(!SaveUtil.IsSizeValid(MC.Data.Length) ? MsgFileGameCubeBad : MsgFileLoadSaveLoadFail, path); WinFormsUtil.Error(!SaveUtil.IsSizeValid(memCard.Data.Length) ? MsgFileGameCubeBad : MsgFileLoadSaveLoadFail, path);
return false; return false;
} }
return true; return true;