/**** * 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);