/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var BackspaceKey = Container.expand(function () { var self = Container.call(this); var keyGraphic = self.attachAsset('backspaceKey', { anchorX: 0.5, anchorY: 0.5 }); var keyText = new Text2('⌫', { size: 50, fill: 0x000000 }); keyText.anchor.set(0.5, 0.5); self.addChild(keyText); self.down = function (x, y, obj) { if (gameState === 'playing') { removeLetter(); LK.getSound('keyPress').play(); } }; return self; }); var KeyboardKey = Container.expand(function (letter) { var self = Container.call(this); var keyGraphic = self.attachAsset('keyboardKey', { anchorX: 0.5, anchorY: 0.5 }); var keyText = new Text2(letter, { size: 50, fill: 0x000000 }); keyText.anchor.set(0.5, 0.5); self.addChild(keyText); self.letter = letter; self.state = 'normal'; self.setState = function (state) { self.state = state; self.removeChild(keyGraphic); switch (state) { case 'correct': keyGraphic = self.attachAsset('correctKey', { anchorX: 0.5, anchorY: 0.5 }); if (keyText && keyText.style) { keyText.style.fill = "#ffffff"; } break; case 'wrongPosition': keyGraphic = self.attachAsset('wrongPositionKey', { anchorX: 0.5, anchorY: 0.5 }); if (keyText && keyText.style) { keyText.style.fill = "#ffffff"; } break; case 'wrong': keyGraphic = self.attachAsset('wrongKey', { anchorX: 0.5, anchorY: 0.5 }); if (keyText && keyText.style) { keyText.style.fill = "#ffffff"; } break; default: keyGraphic = self.attachAsset('keyboardKey', { anchorX: 0.5, anchorY: 0.5 }); if (keyText && keyText.style) { keyText.style.fill = "#000000"; } } self.addChildAt(keyGraphic, 0); }; self.down = function (x, y, obj) { if (gameState === 'playing') { addLetterToCurrentGuess(self.letter); LK.getSound('keyPress').play(); } }; return self; }); var LetterTile = Container.expand(function () { var self = Container.call(this); var tileGraphic = self.attachAsset('letterTile', { anchorX: 0.5, anchorY: 0.5 }); var letterText = new Text2('', { size: 100, fill: 0x000000 }); letterText.anchor.set(0.5, 0.5); self.addChild(letterText); self.letter = ''; self.state = 'empty'; // empty, filled, correct, wrongPosition, wrong self.setLetter = function (letter) { self.letter = letter; letterText.setText(letter); if (letter === '') { self.state = 'empty'; } else { self.state = 'filled'; } }; self.setState = function (state) { self.state = state; self.removeChild(tileGraphic); switch (state) { case 'correct': tileGraphic = self.attachAsset('correctTile', { anchorX: 0.5, anchorY: 0.5 }); if (letterText && letterText.style) { letterText.style.fill = "#ffffff"; } break; case 'wrongPosition': tileGraphic = self.attachAsset('wrongPositionTile', { anchorX: 0.5, anchorY: 0.5 }); if (letterText && letterText.style) { letterText.style.fill = "#ffffff"; } break; case 'wrong': tileGraphic = self.attachAsset('wrongTile', { anchorX: 0.5, anchorY: 0.5 }); if (letterText && letterText.style) { letterText.style.fill = "#ffffff"; } break; default: tileGraphic = self.attachAsset('letterTile', { anchorX: 0.5, anchorY: 0.5 }); if (letterText && letterText.style) { letterText.style.fill = "#000000"; } } self.addChildAt(tileGraphic, 0); }; return self; }); var Star = Container.expand(function () { var self = Container.call(this); // Choose random star type for variety var starTypes = ['star', 'starYellow', 'starBright', 'starSmall']; var starType = starTypes[Math.floor(Math.random() * starTypes.length)]; var starGraphic = self.attachAsset(starType, { anchorX: 0.5, anchorY: 0.5 }); // Random properties for each star self.fallSpeed = 2 + Math.random() * 3; // Simple speed between 2-5 pixels per frame // Random scale for size variety var scale = 0.8 + Math.random() * 1.2; starGraphic.scaleX = scale; starGraphic.scaleY = scale; // Set random alpha for variety starGraphic.alpha = 0.5 + Math.random() * 0.5; // Simple update method for falling self.update = function () { self.y += self.fallSpeed * 0.3; // Much slower falling speed // Reset to top when off screen if (self.y > 2732 + 50) { self.y = -50 - Math.random() * 100; self.x = Math.random() * 2048; } }; return self; }); var SubmitButton = Container.expand(function () { var self = Container.call(this); var buttonGraphic = self.attachAsset('submitButton', { anchorX: 0.5, anchorY: 0.5 }); var buttonText = new Text2('SUBMIT', { size: 38, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); self.addChild(buttonText); self.down = function (x, y, obj) { if (gameState === 'playing' && currentGuess.length === 5) { submitGuess(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x121213 }); /**** * Game Code ****/ // Create simple animated star background var stars = []; var numStars = 200; for (var i = 0; i < numStars; i++) { var star = new Star(); star.x = Math.random() * 2048; star.y = Math.random() * 2732; // Distribute evenly across screen stars.push(star); game.addChild(star); } // Game state variables var gameState = 'playing'; // playing, won, lost var currentRow = 0; var currentGuess = ''; var wordList = ['PIANO', 'TIGER', 'WORLD', 'LAUGH', 'STORM', 'LIGHT', 'DREAM', 'HAPPY', 'MUSIC', 'GAMES', 'ABOUT', 'ABOVE', 'ABUSE', 'ACTOR', 'ACUTE', 'ADMIT', 'ADOPT', 'ADULT', 'AFTER', 'AGAIN', 'AGENT', 'AGREE', 'AHEAD', 'ALARM', 'ALBUM', 'ALERT', 'ALIEN', 'ALIGN', 'ALIKE', 'ALIVE', 'ALLOW', 'ALONE', 'ALONG', 'ALTER', 'ANGEL', 'ANGER', 'ANGLE', 'ANGRY', 'APART', 'APPLE', 'APPLY', 'ARENA', 'ARGUE', 'ARISE', 'ARRAY', 'ARROW', 'ASIDE', 'ASSET', 'AVOID', 'AWAKE', 'AWARD', 'AWARE', 'BADLY', 'BAKER', 'BASIC', 'BEACH', 'BEGAN', 'BEGIN', 'BEING', 'BELOW', 'BENCH', 'BILLY', 'BIRTH', 'BLACK', 'BLAME', 'BLANK', 'BLIND', 'BLOCK', 'BLOOD', 'BOARD', 'BOAST', 'BOOST', 'BOOTH', 'BOUND', 'BRAIN', 'BRAND', 'BRAVE', 'BREAD', 'BREAK', 'BREED', 'BRIEF', 'BRING', 'BROAD', 'BROKE', 'BROWN', 'BUILD', 'BUILT', 'BUYER', 'CABLE', 'CALIF', 'CARRY', 'CATCH', 'CAUSE', 'CHAIN', 'CHAIR', 'CHAOS', 'CHARM', 'CHART', 'CHASE', 'CHEAP', 'CHECK', 'CHEST', 'CHIEF', 'CHILD', 'CHINA', 'CHOSE', 'CIVIL', 'CLAIM', 'CLASS', 'CLEAN', 'CLEAR', 'CLICK', 'CLIMB', 'CLOCK', 'CLOSE', 'CLOUD', 'COACH', 'COAST', 'COULD', 'COUNT', 'COURT', 'COVER', 'CRAFT', 'CRASH', 'CRAZY', 'CREAM', 'CRIME', 'CROSS', 'CROWD', 'CROWN', 'CRUDE', 'CURVE', 'CYCLE', 'DAILY', 'DANCE', 'DATED', 'DEALT', 'DEATH', 'DEBUT', 'DELAY', 'DEPTH', 'DOING', 'DOUBT', 'DOZEN', 'DRAFT', 'DRAMA', 'DRANK', 'DRAWN', 'DRESS', 'DRILL', 'DRINK', 'DRIVE', 'DROVE', 'DYING', 'EAGER', 'EARLY', 'EARTH', 'EIGHT', 'ELITE', 'EMPTY', 'ENEMY', 'ENJOY', 'ENTER', 'ENTRY', 'EQUAL', 'ERROR', 'EVENT', 'EVERY', 'EXACT', 'EXIST', 'EXTRA', 'FAITH', 'FALSE', 'FAULT', 'FIBER', 'FIELD', 'FIFTH', 'FIFTY', 'FIGHT', 'FINAL', 'FIRST', 'FIXED', 'FLASH', 'FLEET', 'FLOOR', 'FLUID', 'FOCUS', 'FORCE', 'FORTH', 'FORTY', 'FORUM', 'FOUND', 'FRAME', 'FRANK', 'FRAUD', 'FRESH', 'FRONT', 'FRUIT', 'FULLY', 'FUNNY', 'GIANT', 'GIVEN', 'GLASS', 'GLOBE', 'GOING', 'GRACE', 'GRADE', 'GRAND', 'GRANT', 'GRASS', 'GRAVE', 'GREAT', 'GREEN', 'GROSS', 'GROUP', 'GROWN', 'GUARD', 'GUESS', 'GUEST', 'GUIDE', 'HAPPY', 'HARRY', 'HEART', 'HEAVY', 'HENCE', 'HENRY', 'HORSE', 'HOTEL', 'HOUSE', 'HUMAN', 'HURRY', 'IMAGE', 'INDEX', 'INNER', 'INPUT', 'ISSUE', 'JAPAN', 'JIMMY', 'JOINT', 'JONES', 'JUDGE', 'KNOWN', 'LABEL', 'LARGE', 'LASER', 'LATER', 'LAUGH', 'LAYER', 'LEARN', 'LEASE', 'LEAST', 'LEAVE', 'LEGAL', 'LEVEL', 'LEWIS', 'LIGHT', 'LIMIT', 'LINKS', 'LIVES', 'LOCAL', 'LOOSE', 'LOWER', 'LUCKY', 'LUNCH', 'LYING', 'MAGIC', 'MAJOR', 'MAKER', 'MARCH', 'MARIA', 'MATCH', 'MAYBE', 'MAYOR', 'MEANT', 'MEDIA', 'METAL', 'MIGHT', 'MINOR', 'MINUS', 'MIXED', 'MODEL', 'MONEY', 'MONTH', 'MORAL', 'MOTOR', 'MOUNT', 'MOUSE', 'MOUTH', 'MOVED', 'MOVIE', 'MUSIC', 'NEEDS', 'NEVER', 'NEWLY', 'NIGHT', 'NOISE', 'NORTH', 'NOTED', 'NOVEL', 'NURSE', 'OCCUR', 'OCEAN', 'OFFER', 'OFTEN', 'ORDER', 'OTHER', 'OUGHT', 'PAINT', 'PANEL', 'PAPER', 'PARTY', 'PEACE', 'PETER', 'PHASE', 'PHONE', 'PHOTO', 'PIANO', 'PIECE', 'PILOT', 'PITCH', 'PLACE', 'PLAIN', 'PLANE', 'PLANT', 'PLATE', 'POINT', 'POUND', 'POWER', 'PRESS', 'PRICE', 'PRIDE', 'PRIME', 'PRINT', 'PRIOR', 'PRIZE', 'PROOF', 'PROUD', 'PROVE', 'QUEEN', 'QUICK', 'QUIET', 'QUITE', 'RADIO', 'RAISE', 'RANGE', 'RAPID', 'RATIO', 'REACH', 'READY', 'REALM', 'REBEL', 'REFER', 'RELAX', 'REPLY', 'RIGHT', 'RIGID', 'RIVAL', 'RIVER', 'ROBIN', 'ROGER', 'ROMAN', 'ROUGH', 'ROUND', 'ROUTE', 'ROYAL', 'RURAL', 'SCALE', 'SCENE', 'SCOPE', 'SCORE', 'SENSE', 'SERVE', 'SEVEN', 'SHALL', 'SHAPE', 'SHARE', 'SHARP', 'SHEET', 'SHELF', 'SHELL', 'SHIFT', 'SHINE', 'SHIRT', 'SHOCK', 'SHOOT', 'SHORT', 'SHOWN', 'SIDED', 'SIGHT', 'SILLY', 'SINCE', 'SIXTH', 'SIXTY', 'SIZED', 'SKILL', 'SLEEP', 'SLIDE', 'SMALL', 'SMART', 'SMILE', 'SMITH', 'SMOKE', 'SNAKE', 'SNOW', 'SOLAR', 'SOLID', 'SOLVE', 'SORRY', 'SOUND', 'SOUTH', 'SPACE', 'SPARE', 'SPEAK', 'SPEED', 'SPEND', 'SPENT', 'SPLIT', 'SPOKE', 'SPORT', 'STAFF', 'STAGE', 'STAKE', 'STAND', 'START', 'STATE', 'STEAM', 'STEEL', 'STICK', 'STILL', 'STOCK', 'STONE', 'STOOD', 'STORE', 'STORM', 'STORY', 'STRIP', 'STUCK', 'STUDY', 'STUFF', 'STYLE', 'SUGAR', 'SUITE', 'SUPER', 'SWEET', 'TABLE', 'TAKEN', 'TASTE', 'TAXES', 'TEACH', 'TEAMS', 'TEETH', 'TERRY', 'TEXAS', 'THANK', 'THEFT', 'THEIR', 'THEME', 'THERE', 'THESE', 'THICK', 'THING', 'THINK', 'THIRD', 'THOSE', 'THREE', 'THREW', 'THROW', 'THUMB', 'TIGER', 'TIGHT', 'TIMER', 'TIRED', 'TITLE', 'TODAY', 'TOPIC', 'TOTAL', 'TOUGH', 'TOWER', 'TRACK', 'TRADE', 'TRAIL', 'TRAIN', 'TREAT', 'TREND', 'TRIAL', 'TRIBE', 'TRICK', 'TRIED', 'TRIES', 'TRUCK', 'TRULY', 'TRUNK', 'TRUST', 'TRUTH', 'TRYING', 'TWICE', 'UNCLE', 'UNDUE', 'UNION', 'UNITY', 'UNTIL', 'UPPER', 'UPSET', 'URBAN', 'USAGE', 'USUAL', 'VALID', 'VALUE', 'VIDEO', 'VIRUS', 'VISIT', 'VITAL', 'VOCAL', 'VOICE', 'WASTE', 'WATCH', 'WATER', 'WHEEL', 'WHERE', 'WHICH', 'WHILE', 'WHITE', 'WHOLE', 'WHOSE', 'WOMAN', 'WOMEN', 'WORLD', 'WORRY', 'WORSE', 'WORST', 'WORTH', 'WOULD', 'WRITE', 'WRONG', 'WROTE', 'YOUNG', 'YOUTH']; var targetWord = wordList[Math.floor(Math.random() * wordList.length)]; var letterGrid = []; var keyboardKeys = {}; var keyStates = {}; // Word list for validation (simplified) var validWords = ['PIANO', 'TIGER', 'WORLD', 'LAUGH', 'STORM', 'LIGHT', 'DREAM', 'HAPPY', 'MUSIC', 'GAMES', 'ABOUT', 'ABOVE', 'ABUSE', 'ACTOR', 'ACUTE', 'ADMIT', 'ADOPT', 'ADULT', 'AFTER', 'AGAIN', 'AGENT', 'AGREE', 'AHEAD', 'ALARM', 'ALBUM', 'ALERT', 'ALIEN', 'ALIGN', 'ALIKE', 'ALIVE', 'ALLOW', 'ALONE', 'ALONG', 'ALTER', 'ANGEL', 'ANGER', 'ANGLE', 'ANGRY', 'APART', 'APPLE', 'APPLY', 'ARENA', 'ARGUE', 'ARISE', 'ARRAY', 'ARROW', 'ASIDE', 'ASSET', 'AVOID', 'AWAKE', 'AWARD', 'AWARE', 'BADLY', 'BAKER', 'BASIC', 'BEACH', 'BEGAN', 'BEGIN', 'BEING', 'BELOW', 'BENCH', 'BILLY', 'BIRTH', 'BLACK', 'BLAME', 'BLANK', 'BLIND', 'BLOCK', 'BLOOD', 'BOARD', 'BOAST', 'BOOST', 'BOOTH', 'BOUND', 'BRAIN', 'BRAND', 'BRAVE', 'BREAD', 'BREAK', 'BREED', 'BRIEF', 'BRING', 'BROAD', 'BROKE', 'BROWN', 'BUILD', 'BUILT', 'BUYER', 'CABLE', 'CALIF', 'CARRY', 'CATCH', 'CAUSE', 'CHAIN', 'CHAIR', 'CHAOS', 'CHARM', 'CHART', 'CHASE', 'CHEAP', 'CHECK', 'CHEST', 'CHIEF', 'CHILD', 'CHINA', 'CHOSE', 'CIVIL', 'CLAIM', 'CLASS', 'CLEAN', 'CLEAR', 'CLICK', 'CLIMB', 'CLOCK', 'CLOSE', 'CLOUD', 'COACH', 'COAST', 'COULD', 'COUNT', 'COURT', 'COVER', 'CRAFT', 'CRASH', 'CRAZY', 'CREAM', 'CRIME', 'CROSS', 'CROWD', 'CROWN', 'CRUDE', 'CURVE', 'CYCLE', 'DAILY', 'DANCE', 'DATED', 'DEALT', 'DEATH', 'DEBUT', 'DELAY', 'DEPTH', 'DOING', 'DOUBT', 'DOZEN', 'DRAFT', 'DRAMA', 'DRANK', 'DRAWN', 'DRESS', 'DRILL', 'DRINK', 'DRIVE', 'DROVE', 'DYING', 'EAGER', 'EARLY', 'EARTH', 'EIGHT', 'ELITE', 'EMPTY', 'ENEMY', 'ENJOY', 'ENTER', 'ENTRY', 'EQUAL', 'ERROR', 'EVENT', 'EVERY', 'EXACT', 'EXIST', 'EXTRA', 'FAITH', 'FALSE', 'FAULT', 'FIBER', 'FIELD', 'FIFTH', 'FIFTY', 'FIGHT', 'FINAL', 'FIRST', 'FIXED', 'FLASH', 'FLEET', 'FLOOR', 'FLUID', 'FOCUS', 'FORCE', 'FORTH', 'FORTY', 'FORUM', 'FOUND', 'FRAME', 'FRANK', 'FRAUD', 'FRESH', 'FRONT', 'FRUIT', 'FULLY', 'FUNNY', 'GIANT', 'GIVEN', 'GLASS', 'GLOBE', 'GOING', 'GRACE', 'GRADE', 'GRAND', 'GRANT', 'GRASS', 'GRAVE', 'GREAT', 'GREEN', 'GROSS', 'GROUP', 'GROWN', 'GUARD', 'GUESS', 'GUEST', 'GUIDE', 'HAPPY', 'HARRY', 'HEART', 'HEAVY', 'HENCE', 'HENRY', 'HORSE', 'HOTEL', 'HOUSE', 'HUMAN', 'HURRY', 'IMAGE', 'INDEX', 'INNER', 'INPUT', 'ISSUE', 'JAPAN', 'JIMMY', 'JOINT', 'JONES', 'JUDGE', 'KNOWN', 'LABEL', 'LARGE', 'LASER', 'LATER', 'LAUGH', 'LAYER', 'LEARN', 'LEASE', 'LEAST', 'LEAVE', 'LEGAL', 'LEVEL', 'LEWIS', 'LIGHT', 'LIMIT', 'LINKS', 'LIVES', 'LOCAL', 'LOOSE', 'LOWER', 'LUCKY', 'LUNCH', 'LYING', 'MAGIC', 'MAJOR', 'MAKER', 'MARCH', 'MARIA', 'MATCH', 'MAYBE', 'MAYOR', 'MEANT', 'MEDIA', 'METAL', 'MIGHT', 'MINOR', 'MINUS', 'MIXED', 'MODEL', 'MONEY', 'MONTH', 'MORAL', 'MOTOR', 'MOUNT', 'MOUSE', 'MOUTH', 'MOVED', 'MOVIE', 'MUSIC', 'NEEDS', 'NEVER', 'NEWLY', 'NIGHT', 'NOISE', 'NORTH', 'NOTED', 'NOVEL', 'NURSE', 'OCCUR', 'OCEAN', 'OFFER', 'OFTEN', 'ORDER', 'OTHER', 'OUGHT', 'PAINT', 'PANEL', 'PAPER', 'PARTY', 'PEACE', 'PETER', 'PHASE', 'PHONE', 'PHOTO', 'PIANO', 'PIECE', 'PILOT', 'PITCH', 'PLACE', 'PLAIN', 'PLANE', 'PLANT', 'PLATE', 'POINT', 'POUND', 'POWER', 'PRESS', 'PRICE', 'PRIDE', 'PRIME', 'PRINT', 'PRIOR', 'PRIZE', 'PROOF', 'PROUD', 'PROVE', 'QUEEN', 'QUICK', 'QUIET', 'QUITE', 'RADIO', 'RAISE', 'RANGE', 'RAPID', 'RATIO', 'REACH', 'READY', 'REALM', 'REBEL', 'REFER', 'RELAX', 'REPLY', 'RIGHT', 'RIGID', 'RIVAL', 'RIVER', 'ROBIN', 'ROGER', 'ROMAN', 'ROUGH', 'ROUND', 'ROUTE', 'ROYAL', 'RURAL', 'SCALE', 'SCENE', 'SCOPE', 'SCORE', 'SENSE', 'SERVE', 'SEVEN', 'SHALL', 'SHAPE', 'SHARE', 'SHARP', 'SHEET', 'SHELF', 'SHELL', 'SHIFT', 'SHINE', 'SHIRT', 'SHOCK', 'SHOOT', 'SHORT', 'SHOWN', 'SIDED', 'SIGHT', 'SILLY', 'SINCE', 'SIXTH', 'SIXTY', 'SIZED', 'SKILL', 'SLEEP', 'SLIDE', 'SMALL', 'SMART', 'SMILE', 'SMITH', 'SMOKE', 'SNAKE', 'SNOW', 'SOLAR', 'SOLID', 'SOLVE', 'SORRY', 'SOUND', 'SOUTH', 'SPACE', 'SPARE', 'SPEAK', 'SPEED', 'SPEND', 'SPENT', 'SPLIT', 'SPOKE', 'SPORT', 'STAFF', 'STAGE', 'STAKE', 'STAND', 'START', 'STATE', 'STEAM', 'STEEL', 'STICK', 'STILL', 'STOCK', 'STONE', 'STOOD', 'STORE', 'STORM', 'STORY', 'STRIP', 'STUCK', 'STUDY', 'STUFF', 'STYLE', 'SUGAR', 'SUITE', 'SUPER', 'SWEET', 'TABLE', 'TAKEN', 'TASTE', 'TAXES', 'TEACH', 'TEAMS', 'TEETH', 'TERRY', 'TEXAS', 'THANK', 'THEFT', 'THEIR', 'THEME', 'THERE', 'THESE', 'THICK', 'THING', 'THINK', 'THIRD', 'THOSE', 'THREE', 'THREW', 'THROW', 'THUMB', 'TIGER', 'TIGHT', 'TIMER', 'TIRED', 'TITLE', 'TODAY', 'TOPIC', 'TOTAL', 'TOUGH', 'TOWER', 'TRACK', 'TRADE', 'TRAIL', 'TRAIN', 'TREAT', 'TREND', 'TRIAL', 'TRIBE', 'TRICK', 'TRIED', 'TRIES', 'TRUCK', 'TRULY', 'TRUNK', 'TRUST', 'TRUTH', 'TRYING', 'TWICE', 'UNCLE', 'UNDUE', 'UNION', 'UNITY', 'UNTIL', 'UPPER', 'UPSET', 'URBAN', 'USAGE', 'USUAL', 'VALID', 'VALUE', 'VIDEO', 'VIRUS', 'VISIT', 'VITAL', 'VOCAL', 'VOICE', 'WASTE', 'WATCH', 'WATER', 'WHEEL', 'WHERE', 'WHICH', 'WHILE', 'WHITE', 'WHOLE', 'WHOSE', 'WOMAN', 'WOMEN', 'WORLD', 'WORRY', 'WORSE', 'WORST', 'WORTH', 'WOULD', 'WRITE', 'WRONG', 'WROTE', 'YOUNG', 'YOUTH', 'WORDS', 'QUEST', 'SMALL']; // Create the game grid (6 rows x 5 columns) var gridStartX = 1024; var gridStartY = 400; var tileSpacing = 220; for (var row = 0; row < 6; row++) { letterGrid[row] = []; for (var col = 0; col < 5; col++) { var tile = new LetterTile(); tile.x = gridStartX + (col - 2) * tileSpacing; tile.y = gridStartY + row * tileSpacing; letterGrid[row][col] = tile; game.addChild(tile); } } // Create keyboard layout var keyboardLayout = ['QWERTYUIOP', 'ASDFGHJKL', 'ZXCVBNM']; var keyboardStartY = 1800; var keySpacing = 140; for (var rowIdx = 0; rowIdx < keyboardLayout.length; rowIdx++) { var keyRow = keyboardLayout[rowIdx]; var rowWidth = keyRow.length * keySpacing; var startX = 1024 - rowWidth / 2 + keySpacing / 2; for (var keyIdx = 0; keyIdx < keyRow.length; keyIdx++) { var letter = keyRow[keyIdx]; var key = new KeyboardKey(letter); key.x = startX + keyIdx * keySpacing; key.y = keyboardStartY + rowIdx * 190; keyboardKeys[letter] = key; keyStates[letter] = 'normal'; game.addChild(key); } } // Create submit button (placed below keyboard) var submitButton = new SubmitButton(); submitButton.x = 924; submitButton.y = keyboardStartY + 530; game.addChild(submitButton); // Create backspace button (placed below keyboard) var backspaceButton = new BackspaceKey(); backspaceButton.x = 1124; backspaceButton.y = keyboardStartY + 530; game.addChild(backspaceButton); // Create title var titleText = new Text2('WORD QUEST', { size: 80, fill: 0x333333 }); titleText.anchor.set(0.5, 0.5); titleText.x = 1024; titleText.y = 200; game.addChild(titleText); // Create score display var scoreText = new Text2('Attempts: 0/6', { size: 40, fill: 0x666666 }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); function addLetterToCurrentGuess(letter) { if (currentGuess.length < 5) { currentGuess += letter; letterGrid[currentRow][currentGuess.length - 1].setLetter(letter); updateDisplay(); } } function removeLetter() { if (currentGuess.length > 0) { letterGrid[currentRow][currentGuess.length - 1].setLetter(''); currentGuess = currentGuess.slice(0, -1); updateDisplay(); } } function submitGuess() { if (currentGuess.length !== 5) return; // Check if word is valid (simplified check) var isValidWord = validWords.indexOf(currentGuess) !== -1; if (!isValidWord) { // Flash invalid word for (var i = 0; i < 5; i++) { LK.effects.flashObject(letterGrid[currentRow][i], 0xff0000, 500); } return; } LK.getSound('wordSubmit').play(); // Check letters and update colors var letterCounts = {}; for (var i = 0; i < targetWord.length; i++) { var letter = targetWord[i]; letterCounts[letter] = (letterCounts[letter] || 0) + 1; } var results = ['wrong', 'wrong', 'wrong', 'wrong', 'wrong']; // First pass: mark correct positions for (var i = 0; i < 5; i++) { if (currentGuess[i] === targetWord[i]) { results[i] = 'correct'; letterCounts[currentGuess[i]]--; } } // Second pass: mark wrong positions for (var i = 0; i < 5; i++) { if (results[i] !== 'correct' && letterCounts[currentGuess[i]] > 0) { results[i] = 'wrongPosition'; letterCounts[currentGuess[i]]--; } } // Capture current values before they change var guessForCallback = currentGuess; var rowForCallback = currentRow; // Update tile colors with animation delay for (var i = 0; i < 5; i++) { (function (index, state) { LK.setTimeout(function () { if (letterGrid[rowForCallback] && letterGrid[rowForCallback][index]) { letterGrid[rowForCallback][index].setState(state); } updateKeyboardKey(guessForCallback[index], state); }, index * 150); })(i, results[i]); } // Check win condition if (currentGuess === targetWord) { LK.setTimeout(function () { gameState = 'won'; LK.setScore(6 - rowForCallback); LK.getSound('correctGuess').play(); LK.showYouWin(); }, 750); return; } currentRow++; currentGuess = ''; // Check lose condition if (currentRow >= 6) { LK.setTimeout(function () { gameState = 'lost'; // Create a custom game over display that shows the correct word var gameOverContainer = new Container(); gameOverContainer.x = 1024; // Center horizontally gameOverContainer.y = 1366; // Center vertically // Game Over title var gameOverTitle = new Text2('GAME OVER!', { size: 80, fill: 0xff0000 }); gameOverTitle.anchor.set(0.5, 0.5); gameOverTitle.y = -150; gameOverContainer.addChild(gameOverTitle); // Show the correct word in large, beautiful letters var revealText = new Text2('The word was: ' + targetWord, { size: 100, fill: 0xffffff }); revealText.anchor.set(0.5, 0.5); revealText.y = -50; gameOverContainer.addChild(revealText); // Make sure the text is fully opaque (not transparent) revealText.alpha = 1.0; // Encouragement message var encourageText = new Text2('Better luck next time!', { size: 40, fill: 0xcccccc }); encourageText.anchor.set(0.5, 0.5); encourageText.y = 50; gameOverContainer.addChild(encourageText); game.addChild(gameOverContainer); // Show game over after 5 seconds to let player see the word LK.setTimeout(function () { LK.showGameOver(); }, 5000); }, 750); return; } updateDisplay(); } function updateKeyboardKey(letter, newState) { if (!keyboardKeys[letter]) return; // Check if the key exists if (keyStates[letter] === 'correct') return; // Don't downgrade from correct if (keyStates[letter] === 'wrongPosition' && newState === 'wrong') return; // Don't downgrade from wrongPosition to wrong keyStates[letter] = newState; keyboardKeys[letter].setState(newState); } function updateDisplay() { scoreText.setText('Attempts: ' + currentRow + '/6'); } updateDisplay();
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var BackspaceKey = Container.expand(function () {
var self = Container.call(this);
var keyGraphic = self.attachAsset('backspaceKey', {
anchorX: 0.5,
anchorY: 0.5
});
var keyText = new Text2('⌫', {
size: 50,
fill: 0x000000
});
keyText.anchor.set(0.5, 0.5);
self.addChild(keyText);
self.down = function (x, y, obj) {
if (gameState === 'playing') {
removeLetter();
LK.getSound('keyPress').play();
}
};
return self;
});
var KeyboardKey = Container.expand(function (letter) {
var self = Container.call(this);
var keyGraphic = self.attachAsset('keyboardKey', {
anchorX: 0.5,
anchorY: 0.5
});
var keyText = new Text2(letter, {
size: 50,
fill: 0x000000
});
keyText.anchor.set(0.5, 0.5);
self.addChild(keyText);
self.letter = letter;
self.state = 'normal';
self.setState = function (state) {
self.state = state;
self.removeChild(keyGraphic);
switch (state) {
case 'correct':
keyGraphic = self.attachAsset('correctKey', {
anchorX: 0.5,
anchorY: 0.5
});
if (keyText && keyText.style) {
keyText.style.fill = "#ffffff";
}
break;
case 'wrongPosition':
keyGraphic = self.attachAsset('wrongPositionKey', {
anchorX: 0.5,
anchorY: 0.5
});
if (keyText && keyText.style) {
keyText.style.fill = "#ffffff";
}
break;
case 'wrong':
keyGraphic = self.attachAsset('wrongKey', {
anchorX: 0.5,
anchorY: 0.5
});
if (keyText && keyText.style) {
keyText.style.fill = "#ffffff";
}
break;
default:
keyGraphic = self.attachAsset('keyboardKey', {
anchorX: 0.5,
anchorY: 0.5
});
if (keyText && keyText.style) {
keyText.style.fill = "#000000";
}
}
self.addChildAt(keyGraphic, 0);
};
self.down = function (x, y, obj) {
if (gameState === 'playing') {
addLetterToCurrentGuess(self.letter);
LK.getSound('keyPress').play();
}
};
return self;
});
var LetterTile = Container.expand(function () {
var self = Container.call(this);
var tileGraphic = self.attachAsset('letterTile', {
anchorX: 0.5,
anchorY: 0.5
});
var letterText = new Text2('', {
size: 100,
fill: 0x000000
});
letterText.anchor.set(0.5, 0.5);
self.addChild(letterText);
self.letter = '';
self.state = 'empty'; // empty, filled, correct, wrongPosition, wrong
self.setLetter = function (letter) {
self.letter = letter;
letterText.setText(letter);
if (letter === '') {
self.state = 'empty';
} else {
self.state = 'filled';
}
};
self.setState = function (state) {
self.state = state;
self.removeChild(tileGraphic);
switch (state) {
case 'correct':
tileGraphic = self.attachAsset('correctTile', {
anchorX: 0.5,
anchorY: 0.5
});
if (letterText && letterText.style) {
letterText.style.fill = "#ffffff";
}
break;
case 'wrongPosition':
tileGraphic = self.attachAsset('wrongPositionTile', {
anchorX: 0.5,
anchorY: 0.5
});
if (letterText && letterText.style) {
letterText.style.fill = "#ffffff";
}
break;
case 'wrong':
tileGraphic = self.attachAsset('wrongTile', {
anchorX: 0.5,
anchorY: 0.5
});
if (letterText && letterText.style) {
letterText.style.fill = "#ffffff";
}
break;
default:
tileGraphic = self.attachAsset('letterTile', {
anchorX: 0.5,
anchorY: 0.5
});
if (letterText && letterText.style) {
letterText.style.fill = "#000000";
}
}
self.addChildAt(tileGraphic, 0);
};
return self;
});
var Star = Container.expand(function () {
var self = Container.call(this);
// Choose random star type for variety
var starTypes = ['star', 'starYellow', 'starBright', 'starSmall'];
var starType = starTypes[Math.floor(Math.random() * starTypes.length)];
var starGraphic = self.attachAsset(starType, {
anchorX: 0.5,
anchorY: 0.5
});
// Random properties for each star
self.fallSpeed = 2 + Math.random() * 3; // Simple speed between 2-5 pixels per frame
// Random scale for size variety
var scale = 0.8 + Math.random() * 1.2;
starGraphic.scaleX = scale;
starGraphic.scaleY = scale;
// Set random alpha for variety
starGraphic.alpha = 0.5 + Math.random() * 0.5;
// Simple update method for falling
self.update = function () {
self.y += self.fallSpeed * 0.3; // Much slower falling speed
// Reset to top when off screen
if (self.y > 2732 + 50) {
self.y = -50 - Math.random() * 100;
self.x = Math.random() * 2048;
}
};
return self;
});
var SubmitButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphic = self.attachAsset('submitButton', {
anchorX: 0.5,
anchorY: 0.5
});
var buttonText = new Text2('SUBMIT', {
size: 38,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.down = function (x, y, obj) {
if (gameState === 'playing' && currentGuess.length === 5) {
submitGuess();
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x121213
});
/****
* Game Code
****/
// Create simple animated star background
var stars = [];
var numStars = 200;
for (var i = 0; i < numStars; i++) {
var star = new Star();
star.x = Math.random() * 2048;
star.y = Math.random() * 2732; // Distribute evenly across screen
stars.push(star);
game.addChild(star);
}
// Game state variables
var gameState = 'playing'; // playing, won, lost
var currentRow = 0;
var currentGuess = '';
var wordList = ['PIANO', 'TIGER', 'WORLD', 'LAUGH', 'STORM', 'LIGHT', 'DREAM', 'HAPPY', 'MUSIC', 'GAMES', 'ABOUT', 'ABOVE', 'ABUSE', 'ACTOR', 'ACUTE', 'ADMIT', 'ADOPT', 'ADULT', 'AFTER', 'AGAIN', 'AGENT', 'AGREE', 'AHEAD', 'ALARM', 'ALBUM', 'ALERT', 'ALIEN', 'ALIGN', 'ALIKE', 'ALIVE', 'ALLOW', 'ALONE', 'ALONG', 'ALTER', 'ANGEL', 'ANGER', 'ANGLE', 'ANGRY', 'APART', 'APPLE', 'APPLY', 'ARENA', 'ARGUE', 'ARISE', 'ARRAY', 'ARROW', 'ASIDE', 'ASSET', 'AVOID', 'AWAKE', 'AWARD', 'AWARE', 'BADLY', 'BAKER', 'BASIC', 'BEACH', 'BEGAN', 'BEGIN', 'BEING', 'BELOW', 'BENCH', 'BILLY', 'BIRTH', 'BLACK', 'BLAME', 'BLANK', 'BLIND', 'BLOCK', 'BLOOD', 'BOARD', 'BOAST', 'BOOST', 'BOOTH', 'BOUND', 'BRAIN', 'BRAND', 'BRAVE', 'BREAD', 'BREAK', 'BREED', 'BRIEF', 'BRING', 'BROAD', 'BROKE', 'BROWN', 'BUILD', 'BUILT', 'BUYER', 'CABLE', 'CALIF', 'CARRY', 'CATCH', 'CAUSE', 'CHAIN', 'CHAIR', 'CHAOS', 'CHARM', 'CHART', 'CHASE', 'CHEAP', 'CHECK', 'CHEST', 'CHIEF', 'CHILD', 'CHINA', 'CHOSE', 'CIVIL', 'CLAIM', 'CLASS', 'CLEAN', 'CLEAR', 'CLICK', 'CLIMB', 'CLOCK', 'CLOSE', 'CLOUD', 'COACH', 'COAST', 'COULD', 'COUNT', 'COURT', 'COVER', 'CRAFT', 'CRASH', 'CRAZY', 'CREAM', 'CRIME', 'CROSS', 'CROWD', 'CROWN', 'CRUDE', 'CURVE', 'CYCLE', 'DAILY', 'DANCE', 'DATED', 'DEALT', 'DEATH', 'DEBUT', 'DELAY', 'DEPTH', 'DOING', 'DOUBT', 'DOZEN', 'DRAFT', 'DRAMA', 'DRANK', 'DRAWN', 'DRESS', 'DRILL', 'DRINK', 'DRIVE', 'DROVE', 'DYING', 'EAGER', 'EARLY', 'EARTH', 'EIGHT', 'ELITE', 'EMPTY', 'ENEMY', 'ENJOY', 'ENTER', 'ENTRY', 'EQUAL', 'ERROR', 'EVENT', 'EVERY', 'EXACT', 'EXIST', 'EXTRA', 'FAITH', 'FALSE', 'FAULT', 'FIBER', 'FIELD', 'FIFTH', 'FIFTY', 'FIGHT', 'FINAL', 'FIRST', 'FIXED', 'FLASH', 'FLEET', 'FLOOR', 'FLUID', 'FOCUS', 'FORCE', 'FORTH', 'FORTY', 'FORUM', 'FOUND', 'FRAME', 'FRANK', 'FRAUD', 'FRESH', 'FRONT', 'FRUIT', 'FULLY', 'FUNNY', 'GIANT', 'GIVEN', 'GLASS', 'GLOBE', 'GOING', 'GRACE', 'GRADE', 'GRAND', 'GRANT', 'GRASS', 'GRAVE', 'GREAT', 'GREEN', 'GROSS', 'GROUP', 'GROWN', 'GUARD', 'GUESS', 'GUEST', 'GUIDE', 'HAPPY', 'HARRY', 'HEART', 'HEAVY', 'HENCE', 'HENRY', 'HORSE', 'HOTEL', 'HOUSE', 'HUMAN', 'HURRY', 'IMAGE', 'INDEX', 'INNER', 'INPUT', 'ISSUE', 'JAPAN', 'JIMMY', 'JOINT', 'JONES', 'JUDGE', 'KNOWN', 'LABEL', 'LARGE', 'LASER', 'LATER', 'LAUGH', 'LAYER', 'LEARN', 'LEASE', 'LEAST', 'LEAVE', 'LEGAL', 'LEVEL', 'LEWIS', 'LIGHT', 'LIMIT', 'LINKS', 'LIVES', 'LOCAL', 'LOOSE', 'LOWER', 'LUCKY', 'LUNCH', 'LYING', 'MAGIC', 'MAJOR', 'MAKER', 'MARCH', 'MARIA', 'MATCH', 'MAYBE', 'MAYOR', 'MEANT', 'MEDIA', 'METAL', 'MIGHT', 'MINOR', 'MINUS', 'MIXED', 'MODEL', 'MONEY', 'MONTH', 'MORAL', 'MOTOR', 'MOUNT', 'MOUSE', 'MOUTH', 'MOVED', 'MOVIE', 'MUSIC', 'NEEDS', 'NEVER', 'NEWLY', 'NIGHT', 'NOISE', 'NORTH', 'NOTED', 'NOVEL', 'NURSE', 'OCCUR', 'OCEAN', 'OFFER', 'OFTEN', 'ORDER', 'OTHER', 'OUGHT', 'PAINT', 'PANEL', 'PAPER', 'PARTY', 'PEACE', 'PETER', 'PHASE', 'PHONE', 'PHOTO', 'PIANO', 'PIECE', 'PILOT', 'PITCH', 'PLACE', 'PLAIN', 'PLANE', 'PLANT', 'PLATE', 'POINT', 'POUND', 'POWER', 'PRESS', 'PRICE', 'PRIDE', 'PRIME', 'PRINT', 'PRIOR', 'PRIZE', 'PROOF', 'PROUD', 'PROVE', 'QUEEN', 'QUICK', 'QUIET', 'QUITE', 'RADIO', 'RAISE', 'RANGE', 'RAPID', 'RATIO', 'REACH', 'READY', 'REALM', 'REBEL', 'REFER', 'RELAX', 'REPLY', 'RIGHT', 'RIGID', 'RIVAL', 'RIVER', 'ROBIN', 'ROGER', 'ROMAN', 'ROUGH', 'ROUND', 'ROUTE', 'ROYAL', 'RURAL', 'SCALE', 'SCENE', 'SCOPE', 'SCORE', 'SENSE', 'SERVE', 'SEVEN', 'SHALL', 'SHAPE', 'SHARE', 'SHARP', 'SHEET', 'SHELF', 'SHELL', 'SHIFT', 'SHINE', 'SHIRT', 'SHOCK', 'SHOOT', 'SHORT', 'SHOWN', 'SIDED', 'SIGHT', 'SILLY', 'SINCE', 'SIXTH', 'SIXTY', 'SIZED', 'SKILL', 'SLEEP', 'SLIDE', 'SMALL', 'SMART', 'SMILE', 'SMITH', 'SMOKE', 'SNAKE', 'SNOW', 'SOLAR', 'SOLID', 'SOLVE', 'SORRY', 'SOUND', 'SOUTH', 'SPACE', 'SPARE', 'SPEAK', 'SPEED', 'SPEND', 'SPENT', 'SPLIT', 'SPOKE', 'SPORT', 'STAFF', 'STAGE', 'STAKE', 'STAND', 'START', 'STATE', 'STEAM', 'STEEL', 'STICK', 'STILL', 'STOCK', 'STONE', 'STOOD', 'STORE', 'STORM', 'STORY', 'STRIP', 'STUCK', 'STUDY', 'STUFF', 'STYLE', 'SUGAR', 'SUITE', 'SUPER', 'SWEET', 'TABLE', 'TAKEN', 'TASTE', 'TAXES', 'TEACH', 'TEAMS', 'TEETH', 'TERRY', 'TEXAS', 'THANK', 'THEFT', 'THEIR', 'THEME', 'THERE', 'THESE', 'THICK', 'THING', 'THINK', 'THIRD', 'THOSE', 'THREE', 'THREW', 'THROW', 'THUMB', 'TIGER', 'TIGHT', 'TIMER', 'TIRED', 'TITLE', 'TODAY', 'TOPIC', 'TOTAL', 'TOUGH', 'TOWER', 'TRACK', 'TRADE', 'TRAIL', 'TRAIN', 'TREAT', 'TREND', 'TRIAL', 'TRIBE', 'TRICK', 'TRIED', 'TRIES', 'TRUCK', 'TRULY', 'TRUNK', 'TRUST', 'TRUTH', 'TRYING', 'TWICE', 'UNCLE', 'UNDUE', 'UNION', 'UNITY', 'UNTIL', 'UPPER', 'UPSET', 'URBAN', 'USAGE', 'USUAL', 'VALID', 'VALUE', 'VIDEO', 'VIRUS', 'VISIT', 'VITAL', 'VOCAL', 'VOICE', 'WASTE', 'WATCH', 'WATER', 'WHEEL', 'WHERE', 'WHICH', 'WHILE', 'WHITE', 'WHOLE', 'WHOSE', 'WOMAN', 'WOMEN', 'WORLD', 'WORRY', 'WORSE', 'WORST', 'WORTH', 'WOULD', 'WRITE', 'WRONG', 'WROTE', 'YOUNG', 'YOUTH'];
var targetWord = wordList[Math.floor(Math.random() * wordList.length)];
var letterGrid = [];
var keyboardKeys = {};
var keyStates = {};
// Word list for validation (simplified)
var validWords = ['PIANO', 'TIGER', 'WORLD', 'LAUGH', 'STORM', 'LIGHT', 'DREAM', 'HAPPY', 'MUSIC', 'GAMES', 'ABOUT', 'ABOVE', 'ABUSE', 'ACTOR', 'ACUTE', 'ADMIT', 'ADOPT', 'ADULT', 'AFTER', 'AGAIN', 'AGENT', 'AGREE', 'AHEAD', 'ALARM', 'ALBUM', 'ALERT', 'ALIEN', 'ALIGN', 'ALIKE', 'ALIVE', 'ALLOW', 'ALONE', 'ALONG', 'ALTER', 'ANGEL', 'ANGER', 'ANGLE', 'ANGRY', 'APART', 'APPLE', 'APPLY', 'ARENA', 'ARGUE', 'ARISE', 'ARRAY', 'ARROW', 'ASIDE', 'ASSET', 'AVOID', 'AWAKE', 'AWARD', 'AWARE', 'BADLY', 'BAKER', 'BASIC', 'BEACH', 'BEGAN', 'BEGIN', 'BEING', 'BELOW', 'BENCH', 'BILLY', 'BIRTH', 'BLACK', 'BLAME', 'BLANK', 'BLIND', 'BLOCK', 'BLOOD', 'BOARD', 'BOAST', 'BOOST', 'BOOTH', 'BOUND', 'BRAIN', 'BRAND', 'BRAVE', 'BREAD', 'BREAK', 'BREED', 'BRIEF', 'BRING', 'BROAD', 'BROKE', 'BROWN', 'BUILD', 'BUILT', 'BUYER', 'CABLE', 'CALIF', 'CARRY', 'CATCH', 'CAUSE', 'CHAIN', 'CHAIR', 'CHAOS', 'CHARM', 'CHART', 'CHASE', 'CHEAP', 'CHECK', 'CHEST', 'CHIEF', 'CHILD', 'CHINA', 'CHOSE', 'CIVIL', 'CLAIM', 'CLASS', 'CLEAN', 'CLEAR', 'CLICK', 'CLIMB', 'CLOCK', 'CLOSE', 'CLOUD', 'COACH', 'COAST', 'COULD', 'COUNT', 'COURT', 'COVER', 'CRAFT', 'CRASH', 'CRAZY', 'CREAM', 'CRIME', 'CROSS', 'CROWD', 'CROWN', 'CRUDE', 'CURVE', 'CYCLE', 'DAILY', 'DANCE', 'DATED', 'DEALT', 'DEATH', 'DEBUT', 'DELAY', 'DEPTH', 'DOING', 'DOUBT', 'DOZEN', 'DRAFT', 'DRAMA', 'DRANK', 'DRAWN', 'DRESS', 'DRILL', 'DRINK', 'DRIVE', 'DROVE', 'DYING', 'EAGER', 'EARLY', 'EARTH', 'EIGHT', 'ELITE', 'EMPTY', 'ENEMY', 'ENJOY', 'ENTER', 'ENTRY', 'EQUAL', 'ERROR', 'EVENT', 'EVERY', 'EXACT', 'EXIST', 'EXTRA', 'FAITH', 'FALSE', 'FAULT', 'FIBER', 'FIELD', 'FIFTH', 'FIFTY', 'FIGHT', 'FINAL', 'FIRST', 'FIXED', 'FLASH', 'FLEET', 'FLOOR', 'FLUID', 'FOCUS', 'FORCE', 'FORTH', 'FORTY', 'FORUM', 'FOUND', 'FRAME', 'FRANK', 'FRAUD', 'FRESH', 'FRONT', 'FRUIT', 'FULLY', 'FUNNY', 'GIANT', 'GIVEN', 'GLASS', 'GLOBE', 'GOING', 'GRACE', 'GRADE', 'GRAND', 'GRANT', 'GRASS', 'GRAVE', 'GREAT', 'GREEN', 'GROSS', 'GROUP', 'GROWN', 'GUARD', 'GUESS', 'GUEST', 'GUIDE', 'HAPPY', 'HARRY', 'HEART', 'HEAVY', 'HENCE', 'HENRY', 'HORSE', 'HOTEL', 'HOUSE', 'HUMAN', 'HURRY', 'IMAGE', 'INDEX', 'INNER', 'INPUT', 'ISSUE', 'JAPAN', 'JIMMY', 'JOINT', 'JONES', 'JUDGE', 'KNOWN', 'LABEL', 'LARGE', 'LASER', 'LATER', 'LAUGH', 'LAYER', 'LEARN', 'LEASE', 'LEAST', 'LEAVE', 'LEGAL', 'LEVEL', 'LEWIS', 'LIGHT', 'LIMIT', 'LINKS', 'LIVES', 'LOCAL', 'LOOSE', 'LOWER', 'LUCKY', 'LUNCH', 'LYING', 'MAGIC', 'MAJOR', 'MAKER', 'MARCH', 'MARIA', 'MATCH', 'MAYBE', 'MAYOR', 'MEANT', 'MEDIA', 'METAL', 'MIGHT', 'MINOR', 'MINUS', 'MIXED', 'MODEL', 'MONEY', 'MONTH', 'MORAL', 'MOTOR', 'MOUNT', 'MOUSE', 'MOUTH', 'MOVED', 'MOVIE', 'MUSIC', 'NEEDS', 'NEVER', 'NEWLY', 'NIGHT', 'NOISE', 'NORTH', 'NOTED', 'NOVEL', 'NURSE', 'OCCUR', 'OCEAN', 'OFFER', 'OFTEN', 'ORDER', 'OTHER', 'OUGHT', 'PAINT', 'PANEL', 'PAPER', 'PARTY', 'PEACE', 'PETER', 'PHASE', 'PHONE', 'PHOTO', 'PIANO', 'PIECE', 'PILOT', 'PITCH', 'PLACE', 'PLAIN', 'PLANE', 'PLANT', 'PLATE', 'POINT', 'POUND', 'POWER', 'PRESS', 'PRICE', 'PRIDE', 'PRIME', 'PRINT', 'PRIOR', 'PRIZE', 'PROOF', 'PROUD', 'PROVE', 'QUEEN', 'QUICK', 'QUIET', 'QUITE', 'RADIO', 'RAISE', 'RANGE', 'RAPID', 'RATIO', 'REACH', 'READY', 'REALM', 'REBEL', 'REFER', 'RELAX', 'REPLY', 'RIGHT', 'RIGID', 'RIVAL', 'RIVER', 'ROBIN', 'ROGER', 'ROMAN', 'ROUGH', 'ROUND', 'ROUTE', 'ROYAL', 'RURAL', 'SCALE', 'SCENE', 'SCOPE', 'SCORE', 'SENSE', 'SERVE', 'SEVEN', 'SHALL', 'SHAPE', 'SHARE', 'SHARP', 'SHEET', 'SHELF', 'SHELL', 'SHIFT', 'SHINE', 'SHIRT', 'SHOCK', 'SHOOT', 'SHORT', 'SHOWN', 'SIDED', 'SIGHT', 'SILLY', 'SINCE', 'SIXTH', 'SIXTY', 'SIZED', 'SKILL', 'SLEEP', 'SLIDE', 'SMALL', 'SMART', 'SMILE', 'SMITH', 'SMOKE', 'SNAKE', 'SNOW', 'SOLAR', 'SOLID', 'SOLVE', 'SORRY', 'SOUND', 'SOUTH', 'SPACE', 'SPARE', 'SPEAK', 'SPEED', 'SPEND', 'SPENT', 'SPLIT', 'SPOKE', 'SPORT', 'STAFF', 'STAGE', 'STAKE', 'STAND', 'START', 'STATE', 'STEAM', 'STEEL', 'STICK', 'STILL', 'STOCK', 'STONE', 'STOOD', 'STORE', 'STORM', 'STORY', 'STRIP', 'STUCK', 'STUDY', 'STUFF', 'STYLE', 'SUGAR', 'SUITE', 'SUPER', 'SWEET', 'TABLE', 'TAKEN', 'TASTE', 'TAXES', 'TEACH', 'TEAMS', 'TEETH', 'TERRY', 'TEXAS', 'THANK', 'THEFT', 'THEIR', 'THEME', 'THERE', 'THESE', 'THICK', 'THING', 'THINK', 'THIRD', 'THOSE', 'THREE', 'THREW', 'THROW', 'THUMB', 'TIGER', 'TIGHT', 'TIMER', 'TIRED', 'TITLE', 'TODAY', 'TOPIC', 'TOTAL', 'TOUGH', 'TOWER', 'TRACK', 'TRADE', 'TRAIL', 'TRAIN', 'TREAT', 'TREND', 'TRIAL', 'TRIBE', 'TRICK', 'TRIED', 'TRIES', 'TRUCK', 'TRULY', 'TRUNK', 'TRUST', 'TRUTH', 'TRYING', 'TWICE', 'UNCLE', 'UNDUE', 'UNION', 'UNITY', 'UNTIL', 'UPPER', 'UPSET', 'URBAN', 'USAGE', 'USUAL', 'VALID', 'VALUE', 'VIDEO', 'VIRUS', 'VISIT', 'VITAL', 'VOCAL', 'VOICE', 'WASTE', 'WATCH', 'WATER', 'WHEEL', 'WHERE', 'WHICH', 'WHILE', 'WHITE', 'WHOLE', 'WHOSE', 'WOMAN', 'WOMEN', 'WORLD', 'WORRY', 'WORSE', 'WORST', 'WORTH', 'WOULD', 'WRITE', 'WRONG', 'WROTE', 'YOUNG', 'YOUTH', 'WORDS', 'QUEST', 'SMALL'];
// Create the game grid (6 rows x 5 columns)
var gridStartX = 1024;
var gridStartY = 400;
var tileSpacing = 220;
for (var row = 0; row < 6; row++) {
letterGrid[row] = [];
for (var col = 0; col < 5; col++) {
var tile = new LetterTile();
tile.x = gridStartX + (col - 2) * tileSpacing;
tile.y = gridStartY + row * tileSpacing;
letterGrid[row][col] = tile;
game.addChild(tile);
}
}
// Create keyboard layout
var keyboardLayout = ['QWERTYUIOP', 'ASDFGHJKL', 'ZXCVBNM'];
var keyboardStartY = 1800;
var keySpacing = 140;
for (var rowIdx = 0; rowIdx < keyboardLayout.length; rowIdx++) {
var keyRow = keyboardLayout[rowIdx];
var rowWidth = keyRow.length * keySpacing;
var startX = 1024 - rowWidth / 2 + keySpacing / 2;
for (var keyIdx = 0; keyIdx < keyRow.length; keyIdx++) {
var letter = keyRow[keyIdx];
var key = new KeyboardKey(letter);
key.x = startX + keyIdx * keySpacing;
key.y = keyboardStartY + rowIdx * 190;
keyboardKeys[letter] = key;
keyStates[letter] = 'normal';
game.addChild(key);
}
}
// Create submit button (placed below keyboard)
var submitButton = new SubmitButton();
submitButton.x = 924;
submitButton.y = keyboardStartY + 530;
game.addChild(submitButton);
// Create backspace button (placed below keyboard)
var backspaceButton = new BackspaceKey();
backspaceButton.x = 1124;
backspaceButton.y = keyboardStartY + 530;
game.addChild(backspaceButton);
// Create title
var titleText = new Text2('WORD QUEST', {
size: 80,
fill: 0x333333
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 200;
game.addChild(titleText);
// Create score display
var scoreText = new Text2('Attempts: 0/6', {
size: 40,
fill: 0x666666
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
function addLetterToCurrentGuess(letter) {
if (currentGuess.length < 5) {
currentGuess += letter;
letterGrid[currentRow][currentGuess.length - 1].setLetter(letter);
updateDisplay();
}
}
function removeLetter() {
if (currentGuess.length > 0) {
letterGrid[currentRow][currentGuess.length - 1].setLetter('');
currentGuess = currentGuess.slice(0, -1);
updateDisplay();
}
}
function submitGuess() {
if (currentGuess.length !== 5) return;
// Check if word is valid (simplified check)
var isValidWord = validWords.indexOf(currentGuess) !== -1;
if (!isValidWord) {
// Flash invalid word
for (var i = 0; i < 5; i++) {
LK.effects.flashObject(letterGrid[currentRow][i], 0xff0000, 500);
}
return;
}
LK.getSound('wordSubmit').play();
// Check letters and update colors
var letterCounts = {};
for (var i = 0; i < targetWord.length; i++) {
var letter = targetWord[i];
letterCounts[letter] = (letterCounts[letter] || 0) + 1;
}
var results = ['wrong', 'wrong', 'wrong', 'wrong', 'wrong'];
// First pass: mark correct positions
for (var i = 0; i < 5; i++) {
if (currentGuess[i] === targetWord[i]) {
results[i] = 'correct';
letterCounts[currentGuess[i]]--;
}
}
// Second pass: mark wrong positions
for (var i = 0; i < 5; i++) {
if (results[i] !== 'correct' && letterCounts[currentGuess[i]] > 0) {
results[i] = 'wrongPosition';
letterCounts[currentGuess[i]]--;
}
}
// Capture current values before they change
var guessForCallback = currentGuess;
var rowForCallback = currentRow;
// Update tile colors with animation delay
for (var i = 0; i < 5; i++) {
(function (index, state) {
LK.setTimeout(function () {
if (letterGrid[rowForCallback] && letterGrid[rowForCallback][index]) {
letterGrid[rowForCallback][index].setState(state);
}
updateKeyboardKey(guessForCallback[index], state);
}, index * 150);
})(i, results[i]);
}
// Check win condition
if (currentGuess === targetWord) {
LK.setTimeout(function () {
gameState = 'won';
LK.setScore(6 - rowForCallback);
LK.getSound('correctGuess').play();
LK.showYouWin();
}, 750);
return;
}
currentRow++;
currentGuess = '';
// Check lose condition
if (currentRow >= 6) {
LK.setTimeout(function () {
gameState = 'lost';
// Create a custom game over display that shows the correct word
var gameOverContainer = new Container();
gameOverContainer.x = 1024; // Center horizontally
gameOverContainer.y = 1366; // Center vertically
// Game Over title
var gameOverTitle = new Text2('GAME OVER!', {
size: 80,
fill: 0xff0000
});
gameOverTitle.anchor.set(0.5, 0.5);
gameOverTitle.y = -150;
gameOverContainer.addChild(gameOverTitle);
// Show the correct word in large, beautiful letters
var revealText = new Text2('The word was: ' + targetWord, {
size: 100,
fill: 0xffffff
});
revealText.anchor.set(0.5, 0.5);
revealText.y = -50;
gameOverContainer.addChild(revealText);
// Make sure the text is fully opaque (not transparent)
revealText.alpha = 1.0;
// Encouragement message
var encourageText = new Text2('Better luck next time!', {
size: 40,
fill: 0xcccccc
});
encourageText.anchor.set(0.5, 0.5);
encourageText.y = 50;
gameOverContainer.addChild(encourageText);
game.addChild(gameOverContainer);
// Show game over after 5 seconds to let player see the word
LK.setTimeout(function () {
LK.showGameOver();
}, 5000);
}, 750);
return;
}
updateDisplay();
}
function updateKeyboardKey(letter, newState) {
if (!keyboardKeys[letter]) return; // Check if the key exists
if (keyStates[letter] === 'correct') return; // Don't downgrade from correct
if (keyStates[letter] === 'wrongPosition' && newState === 'wrong') return; // Don't downgrade from wrongPosition to wrong
keyStates[letter] = newState;
keyboardKeys[letter].setState(newState);
}
function updateDisplay() {
scoreText.setText('Attempts: ' + currentRow + '/6');
}
updateDisplay();