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 = {};
}
// Gem shop storage initialization
if (!storage.totalGems) {
storage.totalGems = 10; // Start with 10 gems
}
if (!storage.gemShopPurchases) {
storage.gemShopPurchases = {};
}
// 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);
// Gem counter
var gemText = new Text2('Gems: ' + storage.totalGems, {
size: 50,
fill: 0xFF00FF
});
gemText.anchor.set(0, 0);
gemText.x = 120;
gemText.y = 190;
LK.gui.topLeft.addChild(gemText);
}
// 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();
};
// Gem Shop button
var gemShopButton = LK.getAsset('levelButton', {
anchorX: 0.5,
anchorY: 0.5
});
gemShopButton.x = 724;
gemShopButton.y = 300;
gemShopButton.tint = 0xff00ff;
game.addChild(gemShopButton);
var gemShopText = new Text2('Gem Shop', {
size: 32,
fill: 0xFFFFFF
});
gemShopText.anchor.set(0.5, 0.5);
gemShopText.x = gemShopButton.x;
gemShopText.y = gemShopButton.y;
game.addChild(gemShopText);
gemShopButton.down = function (x, y, obj) {
showGemShop();
};
// 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;
// Give 2 gems for daily level completion
storage.totalGems += 2;
} else {
storage.completedLevels[currentLevel] = true;
// Give 1 gem for regular level completion
storage.totalGems += 1;
}
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();
};
}
// 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
});
}
}
}
// 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();
};
}
// Gem shop screen
function showGemShop() {
gameState = 'gemShop';
game.removeChildren();
// Title
var titleText = new Text2('Premium Gem Shop', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0);
titleText.x = 1024;
titleText.y = 150;
game.addChild(titleText);
// Gem display
var gemDisplayText = new Text2('Gems: ' + storage.totalGems, {
size: 60,
fill: 0xFF00FF
});
gemDisplayText.anchor.set(0.5, 0);
gemDisplayText.x = 1024;
gemDisplayText.y = 250;
game.addChild(gemDisplayText);
// Premium shop items
var gemShopItems = [{
name: 'Rainbow Player',
price: 5,
type: 'playerColor',
value: 0x00ffff,
description: 'Exclusive rainbow-like cyan player'
}, {
name: 'Golden Player',
price: 8,
type: 'playerColor',
value: 0xffd700,
description: 'Luxurious golden player color'
}, {
name: 'Diamond Ship',
price: 10,
type: 'shipColor',
value: 0xb9f2ff,
description: 'Sparkling diamond ship'
}, {
name: 'Ruby Ship',
price: 8,
type: 'shipColor',
value: 0xe0115f,
description: 'Deep ruby red ship'
}, {
name: 'Ultra Speed',
price: 15,
type: 'speedMultiplier',
value: 3.0,
description: 'Triple movement speed'
}, {
name: 'Mega Jump',
price: 12,
type: 'jumpBoost',
value: true,
description: 'Jump 50% higher than normal'
}, {
name: 'Double Shield',
price: 20,
type: 'shield',
value: true,
description: 'Survive two spike hits per level'
}, {
name: 'Coin Multiplier x2',
price: 25,
type: 'coinMultiplier',
value: 2.0,
description: 'Double all coin rewards'
}, {
name: 'Ghost Mode',
price: 30,
type: 'ghostMode',
value: true,
description: 'Pass through spikes for 5 seconds'
}, {
name: 'Level Skip Token',
price: 50,
type: 'skipToken',
value: true,
description: 'Skip any level instantly'
}];
var itemY = 400;
var itemsPerRow = 2;
var itemSpacing = 400;
for (var i = 0; i < gemShopItems.length; i++) {
var item = gemShopItems[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.gemShopPurchases[item.name] || false;
var canAfford = storage.totalGems >= 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 = 0xff00ff; // Magenta for gem shop
} 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 + ' gems', {
size: 25,
fill: isPurchased ? 0x00ff00 : 0xFF00FF
});
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.totalGems -= itemToPurchase.price;
storage.gemShopPurchases[itemToPurchase.name] = true;
storage[itemToPurchase.type] = itemToPurchase.value;
showGemShop(); // Refresh shop display
};
}
}
// Back button
var backButton = LK.getAsset('levelButton', {
anchorX: 0.5,
anchorY: 0.5
});
backButton.x = 1024;
backButton.y = itemY + Math.ceil(gemShopItems.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();
};
}
// 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
// Initialize page tracking if not exists
if (!storage.ownerCommandsPage) {
storage.ownerCommandsPage = 1;
}
var allCommandButtons = [{
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: 'Give 100 Gems',
action: giveGems
}, {
text: 'Reset Gems',
action: resetGems
}, {
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: 'Toggle Invincibility',
action: toggleInvincibility
}, {
text: 'Max All Shop Items',
action: maxAllShopItems
}, {
text: 'Reset Shop Purchases',
action: resetShopPurchases
}, {
text: 'Instant Level Complete',
action: instantLevelComplete
}, {
text: 'Unlock Daily Shop',
action: unlockDailyShop
}, {
text: 'Reset All Data',
action: resetAllData
}];
var commandsPerPage = 10;
var totalPages = Math.ceil(allCommandButtons.length / commandsPerPage);
var currentPage = storage.ownerCommandsPage || 1;
// Get commands for current page
var startIndex = (currentPage - 1) * commandsPerPage;
var endIndex = Math.min(startIndex + commandsPerPage, allCommandButtons.length);
var commandButtons = allCommandButtons.slice(startIndex, endIndex);
// Add navigation buttons
if (currentPage < totalPages) {
commandButtons.push({
text: 'Next Page (' + (currentPage + 1) + '/' + totalPages + ')',
action: function action() {
storage.ownerCommandsPage = currentPage + 1;
showOwnerCommands();
}
});
}
if (currentPage > 1) {
commandButtons.push({
text: 'Previous Page (' + (currentPage - 1) + '/' + totalPages + ')',
action: function action() {
storage.ownerCommandsPage = currentPage - 1;
showOwnerCommands();
}
});
}
// Add back to menu as last option
commandButtons.push({
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 giveGems() {
storage.totalGems += 100;
showOwnerCommands();
}
function resetGems() {
storage.totalGems = 0;
showOwnerCommands();
}
function teleportToEnd() {
if (gameState === 'playing' && player) {
var levelLength = levelData[currentLevel] ? levelData[currentLevel].length : 3000;
player.x = levelLength - 100;
cameraX = levelLength - 500;
}
showGameplay();
}
function toggleInvincibility() {
godModeEnabled = !godModeEnabled;
showOwnerCommands();
}
function maxAllShopItems() {
var allShopItemNames = ['Red Player', 'Blue Player', 'Yellow Player', 'Purple Player', 'Orange Player', 'Cyan Player', 'Pink Player', 'Red Ship', 'Green Ship', 'Yellow Ship', 'Purple Ship', 'Orange Ship', 'Speed Boost', 'Super Speed', 'Coin Magnet', 'Extra Checkpoint', 'Jump Boost', 'Shield Protection', 'Size Reduction', 'Trail Effect'];
for (var i = 0; i < allShopItemNames.length; i++) {
storage.shopPurchases[allShopItemNames[i]] = true;
}
// Apply all effects
storage.playerColor = 0xff69b4; // Pink
storage.shipColor = 0xffff00; // Yellow
storage.speedMultiplier = 2.0;
storage.coinMagnet = true;
storage.checkpoint = true;
storage.jumpBoost = true;
storage.shield = true;
storage.smallSize = true;
storage.trail = true;
showOwnerCommands();
}
function resetShopPurchases() {
storage.shopPurchases = {};
storage.dailyShopPurchases = {};
storage.gemShopPurchases = {};
// Reset to defaults
storage.playerColor = 0x00ff00;
storage.shipColor = 0x0088ff;
storage.speedMultiplier = 1.0;
storage.coinMagnet = false;
storage.checkpoint = false;
storage.jumpBoost = false;
storage.shield = false;
storage.smallSize = false;
storage.trail = false;
showOwnerCommands();
}
function instantLevelComplete() {
if (gameState === 'playing') {
completeLevel();
}
showOwnerCommands();
}
function unlockDailyShop() {
// Force regenerate daily shop with all items available
storage.dailyShopDate = '';
generateDailyShop();
showOwnerCommands();
}
function resetAllData() {
storage.completedLevels = {};
storage.totalCoins = 0;
storage.levelCoins = {};
storage.totalGems = 0;
storage.shopPurchases = {};
storage.dailyShopPurchases = {};
storage.gemShopPurchases = {};
storage.dailyLevelCompleted = false;
storage.dailyLevelCoins = 0;
storage.ownerCommandsPage = 1;
// Reset to defaults
storage.playerColor = 0x00ff00;
storage.shipColor = 0x0088ff;
storage.speedMultiplier = 1.0;
storage.coinMagnet = false;
storage.checkpoint = false;
storage.jumpBoost = false;
storage.shield = false;
storage.smallSize = false;
storage.trail = false;
showLevelMenu();
}
// Initialize game
initializeLevelData();
setupUI();
showLevelMenu(); ===================================================================
--- original.js
+++ change.js
@@ -2687,9 +2687,13 @@
titleText.x = 1024;
titleText.y = 200;
game.addChild(titleText);
// Command buttons
- var commandButtons = [{
+ // Initialize page tracking if not exists
+ if (!storage.ownerCommandsPage) {
+ storage.ownerCommandsPage = 1;
+ }
+ var allCommandButtons = [{
text: 'Unlock All Levels',
action: unlockAllLevels
}, {
text: 'Reset Progress',
@@ -2742,11 +2746,57 @@
}, {
text: 'Teleport to End',
action: teleportToEnd
}, {
+ text: 'Toggle Invincibility',
+ action: toggleInvincibility
+ }, {
+ text: 'Max All Shop Items',
+ action: maxAllShopItems
+ }, {
+ text: 'Reset Shop Purchases',
+ action: resetShopPurchases
+ }, {
+ text: 'Instant Level Complete',
+ action: instantLevelComplete
+ }, {
+ text: 'Unlock Daily Shop',
+ action: unlockDailyShop
+ }, {
+ text: 'Reset All Data',
+ action: resetAllData
+ }];
+ var commandsPerPage = 10;
+ var totalPages = Math.ceil(allCommandButtons.length / commandsPerPage);
+ var currentPage = storage.ownerCommandsPage || 1;
+ // Get commands for current page
+ var startIndex = (currentPage - 1) * commandsPerPage;
+ var endIndex = Math.min(startIndex + commandsPerPage, allCommandButtons.length);
+ var commandButtons = allCommandButtons.slice(startIndex, endIndex);
+ // Add navigation buttons
+ if (currentPage < totalPages) {
+ commandButtons.push({
+ text: 'Next Page (' + (currentPage + 1) + '/' + totalPages + ')',
+ action: function action() {
+ storage.ownerCommandsPage = currentPage + 1;
+ showOwnerCommands();
+ }
+ });
+ }
+ if (currentPage > 1) {
+ commandButtons.push({
+ text: 'Previous Page (' + (currentPage - 1) + '/' + totalPages + ')',
+ action: function action() {
+ storage.ownerCommandsPage = currentPage - 1;
+ showOwnerCommands();
+ }
+ });
+ }
+ // Add back to menu as last option
+ commandButtons.push({
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,
@@ -2875,8 +2925,80 @@
cameraX = levelLength - 500;
}
showGameplay();
}
+function toggleInvincibility() {
+ godModeEnabled = !godModeEnabled;
+ showOwnerCommands();
+}
+function maxAllShopItems() {
+ var allShopItemNames = ['Red Player', 'Blue Player', 'Yellow Player', 'Purple Player', 'Orange Player', 'Cyan Player', 'Pink Player', 'Red Ship', 'Green Ship', 'Yellow Ship', 'Purple Ship', 'Orange Ship', 'Speed Boost', 'Super Speed', 'Coin Magnet', 'Extra Checkpoint', 'Jump Boost', 'Shield Protection', 'Size Reduction', 'Trail Effect'];
+ for (var i = 0; i < allShopItemNames.length; i++) {
+ storage.shopPurchases[allShopItemNames[i]] = true;
+ }
+ // Apply all effects
+ storage.playerColor = 0xff69b4; // Pink
+ storage.shipColor = 0xffff00; // Yellow
+ storage.speedMultiplier = 2.0;
+ storage.coinMagnet = true;
+ storage.checkpoint = true;
+ storage.jumpBoost = true;
+ storage.shield = true;
+ storage.smallSize = true;
+ storage.trail = true;
+ showOwnerCommands();
+}
+function resetShopPurchases() {
+ storage.shopPurchases = {};
+ storage.dailyShopPurchases = {};
+ storage.gemShopPurchases = {};
+ // Reset to defaults
+ storage.playerColor = 0x00ff00;
+ storage.shipColor = 0x0088ff;
+ storage.speedMultiplier = 1.0;
+ storage.coinMagnet = false;
+ storage.checkpoint = false;
+ storage.jumpBoost = false;
+ storage.shield = false;
+ storage.smallSize = false;
+ storage.trail = false;
+ showOwnerCommands();
+}
+function instantLevelComplete() {
+ if (gameState === 'playing') {
+ completeLevel();
+ }
+ showOwnerCommands();
+}
+function unlockDailyShop() {
+ // Force regenerate daily shop with all items available
+ storage.dailyShopDate = '';
+ generateDailyShop();
+ showOwnerCommands();
+}
+function resetAllData() {
+ storage.completedLevels = {};
+ storage.totalCoins = 0;
+ storage.levelCoins = {};
+ storage.totalGems = 0;
+ storage.shopPurchases = {};
+ storage.dailyShopPurchases = {};
+ storage.gemShopPurchases = {};
+ storage.dailyLevelCompleted = false;
+ storage.dailyLevelCoins = 0;
+ storage.ownerCommandsPage = 1;
+ // Reset to defaults
+ storage.playerColor = 0x00ff00;
+ storage.shipColor = 0x0088ff;
+ storage.speedMultiplier = 1.0;
+ storage.coinMagnet = false;
+ storage.checkpoint = false;
+ storage.jumpBoost = false;
+ storage.shield = false;
+ storage.smallSize = false;
+ storage.trail = false;
+ showLevelMenu();
+}
// Initialize game
initializeLevelData();
setupUI();
showLevelMenu();
\ No newline at end of file