public static Wdf ParseWdf(string filename) { using (Bwd2Reader br = new Bwd2Reader(filename)) { Wdf wdf = new Wdf(); br.FindNext("WDFC"); wdf.Name = br.ReadCString(20); wdf.Float1 = br.ReadSingle(); //160 wdf.Float2 = br.ReadSingle(); //100 wdf.Float3 = br.ReadSingle(); //70 wdf.Float4 = br.ReadSingle(); //30 wdf.Byte1 = br.ReadByte(); // 255 wdf.Byte2 = br.ReadByte(); // 255 wdf.Byte3 = br.ReadByte(); // 127 wdf.Byte4 = br.ReadByte(); // 127 wdf.Int1 = br.ReadUInt32(); // 100 wdf.Float5 = br.ReadSingle(); //10 wdf.Radius = br.ReadSingle(); br.FindNext("WGEO"); uint numParts = br.ReadUInt32(); wdf.Parts = new SdfPart[numParts]; for (int i = 0; i < numParts; i++) { SdfPart sdfPart = new SdfPart(); sdfPart.Name = br.ReadCString(8); sdfPart.Right = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); sdfPart.Up = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); sdfPart.Forward = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); sdfPart.Position = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); sdfPart.ParentName = br.ReadCString(8); br.Position += 36; wdf.Parts[i] = sdfPart; } br.Position -= 16; wdf.Radius = br.ReadSingle(); return(wdf); } }
private static SdfPart GetDestroyedPart(Bwd2Reader br) { string partName = br.ReadCString(8); if (string.IsNullOrEmpty(partName) || partName.ToLower() == "null") { br.Position += 112; return(null); } SdfPart wreckedPart = new SdfPart(); wreckedPart.Name = partName; wreckedPart.Right = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); wreckedPart.Up = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); wreckedPart.Forward = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); wreckedPart.Position = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); wreckedPart.ParentName = br.ReadCString(8); br.Position += 56; return(wreckedPart); }
public static Vdf ParseVdf(string filename) { using (Bwd2Reader br = new Bwd2Reader(filename)) { Vdf vdf = new Vdf(); br.FindNext("VDFC"); vdf.Name = br.ReadCString(20); vdf.VehicleType = br.ReadUInt32(); vdf.VehicleSize = br.ReadUInt32(); vdf.LODDistance1 = br.ReadSingle(); vdf.LODDistance2 = br.ReadSingle(); vdf.LODDistance3 = br.ReadSingle(); vdf.LODDistance4 = br.ReadSingle(); vdf.LODDistance5 = br.ReadSingle(); vdf.Mass = br.ReadSingle(); vdf.CollisionMultiplier = br.ReadSingle(); vdf.DragCoefficient = br.ReadSingle(); vdf.Unknown = br.ReadUInt32(); if (br.Current.DataLength == 77) { vdf.EltFile = br.ReadCString(13); } br.FindNext("SOBJ"); vdf.SOBJGeoName = br.ReadCString(8); vdf.VLocs = new List <VLoc>(); br.FindNext("VLOC"); while (br.Current != null && br.Current.Name != "EXIT") { VLoc vloc = new VLoc { Number = br.ReadUInt32(), Right = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()), Up = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()), Forward = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()), Position = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()) }; vdf.VLocs.Add(vloc); br.Next(); } br.FindNext("VGEO"); uint numParts = br.ReadUInt32(); vdf.PartsThirdPerson = new List <SdfPart[]>(4); for (int damageState = 0; damageState < 4; damageState++) { SdfPart[] parts = new SdfPart[numParts]; for (int i = 0; i < numParts; i++) { SdfPart sdfPart = new SdfPart(); sdfPart.Name = br.ReadCString(8); sdfPart.Right = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); sdfPart.Up = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); sdfPart.Forward = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); sdfPart.Position = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); sdfPart.ParentName = br.ReadCString(8); br.Position += 36; parts[i] = sdfPart; } vdf.PartsThirdPerson.Add(parts); } br.Position += 100 * numParts * 12; vdf.PartsFirstPerson = new SdfPart[numParts]; for (int i = 0; i < numParts; i++) { SdfPart sdfPart = new SdfPart(); sdfPart.Name = br.ReadCString(8); sdfPart.Right = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); sdfPart.Up = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); sdfPart.Forward = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); sdfPart.Position = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); sdfPart.ParentName = br.ReadCString(8); br.Position += 36; vdf.PartsFirstPerson[i] = sdfPart; } br.FindNext("COLP"); float zMaxOuter = br.ReadSingle(); float zMaxInner = br.ReadSingle(); float zMinInner = br.ReadSingle(); float zMinOuter = br.ReadSingle(); float xMaxOuter = br.ReadSingle(); float xMaxInner = br.ReadSingle(); float xMinInner = br.ReadSingle(); float xMinOuter = br.ReadSingle(); float yMaxOuter = br.ReadSingle(); float yMaxInner = br.ReadSingle(); float yMinInner = br.ReadSingle(); float yMinOuter = br.ReadSingle(); Bounds innerBounds = new Bounds(); innerBounds.SetMinMax(new Vector3(xMinInner, yMinInner, zMinInner), new Vector3(xMaxInner, yMaxInner, zMaxInner)); vdf.BoundsInner = innerBounds; Bounds outerBounds = new Bounds(); outerBounds.SetMinMax(new Vector3(xMinOuter, yMinOuter, zMinOuter), new Vector3(xMaxOuter, yMaxOuter, zMaxOuter)); vdf.BoundsOuter = outerBounds; br.FindNext("WLOC"); vdf.WheelLoc = new WheelLoc[6]; for (int i = 0; i < 6; i++) { WheelLoc wheelLoc = vdf.WheelLoc[i] = new WheelLoc(); uint unk1 = br.ReadUInt32(); wheelLoc.Right = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); wheelLoc.Up = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); wheelLoc.Forward = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); wheelLoc.Position = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); float unk2 = br.ReadSingle(); } vdf.HLocs = new List <HLoc>(); br.FindNext("HLOC"); while (br.Current != null && br.Current.Name != "EXIT") { HLoc hloc = new HLoc { Label = br.ReadCString(16), HardpointIndex = br.ReadUInt32(), FacingDirection = br.ReadUInt32(), MeshType = (HardpointMeshType)br.ReadUInt32(), Right = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()), Up = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()), Forward = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()), Position = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()), Unk = br.ReadSingle() }; vdf.HLocs.Add(hloc); br.Next(); } if (!SpriteManager.Instance.Initialised) { if (vdf.EltFile == null) { vdf.Etbls = new List <ETbl>(); br.FindNext("ETBL"); while (br.Current != null && br.Current.Name != "EXIT") { long tableEnd = br.Current.DataPosition + br.Current.DataLength; while (br.Position < tableEnd) { ETbl etbl = new ETbl { MapFile = br.ReadCString(13), IsReferenceImage = br.ReadUInt32() == 1, ItemCount = br.ReadUInt32(), }; uint itemCount = etbl.ItemCount; etbl.Items = new Dictionary <string, ETbl.ETblItem>((int)itemCount); for (uint i = 0; i < itemCount; ++i) { ETbl.ETblItem etblItem = new ETbl.ETblItem { Name = br.ReadCString(16), XOffset = br.ReadInt32(), YOffset = br.ReadInt32(), Width = br.ReadInt32(), Height = br.ReadInt32() }; etbl.Items.Add(etblItem.Name, etblItem); } vdf.Etbls.Add(etbl); } br.Next(); } } else { vdf.Etbls = EltParser.ParseElt(vdf.EltFile); } if (vdf.Etbls != null && vdf.Etbls.Count > 0) { SpriteManager.Instance.Initialise(vdf); } } return(vdf); } }
public static Sdf LoadSdf(string filename, bool canWreck) { filename = filename.ToLower(); if (SdfCache.ContainsKey(filename)) { return(SdfCache[filename]); } using (Bwd2Reader br = new Bwd2Reader(filename)) { Sdf sdf = new Sdf(); br.FindNext("SDFC"); sdf.Name = br.ReadCString(16); uint one = br.ReadUInt32(); Vector3 size = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); uint unk1 = br.ReadUInt32(); uint unk2 = br.ReadUInt32(); sdf.Health = br.ReadUInt32(); string xdfName = br.ReadCString(13) + ".xdf"; string soundName = br.ReadCString(13); if (!string.IsNullOrEmpty(soundName) && soundName.ToLower() != "null") { sdf.DestroySoundName = soundName; } if (VirtualFilesystem.Instance.FileExists(xdfName)) { sdf.Xdf = XdfParser.ParseXdf(xdfName); } br.FindNext("SGEO"); uint numParts = br.ReadUInt32(); sdf.Parts = new SdfPart[numParts]; for (int i = 0; i < numParts; i++) { SdfPart sdfPart = new SdfPart(); sdfPart.Name = br.ReadCString(8); sdfPart.Right = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); sdfPart.Up = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); sdfPart.Forward = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); sdfPart.Position = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); sdfPart.ParentName = br.ReadCString(8); br.Position += 56; sdf.Parts[i] = sdfPart; } if (canWreck) { SdfPart wreckedPart = GetDestroyedPart(br); if (wreckedPart == null) { wreckedPart = GetDestroyedPart(br); } sdf.WreckedPart = wreckedPart; } SdfCache.Add(filename, sdf); return(sdf); } }
public static Gdf ParseGdf(string filename) { using (Bwd2Reader br = new Bwd2Reader(filename)) { Gdf gdf = new Gdf(); br.FindNext("REV"); int rev = br.ReadInt32(); br.FindNext("GDFC"); { gdf.Name = br.ReadCString(16); int unk1 = br.ReadInt32(); int unk2 = br.ReadInt32(); float unk3 = br.ReadSingle(); float unk4 = br.ReadSingle(); float unk5 = br.ReadSingle(); float unk6 = br.ReadSingle(); br.ReadBytes(4); gdf.Damage = br.ReadInt32(); gdf.Health = br.ReadInt32(); gdf.WeaponMass = br.ReadSingle(); string unk7 = br.ReadCString(12); ushort unk8 = br.ReadUInt16(); float unk9 = br.ReadSingle(); gdf.BurstRate = 1f / br.ReadSingle(); gdf.FiringRate = 1f / br.ReadSingle(); gdf.FireAmount = br.ReadInt32(); gdf.BulletVelocity = br.ReadSingle(); gdf.WeaponGroup = br.ReadInt32(); gdf.AmmoCount = br.ReadInt32(); float unk10 = br.ReadSingle(); gdf.FireSpriteName = br.ReadCString(13); gdf.SoundName = br.ReadCString(13); if (rev == 8) { int unk11 = br.ReadInt32(); // Always 1? gdf.EnabledSpriteName = br.ReadCString(16); gdf.DisabledSpriteName = br.ReadCString(16); } } br.FindNext("GPOF"); // 192 bytes SdfPart[] parts = new SdfPart[4]; for (int i = 0; i < 4; ++i) { SdfPart part = new SdfPart(); part.Right = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); part.Up = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); part.Forward = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); part.Position = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()); parts[i] = part; } br.FindNext("GGEO"); // 4 bytes { int numParts = br.ReadInt32(); if (numParts > 0) { int topPartsIndex = 0; int sidePartsIndex = 0; int turretPartsIndex = 0; int insidePartsIndex = 0; const int weaponSlots = 4; int totalSlots = weaponSlots * numParts; for (int i = 0; i < totalSlots; ++i) { string partName = br.ReadCString(8); if (partName == "NULL") { br.Position += 92; } else { SdfPart sdfPart = new SdfPart { Name = partName, Right = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()), Up = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()), Forward = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()), Position = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()), ParentName = br.ReadCString(8) }; char partType = partName[3]; switch (partType) { case 'P': if (gdf.TopParts == null) { gdf.TopParts = new SdfPart[numParts]; } gdf.TopParts[topPartsIndex++] = sdfPart; break; case 'S': if (gdf.SideParts == null) { gdf.SideParts = new SdfPart[numParts]; } gdf.SideParts[sidePartsIndex++] = sdfPart; break; case 'T': if (gdf.TurretParts == null) { gdf.TurretParts = new SdfPart[numParts]; } gdf.TurretParts[turretPartsIndex++] = sdfPart; break; case 'I': if (gdf.InsideParts == null) { gdf.InsideParts = new SdfPart[numParts]; } gdf.InsideParts[insidePartsIndex++] = sdfPart; break; default: Debug.LogWarningFormat("Unknown part type '{0}' for part name '{1}'.", partType, partName); break; } br.Position += 36; } // Skip Lower LOD levels - do we want to use these at all? br.Position += 200; } } } br.FindNext("ORDF"); // 133 bytes br.FindNext("OGEO"); // 104 bytes br.ReadInt32(); gdf.Projectile = new SdfPart { Name = br.ReadCString(8), Right = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()), Up = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()), Forward = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()), Position = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()), ParentName = br.ReadCString(8) }; return(gdf); } }