/****
* Classes
****/
var Basket = Container.expand(function (color) {
var self = Container.call(this);
self.color = color;
self.isDragging = false;
var basketGraphics = self.attachAsset(color + 'Basket', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
self.isDragging = true;
draggedBasket = self;
};
self.up = function (x, y, obj) {
self.isDragging = false;
if (draggedBasket === self) {
draggedBasket = null;
}
};
return self;
});
// Game variables
var Orb = Container.expand(function (color) {
var self = Container.call(this);
self.color = color;
self.speed = 3 + Math.random() * 2; // Random fall speed
var orbGraphics = self.attachAsset(color + 'Orb', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
if (self.lastY === undefined) self.lastY = self.y;
self.y += self.speed;
// Check if orb hit the ground
if (self.lastY < 2650 && self.y >= 2650) {
// Missed - lose health
health--;
LK.getSound('miss').play();
self.destroy();
// Remove from orbs array
for (var i = orbs.length - 1; i >= 0; i--) {
if (orbs[i] === self) {
orbs.splice(i, 1);
break;
}
}
}
self.lastY = self.y;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x001122
});
/****
* Game Code
****/
// Sound effects
// Colored baskets
// Colored orbs
// Game variables
var score = 0;
var health = 5;
var gameSpeed = 1;
var colors = ['red', 'blue', 'green'];
var orbs = [];
var baskets = [];
var draggedBasket = null;
var orbSpawnTimer = 0;
var orbSpawnDelay = 90; // frames between orb spawns
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var healthText = new Text2('Health: 5', {
size: 60,
fill: 0xFF4444
});
healthText.anchor.set(0.5, 0);
healthText.y = 80;
LK.gui.top.addChild(healthText);
// Tutorial system
var showTutorial = true;
var tutorialStep = 0;
var tutorialTimer = 0;
var tutorialTexts = [];
// Create tutorial overlay
var tutorialOverlay = LK.getAsset('tutorialOverlay', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
tutorialOverlay.x = 1024;
tutorialOverlay.y = 1366;
// Tutorial text content
var tutorialMessages = ["Welcome to Color Cascade!", "Drag baskets to catch falling orbs", "Match orb colors with basket colors", "Correct catches = +10 points", "Wrong colors or misses = -1 health", "Reach 500 points to win!", "Tap anywhere to start playing"];
// Create tutorial text elements
for (var t = 0; t < tutorialMessages.length; t++) {
var tutorialText = new Text2(tutorialMessages[t], {
size: 80,
fill: 0xFFFFFF
});
tutorialText.anchor.set(0.5, 0.5);
tutorialText.x = 1024;
tutorialText.y = 1366 + (t - 3) * 100;
tutorialText.alpha = 0;
tutorialTexts.push(tutorialText);
}
// Add tutorial elements to game
if (showTutorial) {
game.addChild(tutorialOverlay);
for (var t = 0; t < tutorialTexts.length; t++) {
game.addChild(tutorialTexts[t]);
}
}
// Create baskets
for (var i = 0; i < colors.length; i++) {
var basket = new Basket(colors[i]);
basket.x = 400 + i * 400;
basket.y = 2600;
baskets.push(basket);
game.addChild(basket);
}
// Mouse/touch handlers
game.down = function (x, y, obj) {
// Dismiss tutorial on any touch
if (showTutorial) {
showTutorial = false;
// Remove tutorial elements
tutorialOverlay.destroy();
for (var t = 0; t < tutorialTexts.length; t++) {
tutorialTexts[t].destroy();
}
tutorialTexts = [];
return;
}
};
game.move = function (x, y, obj) {
if (draggedBasket) {
draggedBasket.x = Math.max(60, Math.min(1988, x));
}
};
game.up = function (x, y, obj) {
draggedBasket = null;
for (var i = 0; i < baskets.length; i++) {
baskets[i].isDragging = false;
}
};
// Main game update loop
game.update = function () {
// Handle tutorial display
if (showTutorial) {
tutorialTimer++;
// Show tutorial steps with timing
if (tutorialTimer < 60) {
// Fade in overlay
tutorialOverlay.alpha = Math.min(0.8, tutorialTimer / 60 * 0.8);
} else if (tutorialTimer < 420) {
// Show tutorial steps every 60 frames
var currentStep = Math.floor((tutorialTimer - 60) / 60);
if (currentStep < tutorialTexts.length) {
tutorialTexts[currentStep].alpha = 1;
tutorialStep = currentStep;
}
}
return; // Don't run game logic during tutorial
}
// Check for game over
if (health <= 0) {
LK.showGameOver();
return;
}
// Check for win condition
if (score >= 500) {
LK.showYouWin();
return;
}
// Spawn orbs
orbSpawnTimer++;
if (orbSpawnTimer >= orbSpawnDelay / gameSpeed) {
orbSpawnTimer = 0;
var randomColor = colors[Math.floor(Math.random() * colors.length)];
var newOrb = new Orb(randomColor);
newOrb.x = 100 + Math.random() * 1848;
newOrb.y = -50;
newOrb.lastIntersecting = [];
// Initialize intersection tracking for each basket
for (var b = 0; b < baskets.length; b++) {
newOrb.lastIntersecting[b] = false;
}
orbs.push(newOrb);
game.addChild(newOrb);
}
// Check orb-basket collisions
for (var i = orbs.length - 1; i >= 0; i--) {
var orb = orbs[i];
var orbCaught = false;
for (var j = 0; j < baskets.length; j++) {
var basket = baskets[j];
var currentIntersecting = orb.intersects(basket);
if (!orb.lastIntersecting[j] && currentIntersecting) {
// Collision just happened
if (orb.color === basket.color) {
// Correct catch
score += 10;
LK.getSound('catch').play();
LK.setScore(score);
} else {
// Wrong color
health--;
LK.getSound('shatter').play();
LK.effects.flashObject(orb, 0xff0000, 300);
}
orb.destroy();
orbs.splice(i, 1);
orbCaught = true;
break;
}
orb.lastIntersecting[j] = currentIntersecting;
}
if (orbCaught) continue;
// Remove orbs that are off screen
if (orb.y > 2800) {
orb.destroy();
orbs.splice(i, 1);
}
}
// Update UI
scoreText.setText('Score: ' + score);
healthText.setText('Health: ' + health);
// Increase difficulty
if (score >= 100 && colors.length === 3) {
colors.push('yellow');
// Add yellow basket
var yellowBasket = new Basket('yellow');
yellowBasket.x = 400 + 3 * 400;
yellowBasket.y = 2600;
baskets.push(yellowBasket);
game.addChild(yellowBasket);
}
if (score >= 200 && colors.length === 4) {
colors.push('purple');
// Add purple basket
var purpleBasket = new Basket('purple');
purpleBasket.x = 400 + 4 * 400;
purpleBasket.y = 2600;
baskets.push(purpleBasket);
game.addChild(purpleBasket);
}
// Increase game speed every 50 points
gameSpeed = 1 + Math.floor(score / 50) * 0.2;
orbSpawnDelay = Math.max(30, 90 - Math.floor(score / 50) * 10);
}; /****
* Classes
****/
var Basket = Container.expand(function (color) {
var self = Container.call(this);
self.color = color;
self.isDragging = false;
var basketGraphics = self.attachAsset(color + 'Basket', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
self.isDragging = true;
draggedBasket = self;
};
self.up = function (x, y, obj) {
self.isDragging = false;
if (draggedBasket === self) {
draggedBasket = null;
}
};
return self;
});
// Game variables
var Orb = Container.expand(function (color) {
var self = Container.call(this);
self.color = color;
self.speed = 3 + Math.random() * 2; // Random fall speed
var orbGraphics = self.attachAsset(color + 'Orb', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
if (self.lastY === undefined) self.lastY = self.y;
self.y += self.speed;
// Check if orb hit the ground
if (self.lastY < 2650 && self.y >= 2650) {
// Missed - lose health
health--;
LK.getSound('miss').play();
self.destroy();
// Remove from orbs array
for (var i = orbs.length - 1; i >= 0; i--) {
if (orbs[i] === self) {
orbs.splice(i, 1);
break;
}
}
}
self.lastY = self.y;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x001122
});
/****
* Game Code
****/
// Sound effects
// Colored baskets
// Colored orbs
// Game variables
var score = 0;
var health = 5;
var gameSpeed = 1;
var colors = ['red', 'blue', 'green'];
var orbs = [];
var baskets = [];
var draggedBasket = null;
var orbSpawnTimer = 0;
var orbSpawnDelay = 90; // frames between orb spawns
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var healthText = new Text2('Health: 5', {
size: 60,
fill: 0xFF4444
});
healthText.anchor.set(0.5, 0);
healthText.y = 80;
LK.gui.top.addChild(healthText);
// Tutorial system
var showTutorial = true;
var tutorialStep = 0;
var tutorialTimer = 0;
var tutorialTexts = [];
// Create tutorial overlay
var tutorialOverlay = LK.getAsset('tutorialOverlay', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
tutorialOverlay.x = 1024;
tutorialOverlay.y = 1366;
// Tutorial text content
var tutorialMessages = ["Welcome to Color Cascade!", "Drag baskets to catch falling orbs", "Match orb colors with basket colors", "Correct catches = +10 points", "Wrong colors or misses = -1 health", "Reach 500 points to win!", "Tap anywhere to start playing"];
// Create tutorial text elements
for (var t = 0; t < tutorialMessages.length; t++) {
var tutorialText = new Text2(tutorialMessages[t], {
size: 80,
fill: 0xFFFFFF
});
tutorialText.anchor.set(0.5, 0.5);
tutorialText.x = 1024;
tutorialText.y = 1366 + (t - 3) * 100;
tutorialText.alpha = 0;
tutorialTexts.push(tutorialText);
}
// Add tutorial elements to game
if (showTutorial) {
game.addChild(tutorialOverlay);
for (var t = 0; t < tutorialTexts.length; t++) {
game.addChild(tutorialTexts[t]);
}
}
// Create baskets
for (var i = 0; i < colors.length; i++) {
var basket = new Basket(colors[i]);
basket.x = 400 + i * 400;
basket.y = 2600;
baskets.push(basket);
game.addChild(basket);
}
// Mouse/touch handlers
game.down = function (x, y, obj) {
// Dismiss tutorial on any touch
if (showTutorial) {
showTutorial = false;
// Remove tutorial elements
tutorialOverlay.destroy();
for (var t = 0; t < tutorialTexts.length; t++) {
tutorialTexts[t].destroy();
}
tutorialTexts = [];
return;
}
};
game.move = function (x, y, obj) {
if (draggedBasket) {
draggedBasket.x = Math.max(60, Math.min(1988, x));
}
};
game.up = function (x, y, obj) {
draggedBasket = null;
for (var i = 0; i < baskets.length; i++) {
baskets[i].isDragging = false;
}
};
// Main game update loop
game.update = function () {
// Handle tutorial display
if (showTutorial) {
tutorialTimer++;
// Show tutorial steps with timing
if (tutorialTimer < 60) {
// Fade in overlay
tutorialOverlay.alpha = Math.min(0.8, tutorialTimer / 60 * 0.8);
} else if (tutorialTimer < 420) {
// Show tutorial steps every 60 frames
var currentStep = Math.floor((tutorialTimer - 60) / 60);
if (currentStep < tutorialTexts.length) {
tutorialTexts[currentStep].alpha = 1;
tutorialStep = currentStep;
}
}
return; // Don't run game logic during tutorial
}
// Check for game over
if (health <= 0) {
LK.showGameOver();
return;
}
// Check for win condition
if (score >= 500) {
LK.showYouWin();
return;
}
// Spawn orbs
orbSpawnTimer++;
if (orbSpawnTimer >= orbSpawnDelay / gameSpeed) {
orbSpawnTimer = 0;
var randomColor = colors[Math.floor(Math.random() * colors.length)];
var newOrb = new Orb(randomColor);
newOrb.x = 100 + Math.random() * 1848;
newOrb.y = -50;
newOrb.lastIntersecting = [];
// Initialize intersection tracking for each basket
for (var b = 0; b < baskets.length; b++) {
newOrb.lastIntersecting[b] = false;
}
orbs.push(newOrb);
game.addChild(newOrb);
}
// Check orb-basket collisions
for (var i = orbs.length - 1; i >= 0; i--) {
var orb = orbs[i];
var orbCaught = false;
for (var j = 0; j < baskets.length; j++) {
var basket = baskets[j];
var currentIntersecting = orb.intersects(basket);
if (!orb.lastIntersecting[j] && currentIntersecting) {
// Collision just happened
if (orb.color === basket.color) {
// Correct catch
score += 10;
LK.getSound('catch').play();
LK.setScore(score);
} else {
// Wrong color
health--;
LK.getSound('shatter').play();
LK.effects.flashObject(orb, 0xff0000, 300);
}
orb.destroy();
orbs.splice(i, 1);
orbCaught = true;
break;
}
orb.lastIntersecting[j] = currentIntersecting;
}
if (orbCaught) continue;
// Remove orbs that are off screen
if (orb.y > 2800) {
orb.destroy();
orbs.splice(i, 1);
}
}
// Update UI
scoreText.setText('Score: ' + score);
healthText.setText('Health: ' + health);
// Increase difficulty
if (score >= 100 && colors.length === 3) {
colors.push('yellow');
// Add yellow basket
var yellowBasket = new Basket('yellow');
yellowBasket.x = 400 + 3 * 400;
yellowBasket.y = 2600;
baskets.push(yellowBasket);
game.addChild(yellowBasket);
}
if (score >= 200 && colors.length === 4) {
colors.push('purple');
// Add purple basket
var purpleBasket = new Basket('purple');
purpleBasket.x = 400 + 4 * 400;
purpleBasket.y = 2600;
baskets.push(purpleBasket);
game.addChild(purpleBasket);
}
// Increase game speed every 50 points
gameSpeed = 1 + Math.floor(score / 50) * 0.2;
orbSpawnDelay = Math.max(30, 90 - Math.floor(score / 50) * 10);
};