User prompt
klavye tuşlarını iyice küçült
User prompt
bir kere oyun bitince tekrar başlayamıyoruz
User prompt
Please fix the bug: 'Error: Invalid value. Only literals or 1-level deep objects/arrays containing literals are allowed.' in or related to this line: 'storage.leaderboard = leaderboard;' Line Number: 1805 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
klavye tuşlarını küçült
User prompt
klavye tuşları birbirine girmiş düzelt
User prompt
kullanıcı ismi girme yeri sadece random olmasın klavye ile kendimizde girebilelim ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
kullanıcı ismi girme kısmını düzelt ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
her kullanıcıya oyunu acınca kullanıcı ismi sor ve bir liderlik tablosu ekle ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
level 9 a güzel bir şekil yap
User prompt
level 8 i açınca oyun donuyor bunu düzelt
User prompt
level 8 deki tuğlalarla güzel bir aslan şekli oluştur
User prompt
levellerdeki tuğla çeşitliliğini ve sayisini arttır
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Ball = Container.expand(function (theme) { var self = Container.call(this); theme = theme || currentTheme; var ballAsset = themeAssets[theme].ball; var ballGraphics = self.attachAsset(ballAsset, { anchorX: 0.5, anchorY: 0.5 }); self.velocityX = 0; self.velocityY = 0; self.speed = 12; // Reduced speed for slower gameplay self.update = function () { if (self.destroyed) return; self.x += self.velocityX; self.y += self.velocityY; // Wall collision detection if (self.x <= 10 || self.x >= 2038) { self.velocityX = -self.velocityX; self.x = Math.max(10, Math.min(2038, self.x)); LK.getSound('wallHit').play(); } if (self.y <= 10) { self.velocityY = -self.velocityY; self.y = Math.max(10, self.y); LK.getSound('wallHit').play(); } }; self.destroyed = false; self.destroy = function () { if (!self.destroyed) { self.destroyed = true; if (self.parent) { self.parent.removeChild(self); } } }; return self; }); var Brick = Container.expand(function (brickType, theme) { var self = Container.call(this); theme = theme || currentTheme; var brickAsset; if (theme === 'classic') { brickAsset = 'brick' + (brickType || 1); } else { brickAsset = themeAssets[theme].brick; } var brickGraphics = self.attachAsset(brickAsset, { anchorX: 0.5, anchorY: 0.5 }); if (theme !== 'classic' && brickType) { var colors = [0xff0080, 0x00ff80, 0x8000ff, 0xffff00, 0xff8000]; brickGraphics.tint = colors[(brickType - 1) % colors.length]; } self.destroyed = false; self.destroy = function () { if (!self.destroyed) { self.destroyed = true; LK.effects.flashObject(self, 0xffffff, 200); tween(self, { alpha: 0, scaleX: 1.5, scaleY: 1.5 }, { duration: 200, onFinish: function onFinish() { if (self.parent) { self.parent.removeChild(self); } } }); LK.getSound('brickHit').play(); LK.setScore(LK.getScore() + 10); // 20% chance to drop a powerup if (Math.random() < 0.2) { var powerupTypes = ['speed', 'expand', 'multiball']; var randomType = powerupTypes[Math.floor(Math.random() * powerupTypes.length)]; var powerup = new PowerUp(randomType); powerup.x = self.x; powerup.y = self.y; powerups.push(powerup); game.addChild(powerup); } return true; } return false; }; return self; }); var Laser = Container.expand(function () { var self = Container.call(this); var laserGraphics = self.attachAsset('paddle', { anchorX: 0.5, anchorY: 0.5 }); laserGraphics.tint = 0xff0000; laserGraphics.width = 8; laserGraphics.height = 600; laserGraphics.alpha = 1.0; self.speed = 25; self.destroyed = false; self.update = function () { if (self.destroyed) return; self.y -= self.speed; // Remove if off screen if (self.y < -200) { self.destroy(); } }; self.destroy = function () { if (!self.destroyed) { self.destroyed = true; if (self.parent) { self.parent.removeChild(self); } } }; return self; }); var MenuButton = Container.expand(function (text, action) { var self = Container.call(this); self.buttonGraphics = self.attachAsset('menuButton', { anchorX: 0.5, anchorY: 0.5 }); self.buttonText = new Text2(text, { size: 39, fill: 0xffffff }); self.buttonText.anchor.set(0.5, 0.5); self.addChild(self.buttonText); self.action = action; self.isHovered = false; self.down = function (x, y, obj) { LK.getSound('menuSelect').play(); if (self.action) { self.action(); } }; self.move = function (x, y, obj) { if (!self.isHovered) { self.isHovered = true; var currentScaleX = self.buttonGraphics.scaleX || 1; var currentScaleY = self.buttonGraphics.scaleY || 1; self.removeChild(self.buttonGraphics); self.buttonGraphics = self.attachAsset('menuButtonHover', { anchorX: 0.5, anchorY: 0.5 }); self.buttonGraphics.scaleX = currentScaleX; self.buttonGraphics.scaleY = currentScaleY; self.addChildAt(self.buttonGraphics, 0); tween(self, { scaleX: 1.1, scaleY: 1.1 }, { duration: 200 }); } }; return self; }); var Paddle = Container.expand(function (theme) { var self = Container.call(this); theme = theme || currentTheme; var paddleAsset = themeAssets[theme].paddle; var paddleGraphics = self.attachAsset(paddleAsset, { anchorX: 0.5, anchorY: 0.5 }); return self; }); var PowerUp = Container.expand(function (type) { var self = Container.call(this); self.type = type || 'speed'; var colors = { speed: 0xff4444, expand: 0x44ff44, multiball: 0x4444ff }; var powerupGraphics = self.attachAsset('ball', { anchorX: 0.5, anchorY: 0.5 }); powerupGraphics.tint = colors[self.type]; powerupGraphics.width = 30; powerupGraphics.height = 30; self.velocityY = 3; self.collected = false; self.update = function () { self.y += self.velocityY; // Remove if off screen if (self.y > 2800) { if (self.parent) { self.parent.removeChild(self); } } // Check collection by paddle if (!self.collected && self.intersects(paddle)) { self.collected = true; self.applyEffect(); if (self.parent) { self.parent.removeChild(self); } } }; self.applyEffect = function () { switch (self.type) { case 'speed': // Speed powerup now just creates visual effect without changing speed createEdgeGlow(0xff4444); break; case 'expand': tween(paddle, { scaleX: 1.5 }, { duration: 500 }); LK.setTimeout(function () { tween(paddle, { scaleX: 1 }, { duration: 500 }); }, 10000); createEdgeGlow(0x44ff44); break; case 'multiball': // Create two additional balls for (var i = 0; i < 2; i++) { var newBall = game.addChild(new Ball()); newBall.x = ball.x + (i - 0.5) * 50; newBall.y = ball.y; newBall.velocityX = ball.velocityX + (i - 0.5) * 4; newBall.velocityY = ball.velocityY; newBall.speed = ball.speed; extraBalls.push(newBall); } createEdgeGlow(0x4444ff); break; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x0a0a0a }); /**** * Game Code ****/ var paddle; var ball; var bricks = []; var powerups = []; var extraBalls = []; var gameStarted = false; var dragNode = null; var gameState = 'menu'; // 'menu', 'playing', 'levelSelect' var currentLevel = 1; var gameMode = 'classic'; // 'classic', 'endless', 'timeAttack', 'zen', 'gravity', 'reverse', 'laser' var currentTheme = 'classic'; // 'classic', 'dark', 'neon', 'gold', 'ice', 'fire' var zenModeActive = false; var gravityModeActive = false; var reverseModeActive = false; var laserModeActive = false; var laserBeams = []; var laserCooldown = 0; var gravityDirection = 1; // 1 for down, -1 for up var themeAssets = { classic: { brick: 'brick', paddle: 'paddle', ball: 'ball' }, dark: { brick: 'darkBrick', paddle: 'darkPaddle', ball: 'darkBall' }, neon: { brick: 'neonBrick', paddle: 'neonPaddle', ball: 'neonBall' }, gold: { brick: 'goldBrick', paddle: 'goldPaddle', ball: 'goldBall' }, ice: { brick: 'iceBrick', paddle: 'icePaddle', ball: 'iceBall' }, fire: { brick: 'fireBrick', paddle: 'firePaddle', ball: 'fireBall' }, space: { brick: 'darkBrick', paddle: 'darkPaddle', ball: 'neonBall' }, galaxy: { brick: 'neonBrick', paddle: 'goldPaddle', ball: 'fireBall' } }; var themeBackgrounds = { classic: 0x0a0a0a, dark: 0x2c2c54, neon: 0x0f3460, gold: 0x2c1810, ice: 0x1e3a5f, fire: 0x2a0a0a, space: 'spaceBackground', galaxy: 'galaxyBackground' }; var menuContainer; var levelSelectContainer; var playerNameContainer; var leaderboardContainer; var highScore = storage.highScore || 0; var playerName = storage.playerName || ''; // Reconstruct leaderboard from flattened storage data var leaderboard = []; var storedNames = storage.leaderboardNames || []; var storedScores = storage.leaderboardScores || []; for (var i = 0; i < storedNames.length && i < storedScores.length; i++) { leaderboard.push({ name: storedNames[i], score: storedScores[i] }); } var nameInputActive = false; // Create edge glow effect function createEdgeGlow(color) { // Create glow shapes for each edge var glowShapes = []; // Top edge var topGlow = LK.getAsset('paddle', { anchorX: 0, anchorY: 0, scaleX: 20.5, scaleY: 0.3 }); topGlow.tint = color; topGlow.x = 0; topGlow.y = 0; topGlow.alpha = 0.8; game.addChild(topGlow); glowShapes.push(topGlow); // Bottom edge var bottomGlow = LK.getAsset('paddle', { anchorX: 0, anchorY: 0, scaleX: 20.5, scaleY: 0.3 }); bottomGlow.tint = color; bottomGlow.x = 0; bottomGlow.y = 2720; bottomGlow.alpha = 0.8; game.addChild(bottomGlow); glowShapes.push(bottomGlow); // Left edge var leftGlow = LK.getAsset('paddle', { anchorX: 0, anchorY: 0, scaleX: 0.5, scaleY: 27.3 }); leftGlow.tint = color; leftGlow.x = 0; leftGlow.y = 0; leftGlow.alpha = 0.8; game.addChild(leftGlow); glowShapes.push(leftGlow); // Right edge var rightGlow = LK.getAsset('paddle', { anchorX: 0, anchorY: 0, scaleX: 0.5, scaleY: 27.3 }); rightGlow.tint = color; rightGlow.x = 2038; rightGlow.y = 0; rightGlow.alpha = 0.8; game.addChild(rightGlow); glowShapes.push(rightGlow); // Animate all glow shapes for (var i = 0; i < glowShapes.length; i++) { tween(glowShapes[i], { alpha: 0 }, { duration: 300, onFinish: function () { if (this.parent) { this.parent.removeChild(this); } }.bind(glowShapes[i]) }); } } // Create score display var scoreTxt = new Text2('0', { size: 60, fill: 0x00FFFF }); scoreTxt.setText(LK.getScore()); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Ask for player name if not set function askPlayerName() { // Always load from storage first playerName = storage.playerName || ''; if (playerName === '' || playerName.length < 2) { showNameInput(); } else { createMainMenu(); } } // Show name input screen with virtual keyboard function showNameInput() { nameInputActive = true; playerNameContainer = game.addChild(new Container()); // Name input background var nameBg = playerNameContainer.attachAsset('menuBackground', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.2, scaleY: 2.8 }); nameBg.alpha = 0.9; playerNameContainer.x = 1024; playerNameContainer.y = 1366; // Title var nameTitle = new Text2('Enter Your Name', { size: 60, fill: 0x00ffff }); nameTitle.anchor.set(0.5, 0.5); nameTitle.y = -450; playerNameContainer.addChild(nameTitle); // Current name from storage or default var currentName = storage.playerName || ''; if (currentName === '') { currentName = 'Player'; } // Name display with cursor var nameDisplay = new Text2(currentName + '|', { size: 45, fill: 0xffffff }); nameDisplay.anchor.set(0.5, 0.5); nameDisplay.y = -350; playerNameContainer.addChild(nameDisplay); // Virtual keyboard layout with better spacing var keyboardRows = [['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P'], ['A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L'], ['Z', 'X', 'C', 'V', 'B', 'N', 'M']]; var keyboardContainer = playerNameContainer.addChild(new Container()); keyboardContainer.y = -200; // Number row first var numbers = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']; for (var i = 0; i < numbers.length; i++) { var num = numbers[i]; var numButton = keyboardContainer.addChild(new MenuButton(num, function (digit) { return function () { if (currentName.length < 12) { currentName += digit; nameDisplay.setText(currentName + '|'); } }; }(num))); numButton.x = (i - 4.5) * 70; numButton.y = -90; numButton.buttonGraphics.scaleX = 0.28; numButton.buttonGraphics.scaleY = 0.35; numButton.buttonText.size = 18; } // Create keyboard buttons with improved spacing for (var row = 0; row < keyboardRows.length; row++) { for (var col = 0; col < keyboardRows[row].length; col++) { var letter = keyboardRows[row][col]; var keyButton = keyboardContainer.addChild(new MenuButton(letter, function (_char) { return function () { if (currentName.length < 12) { currentName += _char; nameDisplay.setText(currentName + '|'); } }; }(letter))); // Better spacing calculation to prevent overlap var buttonSpacing = 70; var rowOffset = row === 1 ? 20 : row === 2 ? 40 : 0; // Offset for QWERTY layout keyButton.x = (col - keyboardRows[row].length / 2 + 0.5) * buttonSpacing + rowOffset; keyButton.y = row * 60 + 20; keyButton.buttonGraphics.scaleX = 0.28; keyButton.buttonGraphics.scaleY = 0.35; keyButton.buttonText.size = 18; } } // Special buttons with better positioning // Space button var spaceButton = keyboardContainer.addChild(new MenuButton('SPACE', function () { if (currentName.length < 12 && currentName.length > 0) { currentName += ' '; nameDisplay.setText(currentName + '|'); } })); spaceButton.x = 0; spaceButton.y = 220; spaceButton.buttonGraphics.scaleX = 0.5; spaceButton.buttonGraphics.scaleY = 0.35; spaceButton.buttonText.size = 16; // Backspace button var backspaceButton = keyboardContainer.addChild(new MenuButton('DEL', function () { if (currentName.length > 0) { currentName = currentName.slice(0, -1); nameDisplay.setText(currentName + '|'); } })); backspaceButton.x = -220; backspaceButton.y = 220; backspaceButton.buttonGraphics.scaleX = 0.4; backspaceButton.buttonGraphics.scaleY = 0.35; backspaceButton.buttonText.size = 16; // Clear button var clearButton = keyboardContainer.addChild(new MenuButton('CLEAR', function () { currentName = ''; nameDisplay.setText(currentName + '|'); })); clearButton.x = 220; clearButton.y = 220; clearButton.buttonGraphics.scaleX = 0.4; clearButton.buttonGraphics.scaleY = 0.35; clearButton.buttonText.size = 16; // Random name button var randomButton = playerNameContainer.addChild(new MenuButton('RANDOM', function () { var randomNames = ['Hero', 'Champion', 'Master', 'Legend', 'Pro', 'Star', 'Ace', 'Gamer', 'Player', 'Winner']; currentName = randomNames[Math.floor(Math.random() * randomNames.length)] + Math.floor(Math.random() * 1000); nameDisplay.setText(currentName + '|'); })); randomButton.x = -180; randomButton.y = 320; randomButton.buttonGraphics.scaleX = 0.5; randomButton.buttonGraphics.scaleY = 0.45; randomButton.buttonText.size = 16; // Confirm button var confirmButton = playerNameContainer.addChild(new MenuButton('CONFIRM', function () { if (currentName.trim().length >= 2) { playerName = currentName.trim(); storage.playerName = playerName; hideNameInput(); createMainMenu(); } else { // Flash the name display if name is too short LK.effects.flashObject(nameDisplay, 0xff0000, 500); } })); confirmButton.y = 320; confirmButton.buttonGraphics.scaleX = 0.7; confirmButton.buttonGraphics.scaleY = 0.45; confirmButton.buttonText.size = 16; // Cancel button (keep existing name) var cancelButton = playerNameContainer.addChild(new MenuButton('CANCEL', function () { hideNameInput(); createMainMenu(); })); cancelButton.x = 180; cancelButton.y = 320; cancelButton.buttonGraphics.scaleX = 0.5; cancelButton.buttonGraphics.scaleY = 0.45; cancelButton.buttonText.size = 16; // Animate entrance playerNameContainer.alpha = 0; tween(playerNameContainer, { alpha: 1 }, { duration: 500 }); } function hideNameInput() { if (playerNameContainer) { nameInputActive = false; tween(playerNameContainer, { alpha: 0 }, { duration: 300, onFinish: function onFinish() { if (playerNameContainer.parent) { playerNameContainer.parent.removeChild(playerNameContainer); } playerNameContainer = null; } }); } } // Create main menu function createMainMenu() { menuContainer = game.addChild(new Container()); // Menu background var menuBg = menuContainer.attachAsset('menuBackground', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.4, scaleY: 1.4 }); menuBg.alpha = 0.9; menuContainer.x = 1024; menuContainer.y = 1366; // Game title var titleText = new Text2('BRICK BREAKER', { size: 67, fill: 0x00ffff }); titleText.anchor.set(0.5, 0.5); titleText.y = -250; menuContainer.addChild(titleText); // High score display var highScoreText = new Text2('High Score: ' + highScore, { size: 34, fill: 0xffff00 }); highScoreText.anchor.set(0.5, 0.5); highScoreText.y = -180; menuContainer.addChild(highScoreText); // Menu buttons var classicButton = menuContainer.addChild(new MenuButton('Classic Mode', function () { gameMode = 'classic'; startClassicGame(); })); classicButton.y = -60; classicButton.buttonGraphics.scaleX = 1.2; classicButton.buttonGraphics.scaleY = 1.2; classicButton.buttonText.size = 36; var endlessButton = menuContainer.addChild(new MenuButton('Endless Mode', function () { gameMode = 'endless'; startEndlessGame(); })); endlessButton.y = 10; endlessButton.buttonGraphics.scaleX = 1.2; endlessButton.buttonGraphics.scaleY = 1.2; endlessButton.buttonText.size = 36; var timeAttackButton = menuContainer.addChild(new MenuButton('Time Attack', function () { gameMode = 'timeAttack'; startTimeAttackGame(); })); timeAttackButton.y = 80; timeAttackButton.buttonGraphics.scaleX = 1.2; timeAttackButton.buttonGraphics.scaleY = 1.2; timeAttackButton.buttonText.size = 36; var zenButton = menuContainer.addChild(new MenuButton('Zen Mode', function () { gameMode = 'zen'; startZenGame(); })); zenButton.y = 150; zenButton.buttonGraphics.scaleX = 1.2; zenButton.buttonGraphics.scaleY = 1.2; zenButton.buttonText.size = 36; var gravityButton = menuContainer.addChild(new MenuButton('Gravity Mode', function () { gameMode = 'gravity'; startGravityGame(); })); gravityButton.y = 220; gravityButton.buttonGraphics.scaleX = 1.2; gravityButton.buttonGraphics.scaleY = 1.2; gravityButton.buttonText.size = 36; var reverseButton = menuContainer.addChild(new MenuButton('Reverse Mode', function () { gameMode = 'reverse'; startReverseGame(); })); reverseButton.y = 290; reverseButton.buttonGraphics.scaleX = 1.2; reverseButton.buttonGraphics.scaleY = 1.2; reverseButton.buttonText.size = 36; var laserButton = menuContainer.addChild(new MenuButton('Laser Mode', function () { gameMode = 'laser'; startLaserGame(); })); laserButton.y = 360; laserButton.buttonGraphics.scaleX = 1.2; laserButton.buttonGraphics.scaleY = 1.2; laserButton.buttonText.size = 36; var themeButton = menuContainer.addChild(new MenuButton('Themes', function () { showThemeSelect(); })); themeButton.y = 430; themeButton.buttonGraphics.scaleX = 1.2; themeButton.buttonGraphics.scaleY = 1.2; themeButton.buttonText.size = 36; var levelSelectButton = menuContainer.addChild(new MenuButton('Level Select', function () { showLevelSelect(); })); levelSelectButton.y = 500; levelSelectButton.buttonGraphics.scaleX = 1.2; levelSelectButton.buttonGraphics.scaleY = 1.2; levelSelectButton.buttonText.size = 36; var leaderboardButton = menuContainer.addChild(new MenuButton('Leaderboard', function () { showLeaderboard(); })); leaderboardButton.y = 570; leaderboardButton.buttonGraphics.scaleX = 1.2; leaderboardButton.buttonGraphics.scaleY = 1.2; leaderboardButton.buttonText.size = 36; var changeNameButton = menuContainer.addChild(new MenuButton('Change Name', function () { hideMenu(); showNameInput(); })); changeNameButton.y = 640; changeNameButton.buttonGraphics.scaleX = 1.2; changeNameButton.buttonGraphics.scaleY = 1.2; changeNameButton.buttonText.size = 36; // Animate menu entrance menuContainer.alpha = 0; menuContainer.scaleX = 0.5; menuContainer.scaleY = 0.5; tween(menuContainer, { alpha: 1, scaleX: 1, scaleY: 1 }, { duration: 500 }); } function hideMenu() { if (menuContainer) { tween(menuContainer, { alpha: 0, scaleY: 0 }, { duration: 300, onFinish: function onFinish() { if (menuContainer.parent) { menuContainer.parent.removeChild(menuContainer); } menuContainer = null; } }); } } function showLevelSelect() { hideMenu(); levelSelectContainer = game.addChild(new Container()); // Level select background var levelBg = levelSelectContainer.attachAsset('menuBackground', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.0, scaleY: 2.2 }); levelBg.alpha = 0.9; levelSelectContainer.x = 1024; levelSelectContainer.y = 1366; // Title var levelTitle = new Text2('SELECT LEVEL', { size: 50, fill: 0x00ffff }); levelTitle.anchor.set(0.5, 0.5); levelTitle.y = -350; levelSelectContainer.addChild(levelTitle); // Level buttons (5x3 grid for 15 levels) for (var i = 1; i <= 15; i++) { var levelButton = levelSelectContainer.addChild(new MenuButton('Level ' + i, function (level) { return function () { currentLevel = level; gameMode = 'level'; startLevelGame(level); }; }(i))); var row = Math.floor((i - 1) / 5); var col = (i - 1) % 5; levelButton.x = (col - 2) * 200; levelButton.y = -180 + row * 140; levelButton.buttonGraphics.scaleX = 0.44; levelButton.buttonGraphics.scaleY = 0.6; levelButton.buttonText.size = 28; } // Back button var backButton = levelSelectContainer.addChild(new MenuButton('Back', function () { hideLevelSelect(); createMainMenu(); })); backButton.y = 350; // Animate entrance levelSelectContainer.alpha = 0; tween(levelSelectContainer, { alpha: 1 }, { duration: 300 }); } function hideLevelSelect() { if (levelSelectContainer) { tween(levelSelectContainer, { alpha: 0 }, { duration: 200, onFinish: function onFinish() { if (levelSelectContainer.parent) { levelSelectContainer.parent.removeChild(levelSelectContainer); } levelSelectContainer = null; } }); } } var themeSelectContainer; var themeSelectOpen = false; function hideThemeSelect() { if (themeSelectContainer) { themeSelectOpen = false; tween(themeSelectContainer, { alpha: 0 }, { duration: 200, onFinish: function onFinish() { if (themeSelectContainer.parent) { themeSelectContainer.parent.removeChild(themeSelectContainer); } themeSelectContainer = null; } }); } } function showThemeSelect() { if (themeSelectOpen) { // If theme menu is open, close it hideThemeSelect(); createMainMenu(); return; } if (!menuContainer) { // If menu is not showing, don't open theme menu return; } hideMenu(); themeSelectOpen = true; themeSelectContainer = game.addChild(new Container()); // Theme select background var themeBg = themeSelectContainer.attachAsset('menuBackground', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.0, scaleY: 2.2 }); themeBg.alpha = 0.9; themeSelectContainer.x = 1024; themeSelectContainer.y = 1366; // Title var themeTitle = new Text2('SELECT THEME', { size: 50, fill: 0x00ffff }); themeTitle.anchor.set(0.5, 0.5); themeTitle.y = -350; themeSelectContainer.addChild(themeTitle); // Theme buttons var themes = ['classic', 'dark', 'neon', 'gold', 'ice', 'fire', 'space', 'galaxy']; var themeNames = ['Classic', 'Dark', 'Neon', 'Gold', 'Ice', 'Fire', 'Space', 'Galaxy']; for (var i = 0; i < themes.length; i++) { var themeButton = themeSelectContainer.addChild(new MenuButton(themeNames[i], function (theme) { return function () { currentTheme = theme; if (typeof themeBackgrounds[theme] === 'string') { // If it's an image asset name, add background image if (game.backgroundImage) { game.removeChild(game.backgroundImage); } game.backgroundImage = game.attachAsset(themeBackgrounds[theme], { anchorX: 0, anchorY: 0, scaleX: 1, scaleY: 1 }); game.addChildAt(game.backgroundImage, 0); } else { // If it's a color, set background color if (game.backgroundImage) { game.removeChild(game.backgroundImage); game.backgroundImage = null; } game.setBackgroundColor(themeBackgrounds[theme]); } hideThemeSelect(); createMainMenu(); }; }(themes[i]))); var row = Math.floor(i / 4); var col = i % 4; themeButton.x = (col - 1.5) * 220; themeButton.y = -200 + row * 120; themeButton.buttonGraphics.scaleX = 0.5; themeButton.buttonGraphics.scaleY = 0.5; } // Back button var backButton = themeSelectContainer.addChild(new MenuButton('Back', function () { hideThemeSelect(); createMainMenu(); })); backButton.y = 350; // Animate entrance themeSelectContainer.alpha = 0; tween(themeSelectContainer, { alpha: 1 }, { duration: 300 }); } function startClassicGame() { hideMenu(); gameState = 'playing'; initializeGame(); } function startEndlessGame() { hideMenu(); gameState = 'playing'; initializeGame(); // In endless mode, we'll regenerate bricks when they're all destroyed } function startTimeAttackGame() { hideMenu(); gameState = 'playing'; initializeGame(); // Add timer for time attack mode var timeLeft = 120; // 2 minutes var timeText = new Text2('Time: ' + timeLeft, { size: 30, fill: 0xff0000 }); timeText.anchor.set(1, 0); LK.gui.topRight.addChild(timeText); var timeTimer = LK.setInterval(function () { timeLeft--; timeText.setText('Time: ' + timeLeft); if (timeLeft <= 0) { LK.clearInterval(timeTimer); LK.showGameOver(); } }, 1000); } function startLevelGame(level) { hideLevelSelect(); gameState = 'playing'; initializeGame(); createLevelBricks(level); } function startZenGame() { hideMenu(); gameState = 'playing'; zenModeActive = true; initializeGame(); // Create peaceful, slowly moving bricks createZenBricks(); // Add zen mode indicator var zenText = new Text2('ZEN MODE - Relax and enjoy', { size: 25, fill: 0x90EE90 }); zenText.anchor.set(0.5, 0); zenText.y = 100; LK.gui.top.addChild(zenText); } function startGravityGame() { hideMenu(); gameState = 'playing'; gravityModeActive = true; initializeGame(); // Create bricks for gravity mode createBricks(); // Start ball with initial velocity for gravity mode ball.velocityX = (Math.random() - 0.5) * 8; ball.velocityY = -ball.speed * 0.8; gameStarted = true; // Add gravity mode indicator var gravityText = new Text2('GRAVITY MODE - Gravity changes every 10 seconds!', { size: 25, fill: 0xff6b6b }); gravityText.anchor.set(0.5, 0); gravityText.y = 100; LK.gui.top.addChild(gravityText); // Set up gravity timer LK.setInterval(function () { gravityDirection *= -1; createEdgeGlow(gravityDirection > 0 ? 0xff0000 : 0x0000ff); }, 10000); } function startReverseGame() { hideMenu(); gameState = 'playing'; reverseModeActive = true; initializeGame(); // Create bricks for reverse mode (positioned lower for reverse gameplay) var brickColors = [1, 2, 3, 4, 5]; var rows = 8; var cols = 18; var brickWidth = 110; var brickHeight = 50; var startX = 110; var startY = 1800; // Lower position for reverse mode for (var row = 0; row < rows; row++) { for (var col = 0; col < cols; col++) { var brick = new Brick(brickColors[row % brickColors.length], currentTheme); brick.x = startX + col * brickWidth; brick.y = startY + row * brickHeight; bricks.push(brick); game.addChild(brick); } } // Place paddle at top instead of bottom paddle.y = 150; ball.x = 1024; ball.y = 200; ball.velocityX = (Math.random() - 0.5) * 8; ball.velocityY = ball.speed; gameStarted = true; // Add reverse mode indicator var reverseText = new Text2('REVERSE MODE - Paddle is at the top!', { size: 25, fill: 0x9b59b6 }); reverseText.anchor.set(0.5, 0); reverseText.y = 100; LK.gui.top.addChild(reverseText); } function startLaserGame() { hideMenu(); gameState = 'playing'; laserModeActive = true; initializeGame(); // Create bricks for laser mode createBricks(); // Start ball with initial velocity for laser mode ball.velocityX = (Math.random() - 0.5) * 8; ball.velocityY = -ball.speed * 0.8; gameStarted = true; // Initialize laser variables laserCooldown = 0; laserBeams = []; // Add laser mode indicator var laserText = new Text2('LASER MODE - Tap to shoot laser beams!', { size: 25, fill: 0xff6b6b }); laserText.anchor.set(0.5, 0); laserText.y = 100; LK.gui.top.addChild(laserText); } function clearLevelElements() { // Remove all existing bricks from screen for (var i = 0; i < bricks.length; i++) { if (bricks[i].parent) { bricks[i].parent.removeChild(bricks[i]); } } // Remove all existing powerups from screen for (var p = 0; p < powerups.length; p++) { if (powerups[p].parent) { powerups[p].parent.removeChild(powerups[p]); } } // Remove all extra balls from screen for (var e = 0; e < extraBalls.length; e++) { if (extraBalls[e].parent) { extraBalls[e].parent.removeChild(extraBalls[e]); } } // Remove all laser beams from screen for (var lb = 0; lb < laserBeams.length; lb++) { if (laserBeams[lb].parent) { laserBeams[lb].parent.removeChild(laserBeams[lb]); } } // Clear GUI elements that might be from previous level var guiChildren = LK.gui.topRight.children.slice(); for (var g = 0; g < guiChildren.length; g++) { if (guiChildren[g] !== scoreTxt) { LK.gui.topRight.removeChild(guiChildren[g]); } } var guiTopChildren = LK.gui.top.children.slice(); for (var gt = 0; gt < guiTopChildren.length; gt++) { if (guiTopChildren[gt] !== scoreTxt) { LK.gui.top.removeChild(guiTopChildren[gt]); } } } function initializeGame() { // Clear previous level elements first clearLevelElements(); // Reset game variables bricks = []; powerups = []; extraBalls = []; laserBeams = []; gameStarted = false; zenModeActive = false; gravityModeActive = false; reverseModeActive = false; laserModeActive = false; laserCooldown = 0; gravityDirection = 1; LK.setScore(0); // Create game objects if they don't exist if (!paddle) { paddle = game.addChild(new Paddle(currentTheme)); } else { // Update paddle for new theme paddle.parent.removeChild(paddle); paddle = game.addChild(new Paddle(currentTheme)); } if (!ball) { ball = game.addChild(new Ball(currentTheme)); } else { // Update ball for new theme ball.parent.removeChild(ball); ball = game.addChild(new Ball(currentTheme)); } // Reset positions paddle.x = 1024; paddle.y = 2600; ball.x = 1024; ball.y = 2550; ball.velocityX = 0; ball.velocityY = 0; if (gameMode === 'classic' || gameMode === 'endless' || gameMode === 'timeAttack') { createBricks(); } // Start ball movement immediately for level-based games if (gameMode === 'level') { ball.velocityX = (Math.random() - 0.5) * 10; ball.velocityY = -ball.speed; gameStarted = true; } // Create back to menu button var backToMenuButton = new MenuButton('Menu', function () { gameState = 'menu'; createMainMenu(); }); backToMenuButton.buttonGraphics.scaleX = 0.4; backToMenuButton.buttonGraphics.scaleY = 0.4; backToMenuButton.buttonText.size = 25; backToMenuButton.x = 1800; backToMenuButton.y = 150; game.addChild(backToMenuButton); } function createLevelBricks(level) { // Clear any existing bricks before creating new pattern clearLevelElements(); var patterns = { 1: function _() { createSimplePattern(); }, 2: function _() { createDiamondPattern(); }, 3: function _() { createCheckerPattern(); }, 4: function _() { createWavePattern(); }, 5: function _() { createCirclePattern(); }, 6: function _() { createTrianglePattern(); }, 7: function _() { createCrossPattern(); }, 8: function _() { createSpiralPattern(); }, 9: function _() { createButterflyPattern(); }, 10: function _() { createHexagonPattern(); }, 11: function _() { createZigZagPattern(); }, 12: function _() { createHeartPattern(); }, 13: function _() { createMazePattern(); }, 14: function _() { createStarPattern(); }, 15: function _() { createDoubleCirclePattern(); } }; if (patterns[level]) { patterns[level](); } else { createBricks(); } } function createSimplePattern() { var rows = 6; var cols = 14; var brickWidth = 140; var brickHeight = 45; var startX = 1024 - cols * brickWidth / 2 + brickWidth / 2; var startY = 250; for (var row = 0; row < rows; row++) { for (var col = 0; col < cols; col++) { var brickType = (row * cols + col) % 8 + 1; var brick = new Brick(brickType, currentTheme); brick.x = startX + col * brickWidth; brick.y = startY + row * brickHeight; bricks.push(brick); game.addChild(brick); } } } function createDiamondPattern() { var centerX = 1024; var centerY = 350; var brickWidth = 100; var brickHeight = 40; var diamond = [[0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0], [0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0], [0, 0, 3, 3, 3, 3, 3, 3, 3, 0, 0], [0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0], [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5], [6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6], [0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0], [0, 0, 8, 8, 8, 8, 8, 8, 8, 0, 0], [0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0], [0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0]]; for (var row = 0; row < diamond.length; row++) { for (var col = 0; col < diamond[row].length; col++) { if (diamond[row][col] > 0) { var brick = new Brick(diamond[row][col]); brick.x = centerX + (col - 5) * brickWidth; brick.y = centerY + row * brickHeight; bricks.push(brick); game.addChild(brick); } } } } function createCheckerPattern() { var rows = 12; var cols = 16; var brickWidth = 120; var brickHeight = 35; var startX = 1024 - cols * brickWidth / 2 + brickWidth / 2; var startY = 200; for (var row = 0; row < rows; row++) { for (var col = 0; col < cols; col++) { if ((row + col) % 2 === 0) { var brickType = (row + col) % 8 + 1; var brick = new Brick(brickType); brick.x = startX + col * brickWidth; brick.y = startY + row * brickHeight; bricks.push(brick); game.addChild(brick); } else if ((row + col) % 3 === 1) { // Add some bricks in alternate spaces for more density var brickType = row * col % 5 + 1; var brick = new Brick(brickType); brick.x = startX + col * brickWidth; brick.y = startY + row * brickHeight; bricks.push(brick); game.addChild(brick); } } } } function createWavePattern() { var cols = 15; var brickWidth = 130; var brickHeight = 45; var startX = 1024 - cols * brickWidth / 2 + brickWidth / 2; var baseY = 400; for (var col = 0; col < cols; col++) { var waveHeight = Math.sin(col * 0.5) * 100; var rows = Math.floor(3 + Math.abs(waveHeight / 50)); for (var row = 0; row < rows; row++) { var brick = new Brick(col % 5 + 1); brick.x = startX + col * brickWidth; brick.y = baseY + waveHeight + row * brickHeight; bricks.push(brick); game.addChild(brick); } } } function createCirclePattern() { var centerX = 1024; var centerY = 450; var circles = [{ radius: 80, bricks: 12, type: 1 }, { radius: 140, bricks: 20, type: 2 }, { radius: 200, bricks: 28, type: 3 }, { radius: 260, bricks: 36, type: 4 }, { radius: 320, bricks: 44, type: 5 }]; for (var c = 0; c < circles.length; c++) { var circle = circles[c]; for (var i = 0; i < circle.bricks; i++) { var angle = i / circle.bricks * Math.PI * 2; var brickType = (circle.type + Math.floor(i / 4)) % 8 + 1; var brick = new Brick(brickType); brick.x = centerX + Math.cos(angle) * circle.radius; brick.y = centerY + Math.sin(angle) * circle.radius; bricks.push(brick); game.addChild(brick); } } } function createTrianglePattern() { var centerX = 1024; var startY = 300; var brickWidth = 120; var brickHeight = 50; for (var row = 0; row < 8; row++) { var bricksInRow = 8 - row; var startX = centerX - bricksInRow * brickWidth / 2 + brickWidth / 2; for (var col = 0; col < bricksInRow; col++) { var brick = new Brick(row % 5 + 1); brick.x = startX + col * brickWidth; brick.y = startY + row * brickHeight; bricks.push(brick); game.addChild(brick); } } } function createCrossPattern() { var centerX = 1024; var centerY = 450; var brickWidth = 100; var brickHeight = 40; // Horizontal line for (var i = -5; i <= 5; i++) { var brick = new Brick(3); brick.x = centerX + i * brickWidth; brick.y = centerY; bricks.push(brick); game.addChild(brick); } // Vertical line for (var i = -4; i <= 4; i++) { if (i !== 0) { // Don't place on center (already has horizontal brick) var brick = new Brick(5); brick.x = centerX; brick.y = centerY + i * brickHeight; bricks.push(brick); game.addChild(brick); } } } function createSpiralPattern() { var centerX = 1024; var centerY = 450; var brickWidth = 80; var brickHeight = 40; // Simplified lion pattern - creating a stylized lion face with fewer bricks var lionPattern = [ // Mane (outer layer) - using brick type 6 (yellow/gold) [0, 0, 6, 6, 6, 6, 6, 6, 6, 0, 0], [0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0], [6, 6, 4, 4, 4, 4, 4, 4, 4, 6, 6], // Eyes area - using brick type 2 (green) for eyes, type 4 for face [6, 4, 4, 2, 4, 4, 4, 2, 4, 4, 6], [6, 4, 4, 2, 4, 4, 4, 2, 4, 4, 6], // Nose area - using brick type 1 (pink/red) for nose [6, 4, 4, 4, 1, 1, 1, 4, 4, 4, 6], // Mouth area - using brick type 3 (purple) for mouth [6, 4, 4, 3, 3, 3, 3, 3, 4, 4, 6], [6, 6, 4, 4, 4, 4, 4, 4, 4, 6, 6], // Bottom mane [0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0], [0, 0, 6, 6, 6, 6, 6, 6, 6, 0, 0]]; // Create bricks based on the simplified lion pattern for (var row = 0; row < lionPattern.length; row++) { for (var col = 0; col < lionPattern[row].length; col++) { if (lionPattern[row][col] > 0) { var brickType = lionPattern[row][col]; var brick = new Brick(brickType); brick.x = centerX + (col - 5) * brickWidth; brick.y = centerY + (row - 4) * brickHeight - 100; bricks.push(brick); game.addChild(brick); } } } } function createRandomPattern() { var brickCount = 80; var minX = 150; var maxX = 1898; var minY = 200; var maxY = 900; // Create clusters of bricks for more interesting gameplay var clusterCount = 8; var bricksPerCluster = brickCount / clusterCount; for (var cluster = 0; cluster < clusterCount; cluster++) { var clusterCenterX = minX + Math.random() * (maxX - minX); var clusterCenterY = minY + Math.random() * (maxY - minY); var clusterRadius = 80 + Math.random() * 40; for (var i = 0; i < bricksPerCluster; i++) { var angle = Math.random() * Math.PI * 2; var distance = Math.random() * clusterRadius; var brickType = Math.floor(Math.random() * 8) + 1; var brick = new Brick(brickType); brick.x = clusterCenterX + Math.cos(angle) * distance; brick.y = clusterCenterY + Math.sin(angle) * distance; // Ensure bricks stay within bounds brick.x = Math.max(minX, Math.min(maxX, brick.x)); brick.y = Math.max(minY, Math.min(maxY, brick.y)); bricks.push(brick); game.addChild(brick); } } } function createButterflyPattern() { var centerX = 1024; var centerY = 450; var brickWidth = 80; var brickHeight = 40; // Beautiful butterfly pattern with wings, body, and antennae var butterflyPattern = [ // Antennae - using brick type 1 (pink) [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], // Upper wings - using multiple colors for beauty [0, 2, 2, 2, 0, 0, 0, 8, 0, 0, 0, 3, 3, 3, 0], [2, 2, 4, 2, 2, 0, 0, 8, 0, 0, 2, 2, 5, 2, 2], [2, 4, 6, 4, 2, 0, 0, 8, 0, 0, 2, 5, 7, 5, 2], [2, 4, 6, 4, 2, 0, 0, 8, 0, 0, 2, 5, 7, 5, 2], // Body - using brick type 8 (dark color for body) [0, 2, 4, 2, 0, 0, 0, 8, 0, 0, 0, 2, 5, 2, 0], [0, 0, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 2, 0, 0], // Lower wings - colorful pattern [0, 3, 3, 3, 0, 0, 0, 8, 0, 0, 0, 4, 4, 4, 0], [3, 3, 5, 3, 3, 0, 0, 8, 0, 0, 3, 3, 6, 3, 3], [3, 5, 7, 5, 3, 0, 0, 8, 0, 0, 3, 6, 1, 6, 3], [3, 5, 7, 5, 3, 0, 0, 8, 0, 0, 3, 6, 1, 6, 3], [0, 3, 5, 3, 0, 0, 0, 8, 0, 0, 0, 3, 6, 3, 0], [0, 0, 3, 0, 0, 0, 0, 8, 0, 0, 0, 0, 3, 0, 0], // Wing spots and details [0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0]]; // Create bricks based on the butterfly pattern for (var row = 0; row < butterflyPattern.length; row++) { for (var col = 0; col < butterflyPattern[row].length; col++) { if (butterflyPattern[row][col] > 0) { var brickType = butterflyPattern[row][col]; var brick = new Brick(brickType); brick.x = centerX + (col - 7) * brickWidth; brick.y = centerY + (row - 8) * brickHeight - 100; bricks.push(brick); game.addChild(brick); } } } // Add some decorative spots around the butterfly var spots = [{ x: centerX - 200, y: centerY - 50, type: 2 }, { x: centerX + 200, y: centerY - 50, type: 2 }, { x: centerX - 180, y: centerY + 100, type: 4 }, { x: centerX + 180, y: centerY + 100, type: 4 }, { x: centerX - 250, y: centerY, type: 6 }, { x: centerX + 250, y: centerY, type: 6 }]; for (var s = 0; s < spots.length; s++) { var spot = spots[s]; var brick = new Brick(spot.type); brick.x = spot.x; brick.y = spot.y; bricks.push(brick); game.addChild(brick); } } function createHexagonPattern() { var centerX = 1024; var centerY = 450; var radius = 180; var brickWidth = 100; var brickHeight = 40; // Create hexagon with 6 sides for (var side = 0; side < 6; side++) { var angle = side * Math.PI / 3; var sideLength = 8; for (var i = 0; i < sideLength; i++) { var brick = new Brick(side % 5 + 1); var x = centerX + Math.cos(angle) * radius + Math.cos(angle + Math.PI / 2) * (i - sideLength / 2) * brickWidth / 2; var y = centerY + Math.sin(angle) * radius + Math.sin(angle + Math.PI / 2) * (i - sideLength / 2) * brickHeight / 2; brick.x = x; brick.y = y; bricks.push(brick); game.addChild(brick); } } } function createZigZagPattern() { var cols = 16; var brickWidth = 120; var brickHeight = 45; var startX = 1024 - cols * brickWidth / 2 + brickWidth / 2; var baseY = 300; for (var col = 0; col < cols; col++) { var zigzagOffset = col % 4 * 60 - 90; var rows = 3 + Math.abs(zigzagOffset) / 30; for (var row = 0; row < rows; row++) { var brick = new Brick(col % 5 + 1); brick.x = startX + col * brickWidth; brick.y = baseY + zigzagOffset + row * brickHeight; bricks.push(brick); game.addChild(brick); } } } function createHeartPattern() { var centerX = 1024; var centerY = 400; var scale = 8; // Heart shape using parametric equations for (var t = 0; t < Math.PI * 2; t += 0.3) { var x = scale * (16 * Math.pow(Math.sin(t), 3)); var y = scale * (13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t)); var brick = new Brick(Math.floor(t * 5 / (Math.PI * 2)) + 1); brick.x = centerX + x; brick.y = centerY - y + 100; // Flip and offset bricks.push(brick); game.addChild(brick); } } function createMazePattern() { var centerX = 1024; var centerY = 400; var brickWidth = 70; var brickHeight = 35; // Create larger, more complex maze-like pattern var mazePattern = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 3, 0, 0, 0, 4, 0, 0, 0, 1], [1, 0, 5, 5, 5, 5, 5, 0, 6, 0, 6, 0, 7, 7, 7, 7, 7, 0, 1], [1, 0, 5, 0, 0, 0, 5, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 1], [1, 0, 5, 0, 8, 0, 5, 8, 8, 8, 8, 8, 7, 0, 1, 0, 7, 0, 1], [1, 0, 5, 0, 8, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 7, 0, 1], [1, 0, 5, 5, 8, 5, 5, 5, 5, 2, 5, 5, 5, 5, 1, 5, 7, 0, 1], [1, 0, 0, 0, 8, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 1], [1, 3, 3, 3, 8, 3, 3, 0, 4, 2, 4, 0, 6, 6, 1, 6, 6, 3, 1], [1, 0, 0, 0, 8, 0, 0, 0, 4, 2, 4, 0, 0, 0, 1, 0, 0, 0, 1], [1, 0, 7, 7, 8, 7, 7, 7, 4, 2, 4, 7, 7, 7, 1, 7, 7, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 4, 2, 4, 0, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]; for (var row = 0; row < mazePattern.length; row++) { for (var col = 0; col < mazePattern[row].length; col++) { if (mazePattern[row][col] > 0) { var brickType = mazePattern[row][col]; var brick = new Brick(brickType); brick.x = centerX + (col - 9) * brickWidth; brick.y = centerY + (row - 6) * brickHeight; bricks.push(brick); game.addChild(brick); } } } } function createStarPattern() { var centerX = 1024; var centerY = 450; var outerRadius = 200; var innerRadius = 100; var points = 5; // Create 5-pointed star for (var i = 0; i < points * 2; i++) { var angle = i * Math.PI / points; var radius = i % 2 === 0 ? outerRadius : innerRadius; var bricksOnRay = 8; for (var j = 1; j <= bricksOnRay; j++) { var brick = new Brick(i % 5 + 1); brick.x = centerX + Math.cos(angle) * radius * j / bricksOnRay; brick.y = centerY + Math.sin(angle) * radius * j / bricksOnRay; bricks.push(brick); game.addChild(brick); } } } function createDoubleCirclePattern() { var centerX = 1024; var centerY = 450; var innerRadius = 120; var outerRadius = 220; var brickCount = 20; // Inner circle for (var i = 0; i < brickCount; i++) { var angle = i / brickCount * Math.PI * 2; var brick = new Brick(1, currentTheme); brick.x = centerX + Math.cos(angle) * innerRadius; brick.y = centerY + Math.sin(angle) * innerRadius; bricks.push(brick); game.addChild(brick); } // Outer circle for (var i = 0; i < brickCount * 1.5; i++) { var angle = i / (brickCount * 1.5) * Math.PI * 2; var brick = new Brick(3, currentTheme); brick.x = centerX + Math.cos(angle) * outerRadius; brick.y = centerY + Math.sin(angle) * outerRadius; bricks.push(brick); game.addChild(brick); } // Connecting lines for (var i = 0; i < 8; i++) { var angle = i / 8 * Math.PI * 2; for (var j = 1; j < 4; j++) { var radius = innerRadius + (outerRadius - innerRadius) * j / 4; var brick = new Brick(5, currentTheme); brick.x = centerX + Math.cos(angle) * radius; brick.y = centerY + Math.sin(angle) * radius; bricks.push(brick); game.addChild(brick); } } } function createZenBricks() { var centerX = 1024; var centerY = 400; var rows = 3; var cols = 8; var brickWidth = 140; var brickHeight = 60; var startX = centerX - cols * brickWidth / 2 + brickWidth / 2; var startY = centerY; for (var row = 0; row < rows; row++) { for (var col = 0; col < cols; col++) { var brick = new Brick(Math.floor(Math.random() * 5) + 1, currentTheme); brick.x = startX + col * brickWidth; brick.y = startY + row * brickHeight; brick.zenBrick = true; brick.floatOffset = Math.random() * Math.PI * 2; brick.originalY = brick.y; bricks.push(brick); game.addChild(brick); } } } // Show leaderboard function showLeaderboard() { hideMenu(); leaderboardContainer = game.addChild(new Container()); // Leaderboard background var leaderBg = leaderboardContainer.attachAsset('menuBackground', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.0, scaleY: 2.5 }); leaderBg.alpha = 0.9; leaderboardContainer.x = 1024; leaderboardContainer.y = 1366; // Title var leaderTitle = new Text2('LEADERBOARD', { size: 55, fill: 0x00ffff }); leaderTitle.anchor.set(0.5, 0.5); leaderTitle.y = -400; leaderboardContainer.addChild(leaderTitle); // Sort leaderboard by score var sortedLeaderboard = leaderboard.slice().sort(function (a, b) { return b.score - a.score; }); // Display top 10 scores for (var i = 0; i < Math.min(10, sortedLeaderboard.length); i++) { var entry = sortedLeaderboard[i]; var position = i + 1; var entryText = position + '. ' + entry.name + ' - ' + entry.score; var scoreEntry = new Text2(entryText, { size: 32, fill: position <= 3 ? 0xffd700 : 0xffffff }); scoreEntry.anchor.set(0.5, 0.5); scoreEntry.y = -300 + i * 45; leaderboardContainer.addChild(scoreEntry); } // Show message if no scores if (sortedLeaderboard.length === 0) { var noScoresText = new Text2('No scores yet!', { size: 40, fill: 0xcccccc }); noScoresText.anchor.set(0.5, 0.5); noScoresText.y = -200; leaderboardContainer.addChild(noScoresText); } // Current player info var playerInfoText = new Text2('Playing as: ' + playerName, { size: 28, fill: 0x90EE90 }); playerInfoText.anchor.set(0.5, 0.5); playerInfoText.y = 150; leaderboardContainer.addChild(playerInfoText); // Back button var backButton = leaderboardContainer.addChild(new MenuButton('Back', function () { hideLeaderboard(); createMainMenu(); })); backButton.y = 350; // Clear leaderboard button var clearButton = leaderboardContainer.addChild(new MenuButton('Clear Scores', function () { leaderboard = []; storage.leaderboardNames = []; storage.leaderboardScores = []; hideLeaderboard(); showLeaderboard(); })); clearButton.y = 420; clearButton.buttonGraphics.scaleX = 0.8; clearButton.buttonGraphics.scaleY = 0.8; // Animate entrance leaderboardContainer.alpha = 0; tween(leaderboardContainer, { alpha: 1 }, { duration: 300 }); } function hideLeaderboard() { if (leaderboardContainer) { tween(leaderboardContainer, { alpha: 0 }, { duration: 200, onFinish: function onFinish() { if (leaderboardContainer.parent) { leaderboardContainer.parent.removeChild(leaderboardContainer); } leaderboardContainer = null; } }); } } function addToLeaderboard(name, score) { leaderboard.push({ name: name, score: score }); // Keep only top 50 scores to prevent storage bloat leaderboard.sort(function (a, b) { return b.score - a.score; }); if (leaderboard.length > 50) { leaderboard = leaderboard.slice(0, 50); } // Flatten leaderboard for storage - create separate arrays for names and scores var leaderboardNames = []; var leaderboardScores = []; for (var i = 0; i < leaderboard.length; i++) { leaderboardNames.push(leaderboard[i].name); leaderboardScores.push(leaderboard[i].score); } storage.leaderboardNames = leaderboardNames; storage.leaderboardScores = leaderboardScores; } // Show main menu on game start askPlayerName(); // Create paddle paddle = game.addChild(new Paddle()); paddle.x = 1024; paddle.y = 2600; // Create ball ball = game.addChild(new Ball()); ball.x = 1024; ball.y = 2550; // Initialize ball movement when game starts function startGame() { if (!gameStarted) { gameStarted = true; ball.velocityX = (Math.random() - 0.5) * 10; ball.velocityY = -ball.speed; } } // Create brick pattern function createBricks() { var brickColors = [1, 2, 3, 4, 5, 6, 7, 8]; var rows = 10; var cols = 20; var brickWidth = 100; var brickHeight = 42; var startX = 74; var startY = 180; for (var row = 0; row < rows; row++) { for (var col = 0; col < cols; col++) { // Create more interesting patterns with varying brick types var brickType; if (row < 2) { // Top rows use special stronger bricks brickType = col % 4 + 5; } else if (row === rows - 1) { // Bottom row alternates between types brickType = col % 2 === 0 ? 1 : 8; } else { // Middle rows use varied pattern brickType = row * col % 8 + 1; } var brick = new Brick(brickType, currentTheme); brick.x = startX + col * brickWidth; brick.y = startY + row * brickHeight; bricks.push(brick); game.addChild(brick); } } } createBricks(); // Event handlers game.down = function (x, y, obj) { if (nameInputActive) { return; // Prevent game interaction during name input } if (gameState === 'playing') { if (laserModeActive && laserCooldown <= 0) { // Shoot laser beam var laser = new Laser(); laser.x = paddle.x; laser.y = paddle.y - 300; // Start laser higher up laserBeams.push(laser); game.addChild(laser); laserCooldown = 15; // Faster shooting - 1/4 second cooldown at 60fps LK.getSound('paddleHit').play(); } else { dragNode = paddle; } // Only start game if it hasn't started yet and we're in a mode that requires manual start if (!gameStarted && (gameMode === 'classic' || gameMode === 'endless' || gameMode === 'timeAttack' || gameMode === 'zen')) { startGame(); } } }; game.move = function (x, y, obj) { if (gameState === 'playing' && dragNode) { dragNode.x = Math.max(100, Math.min(1948, x)); } }; game.up = function (x, y, obj) { if (gameState === 'playing') { dragNode = null; } }; // Main game update loop game.update = function () { // Only update game logic when actually playing if (gameState !== 'playing') { return; } // Update score display scoreTxt.setText(LK.getScore()); // Update high score if (LK.getScore() > highScore) { highScore = LK.getScore(); storage.highScore = highScore; } // Animate zen mode bricks if (zenModeActive) { for (var z = 0; z < bricks.length; z++) { if (bricks[z].zenBrick) { bricks[z].y = bricks[z].originalY + Math.sin(LK.ticks * 0.02 + bricks[z].floatOffset) * 10; } } } // Check if ball fell below paddle (or above in reverse mode) var ballOutOfBounds = reverseModeActive ? ball.y < -20 : ball.y > 2750; if (ballOutOfBounds) { if (gameMode === 'zen') { // In zen mode, just reset the ball ball.x = 1024; ball.y = reverseModeActive ? 200 : 2550; ball.velocityX = 0; ball.velocityY = 0; gameStarted = false; // Reset paddle position for zen mode paddle.y = reverseModeActive ? 150 : 2600; return; } else { // Add score to leaderboard before game over if (LK.getScore() > 0) { addToLeaderboard(playerName, LK.getScore()); } LK.showGameOver(); gameState = 'menu'; LK.setTimeout(function () { askPlayerName(); }, 2000); return; } } // Apply gravity mode effects if (gravityModeActive && gameStarted) { ball.velocityY += 0.15 * gravityDirection; // Limit velocity to prevent uncontrollable speed ball.velocityY = Math.max(-12, Math.min(12, ball.velocityY)); for (var eb = 0; eb < extraBalls.length; eb++) { extraBalls[eb].velocityY += 0.15 * gravityDirection; extraBalls[eb].velocityY = Math.max(-12, Math.min(12, extraBalls[eb].velocityY)); } } // Laser mode mechanics if (laserModeActive) { // Decrease laser cooldown if (laserCooldown > 0) { laserCooldown--; } // Update laser beams and check collisions for (var lb = laserBeams.length - 1; lb >= 0; lb--) { var laser = laserBeams[lb]; // Update laser position (call update method) laser.update(); if (laser.destroyed) { laserBeams.splice(lb, 1); continue; } // Check laser-brick collisions for (var i = bricks.length - 1; i >= 0; i--) { var brick = bricks[i]; if (!brick.destroyed && laser.intersects(brick)) { brick.destroy(); bricks.splice(i, 1); laser.destroy(); laserBeams.splice(lb, 1); LK.effects.flashObject(laser, 0xffffff, 200); break; } } } } // Ball-paddle collision (updated for reverse mode) var paddleCollisionCheck = reverseModeActive ? ball.intersects(paddle) && ball.velocityY < 0 && ball.y > paddle.y - 15 : ball.intersects(paddle) && ball.velocityY > 0 && ball.y < paddle.y + 15; if (paddleCollisionCheck) { var paddleCenter = paddle.x; var ballRelativePosition = (ball.x - paddleCenter) / 100; if (reverseModeActive) { ball.velocityY = Math.abs(ball.velocityY); ball.y = paddle.y + 25; } else { ball.velocityY = -Math.abs(ball.velocityY); ball.y = paddle.y - 25; } ball.velocityX = ballRelativePosition * 8; LK.getSound('paddleHit').play(); } // Ball-brick collisions for (var i = bricks.length - 1; i >= 0; i--) { var brick = bricks[i]; if (!brick.destroyed && ball.intersects(brick)) { brick.destroy(); bricks.splice(i, 1); // Simple bounce - reverse Y velocity ball.velocityY = -ball.velocityY; // In laser mode, create horizontal laser beam when ball hits brick if (laserModeActive) { var horizontalLaser = new Laser(); horizontalLaser.x = brick.x; horizontalLaser.y = brick.y; // Make laser horizontal by swapping dimensions and changing speed direction var laserGraphics = horizontalLaser.children[0]; laserGraphics.width = 600; laserGraphics.height = 8; laserGraphics.rotation = Math.PI / 2; // Rotate 90 degrees to make it horizontal horizontalLaser.speed = 0; // Don't move vertically horizontalLaser.horizontalSpeed = 15; // Move horizontally instead horizontalLaser.direction = ball.velocityX > 0 ? 1 : -1; // Move in ball's horizontal direction // Override update method for horizontal movement horizontalLaser.update = function () { if (this.destroyed) return; this.x += this.horizontalSpeed * this.direction; // Remove if off screen horizontally if (this.x < -200 || this.x > 2248) { this.destroy(); } }; laserBeams.push(horizontalLaser); game.addChild(horizontalLaser); } break; } } // Update powerups for (var p = powerups.length - 1; p >= 0; p--) { var powerup = powerups[p]; if (powerup.y > 2800 || powerup.collected) { powerups.splice(p, 1); } } // Handle extra balls collisions for (var e = extraBalls.length - 1; e >= 0; e--) { var extraBall = extraBalls[e]; // Remove if fallen below screen (or above in reverse mode) var extraBallOutOfBounds = reverseModeActive ? extraBall.y < -20 : extraBall.y > 2750; if (extraBallOutOfBounds) { extraBall.parent.removeChild(extraBall); extraBalls.splice(e, 1); continue; } // Extra ball-paddle collision (updated for reverse mode) var extraBallPaddleCheck = reverseModeActive ? extraBall.intersects(paddle) && extraBall.velocityY < 0 && extraBall.y > paddle.y - 15 : extraBall.intersects(paddle) && extraBall.velocityY > 0 && extraBall.y < paddle.y + 15; if (extraBallPaddleCheck) { var paddleCenter = paddle.x; var ballRelativePosition = (extraBall.x - paddleCenter) / 100; if (reverseModeActive) { extraBall.velocityY = Math.abs(extraBall.velocityY); extraBall.y = paddle.y + 25; } else { extraBall.velocityY = -Math.abs(extraBall.velocityY); extraBall.y = paddle.y - 25; } extraBall.velocityX = ballRelativePosition * 8; } // Extra ball-brick collisions for (var i = bricks.length - 1; i >= 0; i--) { var brick = bricks[i]; if (!brick.destroyed && extraBall.intersects(brick)) { brick.destroy(); bricks.splice(i, 1); extraBall.velocityY = -extraBall.velocityY; break; } } } // Check win condition if (bricks.length === 0) { if (gameMode === 'endless') { // In endless mode, create new bricks createBricks(); LK.setScore(LK.getScore() + 500); // Bonus for completing a level } else { // Add score to leaderboard before you win if (LK.getScore() > 0) { addToLeaderboard(playerName, LK.getScore()); } LK.showYouWin(); gameState = 'menu'; LK.setTimeout(function () { askPlayerName(); }, 2000); } } };
===================================================================
--- original.js
+++ change.js
@@ -338,9 +338,18 @@
var playerNameContainer;
var leaderboardContainer;
var highScore = storage.highScore || 0;
var playerName = storage.playerName || '';
-var leaderboard = storage.leaderboard || [];
+// Reconstruct leaderboard from flattened storage data
+var leaderboard = [];
+var storedNames = storage.leaderboardNames || [];
+var storedScores = storage.leaderboardScores || [];
+for (var i = 0; i < storedNames.length && i < storedScores.length; i++) {
+ leaderboard.push({
+ name: storedNames[i],
+ score: storedScores[i]
+ });
+}
var nameInputActive = false;
// Create edge glow effect
function createEdgeGlow(color) {
// Create glow shapes for each edge
@@ -1713,9 +1722,10 @@
backButton.y = 350;
// Clear leaderboard button
var clearButton = leaderboardContainer.addChild(new MenuButton('Clear Scores', function () {
leaderboard = [];
- storage.leaderboard = leaderboard;
+ storage.leaderboardNames = [];
+ storage.leaderboardScores = [];
hideLeaderboard();
showLeaderboard();
}));
clearButton.y = 420;
@@ -1755,9 +1765,17 @@
});
if (leaderboard.length > 50) {
leaderboard = leaderboard.slice(0, 50);
}
- storage.leaderboard = leaderboard;
+ // Flatten leaderboard for storage - create separate arrays for names and scores
+ var leaderboardNames = [];
+ var leaderboardScores = [];
+ for (var i = 0; i < leaderboard.length; i++) {
+ leaderboardNames.push(leaderboard[i].name);
+ leaderboardScores.push(leaderboard[i].score);
+ }
+ storage.leaderboardNames = leaderboardNames;
+ storage.leaderboardScores = leaderboardScores;
}
// Show main menu on game start
askPlayerName();
// Create paddle