File indexing completed on 2024-04-21 14:43:35

0001 /* GCompris - hangman.js
0002  *
0003  *   SPDX-FileCopyrightText: 2015 Rajdeep Kaur <rajdeep1994@gmail.com>
0004  *
0005  *    Authors:
0006  *    Bruno Coudoin <bruno.coudoin@gcompris.net> (GTK+ version)
0007  *    Rajdeep kaur <rajdeep51994@gmail.com> (Qt Quick port)
0008  *
0009  *   SPDX-License-Identifier: GPL-3.0-or-later
0010  */
0011 
0012 .pragma library
0013 .import QtQuick 2.12 as Quick
0014 .import GCompris 1.0 as GCompris
0015 .import "qrc:/gcompris/src/core/core.js" as Core
0016 .import "qrc:/gcompris/src/activities/lang/lang_api.js" as Lang
0017 
0018 var currentSubLevel
0019 var numberOfLevel
0020 var maxSubLevel
0021 var items
0022 
0023 var currentWord
0024 var sp ="_ "
0025 var dataset = null
0026 var lessons
0027 var wordList
0028 var subLevelsLeft
0029 var alreadyTypedLetters
0030 
0031 // js strings are immutable, can't replace letter like that...
0032 // http://stackoverflow.com/questions/1431094/how-do-i-replace-a-character-at-a-particular-index-in-javascript
0033 String.prototype.replaceAt = function(index, character) {
0034     return this.substr(0, index) + character + this.substr(index+character.length);
0035 }
0036 
0037 function start(items_) {
0038     items = items_
0039     currentSubLevel = 0;
0040     items.remainingLife = 6;
0041 
0042     var locale = GCompris.ApplicationInfo.getVoicesLocale(items.locale)
0043 
0044     var resourceUrl = "qrc:/gcompris/src/activities/lang/resource/"
0045 
0046     // register the voices for the locale
0047     GCompris.DownloadManager.updateResource(GCompris.GCompris.VOICES, {"locale": locale})
0048 
0049     var data = Lang.loadDataset(items.parser, resourceUrl, locale);
0050     dataset = data["dataset"];
0051     items.background.englishFallback = data["englishFallback"];
0052     lessons = Lang.getAllLessons(dataset)
0053     numberOfLevel = lessons.length
0054     items.currentLevel = Core.getInitialLevel(numberOfLevel);
0055     initLevel();
0056 }
0057 
0058 function stop() {
0059     items.winTimer.stop();
0060 }
0061 
0062 function initLevel() {
0063     // If clicking on previous/next level after winning, we prevent to skip the next word
0064     if(items.winTimer.running) {
0065         items.winTimer.stop();
0066     }
0067 
0068     var currentLesson = lessons[items.currentLevel];
0069     wordList = Lang.getLessonWords(dataset, currentLesson);
0070     Core.shuffle(wordList);
0071 
0072     maxSubLevel = wordList.length;
0073     items.score.numberOfSubLevels = maxSubLevel;
0074     items.score.visible = true;
0075 
0076     subLevelsLeft = []
0077     for(var i in wordList)
0078         subLevelsLeft.push(i)
0079 
0080     initSubLevel();
0081 
0082     //to set the layout...populate
0083     var letters = new Array();
0084     for (var i = 0; i < wordList.length; i++) {
0085         var word = wordList[i].translatedTxt;
0086         for (var j = 0; j < word.length; j++) {
0087             var letter = word.charAt(j).toLocaleLowerCase();
0088             if (letters.indexOf(letter) === -1)
0089                 letters.push(letter);
0090         }
0091     }
0092     letters = GCompris.ApplicationInfo.localeSort(letters, items.locale);
0093     // Remove space character if in list
0094     var indexOfSpace = letters.indexOf(' ')
0095     if(indexOfSpace > -1)
0096         letters.splice(indexOfSpace, 1)
0097     // generate layout from letter map
0098     var layout = new Array();
0099     var row = 0;
0100     var offset = 0;
0101     while (offset < letters.length-1) {
0102         var cols = letters.length <= 10
0103                 ? letters.length : (Math.ceil((letters.length-offset) / (3 - row)));
0104         layout[row] = new Array();
0105         for (var j = 0; j < cols; j++)
0106             layout[row][j] = { label: letters[j+offset] };
0107         offset += j;
0108         row++;
0109     }
0110     items.keyboard.layout = layout;
0111 }
0112 
0113 function processKeyPress(text) {
0114     if(items.remainingLife === 0 || items.goodIcon.visible) {
0115         return
0116     }
0117 
0118     text = text.toLocaleLowerCase()
0119 
0120     // Check if the character has already been typed
0121     if(alreadyTypedLetters.indexOf(text) !== -1) {
0122         // Character already typed, do nothing
0123         return;
0124     }
0125     // Add the character to the already typed characters
0126     alreadyTypedLetters.push(text);
0127 
0128     // add the typed character in the "Attempted characters" text field
0129     createAttemptedText()
0130 
0131     // Get all the indices of this letter in the word
0132     var indices = [];
0133     for(var i = 0 ; i < currentWord.length ; i ++) {
0134         if (currentWord[i].toLocaleLowerCase() === text) {
0135             indices.push(i);
0136         }
0137     }
0138 
0139     if(indices.length == 0) {
0140         // The letter is not in the word to find
0141         // If no more life, we display the good word and show the bonus
0142         if(--items.remainingLife == 0) {
0143             items.hidden.text = items.goodWord.translatedTxt;
0144             items.playWord()
0145             items.bonus.bad("lion");
0146             return;
0147         }
0148     } else {
0149         // For all the indices found, we replace the "_" by the letter
0150         for(var index = 0 ; index < indices.length ; index ++) {
0151             // Characters in the word displayed are separated by spaces, this is why we do 2*index
0152             items.hidden.text = items.hidden.text.replaceAt(2*indices[index],
0153                                                             currentWord[indices[index]]);
0154         }
0155     }
0156 
0157     // If no more '_' in the word to find, we have found all letters, show bonus
0158     if(items.hidden.text.indexOf("_") === -1) {
0159         items.maskThreshold = 0;
0160         items.playWord();
0161         items.hidden.text = items.goodWord.translatedTxt;
0162         items.goodIcon.visible = true
0163         items.winTimer.start();
0164     }
0165 }
0166 
0167 function nextLevel() {
0168     items.currentLevel = Core.getNextLevel(items.currentLevel, numberOfLevel);
0169     currentSubLevel = 0;
0170     initLevel();
0171 }
0172 
0173 
0174 function previousLevel() {
0175     items.currentLevel = Core.getPreviousLevel(items.currentLevel, numberOfLevel);
0176     currentSubLevel = 0;
0177     initLevel();
0178 }
0179 
0180 function initSubLevel() {
0181     // initialize sublevel
0182     if(items.score.currentSubLevel < items.score.numberOfSubLevels)
0183         items.score.currentSubLevel = currentSubLevel + 1;
0184     else
0185         items.score.visible = false
0186     items.goodWordIndex = subLevelsLeft.pop()
0187     items.ok.visible = false
0188     items.goodIcon.visible = false
0189     items.goodWord = wordList[items.goodWordIndex]
0190     items.wordImage.changeSource(items.goodWord.image);
0191     items.remainingLife = 6;
0192     alreadyTypedLetters = new Array();
0193     currentWord = items.goodWord.translatedTxt;
0194     items.hidden.text = ""
0195     createAttemptedText()
0196 
0197     for(var i = 0; i < currentWord.length ; ++ i) {
0198         if(currentWord[i] == " ") {
0199             items.hidden.text = items.hidden.text + " " + " "
0200         } else {
0201             items.hidden.text = items.hidden.text + sp;
0202         }
0203     }
0204 }
0205 
0206 function createAttemptedText() {
0207     alreadyTypedLetters.sort()
0208     items.guessedText.text = qsTr("Attempted: %1").arg(alreadyTypedLetters.join(", "))
0209 }
0210 
0211 function nextSubLevel() {
0212     if( ++currentSubLevel >= maxSubLevel) {
0213         currentSubLevel = 0;
0214         nextLevel();
0215     } else {
0216         initSubLevel();
0217     }
0218 }
0219 
0220 function focusTextInput() {
0221     if (!GCompris.ApplicationInfo.isMobile && items && items.textinput)
0222         items.textinput.forceActiveFocus();
0223 }