Beispiel #1
0
        int ParseConversionFlags(List <string> args, out MultiplayerScenarioConversionFlags flags)
        {
            flags = MultiplayerScenarioConversionFlags.Default;
            var endIndex = 0;

            for (int i = 0; i < args.Count; i++)
            {
                var arg = args[i];

                bool   not      = false;
                string flagName = "";
                if (arg.Length > 1)
                {
                    not      = arg[0] == '!';
                    flagName = arg.Substring(1);
                }

                MultiplayerScenarioConversionFlags flag;
                if (Enum.TryParse(flagName, true, out flag))
                {
                    endIndex++;

                    if (not)
                    {
                        flags &= ~flag;
                    }
                    else
                    {
                        flags |= flag;
                    }
                }
            }

            return(endIndex);
        }
Beispiel #2
0
 public MultiplayerScenarioTagCollector(CacheFile blamCache, Scenario blamScnr,
                                        int desiredZoneSetIndex, BspFlags desiredBsps, MultiplayerScenarioConversionFlags conversionFlags)
 {
     this.BlamCache           = blamCache;
     this.BlamScnr            = blamScnr;
     this.DesiredZoneSetIndex = desiredZoneSetIndex;
     this.DesiredBsps         = desiredBsps;
     this.ConversionFlags     = conversionFlags;
     this.Tags = new List <IndexItem>();
 }
Beispiel #3
0
        private void Convert(int zoneSetIndex, BspFlags bspMask, MultiplayerScenarioConversionFlags conversionFlags)
        {
            var blamCache   = BlamCache;
            var blamScnrTag = BlamCache.IndexItems.FirstOrDefault(x => x.GroupTag == "scnr");
            var blamScnr    = BlamCache.Deserializer.Deserialize <Scenario>(new CacheSerializationContext(ref blamCache, blamScnrTag));

            using (var cacheStream = CacheContext.OpenTagCacheReadWrite())
            {
                var resourceStreams = new Dictionary <ResourceLocation, Stream>();

                var defaultPortingFlags = PortingFlags.Default;
                if (!conversionFlags.HasFlag(MultiplayerScenarioConversionFlags.Audio))
                {
                    defaultPortingFlags &= ~PortingFlags.Audio;
                }
                if (!conversionFlags.HasFlag(MultiplayerScenarioConversionFlags.Ms30))
                {
                    defaultPortingFlags &= ~PortingFlags.Ms30;
                }

                if (blamScnr.Lightmap != null)
                {
                    PortTag.RemoveFlags(~defaultPortingFlags);
                    PortTag.SetFlags(defaultPortingFlags);
                    ConvertLightmap(cacheStream, resourceStreams,
                                    blamCache.GetIndexItemFromID(blamScnr.Lightmap.Index), zoneSetIndex, bspMask);
                }

                var tagCollector = new MultiplayerScenarioTagCollector(blamCache, blamScnr, zoneSetIndex, bspMask, conversionFlags);
                tagCollector.Collect();

                PortTag.RemoveFlags(~defaultPortingFlags);
                PortTag.SetFlags(defaultPortingFlags);

                foreach (var tag in tagCollector.Tags)
                {
                    PortTag.ConvertTag(cacheStream, resourceStreams, tag);
                }

                PortTag.RemoveFlags(PortingFlags.Recursive);
                var scnrTag = PortTag.ConvertTag(cacheStream, resourceStreams, blamScnrTag);

                new MultiplayerScenarioFixup(cacheStream, CacheContext, blamScnrTag.Name, zoneSetIndex, bspMask, conversionFlags).Fixup();

                foreach (var entry in resourceStreams.Values)
                {
                    entry.Close();
                }
            }

            using (var stringIdCacheStream = CacheContext.OpenStringIdCacheReadWrite())
                CacheContext.StringIdCache.Save(stringIdCacheStream);

            CacheContext.SaveTagNames();
        }
Beispiel #4
0
 public MultiplayerScenarioFixup(
     Stream cacheStream, HaloOnlineCacheContext cacheContext, string scenarioTagName, int desiredZoneSetIndex,
     BspFlags desiredBsps, MultiplayerScenarioConversionFlags conversionFlags)
 {
     this.CacheContext        = cacheContext;
     this.CacheStream         = cacheStream;
     this.ScnrTag             = cacheContext.GetTag <Scenario>(scenarioTagName);
     this.Scnr                = cacheContext.Deserialize <Scenario>(new TagSerializationContext(cacheStream, cacheContext, this.ScnrTag));
     this.DesiredZoneSetIndex = desiredZoneSetIndex;
     this.DesiredBsps         = desiredBsps;
     this.ConversionFlags     = conversionFlags;
     this.BspIndexRemapping   = new Dictionary <int, int>();
 }