User prompt
когда заходишь на Learning Mode то там где показывается "кана" и как он читается то там баг, они друг на друга положились, исправь это. сделай выбор языка интерфейса Английский и Русский
User prompt
интерфейс всё ещё немного староватый измени интерфейс. сделай звук на правильном ответе и звук в неправильном ответе
User prompt
улучши интерфейс игры сделай современным и красивым и понятным и добавь ещё варианты и комбинации в катакану и в хирагану
Code edit (1 edits merged)
Please save this source code
User prompt
Japanese Character Master
Initial prompt
Создай игру для тренировки японского, например тесты на хирагану и на катакану. тесты на хирагану отдельный тест на катакану отдельный. ещё когда заходишь в программу можно было немного выучить хирагану и катакану
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var AnswerButton = Container.expand(function (text, isCorrect, callback) {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('answerButton', {
anchorX: 0.5,
anchorY: 0.5
});
var buttonText = new Text2(text, {
size: 42,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.isCorrect = isCorrect;
self.callback = callback;
self.isPressed = false;
self.down = function (x, y, obj) {
if (!self.isPressed) {
self.isPressed = true;
tween(buttonGraphics, {
scaleX: 0.92,
scaleY: 0.92
}, {
duration: 120
});
buttonGraphics.tint = 0x5a4bdb;
if (self.callback) {
self.callback(self.isCorrect);
}
}
};
return self;
});
var CharacterDisplay = Container.expand(function (character, romanization) {
var self = Container.call(this);
var cardShadow = self.attachAsset('characterCardShadow', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.15
});
cardShadow.y = 10;
var cardGraphics = self.attachAsset('characterCard', {
anchorX: 0.5,
anchorY: 0.5
});
var charText = new Text2(character, {
size: 140,
fill: 0x2f3542
});
charText.anchor.set(0.5, 0.5);
charText.y = -60;
self.addChild(charText);
var romText = new Text2(romanization, {
size: 55,
fill: 0x3742fa
});
romText.anchor.set(0.5, 0.5);
romText.y = 60;
self.addChild(romText);
return self;
});
var MenuButton = Container.expand(function (text, callback) {
var self = Container.call(this);
var buttonShadow = self.attachAsset('menuButtonShadow', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
buttonShadow.y = 8;
var buttonGraphics = self.attachAsset('menuButton', {
anchorX: 0.5,
anchorY: 0.5
});
var buttonText = new Text2(text, {
size: 52,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.callback = callback;
self.down = function (x, y, obj) {
tween(buttonGraphics, {
scaleX: 0.95,
scaleY: 0.95,
y: 4
}, {
duration: 100
});
tween(buttonShadow, {
scaleX: 0.95,
scaleY: 0.95,
alpha: 0.5
}, {
duration: 100
});
if (self.callback) {
self.callback();
}
};
self.up = function (x, y, obj) {
tween(buttonGraphics, {
scaleX: 1.0,
scaleY: 1.0,
y: 0
}, {
duration: 100
});
tween(buttonShadow, {
scaleX: 1.0,
scaleY: 1.0,
alpha: 0.3
}, {
duration: 100
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xffffff
});
/****
* Game Code
****/
// Game data
var hiraganaChars = [{
"char": 'あ',
rom: 'a'
}, {
"char": 'い',
rom: 'i'
}, {
"char": 'う',
rom: 'u'
}, {
"char": 'え',
rom: 'e'
}, {
"char": 'お',
rom: 'o'
}, {
"char": 'か',
rom: 'ka'
}, {
"char": 'き',
rom: 'ki'
}, {
"char": 'く',
rom: 'ku'
}, {
"char": 'け',
rom: 'ke'
}, {
"char": 'こ',
rom: 'ko'
}, {
"char": 'が',
rom: 'ga'
}, {
"char": 'ぎ',
rom: 'gi'
}, {
"char": 'ぐ',
rom: 'gu'
}, {
"char": 'げ',
rom: 'ge'
}, {
"char": 'ご',
rom: 'go'
}, {
"char": 'さ',
rom: 'sa'
}, {
"char": 'し',
rom: 'shi'
}, {
"char": 'す',
rom: 'su'
}, {
"char": 'せ',
rom: 'se'
}, {
"char": 'そ',
rom: 'so'
}, {
"char": 'ざ',
rom: 'za'
}, {
"char": 'じ',
rom: 'ji'
}, {
"char": 'ず',
rom: 'zu'
}, {
"char": 'ぜ',
rom: 'ze'
}, {
"char": 'ぞ',
rom: 'zo'
}, {
"char": 'た',
rom: 'ta'
}, {
"char": 'ち',
rom: 'chi'
}, {
"char": 'つ',
rom: 'tsu'
}, {
"char": 'て',
rom: 'te'
}, {
"char": 'と',
rom: 'to'
}, {
"char": 'だ',
rom: 'da'
}, {
"char": 'ぢ',
rom: 'di'
}, {
"char": 'づ',
rom: 'du'
}, {
"char": 'で',
rom: 'de'
}, {
"char": 'ど',
rom: 'do'
}, {
"char": 'な',
rom: 'na'
}, {
"char": 'に',
rom: 'ni'
}, {
"char": 'ぬ',
rom: 'nu'
}, {
"char": 'ね',
rom: 'ne'
}, {
"char": 'の',
rom: 'no'
}, {
"char": 'は',
rom: 'ha'
}, {
"char": 'ひ',
rom: 'hi'
}, {
"char": 'ふ',
rom: 'fu'
}, {
"char": 'へ',
rom: 'he'
}, {
"char": 'ほ',
rom: 'ho'
}, {
"char": 'ば',
rom: 'ba'
}, {
"char": 'び',
rom: 'bi'
}, {
"char": 'ぶ',
rom: 'bu'
}, {
"char": 'べ',
rom: 'be'
}, {
"char": 'ぼ',
rom: 'bo'
}, {
"char": 'ぱ',
rom: 'pa'
}, {
"char": 'ぴ',
rom: 'pi'
}, {
"char": 'ぷ',
rom: 'pu'
}, {
"char": 'ぺ',
rom: 'pe'
}, {
"char": 'ぽ',
rom: 'po'
}, {
"char": 'ま',
rom: 'ma'
}, {
"char": 'み',
rom: 'mi'
}, {
"char": 'む',
rom: 'mu'
}, {
"char": 'め',
rom: 'me'
}, {
"char": 'も',
rom: 'mo'
}, {
"char": 'や',
rom: 'ya'
}, {
"char": 'ゆ',
rom: 'yu'
}, {
"char": 'よ',
rom: 'yo'
}, {
"char": 'きゃ',
rom: 'kya'
}, {
"char": 'きゅ',
rom: 'kyu'
}, {
"char": 'きょ',
rom: 'kyo'
}, {
"char": 'しゃ',
rom: 'sha'
}, {
"char": 'しゅ',
rom: 'shu'
}, {
"char": 'しょ',
rom: 'sho'
}, {
"char": 'ちゃ',
rom: 'cha'
}, {
"char": 'ちゅ',
rom: 'chu'
}, {
"char": 'ちょ',
rom: 'cho'
}, {
"char": 'にゃ',
rom: 'nya'
}, {
"char": 'にゅ',
rom: 'nyu'
}, {
"char": 'にょ',
rom: 'nyo'
}, {
"char": 'ひゃ',
rom: 'hya'
}, {
"char": 'ひゅ',
rom: 'hyu'
}, {
"char": 'ひょ',
rom: 'hyo'
}, {
"char": 'みゃ',
rom: 'mya'
}, {
"char": 'みゅ',
rom: 'myu'
}, {
"char": 'みょ',
rom: 'myo'
}, {
"char": 'りゃ',
rom: 'rya'
}, {
"char": 'りゅ',
rom: 'ryu'
}, {
"char": 'りょ',
rom: 'ryo'
}, {
"char": 'ら',
rom: 'ra'
}, {
"char": 'り',
rom: 'ri'
}, {
"char": 'る',
rom: 'ru'
}, {
"char": 'れ',
rom: 're'
}, {
"char": 'ろ',
rom: 'ro'
}, {
"char": 'わ',
rom: 'wa'
}, {
"char": 'を',
rom: 'wo'
}, {
"char": 'ん',
rom: 'n'
}];
var katakanaChars = [{
"char": 'ア',
rom: 'a'
}, {
"char": 'イ',
rom: 'i'
}, {
"char": 'ウ',
rom: 'u'
}, {
"char": 'エ',
rom: 'e'
}, {
"char": 'オ',
rom: 'o'
}, {
"char": 'カ',
rom: 'ka'
}, {
"char": 'キ',
rom: 'ki'
}, {
"char": 'ク',
rom: 'ku'
}, {
"char": 'ケ',
rom: 'ke'
}, {
"char": 'コ',
rom: 'ko'
}, {
"char": 'ガ',
rom: 'ga'
}, {
"char": 'ギ',
rom: 'gi'
}, {
"char": 'グ',
rom: 'gu'
}, {
"char": 'ゲ',
rom: 'ge'
}, {
"char": 'ゴ',
rom: 'go'
}, {
"char": 'サ',
rom: 'sa'
}, {
"char": 'シ',
rom: 'shi'
}, {
"char": 'ス',
rom: 'su'
}, {
"char": 'セ',
rom: 'se'
}, {
"char": 'ソ',
rom: 'so'
}, {
"char": 'ザ',
rom: 'za'
}, {
"char": 'ジ',
rom: 'ji'
}, {
"char": 'ズ',
rom: 'zu'
}, {
"char": 'ゼ',
rom: 'ze'
}, {
"char": 'ゾ',
rom: 'zo'
}, {
"char": 'タ',
rom: 'ta'
}, {
"char": 'チ',
rom: 'chi'
}, {
"char": 'ツ',
rom: 'tsu'
}, {
"char": 'テ',
rom: 'te'
}, {
"char": 'ト',
rom: 'to'
}, {
"char": 'ダ',
rom: 'da'
}, {
"char": 'ヂ',
rom: 'di'
}, {
"char": 'ヅ',
rom: 'du'
}, {
"char": 'デ',
rom: 'de'
}, {
"char": 'ド',
rom: 'do'
}, {
"char": 'ナ',
rom: 'na'
}, {
"char": 'ニ',
rom: 'ni'
}, {
"char": 'ヌ',
rom: 'nu'
}, {
"char": 'ネ',
rom: 'ne'
}, {
"char": 'ノ',
rom: 'no'
}, {
"char": 'ハ',
rom: 'ha'
}, {
"char": 'ヒ',
rom: 'hi'
}, {
"char": 'フ',
rom: 'fu'
}, {
"char": 'ヘ',
rom: 'he'
}, {
"char": 'ホ',
rom: 'ho'
}, {
"char": 'バ',
rom: 'ba'
}, {
"char": 'ビ',
rom: 'bi'
}, {
"char": 'ブ',
rom: 'bu'
}, {
"char": 'ベ',
rom: 'be'
}, {
"char": 'ボ',
rom: 'bo'
}, {
"char": 'パ',
rom: 'pa'
}, {
"char": 'ピ',
rom: 'pi'
}, {
"char": 'プ',
rom: 'pu'
}, {
"char": 'ペ',
rom: 'pe'
}, {
"char": 'ポ',
rom: 'po'
}, {
"char": 'マ',
rom: 'ma'
}, {
"char": 'ミ',
rom: 'mi'
}, {
"char": 'ム',
rom: 'mu'
}, {
"char": 'メ',
rom: 'me'
}, {
"char": 'モ',
rom: 'mo'
}, {
"char": 'ヤ',
rom: 'ya'
}, {
"char": 'ユ',
rom: 'yu'
}, {
"char": 'ヨ',
rom: 'yo'
}, {
"char": 'キャ',
rom: 'kya'
}, {
"char": 'キュ',
rom: 'kyu'
}, {
"char": 'キョ',
rom: 'kyo'
}, {
"char": 'シャ',
rom: 'sha'
}, {
"char": 'シュ',
rom: 'shu'
}, {
"char": 'ショ',
rom: 'sho'
}, {
"char": 'チャ',
rom: 'cha'
}, {
"char": 'チュ',
rom: 'chu'
}, {
"char": 'チョ',
rom: 'cho'
}, {
"char": 'ニャ',
rom: 'nya'
}, {
"char": 'ニュ',
rom: 'nyu'
}, {
"char": 'ニョ',
rom: 'nyo'
}, {
"char": 'ヒャ',
rom: 'hya'
}, {
"char": 'ヒュ',
rom: 'hyu'
}, {
"char": 'ヒョ',
rom: 'hyo'
}, {
"char": 'ミャ',
rom: 'mya'
}, {
"char": 'ミュ',
rom: 'myu'
}, {
"char": 'ミョ',
rom: 'myo'
}, {
"char": 'リャ',
rom: 'rya'
}, {
"char": 'リュ',
rom: 'ryu'
}, {
"char": 'リョ',
rom: 'ryo'
}, {
"char": 'ファ',
rom: 'fa'
}, {
"char": 'フィ',
rom: 'fi'
}, {
"char": 'フェ',
rom: 'fe'
}, {
"char": 'フォ',
rom: 'fo'
}, {
"char": 'ラ',
rom: 'ra'
}, {
"char": 'リ',
rom: 'ri'
}, {
"char": 'ル',
rom: 'ru'
}, {
"char": 'レ',
rom: 're'
}, {
"char": 'ロ',
rom: 'ro'
}, {
"char": 'ワ',
rom: 'wa'
}, {
"char": 'ヲ',
rom: 'wo'
}, {
"char": 'ン',
rom: 'n'
}];
// Game state
var gameState = 'menu'; // 'menu', 'learn', 'hiraganaTest', 'katakanaTest'
var currentMode = null;
var currentCharIndex = 0;
var currentQuestion = null;
var answerButtons = [];
var score = 0;
var streak = 0;
var questionsAnswered = 0;
// Load saved progress
var savedScore = storage.bestScore || 0;
var savedStreak = storage.bestStreak || 0;
// Language settings
var currentLanguage = storage.language || 'en'; // 'en' for English, 'ru' for Russian
var uiTexts = {
en: {
title: 'Japanese Character Master',
learnMode: 'Learn Mode',
hiraganaTest: 'Hiragana Test',
katakanaTest: 'Katakana Test',
backToMenu: 'Back to Menu',
nextCharacter: 'Next Character',
prevCharacter: 'Previous Character',
bestScore: 'Best Score: ',
score: 'Score: ',
streak: 'Streak: ',
language: 'Language'
},
ru: {
title: 'Мастер японских символов',
learnMode: 'Режим изучения',
hiraganaTest: 'Тест хираганы',
katakanaTest: 'Тест катаканы',
backToMenu: 'Назад в меню',
nextCharacter: 'Следующий символ',
prevCharacter: 'Предыдущий символ',
bestScore: 'Лучший результат: ',
score: 'Счёт: ',
streak: 'Серия: ',
language: 'Язык'
}
};
// UI Elements
var backgroundGradient = game.addChild(LK.getAsset('backgroundGradient', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
alpha: 0.8
}));
var backgroundPanel = game.addChild(LK.getAsset('backgroundPanel', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
alpha: 0.95
}));
var titleText = new Text2(uiTexts[currentLanguage].title, {
size: 85,
fill: 0xf1f2f6
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 400;
game.addChild(titleText);
var scoreText = new Text2(uiTexts[currentLanguage].bestScore + savedScore, {
size: 42,
fill: 0xf1f2f6
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
scoreText.y = 50;
var currentScoreText = new Text2(uiTexts[currentLanguage].score + '0', {
size: 55,
fill: 0xf1f2f6
});
currentScoreText.anchor.set(0.5, 0);
currentScoreText.x = 1024;
currentScoreText.y = 200;
game.addChild(currentScoreText);
currentScoreText.visible = false;
var streakText = new Text2(uiTexts[currentLanguage].streak + '0', {
size: 45,
fill: 0x2ed573
});
streakText.anchor.set(0.5, 0);
streakText.x = 1024;
streakText.y = 270;
game.addChild(streakText);
streakText.visible = false;
var progressBarBg = game.addChild(LK.getAsset('progressBarBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 330
}));
progressBarBg.visible = false;
var progressBar = game.addChild(LK.getAsset('progressBar', {
anchorX: 0,
anchorY: 0.5,
x: 824,
y: 330,
scaleX: 0
}));
progressBar.visible = false;
// Menu buttons
var learnButton = game.addChild(new MenuButton(uiTexts[currentLanguage].learnMode, function () {
startLearnMode();
}));
learnButton.x = 1024;
learnButton.y = 700;
var hiraganaButton = game.addChild(new MenuButton(uiTexts[currentLanguage].hiraganaTest, function () {
startHiraganaTest();
}));
hiraganaButton.x = 1024;
hiraganaButton.y = 850;
var katakanaButton = game.addChild(new MenuButton(uiTexts[currentLanguage].katakanaTest, function () {
startKatakanaTest();
}));
katakanaButton.x = 1024;
katakanaButton.y = 1000;
var languageButton = game.addChild(new MenuButton(uiTexts[currentLanguage].language + ': ' + (currentLanguage === 'en' ? 'English' : 'Русский'), function () {
toggleLanguage();
}));
languageButton.x = 1024;
languageButton.y = 1150;
var backButton = game.addChild(new MenuButton(uiTexts[currentLanguage].backToMenu, function () {
returnToMenu();
}));
backButton.x = 1024;
backButton.y = 2200;
backButton.visible = false;
var nextButton = game.addChild(new MenuButton(uiTexts[currentLanguage].nextCharacter, function () {
showNextCharacter();
}));
nextButton.x = 1024;
nextButton.y = 1800;
nextButton.visible = false;
var prevButton = game.addChild(new MenuButton(uiTexts[currentLanguage].prevCharacter, function () {
showPrevCharacter();
}));
prevButton.x = 1024;
prevButton.y = 1950;
prevButton.visible = false;
// Character display for learn mode
var characterDisplay = null;
// Question character display for tests
var questionCharBg = game.addChild(LK.getAsset('characterCard', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 600
}));
questionCharBg.visible = false;
var questionCharText = new Text2('', {
size: 180,
fill: 0x2f3542
});
questionCharText.anchor.set(0.5, 0.5);
questionCharText.x = 1024;
questionCharText.y = 600;
game.addChild(questionCharText);
questionCharText.visible = false;
function hideMenuElements() {
titleText.visible = false;
learnButton.visible = false;
hiraganaButton.visible = false;
katakanaButton.visible = false;
languageButton.visible = false;
}
function showMenuElements() {
titleText.visible = true;
learnButton.visible = true;
hiraganaButton.visible = true;
katakanaButton.visible = true;
languageButton.visible = true;
backButton.visible = false;
nextButton.visible = false;
prevButton.visible = false;
currentScoreText.visible = false;
streakText.visible = false;
questionCharText.visible = false;
questionCharBg.visible = false;
progressBar.visible = false;
progressBarBg.visible = false;
if (characterDisplay) {
characterDisplay.visible = false;
}
for (var i = 0; i < answerButtons.length; i++) {
answerButtons[i].visible = false;
}
}
function startLearnMode() {
gameState = 'learn';
currentMode = hiraganaChars;
currentCharIndex = 0;
hideMenuElements();
backButton.visible = true;
nextButton.visible = true;
prevButton.visible = true;
showCurrentCharacter();
}
function startHiraganaTest() {
gameState = 'hiraganaTest';
currentMode = hiraganaChars;
score = 0;
streak = 0;
questionsAnswered = 0;
hideMenuElements();
backButton.visible = true;
currentScoreText.visible = true;
streakText.visible = true;
questionCharText.visible = true;
questionCharBg.visible = true;
progressBar.visible = true;
progressBarBg.visible = true;
updateScoreDisplay();
generateQuestion();
}
function startKatakanaTest() {
gameState = 'katakanaTest';
currentMode = katakanaChars;
score = 0;
streak = 0;
questionsAnswered = 0;
hideMenuElements();
backButton.visible = true;
currentScoreText.visible = true;
streakText.visible = true;
questionCharText.visible = true;
questionCharBg.visible = true;
progressBar.visible = true;
progressBarBg.visible = true;
updateScoreDisplay();
generateQuestion();
}
function returnToMenu() {
gameState = 'menu';
showMenuElements();
}
function showCurrentCharacter() {
if (characterDisplay) {
game.removeChild(characterDisplay);
}
var _char = currentMode[currentCharIndex];
characterDisplay = game.addChild(new CharacterDisplay(_char["char"], _char.rom));
characterDisplay.x = 1024;
characterDisplay.y = 1000;
}
function showNextCharacter() {
currentCharIndex = (currentCharIndex + 1) % currentMode.length;
showCurrentCharacter();
}
function showPrevCharacter() {
currentCharIndex = (currentCharIndex - 1 + currentMode.length) % currentMode.length;
showCurrentCharacter();
}
function generateQuestion() {
// Clear previous answer buttons
for (var i = 0; i < answerButtons.length; i++) {
game.removeChild(answerButtons[i]);
}
answerButtons = [];
// Pick random character
var randomIndex = Math.floor(Math.random() * currentMode.length);
currentQuestion = currentMode[randomIndex];
questionCharText.setText(currentQuestion["char"]);
// Generate wrong answers
var wrongAnswers = [];
while (wrongAnswers.length < 3) {
var wrongIndex = Math.floor(Math.random() * currentMode.length);
var wrongAnswer = currentMode[wrongIndex].rom;
if (wrongAnswer !== currentQuestion.rom && wrongAnswers.indexOf(wrongAnswer) === -1) {
wrongAnswers.push(wrongAnswer);
}
}
// Create answer options
var allAnswers = [currentQuestion.rom].concat(wrongAnswers);
// Shuffle answers
for (var i = allAnswers.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = allAnswers[i];
allAnswers[i] = allAnswers[j];
allAnswers[j] = temp;
}
// Create answer buttons
var buttonPositions = [{
x: 512,
y: 1000
}, {
x: 1536,
y: 1000
}, {
x: 512,
y: 1150
}, {
x: 1536,
y: 1150
}];
for (var i = 0; i < 4; i++) {
var isCorrect = allAnswers[i] === currentQuestion.rom;
var button = game.addChild(new AnswerButton(allAnswers[i], isCorrect, onAnswerSelected));
button.x = buttonPositions[i].x;
button.y = buttonPositions[i].y;
answerButtons.push(button);
}
}
function onAnswerSelected(isCorrect) {
questionsAnswered++;
if (isCorrect) {
score++;
streak++;
LK.getSound('correct').play();
// Show correct feedback
var feedback = game.addChild(LK.getAsset('correctFeedback', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 800,
alpha: 0
}));
tween(feedback, {
alpha: 1
}, {
duration: 200,
onFinish: function onFinish() {
tween(feedback, {
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
game.removeChild(feedback);
}
});
}
});
} else {
streak = 0;
LK.getSound('incorrect').play();
// Show incorrect feedback
var feedback = game.addChild(LK.getAsset('incorrectFeedback', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 800,
alpha: 0
}));
tween(feedback, {
alpha: 1
}, {
duration: 200,
onFinish: function onFinish() {
tween(feedback, {
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
game.removeChild(feedback);
}
});
}
});
}
updateScoreDisplay();
// Save best scores
if (score > savedScore) {
savedScore = score;
storage.bestScore = savedScore;
scoreText.setText(uiTexts[currentLanguage].bestScore + savedScore);
}
if (streak > savedStreak) {
savedStreak = streak;
storage.bestStreak = savedStreak;
}
// Generate next question after delay
LK.setTimeout(function () {
generateQuestion();
}, 800);
}
function toggleLanguage() {
currentLanguage = currentLanguage === 'en' ? 'ru' : 'en';
storage.language = currentLanguage;
updateAllTexts();
}
function updateAllTexts() {
titleText.setText(uiTexts[currentLanguage].title);
scoreText.setText(uiTexts[currentLanguage].bestScore + savedScore);
currentScoreText.setText(uiTexts[currentLanguage].score + score);
streakText.setText(uiTexts[currentLanguage].streak + streak);
// Update button texts by recreating them
game.removeChild(learnButton);
game.removeChild(hiraganaButton);
game.removeChild(katakanaButton);
game.removeChild(languageButton);
game.removeChild(backButton);
game.removeChild(nextButton);
game.removeChild(prevButton);
learnButton = game.addChild(new MenuButton(uiTexts[currentLanguage].learnMode, function () {
startLearnMode();
}));
learnButton.x = 1024;
learnButton.y = 700;
hiraganaButton = game.addChild(new MenuButton(uiTexts[currentLanguage].hiraganaTest, function () {
startHiraganaTest();
}));
hiraganaButton.x = 1024;
hiraganaButton.y = 850;
katakanaButton = game.addChild(new MenuButton(uiTexts[currentLanguage].katakanaTest, function () {
startKatakanaTest();
}));
katakanaButton.x = 1024;
katakanaButton.y = 1000;
languageButton = game.addChild(new MenuButton(uiTexts[currentLanguage].language + ': ' + (currentLanguage === 'en' ? 'English' : 'Русский'), function () {
toggleLanguage();
}));
languageButton.x = 1024;
languageButton.y = 1150;
backButton = game.addChild(new MenuButton(uiTexts[currentLanguage].backToMenu, function () {
returnToMenu();
}));
backButton.x = 1024;
backButton.y = 2200;
backButton.visible = false;
nextButton = game.addChild(new MenuButton(uiTexts[currentLanguage].nextCharacter, function () {
showNextCharacter();
}));
nextButton.x = 1024;
nextButton.y = 1800;
nextButton.visible = false;
prevButton = game.addChild(new MenuButton(uiTexts[currentLanguage].prevCharacter, function () {
showPrevCharacter();
}));
prevButton.x = 1024;
prevButton.y = 1950;
prevButton.visible = false;
// Update visibility based on current state
if (gameState === 'menu') {
showMenuElements();
} else {
hideMenuElements();
backButton.visible = true;
if (gameState === 'learn') {
nextButton.visible = true;
prevButton.visible = true;
} else {
currentScoreText.visible = true;
streakText.visible = true;
questionCharText.visible = true;
questionCharBg.visible = true;
progressBar.visible = true;
progressBarBg.visible = true;
}
}
}
function updateScoreDisplay() {
currentScoreText.setText(uiTexts[currentLanguage].score + score);
streakText.setText(uiTexts[currentLanguage].streak + streak);
var progress = Math.min(questionsAnswered / 20, 1);
tween(progressBar, {
scaleX: progress
}, {
duration: 300
});
}
// Game update loop
game.update = function () {
// Game loop logic if needed
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var AnswerButton = Container.expand(function (text, isCorrect, callback) {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('answerButton', {
anchorX: 0.5,
anchorY: 0.5
});
var buttonText = new Text2(text, {
size: 42,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.isCorrect = isCorrect;
self.callback = callback;
self.isPressed = false;
self.down = function (x, y, obj) {
if (!self.isPressed) {
self.isPressed = true;
tween(buttonGraphics, {
scaleX: 0.92,
scaleY: 0.92
}, {
duration: 120
});
buttonGraphics.tint = 0x5a4bdb;
if (self.callback) {
self.callback(self.isCorrect);
}
}
};
return self;
});
var CharacterDisplay = Container.expand(function (character, romanization) {
var self = Container.call(this);
var cardShadow = self.attachAsset('characterCardShadow', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.15
});
cardShadow.y = 10;
var cardGraphics = self.attachAsset('characterCard', {
anchorX: 0.5,
anchorY: 0.5
});
var charText = new Text2(character, {
size: 140,
fill: 0x2f3542
});
charText.anchor.set(0.5, 0.5);
charText.y = -60;
self.addChild(charText);
var romText = new Text2(romanization, {
size: 55,
fill: 0x3742fa
});
romText.anchor.set(0.5, 0.5);
romText.y = 60;
self.addChild(romText);
return self;
});
var MenuButton = Container.expand(function (text, callback) {
var self = Container.call(this);
var buttonShadow = self.attachAsset('menuButtonShadow', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
buttonShadow.y = 8;
var buttonGraphics = self.attachAsset('menuButton', {
anchorX: 0.5,
anchorY: 0.5
});
var buttonText = new Text2(text, {
size: 52,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.callback = callback;
self.down = function (x, y, obj) {
tween(buttonGraphics, {
scaleX: 0.95,
scaleY: 0.95,
y: 4
}, {
duration: 100
});
tween(buttonShadow, {
scaleX: 0.95,
scaleY: 0.95,
alpha: 0.5
}, {
duration: 100
});
if (self.callback) {
self.callback();
}
};
self.up = function (x, y, obj) {
tween(buttonGraphics, {
scaleX: 1.0,
scaleY: 1.0,
y: 0
}, {
duration: 100
});
tween(buttonShadow, {
scaleX: 1.0,
scaleY: 1.0,
alpha: 0.3
}, {
duration: 100
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xffffff
});
/****
* Game Code
****/
// Game data
var hiraganaChars = [{
"char": 'あ',
rom: 'a'
}, {
"char": 'い',
rom: 'i'
}, {
"char": 'う',
rom: 'u'
}, {
"char": 'え',
rom: 'e'
}, {
"char": 'お',
rom: 'o'
}, {
"char": 'か',
rom: 'ka'
}, {
"char": 'き',
rom: 'ki'
}, {
"char": 'く',
rom: 'ku'
}, {
"char": 'け',
rom: 'ke'
}, {
"char": 'こ',
rom: 'ko'
}, {
"char": 'が',
rom: 'ga'
}, {
"char": 'ぎ',
rom: 'gi'
}, {
"char": 'ぐ',
rom: 'gu'
}, {
"char": 'げ',
rom: 'ge'
}, {
"char": 'ご',
rom: 'go'
}, {
"char": 'さ',
rom: 'sa'
}, {
"char": 'し',
rom: 'shi'
}, {
"char": 'す',
rom: 'su'
}, {
"char": 'せ',
rom: 'se'
}, {
"char": 'そ',
rom: 'so'
}, {
"char": 'ざ',
rom: 'za'
}, {
"char": 'じ',
rom: 'ji'
}, {
"char": 'ず',
rom: 'zu'
}, {
"char": 'ぜ',
rom: 'ze'
}, {
"char": 'ぞ',
rom: 'zo'
}, {
"char": 'た',
rom: 'ta'
}, {
"char": 'ち',
rom: 'chi'
}, {
"char": 'つ',
rom: 'tsu'
}, {
"char": 'て',
rom: 'te'
}, {
"char": 'と',
rom: 'to'
}, {
"char": 'だ',
rom: 'da'
}, {
"char": 'ぢ',
rom: 'di'
}, {
"char": 'づ',
rom: 'du'
}, {
"char": 'で',
rom: 'de'
}, {
"char": 'ど',
rom: 'do'
}, {
"char": 'な',
rom: 'na'
}, {
"char": 'に',
rom: 'ni'
}, {
"char": 'ぬ',
rom: 'nu'
}, {
"char": 'ね',
rom: 'ne'
}, {
"char": 'の',
rom: 'no'
}, {
"char": 'は',
rom: 'ha'
}, {
"char": 'ひ',
rom: 'hi'
}, {
"char": 'ふ',
rom: 'fu'
}, {
"char": 'へ',
rom: 'he'
}, {
"char": 'ほ',
rom: 'ho'
}, {
"char": 'ば',
rom: 'ba'
}, {
"char": 'び',
rom: 'bi'
}, {
"char": 'ぶ',
rom: 'bu'
}, {
"char": 'べ',
rom: 'be'
}, {
"char": 'ぼ',
rom: 'bo'
}, {
"char": 'ぱ',
rom: 'pa'
}, {
"char": 'ぴ',
rom: 'pi'
}, {
"char": 'ぷ',
rom: 'pu'
}, {
"char": 'ぺ',
rom: 'pe'
}, {
"char": 'ぽ',
rom: 'po'
}, {
"char": 'ま',
rom: 'ma'
}, {
"char": 'み',
rom: 'mi'
}, {
"char": 'む',
rom: 'mu'
}, {
"char": 'め',
rom: 'me'
}, {
"char": 'も',
rom: 'mo'
}, {
"char": 'や',
rom: 'ya'
}, {
"char": 'ゆ',
rom: 'yu'
}, {
"char": 'よ',
rom: 'yo'
}, {
"char": 'きゃ',
rom: 'kya'
}, {
"char": 'きゅ',
rom: 'kyu'
}, {
"char": 'きょ',
rom: 'kyo'
}, {
"char": 'しゃ',
rom: 'sha'
}, {
"char": 'しゅ',
rom: 'shu'
}, {
"char": 'しょ',
rom: 'sho'
}, {
"char": 'ちゃ',
rom: 'cha'
}, {
"char": 'ちゅ',
rom: 'chu'
}, {
"char": 'ちょ',
rom: 'cho'
}, {
"char": 'にゃ',
rom: 'nya'
}, {
"char": 'にゅ',
rom: 'nyu'
}, {
"char": 'にょ',
rom: 'nyo'
}, {
"char": 'ひゃ',
rom: 'hya'
}, {
"char": 'ひゅ',
rom: 'hyu'
}, {
"char": 'ひょ',
rom: 'hyo'
}, {
"char": 'みゃ',
rom: 'mya'
}, {
"char": 'みゅ',
rom: 'myu'
}, {
"char": 'みょ',
rom: 'myo'
}, {
"char": 'りゃ',
rom: 'rya'
}, {
"char": 'りゅ',
rom: 'ryu'
}, {
"char": 'りょ',
rom: 'ryo'
}, {
"char": 'ら',
rom: 'ra'
}, {
"char": 'り',
rom: 'ri'
}, {
"char": 'る',
rom: 'ru'
}, {
"char": 'れ',
rom: 're'
}, {
"char": 'ろ',
rom: 'ro'
}, {
"char": 'わ',
rom: 'wa'
}, {
"char": 'を',
rom: 'wo'
}, {
"char": 'ん',
rom: 'n'
}];
var katakanaChars = [{
"char": 'ア',
rom: 'a'
}, {
"char": 'イ',
rom: 'i'
}, {
"char": 'ウ',
rom: 'u'
}, {
"char": 'エ',
rom: 'e'
}, {
"char": 'オ',
rom: 'o'
}, {
"char": 'カ',
rom: 'ka'
}, {
"char": 'キ',
rom: 'ki'
}, {
"char": 'ク',
rom: 'ku'
}, {
"char": 'ケ',
rom: 'ke'
}, {
"char": 'コ',
rom: 'ko'
}, {
"char": 'ガ',
rom: 'ga'
}, {
"char": 'ギ',
rom: 'gi'
}, {
"char": 'グ',
rom: 'gu'
}, {
"char": 'ゲ',
rom: 'ge'
}, {
"char": 'ゴ',
rom: 'go'
}, {
"char": 'サ',
rom: 'sa'
}, {
"char": 'シ',
rom: 'shi'
}, {
"char": 'ス',
rom: 'su'
}, {
"char": 'セ',
rom: 'se'
}, {
"char": 'ソ',
rom: 'so'
}, {
"char": 'ザ',
rom: 'za'
}, {
"char": 'ジ',
rom: 'ji'
}, {
"char": 'ズ',
rom: 'zu'
}, {
"char": 'ゼ',
rom: 'ze'
}, {
"char": 'ゾ',
rom: 'zo'
}, {
"char": 'タ',
rom: 'ta'
}, {
"char": 'チ',
rom: 'chi'
}, {
"char": 'ツ',
rom: 'tsu'
}, {
"char": 'テ',
rom: 'te'
}, {
"char": 'ト',
rom: 'to'
}, {
"char": 'ダ',
rom: 'da'
}, {
"char": 'ヂ',
rom: 'di'
}, {
"char": 'ヅ',
rom: 'du'
}, {
"char": 'デ',
rom: 'de'
}, {
"char": 'ド',
rom: 'do'
}, {
"char": 'ナ',
rom: 'na'
}, {
"char": 'ニ',
rom: 'ni'
}, {
"char": 'ヌ',
rom: 'nu'
}, {
"char": 'ネ',
rom: 'ne'
}, {
"char": 'ノ',
rom: 'no'
}, {
"char": 'ハ',
rom: 'ha'
}, {
"char": 'ヒ',
rom: 'hi'
}, {
"char": 'フ',
rom: 'fu'
}, {
"char": 'ヘ',
rom: 'he'
}, {
"char": 'ホ',
rom: 'ho'
}, {
"char": 'バ',
rom: 'ba'
}, {
"char": 'ビ',
rom: 'bi'
}, {
"char": 'ブ',
rom: 'bu'
}, {
"char": 'ベ',
rom: 'be'
}, {
"char": 'ボ',
rom: 'bo'
}, {
"char": 'パ',
rom: 'pa'
}, {
"char": 'ピ',
rom: 'pi'
}, {
"char": 'プ',
rom: 'pu'
}, {
"char": 'ペ',
rom: 'pe'
}, {
"char": 'ポ',
rom: 'po'
}, {
"char": 'マ',
rom: 'ma'
}, {
"char": 'ミ',
rom: 'mi'
}, {
"char": 'ム',
rom: 'mu'
}, {
"char": 'メ',
rom: 'me'
}, {
"char": 'モ',
rom: 'mo'
}, {
"char": 'ヤ',
rom: 'ya'
}, {
"char": 'ユ',
rom: 'yu'
}, {
"char": 'ヨ',
rom: 'yo'
}, {
"char": 'キャ',
rom: 'kya'
}, {
"char": 'キュ',
rom: 'kyu'
}, {
"char": 'キョ',
rom: 'kyo'
}, {
"char": 'シャ',
rom: 'sha'
}, {
"char": 'シュ',
rom: 'shu'
}, {
"char": 'ショ',
rom: 'sho'
}, {
"char": 'チャ',
rom: 'cha'
}, {
"char": 'チュ',
rom: 'chu'
}, {
"char": 'チョ',
rom: 'cho'
}, {
"char": 'ニャ',
rom: 'nya'
}, {
"char": 'ニュ',
rom: 'nyu'
}, {
"char": 'ニョ',
rom: 'nyo'
}, {
"char": 'ヒャ',
rom: 'hya'
}, {
"char": 'ヒュ',
rom: 'hyu'
}, {
"char": 'ヒョ',
rom: 'hyo'
}, {
"char": 'ミャ',
rom: 'mya'
}, {
"char": 'ミュ',
rom: 'myu'
}, {
"char": 'ミョ',
rom: 'myo'
}, {
"char": 'リャ',
rom: 'rya'
}, {
"char": 'リュ',
rom: 'ryu'
}, {
"char": 'リョ',
rom: 'ryo'
}, {
"char": 'ファ',
rom: 'fa'
}, {
"char": 'フィ',
rom: 'fi'
}, {
"char": 'フェ',
rom: 'fe'
}, {
"char": 'フォ',
rom: 'fo'
}, {
"char": 'ラ',
rom: 'ra'
}, {
"char": 'リ',
rom: 'ri'
}, {
"char": 'ル',
rom: 'ru'
}, {
"char": 'レ',
rom: 're'
}, {
"char": 'ロ',
rom: 'ro'
}, {
"char": 'ワ',
rom: 'wa'
}, {
"char": 'ヲ',
rom: 'wo'
}, {
"char": 'ン',
rom: 'n'
}];
// Game state
var gameState = 'menu'; // 'menu', 'learn', 'hiraganaTest', 'katakanaTest'
var currentMode = null;
var currentCharIndex = 0;
var currentQuestion = null;
var answerButtons = [];
var score = 0;
var streak = 0;
var questionsAnswered = 0;
// Load saved progress
var savedScore = storage.bestScore || 0;
var savedStreak = storage.bestStreak || 0;
// Language settings
var currentLanguage = storage.language || 'en'; // 'en' for English, 'ru' for Russian
var uiTexts = {
en: {
title: 'Japanese Character Master',
learnMode: 'Learn Mode',
hiraganaTest: 'Hiragana Test',
katakanaTest: 'Katakana Test',
backToMenu: 'Back to Menu',
nextCharacter: 'Next Character',
prevCharacter: 'Previous Character',
bestScore: 'Best Score: ',
score: 'Score: ',
streak: 'Streak: ',
language: 'Language'
},
ru: {
title: 'Мастер японских символов',
learnMode: 'Режим изучения',
hiraganaTest: 'Тест хираганы',
katakanaTest: 'Тест катаканы',
backToMenu: 'Назад в меню',
nextCharacter: 'Следующий символ',
prevCharacter: 'Предыдущий символ',
bestScore: 'Лучший результат: ',
score: 'Счёт: ',
streak: 'Серия: ',
language: 'Язык'
}
};
// UI Elements
var backgroundGradient = game.addChild(LK.getAsset('backgroundGradient', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
alpha: 0.8
}));
var backgroundPanel = game.addChild(LK.getAsset('backgroundPanel', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
alpha: 0.95
}));
var titleText = new Text2(uiTexts[currentLanguage].title, {
size: 85,
fill: 0xf1f2f6
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 400;
game.addChild(titleText);
var scoreText = new Text2(uiTexts[currentLanguage].bestScore + savedScore, {
size: 42,
fill: 0xf1f2f6
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
scoreText.y = 50;
var currentScoreText = new Text2(uiTexts[currentLanguage].score + '0', {
size: 55,
fill: 0xf1f2f6
});
currentScoreText.anchor.set(0.5, 0);
currentScoreText.x = 1024;
currentScoreText.y = 200;
game.addChild(currentScoreText);
currentScoreText.visible = false;
var streakText = new Text2(uiTexts[currentLanguage].streak + '0', {
size: 45,
fill: 0x2ed573
});
streakText.anchor.set(0.5, 0);
streakText.x = 1024;
streakText.y = 270;
game.addChild(streakText);
streakText.visible = false;
var progressBarBg = game.addChild(LK.getAsset('progressBarBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 330
}));
progressBarBg.visible = false;
var progressBar = game.addChild(LK.getAsset('progressBar', {
anchorX: 0,
anchorY: 0.5,
x: 824,
y: 330,
scaleX: 0
}));
progressBar.visible = false;
// Menu buttons
var learnButton = game.addChild(new MenuButton(uiTexts[currentLanguage].learnMode, function () {
startLearnMode();
}));
learnButton.x = 1024;
learnButton.y = 700;
var hiraganaButton = game.addChild(new MenuButton(uiTexts[currentLanguage].hiraganaTest, function () {
startHiraganaTest();
}));
hiraganaButton.x = 1024;
hiraganaButton.y = 850;
var katakanaButton = game.addChild(new MenuButton(uiTexts[currentLanguage].katakanaTest, function () {
startKatakanaTest();
}));
katakanaButton.x = 1024;
katakanaButton.y = 1000;
var languageButton = game.addChild(new MenuButton(uiTexts[currentLanguage].language + ': ' + (currentLanguage === 'en' ? 'English' : 'Русский'), function () {
toggleLanguage();
}));
languageButton.x = 1024;
languageButton.y = 1150;
var backButton = game.addChild(new MenuButton(uiTexts[currentLanguage].backToMenu, function () {
returnToMenu();
}));
backButton.x = 1024;
backButton.y = 2200;
backButton.visible = false;
var nextButton = game.addChild(new MenuButton(uiTexts[currentLanguage].nextCharacter, function () {
showNextCharacter();
}));
nextButton.x = 1024;
nextButton.y = 1800;
nextButton.visible = false;
var prevButton = game.addChild(new MenuButton(uiTexts[currentLanguage].prevCharacter, function () {
showPrevCharacter();
}));
prevButton.x = 1024;
prevButton.y = 1950;
prevButton.visible = false;
// Character display for learn mode
var characterDisplay = null;
// Question character display for tests
var questionCharBg = game.addChild(LK.getAsset('characterCard', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 600
}));
questionCharBg.visible = false;
var questionCharText = new Text2('', {
size: 180,
fill: 0x2f3542
});
questionCharText.anchor.set(0.5, 0.5);
questionCharText.x = 1024;
questionCharText.y = 600;
game.addChild(questionCharText);
questionCharText.visible = false;
function hideMenuElements() {
titleText.visible = false;
learnButton.visible = false;
hiraganaButton.visible = false;
katakanaButton.visible = false;
languageButton.visible = false;
}
function showMenuElements() {
titleText.visible = true;
learnButton.visible = true;
hiraganaButton.visible = true;
katakanaButton.visible = true;
languageButton.visible = true;
backButton.visible = false;
nextButton.visible = false;
prevButton.visible = false;
currentScoreText.visible = false;
streakText.visible = false;
questionCharText.visible = false;
questionCharBg.visible = false;
progressBar.visible = false;
progressBarBg.visible = false;
if (characterDisplay) {
characterDisplay.visible = false;
}
for (var i = 0; i < answerButtons.length; i++) {
answerButtons[i].visible = false;
}
}
function startLearnMode() {
gameState = 'learn';
currentMode = hiraganaChars;
currentCharIndex = 0;
hideMenuElements();
backButton.visible = true;
nextButton.visible = true;
prevButton.visible = true;
showCurrentCharacter();
}
function startHiraganaTest() {
gameState = 'hiraganaTest';
currentMode = hiraganaChars;
score = 0;
streak = 0;
questionsAnswered = 0;
hideMenuElements();
backButton.visible = true;
currentScoreText.visible = true;
streakText.visible = true;
questionCharText.visible = true;
questionCharBg.visible = true;
progressBar.visible = true;
progressBarBg.visible = true;
updateScoreDisplay();
generateQuestion();
}
function startKatakanaTest() {
gameState = 'katakanaTest';
currentMode = katakanaChars;
score = 0;
streak = 0;
questionsAnswered = 0;
hideMenuElements();
backButton.visible = true;
currentScoreText.visible = true;
streakText.visible = true;
questionCharText.visible = true;
questionCharBg.visible = true;
progressBar.visible = true;
progressBarBg.visible = true;
updateScoreDisplay();
generateQuestion();
}
function returnToMenu() {
gameState = 'menu';
showMenuElements();
}
function showCurrentCharacter() {
if (characterDisplay) {
game.removeChild(characterDisplay);
}
var _char = currentMode[currentCharIndex];
characterDisplay = game.addChild(new CharacterDisplay(_char["char"], _char.rom));
characterDisplay.x = 1024;
characterDisplay.y = 1000;
}
function showNextCharacter() {
currentCharIndex = (currentCharIndex + 1) % currentMode.length;
showCurrentCharacter();
}
function showPrevCharacter() {
currentCharIndex = (currentCharIndex - 1 + currentMode.length) % currentMode.length;
showCurrentCharacter();
}
function generateQuestion() {
// Clear previous answer buttons
for (var i = 0; i < answerButtons.length; i++) {
game.removeChild(answerButtons[i]);
}
answerButtons = [];
// Pick random character
var randomIndex = Math.floor(Math.random() * currentMode.length);
currentQuestion = currentMode[randomIndex];
questionCharText.setText(currentQuestion["char"]);
// Generate wrong answers
var wrongAnswers = [];
while (wrongAnswers.length < 3) {
var wrongIndex = Math.floor(Math.random() * currentMode.length);
var wrongAnswer = currentMode[wrongIndex].rom;
if (wrongAnswer !== currentQuestion.rom && wrongAnswers.indexOf(wrongAnswer) === -1) {
wrongAnswers.push(wrongAnswer);
}
}
// Create answer options
var allAnswers = [currentQuestion.rom].concat(wrongAnswers);
// Shuffle answers
for (var i = allAnswers.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = allAnswers[i];
allAnswers[i] = allAnswers[j];
allAnswers[j] = temp;
}
// Create answer buttons
var buttonPositions = [{
x: 512,
y: 1000
}, {
x: 1536,
y: 1000
}, {
x: 512,
y: 1150
}, {
x: 1536,
y: 1150
}];
for (var i = 0; i < 4; i++) {
var isCorrect = allAnswers[i] === currentQuestion.rom;
var button = game.addChild(new AnswerButton(allAnswers[i], isCorrect, onAnswerSelected));
button.x = buttonPositions[i].x;
button.y = buttonPositions[i].y;
answerButtons.push(button);
}
}
function onAnswerSelected(isCorrect) {
questionsAnswered++;
if (isCorrect) {
score++;
streak++;
LK.getSound('correct').play();
// Show correct feedback
var feedback = game.addChild(LK.getAsset('correctFeedback', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 800,
alpha: 0
}));
tween(feedback, {
alpha: 1
}, {
duration: 200,
onFinish: function onFinish() {
tween(feedback, {
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
game.removeChild(feedback);
}
});
}
});
} else {
streak = 0;
LK.getSound('incorrect').play();
// Show incorrect feedback
var feedback = game.addChild(LK.getAsset('incorrectFeedback', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 800,
alpha: 0
}));
tween(feedback, {
alpha: 1
}, {
duration: 200,
onFinish: function onFinish() {
tween(feedback, {
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
game.removeChild(feedback);
}
});
}
});
}
updateScoreDisplay();
// Save best scores
if (score > savedScore) {
savedScore = score;
storage.bestScore = savedScore;
scoreText.setText(uiTexts[currentLanguage].bestScore + savedScore);
}
if (streak > savedStreak) {
savedStreak = streak;
storage.bestStreak = savedStreak;
}
// Generate next question after delay
LK.setTimeout(function () {
generateQuestion();
}, 800);
}
function toggleLanguage() {
currentLanguage = currentLanguage === 'en' ? 'ru' : 'en';
storage.language = currentLanguage;
updateAllTexts();
}
function updateAllTexts() {
titleText.setText(uiTexts[currentLanguage].title);
scoreText.setText(uiTexts[currentLanguage].bestScore + savedScore);
currentScoreText.setText(uiTexts[currentLanguage].score + score);
streakText.setText(uiTexts[currentLanguage].streak + streak);
// Update button texts by recreating them
game.removeChild(learnButton);
game.removeChild(hiraganaButton);
game.removeChild(katakanaButton);
game.removeChild(languageButton);
game.removeChild(backButton);
game.removeChild(nextButton);
game.removeChild(prevButton);
learnButton = game.addChild(new MenuButton(uiTexts[currentLanguage].learnMode, function () {
startLearnMode();
}));
learnButton.x = 1024;
learnButton.y = 700;
hiraganaButton = game.addChild(new MenuButton(uiTexts[currentLanguage].hiraganaTest, function () {
startHiraganaTest();
}));
hiraganaButton.x = 1024;
hiraganaButton.y = 850;
katakanaButton = game.addChild(new MenuButton(uiTexts[currentLanguage].katakanaTest, function () {
startKatakanaTest();
}));
katakanaButton.x = 1024;
katakanaButton.y = 1000;
languageButton = game.addChild(new MenuButton(uiTexts[currentLanguage].language + ': ' + (currentLanguage === 'en' ? 'English' : 'Русский'), function () {
toggleLanguage();
}));
languageButton.x = 1024;
languageButton.y = 1150;
backButton = game.addChild(new MenuButton(uiTexts[currentLanguage].backToMenu, function () {
returnToMenu();
}));
backButton.x = 1024;
backButton.y = 2200;
backButton.visible = false;
nextButton = game.addChild(new MenuButton(uiTexts[currentLanguage].nextCharacter, function () {
showNextCharacter();
}));
nextButton.x = 1024;
nextButton.y = 1800;
nextButton.visible = false;
prevButton = game.addChild(new MenuButton(uiTexts[currentLanguage].prevCharacter, function () {
showPrevCharacter();
}));
prevButton.x = 1024;
prevButton.y = 1950;
prevButton.visible = false;
// Update visibility based on current state
if (gameState === 'menu') {
showMenuElements();
} else {
hideMenuElements();
backButton.visible = true;
if (gameState === 'learn') {
nextButton.visible = true;
prevButton.visible = true;
} else {
currentScoreText.visible = true;
streakText.visible = true;
questionCharText.visible = true;
questionCharBg.visible = true;
progressBar.visible = true;
progressBarBg.visible = true;
}
}
}
function updateScoreDisplay() {
currentScoreText.setText(uiTexts[currentLanguage].score + score);
streakText.setText(uiTexts[currentLanguage].streak + streak);
var progress = Math.min(questionsAnswered / 20, 1);
tween(progressBar, {
scaleX: progress
}, {
duration: 300
});
}
// Game update loop
game.update = function () {
// Game loop logic if needed
};