From 3efcd40cdc88f8a3129dbebee618ddf86d773fca Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Sat, 21 Dec 2024 17:46:34 +0100 Subject: [PATCH] [chore] rework advanced launch --- .../bs-launcher/abstract-launcher.service.ts | 7 +- .../bs-launcher/bs-launcher.service.ts | 22 ++-- .../bs-launcher/steam-launcher.service.ts | 7 +- .../bs-version-item.component.tsx | 5 +- .../svgs/icons/desktop-icon.component.tsx | 8 +- .../svgs/icons/oculus-icon.component.tsx | 8 +- .../svgs/icons/pin-icon.component.tsx | 9 ++ .../svgs/icons/terminal-icon.component.tsx | 8 +- .../svgs/icons/unpin-icon.component.tsx | 9 ++ .../launch/launch-mod-toogle.component.tsx | 9 +- .../launch/launch-options-panel.component.tsx | 67 ++++++++++ .../slides/launch/launch-slide.component.tsx | 118 ++++++++++++------ .../config/default-configuration.config.ts | 3 + src/renderer/services/bs-launcher.service.ts | 12 +- .../bs-launch/launch-option.interface.ts | 16 ++- 15 files changed, 221 insertions(+), 87 deletions(-) create mode 100644 src/renderer/components/svgs/icons/pin-icon.component.tsx create mode 100644 src/renderer/components/svgs/icons/unpin-icon.component.tsx create mode 100644 src/renderer/components/version-viewer/slides/launch/launch-options-panel.component.tsx diff --git a/src/main/services/bs-launcher/abstract-launcher.service.ts b/src/main/services/bs-launcher/abstract-launcher.service.ts index 6ed46121..ed324f8d 100644 --- a/src/main/services/bs-launcher/abstract-launcher.service.ts +++ b/src/main/services/bs-launcher/abstract-launcher.service.ts @@ -7,6 +7,7 @@ import { sToMs } from "../../../shared/helpers/time.helpers"; import { LinuxService } from "../linux.service"; import { bsmSpawn } from "main/helpers/os.helpers"; import { IS_FLATPAK } from "main/constants"; +import { LaunchMods } from "shared/models/bs-launch/launch-option.interface"; export abstract class AbstractLauncherService { @@ -24,14 +25,14 @@ export abstract class AbstractLauncherService { if(!launchOptions.version.steam && !launchOptions.version.oculus){ launchArgs.push("--no-yeet") } - if (launchOptions.oculus) { + if (launchOptions.launchMods?.includes(LaunchMods.OCULUS)) { launchArgs.push("-vrmode"); launchArgs.push("oculus"); } - if (launchOptions.desktop) { + if (launchOptions.launchMods?.includes(LaunchMods.FPFC)) { launchArgs.push("fpfc"); } - if (launchOptions.debug) { + if (launchOptions.launchMods?.includes(LaunchMods.DEBUG)) { launchArgs.push("--verbose"); } if (launchOptions.additionalArgs) { diff --git a/src/main/services/bs-launcher/bs-launcher.service.ts b/src/main/services/bs-launcher/bs-launcher.service.ts index 832b484e..5afe996e 100644 --- a/src/main/services/bs-launcher/bs-launcher.service.ts +++ b/src/main/services/bs-launcher/bs-launcher.service.ts @@ -20,6 +20,7 @@ import { SteamLauncherService } from "./steam-launcher.service"; import { OculusLauncherService } from "./oculus-launcher.service"; import { BSVersion } from "shared/bs-version.interface"; import { BsStore } from "../../../shared/models/bs-store.enum"; +import { LaunchMod, LaunchMods } from "shared/models/bs-launch/launch-option.interface"; export class BSLauncherService { private static instance: BSLauncherService; @@ -94,6 +95,14 @@ export class BSLauncherService { } private shortcutParamsToLaunchOption(params: ShortcutParams): LaunchOption{ + + const launchMods: LaunchMod[] = []; + + if(params.oculusMode === "true"){ launchMods.push(LaunchMods.OCULUS); } + if(params.desktopMode === "true"){ launchMods.push(LaunchMods.FPFC); } + if(params.debug === "true"){ launchMods.push(LaunchMods.DEBUG); } + if(params.skipSteam === "true"){ launchMods.push(LaunchMods.SKIP_STEAM); } + const res: LaunchOption = { version: { BSVersion: params.version, @@ -102,11 +111,8 @@ export class BSLauncherService { oculus: params.versionOculus === "true", ino: +params.versionIno }, - oculus: params.oculusMode === "true", - desktop: params.desktopMode === "true", - debug: params.debug === "true", additionalArgs: params.additionalArgs, - skipSteam: params.skipSteam === "true", + launchMods, }; return res; @@ -120,11 +126,11 @@ export class BSLauncherService { if(launchOptions.version.oculus){ res.versionOculus = `${launchOptions.version.oculus}`; } if(launchOptions.version.ino){ res.versionIno = `${launchOptions.version.ino}`; } - if(launchOptions.oculus){ res.oculusMode = "true"; } - if(launchOptions.desktop){ res.desktopMode = "true"; } - if(launchOptions.debug){ res.debug = "true"; } + if(launchOptions.launchMods?.includes(LaunchMods.OCULUS)){ res.oculusMode = "true"; } + if(launchOptions.launchMods?.includes(LaunchMods.FPFC)){ res.desktopMode = "true"; } + if(launchOptions.launchMods?.includes(LaunchMods.DEBUG)){ res.debug = "true"; } if(launchOptions.additionalArgs){ res.additionalArgs = launchOptions.additionalArgs; } - if(launchOptions.skipSteam){ res.skipSteam = "true"; } + if(launchOptions.launchMods?.includes(LaunchMods.SKIP_STEAM)){ res.skipSteam = "true"; } return res; } diff --git a/src/main/services/bs-launcher/steam-launcher.service.ts b/src/main/services/bs-launcher/steam-launcher.service.ts index e8a7106b..fdae1e1c 100644 --- a/src/main/services/bs-launcher/steam-launcher.service.ts +++ b/src/main/services/bs-launcher/steam-launcher.service.ts @@ -10,6 +10,7 @@ import { AbstractLauncherService } from "./abstract-launcher.service"; import { CustomError } from "../../../shared/models/exceptions/custom-error.class"; import { UtilsService } from "../utils.service"; import { exec } from "child_process"; +import { LaunchMods } from "shared/models/bs-launch/launch-option.interface"; export class SteamLauncherService extends AbstractLauncherService implements StoreLauncherInterface{ @@ -73,7 +74,7 @@ export class SteamLauncherService extends AbstractLauncherService implements Sto throw CustomError.fromError(new Error(`Path not exist : ${bsExePath}`), BSLaunchError.BS_NOT_FOUND); } - const skipSteam: boolean = launchOptions.skipSteam ?? false; + const skipSteam: boolean = launchOptions.launchMods?.includes(LaunchMods.SKIP_STEAM) ?? false; // Open Steam if not running if(!skipSteam && !(await this.steam.isSteamRunning())){ @@ -87,12 +88,12 @@ export class SteamLauncherService extends AbstractLauncherService implements Sto obs.next({type: BSLaunchWarning.UNABLE_TO_LAUNCH_STEAM}); }); } - else if (launchOptions.skipSteam) { + else { obs.next({ type: BSLaunchEvent.SKIPPING_STEAM_LAUNCH}); } // Backup SteamVR when desktop mode is enabled - if(launchOptions.desktop){ + if(launchOptions.launchMods?.includes(LaunchMods.FPFC)){ await this.backupSteamVR().catch(() => { return this.restoreSteamVR(); }); diff --git a/src/renderer/components/nav-bar/nav-bar-items/bs-version-item.component.tsx b/src/renderer/components/nav-bar/nav-bar-items/bs-version-item.component.tsx index 8c4b3f52..fae18770 100644 --- a/src/renderer/components/nav-bar/nav-bar-items/bs-version-item.component.tsx +++ b/src/renderer/components/nav-bar/nav-bar-items/bs-version-item.component.tsx @@ -60,10 +60,7 @@ export function BsVersionItem(props: { version: BSVersion }) { if(equal(downloadingVersion, props.version)){ return; } const launch$ = launcherService.launch({ version: state, - oculus: !!configService.get(LaunchMods.OCULUS_MOD), - desktop: !!configService.get(LaunchMods.DESKTOP_MOD), - debug: !!configService.get(LaunchMods.DEBUG_MOD), - skipSteam: !!configService.get(LaunchMods.SKIPSTEAM_MOD), + launchMods: configService.get("launch-mods") ?? [], }); return lastValueFrom(launch$).catch(() => {}); }; diff --git a/src/renderer/components/svgs/icons/desktop-icon.component.tsx b/src/renderer/components/svgs/icons/desktop-icon.component.tsx index 367ba71f..56aa8af5 100644 --- a/src/renderer/components/svgs/icons/desktop-icon.component.tsx +++ b/src/renderer/components/svgs/icons/desktop-icon.component.tsx @@ -1,9 +1,9 @@ -import { CSSProperties } from "react"; +import { createSvgIcon } from "../svg-icon.type"; -export function DesktopIcon(props: { className?: string; style?: CSSProperties }) { +export const DesktopIcon = createSvgIcon((props, ref) => { return ( - + ); -} +}) diff --git a/src/renderer/components/svgs/icons/oculus-icon.component.tsx b/src/renderer/components/svgs/icons/oculus-icon.component.tsx index dc2484fc..d2736bc5 100644 --- a/src/renderer/components/svgs/icons/oculus-icon.component.tsx +++ b/src/renderer/components/svgs/icons/oculus-icon.component.tsx @@ -1,12 +1,12 @@ -import { HTMLProps } from "react"; +import { createSvgIcon } from "../svg-icon.type"; -export function OculusIcon(props: HTMLProps) { +export const OculusIcon = createSvgIcon((props, ref) => { return ( - + ); -} +}) diff --git a/src/renderer/components/svgs/icons/pin-icon.component.tsx b/src/renderer/components/svgs/icons/pin-icon.component.tsx new file mode 100644 index 00000000..42a580aa --- /dev/null +++ b/src/renderer/components/svgs/icons/pin-icon.component.tsx @@ -0,0 +1,9 @@ +import { createSvgIcon } from "../svg-icon.type"; + +export const PinIcon = createSvgIcon((props, ref) => { + return ( + + + + ) +}); diff --git a/src/renderer/components/svgs/icons/terminal-icon.component.tsx b/src/renderer/components/svgs/icons/terminal-icon.component.tsx index a553809c..ac930525 100644 --- a/src/renderer/components/svgs/icons/terminal-icon.component.tsx +++ b/src/renderer/components/svgs/icons/terminal-icon.component.tsx @@ -1,9 +1,9 @@ -import { CSSProperties } from "react"; +import { createSvgIcon } from "../svg-icon.type"; -export function TerminalIcon(props: { className?: string; style?: CSSProperties }) { +export const TerminalIcon = createSvgIcon((props, ref) => { return ( - + ); -} +}) diff --git a/src/renderer/components/svgs/icons/unpin-icon.component.tsx b/src/renderer/components/svgs/icons/unpin-icon.component.tsx new file mode 100644 index 00000000..bf38bd5b --- /dev/null +++ b/src/renderer/components/svgs/icons/unpin-icon.component.tsx @@ -0,0 +1,9 @@ +import { createSvgIcon } from "../svg-icon.type" + +export const UnpinIcon = createSvgIcon((props, ref) => { + return ( + + + + ) +}) diff --git a/src/renderer/components/version-viewer/slides/launch/launch-mod-toogle.component.tsx b/src/renderer/components/version-viewer/slides/launch/launch-mod-toogle.component.tsx index 990c0083..b9038d54 100644 --- a/src/renderer/components/version-viewer/slides/launch/launch-mod-toogle.component.tsx +++ b/src/renderer/components/version-viewer/slides/launch/launch-mod-toogle.component.tsx @@ -1,24 +1,25 @@ import Tippy from "@tippyjs/react"; import { GlowEffect } from "renderer/components/shared/glow-effect.component"; -import { BsmIcon, BsmIconType } from "renderer/components/svgs/bsm-icon.component"; +import { BsmIcon } from "renderer/components/svgs/bsm-icon.component"; +import { SvgIcon } from "renderer/components/svgs/svg-icon.type"; import { useTranslation } from "renderer/hooks/use-translation.hook"; type Props = { onClick: (active: boolean) => void; active: boolean; text: string; - icon: BsmIconType; + icon?: SvgIcon; infoText?: string; }; -export function LaunchModToogle({ onClick, active, text, icon, infoText }: Props) { +export function LaunchModToogle({ onClick, active, text, icon: Icon, infoText }: Props) { const t = useTranslation(); return (
onClick(!active)}>
- + {Icon && } {t(text)} {infoText && ( diff --git a/src/renderer/components/version-viewer/slides/launch/launch-options-panel.component.tsx b/src/renderer/components/version-viewer/slides/launch/launch-options-panel.component.tsx new file mode 100644 index 00000000..9f06242b --- /dev/null +++ b/src/renderer/components/version-viewer/slides/launch/launch-options-panel.component.tsx @@ -0,0 +1,67 @@ +import Tippy from "@tippyjs/react"; +import { BsmCheckbox } from "renderer/components/shared/bsm-checkbox.component"; +import { PinIcon } from "renderer/components/svgs/icons/pin-icon.component"; +import { UnpinIcon } from "renderer/components/svgs/icons/unpin-icon.component"; +import { SvgIcon } from "renderer/components/svgs/svg-icon.type"; +import { cn } from "renderer/helpers/css-class.helpers"; +import { useTranslationV2 } from "renderer/hooks/use-translation.hook"; +import { LaunchMod } from "shared/models/bs-launch/launch-option.interface"; + +type Props = { + readonly className?: string; + readonly open: boolean; + readonly launchArgs?: string; + readonly launchMods?: LaunchModItemProps[]; + readonly onLaunchArgsChange?: (args: string) => void; +}; + +export function LaunchOptionsPanel({ className, open, launchArgs, launchMods, onLaunchArgsChange }: Props) { + + const {text: t} = useTranslationV2(); + + return ( +
+
+
+ onLaunchArgsChange(e.target.value)}/> +
+ {launchMods?.map((mod) => ( + + ))} +
+
+
+
+ ) +} + +export type LaunchModItemProps = { + readonly id: LaunchMod; + readonly Icon?: SvgIcon; + readonly label: string; + readonly description: string; + readonly active: boolean; + readonly visible?: boolean; + readonly pinned?: boolean; + readonly onChange?: (val: boolean) => void; + readonly onPinChange?: (val: boolean) => void; +} + +export function LaunchModItem({ id, Icon, label, description, active, visible, pinned, onChange, onPinChange }: LaunchModItemProps) { + + return ( + + + + +
+ ); + +} diff --git a/src/renderer/components/version-viewer/slides/launch/launch-slide.component.tsx b/src/renderer/components/version-viewer/slides/launch/launch-slide.component.tsx index bd84b713..1bac490b 100644 --- a/src/renderer/components/version-viewer/slides/launch/launch-slide.component.tsx +++ b/src/renderer/components/version-viewer/slides/launch/launch-slide.component.tsx @@ -1,8 +1,8 @@ -import { ChangeEvent, useEffect, useMemo, useState } from "react"; +import { useEffect, useMemo, useState } from "react"; import { BsmButton } from "renderer/components/shared/bsm-button.component"; import { useObservable } from "renderer/hooks/use-observable.hook"; import { useTranslationV2 } from "renderer/hooks/use-translation.hook"; -import { BSLauncherService, LaunchMods } from "renderer/services/bs-launcher.service"; +import { BSLauncherService } from "renderer/services/bs-launcher.service"; import { ConfigurationService } from "renderer/services/configuration.service"; import { BSVersion } from "shared/bs-version.interface"; import { LaunchModToogle } from "./launch-mod-toogle.component"; @@ -19,6 +19,12 @@ import { BSVersionManagerService } from "renderer/services/bs-version-manager.se import { safeLt } from "shared/helpers/semver.helpers"; import { WarningIcon } from "renderer/components/svgs/icons/warning-icon.component"; import Tippy from "@tippyjs/react"; +import { LaunchModItemProps, LaunchOptionsPanel } from "./launch-options-panel.component"; +import { LaunchMod, LaunchMods } from "shared/models/bs-launch/launch-option.interface"; +import { OculusIcon } from "renderer/components/svgs/icons/oculus-icon.component"; +import { DesktopIcon } from "renderer/components/svgs/icons/desktop-icon.component"; +import { TerminalIcon } from "renderer/components/svgs/icons/terminal-icon.component"; +import { DefaultConfigKey } from "renderer/config/default-configuration.config"; type Props = { version: BSVersion }; @@ -30,13 +36,12 @@ export function LaunchSlide({ version }: Props) { const bsDownloader = useService(BsDownloaderService); const versions = useService(BSVersionManagerService); - const [oculusMode, setOculusMode] = useState(!!configService.get(LaunchMods.OCULUS_MOD)); - const [desktopMode, setDesktopMode] = useState(!!configService.get(LaunchMods.DESKTOP_MOD)); - const [debugMode, setDebugMode] = useState(!!configService.get(LaunchMods.DEBUG_MOD)); const [advancedLaunch, setAdvancedLaunch] = useState(false); const [additionalArgsString, setAdditionalArgsString] = useState(configService.get("additionnal-args") || ""); - const [skipSteamMode, setSkipSteamMode] = useState(!!configService.get(LaunchMods.SKIPSTEAM_MOD)); const versionDownloading = useObservable(() => bsDownloader.downloadingVersion$); + const [activeLaunchMods, setActiveLaunchMods] = useState(configService.get("launch-mods") ?? []); + const [pinnedLaunchMods, setPinnedLaunchMods] = useState(configService.get("pinned-launch-mods" as DefaultConfigKey) ?? []); + const [launchModItems, setLaunchModItems] = useState([]); const versionRunning = useObservable(() => bsLauncherService.versionRunning$); @@ -45,36 +50,69 @@ export function LaunchSlide({ version }: Props) { }, [additionalArgsString]); useEffect(() => { - if(desktopMode){ return; } - bsLauncherService.restoreSteamVR(); - }, [desktopMode]); + configService.set("pinned-launch-mods", pinnedLaunchMods); + }, [pinnedLaunchMods]) - const setMode = (mode: LaunchMods, value: boolean) => { + useEffect(() => { + configService.set("launch-mods", activeLaunchMods); - if (mode === LaunchMods.DEBUG_MOD) { - setDebugMode(value); - } else if (mode === LaunchMods.OCULUS_MOD) { - setOculusMode(value); - } else if (mode === LaunchMods.DESKTOP_MOD) { - setDesktopMode(value); - } else if (mode === LaunchMods.SKIPSTEAM_MOD) { - setSkipSteamMode(value); + if(!activeLaunchMods.includes("fpfc")){ + bsLauncherService.restoreSteamVR(); } - configService.set(mode, value); - }; + }, [activeLaunchMods]); - const handleAdditionalArgsChange = (e: ChangeEvent) => setAdditionalArgsString(() => e.target.value); + useEffect(() => { + setLaunchModItems(() => [ + { + id: LaunchMods.OCULUS, + Icon: OculusIcon, + label: t("pages.version-viewer.launch-mods.oculus"), + description: t("pages.version-viewer.launch-mods.oculus-description"), + active: activeLaunchMods.includes(LaunchMods.OCULUS), + visible: !(version.metadata?.store === BsStore.OCULUS), + pinned: pinnedLaunchMods.includes(LaunchMods.OCULUS), + onChange: checked => checked ? setActiveLaunchMods(prev => [...prev, LaunchMods.OCULUS]) : setActiveLaunchMods(prev => prev.filter(mod => mod !== LaunchMods.OCULUS)), + onPinChange: pinned => pinned ? setPinnedLaunchMods(prev => [...prev, LaunchMods.OCULUS]) : setPinnedLaunchMods(prev => prev.filter(mod => mod !== LaunchMods.OCULUS)), + }, + { + id: LaunchMods.FPFC, + Icon: DesktopIcon, + label: t("pages.version-viewer.launch-mods.desktop"), + description: t("pages.version-viewer.launch-mods.desktop-description"), + active: activeLaunchMods.includes(LaunchMods.FPFC), + pinned: pinnedLaunchMods.includes(LaunchMods.FPFC), + onChange: checked => checked ? setActiveLaunchMods(prev => [...prev, LaunchMods.FPFC]) : setActiveLaunchMods(prev => prev.filter(mod => mod !== LaunchMods.FPFC)), + onPinChange: pinned => pinned ? setPinnedLaunchMods(prev => [...prev, LaunchMods.FPFC]) : setPinnedLaunchMods(prev => prev.filter(mod => mod !== LaunchMods.FPFC)), + }, + { + id: LaunchMods.DEBUG, + Icon: TerminalIcon, + label: t("pages.version-viewer.launch-mods.debug"), + description: t("pages.version-viewer.launch-mods.debug-description"), + active: activeLaunchMods.includes(LaunchMods.DEBUG), + pinned: pinnedLaunchMods.includes(LaunchMods.DEBUG), + onChange: checked => checked ? setActiveLaunchMods(prev => [...prev, LaunchMods.DEBUG]) : setActiveLaunchMods(prev => prev.filter(mod => mod !== LaunchMods.DEBUG)), + onPinChange: pinned => pinned ? setPinnedLaunchMods(prev => [...prev, LaunchMods.DEBUG]) : setPinnedLaunchMods(prev => prev.filter(mod => mod !== LaunchMods.DEBUG)), + }, + { + id: LaunchMods.SKIP_STEAM, + label: t("pages.version-viewer.launch-mods.skipsteam"), + description: t("pages.version-viewer.launch-mods.skipsteam-description"), + active: activeLaunchMods.includes(LaunchMods.SKIP_STEAM), + pinned: pinnedLaunchMods.includes(LaunchMods.SKIP_STEAM), + onChange: checked => checked ? setActiveLaunchMods(prev => [...prev, LaunchMods.SKIP_STEAM]) : setActiveLaunchMods(prev => prev.filter(mod => mod !== LaunchMods.SKIP_STEAM)), + onPinChange: pinned => pinned ? setPinnedLaunchMods(prev => [...prev, LaunchMods.SKIP_STEAM]) : setPinnedLaunchMods(prev => prev.filter(mod => mod !== LaunchMods.SKIP_STEAM)), + } + ]); + }, [activeLaunchMods, pinnedLaunchMods, version]); const launch = () => { const additionalArgs = additionalArgsString?.split(";").map(arg => arg.trim()).filter(arg => arg.length > 0); const launch$ = bsLauncherService.launch({ version, - oculus: version.oculus ? false : oculusMode, - desktop: desktopMode, - debug: debugMode, + launchMods: activeLaunchMods, additionalArgs: advancedLaunch ? additionalArgs : [], - skipSteam: skipSteamMode, }); return lastValueFrom(launch$).catch(() => {}); @@ -87,7 +125,9 @@ export function LaunchSlide({ version }: Props) { return (
- +
+ +

{version.name ? `${version.BSVersion} - ${version.name}` : version.BSVersion} {isOutdated && ( @@ -100,9 +140,18 @@ export function LaunchSlide({ version }: Props) {

- {!(version.oculus || version.metadata?.store === BsStore.OCULUS) && setMode(LaunchMods.OCULUS_MOD, !oculusMode)} active={oculusMode} text="pages.version-viewer.launch-mods.oculus" />} - setMode(LaunchMods.DESKTOP_MOD, !desktopMode)} active={desktopMode} text="pages.version-viewer.launch-mods.desktop" /> - setMode(LaunchMods.DEBUG_MOD, !debugMode)} active={debugMode} text="pages.version-viewer.launch-mods.debug" /> + {pinnedLaunchMods.map(id => launchModItems.find(mod => mod.id === id)).map(launchMod => { + if(launchMod?.visible === false || !launchMod?.pinned) { return undefined; } + return ( + launchMod.onChange(!launchMod.active)} + /> + ); + })}
@@ -117,18 +166,13 @@ export function LaunchSlide({ version }: Props) { }} />
-
- -
-
- {advancedLaunch && !(version.oculus || version.metadata?.store === BsStore.OCULUS) && setMode(LaunchMods.SKIPSTEAM_MOD, !skipSteamMode)} active={skipSteamMode} text="pages.version-viewer.launch-mods.skipsteam" />} -
-
+ +
diff --git a/src/renderer/config/default-configuration.config.ts b/src/renderer/config/default-configuration.config.ts index fedbfcdc..81c3b0fa 100644 --- a/src/renderer/config/default-configuration.config.ts +++ b/src/renderer/config/default-configuration.config.ts @@ -1,3 +1,4 @@ +import { LaunchMod, LaunchMods } from "shared/models/bs-launch/launch-option.interface"; import { BsvSearchOrder } from "shared/models/maps/beat-saver.model"; // NOTE: To refactor. Rename to LocalStorageConfigKeyValues since these are stored in the @@ -12,6 +13,7 @@ export interface DefaultConfigKeyValues { "default-shared-folders": string[]; "playlist-sort-order": BsvSearchOrder; "map-sort-order": BsvSearchOrder; + "pinned-launch-mods": LaunchMod[]; }; export type DefaultConfigKey = keyof DefaultConfigKeyValues; @@ -31,6 +33,7 @@ export const defaultConfiguration: { ], "playlist-sort-order": BsvSearchOrder.Relevance, "map-sort-order": BsvSearchOrder.Relevance, + "pinned-launch-mods": [LaunchMods.OCULUS, LaunchMods.DEBUG] }; export type ThemeConfig = "dark" | "light" | "os"; diff --git a/src/renderer/services/bs-launcher.service.ts b/src/renderer/services/bs-launcher.service.ts index 4361779d..3c78ff16 100644 --- a/src/renderer/services/bs-launcher.service.ts +++ b/src/renderer/services/bs-launcher.service.ts @@ -47,11 +47,8 @@ export class BSLauncherService { public getLaunchOptions(version: BSVersion): LaunchOption{ return { version, - oculus: this.config.get(LaunchMods.OCULUS_MOD), - desktop: this.config.get(LaunchMods.DESKTOP_MOD), - debug: this.config.get(LaunchMods.DEBUG_MOD), + launchMods: this.config.get("launch-mods") ?? [], additionalArgs: (this.config.get("additionnal-args") || "").split(";").map(arg => arg.trim()).filter(arg => arg.length > 0), - skipSteam: this.config.get(LaunchMods.SKIPSTEAM_MOD), } } @@ -124,10 +121,3 @@ export class BSLauncherService { return lastValueFrom(this.ipcService.sendV2("bs-launch.restore-steamvr")); } } - -export enum LaunchMods { - OCULUS_MOD = "LAUNCH_OCULUS_MOD", - DESKTOP_MOD = "LAUNCH_DESKTOP_MOD", - DEBUG_MOD = "LAUNCH_DEBUG_MOD", - SKIPSTEAM_MOD = "LAUNCH_SKIPSTEAM_MOD", -} diff --git a/src/shared/models/bs-launch/launch-option.interface.ts b/src/shared/models/bs-launch/launch-option.interface.ts index af972b23..732eb01c 100644 --- a/src/shared/models/bs-launch/launch-option.interface.ts +++ b/src/shared/models/bs-launch/launch-option.interface.ts @@ -1,11 +1,17 @@ import { BSVersion } from "shared/bs-version.interface"; +export const LaunchMods = { + OCULUS: "oculus", + FPFC: "fpfc", + DEBUG: "debug", + SKIP_STEAM: "skip_steam", +} as const; + +export type LaunchMod = typeof LaunchMods[keyof typeof LaunchMods]; + export interface LaunchOption { version: BSVersion, - oculus?: boolean, - desktop?: boolean, - debug?: boolean, + launchMods?: LaunchMod[], additionalArgs?: string[], - admin?: boolean, - skipSteam?: boolean + admin?: boolean }