File indexing completed on 2024-05-19 07:29:44
0001 /* GCompris - Hat.qml 0002 * 0003 * SPDX-FileCopyrightText: 2014 Thibaut ROMAIN 0004 * 0005 * Authors: 0006 * Thibaut ROMAIN <thibrom@gmail.com> 0007 * 0008 * SPDX-License-Identifier: GPL-3.0-or-later 0009 */ 0010 .pragma library 0011 .import QtQuick 2.12 as Quick 0012 .import "qrc:/gcompris/src/core/core.js" as Core 0013 0014 var url = "qrc:/gcompris/src/activities/magic-hat-minus/resource/" 0015 0016 var numberOfLevel 0017 var numberOfUserStars 0018 var items; 0019 var mode; 0020 var magicHat 0021 var numberOfStars 0022 var nbStarsToAddOrRemove 0023 var nbStarsToCount 0024 var animationCount 0025 var questionCoefficients = [] 0026 var maxStarSlots = 30 0027 var answerCoefficients = [] 0028 var coefficientsNeeded = false 0029 0030 function start(items_, mode_) { 0031 items = items_ 0032 mode = mode_ 0033 magicHat = items.hat 0034 numberOfLevel = items.levels.length 0035 items.currentLevel = Core.getInitialLevel(numberOfLevel) 0036 initLevel() 0037 } 0038 0039 function stop() { 0040 } 0041 0042 function initLevel() { 0043 magicHat.state = "NormalPosition" 0044 numberOfStars = new Array(0, 0, 0) 0045 numberOfUserStars = new Array(0, 0, 0) 0046 nbStarsToAddOrRemove = new Array(0, 0, 0) 0047 nbStarsToCount = new Array(0, 0, 0) 0048 animationCount = 0 0049 var maxValue = items.levels[items.currentLevel].maxValue 0050 0051 if(items.currentLevel > 0) { 0052 items.introductionText.visible = false 0053 } else { 0054 items.introductionText.visible = true 0055 } 0056 coefficientsNeeded = (maxValue / maxStarSlots <= 1) ? false : true 0057 for(var j = 0; j < 3; j++) { 0058 items.repeatersList[0].itemAt(j).initStars() 0059 items.repeatersList[1].itemAt(j).initStars() 0060 items.repeatersList[2].itemAt(j).resetStars() 0061 } 0062 if(!coefficientsNeeded) { 0063 questionCoefficients[0] = questionCoefficients[1] = questionCoefficients[2] = 1; 0064 answerCoefficients[0] = answerCoefficients[1] = answerCoefficients[2] = 1; 0065 setCoefficientVisibility(false) 0066 } else { 0067 for(var i = 0; i < 3; i++) 0068 questionCoefficients[i] = Math.round(items.levels[items.currentLevel].maxStars[i] / 10); 0069 answerCoefficients[0] = maxValue / 100; 0070 answerCoefficients[1] = maxValue / 20; 0071 answerCoefficients[2] = maxValue / 10; 0072 setCoefficientVisibility(true) 0073 } 0074 var subtractor = (mode === "minus") ? 0 : 1 0075 numberOfStars[0] = (items.levels[items.currentLevel].maxStars[0] > 0) ? getRandomInt(items.levels[items.currentLevel].minStars[0], (items.levels[items.currentLevel].maxStars[0] / questionCoefficients[0]) - subtractor) : 0 0076 numberOfStars[1] = (items.levels[items.currentLevel].maxStars[1] > 0) ? getRandomInt(items.levels[items.currentLevel].minStars[1], (items.levels[items.currentLevel].maxStars[1] / questionCoefficients[1]) - subtractor) : 0 0077 numberOfStars[2] = (items.levels[items.currentLevel].maxStars[2] > 0) ? getRandomInt(items.levels[items.currentLevel].minStars[2], (items.levels[items.currentLevel].maxStars[2] / questionCoefficients[2]) - subtractor) : 0 0078 0079 for(var i=0; i<3; i++) { 0080 items.repeatersList[0].itemAt(i).nbStarsOn = numberOfStars[i] 0081 items.repeatersList[0].itemAt(i).coefficient = questionCoefficients[i] 0082 items.repeatersList[1].itemAt(i).nbStarsOn = 0 0083 items.repeatersList[1].itemAt(i).coefficient = questionCoefficients[i] 0084 items.repeatersList[2].itemAt(i).nbStarsOn = 0 0085 items.repeatersList[2].itemAt(i).authorizeClick = false 0086 items.repeatersList[2].itemAt(i).coefficient = answerCoefficients[i] 0087 if(numberOfStars[i] > 0) { 0088 items.repeatersList[0].itemAt(i).opacity = 1 0089 items.repeatersList[1].itemAt(i).opacity = 1 0090 items.repeatersList[2].itemAt(i).opacity = 1 0091 if(mode === "minus") { 0092 nbStarsToAddOrRemove[i] = getRandomInt(1, numberOfStars[i]-1) 0093 } 0094 else { 0095 // For first level, we have 5 stars max, we don't want to add up to 10 stars 0096 nbStarsToAddOrRemove[i] = getRandomInt(1, Math.min(10, maxValue)-numberOfStars[i]) 0097 } 0098 } 0099 else { 0100 items.repeatersList[0].itemAt(i).opacity = 0 0101 items.repeatersList[1].itemAt(i).opacity = 0 0102 items.repeatersList[2].itemAt(i).opacity = 0 0103 } 0104 } 0105 0106 if(mode === "minus") { 0107 for(var i = 0; i < 3; i++) { 0108 nbStarsToCount[i] = numberOfStars[i] - nbStarsToAddOrRemove[i] 0109 items.repeatersList[1].itemAt(i).nbStarsOn = 0 0110 } 0111 } else { 0112 for(var i = 0; i < 3; i++) { 0113 nbStarsToCount[i] = numberOfStars[i]+nbStarsToAddOrRemove[i] 0114 items.repeatersList[1].itemAt(i).nbStarsOn = nbStarsToAddOrRemove[i] 0115 } 0116 } 0117 } 0118 0119 function setCoefficientVisibility(visibility) { 0120 for(var i = 0; i < 3; i++) { 0121 for(var j = 0; j < 3; j++) { 0122 items.repeatersList[j].itemAt(i).coefficientVisible = visibility 0123 } 0124 } 0125 } 0126 0127 function userClickedAStar(barIndex,state) { 0128 if(state) 0129 numberOfUserStars[barIndex]++ 0130 else 0131 numberOfUserStars[barIndex]-- 0132 } 0133 0134 function verifyAnswer() { 0135 if(items.levels[items.currentLevel].maxValue / maxStarSlots <= 1) { 0136 if(numberOfUserStars[0] === nbStarsToCount[0] && 0137 numberOfUserStars[1] === nbStarsToCount[1] && 0138 numberOfUserStars[2] === nbStarsToCount[2]) { 0139 items.bonus.good("flower") 0140 } else { 0141 items.bonus.bad("flower") 0142 } 0143 } else { 0144 var starsCalculatedByUser = numberOfUserStars[0] * answerCoefficients[0] + numberOfUserStars[1] * answerCoefficients[1] + 0145 numberOfUserStars[2] * answerCoefficients[2]; 0146 var actualNumberOfStars = nbStarsToCount[0] * questionCoefficients[0] + nbStarsToCount[1] * questionCoefficients[1] + 0147 nbStarsToCount[2] * questionCoefficients[2]; 0148 if(starsCalculatedByUser == actualNumberOfStars) 0149 items.bonus.good("flower") 0150 else 0151 items.bonus.bad("flower") 0152 } 0153 } 0154 0155 function nextLevel() { 0156 items.currentLevel = Core.getNextLevel(items.currentLevel, numberOfLevel); 0157 initLevel(); 0158 } 0159 0160 function previousLevel() { 0161 items.currentLevel = Core.getPreviousLevel(items.currentLevel, numberOfLevel); 0162 initLevel(); 0163 } 0164 0165 function moveStarsUnderHat() { 0166 if(items.currentLevel == 0) { 0167 items.introductionText.visible = false 0168 } 0169 0170 for(var j = 0; j < 3; j++) { 0171 items.repeatersList[0].itemAt(j).moveStars() 0172 } 0173 } 0174 0175 function moveBackMinusStars() { 0176 for(var j = 0; j < 3; j++) { 0177 items.repeatersList[0].itemAt(j). 0178 moveBackMinusStars(items.repeatersList[1].itemAt(j), 0179 nbStarsToAddOrRemove[j]) 0180 } 0181 } 0182 0183 function movePlusStars() { 0184 for(var j = 0; j < 3; j++) { 0185 items.repeatersList[1].itemAt(j).moveStars() 0186 } 0187 } 0188 0189 // Function called everytime the first animation ends 0190 function animation1Finished(barGroupIndex) { 0191 animationCount++ 0192 if(barGroupIndex == 0) { 0193 if(animationCount === numberOfStars[0] + numberOfStars[1] + numberOfStars[2]) { 0194 animationCount = 0 0195 if(mode === "minus") 0196 moveBackMinusStars() 0197 else 0198 movePlusStars() 0199 } 0200 } else { 0201 animationCount = 0 0202 userGuessNumberState() 0203 } 0204 } 0205 0206 // Function called everytime the second animation ends 0207 function animation2Finished() 0208 { 0209 animationCount++ 0210 if(animationCount === nbStarsToAddOrRemove[0] + 0211 nbStarsToAddOrRemove[1] + nbStarsToAddOrRemove[2]) { 0212 animationCount = 0 0213 userGuessNumberState() 0214 } 0215 } 0216 0217 function userGuessNumberState() { 0218 for(var i = 0; i < 3; i++) { 0219 if(numberOfStars[i] + nbStarsToAddOrRemove[i]) 0220 items.repeatersList[2].itemAt(i).authorizeClick = true 0221 } 0222 magicHat.state = "GuessNumber" 0223 } 0224 0225 function getRandomInt(min, max) { 0226 return Math.floor(Math.random() * (max - min + 1) + min); 0227 }