using System;
using System.IO;

public class FilePack
{
	private string[] fname;

	private int[] fpos;

	private int[] flen;

	private sbyte[] fullData;

	private int nFile;

	private int hSize;

	private string name;

	private static sbyte[] code = new sbyte[13]
	{
		78, 103, 117, 121, 101, 110, 86, 97, 110, 77,
		105, 110, 104
	};

	private int codeLen = code.Length;

	private DataInputStream file;

	public FilePack(sbyte[] DATA)
	{
		file = new DataInputStream(DATA);
		int num = 0;
		int num2 = 0;
		hSize = 0;
		try
		{
			nFile = encode(file.readUnsignedByte());
			hSize++;
			fname = new string[nFile];
			fpos = new int[nFile];
			flen = new int[nFile];
			for (int i = 0; i < nFile; i++)
			{
				int num3 = encode(file.readByte());
				sbyte[] data = new sbyte[num3];
				file.read(ref data);
				encode(data);
				fname[i] = data.ToString();
				fpos[i] = num;
				flen[i] = encode(file.readUnsignedShort());
				num += flen[i];
				num2 += flen[i];
				hSize += num3 + 3;
			}
			fullData = new sbyte[num2];
			file.readFully(ref fullData);
			encode(fullData);
		}
		catch (IOException)
		{
		}
		close();
	}

	public FilePack(string name)
	{
		int num = 0;
		int num2 = 0;
		this.name = name;
		hSize = 0;
		open();
		try
		{
			nFile = encode(file.readUnsignedByte());
			hSize++;
			fname = new string[nFile];
			fpos = new int[nFile];
			flen = new int[nFile];
			for (int i = 0; i < nFile; i++)
			{
				int num3 = encode(file.readByte());
				sbyte[] data = new sbyte[num3];
				file.read(ref data);
				encode(data);
				fname[i] = data.ToString();
				fpos[i] = num;
				flen[i] = encode(file.readUnsignedShort());
				num += flen[i];
				num2 += flen[i];
				hSize += num3 + 3;
			}
			fullData = new sbyte[num2];
			file.readFully(ref fullData);
			encode(fullData);
		}
		catch (IOException)
		{
		}
		close();
	}

	private int encode(int i)
	{
		return i;
	}

	private void encode(sbyte[] bytes)
	{
		int num = bytes.Length;
		for (int i = 0; i < num; i++)
		{
			bytes[i] ^= code[i % codeLen];
		}
	}

	private void open()
	{
		CRes.outz("open filepack");
		file = MyStream.readFile(name);
	}

	private void close()
	{
		try
		{
			if (file != null)
			{
				file.close();
			}
		}
		catch (IOException)
		{
		}
	}

	public sbyte[] loadFile(string fileName)
	{
		for (int i = 0; i < nFile; i++)
		{
			if (fname[i].CompareTo(fileName) == 0)
			{
				sbyte[] array = new sbyte[flen[i]];
				mSystem.arraycopy(fullData, fpos[i], array, 0, flen[i]);
				return array;
			}
		}
		throw new Exception("File '" + fileName + "' not found!");
	}

	public Image loadImage(string fileName)
	{
		for (int i = 0; i < nFile; i++)
		{
			if (fname[i].CompareTo(fileName) == 0)
			{
				return Image.createImage(fullData, fpos[i], flen[i]);
			}
		}
		CRes.outz("File '" + fileName + "' not found!");
		return null;
	}
}
