From 67b61eceb8173c4890082ea87a8bd14db425e200 Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 19 Aug 2026 18:41:18 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20impl=C3=A9mentation=20de=20la=20section?= =?UTF-8?q?=20R=C3=A8gles=20des=20jeux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Les activités RulesListActivity et RuleDetailActivity étaient des stubs vides (TODO) -> écran noir depuis la migration du hub. - Liste des 3 jeux (Classic, 89++, Papelito) dans le style du hub - Fiche de règles détaillées par jeu (déroulement, valeurs spéciales, conditions de victoire), écrites à partir du comportement réel du code - Bouton «Jouer maintenant» ouvrant directement la configuration du jeu --- .../boidelov3/rules/RuleDetailActivity.java | 62 +++- .../boidelov3/rules/RulesListActivity.java | 37 +- .../main/res/layout/activity_rule_detail.xml | 123 +++++++ .../main/res/layout/activity_rules_list.xml | 321 ++++++++++++++++++ app/src/main/res/values/strings.xml | 8 + 5 files changed, 545 insertions(+), 6 deletions(-) create mode 100644 app/src/main/res/layout/activity_rule_detail.xml create mode 100644 app/src/main/res/layout/activity_rules_list.xml diff --git a/app/src/main/java/com/example/boidelov3/rules/RuleDetailActivity.java b/app/src/main/java/com/example/boidelov3/rules/RuleDetailActivity.java index e110ef2..3cf4c21 100644 --- a/app/src/main/java/com/example/boidelov3/rules/RuleDetailActivity.java +++ b/app/src/main/java/com/example/boidelov3/rules/RuleDetailActivity.java @@ -1,12 +1,68 @@ package com.example.boidelov3.rules; +import android.content.Intent; import android.os.Bundle; -import android.app.Activity; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; + +import com.example.boidelov3.R; +import com.google.android.material.appbar.MaterialToolbar; +import com.google.android.material.button.MaterialButton; + +/** + * Règles détaillées d'un jeu, avec accès direct à sa configuration + */ +public class RuleDetailActivity extends AppCompatActivity { -public class RuleDetailActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - // TODO: Implement rule detail screen + setContentView(R.layout.activity_rule_detail); + + MaterialToolbar toolbar = findViewById(R.id.toolbar); + toolbar.setNavigationOnClickListener(v -> finish()); + + String gameId = getIntent().getStringExtra(RulesListActivity.EXTRA_GAME_ID); + if (gameId == null) { + gameId = RulesListActivity.GAME_CLASSIC; + } + + int iconRes = R.drawable.ic_boidelo_classic; + int titleRes = R.string.boidelo_classic_title; + int summaryRes = R.string.boidelo_classic_description; + int detailRes = R.string.rules_classic_detail; + Class setupActivity = com.example.boidelov3.games.boideloclassic.BoideloClassicSetupActivity.class; + + switch (gameId) { + case RulesListActivity.GAME_89: + iconRes = R.drawable.ic_game_89; + titleRes = R.string.game_89_title; + summaryRes = R.string.game_89_description; + detailRes = R.string.rules_89_detail; + setupActivity = com.example.boidelov3.games.game89.Game89SetupActivity.class; + break; + case RulesListActivity.GAME_PAPELITO: + iconRes = R.drawable.ic_papelito; + titleRes = R.string.rules_papelito_title; + summaryRes = R.string.undercover_description; + detailRes = R.string.rules_papelito_detail; + setupActivity = com.example.boidelov3.games.papelito.PapelitoSetupActivity.class; + break; + default: + break; + } + + toolbar.setTitle(getString(titleRes)); + ((ImageView) findViewById(R.id.ruleIcon)).setImageResource(iconRes); + ((TextView) findViewById(R.id.ruleTitle)).setText(titleRes); + ((TextView) findViewById(R.id.ruleSummary)).setText(summaryRes); + ((TextView) findViewById(R.id.ruleText)).setText(detailRes); + + MaterialButton playButton = findViewById(R.id.playButton); + final Class targetActivity = setupActivity; + playButton.setOnClickListener(v -> + startActivity(new Intent(this, targetActivity))); } } diff --git a/app/src/main/java/com/example/boidelov3/rules/RulesListActivity.java b/app/src/main/java/com/example/boidelov3/rules/RulesListActivity.java index 4020e2f..7fd2a4c 100644 --- a/app/src/main/java/com/example/boidelov3/rules/RulesListActivity.java +++ b/app/src/main/java/com/example/boidelov3/rules/RulesListActivity.java @@ -1,12 +1,43 @@ package com.example.boidelov3.rules; +import android.content.Intent; import android.os.Bundle; -import android.app.Activity; -public class RulesListActivity extends Activity { +import androidx.appcompat.app.AppCompatActivity; + +import com.example.boidelov3.R; +import com.google.android.material.appbar.MaterialToolbar; + +/** + * Liste des règles : une carte par jeu, ouvre le détail des règles + */ +public class RulesListActivity extends AppCompatActivity { + + /** Identifiant du jeu dont on veut les règles */ + public static final String EXTRA_GAME_ID = "RULES_GAME_ID"; + public static final String GAME_CLASSIC = "classic"; + public static final String GAME_89 = "89"; + public static final String GAME_PAPELITO = "papelito"; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - // TODO: Implement rules list screen + setContentView(R.layout.activity_rules_list); + + MaterialToolbar toolbar = findViewById(R.id.toolbar); + toolbar.setNavigationOnClickListener(v -> finish()); + + findViewById(R.id.cardClassic).setOnClickListener(v -> openRules(GAME_CLASSIC)); + findViewById(R.id.card89).setOnClickListener(v -> openRules(GAME_89)); + findViewById(R.id.cardPapelito).setOnClickListener(v -> openRules(GAME_PAPELITO)); + } + + /** + * Ouvre l'écran de règles détaillées du jeu choisi + */ + private void openRules(String gameId) { + Intent intent = new Intent(this, RuleDetailActivity.class); + intent.putExtra(EXTRA_GAME_ID, gameId); + startActivity(intent); } } diff --git a/app/src/main/res/layout/activity_rule_detail.xml b/app/src/main/res/layout/activity_rule_detail.xml new file mode 100644 index 0000000..7bda03d --- /dev/null +++ b/app/src/main/res/layout/activity_rule_detail.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_rules_list.xml b/app/src/main/res/layout/activity_rules_list.xml new file mode 100644 index 0000000..de04c1d --- /dev/null +++ b/app/src/main/res/layout/activity_rules_list.xml @@ -0,0 +1,321 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9ac5f1f..1be869b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -77,4 +77,12 @@ Tester la connexion + + Règles des jeux + Choisissez un jeu pour découvrir ses règles + Jouer maintenant + Papelito (Undercover) + Comment jouer ?\n\n1. Ajoutez au moins 3 joueurs, puis choisissez le nombre de questions et le nombre de gorgées.\n\n2. À chaque manche, l\'application pose une question du type « Ceux/Celles qui… » : tous les joueurs concernés boivent le nombre de gorgées affiché.\n\n3. Certaines questions permettent au joueur désigné de distribuer ses gorgées aux autres.\n\nLes défis à manches\n\nCertaines questions imposent une contrainte qui dure plusieurs manches (parler au passé, interdiction de rire…). La contrainte reste affichée en haut de l\'écran : celui qui ne la respecte pas boit !\n\nLe bouton « Passer » abandonne le défi en cours et enchaîne sur la question suivante.\n\nBon à savoir\n\n• Une question déjà posée ne revient pas tant que le stock n\'est pas épuisé.\n• Activez l\'option IA dans les paramètres pour générer des questions inédites (OpenAI, OpenRouter, Z.AI).\n• En fin de partie, l\'application affiche les statistiques de la soirée. + Le principe\n\n89++ se joue avec de vraies cartes (32 ou 52). L\'application sert d\'arbitre : elle gère le timer des défis et le compteur de gorgées.\n\nLes joueurs posent chacun leur tour une carte en annonçant le total cumulé à voix haute. Le joueur qui atteint ou dépasse 89 a perdu !\n\nValeurs spéciales\n\n• Valet : -10\n• Dame : change le sens du jeu\n• Roi : le joueur choisit la valeur\n\nLes gorgées\n\nÀ chaque dizaine atteinte (10, 20, 30…), distribuez autant de gorgées que la valeur de la dizaine. Attention, 70 = double : 14 gorgées à distribuer !\n\nLes défis\n\nUn compte à rebours s\'affiche en haut de l\'écran. Quand il se termine, un carillon retentit et un défi aléatoire apparaît : réalisez-le, puis touchez le défi pour relancer le compte à rebours.\n\nLe bouton « Enregistrer des gorgées » suit ce que boit chaque joueur, et les statistiques sont consultables à tout moment. + Le principe\n\nChaque joueur reçoit un mot secret… sauf les undercovers, qui reçoivent un mot légèrement différent du même univers.\n\nDéroulement d\'un tour\n\n1. Révélation : passez le téléphone, chaque joueur découvre son mot en privé.\n\n2. Discussion : à tour de rôle, chacun décrit son mot en une phrase, sans le dire. Les undercovers doivent improviser sans se faire repérer !\n\n3. Vote : chaque joueur vivant vote pour éliminer le plus suspect.\n\nFin de partie\n\n• Si tous les undercovers sont éliminés, les civils gagnent.\n• Si les undercovers résistent jusqu\'à la fin, ils gagnent !\n\nLes deux mots sont révélés à la fin de la partie.\n\nPersonnalisation\n\nDans la configuration, choisissez le nombre d\'undercovers et la durée de la discussion. \ No newline at end of file