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

0001 /* GCompris - tens_complement_use.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 "../../core/core.js" as Core
0009 
0010 var numberOfLevel;
0011 var numberOfSubLevel;
0012 var items;
0013 var questionArrayValue = [null, "+", null, "=", null];
0014 var answerArrayValue = ["(", null, "+", null, ")", "+", null, "=", null];
0015 var indexOfNumberInAnswerArray = [1, 3, 6];
0016 
0017 function start(items_) {
0018     items = items_
0019     numberOfLevel = items.levels.length;
0020     items.currentLevel = Core.getInitialLevel(numberOfLevel)
0021     items.score.currentSubLevel = 0
0022     initLevel()
0023 }
0024 
0025 function stop() {
0026 }
0027 
0028 function initLevel() {
0029     items.okButton.visible = false;
0030     clearAllListModels();
0031     var currentDataset = items.levels[items.currentLevel];
0032     if(currentDataset.randomValues) {
0033         numberOfSubLevel = currentDataset.numberOfSublevels;
0034 
0035         var cards = [];
0036         // Fill the right panel
0037         for(var equationIndex = 0; equationIndex < currentDataset.numberOfEquations; equationIndex ++) {
0038             var questionsModel = {
0039                 "addition": [],
0040                 "secondRow": [],
0041                 "tickVisibility": false,
0042                 "isGood": false
0043             };
0044 
0045             var resultToFind = Math.floor(Math.random() * (currentDataset.maxResult - currentDataset.minResult + 1)) + currentDataset.minResult;
0046 
0047             // Add the last number to find first
0048             cards.push({
0049                 "value": (resultToFind-10).toString(),
0050                 "visibility": true,
0051                 "isSignSymbol": false,
0052                 "clickable": true
0053             });
0054             // Ensure we have at least two numbers where the sum is ten
0055             var firstNumberOfSum = Math.floor(Math.random() * 9) + 1;
0056             var counterpart = (10 - firstNumberOfSum).toString();
0057             cards.push({
0058                 "value": counterpart,
0059                 "visibility": true,
0060                 "isSignSymbol": false,
0061                 "clickable": true
0062             });
0063 
0064             var indexCounter = 0;
0065             var questionValue = [firstNumberOfSum, resultToFind-firstNumberOfSum, resultToFind];
0066             for(var i = 0; i < questionArrayValue.length; i++) {
0067                 var isNumber = true;
0068                 if(questionArrayValue[i] == "+" || questionArrayValue[i] == "(" || questionArrayValue[i] == ")" || questionArrayValue[i] == "=") {
0069                     isNumber = false;
0070                 }
0071                 else {
0072                     questionArrayValue[i] = questionValue[indexCounter].toString();
0073                     indexCounter++;
0074                 }
0075                 var card = {
0076                     "value": questionArrayValue[i].toString(),
0077                     "visibility": true,
0078                     "isSignSymbol": !isNumber,
0079                     "clickable": false
0080                 }
0081                 questionsModel.addition.push(card);
0082             }
0083             indexCounter = 0;
0084             var splitValue = [firstNumberOfSum, "?", "?", resultToFind];
0085             for(var i = 0; i < answerArrayValue.length; i++) {
0086                 var isNumber = true;
0087                 if(answerArrayValue[i] == "+" || answerArrayValue[i] == "(" || answerArrayValue[i] == ")" || answerArrayValue[i] == "=") {
0088                     isNumber = false;
0089                 }
0090                 else {
0091                     answerArrayValue[i] = splitValue[indexCounter].toString();
0092                     indexCounter++;
0093                 }
0094                 var card = {
0095                     "value": answerArrayValue[i].toString(),
0096                     "visibility": true,
0097                     "clickable": (answerArrayValue[i] === "?"),
0098                     "isSignSymbol": !isNumber
0099                 }
0100                 questionsModel.secondRow.push(card);
0101             }
0102             items.holderListModel.append(questionsModel);
0103         }
0104 
0105         // Fill left container
0106         for(var i = 0; i < currentDataset.numberOfNumbersInLeftContainer-cards.length+1; i++) {
0107             var randomNumber = Math.floor(Math.random() * 9) + 1;
0108             var card = {
0109                 "value": randomNumber.toString(),
0110                 "visibility": true,
0111                 "isSignSymbol": false,
0112                 "clickable": true
0113             }
0114             cards.push(card);
0115         }
0116         // Shuffle and add to the model
0117         Core.shuffle(cards);
0118         for(var i = 0 ; i < cards.length ; ++ i) {
0119             items.cardListModel.append(cards[i]);
0120         }
0121     }
0122     else {
0123         var sublevel = currentDataset.values[currentSubLevel];
0124         numberOfSubLevel = currentDataset.values.length;
0125         var numberValue = sublevel.numberValue;
0126 
0127         // Fill left container
0128         for(var i = 0; i < numberValue.length; i++) {
0129             var card = {
0130                 "value": numberValue[i].toString(),
0131                 "visibility": true,
0132                 "isSignSymbol": false,
0133                 "clickable": true
0134             }
0135             items.cardListModel.append(card);
0136         }
0137 
0138         for(var equationIndex = 0; equationIndex < sublevel.questions.length; equationIndex ++) {
0139             var questionsModel = {
0140                 "addition": [],
0141                 "secondRow": [],
0142                 "tickVisibility": false,
0143                 "isGood": false
0144             };
0145 
0146             var question = sublevel.questions[equationIndex];
0147             var indexCounter = 0;
0148             for(var i = 0; i < questionArrayValue.length; i++) {
0149                 var isNumber = true;
0150                 if(questionArrayValue[i] == "+" || questionArrayValue[i] == "(" || questionArrayValue[i] == ")" || questionArrayValue[i] == "=") {
0151                     isNumber = false;
0152                 }
0153                 else {
0154                     questionArrayValue[i] = question.questionValue[indexCounter].toString();
0155                     indexCounter++;
0156                 }
0157                 var card = {
0158                     "value": questionArrayValue[i].toString(),
0159                     "visibility": true,
0160                     "isSignSymbol": !isNumber,
0161                     "clickable": false
0162                 }
0163                 questionsModel.addition.push(card);
0164             }
0165             indexCounter = 0;
0166             for(var i = 0; i < answerArrayValue.length; i++) {
0167                 var isNumber = true;
0168                 if(answerArrayValue[i] == "+" || answerArrayValue[i] == "(" || answerArrayValue[i] == ")" || answerArrayValue[i] == "=") {
0169                     isNumber = false;
0170                 }
0171                 else {
0172                     answerArrayValue[i] = question.splitValue[indexCounter].toString();
0173                     indexCounter++;
0174                 }
0175                 var card = {
0176                     "value": answerArrayValue[i].toString(),
0177                     "visibility": true,
0178                     "clickable": (answerArrayValue[i] === "?"),
0179                     "isSignSymbol": !isNumber
0180                 }
0181                 questionsModel.secondRow.push(card);
0182             }
0183             items.holderListModel.append(questionsModel);
0184         }
0185     }
0186     items.score.numberOfSubLevels = numberOfSubLevel;
0187     items.buttonsBlocked = false;
0188 }
0189 
0190 function nextLevel() {
0191     items.score.stopWinAnimation();
0192     items.currentLevel = Core.getNextLevel(items.currentLevel, numberOfLevel);
0193     items.score.currentSubLevel = 0;
0194     initLevel();
0195 }
0196 
0197 function nextSubLevel() {
0198     if(items.score.currentSubLevel >= numberOfSubLevel) {
0199         items.bonus.good("flower");
0200     } else {
0201         initLevel();
0202     }
0203 }
0204 
0205 function previousLevel() {
0206     items.score.stopWinAnimation();
0207     items.currentLevel = Core.getPreviousLevel(items.currentLevel, numberOfLevel);
0208     items.score.currentSubLevel = 0;
0209     initLevel();
0210 }
0211 
0212 function getEnteredCard() {
0213     if(items.selectedIndex == -1) {
0214         return "?";
0215     }
0216     items.cardListModel.setProperty(items.selectedIndex, "visibility", false);
0217     var tempSelected = items.selectedIndex;
0218     items.selectedIndex = -1;
0219     return items.cardListModel.get(tempSelected).value.toString();
0220 }
0221 
0222 function reappearNumberCard(value) {
0223     for(var i = 0; i < items.cardListModel.count; i++) {
0224         var card = items.cardListModel.get(i);
0225         if(value == card.value && card.visibility == false) {
0226             items.cardListModel.setProperty(i, "visibility", true);
0227             break;
0228         }
0229     }
0230 }
0231 
0232 function clearAllListModels() {
0233     items.cardListModel.clear();
0234     items.holderListModel.clear();
0235 }
0236 
0237 function showOkButton() {
0238     var checkQuestionMark = true;
0239     for(var i = 0; i < items.holderListModel.count; i++) {
0240         var equation = items.holderListModel.get(i).secondRow;
0241         for(var j = 0; j < equation.count; j++) {
0242             var answer = equation.get(j);
0243             if(answer.value == "?") {
0244                 checkQuestionMark = false;
0245                 break;
0246             }
0247         }
0248     }
0249 
0250     items.okButton.visible = checkQuestionMark;
0251 }
0252 
0253 function checkAnswer() {
0254     var allOk = true;
0255     for(var i = 0; i < items.holderListModel.count; i++) {
0256         var check = true;
0257         var equation = items.holderListModel.get(i);
0258         var solution = equation.secondRow;
0259         if(parseInt(solution.get(indexOfNumberInAnswerArray[0]).value) + parseInt(solution.get(indexOfNumberInAnswerArray[1]).value) != 10) {
0260             check = false;
0261         }
0262         var rest = parseInt(solution.get(solution.count-1).value)-10;
0263         if(parseInt(solution.get(indexOfNumberInAnswerArray[2]).value) != rest) {
0264             check = false;
0265         }
0266         if(!check) {
0267             allOk = false;
0268         }
0269         equation.tickVisibility = true;
0270         equation.isGood = check;
0271     }
0272     if(allOk) {
0273         items.buttonsBlocked = true;
0274         items.score.currentSubLevel++
0275         items.score.playWinAnimation()
0276         items.audioEffects.play("qrc:/gcompris/src/core/resource/sounds/completetask.wav")
0277     }
0278     else {
0279         items.audioEffects.play("qrc:/gcompris/src/core/resource/sounds/crash.wav")
0280     }
0281 }