@@ -10,6 +10,7 @@ let tennisScores = ['00','15','30','40','DC','AD'];
1010let scores = null ;
1111let tScores = null ;
1212let cSet = null ;
13+ let matchEnd = null ;
1314
1415let firstShownSet = null ;
1516
@@ -19,10 +20,10 @@ let correctionMode = false;
1920let w = g . getWidth ( ) ;
2021let h = g . getHeight ( ) ;
2122
22- let isBangle1 = process . env . BOARD === 'BANGLEJS' ;
23+ let isBangle1 = process . env . BOARD === 'BANGLEJS' || process . env . BOARD === 'EMSCRIPTEN' ;
2324
2425function 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
76105function 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
97127function 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
145180function 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
186221function 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
207237function 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
211241function matchWon ( player ) {
212242 return setsWon ( player ) >= settings . winSets ;
213243}
214244
215245function 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
219256function matchScore ( player ) {
@@ -304,7 +341,20 @@ function score(player) {
304341}
305342
306343function 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+
475537setupDisplay ( ) ;
476538setupInputWatchers ( true ) ;
477539setupMatch ( ) ;
478540draw ( ) ;
541+ drawInitialMsg ( ) ;
0 commit comments