File

src/app/models/scenario-jeu-juste-point.ts

Description

Scénarios pour l’activité Calcul mental

Constructor

constructor(cabri: CabriDataService, accountService: AccountService, globalService: GlobalService, page: any, cd: ChangeDetectorRef, ttsService: any)

Methods

playIntro
playIntro()

Shorter version of playIntro

Returns: void
restartActivity
restartActivity()

Recommencer l’activité

Returns: void
nextPlayerInit
nextPlayerInit()

Lancement de l’activité / 1er joueur

Returns: void
nextPlayerSwitch
nextPlayerSwitch()

Joueur suivant.

Returns: void
populateScenarioBasket
populateScenarioBasket(randomize: boolean)

Creates feedbacks for calcul mental on top of general feedbacks

Returns: void
populateScenarioOnTheRoad
populateScenarioOnTheRoad(randomize: boolean)
Returns: void
dynamicFeedback
dynamicFeedback(answerStatus: AnswerStatus, responseTimeInSeconds: number, award: string, help: AnswerNeedsHelp)

dynamic Feedback depending of answer context - Basket + Road

Returns: void
playSoundWithAward
playSoundWithAward(award: string)
Returns: void
badResponseMoonWithResultBasketDynamic
badResponseMoonWithResultBasketDynamic(answerStatus: AnswerStatus, responseTimeInSeconds: number, award: string)

Mauvaise réponse avec affichage solution

Returns: void
badResponseMoonWithResultNextQRoadDynamic
badResponseMoonWithResultNextQRoadDynamic(resultOnTheRoad: ResultOnTheRoad, answerStatus: AnswerStatus, responseTimeInSeconds: number, award: string)

Mauvaise réponse avec affichage solution et question suivante

Returns: void
ttsFraction
ttsFraction(fraction: Fraction)
Returns: void
runCompleteRemediationBasket
runCompleteRemediationBasket()
Returns: void
runCompleteRemediationBasketNotExact
runCompleteRemediationBasketNotExact()
Returns: void
runResumedRemediationBasket
runResumedRemediationBasket()
Returns: void
runRemediationRoad
runRemediationRoad()
Returns: void
runRemediationRoadReverse
runRemediationRoadReverse()
Returns: void
runRemediationBasket
runRemediationBasket()
Returns: void
readCurrentOperationNormal
readCurrentOperationNormal()
Returns: void
readCurrentOperationProbleme
readCurrentOperationProbleme()
Returns: void
showErrorCar
showErrorCar(resultOnTheRoad: ResultOnTheRoad)

Highlight les voiture en erreurs

Returns: void
showRightPositionCar
showRightPositionCar(resultOnTheRoad: ResultOnTheRoad)

Highlight les voiture en erreurs

Returns: void

Properties

help2NumberSeparation
help2NumberSeparation: string
Public page
page: JeuJustePointPage
resultPhrase
resultPhrase: string
resultPhraseRemediation
resultPhraseRemediation: string
import { PlayTTSService } from "src/app/services/play-tts.service";
import { ChangeDetectorRef } from "@angular/core";
import { AppUtils, Fraction } from "../app-utils";
import { JeuJustePointPage, justePointActivity } from "../page/jeu-juste-point/jeu-juste-point.page";
import { AccountService } from "../services/account.service";
import { CabriDataService } from "../services/cabri-data.service";
import { GlobalService } from "../services/global.service";
import { ResultOnTheRoad } from "./cabri-integration-jeujustepoint";
import { ScenarioPhrase } from "./scenario-phrase";
import { ScenarioCabri } from "./scenario-cabri";
import { AnswerStatus, AnswerSpeed, AnswerAverage, AnswerExtreme, AnswerNeedsHelp } from "./activity-answer";

/**
 * Scénarios pour l’activité Calcul mental
 */
export class ScenarioJeuJustePoint extends ScenarioCabri {
	public page: JeuJustePointPage;
	help2NumberSeparation: string;
	resultPhrase: string;
	resultPhraseRemediation: string;

	constructor(
		cabri: CabriDataService,
		accountService: AccountService,
		globalService: GlobalService,
		page: any,
		cd: ChangeDetectorRef,
		ttsService: PlayTTSService
		) {
		super(cabri, accountService, globalService, page, cd, ttsService);
	}

	/**
	 * Shorter version of playIntro
	 */
	 async playIntro() {
		const introShort = new Array();
		if (this.accountService.team.length > 1) {
			// MULTI:
			const players: any = this.accountService.team.map(student => student.name).join(" ! ");
			// 1
			introShort.push(
				new ScenarioPhrase($localize`${players}:allPlayersNames: ! Bienvenue dans le jeu du juste point !`)
			)
			// 2
			if (this.page.justePointExercices.exoType === justePointActivity.basket) {
				// BASKET
				introShort.push(
					new ScenarioPhrase([
						$localize`Dans ce jeu, vous allez jouer au basket en calculant !`
					]).setRandomMode()
				)
			} else {
				// ROAD
				introShort.push(
					new ScenarioPhrase([
						$localize`Dans ce jeu, vous allez jouer aux petites voitures en calculant !`
					]).setRandomMode()
				)
			}
		} else {
			// SOLO
			// 1
			introShort.push(
				new ScenarioPhrase($localize`${this.page.currentUser.name}:playerName: ! Bienvenue dans le jeu du juste point !`)
			)
			// 2
			if (this.page.justePointExercices.exoType === justePointActivity.basket) {
				// BASKET
				introShort.push(
					new ScenarioPhrase([
						$localize`Dans ce jeu, tu vas jouer au basket en calculant !`
					]).setRandomMode()
				)
			} else {
				// ROAD
				introShort.push(
					new ScenarioPhrase([
						$localize`Dans ce jeu, tu vas jouer aux petites voitures en calculant !`
					]).setRandomMode()
				)
			}
			// 3
			introShort.push(
				new ScenarioPhrase($localize`On y va ?`),
				new ScenarioPhrase("3... 2... 1..."),
				new ScenarioPhrase(
					[
						$localize`C’est parti !`,
						// $localize`Décollage !`,
						// $localize`Allumage des réacteurs !`,
						$localize`Vers l’infini et au-delà !`,
						$localize`Que la force soit avec toi !`
					]
					).setRandomMode()
			)
		}
		await this.runMathiaSpeech(introShort);
	}

	/**
	 * Recommencer l’activité
	 */
	async restartActivity() {
		const playRestart: Array<any> = [
			new ScenarioPhrase([$localize`Une nouvelle expédition est parée au lancement ? Youpi !`]),
			new ScenarioPhrase([$localize`C’est reparti pour un nouveau voyage dans l’espace des nombres !`])
		];
		await this.runMathiaSpeech(playRestart);
	}

	/**
	 * Lancement de l’activité / 1er joueur
	 */
	async nextPlayerInit() {
		const nextPlayerInit: Array<any> = [
			new ScenarioPhrase([
				$localize`Comme vous êtes ${this.page.currentTeam.length} dans l’équipe, vous allez jouer chacun votre tour !`,
				$localize`Vous êtes ${this.page.currentTeam.length} dans l’équipe donc vous allez jouer chacun votre tour !`
			]).setRandomMode(),
			new ScenarioPhrase([
				$localize`C’est toi qui commences ${this.page.currentUser.name} !`,
				$localize`À toi de commencer ${this.page.currentUser.name} !`,
				$localize`${this.page.currentUser.name}, à toi l’honneur de jouer en premier !`
			]).setRandomMode(),
			new ScenarioPhrase(["3... 2... 1..."]),
			new ScenarioPhrase(
				[
					// $localize`Allons-y !`,
					$localize`C’est parti !`,
					// $localize`Décollage !`,
					$localize`Allumage des moteurs !`,
					$localize`Que la force soit avec toi !`,
					$localize`Vers l’infini et au-delà !`
				]
			)
		];
		await this.runMathiaSpeech(nextPlayerInit);
	}

	/**
	 * Joueur suivant.
	 */
	async nextPlayerSwitch() {
		const nextPlayerContent: Array<any> = [
			new ScenarioPhrase([
				$localize`Maintenant c’est à ${this.page.currentUser.name} de jouer ! Vas-y ! ${this.page.currentUser.name} !`,
				$localize`Maintenant à toi ${this.page.currentUser.name}  ! Vas-y !`,
				$localize`À ton tour ${this.page.currentUser.name} !`,
				$localize`À toi ${this.page.currentUser.name} !`,
				$localize`Maintenant à ton tour ${this.page.currentUser.name} !`,
				$localize`${this.page.currentUser.name} ? Tu es toujours là ? Ok, à toi de jouer !`,
				$localize`Et maintenant c’est à... ${this.page.currentUser.name} !`,
				$localize`À ${this.page.currentUser.name} maintenant !`,
				$localize`${this.page.currentUser.name}, à toi !`,
				$localize`Quel voyage ! À toi ${this.page.currentUser.name} !`
			])
				.speechOnly()
				.setRandomMode()
		];

		// console.log("nextPlayerContent", nextPlayerContent);
		await this.runMathiaSpeech(nextPlayerContent);
	}

	/**
	 * Creates feedbacks for calcul mental on top of general feedbacks
	 */
	 populateScenarioBasket(randomize?: boolean) {
		randomize = true;
		super.populateScenario(randomize);
		// SUCCESS 1ST TRY
			// SLOW
			this.addFeedbacks({ status: AnswerStatus.VALID1ST, speed: AnswerSpeed.SLOW }, 2, [
				$localize`Mieux vaut bien viser avant de tirer #playerName, bien joué !`,
				$localize`Pas facile celui-là ! Bien visé !`,
				$localize`Un petit panier pour toi, une grande victoire pour ton apprentissage ! Bravo !`,
				$localize`Bravo #playerName ! Bien visé !`
			], 2);
			// NORMAL
			this.addFeedbacks({ status: AnswerStatus.VALID1ST, speed: AnswerSpeed.NORMAL }, 1, [
				$localize`Quel tir bien calculé #playerName ! Bien joué !`,
				$localize`Méga-boulonique ce panier !`,
				$localize`Quel super tir ! Bravo !`,
				$localize`Oui, bien visé #playerName !`,
				$localize`Vers l’infini et au-delà ! Bien joué !`,
				$localize`Droit dedans ! Youpi !`,
				$localize`Oui ! Bravo !`,
				$localize`Quel cosmo-panier ! Bien visé !`,
				$localize`Tu m’impressionnes #playerName ! Bravo !`,
			], 2);
			// FAST
			this.addFeedbacks({ status: AnswerStatus.VALID1ST, speed: AnswerSpeed.FAST }, 2, [
				$localize`Wahou ! Tu l’as mis sans hésiter #playerName ! Bravo !`,
				$localize`Incroyable ! Quelle vitesse ! Quelle précision !`,
				$localize`Quelle maîtrise du ballon #playerName ! Bravo !`,
				$localize`Supra-luminique ! Tu tires à la vitesse de l’éclair !`,
				$localize`Par Toutatis ! Quelle maîtrise du ballon !`,
				$localize`Encore un point marqué à la vitesse de la lumière !`,
				$localize`Tu marques plus vite que Michael Jordan #playerName ! Bravo !`

			], 2);
			// PROGRESSION ABOVE AVERAGE
			this.addFeedbacks({ status: AnswerStatus.VALID1ST, progressionAverage: AnswerAverage.ABOVE }, 3, [
				$localize`Dans le mille ! Continue comme ça et tu vas remporter le match #playerName !`,
				// $localize`Je suis impressionnée ! Ce match est une promenade pour toi !`,
				// $localize`Super ! La victoire est proche, continue comme ça !`
			], 2);
			// PROGRESSION BELOW AVERAGE
			this.addFeedbacks({ status: AnswerStatus.VALID1ST, progressionAverage: AnswerAverage.BELOW }, 3, [
				$localize`Bien joué #playerName ! Continue ! Tu peux remonter le score !`
			], 2);
			// PROGRESSION NO ERRORS TILL THEN
			this.addFeedbacks({ status: AnswerStatus.VALID1ST, progressionExtreme: AnswerExtreme.ALLGOOD }, 3, [
				$localize`Sans faute jusqu'ici ! Tu m’épates #playerName !`,
				$localize`Quelle série ! Tu ne rates jamais de panier ?`,
				$localize`Incroyable ! Jusqu’où iras tu comme ça ?`,
				$localize`Epoustouflant #playerName !`,
				$localize`Wahou ! Aucun panier ne t’échappe #playerName !`,
				$localize`Quelle cosmo-réponse ! Tu es supra-luminique !`,
				$localize`Wahou ! Tes processeurs fonctionnent à plein régime !`,
			], 2);
			// PROGRESSION ONLY ERRORS TILL THEN
			this.addFeedbacks({ status: AnswerStatus.VALID1ST, progressionExtreme: AnswerExtreme.ALLBAD }, 3, [
				$localize`Oui #playerName ! C’est ça ! Continue !`
			], 2);
			this.addFeedbacks({ status: AnswerStatus.VALID1ST, speed: AnswerSpeed.FAST, progressionExtreme: AnswerExtreme.ALLGOOD }, 4, [
				$localize`Quelle match ! La foule est en délire !`,
				$localize`Tu es lancé comme une fusée vers le sans faute !`,
				$localize`Wahou ! Tu m’impressionnes #playerName ! Quelle vitesse !`
			], 2);
		// SUCCESS 2ND TRY
			this.addFeedbacks({ status: AnswerStatus.VALID2ND }, 2, [
				$localize`Magnifique contre-attaque de #playerName ! Wahou !`,
				$localize`Beau rattrapage ! Continue !`,
				$localize`Oui, bien rattrapé #playerName !`,
				$localize`Oui ! Tu as trouvé ! Je suis fière de toi !`,
				$localize`Oui ! Bravo ! C’était bien ce panier !`,
				$localize`Super ! Tu as su corriger le tir !`,
				$localize`Bravo ! Avec persévérance on arrive à tout ! Même toucher les étoiles !`,
				$localize`Oui ! Bravo ! Bravo ! Bravooo !`,
				$localize`Un petit pas pour toi, un grand pas pour ton apprentissage ! Bravo !`
			], 2);
		// ERRORS
			// FIRST ERROR - retry with help
			this.addFeedbacks({ status: AnswerStatus.ERROR1ST, needsHelp: AnswerNeedsHelp.YES, speed: AnswerSpeed.SLOW }, 4, [
				$localize`Tu y es presque ! Voyons ces paniers de plus près !`,
				$localize`Tu n’es pas loin ! Regardons de plus près...`,
			], 2);
			this.addFeedbacks({ status: AnswerStatus.ERROR1ST, needsHelp: AnswerNeedsHelp.YES }, 3, [
				$localize`Dommage, tu y étais presque... Regardons de plus près ces paniers !`,
				$localize`Oups, laisse-moi te donner un coup de main !`,
				$localize`Tu t’es trompé mais ce n’est pas grave, c’est comme ça qu’on apprend ! Je vais t’aider !`,
				$localize`Oups ! Ce n’est pas celui-ci ! Je vais t’aider !`,
				$localize`Ce n’était pas ce panier... Je vais te guider !`,
				$localize`Oups ! Ce n’est pas ça. Laisse moi t’aider !`,
				$localize`Ce n’est pas celui-ci. Regardons de plus près !`,
				$localize`Appel à l’entraîneur ! Nous avons besoin d’aide par ici !`,
				$localize`Oups... A côté ! Tu veux un peu d’aide ?`
			], 2);
			this.addFeedbacks({ status: AnswerStatus.ERROR1ST, needsHelp: AnswerNeedsHelp.YES, speed: AnswerSpeed.FAST }, 4, [
				$localize`Oups ! A côté, ralentissons un peu !`,
				$localize`Pas si vite, ce n’est pas celui-là ! Regardons ces paniers de plus près...`,
				$localize`A côté... N’hésite pas à prendre plus de temps pour calculer ton tir ! Voyons ces paniers...`,
				$localize`Ce n’est pas celui-là. Tu devrais peut-être aller plus doucement ?`,
			], 2);
			// SECOND ERROR - failed
			this.addFeedbacks({ status: AnswerStatus.ERROR2ND }, 3, [
				$localize`Tu y étais presque ! Courage, tu vas y arriver !`,
				$localize`Oups à côté... Il faut dire que ce n’était pas un tir facile !`,
				$localize`Ce n’est pas ce panier non plus... Pas facile !`,
				$localize`Ce n’était pas celui-là non plus. Courage !`,
				$localize`Tu t’es trompé mais ce n’est pas grave ! C’est comme ça qu’on apprend !`,
				$localize`Oups, ce n’est pas le bon panier...`
			], 2);
			this.addFeedbacks({ status: AnswerStatus.ERROR2ND, progressionAverage: AnswerAverage.BELOW }, 4, [
				$localize`Oups... Ce n’était pas celui-là ! Courage, je suis sûre que tu vas y arriver !`,
			], 2);
			this.addFeedbacks({ status: AnswerStatus.ERROR2ND, progressionAverage: AnswerAverage.ABOVE }, 4, [
				$localize`Non... Mais, tu mènes toujours le score, ne lâche rien !`,
				$localize`Non... Mais tu restes sur la voie de la victoire ! Continue !`
			], 2);
			this.addFeedbacks({ status: AnswerStatus.ERROR2ND, progressionExtreme: AnswerExtreme.ALLBAD }, 5, [
				$localize`Non... Mais ne t'inquiète pas, c’est en faisant des erreurs qu’on apprend !`,
				$localize`Oups... Courage, je sais que tu vas y arriver !`,
				$localize`Je sais que c’est dur, mais continue d'essayer ! C’est normal de faire des erreurs !`,
				$localize`Ce n’est pas grave #playerName, continue ! Je sais que tu vas y arriver !`,
				$localize`Non plus... Courage, tu vas finir par y arriver #playerName !`,
			], 2);
			this.addFeedbacks({ status: AnswerStatus.ERROR2ND, progressionExtreme: AnswerExtreme.ALLGOOD }, 5, [
				$localize`Aïe ! Retournement de situation ! C’était pourtant si bien parti !`,
			], 2);
			// console.error("feedbacks unshuffled = ", this.feedbacks);
			if (randomize) {
				AppUtils.shuffleArray(this.feedbacks);
				console.error("feedbacks shuffled = ", this.feedbacks);
			}
	}

	populateScenarioOnTheRoad(randomize?: boolean) {
		randomize = true;
		super.populateScenario(randomize);
		// SUCCESS 1ST TRY
			// SLOW
			this.addFeedbacks({ status: AnswerStatus.VALID1ST, speed: AnswerSpeed.SLOW }, 2, [
				$localize`Bien calculé #playerName, bravo !`,
				$localize`Quel calcul minutieux ! Bien joué #playerName !`,
				$localize`Tu as bien pris le temps de calculer ! Tu as raison !`,
				$localize`Un petit calcul pour toi, une grande victoire pour ton apprentissage ! Bravo !`,
				$localize`Bravo #playerName ! Bien calculé !`
			], 2);
			// NORMAL
			this.addFeedbacks({ status: AnswerStatus.VALID1ST, speed: AnswerSpeed.NORMAL }, 1, [
				$localize`C’est ça #playerName ! Bien joué !`,
				$localize`Méga-boulonique ce calcul !`,
				$localize`Quel super calcul ! Bravo !`,
				$localize`Bien joué #playerName !`,
				$localize`Vers l’infini et au-delà ! Bien joué !`,
				$localize`Tu es sur la route du succès #playerName ! Youpi !`,
				$localize`Bravo !`,
				$localize`Tu m’impressionnes #playerName ! Bravo !`,
			], 2);
			// FAST
			this.addFeedbacks({ status: AnswerStatus.VALID1ST, speed: AnswerSpeed.FAST }, 2, [
				$localize`Super positionnement ! Bravo !`,
				$localize`Tu les a placé sans hésiter #playerName ! Bravo !`,
				$localize`Incroyable ! Quelle vitesse ! Quelle précision !`,
				$localize`Quelle maîtrise des distances #playerName ! Bravo !`,
				$localize`Supra-luminique ! Tu réfléchis à la vitesse de l’éclair !`,
				$localize`Par Toutatis ! Quelle maîtrise des distances !`
			], 2);
			// PROGRESSION ABOVE AVERAGE
			this.addFeedbacks({ status: AnswerStatus.VALID1ST, progressionAverage: AnswerAverage.ABOVE }, 3, [
				$localize`Tu es lancé sur l’autoroute de la victoire ! Continue comme ça #playerName !`,
				// $localize`Je suis impressionnée ! Ce match est une promenade pour toi !`,
				// $localize`Super ! La victoire est proche, continue comme ça !`
			], 2);
			// PROGRESSION BELOW AVERAGE
			this.addFeedbacks({ status: AnswerStatus.VALID1ST, progressionAverage: AnswerAverage.BELOW }, 3, [
				$localize`Bien joué #playerName ! Continue ! Tu peux rattraper le retard !`
			], 2);
			// PROGRESSION NO ERRORS TILL THEN
			this.addFeedbacks({ status: AnswerStatus.VALID1ST, progressionExtreme: AnswerExtreme.ALLGOOD }, 3, [
				$localize`Sans faute jusqu'ici ! Tu m’épates #playerName !`,
				$localize`Tu ne t’écartes jamais de la bonne trajectoire toi ! Bravo ! `,
				$localize`Incroyable ! Jusqu’où rouleras tu comme ça ?`,
				$localize`Epoustouflant #playerName !`,
				$localize`Tu roules à toute allure vers la victoire #playerName !`,
				$localize`Quelle cosmo-réponse ! Tu es supra-luminique !`,
				$localize`Tes moteurs fonctionnent à plein régime !`,
			], 2);
			// PROGRESSION ONLY ERRORS TILL THEN
			this.addFeedbacks({ status: AnswerStatus.VALID1ST, progressionExtreme: AnswerExtreme.ALLBAD }, 3, [
				$localize`Tu as trouvé #playerName ! Bravo !`
			], 2);
			this.addFeedbacks({ status: AnswerStatus.VALID1ST, speed: AnswerSpeed.FAST, progressionExtreme: AnswerExtreme.ALLGOOD }, 4, [
				$localize`Quelle course ! La foule est en délire !`,
				$localize`Tu es lancé comme un bolide vers le sans faute !`,
				$localize`Tu m’impressionnes #playerName ! Quelle vitesse !`,
				$localize`Je ne sais pas ce que tu mets dans ton réservoir mais ça carbure !`
			], 2);
		// SUCCESS 2ND TRY
			this.addFeedbacks({ status: AnswerStatus.VALID2ND }, 2, [
				$localize`Magnifique correction de trajectoire #playerName ! Bravo !`,
				$localize`Beau rattrapage ! Continue !`,
				$localize`Bien manœuvré #playerName !`,
				$localize`Tu as trouvé ! Je suis fière de toi !`,
				$localize`Bravo ! C’était bien ces distances !`,
				$localize`Super ! Tu as su éviter la sortie de route !`,
				$localize`Bravo ! Avec persévérance on arrive à tout ! Même toucher les étoiles !`,
				$localize`Bravo ! Bravo ! Bravooo !`,
				$localize`Un petit pas pour toi, un grand pas pour ton apprentissage ! Bravo !`
			], 2);
		// ERRORS
			// FIRST ERROR - retry with help
			this.addFeedbacks({ status: AnswerStatus.ERROR1ST, needsHelp: AnswerNeedsHelp.YES, speed: AnswerSpeed.SLOW }, 4, [
				$localize`Tu y es presque ! Voyons ces voitures de plus près !`,
				$localize`Tu n’es pas loin ! Regardons de plus près...`,
			], 2);
			this.addFeedbacks({ status: AnswerStatus.ERROR1ST, needsHelp: AnswerNeedsHelp.YES }, 3, [
				$localize`Oups, laisse-moi te donner un coup de main !`,
				$localize`Tu t’es trompé mais ce n’est pas grave, c’est comme ça qu’on apprend ! Je vais t’aider !`,
				$localize`Oups ! Ce n’est pas exactement ça ! Je vais t’aider !`,
				$localize`Pas vraiment... Je vais te guider !`,
				$localize`Oups ! Ce n’est pas ça. Laisse moi t’aider !`,
				$localize`Ce ne sont pas ces distances. Regardons de plus près !`,
				$localize`Appel aux mécaniciens ! Nous avons besoin d’aide par ici !`,
				$localize`Oups... Pas tout à fait ! Tu veux un peu d’aide ?`
			], 2);
			this.addFeedbacks({ status: AnswerStatus.ERROR1ST, needsHelp: AnswerNeedsHelp.YES, speed: AnswerSpeed.FAST }, 4, [
				$localize`Ce n’est pas ça. Tu pourrais peut-être aller plus doucement ?`,
				$localize`Excès de vitesse ! Contrôle des véhicules !`,
				$localize`Non... N’hésite pas à prendre plus de temps pour placer les voitures !`,
				$localize`Pas si vite, tu vas sortir de la route ! Regardons ces voitures de plus près...`,
				$localize`Oups ! Pas tout à fait. Ralentissons un peu et réfléchissons !`,
			], 2);
			// SECOND ERROR - failed
			this.addFeedbacks({ status: AnswerStatus.ERROR2ND }, 3, [
				$localize`Tu y étais presque ! Courage, tu vas y arriver !`,
				$localize`Oups sortie de route... Il faut dire qu’il est difficile ce circuit !`,
				$localize`Presque ! Continue d’essayer #playerName ! Courage !`,
				$localize`Ce n’est pas ça... Pas facile ce circuit !`,
				$localize`Tu t’es trompé mais ce n’est pas grave ! C’est comme ça qu’on apprend !`,
				$localize`Oups. Pas évident, pas vrai ? Mais continue ! Tu vas y arriver !`
			], 2);
			this.addFeedbacks({ status: AnswerStatus.ERROR2ND, progressionAverage: AnswerAverage.BELOW }, 4, [
				$localize`Oups... Ce n’est pas ça ! Courage, je suis sûre que tu vas y arriver !`,
			], 2);
			this.addFeedbacks({ status: AnswerStatus.ERROR2ND, progressionAverage: AnswerAverage.ABOVE }, 4, [
				$localize`Non... Mais, tu es toujours en bonne voie, ne lâche rien !`,
				$localize`Non... Mais tu restes sur la route de la victoire ! Continue !`
			], 2);
			this.addFeedbacks({ status: AnswerStatus.ERROR2ND, progressionExtreme: AnswerExtreme.ALLBAD }, 5, [
				$localize`Non... Mais ne t'inquiète pas, c’est en faisant des erreurs qu’on apprend !`,
				$localize`Oups... Courage, je sais que tu vas y arriver !`,
				$localize`Je sais que c’est dur, mais continue d'essayer ! C’est normal de faire des erreurs !`,
				$localize`Ce n’est pas grave #playerName, continue ! Je sais que tu vas y arriver !`,
				$localize`Non plus... Courage, tu vas finir par y arriver #playerName !`,
			], 2);
			this.addFeedbacks({ status: AnswerStatus.ERROR2ND, progressionExtreme: AnswerExtreme.ALLGOOD }, 5, [
				$localize`Aïe ! Petit accident ! C’était pourtant si bien parti ! Continuons cette route !`,
			], 2);
			// console.error("feedbacks unshuffled = ", this.feedbacks);
			if (randomize) {
				AppUtils.shuffleArray(this.feedbacks);
				console.error("feedbacks shuffled = ", this.feedbacks);
			}
	}

	/**
	 * dynamic Feedback depending of answer context - Basket + Road
	 */
	async dynamicFeedback(answerStatus: AnswerStatus, responseTimeInSeconds: number, award?: string, help?: AnswerNeedsHelp) {
		let phrase;
		const speechSequence = new Array();
		const timeForSlowAnswer = 20;
		console.error("responseTimeInSeconds = ", responseTimeInSeconds);
		if (answerStatus !== AnswerStatus.ERROR1ST) {
			this.page.showHideAward();
		}
		if (this.page.endOfActivity()) {
			this.page.displayActivityElements(false);
			speechSequence.push(
				new ScenarioPhrase([
					$localize`Wahou ! Quelle expédition !`,
					$localize`Oui ! Quelle expédition !`,
					$localize`Bravo ! Quel voyage !`,
					$localize`Bien joué ! Quel cosmo-voyage !`
				])
					.setRandomMode()
					.showAward(award)
			);
		} else {
			const timeForFastAnswer = this.page.justePointExercices.exoType === justePointActivity.basket ? 4 : 8;
			if (answerStatus === AnswerStatus.VALID1ST || answerStatus === AnswerStatus.VALID2ND) {
				phrase = this.getContextualFeedbackPhrase(answerStatus, responseTimeInSeconds, award, timeForSlowAnswer, timeForFastAnswer, 5, 3);
				if (this.page.currentUser.awardsCurrent.total < 6 && this.resultPhrase) {
					phrase = this.resultPhrase + " " + phrase;
				}
				console.error(phrase);
				speechSequence.push(
					new ScenarioPhrase([phrase]).setRandomMode().showAward(award)
					);
			} else {
				phrase = this.getContextualFeedbackPhrase(answerStatus, responseTimeInSeconds, award, timeForSlowAnswer, timeForFastAnswer, 5, 3, help);
				speechSequence.push(
					new ScenarioPhrase([phrase]).setRandomMode()
					);
			}
		}
		await this.runMathiaSpeech(speechSequence);
	}

	async playSoundWithAward(award?: string) {
		let speechSequence;
		this.page.hideBubbleText = true;
		let awardSoundPromise;
		if (award) {
			if (award === "moon") {
				awardSoundPromise = this.page.audioService.playAwardMoonSound();
			} else {
				awardSoundPromise = this.page.audioService.playStarSound();
			}
			if (this.page.justePointExercices.exoType === justePointActivity.onTheRoad &&
				this.page.currentUser.awardsCurrent.total < 6 && this.resultPhrase) {
				// inject result phrase in sonic award
				this.page.hideBubbleText = false;
				speechSequence = [new ScenarioPhrase(this.resultPhrase, async() => {
					await this.timeOut(1500);
				}).showAward(award)];
			} else {
				speechSequence = [new ScenarioPhrase(" ", async() => {
					await this.timeOut(1500);
				}).showAward(award)];
			}
			await this.runMathiaSpeech(speechSequence);
		} else {
			this.page.audioService.playAwardMoonSound();
			await this.timeOut(1500);
		}
		this.page.hideBubbleText = false;
	}

	/**
	 * Mauvaise réponse avec affichage solution
	 */
	 async badResponseMoonWithResultBasketDynamic(answerStatus: AnswerStatus, responseTimeInSeconds: number, award?: string) {
		const phrase = this.getContextualFeedbackPhrase(answerStatus, responseTimeInSeconds, award, 20, 4, 5, 3);
		const moonResult: Array<any> = [
			new ScenarioPhrase([
				phrase
			],
			async () => {
				await this.timeOut(500);
			}).setRandomMode(),
			new ScenarioPhrase([
				$localize`Tu as quand même gagné une lune !`,
				$localize`Nous avons quand même gagné une lune !`
			],
				async () => {
					await this.timeOut(1000);
				}
			)
				.setRandomMode()
				.showAward("moon")
		];
		await this.runMathiaSpeech(moonResult);
	}

	/**
	 * Mauvaise réponse avec affichage solution et question suivante
	 */
	async badResponseMoonWithResultNextQRoadDynamic(
		resultOnTheRoad: ResultOnTheRoad,
		answerStatus: AnswerStatus,
		responseTimeInSeconds: number,
		award?: string
		) {
		let promiseAnimation;
		const phrase = this.getContextualFeedbackPhrase(answerStatus, responseTimeInSeconds, award, 20, 4, 5, 3);
		// TODO push to add :
		const moonResult: Array<any> = [
			new ScenarioPhrase(
				[
					phrase
				],
				async () => {
					await promiseAnimation;
					this.cabriService.hideMathia = true;
					if (!this.skipSequence) {
						this.page.cabri.showAllKpost();
						this.page.cabri.highlightCar(true, resultOnTheRoad);
					}
					this.page.cabri.setAllCarOnCorrectPosition(resultOnTheRoad);
				}
			).setRandomMode(),
			new ScenarioPhrase([
				this.resultPhraseRemediation ?
				$localize`Le bon placement était celui là, car ${this.resultPhraseRemediation}`
				:
				$localize`Le bon placement était celui là !`
		], async () => {
				await this.timeOut(4000);
			}),
			new ScenarioPhrase(
				[$localize`Tu as quand même gagné une lune !`, $localize`Nous avons quand même gagné une lune !`],
				async () => {
					this.page.showHideAward();
					await this.timeOut(2000);
				}
			).setRandomMode().showAward("moon"),
			new ScenarioPhrase(
				[
					$localize`Passons à la prochaine question !`,
					$localize`Voyons si nous avons plus de chance avec la prochaine question !`,
					$localize`Essayons une autre question !`,
					$localize`Reprenons la bonne trajectoire avec la question suivante`,
					$localize`Voyons si nous pouvons trouver le résultat de la prochaine question !`
				],
				async () => {
					await this.timeOut(1000);
				}
			).setRandomMode()
		];
		promiseAnimation = this.page.runAnimError(false);
		await this.runMathiaSpeech(moonResult);
	}

	ttsFraction(fraction: Fraction) {
		var unites = new Array(
			$localize`zéro`,
			$localize`un`,
			$localize`deux`,
			$localize`trois`,
			$localize`quatre`,
			$localize`cinq`,
			$localize`six`,
			$localize`sept`,
			$localize`huit`,
			$localize`neuf`,
			$localize`dix`,
			$localize`onze`,
			$localize`douze`,
			$localize`treize`,
			$localize`quatorze`,
			$localize`quinze`,
			$localize`seize`
		);
		var soixante = $localize`soixante`;
		var quatrevingt = $localize`quatre-vingt`;
		var dizaines = new Array(
			"",
			unites[10],
			$localize`vingt`,
			$localize`trente`,
			$localize`quarante`,
			$localize`cinquante`,
			soixante,
			soixante,
			quatrevingt,
			quatrevingt
		);
		var mul = new Array(
			$localize`cent`,
			$localize`mille`,
			$localize`million`,
			$localize`milliard`,
			$localize`billion`,
			$localize`JeNeSaisPas`
		);
		var pp = new Array(100, 1000, 1000000, 1000000000, 1000000000000, 1000000000000000);
		var tiret = "-";
		var et = " et ";
		var espace = " ";
		var pluriel = "s";
		function getCardinal(n, debut) {
			n = Math.abs(Number(n));
			if ("" + n == "NaN") return "";
			var j = 6;
			while (j--) {
				var z = Number(Math.floor(n / pp[j]));
				if (z > 0) {
					var r = n % pp[j];
					if (j < 2 && z == 1) {
						if (r > 0) return mul[j] + espace + getCardinal(r, debut);
						return mul[j];
					}
					var s = getCardinal(z, false) + espace + mul[j];
					if (r > 0) return s + espace + getCardinal(r, debut);
					if (debut && j == 0) return s + pluriel;
					return s;
				}
			}
			if (n < 17) return unites[n];
			var ndix = Number(Math.floor(n / 10));
			var d = dizaines[ndix];
			n = n % 10;
			if (ndix == 7 || ndix == 9) {
				if (ndix == 7 && n == 1) return d + et + unites[11];
				if (n < 7) return d + tiret + unites[n + 10];
				return d + tiret + getCardinal(n + 10, debut);
			}
			if (n == 0) {
				if (debut && ndix == 8) return d + pluriel;
				return d;
			}
			if (n == 1 && ndix != 8) return d + et + unites[n];
			return d + tiret + unites[n];
		}
		function getOrdinal(x) {
			switch (x) {
				case 2:
					return $localize`demi`;
					break;
				case 3:
					return $localize`tiers`;
					break;
				case 4:
					return $localize`quart`;
					break;
				default:
					x = Math.abs(Number(x));
					if ("" + x == "NaN" || x == 0) return "";
					var t = getCardinal(x, false);
					var s = t.substring(t.length - 1, t.length);
					if (s == "f") t = t.substr(0, t.length - 1) + "v";
					else if (s == "e") t = t.substr(0, t.length - 1);
					else if (s == "q") t = t + "u";
					return t + $localize`ième`;
			}
		}
		return fraction.numerateur + " " + getOrdinal(fraction.denominateur);
	}

	async runCompleteRemediationBasket() {
		const unitStep =
			this.page.variable.unitStep instanceof Fraction
				? this.page.variable.unitStep.toLatex()
				: String(this.page.variable.unitStep.valueOf()).replace(".", ",");

		let phrase: Array<any>;
		this.page.cabri.keepRemediationElements();
		const decimal = this.page.variable.unitStep.valueOf() % 1 !== 0;
		const phraseShowUnity = $localize`Dans cet exemple, pour passer d’une valeur à la suivante, on ajoute `+ " ";
		let phraseReadUnity;
		if (decimal && this.page.variable.unitStep instanceof Fraction) {
			phraseReadUnity = phraseShowUnity + this.ttsFraction(this.page.variable.unitStep);
		} else if (decimal) {
			phraseReadUnity =
				phraseShowUnity +
				this.page.variable.unitStep
					.valueOf()
					.toString()
					.replace(".", $localize`:number decimal point:virgule`);
		} else {
			phraseReadUnity = phraseShowUnity + this.page.variable.unitStep.valueOf();
		}
		phrase = [
			new ScenarioPhrase([$localize`Afin de repérer un point, on utilise la droite graduée.`], async () => {
				await this.timeOut(300);
				this.page.cabri.hideAlmostRemediationElements();
			}),
			new ScenarioPhrase(
				[$localize`Tout au long de cette droite, nous avons des petits traits qu’on appelle les graduations. Les voici !`],
				async () => {
					// await this.timeOut(500);
					await this.page.cabri.showHideLines(true, false);
				}
			),
			new ScenarioPhrase([$localize`Prenons deux valeurs consécutives.`], async () => {
				await this.page.cabri.showLineBoxResult(true, false);
				await this.timeOut(1000);
			}),
			new ScenarioPhrase([$localize`L’unité de graduation est l’espace qui sépare ces deux valeurs.`], async () => {
				await this.page.cabri.showLineBoxResult(false, false);
				await this.timeOut(1000);
			}),
			new ScenarioPhrase(
				[` ${phraseShowUnity + String(unitStep)}.`],
				async () => {
					if (this.page.variable.chooseExactNumber) {
						this.page.cabri.showDrawedCircleLine();
						await this.page.cabri.showLineBoxResult(false, true);
					}
					await this.timeOut(2000);
				},
				[` ${phraseReadUnity}.`]
			)
		];
		await this.runMathiaSpeech(phrase);
		if (!this.page.variable.chooseExactNumber) {
			await this.runCompleteRemediationBasketNotExact();
		}
		this.page.activateHelp = false;
		this.page.cabri.showHideBoxesResults(true);
	}

	async runCompleteRemediationBasketNotExact() {
		let phrase: Array<any>;
		const virgule = $localize`virgule`;
		const ttsStepValue = String(this.page.variable.unitStep.valueOf()).replace(".", virgule);
		const approx = String(this.page.variable.unitStep.valueOf() / this.page.variable.approximation).replace(".", virgule);
		const approximation = String(this.page.variable.approximation);
		const resultat = `${String(this.page.variable.unitStep.valueOf()).replace(".", ",")} : ${String(
			this.page.variable.approximation
		).replace(".", ",")} = ${String(this.page.variable.unitStep.valueOf() / this.page.variable.approximation).replace(".", ",")}`;
		phrase = [
			new ScenarioPhrase(
				[
					$localize`Ensuite, il faut compter combien d’espaces séparent deux graduations orange. Dans cet exemple il y en a ${this.page.variable.approximation}.`
				],
				async () => {
					await this.page.cabri.showDrawedCircleLinesByIndexes();
					if (!this.skipSequence) {
						await AppUtils.timeOut(2000);
					}
				}
			),
			new ScenarioPhrase([$localize`Chaque espace mesure donc ${resultat}.`], () => {}, [
				$localize`:tts:Chaque espace mesure donc ${ttsStepValue} divisé par ${approximation} égale ${approx}.`
			])
		];
		await this.runMathiaSpeech(phrase);
		this.page.activateHelp = false;
	}

	async runResumedRemediationBasket() {
		const unitStep =
			this.page.variable.unitStep instanceof Fraction
				? this.page.variable.unitStep.toLatex()
				: String(this.page.variable.unitStep.valueOf()).replace(".", ",");

		let phrase: Array<any>;
		let phraseNotExactNumber: Array<any>;

		const decimal = this.page.variable.unitStep.valueOf() % 1 !== 0;
		let valueToRead;
		let phraseTTS = $localize`La droite graduée est divisée en segments qui mesurent chacun ` + " ";
		if (decimal && this.page.variable.unitStep instanceof Fraction) {
			valueToRead = phraseTTS + this.ttsFraction(this.page.variable.unitStep);
		} else if (decimal) {
			const virgule = $localize`virgule`;
			valueToRead = phraseTTS + this.page.variable.unitStep.valueOf().toString().replace(".", virgule);
		} else {
			valueToRead = phraseTTS + this.page.variable.unitStep.valueOf();
		}
		const startPhrase = (phraseTTS += String(unitStep));
		this.page.cabri.keepRemediationElements();
		const phraseCommon = new ScenarioPhrase(
			[$localize`${startPhrase}. Pour le savoir, mesure la distance entre ces deux valeurs.`],
			async () => {
					await this.page.cabri.showBasketDistanceGraduation();
					if (!this.skipSequence) {
						await AppUtils.timeOut(3000);
					}
			},
			[$localize`:tts:${valueToRead}. Pour le savoir, mesure la distance entre ces deux valeurs.`]
		);
		if (!this.page.variable.chooseExactNumber && this.page.variable.approximation > 1) {
			const virgule = $localize`virgule`;
			const ttsStepValue = String(this.page.variable.unitStep.valueOf()).replace(".", virgule);
			const resultTTS = String(this.page.variable.unitStep.valueOf() / this.page.variable.approximation).replace(".", virgule);
			const approximationTTS = String(this.page.variable.approximation);

			const resultPhrase = `${String(this.page.variable.unitStep.valueOf()).replace(".", ",")} : ${String(
				this.page.variable.approximation
			).replace(".", ",")} = ${String(this.page.variable.unitStep.valueOf() / this.page.variable.approximation).replace(".", ",")}`;
			phraseNotExactNumber = [
				new ScenarioPhrase(
					[
						$localize`Ensuite, il faut compter combien d’espaces séparent deux graduations orange. Dans cet exemple il y en a ${this.page.variable.approximation}.`
					],
					async () => {
						if (!this.skipSequence) {
							await this.page.cabri.showDrawedCircleLinesByIndexes();
						}
					}
				),
				new ScenarioPhrase([$localize`Chaque espace mesure donc ${resultPhrase} .`], () => {}, [
					$localize`:tts:Chaque espace mesure donc ${ttsStepValue} divisé par ${approximationTTS} égale ${resultTTS}.`
				]),
				new ScenarioPhrase(
					[$localize`Une fois que tu as la bonne réponse, place le ballon dans le bon intervalle. Comme ceci.`],
					async () => {
						if (!this.skipSequence) {
							await this.page.cabri.moveBallAnimation();
							if (!this.skipSequence) {
								await AppUtils.timeOut(1000);
							}
						}
					}
				)
			];
		}
		phrase = [phraseCommon];
		if (phraseNotExactNumber) {
			phrase.push(...phraseNotExactNumber);
		}

		await this.runMathiaSpeech(phrase);
	}

	async runRemediationRoad() {
		let phrase: Array<any>;
		let promisePart2: Promise<void>;
		const result = await this.page.cabri.remediationRoadPart1();
		const unitStep = this.page.variable.unitStep.valueOf();
		const resultKm = result.value.valueOf();
		const firstPhrase = $localize`Regarde ce tronçon de route correspond à : ${unitStep} km de distance.`;
		const secondPhrase = $localize`Tu as parcouru  ${result.range} km de distance et tu te situes à ${resultKm} km`;
		phrase = [
			new ScenarioPhrase(
				firstPhrase,
				async () => {
					await this.timeOut(1000);
					if (!this.skipSequence) {
						promisePart2 = this.page.cabri.remediationRoadPart2(result.turn);
					}
				},
				firstPhrase.replace(/\d\.\d/gm, $localize`:replacement keep space: virgule `).replace($localize`km`, $localize`kilomètre`)
			),
			new ScenarioPhrase($localize`Si tu répètes ${result.turn} fois ce tronçon.`, async () => {
				await promisePart2;
			}),
			new ScenarioPhrase(
				secondPhrase,
				async () => {
					await this.timeOut(2000);
					this.page.cabri.disposeRemediationRoad();
				},
				secondPhrase.replace($localize`km`, $localize`kilomètre`)
			),
		];
		// réessaie / réessaye
		await this.runMathiaSpeech(phrase);
		phrase = [
			new ScenarioPhrase([
				$localize`Maintenant essaye encore !`,
				$localize`Maintenant essaie encore !`,
				$localize`Maintenant réessaye !`,
				$localize`Maintenant réessaie !`
			], async () => {
			// await this.timeOut(1000);
			this.page.displayCM = false;
		}).setRandomMode()]
		await this.runMathiaSpeech(phrase);
	}

	async runRemediationRoadReverse() {
		const phrase: Array<any> = [
			new ScenarioPhrase([$localize`Il faut faire attention aux couleurs de chaque voiture !`]),
			new ScenarioPhrase([$localize`Essaye encore !`], async () => {
				this.page.displayCM = false;
			})
		];
		await this.runMathiaSpeech(phrase);
	}

	async runRemediationBasket() {
		const unitStep =
			this.page.variable.unitStep instanceof Fraction
				? this.page.variable.unitStep.toLatex()
				: String(this.page.variable.unitStep.valueOf()).replace(".", ",");
		let phrase: Array<any>;
		this.page.cabri.keepRemediationElements();
		const decimal = this.page.variable.unitStep.valueOf() % 1 !== 0;
		const phraseShowUnity = $localize`Ces deux nombres sont consécutifs car on passe d’un nombre à l’autre en ajoutant `;
		let phraseReadUnity;
		if (decimal && this.page.variable.unitStep instanceof Fraction) {
			phraseReadUnity = phraseShowUnity + this.ttsFraction(this.page.variable.unitStep);
		} else if (decimal) {
			phraseReadUnity =
				phraseShowUnity +
				this.page.variable.unitStep
					.valueOf()
					.toString()
					.replace(".", $localize`:number decimal point:virgule`);
		} else {
			phraseReadUnity = phraseShowUnity + this.page.variable.unitStep.valueOf();
		}
		phrase = [
			new ScenarioPhrase([$localize`Afin de repérer un point sur une droite, on utilise la demi-droite graduée.`], async () => {
				await this.timeOut(300);
				this.page.cabri.hideAlmostRemediationElements();
			}),
			new ScenarioPhrase(
				[$localize`Tout au long de la demi-droite nous avons des petits traits, qu’on appelle la graduation. Les voici !`],
				async () => {
					// await this.timeOut(500);
					await this.page.cabri.showHideLines(true, false);
				}
			),
			new ScenarioPhrase([$localize`Voici deux nombres qu’on va placer sur cette droite.`], async () => {
				await this.page.cabri.showLineBoxResult(true, false);
				await this.timeOut(1000);
			}),
			new ScenarioPhrase([$localize`L’unité de graduation est l’espace qui sépare 2 nombres consécutifs.`], async () => {
				await this.page.cabri.showLineBoxResult(false, false);
				await this.timeOut(1000);
			}),
			new ScenarioPhrase(
				[` ${phraseShowUnity + unitStep}.`],
				async () => {
					if (this.page.variable.chooseExactNumber) {
						this.page.cabri.showDrawedCircleLine();
						await this.page.cabri.showLineBoxResult(false, true);
					}
					await this.timeOut(2000);
				},
				[` ${phraseReadUnity}.`]
			)
		];
		await this.runMathiaSpeech(phrase);
		if (!this.page.variable.chooseExactNumber) {
			await this.runCompleteRemediationBasketNotExact();
		}
		this.page.activateHelp = false;
		this.page.cabri.showHideBoxesResults(true);
	}

	/**
	 * @ignore
	 * message before the user starts a new question for "calcul mental"
	 */
	async readCurrentOperationNormal() {
		const content: Array<any> = [new ScenarioPhrase([this.page.readCurrentOperation(this.page.setOperationMode)]).hideBubble()];
		await this.runMathiaSpeech(content);
	}
	/**
	 * @ignore
	 * message before the user starts a new question for "résolution de problème"
	 */
	async readCurrentOperationProbleme() {
		const phrases = this.page.cabriService.currentExercice.probleme.consigne.split(".");
		const content: Array<any> = [];
		if (!this.page.failure) {
			phrases.forEach(element => {
				content.push(new ScenarioPhrase([element]).hideBubble());
			});
		} else {
			content.push(new ScenarioPhrase([phrases[phrases.length - 1]]).hideBubble());
		}
		await this.runMathiaSpeech(content);
	}

	/**
	 *Highlight les voiture en erreurs
	 */
	async showErrorCar(resultOnTheRoad: ResultOnTheRoad) {
		this.page.cabri.highlightCar(true, resultOnTheRoad);
		const speechSequence = [
			new ScenarioPhrase([
				resultOnTheRoad.carsError.length > 1
					? $localize`Les voitures qui brillent sont mal placées.`
					: $localize`La voiture qui brille est mal placée.`
			])
		];
		await this.runMathiaSpeech(speechSequence);
		this.page.displayCM = false;
		await this.timeOut(300);
	}

	/**
	 *Highlight les voiture en erreurs
	 */
	async showRightPositionCar(resultOnTheRoad: ResultOnTheRoad) {
		this.page.cabri.highlightCar(true, resultOnTheRoad);
		this.page.cabri.setAllCarOnCorrectPosition(resultOnTheRoad);
		const speechSequence = [new ScenarioPhrase([$localize`Le bon placement est celui la.`])];
		await this.runMathiaSpeech(speechSequence);
		this.page.displayCM = false;
		await this.timeOut(3000, () => {
			this.page.cabri.highlightCar(false, resultOnTheRoad);
		});
	}
}

results matching ""

    No results matching ""