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 }