Changelog update

This commit is contained in:
Renan LE CARO 2025-03-29 21:05:53 +01:00
parent a328520191
commit adfd3ecf83
7 changed files with 67 additions and 82 deletions

View file

@ -35,13 +35,11 @@ already maxed out.
- [jaceys] A visual indication of whether a ball has hit a brick this serve - [jaceys] A visual indication of whether a ball has hit a brick this serve
- Top down /reach: punishing now, maybe only reset if you hit the lowest populate row of the level, if it's not a full width row - Top down /reach: punishing now, maybe only reset if you hit the lowest populate row of the level, if it's not a full width row
# Todo before next release # Todo before next release
# Next
# 29 march 2025 - disabled auto-release on fdroid of every web version, as there's a big delay and bugs woudl stay for a long time
- [jaceys] Counters for coins lost, misses, and boundary bounces, as well as a timer. - [jaceys] Counters for coins lost, misses, and boundary bounces, as well as a timer.
- added a white border around all coins, to make dark ones visible on dark bg - added a white border around all coins, to make dark ones visible on dark bg
- Removed all previous loop only hazards - Removed all previous loop only hazards
@ -66,13 +64,20 @@ already maxed out.
- shocks lvl 2+ make bigger explosions - shocks lvl 2+ make bigger explosions
- Make fullscreen an option and turn it back on when playing - Make fullscreen an option and turn it back on when playing
- Made the "combo lost" text last 500ms instead of the pointless 150ms - Made the "combo lost" text last 500ms instead of the pointless 150ms
# 28 march 2025
- loop : added red/blue coins (red kill you, blue freeze puck) (removed later)
- added more hazard that were then removed
- add a toggle to switch between the “coin” design and colored bubbles - add a toggle to switch between the “coin” design and colored bubbles
# 29049575
- added rerolls
- Sacrifice : clear screen instead of doubling coins
# 29048147
- Ascetism : render coins with red border if there's a combo
- Warn about unbounded
- Red border dashes
# UX / gameplay # UX / gameplay
- on mobile, relative movement of the touch would be amplified and added to the puck - on mobile, relative movement of the touch would be amplified and added to the puck

View file

@ -13,11 +13,12 @@ versionCode=$(($(date +%s) / 60))
bash ./build.sh $versionCode bash ./build.sh $versionCode
# Create a release commit and tag # Create a release commit
git add . git add .
git commit -m "Build $versionCode" git commit -m "Build $versionCode"
git tag -a $versionCode -m $versionCode
git push git push
# Auto tagging created random releases on fdroid, not great.
# git tag -a $versionCode -m $versionCode
# upload to breakout.lecaro.me # upload to breakout.lecaro.me
DOMAIN="breakout.lecaro.me" DOMAIN="breakout.lecaro.me"

33
dist/index.html vendored
View file

@ -76,7 +76,7 @@ body {
color: #90ee90; color: #90ee90;
} }
#score span.good { #score span.good, #score span.bad {
color: #fff; color: #fff;
} }
@ -84,22 +84,6 @@ body {
left: 0; left: 0;
} }
#FPSDisplay {
z-index: 1;
white-space: nowrap;
pointer-events: none;
user-select: none;
opacity: .8;
color: #fff;
transform-origin: 0 0;
padding: 0;
line-height: 20px;
position: fixed;
bottom: 0;
left: 0;
transform: rotate(-90deg);
}
body.has-alert-open { body.has-alert-open {
height: auto; height: auto;
overflow: visible; overflow: visible;
@ -629,6 +613,7 @@ parcelHelpers.export(exports, "brickIndex", ()=>brickIndex);
parcelHelpers.export(exports, "hasBrick", ()=>hasBrick); parcelHelpers.export(exports, "hasBrick", ()=>hasBrick);
parcelHelpers.export(exports, "hitsSomething", ()=>hitsSomething); parcelHelpers.export(exports, "hitsSomething", ()=>hitsSomething);
parcelHelpers.export(exports, "tick", ()=>tick); parcelHelpers.export(exports, "tick", ()=>tick);
parcelHelpers.export(exports, "lastMeasuredFPS", ()=>lastMeasuredFPS);
parcelHelpers.export(exports, "openMainMenu", ()=>openMainMenu); parcelHelpers.export(exports, "openMainMenu", ()=>openMainMenu);
parcelHelpers.export(exports, "confirmRestart", ()=>confirmRestart); parcelHelpers.export(exports, "confirmRestart", ()=>confirmRestart);
parcelHelpers.export(exports, "setKeyPressed", ()=>setKeyPressed); parcelHelpers.export(exports, "setKeyPressed", ()=>setKeyPressed);
@ -881,10 +866,9 @@ function tick() {
FPSCounter++; FPSCounter++;
} }
let FPSCounter = 0; let FPSCounter = 0;
let FPSDisplay = document.getElementById("FPSDisplay"); let lastMeasuredFPS = 60;
setInterval(()=>{ setInterval(()=>{
if ((0, _options.isOptionOn)("show_fps")) FPSDisplay.innerText = FPSCounter + " FPS " + (0, _gameStateMutators.liveCount)(gameState.coins) + " COINS " + ((0, _gameStateMutators.liveCount)(gameState.particles) + (0, _gameStateMutators.liveCount)(gameState.texts) + (0, _gameStateMutators.liveCount)(gameState.lights)) + " PARTICLES "; lastMeasuredFPS = FPSCounter;
else FPSDisplay.innerText = "";
FPSCounter = 0; FPSCounter = 0;
}, 1000); }, 1000);
window.addEventListener("visibilitychange", ()=>{ window.addEventListener("visibilitychange", ()=>{
@ -2173,7 +2157,7 @@ function getRowColIndex(gameState, row, col) {
return row * gameState.gridSize + col; return row * gameState.gridSize + col;
} }
function getPossibleUpgrades(gameState) { function getPossibleUpgrades(gameState) {
return (0, _loadGameData.upgrades).filter((u)=>gameState.totalScoreAtRunStart >= u.threshold).filter((u)=>!u?.requires || gameState.perks[u?.requires]); return (0, _loadGameData.upgrades).filter((u)=>gameState.totalScoreAtRunStart >= u.threshold || gameState.loop > 0).filter((u)=>!u?.requires || gameState.perks[u?.requires]);
} }
function max_levels(gameState) { function max_levels(gameState) {
return gameState.levelsPerLoop + gameState.perks.extra_levels; return gameState.levelsPerLoop + gameState.perks.extra_levels;
@ -3549,7 +3533,12 @@ function render(gameState) {
}); });
else menuLabel.innerText = (0, _i18N.t)("play.menu_label"); else menuLabel.innerText = (0, _i18N.t)("play.menu_label");
const catchRate = gameState.levelSpawnedCoins ? (gameState.levelSpawnedCoins - gameState.levelLostCoins) / gameState.levelSpawnedCoins : 1; const catchRate = gameState.levelSpawnedCoins ? (gameState.levelSpawnedCoins - gameState.levelLostCoins) / gameState.levelSpawnedCoins : 1;
scoreDisplay.innerHTML = ((0, _options.isOptionOn)('show_stats') ? ` scoreDisplay.innerHTML = ((0, _options.isOptionOn)("show_fps") ? `
<span class="${Math.abs((0, _game.lastMeasuredFPS) - 60) < 2 && ' ' || Math.abs((0, _game.lastMeasuredFPS) - 60) < 10 && 'good' || 'bad'}">
${0, _game.lastMeasuredFPS} FPS
</span><span> / </span>
` : '') + ((0, _options.isOptionOn)('show_stats') ? `
<span class="${catchRate == 1 && 'great' || catchRate > 0.9 && 'good' || ''}"> <span class="${catchRate == 1 && 'great' || catchRate > 0.9 && 'good' || ''}">
${Math.floor(catchRate * 100)}% ${Math.floor(catchRate * 100)}%
</span><span> / </span> </span><span> / </span>

View file

@ -1,6 +1,5 @@
* { * {
font-family: font-family: Courier New,
Courier New,
Courier, Courier,
Lucida Sans Typewriter, Lucida Sans Typewriter,
Lucida Typewriter, Lucida Typewriter,
@ -45,11 +44,13 @@ body {
min-width: 40px; min-width: 40px;
min-height: 40px; min-height: 40px;
line-height: 20px; line-height: 20px;
&:hover, &:hover,
&:focus { &:focus {
background: rgba(0, 0, 0, 0.3); background: rgba(0, 0, 0, 0.3);
cursor: pointer; cursor: pointer;
} }
text-shadow: 0 0 4px rgba(0, 0, 0, 0.8); text-shadow: 0 0 4px rgba(0, 0, 0, 0.8);
} }
@ -57,6 +58,7 @@ body {
right: 0; right: 0;
color: white; color: white;
transition: color 0.3s; transition: color 0.3s;
&.active { &.active {
color: gold; color: gold;
transition: color 0.01s; transition: color 0.01s;
@ -68,9 +70,13 @@ body {
&.great { &.great {
color: lightgreen; color: lightgreen;
} }
&.good { &.good {
color: white; color: white;
} }
&.bad {
color: white;
}
} }
} }
@ -78,32 +84,15 @@ body {
left: 0; left: 0;
} }
#FPSDisplay {
z-index: 1;
white-space: nowrap;
padding: 10px;
line-height: 20px;
pointer-events: none;
user-select: none;
opacity: 0.8;
color: white;
padding: 0;
position: fixed;
bottom: 0;
left: 0;
transform-origin: top left;
transform: rotate(-90deg);
}
body.has-alert-open { body.has-alert-open {
height: auto; height: auto;
overflow: visible; overflow: visible;
} }
body:not(.has-alert-open) #popup { body:not(.has-alert-open) #popup {
display: none; display: none;
} }
#popup { #popup {
&::before { &::before {
z-index: 10; z-index: 10;
@ -342,6 +331,7 @@ body:not(.has-alert-open) #popup {
} }
} }
} }
& > span:not(:hover):not(.active) > span > span { & > span:not(:hover):not(.active) > span > span {
opacity: 0; opacity: 0;
} }
@ -358,6 +348,7 @@ h2.histogram-title strong {
.red-icon { .red-icon {
background: red; background: red;
img { img {
filter: saturate(0); filter: saturate(0);
mix-blend-mode: luminosity; mix-blend-mode: luminosity;

View file

@ -386,21 +386,10 @@ export function tick() {
} }
let FPSCounter = 0; let FPSCounter = 0;
let FPSDisplay = document.getElementById("FPSDisplay") as HTMLDivElement; export let lastMeasuredFPS = 60;
setInterval(() => { setInterval(() => {
if (isOptionOn("show_fps")) { lastMeasuredFPS = FPSCounter
FPSDisplay.innerText =
FPSCounter +
" FPS " +
liveCount(gameState.coins) +
" COINS " +
(liveCount(gameState.particles) +
liveCount(gameState.texts) +
liveCount(gameState.lights)) +
" PARTICLES ";
} else {
FPSDisplay.innerText = "";
}
FPSCounter = 0; FPSCounter = 0;
}, 1000); }, 1000);

View file

@ -55,7 +55,7 @@ export function getRowColIndex(gameState: GameState, row: number, col: number) {
export function getPossibleUpgrades(gameState: GameState) { export function getPossibleUpgrades(gameState: GameState) {
return upgrades return upgrades
.filter((u) => gameState.totalScoreAtRunStart >= u.threshold) .filter((u) => gameState.totalScoreAtRunStart >= u.threshold || gameState.loop>0)
.filter((u) => !u?.requires || gameState.perks[u?.requires]); .filter((u) => !u?.requires || gameState.perks[u?.requires]);
} }

View file

@ -11,7 +11,7 @@ import {
} from "./game_utils"; } from "./game_utils";
import {colorString, GameState} from "./types"; import {colorString, GameState} from "./types";
import {t} from "./i18n/i18n"; import {t} from "./i18n/i18n";
import {gameState} from "./game"; import {gameState, lastMeasuredFPS} from "./game";
import {isOptionOn} from "./options"; import {isOptionOn} from "./options";
export const gameCanvas = document.getElementById("game") as HTMLCanvasElement; export const gameCanvas = document.getElementById("game") as HTMLCanvasElement;
@ -54,7 +54,17 @@ export function render(gameState: GameState) {
const catchRate = gameState.levelSpawnedCoins ? const catchRate = gameState.levelSpawnedCoins ?
(gameState.levelSpawnedCoins - gameState.levelLostCoins)/gameState.levelSpawnedCoins :1 (gameState.levelSpawnedCoins - gameState.levelLostCoins)/gameState.levelSpawnedCoins :1
scoreDisplay.innerHTML= (isOptionOn('show_stats') ? ` scoreDisplay.innerHTML=
(isOptionOn("show_fps") ? `
<span class="${(Math.abs(lastMeasuredFPS-60)<2 && ' ') || (Math.abs(lastMeasuredFPS-60)<10 && 'good')||'bad'}">
${lastMeasuredFPS} FPS
</span><span> / </span>
`:'')+
(isOptionOn('show_stats') ? `
<span class="${(catchRate==1 && 'great') || (catchRate>0.9 && 'good')||''}"> <span class="${(catchRate==1 && 'great') || (catchRate>0.9 && 'good')||''}">
${Math.floor(catchRate*100)}% ${Math.floor(catchRate*100)}%
</span><span> / </span> </span><span> / </span>