DS-Pokemon-Rom-Editor/DS_Map/ROMFiles/TradeData.cs

146 lines
4.7 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static DSPRE.RomInfo;
namespace DSPRE.ROMFiles
{
internal class TradeData : RomFile
{
public int id;
// TradeData structure in narc
public int species;
public int hpIV;
public int atkIV;
public int defIV;
public int speedIV;
public int spAtkIV;
public int spDefIV;
public int ability; // unused
public int otID;
public int cool;
public int beauty;
public int cute;
public int smart;
public int tough;
public int pid;
public int heldItem;
public int otGender;
public int sheen;
public int language;
public int requestedSpecies;
public int unknown; // unused?
public TradeData(int id, Stream stream)
{
this.id = id;
using (BinaryReader br = new BinaryReader(stream))
{
species = br.ReadInt32();
hpIV = br.ReadInt32();
atkIV = br.ReadInt32();
defIV = br.ReadInt32();
speedIV = br.ReadInt32();
spAtkIV = br.ReadInt32();
spDefIV = br.ReadInt32();
ability = br.ReadInt32(); // appears unused
otID = br.ReadInt32();
cool = br.ReadInt32();
beauty = br.ReadInt32();
cute = br.ReadInt32();
smart = br.ReadInt32();
tough = br.ReadInt32();
pid = br.ReadInt32();
heldItem = br.ReadInt32();
otGender = br.ReadInt32();
sheen = br.ReadInt32();
language = br.ReadInt32();
requestedSpecies = br.ReadInt32();
if (RomInfo.gameFamily == GameFamilies.HGSS)
{
unknown = br.ReadInt32(); // unused?
}
}
}
public TradeData(int id) : this(id, GetStream(id)) { }
private static Stream GetStream(int id)
{
if (!File.Exists(RomInfo.gameDirs[DirNames.tradeData].unpackedDir + "\\" + id.ToString("D4")))
{
// If the file does not exist, create it with default values
FileStream fileStream = new FileStream(RomInfo.gameDirs[DirNames.tradeData].unpackedDir + "\\" + id.ToString("D4"), FileMode.Create);
fileStream.Write(new byte[0x50], 0, 0x50); // create an empty file
if (RomInfo.gameFamily == GameFamilies.HGSS)
{
fileStream.Write(new byte[0x04], 0, 0x04); // HGSS only
}
fileStream.Seek(0, SeekOrigin.Begin); // Reset the position to the start of the file
return fileStream;
}
return new FileStream(RomInfo.gameDirs[DirNames.tradeData].unpackedDir + "\\" + id.ToString("D4"), FileMode.Open);
}
public override byte[] ToByteArray()
{
using (MemoryStream ms = new MemoryStream())
using (BinaryWriter bw = new BinaryWriter(ms))
{
bw.Write(species);
bw.Write(hpIV);
bw.Write(atkIV);
bw.Write(defIV);
bw.Write(speedIV);
bw.Write(spAtkIV);
bw.Write(spDefIV);
bw.Write(ability); // unused
bw.Write(otID);
bw.Write(cool);
bw.Write(beauty);
bw.Write(cute);
bw.Write(smart);
bw.Write(tough);
bw.Write(pid);
bw.Write(heldItem);
bw.Write(otGender);
bw.Write(sheen);
bw.Write(language);
bw.Write(requestedSpecies);
if (RomInfo.gameFamily == GameFamilies.HGSS)
{
bw.Write(unknown); // HGSS only
}
return ms.ToArray();
}
}
public void SaveToFileDefaultDir(int IDtoReplace, bool showSuccessMessage = true)
{
SaveToFileDefaultDir(DirNames.tradeData, IDtoReplace, showSuccessMessage);
}
public void SaveToFileExplorePath(string suggestedFileName, bool showSuccessMessage = true)
{
SaveToFileExplorePath("Gen IV Trade data", "bin", suggestedFileName, showSuccessMessage);
}
public static int GetTradeCount()
{
return Directory.GetFiles(RomInfo.gameDirs[DirNames.tradeData].unpackedDir, "*.*").Length;
}
}
}