import { getSettingValue } from "./settings"; import {GameState} from "./types"; import {ballTransparency} from "./game_utils"; export function clamp(value: number, min: number, max: number) { return Math.max(min, Math.min(value, max)); } export function comboKeepingRate(level: number) { return clamp(1 - (1 / (1 + level)) * 1.5, 0, 1); } export function hoursSpentPlaying() { try { const timePlayed = getSettingValue("breakout_71_total_play_time", 0); return Math.floor(timePlayed / 1000 / 60 / 60); } catch (e) { return 0; } } export function shouldCoinsStick(gameState:GameState){ return gameState.perks.sticky_coins && (!gameState.lastExplosion || gameState.lastExplosion < gameState.levelTime - 300 * gameState.perks.sticky_coins) } export function coinsBoostedCombo(gameState:GameState){ let boost = 1+gameState.perks.sturdy_bricks / 2 + gameState.perks.smaller_puck/2 if(gameState.perks.transparency){ let min=1; gameState.balls.forEach(ball=>{ const bt=ballTransparency(ball, gameState) if(bt { const titlePrefix = line.match(/^#+ /)?.[0]; if (titlePrefix) { if (lastNode) html.push(lastNode); lastNode = { tagName: "h" + (titlePrefix.length - 1), text: line.slice(titlePrefix.length), }; } else if (line.startsWith("- ")) { if (lastNode?.tagName !== "ul") { if (lastNode) html.push(lastNode); lastNode = { tagName: "ul", text: "" }; } lastNode.text += "
  • " + line.slice(2) + "
  • "; } else if (!line.trim()) { if (lastNode) html.push(lastNode); lastNode = null; } else { if (lastNode?.tagName !== "p") { if (lastNode) html.push(lastNode); lastNode = { tagName: "p", text: "" }; } lastNode.text += line + " "; } }); if (lastNode) { html.push(lastNode); } return html .map( (h) => "<" + h.tagName + ">" + h.text.replace( /\bhttps?:\/\/[^\s<>]+/gi, (a) => `${a}`, ) + "", ) .join("\n"); } export function firstWhere( arr: Input[], mapper: (item: Input, index: number) => Output | undefined, ): Output | undefined { for (let i = 0; i < arr.length; i++) { const result = mapper(arr[i], i); if (typeof result !== "undefined") return result; } } export const wallBouncedBest = 3, wallBouncedGood = 10, levelTimeBest = 30, levelTimeGood = 60, catchRateBest = 95, catchRateGood = 90, missesBest = 3, missesGood = 6;