/** * Il telefono passa di mano in mano. Per ogni giocatore tre momenti: * l'avviso («non farti vedere»), il ruolo segreto, la conferma. Fra un giocatore * e l'altro un conto alla rovescia di 3 secondi; dopo l'ultimo parte il timer. */ import { useEffect, useState } from 'react'; import { StyleSheet, Text, View } from 'react-native'; import { Image } from 'expo-image'; import type { NativeStackScreenProps } from '@react-navigation/native-stack'; import { ruoloDi } from '../../gioco.ts'; import { FOTO_LUOGHI, FOTO_SPIA } from '../../immagini.ts'; import { suona } from '../../suoni.ts'; import { nomeLuogo, nomeRuolo } from '../../testi/index.ts'; import { COLORI, Pulsante, Riquadro, Sfondo, testi, useBloccaIndietro } from '../componenti.tsx'; import type { Schermate } from '../navigazione.ts'; import { useStato } from '../stato.tsx'; type Fase = 'avviso' | 'ruolo' | 'conferma'; export function Giro({ navigation }: NativeStackScreenProps) { const { t, lingua, imp, partita } = useStato(); const [giocatore, setGiocatore] = useState(0); const [fase, setFase] = useState('avviso'); const [conto, setConto] = useState(null); useBloccaIndietro(); useEffect(() => { if (conto === null) return; const id = setTimeout(() => { if (conto > 1) { suona('tick'); setConto(conto - 1); } else { setConto(null); setGiocatore((g) => g + 1); setFase('avviso'); } }, 1000); return () => clearTimeout(id); }, [conto]); if (!partita) return null; if (fase === 'avviso') { return ( {t('avviso.desc')} setFase('ruolo')} /> ); } if (fase === 'ruolo') { const r = ruoloDi(partita, giocatore); const spia = r === 'spia'; return ( {t('ruolo.luogo')} {spia ? '? ? ? ?' : nomeLuogo(lingua, partita.luogo)} {t('ruolo.ruolo')} {spia ? t('ruolo.spia') : nomeRuolo(lingua, partita.luogo, r)} setFase('conferma')} /> ); } const fatto = () => { if (giocatore < partita.giocatori - 1) setConto(3); else navigation.replace('Timer'); }; return ( {t('conferma.desc')} ); } const st = StyleSheet.create({ centro: { flex: 1, justifyContent: 'center' }, foto: { width: '100%', aspectRatio: 4 / 3, borderRadius: 5, borderWidth: 2, borderColor: COLORI.grigio }, });