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