Spaces:
Sleeping
Sleeping
| import { ObjectType, v } from "convex/values"; | |
| import { GameId, parseGameId, playerId } from "./ids"; | |
| import { Player } from "./player"; | |
| export type VoteType = 'WarewolfVote' | 'PlayerKill' | 'LLMVote' | |
| export const VotesSchema = { | |
| votesType: v.string(), | |
| votes: v.array(v.object({ | |
| playerId: playerId, | |
| voter: playerId, | |
| })) | |
| } | |
| export type SerializedVotes = ObjectType<typeof VotesSchema>; | |
| export class Votes { | |
| votesType: string; | |
| votes: { | |
| playerId: GameId<'players'>; | |
| voter: GameId<'players'>; | |
| }[]; | |
| constructor(serialized: SerializedVotes) { | |
| const { votesType, votes } = serialized; | |
| this.votesType = votesType; | |
| this.votes = votes.map((vote) => ({ | |
| playerId: parseGameId('players', vote.playerId), | |
| voter: parseGameId('players', vote.voter), | |
| })); | |
| } | |
| serialize(): SerializedVotes { | |
| const { votesType, votes } = this; | |
| return { | |
| votesType, | |
| votes, | |
| }; | |
| } | |
| } | |
| export const processVotes = (votes: Votes, players: Player[], k: number = 1) => { | |
| // Select the players with the most votes | |
| const voteCounts: Record<GameId<'players'>, number> = {}; | |
| players.forEach(player => { | |
| voteCounts[player.id] = 0; | |
| }); | |
| // Tally the votes | |
| votes.votes.forEach(vote => { | |
| voteCounts[vote.playerId] = (voteCounts[vote.playerId] || 0) + 1; | |
| }); | |
| const sortedVoteCounts = Object.entries(voteCounts).sort((a, b) => b[1] - a[1]); | |
| const topKPlayers = sortedVoteCounts.slice(0, k).map(entry => entry[0]); | |
| return topKPlayers as GameId<'players'>[]; | |
| } | |