Skip to content

Commit 9b3b7e1

Browse files
authored
Merge pull request espruino#3638 from AleixDev/score
Score: bug fixes and some usability and performance improvements
2 parents 5af8c43 + e8e70ea commit 9b3b7e1

File tree

4 files changed

+112
-46
lines changed

4 files changed

+112
-46
lines changed

apps/score/ChangeLog

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
0.01: New App!
22
0.02: Minor code improvements
3+
0.03: Bug fixes and some usability and performance improvements

apps/score/metadata.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
{
22
"id": "score",
33
"name": "Score Tracker",
4-
"version": "0.02",
4+
"version": "0.03",
55
"description": "Score Tracker for sports that use plain numbers (e.g. Badminton, Volleyball, Soccer, Table Tennis, ...). Also supports tennis scoring.",
66
"icon": "score.app.png",
77
"screenshots": [{"url":"screenshot_score.png"}],
88
"type": "app",
99
"tags": "",
1010
"supports": ["BANGLEJS","BANGLEJS2"],
11+
"allow_emulator": true,
1112
"readme": "README.md",
1213
"storage": [
1314
{"name":"score.app.js","url":"score.app.js"},

apps/score/score.app.js

Lines changed: 104 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ let tennisScores = ['00','15','30','40','DC','AD'];
1010
let scores = null;
1111
let tScores = null;
1212
let cSet = null;
13+
let matchEnd = null;
1314

1415
let firstShownSet = null;
1516

@@ -19,10 +20,10 @@ let correctionMode = false;
1920
let w = g.getWidth();
2021
let h = g.getHeight();
2122

22-
let isBangle1 = process.env.BOARD === 'BANGLEJS';
23+
let isBangle1 = process.env.BOARD === 'BANGLEJS' || process.env.BOARD === 'EMSCRIPTEN';
2324

2425
function getXCoord(func) {
25-
let offset = 40;
26+
let offset = 20;
2627
return func(w-offset)+offset;
2728
}
2829

@@ -54,7 +55,9 @@ function setupInputWatchers(init) {
5455
}
5556
});
5657
if (init) {
57-
setWatch(() => handleInput(2), isBangle1 ? BTN2 : BTN, { repeat: true });
58+
if (isBangle1) {
59+
setWatch(() => handleInput(2), BTN2, { repeat: true });
60+
}
5861
Bangle.on('touch', (b, e) => {
5962
if (isBangle1) {
6063
if (b === 1) {
@@ -63,17 +66,44 @@ function setupInputWatchers(init) {
6366
handleInput(4);
6467
}
6568
} else {
66-
if (e.x < getXCoord(w => w/2)) {
67-
handleInput(0);
69+
if (e.y > 18) {
70+
if (e.x < getXCoord(w => w/2)) {
71+
handleInput(0);
72+
} else {
73+
handleInput(1);
74+
}
6875
} else {
69-
handleInput(1);
76+
// long press except if we have the menu opened or we are in the emulator (that doesn't
77+
// seem to support long press events)
78+
if (e.type === 2 || settingsMenuOpened || process.env.BOARD === 'EMSCRIPTEN2') {
79+
handleInput(2);
80+
} else {
81+
let p = null;
82+
83+
if (matchWon(0)) p = 0;
84+
else if (matchWon(1)) p = 1;
85+
86+
// display full instructions if there is space available, or brief ones otherwise
87+
if (p === null) {
88+
drawInitialMsg();
89+
} else {
90+
g.setFontAlign(0,0);
91+
g.setFont('Teletext5x9Ascii',1);
92+
g.drawString(
93+
"-Long press-",
94+
getXCoord(w => p === 0 ? w/4*3: (w/4) + 20),
95+
15
96+
);
97+
}
98+
}
7099
}
71100
}
72101
});
73102
}
74103
}
75104

76105
function setupMatch() {
106+
matchEnd = null;
77107
scores = [];
78108
for (let s = 0; s < sets(); s++) {
79109
scores.push([0,0,null,0,0]);
@@ -96,28 +126,33 @@ function setupMatch() {
96126

97127
function showSettingsMenu() {
98128
settingsMenuOpened = getSecondsTime();
99-
settingsMenu(function (s, reset) {
100-
E.showMenu();
129+
settingsMenu(function (s, reset, back) {
130+
// console.log('reset:', reset, 'back:', back);
131+
if (isBangle1) {
132+
E.showMenu();
133+
}
101134

102135
settings = s;
103136

104137
if (reset) {
105138
setupMatch();
106-
} else if (getSecondsTime() - settingsMenuOpened < 500 || correctionMode) {
107-
correctionMode = !correctionMode;
108139
}
140+
if (isBangle1 || (!isBangle1 && back)) {
141+
settingsMenuOpened = null;
109142

110-
settingsMenuOpened = null;
111-
112-
draw();
143+
draw();
113144

114-
setupDisplay();
115-
setupInputWatchers();
145+
setupDisplay();
146+
setupInputWatchers();
147+
}
116148
}, function (msg) {
117149
switch (msg) {
118150
case 'end_set':
119151
updateCurrentSet(1);
120152
break;
153+
case 'correct_mode':
154+
correctionMode = !correctionMode;
155+
break;
121156
}
122157
});
123158
}
@@ -144,6 +179,7 @@ function currentSet() {
144179

145180
function shouldTiebreak() {
146181
return settings.enableMaxScoreTiebreak &&
182+
scores[cSet][0] === scores[cSet][1] &&
147183
scores[cSet][0] + scores[cSet][1] === (maxScore() - 1) * 2;
148184
}
149185

@@ -176,27 +212,21 @@ function tiebreakWon(set, player) {
176212
let pScore = scores[set][3+player];
177213
let p2Score = scores[set][3+~~!player];
178214

179-
let winScoreReached = pScore >= settings.maxScoreTiebreakWinScore;
180-
let isTwoAhead = !settings.maxScoreTiebreakEnableTwoAhead || pScore - p2Score >= 2;
181-
let reachedMaxScore = settings.maxScoreTiebreakEnableMaxScore && pScore >= tiebreakMaxScore();
182-
183-
return reachedMaxScore || (winScoreReached && isTwoAhead);
215+
// reachedMaxScore || (winScoreReached && isTwoAhead);
216+
return (settings.maxScoreTiebreakEnableMaxScore && pScore >= tiebreakMaxScore()) ||
217+
((pScore >= settings.maxScoreTiebreakWinScore) &&
218+
(!settings.maxScoreTiebreakEnableTwoAhead || pScore - p2Score >= 2));
184219
}
185220

186221
function setWon(set, player) {
187222
let pScore = scores[set][player];
188223
let p2Score = scores[set][~~!player];
189224

190-
let winScoreReached = pScore >= settings.winScore;
191-
let isTwoAhead = !settings.enableTwoAhead || pScore - p2Score >= 2;
192-
let tiebreakW = tiebreakWon(set, player);
193-
let reachedMaxScore = settings.enableMaxScore && pScore >= maxScore();
194-
let manuallyEndedWon = cSet > set ? pScore > p2Score : false;
195-
225+
// (tiebreak won / max score) || (winScoreReached && isTwoAhead) || manuallyEndedWon
196226
return (
197-
(settings.enableMaxScoreTiebreak ? tiebreakW : reachedMaxScore) ||
198-
(winScoreReached && isTwoAhead) ||
199-
manuallyEndedWon
227+
(settings.enableMaxScoreTiebreak ? tiebreakWon(set, player) : settings.enableMaxScore && pScore >= maxScore()) ||
228+
(pScore >= settings.winScore && (!settings.enableTwoAhead || pScore - p2Score >= 2)) ||
229+
(cSet > set ? pScore > p2Score : false)
200230
);
201231
}
202232

@@ -205,15 +235,22 @@ function setEnded(set) {
205235
}
206236

207237
function setsWon(player) {
208-
return Array(sets()).fill(0).map((_, s) => ~~setWon(s, player)).reduce((a,v) => a+v, 0);
238+
return Uint16Array(sets()).fill(0).map((_, s) => ~~setWon(s, player)).reduce((a,v) => a+v, 0);
209239
}
210240

211241
function matchWon(player) {
212242
return setsWon(player) >= settings.winSets;
213243
}
214244

215245
function matchEnded() {
216-
return (matchWon(0) || matchWon(1)) && cSet > (setsWon(0) + setsWon(1) - 1);
246+
// query if the match is ended only if: the value is not already saved or the set changed
247+
if (matchEnd == null || matchEnd.set != cSet) {
248+
matchEnd = {
249+
ended: (matchWon(0) || matchWon(1)) && cSet > (setsWon(0) + setsWon(1) - 1),
250+
set: cSet,
251+
}
252+
}
253+
return matchEnd.ended
217254
}
218255

219256
function matchScore(player) {
@@ -304,7 +341,20 @@ function score(player) {
304341
}
305342

306343
function handleInput(button) {
344+
// console.log('button:', button);
307345
if (settingsMenuOpened) {
346+
347+
if (!isBangle1 && button == 2) {
348+
E.showMenu();
349+
350+
settingsMenuOpened = null;
351+
352+
draw();
353+
354+
setupDisplay();
355+
setupInputWatchers();
356+
357+
}
308358
return;
309359
}
310360

@@ -340,8 +390,8 @@ function draw() {
340390
g.setFontAlign(0,0);
341391
g.setFont('Teletext5x9Ascii',2);
342392
g.drawString(
343-
"WINNER",
344-
getXCoord(w => p === 0 ? w/4 : w/4*3),
393+
"WINS",
394+
getXCoord(w => p === 0 ? w/4 + 7 : w/4*3 + 7),
345395
15
346396
);
347397
} else if (matchEnded()) {
@@ -376,7 +426,7 @@ function draw() {
376426
g.setFont('7x11Numeric7Seg',2);
377427
g.drawString(
378428
formatNumber(matchScore(p), 3),
379-
getXCoord(w => p === 0 ? w/2 - 3 : w/2 + 6),
429+
getXCoord(w => p === 0 ? w/2 - 6 : w/2 + 9),
380430
h-5
381431
);
382432
}
@@ -387,7 +437,7 @@ function draw() {
387437
g.setFont('Teletext5x9Ascii',2);
388438
g.drawString(
389439
"R",
390-
getXCoord(w => w/2),
440+
getXCoord(w => w/2) + 1,
391441
h-10
392442
);
393443
}
@@ -411,13 +461,13 @@ function draw() {
411461
g.drawString(set+1, 5, y-10);
412462
if (scores[set+1][2] != null) {
413463
let dur2 = formatDuration(scores[set+1][2] - scores[set][2]);
414-
g.drawString(dur2, 5, y+10);
464+
g.drawString(dur2, 2, y+10);
415465
}
416466

417467
for (let p = 0; p < 2; p++) {
418468
if (!setWon(set, p === 0 ? 1 : 0) || matchEnded()) {
419-
let bigNumX = getXCoord(w => p === 0 ? w/4-12 : w/4*3+15);
420-
let smallNumX = getXCoord(w => p === 0 ? w/2-2 : w/2+3);
469+
let bigNumX = getXCoord(w => p === 0 ? w/4-2 : w/4*3+5);
470+
let smallNumX = getXCoord(w => p === 0 ? w/2-1 : w/2+2);
421471

422472
if (settings.enableTennisScoring && set === cSet && !shouldTiebreak()) {
423473
g.setFontAlign(0,0);
@@ -427,12 +477,12 @@ function draw() {
427477
bigNumX,
428478
y
429479
);
430-
} else if (shouldTiebreak() && set === cSet) {
480+
} else if (set === cSet && shouldTiebreak()) {
431481
g.setFontAlign(0,0);
432482
g.setFont('7x11Numeric7Seg',3);
433483
g.drawString(
434484
formatNumber(scores[set][3+p], 3),
435-
bigNumX,
485+
bigNumX + (p === 0 ? -5 : 5),
436486
y
437487
);
438488
} else {
@@ -445,7 +495,7 @@ function draw() {
445495
);
446496
}
447497

448-
if ((shouldTiebreak() || settings.enableTennisScoring) && set === cSet) {
498+
if (set === cSet && (shouldTiebreak() || settings.enableTennisScoring)) {
449499
g.setFontAlign(p === 0 ? 1 : -1,0);
450500
g.setFont('7x11Numeric7Seg',1);
451501
g.drawString(
@@ -472,7 +522,20 @@ function draw() {
472522
g.flip();
473523
}
474524

525+
function drawInitialMsg() {
526+
if (!isBangle1) {
527+
g.setFontAlign(0,0);
528+
g.setFont('Teletext5x9Ascii',1);
529+
g.drawString(
530+
"-Long press here for menu-",
531+
90,
532+
15
533+
);
534+
}
535+
}
536+
475537
setupDisplay();
476538
setupInputWatchers(true);
477539
setupMatch();
478540
draw();
541+
drawInitialMsg();

apps/score/score.settings.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@
116116
if (selected != null) {
117117
m[''].selected = selected;
118118
}
119-
m['< Back'] = function () { back(settings, changed); };
119+
m['< Back'] = function () { back(settings, changed, true); };
120120
m['Presets'] = function () { E.showMenu(presetMenu(back)); };
121121
if (isBangle1) {
122122
m['Mirror Buttons'] = {
@@ -198,9 +198,10 @@
198198
const inAppMenu = function () {
199199
let m = {
200200
'': {'title': 'Score Menu'},
201-
'< Back': function () { back(settings, changed); },
202-
'Reset match': function () { back(settings, true); },
203-
'End current set': function () { inApp('end_set'); back(settings, changed); },
201+
'< Back': function () { back(settings, changed, false); },
202+
'Correct mode': function () { inApp('correct_mode'); back(settings, false, true); },
203+
'Reset match': function () { back(settings, true, true); },
204+
'End current set': function () { inApp('end_set'); back(settings, changed, true); },
204205
'Configuration': function () { E.showMenu(appMenu(function () {
205206
E.showMenu(inAppMenu());
206207
})); },

0 commit comments

Comments
 (0)