File indexing completed on 2024-05-12 15:21:40

0001 /* GCompris - tens_complement_swap.js
0002  *
0003  * SPDX-FileCopyrightText: 2022 Samarth Raj <mailforsamarth@gmail.com>
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  *
0006  */
0007 .pragma library
0008 .import "qrc:/gcompris/src/core/core.js" as Core
0009 
0010 var numberOfLevel;
0011 var items;
0012 var datasets = [];
0013 var currentDatasetLevel = 0;
0014 var numberOfDatasetLevel;
0015 var previousSelectedCard = undefined;
0016 
0017 function start(items_) {
0018     items = items_
0019     datasets.length = 0;
0020     for(var indexForDataset = 0; indexForDataset < items.levels.length; indexForDataset++) {
0021         for(var indexForLevel = 0; indexForLevel < items.levels[indexForDataset].value.length; indexForLevel++) {
0022             datasets.push(items.levels[indexForDataset].value[indexForLevel]);
0023         }
0024     }
0025     numberOfDatasetLevel = items.levels.length;
0026     numberOfLevel = datasets.length;
0027     items.currentLevel = Core.getInitialLevel(numberOfLevel);
0028     initLevel();
0029 }
0030 
0031 function stop() {
0032     clearListModels();
0033 }
0034 
0035 function initLevel() {
0036     clearListModels();
0037     previousSelectedCard = undefined;
0038     for(var indexOfListModel = 0; indexOfListModel < datasets[items.currentLevel].length; indexOfListModel++) {
0039         var model = [];
0040         var valueArray = getValueArray(datasets[items.currentLevel][indexOfListModel]);
0041         for(var indexOfDisplayArray = 0; indexOfDisplayArray < valueArray.length - 1; indexOfDisplayArray++) {
0042             var card = {};
0043             if(!Number.isNaN(parseInt(valueArray[indexOfDisplayArray]))) {
0044                 card = {
0045                     "type": "numberCard",
0046                     "value": valueArray[indexOfDisplayArray].toString(),
0047                     "rowNumber": indexOfListModel,
0048                     "selected": false,
0049                     "selectable": true
0050                 }
0051             }
0052             else {
0053                 card = {
0054                     "type": "symbolCard",
0055                     "value": valueArray[indexOfDisplayArray].toString()
0056                 }
0057             }
0058             model.push(card);
0059         }
0060         var resultCard = {
0061             "type": "resultCard",
0062             "value": valueArray[valueArray.length - 1].toString(),
0063         }
0064         model.push(resultCard);
0065         items.equations.append({
0066             "listmodel": model,
0067             "isGood": false,
0068             "isValidationImageVisible": false
0069         });
0070     }
0071 }
0072 
0073 function clearListModels() {
0074     items.equations.clear();
0075 }
0076 
0077 /*
0078  * For a given array of numbers this function returns an array of elements to be displayed.
0079  * It calculates the number of pairs to display and an additional number if the size is odd.
0080  */
0081 function getValueArray(numberArray) {
0082     var valueArray = [];
0083     var totalSum = 0;
0084     var indexOfNumberValue = 0;
0085     var countOfNumbers = numberArray.randomValues ? numberArray.numberOfElements : numberArray.numberValue.length;
0086     var numberOfPairs = Math.floor(countOfNumbers / 2);
0087     var values = [];
0088     if(numberArray.randomValues) {
0089         var numberOfPairsFilled = 0;
0090         while(numberOfPairsFilled != numberOfPairs) {
0091             // Get a number between 1 and 9
0092             var randomNumber = Math.floor(1 + Math.random() * 9);
0093 
0094             // Avoid having twice the same numbers
0095             // If we have more than 10 numbers, it's impossible to avoid repetition.
0096             if(values.length < 10 && values.indexOf(randomNumber) > -1) {
0097                 continue;
0098             }
0099 
0100             values.push(randomNumber);
0101             values.push(10 - randomNumber);
0102             numberOfPairsFilled ++;
0103         };
0104         if(countOfNumbers % 2 != 0) {
0105             // Add a random number at the end between 1 and 9
0106             values.push(Math.floor(Math.random() * 9) + 1);
0107         }
0108     }
0109     else {
0110         values = numberArray.numberValue;
0111     }
0112     if(numberArray.randomizeOrder == undefined || numberArray.randomizeOrder == true) {
0113         var maxNumberOfShuffles = 10;
0114         do {
0115             // Shuffle the numbers before creating the model.
0116             // Make sure at least the first computation is not correct to avoid having the possibility to have all good answers at start
0117             Core.shuffle(values);
0118             maxNumberOfShuffles--;
0119         } while(values[0] + values[1] == 10 && maxNumberOfShuffles > 0);
0120     }
0121 
0122     for(var i = 0; i < numberOfPairs; i++) {
0123         valueArray.push("(");
0124         valueArray.push(values[indexOfNumberValue].toString());
0125         totalSum += values[indexOfNumberValue];
0126         indexOfNumberValue++;
0127         valueArray.push("+");
0128         valueArray.push(values[indexOfNumberValue].toString());
0129         totalSum += values[indexOfNumberValue];
0130         indexOfNumberValue++;
0131         valueArray.push(")");
0132         if(i != numberOfPairs - 1) {
0133             valueArray.push("+");
0134         }
0135     }
0136     if(countOfNumbers % 2 != 0) {
0137         valueArray.push("+");
0138         valueArray.push(values[indexOfNumberValue].toString());
0139         totalSum += values[indexOfNumberValue];
0140     }
0141     valueArray.push("=");
0142     valueArray.push(totalSum.toString());
0143     return valueArray;
0144 }
0145 
0146 function swapCards(firstCard, secondCard) {
0147     var selectedEquation = items.equations.get(firstCard.rowNumber).listmodel;
0148     var firstPosition = Math.min(firstCard.columnNumber, secondCard.columnNumber);
0149     var secondPosition = Math.max(firstCard.columnNumber, secondCard.columnNumber);
0150     if(firstPosition != secondPosition) {
0151         selectedEquation.move(firstPosition, secondPosition, 1);
0152         selectedEquation.move(secondPosition - 1, firstPosition, 1);
0153     }
0154 }
0155 
0156 function selectCard(currentSelectedCard) {
0157     items.equations.get(currentSelectedCard.rowNumber).isValidationImageVisible = false;
0158     if(previousSelectedCard != undefined) {
0159         if(previousSelectedCard.rowNumber == currentSelectedCard.rowNumber) {
0160             swapCards(currentSelectedCard, previousSelectedCard)
0161         }
0162         items.equations.get(currentSelectedCard.rowNumber).listmodel.get(currentSelectedCard.columnNumber).selected = false;
0163         items.equations.get(previousSelectedCard.rowNumber).listmodel.get(previousSelectedCard.columnNumber).selected = false;
0164         previousSelectedCard = undefined;
0165     }
0166     else {
0167         previousSelectedCard = currentSelectedCard;
0168     }
0169 
0170 }
0171 
0172 function nextLevel() {
0173     items.currentLevel = Core.getNextLevel(items.currentLevel, numberOfLevel);
0174     initLevel();
0175 }
0176 
0177 function previousLevel() {
0178     items.currentLevel = Core.getPreviousLevel(items.currentLevel, numberOfLevel);
0179     initLevel();
0180 }
0181 
0182 function checkAnswer() {
0183     var isAllCorrect = true;
0184     for(var indexOfRows = 0; indexOfRows < items.equations.count; indexOfRows++) {
0185         var numberCardCounter = 0;
0186         var sum = 0;
0187         var isRowCorrect = true;
0188         var currentRow = items.equations.get(indexOfRows);
0189         var currentEquation = currentRow.listmodel;
0190         for(var indexOfCards = 0; indexOfCards < currentEquation.count - 1; indexOfCards++) {
0191             var currentCard = currentEquation.get(indexOfCards);
0192             if(currentCard.type == "numberCard") {
0193                 if(numberCardCounter != 2) {
0194                     sum += parseInt(currentCard.value);
0195                 }
0196                 numberCardCounter++;
0197                 if(numberCardCounter == 2) {
0198                     if(sum != 10) {
0199                         isRowCorrect = false;
0200                         break;
0201                     }
0202                     numberCardCounter = 0;
0203                     sum = 0;
0204                 }
0205             }
0206         }
0207         currentRow.isGood = isRowCorrect;
0208         currentRow.isValidationImageVisible = true;
0209         isAllCorrect = isAllCorrect & isRowCorrect;
0210     }
0211     if(isAllCorrect) {
0212         items.audioEffects.play("qrc:/gcompris/src/core/resource/sounds/completetask.wav");
0213         items.bonus.good("flower");
0214     }
0215     else {
0216         items.audioEffects.play("qrc:/gcompris/src/core/resource/sounds/crash.wav");
0217     }
0218 }