internal static bool OpenFMInEditor(FanMission fm) { #region Checks (specific to DromEd) // This should never happen because our menu item is supposed to be hidden for Thief 3 FMs. if (!GameIsDark(fm.Game)) { Log("FM game type is not a Dark Engine game.\r\n" + "FM: " + (!fm.Archive.IsEmpty() ? fm.Archive : fm.InstalledDir) + "\r\n" + "fm.Game was: " + fm.Game, stackTrace: true); Dialogs.ShowError(ErrorText.FMGameTypeIsNotDark); return(false); } GameIndex gameIndex = GameToGameIndex(fm.Game); string gamePath = Config.GetGamePath(gameIndex); if (gamePath.IsEmpty()) { Log("Game path is empty for " + gameIndex, stackTrace: true); Dialogs.ShowError(gameIndex + ":\r\n" + ErrorText.GamePathEmpty); return(false); } string editorExe = Config.GetEditorExe_FromDisk(gameIndex); if (editorExe.IsEmpty()) { Log("Editor executable not found.\r\n" + "FM:" + (!fm.Archive.IsEmpty() ? fm.Archive : fm.InstalledDir) + "\r\n" + "Editor executable: " + editorExe); Dialogs.ShowError(fm.Game == Game.SS2 ? LText.AlertMessages.ShockEd_ExecutableNotFound : LText.AlertMessages.DromEd_ExecutableNotFound); return(false); } #endregion // Just in case, and for consistency Paths.CreateOrClearTempPath(Paths.StubCommTemp); if (gameIndex is GameIndex.Thief1 or GameIndex.Thief2) { GameConfigFiles.FixCharacterDetailLine(gamePath); } // We don't need to do this here, right? SetUsAsSelector(gameIndex, gamePath, PlaySource.Editor); // Since we don't use the stub currently, set this here // NOTE: DromEd game mode doesn't even work for me anymore. Black screen no matter what. So I can't test if we need languages. GameConfigFiles.SetCamCfgLanguage(gamePath, ""); // Why not GenerateMissFlagFileIfRequired(fm); // We don't need the stub for DromEd, cause we don't need to pass anything except the fm folder StartExe(editorExe, gamePath, "-fm=\"" + fm.InstalledDir + "\""); return(true); }
private static void WriteStubCommFile(FanMission?fm, string gamePath, bool originalT3 = false) { string sLanguage = ""; bool? bForceLanguage = null; if (fm == null) { if (!originalT3) { GameConfigFiles.SetCamCfgLanguage(gamePath, ""); } } else if (GameIsDark(fm.Game)) { bool langIsDefault = fm.SelectedLang.EqualsI(FMLanguages.DefaultLangKey); if (langIsDefault) { // For Dark, we have to do this semi-manual stuff. (sLanguage, bForceLanguage) = FMLanguages.GetDarkFMLanguage(GameToGameIndex(fm.Game), fm.Archive, fm.InstalledDir); } else { sLanguage = fm.SelectedLang; bForceLanguage = true; } GameConfigFiles.SetCamCfgLanguage(gamePath, langIsDefault ? "" : fm.SelectedLang); } // For Thief 3, Sneaky Upgrade does the entire language thing for me, Builder bless snobel once again. // I just can't tell you how much I appreciate how much work SU does for me, even right down to handling // the "All The World's a Stage" custom sound extract thing. // So, I don't have to do anything whatsoever here, just pass blank and carry on. Awesome! try { // IMPORTANT (Stub comm file encoding): // Encoding MUST be "new UTF8Encoding(false, true)" or the C++ stub won't read it (it doesn't // handle the byte order mark). using var sw = new StreamWriter(Paths.StubCommFilePath, append: false, new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true)); sw.WriteLine("PlayOriginalGame=" + (fm == null)); if (fm != null) { sw.WriteLine("SelectedFMName=" + fm.InstalledDir); sw.WriteLine("DisabledMods=" + fm.DisabledMods); // Pass blank if we have nothing, so the stub will leave whatever was in there before if (!sLanguage.IsEmpty()) { sw.WriteLine("Language=" + sLanguage); } if (bForceLanguage != null) { sw.WriteLine("ForceLanguage=" + (bool)bForceLanguage); } } } catch (Exception ex) { Log("Exception writing stub file '" + Paths.StubFileName + "'\r\n" + (fm == null ? "Original game" : "FM"), ex); Dialogs.ShowError("Unable to write stub comm file. " + (fm == null ? "Game may not start correctly." : "FM cannot be passed to the game and therefore cannot be played.")); } }