diff --git a/src/ui/rename-run-ui-handler.ts b/src/ui/rename-run-ui-handler.ts index 113f432693a..23ba0137f2d 100644 --- a/src/ui/rename-run-ui-handler.ts +++ b/src/ui/rename-run-ui-handler.ts @@ -3,7 +3,7 @@ import type { InputFieldConfig } from "./form-modal-ui-handler"; import { FormModalUiHandler } from "./form-modal-ui-handler"; import type { ModalConfig } from "./modal-ui-handler"; -export default class RenameRunFormUiHandler extends FormModalUiHandler { +export class RenameRunFormUiHandler extends FormModalUiHandler { getModalTitle(_config?: ModalConfig): string { return i18next.t("menu:renamerun"); } diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts index ffe7024b00e..79413c34eac 100644 --- a/src/ui/save-slot-select-ui-handler.ts +++ b/src/ui/save-slot-select-ui-handler.ts @@ -499,27 +499,49 @@ class SessionSlot extends Phaser.GameObjects.Container { this.add(this.loadingLabel); } - decideFallback(data: SessionSaveData) { - let fallbackName; + /** + * Generates a name for sessions that don't have a name yet. + * @param data - The {@linkcode SessionSaveData} being checked + * @returns The default name for the given data. + */ + decideFallback(data: SessionSaveData): string { + let fallbackName = `${GameMode.getModeName(data.gameMode)}`; switch (data.gameMode) { case GameModes.CLASSIC: - fallbackName = `${GameMode.getModeName(data.gameMode)} (${globalScene.gameData.gameStats.classicSessionsPlayed + 1})`; + fallbackName += ` (${globalScene.gameData.gameStats.classicSessionsPlayed + 1})`; break; case GameModes.ENDLESS: case GameModes.SPLICED_ENDLESS: - fallbackName = `${GameMode.getModeName(data.gameMode)} (${globalScene.gameData.gameStats.endlessSessionsPlayed + 1})`; + fallbackName += ` (${globalScene.gameData.gameStats.endlessSessionsPlayed + 1})`; break; case GameModes.DAILY: { const runDay = new Date(data.timestamp).toLocaleDateString(); - fallbackName = `${GameMode.getModeName(data.gameMode)} (${runDay})`; + fallbackName += ` (${runDay})`; break; } - case GameModes.CHALLENGE: - fallbackName = data.challenges - .find(c => c.value !== 0) - ?.toChallenge() - .getName(); + case GameModes.CHALLENGE: { + const activeChallenges = data.challenges.filter(c => c.value !== 0); + if (activeChallenges.length === 0) { + break; + } + + fallbackName = ""; + for (const challenge of activeChallenges.slice(0, 3)) { + if (fallbackName !== "") { + fallbackName += ", "; + } + fallbackName += challenge.toChallenge().getName(); + } + + if (activeChallenges.length > 3) { + fallbackName += ", ..."; + } else if (fallbackName === "") { + // Something went wrong when retrieving the names of the active challenges, + // so fall back to just naming the run "Challenge" + fallbackName = `${GameMode.getModeName(data.gameMode)}`; + } break; + } } return fallbackName; } diff --git a/src/ui/ui.ts b/src/ui/ui.ts index 45dc450abdf..c295cec8207 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -60,7 +60,7 @@ import { addWindow } from "#ui/ui-theme"; import { UnavailableModalUiHandler } from "#ui/unavailable-modal-ui-handler"; import { executeIf } from "#utils/common"; import i18next from "i18next"; -import RenameRunFormUiHandler from "./rename-run-ui-handler"; +import { RenameRunFormUiHandler } from "./rename-run-ui-handler"; const transitionModes = [ UiMode.SAVE_SLOT,