diff --git a/dist/index.html b/dist/index.html
index 984e781..051b428 100644
--- a/dist/index.html
+++ b/dist/index.html
@@ -964,24 +964,31 @@ function hitsSomething(x, y, radius) {
return hasBrick(brickIndex(x - radius, y - radius)) ?? hasBrick(brickIndex(x + radius, y - radius)) ?? hasBrick(brickIndex(x + radius, y + radius)) ?? hasBrick(brickIndex(x - radius, y + radius));
}
function tick() {
+ startWork('tick init');
const currentTick = performance.now();
const timeDeltaMs = currentTick - gameState.lastTick;
gameState.lastTick = currentTick;
let frames = Math.min(4, timeDeltaMs / (1000 / 60));
if (gameState.keyboardPuckSpeed) (0, _gameStateMutators.setMousePos)(gameState, gameState.puckPosition + gameState.keyboardPuckSpeed);
if (gameState.perks.superhot) frames *= (0, _pureFunctions.clamp)(Math.abs(gameState.puckPosition - gameState.lastPuckPosition) / 5, 0.2 / gameState.perks.superhot, 1);
+ startWork('normalizeGameState');
(0, _gameStateMutators.normalizeGameState)(gameState);
+ startWork('gameStateTick');
if (gameState.running) {
gameState.levelTime += timeDeltaMs * frames;
gameState.runStatistics.runTime += timeDeltaMs * frames;
(0, _gameStateMutators.gameStateTick)(gameState, frames);
}
+ startWork('render');
if (gameState.running || gameState.needsRender) {
gameState.needsRender = false;
(0, _render.render)(gameState);
}
+ startWork('recordOneFrame');
if (gameState.running) (0, _recording.recordOneFrame)(gameState);
+ startWork('playPendingSounds');
if ((0, _options.isOptionOn)("sound")) (0, _sounds.playPendingSounds)(gameState);
+ startWork('idle');
requestAnimationFrame(tick);
FPSCounter++;
}
@@ -991,6 +998,20 @@ setInterval(()=>{
lastMeasuredFPS = FPSCounter;
FPSCounter = 0;
}, 1000);
+let total = {};
+let lastTick = performance.now();
+let doing = '';
+function startWork(what) {
+ const newNow = performance.now();
+ if (doing) total[doing] = (total[doing] || 0) + (newNow - lastTick);
+ lastTick = newNow;
+ doing = what;
+}
+setInterval(()=>{
+ const totalTime = (0, _gameUtils.sumOfValues)(total);
+ console.log((0, _gameStateMutators.liveCount)(gameState.coins) + ' coins\n' + Object.entries(total).sort((a, b)=>b[1] - a[1]).filter((a)=>a[1] > 1).map((t)=>t[0] + ':' + (t[1] / totalTime * 100).toFixed(2) + '% (' + t[1] + 'ms)').join('\n'));
+ total = {};
+}, 2000);
setInterval(()=>{
(0, _monitorLevelsUnlocks.monitorLevelsUnlocks)(gameState);
}, 500);
@@ -2388,13 +2409,16 @@ parcelHelpers.export(exports, "getCurrentMaxCoins", ()=>getCurrentMaxCoins);
parcelHelpers.export(exports, "getCurrentMaxParticles", ()=>getCurrentMaxParticles);
parcelHelpers.export(exports, "cycleMaxCoins", ()=>cycleMaxCoins);
let cachedSettings = {};
-function getSettingValue(key, defaultValue) {
- if (typeof cachedSettings[key] == "undefined") try {
- const ls = localStorage.getItem(key);
- if (ls) cachedSettings[key] = JSON.parse(ls);
+try {
+ for(let key in localStorage)try {
+ cachedSettings[key] = JSON.parse(localStorage.getItem(key) || 'null');
} catch (e) {
console.warn(e);
}
+} catch (e) {
+ console.warn(e);
+}
+function getSettingValue(key, defaultValue) {
return cachedSettings[key] ?? defaultValue;
}
function setSettingValue(key, value) {
@@ -2409,13 +2433,13 @@ function getTotalScore() {
return getSettingValue("breakout_71_total_score", 0);
}
function getCurrentMaxCoins() {
- return Math.pow(2, getSettingValue("max_coins", 6)) * 200;
+ return Math.pow(2, getSettingValue("max_coins", 2)) * 200;
}
function getCurrentMaxParticles() {
return getCurrentMaxCoins();
}
function cycleMaxCoins() {
- setSettingValue("max_coins", (getSettingValue("max_coins", 6) + 1) % 6);
+ setSettingValue("max_coins", (getSettingValue("max_coins", 2) + 1) % 10);
}
},{"@parcel/transformer-js/src/esmodule-helpers.js":"gkKU3"}],"gkKU3":[function(require,module,exports,__globalThis) {
diff --git a/src/game.ts b/src/game.ts
index 5ba5c37..c004437 100644
--- a/src/game.ts
+++ b/src/game.ts
@@ -27,24 +27,21 @@ import {
max_levels,
pickedUpgradesHTMl,
reasonLevelIsLocked,
- sample,
+ sample, sumOfValues,
} from "./game_utils";
import "./PWA/sw_loader";
import { getCurrentLang, languages, t } from "./i18n/i18n";
import {
cycleMaxCoins,
- cycleMaxParticles,
getCurrentMaxCoins,
- getCurrentMaxParticles,
getSettingValue,
getTotalScore,
setSettingValue,
} from "./settings";
import {
forEachLiveOne,
- gameStateTick,
- liveCount,
+ gameStateTick, liveCount,
normalizeGameState,
pickRandomUpgrades,
setLevel,
@@ -97,7 +94,6 @@ import { runHistoryViewerMenuEntry } from "./runHistoryViewer";
import { getNearestUnlockHTML, openScorePanel } from "./openScorePanel";
import { monitorLevelsUnlocks } from "./monitorLevelsUnlocks";
import { levelEditorMenuEntry } from "./levelEditor";
-import {toast} from "./toast";
export async function play() {
if (await applyFullScreenChoice()) return;
@@ -424,13 +420,15 @@ export function hitsSomething(x: number, y: number, radius: number) {
);
}
+
export function tick() {
+startWork('tick init')
+
const currentTick = performance.now();
const timeDeltaMs = currentTick - gameState.lastTick;
gameState.lastTick = currentTick;
let frames = Math.min(4, timeDeltaMs / (1000 / 60));
-
if (gameState.keyboardPuckSpeed) {
setMousePos(
gameState,
@@ -444,23 +442,30 @@ export function tick() {
1,
);
}
- normalizeGameState(gameState);
+startWork('normalizeGameState')
+ normalizeGameState(gameState);
+startWork('gameStateTick')
if (gameState.running) {
gameState.levelTime += timeDeltaMs * frames;
gameState.runStatistics.runTime += timeDeltaMs * frames;
gameStateTick(gameState, frames);
}
+
+startWork('render')
if (gameState.running || gameState.needsRender) {
gameState.needsRender = false;
render(gameState);
}
+startWork('recordOneFrame')
if (gameState.running) {
recordOneFrame(gameState);
}
+startWork('playPendingSounds')
if (isOptionOn("sound")) {
playPendingSounds(gameState);
}
+startWork('idle')
requestAnimationFrame(tick);
FPSCounter++;
@@ -468,13 +473,32 @@ export function tick() {
let FPSCounter = 0;
export let lastMeasuredFPS = 60;
-
setInterval(() => {
lastMeasuredFPS = FPSCounter;
FPSCounter = 0;
-
}, 1000);
+let total={}
+let lastTick=performance.now();
+let doing= ''
+function startWork(what){
+ const newNow=performance.now();
+ if(doing) {
+ total[doing] = (total[doing]||0) + ( newNow-lastTick )
+ }
+ lastTick=newNow
+ doing=what
+}
+setInterval(()=>{
+ const totalTime = sumOfValues(total)
+ console.log(
+ liveCount(gameState.coins) +' coins\n'+
+ Object.entries(total).sort((a,b)=>b[1]-a[1]).filter(a=>a[1]>1).map(t=>t[0]+':'+(t[1]/totalTime*100).toFixed(2)+'% ('+t[1]+'ms)').join('\n'))
+
+ total={}
+},2000)
+
+
setInterval(() => {
monitorLevelsUnlocks(gameState);
}, 500);
diff --git a/src/recording.ts b/src/recording.ts
index f771bcc..c72b907 100644
--- a/src/recording.ts
+++ b/src/recording.ts
@@ -12,6 +12,7 @@ let mediaRecorder: MediaRecorder | null,
recordCanvasCtx: CanvasRenderingContext2D;
export function recordOneFrame(gameState: GameState) {
+
if (!isOptionOn("record")) {
return;
}
diff --git a/src/settings.ts b/src/settings.ts
index 1e69759..3cb9d0f 100644
--- a/src/settings.ts
+++ b/src/settings.ts
@@ -2,15 +2,20 @@
let cachedSettings: { [key: string]: unknown } = {};
+ try {
+ for(let key in localStorage){
+
+ try {
+ cachedSettings[key] = JSON.parse(localStorage.getItem(key)||'null') ;
+ } catch (e) {
+ console.warn(e);
+}
+ }
+} catch (e) {
+ console.warn(e);
+}
+
export function getSettingValue(key: string, defaultValue: T) {
- if (typeof cachedSettings[key] == "undefined") {
- try {
- const ls = localStorage.getItem(key);
- if (ls) cachedSettings[key] = JSON.parse(ls) as T;
- } catch (e) {
- console.warn(e);
- }
- }
return (cachedSettings[key] as T) ?? defaultValue;
}
@@ -28,11 +33,11 @@ export function getTotalScore() {
}
export function getCurrentMaxCoins() {
- return Math.pow(2, getSettingValue("max_coins", 6)) * 200;
+ return Math.pow(2, getSettingValue("max_coins", 2)) * 200;
}
export function getCurrentMaxParticles() {
return getCurrentMaxCoins()
}
export function cycleMaxCoins() {
- setSettingValue("max_coins", (getSettingValue("max_coins", 6) + 1) % 6);
+ setSettingValue("max_coins", (getSettingValue("max_coins", 2) + 1) % 10);
}