From c72fe44cfa2d92a1fe57601a62551e5cece6b6dc Mon Sep 17 00:00:00 2001 From: "Aaron D. Lee" Date: Mon, 26 Jan 2026 15:04:23 -0500 Subject: [PATCH] More host UI refinements, intuitive UI enhancements during gameplay pt 3. --- client/app.js | 31 ++++++++++++++++++++++++++----- client/style.css | 19 +++++++++++++++---- server/games.db | Bin 17657856 -> 17678336 bytes 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/client/app.js b/client/app.js index f2fc739..768386b 100644 --- a/client/app.js +++ b/client/app.js @@ -206,8 +206,8 @@ class GolfGame { this.joinRoomBtn.addEventListener('click', () => { this.playSound('click'); this.joinRoom(); }); this.startGameBtn.addEventListener('click', () => { this.playSound('success'); this.startGame(); }); this.leaveRoomBtn.addEventListener('click', () => { this.playSound('click'); this.leaveRoom(); }); - this.deck.addEventListener('click', () => { this.playSound('card'); this.drawFromDeck(); }); - this.discard.addEventListener('click', () => { this.playSound('card'); this.drawFromDiscard(); }); + this.deck.addEventListener('click', () => { this.drawFromDeck(); }); + this.discard.addEventListener('click', () => { this.drawFromDiscard(); }); this.discardBtn.addEventListener('click', () => { this.playSound('card'); this.discardDrawn(); }); this.skipFlipBtn.addEventListener('click', () => { this.playSound('click'); this.skipFlip(); }); this.nextRoundBtn.addEventListener('click', () => { this.playSound('click'); this.nextRound(); }); @@ -633,15 +633,27 @@ class GolfGame { // Game Actions drawFromDeck() { - if (!this.isMyTurn() || this.drawnCard || this.gameState.has_drawn_card) return; + if (!this.isMyTurn() || this.drawnCard || this.gameState.has_drawn_card) { + if (this.gameState && !this.gameState.waiting_for_initial_flip) { + this.playSound('reject'); + } + return; + } if (this.gameState.waiting_for_initial_flip) return; + this.playSound('card'); this.send({ type: 'draw', source: 'deck' }); } drawFromDiscard() { - if (!this.isMyTurn() || this.drawnCard || this.gameState.has_drawn_card) return; + if (!this.isMyTurn() || this.drawnCard || this.gameState.has_drawn_card) { + if (this.gameState && !this.gameState.waiting_for_initial_flip) { + this.playSound('reject'); + } + return; + } if (this.gameState.waiting_for_initial_flip) return; if (!this.gameState.discard_top) return; + this.playSound('card'); this.send({ type: 'draw', source: 'discard' }); } @@ -1142,6 +1154,15 @@ class GolfGame { const card = myData.cards[position]; + // Check if action is allowed - if not, play reject sound + const canAct = this.gameState.waiting_for_initial_flip || + this.drawnCard || + this.waitingForFlip; + if (!canAct) { + this.playSound('reject'); + return; + } + // Initial flip phase if (this.gameState.waiting_for_initial_flip) { if (card.face_up) return; @@ -1503,7 +1524,7 @@ class GolfGame { // Toggle not-my-turn class to disable hover effects when it's not player's turn const isMyTurn = this.isMyTurn(); - this.playerArea.classList.toggle('not-my-turn', !isMyTurn); + this.gameScreen.classList.toggle('not-my-turn', !isMyTurn); // Update status message (handled by specific actions, but set default here) const currentPlayer = this.gameState.players.find(p => p.id === this.gameState.current_player_id); diff --git a/client/style.css b/client/style.css index 34567d3..231fbbc 100644 --- a/client/style.css +++ b/client/style.css @@ -786,11 +786,22 @@ input::placeholder { } /* Disable hover effects when not player's turn */ -.not-my-turn .card { +#game-screen.not-my-turn .card { cursor: default; } -.not-my-turn .card:hover { +#game-screen.not-my-turn .card:hover { + transform: none; + box-shadow: none; +} + +#game-screen.not-my-turn #deck, +#game-screen.not-my-turn #discard { + cursor: default; +} + +#game-screen.not-my-turn #deck:hover, +#game-screen.not-my-turn #discard:hover { transform: none; box-shadow: none; } @@ -1834,11 +1845,11 @@ input::placeholder { } /* Disable hover effects when not player's turn */ -.not-my-turn .real-card { +#game-screen.not-my-turn .real-card { cursor: default; } -.not-my-turn .real-card:hover { +#game-screen.not-my-turn .real-card:hover { transform: none; } } diff --git a/server/games.db b/server/games.db index 8a2a54438c87f0fb35f71adcd5a23646a1859b80..112acbbca43beea379ba2cf38e2a7a43fcc2aca5 100644 GIT binary patch delta 5146 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 delta 1982 zcmZ9~dsq}z7zXe;b7ppDc3EUW$Uu?g5}4?E*Hi>Vyk%nIC8ZQa1T|X)!>nutZB0$q z3XfM@5=%`J&}B4~wJa?$Kv5UW3lLs{G)mK5%<^6BADid-z0b^l53LMI4>&JYC8K^F*y5D0}Zcpkzb0=mKr&QBE3t8@z+rbJ2@EPoYLf8qP!xyj%cEcX{686GA_zLzz5fnoS9DsvhgHll7 z5FCcDp$v||Q78vH9D{G*TR0Bi!S`?iPQnlHqjEL&ROnICoF`WFwMA9zAat1AN2w{nJn@Ltjca~^%%x5OkR!=!~cI3?dsr@2n zGQIJ7#FN6@vO2o5Yp4!6^mrJS9BWBb4i`8c@Q-J}M8P$U^(%A)vx(w=cVq)I6gnc5 zhdUjYC1#XIUSPf>?uVGq?RP*e)WJpg87{$PxB^$99vYw#et{;q2G`*R+=O41bNibk zjcPHItDq$uGwOANmAIgm7>Xkm$;wNeI>jE`Vk4B}IHo_QN`2gBZVqjM-{2P9hTowT z{(wK>4%~&m;2zvpnnRr(R=2MtetbHW$I4N14>?HI%e-`lNnW~1Y)X+cT|UU~w9QtTWUbDBTSU*XU5F20q&K|9g*R7-g}fsUpzbO7x^!)P8| zOLOQ_YNV+&iQcA7^dhaMC+HDcLU+-8mS61j z6=wr!=Se&BDT|V`rl-uFHE*cMGDBPDDCvitb5)T~zw&wd@qZu6rN^8kS}k_t;)JOj zvzUCk+M->H+{GzD{YomDXOz=87f6ztxYDZJifPNZmesA2kZYM zSgn`C?$OE<1690RYcxD2Q=1!jk0%J~4uRMM?}_BvD3NPcUE=If(JEpQZ3ZFk$#A(% z@hW0(idU1M2;s7z;_Q|9-AQ7vTBs&>$o3VPY7%ExAr+bFz5L47CwMaJN=dMdS9<)%@IAY^xF+@W=c2eGG79od>BQ(+J1F;ZG4VBw25 R5hcjjOQ7~WDLOJq`v@wDXv_cr