mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2025-02-20 23:47:16 -05:00
Fixed signed/unsigned ds/dt issue. Cleaned up load logic
This commit is contained in:
parent
ecc6eb2138
commit
78ee66bdfb
@ -43,27 +43,27 @@ namespace OpenDiablo2.Common.Models
|
||||
|
||||
public sealed class MPQDS1Object
|
||||
{
|
||||
public UInt32 Type { get; internal set; }
|
||||
public UInt32 Id { get; internal set; }
|
||||
public UInt32 X { get; internal set; }
|
||||
public UInt32 Y { get; internal set; }
|
||||
public UInt32 DS1Flags { get; internal set; }
|
||||
public Int32 Type { get; internal set; }
|
||||
public Int32 Id { get; internal set; }
|
||||
public Int32 X { get; internal set; }
|
||||
public Int32 Y { get; internal set; }
|
||||
public Int32 DS1Flags { get; internal set; }
|
||||
}
|
||||
|
||||
public sealed class MPQDS1
|
||||
{
|
||||
static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
public UInt32 Version { get; internal set; }
|
||||
public UInt32 Width { get; internal set; }
|
||||
public UInt32 Height { get; internal set; }
|
||||
public UInt32 Act { get; internal set; } // ???
|
||||
public UInt32 TagType { get; internal set; } // ???
|
||||
public UInt32 FileCount { get; internal set; }
|
||||
public UInt32 NumberOfWalls { get; internal set; }
|
||||
public UInt32 NumberOfFloors { get; internal set; }
|
||||
public UInt32 NumberOfObjects { get; internal set; }
|
||||
public UInt32 NumberOfNPCs { get; internal set; }
|
||||
public Int32 Version { get; internal set; }
|
||||
public Int32 Width { get; internal set; }
|
||||
public Int32 Height { get; internal set; }
|
||||
public Int32 Act { get; internal set; } // ???
|
||||
public Int32 TagType { get; internal set; } // ???
|
||||
public Int32 FileCount { get; internal set; }
|
||||
public Int32 NumberOfWalls { get; internal set; }
|
||||
public Int32 NumberOfFloors { get; internal set; }
|
||||
public Int32 NumberOfObjects { get; internal set; }
|
||||
public Int32 NumberOfNPCs { get; internal set; }
|
||||
|
||||
public MPQDT1[] DT1s = new MPQDT1[32];
|
||||
|
||||
@ -78,12 +78,12 @@ namespace OpenDiablo2.Common.Models
|
||||
{
|
||||
log.Debug($"Loading {fileName} (Act {act}) Def {definition}");
|
||||
var br = new BinaryReader(stream);
|
||||
Version = br.ReadUInt32();
|
||||
Width = br.ReadUInt32() + 1;
|
||||
Height = br.ReadUInt32() + 1;
|
||||
Act = br.ReadUInt32();
|
||||
TagType = br.ReadUInt32();
|
||||
FileCount = br.ReadUInt32();
|
||||
Version = br.ReadInt32();
|
||||
Width = br.ReadInt32() + 1;
|
||||
Height = br.ReadInt32() + 1;
|
||||
Act = br.ReadInt32();
|
||||
TagType = br.ReadInt32();
|
||||
FileCount = br.ReadInt32();
|
||||
|
||||
|
||||
|
||||
@ -105,8 +105,8 @@ namespace OpenDiablo2.Common.Models
|
||||
FileNames.Add(fn);
|
||||
}
|
||||
|
||||
NumberOfWalls = br.ReadUInt32();
|
||||
NumberOfFloors = br.ReadUInt32();
|
||||
NumberOfWalls = br.ReadInt32();
|
||||
NumberOfFloors = br.ReadInt32();
|
||||
|
||||
for (int i = 0; i < NumberOfWalls; i++)
|
||||
{
|
||||
@ -186,22 +186,22 @@ namespace OpenDiablo2.Common.Models
|
||||
|
||||
// TODO: Tag layer goes here (tag = 1)
|
||||
|
||||
NumberOfObjects = br.ReadUInt32();
|
||||
NumberOfObjects = br.ReadInt32();
|
||||
for (int i = 0; i < NumberOfObjects; i++)
|
||||
{
|
||||
Objects.Add(new MPQDS1Object
|
||||
{
|
||||
Type = br.ReadUInt32(),
|
||||
Id = br.ReadUInt32(),
|
||||
X = br.ReadUInt32(),
|
||||
Y = br.ReadUInt32(),
|
||||
DS1Flags = br.ReadUInt32()
|
||||
Type = br.ReadInt32(),
|
||||
Id = br.ReadInt32(),
|
||||
X = br.ReadInt32(),
|
||||
Y = br.ReadInt32(),
|
||||
DS1Flags = br.ReadInt32()
|
||||
});
|
||||
}
|
||||
|
||||
// TODO: Option groups go here (tag = 1)
|
||||
|
||||
NumberOfNPCs = br.ReadUInt32();
|
||||
NumberOfNPCs = br.ReadInt32();
|
||||
|
||||
|
||||
// TODO: WalkPaths
|
||||
|
@ -9,100 +9,119 @@ namespace OpenDiablo2.Common.Models
|
||||
{
|
||||
public sealed class MPQDT1Block
|
||||
{
|
||||
public UInt16 PositionX { get; internal set; }
|
||||
public UInt16 PositionY { get; internal set; }
|
||||
public Int16 PositionX { get; internal set; }
|
||||
public Int16 PositionY { get; internal set; }
|
||||
public byte GridX { get; internal set; }
|
||||
public byte GridY { get; internal set; }
|
||||
public UInt16 Format { get; internal set; }
|
||||
public UInt32 Length { get; internal set; }
|
||||
public UInt32 FileOffset { get; internal set; }
|
||||
public Int16 Format { get; internal set; }
|
||||
public Int32 Length { get; internal set; }
|
||||
public Int32 FileOffset { get; internal set; }
|
||||
public Int16[] PixelData { get; internal set; }
|
||||
}
|
||||
|
||||
public sealed class MPQDT1Tile
|
||||
{
|
||||
public UInt32 Direction { get; internal set; }
|
||||
public UInt16 RoofHeight { get; internal set; }
|
||||
public Int32 Direction { get; internal set; }
|
||||
public Int16 RoofHeight { get; internal set; }
|
||||
public byte SoundIndex { get; internal set; }
|
||||
public bool Animated { get; internal set; }
|
||||
public int Height { get; internal set; }
|
||||
public int Width { get; internal set; }
|
||||
public UInt32 Orientation { get; internal set; }
|
||||
public UInt32 MainIndex { get; internal set; }
|
||||
public UInt32 SubIndex { get; internal set; }
|
||||
public UInt32 RarityOrFrameIndex { get; internal set; }// Frame index if animated floor tile
|
||||
public Int32 Orientation { get; internal set; }
|
||||
public Int32 MainIndex { get; internal set; }
|
||||
public Int32 SubIndex { get; internal set; }
|
||||
public Int32 RarityOrFrameIndex { get; internal set; }// Frame index if animated floor tile
|
||||
public byte[] SubTileFlags { get; internal set; } = new byte[25];
|
||||
public UInt32 BlockHeadersPointer { get; internal set; } // Pointer to block headers for this tile
|
||||
public UInt32 BlockDataLength { get; internal set; } // Block headers + block data of this tile
|
||||
public UInt32 NumberOfBlocks { get; internal set; }
|
||||
public Int32 BlockHeadersPointer { get; internal set; } // Pointer to block headers for this tile
|
||||
public Int32 BlockDataLength { get; internal set; } // Block headers + block data of this tile
|
||||
public Int32 NumberOfBlocks { get; internal set; }
|
||||
public MPQDT1Block[] Blocks { get; internal set; }
|
||||
}
|
||||
|
||||
public sealed class MPQDT1
|
||||
{
|
||||
public UInt32 NumberOfTiles { get; private set; }
|
||||
public Int32 NumberOfTiles { get; private set; }
|
||||
public MPQDT1Tile[] Tiles { get; private set; }
|
||||
private Int32 tileHeaderOffset;
|
||||
|
||||
public MPQDT1(Stream stream)
|
||||
{
|
||||
var br = new BinaryReader(stream);
|
||||
|
||||
stream.Seek(268, SeekOrigin.Begin); // Skip useless header info
|
||||
NumberOfTiles = br.ReadUInt32();
|
||||
var tileHeaderOffset = br.ReadUInt32();
|
||||
stream.Seek(tileHeaderOffset, SeekOrigin.Begin);
|
||||
NumberOfTiles = br.ReadInt32();
|
||||
tileHeaderOffset = br.ReadInt32();
|
||||
|
||||
ReadTiles(br);
|
||||
ReadBlockHeaders(br);
|
||||
ReadBlockGraphics(br);
|
||||
|
||||
}
|
||||
private void ReadTiles(BinaryReader br)
|
||||
{
|
||||
Tiles = new MPQDT1Tile[NumberOfTiles];
|
||||
|
||||
for (int tileIndex = 0; tileIndex < NumberOfTiles; tileIndex++)
|
||||
{
|
||||
stream.Seek(tileHeaderOffset + (96 * tileIndex), SeekOrigin.Begin);
|
||||
Tiles[tileIndex] = new MPQDT1Tile();
|
||||
var tile = Tiles[tileIndex];
|
||||
|
||||
tile.Direction = br.ReadUInt32();
|
||||
tile.RoofHeight = br.ReadUInt16();
|
||||
tile.Direction = br.ReadInt32();
|
||||
tile.RoofHeight = br.ReadInt16();
|
||||
tile.SoundIndex = br.ReadByte();
|
||||
tile.Animated = br.ReadByte() == 1;
|
||||
tile.Height = br.ReadInt32();
|
||||
tile.Width = br.ReadInt32();
|
||||
br.ReadBytes(4);
|
||||
tile.Orientation = br.ReadUInt32();
|
||||
tile.MainIndex = br.ReadUInt32();
|
||||
tile.SubIndex = br.ReadUInt32();
|
||||
tile.RarityOrFrameIndex = br.ReadUInt32();
|
||||
tile.Orientation = br.ReadInt32();
|
||||
tile.MainIndex = br.ReadInt32();
|
||||
tile.SubIndex = br.ReadInt32();
|
||||
tile.RarityOrFrameIndex = br.ReadInt32();
|
||||
br.ReadBytes(4);
|
||||
for (int i = 0; i < 25; i++)
|
||||
tile.SubTileFlags[i] = br.ReadByte();
|
||||
br.ReadBytes(7);
|
||||
tile.BlockHeadersPointer = br.ReadUInt32();
|
||||
tile.BlockDataLength = br.ReadUInt32();
|
||||
tile.NumberOfBlocks = br.ReadUInt32();
|
||||
tile.BlockHeadersPointer = br.ReadInt32();
|
||||
tile.BlockDataLength = br.ReadInt32();
|
||||
tile.NumberOfBlocks = br.ReadInt32();
|
||||
br.ReadBytes(12);
|
||||
}
|
||||
}
|
||||
|
||||
if (tile.BlockHeadersPointer == 0 || tile.Width == 0 || tile.Height == 0)
|
||||
{
|
||||
tile.Blocks = new MPQDT1Block[0];
|
||||
continue;
|
||||
}
|
||||
|
||||
private void ReadBlockHeaders(BinaryReader br)
|
||||
{
|
||||
for (int tileIndex = 0; tileIndex < NumberOfTiles; tileIndex++)
|
||||
{
|
||||
var tile = Tiles[tileIndex];
|
||||
br.BaseStream.Seek(tile.BlockHeadersPointer, SeekOrigin.Begin);
|
||||
tile.Blocks = new MPQDT1Block[tile.NumberOfBlocks];
|
||||
|
||||
for (int blockIndex = 0; blockIndex < tile.NumberOfBlocks; blockIndex++)
|
||||
{
|
||||
stream.Seek(tile.BlockHeadersPointer + (20 * blockIndex), SeekOrigin.Begin);
|
||||
tile.Blocks[blockIndex] = new MPQDT1Block();
|
||||
var block = tile.Blocks[blockIndex];
|
||||
|
||||
block.PositionX = br.ReadUInt16();
|
||||
block.PositionY = br.ReadUInt16();
|
||||
block.PositionX = br.ReadInt16();
|
||||
block.PositionY = br.ReadInt16();
|
||||
br.ReadBytes(2);
|
||||
block.GridX = br.ReadByte();
|
||||
block.GridX = br.ReadByte();
|
||||
block.Format = br.ReadUInt16();
|
||||
block.Length = br.ReadUInt32();
|
||||
block.Format = br.ReadInt16();
|
||||
block.Length = br.ReadInt32();
|
||||
br.ReadBytes(2);
|
||||
block.FileOffset = br.ReadUInt32();
|
||||
|
||||
stream.Seek(tile.BlockHeadersPointer + block.FileOffset, SeekOrigin.Begin);
|
||||
block.FileOffset = br.ReadInt32();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ReadBlockGraphics(BinaryReader br)
|
||||
{
|
||||
for (int tileIndex = 0; tileIndex < NumberOfTiles; tileIndex++)
|
||||
{
|
||||
for (int blockIndex = 0; blockIndex < Tiles[tileIndex].NumberOfBlocks; blockIndex++)
|
||||
{
|
||||
var block = Tiles[tileIndex].Blocks[blockIndex];
|
||||
br.BaseStream.Seek(Tiles[tileIndex].BlockHeadersPointer + block.FileOffset, SeekOrigin.Begin);
|
||||
|
||||
if (block.Format == 1)
|
||||
{
|
||||
@ -132,10 +151,10 @@ namespace OpenDiablo2.Common.Models
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
// RLE block
|
||||
/* TODO: BROKEN
|
||||
/*
|
||||
var length = block.Length;
|
||||
byte b1;
|
||||
byte b2;
|
||||
@ -143,28 +162,27 @@ namespace OpenDiablo2.Common.Models
|
||||
int y = 0;
|
||||
int width = (block.Format >> 8);
|
||||
int height = (block.Format & 0xFF);
|
||||
block.PixelData = new Int16[width * height];
|
||||
block.PixelData = new Int16[256 * 256];
|
||||
while (length > 0)
|
||||
{
|
||||
b1 = br.ReadByte();
|
||||
b2 = br.ReadByte();
|
||||
length -= 2;
|
||||
if (b1 != 0 || b2 != 0)
|
||||
{
|
||||
x += b1;
|
||||
length -= b2;
|
||||
while (b2 > 0)
|
||||
{
|
||||
block.PixelData[x + (y * 32)] = br.ReadByte();
|
||||
br.ReadByte();
|
||||
x++;
|
||||
b2--;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (b1 + b2 == 0)
|
||||
{
|
||||
x = 0;
|
||||
y++;
|
||||
continue;
|
||||
}
|
||||
|
||||
x += b1;
|
||||
length -= b2;
|
||||
while (b2 > 0)
|
||||
{
|
||||
block.PixelData[x + (y * 32)] = br.ReadByte();
|
||||
br.ReadByte();
|
||||
x++;
|
||||
b2--;
|
||||
}
|
||||
}
|
||||
*/
|
||||
@ -172,5 +190,6 @@ namespace OpenDiablo2.Common.Models
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user