fix(classic): anti-répétition persistante + cohérence des questions

Anti-répétition:
- Chaque question posée est marquée en SharedPreferences (par ID):
  elle ne revient plus, même entre les parties, tant que le stock
  de 185 questions n'est pas épuisé (reset automatique ensuite)
- Le fallback ne renvoie plus une question déjà posée

Cohérence (audit croisé JSON <-> moteur, 185 questions):
- Accord du verbe selon le sujet réel: 62 questions à sujet pluriel
  recevaient «boit» au lieu de «boivent» (isPluralSubject)
- Remplacement indépendant des balises <J1>/<J2>/<J3>: une question
  contenant <J2> sans <J1> n'affichait plus la balise brute
- Le champ arret du JSON est désormais utilisé comme message de fin
  de défi (27 messages étaient des données mortes)
- id 84: champ "distribut" (typo) jamais lu -> question muette
- 16 questions à double consigne (gorgées en dur + gorgées du moteur)
  passées en auto-suffisantes
- Balises <variante> manquantes (ids 21, 97) rétablies
- 78 corrections de langue/accord dans les textes (orthographe,
  accords m/f, variantes vieux/vieille, branché(e), fins de phrases
  incohérentes avec le verbe ajouté...)
This commit is contained in:
Roman
2026-08-19 18:41:07 +00:00
parent b3722ed776
commit de85af4e2a
4 changed files with 245 additions and 142 deletions
+116 -108
View File
@@ -17,14 +17,14 @@
}, },
{ {
"id": 3, "id": 3,
"question": "si tu n'as pas ton véritable nom sur insta", "question": "Ceux/Celles qui n'ont pas leur véritable nom sur Insta",
"gorger": 3, "gorger": 3,
"distribution": true, "distribution": true,
"recois": true "recois": true
}, },
{ {
"id": 4, "id": 4,
"question": "si tu as des photos sur insta", "question": "Ceux/Celles qui ont des photos compromettantes sur Insta",
"gorger": 3, "gorger": 3,
"distribution": true, "distribution": true,
"recois": true "recois": true
@@ -45,7 +45,7 @@
}, },
{ {
"id": 7, "id": 7,
"question": "Toutes celles (ou ceux) qui ont du verni à ongles", "question": "Toutes celles (ou ceux) qui ont du vernis à ongles",
"gorger": 3, "gorger": 3,
"distribution": true, "distribution": true,
"recois": true "recois": true
@@ -80,7 +80,7 @@
}, },
{ {
"id": 12, "id": 12,
"question": "<J1> à toi de juger : entre <J1> et <J2> qui stresse le plus pour un rien selon toi? Le perdant ", "question": "<J1>, à toi de juger : entre <J2> et <J3> qui stresse le plus pour un rien selon toi ? Le perdant ",
"gorger": 5, "gorger": 5,
"distribution": false, "distribution": false,
"recois": true "recois": true
@@ -101,12 +101,12 @@
}, },
{ {
"id": 15, "id": 15,
"question": "<J1>, donne le nombre d'habitant du/de la <variante> ( à 1 000 000 près) Si tu as faux tu bois, sinon tu ", "question": "<J1>, donne le nombre d'habitants du/de la <variante> (à 1 000 000 près). Si tu as faux, le joueur ",
"gorger": 3, "gorger": 3,
"distribution": true, "distribution": true,
"recois": false, "recois": false,
"variante": [ "variante": [
"Tadjikistant", "Tadjikistan",
"Monaco", "Monaco",
"Belgique", "Belgique",
"Suisse", "Suisse",
@@ -126,12 +126,12 @@
"id": 17, "id": 17,
"question": "<J1> à qui appartient le slogan suivant? <variante>", "question": "<J1> à qui appartient le slogan suivant? <variante>",
"variante": [ "variante": [
"Des pâtes oui mais des (panzani)", "Des pâtes oui, mais des Panzani ! (Panzani)",
" Le plaisir pour les petites faims. (Kinder Bueno)", " Le plaisir pour les petites faims. (Kinder Bueno)",
"Réveillez le lion qui est en vous. (Cereale lion)", "Réveillez le lion qui est en vous. (Céréales Lion)",
"Parce que le monde bouge (CIC)", "Parce que le monde bouge (CIC)",
"Ça coule de source ! (Cristaline)", "Ça coule de source ! (Cristaline)",
"Pensez différemment (apple)" "Pensez différemment (Apple)"
], ],
"gorger": 3, "gorger": 3,
"distribution": true, "distribution": true,
@@ -139,14 +139,14 @@
}, },
{ {
"id": 18, "id": 18,
"question": "Celles et ceux qui ont eu un Windows phone", "question": "Celles et ceux qui ont eu un Windows Phone",
"gorger": 3, "gorger": 3,
"distribution": true, "distribution": true,
"recois": true "recois": true
}, },
{ {
"id": 19, "id": 19,
"question": "<J1>, Boire un café fait baisser le taux d'alcool? Si tu as faux ", "question": "<J1>, Boire un café fait baisser le taux d'alcool ? Si tu as faux, ",
"gorger": 3, "gorger": 3,
"distribution": false, "distribution": false,
"recois": true "recois": true
@@ -160,10 +160,10 @@
}, },
{ {
"id": 21, "id": 21,
"question": "Celui/Celle qui pèse le plus lourd", "question": "Celui/Celle qui pèse le plus <variante>",
"variante": [ "variante": [
"lourd", "lourd",
"leger" "léger"
], ],
"gorger": 3, "gorger": 3,
"distribution": true, "distribution": true,
@@ -174,9 +174,9 @@
"question": "Pour se décoincer, le/la plus <variante>", "question": "Pour se décoincer, le/la plus <variante>",
"variante": [ "variante": [
"timide", "timide",
"enervé ", "énervé(e)",
"angoissé", "angoissé(e)",
"aigri" "aigri(e)"
], ],
"gorger": 2, "gorger": 2,
"distribution": false, "distribution": false,
@@ -188,7 +188,7 @@
"gorger": 3, "gorger": 3,
"variante": [ "variante": [
"jeune", "jeune",
"vieille" "vieux/vieille"
], ],
"distribution": false, "distribution": false,
"recois": true "recois": true
@@ -200,7 +200,7 @@
"variante": [ "variante": [
"L", "L",
"Scientifique", "Scientifique",
"Bac Professionel", "Bac Professionnel",
"STMG" "STMG"
], ],
"distribution": true, "distribution": true,
@@ -208,7 +208,7 @@
}, },
{ {
"id": 25, "id": 25,
"question": "Celles et ceux qui ont deja joué <variante> de maniere recurrente ", "question": "Celles et ceux qui ont déjà joué <variante> de manière récurrente ",
"gorger": 3, "gorger": 3,
"variante": [ "variante": [
"du piano", "du piano",
@@ -229,7 +229,7 @@
}, },
{ {
"id": 27, "id": 27,
"question": "Celui ou celle a la meilleure place", "question": "Celui ou celle à la meilleure place",
"gorger": 2, "gorger": 2,
"distribution": false, "distribution": false,
"recois": true "recois": true
@@ -268,7 +268,7 @@
}, },
{ {
"id": 32, "id": 32,
"question": "La personne la plus maquillé ", "question": "La personne la plus maquillée ",
"gorger": 2, "gorger": 2,
"distribution": true, "distribution": true,
"recois": true "recois": true
@@ -282,7 +282,7 @@
}, },
{ {
"id": 34, "id": 34,
"question": "Celles et ceux qui boit de la <variante> actuellement", "question": "Celles et ceux qui boivent de la <variante> actuellement",
"gorger": 3, "gorger": 3,
"distribution": true, "distribution": true,
"recois": true, "recois": true,
@@ -332,7 +332,7 @@
}, },
{ {
"id": 38, "id": 38,
"question": "Celui/celle avec le plus gros appetit sexuel", "question": "Celui/celle avec le plus gros appétit sexuel",
"gorger": 3, "gorger": 3,
"distribution": false, "distribution": false,
"recois": true, "recois": true,
@@ -340,7 +340,7 @@
}, },
{ {
"id": 39, "id": 39,
"question": "Ceux/Celles qui fumes (VapeNation compris)", "question": "Ceux/Celles qui fument (vapoteurs compris)",
"gorger": 3, "gorger": 3,
"distribution": false, "distribution": false,
"recois": true "recois": true
@@ -378,7 +378,7 @@
}, },
{ {
"id": 43, "id": 43,
"question": "Le premier joueur à enlever un vêtements", "question": "Le premier joueur à enlever un vêtement",
"gorger": 3, "gorger": 3,
"distribution": true, "distribution": true,
"recois": true "recois": true
@@ -392,14 +392,14 @@
}, },
{ {
"id": 45, "id": 45,
"question": "Celui/Celle avec le plus de follow sur <variante>", "question": "Celui/Celle avec le plus d'abonnés sur <variante>",
"gorger": 3, "gorger": 3,
"distribution": true, "distribution": true,
"recois": true, "recois": true,
"variante": [ "variante": [
"instagram", "instagram",
"facebook", "facebook",
"tik-tok" "TikTok"
] ]
}, },
{ {
@@ -426,7 +426,7 @@
}, },
{ {
"id": 49, "id": 49,
"question": "Celles et ceux qui ont déjà dépenser plus de 2000 euros en un achat", "question": "Celles et ceux qui ont déjà dépensé plus de 2000 euros en un achat",
"gorger": 3, "gorger": 3,
"distribution": true, "distribution": true,
"recois": true "recois": true
@@ -440,7 +440,7 @@
}, },
{ {
"id": 51, "id": 51,
"question": "Celles/Ceux qui rentre chez eux à la fin de la soirée", "question": "Celles/Ceux qui rentrent chez eux à la fin de la soirée",
"gorger": 3, "gorger": 3,
"distribution": true, "distribution": true,
"recois": true "recois": true
@@ -452,13 +452,13 @@
"distribution": true, "distribution": true,
"recois": true, "recois": true,
"variante": [ "variante": [
"impaire", "impair",
"paire" "pair"
] ]
}, },
{ {
"id": 53, "id": 53,
"question": "Si tu as un téléphone qui a un prix supérieur d'achat à 1000 euros, tu es riche donc en tant que personne généreuse", "question": "Si tu as un téléphone acheté plus de 1000 euros, tu es riche, donc en tant que personne généreuse",
"gorger": 3, "gorger": 3,
"distribution": true, "distribution": true,
"recois": false "recois": false
@@ -473,7 +473,7 @@
{ {
"id": 55, "id": 55,
"jeux": true, "jeux": true,
"question": "Le jeu du revolver: Chaque joueur a maintenant 7 balles, une balle correspondant à une gorgée. Les joueurs ont la capacité de tirer des balles à tout moment du jeu.", "question": "Le jeu du revolver: Chaque joueur a maintenant 7 balles, une balle correspond à une gorgée. Les joueurs ont la capacité de tirer des balles à tout moment du jeu.",
"distribution": false, "distribution": false,
"recois": false "recois": false
}, },
@@ -487,14 +487,14 @@
{ {
"id": 57, "id": 57,
"jeux": true, "jeux": true,
"question": "<J1> est le vieu/vieille briscard ! Interdiction de montrer tes dents pendant <manche> manches", "question": "<J1> est un vieux/une vieille briscard(e) ! Interdiction de montrer tes dents pendant <manches> manches",
"manches": true, "manches": true,
"arret": "Tu peux arreter de cacher tes belles dents" "arret": "Tu peux arrêter de cacher tes belles dents"
}, },
{ {
"id": 58, "id": 58,
"jeux": true, "jeux": true,
"question": "<J1> et <J2> liser le premier SMS qui s'affiche quand on tape <variante> dans la barre de recherche. le plus marrant", "question": "<J1> et <J2>, lisez le premier SMS qui s'affiche quand on tape <variante> dans la barre de recherche. le plus marrant",
"gorger": 3, "gorger": 3,
"variante": [ "variante": [
"désolé", "désolé",
@@ -509,7 +509,7 @@
{ {
"id": 59, "id": 59,
"jeux": true, "jeux": true,
"question": "A tour de role, vous avez exactement 3 secondes pour donner un mot en rapport avec le mots dit precedemment.<J1> tu commences en choissisant un mot. Le perdant", "question": "À tour de rôle, vous avez exactement 3 secondes pour donner un mot en rapport avec le mot dit précédemment. <J1>, tu commences en choisissant un mot. Le perdant",
"gorger": 3, "gorger": 3,
"distribution": false, "distribution": false,
"recois": true "recois": true
@@ -525,7 +525,7 @@
{ {
"id": 61, "id": 61,
"jeux": true, "jeux": true,
"question": "<J1> defie <J2> au chifoumi ! Le perdant", "question": "<J1> défie <J2> au chifoumi ! Le perdant",
"gorger": 3, "gorger": 3,
"distribution": false, "distribution": false,
"recois": true "recois": true
@@ -539,7 +539,7 @@
"futur" "futur"
], ],
"manches": true, "manches": true,
"arret": "Tu est revenu dans le present", "arret": "Tu es revenu dans le présent",
"distribution": false, "distribution": false,
"recois": false, "recois": false,
"caliente": false "caliente": false
@@ -551,7 +551,7 @@
{ {
"id": 64, "id": 64,
"jeux": true, "jeux": true,
"question": "<J1> et <J2> ferment leurs yeux ! Ils/Elles doivent deviner la couleur des yeux de l'autre. ", "question": "<J1> et <J2> ferment leurs yeux ! Ils/Elles doivent deviner la couleur des yeux de l'autre. Le perdant ",
"gorger": 3, "gorger": 3,
"distribution": false, "distribution": false,
"recois": true "recois": true
@@ -559,27 +559,27 @@
{ {
"id": 65, "id": 65,
"jeux": true, "jeux": true,
"question": "<J1> est manchot ! Il/Elle ne peut plus utiliser ses doigts durant <manches> manches . Si il/elle s'en sert, il/elle devra boire autant de gorgées qu'il/elle a utilisé de doigts", "question": "<J1> est manchot ! Il/Elle ne peut plus utiliser ses doigts durant <manches> manches . S'il/elle s'en sert, il/elle devra boire autant de gorgées qu'il/elle a utilisé de doigts",
"distribution": false, "distribution": false,
"arret": "Tu n'es plus manchot", "arret": "Tu n'es plus manchot",
"recois": true "recois": false
}, },
{ {
"id": 66, "id": 66,
"jeux": true, "jeux": true,
"question": "<J1> et <J2> , si vous êtes ensemble dans la vraie vie, vous pouvez distribuer 2 gorgées , autrement buvez-les" "question": "<J1> et <J2>, si vous êtes ensemble dans la vraie vie, vous pouvez distribuer 2 gorgées , autrement buvez-les"
}, },
{ {
"id": 67, "id": 67,
"jeux": true, "jeux": true,
"question": "<J1> a la tourette ! A chaque fois que tu bois une gorgée, tu dois CRIER une insulte. C'est un stade avancé, ça dure <manches> manches", "question": "<J1> a la Tourette ! A chaque fois que tu bois une gorgée, tu dois CRIER une insulte. C'est un stade avancé, ça dure <manches> manches",
"manches": true, "manches": true,
"arret": "Tu n'as plus tourette." "arret": "Tu n'as plus la Tourette."
}, },
{ {
"id": 68, "id": 68,
"jeux": true, "jeux": true,
"question": "<J1>, donne la couleur préférée de <J2> si tu te trompes", "question": "<J1>, donne la couleur préférée de <J2>. En cas d'erreur, <J1>",
"gorger": 3, "gorger": 3,
"distribution": false, "distribution": false,
"recois": true "recois": true
@@ -587,10 +587,11 @@
{ {
"id": 69, "id": 69,
"jeux": true, "jeux": true,
"question": "<J1> à l'oeil de serpent ! Dès qu'un joueur te regarde dans les yeux, il/elle boit. Si tu es arrivé à faire boire personne avant <manches> manches, tu ", "question": "<J1> a l'œil de serpent ! Dès qu'un joueur te regarde dans les yeux, il/elle boit. Si tu n'as réussi à faire boire personne avant <manches> manches, le serpent ",
"gorger": 4, "gorger": 4,
"distribution": false, "distribution": false,
"recois": true "recois": true,
"arret": "Tu n'as plus l'œil de serpent !"
}, },
{ {
"id": 70, "id": 70,
@@ -598,8 +599,8 @@
"question": "<J1> et <J2> se mesurent ! Le/la plus <variante>", "question": "<J1> et <J2> se mesurent ! Le/la plus <variante>",
"gorger": 3, "gorger": 3,
"variante": [ "variante": [
"petit", "petit(e)",
"grand" "grand(e)"
], ],
"distribution": true, "distribution": true,
"recois": true "recois": true
@@ -612,12 +613,13 @@
"C'est clair", "C'est clair",
"han", "han",
"quoicoubeh" "quoicoubeh"
] ],
"arret": "Tu peux enfin parler normalement !"
}, },
{ {
"id": 72, "id": 72,
"jeux": true, "jeux": true,
"question": "<J1> et <J2> se défient au 'je te tiens, tu me tiens', le premier qui rit sera dechiré, et ", "question": "<J1> et <J2> se défient au 'je te tiens, tu me tiens', le premier qui rit sera déchiré, et ",
"gorger": 3, "gorger": 3,
"distribution": false, "distribution": false,
"recois": true "recois": true
@@ -627,7 +629,7 @@
"jeux": true, "jeux": true,
"question": "<J1> et <J2> n'ont plus le droit d'utiliser leur téléphone pendant <manches> manches !", "question": "<J1> et <J2> n'ont plus le droit d'utiliser leur téléphone pendant <manches> manches !",
"manches": "true", "manches": "true",
"arret": "vous pouvez enfin utiliser vos téléphone bande de geek" "arret": "vous pouvez enfin utiliser vos téléphones, bande de geeks"
}, },
{ {
"id": 74, "id": 74,
@@ -645,7 +647,7 @@
{ {
"id": 75, "id": 75,
"jeux": true, "jeux": true,
"question": "<J1>, Si on te dit Marco? ... Si tu as dis Polo ", "question": "<J1>, Si on te dit Marco? ... Si tu as dit Polo ",
"gorger": 3, "gorger": 3,
"distribution": true, "distribution": true,
"recois": true "recois": true
@@ -653,11 +655,11 @@
{ {
"id": 76, "id": 76,
"jeux": true, "jeux": true,
"question": "<J1> est l'aigris pendant <manches> manches ! Dès que tu souris ou rigoles,", "question": "<J1> est l'aigri pendant <manches> manches ! Dès que tu souris ou rigoles,",
"gorger": 1, "gorger": 1,
"manches": true, "manches": true,
"distribution": false, "distribution": false,
"arret": "Tu n'es plus aigris!", "arret": "Tu n'es plus aigri !",
"recois": true "recois": true
}, },
{ {
@@ -689,9 +691,9 @@
{ {
"id": 81, "id": 81,
"jeux": true, "jeux": true,
"question": "<J1> et <J2> sont lies, si l'un boit alors l'autre aussi, et ce pendant <manches> manches", "question": "<J1> et <J2> sont liés : si l'un boit alors l'autre aussi, et ce pendant <manches> manches",
"manches": true, "manches": true,
"arret": "Vous n'etes plus liés par le verre de l'amitié et plus.." "arret": "Vous n'êtes plus liés par le verre de l'amitié !"
}, },
{ {
"id": 82, "id": 82,
@@ -703,19 +705,18 @@
"question": "<J1> doit choisir un mot que tout le monde devra dire à chaque fois qu'une personne boit. Pendant <manches> manches", "question": "<J1> doit choisir un mot que tout le monde devra dire à chaque fois qu'une personne boit. Pendant <manches> manches",
"jeux": false, "jeux": false,
"manches": true, "manches": true,
"arret": "Plus besoin de dire le mots avant de boire" "arret": "Plus besoin de dire le mot avant de boire"
}, },
{ {
"id": 84, "id": 84,
"question": "Quand l'heure affichera un multiple de 10 (22h, 22h10 ...) le premier à crier 'merde j'ai oublié mon chat'", "question": "Quand l'heure affichera un multiple de 10 (22h, 22h10 ...) le premier à crier 'merde j'ai oublié mon chat'",
"gorger": 3, "gorger": 3,
"distribut": false, "distribution": false,
"manches": true, "recois": true
"arret": "Vous avez retrouver le chat!"
}, },
{ {
"id": 85, "id": 85,
"question": "Plutôt ne plus avoir de mains ou de jambes? les perdants ", "question": "Plutôt ne plus avoir de mains ou de jambes ? Votez tous en même temps. La minorité ",
"gorger": 3, "gorger": 3,
"jeux": false, "jeux": false,
"distribution": false, "distribution": false,
@@ -745,7 +746,7 @@
"filles", "filles",
"garçons", "garçons",
"couples", "couples",
"celibataires" "célibataires"
], ],
"gorger": 3, "gorger": 3,
"distribution": true, "distribution": true,
@@ -784,21 +785,21 @@
}, },
{ {
"id": 93, "id": 93,
"question": "Plutôt jeux-videos ou livre ? Votez tous en même temps. La minorité ", "question": "Plutôt jeux vidéo ou livres ? Votez tous en même temps. La minorité ",
"gorger": 3, "gorger": 3,
"distribution": false, "distribution": false,
"recois": true "recois": true
}, },
{ {
"id": 94, "id": 94,
"question": "Plutôt anime ou jeux-videos ? Votez tous en même temps. La minorité ", "question": "Plutôt animés ou jeux vidéo ? Votez tous en même temps. La minorité ",
"gorger": 3, "gorger": 3,
"distribution": false, "distribution": false,
"recois": true "recois": true
}, },
{ {
"id": 95, "id": 95,
"question": "Elisez le plus <variante> d'entre vous, ce dernier ", "question": "Élisez le plus <variante> d'entre vous, ce dernier ",
"variante": [ "variante": [
"con", "con",
"intelligent", "intelligent",
@@ -821,16 +822,16 @@
"Christopher Nolan", "Christopher Nolan",
"James Cameron", "James Cameron",
"Tim Burton", "Tim Burton",
"Quentin tarantino", "Quentin Tarantino",
"Steven Spielberg" "Steven Spielberg"
] ]
}, },
{ {
"id": 97, "id": 97,
"question": "Le premier qui donne un film avec ", "question": "Le premier qui donne un film avec <variante> ",
"variante": [ "variante": [
"Christian Clavier", "Christian Clavier",
"Morgan freeman", "Morgan Freeman",
"Brad Pitt", "Brad Pitt",
"Jean Reno", "Jean Reno",
"Marion Cotillard" "Marion Cotillard"
@@ -847,7 +848,7 @@
"recois": false, "recois": false,
"variante": [ "variante": [
"jeune", "jeune",
"vieille" "vieux/vieille"
] ]
}, },
{ {
@@ -866,14 +867,14 @@
}, },
{ {
"id": 101, "id": 101,
"question": "Plutot vaincre le patrikaka ou la polution dans le monde? Votez tous en meme temps. La minorité ", "question": "Plutôt vaincre le patrikaka ou la pollution dans le monde ? Votez tous en même temps. La minorité ",
"gorger": 3, "gorger": 3,
"distribution": false, "distribution": false,
"recois": true "recois": true
}, },
{ {
"id": 102, "id": 102,
"question": "Jeu du LUTIN : Pendant <manches> manches. Vous devez enlever le lutin de votre verre pour pouvoir boire et le remettre ensuite sinon vous devait reboire", "question": "Jeu du LUTIN : Pendant <manches> manches. Vous devez enlever le lutin de votre verre pour pouvoir boire et le remettre ensuite sinon vous devez reboire",
"gorger": 3, "gorger": 3,
"distribution": false, "distribution": false,
"recois": false, "recois": false,
@@ -896,17 +897,17 @@
}, },
{ {
"id": 104, "id": 104,
"question": "Le premier joueur qui dévoile un de ses secrets et que personne ne sait ", "question": "Le premier joueur qui dévoile un de ses secrets et que personne ne connaissait : le perdant ",
"gorger": 3, "gorger": 3,
"distribution": true, "distribution": true,
"recois": false "recois": false
}, },
{ {
"id": 105, "id": 105,
"question": "Jeu des peaux! Triez vous du joueur le plus bronzé au joueur le moins bronzé. Le plus bronzé prend 1 gorgée, le second 2 gorgées, etc.", "question": "Jeu des peaux! Triez-vous : du joueur le plus bronzé au joueur le moins bronzé. Le plus bronzé prend 1 gorgée, le second 2 gorgées, etc.",
"gorger": 3, "gorger": 3,
"distribution": true, "distribution": false,
"recois": true "recois": false
}, },
{ {
"id": 106, "id": 106,
@@ -919,11 +920,11 @@
"id": 107, "id": 107,
"question": "Il est désormais interdit de se tutoyer pendant <manches> manches", "question": "Il est désormais interdit de se tutoyer pendant <manches> manches",
"manches": true, "manches": true,
"arret": "Vous pouvez vous enfin vous tutoyer" "arret": "Vous pouvez enfin vous tutoyer"
}, },
{ {
"id": 108, "id": 108,
"question": "Vaccin contre le COVID19 : Le DR Raoul à dit que boire un cul sec avait les mêmes effets que le vaccin. Tout le monde bois sont verre cul sec" "question": "Vaccin contre le COVID19 : Le Dr Raoult a dit que boire un cul sec avait les mêmes effets que le vaccin. Tout le monde boit son verre cul sec"
}, },
{ {
"id": 109, "id": 109,
@@ -948,29 +949,28 @@
{ {
"id": 112, "id": 112,
"question": "Le prochain qui parle de travail ou d'école doit boire un shot", "question": "Le prochain qui parle de travail ou d'école doit boire un shot",
"duree": true, "duree": true
"arret": "Fin de l'interdiction"
}, },
{ {
"id": 113, "id": 113,
"question": "Karaoké improvisé : <J1> choisit une chanson pour <J2>", "question": "Karaoké improvisé : <J1> choisit une chanson, et c'est <J2> qui doit la chanter. <J2> ",
"gorger": 3, "gorger": 3,
"distribution": false, "distribution": false,
"recois": true "recois": true
}, },
{ {
"id": 114, "id": 114,
"question": "Qui serait le plus susceptible de survivre dans un film de survie ? Votez", "question": "Qui serait le plus susceptible de survivre dans un film de survie ? Votez, et le perdant ",
"gorger": 3, "gorger": 3,
"distribution": false, "distribution": false,
"recois": true "recois": true
}, },
{ {
"id": 115, "id": 115,
"question": "Défi cuisine : <J1> doit créer la combinaison d'alcool la plus bizarre avec les ingrédients présents, <J2> doit boire la mixture", "question": "Défi cuisine : <J1> doit créer la combinaison d'alcool la plus bizarre avec les ingrédients présents, et c'est <J2> qui doit la boire cul sec",
"gorger": 2, "gorger": 2,
"distribution": false, "distribution": false,
"recois": true "recois": false
}, },
{ {
"id": 116, "id": 116,
@@ -1051,14 +1051,14 @@
}, },
{ {
"id": 127, "id": 127,
"question": "Le/La plus drôle du groupe (vote à main levée, le perdant boit)", "question": "Le/La plus drôle du groupe (vote à main levée)",
"gorger": 3, "gorger": 3,
"distribution": false, "distribution": false,
"recois": true "recois": true
}, },
{ {
"id": 128, "id": 128,
"question": "Le/La plus 'bête' cul du groupe", "question": "Le/La plus beau cul du groupe",
"gorger": 4, "gorger": 4,
"distribution": false, "distribution": false,
"recois": true "recois": true
@@ -1072,7 +1072,7 @@
}, },
{ {
"id": 130, "id": 130,
"question": "Le/La plus likely to rater sa vie", "question": "Le/La plus susceptible de rater sa vie",
"gorger": 4, "gorger": 4,
"distribution": false, "distribution": false,
"recois": true "recois": true
@@ -1146,7 +1146,7 @@
}, },
{ {
"id": 139, "id": 139,
"question": "Pause pip interdite pendant <manches> manches. 5 gorgées si tu vas aux toilettes !", "question": "Pause pipi interdite pendant <manches> manches. 5 gorgées si tu vas aux toilettes !",
"gorger": 0, "gorger": 0,
"arret": "Tu peux enfin aller aux toilettes !" "arret": "Tu peux enfin aller aux toilettes !"
}, },
@@ -1190,49 +1190,57 @@
"id": 146, "id": 146,
"question": "<J1> et <J2> se regardent dans les yeux pendant 10 secondes sans rire. Le premier à rire boit 4 gorgées", "question": "<J1> et <J2> se regardent dans les yeux pendant 10 secondes sans rire. Le premier à rire boit 4 gorgées",
"gorger": 0, "gorger": 0,
"recois": true "recois": false,
"distribution": false
}, },
{ {
"id": 147, "id": 147,
"question": "<J1> doit donner un compliment à <J2>. Si <J2> n'est pas satisfait : <J1> boit 3 gorgées", "question": "<J1> doit donner un compliment à <J2>. Si <J2> n'est pas satisfait : <J1> boit 3 gorgées",
"gorger": 0, "gorger": 0,
"recois": true "recois": false,
"distribution": false
}, },
{ {
"id": 148, "id": 148,
"question": "<J1> à toi de choisir : qui de <J2> ou <J3> a le plus mauvais goût musical ? Le perdant boit 3 gorgées", "question": "<J1>, à toi de choisir : qui de <J2> ou <J3> a le plus mauvais goût musical ? Le perdant boit 3 gorgées",
"gorger": 0, "gorger": 0,
"recois": true "recois": false,
"distribution": false
}, },
{ {
"id": 149, "id": 149,
"question": "<J1> doit deviner ce que <J2> a mangé aujourd'hui. 1 gorgée par mauvaise réponse, max 5", "question": "<J1> doit deviner ce que <J2> a mangé aujourd'hui. 1 gorgée par mauvaise réponse, max 5",
"gorger": 0, "gorger": 0,
"recois": true "recois": false,
"distribution": false
}, },
{ {
"id": 150, "id": 150,
"question": "<J1> et <J2> font un bras de fer. Le perdant boit 5 gorgées", "question": "<J1> et <J2> font un bras de fer. Le perdant boit 5 gorgées",
"gorger": 0, "gorger": 0,
"recois": true "recois": false,
"distribution": false
}, },
{ {
"id": 151, "id": 151,
"question": "<J1> doit nommer une qualité de <J2>. Si <J2> n'est pas d'accord : 3 gorgées pour <J1>", "question": "<J1> doit nommer une qualité de <J2>. Si <J2> n'est pas d'accord : 3 gorgées pour <J1>",
"gorger": 0, "gorger": 0,
"recois": true "recois": false,
"distribution": false
}, },
{ {
"id": 152, "id": 152,
"question": "<J1> doit deviner la couleur des sous-vêtements de <J2>. 2 gorgées si faux", "question": "<J1> doit deviner la couleur des sous-vêtements de <J2>. 2 gorgées si faux",
"gorger": 0, "gorger": 0,
"recois": true "recois": false,
"distribution": false
}, },
{ {
"id": 153, "id": 153,
"question": "<J1> doit mimer le métier de <J2>. Les autres doivent deviner en moins de 30 secondes ou <J1> boit 4 gorgées", "question": "<J1> doit mimer le métier de <J2>. Les autres doivent deviner en moins de 30 secondes ou <J1> boit 4 gorgées",
"gorger": 0, "gorger": 0,
"recois": true "recois": false,
"distribution": false
}, },
{ {
"id": 154, "id": 154,
@@ -1286,7 +1294,7 @@
}, },
{ {
"id": 158, "id": 158,
"question": "Le/La plus 'influençant' du groupe (vote à main levée)", "question": "Le/La plus influenceur/euse du groupe (vote à main levée)",
"gorger": 3, "gorger": 3,
"distribution": false, "distribution": false,
"recois": true "recois": true
@@ -1302,7 +1310,8 @@
"id": 160, "id": 160,
"question": "<J1> doit dire 3 mots commençant par la même lettre que <J2> choisit. Si échec : 3 gorgées", "question": "<J1> doit dire 3 mots commençant par la même lettre que <J2> choisit. Si échec : 3 gorgées",
"gorger": 0, "gorger": 0,
"recois": true "recois": false,
"distribution": false
}, },
{ {
"id": 161, "id": 161,
@@ -1313,7 +1322,7 @@
}, },
{ {
"id": 162, "id": 162,
"question": "Le/La plus 'branché' du groupe selon les autres", "question": "Le/La plus 'branché(e)' du groupe selon les autres",
"gorger": 3, "gorger": 3,
"distribution": false, "distribution": false,
"recois": true "recois": true
@@ -1382,7 +1391,8 @@
"id": 171, "id": 171,
"question": "<J1> doit faire rire <J2> en 30 secondes. Si échec : 5 gorgées", "question": "<J1> doit faire rire <J2> en 30 secondes. Si échec : 5 gorgées",
"gorger": 0, "gorger": 0,
"recois": true "recois": false,
"distribution": false
}, },
{ {
"id": 172, "id": 172,
@@ -1408,8 +1418,7 @@
"une voiture", "une voiture",
"un téléphone", "un téléphone",
"un avion" "un avion"
], ]
"arret": "Fin du mime !"
}, },
{ {
"id": 175, "id": 175,
@@ -1435,8 +1444,7 @@
"mèche", "mèche",
"alliance", "alliance",
"bracelet" "bracelet"
], ]
"arret": "Fin du jeu du NI !"
}, },
{ {
"id": 178, "id": 178,
@@ -1479,14 +1487,14 @@
}, },
{ {
"id": 183, "id": 183,
"question": "Ceux qui ont déjà fait un regretté post-soirée (message à un ex)", "question": "Ceux qui ont déjà envoyé un message à leur ex après une soirée",
"gorger": 4, "gorger": 4,
"distribution": true, "distribution": true,
"recois": true "recois": true
}, },
{ {
"id": 184, "id": 184,
"question": "Le/La plus 'organisé' du groupe", "question": "Le/La plus 'organisé(e)' du groupe",
"gorger": 2, "gorger": 2,
"distribution": false, "distribution": false,
"recois": true "recois": true
@@ -98,6 +98,13 @@ public class QuestionRepository {
return Result.success(selected); return Result.success(selected);
} }
/**
* Retourne l'ensemble des IDs des questions déjà posées (toutes parties confondues).
*/
public Set<String> getAskedQuestionIds() {
return new HashSet<>(prefs.getStringSet(KEY_ASKED_QUESTIONS, new HashSet<>()));
}
/** /**
* Marque une question comme étant posée. * Marque une question comme étant posée.
*/ */
@@ -100,23 +100,25 @@ public class GameEngine {
String result = questionText; String result = questionText;
int playerCount = 0; int playerCount = 0;
if (hasJ1 && hasJ2 && hasJ3 && selectedPlayers.size() >= 3) { // Chaque balise est remplacée indépendamment : une question contenant
playerCount = 3; // uniquement <J2> ou <J3> reste jouable (l'ordre J1, J2, J3 est conservé)
if (hasJ1 && selectedPlayers.size() >= 1) {
playerCount++;
result = result.replace("<J1>", selectedPlayers.get(0)); result = result.replace("<J1>", selectedPlayers.get(0));
}
if (hasJ2 && selectedPlayers.size() >= 2) {
playerCount++;
result = result.replace("<J2>", selectedPlayers.get(1)); result = result.replace("<J2>", selectedPlayers.get(1));
}
if (hasJ3 && selectedPlayers.size() >= 3) {
playerCount++;
result = result.replace("<J3>", selectedPlayers.get(2)); result = result.replace("<J3>", selectedPlayers.get(2));
} else if (hasJ1 && hasJ2 && selectedPlayers.size() >= 2) {
playerCount = 2;
result = result.replace("<J1>", selectedPlayers.get(0));
result = result.replace("<J2>", selectedPlayers.get(1));
} else if (hasJ1 && selectedPlayers.size() >= 1) {
playerCount = 1;
result = result.replace("<J1>", selectedPlayers.get(0));
} }
return new PlayerReplaceResult(result, playerCount); return new PlayerReplaceResult(result, playerCount);
} }
/** /**
* Ajoute le texte des gorgées à la question. * Ajoute le texte des gorgées à la question.
*/ */
@@ -130,9 +132,11 @@ public class GameEngine {
int totalGorgees = question.getGorger() + addedGorgees; int totalGorgees = question.getGorger() + addedGorgees;
// Accord du verbe selon le nombre de joueurs // Accord du verbe selon le véritable sujet de la phrase
String boisVerb = (playerCount > 1) ? "boivent" : "boit"; boolean pluriel = isPluralSubject(questionText);
String distribueVerb = (playerCount > 1) ? "distribuent" : "distribue"; String boisVerb = pluriel ? "boivent" : "boit";
String distribueVerb = pluriel ? "distribuent" : "distribue";
// Déterminer si boire ou distribuer // Déterminer si boire ou distribuer
if (question.isRecois() && question.isDistribution()) { if (question.isRecois() && question.isDistribution()) {
@@ -152,6 +156,31 @@ public class GameEngine {
return sb.toString(); return sb.toString();
} }
/**
* Indique si le sujet de la question est pluriel, pour accorder le verbe
* (boit/boivent, distribue/distribuent) ajouté en fin de question.
*/
private static boolean isPluralSubject(String questionText) {
String t = questionText.trim().toLowerCase();
if (t.isEmpty()) {
return false;
}
// Sujet de groupe en tête de question : « Ceux qui… », « Les fans de… », « Tous ceux qui… »
if (t.startsWith("ceux") || t.startsWith("celles") || t.startsWith("tous ") || t.startsWith("toutes ")
|| t.startsWith("les ")) {
return true;
}
// Sujet pluriel en toute fin de phrase, juste avant le verbe ajouté
String[] finsPlurielles = {"perdants", "joueurs", "joueuses", "gens", "ceux", "celles", "eux", "elles",
"abonnés", "abonnées", "végans", "célibataires", "filles", "garçons", "couples"};
for (String fin : finsPlurielles) {
if (t.endsWith(fin)) {
return true;
}
}
return false;
}
/** /**
* Sélectionne n joueurs aléatoires uniques. * Sélectionne n joueurs aléatoires uniques.
*/ */
@@ -191,6 +191,24 @@ public class BoideloClassicGameActivity extends AppCompatActivity {
if (result.isSuccess()) { if (result.isSuccess()) {
Questions q = result.getData(); Questions q = result.getData();
questions = q != null && q.getQuestions() != null ? q.getQuestions() : new ArrayList<>(); questions = q != null && q.getQuestions() != null ? q.getQuestions() : new ArrayList<>();
// Exclure les questions déjà posées lors des parties précédentes,
// pour qu'une question ne revienne pas tant que tout le stock n'a pas été épuisé
java.util.Set<String> askedIds = questionRepository.getAskedQuestionIds();
if (!askedIds.isEmpty()) {
List<Question> unasked = new ArrayList<>();
for (Question question : questions) {
if (!askedIds.contains(String.valueOf(question.getId()))) {
unasked.add(question);
}
}
if (unasked.isEmpty()) {
// Toutes les questions ont été posées : on repart sur le stock complet
questionRepository.resetAskedQuestions();
} else {
questions = unasked;
}
}
} else { } else {
android.util.Log.e("BoideloClassicGame", "Erreur lors du chargement des questions: " + result.getError()); android.util.Log.e("BoideloClassicGame", "Erreur lors du chargement des questions: " + result.getError());
questions = new ArrayList<>(); questions = new ArrayList<>();
@@ -407,10 +425,19 @@ public class BoideloClassicGameActivity extends AppCompatActivity {
} }
askedQuestionIndices.add(questionIndex); askedQuestionIndices.add(questionIndex);
// Persistance : la question ne reviendra plus lors des prochaines parties
questionRepository.markQuestionAsAsked(question.getId());
return question; return question;
} }
// Si on ne trouve pas de question valide, retourner une question aléatoire // Si on ne trouve pas de question valide (toutes les restantes ont <manches>),
// retourner une question non posée plutôt qu'une question au hasard
if (!availableIndices.isEmpty()) {
int fallbackIndex = availableIndices.get(random.nextInt(availableIndices.size()));
askedQuestionIndices.add(fallbackIndex);
questionRepository.markQuestionAsAsked(questions.get(fallbackIndex).getId());
return questions.get(fallbackIndex);
}
return questions.get(random.nextInt(questions.size())); return questions.get(random.nextInt(questions.size()));
} }
@@ -825,8 +852,10 @@ public class BoideloClassicGameActivity extends AppCompatActivity {
question.setManchesRestantes(nbaleatoiremanches); question.setManchesRestantes(nbaleatoiremanches);
// Définir le message de fin de défi // Définir le message de fin de défi
String stopMessage = "Fin de défi!\n" + questionText; // Message de fin de défi : texte d'arrêt dédié s'il existe, sinon rappel de la consigne
question.setArretMessageManche(stopMessage); String arret = question.getArret();
String stopMessage = "Fin de défi !\n" + (arret != null && !arret.trim().isEmpty() ? arret : questionText);
questionsAvecManches.add(question); questionsAvecManches.add(question);
@@ -873,24 +902,25 @@ public class BoideloClassicGameActivity extends AppCompatActivity {
if (isJoueurs1 || isJoueurs2 || isJoueurs3) { if (isJoueurs1 || isJoueurs2 || isJoueurs3) {
List<String> aleatoirejoueurs = TroisJoueurAleatoire(); List<String> aleatoirejoueurs = TroisJoueurAleatoire();
if (isJoueurs1 && isJoueurs2 && isJoueurs3 && aleatoirejoueurs.size() >= RANDOM_PLAYER_SELECTION_COUNT) { // Chaque balise est remplacée indépendamment : une question contenant
playerCount = 3; // uniquement <J2> ou <J3> reste jouable (l'ordre J1, J2, J3 est conservé)
if (isJoueurs1 && aleatoirejoueurs.size() >= ONE_PLAYER) {
playerCount++;
j1Name = aleatoirejoueurs.get(0); j1Name = aleatoirejoueurs.get(0);
questionText = questionText.replace("<J1>", ErrorHandler.escapeHtml(j1Name)); questionText = questionText.replace("<J1>", ErrorHandler.escapeHtml(j1Name));
}
if (isJoueurs2 && aleatoirejoueurs.size() >= TWO_PLAYERS) {
playerCount++;
questionText = questionText.replace("<J2>", ErrorHandler.escapeHtml(aleatoirejoueurs.get(1))); questionText = questionText.replace("<J2>", ErrorHandler.escapeHtml(aleatoirejoueurs.get(1)));
}
if (isJoueurs3 && aleatoirejoueurs.size() >= RANDOM_PLAYER_SELECTION_COUNT) {
playerCount++;
questionText = questionText.replace("<J3>", ErrorHandler.escapeHtml(aleatoirejoueurs.get(2))); questionText = questionText.replace("<J3>", ErrorHandler.escapeHtml(aleatoirejoueurs.get(2)));
} else if (isJoueurs1 && isJoueurs2 && aleatoirejoueurs.size() >= TWO_PLAYERS) {
playerCount = 2;
j1Name = aleatoirejoueurs.get(0);
questionText = questionText.replace("<J1>", ErrorHandler.escapeHtml(j1Name));
questionText = questionText.replace("<J2>", ErrorHandler.escapeHtml(aleatoirejoueurs.get(1)));
} else if (isJoueurs1 && aleatoirejoueurs.size() >= ONE_PLAYER) {
playerCount = 1;
j1Name = aleatoirejoueurs.get(0);
questionText = questionText.replace("<J1>", ErrorHandler.escapeHtml(j1Name));
} }
} }
return new PlayerSelectionResult(questionText, j1Name, playerCount); return new PlayerSelectionResult(questionText, j1Name, playerCount);
} }
@@ -949,15 +979,19 @@ public class BoideloClassicGameActivity extends AppCompatActivity {
} }
/** /**
* Détermine l'action (boit/boivent ou distribue/distribuent) selon le nombre de joueurs /**
* Détermine l'action (boit/boivent ou distribue/distribuent) selon le véritable
* sujet de la phrase, pour un accord grammatical correct.
*/ */
private ActionChoiceResult determineActionChoice(Question question, String questionText, int playerCount) { private ActionChoiceResult determineActionChoice(Question question, String questionText, int playerCount) {
boolean isBois = false; boolean isBois = false;
boolean isDistribue = false; boolean isDistribue = false;
// Accord du verbe selon le nombre de joueurs // Accord du verbe selon le sujet réel de la question
String boisVerb = (playerCount > 1) ? "boivent" : "boit"; boolean pluriel = isPluralSubject(questionText);
String distribueVerb = (playerCount > 1) ? "distribuent" : "distribue"; String boisVerb = pluriel ? "boivent" : "boit";
String distribueVerb = pluriel ? "distribuent" : "distribue";
if (question.isRecois() && question.isDistribution()) { if (question.isRecois() && question.isDistribution()) {
boolean rand = random.nextBoolean(); boolean rand = random.nextBoolean();
@@ -979,6 +1013,31 @@ public class BoideloClassicGameActivity extends AppCompatActivity {
return new ActionChoiceResult(questionText, isBois, isDistribue); return new ActionChoiceResult(questionText, isBois, isDistribue);
} }
/**
* Indique si le sujet de la question est pluriel, pour accorder le verbe
* (boit/boivent, distribue/distribuent) ajouté en fin de question.
*/
private boolean isPluralSubject(String questionText) {
String t = questionText.trim().toLowerCase();
if (t.isEmpty()) {
return false;
}
// Sujet de groupe en tête de question : « Ceux qui… », « Les fans de… », « Tous ceux qui… »
if (t.startsWith("ceux") || t.startsWith("celles") || t.startsWith("tous ") || t.startsWith("toutes ")
|| t.startsWith("les ")) {
return true;
}
// Sujet pluriel en toute fin de phrase, juste avant le verbe ajouté
String[] finsPlurielles = {"perdants", "joueurs", "joueuses", "gens", "ceux", "celles", "eux", "elles",
"abonnés", "abonnées", "végans", "célibataires", "filles", "garçons", "couples"};
for (String fin : finsPlurielles) {
if (t.endsWith(fin)) {
return true;
}
}
return false;
}
/** /**
* Ajoute le nombre de gorgées au texte de la question * Ajoute le nombre de gorgées au texte de la question
*/ */