public static Stream CreateResource(ResourceIndex0 index, byte resourceNumber) { var roomDisk = index.GetRoomDisk(resourceNumber); var disk = string.Format(index.Game.Pattern, roomDisk); var directory = ServiceLocator.FileStorage.GetDirectoryName(index.Game.Path); var path = ServiceLocator.FileStorage.OpenFileRead(ScummHelper.LocatePath(directory, disk)); var br = new BinaryReader(path); if (index.Game.Platform == Platform.Apple2GS) { br.BaseStream.Seek(roomDisk == 1 ? 142080 : 143104, SeekOrigin.Begin); } var signature = br.ReadUInt16(); if (roomDisk == 1 && signature != 0x0A31) throw new NotSupportedException(string.Format("Invalid signature '{0:X}' in disk 1", signature)); var signatureExpected = index.Game.Platform == Platform.Apple2GS ? 0x0032 : 0x0132; if (roomDisk == 2 && signature != signatureExpected) throw new NotSupportedException(string.Format("Invalid signature '{0:X}' in disk 2", signature)); int numResources; if (index.Game.GameId == GameId.Maniac) { if (index.Game.Features.HasFlag(GameFeatures.Demo)) { numResources = maniacDemoResourcesPerFile[resourceNumber]; } else { numResources = maniacResourcesPerFile[resourceNumber]; } } else { numResources = zakResourcesPerFile[resourceNumber]; } // read resources var ms = new MemoryStream(); var bw = new BinaryWriter(ms); var resourceOffset = index.GetResourceOffset(resourceNumber); br.BaseStream.Seek(resourceOffset, SeekOrigin.Begin); for (var i = 0; i < numResources; i++) { var size = br.ReadUInt16(); bw.Write(size); if (size > 0) { bw.Write(br.ReadBytes(size - 2)); } } ms.Seek(0, SeekOrigin.Begin); return ms; }
public static ResourceIndex Load(GameInfo game) { ResourceIndex index; switch (game.Version) { case 0: index = new ResourceIndex0(); break; case 1: if (game.Platform == Platform.C64) { index = new ResourceIndex0(); } else { index = new ResourceIndex2(); } break; case 2: index = new ResourceIndex2(); break; case 3: if (game.IsOldBundle) { index = new ResourceIndex3_16(); } else { index = new ResourceIndex3(); } break; case 4: index = new ResourceIndex4(); break; case 5: index = new ResourceIndex5(); break; case 6: index = new ResourceIndex6(); break; case 7: index = new ResourceIndex7(); break; case 8: index = new ResourceIndex8(); break; default: throw new NotSupportedException("The SCUMM version {0} is not supported."); } index.Game = game; index.LoadIndex(game); return(index); }
public static ResourceIndex Load(GameInfo game) { ResourceIndex index; switch (game.Version) { case 0: index = new ResourceIndex0(); break; case 1: if (game.Platform == Platform.C64) { index = new ResourceIndex0(); } else { index = new ResourceIndex2(); } break; case 2: index = new ResourceIndex2(); break; case 3: if (game.IsOldBundle) { index = new ResourceIndex3_16(); } else { index = new ResourceIndex3(); } break; case 4: index = new ResourceIndex4(); break; case 5: index = new ResourceIndex5(); break; case 6: index = new ResourceIndex6(); break; case 7: index = new ResourceIndex7(); break; case 8: index = new ResourceIndex8(); break; default: throw new NotSupportedException("The SCUMM version {0} is not supported."); } index.Game = game; index.LoadIndex(game); return index; }
public static Stream CreateResource(ResourceIndex0 index, byte resourceNumber) { var roomDisk = index.GetRoomDisk(resourceNumber); var disk = string.Format(index.Game.Pattern, roomDisk); var directory = ServiceLocator.FileStorage.GetDirectoryName(index.Game.Path); var path = ServiceLocator.FileStorage.OpenFileRead(ScummHelper.LocatePath(directory, disk)); var br = new BinaryReader(path); if (index.Game.Platform == Platform.Apple2GS) { br.BaseStream.Seek(roomDisk == 1 ? 142080 : 143104, SeekOrigin.Begin); } var signature = br.ReadUInt16(); if (roomDisk == 1 && signature != 0x0A31) { throw new NotSupportedException(string.Format("Invalid signature '{0:X}' in disk 1", signature)); } var signatureExpected = index.Game.Platform == Platform.Apple2GS ? 0x0032 : 0x0132; if (roomDisk == 2 && signature != signatureExpected) { throw new NotSupportedException(string.Format("Invalid signature '{0:X}' in disk 2", signature)); } int numResources; if (index.Game.GameId == GameId.Maniac) { if (index.Game.Features.HasFlag(GameFeatures.Demo)) { numResources = maniacDemoResourcesPerFile[resourceNumber]; } else { numResources = maniacResourcesPerFile[resourceNumber]; } } else { numResources = zakResourcesPerFile[resourceNumber]; } // read resources var ms = new MemoryStream(); var bw = new BinaryWriter(ms); var resourceOffset = index.GetResourceOffset(resourceNumber); br.BaseStream.Seek(resourceOffset, SeekOrigin.Begin); for (var i = 0; i < numResources; i++) { var size = br.ReadUInt16(); bw.Write(size); if (size > 0) { bw.Write(br.ReadBytes(size - 2)); } } ms.Seek(0, SeekOrigin.Begin); return(ms); }