void EncodeParseSwitches(string switches, out EncodeSwitches flags) { flags = 0; if (switches == null) { switches = ""; } const string k_switches_ctxt = "GameVariant:Encode"; if (SwitchIsOn(switches, 0, k_switches_ctxt + ":Megalo", "Clear TU weapon tuning data")) { flags |= EncodeSwitches.ClearWeaponTuning; } if (SwitchIsOn(switches, 1, k_switches_ctxt, "Create output game file")) { flags |= EncodeSwitches.CreateVariantFile; mFileOffset = 0; } if (SwitchIsOn(switches, 2, k_switches_ctxt, "Add all 8 teams")) { flags |= EncodeSwitches.AddAllTeams; } }
bool EncodeVariantPreprocess(EncodeSwitches switches, KBlam.RuntimeData.Variants.GameEngineVariant gev, string filePath) { const string k_teams_xml_filename = @"Games\Halo4\Definitions\VariantGameTeams.xml"; var mv = gev.TryGetMegaloVariant(); #region CreateVariantFile if ((switches & EncodeSwitches.CreateVariantFile) != 0) { string dir = Path.GetDirectoryName(filePath); if (!Directory.Exists(dir)) { Console.WriteLine("Error: The directory for the game file doesn't exist or is inaccessible: {0}", dir); return(false); } using (var fs = File.Create(filePath)) { fs.SetLength(KBlam.Blob.GameEngineVariantBlob.GetBlfFileLength(mGameBuildAndTarget)); } } else if (!File.Exists(filePath)) { Console.WriteLine("Error: Output game file does not exist"); return(false); } #endregion #region ClearWeaponTuning if ((switches & EncodeSwitches.ClearWeaponTuning) != 0 && mv != null) { mv.ClearWeaponTunings(); } #endregion #region AddAllTeams if ((switches & EncodeSwitches.AddAllTeams) != 0 && mGameBuildAndTarget.Build.IsWithinSameBranch(KBlam.Engine.EngineRegistry.EngineBranchHalo4)) { var bv = gev.Variant.BaseVariant; foreach (var team in bv.TeamOptions.Teams) { team.NameString.Clear(); } if (File.Exists(k_teams_xml_filename)) { using (var xml = new IO.XmlElementStream(k_teams_xml_filename, System.IO.FileAccess.Read)) { xml.InitializeAtRootElement(); xml.StreamMode = System.IO.FileAccess.Read; var team_xml_game = KBlam.Engine.EngineBuildHandle.None; KBlam.Engine.EngineBuildHandle.Serialize(xml, ref team_xml_game); if (team_xml_game.IsWithinSameBranch(KBlam.Engine.EngineRegistry.EngineBranchHalo4)) { bv.TeamOptions.SerializeTeams(xml); } else { Console.WriteLine("Warning: Teams xml is not for this game, not modifying variant's team data"); } } } else { Console.WriteLine("Warning: Teams xml not found, not modifying variant's team data"); } } #endregion if (mv == null) { return(true); } #region sanity check category name #if false string megalo_category_name; if (mv != null && mCornbread == false && mCategoryIndexToName.TryGetValue(mv.EngineCategory, out megalo_category_name)) { if (mv.CategoryString.Count == 0) { mv.CategoryString.Add(megalo_category_name); } else if (mv.CategoryString[0].English != megalo_category_name) { mv.CategoryString[0].Set(megalo_category_name); } } else if (mv != null && mCornbread == false) { Console.WriteLine("Warning: Invalid Megalo category data {0}, defaulting", mv.EngineCategory); mv.BaseVariant.Header.EngineCategoryIndex = mv.EngineCategory = kCommunityCategoryIndex; if (mv.CategoryString.Count == 0) { mv.CategoryString.Add(kCommunityCategory); } else { mv.CategoryString[0].Set(kCommunityCategory); } } #endif #endregion #region watermark #if false if (mv != null) { var mv_h4 = mv as KBlam.Games.Halo4.RuntimeData.Variants.GameEngineMegaloVariantHalo4; if (mv_h4 != null) { const string k_water_mark = "Halomods in your pods!"; if (mv_h4.IntroDescriptionString.Count == 0) { mv_h4.IntroDescriptionString.Add(k_water_mark); } else { mv_h4.IntroDescriptionString[0].Set(k_water_mark); } } } #endif #endregion return(true); }