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); }
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>(); }
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(); }
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>(); }