From d8c41b78a2f4ab8cc16fd97383cbd3104ded8990 Mon Sep 17 00:00:00 2001 From: Michael Salaverry Date: Sat, 11 Dec 2021 20:29:54 +0200 Subject: [PATCH] feat: multiple player support --- apps.json | 5 +- apps/golfscore/ChangeLog | 1 + apps/golfscore/README.md | 28 +++++--- apps/golfscore/app.js | 115 ++++++++++++++++++++++++--------- apps/golfscore/holemenu.png | Bin 0 -> 3086 bytes apps/golfscore/mainmenu.png | Bin 0 -> 2454 bytes apps/golfscore/scorecard.png | Bin 0 -> 2922 bytes apps/golfscore/setupmenu.png | Bin 0 -> 2283 bytes apps/hebrew_calendar/ChangeLog | 3 +- 9 files changed, 108 insertions(+), 44 deletions(-) create mode 100644 apps/golfscore/holemenu.png create mode 100644 apps/golfscore/mainmenu.png create mode 100644 apps/golfscore/scorecard.png create mode 100644 apps/golfscore/setupmenu.png diff --git a/apps.json b/apps.json index 8640433ee..70d0a8cf4 100644 --- a/apps.json +++ b/apps.json @@ -57,11 +57,12 @@ { "id": "golfscore", "name": "Golf Score", "shortName":"golfscore", - "version":"0.01", + "version":"0.02", "description": "keeps track of strokes during a golf game", "icon": "app.png", "tags": "outdoors", - "supports" : ["BANGLEJS2"], + "allow_emulator": true, + "supports" : ["BANGLEJS","BANGLEJS2"], "readme": "README.md", "storage": [ {"name":"golfscore.app.js","url":"app.js"}, diff --git a/apps/golfscore/ChangeLog b/apps/golfscore/ChangeLog index 5560f00bc..4995dd59a 100644 --- a/apps/golfscore/ChangeLog +++ b/apps/golfscore/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: multiple player score support \ No newline at end of file diff --git a/apps/golfscore/README.md b/apps/golfscore/README.md index dc139bc9a..68552ad4b 100644 --- a/apps/golfscore/README.md +++ b/apps/golfscore/README.md @@ -1,25 +1,37 @@ -# App Name +# Golf Score -Describe the app... +Lets you keep track of strokes during a game of Golf. -Add screen shots (if possible) to the app folder and link then into this file with ![](.png) +![](mainmenu.png) +![](setupmenu.png) +![](scorecard.png) +![](holemenu.png) ## Usage -Describe how to use it +1. Open the app, +1. scroll to setup +2. set the number of holes (18 by default, but can be configured) +3. set the number of players (4 by default, but can be 1-20) +4. click back +5. scroll to a hole (hole 1) +6. scroll to a player and set the number of strokes they took (repeat as needed) +7. click next hole and repeat #6 and #7 as needed; or click back +8. at any time, check the score card for a sum total of all the strokes for each player ## Features -Name the function +Track strokes for multiple players (1-20) +Set number of holes on course ## Controls -Name the buttons and what they are used for +N/A ## Requests -Name who should be contacted for support/update requests +Michael Salaverry (github.com/barakplasma) ## Creator -Your name +Michael Salaverry diff --git a/apps/golfscore/app.js b/apps/golfscore/app.js index b971087ad..7c5c2d0e8 100644 --- a/apps/golfscore/app.js +++ b/apps/golfscore/app.js @@ -1,62 +1,113 @@ +// @ts-check +// @ts-ignore const menu = require("graphical_menu"); +/** + * @type {{showMenu: (config) => void}} + */ +let E; +/** + * @type {{clear: () => void}} + */ +let g; let holes_count = 18; -let course = new Array(holes_count).fill(0); -let total_strokes = 0; +let player_count = 4; +/** + * @type {number[][]} + */ +let course = new Array(holes_count).map(() => new Array(player_count).fill(0)); -const mainmenu = { +const main_menu = { "": { "title": "-- Golf --" }, + "Setup": function () { E.showMenu(setup_menu); }, + "Score Card": function () { + calculate_score(); + E.showMenu(score_card); + }, +}; + +function calculate_score() { + let scores = course.reduce((acc, hole) => { + hole.forEach((stroke_count, player) => { + acc[player] = acc[player]+stroke_count; + }); + return acc; + }, new Array(player_count).fill(0)); + + score_card = { + "": { + "title": "score card" + }, + "< Back": function () { E.showMenu(main_menu); }, + }; + + for (let player = 0; player < player_count; player++) { + score_card["Player - " + (player + 1)] = { + value: scores[player] + }; + } +} + +let score_card = {}; + +const setup_menu = { + "": { + "title": "-- Golf Setup --" + }, "Holes": { value: holes_count, min: 1, max: 20, step: 1, wrap: true, onchange: v => { holes_count = v; add_holes(); } }, - "Total Strokes": { - value: total_strokes, + "Players": { + value: player_count, + min: 1, max: 10, step: 1, wrap: true, + onchange: v => { player_count = v; } }, + "< Back": function () { E.showMenu(main_menu); }, }; -function updateTotalStrokes() { - total_strokes = course.reduce((acc, strokes) => acc + strokes, 0); - mainmenu["Total Strokes"].value = total_strokes; -} - -function inc_hole(i) { return function (v) { course[i] = v; updateTotalStrokes(); }; } +function inc_hole(i, player) { return function (v) { course[i][player] = v; }; } function add_holes() { - for (let j = 0; j < 100; j++) { - delete mainmenu["Hole - " + (j + 1)]; + for (let j = 0; j < 20; j++) { + delete main_menu["Hole - " + (j + 1)]; } for (let i = 0; i < holes_count; i++) { - course[i] = 0; - mainmenu["Hole - " + (i + 1)] = hole_menu(i); + course[i] = new Array(player_count).fill(0); + main_menu["Hole - " + (i + 1)] = goto_hole_menu(i); } - E.showMenu(mainmenu); + E.showMenu(main_menu); +} + +function goto_hole_menu(i) { + return function () { + E.showMenu(hole_menu(i)); + }; } function hole_menu(i) { - return function () { - E.showMenu(submenu(i)); - }; -} - -function submenu(i) { - return { + let menu = { "": { "title": `-- Hole ${i + 1}--` }, - "strokes:": { - value: course[i], - min: 1, max: 20, step: 1, wrap: true, - onchange: inc_hole(i) - }, - "Next hole": hole_menu(i + 1), - "< Back": function () { E.showMenu(mainmenu); }, + "Next hole": goto_hole_menu(i + 1), + "< Back": function () { E.showMenu(main_menu); }, }; + + for (let player = 0; player < player_count; player++) { + menu[`player - ${player + 1}`] = { + value: course[i][player], + min: 1, max: 20, step: 1, wrap: true, + onchange: inc_hole(i, player) + }; + } + + return menu; } +// @ts-ignore g.clear(); -add_holes(); -E.showMenu(mainmenu); \ No newline at end of file +add_holes(); \ No newline at end of file diff --git a/apps/golfscore/holemenu.png b/apps/golfscore/holemenu.png new file mode 100644 index 0000000000000000000000000000000000000000..ac214f182796e9edd3cb0b461be6481f632222b8 GIT binary patch literal 3086 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 literal 0 HcmV?d00001 diff --git a/apps/golfscore/mainmenu.png b/apps/golfscore/mainmenu.png new file mode 100644 index 0000000000000000000000000000000000000000..3ebeb0ca74c0b272a2cd26d7643db993d56332bc GIT binary patch literal 2454 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 RBXXZ-;IgTuNsSRM>R*9+bO`_e literal 0 HcmV?d00001 diff --git a/apps/golfscore/setupmenu.png b/apps/golfscore/setupmenu.png new file mode 100644 index 0000000000000000000000000000000000000000..13158e2e7bc467ba45ea8482cabe05f154e1d5fc GIT binary patch literal 2283 zcmeHJ={MU80*#2Z^a(?&w1Q`;M3vUQmPkrUt5jRD7Kw^2qSW5sw5IeSrSzeeR*(#} zJo{Q{i)t)ss=RtZGE`|}i7l4qG2S`zeg1%%d(OT0oO{mwazEXSE3Rl+=@Zf*5J=YP zBJ%2?H~d9O@k6a|`{H|OBBZNmdr;k|>NgNbveF58!Q-y)a>;URMdwj5D(Bz@$x~-+ zTV5QSI~iuZ`W(A(CKZb|L zY1el$F`%-~g(<__ol3C?MT}dYE-I#5>s?OrekpO^_k*O+9T<{URn)UMHDbfsWv$ij zu*_L&G^V7`Kphfc^)`FZB-$0_^;9n0xlOU%RJ4v9J{{2(M5y(#T`Ok`(&>d;(XD=N z`}1pI!{5ceMjRXmY6wi{-d~+pUIPvxc;n}&eF%nKdWu7wHk@+PiDgM-z+QYx)(4SpSK{~n4^T#=z^9N z81zYSmQgsxq_(ZvQx;9u=9q4~?y0vW9PD+`Ns2GNw(eMcI~0OK~ebCrjPv z3m04VNCoJP_ADizFZsXJH8!8V6=|uA1~pB7 z;y<_Y%Fkx+N;W(wsQ*enVF~vNIG_a>6;S2vxKz*BT;iXS!d>`cEi)MT4%;x1>Qllb zUMjzaFUY}U^$s3Tx7c$JrG?7qPq!Hs5C_P$FlJXAH@W&H8h{h>XU6lh#zMC*4DBV91=Tefs7JLZB(i^+@%1)VzYN%or}-;; z`PpX;C;R|j(f4{<;#3CH#Uu<+ItkBJ)P8==Rgfb z{iw~P%`YF6%{DYN6UFocw{Y{curf2NKF5j`Vp5TDRHZ7*@mhu>J5UP77x#nMcv=L< zKv4dbmjySdN2cQ8AE#a%|F*ea9P*E>Y<3OujW#f*Hanp*#4C-k?#^nCFME=)l`-k#FCuv~ zPkCn#Jk{}#H!cF^bQC?=vfd!B`w_T{a~}(p+uKSMP;8cX9#1siZ1 zVRZmbrB)+KpjRDZ)(Lw$l%~5f*dKf8eY#iSCB(U?pPAFR@enIrnx@=uD6Yr^^b_#7 z_#^B}$Iz+P2kFwIGMT*;2;v;Si!^B*RlmF*DqQ+GXbyEO=hn2b7i3gL2d2<&JdU3! z&{u1nU=wR!1kd4+tJaygb@JT8a1W#tyega0x0_$MnJ(<>mH>wK?JU6@hv!X+@lHU_ zc9{OklLHSR5v#)@aDTw6sAze!Yg|nU)RMU*jIVkpWl7foILBix>OTrJfBbDBu*PhS z-U-H64!#O9%O$neqXod{6tD{bw?~Fk<{kxDM(gf5$>;+vK#dV{`7lv8|4)(%IR#a> zz$bTiCVR#w`|Prnyz-Ei_vr?JCKP+pqZVkJJ