import { GameState } from "./types"; import { asyncAlert } from "./asyncAlert"; import { t } from "./i18n/i18n"; import { levelsListHTMl, max_levels, pickedUpgradesHTMl } from "./game_utils"; import { getCreativeModeWarning, getHistory } from "./gameOver"; import { pause } from "./game"; import { allLevels, icons } from "./loadGameData"; import { firstWhere } from "./pure_functions"; import { getSettingValue, getTotalScore } from "./settings"; import { getLevelUnlockCondition, reasonLevelIsLocked, upgradeName, } from "./get_level_unlock_condition"; export async function openScorePanel(gameState: GameState) { pause(true); await asyncAlert({ title: t("score_panel.title", { score: gameState.score, level: gameState.currentLevel + 1, max: max_levels(gameState), }), content: [ getCreativeModeWarning(gameState), pickedUpgradesHTMl(gameState), levelsListHTMl(gameState, gameState.currentLevel), getNearestUnlockHTML(gameState), gameState.upgrade_points ? t("score_panel.upgrade_point_count", { count: gameState.upgrade_points, }) : "", ], allowClose: true, }); } export function getNearestUnlockHTML(gameState: GameState) { if (gameState.creative) return ""; const unlocked = new Set(getSettingValue("breakout_71_unlocked_levels", [])); const firstUnlockable = firstWhere(allLevels, (l, li) => { if (unlocked.has(l.name)) return; const reason = reasonLevelIsLocked(li, l.name, getHistory(), false); if (!reason) return; const { minScore, forbidden, required } = getLevelUnlockCondition( li, l.name, ); const missing = required.filter((id) => !gameState?.perks?.[id]); // we can't have a forbidden perk if (forbidden.find((id) => gameState?.perks?.[id])) { return; } // All required upgrades need to be unlocked if (missing.find((u) => u.threshold > getTotalScore())) { return; } return { l, li, minScore, forbidden, required, missing, reason, }; }); if (!firstUnlockable) return ""; let missingPoints = Math.max(0, firstUnlockable.minScore - gameState.score); let missingUpgrades = firstUnlockable.missing .map((id) => upgradeName(id)) .join(", "); const title = (missingUpgrades && t("score_panel.get_upgrades_to_unlock", { missingUpgrades, points: missingPoints, level: firstUnlockable.l.name, })) || t("score_panel.score_to_unlock", { points: missingPoints, level: firstUnlockable.l.name, }); return `
${t("score_panel.close_to_unlock")}
${title} ${firstUnlockable.reason?.text}