コード例 #1
0
        private void LoadAnimations(Robot robot, Polymodel model)
        {
            robot.NumGuns = (sbyte)model.NumGuns;
            for (int i = 0; i < 8; i++)
            {
                robot.GunPoints[i]    = model.GunPoints[i];
                robot.GunSubmodels[i] = (byte)model.GunSubmodels[i];
            }
            for (int m = 0; m < 9; m++)
            {
                for (int f = 0; f < 5; f++)
                {
                    robot.AnimStates[m, f].NumJoints = 0;
                    robot.AnimStates[m, f].Offset    = 0;
                }
            }
            if (!model.IsAnimated)
            {
                return;
            }
            int[] gunNums = new int[10];

            for (int i = 1; i < model.NumSubmodels; i++)
            {
                gunNums[i] = robot.NumGuns;
            }
            gunNums[0] = -1;

            for (int g = 0; g < robot.NumGuns; g++)
            {
                int m = robot.GunSubmodels[g];

                while (m != 0)
                {
                    gunNums[m] = g;
                    m          = model.Submodels[m].Parent;
                }
            }

            for (int g = 0; g < robot.NumGuns + 1; g++)
            {
                for (int state = 0; state < 5; state++)
                {
                    robot.AnimStates[g, state].NumJoints = 0;
                    robot.AnimStates[g, state].Offset    = (short)(Joints.Count + VHAMFile.NumDescent2Joints);

                    for (int m = 0; m < model.NumSubmodels; m++)
                    {
                        if (gunNums[m] == g)
                        {
                            JointPos joint = new JointPos();
                            joint.JointNum = (short)m;
                            joint.Angles   = model.AnimationMatrix[m, state];
                            Joints.Add(joint);
                            robot.AnimStates[g, state].NumJoints++;
                        }
                    }
                }
            }
        }
コード例 #2
0
        public Descent1PIGFile(bool macPig = false, bool loadData = true)
        {
            Textures  = new ushort[800];
            TMapInfo  = new TMAPInfo[800];
            SoundIDs  = new byte[250];
            AltSounds = new byte[250];
            VClips    = new VClip[70];
            EClips    = new EClip[60];
            WClips    = new WClip[30];
            Robots    = new Robot[30];
            Joints    = new JointPos[600];
            Weapons   = new Weapon[30];
            Models    = new Polymodel[85];
            if (macPig)
            {
                Gauges = new ushort[85];
            }
            else
            {
                Gauges = new ushort[80];
            }
            ObjBitmaps        = new ushort[210];
            ObjBitmapPointers = new ushort[210];
            Cockpits          = new ushort[4];
            ObjectTypes       = new EditorObjectDefinition[100];
            Powerups          = new Powerup[29];
            BitmapXLATData    = new ushort[1800];
            reactor           = new Reactor();

            Bitmaps = new List <PIGImage>();
            Sounds  = new List <SoundData>();

            this.big      = macPig;
            this.LoadData = loadData;
        }
コード例 #3
0
        /// <summary>
        /// Transfers the gun information from a robot to a Polymodel instance.
        /// </summary>
        /// <param name="robot">The robot to read the guns from.</param>
        private void BuildModelAnimation(Robot robot)
        {
            if (robot.ModelNum == -1)
            {
                return;
            }
            Polymodel        model     = Models[robot.ModelNum];
            List <FixAngles> jointlist = new List <FixAngles>();

            model.NumGuns = robot.NumGuns;
            for (int i = 0; i < Polymodel.MaxGuns; i++)
            {
                model.GunPoints[i]    = robot.GunPoints[i];
                model.GunDirs[i]      = FixVector.FromRawValues(65536, 0, 0);
                model.GunSubmodels[i] = robot.GunSubmodels[i];
            }
            int[,] jointmapping = new int[10, 5];
            for (int m = 0; m < Polymodel.MaxSubmodels; m++)
            {
                for (int f = 0; f < Robot.NumAnimationStates; f++)
                {
                    jointmapping[m, f] = -1;
                }
            }
            int basejoint = 0;

            for (int m = 0; m < Polymodel.MaxGuns + 1; m++)
            {
                for (int f = 0; f < Robot.NumAnimationStates; f++)
                {
                    Robot.JointList robotjointlist = robot.AnimStates[m, f];
                    basejoint = robotjointlist.Offset;
                    for (int j = 0; j < robotjointlist.NumJoints; j++)
                    {
                        JointPos joint = Joints[basejoint];
                        jointmapping[joint.JointNum, f] = basejoint;
                        model.IsAnimated = true;
                        basejoint++;
                    }
                }
            }

            for (int m = 1; m < Polymodel.MaxSubmodels; m++)
            {
                for (int f = 0; f < Robot.NumAnimationStates; f++)
                {
                    int jointnum = jointmapping[m, f];
                    if (jointnum != -1)
                    {
                        JointPos joint = Joints[jointnum];
                        model.AnimationMatrix[m, f].P = joint.Angles.P;
                        model.AnimationMatrix[m, f].B = joint.Angles.B;
                        model.AnimationMatrix[m, f].H = joint.Angles.H;
                    }
                }
            }
        }
コード例 #4
0
 public PSXDatFile()
 {
     Textures          = new ushort[800];
     TMapInfo          = new TMAPInfo[800];
     Sounds            = new byte[250];
     AltSounds         = new byte[250];
     VClips            = new VClip[70];
     EClips            = new EClip[60];
     WClips            = new WClip[30];
     Robots            = new Robot[30];
     Joints            = new JointPos[600];
     Weapons           = new Weapon[30];
     Models            = new Polymodel[85];
     Gauges            = new ushort[80];
     ObjBitmaps        = new ushort[210];
     ObjBitmapPointers = new ushort[210];
     Cockpits          = new ushort[4];
     ObjectTypes       = new EditorObjectDefinition[100];
     Powerups          = new Powerup[29];
     BitmapXLATData    = new ushort[1800];
     reactor           = new Reactor();
 }
コード例 #5
0
        public void Write(Stream stream)
        {
            HAMDataWriter writer = new HAMDataWriter();
            BinaryWriter  bw     = new BinaryWriter(stream);

            bw.Write(558711112);
            bw.Write(Version);
            int returnPoint = (int)bw.BaseStream.Position;

            if (Version < 3)
            {
                bw.Write(0);
            }
            bw.Write(Textures.Count);
            for (int x = 0; x < Textures.Count; x++)
            {
                ushort texture = Textures[x];
                bw.Write(texture);
            }
            for (int x = 0; x < TMapInfo.Count; x++)
            {
                TMAPInfo texture = TMapInfo[x];
                writer.WriteTMAPInfo(texture, bw);
            }

            //Always write 254 sounds, for convenience.
            bw.Write(254);
            for (int x = 0; x < Sounds.Length; x++)
            {
                byte sound = Sounds[x];
                bw.Write(sound);
            }
            for (int x = 0; x < Sounds.Length; x++)
            {
                byte sound = AltSounds[x];
                bw.Write(sound);
            }
            bw.Write(VClips.Count);
            for (int x = 0; x < VClips.Count; x++)
            {
                writer.WriteVClip(VClips[x], bw);
            }
            bw.Write(EClips.Count);
            for (int x = 0; x < EClips.Count; x++)
            {
                writer.WriteEClip(EClips[x], bw);
            }
            bw.Write(WClips.Count);
            for (int x = 0; x < WClips.Count; x++)
            {
                writer.WriteWClip(WClips[x], bw);
            }
            bw.Write(Robots.Count);
            for (int x = 0; x < Robots.Count; x++)
            {
                writer.WriteRobot(Robots[x], bw);
            }
            bw.Write(Joints.Count);
            for (int x = 0; x < Joints.Count; x++)
            {
                JointPos joint = Joints[x];
                bw.Write(joint.JointNum);
                bw.Write(joint.Angles.P);
                bw.Write(joint.Angles.B);
                bw.Write(joint.Angles.H);
            }
            bw.Write(Weapons.Count);
            if (Version < 3)
            {
                for (int x = 0; x < Weapons.Count; x++)
                {
                    writer.WriteWeaponV2(Weapons[x], bw);
                }
            }
            else
            {
                for (int x = 0; x < Weapons.Count; x++)
                {
                    writer.WriteWeapon(Weapons[x], bw);
                }
            }
            bw.Write(Powerups.Count);
            for (int x = 0; x < Powerups.Count; x++)
            {
                Powerup powerup = Powerups[x];
                bw.Write(powerup.VClipNum);
                bw.Write(powerup.HitSound);
                bw.Write(powerup.Size.value);
                bw.Write(powerup.Light.value);
            }
            bw.Write(Models.Count);
            for (int x = 0; x < Models.Count; x++)
            {
                writer.WritePolymodel(Models[x], bw);
            }
            for (int x = 0; x < Models.Count; x++)
            {
                bw.Write(Models[x].InterpreterData);
            }
            for (int x = 0; x < Models.Count; x++)
            {
                int modelnum = Models[x].DyingModelnum;
                bw.Write(modelnum);
            }
            for (int x = 0; x < Models.Count; x++)
            {
                int modelnum = Models[x].DeadModelnum;
                bw.Write(modelnum);
            }
            bw.Write(Gauges.Count);
            for (int x = 0; x < Gauges.Count; x++)
            {
                ushort gague = Gauges[x];
                bw.Write(gague);
            }
            for (int x = 0; x < Gauges.Count; x++)
            {
                ushort gague = GaugesHires[x];
                bw.Write(gague);
            }
            //Always write exactly 600 ObjBitmaps, the limit in Descent 2, to conform to the original data files.
            //Can be optimized if you need to save a kb of data I guess
            bw.Write(600);
            for (int x = 0; x < 600; x++)
            {
                if (x < ObjBitmaps.Count)
                {
                    bw.Write(ObjBitmaps[x]);
                }
                else
                {
                    bw.Write((ushort)0);
                }
            }
            for (int x = 0; x < 600; x++)
            {
                if (x < ObjBitmapPointers.Count)
                {
                    bw.Write(ObjBitmapPointers[x]);
                }
                else
                {
                    bw.Write((ushort)0);
                }
            }
            writer.WritePlayerShip(PlayerShip, bw);
            bw.Write(Cockpits.Count);
            for (int x = 0; x < Cockpits.Count; x++)
            {
                ushort cockpit = Cockpits[x];
                bw.Write(cockpit);
            }
            bw.Write(FirstMultiBitmapNum);
            bw.Write(Reactors.Count);
            for (int x = 0; x < Reactors.Count; x++)
            {
                Reactor reactor = Reactors[x];
                bw.Write(reactor.ModelNum);
                bw.Write(reactor.NumGuns);
                for (int y = 0; y < 8; y++)
                {
                    bw.Write(reactor.GunPoints[y].X.value);
                    bw.Write(reactor.GunPoints[y].Y.value);
                    bw.Write(reactor.GunPoints[y].Z.value);
                }
                for (int y = 0; y < 8; y++)
                {
                    bw.Write(reactor.GunDirs[y].X.value);
                    bw.Write(reactor.GunDirs[y].Y.value);
                    bw.Write(reactor.GunDirs[y].Z.value);
                }
            }
            bw.Write(PlayerShip.MarkerModel);
            if (Version < 3)
            {
                bw.Write(ExitModelnum);
                bw.Write(DestroyedExitModelnum);
            }
            for (int x = 0; x < 2620; x++)
            {
                bw.Write(BitmapXLATData[x]);
            }
            int ptr = (int)bw.BaseStream.Position;

            if (Version < 3)
            {
                bw.BaseStream.Seek(returnPoint, SeekOrigin.Begin);
                bw.Write(ptr);
                bw.BaseStream.Seek(ptr, SeekOrigin.Begin);
                bw.Write(sounddata);
            }
            //bw.Dispose(); //[ISB] disposing a BinaryWriter seems to close the underlying stream. That's nice.
        }
コード例 #6
0
        public void Read(Stream stream)
        {
            BinaryReader br;

            br = new BinaryReader(stream);
            HAMDataReader bm = new HAMDataReader();

            int sig = br.ReadInt32();

            if (sig != 0x214D4148)
            {
                br.Dispose();
                throw new InvalidDataException("HAMFile::Read: HAM file has bad header.");
            }
            Version = br.ReadInt32();
            if (Version < 2 || Version > 3)
            {
                br.Dispose();
                throw new InvalidDataException(string.Format("HAMFile::Read: HAM file has bad version. Got {0}, but expected \"2\" or \"3\"", Version));
            }
            int sndptr = 0;

            if (Version == 2)
            {
                sndptr = br.ReadInt32();
            }

            int NumBitmaps = br.ReadInt32();

            for (int x = 0; x < NumBitmaps; x++)
            {
                Textures.Add(br.ReadUInt16());
            }
            for (int x = 0; x < NumBitmaps; x++)
            {
                TMapInfo.Add(bm.ReadTMAPInfo(br));
                TMapInfo[x].ID = x;
            }

            int NumSounds = br.ReadInt32();

            if (NumSounds > 254)
            {
                throw new InvalidDataException("HAM file specifies more than 254 sounds.");
            }

            for (int x = 0; x < NumSounds; x++)
            {
                Sounds[x] = br.ReadByte();
            }
            for (int x = 0; x < NumSounds; x++)
            {
                AltSounds[x] = br.ReadByte();
            }

            int NumVClips = br.ReadInt32();

            for (int x = 0; x < NumVClips; x++)
            {
                VClips.Add(bm.ReadVClip(br));
                VClips[x].ID = x;
            }

            int NumEClips = br.ReadInt32();

            for (int x = 0; x < NumEClips; x++)
            {
                EClips.Add(bm.ReadEClip(br));
                EClips[x].ID = x;
            }

            int NumWallAnims = br.ReadInt32();

            for (int x = 0; x < NumWallAnims; x++)
            {
                WClips.Add(bm.ReadWClip(br));
            }

            int NumRobots = br.ReadInt32();

            for (int x = 0; x < NumRobots; x++)
            {
                Robots.Add(bm.ReadRobot(br));
                Robots[x].ID = x;
            }

            int NumLoadJoints = br.ReadInt32();

            for (int x = 0; x < NumLoadJoints; x++)
            {
                JointPos joint = new JointPos();
                joint.JointNum = br.ReadInt16();
                joint.Angles.P = br.ReadInt16();
                joint.Angles.B = br.ReadInt16();
                joint.Angles.H = br.ReadInt16();
                Joints.Add(joint);
            }

            int NumWeaponTypes = br.ReadInt32();

            for (int x = 0; x < NumWeaponTypes; x++)
            {
                if (Version >= 3)
                {
                    Weapons.Add(bm.ReadWeapon(br));
                }
                else
                {
                    Weapons.Add(bm.ReadWeaponInfoVersion2(br));
                }
                Weapons[x].ID = x;
            }

            int NumPowerups = br.ReadInt32();

            for (int x = 0; x < NumPowerups; x++)
            {
                Powerup powerup = new Powerup();
                powerup.VClipNum = br.ReadInt32();
                powerup.HitSound = br.ReadInt32();
                powerup.Size     = new Fix(br.ReadInt32());
                powerup.Light    = new Fix(br.ReadInt32());
                powerup.ID       = x;
                Powerups.Add(powerup);
            }

            int NumPolygonModels = br.ReadInt32();

            for (int x = 0; x < NumPolygonModels; x++)
            {
                Models.Add(bm.ReadPolymodelInfo(br));
                Models[x].ID = x;
            }

            for (int x = 0; x < NumPolygonModels; x++)
            {
                Models[x].InterpreterData = br.ReadBytes(Models[x].ModelIDTASize);
                //PolymodelData.Add(modeldata);
            }
            for (int x = 0; x < NumPolygonModels; x++)
            {
                Models[x].DyingModelnum = br.ReadInt32();
            }
            for (int x = 0; x < NumPolygonModels; x++)
            {
                Models[x].DeadModelnum = br.ReadInt32();
            }
            int gagueCount = br.ReadInt32();

            for (int x = 0; x < gagueCount; x++)
            {
                Gauges.Add(br.ReadUInt16());
            }
            for (int x = 0; x < gagueCount; x++)
            {
                GaugesHires.Add(br.ReadUInt16());
            }

            int bitmapCount = br.ReadInt32();

            for (int x = 0; x < bitmapCount; x++)
            {
                ObjBitmaps.Add(br.ReadUInt16());
            }
            ushort value;

            for (int x = 0; x < bitmapCount; x++)
            {
                value = br.ReadUInt16();
                if ((value + 1) > NumObjBitmaps)
                {
                    NumObjBitmaps = (value + 1);
                }
                ObjBitmapPointers.Add(value);
            }

            PlayerShip                   = new Ship();
            PlayerShip.ModelNum          = br.ReadInt32();
            PlayerShip.DeathVClipNum     = br.ReadInt32();
            PlayerShip.Mass              = new Fix(br.ReadInt32());
            PlayerShip.Drag              = new Fix(br.ReadInt32());
            PlayerShip.MaxThrust         = new Fix(br.ReadInt32());
            PlayerShip.ReverseThrust     = new Fix(br.ReadInt32());
            PlayerShip.Brakes            = new Fix(br.ReadInt32());
            PlayerShip.Wiggle            = new Fix(br.ReadInt32());
            PlayerShip.MaxRotationThrust = new Fix(br.ReadInt32());
            for (int x = 0; x < 8; x++)
            {
                PlayerShip.GunPoints[x] = FixVector.FromRawValues(br.ReadInt32(), br.ReadInt32(), br.ReadInt32());
            }

            int NumCockpits = br.ReadInt32();

            for (int x = 0; x < NumCockpits; x++)
            {
                Cockpits.Add(br.ReadUInt16());
            }
            //Build a table of all multiplayer bitmaps, to inject into the object bitmap table
            FirstMultiBitmapNum = br.ReadInt32();

            int NumReactors = br.ReadInt32();

            for (int x = 0; x < NumReactors; x++)
            {
                Reactor reactor = new Reactor();
                reactor.ModelNum = br.ReadInt32();
                reactor.NumGuns  = br.ReadInt32();
                for (int y = 0; y < 8; y++)
                {
                    reactor.GunPoints[y] = FixVector.FromRawValues(br.ReadInt32(), br.ReadInt32(), br.ReadInt32());
                }
                for (int y = 0; y < 8; y++)
                {
                    reactor.GunDirs[y] = FixVector.FromRawValues(br.ReadInt32(), br.ReadInt32(), br.ReadInt32());
                }
                Reactors.Add(reactor);
            }
            PlayerShip.MarkerModel = br.ReadInt32();
            //2620
            if (Version < 3)
            {
                ExitModelnum          = br.ReadInt32();
                DestroyedExitModelnum = br.ReadInt32();
            }
            for (int x = 0; x < 2620; x++)
            {
                try
                {
                    BitmapXLATData[x] = br.ReadUInt16();
                }
                catch (EndOfStreamException) //Descent 2's official HAM files have only 2600 XLAT entries, but later versions of the game attempt to read 2620.
                {
                    break;
                }
            }

            if (Version < 3)
            {
                br.BaseStream.Seek(sndptr, SeekOrigin.Begin);
                int dataToRead = (int)(br.BaseStream.Length - br.BaseStream.Position);
                sounddata = br.ReadBytes(dataToRead);
            }

            hasRead = true;
            //br.Dispose();
        }
コード例 #7
0
        public void Read(Stream stream)
        {
            BinaryReader br;

            br = new BinaryReader(stream);

            HAMDataReader bm  = new HAMDataReader();
            uint          sig = br.ReadUInt32();

            if (sig != Util.MakeSig('M', 'A', 'H', 'X'))
            {
                br.Dispose();
                throw new InvalidDataException("VHAMFile::Read: V-HAM file has bad header.");
            }
            int version = br.ReadInt32();

            if (version != 1)
            {
                br.Dispose();
                throw new InvalidDataException(string.Format("VHAMFile::Read: V-HAM file has bad version. Got {0}, but expected 1.", version));
            }

            int numWeapons = br.ReadInt32();

            for (int i = 0; i < numWeapons; i++)
            {
                Weapons.Add(bm.ReadWeapon(br));
                Weapons[i].ID = i + NumDescent2WeaponTypes;
            }
            int numRobots = br.ReadInt32();

            for (int i = 0; i < numRobots; i++)
            {
                Robots.Add(bm.ReadRobot(br));
                Robots[i].ID = i + NumDescent2RobotTypes;
            }
            int numJoints = br.ReadInt32();

            for (int i = 0; i < numJoints; i++)
            {
                JointPos joint = new JointPos();
                joint.JointNum = br.ReadInt16();
                joint.Angles.P = br.ReadInt16();
                joint.Angles.B = br.ReadInt16();
                joint.Angles.H = br.ReadInt16();
                Joints.Add(joint);
            }
            int numModels = br.ReadInt32();

            for (int i = 0; i < numModels; i++)
            {
                Models.Add(bm.ReadPolymodelInfo(br));
                Models[i].ID = i + NumDescent2Polymodels;
            }
            for (int x = 0; x < numModels; x++)
            {
                Models[x].InterpreterData = br.ReadBytes(Models[x].ModelIDTASize);
            }
            for (int i = 0; i < numModels; i++)
            {
                Models[i].DyingModelnum = br.ReadInt32();
            }
            for (int i = 0; i < numModels; i++)
            {
                Models[i].DeadModelnum = br.ReadInt32();
            }
            int numObjBitmaps = br.ReadInt32();

            for (int i = 0; i < numObjBitmaps; i++)
            {
                ObjBitmaps.Add(br.ReadUInt16());
            }
            int numObjBitmapPointers = br.ReadInt32();

            for (int i = 0; i < numObjBitmapPointers; i++)
            {
                ObjBitmapPointers.Add(br.ReadUInt16());
            }

            br.Dispose();
        }
コード例 #8
0
        private void BuildModelAnimation(Robot robot)
        {
            //this shouldn't happen?
            if (robot.ModelNum == -1)
            {
                return;
            }
            //If the robot is referring to a base HAM file model, reject it
            if (robot.ModelNum < VHAMFile.NumDescent2Polymodels)
            {
                return;
            }
            Polymodel        model     = Models[robot.ModelNum - VHAMFile.NumDescent2Polymodels];
            List <FixAngles> jointlist = new List <FixAngles>();

            model.NumGuns = robot.NumGuns;
            for (int i = 0; i < Polymodel.MaxGuns; i++)
            {
                model.GunPoints[i]    = robot.GunPoints[i];
                model.GunDirs[i]      = FixVector.FromRawValues(65536, 0, 0);
                model.GunSubmodels[i] = robot.GunSubmodels[i];
            }
            int[,] jointmapping = new int[10, 5];
            for (int m = 0; m < Polymodel.MaxSubmodels; m++)
            {
                for (int f = 0; f < Robot.NumAnimationStates; f++)
                {
                    jointmapping[m, f] = -1;
                }
            }
            int basejoint = 0;

            for (int m = 0; m < Polymodel.MaxGuns + 1; m++)
            {
                for (int f = 0; f < Robot.NumAnimationStates; f++)
                {
                    Robot.JointList robotjointlist = robot.AnimStates[m, f];
                    basejoint = robotjointlist.Offset;
                    for (int j = 0; j < robotjointlist.NumJoints; j++)
                    {
                        JointPos joint = GetJoint(basejoint);
                        jointmapping[joint.JointNum, f] = basejoint;
                        model.IsAnimated = true;
                        basejoint++;
                    }
                }
            }

            for (int m = 1; m < Polymodel.MaxSubmodels; m++)
            {
                for (int f = 0; f < Robot.NumAnimationStates; f++)
                {
                    int jointnum = jointmapping[m, f];
                    if (jointnum != -1)
                    {
                        JointPos joint = GetJoint(jointnum);
                        model.AnimationMatrix[m, f].P = joint.Angles.P;
                        model.AnimationMatrix[m, f].B = joint.Angles.B;
                        model.AnimationMatrix[m, f].H = joint.Angles.H;
                    }
                }
            }
        }
コード例 #9
0
        public int Read(Stream stream)
        {
            BinaryReader  br     = new BinaryReader(stream);
            HAMDataReader reader = new HAMDataReader();

            DataPointer = br.ReadInt32();

            numTextures = br.ReadInt32();
            for (int i = 0; i < 800; i++)
            {
                Textures[i] = br.ReadUInt16();
            }
            for (int i = 0; i < 800; i++)
            {
                TMapInfo[i] = reader.ReadTMAPInfoDescentPSX(br);
            }
            Sounds    = br.ReadBytes(250);
            AltSounds = br.ReadBytes(250);
            numVClips = br.ReadInt32(); //this value is bogus. rip
            for (int i = 0; i < 70; i++)
            {
                VClips[i] = reader.ReadVClipPSX(br);
            }
            numEClips = br.ReadInt32();
            for (int i = 0; i < 60; i++)
            {
                EClips[i] = reader.ReadEClipPSX(br);
            }
            numWClips = br.ReadInt32();
            for (int i = 0; i < 30; i++)
            {
                WClips[i] = reader.ReadWClipPSX(br);
            }
            numRobots = br.ReadInt32();
            for (int i = 0; i < 30; i++)
            {
                Robots[i] = reader.ReadRobotPSX(br);
            }
            numJoints = br.ReadInt32();
            for (int i = 0; i < 600; i++)
            {
                JointPos joint = new JointPos();
                joint.JointNum = br.ReadInt16();
                joint.Angles.P = br.ReadInt16();
                joint.Angles.B = br.ReadInt16();
                joint.Angles.H = br.ReadInt16();
                Joints[i]      = joint;
            }
            numWeapons = br.ReadInt32();
            for (int i = 0; i < 30; i++)
            {
                Weapons[i] = reader.ReadWeaponInfoPSX(br);
            }
            numPowerups = br.ReadInt32();
            for (int i = 0; i < 29; i++)
            {
                Powerup powerup = new Powerup();
                powerup.VClipNum = br.ReadInt32();
                powerup.HitSound = br.ReadInt32();
                powerup.Size     = new Fix(br.ReadInt32());
                powerup.Light    = new Fix(br.ReadInt32());
                Powerups[i]      = powerup;
            }
            numModels = br.ReadInt32();
            for (int i = 0; i < numModels; i++)
            {
                Models[i] = reader.ReadPolymodelInfoPSX(br);
            }
            for (int i = 0; i < numModels; i++)
            {
                Models[i].InterpreterData = br.ReadBytes(Models[i].ModelIDTASize);
            }
            for (int i = 0; i < Gauges.Length; i++)
            {
                Gauges[i] = br.ReadUInt16();
            }
            for (int i = 0; i < 85; i++)
            {
                int num = br.ReadInt32();
                if (i < numModels)
                {
                    Models[i].DyingModelnum = num;
                }
            }
            for (int i = 0; i < 85; i++)
            {
                int num = br.ReadInt32();
                if (i < numModels)
                {
                    Models[i].DeadModelnum = num;
                }
            }
            for (int i = 0; i < 210; i++)
            {
                ObjBitmaps[i] = br.ReadUInt16();
            }
            for (int i = 0; i < 210; i++)
            {
                ObjBitmapPointers[i] = br.ReadUInt16();
            }
            PlayerShip                   = new Ship();
            PlayerShip.ModelNum          = br.ReadInt32();
            PlayerShip.DeathVClipNum     = br.ReadInt32();
            PlayerShip.Mass              = new Fix(br.ReadInt32());
            PlayerShip.Drag              = new Fix(br.ReadInt32());
            PlayerShip.MaxThrust         = new Fix(br.ReadInt32());
            PlayerShip.ReverseThrust     = new Fix(br.ReadInt32());
            PlayerShip.Brakes            = new Fix(br.ReadInt32());
            PlayerShip.Wiggle            = new Fix(br.ReadInt32());
            PlayerShip.MaxRotationThrust = new Fix(br.ReadInt32());
            for (int x = 0; x < 8; x++)
            {
                PlayerShip.GunPoints[x] = FixVector.FromRawValues(br.ReadInt32(), br.ReadInt32(), br.ReadInt32());
            }
            numCockpits = br.ReadInt32();
            for (int i = 0; i < 4; i++)
            {
                Cockpits[i] = br.ReadUInt16();
            }
            //heh
            Sounds    = br.ReadBytes(250);
            AltSounds = br.ReadBytes(250);

            numObjects = br.ReadInt32();
            for (int i = 0; i < 100; i++)
            {
                ObjectTypes[i].type = (EditorObjectType)(br.ReadSByte());
            }
            for (int i = 0; i < 100; i++)
            {
                ObjectTypes[i].id = br.ReadByte();
            }
            for (int i = 0; i < 100; i++)
            {
                ObjectTypes[i].strength = new Fix(br.ReadInt32());
                //Console.WriteLine("type: {0}({3})\nid: {1}\nstr: {2}", ObjectTypes[i].type, ObjectTypes[i].id, ObjectTypes[i].strength, (int)ObjectTypes[i].type);
            }
            FirstMultiBitmapNum = br.ReadInt32();
            reactor.NumGuns     = br.ReadInt32();
            for (int y = 0; y < 4; y++)
            {
                reactor.GunPoints[y] = FixVector.FromRawValues(br.ReadInt32(), br.ReadInt32(), br.ReadInt32());
            }
            for (int y = 0; y < 4; y++)
            {
                reactor.GunDirs[y] = FixVector.FromRawValues(br.ReadInt32(), br.ReadInt32(), br.ReadInt32());
            }
            exitModelnum          = br.ReadInt32();
            destroyedExitModelnum = br.ReadInt32();

            for (int i = 0; i < 1800; i++)
            {
                BitmapXLATData[i] = br.ReadUInt16();
            }
            br.Dispose();

            return(0);
        }
コード例 #10
0
ファイル: HXMFile.cs プロジェクト: InsanityBringer/LibDescent
        /// <summary>
        /// Loads an HXM file from a given stream.
        /// </summary>
        /// <param name="stream">The stream to load the HXM data from.</param>
        public void Read(Stream stream)
        {
            BinaryReader br;

            br = new BinaryReader(stream);

            HAMDataReader data = new HAMDataReader();

            int sig = br.ReadInt32();
            int ver = br.ReadInt32();

            if (sig != 559435080)
            {
                br.Dispose();
                throw new InvalidDataException("HXMFile::Read: HXM file has bad header.");
            }
            if (ver != 1)
            {
                br.Dispose();
                throw new InvalidDataException(string.Format("HXMFile::Read: HXM file has bad version. Got {0}, but expected 1", ver));
            }

            int replacedRobotCount = br.ReadInt32();

            for (int x = 0; x < replacedRobotCount; x++)
            {
                int   replacementID = br.ReadInt32();
                Robot robot         = data.ReadRobot(br);
                robot.replacementID = replacementID;
                ReplacedRobots.Add(robot);
            }
            int replacedJointCount = br.ReadInt32();

            for (int x = 0; x < replacedJointCount; x++)
            {
                int      replacementID = br.ReadInt32();
                JointPos joint         = new JointPos();
                joint.JointNum      = br.ReadInt16();
                joint.Angles.P      = br.ReadInt16();
                joint.Angles.B      = br.ReadInt16();
                joint.Angles.H      = br.ReadInt16();
                joint.ReplacementID = replacementID;
                ReplacedJoints.Add(joint);
            }
            int modelsToReplace = br.ReadInt32();

            for (int x = 0; x < modelsToReplace; x++)
            {
                int       replacementID = br.ReadInt32();
                Polymodel model         = data.ReadPolymodelInfo(br);
                model.ReplacementID   = replacementID;
                model.InterpreterData = br.ReadBytes(model.ModelIDTASize);
                ReplacedModels.Add(model);
                model.DyingModelnum = br.ReadInt32();
                model.DeadModelnum  = br.ReadInt32();
            }
            int objBitmapsToReplace = br.ReadInt32();

            for (int x = 0; x < objBitmapsToReplace; x++)
            {
                ReplacedBitmapElement objBitmap = new ReplacedBitmapElement();
                objBitmap.ReplacementID = br.ReadInt32();
                objBitmap.Data          = br.ReadUInt16();
                ReplacedObjBitmaps.Add(objBitmap);
                //Console.WriteLine("Loading replacement obj bitmap, replacing slot {0} with {1} ({2})", objBitmap.replacementID, objBitmap.data, baseFile.piggyFile.images[objBitmap.data].name);
            }
            int objBitmapPtrsToReplace = br.ReadInt32();

            for (int x = 0; x < objBitmapPtrsToReplace; x++)
            {
                ReplacedBitmapElement objBitmap = new ReplacedBitmapElement();
                objBitmap.ReplacementID = br.ReadInt32();
                objBitmap.Data          = br.ReadUInt16();
                ReplacedObjBitmapPtrs.Add(objBitmap);
            }
        }
コード例 #11
0
        public void Write(Stream stream)
        {
            DescentWriter descentWriter = new DescentWriter(stream);
            HAMDataWriter writer        = new HAMDataWriter();

            Int32 DataPointer = 0;            // update this later on

            descentWriter.Write(DataPointer); // update this later on

            descentWriter.Write((Int32)numTextures);

            for (int i = 0; i < 800; i++)
            {
                descentWriter.Write((UInt16)Textures[i]);
            }

            for (int i = 0; i < 800; i++)
            {
                this.WriteTMAPInfoDescent1(descentWriter, TMapInfo[i]);
            }

            descentWriter.Write(SoundIDs);

            descentWriter.Write(AltSounds);

            descentWriter.Write((Int32)numVClips); //this value is bogus. rip

            for (int i = 0; i < 70; i++)
            {
                writer.WriteVClip(VClips[i], descentWriter);
            }

            descentWriter.Write((Int32)numEClips);

            for (int i = 0; i < 60; i++)
            {
                writer.WriteEClip(EClips[i], descentWriter);
            }

            descentWriter.Write((Int32)numWClips);
            for (int i = 0; i < 30; i++)
            {
                this.WriteWClipDescent1(WClips[i], descentWriter);
            }

            descentWriter.Write((Int32)numRobots);
            for (int i = 0; i < 30; i++)
            {
                this.WriteRobotDescent1(Robots[i], descentWriter);
            }

            descentWriter.Write((Int32)numJoints);
            for (int i = 0; i < 600; i++)
            {
                JointPos joint = Joints[i];

                descentWriter.WriteInt16(joint.JointNum);
                descentWriter.WriteInt16(joint.Angles.P);
                descentWriter.WriteInt16(joint.Angles.B);
                descentWriter.WriteInt16(joint.Angles.H);
            }

            descentWriter.WriteInt32(numWeapons);
            for (int i = 0; i < 30; i++)
            {
                this.WriteWeaponInfoDescent1(descentWriter, Weapons[i]);
            }

            descentWriter.WriteInt32(numPowerups);
            for (int i = 0; i < 29; i++)
            {
                var powerup = this.Powerups[i];

                descentWriter.WriteInt32(powerup.VClipNum);
                descentWriter.WriteInt32(powerup.HitSound);
                descentWriter.WriteFix(powerup.Size);
                descentWriter.WriteFix(powerup.Light);
            }

            descentWriter.WriteInt32(numModels);
            for (int i = 0; i < numModels; i++)
            {
                writer.WritePolymodel(Models[i], descentWriter);
            }

            for (int i = 0; i < numModels; i++)
            {
                descentWriter.Write(Models[i].InterpreterData, 0, Models[i].ModelIDTASize);
            }

            for (int i = 0; i < Gauges.Length; i++)
            {
                descentWriter.WriteUInt16(Gauges[i]);
            }

            for (int i = 0; i < 85; i++)
            {
                if (Models[i] == null)
                {
                    descentWriter.WriteInt32(-1);
                }
                else
                {
                    descentWriter.WriteInt32(Models[i].DyingModelnum);
                }
            }

            for (int i = 0; i < 85; i++)
            {
                if (Models[i] == null)
                {
                    descentWriter.WriteInt32(-1);
                }
                else
                {
                    descentWriter.WriteInt32(Models[i].DeadModelnum);
                }
            }

            for (int i = 0; i < 210; i++)
            {
                descentWriter.WriteUInt16(ObjBitmaps[i]);
            }

            for (int i = 0; i < 210; i++)
            {
                descentWriter.WriteUInt16(ObjBitmapPointers[i]);
            }

            descentWriter.WriteInt32(PlayerShip.ModelNum);
            descentWriter.WriteInt32(PlayerShip.DeathVClipNum);
            descentWriter.WriteFix(PlayerShip.Mass);
            descentWriter.WriteFix(PlayerShip.Drag);
            descentWriter.WriteFix(PlayerShip.MaxThrust);
            descentWriter.WriteFix(PlayerShip.ReverseThrust);
            descentWriter.WriteFix(PlayerShip.Brakes);
            descentWriter.WriteFix(PlayerShip.Wiggle);
            descentWriter.WriteFix(PlayerShip.MaxRotationThrust);

            for (int x = 0; x < 8; x++)
            {
                descentWriter.WriteFixVector(PlayerShip.GunPoints[x]);
            }

            descentWriter.WriteInt32(numCockpits);
            for (int i = 0; i < 4; i++)
            {
                descentWriter.WriteInt16((Int16)Cockpits[i]);
            }

            //heh
            descentWriter.Write(SoundIDs, 0, 250);
            descentWriter.Write(AltSounds, 0, 250);

            descentWriter.WriteInt32(numObjects);
            for (int i = 0; i < 100; i++)
            {
                descentWriter.Write((sbyte)ObjectTypes[i].type);
            }
            for (int i = 0; i < 100; i++)
            {
                descentWriter.Write((byte)ObjectTypes[i].id);
            }
            for (int i = 0; i < 100; i++)
            {
                descentWriter.WriteFix(ObjectTypes[i].strength);
            }

            descentWriter.WriteInt32(FirstMultiBitmapNum);
            descentWriter.WriteInt32(reactor.NumGuns);

            for (int y = 0; y < 4; y++)
            {
                descentWriter.WriteFixVector(reactor.GunPoints[y]);
            }
            for (int y = 0; y < 4; y++)
            {
                descentWriter.WriteFixVector(reactor.GunDirs[y]);
            }

            descentWriter.WriteInt32(exitModelnum);
            descentWriter.WriteInt32(destroyedExitModelnum);

            for (int i = 0; i < 1800; i++)
            {
                descentWriter.WriteInt16((Int16)BitmapXLATData[i]);
            }

            //
            // Go back to the start and update the DataPointer
            //
            DataPointer = (int)descentWriter.BaseStream.Position;

            descentWriter.BaseStream.Seek(0, SeekOrigin.Begin);
            descentWriter.Write((Int32)DataPointer); // update the data pointer

            // Return to where we were
            descentWriter.BaseStream.Seek(DataPointer, SeekOrigin.Begin);

            descentWriter.WriteInt32(Bitmaps.Count - 1); // Ignore the bogus one
            descentWriter.WriteInt32(Sounds.Count);

            int dynamicOffset = 0;

            for (int i = 1; i < Bitmaps.Count; i++) // Skip the bogus one
            {
                var bitmap = Bitmaps[i];

                descentWriter.Write(bitmap.LocalName, 0, 8);

                descentWriter.WriteByte((byte)bitmap.DFlags);
                descentWriter.WriteByte((byte)bitmap.Width);
                descentWriter.WriteByte((byte)bitmap.Height);
                descentWriter.WriteByte((byte)bitmap.Flags);
                descentWriter.WriteByte((byte)bitmap.AverageIndex);

                descentWriter.WriteInt32(dynamicOffset);
                dynamicOffset += bitmap.GetSize();
            }

            for (int i = 0; i < Sounds.Count; i++)
            {
                var sound = Sounds[i];

                //var nameBytes = NameHelper.GetNameBytes(sound.name, 8);
                descentWriter.Write(sound.LocalName, 0, 8);

                descentWriter.WriteInt32(sound.Length);
                descentWriter.WriteInt32(sound.Length);

                descentWriter.WriteInt32(dynamicOffset);
                dynamicOffset += sound.Length;
            }

            for (int i = 1; i < Bitmaps.Count; i++)
            {
                Bitmaps[i].WriteImage(descentWriter);
            }

            for (int i = 0; i < Sounds.Count; i++)
            {
                descentWriter.Write(Sounds[i].Data);
            }
        }
コード例 #12
0
        public void Read(Stream stream)
        {
            BinaryReader  br     = new BinaryReader(stream);
            HAMDataReader reader = new HAMDataReader();

            if (LoadData)
            {
                DataPointer = br.ReadInt32();
                //So there's no sig, so we're going to take a guess based on the pointer. If it's greater than max bitmaps, we'll assume it's a descent 1 1.4+ piggy file
                if (DataPointer <= 1800)
                {
                    throw new ArgumentException("Cannot read this .PIG file");
                }

                numTextures = br.ReadInt32();
                for (int i = 0; i < 800; i++)
                {
                    Textures[i] = br.ReadUInt16();
                }

                for (int i = 0; i < 800; i++)
                {
                    TMapInfo[i] = reader.ReadTMAPInfoDescent1(br);
                }

                SoundIDs  = br.ReadBytes(250);
                AltSounds = br.ReadBytes(250);

                numVClips = br.ReadInt32(); //this value is bogus. rip
                for (int i = 0; i < 70; i++)
                {
                    VClips[i] = reader.ReadVClip(br);
                }

                numEClips = br.ReadInt32();
                for (int i = 0; i < 60; i++)
                {
                    EClips[i] = reader.ReadEClip(br);
                }

                numWClips = br.ReadInt32();
                for (int i = 0; i < 30; i++)
                {
                    WClips[i] = reader.ReadWClipDescent1(br);
                }

                numRobots = br.ReadInt32();
                for (int i = 0; i < 30; i++)
                {
                    Robots[i] = reader.ReadRobotDescent1(br);
                }

                numJoints = br.ReadInt32();
                for (int i = 0; i < 600; i++)
                {
                    JointPos joint = new JointPos();
                    joint.JointNum = br.ReadInt16();
                    joint.Angles.P = br.ReadInt16();
                    joint.Angles.B = br.ReadInt16();
                    joint.Angles.H = br.ReadInt16();
                    Joints[i]      = joint;
                }

                numWeapons = br.ReadInt32();
                for (int i = 0; i < 30; i++)
                {
                    Weapons[i] = reader.ReadWeaponInfoDescent1(br);
                }

                numPowerups = br.ReadInt32();
                for (int i = 0; i < 29; i++)
                {
                    Powerup powerup = new Powerup();
                    powerup.VClipNum = br.ReadInt32();
                    powerup.HitSound = br.ReadInt32();
                    powerup.Size     = new Fix(br.ReadInt32());
                    powerup.Light    = new Fix(br.ReadInt32());
                    Powerups[i]      = powerup;
                }

                numModels = br.ReadInt32();
                for (int i = 0; i < numModels; i++)
                {
                    Models[i] = reader.ReadPolymodelInfo(br);
                }
                for (int i = 0; i < numModels; i++)
                {
                    Models[i].InterpreterData = br.ReadBytes(Models[i].ModelIDTASize);
                }
                for (int i = 0; i < Gauges.Length; i++)
                {
                    Gauges[i] = br.ReadUInt16();
                }
                for (int i = 0; i < 85; i++)
                {
                    int num = br.ReadInt32();
                    if (i < numModels)
                    {
                        Models[i].DyingModelnum = num;
                    }
                    else
                    {
                        int wtfIsThis = num;
                    }
                }
                for (int i = 0; i < 85; i++)
                {
                    int num = br.ReadInt32();

                    if (i < numModels)
                    {
                        Models[i].DeadModelnum = num;
                    }
                    else
                    {
                        int wtfIsThis = num;
                    }
                }

                for (int i = 0; i < 210; i++)
                {
                    ObjBitmaps[i] = br.ReadUInt16();
                }
                for (int i = 0; i < 210; i++)
                {
                    ObjBitmapPointers[i] = br.ReadUInt16();
                }

                PlayerShip                   = new Ship();
                PlayerShip.ModelNum          = br.ReadInt32();
                PlayerShip.DeathVClipNum     = br.ReadInt32();
                PlayerShip.Mass              = new Fix(br.ReadInt32());
                PlayerShip.Drag              = new Fix(br.ReadInt32());
                PlayerShip.MaxThrust         = new Fix(br.ReadInt32());
                PlayerShip.ReverseThrust     = new Fix(br.ReadInt32());
                PlayerShip.Brakes            = new Fix(br.ReadInt32());
                PlayerShip.Wiggle            = new Fix(br.ReadInt32());
                PlayerShip.MaxRotationThrust = new Fix(br.ReadInt32());
                for (int x = 0; x < 8; x++)
                {
                    PlayerShip.GunPoints[x] = FixVector.FromRawValues(br.ReadInt32(), br.ReadInt32(), br.ReadInt32());
                }
                numCockpits = br.ReadInt32();
                for (int i = 0; i < 4; i++)
                {
                    Cockpits[i] = br.ReadUInt16();
                }

                //heh
                SoundIDs  = br.ReadBytes(250);
                AltSounds = br.ReadBytes(250);

                numObjects = br.ReadInt32();
                for (int i = 0; i < 100; i++)
                {
                    ObjectTypes[i].type = (EditorObjectType)(br.ReadSByte());
                }
                for (int i = 0; i < 100; i++)
                {
                    ObjectTypes[i].id = br.ReadByte();
                }
                for (int i = 0; i < 100; i++)
                {
                    ObjectTypes[i].strength = new Fix(br.ReadInt32());
                    //Console.WriteLine("type: {0}({3})\nid: {1}\nstr: {2}", ObjectTypes[i].type, ObjectTypes[i].id, ObjectTypes[i].strength, (int)ObjectTypes[i].type);
                }
                FirstMultiBitmapNum = br.ReadInt32();
                reactor.NumGuns     = br.ReadInt32();
                for (int y = 0; y < 4; y++)
                {
                    reactor.GunPoints[y] = FixVector.FromRawValues(br.ReadInt32(), br.ReadInt32(), br.ReadInt32());
                }
                for (int y = 0; y < 4; y++)
                {
                    reactor.GunDirs[y] = FixVector.FromRawValues(br.ReadInt32(), br.ReadInt32(), br.ReadInt32());
                }

                exitModelnum          = br.ReadInt32();
                destroyedExitModelnum = br.ReadInt32();

                for (int i = 0; i < 1800; i++)
                {
                    BitmapXLATData[i] = br.ReadUInt16();
                }
            }


            //Init a bogus texture for all piggyfiles
            PIGImage bogusTexture = new PIGImage(64, 64, 0, 0, 0, 0, "bogus", 0);

            bogusTexture.Data = new byte[64 * 64];
            //Create an X using descent 1 palette indicies. For accuracy. Heh
            for (int i = 0; i < 4096; i++)
            {
                bogusTexture.Data[i] = 85;
            }
            for (int i = 0; i < 64; i++)
            {
                bogusTexture.Data[i * 64 + i]        = 193;
                bogusTexture.Data[i * 64 + (63 - i)] = 193;
            }
            Bitmaps.Add(bogusTexture);

            if (LoadData)
            {
                br.BaseStream.Seek(DataPointer, SeekOrigin.Begin);
            }

            int numBitmaps = br.ReadInt32();
            int numSounds  = br.ReadInt32();

            for (int i = 0; i < numBitmaps; i++)
            {
                bool hashitnull = false;

                byte[] localNameBytes = br.ReadBytes(8);
                char[] localname      = new char[8];

                for (int j = 0; j < 8; j++)
                {
                    char c = (char)localNameBytes[j];

                    if (c == 0)
                    {
                        hashitnull = true;
                    }
                    if (!hashitnull)
                    {
                        localname[j] = c;
                    }
                }

                string imagename = new String(localname);
                imagename = imagename.Trim(' ', '\0');
                byte framedata = br.ReadByte();
                byte lx        = br.ReadByte();
                byte ly        = br.ReadByte();
                byte flags     = br.ReadByte();
                byte average   = br.ReadByte();
                int  offset    = br.ReadInt32();

                PIGImage image = new PIGImage(lx, ly, framedata, flags, average, offset, imagename, big);
                image.LocalName = localNameBytes;
                Bitmaps.Add(image);
            }

            for (int i = 0; i < numSounds; i++)
            {
                bool hashitnull = false;

                byte[] localNameBytes = br.ReadBytes(8);
                char[] localname      = new char[8];

                for (int j = 0; j < 8; j++)
                {
                    char c = (char)localNameBytes[j];

                    if (c == 0)
                    {
                        hashitnull = true;
                    }
                    if (!hashitnull)
                    {
                        localname[j] = c;
                    }
                }

                string soundname = new string(localname);
                soundname = soundname.Trim(' ', '\0');
                int num1   = br.ReadInt32();
                int num2   = br.ReadInt32();
                int offset = br.ReadInt32();

                SoundData sound = new SoundData {
                    Data = null
                };
                sound.Name      = soundname;
                sound.LocalName = localNameBytes;
                sound.Offset    = offset;
                sound.Length    = num1;
                Sounds.Add(sound);
            }

            int basePointer = (int)br.BaseStream.Position;

            for (int i = 1; i < Bitmaps.Count; i++)
            {
                br.BaseStream.Seek(basePointer + Bitmaps[i].Offset, SeekOrigin.Begin);
                if ((Bitmaps[i].Flags & PIGImage.BM_FLAG_RLE) != 0)
                {
                    int compressedSize = br.ReadInt32();
                    Bitmaps[i].Data = br.ReadBytes(compressedSize - 4);
                }
                else
                {
                    Bitmaps[i].Data = br.ReadBytes(Bitmaps[i].Width * Bitmaps[i].Height);
                }
            }

            for (int i = 0; i < Sounds.Count; i++)
            {
                br.BaseStream.Seek(basePointer + Sounds[i].Offset, SeekOrigin.Begin);

                var soundBytes = br.ReadBytes(Sounds[i].Length);

                var ps = Sounds[i];

                ps.Data = soundBytes;
            }

            br.Dispose();
        }