From 700e569a42de0ea60011da3590da2d4cc92521e1 Mon Sep 17 00:00:00 2001 From: Lars Berning <151194+laberning@users.noreply.github.com> Date: Sun, 13 Feb 2022 21:33:09 +0100 Subject: [PATCH] adds first steps for the arcade game stroke fighter --- app/client/arcade/GameEngine.js | 12 ++ app/client/arcade/RowingGames.js | 44 +++++ app/client/arcade/SpaceBackground.js | 51 +++++ app/client/arcade/StrokeFighterBattleScene.js | 174 ++++++++++++++++++ .../assets/sounds/explosionCrunch_000.ogg | Bin 0 -> 28274 bytes app/client/assets/sounds/laserSmall_001.ogg | Bin 0 -> 7448 bytes app/client/assets/sprites/enemyBlack1.png | Bin 0 -> 3019 bytes app/client/assets/sprites/enemyBlue2.png | Bin 0 -> 3059 bytes app/client/assets/sprites/enemyGreen3.png | Bin 0 -> 3609 bytes app/client/assets/sprites/enemyRed4.png | Bin 0 -> 2279 bytes app/client/assets/sprites/enemyRed5.png | Bin 0 -> 2733 bytes app/client/assets/sprites/laserRed01.png | Bin 0 -> 735 bytes app/client/assets/sprites/laserRed09.png | Bin 0 -> 752 bytes .../assets/sprites/playerShip2_orange.png | Bin 0 -> 3597 bytes app/client/assets/sprites/spaceShips_004.png | Bin 0 -> 5074 bytes app/client/assets/sprites/spaceShips_006.png | Bin 0 -> 4515 bytes app/client/assets/sprites/spaceShips_007.png | Bin 0 -> 7460 bytes app/client/assets/sprites/spaceShips_009.png | Bin 0 -> 4474 bytes app/client/assets/sprites/star1.png | Bin 0 -> 312 bytes app/client/assets/sprites/star2.png | Bin 0 -> 345 bytes app/client/assets/sprites/ufoGreen.png | Bin 0 -> 3049 bytes app/client/components/BatteryIcon.js | 4 +- app/client/components/DashboardActions.js | 7 +- app/client/components/GameComponent.js | 33 ++++ app/client/index.html | 2 + app/client/index.js | 14 +- app/client/lib/app.js | 4 + app/client/lib/icons.js | 1 + app/client/store/appState.js | 2 + package-lock.json | 35 ++-- package.json | 1 + 31 files changed, 367 insertions(+), 17 deletions(-) create mode 100644 app/client/arcade/GameEngine.js create mode 100644 app/client/arcade/RowingGames.js create mode 100644 app/client/arcade/SpaceBackground.js create mode 100644 app/client/arcade/StrokeFighterBattleScene.js create mode 100644 app/client/assets/sounds/explosionCrunch_000.ogg create mode 100644 app/client/assets/sounds/laserSmall_001.ogg create mode 100644 app/client/assets/sprites/enemyBlack1.png create mode 100644 app/client/assets/sprites/enemyBlue2.png create mode 100644 app/client/assets/sprites/enemyGreen3.png create mode 100644 app/client/assets/sprites/enemyRed4.png create mode 100644 app/client/assets/sprites/enemyRed5.png create mode 100644 app/client/assets/sprites/laserRed01.png create mode 100644 app/client/assets/sprites/laserRed09.png create mode 100644 app/client/assets/sprites/playerShip2_orange.png create mode 100644 app/client/assets/sprites/spaceShips_004.png create mode 100644 app/client/assets/sprites/spaceShips_006.png create mode 100644 app/client/assets/sprites/spaceShips_007.png create mode 100644 app/client/assets/sprites/spaceShips_009.png create mode 100644 app/client/assets/sprites/star1.png create mode 100644 app/client/assets/sprites/star2.png create mode 100644 app/client/assets/sprites/ufoGreen.png create mode 100644 app/client/components/GameComponent.js diff --git a/app/client/arcade/GameEngine.js b/app/client/arcade/GameEngine.js new file mode 100644 index 0000000..46ad990 --- /dev/null +++ b/app/client/arcade/GameEngine.js @@ -0,0 +1,12 @@ +'use strict' +/* + Open Rowing Monitor, https://github.com/laberning/openrowingmonitor + + Kaboom based Game Engine for Rowing Games +*/ + +import kaboom from 'kaboom' + +export function createGameEngine (options) { + return kaboom(options) +} diff --git a/app/client/arcade/RowingGames.js b/app/client/arcade/RowingGames.js new file mode 100644 index 0000000..3dd44a0 --- /dev/null +++ b/app/client/arcade/RowingGames.js @@ -0,0 +1,44 @@ +'use strict' +/* + Open Rowing Monitor, https://github.com/laberning/openrowingmonitor + + Initializer for the Rowing Games +*/ + +import { createGameEngine } from './GameEngine.js' +import StrokeFighterBattleScene from './StrokeFighterBattleScene.js' + +/** + * creates and initializes the rowing games + * @param {Element} canvasElement + * @param {number} clientWidth + * @param {number} clientHeight + */ +export function createRowingGames (canvasElement, clientWidth, clientHeight) { + const k = createGameEngine({ + debug: true, + global: false, + canvas: canvasElement, + crisp: true, + width: clientWidth, + height: clientHeight + }) + // for now show debug infos all the time + k.debug.inspect = true + + // todo: once there are multiple games, asset loadingshould be moved to the individual games + const assets = '/assets' + const sprites = ['enemyBlack1', 'enemyBlue2', 'enemyGreen3', 'enemyRed4', 'enemyRed5', 'playerShip2_orange', + 'spaceShips_004', 'spaceShips_006', 'spaceShips_007', 'spaceShips_009', 'star1', 'star2', 'ufoGreen', + 'laserRed01', 'laserRed09'] + + for (const sprite of sprites) { + k.loadSprite(sprite, `${assets}/sprites/${sprite}.png`) + } + k.loadSound('hit', `${assets}/sounds/explosionCrunch_000.ogg`) + k.loadSound('shoot', `${assets}/sounds/laserSmall_001.ogg`) + + k.scene('strokeFighterBattle', () => { StrokeFighterBattleScene(k) }) + + k.go('strokeFighterBattle') +} diff --git a/app/client/arcade/SpaceBackground.js b/app/client/arcade/SpaceBackground.js new file mode 100644 index 0000000..3bb8018 --- /dev/null +++ b/app/client/arcade/SpaceBackground.js @@ -0,0 +1,51 @@ +'use strict' +/* + Open Rowing Monitor, https://github.com/laberning/openrowingmonitor + + Creates a scrolling space background +*/ + +const STAR_SPEED = 20 +const STAR_SPRITE_NAMES = ['star1', 'star2'] +const STAR_NUM = 10 + +export default function addSpaceBackground (k) { + k.add([ + k.rect(k.width() + 50, k.height() + 50), + k.pos(-25, -25), + k.color(0, 0, 0), + k.layer('background') + ]) + + for (let i = 0; i < STAR_NUM; i++) { + addStar(false) + } + + /** + * adds a star at a random position + * @param {boolean} respawn defines whether this is an initial star or a respawn + */ + function addStar (respawn) { + const spriteName = k.choose(STAR_SPRITE_NAMES) + const position = k.rand(k.vec2(0, respawn ? -50 : 0), k.vec2(k.width(), respawn ? 0 : k.height())) + + const starColor = k.rand(120, 200) + k.add([ + k.sprite(spriteName), + k.scale(k.rand(0.2, 0.7)), + k.color(starColor, starColor, starColor), + k.layer('background'), + k.pos(position), + 'star', + { speed: k.rand(STAR_SPEED * 0.5, STAR_SPEED * 1.5) } + ]) + } + + k.onUpdate('star', (component) => { + component.move(0, component.speed) + if (component.pos.y - component.height > k.height()) { + k.destroy(component) + addStar(true) + } + }) +} diff --git a/app/client/arcade/StrokeFighterBattleScene.js b/app/client/arcade/StrokeFighterBattleScene.js new file mode 100644 index 0000000..ee5f4b7 --- /dev/null +++ b/app/client/arcade/StrokeFighterBattleScene.js @@ -0,0 +1,174 @@ +'use strict' +/* + Open Rowing Monitor, https://github.com/laberning/openrowingmonitor + + Implements the Battle Actions of the Stroke Fighter Game +*/ + +import addSpaceBackground from './SpaceBackground.js' + +const ENEMY_SPRITE_NAMES = ['enemyBlack1', 'enemyBlue2', 'enemyGreen3', 'enemyRed4', 'enemyRed5', + 'spaceShips_004', 'spaceShips_006', 'spaceShips_007', 'spaceShips_009', 'ufoGreen'] + +export default function StrokeFighterBattleScene (k) { + const BULLET_SPEED = 1200 + const ENEMY_SPEED = 60 + const PLAYER_SPEED = 480 + const ENEMY_HEALTH = 4 + const SPRITE_WIDTH = 90 + + k.layers([ + 'background', + 'game', + 'ui' + ], 'game') + + addSpaceBackground(k) + + function grow (rate) { + return { + update () { + const n = rate * k.dt() + this.scale.x += n + this.scale.y += n + } + } + } + + const player = k.add([ + k.sprite('playerShip2_orange'), + k.area(), + k.pos(k.width() / 2, k.height() - 64), + k.origin('center') + ]) + + function moveLeft () { + player.move(-PLAYER_SPEED, 0) + if (player.pos.x < 0) { + player.pos.x = k.width() + } + } + + function moveRight () { + player.move(PLAYER_SPEED, 0) + if (player.pos.x > k.width()) { + player.pos.x = 0 + } + } + + player.onCollide('enemy', (e) => { + k.destroy(e) + k.shake(4) + k.play('hit', { + detune: -1200, + volume: 0.3, + speed: k.rand(0.5, 2) + }) + }) + + player.onUpdate(() => { + const tolerance = 10 + const closestEnemy = k.get('enemy').reduce((prev, enemy) => { return enemy?.pos.y > prev?.pos.y ? enemy : prev }, { pos: { y: 0 } }) + if (closestEnemy?.pos?.x) { + if (closestEnemy.pos.x > player.pos.x + tolerance) { + moveRight() + } else if (closestEnemy.pos.x < player.pos.x - tolerance) { + moveLeft() + } + } + }) + + function addLaserHit (p, n) { + for (let i = 0; i < n; i++) { + k.wait(k.rand(n * 0.1), () => { + for (let i = 0; i < 2; i++) { + k.add([ + k.sprite('laserRed09'), + k.pos(p.sub(0, 10)), + k.scale(k.vec2(0.5)), + k.lifespan(0.1), + grow(k.rand(0.5, 2)), + k.origin('center') + ]) + } + }) + } + } + + function spawnBullet (p) { + k.add([ + k.sprite('laserRed01'), + k.area(), + k.pos(p), + k.origin('center'), + k.move(k.UP, BULLET_SPEED), + k.cleanup(), + 'bullet' + ]) + } + + // todo: this should be triggered by a finished rowing drive phase + k.onKeyPress('space', () => { + spawnBullet(player.pos.sub(16, 15)) + spawnBullet(player.pos.add(16, -15)) + k.play('shoot', { + volume: 0.3, + detune: k.rand(-1200, 1200) + }) + }) + + function spawnEnemy () { + const name = k.choose(ENEMY_SPRITE_NAMES) + k.add([ + k.sprite(name), + k.area(), + k.pos(k.rand(0 + SPRITE_WIDTH / 2, k.width() - SPRITE_WIDTH / 2), 0), + k.health(ENEMY_HEALTH), + k.origin('bot'), + 'enemy', + { speed: k.rand(ENEMY_SPEED * 0.5, ENEMY_SPEED * 1.5) } + ]) + k.wait(3, spawnEnemy) + } + + k.on('death', 'enemy', (e) => { + k.destroy(e) + k.shake(2) + }) + + k.on('hurt', 'enemy', (e) => { + k.shake(1) + k.play('hit', { + detune: k.rand(-1200, 1200), + volume: 0.1, + speed: k.rand(0.2, 2) + }) + }) + + const timer = k.add([ + k.text(0), + k.pos(12, 32), + k.fixed(), + k.layer('ui'), + { time: 0 } + ]) + + timer.onUpdate(() => { + timer.time += k.dt() + timer.text = timer.time.toFixed(2) + }) + + k.onCollide('bullet', 'enemy', (b, e) => { + k.destroy(b) + e.hurt(1) + addLaserHit(b.pos, 1) + }) + + k.onUpdate('enemy', (sprite) => { + sprite.move(0, sprite.speed) + if (sprite.pos.y - sprite.height > k.height()) { + k.destroy(sprite) + } + }) + spawnEnemy() +} diff --git a/app/client/assets/sounds/explosionCrunch_000.ogg b/app/client/assets/sounds/explosionCrunch_000.ogg new file mode 100644 index 0000000000000000000000000000000000000000..019e53664abf859fc5529f95d0db23fa3ac1e42d GIT binary patch literal 28274 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≶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 literal 0 HcmV?d00001 diff --git a/app/client/assets/sprites/enemyBlack1.png b/app/client/assets/sprites/enemyBlack1.png new file mode 100644 index 0000000000000000000000000000000000000000..bc2fa4c1c92db0c8583b87ae67afa8897054f766 GIT binary patch literal 3019 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 I1+TdO0P5S~h5!Hn literal 0 HcmV?d00001 diff --git a/app/client/assets/sprites/enemyBlue2.png b/app/client/assets/sprites/enemyBlue2.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3bd0c9fa347fa5d0ac09b42d1496117b1960e8 GIT binary patch literal 3059 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 B-P`~G literal 0 HcmV?d00001 diff --git a/app/client/assets/sprites/enemyGreen3.png b/app/client/assets/sprites/enemyGreen3.png new file mode 100644 index 0000000000000000000000000000000000000000..74e2bca68229314e2a6b074850c0f309ac547cc1 GIT binary patch literal 3609 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 fP)Z)9b1s0M%T00000NkvXXu0mjf`V7Zs literal 0 HcmV?d00001 diff --git a/app/client/assets/sprites/enemyRed4.png b/app/client/assets/sprites/enemyRed4.png new file mode 100644 index 0000000000000000000000000000000000000000..a3216d4bf9419479ebe3881b92ef3f0944009781 GIT binary patch literal 2279 zcmVk{F!vjpVN6TRnByDbfn4|(Yg-5H{&-I5?P*$$aycY5TxPM9N}8jAGv8^QTxY5s7*9M_C@!tq&`|D6)YyH#di#NMHn3 zVAicSW%-lqo%t~uRQRG=w7&C)Tt`17aDY2?>Qv~71V&&5X1BNyy9x)9Y0uf6h(z}m z^P!WK9s1e^*xA_`S|WkXPD2(}-MGMk>{Zty^54IEmHAL*KbNeVO5nA%p(PU7fDu@| z#0D6fSF=PSp){vKDP1Db zrjt)#avNl_LS*%}#jNU$99HrA{Zcz^{Z_qmNvc;m8EQGdiA0-jet``bPdmhc7!j*6 zBH`rN<_8=tzBPyavTF%Dvu~@^sK=Tl5h>VDg zh>VDgh>VDgh}0zV{I)3&PIlp~#i1wi*8=xAY6}9MBIwtRJ=GA8j;FBz(;2@&{jE=yR5- z?~&Ag)u%h=CXw{{49lQyYdV>HAxGP^)T;V`J1dFAC;f^8@25!Y>FF`P)BqnuCU#SZ z%L=oONCa^F;Ag32S{)MoTC;&KT6P5np3GTAB({R^Bzjp4^K0=7K8Z{$ztZ-Uz=^EX zAo8qLqX96j+hD=T>x!bEtBCMTi(bG4Y{2LiN2N(3F-OIG+sV!qKbs;k-Suq~%dxbc z4Q%m}b*^#9z8Pd~iU<;^{J41WV(8Yjfr;<|YiQ@%v}GmJjZ`LgT2QU&Wy?y|iKPGS zuy3LwoDq=`kr9y*kr9#el*nW<=}IK-iHLNuiHQkUB5_Ydq=TuBqo|H+L_|vL>eZ`k za&l6eNZgBOA|eGF9Uavskw1hP5y_eAfRv8m*@(z#8y_D}n@Btx5oy`T$Vl2GlA(=x zOXR90FBq{oK_q=f!?E135(#Ws{fwp~HKSU$*7-92+{#TXFLwi5{qTz!lZQ6Y7TVPP zQVy(M<0Hu%&u0<;`8_d1A;8UW^g{Qz@!Okrv*#b*Y}?uu8`;y#UiM5Np24%!4%*Z` zUJR_dae)JHk@lfZI@sw&_`}O_n%q~|>PKEu_de@4+=F}Z z44y?BXv>e|#WDdA)!FSCMCzW`c9Z53H%XP3mwOsX%a5I5McY64zn4Dt8hd8h`V@iq zH~vPy<6b=D$%lnWciSIHfoY%D_NpMz{%wKLO9+1^oecwx9Q`>DuEDfO$#@*DVfR&&MvD;B>uRuPAO#C zsN``vUW{18^VkZN6@8T|mHwG5e?qE2);np?!SUXpi3A4KAOq|&xdoZ-PujX^GDW`O z;bEz8h^RKemqI}ksVaGZStbC27>y|TVPqFIB1LU9SrJd7N`5G>WV#`M7fX^A*D`Ii zX>G|o$93rm#@kKn9Lb`h+{WSRG zOCDKqjr)W=7|*I8rznNUE1L3C%$n~?d?|%8DS3cFoZ?9oO}hh?h_wI|@~=Cuv1`BT z*RQ8OTlpdPTBjiDpGlij*&F0G`>s7G>vH)j|Nce(J_?AuULM@{Wv2?y% zqUq+qz(88_?@Wy5)$lD&>ws}q2)m0Kl$csoR#w`9wYIhzClNmE0^IV+PwQN@AH%AW z&#R(R;>Uh&(?rsqarjJ2jWmoG&5kH%nVx^syqa=y*7e1+Q7%5XEp^wX?1yMv17KkT3Kbo0>8ZvX%QEp$a#bW?9;ba!ELWdLG% zE@EtNZ)9Y7E@N_eaCC1jX>DO=WiC)oM=~@;Zewp`Wpbznf9?PP002ovPDHLkV1m&; BU9tcG literal 0 HcmV?d00001 diff --git a/app/client/assets/sprites/enemyRed5.png b/app/client/assets/sprites/enemyRed5.png new file mode 100644 index 0000000000000000000000000000000000000000..645cdf3c82929087701f933252e30cd5de353ef3 GIT binary patch literal 2733 zcmV;e3R3lnP);Gf`sAod5-rm>}Ms!gm0Uu|luCG`zeNVIBftwy6JMlC8e77N_+24B|- z(t-j(K=Dx!X(85BY;CR9ME->7emBfI?48{`GrRZRWiOi?6Og+*bG|cYK4cjw2l?C9v|m}&IA#ISKqzm50w^z6BE<;skh;lM#%0Yo#- z(}jj*g8)Wfi*=oEHwY2qKRkWllP6EC@NHcT zj>0d4x`=F6fFw*3m^!0>FzC_G?f(7y+$V8SggC!gP#1EU6?xe>`bE2a`!-)Y^F&=+)=6^XFT3WQ7^5nvdtsqh766u-tKAK(YSs0#bCPUe4#%yML)4G#ztmoEEAg^td(HOAL-|(m3hd z*1U-gv;<}mHKg&u2J#U{Kh^o7;qQH;sib4dsOl7kC}N-!=sadbQu1OuDk>^+u3o)b zERJH?jxK~bd-iNzSy|Z(r|kzZ>|z#Uu~l)tZdl@I>Wb;AsEP*YG+Z=v9%6L0w@$(~ zIK8s6vN#@(Ckz{}s;a{OF)@x~uwZn-p*+^Ynwpvz{@(c9pkXD(c`Q-*S}@Ri)pWk! z_G2(%AZeqiY{61NRm4TVo#56`x}P;PG_dOG>Ot;w(Tve;t{;ycJ#x%m5niz1x3#sg z+S*!XKL%9~nHC{AUvNWHB$+xlwp~$GH^Ypo2u_Q#5}K-_s<>@EErRp*wi24EqN;AP7F7{s zdq`Sns)DMz30o9JKxhsOO;u5KT7;K(5k1f}*N+IUsH&5+MNtIVeFcuDZrk&LpsG&N z7DW+cn|Hp@R0UOalC~&{AWPB&G|dk}1V>cWN!p?&g44ZbUudd|s;Ws_)I^YN+Ho{R zDP@q=367|$nzTht1X(#xAZV(Bs;Ws_)I>l?P6?W-psH%p79|m6Nm^iNs*0-FDgr`r zO3_pWRaKIekV#I$dWXUrYR}?cSBW`q%BG!qysH#$l$7_tJ z6&C3d0aYJp7wVvNH|;o@ru2bHH&mr2ZD)>dvx>WTQCFr#;IjZmt;~~c+Ho{Z>Epw0 zs7kHOZrMDCRh>Lyl{TsfkqQwoBdwCjLp!u9D^iB0DyT|L+I}uHLQ-KatExC{b{tiA znG#`=0LKrohPAV`H|+#8ji=+ub}6c=ByBZoUSZWm^DQAzbDC}uFaxd1J7Z>6uYZj- zt(&b~S&>pSrJ^cEhKdNL5Zjkqu^5HF=@LOE0NQhgD1xlABBf}mf~wS{4b$Ed;>%CS zLIfoOLZEp~VbCutc$ zQ!1)blD4pkKuOfZ%8HDkDHT;INn4X7Vaucl7dPf8ZQ2QFS`y3jAwyM4(iS!myb?8g zWkp8Ol!~feN!z*g4q5ZW4Ih~ZM-P;;tsB4cwC>IxXAv~BWqXpw(KHr@!wFTr$|D`O zE+)1XWFi!;+0GWs{lL>&o7_FKafROnYYeZqwXc01B)rYr!1}w z=R9%*@lIN3(3Fa*UYmKyoUxf#w{@X)FG0424Tmn9w~8zR?9kp4shD`x4!@_+Snw)o z`&uk_3>BJEP?h>j8-M){;t3(HtLD?#+52yNsO9`cxhvR`ck|iu_tvnB=PqlN!}Fa}j;3j?Ez(6*`&VCeb#+PK zyePhm(C(ajL&NOU@i<$#xX^SUZ1Fp*$YLyd>tnWb-e=Zlw{6Ej zXpJ=&CW(PCv+&K2Oy?tHA#{n(ztw+-{9Hmj9`A}}R(53sFTGonCUS2*^_pzyyePLKFbsQZns%mo*~Qmep$jQHT=R z*SQ2?#(BrWD8T<|YrK+i+6(Uh001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(Qrc nZ!T$VVP|D7P)Z)9b1s0M%T00000NkvXXu0mjf6aOWz literal 0 HcmV?d00001 diff --git a/app/client/assets/sprites/laserRed01.png b/app/client/assets/sprites/laserRed01.png new file mode 100644 index 0000000000000000000000000000000000000000..5e467b65ba82babe205a227f0ba2ef5912d6839b GIT binary patch literal 735 zcmV<50wDc~P)0D5BJyC%g?&H zexk`bMJ;O|O8NYslX97V6^kdjlQW%%^6@c)?lP2x-=z|R?lQCk&S@BQCp!?>f}=u# zL3g>k4LID}W6+)AmbD6{T#i9^a&~qZeq^%@x|1CYrr;oxVbEPJd=9>EZ!_pFTQCdX z(rE_WW#~Q>Ha8h`m!WC+y0*rkyWHJ9__Dgnpu2q1D12U7VbGnN$8{L;OG^y8%g`Oj zrBV#Klk>pehTZvj2HnZ|W%R?RWRgL5`C5A5qdRKcshJ_g-srn1rxFME0zbf;;r z_cFZb?q<-PqF(PMc;4B`pgToE++0ek? zI`p`{p22nKQC%H_>(Im6S_aplL`_ZcK`6w+btqm{)tjiUW_i{9F9;-mPg1X)a{vGU zEp$a#bW?9;ba!ELWdLG%E@EtNZ)9Y7E@N_eaCC1jX>DO=WiC)oM=~@;Zewp`Wpbzn Rf9?PP002ovPDHLkV1hx$V`BgS literal 0 HcmV?d00001 diff --git a/app/client/assets/sprites/laserRed09.png b/app/client/assets/sprites/laserRed09.png new file mode 100644 index 0000000000000000000000000000000000000000..7dc31dcc294bdf5ce3f55bd606282a75d4f09675 GIT binary patch literal 752 zcmV436=PP3W+2N3lnq2573>3jkN(OoZ7G(n6xoh_j(zR>a4vU%a+A-W-8qgQ%48uv>T)I&0p4{-_pTdo zL7fpKdbWKngC{|o_5`3Z1o+eQghaa#wrLICD-|?bWP{B9VqmRC;Z&?ij`rd9w z1n?d0LfA)V_3;Vl*I*D4z&BGP-w6HxnNA}D_%`Ak@Eb=iyiH5+x24iK0eq-b6auKD zcJ$RxeO$Lp0AK2Lg#hZ9Q7dar;I-LQ2%t`D0^9I7%*I^Hdc#++eFd`Y$BKw za|;Y1mQ+%RmgJS(R`x+)6)9j;B0H~GyzIH|Y}JqO=V3|V7UMQa6Yj`yhi;R9F$d=2 zF@zG?g;;@kx$+YDr&=v|Yqdl)g_WC)$HB1+=EU5<04%^HlMp+>T>v;-Nvo$z0XFUw zMlMO3{_0ZXbF{Rgk_utVCjGt^WPkx!fJs)N*dbnb`mt>|SR{0qF?f>v&gTjc)UE2z z4=)K^s!Y~(|CQko`~1~H*P&p8Q^ zh&qt&{{cZ?CltF$a+d%A04;PySaefwW^{L9a%BKwc`jmXZ*OE|c`jped2n=ZE@^FH iXJsx>PDe5{MQ&qnWMy)w27m4V0000bZ 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 Ts0M%T00000NkvXXu0mjf94h4C literal 0 HcmV?d00001 diff --git a/app/client/assets/sprites/spaceShips_004.png b/app/client/assets/sprites/spaceShips_004.png new file mode 100644 index 0000000000000000000000000000000000000000..9e9c73afecb791ef2afffd364d2d0f56f839658f GIT binary patch literal 5074 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 literal 0 HcmV?d00001 diff --git a/app/client/assets/sprites/spaceShips_006.png b/app/client/assets/sprites/spaceShips_006.png new file mode 100644 index 0000000000000000000000000000000000000000..2d62a81626c89ca4e03fca89f43b3b0e971bad02 GIT binary patch literal 4515 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 M07*qoM6N<$g5m&~Z2$lO literal 0 HcmV?d00001 diff --git a/app/client/assets/sprites/star1.png b/app/client/assets/sprites/star1.png new file mode 100644 index 0000000000000000000000000000000000000000..67551ae782e67a6cbad8b01fd746609c327e44ea GIT binary patch literal 312 zcmV-80muG{P)P000;W1^@s654Bdt0002SNkl$W|`Sa(`{r^Dl{rh)$npyH63P8a&bS(iH46_6n zH~I9iq<-jH0!&%)NS5@|Dv#77S+bvOgFxvY6fD>2xhrZ8}c0Lo88z9A70v}8T0`T*1~E^1R9B^v+$04;PySaefw zW^{L9a%BKwc`jmXZ*OE|c`jped2n=ZE@^FHXJsx>PDe5{MQ&qnWMy)w27m4V0000< KMNUMnLSTZa8h{=E literal 0 HcmV?d00001 diff --git a/app/client/assets/sprites/star2.png b/app/client/assets/sprites/star2.png new file mode 100644 index 0000000000000000000000000000000000000000..a047ef64fe6e92b1b71c6b06b922f7d0a4eaa513 GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoM!3HGxw}u@9QqMhI978H@T@8!oJ#4_k)9fhG z0zw)sPGAzqaFA&JV%+s zXOE%2|Ae4u#DgG%?|ZEO@}YWvMmDY8519^n##p?B(+!O z)T4=x2fAC_LkktcI_DXAeY@3W7P`OcOU2o9D>nUH@TYFh-EGQRS+^GL*IR2L_+ZcB z{~kOM2|Ek(J#T!`Q(p7z4baQFC9V-A!TD(=<%vb93`v!GNjdrXDJhkD$wid~CHZ=p kxrynidcd$VGI7mI&QD1#TESNT4ycjA)78&qol`;+09P!FWB>pF literal 0 HcmV?d00001 diff --git a/app/client/assets/sprites/ufoGreen.png b/app/client/assets/sprites/ufoGreen.png new file mode 100644 index 0000000000000000000000000000000000000000..7d441b2c5ff5f42d6ea61ad9503fb3f237f925f4 GIT binary patch literal 3049 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 25 ? 'icon' : 'icon low-battery' + const iconClass = parseInt(this.batteryLevel) > 25 ? 'icon' : 'icon low-battery' return svg`
${this.peripheralMode()}
${this.dialog ? this.dialog : ''} @@ -129,6 +130,10 @@ export class DashboardActions extends AppElement { this.sendEvent('triggerAction', { command: 'reset' }) } + openRowingGames () { + this.sendEvent('triggerAction', { command: 'openRowingGames' }) + } + switchPeripheralMode () { this.sendEvent('triggerAction', { command: 'switchPeripheralMode' }) } diff --git a/app/client/components/GameComponent.js b/app/client/components/GameComponent.js new file mode 100644 index 0000000..177d89f --- /dev/null +++ b/app/client/components/GameComponent.js @@ -0,0 +1,33 @@ +'use strict' +/* + Open Rowing Monitor, https://github.com/laberning/openrowingmonitor + + Wrapper for the Open Rowing Monitor rowing games +*/ + +import { AppElement, html, css } from './AppElement.js' +import { customElement } from 'lit/decorators.js' +import { createRowingGames } from '../arcade/RowingGames.js' + +@customElement('game-component') +export class GameComponent extends AppElement { + static styles = css` + :host { + width: 100%; + height: 100%; + display: block; + } + #arcade { + width: 100%; + height: 100%; + } + ` + render () { + return html`` + } + + firstUpdated () { + const canvas = this.renderRoot.querySelector('#arcade') + createRowingGames(canvas, canvas.clientWidth, canvas.clientHeight) + } +} diff --git a/app/client/index.html b/app/client/index.html index 22ef8e8..98f74a1 100644 --- a/app/client/index.html +++ b/app/client/index.html @@ -24,6 +24,7 @@ --theme-font-color: #f5f5f5; --theme-warning-color: #ff0000; --theme-border-radius: 3px; + height: 100%; } body { @@ -34,6 +35,7 @@ font-family: var(--theme-font-family); user-select: none; overscroll-behavior: contain; + height: 100%; } @media (orientation: portrait) { diff --git a/app/client/index.js b/app/client/index.js index b26dfcd..153e18f 100644 --- a/app/client/index.js +++ b/app/client/index.js @@ -10,6 +10,7 @@ import { customElement, state } from 'lit/decorators.js' import { APP_STATE } from './store/appState.js' import { createApp } from './lib/app.js' import './components/PerformanceDashboard.js' +import './components/GameComponent.js' @customElement('web-app') export class App extends LitElement { @@ -55,9 +56,12 @@ export class App extends LitElement { return JSON.parse(JSON.stringify(this.appState)) } - // once we have multiple views, then we would rather reference some kind of router here - // instead of embedding the performance-dashboard directly + // currently just toggle between games and dashboard, if this gets more complex we might use a router here... render () { + return this.appState?.activeRoute === 'DASHBOARD' ? this.renderDashboard() : this.renderRowingGames() + } + + renderDashboard () { return html` + ` + } + // there is no need to put this initialization component into a shadow root createRenderRoot () { return this diff --git a/app/client/lib/app.js b/app/client/lib/app.js index 90f5801..34e973f 100644 --- a/app/client/lib/app.js +++ b/app/client/lib/app.js @@ -128,6 +128,10 @@ export function createApp (app) { if (socket)socket.send(JSON.stringify({ command: 'switchPeripheralMode' })) break } + case 'openRowingGames': { + app.updateState({ ...app.getState(), activeRoute: 'ROWINGGAMES' }) + break + } case 'reset': { resetFields() if (socket)socket.send(JSON.stringify({ command: 'reset' })) diff --git a/app/client/lib/icons.js b/app/client/lib/icons.js index 23b9a75..463f10c 100644 --- a/app/client/lib/icons.js +++ b/app/client/lib/icons.js @@ -25,3 +25,4 @@ export const icon_expand = svg`` export const icon_bluetooth = svg`` export const icon_upload = svg`` +export const icon_gamepad = svg`` diff --git a/app/client/store/appState.js b/app/client/store/appState.js index 3a93f55..5541e6c 100644 --- a/app/client/store/appState.js +++ b/app/client/store/appState.js @@ -8,6 +8,8 @@ export const APP_STATE = { // currently can be STANDALONE (Mobile Home Screen App), KIOSK (Raspberry Pi deployment) or '' (default) appMode: '', + // currently can be DASHBOARD or 'ROWINGGAMES' (default) + activeRoute: 'DASHBOARD', // contains all the rowing metrics that are delivered from the backend metrics: {}, config: { diff --git a/package-lock.json b/package-lock.json index 33e4e08..90e7d3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "ant-plus": "0.1.24", "finalhandler": "1.1.2", "form-data": "4.0.0", + "kaboom": "2000.2.7", "lit": "2.1.3", "loglevel": "1.8.0", "nosleep.js": "0.12.0", @@ -3372,9 +3373,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001311", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001311.tgz", - "integrity": "sha512-mleTFtFKfykEeW34EyfhGIFjGCqzhh38Y0LhdQ9aWF+HorZTtdgKV/1hEE0NlFkG2ubvisPV6l400tlbPys98A==", + "version": "1.0.30001312", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", + "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==", "dev": true, "funding": { "type": "opencollective", @@ -6640,6 +6641,11 @@ "integrity": "sha512-TCa7ZdxCeq6q3Rgms2JCRHTCfWAETPZ8SzYUbkYF6KR3I03sN29DaOIC+xyWboIcMvjAsD5iG2u/RWzHD8XpgQ==", "dev": true }, + "node_modules/kaboom": { + "version": "2000.2.7", + "resolved": "https://registry.npmjs.org/kaboom/-/kaboom-2000.2.7.tgz", + "integrity": "sha512-CiEsmVdmufedNNvppMrVwVGYmao+WRsjE7M/TU4lFGYwUNwBPBVxORmsKvUmuvchw0cR+Dwcj1vAL+K8P06qGA==" + }, "node_modules/keyv": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", @@ -7051,9 +7057,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.1.tgz", + "integrity": "sha512-reLxBcKUPNBnc/sVtAbxgRVFSegoGeLaSjmphNhcwcolhYLRgtJscn5mRl6YRZNQv40Y7P6JM2YhSIsbL9OB5A==", "devOptional": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -13733,9 +13739,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001311", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001311.tgz", - "integrity": "sha512-mleTFtFKfykEeW34EyfhGIFjGCqzhh38Y0LhdQ9aWF+HorZTtdgKV/1hEE0NlFkG2ubvisPV6l400tlbPys98A==", + "version": "1.0.30001312", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", + "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==", "dev": true }, "caseless": { @@ -16197,6 +16203,11 @@ "integrity": "sha512-TCa7ZdxCeq6q3Rgms2JCRHTCfWAETPZ8SzYUbkYF6KR3I03sN29DaOIC+xyWboIcMvjAsD5iG2u/RWzHD8XpgQ==", "dev": true }, + "kaboom": { + "version": "2000.2.7", + "resolved": "https://registry.npmjs.org/kaboom/-/kaboom-2000.2.7.tgz", + "integrity": "sha512-CiEsmVdmufedNNvppMrVwVGYmao+WRsjE7M/TU4lFGYwUNwBPBVxORmsKvUmuvchw0cR+Dwcj1vAL+K8P06qGA==" + }, "keyv": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", @@ -16518,9 +16529,9 @@ "dev": true }, "minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.1.tgz", + "integrity": "sha512-reLxBcKUPNBnc/sVtAbxgRVFSegoGeLaSjmphNhcwcolhYLRgtJscn5mRl6YRZNQv40Y7P6JM2YhSIsbL9OB5A==", "devOptional": true, "requires": { "brace-expansion": "^1.1.7" diff --git a/package.json b/package.json index cd8c906..204d3d5 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "ant-plus": "0.1.24", "finalhandler": "1.1.2", "form-data": "4.0.0", + "kaboom": "2000.2.7", "lit": "2.1.3", "loglevel": "1.8.0", "nosleep.js": "0.12.0",