User prompt
If the player touches the Turkish boxes and then releases them, the Turkish boxes cannot be nested (if they are nested, the nested box is positioned somewhere else)
User prompt
Please fix the bug: 'undefined is not an object (evaluating 'turkishBoxes.length')' in or related to this line: 'for (var i = 0; i < turkishBoxes.length; i++) {' Line Number: 95
User prompt
When the player does not touch the Turkish boxes, the Turkish boxes cannot remain in the same position inside each other.
User prompt
Turkish box should not be nested with another Turkish box
User prompt
2 Turkish boxes should not be placed in the same place.
User prompt
Turkish box assets should move where player touch
Code edit (1 edits merged)
Please save this source code
User prompt
Merhaba: Word Match
Initial prompt
Merhaba
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ // EnglishWordBox: static target var EnglishWordBox = Container.expand(function () { var self = Container.call(this); // Attach box var box = self.attachAsset('englishBox', { anchorX: 0.5, anchorY: 0.5 }); // Attach text self.textObj = new Text2('', { size: 80, fill: 0xFFFFFF }); self.textObj.anchor.set(0.5, 0.5); self.addChild(self.textObj); // Store word self.word = ''; self.matchId = ''; // Set word and match id self.setWord = function (word, matchId) { self.word = word; self.matchId = matchId; self.textObj.setText(word); }; return self; }); // LanguageScreen: shows interface and game language options var LanguageScreen = Container.expand(function () { var self = Container.call(this); // Background var bg = self.attachAsset('flashCorrect', { anchorX: 0.5, anchorY: 0.5, alpha: 0.9 }); // Title self.titleText = new Text2(getInterfaceText('languageScreenTitle'), { size: 120, fill: 0x222222 }); self.titleText.anchor.set(0.5, 0.5); self.titleText.x = 0; self.titleText.y = -400; self.addChild(self.titleText); // Interface Language Section (Right side) self.interfaceText = new Text2(getInterfaceText('interfaceLanguage'), { size: 90, fill: 0x444444 }); self.interfaceText.anchor.set(0.5, 0.5); self.interfaceText.x = 650; self.interfaceText.y = -250; self.addChild(self.interfaceText); // Interface Turkish button var interfaceTurkishBg = self.attachAsset('turkishBox', { anchorX: 0.5, anchorY: 0.5 }); interfaceTurkishBg.y = -120; interfaceTurkishBg.x = 650; self.interfaceTurkishText = new Text2('TÜRKÇE', { size: 70, fill: 0xFFFFFF }); self.interfaceTurkishText.anchor.set(0.5, 0.5); self.interfaceTurkishText.x = 650; self.interfaceTurkishText.y = -120; self.addChild(self.interfaceTurkishText); // Interface English button var interfaceEnglishBg = self.attachAsset('englishBox', { anchorX: 0.5, anchorY: 0.5 }); interfaceEnglishBg.y = 55; interfaceEnglishBg.x = 650; self.interfaceEnglishText = new Text2('ENGLISH', { size: 70, fill: 0xFFFFFF }); self.interfaceEnglishText.anchor.set(0.5, 0.5); self.interfaceEnglishText.x = 650; self.interfaceEnglishText.y = 55; self.addChild(self.interfaceEnglishText); // Interface Spanish button var interfaceSpanishBg = self.attachAsset('turkishBox', { anchorX: 0.5, anchorY: 0.5 }); interfaceSpanishBg.y = 230; interfaceSpanishBg.x = 650; self.interfaceSpanishText = new Text2('ESPAÑOL', { size: 70, fill: 0xFFFFFF }); self.interfaceSpanishText.anchor.set(0.5, 0.5); self.interfaceSpanishText.x = 650; self.interfaceSpanishText.y = 230; self.addChild(self.interfaceSpanishText); // Game Language Section (Left side) self.gameLanguageText = new Text2(getInterfaceText('gameLanguage'), { size: 90, fill: 0x444444 }); self.gameLanguageText.anchor.set(0.5, 0.5); self.gameLanguageText.x = -450; self.gameLanguageText.y = -250; self.addChild(self.gameLanguageText); // Game English button var gameEnglishBg = self.attachAsset('englishBox', { anchorX: 0.5, anchorY: 0.5 }); gameEnglishBg.y = -120; gameEnglishBg.x = -450; self.gameEnglishText = new Text2('ENGLISH', { size: 70, fill: 0xFFFFFF }); self.gameEnglishText.anchor.set(0.5, 0.5); self.gameEnglishText.x = -450; self.gameEnglishText.y = -120; self.addChild(self.gameEnglishText); // Game Spanish button var gameSpanishBg = self.attachAsset('turkishBox', { anchorX: 0.5, anchorY: 0.5 }); gameSpanishBg.y = 55; gameSpanishBg.x = -450; self.gameSpanishText = new Text2('ESPAÑOL', { size: 70, fill: 0xFFFFFF }); self.gameSpanishText.anchor.set(0.5, 0.5); self.gameSpanishText.x = -450; self.gameSpanishText.y = 55; self.addChild(self.gameSpanishText); // Back button var backButtonBg = self.attachAsset('turkishBox', { anchorX: 0.5, anchorY: 0.5 }); backButtonBg.y = 425; self.backButtonText = new Text2(getInterfaceText('back'), { size: 70, fill: 0xFFFFFF }); self.backButtonText.anchor.set(0.5, 0.5); self.backButtonText.x = 0; self.backButtonText.y = 425; self.addChild(self.backButtonText); // Update button colors based on current selections self.updateLanguageButtons = function () { var interfaceLang = storage.interfaceLanguage || 'turkish'; var gameLang = storage.gameLanguage || 'english'; // Reset all to default color interfaceTurkishBg.tint = 0x1e90ff; interfaceEnglishBg.tint = 0x32cd32; interfaceSpanishBg.tint = 0x1e90ff; gameEnglishBg.tint = 0x32cd32; gameSpanishBg.tint = 0x1e90ff; // Highlight selected interface language if (interfaceLang === 'turkish') { interfaceTurkishBg.tint = 0x1565c0; } else if (interfaceLang === 'english') { interfaceEnglishBg.tint = 0x228b22; } else if (interfaceLang === 'spanish') { interfaceSpanishBg.tint = 0x1565c0; } // Highlight selected game language if (gameLang === 'english') { gameEnglishBg.tint = 0x228b22; } else if (gameLang === 'spanish') { gameSpanishBg.tint = 0x1565c0; } }; // Method to update all interface texts self.updateInterfaceTexts = function () { self.titleText.setText(getInterfaceText('languageScreenTitle')); self.interfaceText.setText(getInterfaceText('interfaceLanguage')); self.gameLanguageText.setText(getInterfaceText('gameLanguage')); self.backButtonText.setText(getInterfaceText('back')); }; self.updateLanguageButtons(); // Touch handler self.down = function (x, y, obj) { // Interface Turkish button if (x >= interfaceTurkishBg.x - interfaceTurkishBg.width / 2 && x <= interfaceTurkishBg.x + interfaceTurkishBg.width / 2 && y >= interfaceTurkishBg.y - interfaceTurkishBg.height / 2 && y <= interfaceTurkishBg.y + interfaceTurkishBg.height / 2) { storage.interfaceLanguage = 'turkish'; self.updateLanguageButtons(); self.updateInterfaceTexts(); updateAllInterfaceTexts(); } // Interface English button else if (x >= interfaceEnglishBg.x - interfaceEnglishBg.width / 2 && x <= interfaceEnglishBg.x + interfaceEnglishBg.width / 2 && y >= interfaceEnglishBg.y - interfaceEnglishBg.height / 2 && y <= interfaceEnglishBg.y + interfaceEnglishBg.height / 2) { storage.interfaceLanguage = 'english'; self.updateLanguageButtons(); self.updateInterfaceTexts(); updateAllInterfaceTexts(); } // Interface Spanish button else if (x >= interfaceSpanishBg.x - interfaceSpanishBg.width / 2 && x <= interfaceSpanishBg.x + interfaceSpanishBg.width / 2 && y >= interfaceSpanishBg.y - interfaceSpanishBg.height / 2 && y <= interfaceSpanishBg.y + interfaceSpanishBg.height / 2) { storage.interfaceLanguage = 'spanish'; self.updateLanguageButtons(); self.updateInterfaceTexts(); updateAllInterfaceTexts(); } // Game English button else if (x >= gameEnglishBg.x - gameEnglishBg.width / 2 && x <= gameEnglishBg.x + gameEnglishBg.width / 2 && y >= gameEnglishBg.y - gameEnglishBg.height / 2 && y <= gameEnglishBg.y + gameEnglishBg.height / 2) { storage.gameLanguage = 'english'; self.updateLanguageButtons(); } // Game Spanish button else if (x >= gameSpanishBg.x - gameSpanishBg.width / 2 && x <= gameSpanishBg.x + gameSpanishBg.width / 2 && y >= gameSpanishBg.y - gameSpanishBg.height / 2 && y <= gameSpanishBg.y + gameSpanishBg.height / 2) { storage.gameLanguage = 'spanish'; self.updateLanguageButtons(); } // Back button else if (x >= backButtonBg.x - backButtonBg.width / 2 && x <= backButtonBg.x + backButtonBg.width / 2 && y >= backButtonBg.y - backButtonBg.height / 2 && y <= backButtonBg.y + backButtonBg.height / 2) { // Go back to settings screen self.destroy(); var settingsScreen = new SettingsScreen(); settingsScreen.x = 2048 / 2; settingsScreen.y = 2732 / 2; game.addChild(settingsScreen); } }; return self; }); // SettingsScreen: shows difficulty and language options var SettingsScreen = Container.expand(function () { var self = Container.call(this); // Background var bg = self.attachAsset('flashCorrect', { anchorX: 0.5, anchorY: 0.5, alpha: 0.9 }); // Title self.titleText = new Text2(getInterfaceText('settingsTitle'), { size: 120, fill: 0x222222 }); self.titleText.anchor.set(0.5, 0.5); self.titleText.x = 0; self.titleText.y = -400; self.addChild(self.titleText); // Difficulty section self.difficultyText = new Text2(getInterfaceText('difficulty'), { size: 90, fill: 0x444444 }); self.difficultyText.anchor.set(0.5, 0.5); self.difficultyText.x = 0; self.difficultyText.y = -300; self.addChild(self.difficultyText); // Easy button var easyButtonBg = self.attachAsset('easyButton', { anchorX: 0.5, anchorY: 0.5 }); easyButtonBg.y = -120; easyButtonBg.x = -500; self.easyButtonText = new Text2(getInterfaceText('easy'), { size: 70, fill: 0xFFFFFF }); self.easyButtonText.anchor.set(0.5, 0.5); self.easyButtonText.x = -500; self.easyButtonText.y = -120; self.addChild(self.easyButtonText); // Medium button var mediumButtonBg = self.attachAsset('mediumButton', { anchorX: 0.5, anchorY: 0.5 }); mediumButtonBg.y = -120; mediumButtonBg.x = 0; self.mediumButtonText = new Text2(getInterfaceText('medium'), { size: 70, fill: 0xFFFFFF }); self.mediumButtonText.anchor.set(0.5, 0.5); self.mediumButtonText.x = 0; self.mediumButtonText.y = -120; self.addChild(self.mediumButtonText); // Hard button var hardButtonBg = self.attachAsset('hardButton', { anchorX: 0.5, anchorY: 0.5 }); hardButtonBg.y = -120; hardButtonBg.x = 500; self.hardButtonText = new Text2(getInterfaceText('hard'), { size: 70, fill: 0xFFFFFF }); self.hardButtonText.anchor.set(0.5, 0.5); self.hardButtonText.x = 500; self.hardButtonText.y = -120; self.addChild(self.hardButtonText); // Language section self.languageText = new Text2(getInterfaceText('language'), { size: 90, fill: 0x444444 }); self.languageText.anchor.set(0.5, 0.5); self.languageText.x = 0; self.languageText.y = 50; self.addChild(self.languageText); // Language button var languageButtonBg = self.attachAsset('turkishBox', { anchorX: 0.5, anchorY: 0.5 }); languageButtonBg.y = 180; self.languageButtonText = new Text2(getInterfaceText('languageButton'), { size: 70, fill: 0xFFFFFF }); self.languageButtonText.anchor.set(0.5, 0.5); self.languageButtonText.x = 0; self.languageButtonText.y = 180; self.addChild(self.languageButtonText); // Back button var backButtonBg = self.attachAsset('turkishBox', { anchorX: 0.5, anchorY: 0.5 }); backButtonBg.y = 425; self.backButtonText = new Text2(getInterfaceText('back'), { size: 70, fill: 0xFFFFFF }); self.backButtonText.anchor.set(0.5, 0.5); self.backButtonText.x = 0; self.backButtonText.y = 425; self.addChild(self.backButtonText); // Update button colors based on current difficulty self.updateDifficultyButtons = function () { var currentDifficulty = storage.difficulty || 'medium'; // Reset all to default color easyButtonBg.tint = 0xFFFFFF; mediumButtonBg.tint = 0xFFFFFF; hardButtonBg.tint = 0xFFFFFF; // Highlight selected if (currentDifficulty === 'easy') { easyButtonBg.tint = 0x228b22; } else if (currentDifficulty === 'medium') { mediumButtonBg.tint = 0xB8860B; } else if (currentDifficulty === 'hard') { hardButtonBg.tint = 0xCC0000; } }; self.updateDifficultyButtons(); // Touch handler self.down = function (x, y, obj) { // Easy button if (x >= easyButtonBg.x - easyButtonBg.width / 2 && x <= easyButtonBg.x + easyButtonBg.width / 2 && y >= easyButtonBg.y - easyButtonBg.height / 2 && y <= easyButtonBg.y + easyButtonBg.height / 2) { storage.difficulty = 'easy'; self.updateDifficultyButtons(); } // Medium button else if (x >= mediumButtonBg.x - mediumButtonBg.width / 2 && x <= mediumButtonBg.x + mediumButtonBg.width / 2 && y >= mediumButtonBg.y - mediumButtonBg.height / 2 && y <= mediumButtonBg.y + mediumButtonBg.height / 2) { storage.difficulty = 'medium'; self.updateDifficultyButtons(); } // Hard button else if (x >= hardButtonBg.x - hardButtonBg.width / 2 && x <= hardButtonBg.x + hardButtonBg.width / 2 && y >= hardButtonBg.y - hardButtonBg.height / 2 && y <= hardButtonBg.y + hardButtonBg.height / 2) { storage.difficulty = 'hard'; self.updateDifficultyButtons(); } // Language button else if (x >= languageButtonBg.x - languageButtonBg.width / 2 && x <= languageButtonBg.x + languageButtonBg.width / 2 && y >= languageButtonBg.y - languageButtonBg.height / 2 && y <= languageButtonBg.y + languageButtonBg.height / 2) { // Show language screen self.destroy(); var languageScreen = new LanguageScreen(); languageScreen.x = 2048 / 2; languageScreen.y = 2732 / 2; game.addChild(languageScreen); } // Back button else if (x >= backButtonBg.x - backButtonBg.width / 2 && x <= backButtonBg.x + backButtonBg.width / 2 && y >= backButtonBg.y - backButtonBg.height / 2 && y <= backButtonBg.y + backButtonBg.height / 2) { // Go back to start screen self.destroy(); startScreen = new StartScreen(); startScreen.x = 2048 / 2; startScreen.y = 2732 / 2; game.addChild(startScreen); } }; return self; }); // StartScreen: shows game intro and start button var StartScreen = Container.expand(function () { var self = Container.call(this); // Background var bg = self.attachAsset('flashCorrect', { anchorX: 0.5, anchorY: 0.5, alpha: 0.9 }); // Title self.titleText = new Text2(getInterfaceText('title'), { size: 120, fill: 0x222222, font: "'GillSans-Bold',Impact,'Arial Black',Tahoma" }); self.titleText.anchor.set(0.5, 0.5); self.titleText.x = 0; self.titleText.y = -300; self.addChild(self.titleText); // Instructions self.instructionText = new Text2(getInterfaceText('instructions'), { size: 80, fill: 0x444444 }); self.instructionText.anchor.set(0.5, 0.5); self.instructionText.x = 0; self.instructionText.y = -100; self.addChild(self.instructionText); // Start button background var startButtonBg = self.attachAsset('turkishBox', { anchorX: 0.5, anchorY: 0.5 }); startButtonBg.y = 200; // Start button text self.startButtonText = new Text2(getInterfaceText('start'), { size: 90, fill: 0xFFFFFF }); self.startButtonText.anchor.set(0.5, 0.5); self.startButtonText.x = 0; self.startButtonText.y = 200; self.addChild(self.startButtonText); // Settings button background var settingsButtonBg = self.attachAsset('englishBox', { anchorX: 0.5, anchorY: 0.5 }); settingsButtonBg.y = 455; // Settings button text self.settingsButtonText = new Text2(getInterfaceText('settings'), { size: 90, fill: 0xFFFFFF }); self.settingsButtonText.anchor.set(0.5, 0.5); self.settingsButtonText.x = 0; self.settingsButtonText.y = 455; self.addChild(self.settingsButtonText); // Touch handler for start button self.down = function (x, y, obj) { // Check if clicked on start button area var buttonX = startButtonBg.x; var buttonY = startButtonBg.y; var buttonW = startButtonBg.width; var buttonH = startButtonBg.height; if (x >= buttonX - buttonW / 2 && x <= buttonX + buttonW / 2 && y >= buttonY - buttonH / 2 && y <= buttonY + buttonH / 2) { // Start the game self.destroy(); startRound(); } // Check if clicked on settings button area else if (x >= settingsButtonBg.x - settingsButtonBg.width / 2 && x <= settingsButtonBg.x + settingsButtonBg.width / 2 && y >= settingsButtonBg.y - settingsButtonBg.height / 2 && y <= settingsButtonBg.y + settingsButtonBg.height / 2) { // Show settings screen self.destroy(); var settingsScreen = new SettingsScreen(); settingsScreen.x = 2048 / 2; settingsScreen.y = 2732 / 2; game.addChild(settingsScreen); } }; return self; }); // TurkishWordBox: draggable Turkish word var TurkishWordBox = Container.expand(function () { var self = Container.call(this); // Attach box var box = self.attachAsset('turkishBox', { anchorX: 0.5, anchorY: 0.5 }); // Attach text self.textObj = new Text2('', { size: 80, fill: 0xFFFFFF }); self.textObj.anchor.set(0.5, 0.5); self.addChild(self.textObj); // Store word self.word = ''; self.matchId = ''; // Drag state self.isDragging = false; // Set word and match id self.setWord = function (word, matchId) { self.word = word; self.matchId = matchId; self.textObj.setText(word); }; // For drag offset self.dragOffsetX = 0; self.dragOffsetY = 0; // Down event: start drag self.down = function (x, y, obj) { self.isDragging = true; // Offset from center self.dragOffsetX = self.x - x; self.dragOffsetY = self.y - y; dragNode = self; }; // Up event: handled in game.up return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xf7f7f7 }); /**** * Game Code ****/ // Wrong match flash // Correct match flash // English word box // Turkish word box // --- Interface Language Translations --- var interfaceTranslations = { turkish: { title: 'Turkish Word Match', instructions: 'Türkçe kelimeleri\nİngilizce karşılıklarıyla eşleştirin!', start: 'BAŞLA', settings: 'AYARLAR', back: 'GERİ', settingsTitle: 'Ayarlar', difficulty: 'Zorluk Seviyesi:', easy: 'KOLAY', medium: 'ORTA', hard: 'ZOR', language: 'Dil:', languageButton: 'LANGUAGE', languageScreenTitle: 'Dil Ayarları', interfaceLanguage: 'Arayüz Dili:', gameLanguage: 'Oyun Dili:', score: 'Skor: ' }, english: { title: 'Turkish Word Match', instructions: 'Match Turkish words\nto their English meanings!', start: 'START', settings: 'SETTINGS', back: 'BACK', settingsTitle: 'Settings', difficulty: 'Difficulty Level:', easy: 'EASY', medium: 'MEDIUM', hard: 'HARD', language: 'Language:', languageButton: 'LANGUAGE', languageScreenTitle: 'Language Settings', interfaceLanguage: 'Interface Language:', gameLanguage: 'Game Language:', score: 'Score: ' }, spanish: { title: 'Turkish Word Match', instructions: 'Empareja palabras turcas\ncon sus significados!', start: 'EMPEZAR', settings: 'CONFIGURACIÓN', back: 'VOLVER', settingsTitle: 'Configuración', difficulty: 'Nivel de Dificultad:', easy: 'FÁCIL', medium: 'MEDIO', hard: 'DIFÍCIL', language: 'Idioma:', languageButton: 'IDIOMA', languageScreenTitle: 'Configuración de Idioma', interfaceLanguage: 'Idioma de Interfaz:', gameLanguage: 'Idioma del Juego:', score: 'Puntuación: ' } }; // Function to get current interface language text function getInterfaceText(key) { var interfaceLang = storage.interfaceLanguage || 'english'; return interfaceTranslations[interfaceLang][key] || interfaceTranslations.english[key]; } // Function to update all interface texts function updateAllInterfaceTexts() { // Update score text scoreText.setText(getInterfaceText('score') + score); } // --- Word Data --- var easyWordPairs = [{ tr: "Merhaba", en: "Hello" }, { tr: "Evet", en: "Yes" }, { tr: "Hayır", en: "No" }, { tr: "Teşekkürler", en: "Thank you" }, { tr: "İyi", en: "Good" }, { tr: "Kötü", en: "Bad" }, { tr: "Tamam", en: "Okay" }, { tr: "Güle güle", en: "Goodbye" }]; var mediumWordPairs = [{ tr: "Günaydın", en: "Good morning" }, { tr: "Lütfen", en: "Please" }, { tr: "Nasılsın?", en: "How are you?" }, { tr: "Affedersiniz", en: "Excuse me" }, { tr: "Hoş geldiniz", en: "Welcome" }, { tr: "Hoşça kal", en: "Bye" }, { tr: "Benim adım...", en: "My name is..." }, { tr: "Ne?", en: "What?" }, { tr: "Kim?", en: "Who?" }, { tr: "Nerede?", en: "Where?" }]; var hardWordPairs = [{ tr: "Ne zaman?", en: "When?", es: "¿Cuándo?" }, { tr: "Neden?", en: "Why?", es: "¿Por qué?" }, { tr: "Anlıyorum", en: "I understand", es: "Entiendo" }, { tr: "Anlamıyorum", en: "I don't understand", es: "No entiendo" }, { tr: "Yardım edebilir misiniz?", en: "Can you help me?", es: "¿Puedes ayudarme?" }, { tr: "Özür dilerim", en: "I'm sorry", es: "Lo siento" }, { tr: "Bir dakika", en: "One moment", es: "Un momento" }, { tr: "Konuşabiliyor musunuz?", en: "Can you speak?", es: "¿Puedes hablar?" }, { tr: "Tekrar söyleyebilir misiniz?", en: "Can you repeat?", es: "¿Puedes repetir?" }, { tr: "Çok teşekkür ederim", en: "Thank you very much", es: "Muchas gracias" }]; var easyWordPairsSpanish = [{ tr: "Merhaba", es: "Hola" }, { tr: "Evet", es: "Sí" }, { tr: "Hayır", es: "No" }, { tr: "Teşekkürler", es: "Gracias" }, { tr: "İyi", es: "Bueno" }, { tr: "Kötü", es: "Malo" }, { tr: "Tamam", es: "Okay" }, { tr: "Güle güle", es: "Adiós" }]; var mediumWordPairsSpanish = [{ tr: "Günaydın", es: "Buenos días" }, { tr: "Lütfen", es: "Por favor" }, { tr: "Nasılsın?", es: "¿Cómo estás?" }, { tr: "Affedersiniz", es: "Perdón" }, { tr: "Hoş geldiniz", es: "Bienvenido" }, { tr: "Hoşça kal", es: "Hasta luego" }, { tr: "Benim adım...", es: "Mi nombre es..." }, { tr: "Ne?", es: "¿Qué?" }, { tr: "Kim?", es: "¿Quién?" }, { tr: "Nerede?", es: "¿Dónde?" }]; var hardWordPairsSpanish = [{ tr: "Ne zaman?", es: "¿Cuándo?" }, { tr: "Neden?", es: "¿Por qué?" }, { tr: "Anlıyorum", es: "Entiendo" }, { tr: "Anlamıyorum", es: "No entiendo" }, { tr: "Yardım edebilir misiniz?", es: "¿Puedes ayudarme?" }, { tr: "Özür dilerim", es: "Lo siento" }, { tr: "Bir dakika", es: "Un momento" }, { tr: "Konuşabiliyor musunuz?", es: "¿Puedes hablar?" }, { tr: "Tekrar söyleyebilir misiniz?", es: "¿Puedes repetir?" }, { tr: "Çok teşekkür ederim", es: "Muchas gracias" }]; // Get word pairs based on difficulty function getWordPairs() { var difficulty = storage.difficulty || 'medium'; var gameLanguage = storage.gameLanguage || 'english'; if (gameLanguage === 'spanish') { if (difficulty === 'easy') { return easyWordPairsSpanish; } else if (difficulty === 'hard') { return hardWordPairsSpanish; } else { return mediumWordPairsSpanish; } } else { if (difficulty === 'easy') { return easyWordPairs; } else if (difficulty === 'hard') { return hardWordPairs; } else { return mediumWordPairs; } } } // --- Game State --- var currentRound = 0; var score = 0; var timeLeft = 15; // seconds per round, will decrease var roundTimer = null; var timerText = null; var scoreText = null; var dragNode = null; var turkishBoxes = []; var englishBoxes = []; var matchCount = 0; var roundActive = false; var lastFlash = null; var gameStarted = false; var startScreen = null; // --- UI Setup --- // Score display scoreText = new Text2(getInterfaceText('score') + '0', { size: 90, fill: 0x222222 }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); // Timer display timerText = new Text2('15', { size: 90, fill: 0xD83318 }); timerText.anchor.set(1, 0); LK.gui.topRight.addChild(timerText); // --- Game Functions --- function shuffleArray(arr) { // Fisher-Yates shuffle for (var i = arr.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } return arr; } function startRound() { // Clean up previous round for (var i = 0; i < turkishBoxes.length; i++) { turkishBoxes[i].destroy(); } for (var i = 0; i < englishBoxes.length; i++) { englishBoxes[i].destroy(); } turkishBoxes = []; englishBoxes = []; matchCount = 0; dragNode = null; roundActive = true; gameStarted = true; // Increase difficulty: more pairs, less time var numPairs = 2 + Math.floor(currentRound / 2); if (numPairs > 6) { numPairs = 6; } timeLeft = 15 - currentRound * 1; if (timeLeft < 6) { timeLeft = 6; } // Pick random pairs based on difficulty var currentWordPairs = getWordPairs(); var gameLanguage = storage.gameLanguage || 'english'; var pairs = []; var used = []; while (pairs.length < numPairs && used.length < currentWordPairs.length) { var idx = Math.floor(Math.random() * currentWordPairs.length); if (used.indexOf(idx) === -1) { var targetWord = gameLanguage === 'spanish' ? currentWordPairs[idx].es : currentWordPairs[idx].en; pairs.push({ tr: currentWordPairs[idx].tr, en: targetWord, id: 'pair' + idx }); used.push(idx); } } // Shuffle Turkish and English sides separately var turkishList = []; var englishList = []; for (var i = 0; i < pairs.length; i++) { turkishList.push({ word: pairs[i].tr, id: pairs[i].id }); englishList.push({ word: pairs[i].en, id: pairs[i].id }); } shuffleArray(turkishList); shuffleArray(englishList); // Layout Turkish boxes (draggable) on left var spacingY = 220; var startY = (2732 - (turkishList.length * spacingY - (spacingY - 180))) / 2; for (var i = 0; i < turkishList.length; i++) { var box = new TurkishWordBox(); box.setWord(turkishList[i].word, turkishList[i].id); box.x = 400; box.y = startY + i * spacingY; // Store initial position for snap-back box.initialX = box.x; box.initialY = box.y; turkishBoxes.push(box); game.addChild(box); } // Layout English boxes (targets) on right for (var i = 0; i < englishList.length; i++) { var box = new EnglishWordBox(); box.setWord(englishList[i].word, englishList[i].id); box.x = 2048 - 400; box.y = startY + i * spacingY; englishBoxes.push(box); game.addChild(box); } // Start timer timerText.setText(timeLeft); if (roundTimer) { LK.clearInterval(roundTimer); } roundTimer = LK.setInterval(function () { if (!roundActive) { return; } timeLeft -= 1; timerText.setText(timeLeft); if (timeLeft <= 0) { endRound(false); } }, 1000); } function endRound(success) { roundActive = false; if (roundTimer) { LK.clearInterval(roundTimer); roundTimer = null; } // Flash feedback if (success) { LK.effects.flashScreen(0x83de44, 600); } else { LK.effects.flashScreen(0xff0000, 900); } // Next round or game over LK.setTimeout(function () { if (success) { currentRound += 1; if (currentRound >= 10) { LK.showYouWin(); } else { startRound(); } } else { LK.showGameOver(); } }, 900); } function checkMatch(turkishBox, englishBox) { if (!roundActive) { return; } if (turkishBox.matchId === englishBox.matchId) { // Correct score += 1; LK.setScore(score); scoreText.setText(getInterfaceText('score') + score); // Animate to target tween(turkishBox, { x: englishBox.x, y: englishBox.y }, { duration: 250, easing: tween.easeIn, onFinish: function onFinish() { turkishBox.destroy(); englishBox.destroy(); } }); // Remove from arrays for (var i = 0; i < turkishBoxes.length; i++) { if (turkishBoxes[i] === turkishBox) { turkishBoxes.splice(i, 1); break; } } for (var i = 0; i < englishBoxes.length; i++) { if (englishBoxes[i] === englishBox) { englishBoxes.splice(i, 1); break; } } matchCount += 1; LK.effects.flashObject(turkishBox, 0x83de44, 400); // Only pass if all Turkish and English boxes are matched (arrays are empty) if (turkishBoxes.length === 0 && englishBoxes.length === 0) { endRound(true); } } else { // Wrong score -= 1; if (score < 0) score = 0; LK.setScore(score); scoreText.setText(getInterfaceText('score') + score); LK.effects.flashObject(turkishBox, 0xff0000, 400); // Snap back tween(turkishBox, { x: typeof turkishBox.initialX !== "undefined" ? turkishBox.initialX : 400, y: typeof turkishBox.initialY !== "undefined" ? turkishBox.initialY : turkishBox.y }, { duration: 200, easing: tween.easeOut }); } } // --- Drag and Drop Logic --- function handleMove(x, y, obj) { if (!gameStarted || !roundActive) { return; } if (dragNode && dragNode.isDragging) { // Move Turkish box to where player touches (centered) dragNode.x = x; dragNode.y = y; } } game.move = handleMove; game.down = function (x, y, obj) { if (!gameStarted || !roundActive) { return; } // Check if a Turkish box is pressed for (var i = 0; i < turkishBoxes.length; i++) { var box = turkishBoxes[i]; // Check bounds var bx = box.x - box.width / 2; var by = box.y - box.height / 2; if (x >= bx && x <= bx + box.width && y >= by && y <= by + box.height) { // Start drag box.down(x, y, obj); break; } } }; game.up = function (x, y, obj) { if (!gameStarted || !roundActive) { return; } if (dragNode && dragNode.isDragging) { // Check if over any English box var dropped = false; for (var i = 0; i < englishBoxes.length; i++) { var target = englishBoxes[i]; if (dragNode.intersects(target)) { checkMatch(dragNode, target); dropped = true; break; } } if (!dropped) { // Check for nesting with other Turkish boxes var nested = false; for (var i = 0; i < turkishBoxes.length; i++) { var other = turkishBoxes[i]; if (other !== dragNode && dragNode.intersects(other)) { nested = true; break; } } if (nested) { // Find a free Y position (not overlapping others) var spacingY = 220; var startY = (2732 - (turkishBoxes.length * spacingY - (spacingY - 180))) / 2; var found = false; for (var tryI = 0; tryI < 20 && !found; tryI++) { var tryY = startY + Math.floor(Math.random() * turkishBoxes.length) * spacingY; var overlap = false; for (var j = 0; j < turkishBoxes.length; j++) { var otherBox = turkishBoxes[j]; if (otherBox !== dragNode) { var dy = Math.abs(otherBox.y - tryY); if (dy < 180) { // box height overlap = true; break; } } } if (!overlap) { found = true; tween(dragNode, { x: 400, y: tryY }, { duration: 200, easing: tween.easeOut }); } } if (!found) { // fallback: snap to default tween(dragNode, { x: 400 }, { duration: 200, easing: tween.easeOut }); } } else { // Snap back tween(dragNode, { x: typeof dragNode.initialX !== "undefined" ? dragNode.initialX : 400, y: typeof dragNode.initialY !== "undefined" ? dragNode.initialY : dragNode.y }, { duration: 200, easing: tween.easeOut }); } } dragNode.isDragging = false; dragNode = null; } }; // --- Game Update --- game.update = function () { // No per-frame logic needed for now }; // --- Start Game --- currentRound = 0; score = 0; LK.setScore(0); scoreText.setText(getInterfaceText('score') + '0'); // Show start screen instead of immediately starting startScreen = new StartScreen(); startScreen.x = 2048 / 2; startScreen.y = 2732 / 2; game.addChild(startScreen);
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
// EnglishWordBox: static target
var EnglishWordBox = Container.expand(function () {
var self = Container.call(this);
// Attach box
var box = self.attachAsset('englishBox', {
anchorX: 0.5,
anchorY: 0.5
});
// Attach text
self.textObj = new Text2('', {
size: 80,
fill: 0xFFFFFF
});
self.textObj.anchor.set(0.5, 0.5);
self.addChild(self.textObj);
// Store word
self.word = '';
self.matchId = '';
// Set word and match id
self.setWord = function (word, matchId) {
self.word = word;
self.matchId = matchId;
self.textObj.setText(word);
};
return self;
});
// LanguageScreen: shows interface and game language options
var LanguageScreen = Container.expand(function () {
var self = Container.call(this);
// Background
var bg = self.attachAsset('flashCorrect', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.9
});
// Title
self.titleText = new Text2(getInterfaceText('languageScreenTitle'), {
size: 120,
fill: 0x222222
});
self.titleText.anchor.set(0.5, 0.5);
self.titleText.x = 0;
self.titleText.y = -400;
self.addChild(self.titleText);
// Interface Language Section (Right side)
self.interfaceText = new Text2(getInterfaceText('interfaceLanguage'), {
size: 90,
fill: 0x444444
});
self.interfaceText.anchor.set(0.5, 0.5);
self.interfaceText.x = 650;
self.interfaceText.y = -250;
self.addChild(self.interfaceText);
// Interface Turkish button
var interfaceTurkishBg = self.attachAsset('turkishBox', {
anchorX: 0.5,
anchorY: 0.5
});
interfaceTurkishBg.y = -120;
interfaceTurkishBg.x = 650;
self.interfaceTurkishText = new Text2('TÜRKÇE', {
size: 70,
fill: 0xFFFFFF
});
self.interfaceTurkishText.anchor.set(0.5, 0.5);
self.interfaceTurkishText.x = 650;
self.interfaceTurkishText.y = -120;
self.addChild(self.interfaceTurkishText);
// Interface English button
var interfaceEnglishBg = self.attachAsset('englishBox', {
anchorX: 0.5,
anchorY: 0.5
});
interfaceEnglishBg.y = 55;
interfaceEnglishBg.x = 650;
self.interfaceEnglishText = new Text2('ENGLISH', {
size: 70,
fill: 0xFFFFFF
});
self.interfaceEnglishText.anchor.set(0.5, 0.5);
self.interfaceEnglishText.x = 650;
self.interfaceEnglishText.y = 55;
self.addChild(self.interfaceEnglishText);
// Interface Spanish button
var interfaceSpanishBg = self.attachAsset('turkishBox', {
anchorX: 0.5,
anchorY: 0.5
});
interfaceSpanishBg.y = 230;
interfaceSpanishBg.x = 650;
self.interfaceSpanishText = new Text2('ESPAÑOL', {
size: 70,
fill: 0xFFFFFF
});
self.interfaceSpanishText.anchor.set(0.5, 0.5);
self.interfaceSpanishText.x = 650;
self.interfaceSpanishText.y = 230;
self.addChild(self.interfaceSpanishText);
// Game Language Section (Left side)
self.gameLanguageText = new Text2(getInterfaceText('gameLanguage'), {
size: 90,
fill: 0x444444
});
self.gameLanguageText.anchor.set(0.5, 0.5);
self.gameLanguageText.x = -450;
self.gameLanguageText.y = -250;
self.addChild(self.gameLanguageText);
// Game English button
var gameEnglishBg = self.attachAsset('englishBox', {
anchorX: 0.5,
anchorY: 0.5
});
gameEnglishBg.y = -120;
gameEnglishBg.x = -450;
self.gameEnglishText = new Text2('ENGLISH', {
size: 70,
fill: 0xFFFFFF
});
self.gameEnglishText.anchor.set(0.5, 0.5);
self.gameEnglishText.x = -450;
self.gameEnglishText.y = -120;
self.addChild(self.gameEnglishText);
// Game Spanish button
var gameSpanishBg = self.attachAsset('turkishBox', {
anchorX: 0.5,
anchorY: 0.5
});
gameSpanishBg.y = 55;
gameSpanishBg.x = -450;
self.gameSpanishText = new Text2('ESPAÑOL', {
size: 70,
fill: 0xFFFFFF
});
self.gameSpanishText.anchor.set(0.5, 0.5);
self.gameSpanishText.x = -450;
self.gameSpanishText.y = 55;
self.addChild(self.gameSpanishText);
// Back button
var backButtonBg = self.attachAsset('turkishBox', {
anchorX: 0.5,
anchorY: 0.5
});
backButtonBg.y = 425;
self.backButtonText = new Text2(getInterfaceText('back'), {
size: 70,
fill: 0xFFFFFF
});
self.backButtonText.anchor.set(0.5, 0.5);
self.backButtonText.x = 0;
self.backButtonText.y = 425;
self.addChild(self.backButtonText);
// Update button colors based on current selections
self.updateLanguageButtons = function () {
var interfaceLang = storage.interfaceLanguage || 'turkish';
var gameLang = storage.gameLanguage || 'english';
// Reset all to default color
interfaceTurkishBg.tint = 0x1e90ff;
interfaceEnglishBg.tint = 0x32cd32;
interfaceSpanishBg.tint = 0x1e90ff;
gameEnglishBg.tint = 0x32cd32;
gameSpanishBg.tint = 0x1e90ff;
// Highlight selected interface language
if (interfaceLang === 'turkish') {
interfaceTurkishBg.tint = 0x1565c0;
} else if (interfaceLang === 'english') {
interfaceEnglishBg.tint = 0x228b22;
} else if (interfaceLang === 'spanish') {
interfaceSpanishBg.tint = 0x1565c0;
}
// Highlight selected game language
if (gameLang === 'english') {
gameEnglishBg.tint = 0x228b22;
} else if (gameLang === 'spanish') {
gameSpanishBg.tint = 0x1565c0;
}
};
// Method to update all interface texts
self.updateInterfaceTexts = function () {
self.titleText.setText(getInterfaceText('languageScreenTitle'));
self.interfaceText.setText(getInterfaceText('interfaceLanguage'));
self.gameLanguageText.setText(getInterfaceText('gameLanguage'));
self.backButtonText.setText(getInterfaceText('back'));
};
self.updateLanguageButtons();
// Touch handler
self.down = function (x, y, obj) {
// Interface Turkish button
if (x >= interfaceTurkishBg.x - interfaceTurkishBg.width / 2 && x <= interfaceTurkishBg.x + interfaceTurkishBg.width / 2 && y >= interfaceTurkishBg.y - interfaceTurkishBg.height / 2 && y <= interfaceTurkishBg.y + interfaceTurkishBg.height / 2) {
storage.interfaceLanguage = 'turkish';
self.updateLanguageButtons();
self.updateInterfaceTexts();
updateAllInterfaceTexts();
}
// Interface English button
else if (x >= interfaceEnglishBg.x - interfaceEnglishBg.width / 2 && x <= interfaceEnglishBg.x + interfaceEnglishBg.width / 2 && y >= interfaceEnglishBg.y - interfaceEnglishBg.height / 2 && y <= interfaceEnglishBg.y + interfaceEnglishBg.height / 2) {
storage.interfaceLanguage = 'english';
self.updateLanguageButtons();
self.updateInterfaceTexts();
updateAllInterfaceTexts();
}
// Interface Spanish button
else if (x >= interfaceSpanishBg.x - interfaceSpanishBg.width / 2 && x <= interfaceSpanishBg.x + interfaceSpanishBg.width / 2 && y >= interfaceSpanishBg.y - interfaceSpanishBg.height / 2 && y <= interfaceSpanishBg.y + interfaceSpanishBg.height / 2) {
storage.interfaceLanguage = 'spanish';
self.updateLanguageButtons();
self.updateInterfaceTexts();
updateAllInterfaceTexts();
}
// Game English button
else if (x >= gameEnglishBg.x - gameEnglishBg.width / 2 && x <= gameEnglishBg.x + gameEnglishBg.width / 2 && y >= gameEnglishBg.y - gameEnglishBg.height / 2 && y <= gameEnglishBg.y + gameEnglishBg.height / 2) {
storage.gameLanguage = 'english';
self.updateLanguageButtons();
}
// Game Spanish button
else if (x >= gameSpanishBg.x - gameSpanishBg.width / 2 && x <= gameSpanishBg.x + gameSpanishBg.width / 2 && y >= gameSpanishBg.y - gameSpanishBg.height / 2 && y <= gameSpanishBg.y + gameSpanishBg.height / 2) {
storage.gameLanguage = 'spanish';
self.updateLanguageButtons();
}
// Back button
else if (x >= backButtonBg.x - backButtonBg.width / 2 && x <= backButtonBg.x + backButtonBg.width / 2 && y >= backButtonBg.y - backButtonBg.height / 2 && y <= backButtonBg.y + backButtonBg.height / 2) {
// Go back to settings screen
self.destroy();
var settingsScreen = new SettingsScreen();
settingsScreen.x = 2048 / 2;
settingsScreen.y = 2732 / 2;
game.addChild(settingsScreen);
}
};
return self;
});
// SettingsScreen: shows difficulty and language options
var SettingsScreen = Container.expand(function () {
var self = Container.call(this);
// Background
var bg = self.attachAsset('flashCorrect', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.9
});
// Title
self.titleText = new Text2(getInterfaceText('settingsTitle'), {
size: 120,
fill: 0x222222
});
self.titleText.anchor.set(0.5, 0.5);
self.titleText.x = 0;
self.titleText.y = -400;
self.addChild(self.titleText);
// Difficulty section
self.difficultyText = new Text2(getInterfaceText('difficulty'), {
size: 90,
fill: 0x444444
});
self.difficultyText.anchor.set(0.5, 0.5);
self.difficultyText.x = 0;
self.difficultyText.y = -300;
self.addChild(self.difficultyText);
// Easy button
var easyButtonBg = self.attachAsset('easyButton', {
anchorX: 0.5,
anchorY: 0.5
});
easyButtonBg.y = -120;
easyButtonBg.x = -500;
self.easyButtonText = new Text2(getInterfaceText('easy'), {
size: 70,
fill: 0xFFFFFF
});
self.easyButtonText.anchor.set(0.5, 0.5);
self.easyButtonText.x = -500;
self.easyButtonText.y = -120;
self.addChild(self.easyButtonText);
// Medium button
var mediumButtonBg = self.attachAsset('mediumButton', {
anchorX: 0.5,
anchorY: 0.5
});
mediumButtonBg.y = -120;
mediumButtonBg.x = 0;
self.mediumButtonText = new Text2(getInterfaceText('medium'), {
size: 70,
fill: 0xFFFFFF
});
self.mediumButtonText.anchor.set(0.5, 0.5);
self.mediumButtonText.x = 0;
self.mediumButtonText.y = -120;
self.addChild(self.mediumButtonText);
// Hard button
var hardButtonBg = self.attachAsset('hardButton', {
anchorX: 0.5,
anchorY: 0.5
});
hardButtonBg.y = -120;
hardButtonBg.x = 500;
self.hardButtonText = new Text2(getInterfaceText('hard'), {
size: 70,
fill: 0xFFFFFF
});
self.hardButtonText.anchor.set(0.5, 0.5);
self.hardButtonText.x = 500;
self.hardButtonText.y = -120;
self.addChild(self.hardButtonText);
// Language section
self.languageText = new Text2(getInterfaceText('language'), {
size: 90,
fill: 0x444444
});
self.languageText.anchor.set(0.5, 0.5);
self.languageText.x = 0;
self.languageText.y = 50;
self.addChild(self.languageText);
// Language button
var languageButtonBg = self.attachAsset('turkishBox', {
anchorX: 0.5,
anchorY: 0.5
});
languageButtonBg.y = 180;
self.languageButtonText = new Text2(getInterfaceText('languageButton'), {
size: 70,
fill: 0xFFFFFF
});
self.languageButtonText.anchor.set(0.5, 0.5);
self.languageButtonText.x = 0;
self.languageButtonText.y = 180;
self.addChild(self.languageButtonText);
// Back button
var backButtonBg = self.attachAsset('turkishBox', {
anchorX: 0.5,
anchorY: 0.5
});
backButtonBg.y = 425;
self.backButtonText = new Text2(getInterfaceText('back'), {
size: 70,
fill: 0xFFFFFF
});
self.backButtonText.anchor.set(0.5, 0.5);
self.backButtonText.x = 0;
self.backButtonText.y = 425;
self.addChild(self.backButtonText);
// Update button colors based on current difficulty
self.updateDifficultyButtons = function () {
var currentDifficulty = storage.difficulty || 'medium';
// Reset all to default color
easyButtonBg.tint = 0xFFFFFF;
mediumButtonBg.tint = 0xFFFFFF;
hardButtonBg.tint = 0xFFFFFF;
// Highlight selected
if (currentDifficulty === 'easy') {
easyButtonBg.tint = 0x228b22;
} else if (currentDifficulty === 'medium') {
mediumButtonBg.tint = 0xB8860B;
} else if (currentDifficulty === 'hard') {
hardButtonBg.tint = 0xCC0000;
}
};
self.updateDifficultyButtons();
// Touch handler
self.down = function (x, y, obj) {
// Easy button
if (x >= easyButtonBg.x - easyButtonBg.width / 2 && x <= easyButtonBg.x + easyButtonBg.width / 2 && y >= easyButtonBg.y - easyButtonBg.height / 2 && y <= easyButtonBg.y + easyButtonBg.height / 2) {
storage.difficulty = 'easy';
self.updateDifficultyButtons();
}
// Medium button
else if (x >= mediumButtonBg.x - mediumButtonBg.width / 2 && x <= mediumButtonBg.x + mediumButtonBg.width / 2 && y >= mediumButtonBg.y - mediumButtonBg.height / 2 && y <= mediumButtonBg.y + mediumButtonBg.height / 2) {
storage.difficulty = 'medium';
self.updateDifficultyButtons();
}
// Hard button
else if (x >= hardButtonBg.x - hardButtonBg.width / 2 && x <= hardButtonBg.x + hardButtonBg.width / 2 && y >= hardButtonBg.y - hardButtonBg.height / 2 && y <= hardButtonBg.y + hardButtonBg.height / 2) {
storage.difficulty = 'hard';
self.updateDifficultyButtons();
}
// Language button
else if (x >= languageButtonBg.x - languageButtonBg.width / 2 && x <= languageButtonBg.x + languageButtonBg.width / 2 && y >= languageButtonBg.y - languageButtonBg.height / 2 && y <= languageButtonBg.y + languageButtonBg.height / 2) {
// Show language screen
self.destroy();
var languageScreen = new LanguageScreen();
languageScreen.x = 2048 / 2;
languageScreen.y = 2732 / 2;
game.addChild(languageScreen);
}
// Back button
else if (x >= backButtonBg.x - backButtonBg.width / 2 && x <= backButtonBg.x + backButtonBg.width / 2 && y >= backButtonBg.y - backButtonBg.height / 2 && y <= backButtonBg.y + backButtonBg.height / 2) {
// Go back to start screen
self.destroy();
startScreen = new StartScreen();
startScreen.x = 2048 / 2;
startScreen.y = 2732 / 2;
game.addChild(startScreen);
}
};
return self;
});
// StartScreen: shows game intro and start button
var StartScreen = Container.expand(function () {
var self = Container.call(this);
// Background
var bg = self.attachAsset('flashCorrect', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.9
});
// Title
self.titleText = new Text2(getInterfaceText('title'), {
size: 120,
fill: 0x222222,
font: "'GillSans-Bold',Impact,'Arial Black',Tahoma"
});
self.titleText.anchor.set(0.5, 0.5);
self.titleText.x = 0;
self.titleText.y = -300;
self.addChild(self.titleText);
// Instructions
self.instructionText = new Text2(getInterfaceText('instructions'), {
size: 80,
fill: 0x444444
});
self.instructionText.anchor.set(0.5, 0.5);
self.instructionText.x = 0;
self.instructionText.y = -100;
self.addChild(self.instructionText);
// Start button background
var startButtonBg = self.attachAsset('turkishBox', {
anchorX: 0.5,
anchorY: 0.5
});
startButtonBg.y = 200;
// Start button text
self.startButtonText = new Text2(getInterfaceText('start'), {
size: 90,
fill: 0xFFFFFF
});
self.startButtonText.anchor.set(0.5, 0.5);
self.startButtonText.x = 0;
self.startButtonText.y = 200;
self.addChild(self.startButtonText);
// Settings button background
var settingsButtonBg = self.attachAsset('englishBox', {
anchorX: 0.5,
anchorY: 0.5
});
settingsButtonBg.y = 455;
// Settings button text
self.settingsButtonText = new Text2(getInterfaceText('settings'), {
size: 90,
fill: 0xFFFFFF
});
self.settingsButtonText.anchor.set(0.5, 0.5);
self.settingsButtonText.x = 0;
self.settingsButtonText.y = 455;
self.addChild(self.settingsButtonText);
// Touch handler for start button
self.down = function (x, y, obj) {
// Check if clicked on start button area
var buttonX = startButtonBg.x;
var buttonY = startButtonBg.y;
var buttonW = startButtonBg.width;
var buttonH = startButtonBg.height;
if (x >= buttonX - buttonW / 2 && x <= buttonX + buttonW / 2 && y >= buttonY - buttonH / 2 && y <= buttonY + buttonH / 2) {
// Start the game
self.destroy();
startRound();
}
// Check if clicked on settings button area
else if (x >= settingsButtonBg.x - settingsButtonBg.width / 2 && x <= settingsButtonBg.x + settingsButtonBg.width / 2 && y >= settingsButtonBg.y - settingsButtonBg.height / 2 && y <= settingsButtonBg.y + settingsButtonBg.height / 2) {
// Show settings screen
self.destroy();
var settingsScreen = new SettingsScreen();
settingsScreen.x = 2048 / 2;
settingsScreen.y = 2732 / 2;
game.addChild(settingsScreen);
}
};
return self;
});
// TurkishWordBox: draggable Turkish word
var TurkishWordBox = Container.expand(function () {
var self = Container.call(this);
// Attach box
var box = self.attachAsset('turkishBox', {
anchorX: 0.5,
anchorY: 0.5
});
// Attach text
self.textObj = new Text2('', {
size: 80,
fill: 0xFFFFFF
});
self.textObj.anchor.set(0.5, 0.5);
self.addChild(self.textObj);
// Store word
self.word = '';
self.matchId = '';
// Drag state
self.isDragging = false;
// Set word and match id
self.setWord = function (word, matchId) {
self.word = word;
self.matchId = matchId;
self.textObj.setText(word);
};
// For drag offset
self.dragOffsetX = 0;
self.dragOffsetY = 0;
// Down event: start drag
self.down = function (x, y, obj) {
self.isDragging = true;
// Offset from center
self.dragOffsetX = self.x - x;
self.dragOffsetY = self.y - y;
dragNode = self;
};
// Up event: handled in game.up
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xf7f7f7
});
/****
* Game Code
****/
// Wrong match flash
// Correct match flash
// English word box
// Turkish word box
// --- Interface Language Translations ---
var interfaceTranslations = {
turkish: {
title: 'Turkish Word Match',
instructions: 'Türkçe kelimeleri\nİngilizce karşılıklarıyla eşleştirin!',
start: 'BAŞLA',
settings: 'AYARLAR',
back: 'GERİ',
settingsTitle: 'Ayarlar',
difficulty: 'Zorluk Seviyesi:',
easy: 'KOLAY',
medium: 'ORTA',
hard: 'ZOR',
language: 'Dil:',
languageButton: 'LANGUAGE',
languageScreenTitle: 'Dil Ayarları',
interfaceLanguage: 'Arayüz Dili:',
gameLanguage: 'Oyun Dili:',
score: 'Skor: '
},
english: {
title: 'Turkish Word Match',
instructions: 'Match Turkish words\nto their English meanings!',
start: 'START',
settings: 'SETTINGS',
back: 'BACK',
settingsTitle: 'Settings',
difficulty: 'Difficulty Level:',
easy: 'EASY',
medium: 'MEDIUM',
hard: 'HARD',
language: 'Language:',
languageButton: 'LANGUAGE',
languageScreenTitle: 'Language Settings',
interfaceLanguage: 'Interface Language:',
gameLanguage: 'Game Language:',
score: 'Score: '
},
spanish: {
title: 'Turkish Word Match',
instructions: 'Empareja palabras turcas\ncon sus significados!',
start: 'EMPEZAR',
settings: 'CONFIGURACIÓN',
back: 'VOLVER',
settingsTitle: 'Configuración',
difficulty: 'Nivel de Dificultad:',
easy: 'FÁCIL',
medium: 'MEDIO',
hard: 'DIFÍCIL',
language: 'Idioma:',
languageButton: 'IDIOMA',
languageScreenTitle: 'Configuración de Idioma',
interfaceLanguage: 'Idioma de Interfaz:',
gameLanguage: 'Idioma del Juego:',
score: 'Puntuación: '
}
};
// Function to get current interface language text
function getInterfaceText(key) {
var interfaceLang = storage.interfaceLanguage || 'english';
return interfaceTranslations[interfaceLang][key] || interfaceTranslations.english[key];
}
// Function to update all interface texts
function updateAllInterfaceTexts() {
// Update score text
scoreText.setText(getInterfaceText('score') + score);
}
// --- Word Data ---
var easyWordPairs = [{
tr: "Merhaba",
en: "Hello"
}, {
tr: "Evet",
en: "Yes"
}, {
tr: "Hayır",
en: "No"
}, {
tr: "Teşekkürler",
en: "Thank you"
}, {
tr: "İyi",
en: "Good"
}, {
tr: "Kötü",
en: "Bad"
}, {
tr: "Tamam",
en: "Okay"
}, {
tr: "Güle güle",
en: "Goodbye"
}];
var mediumWordPairs = [{
tr: "Günaydın",
en: "Good morning"
}, {
tr: "Lütfen",
en: "Please"
}, {
tr: "Nasılsın?",
en: "How are you?"
}, {
tr: "Affedersiniz",
en: "Excuse me"
}, {
tr: "Hoş geldiniz",
en: "Welcome"
}, {
tr: "Hoşça kal",
en: "Bye"
}, {
tr: "Benim adım...",
en: "My name is..."
}, {
tr: "Ne?",
en: "What?"
}, {
tr: "Kim?",
en: "Who?"
}, {
tr: "Nerede?",
en: "Where?"
}];
var hardWordPairs = [{
tr: "Ne zaman?",
en: "When?",
es: "¿Cuándo?"
}, {
tr: "Neden?",
en: "Why?",
es: "¿Por qué?"
}, {
tr: "Anlıyorum",
en: "I understand",
es: "Entiendo"
}, {
tr: "Anlamıyorum",
en: "I don't understand",
es: "No entiendo"
}, {
tr: "Yardım edebilir misiniz?",
en: "Can you help me?",
es: "¿Puedes ayudarme?"
}, {
tr: "Özür dilerim",
en: "I'm sorry",
es: "Lo siento"
}, {
tr: "Bir dakika",
en: "One moment",
es: "Un momento"
}, {
tr: "Konuşabiliyor musunuz?",
en: "Can you speak?",
es: "¿Puedes hablar?"
}, {
tr: "Tekrar söyleyebilir misiniz?",
en: "Can you repeat?",
es: "¿Puedes repetir?"
}, {
tr: "Çok teşekkür ederim",
en: "Thank you very much",
es: "Muchas gracias"
}];
var easyWordPairsSpanish = [{
tr: "Merhaba",
es: "Hola"
}, {
tr: "Evet",
es: "Sí"
}, {
tr: "Hayır",
es: "No"
}, {
tr: "Teşekkürler",
es: "Gracias"
}, {
tr: "İyi",
es: "Bueno"
}, {
tr: "Kötü",
es: "Malo"
}, {
tr: "Tamam",
es: "Okay"
}, {
tr: "Güle güle",
es: "Adiós"
}];
var mediumWordPairsSpanish = [{
tr: "Günaydın",
es: "Buenos días"
}, {
tr: "Lütfen",
es: "Por favor"
}, {
tr: "Nasılsın?",
es: "¿Cómo estás?"
}, {
tr: "Affedersiniz",
es: "Perdón"
}, {
tr: "Hoş geldiniz",
es: "Bienvenido"
}, {
tr: "Hoşça kal",
es: "Hasta luego"
}, {
tr: "Benim adım...",
es: "Mi nombre es..."
}, {
tr: "Ne?",
es: "¿Qué?"
}, {
tr: "Kim?",
es: "¿Quién?"
}, {
tr: "Nerede?",
es: "¿Dónde?"
}];
var hardWordPairsSpanish = [{
tr: "Ne zaman?",
es: "¿Cuándo?"
}, {
tr: "Neden?",
es: "¿Por qué?"
}, {
tr: "Anlıyorum",
es: "Entiendo"
}, {
tr: "Anlamıyorum",
es: "No entiendo"
}, {
tr: "Yardım edebilir misiniz?",
es: "¿Puedes ayudarme?"
}, {
tr: "Özür dilerim",
es: "Lo siento"
}, {
tr: "Bir dakika",
es: "Un momento"
}, {
tr: "Konuşabiliyor musunuz?",
es: "¿Puedes hablar?"
}, {
tr: "Tekrar söyleyebilir misiniz?",
es: "¿Puedes repetir?"
}, {
tr: "Çok teşekkür ederim",
es: "Muchas gracias"
}];
// Get word pairs based on difficulty
function getWordPairs() {
var difficulty = storage.difficulty || 'medium';
var gameLanguage = storage.gameLanguage || 'english';
if (gameLanguage === 'spanish') {
if (difficulty === 'easy') {
return easyWordPairsSpanish;
} else if (difficulty === 'hard') {
return hardWordPairsSpanish;
} else {
return mediumWordPairsSpanish;
}
} else {
if (difficulty === 'easy') {
return easyWordPairs;
} else if (difficulty === 'hard') {
return hardWordPairs;
} else {
return mediumWordPairs;
}
}
}
// --- Game State ---
var currentRound = 0;
var score = 0;
var timeLeft = 15; // seconds per round, will decrease
var roundTimer = null;
var timerText = null;
var scoreText = null;
var dragNode = null;
var turkishBoxes = [];
var englishBoxes = [];
var matchCount = 0;
var roundActive = false;
var lastFlash = null;
var gameStarted = false;
var startScreen = null;
// --- UI Setup ---
// Score display
scoreText = new Text2(getInterfaceText('score') + '0', {
size: 90,
fill: 0x222222
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
// Timer display
timerText = new Text2('15', {
size: 90,
fill: 0xD83318
});
timerText.anchor.set(1, 0);
LK.gui.topRight.addChild(timerText);
// --- Game Functions ---
function shuffleArray(arr) {
// Fisher-Yates shuffle
for (var i = arr.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
return arr;
}
function startRound() {
// Clean up previous round
for (var i = 0; i < turkishBoxes.length; i++) {
turkishBoxes[i].destroy();
}
for (var i = 0; i < englishBoxes.length; i++) {
englishBoxes[i].destroy();
}
turkishBoxes = [];
englishBoxes = [];
matchCount = 0;
dragNode = null;
roundActive = true;
gameStarted = true;
// Increase difficulty: more pairs, less time
var numPairs = 2 + Math.floor(currentRound / 2);
if (numPairs > 6) {
numPairs = 6;
}
timeLeft = 15 - currentRound * 1;
if (timeLeft < 6) {
timeLeft = 6;
}
// Pick random pairs based on difficulty
var currentWordPairs = getWordPairs();
var gameLanguage = storage.gameLanguage || 'english';
var pairs = [];
var used = [];
while (pairs.length < numPairs && used.length < currentWordPairs.length) {
var idx = Math.floor(Math.random() * currentWordPairs.length);
if (used.indexOf(idx) === -1) {
var targetWord = gameLanguage === 'spanish' ? currentWordPairs[idx].es : currentWordPairs[idx].en;
pairs.push({
tr: currentWordPairs[idx].tr,
en: targetWord,
id: 'pair' + idx
});
used.push(idx);
}
}
// Shuffle Turkish and English sides separately
var turkishList = [];
var englishList = [];
for (var i = 0; i < pairs.length; i++) {
turkishList.push({
word: pairs[i].tr,
id: pairs[i].id
});
englishList.push({
word: pairs[i].en,
id: pairs[i].id
});
}
shuffleArray(turkishList);
shuffleArray(englishList);
// Layout Turkish boxes (draggable) on left
var spacingY = 220;
var startY = (2732 - (turkishList.length * spacingY - (spacingY - 180))) / 2;
for (var i = 0; i < turkishList.length; i++) {
var box = new TurkishWordBox();
box.setWord(turkishList[i].word, turkishList[i].id);
box.x = 400;
box.y = startY + i * spacingY;
// Store initial position for snap-back
box.initialX = box.x;
box.initialY = box.y;
turkishBoxes.push(box);
game.addChild(box);
}
// Layout English boxes (targets) on right
for (var i = 0; i < englishList.length; i++) {
var box = new EnglishWordBox();
box.setWord(englishList[i].word, englishList[i].id);
box.x = 2048 - 400;
box.y = startY + i * spacingY;
englishBoxes.push(box);
game.addChild(box);
}
// Start timer
timerText.setText(timeLeft);
if (roundTimer) {
LK.clearInterval(roundTimer);
}
roundTimer = LK.setInterval(function () {
if (!roundActive) {
return;
}
timeLeft -= 1;
timerText.setText(timeLeft);
if (timeLeft <= 0) {
endRound(false);
}
}, 1000);
}
function endRound(success) {
roundActive = false;
if (roundTimer) {
LK.clearInterval(roundTimer);
roundTimer = null;
}
// Flash feedback
if (success) {
LK.effects.flashScreen(0x83de44, 600);
} else {
LK.effects.flashScreen(0xff0000, 900);
}
// Next round or game over
LK.setTimeout(function () {
if (success) {
currentRound += 1;
if (currentRound >= 10) {
LK.showYouWin();
} else {
startRound();
}
} else {
LK.showGameOver();
}
}, 900);
}
function checkMatch(turkishBox, englishBox) {
if (!roundActive) {
return;
}
if (turkishBox.matchId === englishBox.matchId) {
// Correct
score += 1;
LK.setScore(score);
scoreText.setText(getInterfaceText('score') + score);
// Animate to target
tween(turkishBox, {
x: englishBox.x,
y: englishBox.y
}, {
duration: 250,
easing: tween.easeIn,
onFinish: function onFinish() {
turkishBox.destroy();
englishBox.destroy();
}
});
// Remove from arrays
for (var i = 0; i < turkishBoxes.length; i++) {
if (turkishBoxes[i] === turkishBox) {
turkishBoxes.splice(i, 1);
break;
}
}
for (var i = 0; i < englishBoxes.length; i++) {
if (englishBoxes[i] === englishBox) {
englishBoxes.splice(i, 1);
break;
}
}
matchCount += 1;
LK.effects.flashObject(turkishBox, 0x83de44, 400);
// Only pass if all Turkish and English boxes are matched (arrays are empty)
if (turkishBoxes.length === 0 && englishBoxes.length === 0) {
endRound(true);
}
} else {
// Wrong
score -= 1;
if (score < 0) score = 0;
LK.setScore(score);
scoreText.setText(getInterfaceText('score') + score);
LK.effects.flashObject(turkishBox, 0xff0000, 400);
// Snap back
tween(turkishBox, {
x: typeof turkishBox.initialX !== "undefined" ? turkishBox.initialX : 400,
y: typeof turkishBox.initialY !== "undefined" ? turkishBox.initialY : turkishBox.y
}, {
duration: 200,
easing: tween.easeOut
});
}
}
// --- Drag and Drop Logic ---
function handleMove(x, y, obj) {
if (!gameStarted || !roundActive) {
return;
}
if (dragNode && dragNode.isDragging) {
// Move Turkish box to where player touches (centered)
dragNode.x = x;
dragNode.y = y;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
if (!gameStarted || !roundActive) {
return;
}
// Check if a Turkish box is pressed
for (var i = 0; i < turkishBoxes.length; i++) {
var box = turkishBoxes[i];
// Check bounds
var bx = box.x - box.width / 2;
var by = box.y - box.height / 2;
if (x >= bx && x <= bx + box.width && y >= by && y <= by + box.height) {
// Start drag
box.down(x, y, obj);
break;
}
}
};
game.up = function (x, y, obj) {
if (!gameStarted || !roundActive) {
return;
}
if (dragNode && dragNode.isDragging) {
// Check if over any English box
var dropped = false;
for (var i = 0; i < englishBoxes.length; i++) {
var target = englishBoxes[i];
if (dragNode.intersects(target)) {
checkMatch(dragNode, target);
dropped = true;
break;
}
}
if (!dropped) {
// Check for nesting with other Turkish boxes
var nested = false;
for (var i = 0; i < turkishBoxes.length; i++) {
var other = turkishBoxes[i];
if (other !== dragNode && dragNode.intersects(other)) {
nested = true;
break;
}
}
if (nested) {
// Find a free Y position (not overlapping others)
var spacingY = 220;
var startY = (2732 - (turkishBoxes.length * spacingY - (spacingY - 180))) / 2;
var found = false;
for (var tryI = 0; tryI < 20 && !found; tryI++) {
var tryY = startY + Math.floor(Math.random() * turkishBoxes.length) * spacingY;
var overlap = false;
for (var j = 0; j < turkishBoxes.length; j++) {
var otherBox = turkishBoxes[j];
if (otherBox !== dragNode) {
var dy = Math.abs(otherBox.y - tryY);
if (dy < 180) {
// box height
overlap = true;
break;
}
}
}
if (!overlap) {
found = true;
tween(dragNode, {
x: 400,
y: tryY
}, {
duration: 200,
easing: tween.easeOut
});
}
}
if (!found) {
// fallback: snap to default
tween(dragNode, {
x: 400
}, {
duration: 200,
easing: tween.easeOut
});
}
} else {
// Snap back
tween(dragNode, {
x: typeof dragNode.initialX !== "undefined" ? dragNode.initialX : 400,
y: typeof dragNode.initialY !== "undefined" ? dragNode.initialY : dragNode.y
}, {
duration: 200,
easing: tween.easeOut
});
}
}
dragNode.isDragging = false;
dragNode = null;
}
};
// --- Game Update ---
game.update = function () {
// No per-frame logic needed for now
};
// --- Start Game ---
currentRound = 0;
score = 0;
LK.setScore(0);
scoreText.setText(getInterfaceText('score') + '0');
// Show start screen instead of immediately starting
startScreen = new StartScreen();
startScreen.x = 2048 / 2;
startScreen.y = 2732 / 2;
game.addChild(startScreen);