diff --git a/assets/jsons/translations/de.json b/assets/jsons/translations/de.json index 31f4654b..d3772125 100644 --- a/assets/jsons/translations/de.json +++ b/assets/jsons/translations/de.json @@ -54,7 +54,9 @@ "placeholder": "Weitere Argumente, bspw: --revert; --nowait" }, "skipsteam": "Steam überspringen", - "skipsteam-description": "Verhindert, dass Steam automatisch mit Beat Saber geöffnet wird. Aktivieren Sie dies, wenn Sie eine andere VR-Laufzeit wie WiVRn oder Monado verwenden, mit der SteamVR interferieren könnte." + "skipsteam-description": "Verhindert, dass Steam automatisch mit Beat Saber geöffnet wird. Aktivieren Sie dies, wenn Sie eine andere VR-Laufzeit wie WiVRn oder Monado verwenden, mit der SteamVR interferieren könnte.", + "map-editor": "Karteneditor", + "map-editor-description": "Starte den offiziellen Beat Saber-Karteneditor anstelle des Spiels." }, "maps": { "search-bar": { diff --git a/assets/jsons/translations/en.json b/assets/jsons/translations/en.json index 284c0f4b..1ef9eab9 100644 --- a/assets/jsons/translations/en.json +++ b/assets/jsons/translations/en.json @@ -54,7 +54,9 @@ "placeholder": "Additional arguments ex: --revert; --nowait" }, "skipsteam": "Skip Steam", - "skipsteam-description": "Stops Steam from opening automatically with Beat Saber, enable if you are using a different VR runtime like WiVRn or Monado that SteamVR may interfere with." + "skipsteam-description": "Stops Steam from opening automatically with Beat Saber, enable if you are using a different VR runtime like WiVRn or Monado that SteamVR may interfere with.", + "map-editor": "Map Editor", + "map-editor-description": "Start the official Beat Saber map editor instead of the game." }, "maps": { "search-bar": { diff --git a/assets/jsons/translations/es.json b/assets/jsons/translations/es.json index 09557906..553790e0 100644 --- a/assets/jsons/translations/es.json +++ b/assets/jsons/translations/es.json @@ -64,7 +64,9 @@ "delete-duplicate-maps": "Borrar duplicados" }, "skipsteam": "Saltar Steam", - "skipsteam-description": "Evita que Steam se abra automáticamente con Beat Saber, habilita esto si estás usando un runtime de VR diferente como WiVRn o Monado que SteamVR podría interferir." + "skipsteam-description": "Evita que Steam se abra automáticamente con Beat Saber, habilita esto si estás usando un runtime de VR diferente como WiVRn o Monado que SteamVR podría interferir.", + "map-editor": "Editor de mapas", + "map-editor-description": "Inicia el editor oficial de mapas de Beat Saber en lugar del juego." }, "tabs": { "maps": { diff --git a/assets/jsons/translations/fr.json b/assets/jsons/translations/fr.json index 4106b471..ec4d562e 100644 --- a/assets/jsons/translations/fr.json +++ b/assets/jsons/translations/fr.json @@ -54,7 +54,9 @@ "placeholder": "Arguments supplémentaires ex: --revert; --nowait" }, "skipsteam": "Ignorer Steam", - "skipsteam-description": "Empêche Steam de s'ouvrir automatiquement avec Beat Saber, activez-le si vous utilisez un autre runtime VR comme WiVRn ou Monado avec lequel SteamVR pourrait interférer." + "skipsteam-description": "Empêche Steam de s'ouvrir automatiquement avec Beat Saber, activez-le si vous utilisez un autre runtime VR comme WiVRn ou Monado avec lequel SteamVR pourrait interférer.", + "map-editor": "Éditeur de map", + "map-editor-description": "Lance l'éditeur officiel de map de Beat Saber au lieu du jeu." }, "maps": { "search-bar": { diff --git a/assets/jsons/translations/ko.json b/assets/jsons/translations/ko.json index 89f4ab51..581aca3b 100644 --- a/assets/jsons/translations/ko.json +++ b/assets/jsons/translations/ko.json @@ -54,7 +54,9 @@ "placeholder": "추가 인수 예: --revert; --nowait" }, "skipsteam": "Steam 실행 건너뛰기", - "skipsteam-description": "Beat Saber와 함께 Steam이 자동으로 열리는 것을 방지합니다. SteamVR이 간섭할 수 있는 WiVRn 또는 Monado와 같은 다른 VR 런타임을 사용하는 경우 활성화하세요." + "skipsteam-description": "Beat Saber와 함께 Steam이 자동으로 열리는 것을 방지합니다. SteamVR이 간섭할 수 있는 WiVRn 또는 Monado와 같은 다른 VR 런타임을 사용하는 경우 활성화하세요.", + "map-editor": "맵 편집기", + "map-editor-description": "게임 대신 공식 Beat Saber 맵 편집기를 실행해." }, "maps": { "search-bar": { diff --git a/assets/jsons/translations/ru.json b/assets/jsons/translations/ru.json index bbe73fcd..09a9ea1f 100644 --- a/assets/jsons/translations/ru.json +++ b/assets/jsons/translations/ru.json @@ -54,7 +54,9 @@ "placeholder": "Параметры запуска, например: --revert; --nowait" }, "skipsteam": "Пропустить Steam", - "skipsteam-description": "Предотвращает автоматическое открытие Steam с Beat Saber, включите, если вы используете другую VR-среду, такую как WiVRn или Monado, с которой SteamVR может мешать." + "skipsteam-description": "Предотвращает автоматическое открытие Steam с Beat Saber, включите, если вы используете другую VR-среду, такую как WiVRn или Monado, с которой SteamVR может мешать.", + "map-editor": "Редактор карт", + "map-editor-description": "Запусти официальный редактор карт Beat Saber вместо игры." }, "maps": { "search-bar": { diff --git a/assets/jsons/translations/zh-tw.json b/assets/jsons/translations/zh-tw.json index 9aece0d5..6bf2364b 100644 --- a/assets/jsons/translations/zh-tw.json +++ b/assets/jsons/translations/zh-tw.json @@ -54,7 +54,9 @@ "placeholder": "額外啟動參數,例如: --revert; --nowait" }, "skipsteam": "跳過 Steam", - "skipsteam-description": "防止 Steam 與 Beat Saber 自動打開,如果您使用的是其他 VR 執行時,如 WiVRn 或 Monado,SteamVR 可能會干擾,請啟用此選項。" + "skipsteam-description": "防止 Steam 與 Beat Saber 自動打開,如果您使用的是其他 VR 執行時,如 WiVRn 或 Monado,SteamVR 可能會干擾,請啟用此選項。", + "map-editor": "地圖編輯器", + "map-editor-description": "啟動官方的 Beat Saber 地圖編輯器,而不是遊戲。" }, "maps": { "search-bar": { diff --git a/assets/jsons/translations/zh.json b/assets/jsons/translations/zh.json index 6a400cd0..a84ec492 100644 --- a/assets/jsons/translations/zh.json +++ b/assets/jsons/translations/zh.json @@ -54,7 +54,9 @@ "placeholder": "额外启动参数,例如: --revert; --nowait" }, "skipsteam": "跳过 Steam", - "skipsteam-description": "防止 Steam 与 Beat Saber 自动打开,如果您使用的是其他 VR 运行时,如 WiVRn 或 Monado,SteamVR 可能会干扰,请启用此选项。" + "skipsteam-description": "防止 Steam 与 Beat Saber 自动打开,如果您使用的是其他 VR 运行时,如 WiVRn 或 Monado,SteamVR 可能会干扰,请启用此选项。", + "map-editor": "地图编辑器", + "map-editor-description": "启动官方的 Beat Saber 地图编辑器,而不是游戏。" }, "maps": { "search-bar": { diff --git a/src/main/services/bs-launcher/abstract-launcher.service.ts b/src/main/services/bs-launcher/abstract-launcher.service.ts index ed324f8d..9f6d8a84 100644 --- a/src/main/services/bs-launcher/abstract-launcher.service.ts +++ b/src/main/services/bs-launcher/abstract-launcher.service.ts @@ -25,16 +25,20 @@ export abstract class AbstractLauncherService { if(!launchOptions.version.steam && !launchOptions.version.oculus){ launchArgs.push("--no-yeet") } - if (launchOptions.launchMods?.includes(LaunchMods.OCULUS)) { + if(launchOptions.launchMods?.includes(LaunchMods.OCULUS)) { launchArgs.push("-vrmode"); launchArgs.push("oculus"); } - if (launchOptions.launchMods?.includes(LaunchMods.FPFC)) { + if(launchOptions.launchMods?.includes(LaunchMods.FPFC)) { launchArgs.push("fpfc"); } - if (launchOptions.launchMods?.includes(LaunchMods.DEBUG)) { + if(launchOptions.launchMods?.includes(LaunchMods.DEBUG)) { launchArgs.push("--verbose"); } + if(launchOptions.launchMods?.includes(LaunchMods.EDITOR)) { + launchArgs.push("editor"); + } + if (launchOptions.additionalArgs) { launchArgs.push(...launchOptions.additionalArgs); } diff --git a/src/renderer/components/svgs/bsm-icon.component.tsx b/src/renderer/components/svgs/bsm-icon.component.tsx index bb0a666f..237616e3 100644 --- a/src/renderer/components/svgs/bsm-icon.component.tsx +++ b/src/renderer/components/svgs/bsm-icon.component.tsx @@ -16,7 +16,7 @@ import { TaskIcon } from "./icons/task-icon.component"; import { CopyIcon } from "./icons/copy-icon.component"; import { SteamIcon } from "./icons/steam-icon.component"; import { CSSProperties, memo } from "react"; -import EditIcon from "./icons/edit-icon.component"; +import { EditIcon } from "./icons/edit-icon.component"; import { ExportIcon } from "./icons/export-icon.component"; import PatreonIcon from "./icons/patreon-icon.component"; import { SearchIcon } from "./icons/search-icon.component"; diff --git a/src/renderer/components/svgs/icons/edit-icon.component.tsx b/src/renderer/components/svgs/icons/edit-icon.component.tsx index 9523437e..6f8cc7d2 100644 --- a/src/renderer/components/svgs/icons/edit-icon.component.tsx +++ b/src/renderer/components/svgs/icons/edit-icon.component.tsx @@ -1,9 +1,9 @@ -import { CSSProperties } from "react"; +import { createSvgIcon } from "../svg-icon.type"; -export default function EditIcon(props: { className?: string; style?: CSSProperties }) { +export const EditIcon = 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 37631fd4..e560a7a2 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 @@ -16,7 +16,7 @@ export function LaunchModToogle({ onClick, active, text, icon: Icon, infoText }: const t = useTranslation(); return ( -
{Icon && } 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 index 47b2a4a5..db2cf231 100644 --- 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 @@ -37,7 +37,7 @@ export function LaunchOptionsPanel({ className, open, launchArgs, launchMods, on export type LaunchModItemProps = { readonly id: LaunchMod; - readonly Icon?: SvgIcon; + readonly icon?: SvgIcon; readonly label: string; readonly description: string; readonly active: boolean; @@ -47,21 +47,23 @@ export type LaunchModItemProps = { readonly onPinChange?: (val: boolean) => void; } -export function LaunchModItem({ id, Icon, label, description, active, visible, pinned, onChange, onPinChange }: LaunchModItemProps) { +export function LaunchModItem({ id, icon: Icon, label, description, active, visible, pinned, onChange, onPinChange }: LaunchModItemProps) { const { text: t } = useTranslationV2(); return ( - - + {onPinChange && ( + + + + )} ); 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 70f961c2..b705b132 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 @@ -25,6 +25,7 @@ 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"; +import { EditIcon } from "renderer/components/svgs/icons/edit-icon.component"; type Props = { version: BSVersion }; @@ -65,7 +66,7 @@ export function LaunchSlide({ version }: Props) { setLaunchModItems(() => [ { id: LaunchMods.OCULUS, - Icon: OculusIcon, + icon: OculusIcon, label: t("pages.version-viewer.launch-mods.oculus"), description: t("pages.version-viewer.launch-mods.oculus-description"), active: activeLaunchMods.includes(LaunchMods.OCULUS), @@ -76,7 +77,7 @@ export function LaunchSlide({ version }: Props) { }, { id: LaunchMods.FPFC, - Icon: DesktopIcon, + icon: DesktopIcon, label: t("pages.version-viewer.launch-mods.desktop"), description: t("pages.version-viewer.launch-mods.desktop-description"), active: activeLaunchMods.includes(LaunchMods.FPFC), @@ -86,7 +87,7 @@ export function LaunchSlide({ version }: Props) { }, { id: LaunchMods.DEBUG, - Icon: TerminalIcon, + icon: TerminalIcon, label: t("pages.version-viewer.launch-mods.debug"), description: t("pages.version-viewer.launch-mods.debug-description"), active: activeLaunchMods.includes(LaunchMods.DEBUG), @@ -102,6 +103,18 @@ export function LaunchSlide({ version }: Props) { 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)), + }, + { + id: LaunchMods.EDITOR, + icon: EditIcon, + label: t("pages.version-viewer.launch-mods.map-editor"), + description: t("pages.version-viewer.launch-mods.map-editor-description"), + active: activeLaunchMods.includes(LaunchMods.EDITOR), + pinned: pinnedLaunchMods.includes(LaunchMods.EDITOR), + visible: !safeLt(version.BSVersion, "1.23.0"), + onChange: checked => checked ? setActiveLaunchMods(prev => [...prev, LaunchMods.EDITOR]) : setActiveLaunchMods(prev => prev.filter(mod => mod !== LaunchMods.EDITOR)), + onPinChange: pinned => pinned ? setPinnedLaunchMods(prev => [...prev, LaunchMods.EDITOR]) : setPinnedLaunchMods(prev => prev.filter(mod => mod !== LaunchMods.EDITOR)), + } ]); }, [activeLaunchMods, pinnedLaunchMods, version]); @@ -123,8 +136,8 @@ export function LaunchSlide({ version }: Props) { }, [version]); return ( -
-
+
+
@@ -139,12 +152,12 @@ export function LaunchSlide({ version }: Props) { )}
-
+
{pinnedLaunchMods.map(id => launchModItems.find(mod => mod.id === id)).map(launchMod => { if(launchMod?.visible === false || !launchMod?.pinned) { return undefined; } return ( -
+