示例#1
0
        public static LandTable LoadFromFile(string filename)
        {
            bool be = ByteConverter.BigEndian;

            ByteConverter.BigEndian = false;
            byte[] file    = File.ReadAllBytes(filename);
            ulong  magic   = ByteConverter.ToUInt64(file, 0) & FormatMask;
            byte   version = file[7];

            if (version > CurrentVersion)
            {
                throw new FormatException("Not a valid SA1LVL/SA2LVL file.");
            }
            Dictionary <int, string> labels = new Dictionary <int, string>();
            string author = null, description = null, tool = null;
            Dictionary <uint, byte[]> meta = new Dictionary <uint, byte[]>();

            if (version < 2)
            {
                if (version == 1)
                {
                    int tmpaddr = ByteConverter.ToInt32(file, 0xC);
                    if (tmpaddr != 0)
                    {
                        int addr = ByteConverter.ToInt32(file, tmpaddr);
                        while (addr != -1)
                        {
                            labels.Add(addr, file.GetCString(ByteConverter.ToInt32(file, tmpaddr + 4)));
                            tmpaddr += 8;
                            addr     = ByteConverter.ToInt32(file, tmpaddr);
                        }
                    }
                }
            }
            else
            {
                int tmpaddr = ByteConverter.ToInt32(file, 0xC);
                if (tmpaddr != 0)
                {
                    bool finished = false;
                    while (!finished)
                    {
                        ChunkTypes type      = (ChunkTypes)ByteConverter.ToUInt32(file, tmpaddr);
                        int        chunksz   = ByteConverter.ToInt32(file, tmpaddr + 4);
                        int        nextchunk = tmpaddr + 8 + chunksz;
                        tmpaddr += 8;
                        if (version == 2)
                        {
                            switch (type)
                            {
                            case ChunkTypes.Label:
                                while (ByteConverter.ToInt64(file, tmpaddr) != -1)
                                {
                                    labels.Add(ByteConverter.ToInt32(file, tmpaddr), file.GetCString(ByteConverter.ToInt32(file, tmpaddr + 4)));
                                    tmpaddr += 8;
                                }
                                break;

                            case ChunkTypes.Author:
                                author = file.GetCString(tmpaddr);
                                break;

                            case ChunkTypes.Tool:
                                tool = file.GetCString(tmpaddr);
                                break;

                            case ChunkTypes.Description:
                                description = file.GetCString(tmpaddr);
                                break;

                            case ChunkTypes.End:
                                finished = true;
                                break;
                            }
                        }
                        else
                        {
                            byte[] chunk = new byte[chunksz];
                            Array.Copy(file, tmpaddr, chunk, 0, chunksz);
                            int chunkaddr = 0;
                            switch (type)
                            {
                            case ChunkTypes.Label:
                                while (ByteConverter.ToInt64(chunk, chunkaddr) != -1)
                                {
                                    labels.Add(ByteConverter.ToInt32(chunk, chunkaddr),
                                               chunk.GetCString(ByteConverter.ToInt32(chunk, chunkaddr + 4)));
                                    chunkaddr += 8;
                                }
                                break;

                            case ChunkTypes.Author:
                                author = chunk.GetCString(0);
                                break;

                            case ChunkTypes.Tool:
                                tool = chunk.GetCString(0);
                                break;

                            case ChunkTypes.Description:
                                description = chunk.GetCString(0);
                                break;

                            case ChunkTypes.End:
                                finished = true;
                                break;

                            default:
                                meta.Add((uint)type, chunk);
                                break;
                            }
                        }
                        tmpaddr = nextchunk;
                    }
                }
            }
            if (magic == SA1LVL)
            {
                LandTable table = new LandTable(file, ByteConverter.ToInt32(file, 8), 0, LandTableFormat.SA1, labels)
                {
                    Author      = author,
                    Description = description,
                    Tool        = tool,
                    Metadata    = meta
                };
                ByteConverter.BigEndian = be;
                return(table);
            }
            if (magic == SA2LVL)
            {
                LandTable table = new LandTable(file, ByteConverter.ToInt32(file, 8), 0, LandTableFormat.SA2, labels)
                {
                    Author      = author,
                    Description = description,
                    Tool        = tool,
                    Metadata    = meta
                };
                ByteConverter.BigEndian = be;
                return(table);
            }
            ByteConverter.BigEndian = be;
            throw new FormatException("Not a valid SA1LVL/SA2LVL file.");
        }
示例#2
0
 public static LandTable LoadFromFile(string filename)
 {
     bool be = ByteConverter.BigEndian;
     ByteConverter.BigEndian = false;
     byte[] file = File.ReadAllBytes(filename);
     ulong magic = ByteConverter.ToUInt64(file, 0) & FormatMask;
     byte version = file[7];
     if (version > CurrentVersion)
         throw new FormatException("Not a valid SA1LVL/SA2LVL file.");
     Dictionary<int, string> labels = new Dictionary<int, string>();
     string author = null, description = null, tool = null;
     Dictionary<uint, byte[]> meta = new Dictionary<uint, byte[]>();
     if (version < 2)
     {
         if (version == 1)
         {
             int tmpaddr = ByteConverter.ToInt32(file, 0xC);
             if (tmpaddr != 0)
             {
                 int addr = ByteConverter.ToInt32(file, tmpaddr);
                 while (addr != -1)
                 {
                     labels.Add(addr, file.GetCString(ByteConverter.ToInt32(file, tmpaddr + 4)));
                     tmpaddr += 8;
                     addr = ByteConverter.ToInt32(file, tmpaddr);
                 }
             }
         }
     }
     else
     {
         int tmpaddr = ByteConverter.ToInt32(file, 0xC);
         if (tmpaddr != 0)
         {
             bool finished = false;
             while (!finished)
             {
                 ChunkTypes type = (ChunkTypes)ByteConverter.ToUInt32(file, tmpaddr);
                 int chunksz = ByteConverter.ToInt32(file, tmpaddr + 4);
                 int nextchunk = tmpaddr + 8 + chunksz;
                 tmpaddr += 8;
                 if (version == 2)
                 {
                     switch (type)
                     {
                         case ChunkTypes.Label:
                             while (ByteConverter.ToInt64(file, tmpaddr) != -1)
                             {
                                 labels.Add(ByteConverter.ToInt32(file, tmpaddr), file.GetCString(ByteConverter.ToInt32(file, tmpaddr + 4)));
                                 tmpaddr += 8;
                             }
                             break;
                         case ChunkTypes.Author:
                             author = file.GetCString(tmpaddr);
                             break;
                         case ChunkTypes.Tool:
                             tool = file.GetCString(tmpaddr);
                             break;
                         case ChunkTypes.Description:
                             description = file.GetCString(tmpaddr);
                             break;
                         case ChunkTypes.End:
                             finished = true;
                             break;
                     }
                 }
                 else
                 {
                     byte[] chunk = new byte[chunksz];
                     Array.Copy(file, tmpaddr, chunk, 0, chunksz);
                     int chunkaddr = 0;
                     switch (type)
                     {
                         case ChunkTypes.Label:
                             while (ByteConverter.ToInt64(chunk, chunkaddr) != -1)
                             {
                                 labels.Add(ByteConverter.ToInt32(chunk, chunkaddr),
                                     chunk.GetCString(ByteConverter.ToInt32(chunk, chunkaddr + 4)));
                                 chunkaddr += 8;
                             }
                             break;
                         case ChunkTypes.Author:
                             author = chunk.GetCString(0);
                             break;
                         case ChunkTypes.Tool:
                             tool = chunk.GetCString(0);
                             break;
                         case ChunkTypes.Description:
                             description = chunk.GetCString(0);
                             break;
                         case ChunkTypes.End:
                             finished = true;
                             break;
                         default:
                             meta.Add((uint)type, chunk);
                             break;
                     }
                 }
                 tmpaddr = nextchunk;
             }
         }
     }
     if (magic == SA1LVL)
     {
         LandTable table = new LandTable(file, ByteConverter.ToInt32(file, 8), 0, LandTableFormat.SA1, labels)
         {
             Author = author,
             Description = description,
             Tool = tool,
             Metadata = meta
         };
         ByteConverter.BigEndian = be;
         return table;
     }
     if (magic == SA2LVL)
     {
         LandTable table = new LandTable(file, ByteConverter.ToInt32(file, 8), 0, LandTableFormat.SA2, labels)
         {
             Author = author,
             Description = description,
             Tool = tool,
             Metadata = meta
         };
         ByteConverter.BigEndian = be;
         return table;
     }
     ByteConverter.BigEndian = be;
     throw new FormatException("Not a valid SA1LVL/SA2LVL file.");
 }