DS-Pokemon-Rom-Editor/DS_Map/AB.cs
AdAstra-LD dd73a861de Misc optimizations and fixes
- 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
2021-01-15 03:35:41 +01:00

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();
}
}
}