Skip to content

Commit

Permalink
WIP update scores and bonus points at turn end
Browse files Browse the repository at this point in the history
Co-authored-by: Rich James <[email protected]>
  • Loading branch information
yndajas and Rich James committed Aug 19, 2024
1 parent 34d6d68 commit 2f52410
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 10 deletions.
7 changes: 6 additions & 1 deletion server/@types/entities.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,9 @@ type Question = {
subject: string;
};

export type { Answer, Colour, Player, Question };
type PlayerScore = {
player: Player;
score: number;
};

export type { Answer, Colour, Player, PlayerScore, Question };
4 changes: 3 additions & 1 deletion server/machines/round.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { assign, setup } from "xstate";
import type { Question } from "../@types/entities";
import type { PlayerScore, Question } from "../@types/entities";
import questions from "../data/questions.json";

const context = {
questions: questions as Question[],
playerScores: [] as PlayerScore[],
selectedQuestion: {} as Question | undefined,
bonusPoints: 0,
};

type Context = typeof context;
Expand Down
17 changes: 10 additions & 7 deletions server/models/round.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { context, roundMachine } from "../machines/round";
import { turnMachine } from "../machines/turn";
import type { SocketServer } from "../socketServer";
import { machineLogger } from "../utils/loggingUtils";
import { getUpdatedScoresAndBonusPoints } from "../utils/scoringUtils";

class Round {
machine: Actor<typeof roundMachine>;
Expand Down Expand Up @@ -46,13 +47,15 @@ class Round {
this.turnMachine.subscribe((state) => {
switch (state.value) {
case "finished": {
// TODO:
// - add logic for updating scores then checking if there's a clear winner in the round machine
// - delete the console.info below
console.info(
"turn machine finished with context:",
this.turnMachine?.getSnapshot().context,
);
this.machine.send({
type: "turnEnd",
scoresAndBonusPoints: getUpdatedScoresAndBonusPoints(
this.machine.getSnapshot().context.bonusPoints,
this.machine.getSnapshot().context.playerScores,
this.turnMachine?.getSnapshot().context.correctPlayerSocketIds ||
[],
),
});
}
}
});
Expand Down
58 changes: 57 additions & 1 deletion server/utils/scoringUtils.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,59 @@
import type { Answer, Player, PlayerScore, Question } from "../@types/entities";

const allCorrect = (
totalPlayerCount: number,
correctPlayerSocketIds: Player["socketId"][],
): boolean => {
return correctPlayerSocketIds.length === totalPlayerCount;
};

const allIncorrect = (
correctPlayerSocketIds: Player["socketId"][],
): boolean => {
return correctPlayerSocketIds.length === 0;
};

const awardPointsForCorrectAnswers = (
currentPlayerScores: PlayerScore[],
bonusPoints: number,
correctPlayerSocketIds: Player["socketId"][],
): PlayerScore[] => {
const numberOfIncorrectAnswers =
currentPlayerScores.length - correctPlayerSocketIds.length;
const pointsToAward = numberOfIncorrectAnswers + bonusPoints;

return currentPlayerScores.map(({ player, score }) => {
if (correctPlayerSocketIds.includes(player.socketId)) {
return { player, score: score + pointsToAward };
}

return { player, score };
});
};

const getUpdatedScoresAndBonusPoints = (
currentBonusPoints: number,
currentPlayerScores: PlayerScore[],
correctPlayerSocketIds: Player["socketId"][],
): { bonusPoints: number; scores: PlayerScore[] } => {
if (allCorrect(currentPlayerScores.length, correctPlayerSocketIds)) {
return { bonusPoints: currentBonusPoints + 1, scores: currentPlayerScores };
}

if (allIncorrect(correctPlayerSocketIds)) {
return { bonusPoints: 0, scores: currentPlayerScores };
}

return {
bonusPoints: 0,
scores: awardPointsForCorrectAnswers(
currentPlayerScores,
currentBonusPoints,
correctPlayerSocketIds,
),
};
};

const getCorrectSocketIdsFromAnswers = (
answers: Answer[],
correctAnswer: Question["colours"],
Expand All @@ -13,4 +69,4 @@ const getCorrectSocketIdsFromAnswers = (
.map((answer) => answer.socketId);
};

export { getCorrectSocketIdsFromAnswers };
export { getCorrectSocketIdsFromAnswers, getUpdatedScoresAndBonusPoints };

0 comments on commit 2f52410

Please sign in to comment.