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.extra_lives ? t("score_panel.extra_lives_count", { count: gameState.extra_lives }) : "", ], 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")}

${icons[firstUnlockable.l.name]}

${title} ${firstUnlockable.reason?.text}

`; }