mirror of
https://github.com/AdAstra-LD/DS-Pokemon-Rom-Editor.git
synced 2026-05-10 22:21:05 -05:00
102 lines
3.1 KiB
C#
102 lines
3.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
|
|
namespace NSMBe4.DSFileSystem
|
|
{
|
|
public class InlineFile : File
|
|
{
|
|
private int inlineOffs;
|
|
private int inlineLen;
|
|
private File parentFile;
|
|
private CompressionType comp;
|
|
|
|
public enum CompressionType : int
|
|
{
|
|
NoComp,
|
|
LZComp,
|
|
LZWithHeaderComp
|
|
}
|
|
|
|
public InlineFile(File parent, int offs, int len, string name, Directory parentDir) :
|
|
this(parent, offs, len, name, parentDir, CompressionType.NoComp)
|
|
{
|
|
|
|
}
|
|
|
|
public InlineFile(File parent, int offs, int len, string name, Directory parentDir, CompressionType comp)
|
|
: base(parent.parent, parentDir, parent.name + " - " + name + ":" + offs.ToString("X") + ":" + len)
|
|
{
|
|
parentFile = parent;
|
|
inlineOffs = offs;
|
|
inlineLen = len;
|
|
this.comp = comp;
|
|
this.fixedFile = true;
|
|
this.canChangeOffset = false;
|
|
refreshOffsets();
|
|
}
|
|
|
|
public override byte[] getContents()
|
|
{
|
|
if (comp != CompressionType.NoComp)
|
|
{
|
|
byte[] data;
|
|
if (comp == CompressionType.LZWithHeaderComp)
|
|
data = ROM.LZ77_DecompressWithHeader(parentFile.getContents());
|
|
else
|
|
data = ROM.LZ77_Decompress(parentFile.getContents());
|
|
byte[] thisdata = new byte[inlineLen];
|
|
Array.Copy(data, inlineOffs, thisdata, 0, inlineLen);
|
|
return thisdata;
|
|
}
|
|
else return base.getContents();
|
|
}
|
|
|
|
public override void replace(byte[] newFile, object editor)
|
|
{
|
|
//if (!isAGoodEditor(editor))
|
|
// throw new Exception("NOT CORRECT EDITOR " + name);
|
|
|
|
if (comp != CompressionType.NoComp)
|
|
{
|
|
byte[] data;
|
|
if (comp == CompressionType.LZWithHeaderComp)
|
|
data = ROM.LZ77_DecompressWithHeader(parentFile.getContents());
|
|
else
|
|
data = ROM.LZ77_Decompress(parentFile.getContents());
|
|
Array.Copy(newFile, 0, data, inlineOffs, inlineLen);
|
|
parentFile.replace(ROM.LZ77_Compress(data, comp == CompressionType.LZWithHeaderComp), this);
|
|
}
|
|
else base.replace(newFile, editor);
|
|
}
|
|
|
|
public override void beginEdit(object editor)
|
|
{
|
|
parentFile.beginEditInline(this);
|
|
base.beginEdit(editor);
|
|
}
|
|
|
|
public override void endEdit(object editor)
|
|
{
|
|
parentFile.endEditInline(this);
|
|
base.endEdit(editor);
|
|
}
|
|
|
|
public override void refreshOffsets()
|
|
{
|
|
fileBegin = parentFile.fileBegin + inlineOffs;
|
|
fileSize = inlineLen;
|
|
}
|
|
|
|
public override void saveOffsets()
|
|
{
|
|
}
|
|
|
|
public override void enableEdition()
|
|
{
|
|
refreshOffsets(); // In case the parent file gets moved...
|
|
base.enableEdition();
|
|
}
|
|
}
|
|
}
|