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

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 }