CIELO-la / loteria

A lotería game with multi-language support focused on enabling play in indigenous languages
6 stars 2 forks source link

https://cielo-la.github.io/loteria/

Lotería pero en su lengua

El juego de cartas de lotería mexicana.

Implementación

Por ahora realizado con React, y custom js en ./src/Game. Antes con boardgame.io pero no tuvimos éxito porque nuestra concepto del juego no tiene ni turnos ni fases (aparte del cantor que nomás aumenta la gama de elecciones válidas).

Running Locally

Tareas

Aprendizaje improvisado

// Ejemplo del error semántico
const c = [[0, 1, 2], [1, 2, 3], [2, 3, 4]];
const a = [true, false, true, true, true];
const listOfWins = c.reduce((nextC, accA) => (  // en vez de pensar en (acc, next)
    [
        ...accA,
        !([...nextC.map(i => a[i])].includes(false))
    ]
), []);
// [2, 3, 4, false] en vez de [false, false, true]
console.log(listOfWins);
const didWin = listOfWins.includes(true);
// false en vez de true
console.log(didWin);

// Hipótesis: la penúltima condición determina el valor del booleano final
// las otras nomás almacenan o agregan números
//
// Demostración:
//
// entradas:
//  c = [[0, 1, 2], [1, 2, 3], [2, 3, 4]];
//  a = [false, false, false, false, false];
// salidas:
// ([], [0, 1, 2]) => [0, 1, 2, false !in []]
// ([0, 1, 2, true], [1, 2, 3])  => [1, 2, 3, false !in [a[0], a[1], a[2], a[true]]]
// ([1, 2, 3, false], [2, 3, 4]) => [2, 3, 4, false !in [a[1], a[2], a[3], a[false]]]
// => [2, 3, 4, false] => false
//
// entradas:
//  c = [[0, 1, 2], [1, 2, 3], [2, 3, 4]];
//  a = [true, true, true, true, true];
// salidas:
// ([], [0, 1, 2]) => [0, 1, 2, false !in []]
// ([0, 1, 2, true], [1, 2, 3])  => [1, 2, 3, false !in [a[0], a[1], a[2], a[true]]]
// ([1, 2, 3, true], [2, 3, 4]) => [2, 3, 4, false !in [a[1], a[2], a[3], a[false]]]
// => [2, 3, 4, true] => true
//
// entradas:
//  c = [[0, 1, 2], [1, 2, 3], [2, 3, 4]];
//  a = [false, false, true, true, true];
// salidas:
// ([], [0, 1, 2]) => [0, 1, 2, false !in []]
// ([0, 1, 2, true], [1, 2, 3])  => [1, 2, 3, false !in [a[0], a[1], a[2], a[true]]]
// ([1, 2, 3, false], [2, 3, 4]) => [2, 3, 4, false !in [a[1], a[2], a[3], a[false]]]
// => [2, 3, 4, false] => false
//
// entradas:
//  c = [[0, 1, 2], [1, 2, 3], [2, 3, 4]];
//  a = [false, true, true, true, false];
// salidas:
// ([], [0, 1, 2]) => [0, 1, 2, false !in []]
// ([0, 1, 2, true], [1, 2, 3])  => [1, 2, 3, false !in [a[0], a[1], a[2], a[true]]]
// ([1, 2, 3, false], [2, 3, 4]) => [2, 3, 4, false !in [a[1], a[2], a[3], a[false]]]
// => [2, 3, 4, true] => true

// probar - seleccionar el botón GANAR después de intercambiar los (acc, next) de nuevo
// - no marcar nada => false
// - marcar cada condición menos Juego.condiciones[penúltima] => false
// - marcar la condición penúltima => true
// v2 para usar consultas de base
rules_version = '2';

// abrir un bloque de reglas
service cloud.firestore { }

// `match` identifica documento, `allow` autoriza acceso
match /databases/{database}/documents {
    match /<path>/ {
      allow <action>: if <condition>;
    }
}

// ruta progresiva o sea son equivalentes:
// `match /ciudades/{ciudad} { match /hitos/{hito} {`
// `match /cities/{ciudad}/hitos/{hito} {`

// {nombre=**} para comodín con recursión
// esta ** también busca correspondencias hondas

// acciones permitidas
allow <action>:
// valores posibles
allow read, write, create, get, update, list, delete:

// condiciones
allow <action>: if <condition>
// ej si es usuario autorizado
allow read, write: if request.auth != null;
// ej solo para los datos propios del usuario
allow read, update, delete: if request.auth != null && request.auth.uid == userId;

// condición que se basa en datos del depósito
allow update: if request.resource.data.miVariable == 'valor'

// condición que se basa en la presencia de otros documentos
// aquí solo crear si existe id del usuario en otro documento
allow create: if request.auth != null && exists(/databases/$(database)/documents/usuarios/$(request.auth.uid))

// este ejemplo les permite a todos los usuarios escribir y leer todos los documentos
match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
}

// función para envolver la condición
match /databases/{database}/documents {
    function esUsuario() {
        return request.auth != null || resource.data.visibilidad == 'público'
    }
    match /ciudades/{ciudad} {
        allow read: if esUsuario();
    }
    ...
}
// no son filtros - una consulta amplísima no está permitida - en el ej anterior
// Sí:
db.collection('ciudades').where('visibilidad', '==', 'público').get()...
// No:
db.collection('ciudades').get()...

Deploy to github pages

Automatically deploys using github workflows.

You can modify this file .github/workflows/build-and-deploy.yml

Or run a manual deploy with:

npm run deploy