mirror of
https://github.com/AdAstra-LD/DS-Pokemon-Rom-Editor.git
synced 2026-05-09 21:50:57 -05:00
- minor refactor - optimized script buttons dialog - removed unreachable codes [break after return in switch statements] - added selective header loading - moved narclist to romInfo class - more fixes to the romInfo class [get/set] - added new event editor icons for warps, triggers and spawnables - wild poke editor now detects selected header
115 lines
4.6 KiB
C#
115 lines
4.6 KiB
C#
using System;
|
|
using System.IO;
|
|
|
|
namespace AB_API
|
|
{
|
|
public class AB
|
|
{
|
|
public static void Extract(string filePath, string dirPath)
|
|
{
|
|
BinaryReader read = new BinaryReader(File.OpenRead(filePath));
|
|
if (read.ReadUInt16() != 0x4241)
|
|
{
|
|
read.Close();
|
|
return;
|
|
}
|
|
int fileCount = read.ReadUInt16();
|
|
int[] offsets = new int[fileCount];
|
|
for (int i = 0; i < fileCount; i++)
|
|
{
|
|
offsets[i] = read.ReadInt32();
|
|
}
|
|
FileStream file;
|
|
byte[] buffer;
|
|
if (Directory.Exists(dirPath + "\\" + "header"))
|
|
{
|
|
Directory.Delete(dirPath + "\\" + "header", true);
|
|
}
|
|
if (Directory.Exists(dirPath + "\\" + "model"))
|
|
{
|
|
Directory.Delete(dirPath + "\\" + "model", true);
|
|
}
|
|
Directory.CreateDirectory(dirPath + "\\" + "header");
|
|
Directory.CreateDirectory(dirPath + "\\" + "model");
|
|
for (int i = 0; i < fileCount / 2; i++)
|
|
{
|
|
read.BaseStream.Position = offsets[i] + 19;
|
|
int count = read.ReadByte();
|
|
if (count == 0)
|
|
{
|
|
file = File.Create(dirPath + "\\" + "header" + "\\" + i.ToString("D4"));
|
|
read.BaseStream.Position = offsets[i];
|
|
buffer = new byte[0x24];
|
|
read.Read(buffer, 0, 0x24);
|
|
file.Write(buffer, 0, 0x24);
|
|
file.Close();
|
|
}
|
|
else
|
|
{
|
|
BinaryWriter write = new BinaryWriter(File.Create(dirPath + "\\" + "header" + "\\" + i.ToString("D4")));
|
|
if (count == 2)
|
|
read.BaseStream.Position += 4;
|
|
if (count == 3)
|
|
read.BaseStream.Position += 8;
|
|
if (count == 4)
|
|
read.BaseStream.Position += 12;
|
|
int offset = read.ReadInt32();
|
|
read.BaseStream.Position = offsets[i] + 0x18 + offset;
|
|
int size = read.ReadInt32();
|
|
read.BaseStream.Position = offsets[i];
|
|
for (int j = 0; j < 0x10 + offset + size; j++)
|
|
{
|
|
write.Write((byte)read.ReadByte());
|
|
}
|
|
write.Close();
|
|
}
|
|
}
|
|
for (int i = fileCount / 2; i < fileCount; i++)
|
|
{
|
|
read.BaseStream.Position = offsets[i] + 8;
|
|
BinaryWriter write = new BinaryWriter(File.Create(dirPath + "\\" + "model" + "\\" + (i - fileCount / 2).ToString("D4")));
|
|
int size = read.ReadInt32();
|
|
read.BaseStream.Position = offsets[i];
|
|
for (int j = 0; j < size; j++)
|
|
{
|
|
write.Write((byte)read.ReadByte());
|
|
}
|
|
write.Close();
|
|
}
|
|
read.Close();
|
|
}
|
|
|
|
public static void Pack(string dirPath, string filePath)
|
|
{
|
|
BinaryWriter write = new BinaryWriter(File.Create(filePath));
|
|
int count = Directory.GetFiles(dirPath + "\\" + "header").Length;
|
|
write.Write((Int16)0x4241);
|
|
write.Write((Int16)(count * 2));
|
|
int offset = 0x4 + (count * 2) * 4;
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
write.Write((UInt32)offset);
|
|
offset += (int)new FileInfo(dirPath + "\\" + "header" + "\\" + i.ToString("D4")).Length;
|
|
}
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
write.Write((UInt32)offset);
|
|
offset += (int)new FileInfo(dirPath + "\\" + "model" + "\\" + i.ToString("D4")).Length;
|
|
}
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
BinaryReader read = new BinaryReader(File.OpenRead(dirPath + "\\" + "header" + "\\" + i.ToString("D4")));
|
|
write.Write(read.ReadBytes((int)new FileInfo(dirPath + "\\" + "header" + "\\" + i.ToString("D4")).Length));
|
|
read.Close();
|
|
}
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
BinaryReader read = new BinaryReader(File.OpenRead(dirPath + "\\" + "model" + "\\" + i.ToString("D4")));
|
|
write.Write(read.ReadBytes((int)new FileInfo(dirPath + "\\" + "model" + "\\" + i.ToString("D4")).Length));
|
|
read.Close();
|
|
}
|
|
write.Close();
|
|
}
|
|
}
|
|
}
|