diff --git a/LibBSP/Source/Extensions/PlaneExtensions.cs b/LibBSP/Source/Extensions/PlaneExtensions.cs index cb9148f..df65ee8 100644 --- a/LibBSP/Source/Extensions/PlaneExtensions.cs +++ b/LibBSP/Source/Extensions/PlaneExtensions.cs @@ -497,8 +497,8 @@ namespace LibBSP { case MapType.Quake3: { return 2; } - case MapType.CoD4: - case MapType.CoD2: { + case MapType.CoD2: + case MapType.CoD4: { return 4; } default: { diff --git a/LibBSP/Source/Extensions/VertexExtensions.cs b/LibBSP/Source/Extensions/VertexExtensions.cs index 6dac1a4..d19346e 100644 --- a/LibBSP/Source/Extensions/VertexExtensions.cs +++ b/LibBSP/Source/Extensions/VertexExtensions.cs @@ -119,7 +119,8 @@ namespace LibBSP { } break; } - case MapType.CoD2: { + case MapType.CoD2: + case MapType.CoD4: { result.normal = new Vector3d(BitConverter.ToSingle(data, 12), BitConverter.ToSingle(data, 16), BitConverter.ToSingle(data, 20)); result.color = ColorExtensions.FromArgb(data[27], data[24], data[25], data[26]); result.uv0 = new Vector2d(BitConverter.ToSingle(data, 28), BitConverter.ToSingle(data, 32)); @@ -131,7 +132,6 @@ namespace LibBSP { } case MapType.MOHAA: case MapType.Quake3: - case MapType.CoD4: case MapType.FAKK: { result.uv0 = new Vector2d(BitConverter.ToSingle(data, 12), BitConverter.ToSingle(data, 16)); result.uv1 = new Vector2d(BitConverter.ToSingle(data, 20), BitConverter.ToSingle(data, 24)); @@ -147,7 +147,7 @@ namespace LibBSP { result.normal = new Vector3d(BitConverter.ToSingle(data, 52), BitConverter.ToSingle(data, 56), BitConverter.ToSingle(data, 60)); result.color = ColorExtensions.FromArgb(data[67], data[64], data[65], data[66]); // Use for two more float fields and two more colors. - // There's actually another field that seems to be color but I've only ever seen it be FFFFFFFF. + // There's actually another field that seems to be color but I've only ever seen it be 0xFFFFFFFF. result.tangent = new Vector4d(BitConverter.ToSingle(data, 44), BitConverter.ToSingle(data, 48), BitConverter.ToSingle(data, 68), BitConverter.ToSingle(data, 72)); goto case MapType.Quake; } @@ -259,6 +259,7 @@ namespace LibBSP { case MapType.CoD2: { return 8; } + case MapType.CoD4: case MapType.Raven: case MapType.Quake3: { return 10; @@ -324,7 +325,8 @@ namespace LibBSP { } break; } - case MapType.CoD2: { + case MapType.CoD2: + case MapType.CoD4: { structLength = 68; break; } @@ -391,7 +393,8 @@ namespace LibBSP { } break; } - case MapType.CoD2: { + case MapType.CoD2: + case MapType.CoD4: { v.normal.GetBytes().CopyTo(bytes, 12); v.color.GetBytes().CopyTo(bytes, 24); v.uv0.GetBytes().CopyTo(bytes, 28); @@ -403,7 +406,6 @@ namespace LibBSP { } case MapType.MOHAA: case MapType.Quake3: - case MapType.CoD4: case MapType.FAKK: { v.uv0.GetBytes().CopyTo(bytes, 12); v.uv1.GetBytes().CopyTo(bytes, 20); diff --git a/LibBSP/Source/Structs/BSP/BrushSide.cs b/LibBSP/Source/Structs/BSP/BrushSide.cs index ea6f08f..05953ea 100644 --- a/LibBSP/Source/Structs/BSP/BrushSide.cs +++ b/LibBSP/Source/Structs/BSP/BrushSide.cs @@ -463,8 +463,8 @@ namespace LibBSP { case MapType.CoD: { return 3; } - case MapType.CoD4: - case MapType.CoD2: { + case MapType.CoD2: + case MapType.CoD4: { return 5; } case MapType.Raven: diff --git a/LibBSP/Source/Structs/BSP/Face.cs b/LibBSP/Source/Structs/BSP/Face.cs index 119e249..a450b3e 100644 --- a/LibBSP/Source/Structs/BSP/Face.cs +++ b/LibBSP/Source/Structs/BSP/Face.cs @@ -299,7 +299,8 @@ namespace LibBSP { get { switch (type) { case MapType.CoD: - case MapType.CoD2: { + case MapType.CoD2: + case MapType.CoD4: { return BitConverter.ToInt16(data, 0); } case MapType.Quake3: @@ -329,7 +330,8 @@ namespace LibBSP { byte[] bytes = BitConverter.GetBytes(value); switch (type) { case MapType.CoD: - case MapType.CoD2: { + case MapType.CoD2: + case MapType.CoD4: { data[0] = bytes[0]; data[1] = bytes[1]; break; @@ -373,7 +375,8 @@ namespace LibBSP { case MapType.STEF2: case MapType.STEF2Demo: case MapType.MOHAA: - case MapType.FAKK: { + case MapType.FAKK: + case MapType.CoD4: { return BitConverter.ToInt32(data, 12); } default: { @@ -395,7 +398,8 @@ namespace LibBSP { case MapType.STEF2: case MapType.STEF2Demo: case MapType.MOHAA: - case MapType.FAKK: { + case MapType.FAKK: + case MapType.CoD4: { bytes.CopyTo(data, 12); break; } @@ -421,6 +425,9 @@ namespace LibBSP { case MapType.FAKK: { return BitConverter.ToInt32(data, 16); } + case MapType.CoD4: { + return BitConverter.ToInt16(data, 16); + } default: { return -1; } @@ -448,6 +455,11 @@ namespace LibBSP { bytes.CopyTo(data, 16); break; } + case MapType.CoD4: { + data[16] = bytes[0]; + data[17] = bytes[1]; + break; + } } } } @@ -709,7 +721,8 @@ namespace LibBSP { case MapType.STEF2: case MapType.STEF2Demo: case MapType.MOHAA: - case MapType.FAKK: { + case MapType.FAKK: + case MapType.CoD4: { return BitConverter.ToInt32(data, 20); } default: { @@ -731,7 +744,8 @@ namespace LibBSP { case MapType.STEF2: case MapType.STEF2Demo: case MapType.MOHAA: - case MapType.FAKK: { + case MapType.FAKK: + case MapType.CoD4: { bytes.CopyTo(data, 20); break; } @@ -749,6 +763,9 @@ namespace LibBSP { case MapType.Nightfire: { return BitConverter.ToInt32(data, 16); } + case MapType.CoD4: { + return BitConverter.ToInt16(data, 18); + } case MapType.Quake3: case MapType.Raven: case MapType.STEF2: @@ -775,6 +792,11 @@ namespace LibBSP { bytes.CopyTo(data, 16); break; } + case MapType.CoD4: { + data[18] = bytes[0]; + data[19] = bytes[1]; + return; + } case MapType.Quake3: case MapType.Raven: case MapType.STEF2: @@ -788,28 +810,6 @@ namespace LibBSP { } } - public int unknown { - get { - switch (type) { - case MapType.Nightfire: { - return BitConverter.ToInt32(data, 36); - } - default: { - return 0; - } - } - } - set { - byte[] bytes = BitConverter.GetBytes(value); - switch (type) { - case MapType.Nightfire: { - bytes.CopyTo(data, 36); - break; - } - } - } - } - public int lightStyles { get { switch (type) { @@ -930,6 +930,10 @@ namespace LibBSP { structLength = 20; break; } + case MapType.CoD4: { + structLength = 24; + break; + } case MapType.SiN: { structLength = 36; break; @@ -1021,9 +1025,7 @@ namespace LibBSP { case MapType.CoD: { return 6; } - case MapType.CoD2: { - return 7; - } + case MapType.CoD2: case MapType.Vindictus: case MapType.TacticalInterventionEncrypted: case MapType.Source17: @@ -1039,7 +1041,8 @@ namespace LibBSP { case MapType.Quake: { return 7; } - case MapType.Nightfire: { + case MapType.Nightfire: + case MapType.CoD4: { return 9; } case MapType.Raven: @@ -1073,6 +1076,10 @@ namespace LibBSP { case MapType.DMoMaM: { return 27; } + case MapType.CoD4: { + // Not sure where else to put this. This is the simple surfaces lump? + return 47; + } default: { return -1; } diff --git a/LibBSP/Source/Structs/BSP/Leaf.cs b/LibBSP/Source/Structs/BSP/Leaf.cs index 486d9ba..53b1ac6 100644 --- a/LibBSP/Source/Structs/BSP/Leaf.cs +++ b/LibBSP/Source/Structs/BSP/Leaf.cs @@ -69,6 +69,9 @@ namespace LibBSP { [Index("markBrushes")] public int firstMarkBrush { get { switch (type) { + case MapType.CoD4: { + return BitConverter.ToInt32(data, 12); + } case MapType.CoD: case MapType.CoD2: { return BitConverter.ToInt32(data, 16); @@ -112,6 +115,10 @@ namespace LibBSP { set { byte[] bytes = BitConverter.GetBytes(value); switch (type) { + case MapType.CoD4: { + bytes.CopyTo(data, 12); + break; + } case MapType.CoD: case MapType.CoD2: { bytes.CopyTo(data, 16); @@ -161,6 +168,9 @@ namespace LibBSP { [Count("markBrushes")] public int numMarkBrushes { get { switch (type) { + case MapType.CoD4: { + return BitConverter.ToInt32(data, 16); + } case MapType.CoD: case MapType.CoD2: { return BitConverter.ToInt32(data, 20); @@ -204,6 +214,10 @@ namespace LibBSP { set { byte[] bytes = BitConverter.GetBytes(value); switch (type) { + case MapType.CoD4: { + bytes.CopyTo(data, 16); + break; + } case MapType.CoD: case MapType.CoD2: { bytes.CopyTo(data, 20); @@ -491,6 +505,10 @@ namespace LibBSP { } int structLength = 0; switch (type) { + case MapType.CoD4: { + structLength = 24; + break; + } case MapType.Quake: case MapType.Quake2: case MapType.SiN: { @@ -511,10 +529,6 @@ namespace LibBSP { structLength = 32; break; } - case MapType.Vindictus: { - structLength = 56; - break; - } case MapType.CoD: case MapType.CoD2: { structLength = 36; @@ -530,7 +544,8 @@ namespace LibBSP { break; } case MapType.Source18: - case MapType.Source19: { + case MapType.Source19: + case MapType.Vindictus: { structLength = 56; break; } @@ -597,6 +612,9 @@ namespace LibBSP { case MapType.CoD2: { return 26; } + case MapType.CoD4: { + return 28; + } default: { return -1; } diff --git a/LibBSP/Source/Structs/BSP/Model.cs b/LibBSP/Source/Structs/BSP/Model.cs index 4e82abb..7df69d2 100644 --- a/LibBSP/Source/Structs/BSP/Model.cs +++ b/LibBSP/Source/Structs/BSP/Model.cs @@ -212,6 +212,9 @@ namespace LibBSP { [Index("faces")] public int firstFace { get { switch (type) { + case MapType.CoD4: { + return BitConverter.ToInt16(data, 24); + } case MapType.CoD: case MapType.CoD2: case MapType.STEF2: @@ -256,6 +259,11 @@ namespace LibBSP { set { byte[] bytes = BitConverter.GetBytes(value); switch (type) { + case MapType.CoD4: { + data[24] = bytes[0]; + data[25] = bytes[1]; + break; + } case MapType.CoD: case MapType.CoD2: case MapType.STEF2: @@ -304,6 +312,9 @@ namespace LibBSP { [Count("faces")] public int numFaces { get { switch (type) { + case MapType.CoD4: { + return BitConverter.ToInt16(data, 28); + } case MapType.CoD: case MapType.CoD2: case MapType.STEF2: @@ -348,6 +359,11 @@ namespace LibBSP { set { byte[] bytes = BitConverter.GetBytes(value); switch (type) { + case MapType.CoD4: { + data[28] = bytes[0]; + data[29] = bytes[1]; + break; + } case MapType.CoD: case MapType.CoD2: case MapType.STEF2: diff --git a/LibBSP/Source/Structs/Common/Lumps/NumList.cs b/LibBSP/Source/Structs/Common/Lumps/NumList.cs index deac714..f8d8929 100644 --- a/LibBSP/Source/Structs/Common/Lumps/NumList.cs +++ b/LibBSP/Source/Structs/Common/Lumps/NumList.cs @@ -67,18 +67,18 @@ namespace LibBSP { switch (type) { case DataType.Byte: case DataType.SByte: { - return 1; + return sizeof(sbyte); } case DataType.UInt16: case DataType.Int16: { - return 2; + return sizeof(short); } case DataType.UInt32: case DataType.Int32: { - return 4; + return sizeof(int); } case DataType.Int64: { - return 8; + return sizeof(long); } default: { return 0; @@ -245,6 +245,10 @@ namespace LibBSP { dataType = DataType.UInt32; return 27; } + case MapType.CoD4: { + dataType = DataType.UInt32; + return 29; + } } dataType = DataType.Invalid; return -1; @@ -280,6 +284,10 @@ namespace LibBSP { dataType = DataType.UInt16; return 9; } + case MapType.CoD4: { + dataType = DataType.UInt16; + return 11; + } case MapType.Raven: case MapType.Quake3: { dataType = DataType.UInt32;