Наследование: ResourceIndex
Пример #1
0
        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;
        }
Пример #2
0
        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);
        }
Пример #3
0
        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;
        }
Пример #4
0
        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);
        }