Пример #1
0
        public CDMD(byte[] Data)
        {
            EndianBinaryReaderEx er = new EndianBinaryReaderEx(new MemoryStream(Data), Endianness.LittleEndian);

            try
            {
                Header = new CDMDHeader(er);
                foreach (var v in Header.SectionOffsets)
                {
                    er.BaseStream.Position = Header.HeaderSize + v;
                    String sig = er.ReadString(Encoding.ASCII, 4);
                    er.BaseStream.Position -= 4;
                    switch (sig)
                    {
                    case "TPTK": KartPoint = new KTPT(er); break;

                    case "TPNE": EnemyPoint = new ENPT(er); break;

                    case "HPNE": EnemyPointPath = new ENPH(er); break;

                    case "TPTI": ItemPoint = new ITPT(er); break;

                    case "HPTI": ItemPointPath = new ITPH(er); break;

                    case "TPKC": CheckPoint = new CKPT(er); break;

                    case "HPKC": CheckPointPath = new CKPH(er); break;

                    case "JBOG": GlobalObject = new GOBJ(er); break;

                    case "ITOP": PointInfo = new POTI(er); break;

                    case "AERA": Area = new AREA(er); break;

                    case "EMAC": Camera = new CAME(er); break;

                    case "TPGJ": JugemPoint = new JGPT(er); break;

                    case "TPLG": GliderPoint = new GLPT(er); break;

                    case "HPLG": GliderPointPath = new GLPH(er); break;

                    default:
                        //throw new Exception("Unknown Section: " + sig);
                        continue;
                        //goto cont;
                    }
                }
cont:
                ;
            }
            catch (SignatureNotCorrectException e)
            {
                MessageBox.Show(e.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                er.Close();
            }
        }
Пример #2
0
        public CMSN(byte[] Data)
        {
            Sections = new List <BaseSection>();
            EndianBinaryReaderEx er = new EndianBinaryReaderEx(new MemoryStream(Data), Endianness.LittleEndian);

            Header = new CMSNHeader(er);
            er.BaseStream.Position = Header.SectionTableOffset;
            uint sections = er.ReadUInt32();

            for (int i = 0; i < sections; i++)
            {
                uint sectionType   = er.ReadUInt32();
                uint sectionOffset = er.ReadUInt32();
                long prevPos       = er.BaseStream.Position;
                er.BaseStream.Position = sectionOffset + Header.SectionsOffset;
                switch ((BaseSection.SectionType)sectionType)
                {
                case BaseSection.SectionType.DriverOptions:
                    Sections.Add(new DriverOptionsSection(er));
                    break;

                case BaseSection.SectionType.MissionFlags:
                    Sections.Add(new MissionFlagsSection(er));
                    break;

                case BaseSection.SectionType.ItemOptions:
                    Sections.Add(new ItemOptionsSection(er));
                    break;

                default:
                    throw new NotImplementedException("Section " + sectionType + " not implemented!");
                }
                er.BaseStream.Position = prevPos;
            }
        }
Пример #3
0
        public static Vector3 ToVector3(uint vec, int intPart = 0, int fracPart = 9)
        {
            var buffer = new byte[] { 0x00, 0x00 };
            var coords = new[] { (ushort)(vec & 0x3FF), (ushort)((vec >> 10) & 0x3FF), (ushort)((vec >> 20) & 0x3FF) };

            var m = new MemoryStream(buffer);

            var ew = new EndianBinaryWriterEx(m, Endianness.LittleEndian);
            var er = new EndianBinaryReaderEx(m, Endianness.LittleEndian);

            ew.Write(coords[0]);
            m.Position = 0;
            float x = er.ReadFixedPoint(true, intPart, fracPart);

            m.Position = 0;
            ew.Write(coords[1]);
            m.Position = 0;
            float y = er.ReadFixedPoint(true, intPart, fracPart);

            m.Position = 0;
            ew.Write(coords[2]);
            m.Position = 0;
            float z = er.ReadFixedPoint(true, intPart, fracPart);

            m.Close();

            return(x, y, z);
        }
Пример #4
0
            public INFO(EndianBinaryReaderEx er)
            {
                /*Signature = er.ReadString(Encoding.ASCII, 4);
                 * if (Signature != "INFO") throw new SignatureNotCorrectException(Signature, "INFO", er.BaseStream.Position - 4);
                 * SectionSize = er.ReadUInt32();
                 * long basepos = er.BaseStream.Position;
                 * SoundInfoSignature = er.ReadUInt32();
                 * SoundInfoOffset = er.ReadUInt32();
                 * SoundGroupInfoSignature = er.ReadUInt32();
                 * SoundGroupInfoOffset = er.ReadUInt32();
                 * BankInfoSignature = er.ReadUInt32();
                 * BankInfoOffset = er.ReadUInt32();
                 * WaveArchiveInfoSignature = er.ReadUInt32();
                 * WaveArchiveInfoOffset = er.ReadUInt32();
                 * GroupInfoSignature = er.ReadUInt32();
                 * GroupInfoOffset = er.ReadUInt32();
                 * PlayerInfoSignature = er.ReadUInt32();
                 * PlayerInfoOffset = er.ReadUInt32();
                 * FileInfoSignature = er.ReadUInt32();
                 * FileInfoOffset = er.ReadUInt32();
                 * SoundArchivePlayerInfoSignature = er.ReadUInt32();
                 * SoundArchivePlayerInfoOffset = er.ReadUInt32();*/
                long basepos = er.BaseStream.Position + 8;

                er.ReadObject(this);

                er.BaseStream.Position = basepos + SoundInfoOffset;
                SoundInfo = new INFOInfoBlock <INFOSoundInfoEntry>(er);
            }
Пример #5
0
 public MissionFlagsSection(EndianBinaryReaderEx er) : this()
 {
     CourseID      = er.ReadUInt32();
     Class         = er.ReadByte();
     CPUDifficulty = er.ReadByte();
     er.ReadPadding(4);
 }
 public ThemeIconPlateBGColor(EndianBinaryReaderEx er)
 {
     Dark  = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     Main  = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     Light = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     er.ReadPadding(0x10);
 }
 public ThemeLRButtonArrowColor(EndianBinaryReaderEx er)
 {
     Dark   = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     Main   = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     Expand = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     er.ReadPadding(0x10);
 }
Пример #8
0
 public Map(EndianBinaryReaderEx er)
 {
     BottomLeftX = er.ReadSingle();
     BottomLeftZ = er.ReadSingle();
     TopRightX   = er.ReadSingle();
     TopRightZ   = er.ReadSingle();
 }
Пример #9
0
        public static uint FromVector3(Vector3 vec, int intPart = 0, int fracPart = 9)
        {
            var buffer = new byte[] { 0x00, 0x00 };

            var coords = new ushort[3];

            var m = new MemoryStream(buffer);

            var ew = new EndianBinaryWriterEx(m, Endianness.LittleEndian);
            var er = new EndianBinaryReaderEx(m, Endianness.LittleEndian);

            ew.WriteFixedPoint(vec.X, true, intPart, fracPart);
            m.Position = 0;
            coords[0]  = er.ReadUInt16();

            m.Position = 0;
            ew.WriteFixedPoint(vec.Y, true, intPart, fracPart);
            m.Position = 0;
            coords[1]  = er.ReadUInt16();

            m.Position = 0;
            ew.WriteFixedPoint(vec.Z, true, intPart, fracPart);
            m.Position = 0;
            coords[2]  = er.ReadUInt16();

            m.Close();

            var res = (uint)(coords[0] | (coords[1] << 10) | (coords[2] << 20));

            return(res);
        }
Пример #10
0
        public KMP(byte[] Data)
        {
            EndianBinaryReaderEx er = new EndianBinaryReaderEx(new MemoryStream(Data), Endianness.LittleEndian);

            try
            {
                Header = new KMPHeader(er);
                foreach (var v in Header.SectionOffsets)
                {
                    er.BaseStream.Position = Header.HeaderSize + v;
                    String sig = er.ReadString(Encoding.ASCII, 4);
                    er.BaseStream.Position -= 4;
                    switch (sig)
                    {
                    case "TPTK": KartPoint = new KTPT(er); break;

                    case "TPNE": EnemyPoint = new ENPT(er); break;

                    case "HPNE": EnemyPointPath = new ENPH(er); break;

                    case "TPTI": ItemPoint = new ITPT(er); break;

                    case "HPTI": ItemPointPath = new ITPH(er); break;

                    case "TPKC": CheckPoint = new CKPT(er); break;

                    case "HPKC": CheckPointPath = new CKPH(er); break;

                    case "JBOG": GlobalObject = new GOBJ(er); break;

                    case "ITOP": PointInfo = new POTI(er); break;

                    case "AERA": Area = new AREA(er); break;

                    case "EMAC": Camera = new CAME(er); break;

                    case "TPGJ": JugemPoint = new JGPT(er); break;

                    case "TPNC": CannonPoint = new CNPT(er); break;

                    case "TPSM": MissionPoint = new MSPT(er); break;

                    case "IGTS": StageInfo = new STGI(er); break;

                    case "SROC": CourseSect = new CORS(er); break;

                    case "TPLG": GliderPoint = new GLPT(er); break;

                    case "HPLG": GliderPointPath = new GLPH(er); break;

                    default: continue;
                    }
                }
            }
            finally
            {
                er.Close();
            }
        }
Пример #11
0
 public ThemeTextWithBGColor(EndianBinaryReaderEx er)
 {
     Main     = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     Light    = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     Shadow   = er.ReadColor8();
     TextMain = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     er.ReadPadding(0x10);
 }
Пример #12
0
 public ThemeColorShadowAlpha(EndianBinaryReaderEx er)
 {
     Dark   = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     Main   = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     Light  = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     Shadow = er.ReadColor8();
     er.ReadPadding(0x10);
 }
Пример #13
0
 public ThemeFolderColor(EndianBinaryReaderEx er)
 {
     Dark   = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     Main   = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     Light  = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     Shadow = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     er.ReadPadding(0x10);
 }
Пример #14
0
 public ThemeSelectorColor(EndianBinaryReaderEx er)
 {
     Dark   = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     Main   = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     Light  = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     Expand = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     er.ReadPadding(0x10);
 }
Пример #15
0
 public SMDHHeader(EndianBinaryReaderEx er)
 {
     er.ReadObject(this);
     //Signature = er.ReadString(Encoding.ASCII, 4);
     //if (Signature != "SMDH") throw new SignatureNotCorrectException(Signature, "SMDH", er.BaseStream.Position - 4);
     //Version = er.ReadUInt16();
     //Reserved = er.ReadUInt16();
 }
Пример #16
0
 public STRMEntry(EndianBinaryReaderEx er)
 {
     minX = er.ReadSingle();
     minZ = er.ReadSingle();
     maxX = er.ReadSingle();
     maxZ = er.ReadSingle();
     area = (maxX - minX) * (maxZ - minZ);
 }
Пример #17
0
 public STRMEntry(EndianBinaryReaderEx er)
 {
     er.ReadObject(this);
     //Unknown1 = er.ReadSingle();
     //Unknown2 = er.ReadSingle();
     //Unknown3 = er.ReadSingle();
     //Unknown4 = er.ReadSingle();
 }
Пример #18
0
            public BSEQFlowEntry(EndianBinaryReaderEx er, BSEQSequenceID seqID)
            {
                srcSubSeq = er.ReadInt16();
                srcID     = er.ReadUInt16();
                dstSubSeq = er.ReadInt16();
                dstID     = er.ReadUInt16();

                OwnSequenceID = seqID;
            }
Пример #19
0
 public SHAP(EndianBinaryReaderEx er)
 {
     Signature = er.ReadString(Encoding.ASCII, 4);
     if (Signature != "PAHS")
     {
         throw new FormatException("Invalid signature: " + Signature);
     }
     NrStreams = er.ReadUInt32();
 }
Пример #20
0
 public STRM(EndianBinaryReaderEx er)
 {
     er.ReadObject(this);
     Entries = new STRMEntry[NrEntries];
     for (int i = 0; i < NrEntries; i++)
     {
         Entries[i] = new STRMEntry(er);
     }
 }
Пример #21
0
 public ThemeTopBGColor(EndianBinaryReaderEx er)
 {
     BGColor       = Color.FromArgb(er.ReadByte(), er.ReadByte(), er.ReadByte());
     GradientAlpha = er.ReadByte();
     PatternAlpha  = er.ReadByte();
     Unknown1      = er.ReadByte();
     Unknown2      = er.ReadByte();
     er.ReadPadding(0x10);
 }
Пример #22
0
        public static SbcCommand Read(EndianBinaryReaderEx er)
        {
            var byteCmd = er.ReadByte();
            var cmd     = (Commands)(byteCmd & 0x1F);
            var opt     = (byte)((byteCmd & 0xE0) >> 5);

            //var cmdItem = new SbcCommand { Type = cmd, Operator = opt };

            switch (cmd)
            {
            case Commands.Nop:
                return(new SbcNop());

            case Commands.Ret:
                return(new SbcRet());

            case Commands.Node:
                return(new SbcNode(er));

            case Commands.Mtx:
                return(new SbcMtx(er));

            case Commands.Mat:
                return(new SbcMat(opt, er));

            case (Commands)5:    //Commands.Shp:
                return(new SbcShape(er));

            case Commands.Nodedesc:
                return(new SbcNodeDesc(opt, er));

            case Commands.BB:
                return(new SbcBillboard(opt, er));

            case Commands.BBY:
                return(new SbcBillboardY(opt, er));

            case Commands.Nodemix:
                return(new SbcNodeMix(er));

            case Commands.CallDl:
                return(new SbcCallDl(er));

            case Commands.Posscale:
                return(new SbcPosScale(opt, er));

            case Commands.Envmap:
                return(new SbcEnvMap(er));

            case Commands.Prjmap:
                return(new SbcPrjMap(er));

            default:
                return(null);
            }
        }
Пример #23
0
 public SFNT(EndianBinaryReaderEx er)
 {
     Signature = er.ReadString(Encoding.ASCII, 4);
     if (Signature != "SFNT")
     {
         throw new SignatureNotCorrectException(Signature, "SFNT", er.BaseStream.Position - 4);
     }
     HeaderSize = er.ReadUInt16();
     Unknown1   = er.ReadUInt16();
 }
Пример #24
0
            static public UInt16 GetBlockType(EndianBinaryReaderEx er)
            {
                long prevPosition = er.BaseStream.Position;

                er.BaseStream.Position += 0xE;
                UInt16 ret = er.ReadUInt16();

                er.BaseStream.Position = prevPosition;
                return(ret);
            }
Пример #25
0
 public CORS(EndianBinaryReaderEx er)
 {
     Signature = er.ReadString(Encoding.ASCII, 4);
     if (Signature != "SROC")
     {
         throw new SignatureNotCorrectException(Signature, "SROC", er.BaseStream.Position - 4);
     }
     NrEntries = er.ReadUInt32();
     //for (int i = 0; i < NrEntries; i++) Entries.Add(new AREAEntry(er));
 }
Пример #26
0
                public override void Read(EndianBinaryReaderEx er)
                {
                    FileID   = er.ReadUInt32();
                    PlayerID = er.ReadUInt32();
                    Volume   = er.ReadByte();
                    Padding  = er.ReadBytes(3);

                    SpecificInfoSignature = er.ReadUInt32();
                    SpecificInfoOffset    = er.ReadUInt32();
                }
Пример #27
0
 public IPOIEntry(EndianBinaryReaderEx er, UInt16 Version)
 {
     this.Version = Version;
     Position     = er.ReadVecFx32();
     PointSize    = er.ReadFx32();
     if (Version >= 34)
     {
         Unknown2 = er.ReadUInt32();
     }
 }
Пример #28
0
 public STRGPatriciaTree(EndianBinaryReaderEx er)
 {
     RootNodeIndex = er.ReadUInt32();
     NrNodes       = er.ReadUInt32();
     Nodes         = new PatriciaTreeNode[NrNodes];
     for (int i = 0; i < NrNodes; i++)
     {
         Nodes[i] = new PatriciaTreeNode(er);
     }
 }
Пример #29
0
 public Sbc(byte[] sbc)
 {
     using (var er = new EndianBinaryReaderEx(new MemoryStream(sbc), Endianness.LittleEndian))
     {
         while (er.BaseStream.Position < er.BaseStream.Length)
         {
             CommandList.Add(SbcCommand.Read(er));
         }
     }
 }
Пример #30
0
 public BSEQSceneSequenceProxyBlock(EndianBinaryReaderEx er, BSEQNameTable nameTable)
 {
     Count = er.ReadUInt16();
     if (Count != 1)
     {
         throw new InvalidDataException("ProxyBlock Count not 1: (" + Count + ")");
     }
     UnknownName = new BSEQNameOffset(er, nameTable);
     SceneName   = new BSEQNameOffset(er, nameTable);
     Unknown     = er.ReadUInt16();
 }