User prompt
Add a next page button for owner commands
User prompt
Add a gem shop βͺπ‘ Consider importing and using the following plugins: @upit/storage.v1
User prompt
Fix it
User prompt
Add a daily shop βͺπ‘ Consider importing and using the following plugins: @upit/storage.v1
User prompt
Add 10 more stuff to the shop βͺπ‘ Consider importing and using the following plugins: @upit/storage.v1
User prompt
Add a shop βͺπ‘ Consider importing and using the following plugins: @upit/storage.v1
User prompt
Add 13 owner commands
User prompt
Add 13 more owner commands
User prompt
Make owner commands on top
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'for (var x = 0; x <= level.length + 1000; x += 200) {' Line Number: 1501
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'if (levelData[currentLevel].shipMode) {' Line Number: 1482
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'if (levelData[currentLevel].shipMode) {' Line Number: 1484
User prompt
Add daily level βͺπ‘ Consider importing and using the following plugins: @upit/storage.v1
User prompt
Add 17 more levels in the next page
User prompt
Make level 51 start with a swing βͺπ‘ Consider importing and using the following plugins: @upit/tween.v1
User prompt
Ad coins for each level βͺπ‘ Consider importing and using the following plugins: @upit/storage.v1
User prompt
Add a swing βͺπ‘ Consider importing and using the following plugins: @upit/tween.v1
User prompt
Make the video so people know how to beat it
User prompt
Add a video button
User prompt
Make all levels different from each level
User prompt
Add owner commands button
User prompt
Make the speed more faster
User prompt
Make level 1 start with a ship
Code edit (1 edits merged)
Please save this source code
User prompt
Geometry Dash: 50 Level Challenge
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Checkpoint = Container.expand(function (x, y) { var self = Container.call(this); var checkpointGraphics = self.attachAsset('checkpoint', { anchorX: 0.5, anchorY: 1.0 }); self.x = x; self.y = y; self.activated = false; return self; }); var Coin = Container.expand(function (x, y) { var self = Container.call(this); var coinGraphics = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); self.x = x; self.y = y; self.collected = false; self.rotationSpeed = 0.05; self.update = function () { if (!self.collected) { coinGraphics.rotation += self.rotationSpeed; } }; return self; }); var Ground = Container.expand(function (x, y, width) { var self = Container.call(this); var groundGraphics = self.attachAsset('ground', { anchorX: 0, anchorY: 0 }); groundGraphics.width = width || 200; self.x = x; self.y = y; return self; }); var LevelButton = Container.expand(function (levelNum, x, y) { var self = Container.call(this); var buttonGraphics = self.attachAsset('levelButton', { anchorX: 0.5, anchorY: 0.5 }); self.levelNum = levelNum; self.x = x; self.y = y; self.locked = levelNum > 1 && !storage.completedLevels[levelNum - 1]; // Set button color based on status if (self.locked) { buttonGraphics.tint = 0x666666; } else if (storage.completedLevels[levelNum]) { buttonGraphics.tint = 0x00ff00; } // Level number text self.levelText = new Text2(levelNum.toString(), { size: 40, fill: 0xFFFFFF }); self.levelText.anchor.set(0.5, 0.3); self.addChild(self.levelText); // Coin count text var coinCount = storage.levelCoins[levelNum] || 0; var maxCoins = levelData[levelNum] ? levelData[levelNum].coins.length : 0; self.coinText = new Text2(coinCount + '/' + maxCoins, { size: 25, fill: 0xFFD700 }); self.coinText.anchor.set(0.5, 0.7); self.addChild(self.coinText); self.down = function (x, y, obj) { if (!self.locked) { currentLevel = self.levelNum; showGameplay(); } }; return self; }); var Platform = Container.expand(function (x, y, width) { var self = Container.call(this); var platformGraphics = self.attachAsset('platform', { anchorX: 0, anchorY: 0 }); platformGraphics.width = width || 200; self.x = x; self.y = y; return self; }); var Player = Container.expand(function () { var self = Container.call(this); self.isShipMode = false; self.playerGraphics = null; self.shipGraphics = null; self.setMode = function (isShip) { if (self.playerGraphics) { self.removeChild(self.playerGraphics); self.playerGraphics = null; } if (self.shipGraphics) { self.removeChild(self.shipGraphics); self.shipGraphics = null; } self.isShipMode = isShip; if (isShip) { self.shipGraphics = self.attachAsset('ship', { anchorX: 0.5, anchorY: 0.5 }); // Apply purchased ship color if (storage.shipColor) { self.shipGraphics.tint = storage.shipColor; } // Apply size reduction if (storage.smallSize) { self.shipGraphics.scaleX = 0.75; self.shipGraphics.scaleY = 0.75; } } else { self.playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 1.0 }); // Apply purchased player color if (storage.playerColor) { self.playerGraphics.tint = storage.playerColor; } // Apply size reduction if (storage.smallSize) { self.playerGraphics.scaleX = 0.75; self.playerGraphics.scaleY = 0.75; } } }; // Initialize with player mode self.setMode(false); self.velocityY = 0; self.isGrounded = false; self.isDead = false; self.isFlying = false; self.isSwinging = false; self.swingAnchor = null; self.swingAngle = 0; self.swingLength = 0; self.swingSpeed = 0; self.jump = function () { if (self.isShipMode) { if (!self.isDead) { self.isFlying = true; self.velocityY = -12; LK.getSound('jump').play(); } } else { if (self.isGrounded && !self.isDead) { var jumpPower = storage.jumpBoost ? -30 : -24; self.velocityY = jumpPower; self.isGrounded = false; LK.getSound('jump').play(); } } }; self.stopJump = function () { if (self.isShipMode) { self.isFlying = false; } else if (self.isSwinging) { // Release from swing var releaseVelX = Math.cos(self.swingAngle + Math.PI / 2) * self.swingSpeed * 0.8; var releaseVelY = Math.sin(self.swingAngle + Math.PI / 2) * self.swingSpeed * 0.8; self.velocityY = releaseVelY; self.releaseVelX = releaseVelX; self.isSwinging = false; if (self.swingAnchor) { self.swingAnchor.deactivateSwing(); self.swingAnchor = null; } } }; self.update = function () { if (self.isDead) return; // Trail effect if (storage.trail) { var trailParticle = LK.getAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); trailParticle.x = self.x; trailParticle.y = self.y; trailParticle.scaleX = 0.3; trailParticle.scaleY = 0.3; trailParticle.alpha = 0.6; trailParticle.tint = storage.playerColor || 0x00ff00; game.addChild(trailParticle); // Fade out trail particle tween(trailParticle, { alpha: 0, scaleX: 0, scaleY: 0 }, { duration: 500, onComplete: function onComplete() { game.removeChild(trailParticle); } }); } if (self.isSwinging) { // Swing physics var gravity = 0.8; var dampening = 0.995; // Apply gravity to swing speed var gravityForce = gravity * Math.cos(self.swingAngle); self.swingSpeed += gravityForce; self.swingSpeed *= dampening; // Update swing angle self.swingAngle += self.swingSpeed / self.swingLength; // Update player position based on swing self.x = self.swingAnchor.x + Math.cos(self.swingAngle) * self.swingLength; self.y = self.swingAnchor.y + Math.sin(self.swingAngle) * self.swingLength; // Update rope visual if exists if (self.swingAnchor.rope) { self.swingAnchor.rope.rotation = self.swingAngle; } } else if (self.isShipMode) { // Ship mode physics if (self.isFlying) { self.velocityY -= 2.5; } else { self.velocityY += 2.0; } // Limit ship velocity if (self.velocityY > 18) self.velocityY = 18; if (self.velocityY < -18) self.velocityY = -18; self.y += self.velocityY; // Ship ground collision if (self.y >= groundLevel - 20) { self.y = groundLevel - 20; self.velocityY = 0; } // Ship ceiling collision if (self.y <= 100) { self.y = 100; self.velocityY = 0; } } else { // Regular cube mode physics if (self.releaseVelX) { // Apply horizontal velocity from swing release self.x += self.releaseVelX; self.releaseVelX *= 0.95; // Decay horizontal velocity if (Math.abs(self.releaseVelX) < 0.5) { self.releaseVelX = 0; } } self.velocityY += 2.0; self.y += self.velocityY; // Ground collision if (self.y >= groundLevel) { self.y = groundLevel; self.velocityY = 0; self.isGrounded = true; self.releaseVelX = 0; // Stop horizontal movement on ground } } }; return self; }); var Spike = Container.expand(function (x, y) { var self = Container.call(this); var spikeGraphics = self.attachAsset('spike', { anchorX: 0.5, anchorY: 1.0 }); self.x = x; self.y = y; return self; }); var SwingAnchor = Container.expand(function (x, y) { var self = Container.call(this); var anchorGraphics = self.attachAsset('swingAnchor', { anchorX: 0.5, anchorY: 0.5 }); self.x = x; self.y = y; self.isActive = false; self.rope = null; self.activateSwing = function (player) { if (!self.isActive && !player.isSwinging) { self.isActive = true; player.isSwinging = true; player.swingAnchor = self; player.swingAngle = Math.atan2(player.y - self.y, player.x - self.x); player.swingLength = Math.sqrt(Math.pow(player.x - self.x, 2) + Math.pow(player.y - self.y, 2)); player.swingSpeed = 0; // Create visual rope self.rope = LK.getAsset('ground', { anchorX: 0, anchorY: 0.5 }); self.rope.width = player.swingLength; self.rope.height = 4; self.rope.tint = 0x8B4513; self.rope.x = self.x; self.rope.y = self.y; self.rope.rotation = self.swingAngle; game.addChild(self.rope); // Animate anchor activation tween(anchorGraphics, { scaleX: 1.5, scaleY: 1.5 }, { duration: 200, easing: tween.bounceOut }); } }; self.deactivateSwing = function () { self.isActive = false; if (self.rope) { game.removeChild(self.rope); self.rope = null; } tween(anchorGraphics, { scaleX: 1, scaleY: 1 }, { duration: 150 }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222222 }); /**** * Game Code ****/ // Game states var gameState = 'menu'; // 'menu' or 'playing' var currentLevel = 1; var maxLevels = 68; var groundLevel = 2400; var cameraX = 0; var scrollSpeed = 12; // Player variables var player; var playerStartX = 300; var playerStartY = groundLevel; // Level data var obstacles = []; var platforms = []; var grounds = []; var checkpoints = []; var swingAnchors = []; var coins = []; var currentCheckpoint = 0; var levelData = {}; // UI elements var levelButtons = []; var backButton; var levelCompleteText; var deathCount = 0; var godModeEnabled = false; var speedBoostEnabled = false; var debugInfoVisible = false; var debugText = null; // Storage initialization if (!storage.completedLevels) { storage.completedLevels = {}; } if (!storage.currentLevel) { storage.currentLevel = 1; } if (!storage.totalCoins) { storage.totalCoins = 0; } if (!storage.levelCoins) { storage.levelCoins = {}; } if (!storage.dailyLevelDate) { storage.dailyLevelDate = ''; } if (!storage.dailyLevelCompleted) { storage.dailyLevelCompleted = false; } if (!storage.dailyLevelCoins) { storage.dailyLevelCoins = 0; } // Shop storage initialization if (!storage.shopPurchases) { storage.shopPurchases = {}; } if (!storage.playerColor) { storage.playerColor = 0x00ff00; // Default green } if (!storage.shipColor) { storage.shipColor = 0x0088ff; // Default blue } if (!storage.speedMultiplier) { storage.speedMultiplier = 1.0; } if (!storage.coinMagnet) { storage.coinMagnet = false; } if (!storage.checkpoint) { storage.checkpoint = false; } if (!storage.jumpBoost) { storage.jumpBoost = false; } if (!storage.shield) { storage.shield = false; } if (!storage.smallSize) { storage.smallSize = false; } if (!storage.trail) { storage.trail = false; } if (!storage.shieldUsed) { storage.shieldUsed = false; } // Daily shop storage initialization if (!storage.dailyShopDate) { storage.dailyShopDate = ''; } if (!storage.dailyShopItems) { storage.dailyShopItems = []; } if (!storage.dailyShopPurchases) { storage.dailyShopPurchases = {}; } // Generate daily level based on current date function generateDailyLevel() { var today = new Date(); var dateString = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate(); // Check if daily level needs to be regenerated if (storage.dailyLevelDate !== dateString) { storage.dailyLevelDate = dateString; storage.dailyLevelCompleted = false; storage.dailyLevelCoins = 0; } // Generate daily level using date as seed for consistency var dayOfYear = Math.floor((today - new Date(today.getFullYear(), 0, 0)) / (1000 * 60 * 60 * 24)); var seed = dayOfYear + today.getFullYear() * 365; levelData['daily'] = { spikes: [], platforms: [], checkpoints: [], swingAnchors: [], coins: [], length: 3000, shipMode: seed % 3 === 0 // Ship mode every 3rd type of pattern }; // Generate pattern based on seed var patternType = seed % 5; if (patternType === 0) { // Spike gauntlet for (var i = 0; i < 8; i++) { levelData['daily'].spikes.push({ x: 800 + i * 300, y: groundLevel }); if (i % 2 === 1) { levelData['daily'].spikes.push({ x: 840 + i * 300, y: groundLevel }); } } } else if (patternType === 1) { // Platform jumps with swings for (var i = 0; i < 6; i++) { levelData['daily'].platforms.push({ x: 700 + i * 400, y: groundLevel - 120, width: 120 }); levelData['daily'].spikes.push({ x: 820 + i * 400, y: groundLevel - 120 }); if (i < 5) { levelData['daily'].swingAnchors.push({ x: 1000 + i * 400, y: groundLevel - 250 }); } } } else if (patternType === 2) { // Mixed chaos for (var i = 0; i < 10; i++) { if (i % 3 === 0) { levelData['daily'].platforms.push({ x: 700 + i * 250, y: groundLevel - 100, width: 100 }); } else { levelData['daily'].spikes.push({ x: 700 + i * 250, y: groundLevel }); } } } else if (patternType === 3) { // Staircase challenge for (var i = 0; i < 7; i++) { levelData['daily'].platforms.push({ x: 700 + i * 300, y: groundLevel - i * 50, width: 150 }); levelData['daily'].spikes.push({ x: 850 + i * 300, y: groundLevel - i * 50 }); } } else { // Speed run for (var i = 0; i < 12; i++) { levelData['daily'].spikes.push({ x: 700 + i * 200, y: groundLevel }); if (i % 4 === 3) { levelData['daily'].spikes.push({ x: 720 + i * 200, y: groundLevel }); } } } // Add daily coins (always 5 coins for daily level) for (var i = 0; i < 5; i++) { levelData['daily'].coins.push({ x: 600 + (i + 1) * (levelData['daily'].length / 6), y: groundLevel - 100 - i % 3 * 40 }); } // Add checkpoints levelData['daily'].checkpoints.push({ x: 1500, y: groundLevel }); levelData['daily'].checkpoints.push({ x: 2250, y: groundLevel }); } // Initialize level data with unique patterns for each level function initializeLevelData() { for (var i = 1; i <= 68; i++) { levelData[i] = { spikes: [], platforms: [], checkpoints: [], swingAnchors: [], coins: [], length: 2500 + i * 150, shipMode: false }; // Define unique patterns for each level if (i === 1) { // Level 1: Ship mode tutorial - simple gaps levelData[i].shipMode = true; levelData[i].length = 2000; for (var s = 0; s < 3; s++) { levelData[i].spikes.push({ x: 1000 + s * 600, y: groundLevel }); levelData[i].spikes.push({ x: 1000 + s * 600, y: groundLevel - 300 }); // Add coins between spikes if (s < 2) { levelData[i].coins.push({ x: 1300 + s * 600, y: groundLevel - 150 }); } } } else if (i === 2) { // Level 2: Single spike jumps for (var s = 0; s < 4; s++) { levelData[i].spikes.push({ x: 800 + s * 400, y: groundLevel }); // Add coin above each spike levelData[i].coins.push({ x: 800 + s * 400, y: groundLevel - 100 }); } } else if (i === 3) { // Level 3: Double spike jumps for (var s = 0; s < 3; s++) { levelData[i].spikes.push({ x: 800 + s * 500, y: groundLevel }); levelData[i].spikes.push({ x: 840 + s * 500, y: groundLevel }); } } else if (i === 4) { // Level 4: Platform jumps with swing anchors for (var p = 0; p < 4; p++) { levelData[i].platforms.push({ x: 800 + p * 400, y: groundLevel - 120, width: 150 }); levelData[i].spikes.push({ x: 975 + p * 400, y: groundLevel - 120 }); // Add swing anchor between platforms if (p < 3) { levelData[i].swingAnchors.push({ x: 1075 + p * 400, y: groundLevel - 200 }); } } } else if (i === 5) { // Level 5: Spike clusters for (var c = 0; c < 3; c++) { for (var s = 0; s < 3; s++) { levelData[i].spikes.push({ x: 800 + c * 600 + s * 50, y: groundLevel }); } // Add coin above each cluster levelData[i].coins.push({ x: 850 + c * 600, y: groundLevel - 120 }); } } else if (i >= 6 && i <= 10) { // Levels 6-10: Mixed patterns with increasing difficulty var patternType = (i - 6) % 3; if (patternType === 0) { // Alternating single and double spikes for (var s = 0; s < 5; s++) { levelData[i].spikes.push({ x: 700 + s * 350, y: groundLevel }); if (s % 2 === 1) { levelData[i].spikes.push({ x: 740 + s * 350, y: groundLevel }); } // Add coins between spikes if (s < 4) { levelData[i].coins.push({ x: 875 + s * 350, y: groundLevel - 80 }); } } } else if (patternType === 1) { // Platform hopping for (var p = 0; p < 4; p++) { var height = groundLevel - 100 - p % 2 * 80; levelData[i].platforms.push({ x: 800 + p * 350, y: height, width: 120 }); levelData[i].spikes.push({ x: 920 + p * 350, y: height }); } } else { // Triple spike jumps for (var t = 0; t < 3; t++) { for (var s = 0; s < 3; s++) { levelData[i].spikes.push({ x: 800 + t * 500 + s * 45, y: groundLevel }); } } } } else if (i >= 11 && i <= 20) { // Levels 11-20: Advanced patterns var complexity = i - 10; if (i % 4 === 1) { // Staircase platforms with spikes for (var st = 0; st < 5; st++) { var stairY = groundLevel - st * 60; levelData[i].platforms.push({ x: 700 + st * 300, y: stairY, width: 150 }); levelData[i].spikes.push({ x: 850 + st * 300, y: stairY }); } } else if (i % 4 === 2) { // Ship mode level levelData[i].shipMode = true; for (var s = 0; s < 6; s++) { levelData[i].spikes.push({ x: 800 + s * 300, y: groundLevel }); levelData[i].spikes.push({ x: 800 + s * 300, y: groundLevel - 250 }); } } else if (i % 4 === 3) { // Maze-like platforms with swing challenges for (var m = 0; m < 4; m++) { var upper = m % 2 === 0; var platY = upper ? groundLevel - 200 : groundLevel - 100; levelData[i].platforms.push({ x: 700 + m * 400, y: platY, width: 200 }); levelData[i].spikes.push({ x: 800 + m * 400, y: platY }); // Add swing anchors for advanced navigation if (m < 3) { levelData[i].swingAnchors.push({ x: 900 + m * 400, y: groundLevel - 300 }); } } } else { // Rapid fire spikes for (var r = 0; r < 8; r++) { levelData[i].spikes.push({ x: 700 + r * 200, y: groundLevel }); } } } else if (i >= 21 && i <= 35) { // Levels 21-35: Expert patterns if (i % 5 === 1) { // Multi-level platforms for (var ml = 0; ml < 3; ml++) { for (var level = 0; level < 3; level++) { var platY = groundLevel - 80 - level * 70; levelData[i].platforms.push({ x: 700 + ml * 500 + level * 100, y: platY, width: 100 }); if (level < 2) { levelData[i].spikes.push({ x: 750 + ml * 500 + level * 100, y: platY }); } } // Add challenging coin placement levelData[i].coins.push({ x: 850 + ml * 500, y: groundLevel - 250 }); } } else if (i % 5 === 2) { // Ship maze levelData[i].shipMode = true; for (var sm = 0; sm < 5; sm++) { levelData[i].spikes.push({ x: 800 + sm * 250, y: groundLevel }); levelData[i].spikes.push({ x: 825 + sm * 250, y: groundLevel - 150 }); levelData[i].spikes.push({ x: 850 + sm * 250, y: groundLevel - 300 }); } } else if (i % 5 === 3) { // Wave pattern spikes for (var w = 0; w < 8; w++) { var wave = Math.sin(w * 0.8) * 100; levelData[i].spikes.push({ x: 700 + w * 150, y: groundLevel + wave }); } } else if (i % 5 === 4) { // Tight platform sequences for (var tp = 0; tp < 6; tp++) { levelData[i].platforms.push({ x: 700 + tp * 250, y: groundLevel - 120, width: 80 }); levelData[i].spikes.push({ x: 780 + tp * 250, y: groundLevel - 120 }); levelData[i].spikes.push({ x: 950 + tp * 250, y: groundLevel }); } } else { // Spike walls for (var sw = 0; sw < 4; sw++) { for (var wall = 0; wall < 4; wall++) { levelData[i].spikes.push({ x: 800 + sw * 400, y: groundLevel - wall * 50 }); } } } } else { // Levels 36-50: Master difficulty var masterPattern = (i - 35) % 8; if (masterPattern === 0) { // Ultimate ship challenge levelData[i].shipMode = true; for (var uc = 0; uc < 10; uc++) { levelData[i].spikes.push({ x: 600 + uc * 180, y: groundLevel }); levelData[i].spikes.push({ x: 620 + uc * 180, y: groundLevel - 100 }); levelData[i].spikes.push({ x: 640 + uc * 180, y: groundLevel - 200 }); levelData[i].spikes.push({ x: 660 + uc * 180, y: groundLevel - 300 }); // Add very challenging coins if (uc % 3 === 0) { levelData[i].coins.push({ x: 630 + uc * 180, y: groundLevel - 150 }); } } } else if (masterPattern === 1) { // Precision platform jumps for (var pp = 0; pp < 8; pp++) { levelData[i].platforms.push({ x: 700 + pp * 200, y: groundLevel - 60 - pp % 3 * 40, width: 60 }); levelData[i].spikes.push({ x: 730 + pp * 200, y: groundLevel - 60 - pp % 3 * 40 }); } } else if (masterPattern === 2) { // Chaos mode - random but beatable for (var ch = 0; ch < 12; ch++) { if (ch % 3 === 0) { levelData[i].platforms.push({ x: 600 + ch * 150, y: groundLevel - 100, width: 100 }); } else { levelData[i].spikes.push({ x: 600 + ch * 150, y: groundLevel }); } } } else if (masterPattern === 3) { // Double layer platforms for (var dl = 0; dl < 5; dl++) { levelData[i].platforms.push({ x: 700 + dl * 300, y: groundLevel - 100, width: 120 }); levelData[i].platforms.push({ x: 760 + dl * 300, y: groundLevel - 180, width: 120 }); levelData[i].spikes.push({ x: 820 + dl * 300, y: groundLevel - 100 }); levelData[i].spikes.push({ x: 880 + dl * 300, y: groundLevel - 180 }); } } else if (masterPattern === 4) { // Speed run spikes for (var sr = 0; sr < 15; sr++) { levelData[i].spikes.push({ x: 600 + sr * 120, y: groundLevel }); if (sr % 3 === 2) { levelData[i].spikes.push({ x: 620 + sr * 120, y: groundLevel }); } } } else if (masterPattern === 5) { // Alternating ship/cube sections if (i % 2 === 0) { levelData[i].shipMode = true; } for (var as = 0; as < 8; as++) { levelData[i].spikes.push({ x: 700 + as * 200, y: groundLevel }); if (levelData[i].shipMode) { levelData[i].spikes.push({ x: 720 + as * 200, y: groundLevel - 200 }); } } } else if (masterPattern === 6) { // Extreme precision for (var ep = 0; ep < 6; ep++) { levelData[i].platforms.push({ x: 700 + ep * 250, y: groundLevel - 90, width: 50 }); levelData[i].spikes.push({ x: 725 + ep * 250, y: groundLevel - 90 }); levelData[i].spikes.push({ x: 750 + ep * 250, y: groundLevel - 90 }); levelData[i].spikes.push({ x: 950 + ep * 250, y: groundLevel }); } } else { // Final boss level patterns for (var fb = 0; fb < 5; fb++) { // Complex multi-height obstacles for (var h = 0; h < 4; h++) { if ((fb + h) % 2 === 0) { levelData[i].spikes.push({ x: 700 + fb * 300 + h * 40, y: groundLevel - h * 60 }); } else { levelData[i].platforms.push({ x: 700 + fb * 300 + h * 40, y: groundLevel - h * 60, width: 80 }); } } } } } // Special level 51 pattern with starting swing if (i === 51) { // Start with a swing anchor at the beginning levelData[i].swingAnchors.push({ x: 500, y: groundLevel - 150 }); // Add platform to swing to levelData[i].platforms.push({ x: 700, y: groundLevel - 100, width: 120 }); // Add spikes after platform for (var s51 = 0; s51 < 5; s51++) { levelData[i].spikes.push({ x: 900 + s51 * 200, y: groundLevel }); } // Add more swing anchors throughout level levelData[i].swingAnchors.push({ x: 1200, y: groundLevel - 200 }); levelData[i].swingAnchors.push({ x: 1600, y: groundLevel - 180 }); // Add challenging platform sequence for (var p51 = 0; p51 < 4; p51++) { levelData[i].platforms.push({ x: 1800 + p51 * 300, y: groundLevel - 120 - p51 % 2 * 60, width: 100 }); levelData[i].spikes.push({ x: 1850 + p51 * 300, y: groundLevel - 120 - p51 % 2 * 60 }); } } // Levels 52-68: Next page ultra-hard levels if (i >= 52 && i <= 68) { var ultraPattern = (i - 52) % 17; if (ultraPattern === 0) { // Level 52: Moving spike walls for (var msw = 0; msw < 6; msw++) { for (var wall = 0; wall < 5; wall++) { levelData[i].spikes.push({ x: 800 + msw * 350, y: groundLevel - wall * 45 }); } // Add narrow safe passage levelData[i].platforms.push({ x: 950 + msw * 350, y: groundLevel - 150, width: 60 }); } } else if (ultraPattern === 1) { // Level 53: Ship tunnel nightmare levelData[i].shipMode = true; for (var stn = 0; stn < 12; stn++) { levelData[i].spikes.push({ x: 700 + stn * 150, y: groundLevel }); levelData[i].spikes.push({ x: 725 + stn * 150, y: groundLevel - 80 }); levelData[i].spikes.push({ x: 750 + stn * 150, y: groundLevel - 160 }); levelData[i].spikes.push({ x: 775 + stn * 150, y: groundLevel - 240 }); } } else if (ultraPattern === 2) { // Level 54: Triple layer platform maze for (var tlm = 0; tlm < 5; tlm++) { // Bottom layer levelData[i].platforms.push({ x: 700 + tlm * 400, y: groundLevel - 80, width: 80 }); levelData[i].spikes.push({ x: 780 + tlm * 400, y: groundLevel - 80 }); // Middle layer levelData[i].platforms.push({ x: 850 + tlm * 400, y: groundLevel - 160, width: 80 }); levelData[i].spikes.push({ x: 930 + tlm * 400, y: groundLevel - 160 }); // Top layer levelData[i].platforms.push({ x: 1000 + tlm * 400, y: groundLevel - 240, width: 80 }); levelData[i].spikes.push({ x: 1080 + tlm * 400, y: groundLevel - 240 }); } } else if (ultraPattern === 3) { // Level 55: Swing chain challenge for (var scc = 0; scc < 8; scc++) { levelData[i].swingAnchors.push({ x: 600 + scc * 250, y: groundLevel - 200 - scc % 3 * 50 }); // Add spikes below each swing point levelData[i].spikes.push({ x: 575 + scc * 250, y: groundLevel }); levelData[i].spikes.push({ x: 625 + scc * 250, y: groundLevel }); } } else if (ultraPattern === 4) { // Level 56: Rapid fire precision for (var rfp = 0; rfp < 20; rfp++) { levelData[i].spikes.push({ x: 600 + rfp * 80, y: groundLevel }); if (rfp % 4 === 3) { levelData[i].spikes.push({ x: 620 + rfp * 80, y: groundLevel }); levelData[i].spikes.push({ x: 640 + rfp * 80, y: groundLevel }); } } } else if (ultraPattern === 5) { // Level 57: Alternating cube/ship sections for (var acs = 0; acs < 8; acs++) { if (acs < 4) { // Cube section levelData[i].spikes.push({ x: 700 + acs * 200, y: groundLevel }); levelData[i].platforms.push({ x: 800 + acs * 200, y: groundLevel - 100, width: 100 }); } else { // Ship section indicators (spikes arranged for ship mode) levelData[i].spikes.push({ x: 700 + acs * 200, y: groundLevel }); levelData[i].spikes.push({ x: 720 + acs * 200, y: groundLevel - 150 }); } } if (i % 2 === 1) { levelData[i].shipMode = true; } } else if (ultraPattern === 6) { // Level 58: Micro platforms for (var mp = 0; mp < 10; mp++) { levelData[i].platforms.push({ x: 700 + mp * 180, y: groundLevel - 100 - mp % 4 * 30, width: 40 }); levelData[i].spikes.push({ x: 740 + mp * 180, y: groundLevel - 100 - mp % 4 * 30 }); levelData[i].spikes.push({ x: 880 + mp * 180, y: groundLevel }); } } else if (ultraPattern === 7) { // Level 59: Ceiling and floor spikes levelData[i].shipMode = true; for (var cfs = 0; cfs < 10; cfs++) { levelData[i].spikes.push({ x: 700 + cfs * 150, y: groundLevel }); levelData[i].spikes.push({ x: 725 + cfs * 150, y: groundLevel - 300 }); // Create narrow safe corridor if (cfs % 3 === 1) { levelData[i].coins.push({ x: 712 + cfs * 150, y: groundLevel - 150 }); } } } else if (ultraPattern === 8) { // Level 60: Swing through spike field for (var stsf = 0; stsf < 6; stsf++) { levelData[i].swingAnchors.push({ x: 700 + stsf * 300, y: groundLevel - 250 }); // Dense spike field below for (var sf = 0; sf < 5; sf++) { levelData[i].spikes.push({ x: 600 + stsf * 300 + sf * 50, y: groundLevel }); levelData[i].spikes.push({ x: 625 + stsf * 300 + sf * 50, y: groundLevel - 60 }); } } } else if (ultraPattern === 9) { // Level 61: Stairway to hell for (var sth = 0; sth < 8; sth++) { var stairHeight = groundLevel - sth * 40; levelData[i].platforms.push({ x: 700 + sth * 150, y: stairHeight, width: 70 }); levelData[i].spikes.push({ x: 770 + sth * 150, y: stairHeight }); levelData[i].spikes.push({ x: 850 + sth * 150, y: groundLevel }); } } else if (ultraPattern === 10) { // Level 62: Ship slalom levelData[i].shipMode = true; for (var ss = 0; ss < 15; ss++) { var slalomY = groundLevel - 150 + Math.sin(ss * 0.8) * 100; levelData[i].spikes.push({ x: 700 + ss * 120, y: slalomY }); levelData[i].spikes.push({ x: 720 + ss * 120, y: slalomY + 50 }); } } else if (ultraPattern === 11) { // Level 63: Platform chains for (var pc = 0; pc < 6; pc++) { for (var chain = 0; chain < 4; chain++) { levelData[i].platforms.push({ x: 700 + pc * 350 + chain * 70, y: groundLevel - 80 - chain * 60, width: 50 }); if (chain < 3) { levelData[i].spikes.push({ x: 725 + pc * 350 + chain * 70, y: groundLevel - 80 - chain * 60 }); } } } } else if (ultraPattern === 12) { // Level 64: Double swing challenge for (var dsc = 0; dsc < 5; dsc++) { levelData[i].swingAnchors.push({ x: 700 + dsc * 400, y: groundLevel - 200 }); levelData[i].swingAnchors.push({ x: 900 + dsc * 400, y: groundLevel - 180 }); // Spike barriers for (var sb = 0; sb < 6; sb++) { levelData[i].spikes.push({ x: 650 + dsc * 400 + sb * 40, y: groundLevel }); } } } else if (ultraPattern === 13) { // Level 65: Speed demon for (var sd = 0; sd < 25; sd++) { levelData[i].spikes.push({ x: 600 + sd * 60, y: groundLevel }); if (sd % 5 === 2) { levelData[i].spikes.push({ x: 615 + sd * 60, y: groundLevel }); levelData[i].spikes.push({ x: 630 + sd * 60, y: groundLevel }); } } } else if (ultraPattern === 14) { // Level 66: Ship maze finale levelData[i].shipMode = true; for (var smf = 0; smf < 8; smf++) { levelData[i].spikes.push({ x: 700 + smf * 200, y: groundLevel }); levelData[i].spikes.push({ x: 720 + smf * 200, y: groundLevel - 80 }); levelData[i].spikes.push({ x: 740 + smf * 200, y: groundLevel - 160 }); levelData[i].spikes.push({ x: 760 + smf * 200, y: groundLevel - 240 }); levelData[i].spikes.push({ x: 780 + smf * 200, y: groundLevel - 320 }); } } else if (ultraPattern === 15) { // Level 67: Ultimate precision test for (var upt = 0; upt < 12; upt++) { levelData[i].platforms.push({ x: 700 + upt * 150, y: groundLevel - 80 - upt % 3 * 80, width: 30 }); levelData[i].spikes.push({ x: 730 + upt * 150, y: groundLevel - 80 - upt % 3 * 80 }); levelData[i].spikes.push({ x: 850 + upt * 150, y: groundLevel }); } } else { // Level 68: Final boss gauntlet for (var fbg = 0; fbg < 6; fbg++) { // Multi-height spike walls for (var wall = 0; wall < 6; wall++) { levelData[i].spikes.push({ x: 700 + fbg * 400, y: groundLevel - wall * 50 }); } // Narrow platform escape levelData[i].platforms.push({ x: 750 + fbg * 400, y: groundLevel - 200, width: 40 }); // Swing anchor for advanced navigation levelData[i].swingAnchors.push({ x: 850 + fbg * 400, y: groundLevel - 300 }); // More spikes after swing for (var afterSpike = 0; afterSpike < 4; afterSpike++) { levelData[i].spikes.push({ x: 900 + fbg * 400 + afterSpike * 30, y: groundLevel }); } } } } // Add default coins if none were added yet if (levelData[i].coins.length === 0) { var coinCount = Math.max(2, Math.floor(i / 5) + 1); for (var c = 0; c < coinCount; c++) { levelData[i].coins.push({ x: 600 + c * (levelData[i].length / (coinCount + 1)), y: groundLevel - 80 - c % 3 * 40 }); } } // Add checkpoints based on level length var checkpointCount = Math.max(1, Math.floor(levelData[i].length / 800)); for (var k = 1; k <= checkpointCount; k++) { levelData[i].checkpoints.push({ x: k * (levelData[i].length / (checkpointCount + 1)), y: groundLevel }); } } } // UI Setup function setupUI() { // Score display var scoreText = new Text2('Level: ' + currentLevel, { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); scoreText.x = 120; scoreText.y = 50; LK.gui.topLeft.addChild(scoreText); // Coin counter var coinText = new Text2('Coins: ' + storage.totalCoins, { size: 50, fill: 0xFFD700 }); coinText.anchor.set(0, 0); coinText.x = 120; coinText.y = 120; LK.gui.topLeft.addChild(coinText); } // Level selection menu function showLevelMenu() { gameState = 'menu'; game.removeChildren(); levelButtons = []; // Title var titleText = new Text2('Geometry Dash: 50 Levels', { size: 80, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0); titleText.x = 1024; titleText.y = 200; game.addChild(titleText); // Create level buttons in grid var buttonsPerRow = 5; var buttonSpacing = 220; var startX = 1024 - (buttonsPerRow - 1) * buttonSpacing / 2; var startY = 480; for (var i = 1; i <= maxLevels; i++) { var row = Math.floor((i - 1) / buttonsPerRow); var col = (i - 1) % buttonsPerRow; var buttonX = startX + col * buttonSpacing; var buttonY = startY + row * 150; var levelBtn = game.addChild(new LevelButton(i, buttonX, buttonY)); levelButtons.push(levelBtn); } // Daily level button var dailyButton = LK.getAsset('levelButton', { anchorX: 0.5, anchorY: 0.5 }); dailyButton.x = 1024; dailyButton.y = startY + Math.ceil(maxLevels / buttonsPerRow) * 150 + 250; dailyButton.tint = storage.dailyLevelCompleted ? 0x00ff00 : 0xff6600; dailyButton.scaleX = 1.2; dailyButton.scaleY = 1.2; game.addChild(dailyButton); var dailyText = new Text2('DAILY', { size: 35, fill: 0xFFFFFF }); dailyText.anchor.set(0.5, 0.3); dailyText.x = dailyButton.x; dailyText.y = dailyButton.y; game.addChild(dailyText); var dailyCoinText = new Text2(storage.dailyLevelCoins + '/5', { size: 25, fill: 0xFFD700 }); dailyCoinText.anchor.set(0.5, 0.7); dailyCoinText.x = dailyButton.x; dailyCoinText.y = dailyButton.y; game.addChild(dailyCoinText); dailyButton.down = function (x, y, obj) { currentLevel = 'daily'; showGameplay(); }; // Video button var videoButton = LK.getAsset('levelButton', { anchorX: 0.5, anchorY: 0.5 }); videoButton.x = 1024; videoButton.y = startY + Math.ceil(maxLevels / buttonsPerRow) * 150 + 400; videoButton.tint = 0x9933ff; game.addChild(videoButton); var videoText = new Text2('Video', { size: 40, fill: 0xFFFFFF }); videoText.anchor.set(0.5, 0.5); videoText.x = videoButton.x; videoText.y = videoButton.y; game.addChild(videoText); videoButton.down = function (x, y, obj) { showVideoTutorial(); }; // Shop button var shopButton = LK.getAsset('levelButton', { anchorX: 0.5, anchorY: 0.5 }); shopButton.x = 924; shopButton.y = 300; shopButton.tint = 0x00aaff; game.addChild(shopButton); var shopText = new Text2('Shop', { size: 40, fill: 0xFFFFFF }); shopText.anchor.set(0.5, 0.5); shopText.x = shopButton.x; shopText.y = shopButton.y; game.addChild(shopText); shopButton.down = function (x, y, obj) { showShop(); }; // Daily Shop button var dailyShopButton = LK.getAsset('levelButton', { anchorX: 0.5, anchorY: 0.5 }); dailyShopButton.x = 1124; dailyShopButton.y = 300; dailyShopButton.tint = 0xff6600; game.addChild(dailyShopButton); var dailyShopText = new Text2('Daily Shop', { size: 32, fill: 0xFFFFFF }); dailyShopText.anchor.set(0.5, 0.5); dailyShopText.x = dailyShopButton.x; dailyShopText.y = dailyShopButton.y; game.addChild(dailyShopText); dailyShopButton.down = function (x, y, obj) { showDailyShop(); }; // Owner commands button (moved down) var ownerButton = LK.getAsset('levelButton', { anchorX: 0.5, anchorY: 0.5 }); ownerButton.x = 1024; ownerButton.y = 450; ownerButton.tint = 0xffaa00; game.addChild(ownerButton); var ownerText = new Text2('Owner', { size: 40, fill: 0xFFFFFF }); ownerText.anchor.set(0.5, 0.5); ownerText.x = ownerButton.x; ownerText.y = ownerButton.y; game.addChild(ownerText); ownerButton.down = function (x, y, obj) { showOwnerCommands(); }; } // Show gameplay function showGameplay() { gameState = 'playing'; game.removeChildren(); // Reset camera cameraX = 0; currentCheckpoint = 0; deathCount = 0; // Reset shield for new level storage.shieldUsed = false; // Create player player = game.addChild(new Player()); player.x = playerStartX; player.y = playerStartY; // Set ship mode based on level data if (levelData[currentLevel] && levelData[currentLevel].shipMode) { player.setMode(true); player.y = groundLevel - 200; // Start ship higher up } else { player.setMode(false); } // Load current level loadLevel(currentLevel); } // Load level obstacles function loadLevel(levelNum) { obstacles = []; platforms = []; grounds = []; checkpoints = []; swingAnchors = []; coins = []; var level = levelData[levelNum]; if (!level) { // If level data doesn't exist, create a basic level level = { spikes: [], platforms: [], checkpoints: [], swingAnchors: [], coins: [], length: 3000, shipMode: false }; } // Create ground segments for (var x = 0; x <= level.length + 1000; x += 200) { var ground = game.addChild(new Ground(x, groundLevel, 200)); grounds.push(ground); } // Create spikes for (var i = 0; i < level.spikes.length; i++) { var spikeData = level.spikes[i]; var spike = game.addChild(new Spike(spikeData.x, spikeData.y)); obstacles.push(spike); } // Create platforms for (var j = 0; j < level.platforms.length; j++) { var platformData = level.platforms[j]; var platform = game.addChild(new Platform(platformData.x, platformData.y, platformData.width)); platforms.push(platform); } // Create checkpoints for (var k = 0; k < level.checkpoints.length; k++) { var checkpointData = level.checkpoints[k]; var checkpoint = game.addChild(new Checkpoint(checkpointData.x, checkpointData.y)); checkpoints.push(checkpoint); } // Create swing anchors for (var s = 0; s < level.swingAnchors.length; s++) { var anchorData = level.swingAnchors[s]; var swingAnchor = game.addChild(new SwingAnchor(anchorData.x, anchorData.y)); swingAnchors.push(swingAnchor); } // Create coins for (var c = 0; c < level.coins.length; c++) { var coinData = level.coins[c]; var coin = game.addChild(new Coin(coinData.x, coinData.y)); coins.push(coin); } } // Handle player death function handlePlayerDeath() { if (player.isDead || godModeEnabled) return; // Check shield protection if (storage.shield && !storage.shieldUsed) { storage.shieldUsed = true; LK.effects.flashScreen(0x00ffff, 300); LK.effects.flashObject(player, 0x00ffff, 1000); return; // Shield absorbs hit } player.isDead = true; deathCount++; LK.effects.flashScreen(0xff0000, 500); LK.getSound('death').play(); // Respawn after delay LK.setTimeout(function () { respawnPlayer(); }, 1000); } // Respawn player at checkpoint function respawnPlayer() { player.isDead = false; player.velocityY = 0; player.isGrounded = false; if (currentCheckpoint > 0 && checkpoints[currentCheckpoint - 1]) { player.x = checkpoints[currentCheckpoint - 1].x; cameraX = checkpoints[currentCheckpoint - 1].x - 400; } else { player.x = playerStartX; cameraX = 0; } player.y = groundLevel; } // Handle level completion function completeLevel() { if (currentLevel === 'daily') { storage.dailyLevelCompleted = true; } else { storage.completedLevels[currentLevel] = true; } LK.getSound('complete').play(); LK.effects.flashScreen(0x00ff00, 1000); // Show completion message var completeText = new Text2('Level Complete!', { size: 100, fill: 0x00FF00 }); completeText.anchor.set(0.5, 0.5); completeText.x = 1024; completeText.y = 1366; game.addChild(completeText); // Return to menu after delay LK.setTimeout(function () { showLevelMenu(); }, 2000); } // Input handling game.down = function (x, y, obj) { if (gameState === 'playing' && player && !player.isDead) { player.jump(); } }; game.up = function (x, y, obj) { if (gameState === 'playing' && player && !player.isDead) { player.stopJump(); } }; // Main game loop game.update = function () { if (gameState !== 'playing' || !player || player.isDead) return; // Auto-scroll camera with speed multiplier var currentScrollSpeed = scrollSpeed * (storage.speedMultiplier || 1.0); cameraX += currentScrollSpeed; player.x += currentScrollSpeed; // Update camera position var targetCameraX = player.x - 400; if (targetCameraX > cameraX) { cameraX = targetCameraX; } // Position all game objects relative to camera game.x = -cameraX; // Check obstacle collisions for (var i = 0; i < obstacles.length; i++) { var obstacle = obstacles[i]; if (player.intersects(obstacle)) { handlePlayerDeath(); break; } } // Check platform collisions (simple top collision) for (var j = 0; j < platforms.length; j++) { var platform = platforms[j]; if (player.intersects(platform) && player.velocityY > 0) { var playerBottom = player.y; var platformTop = platform.y; if (playerBottom >= platformTop && playerBottom <= platformTop + 20) { player.y = platformTop; player.velocityY = 0; player.isGrounded = true; } } } // Check checkpoint activation for (var k = 0; k < checkpoints.length; k++) { var checkpoint = checkpoints[k]; if (!checkpoint.activated && player.intersects(checkpoint)) { checkpoint.activated = true; currentCheckpoint = k + 1; LK.effects.flashObject(checkpoint, 0x00ffff, 500); } } // Check swing anchor activation for (var s = 0; s < swingAnchors.length; s++) { var anchor = swingAnchors[s]; if (!anchor.isActive && !player.isSwinging && player.intersects(anchor)) { var distance = Math.sqrt(Math.pow(player.x - anchor.x, 2) + Math.pow(player.y - anchor.y, 2)); if (distance < 80) { // Activation range anchor.activateSwing(player); break; } } } // Check coin collection for (var c = 0; c < coins.length; c++) { var coin = coins[c]; // Coin magnet effect if (!coin.collected && storage.coinMagnet) { var coinDistance = Math.sqrt(Math.pow(player.x - coin.x, 2) + Math.pow(player.y - coin.y, 2)); if (coinDistance < 150) { // Magnet range // Move coin towards player var magnetForce = 8; var dirX = (player.x - coin.x) / coinDistance; var dirY = (player.y - coin.y) / coinDistance; coin.x += dirX * magnetForce; coin.y += dirY * magnetForce; } } if (!coin.collected && player.intersects(coin)) { coin.collected = true; coin.visible = false; storage.totalCoins++; // Update level-specific coin tracking if (currentLevel === 'daily') { storage.dailyLevelCoins++; } else { if (!storage.levelCoins[currentLevel]) { storage.levelCoins[currentLevel] = 0; } storage.levelCoins[currentLevel]++; } // Play coin sound and visual effect LK.getSound('coin').play(); LK.effects.flashObject(coin, 0xFFD700, 300); // Update coin counter var coinTexts = LK.gui.topLeft.children; for (var t = 0; t < coinTexts.length; t++) { if (coinTexts[t].text && coinTexts[t].text.indexOf('Coins:') === 0) { coinTexts[t].setText('Coins: ' + storage.totalCoins); break; } } } } // Check level completion var levelLength = levelData[currentLevel] ? levelData[currentLevel].length : 3000; if (player.x >= levelLength) { completeLevel(); } // Check if player fell off screen if (player.y > 2800) { handlePlayerDeath(); } // Update debug info if (debugInfoVisible && debugText) { var debugInfo = 'X: ' + Math.floor(player.x) + '\nY: ' + Math.floor(player.y) + '\nVelocity Y: ' + Math.floor(player.velocityY) + '\nCheckpoint: ' + currentCheckpoint + '\nDeaths: ' + deathCount + '\nGod Mode: ' + (godModeEnabled ? 'ON' : 'OFF') + '\nSpeed Boost: ' + (speedBoostEnabled ? 'ON' : 'OFF'); debugText.setText(debugInfo); } }; // Video tutorial screen function showVideoTutorial() { gameState = 'video'; game.removeChildren(); // Title var titleText = new Text2('How to Beat Geometry Dash', { size: 70, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0); titleText.x = 1024; titleText.y = 150; game.addChild(titleText); // Instructions sections var instructions = ['BASIC CONTROLS:', 'β’ Tap/Click to jump in cube mode', 'β’ Hold to fly up in ship mode', 'β’ Release to fall down in ship mode', '', 'GAMEPLAY TIPS:', 'β’ Red spikes = deadly obstacles', 'β’ Gray platforms = safe to land on', 'β’ Cyan checkpoints = save your progress', 'β’ Green squares = completed levels', '', 'LEVEL PROGRESSION:', 'β’ Levels 1-10: Learn basic mechanics', 'β’ Levels 11-20: Master timing and ship mode', 'β’ Levels 21-35: Expert precision required', 'β’ Levels 36-50: Ultimate challenges', '', 'SURVIVAL STRATEGY:', 'β’ Practice timing on easier levels first', 'β’ Use checkpoints to avoid restarting', 'β’ Ship levels require smooth control', 'β’ Platform levels need precise jumps']; var instructionY = 300; var lineHeight = 45; for (var i = 0; i < instructions.length; i++) { var line = instructions[i]; var isHeader = line.endsWith(':'); var fontSize = isHeader ? 50 : 40; var color = isHeader ? 0x00FF00 : 0xFFFFFF; var instructionText = new Text2(line, { size: fontSize, fill: color }); instructionText.anchor.set(0, 0); instructionText.x = 200; instructionY += line === '' ? lineHeight * 0.5 : lineHeight; instructionText.y = instructionY; game.addChild(instructionText); } // Demo visual elements var demoY = 1800; // Show cube example var demoCube = LK.getAsset('player', { anchorX: 0.5, anchorY: 1.0 }); demoCube.x = 400; demoCube.y = demoY; game.addChild(demoCube); var cubeLabel = new Text2('Cube Mode', { size: 35, fill: 0x00FF00 }); cubeLabel.anchor.set(0.5, 0); cubeLabel.x = demoCube.x; cubeLabel.y = demoY + 20; game.addChild(cubeLabel); // Show ship example var demoShip = LK.getAsset('ship', { anchorX: 0.5, anchorY: 0.5 }); demoShip.x = 800; demoShip.y = demoY - 30; game.addChild(demoShip); var shipLabel = new Text2('Ship Mode', { size: 35, fill: 0x0088FF }); shipLabel.anchor.set(0.5, 0); shipLabel.x = demoShip.x; shipLabel.y = demoY + 20; game.addChild(shipLabel); // Show spike example var demoSpike = LK.getAsset('spike', { anchorX: 0.5, anchorY: 1.0 }); demoSpike.x = 1200; demoSpike.y = demoY; game.addChild(demoSpike); var spikeLabel = new Text2('Deadly Spike', { size: 35, fill: 0xFF0000 }); spikeLabel.anchor.set(0.5, 0); spikeLabel.x = demoSpike.x; spikeLabel.y = demoY + 20; game.addChild(spikeLabel); // Show platform example var demoPlatform = LK.getAsset('platform', { anchorX: 0, anchorY: 0 }); demoPlatform.x = 1500; demoPlatform.y = demoY - 40; demoPlatform.width = 150; game.addChild(demoPlatform); var platformLabel = new Text2('Safe Platform', { size: 35, fill: 0x888888 }); platformLabel.anchor.set(0.5, 0); platformLabel.x = demoPlatform.x + 75; platformLabel.y = demoY + 20; game.addChild(platformLabel); // Animate demo elements var animTime = 0; var videoUpdateTimer = LK.setInterval(function () { animTime += 0.1; // Bounce cube demoCube.y = demoY + Math.abs(Math.sin(animTime * 2)) * -30; // Float ship demoShip.y = demoY - 30 + Math.sin(animTime) * 15; // Pulse spike demoSpike.alpha = 0.7 + Math.sin(animTime * 3) * 0.3; }, 50); // Back button var backButton = LK.getAsset('levelButton', { anchorX: 0.5, anchorY: 0.5 }); backButton.x = 1024; backButton.y = 2400; backButton.tint = 0x666666; game.addChild(backButton); var backText = new Text2('Back to Menu', { size: 40, fill: 0xFFFFFF }); backText.anchor.set(0.5, 0.5); backText.x = backButton.x; backText.y = backButton.y; game.addChild(backText); backButton.down = function (x, y, obj) { LK.clearInterval(videoUpdateTimer); showLevelMenu(); }; } // Shop screen function showShop() { gameState = 'shop'; game.removeChildren(); // Title var titleText = new Text2('Geometry Dash Shop', { size: 80, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0); titleText.x = 1024; titleText.y = 150; game.addChild(titleText); // Coin display var coinDisplayText = new Text2('Coins: ' + storage.totalCoins, { size: 60, fill: 0xFFD700 }); coinDisplayText.anchor.set(0.5, 0); coinDisplayText.x = 1024; coinDisplayText.y = 250; game.addChild(coinDisplayText); // Shop items var shopItems = [{ name: 'Red Player', price: 100, type: 'playerColor', value: 0xff0000, description: 'Change player color to red' }, { name: 'Blue Player', price: 100, type: 'playerColor', value: 0x0000ff, description: 'Change player color to blue' }, { name: 'Yellow Player', price: 150, type: 'playerColor', value: 0xffff00, description: 'Change player color to yellow' }, { name: 'Purple Player', price: 150, type: 'playerColor', value: 0xff00ff, description: 'Change player color to purple' }, { name: 'Orange Player', price: 120, type: 'playerColor', value: 0xff8800, description: 'Change player color to orange' }, { name: 'Cyan Player', price: 120, type: 'playerColor', value: 0x00ffff, description: 'Change player color to cyan' }, { name: 'Pink Player', price: 180, type: 'playerColor', value: 0xff69b4, description: 'Change player color to pink' }, { name: 'Red Ship', price: 120, type: 'shipColor', value: 0xff0000, description: 'Change ship color to red' }, { name: 'Green Ship', price: 120, type: 'shipColor', value: 0x00ff00, description: 'Change ship color to green' }, { name: 'Yellow Ship', price: 180, type: 'shipColor', value: 0xffff00, description: 'Change ship color to yellow' }, { name: 'Purple Ship', price: 180, type: 'shipColor', value: 0xff00ff, description: 'Change ship color to purple' }, { name: 'Orange Ship', price: 160, type: 'shipColor', value: 0xff8800, description: 'Change ship color to orange' }, { name: 'Speed Boost', price: 300, type: 'speedMultiplier', value: 1.5, description: 'Increase movement speed by 50%' }, { name: 'Super Speed', price: 600, type: 'speedMultiplier', value: 2.0, description: 'Double movement speed' }, { name: 'Coin Magnet', price: 500, type: 'coinMagnet', value: true, description: 'Automatically collect nearby coins' }, { name: 'Extra Checkpoint', price: 250, type: 'checkpoint', value: true, description: 'Add extra checkpoints in levels' }, { name: 'Jump Boost', price: 400, type: 'jumpBoost', value: true, description: 'Jump 25% higher in cube mode' }, { name: 'Shield Protection', price: 800, type: 'shield', value: true, description: 'Survive one spike hit per level' }, { name: 'Size Reduction', price: 350, type: 'smallSize', value: true, description: 'Make player 25% smaller' }, { name: 'Trail Effect', price: 200, type: 'trail', value: true, description: 'Leave a colorful trail behind' }]; var itemY = 400; var itemsPerRow = 2; var itemSpacing = 400; for (var i = 0; i < shopItems.length; i++) { var item = shopItems[i]; var row = Math.floor(i / itemsPerRow); var col = i % itemsPerRow; var itemX = 1024 - (itemsPerRow - 1) * itemSpacing / 2 + col * itemSpacing; var currentItemY = itemY + row * 200; // Check if item is already purchased var isPurchased = storage.shopPurchases[item.name] || false; var canAfford = storage.totalCoins >= item.price; // Item button var itemButton = LK.getAsset('levelButton', { anchorX: 0.5, anchorY: 0.5 }); itemButton.x = itemX; itemButton.y = currentItemY; itemButton.scaleX = 1.8; itemButton.scaleY = 1.2; if (isPurchased) { itemButton.tint = 0x00ff00; // Green for purchased } else if (canAfford) { itemButton.tint = 0x0088ff; // Blue for affordable } else { itemButton.tint = 0x666666; // Gray for too expensive } game.addChild(itemButton); // Item name var nameText = new Text2(item.name, { size: 30, fill: 0xFFFFFF }); nameText.anchor.set(0.5, 0.5); nameText.x = itemX; nameText.y = currentItemY - 20; game.addChild(nameText); // Item price var priceText = new Text2(isPurchased ? 'OWNED' : item.price + ' coins', { size: 25, fill: isPurchased ? 0x00ff00 : 0xFFD700 }); priceText.anchor.set(0.5, 0.5); priceText.x = itemX; priceText.y = currentItemY + 20; game.addChild(priceText); // Purchase logic if (!isPurchased && canAfford) { itemButton.shopItem = item; itemButton.down = function (x, y, obj) { var itemToPurchase = this.shopItem; storage.totalCoins -= itemToPurchase.price; storage.shopPurchases[itemToPurchase.name] = true; storage[itemToPurchase.type] = itemToPurchase.value; showShop(); // Refresh shop display }; } } // Back button var backButton = LK.getAsset('levelButton', { anchorX: 0.5, anchorY: 0.5 }); backButton.x = 1024; backButton.y = itemY + Math.ceil(shopItems.length / itemsPerRow) * 200 + 100; backButton.tint = 0x666666; game.addChild(backButton); var backText = new Text2('Back to Menu', { size: 40, fill: 0xFFFFFF }); backText.anchor.set(0.5, 0.5); backText.x = backButton.x; backText.y = backButton.y; game.addChild(backText); backButton.down = function (x, y, obj) { showLevelMenu(); }; } // Daily shop screen function showDailyShop() { gameState = 'dailyShop'; game.removeChildren(); // Generate daily shop if needed generateDailyShop(); // Title var titleText = new Text2('Daily Shop', { size: 80, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0); titleText.x = 1024; titleText.y = 150; game.addChild(titleText); // Date display var today = new Date(); var dateString = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate(); var dateText = new Text2('Date: ' + dateString, { size: 50, fill: 0x00FF00 }); dateText.anchor.set(0.5, 0); dateText.x = 1024; dateText.y = 250; game.addChild(dateText); // Coin display var coinDisplayText = new Text2('Coins: ' + storage.totalCoins, { size: 60, fill: 0xFFD700 }); coinDisplayText.anchor.set(0.5, 0); coinDisplayText.x = 1024; coinDisplayText.y = 320; game.addChild(coinDisplayText); // Shop items var itemY = 450; for (var i = 0; i < storage.dailyShopItems.length; i++) { var item = storage.dailyShopItems[i]; var currentItemY = itemY + i * 200; // Check if item is already purchased var isPurchased = storage.dailyShopPurchases[item.name] || false; var canAfford = storage.totalCoins >= item.price; // Item button var itemButton = LK.getAsset('levelButton', { anchorX: 0.5, anchorY: 0.5 }); itemButton.x = 1024; itemButton.y = currentItemY; itemButton.scaleX = 2.5; itemButton.scaleY = 1.2; if (isPurchased) { itemButton.tint = 0x00ff00; // Green for purchased } else if (canAfford) { itemButton.tint = 0xff6600; // Orange for daily special } else { itemButton.tint = 0x666666; // Gray for too expensive } game.addChild(itemButton); // Item name var nameText = new Text2(item.name, { size: 35, fill: 0xFFFFFF }); nameText.anchor.set(0.5, 0.5); nameText.x = 1024; nameText.y = currentItemY - 25; game.addChild(nameText); // Item price and discount var discountText = item.discount + '% OFF!'; var priceText = new Text2(isPurchased ? 'OWNED' : item.price + ' coins (' + discountText + ')', { size: 28, fill: isPurchased ? 0x00ff00 : 0xFFD700 }); priceText.anchor.set(0.5, 0.5); priceText.x = 1024; priceText.y = currentItemY + 10; game.addChild(priceText); // Description var descText = new Text2(item.description, { size: 24, fill: 0xCCCCCC }); descText.anchor.set(0.5, 0.5); descText.x = 1024; descText.y = currentItemY + 35; game.addChild(descText); // Purchase logic if (!isPurchased && canAfford) { itemButton.shopItem = item; itemButton.down = function (x, y, obj) { var itemToPurchase = this.shopItem; storage.totalCoins -= itemToPurchase.price; storage.dailyShopPurchases[itemToPurchase.name] = true; storage[itemToPurchase.type] = itemToPurchase.value; showDailyShop(); // Refresh shop display }; } } // Back button var backButton = LK.getAsset('levelButton', { anchorX: 0.5, anchorY: 0.5 }); backButton.x = 1024; backButton.y = itemY + storage.dailyShopItems.length * 200 + 100; backButton.tint = 0x666666; game.addChild(backButton); var backText = new Text2('Back to Menu', { size: 40, fill: 0xFFFFFF }); backText.anchor.set(0.5, 0.5); backText.x = backButton.x; backText.y = backButton.y; game.addChild(backText); backButton.down = function (x, y, obj) { showLevelMenu(); }; } // Generate daily shop items function generateDailyShop() { var today = new Date(); var dateString = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate(); // Check if daily shop needs to be regenerated if (storage.dailyShopDate !== dateString) { storage.dailyShopDate = dateString; storage.dailyShopPurchases = {}; // Generate daily shop using date as seed for consistency var dayOfYear = Math.floor((today - new Date(today.getFullYear(), 0, 0)) / (1000 * 60 * 60 * 24)); var seed = dayOfYear + today.getFullYear() * 365; // All possible shop items var allItems = [{ name: 'Red Player', originalPrice: 100, type: 'playerColor', value: 0xff0000, description: 'Change player color to red' }, { name: 'Blue Player', originalPrice: 100, type: 'playerColor', value: 0x0000ff, description: 'Change player color to blue' }, { name: 'Yellow Player', originalPrice: 150, type: 'playerColor', value: 0xffff00, description: 'Change player color to yellow' }, { name: 'Purple Player', originalPrice: 150, type: 'playerColor', value: 0xff00ff, description: 'Change player color to purple' }, { name: 'Orange Player', originalPrice: 120, type: 'playerColor', value: 0xff8800, description: 'Change player color to orange' }, { name: 'Cyan Player', originalPrice: 120, type: 'playerColor', value: 0x00ffff, description: 'Change player color to cyan' }, { name: 'Pink Player', originalPrice: 180, type: 'playerColor', value: 0xff69b4, description: 'Change player color to pink' }, { name: 'Red Ship', originalPrice: 120, type: 'shipColor', value: 0xff0000, description: 'Change ship color to red' }, { name: 'Green Ship', originalPrice: 120, type: 'shipColor', value: 0x00ff00, description: 'Change ship color to green' }, { name: 'Yellow Ship', originalPrice: 180, type: 'shipColor', value: 0xffff00, description: 'Change ship color to yellow' }, { name: 'Purple Ship', originalPrice: 180, type: 'shipColor', value: 0xff00ff, description: 'Change ship color to purple' }, { name: 'Orange Ship', originalPrice: 160, type: 'shipColor', value: 0xff8800, description: 'Change ship color to orange' }, { name: 'Speed Boost', originalPrice: 300, type: 'speedMultiplier', value: 1.5, description: 'Increase movement speed by 50%' }, { name: 'Super Speed', originalPrice: 600, type: 'speedMultiplier', value: 2.0, description: 'Double movement speed' }, { name: 'Coin Magnet', originalPrice: 500, type: 'coinMagnet', value: true, description: 'Automatically collect nearby coins' }, { name: 'Extra Checkpoint', originalPrice: 250, type: 'checkpoint', value: true, description: 'Add extra checkpoints in levels' }, { name: 'Jump Boost', originalPrice: 400, type: 'jumpBoost', value: true, description: 'Jump 25% higher in cube mode' }, { name: 'Shield Protection', originalPrice: 800, type: 'shield', value: true, description: 'Survive one spike hit per level' }, { name: 'Size Reduction', originalPrice: 350, type: 'smallSize', value: true, description: 'Make player 25% smaller' }, { name: 'Trail Effect', originalPrice: 200, type: 'trail', value: true, description: 'Leave a colorful trail behind' }]; // Select 3 random items for daily shop storage.dailyShopItems = []; var usedIndices = []; for (var i = 0; i < 3; i++) { var randomIndex; do { randomIndex = (seed + i * 7) % allItems.length; } while (usedIndices.indexOf(randomIndex) !== -1); usedIndices.push(randomIndex); var selectedItem = allItems[randomIndex]; // Apply random discount (20-50%) var discount = 20 + (seed + i * 3) % 31; var discountedPrice = Math.floor(selectedItem.originalPrice * (100 - discount) / 100); storage.dailyShopItems.push({ name: selectedItem.name, price: discountedPrice, discount: discount, type: selectedItem.type, value: selectedItem.value, description: selectedItem.description }); } } } // Owner commands screen function showOwnerCommands() { gameState = 'owner'; game.removeChildren(); // Title var titleText = new Text2('Owner Commands', { size: 80, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0); titleText.x = 1024; titleText.y = 200; game.addChild(titleText); // Command buttons var commandButtons = [{ text: 'Unlock All Levels', action: unlockAllLevels }, { text: 'Reset Progress', action: resetProgress }, { text: 'Complete All Levels', action: completeAllLevels }, { text: 'Give 1000 Coins', action: giveCoins }, { text: 'Reset Coins', action: resetCoins }, { text: 'Complete Daily Level', action: completeDailyLevel }, { text: 'Reset Daily Level', action: resetDailyLevel }, { text: 'Skip to Level 25', action: skipToLevel25 }, { text: 'Skip to Level 50', action: skipToLevel50 }, { text: 'God Mode On', action: enableGodMode }, { text: 'God Mode Off', action: disableGodMode }, { text: 'Speed Boost On', action: enableSpeedBoost }, { text: 'Speed Boost Off', action: disableSpeedBoost }, { text: 'Show Debug Info', action: showDebugInfo }, { text: 'Clear Debug Info', action: clearDebugInfo }, { text: 'Teleport to End', action: teleportToEnd }, { text: 'Back to Menu', action: showLevelMenu }]; var buttonY = 400; for (var i = 0; i < commandButtons.length; i++) { var cmdButton = LK.getAsset('levelButton', { anchorX: 0.5, anchorY: 0.5 }); cmdButton.x = 1024; cmdButton.y = buttonY + i * 150; cmdButton.tint = 0x444444; game.addChild(cmdButton); var cmdText = new Text2(commandButtons[i].text, { size: 35, fill: 0xFFFFFF }); cmdText.anchor.set(0.5, 0.5); cmdText.x = cmdButton.x; cmdText.y = cmdButton.y; game.addChild(cmdText); cmdButton.commandAction = commandButtons[i].action; cmdButton.down = function (x, y, obj) { this.commandAction(); }; } } // Owner command functions function unlockAllLevels() { for (var i = 1; i <= maxLevels; i++) { storage.completedLevels[i] = false; // Unlocked but not completed } showLevelMenu(); } function resetProgress() { storage.completedLevels = {}; storage.totalCoins = 0; storage.levelCoins = {}; showLevelMenu(); } function completeAllLevels() { for (var i = 1; i <= maxLevels; i++) { storage.completedLevels[i] = true; } showLevelMenu(); } function giveCoins() { storage.totalCoins += 1000; showOwnerCommands(); } function resetCoins() { storage.totalCoins = 0; storage.levelCoins = {}; showOwnerCommands(); } function completeDailyLevel() { storage.dailyLevelCompleted = true; storage.dailyLevelCoins = 5; showOwnerCommands(); } function resetDailyLevel() { storage.dailyLevelCompleted = false; storage.dailyLevelCoins = 0; showOwnerCommands(); } function skipToLevel25() { for (var i = 1; i <= 25; i++) { storage.completedLevels[i] = true; } showLevelMenu(); } function skipToLevel50() { for (var i = 1; i <= 50; i++) { storage.completedLevels[i] = true; } showLevelMenu(); } function enableGodMode() { godModeEnabled = true; showOwnerCommands(); } function disableGodMode() { godModeEnabled = false; showOwnerCommands(); } function enableSpeedBoost() { speedBoostEnabled = true; scrollSpeed = 24; // Double speed showOwnerCommands(); } function disableSpeedBoost() { speedBoostEnabled = false; scrollSpeed = 12; // Normal speed showOwnerCommands(); } function showDebugInfo() { debugInfoVisible = true; if (!debugText) { debugText = new Text2('Debug Info', { size: 30, fill: 0x00FF00 }); debugText.anchor.set(0, 0); debugText.x = 120; debugText.y = 180; LK.gui.topLeft.addChild(debugText); } showOwnerCommands(); } function clearDebugInfo() { debugInfoVisible = false; if (debugText) { LK.gui.topLeft.removeChild(debugText); debugText = null; } showOwnerCommands(); } function teleportToEnd() { if (gameState === 'playing' && player) { var levelLength = levelData[currentLevel] ? levelData[currentLevel].length : 3000; player.x = levelLength - 100; cameraX = levelLength - 500; } showGameplay(); } // Initialize game initializeLevelData(); setupUI(); showLevelMenu();
===================================================================
--- original.js
+++ change.js
@@ -433,8 +433,18 @@
}
if (!storage.shieldUsed) {
storage.shieldUsed = false;
}
+// Daily shop storage initialization
+if (!storage.dailyShopDate) {
+ storage.dailyShopDate = '';
+}
+if (!storage.dailyShopItems) {
+ storage.dailyShopItems = [];
+}
+if (!storage.dailyShopPurchases) {
+ storage.dailyShopPurchases = {};
+}
// Generate daily level based on current date
function generateDailyLevel() {
var today = new Date();
var dateString = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();
@@ -1508,9 +1518,9 @@
var shopButton = LK.getAsset('levelButton', {
anchorX: 0.5,
anchorY: 0.5
});
- shopButton.x = 1024;
+ shopButton.x = 924;
shopButton.y = 300;
shopButton.tint = 0x00aaff;
game.addChild(shopButton);
var shopText = new Text2('Shop', {
@@ -1523,8 +1533,28 @@
game.addChild(shopText);
shopButton.down = function (x, y, obj) {
showShop();
};
+ // Daily Shop button
+ var dailyShopButton = LK.getAsset('levelButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ dailyShopButton.x = 1124;
+ dailyShopButton.y = 300;
+ dailyShopButton.tint = 0xff6600;
+ game.addChild(dailyShopButton);
+ var dailyShopText = new Text2('Daily Shop', {
+ size: 32,
+ fill: 0xFFFFFF
+ });
+ dailyShopText.anchor.set(0.5, 0.5);
+ dailyShopText.x = dailyShopButton.x;
+ dailyShopText.y = dailyShopButton.y;
+ game.addChild(dailyShopText);
+ dailyShopButton.down = function (x, y, obj) {
+ showDailyShop();
+ };
// Owner commands button (moved down)
var ownerButton = LK.getAsset('levelButton', {
anchorX: 0.5,
anchorY: 0.5
@@ -2161,8 +2191,286 @@
backButton.down = function (x, y, obj) {
showLevelMenu();
};
}
+// Daily shop screen
+function showDailyShop() {
+ gameState = 'dailyShop';
+ game.removeChildren();
+ // Generate daily shop if needed
+ generateDailyShop();
+ // Title
+ var titleText = new Text2('Daily Shop', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ titleText.anchor.set(0.5, 0);
+ titleText.x = 1024;
+ titleText.y = 150;
+ game.addChild(titleText);
+ // Date display
+ var today = new Date();
+ var dateString = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();
+ var dateText = new Text2('Date: ' + dateString, {
+ size: 50,
+ fill: 0x00FF00
+ });
+ dateText.anchor.set(0.5, 0);
+ dateText.x = 1024;
+ dateText.y = 250;
+ game.addChild(dateText);
+ // Coin display
+ var coinDisplayText = new Text2('Coins: ' + storage.totalCoins, {
+ size: 60,
+ fill: 0xFFD700
+ });
+ coinDisplayText.anchor.set(0.5, 0);
+ coinDisplayText.x = 1024;
+ coinDisplayText.y = 320;
+ game.addChild(coinDisplayText);
+ // Shop items
+ var itemY = 450;
+ for (var i = 0; i < storage.dailyShopItems.length; i++) {
+ var item = storage.dailyShopItems[i];
+ var currentItemY = itemY + i * 200;
+ // Check if item is already purchased
+ var isPurchased = storage.dailyShopPurchases[item.name] || false;
+ var canAfford = storage.totalCoins >= item.price;
+ // Item button
+ var itemButton = LK.getAsset('levelButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ itemButton.x = 1024;
+ itemButton.y = currentItemY;
+ itemButton.scaleX = 2.5;
+ itemButton.scaleY = 1.2;
+ if (isPurchased) {
+ itemButton.tint = 0x00ff00; // Green for purchased
+ } else if (canAfford) {
+ itemButton.tint = 0xff6600; // Orange for daily special
+ } else {
+ itemButton.tint = 0x666666; // Gray for too expensive
+ }
+ game.addChild(itemButton);
+ // Item name
+ var nameText = new Text2(item.name, {
+ size: 35,
+ fill: 0xFFFFFF
+ });
+ nameText.anchor.set(0.5, 0.5);
+ nameText.x = 1024;
+ nameText.y = currentItemY - 25;
+ game.addChild(nameText);
+ // Item price and discount
+ var discountText = item.discount + '% OFF!';
+ var priceText = new Text2(isPurchased ? 'OWNED' : item.price + ' coins (' + discountText + ')', {
+ size: 28,
+ fill: isPurchased ? 0x00ff00 : 0xFFD700
+ });
+ priceText.anchor.set(0.5, 0.5);
+ priceText.x = 1024;
+ priceText.y = currentItemY + 10;
+ game.addChild(priceText);
+ // Description
+ var descText = new Text2(item.description, {
+ size: 24,
+ fill: 0xCCCCCC
+ });
+ descText.anchor.set(0.5, 0.5);
+ descText.x = 1024;
+ descText.y = currentItemY + 35;
+ game.addChild(descText);
+ // Purchase logic
+ if (!isPurchased && canAfford) {
+ itemButton.shopItem = item;
+ itemButton.down = function (x, y, obj) {
+ var itemToPurchase = this.shopItem;
+ storage.totalCoins -= itemToPurchase.price;
+ storage.dailyShopPurchases[itemToPurchase.name] = true;
+ storage[itemToPurchase.type] = itemToPurchase.value;
+ showDailyShop(); // Refresh shop display
+ };
+ }
+ }
+ // Back button
+ var backButton = LK.getAsset('levelButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ backButton.x = 1024;
+ backButton.y = itemY + storage.dailyShopItems.length * 200 + 100;
+ backButton.tint = 0x666666;
+ game.addChild(backButton);
+ var backText = new Text2('Back to Menu', {
+ size: 40,
+ fill: 0xFFFFFF
+ });
+ backText.anchor.set(0.5, 0.5);
+ backText.x = backButton.x;
+ backText.y = backButton.y;
+ game.addChild(backText);
+ backButton.down = function (x, y, obj) {
+ showLevelMenu();
+ };
+}
+// Generate daily shop items
+function generateDailyShop() {
+ var today = new Date();
+ var dateString = today.getFullYear() + '-' + (today.getMonth() + 1) + '-' + today.getDate();
+ // Check if daily shop needs to be regenerated
+ if (storage.dailyShopDate !== dateString) {
+ storage.dailyShopDate = dateString;
+ storage.dailyShopPurchases = {};
+ // Generate daily shop using date as seed for consistency
+ var dayOfYear = Math.floor((today - new Date(today.getFullYear(), 0, 0)) / (1000 * 60 * 60 * 24));
+ var seed = dayOfYear + today.getFullYear() * 365;
+ // All possible shop items
+ var allItems = [{
+ name: 'Red Player',
+ originalPrice: 100,
+ type: 'playerColor',
+ value: 0xff0000,
+ description: 'Change player color to red'
+ }, {
+ name: 'Blue Player',
+ originalPrice: 100,
+ type: 'playerColor',
+ value: 0x0000ff,
+ description: 'Change player color to blue'
+ }, {
+ name: 'Yellow Player',
+ originalPrice: 150,
+ type: 'playerColor',
+ value: 0xffff00,
+ description: 'Change player color to yellow'
+ }, {
+ name: 'Purple Player',
+ originalPrice: 150,
+ type: 'playerColor',
+ value: 0xff00ff,
+ description: 'Change player color to purple'
+ }, {
+ name: 'Orange Player',
+ originalPrice: 120,
+ type: 'playerColor',
+ value: 0xff8800,
+ description: 'Change player color to orange'
+ }, {
+ name: 'Cyan Player',
+ originalPrice: 120,
+ type: 'playerColor',
+ value: 0x00ffff,
+ description: 'Change player color to cyan'
+ }, {
+ name: 'Pink Player',
+ originalPrice: 180,
+ type: 'playerColor',
+ value: 0xff69b4,
+ description: 'Change player color to pink'
+ }, {
+ name: 'Red Ship',
+ originalPrice: 120,
+ type: 'shipColor',
+ value: 0xff0000,
+ description: 'Change ship color to red'
+ }, {
+ name: 'Green Ship',
+ originalPrice: 120,
+ type: 'shipColor',
+ value: 0x00ff00,
+ description: 'Change ship color to green'
+ }, {
+ name: 'Yellow Ship',
+ originalPrice: 180,
+ type: 'shipColor',
+ value: 0xffff00,
+ description: 'Change ship color to yellow'
+ }, {
+ name: 'Purple Ship',
+ originalPrice: 180,
+ type: 'shipColor',
+ value: 0xff00ff,
+ description: 'Change ship color to purple'
+ }, {
+ name: 'Orange Ship',
+ originalPrice: 160,
+ type: 'shipColor',
+ value: 0xff8800,
+ description: 'Change ship color to orange'
+ }, {
+ name: 'Speed Boost',
+ originalPrice: 300,
+ type: 'speedMultiplier',
+ value: 1.5,
+ description: 'Increase movement speed by 50%'
+ }, {
+ name: 'Super Speed',
+ originalPrice: 600,
+ type: 'speedMultiplier',
+ value: 2.0,
+ description: 'Double movement speed'
+ }, {
+ name: 'Coin Magnet',
+ originalPrice: 500,
+ type: 'coinMagnet',
+ value: true,
+ description: 'Automatically collect nearby coins'
+ }, {
+ name: 'Extra Checkpoint',
+ originalPrice: 250,
+ type: 'checkpoint',
+ value: true,
+ description: 'Add extra checkpoints in levels'
+ }, {
+ name: 'Jump Boost',
+ originalPrice: 400,
+ type: 'jumpBoost',
+ value: true,
+ description: 'Jump 25% higher in cube mode'
+ }, {
+ name: 'Shield Protection',
+ originalPrice: 800,
+ type: 'shield',
+ value: true,
+ description: 'Survive one spike hit per level'
+ }, {
+ name: 'Size Reduction',
+ originalPrice: 350,
+ type: 'smallSize',
+ value: true,
+ description: 'Make player 25% smaller'
+ }, {
+ name: 'Trail Effect',
+ originalPrice: 200,
+ type: 'trail',
+ value: true,
+ description: 'Leave a colorful trail behind'
+ }];
+ // Select 3 random items for daily shop
+ storage.dailyShopItems = [];
+ var usedIndices = [];
+ for (var i = 0; i < 3; i++) {
+ var randomIndex;
+ do {
+ randomIndex = (seed + i * 7) % allItems.length;
+ } while (usedIndices.indexOf(randomIndex) !== -1);
+ usedIndices.push(randomIndex);
+ var selectedItem = allItems[randomIndex];
+ // Apply random discount (20-50%)
+ var discount = 20 + (seed + i * 3) % 31;
+ var discountedPrice = Math.floor(selectedItem.originalPrice * (100 - discount) / 100);
+ storage.dailyShopItems.push({
+ name: selectedItem.name,
+ price: discountedPrice,
+ discount: discount,
+ type: selectedItem.type,
+ value: selectedItem.value,
+ description: selectedItem.description
+ });
+ }
+ }
+}
// Owner commands screen
function showOwnerCommands() {
gameState = 'owner';
game.removeChildren();