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¶
- 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.
- 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.
- Partie : à son tour, le joueur fait une action sur la grille adverse : envoyer une onde, sonder une case, ou proposer la disposition complète.
- 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-coreest 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 |