mirror of
https://gitlab.com/lecarore/breakout71.git
synced 2025-04-21 12:36:15 -04:00
Changelog update
This commit is contained in:
parent
a328520191
commit
adfd3ecf83
7 changed files with 67 additions and 82 deletions
23
Readme.md
23
Readme.md
|
@ -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
|
||||||
|
|
|
@ -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
33
dist/index.html
vendored
|
@ -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>
|
||||||
|
|
|
@ -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;
|
||||||
|
|
17
src/game.ts
17
src/game.ts
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue