Aller au contenu

Orapa Mine

Adaptation web du jeu de déduction Orapa Mine (Junghee Choi & Wanjin Gill, Playte 2024 / Miraludo 2026) : duel en ligne à 2 joueurs, plus un mode solo d'entraînement.

Chaque joueur cache des gemmes aux formes tangram sur une grille 10×8. L'adversaire envoie des ondes depuis le pourtour et déduit la disposition à partir du point de sortie et de la couleur de chaque onde.

Ressource Détail
Production https://orapamine.dunkan.xyz
Dépôt https://github.com/DuncanCos/orapamine (branche main)
Hébergement Dokploy, Docker Compose, redéploiement automatique à chaque push sur main (voir Déploiement)
Langue Interface, commentaires, commits et README en français

Le jeu en bref

  1. Lobby : on choisit un pseudo et les options, puis on crée une partie (on reçoit un code de 5 lettres à partager), on en rejoint une avec un code, ou on lance une partie solo.
  2. Placement : chaque joueur pose ses 5 gemmes (rouge, jaune, bleue, 2 blanches, plus le Diamant et le Corps noir si les extensions sont activées) en respectant les contraintes de placement.
  3. Partie : à son tour, le joueur fait une action sur la grille adverse : envoyer une onde, sonder une case, ou proposer la disposition complète.
  4. Fin : une proposition juste fait gagner (avec une règle de mort subite pour le premier joueur). Une proposition fausse coûte une vie.

Détail complet : Règles du jeu.

Stack

Couche Technologies
Moteur de jeu Rust (édition 2021), serde, rand
Serveur axum 0.7 (WebSocket), tokio, tower-http (fichiers statiques), dashmap, uuid, tracing
Client React 19, TypeScript, Vite, zustand (état global)
Pont moteur → navigateur WebAssembly via wasm-bindgen 0.2.127
Qualité cargo test, cargo clippy, tsc -b, oxlint
Livraison Image Docker multi-étapes, Docker Compose, Dokploy

Composants

Composant Chemin Rôle
orapa-core crates/orapa-core Moteur pur : géométrie, tracé des ondes, mélange des couleurs, validation de placement, comparaison de solution, tirage aléatoire. Sans dépendance UI ni réseau.
orapa-server crates/orapa-server Serveur axum : WebSocket /ws, machine à états par partie, service des fichiers statiques du client.
orapa-wasm crates/orapa-wasm Bindings wasm-bindgen du moteur pour le navigateur (catalogue, validation en direct, mode aide).
orapa-cli crates/orapa-cli Démo ASCII du moteur en ligne de commande.
orapa-web web/ Client React + TypeScript (Vite).
Catalogue data/pieces.json Formes des pièces, dimensions de la grille, contrainte de symétrie des blanches. Embarqué à la compilation.

Principes de conception

  • Un seul moteur : orapa-core est l'unique implémentation des règles. Le serveur l'utilise en Rust natif, le client en WebAssembly.
  • Autorité serveur : tirs, sondages et vérification des solutions sont calculés côté serveur. Les dispositions secrètes ne partent jamais vers l'adversaire avant la fin de partie.
  • Pas de base de données : les parties vivent en mémoire dans le processus serveur. Un redémarrage (donc un redéploiement) perd les parties en cours.

Pages de cette documentation

Page Contenu
Règles du jeu Plateau, pièces, contraintes, tracé des ondes, couleurs, tours et fin de partie, tels que codés
Architecture Workspace Rust, serveur, client React, WebAssembly, flux client/serveur
Protocole WebSocket Messages client → serveur et serveur → client, états de partie, codes d'erreur
Développement Lancer en local, tests, CLI, fichiers à garder synchronisés
Déploiement Image Docker, Compose, Dokploy, redéploiement