diff --git a/README.md b/README.md new file mode 100644 index 0000000..a7a3886 --- /dev/null +++ b/README.md @@ -0,0 +1,372 @@ +
+ +# đŸŽČ Boidelo + +**L'application de jeux de soirĂ©e — questions, dĂ©fis et cartes entre amis** + +![Android](https://img.shields.io/badge/Android-7.0%2B-3DDC84?logo=android) +![Java](https://img.shields.io/badge/Java-8-orange?logo=java) +![Gradle](https://img.shields.io/badge/Gradle-8.12.0-02303A?logo=gradle) +![SDK](https://img.shields.io/badge/compileSdk-35-34A853?logo=android) +![License](https://img.shields.io/badge/License-Private-grey) + +
+ +--- + +## 📖 Description + +**Boidelo** est une application Android de jeux de soirĂ©e regroupant plusieurs mini-jeux autour d'un hub central. Entrez les noms des joueurs, choisissez un jeu, et laissez l'ambiance opĂ©rer ! + +L'application propose trois jeux distincts ainsi qu'un consulteur de rĂšgles de jeux d'ambiance populaires. + +--- + +## 🎼 Jeux disponibles + +### 1. Boidelo Classic + +Le jeu original de questions et dĂ©fis. InspirĂ© de jeux comme *King's Cup* ou *Never Have I Ever*. + +- **150+ questions** prĂ©chargĂ©es depuis un fichier JSON, avec 10 catĂ©gories distinctes +- Questions dynamiques avec remplacement de variables (``, ``, ``, ``) +- **DĂ©fis multi-manches** avec compte Ă  rebours et message de fin +- Gestion intelligente : pas d'accumulation de dĂ©fis simultanĂ©s +- SystĂšme de **gorgĂ©es** (boire / distribuer) avec accord grammatical automatique +- CatĂ©gorisation automatique des questions avec couleur de fond dynamique : + - Ciblage, Classement, Jugement, Duel, Interactif, DĂ©fi, Variante, Caliente, Vote, Classique +- ParamĂštres personnalisables : nombre de questions, gorgĂ©es supplĂ©mentaires, durĂ©e des dĂ©fis +- **IntĂ©gration OpenAI** (optionnelle) pour gĂ©nĂ©rer des questions via ChatGPT + +### 2. 89++ + +Un jeu de cartes avec timer et dĂ©fis spĂ©ciaux. + +- Objectif : ne pas ĂȘtre celui qui atteint ou dĂ©passe **89** +- RĂšgles spĂ©ciales : Valet (−10), Dame (changement de sens), Roi (choix de valeur) +- GorgĂ©es distribuĂ©es Ă  chaque dizaine atteinte (70 = double !) +- **9 types de dĂ©fis** alĂ©atoires : + - Changement de sens, ImmunitĂ©, GorgĂ©e surprise, Joker (passer son tour), Échange de mains, Double prochaine valeur, Compte mystĂšre, Tour gĂ©nĂ©rale, Victime au choix +- Timer configurable pour les dĂ©fis +- Suivi des gorgĂ©es par joueur + +### 3. Papelito (Undercover) + +Un jeu de dĂ©duction sociale. Trouvez l'Undercover avant qu'il ne soit trop tard ! + +- **20 paires de mots** prĂ©chargĂ©es (Pizza/Burger, Chat/Chien, Vin/BiĂšre, etc.) +- Attribution alĂ©atoire des rĂŽles : **Civil**, **Undercover**, **Mr. White** +- MĂ©canique de **discussion → vote → Ă©limination** +- Conditions de victoire : + - Civils gagnent si tous les Undercovers sont Ă©liminĂ©s + - Undercovers gagnent s'ils sont en nombre ≄ aux Civils +- Gestion des Ă©galitĂ©s de votes (personne n'est Ă©liminĂ©) +- Machine Ă  Ă©tats avec validation des transitions lĂ©gales + +### 4. RĂšgles de jeux + +Consultez les rĂšgles des jeux d'ambiance populaires directement dans l'application. + +--- + +## 🏗 Architecture + +### Vue d'ensemble + +Boidelo suit un pattern **Repository + SĂ©paration des responsabilitĂ©s**. Chaque jeu est isolĂ© dans son propre package avec sa propre logique mĂ©tier. + +``` +app/src/main/java/com/example/boidelov3/ +├── hub/ # Hub central +│ ├── GameSelectionActivity.java # ActivitĂ© LAUNCHER (point d'entrĂ©e) +│ ├── adapter/ +│ │ └── GameAdapter.java # RecyclerView adapter +│ └── model/ +│ └── GameInfo.java # ModĂšle (nom, description, icĂŽne, type) +│ +├── games/ # Jeux isolĂ©s par package +│ ├── boideloclassic/ # Boidelo Classic +│ │ ├── BoideloClassicSetupActivity.java +│ │ ├── BoideloClassicParamsActivity.java +│ │ ├── BoideloClassicGameActivity.java +│ │ └── manager/ +│ │ ├── BoideloPlayerManager.java +│ │ └── BoideloPlayerRowManager.java +│ ├── game89/ # 89++ +│ │ ├── Game89SetupActivity.java +│ │ ├── Game89GameActivity.java +│ │ ├── Game89Player.java # ModĂšle joueur +│ │ └── Game89ChallengeManager.java # Gestionnaire de dĂ©fis +│ └── papelito/ # Papelito (Undercover) +│ ├── PapelitoSetupActivity.java +│ ├── PapelitoGameActivity.java +│ ├── PapelitoResultActivity.java +│ ├── PapelitoResultAdapter.java +│ ├── PapelitoGame.java # Logique complĂšte du jeu +│ └── PapelitoPlayer.java # ModĂšle joueur (Serializable) +│ +├── data/ # Couche d'accĂšs aux donnĂ©es +│ ├── QuestionRepository.java # Chargement JSON + SharedPreferences +│ ├── Result.java # Wrapper type-safe succĂšs/erreur +│ ├── PlayerStats.java # Stats joueur (Parcelable) +│ └── QuestionCategory.java # CatĂ©gorisation + couleurs +│ +├── game/ # Logique mĂ©tier commune +│ └── GameEngine.java # Moteur de jeu (pur Java) +│ +├── utils/ # Utilitaires +│ ├── ErrorHandler.java +│ ├── SecureConfig.java +│ ├── SoundManager.java +│ └── SoundGenerator.java +│ +├── MainActivity.java # Legacy (Ă  supprimer) +├── Jeux.java # Legacy (Ă  supprimer) +├── JeuxParametres.java # Legacy (Ă  supprimer) +├── EndGameActivity.java # Legacy (Ă  supprimer) +├── OpenAIService.java # Service OpenAI +├── ChatGPTTask.java # Task async OpenAI +├── DatabaseConnection.java # Connexion PostgreSQL +├── Question.java # ModĂšle de question +├── Questions.java # Conteneur de questions (Gson) +├── PreferencesKeys.java # Constantes SharedPreferences +└── BoideloAnimationUtils.java # Animations UI +``` + +### Flux d'une partie + +Chaque jeu suit le mĂȘme schĂ©ma d'activitĂ© : + +``` +Hub (GameSelectionActivity) + └─â–ș Setup (saisie des joueurs) + └─â–ș Parameters (configuration, optionnel) + └─â–ș Game (partie en cours) + └─â–ș End Game (statistiques & rĂ©sultats) +``` + +### Pattern Result + +Le projet utilise un wrapper type-safe pour la gestion des erreurs, Ă©vitant les exceptions non contrĂŽlĂ©es : + +```java +Result result = repository.loadQuestions(); +if (result.isSuccess()) { + Questions questions = result.getData(); +} else { + Exception error = result.getError(); +} +``` + +--- + +## 🛠 Stack technique + +| ÉlĂ©ment | Version / DĂ©tail | +|---|---| +| **Langage** | Java 8 | +| **Min SDK** | 24 (Android 7.0) | +| **Target / Compile SDK** | 35 (Android 15) | +| **Build system** | Gradle 8.12.0 + AGP 8.12.0 | +| **UI** | Material Design 3, AppCompat 1.7.0 | +| **Layout** | ConstraintLayout 2.2.0 | +| **RĂ©seau** | OkHttp 4.12.0 | +| **JSON** | Gson 2.11.0 | +| **Base de donnĂ©es** | pgjdbc-ng 0.8.3 (PostgreSQL, actuellement inutilisĂ©) | +| **Tests unitaires** | JUnit 4.13.2, Mockito 5.7.0, Robolectric 4.11.1 | +| **Tests UI** | AndroidX Test JUnit 1.2.1, Espresso 3.6.1 | + +--- + +## đŸ§Ș Tests + +Le projet dispose de **11 classes de test** couvrant l'ensemble des jeux et des composants de donnĂ©es : + +| Classe de test | Fichier | +|---|---| +| `GameEngineTest` | `game/GameEngineTest.java` (15 tests) | +| `ResultTest` | `data/ResultTest.java` (8 tests) | +| `PlayerStatsTest` | `data/PlayerStatsTest.java` | +| `QuestionCategoryTest` | `data/QuestionCategoryTest.java` | +| `QuestionTest` | `QuestionTest.java` | +| `QuestionsClassTest` | `QuestionsClassTest.java` | +| `BoideloPlayerManagerTest` | `games/boideloclassic/manager/BoideloPlayerManagerTest.java` | +| `Game89PlayerTest` | `games/game89/Game89PlayerTest.java` | +| `Game89ChallengeManagerTest` | `games/game89/Game89ChallengeManagerTest.java` | +| `PapelitoPlayerTest` | `games/papelito/PapelitoPlayerTest.java` | +| `PapelitoGameTest` | `games/papelito/PapelitoGameTest.java` | + +--- + +## 🔹 Compilation et installation + +### PrĂ©requis + +- **Android Studio** (recommandĂ©) ou **JDK 17-21** + SDK Android +- Android SDK avec compileSdk 35 + +### Build depuis la ligne de commande + +```bash +# Cloner le projet +git clone +cd boidelo + +# Build +./gradlew build + +# APK debug +./gradlew assembleDebug + +# Installer sur un appareil connectĂ© +adb install -r app/build/outputs/apk/debug/app-debug.apk +``` + +### ExĂ©cuter les tests + +```bash +# Tous les tests unitaires +./gradlew test + +# Tests instrumentĂ©s (appareil/Ă©mulateur requis) +./gradlew connectedAndroidTest + +# Test spĂ©cifique +./gradlew test --tests com.example.boidelov3.game.GameEngineTest +``` + +> ⚠ **Note :** Un bug connu avec Gradle 8.13 peut causer l'Ă©chec des tests unitaires en CLI. Utilisez Android Studio ou un JDK 17-21 pour contourner le problĂšme. + +### Clean + +```bash +./gradlew clean +``` + +--- + +## 🎹 Interface + +- **Material Design 3** avec composants modernes (MaterialCardView, TextInputLayout, etc.) +- **Mode sombre** avec thĂšmes dĂ©diĂ©s (`values-night/`) +- **Animations fluides** : fade in/out, slide, color transition, button press/release +- **Feedback haptique** et effets sonores via `SoundManager` / `SoundGenerator` +- **Palette principale** : Violet (`#9395D3`) / Lavande (`#B3B7EE`) sur fond blanc cassĂ© (`#FBF9FF`) +- Couleurs dynamiques par catĂ©gorie de question (10 couleurs distinctes) +- Toutes les activitĂ©s en mode **portrait** + +--- + +## 📁 Structure des ressources + +``` +app/src/main/res/ +├── anim/ # 10 animations (slide, fade, button, color) +├── drawable/ # IcĂŽnes de jeux, boutons, fonds +├── layout/ # 19 layouts XML +│ ├── activity_game_selection.xml # Hub principal +│ ├── activity_boidelo_classic_setup.xml +│ ├── activity_boidelo_classic_params.xml +│ ├── activity_boidelo_classic_game.xml +│ ├── activity_game89_setup.xml +│ ├── activity_game89_game.xml +│ ├── activity_papelito_setup.xml +│ ├── activity_papelito_game.xml +│ ├── activity_papelito_result.xml +│ ├── dialog_papelito_vote.xml +│ └── dialog_papelito_word_reveal.xml +├── values/ # Strings, couleurs, thĂšmes, styles +├── values-night/ # Variantes mode sombre +├── mipmap-*/ # IcĂŽnes launcher (mdpi → xxxhdpi) +└── xml/ # Backup rules, data extraction rules +``` + +--- + +## 📊 DonnĂ©es + +Les questions de Boidelo Classic sont stockĂ©es dans `app/src/main/assets/question.json`. Chaque question contient : + +- `id` — identifiant unique +- `question` — texte avec placeholders (``, ``, ``) +- `gorger` — nombre de gorgĂ©es +- `distribution` / `recois` — flags pour boire ou distribuer +- `variante` — liste de variantes alternatives +- `manches` — nombre de manches pour les dĂ©fis +- `arret` — message de fin de dĂ©fi + +--- + +## 🔐 Configuration + +### ClĂ© API OpenAI (optionnel) + +Les clĂ©s sensibles sont stockĂ©es dans `local.properties` (non versionnĂ©) : + +```properties +OPENAI_API_KEY=sk-votre-cle-ici +``` + +La classe `SecureConfig` fournit un accĂšs sĂ©curisĂ© Ă  ces valeurs. + +### Base de donnĂ©es PostgreSQL + +La connexion PostgreSQL est prĂ©parĂ©e mais le backend n'est pas encore en production. Les identifiants BuildConfig sont intentionnellement vides — l'usage d'une API backend est recommandĂ©. + +--- + +## 🚀 Ajouter un nouveau jeu + +1. CrĂ©er un package sous `com.example.boidelov3.games.` +2. ImplĂ©menter les activitĂ©s **Setup**, **Game** et **Result** (suivre le flux standard) +3. Ajouter une valeur Ă  l'enum `GameInfo.GameType` +4. Enregistrer le jeu dans `GameSelectionActivity.setupGamesList()` +5. Ajouter le cas dans le `switch` de `GameSelectionActivity.onItemClick()` +6. DĂ©clarer les activitĂ©s dans `AndroidManifest.xml` avec `screenOrientation="portrait"` +7. Ajouter l'icĂŽne drawable `ic_.xml` +8. Écrire les tests unitaires correspondants + +--- + +## 📝 Conventions + +- **Langue mĂ©tier** : français (`gorgees`, `manches`, `caliente`) +- **Code technique** : anglais (`allPlayers`, `activeManches`) +- **Interface utilisateur** : français +- **ClĂ©s SharedPreferences** : centralisĂ©es dans `PreferencesKeys.java` +- **Nommage layouts** : `activity__<Ă©cran>.xml`, `dialog__.xml` +- **Nommage strings** : prĂ©fixe par jeu (`papelito_`, `boidelo_`, `game89_`) + +--- + +## 📋 Statut des fonctionnalitĂ©s + +| FonctionnalitĂ© | Statut | +|---|---| +| Hub de sĂ©lection de jeux | ✅ OpĂ©rationnel | +| Boidelo Classic (150+ questions) | ✅ OpĂ©rationnel | +| 89++ (cartes + dĂ©fis) | ✅ OpĂ©rationnel | +| Papelito / Undercover | ✅ OpĂ©rationnel | +| RĂšgles de jeux | 🚧 En cours | +| IntĂ©gration OpenAI (questions IA) | 🚧 En dĂ©veloppement | +| Connexion PostgreSQL | 🔧 PrĂȘte (backend requis) | +| Mode sombre | ✅ OpĂ©rationnel | +| Tests unitaires (11 classes) | ✅ OpĂ©rationnel | + +--- + +## 📚 Documentation supplĂ©mentaire + +- [`ANALYSE_CODE.md`](ANALYSE_CODE.md) — Analyse dĂ©taillĂ©e du code (ancienne architecture) +- [`README_ARCHITECTURE.md`](README_ARCHITECTURE.md) — Documentation de l'architecture Repository +- [`CLAUDE.md`](CLAUDE.md) — Guide de dĂ©veloppement pour l'IA + +--- + +## 📄 Licence + +Projet privĂ© — tous droits rĂ©servĂ©s. + +--- + +*Boidelo — buvez responsable* đŸ»