User prompt
Okay, just make them fly down slowly. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
make the stars on the background animated, gently falling down ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Make a beautiful pleasant night background with animated stars ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Make a dark background instead of a white one.
User prompt
make it so that if you don't guess the word, then it should be shown when you lose. let the word appear along with the "game over" "play again" window
User prompt
make it so that if you don't guess the word, then it should be shown when you lose.
User prompt
the submit button and the delete button are letters superimposed on each other, place them next to each other
User prompt
move the letter removal button below, and add the letter M to the keyboard.
User prompt
The letter M is still missing
User prompt
The letter m is missing from the keyboard. It should be to the right of N, and there's a letter deletion button. There is no letter M. Add the letter M to the keyboard.
User prompt
The letter "m" is missing from the keyboard.
User prompt
The letter m is missing from the keyboard.
User prompt
Please fix the bug: 'Timeout.tick error: Cannot read properties of undefined (reading '0')' in or related to this line: 'letterGrid[currentRow][index].setState(state);' Line Number: 329
User prompt
Please fix the bug: 'Timeout.tick error: Cannot read properties of undefined (reading 'setState')' in or related to this line: 'keyboardKeys[letter].setState(newState);' Line Number: 364
User prompt
Please fix the bug: 'Timeout.tick error: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'letterText.style.fill = "#ffffff";' Line Number: 134
User prompt
Add 500 words to the game that have 5 letters
User prompt
Add these ten words to the game: PIANO TIGER WORLD LAUGH STORM LIGHT DREAM HAPPY MUSIC
User prompt
put the delete button at the bottom
User prompt
make sure that the letters can be deleted
Code edit (1 edits merged)
Please save this source code
User prompt
Word Quest
Initial prompt
creating a wordle game
/**** * 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();