import { ServerGame } from "@/hooks/serverGame"; import { SelectElement } from "./Player"; import { GameId } from "../../convex/aiTown/ids"; import Button from "./buttons/Button"; import { useQuery } from "convex/react"; import { api } from "../../convex/_generated/api"; import { Id } from '../../convex/_generated/dataModel'; import { characters } from "../../data/characters"; import { useEffect, useState } from "react"; import { BaseTexture, SCALE_MODES, Spritesheet } from "pixi.js"; import { Sprite, Stage } from "@pixi/react"; import { Character } from "./Character"; import { useSendInput } from "../hooks/sendInput"; import { GameCycle } from "../../convex/aiTown/gameCycle"; export type Vote = (id: GameId<'players'>) => void; export function VotingName(gameCycle: GameCycle) { switch (gameCycle.cycleIndex) { case 2: return { name: 'Warewolf Vote', desc: 'Select a player who is warewolf', type: 'WarewolfVote', }; case 3: return { name: 'Player Kill', desc: 'Select a player to kill', type: 'PlayerKill', }; default: return { name: 'Error', desc: 'Select a player to vote', type: 'Error' }; } } export const VoteModal = ({ worldId, engineId, game, }: { worldId: Id<'worlds'>, engineId: Id<'engines'>, game: ServerGame, }) => { const [hasVoted, setHasVoted] = useState(false); const vote = useSendInput(engineId, 'vote'); const onVote = (playerId: GameId<'players'>) => { if (hasVoted) return; vote({votedPlayerId: playerId, voteType: gameState}); setHasVoted(true); } const gameState = "warewolf-vote" const humanTokenIdentifier = useQuery(api.world.userStatus, {worldId}); const [spriteSheet, setSpriteSheet] = useState(); const character = characters[0] useEffect(() => { const parseSheet = async () => { const sheet = new Spritesheet( BaseTexture.from(character.textureUrl, { scaleMode: SCALE_MODES.NEAREST, }), character.spritesheetData, ); await sheet.parse(); setSpriteSheet(sheet); }; void parseSheet(); }, []); // TODO only let people select non-dead players const selectablePlayers = [...game.world.players.values()].filter( (player) => player.id !== humanTokenIdentifier ); return ( <>

{VotingName(game.world.gameCycle).name}

{VotingName(game.world.gameCycle).desc}

{selectablePlayers.map((playable) => { const playerDesc = game.playerDescriptions.get(playable.id); const character = characters.find((c) => c.name === playerDesc?.character); if (!character) return null; return ( <> ) })} ) }