File indexing completed on 2024-04-28 15:07:52

0001 /* GCompris - guesscount.js
0002  *
0003  * SPDX-FileCopyrightText: 2016 Rahul Yadav <rahulyadav170923@gmail.com>
0004  *
0005  * Authors:
0006  *   Pascal Georges <pascal.georges1@free.fr> (GTK+ version)
0007  *   RAHUL YADAV <rahulyadav170923@gmail.com> (Qt Quick port)
0008  *
0009  *   SPDX-License-Identifier: GPL-3.0-or-later
0010  */
0011 .pragma library
0012 .import QtQuick 2.12 as Quick
0013 .import "dataset.js" as Data
0014 .import "qrc:/gcompris/src/core/core.js" as Core
0015 
0016 
0017 var url = "qrc:/gcompris/src/activities/guesscount/resource/"
0018 var defaultOperators = Data.defaultOperators
0019 var baseUrl = "qrc:/gcompris/src/activities/guesscount/resource";
0020 var builtinFile = baseUrl + "/levels-default.json";
0021 var dataset = []
0022 
0023 var numberOfLevel = Data.levelSchema.length
0024 var items
0025 var dataItems
0026 var levelSchema
0027 
0028 function start(items_) {
0029     items = items_
0030     items.currentLevel = Core.getInitialLevel(numberOfLevel)
0031     initLevel()
0032 }
0033 
0034 function stop() {
0035 }
0036 
0037 function initLevel() {
0038     items.currentlevel = items.currentLevel
0039     items.score.currentSubLevel = 0
0040     clearOperations()
0041 
0042     var multipleDataOperators = []
0043     var multipleDataItems = []
0044     var multipleDataSchema = []
0045 
0046     if(items.levels && items.mode === 'builtin') {
0047 
0048         for(var i = 0; i < items.levels.length; i++) {
0049             multipleDataOperators = multipleDataOperators.concat(items.levels[i].defaultOperators)
0050             multipleDataSchema = multipleDataSchema.concat(items.levels[i].levelSchema)
0051             multipleDataItems = multipleDataItems.concat(items.levels[i].dataItems)
0052         }
0053 
0054         defaultOperators = multipleDataOperators
0055         numberOfLevel = multipleDataSchema.length
0056         dataItems = multipleDataItems
0057         levelSchema = multipleDataSchema
0058         items.data = buildDataset(dataItems, levelSchema)
0059         items.operatorRow.repeater.model = defaultOperators[items.currentLevel]
0060     }
0061     else if(items.mode === "admin") {
0062         numberOfLevel = Data.levelSchema.length
0063         items.data = buildDataset(Data.dataset, Data.levelSchema)
0064         items.operatorRow.repeater.model = items.levelArr[items.currentLevel]
0065     }
0066 
0067     items.score.numberOfSubLevels = items.data.length
0068     items.operandRow.repeater.model = Core.shuffle(items.data[items.score.currentSubLevel][0])
0069     items.result = items.data[items.score.currentSubLevel][1]
0070     items.solved = false
0071     if(items.warningDialog.visible)
0072         items.warningDialog.visible = false
0073 }
0074 
0075 function clearOperations() {
0076     items.solved = true
0077     items.clearOperations = true
0078     items.clearOperations = false
0079 }
0080 
0081 function initSubLevel(){
0082     clearOperations()
0083     items.operandRow.repeater.model = items.data[items.score.currentSubLevel][0]
0084     items.result = items.data[items.score.currentSubLevel][1]
0085     items.solved = false
0086     if(items.warningDialog.visible)
0087         items.warningDialog.visible = false
0088 }
0089 
0090 function nextSubLevel() {
0091     if(items.score.currentSubLevel < items.data.length) {
0092         initSubLevel()
0093     }
0094     else {
0095         items.bonus.good("smiley");
0096     }
0097 }
0098 
0099 function nextLevel() {
0100     items.score.stopWinAnimation();
0101     items.score.currentSubLevel = 0;
0102     items.currentLevel = Core.getNextLevel(items.currentLevel, numberOfLevel);
0103     initLevel()
0104 }
0105 
0106 function previousLevel() {
0107     items.score.stopWinAnimation();
0108     items.score.currentSubLevel = 0;
0109     items.currentLevel = Core.getPreviousLevel(items.currentLevel, numberOfLevel);
0110     initLevel()
0111 }
0112 
0113 function calculate(operand1, operator, operand2, operationRow)
0114 {
0115     var repeat = operationRow.rowResult
0116     var result
0117     switch (operator) {
0118     case "+":
0119         result = operand1+operand2
0120         break;
0121     case "-":
0122         result = operand1-operand2
0123         break;
0124     case "/":
0125         result = operand1/operand2
0126         break;
0127     case "*":
0128         result = operand1*operand2
0129     }
0130 
0131     // result is positive integer
0132     if(Math.round(result)-result === 0 && result >= 0) {
0133         operationRow.rowResult = result
0134         operationRow.endResult.text = operationRow.rowResult.toString()
0135         operationRow.complete = true
0136     }
0137     else {
0138         if(result != repeat) {
0139             operationRow.endResult.text = ""
0140             operationRow.complete = false
0141             if(result < 0)
0142                 items.warningDialog.dialogText.text = qsTr("result is not positive integer")
0143             else
0144                 items.warningDialog.dialogText.text = qsTr("result is not an integer")
0145             items.warningDialog.visible = true
0146         }
0147     }
0148 }
0149 
0150 
0151 function childrenChange(item, operationRow)
0152 {
0153     if(item.children.length == 2 && item.count == 0) {
0154         item.count += 1
0155     }
0156     else if(item.children.length == 3) {
0157         item.droppedItem.parent = item.droppedItem.reparent
0158         operationRow.complete=false
0159         if(items.warningDialog.visible)
0160             items.warningDialog.visible = false
0161     }
0162     else if(item.children.length == 1) {
0163         item.count -= 1
0164         operationRow.complete = false
0165         operationRow.endResult.text = ""
0166     }
0167 }
0168 
0169 function goodAnswer() {
0170     items.score.currentSubLevel += 1
0171     items.score.playWinAnimation()
0172     items.audioEffects.play("qrc:/gcompris/src/core/resource/sounds/completetask.wav")
0173 }
0174 
0175 function configDone(array) {
0176     for(var i in array) {
0177         if(array[i].length == 0) {
0178             return false
0179         }
0180     }
0181     return true
0182 }
0183 
0184 function equal(levelOperators, array) {
0185     for(var i in levelOperators) {
0186         var found = false
0187         for(var j in array) {
0188             if(levelOperators[i] == array[j])
0189                 found = true
0190         }
0191         if(!found)
0192             return false
0193     }
0194     return true
0195 }
0196 
0197 function findIndex(data) {
0198 
0199     var index
0200     var levelArr = defaultOperators
0201 
0202     for(var i = 0; i < data.length; i++) {
0203         for(var j in data[i]) {
0204             if(equal(levelArr[items.currentLevel], data[i][j][0])) {
0205                 return i
0206             }
0207         }
0208     }
0209 }
0210 
0211 function buildDataset(data, levelSchema) {
0212 
0213     var level = []
0214     var levelArr = (items.mode === 'builtin' && items.levels) ? defaultOperators : items.levelArr
0215     var noOfOperators = levelArr[items.currentLevel].length
0216     var index = (items.mode === 'builtin' && items.levels) ? findIndex(data) : noOfOperators - 1
0217 
0218     for(var j in data[index]) {
0219         if(equal(levelArr[items.currentLevel], data[index][j][0])) {
0220             questions = data[index][j][1]
0221             break
0222         }
0223     }
0224 
0225     var questions = Core.shuffle(questions)
0226 
0227     for(var m = 0 ; m < levelSchema[items.currentLevel] ; ++ m) {
0228         level.push(questions[m])
0229     }
0230     return level
0231 }
0232