User prompt
add a little bit more rotation
User prompt
let the cannon be able to rotate slightly so it can shoot higher up and lower down ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
give the cannon a cool down of 15 seconds
User prompt
no animation just rotate it so that the long side is facing right.
User prompt
rotate cannon ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
let it only happen if the user clicks one of the cannons cannon balls.
User prompt
remove all three of those cannons. add 1 good looking cannon to the left side of the screen that shoot special effects that gives the user ability to slow down time it also gives a cool little lightning effect. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
add cannons that shoot out special effects ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
add a volume option whenever the game is paused ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
make sure the heart fully vanishes after selected ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
the heart still leaves a dot on the screen. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
the heart leaves a mark. make that not happen ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
make the glow red not golden ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
when i select the heart dont let the screen turn red. add a special effect for the ehart ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
still not hearing anything
User prompt
okay make me hear it now
User prompt
add calm game music
User prompt
make the heart more heart shaped
User prompt
add a heart that floats about randomly but not too often that gives the user an extra life ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
make the score look better ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
add special effects when chosen the correct circle ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
also let the balls despawn when its over 8
User prompt
okay dont add a timer for the game
User prompt
scrap that idea lets use something else
User prompt
fix the game
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Block = Container.expand(function () {
var self = Container.call(this);
self.blockWidth = 200;
self.blockHeight = 60;
var blockGraphics = self.attachAsset('block', {
anchorX: 0.5,
anchorY: 0.5
});
self.setWidth = function (newWidth) {
self.blockWidth = newWidth;
blockGraphics.width = newWidth;
};
self.getWidth = function () {
return self.blockWidth;
};
return self;
});
var FallingBlock = Container.expand(function () {
var self = Container.call(this);
self.blockWidth = 200;
self.blockHeight = 60;
self.speed = 200;
self.stopped = false;
var blockGraphics = self.attachAsset('fallingBlock', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
if (!self.stopped) {
self.y += self.speed / 60; // Proper frame-based movement
}
};
self.stop = function () {
self.stopped = true;
};
self.setWidth = function (newWidth) {
self.blockWidth = newWidth;
blockGraphics.width = newWidth;
};
self.getWidth = function () {
return self.blockWidth;
};
return self;
});
/****
* Initialize Game
****/
// Game variables
var game = new LK.Game({
backgroundColor: 0x1a1a2e
});
/****
* Game Code
****/
// Game variables
// Import tween plugin for animations
// Initialize game assets
var tower = [];
var currentFallingBlock = null;
var gameRunning = true;
var currentPlatformWidth = 200;
var dropSpeed = 200;
var perfectStreak = 0;
var lastDropTime = 0;
var dropInterval = 2000; // 2 seconds initially
// UI Elements
var scoreTxt = new Text2('0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
scoreTxt.y = 50;
var streakTxt = new Text2('', {
size: 40,
fill: 0xFFD700
});
streakTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(streakTxt);
streakTxt.y = 150;
// Create base platform
var basePlatform = game.addChild(new Block());
basePlatform.x = 1024;
basePlatform.y = 2400;
tower.push(basePlatform);
function spawnFallingBlock() {
if (!gameRunning || currentFallingBlock) return;
currentFallingBlock = game.addChild(new FallingBlock());
currentFallingBlock.setWidth(currentPlatformWidth);
// Random horizontal position
var minX = currentPlatformWidth / 2;
var maxX = 2048 - currentPlatformWidth / 2;
currentFallingBlock.x = Math.random() * (maxX - minX) + minX;
currentFallingBlock.y = -30;
// Increase speed based on tower height
var speedMultiplier = 1 + tower.length * 0.1;
currentFallingBlock.speed = dropSpeed * speedMultiplier;
}
function dropBlock() {
if (!currentFallingBlock || !gameRunning) return;
currentFallingBlock.stop();
var topBlock = tower[tower.length - 1];
var alignment = Math.abs(currentFallingBlock.x - topBlock.x);
var tolerance = 10; // Perfect drop tolerance
if (alignment > currentPlatformWidth) {
// Complete miss - game over
gameOver();
return;
}
var newBlock = game.addChild(new Block());
var overlap = currentPlatformWidth - alignment * 2;
var newWidth = Math.max(overlap, 20); // Minimum width of 20
// Position new block
if (currentFallingBlock.x < topBlock.x) {
newBlock.x = topBlock.x - (currentPlatformWidth - newWidth) / 2;
} else {
newBlock.x = topBlock.x + (currentPlatformWidth - newWidth) / 2;
}
newBlock.y = topBlock.y - newBlock.blockHeight;
newBlock.setWidth(newWidth);
// Check if it's a perfect drop
var isPerfect = alignment <= tolerance;
if (isPerfect) {
perfectStreak++;
LK.getSound('perfect').play();
// Flash block green for perfect drop
tween(newBlock, {
tint: 0x00FF00
}, {
duration: 200,
onFinish: function onFinish() {
tween(newBlock, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
// Bonus points for perfect drops
LK.setScore(LK.getScore() + 10 + perfectStreak * 5);
} else {
perfectStreak = 0;
currentPlatformWidth = newWidth;
LK.getSound('trim').play();
// Flash block red for trimmed drop
tween(newBlock, {
tint: 0xFF6666
}, {
duration: 200,
onFinish: function onFinish() {
tween(newBlock, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
LK.setScore(LK.getScore() + 1);
}
LK.getSound('drop').play();
tower.push(newBlock);
// Remove falling block
currentFallingBlock.destroy();
currentFallingBlock = null;
// Update UI
scoreTxt.setText(LK.getScore());
if (perfectStreak > 0) {
streakTxt.setText('Perfect x' + perfectStreak);
} else {
streakTxt.setText('');
}
// Adjust camera to follow tower (keep tower in center of screen)
if (tower.length > 5) {
// Start following after 5 blocks
var cameraY = 2400 - newBlock.y - 800; // Keep tower visible in center
tween(game, {
y: cameraY
}, {
duration: 500,
easing: tween.easeOut
});
}
// Increase difficulty
dropInterval = Math.max(800, dropInterval - 20); // Minimum 0.8 seconds
lastDropTime = LK.ticks;
}
function gameOver() {
gameRunning = false;
// Flash screen red
LK.effects.flashScreen(0xFF0000, 1000);
// Show game over after a brief delay
LK.setTimeout(function () {
LK.showGameOver();
}, 1000);
}
// Touch/click handler
game.down = function (x, y, obj) {
if (currentFallingBlock && !currentFallingBlock.stopped) {
dropBlock();
}
};
// Game update loop
game.update = function () {
// Spawn new falling block if needed (convert milliseconds to frames: 60fps)
if (gameRunning && !currentFallingBlock && LK.ticks - lastDropTime > dropInterval * 60 / 1000) {
spawnFallingBlock();
}
// Check if falling block went off screen (should not happen in normal gameplay)
if (currentFallingBlock && currentFallingBlock.y > 2800) {
gameOver();
}
};
// Initialize game
lastDropTime = LK.ticks;
spawnFallingBlock(); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Block = Container.expand(function () {
var self = Container.call(this);
self.blockWidth = 200;
self.blockHeight = 60;
var blockGraphics = self.attachAsset('block', {
anchorX: 0.5,
anchorY: 0.5
});
self.setWidth = function (newWidth) {
self.blockWidth = newWidth;
blockGraphics.width = newWidth;
};
self.getWidth = function () {
return self.blockWidth;
};
return self;
});
var FallingBlock = Container.expand(function () {
var self = Container.call(this);
self.blockWidth = 200;
self.blockHeight = 60;
self.speed = 200;
self.stopped = false;
var blockGraphics = self.attachAsset('fallingBlock', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
if (!self.stopped) {
self.y += self.speed / 60; // Proper frame-based movement
}
};
self.stop = function () {
self.stopped = true;
};
self.setWidth = function (newWidth) {
self.blockWidth = newWidth;
blockGraphics.width = newWidth;
};
self.getWidth = function () {
return self.blockWidth;
};
return self;
});
/****
* Initialize Game
****/
// Game variables
var game = new LK.Game({
backgroundColor: 0x1a1a2e
});
/****
* Game Code
****/
// Game variables
// Import tween plugin for animations
// Initialize game assets
var tower = [];
var currentFallingBlock = null;
var gameRunning = true;
var currentPlatformWidth = 200;
var dropSpeed = 200;
var perfectStreak = 0;
var lastDropTime = 0;
var dropInterval = 2000; // 2 seconds initially
// UI Elements
var scoreTxt = new Text2('0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
scoreTxt.y = 50;
var streakTxt = new Text2('', {
size: 40,
fill: 0xFFD700
});
streakTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(streakTxt);
streakTxt.y = 150;
// Create base platform
var basePlatform = game.addChild(new Block());
basePlatform.x = 1024;
basePlatform.y = 2400;
tower.push(basePlatform);
function spawnFallingBlock() {
if (!gameRunning || currentFallingBlock) return;
currentFallingBlock = game.addChild(new FallingBlock());
currentFallingBlock.setWidth(currentPlatformWidth);
// Random horizontal position
var minX = currentPlatformWidth / 2;
var maxX = 2048 - currentPlatformWidth / 2;
currentFallingBlock.x = Math.random() * (maxX - minX) + minX;
currentFallingBlock.y = -30;
// Increase speed based on tower height
var speedMultiplier = 1 + tower.length * 0.1;
currentFallingBlock.speed = dropSpeed * speedMultiplier;
}
function dropBlock() {
if (!currentFallingBlock || !gameRunning) return;
currentFallingBlock.stop();
var topBlock = tower[tower.length - 1];
var alignment = Math.abs(currentFallingBlock.x - topBlock.x);
var tolerance = 10; // Perfect drop tolerance
if (alignment > currentPlatformWidth) {
// Complete miss - game over
gameOver();
return;
}
var newBlock = game.addChild(new Block());
var overlap = currentPlatformWidth - alignment * 2;
var newWidth = Math.max(overlap, 20); // Minimum width of 20
// Position new block
if (currentFallingBlock.x < topBlock.x) {
newBlock.x = topBlock.x - (currentPlatformWidth - newWidth) / 2;
} else {
newBlock.x = topBlock.x + (currentPlatformWidth - newWidth) / 2;
}
newBlock.y = topBlock.y - newBlock.blockHeight;
newBlock.setWidth(newWidth);
// Check if it's a perfect drop
var isPerfect = alignment <= tolerance;
if (isPerfect) {
perfectStreak++;
LK.getSound('perfect').play();
// Flash block green for perfect drop
tween(newBlock, {
tint: 0x00FF00
}, {
duration: 200,
onFinish: function onFinish() {
tween(newBlock, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
// Bonus points for perfect drops
LK.setScore(LK.getScore() + 10 + perfectStreak * 5);
} else {
perfectStreak = 0;
currentPlatformWidth = newWidth;
LK.getSound('trim').play();
// Flash block red for trimmed drop
tween(newBlock, {
tint: 0xFF6666
}, {
duration: 200,
onFinish: function onFinish() {
tween(newBlock, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
LK.setScore(LK.getScore() + 1);
}
LK.getSound('drop').play();
tower.push(newBlock);
// Remove falling block
currentFallingBlock.destroy();
currentFallingBlock = null;
// Update UI
scoreTxt.setText(LK.getScore());
if (perfectStreak > 0) {
streakTxt.setText('Perfect x' + perfectStreak);
} else {
streakTxt.setText('');
}
// Adjust camera to follow tower (keep tower in center of screen)
if (tower.length > 5) {
// Start following after 5 blocks
var cameraY = 2400 - newBlock.y - 800; // Keep tower visible in center
tween(game, {
y: cameraY
}, {
duration: 500,
easing: tween.easeOut
});
}
// Increase difficulty
dropInterval = Math.max(800, dropInterval - 20); // Minimum 0.8 seconds
lastDropTime = LK.ticks;
}
function gameOver() {
gameRunning = false;
// Flash screen red
LK.effects.flashScreen(0xFF0000, 1000);
// Show game over after a brief delay
LK.setTimeout(function () {
LK.showGameOver();
}, 1000);
}
// Touch/click handler
game.down = function (x, y, obj) {
if (currentFallingBlock && !currentFallingBlock.stopped) {
dropBlock();
}
};
// Game update loop
game.update = function () {
// Spawn new falling block if needed (convert milliseconds to frames: 60fps)
if (gameRunning && !currentFallingBlock && LK.ticks - lastDropTime > dropInterval * 60 / 1000) {
spawnFallingBlock();
}
// Check if falling block went off screen (should not happen in normal gameplay)
if (currentFallingBlock && currentFallingBlock.y > 2800) {
gameOver();
}
};
// Initialize game
lastDropTime = LK.ticks;
spawnFallingBlock();