Exemplo n.º 1
0
        public void DetermineMapFlags()
        {
            foreach (var mapFile in MapFileStreams)
            {
                var     reader = new EndianReader(mapFile);
                MapFile map    = new MapFile();
                map.Read(reader);

                var type = map.Header.CacheType;

                if (type == CacheFileType.Campaign)
                {
                    Header.MapFlags |= MapFlags.CampaignMaps;
                }
                else if (type == CacheFileType.MainMenu)
                {
                    Header.MapFlags |= MapFlags.MainmenuMaps;
                }
                else if (type == CacheFileType.Multiplayer)
                {
                    Header.MapFlags |= MapFlags.MultiplayerMaps;
                }
            }
        }
Exemplo n.º 2
0
        public GameCacheContextGen3(MapFile mapFile, EndianReader reader)
        {
            BaseMapFile         = mapFile;
            Version             = BaseMapFile.Version;
            Deserializer        = new TagDeserializer(Version);
            LocalesKey          = SetLocalesKey();
            StringsKey          = SetStringsKey();
            TagsKey             = SetTagsKey();
            NetworkKey          = SetNetworkKey();
            StringMods          = SetStringMods();
            LocaleGlobalsSize   = SetLocaleGlobalsSize();
            LocaleGlobalsOffset = SetLocaleGlobalsOffset();


            var interop = mapFile.Header.GetInterop();

            if (interop != null && interop.ResourceBaseAddress == 0)
            {
                Magic = (int)(interop.RuntimeBaseAddress - mapFile.Header.GetMemoryBufferSize());
            }
            else
            {
                mapFile.Header.ApplyMagic(mapFile.Header.GetStringIDsIndicesOffset() - mapFile.Header.GetHeaderSize(mapFile.Version));
                var resourcePartition = mapFile.Header.GetPartitions()[(int)CacheFilePartitionType.Resources];
                var resourceSection   = interop.Sections[(int)CacheFileSectionType.Resource];
                Magic = BitConverter.ToInt32(BitConverter.GetBytes(resourcePartition.BaseAddress), 0) - (interop.DebugSectionSize + resourceSection.Size);
            }

            if (mapFile.Header.GetTagIndexAddress() == 0)
            {
                return;
            }

            mapFile.Header.SetTagIndexAddress(BitConverter.ToUInt32(BitConverter.GetBytes(mapFile.Header.GetTagIndexAddress() - Magic), 0));

            IndexHeader = mapFile.GetIndexHeader(reader, Magic);
            Strings     = CreateStringTable(reader);
            IndexItems  = CreateCacheIndexTable(reader);

            LocaleTables = new List <CacheLocaleTable>();

            switch (mapFile.Version)
            {
            case CacheVersion.Halo3Retail:
                Resolver = new StringIdResolverHalo3();
                break;

            case CacheVersion.Halo3ODST:
                Resolver = new StringIdResolverHalo3ODST();
                break;

            case CacheVersion.HaloReach:
                Resolver = new StringIdResolverHaloReach();
                break;

            default:
                throw new NotSupportedException(CacheVersionDetection.GetBuildName(mapFile.Version));
            }

            foreach (var language in Enum.GetValues(typeof(GameLanguage)))
            {
                LocaleTables.Add(CreateLocaleTable(reader, (GameLanguage)language));
            }
        }
Exemplo n.º 3
0
        public static GameCache Open(FileInfo file)
        {
            MapFile map = new MapFile();
            var     estimatedVersion = CacheVersion.HaloOnline106708;

            using (var stream = file.OpenRead())
                using (var reader = new EndianReader(stream))
                {
                    if (file.Name.Contains(".map"))
                    {
                        map.Read(reader);
                        estimatedVersion = map.Version;
                    }
                    else if (file.Name.Equals("tags.dat"))
                    {
                        estimatedVersion = CacheVersion.HaloOnline106708;
                    }
                    else if (file.Name.Contains(".pak"))
                    {
                        return(new GameCacheModPackage(file));
                    }
                    else
                    {
                        throw new Exception("Invalid file passed to GameCache constructor");
                    }
                }

            switch (estimatedVersion)
            {
            case CacheVersion.HaloXbox:
            case CacheVersion.HaloPC:
            case CacheVersion.HaloCustomEdition:
                return(new GameCacheGen1(map, file));

            case CacheVersion.Halo2Vista:
            case CacheVersion.Halo2Xbox:
                return(new GameCacheGen2(map, file));

            case CacheVersion.Halo3Beta:
            case CacheVersion.Halo3Retail:
            case CacheVersion.Halo3ODST:
            case CacheVersion.HaloReach:
            case CacheVersion.HaloReachMCC0824:
            case CacheVersion.HaloReachMCC0887:
            case CacheVersion.HaloReachMCC1035:
            case CacheVersion.HaloReachMCC1211:
                return(new GameCacheGen3(map, file));

            case CacheVersion.HaloOnline106708:
            case CacheVersion.HaloOnline235640:
            case CacheVersion.HaloOnline301003:
            case CacheVersion.HaloOnline327043:
            case CacheVersion.HaloOnline372731:
            case CacheVersion.HaloOnline416097:
            case CacheVersion.HaloOnline430475:
            case CacheVersion.HaloOnline454665:
            case CacheVersion.HaloOnline449175:
            case CacheVersion.HaloOnline498295:
            case CacheVersion.HaloOnline530605:
            case CacheVersion.HaloOnline532911:
            case CacheVersion.HaloOnline554482:
            case CacheVersion.HaloOnline571627:
            case CacheVersion.HaloOnline700123:
            {
                var directory = file.Directory.FullName;
                var tagsPath  = Path.Combine(directory, "tags.dat");
                var tagsFile  = new FileInfo(tagsPath);

                if (!tagsFile.Exists)
                {
                    throw new Exception("Failed to find tags.dat");
                }

                return(new GameCacheHaloOnline(tagsFile.Directory));
            }
            }

            return(null);
        }