src/app/models/scenario-jeu-juste-point.ts
Scénarios pour l’activité Calcul mental
constructor(cabri: CabriDataService, accountService: AccountService, globalService: GlobalService, page: any, cd: ChangeDetectorRef, ttsService: any)
|
| 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
|
| help2NumberSeparation |
help2NumberSeparation: |
| Public page |
page: |
| resultPhrase |
resultPhrase: |
| resultPhraseRemediation |
resultPhraseRemediation: |
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);
});
}
}