public static DoorStruct CreateDoorStruct(ref FileStruct.TSWedDoor tsWedDoor) { DoorStruct ss = new DoorStruct(); ss.refDoor = Utils.CharsToString(tsWedDoor.refDoor).ToUpper(); ss.state = tsWedDoor.state; ss.openPoly = new PolygonStruct[tsWedDoor.openPolyCount]; ss.closePoly = new PolygonStruct[tsWedDoor.closePolyCount]; ss.tileMaps = new TileMapStruct[tsWedDoor.doorTileCount]; return(ss); }
public static ResourceClass.IResource ReadGWEDResourceFile(bool headerOnly, ChitinKey ckey, FileStream fileStream, int fileOffset, int fileSize) { ResourceClass.GWEDFile wedFile = new ResourceClass.GWEDFile(ckey.name); #region Check file header buff = new byte[FileStruct.TSWedHeaderSize]; fileStream.Position = fileOffset; FileStruct.TSWedHeader wedHead = (FileStruct.TSWedHeader)ReadBuffer <FileStruct.TSWedHeader> (fileStream, buff, FileStruct.TSWedHeaderSize); if (GlobalDefs.RES_GWED_SIGNATURE != Utils.CharsToString(wedHead.signature)) { throw new ArgumentException("Warning: Invalid signature in *.wed file."); } buff = new byte[FileStruct.TSWedSecHeadSize]; fileStream.Position = wedHead.secHeadOffset + fileOffset; FileStruct.TSWedSecHead wedSecHead = (FileStruct.TSWedSecHead)ReadBuffer <FileStruct.TSWedSecHead> (fileStream, buff, FileStruct.TSWedSecHeadSize); #endregion Check file header int tileMapOffset = -1; int tileRefOffset = -1; byte[] tmBuff = new byte[FileStruct.TSWedTileMapSize]; byte[] polyBuff = new byte[FileStruct.TSWedPolygonSize]; byte[] vtBuff = new byte[4]; // Point int vertOffset = wedSecHead.verticeOffset + fileOffset; #region Load overlays // --- overlay list --- // buff = new byte[FileStruct.TSWedOverlaySize]; fileStream.Position = wedHead.overlayOffset + fileOffset; wedFile.overlayList = new ResourceClass.GWEDFile.OverlayStruct[wedHead.overlayCount]; for (int c = 0; c < wedHead.overlayCount; c++) { FileStruct.TSWedOverlay tsWedOverlay = (FileStruct.TSWedOverlay)ReadBuffer <FileStruct.TSWedOverlay> (fileStream, buff, FileStruct.TSWedOverlaySize); ResourceClass.GWEDFile.OverlayStruct olay = ResourceClass.GWEDFile.CreateOverlayStruct(ref tsWedOverlay); wedFile.overlayList[c] = olay; if (tileMapOffset < 0) // get the offsets for overlay[0] { tileMapOffset = tsWedOverlay.tileMapOffset; tileRefOffset = tsWedOverlay.tileRefOffset; } long fpos = fileStream.Position; fileStream.Position = tsWedOverlay.tileMapOffset + fileOffset; // for each (x,y) tile in the overlay for (int y = 0; y < olay.ytile; y++) { for (int x = 0; x < olay.xtile; x++) { olay.tileMaps[x, y] = GetGWEDTileMap(fileStream, tmBuff, tsWedOverlay.tileRefOffset + fileOffset); } } fileStream.Position = fpos; } #endregion Load overlays #region Load doors // --- door list --- // buff = new byte[FileStruct.TSWedDoorSize]; fileStream.Position = wedHead.doorOffset + fileOffset; wedFile.doorList = new ResourceClass.GWEDFile.DoorStruct[wedHead.doorCount]; for (int c = 0; c < wedHead.doorCount; c++) { FileStruct.TSWedDoor tsWedDoor = (FileStruct.TSWedDoor)ReadBuffer <FileStruct.TSWedDoor> (fileStream, buff, FileStruct.TSWedDoorSize); ResourceClass.GWEDFile.DoorStruct door = ResourceClass.GWEDFile.CreateDoorStruct(ref tsWedDoor); wedFile.doorList[c] = door; long fpos = fileStream.Position; fileStream.Position = wedHead.doorTileOffset + (tsWedDoor.doorTileStart * 2) + fileOffset; ushort[] doorTiles = new ushort[tsWedDoor.doorTileCount]; byte[] doorTileBuff = new byte[tsWedDoor.doorTileCount * 2]; fileStream.Read(doorTileBuff, 0, doorTileBuff.Length); Buffer.BlockCopy(doorTileBuff, 0, doorTiles, 0, doorTileBuff.Length); for (int d = 0; d < tsWedDoor.doorTileCount; d++) { fileStream.Position = tileMapOffset + (doorTiles[d] * FileStruct.TSWedTileMapSize) + fileOffset; door.tileMaps[d] = GetGWEDTileMap(fileStream, tmBuff, tileRefOffset + fileOffset); } fileStream.Position = tsWedDoor.openPolyOffset + fileOffset; // for each open polygon for (int p = 0; p < tsWedDoor.openPolyCount; p++) { door.openPoly[p] = GetGWEDPolygon(fileStream, polyBuff, vtBuff, vertOffset); } fileStream.Position = tsWedDoor.openPolyOffset + fileOffset; // for each closed polygon for (int p = 0; p < tsWedDoor.closePolyCount; p++) { door.closePoly[p] = GetGWEDPolygon(fileStream, polyBuff, vtBuff, vertOffset); } fileStream.Position = fpos; } #endregion Load doors #region Load walls // --- wall list --- // buff = new byte[FileStruct.TSWedWallSize]; fileStream.Position = wedSecHead.wallOffset + fileOffset; ArrayList walls = new ArrayList(); int sumPolyRef = 0; int totalPolyRef = (wedSecHead.verticeOffset - wedSecHead.wallPolyRefOffset) / 2; // totalpolyref = sum of each wall { wall[i].wallPolyRefCount } // since we don't know how many walls there are at the start, we use // (sumPolyRef < totalPolyRef) as the stopping point while (sumPolyRef < totalPolyRef) { FileStruct.TSWedWall tsWedWall = (FileStruct.TSWedWall)ReadBuffer <FileStruct.TSWedWall> (fileStream, buff, FileStruct.TSWedWallSize); ResourceClass.GWEDFile.WallStruct wall = ResourceClass.GWEDFile.CreateWallStruct(ref tsWedWall); walls.Add(wall); long fpos = fileStream.Position; fileStream.Position = wedSecHead.wallPolyRefOffset + (tsWedWall.wallPolyRefStart * 2) + fileOffset; ushort[] polyRefs = new ushort[tsWedWall.wallPolyRefCount]; byte[] polyRefBuff = new byte[tsWedWall.wallPolyRefCount * 2]; fileStream.Read(polyRefBuff, 0, polyRefBuff.Length); Buffer.BlockCopy(polyRefBuff, 0, polyRefs, 0, polyRefBuff.Length); // for each wall for (int p = 0; p < tsWedWall.wallPolyRefCount; p++) { fileStream.Position = wedSecHead.wallPolyOffset + (polyRefs[p] * FileStruct.TSWedPolygonSize) + fileOffset; wall.wallPoly[p] = GetGWEDPolygon(fileStream, polyBuff, vtBuff, vertOffset); } sumPolyRef += tsWedWall.wallPolyRefCount; fileStream.Position = fpos; } wedFile.wallList = (ResourceClass.GWEDFile.WallStruct[]) walls.ToArray(typeof(ResourceClass.GWEDFile.WallStruct)); #endregion Load walls fileStream.Close(); return(wedFile); }