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
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: '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: '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();
}
// Initialize game
initializeLevelData();
setupUI();
showLevelMenu(); ===================================================================
--- original.js
+++ change.js
@@ -443,8 +443,15 @@
}
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();
@@ -1434,8 +1441,17 @@
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';
@@ -1553,8 +1569,28 @@
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
@@ -1692,10 +1728,14 @@
// 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
@@ -2469,8 +2509,172 @@
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();
@@ -2499,8 +2703,14 @@
}, {
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',
@@ -2649,8 +2859,16 @@
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;