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++; } } } } }
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; }
/// <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; } } } }
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(); }
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. }
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(); }
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(); }
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; } } } }
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); }
/// <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); } }
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); } }
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(); }