diff --git a/app/src/domain/analysis/phrases.ts b/app/src/domain/analysis/phrases.ts index 97cf8a2..276ee0f 100644 --- a/app/src/domain/analysis/phrases.ts +++ b/app/src/domain/analysis/phrases.ts @@ -73,6 +73,7 @@ export const PHRASE_KEYS: readonly string[] = [ "coup.douteux", "coup.mauvais", "coup.tres-mauvais", + "coup.tres-mauvais.loin", "fait.frappe", "fait.frappe-plusieurs", "fait.point", @@ -131,7 +132,6 @@ function moveWords(phrases: MasterPhrases, advice: MoveAdvice): MasterWords { best: advice.best.notation, played: advice.played.notation, rank: String(advice.rank), - count: String(advice.moveCount), roll: `${advice.roll[0]}-${advice.roll[1]}`, }; const fill = (key: string, extra: Readonly> = {}) => @@ -149,7 +149,9 @@ function moveWords(phrases: MasterPhrases, advice: MoveAdvice): MasterWords { good: "coup.proche", doubtful: "coup.douteux", bad: "coup.mauvais", - veryBad: "coup.tres-mauvais", + // Une grosse erreur ne cite son rang que s'il est proche (2e ou + // 3e choix) ; plus loin, le classement est dans les chiffres. + veryBad: advice.rank <= 3 ? "coup.tres-mauvais" : "coup.tres-mauvais.loin", }[verdict]; base = fill(key); fact = differenceFact(phrases, advice); diff --git a/app/tests/advice.test.ts b/app/tests/advice.test.ts index 301e60a..aae7517 100644 --- a/app/tests/advice.test.ts +++ b/app/tests/advice.test.ts @@ -165,10 +165,27 @@ test("le coup du maître est nommé, et le fait qui distingue les coups vient du assert.equal(said.title, "J'aurais joué 8/5 6/5"); assert.equal( said.phrase, - `J'aurais joué 8/5 6/5. Votre 24/23 13/10 était le ${worst.rank}e choix sur 16. Mon coup fait votre point 5.`, + "J'aurais joué 8/5 6/5. Votre 24/23 13/10 était le 2e choix. Mon coup fait votre point 5.", ); }); +test("grosse erreur : le rang n'est cité que pour un 2e ou 3e choix", async () => { + const engine = await loadNodeEngine(); + const worst = (await adviceOn( + engine, + await playOpening(engine, [3, 1], "24/23 13/10"), + )) as MoveAdvice; + for (const rank of [2, 3, 4, 7, 15]) { + const { phrase } = masterWords(phrases, { ...worst, rank }); + if (rank <= 3) { + assert.ok(phrase.includes(`était le ${rank}e choix`), phrase); + } else { + assert.ok(!phrase.includes("choix"), phrase); + assert.equal(phrase, "J'aurais joué 8/5 6/5. Mon coup fait votre point 5."); + } + } +}); + test("décisions de videau : la décision du maître et le contexte", async () => { const engine = await loadNodeEngine(); const missed = await adviceOn(engine, await playerRollsWithoutDoubling(engine)); diff --git a/docs/maitre/phrases.md b/docs/maitre/phrases.md index 2c84abe..a8499f0 100644 --- a/docs/maitre/phrases.md +++ b/docs/maitre/phrases.md @@ -34,7 +34,6 @@ mots entre accolades sont remplis avec les données du moteur : | `{played}` | votre coup, même notation | | `{move}` | le coup dont parle le fait (le vôtre ou celui du maître) | | `{rank}` | le rang de votre coup dans le classement du moteur (2, 3…) | -| `{count}` | le nombre de coups possibles avec ce jet | | `{points}` | « votre point 5 » ou « vos points 5 et 7 » | | `{roll}` | le jet, « 3-1 » | | `{hits}` | le nombre de pions frappés, en chiffres | @@ -89,7 +88,16 @@ Tout ce qui précède la première section `## mot.…` n'est pas lu. ## coup.tres-mauvais -- J'aurais joué {best}. Votre {played} était le {rank}e choix sur {count}. +Votre coup est le 2e ou le 3e choix du moteur. + +- J'aurais joué {best}. Votre {played} était le {rank}e choix. + +## coup.tres-mauvais.loin + +Votre coup est plus loin dans le classement : le rang n'est pas dit ici, il +se lit dans « Voir les chiffres du moteur ». + +- J'aurais joué {best}. ## fait.frappe @@ -109,7 +117,7 @@ Tout ce qui précède la première section `## mot.…` n'est pas lu. ## fait.maitre-frappe -- Mon coup frappe un pion, le vôtre non. +- Mon coup frappe un pion. ## fait.maitre-point