User prompt
cloud, wind and flying birds
User prompt
Please fix the bug: 'storage.getItem is not a function' in or related to this line: 'var highScore = storage.getItem('citybloxx_highscore') || 0;' Line Number: 173 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'storage.get is not a function' in or related to this line: 'var highScore = storage.get('citybloxx_highscore') || 0;' Line Number: 173
User prompt
Please fix the bug: 'storage.load is not a function' in or related to this line: 'storage.load('citybloxx_highscore', function (val) {' Line Number: 182
User prompt
Please fix the bug: 'storage.get is not a function' in or related to this line: 'var highScore = storage.get('citybloxx_highscore') || 0;' Line Number: 173
User prompt
Please fix the bug: 'storage.getItem is not a function' in or related to this line: 'var highScore = storage.getItem('citybloxx_highscore') || 0;' Line Number: 173
User prompt
Please fix the bug: 'storage.get is not a function' in or related to this line: 'var highScore = storage.get('citybloxx_highscore') || 0;' Line Number: 173
User prompt
Scoring and Competition Updates
User prompt
May the tower continue forever until we lose
User prompt
Relaxing music while playing the game
User prompt
Add day and night transition to the game
User prompt
Add Combo System to the game
Code edit (1 edits merged)
Please save this source code
User prompt
City Bloxx
Initial prompt
make me a game City Bloxx
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
// Block class: represents a single swinging/dropping block
var Block = Container.expand(function () {
var self = Container.call(this);
// Block properties
self.blockWidth = 600; // Default, will be set on creation
self.blockHeight = 100; // Constant height
self.color = 0x4a90e2; // Default color, can be changed
// State
self.isDropping = false;
self.isLanded = false;
self.swingDirection = 1; // 1: right, -1: left
self.swingSpeed = 8; // px per frame
self.swingRange = 700; // How far from center to swing
self.baseY = 350; // Y position for swinging
self.targetY = 0; // Where to land
self.minX = 0; // Left limit for swinging
self.maxX = 0; // Right limit for swinging
// Graphics
var blockAsset = self.attachAsset('blockShape', {
width: self.blockWidth,
height: self.blockHeight,
color: self.color,
shape: 'box',
anchorX: 0.5,
anchorY: 0.5
});
// Set block size and color
self.setBlock = function (width, color) {
self.blockWidth = width;
blockAsset.width = width;
blockAsset.height = self.blockHeight;
if (color !== undefined) {
self.color = color;
blockAsset.color = color;
}
};
// Set swing limits
self.setSwingLimits = function (minX, maxX) {
self.minX = minX;
self.maxX = maxX;
};
// Start swinging
self.startSwing = function () {
self.isDropping = false;
self.isLanded = false;
self.y = self.baseY;
self.swingDirection = 1;
};
// Drop the block
self.drop = function () {
self.isDropping = true;
};
// Called every frame
self.update = function () {
if (!self.isDropping && !self.isLanded) {
// Swing left/right
self.x += self.swingDirection * self.swingSpeed;
if (self.x > self.maxX) {
self.x = self.maxX;
self.swingDirection = -1;
}
if (self.x < self.minX) {
self.x = self.minX;
self.swingDirection = 1;
}
} else if (self.isDropping && !self.isLanded) {
// Drop down
self.y += 32; // Drop speed
if (self.y >= self.targetY) {
self.y = self.targetY;
self.isDropping = false;
self.isLanded = true;
}
}
};
// Animate block cut (for overhangs)
self.animateCut = function (cutX, cutWidth, _onFinish) {
// Animate the overhanging piece falling off
var overhang = LK.getAsset('blockShape', {
width: cutWidth,
height: self.blockHeight,
color: 0xcccccc,
shape: 'box',
anchorX: 0.5,
anchorY: 0.5,
x: cutX,
y: self.y
});
game.addChild(overhang);
tween(overhang, {
y: self.y + 400,
alpha: 0
}, {
duration: 600,
easing: tween.easeIn,
onFinish: function onFinish() {
overhang.destroy();
if (_onFinish) _onFinish();
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
// No title, no description
// Always backgroundColor is black
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Game constants
var GAME_WIDTH = 2048;
var GAME_HEIGHT = 2732;
var BLOCK_START_WIDTH = 600;
var BLOCK_HEIGHT = 100;
var BLOCK_MIN_WIDTH = 80;
var SWING_MARGIN = 200; // Margin from edge for swinging
var TOWER_BASE_Y = GAME_HEIGHT - 350; // Where the first block lands
// Game state
var blocks = [];
var currentBlock = null;
var lastBlock = null;
var isGameOver = false;
var score = 0;
// Day/Night state
var isDay = true;
var dayNightTimer = 0;
var DAY_DURATION = 1800; // frames (~30s at 60fps)
var NIGHT_DURATION = 1200; // frames (~20s at 60fps)
var dayColor = 0x87ceeb; // Light blue
var nightColor = 0x222a36; // Dark blue
// Combo system state
var combo = 0;
var maxCombo = 0;
var comboTxt = new Text2('', {
size: 80,
fill: 0xFFD700
});
comboTxt.anchor.set(0.5, 0);
comboTxt.visible = false;
LK.gui.top.addChild(comboTxt);
// Score display
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// High score display
var highScore = storage.get('citybloxx_highscore') || 0;
var highScoreTxt = new Text2('BEST: ' + highScore, {
size: 60,
fill: 0xFFD700
});
highScoreTxt.anchor.set(0.5, 0);
highScoreTxt.y = 110;
LK.gui.top.addChild(highScoreTxt);
// Helper: get random color for block
function getBlockColor(idx) {
var palette = [0x4a90e2, 0xf5a623, 0x7ed321, 0xd0021b, 0x9013fe, 0x50e3c2];
return palette[idx % palette.length];
}
// Helper: create a new block
function createBlock(width, y, color) {
var block = new Block();
block.setBlock(width, color);
block.baseY = 350;
block.targetY = y;
block.setSwingLimits(SWING_MARGIN + width / 2, GAME_WIDTH - SWING_MARGIN - width / 2);
block.x = GAME_WIDTH / 2;
block.y = block.baseY;
block.startSwing();
return block;
}
// Start the game
function startGame() {
// Reset state
for (var i = 0; i < blocks.length; i++) {
blocks[i].destroy();
}
blocks = [];
currentBlock = null;
lastBlock = null;
isGameOver = false;
score = 0;
scoreTxt.setText(score);
highScore = storage.get('citybloxx_highscore') || 0;
highScoreTxt.setText('BEST: ' + highScore);
// Reset combo system
combo = 0;
maxCombo = 0;
comboTxt.setText('');
comboTxt.visible = false;
// Reset day/night state
isDay = true;
dayNightTimer = 0;
game.setBackgroundColor(dayColor);
// Place the first block (static, as tower base)
var baseBlock = new Block();
baseBlock.setBlock(BLOCK_START_WIDTH, getBlockColor(0));
baseBlock.x = GAME_WIDTH / 2;
baseBlock.y = TOWER_BASE_Y;
baseBlock.isDropping = false;
baseBlock.isLanded = true;
game.addChild(baseBlock);
blocks.push(baseBlock);
lastBlock = baseBlock;
// Place the first swinging block
spawnNextBlock();
}
// Spawn the next swinging block
function spawnNextBlock() {
var idx = blocks.length;
var width = lastBlock.blockWidth;
var color = getBlockColor(idx);
var y = lastBlock.y - BLOCK_HEIGHT;
var block = createBlock(width, y, color);
game.addChild(block);
blocks.push(block);
currentBlock = block;
}
// Handle tap to drop block
game.down = function (x, y, obj) {
if (isGameOver) return;
if (!currentBlock || currentBlock.isDropping || currentBlock.isLanded) return;
currentBlock.drop();
};
// Main update loop
game.update = function () {
if (isGameOver) return;
// Day/Night transition logic
dayNightTimer++;
if (isDay && dayNightTimer >= DAY_DURATION) {
isDay = false;
dayNightTimer = 0;
// Smooth transition to night
tween(game, {
backgroundColor: nightColor
}, {
duration: 1200,
onUpdate: function onUpdate() {
// Interpolate color for smoothness
var t = this.progress;
var r1 = dayColor >> 16 & 0xff,
g1 = dayColor >> 8 & 0xff,
b1 = dayColor & 0xff;
var r2 = nightColor >> 16 & 0xff,
g2 = nightColor >> 8 & 0xff,
b2 = nightColor & 0xff;
var r = Math.round(r1 + (r2 - r1) * t);
var g = Math.round(g1 + (g2 - g1) * t);
var b = Math.round(b1 + (b2 - b1) * t);
game.setBackgroundColor(r << 16 | g << 8 | b);
}
});
}
if (!isDay && dayNightTimer >= NIGHT_DURATION) {
isDay = true;
dayNightTimer = 0;
// Smooth transition to day
tween(game, {
backgroundColor: dayColor
}, {
duration: 1200,
onUpdate: function onUpdate() {
var t = this.progress;
var r1 = nightColor >> 16 & 0xff,
g1 = nightColor >> 8 & 0xff,
b1 = nightColor & 0xff;
var r2 = dayColor >> 16 & 0xff,
g2 = dayColor >> 8 & 0xff,
b2 = dayColor & 0xff;
var r = Math.round(r1 + (r2 - r1) * t);
var g = Math.round(g1 + (g2 - g1) * t);
var b = Math.round(b1 + (b2 - b1) * t);
game.setBackgroundColor(r << 16 | g << 8 | b);
}
});
}
// Update all blocks
for (var i = 0; i < blocks.length; i++) {
blocks[i].update();
}
// If current block has landed, check alignment
if (currentBlock && currentBlock.isLanded && !isGameOver) {
// Check overlap with last block
var prev = lastBlock;
var curr = currentBlock;
var prevLeft = prev.x - prev.blockWidth / 2;
var prevRight = prev.x + prev.blockWidth / 2;
var currLeft = curr.x - curr.blockWidth / 2;
var currRight = curr.x + curr.blockWidth / 2;
var overlapLeft = Math.max(prevLeft, currLeft);
var overlapRight = Math.min(prevRight, currRight);
var overlapWidth = overlapRight - overlapLeft;
if (overlapWidth <= 0) {
// No overlap: game over
endGame();
return;
}
// If block is perfectly aligned, no cut
var perfectAlign = Math.abs(curr.x - prev.x) < 2 && overlapWidth === curr.blockWidth;
if (overlapWidth < curr.blockWidth) {
// Cut off overhangs
var cutLeft = currLeft < prevLeft;
var cutRight = currRight > prevRight;
// Animate left overhang
if (cutLeft) {
var cutW = prevLeft - currLeft;
var cutX = curr.x - curr.blockWidth / 2 + cutW / 2;
curr.animateCut(cutX, cutW);
}
// Animate right overhang
if (cutRight) {
var cutW = currRight - prevRight;
var cutX = curr.x + curr.blockWidth / 2 - cutW / 2;
curr.animateCut(cutX, cutW);
}
// Shrink block to overlap
curr.setBlock(overlapWidth, curr.color);
curr.x = (overlapLeft + overlapRight) / 2;
}
// Combo system: check for perfect alignment
if (perfectAlign) {
combo += 1;
if (combo > maxCombo) maxCombo = combo;
comboTxt.setText('COMBO x' + combo);
comboTxt.visible = true;
comboTxt.x = GAME_WIDTH / 2;
comboTxt.y = 180;
// Animate combo text
comboTxt.alpha = 1;
tween(comboTxt, {
alpha: 0
}, {
duration: 900,
onFinish: function onFinish() {
comboTxt.visible = false;
}
});
} else {
combo = 0;
comboTxt.visible = false;
}
// Update score
score += 1;
scoreTxt.setText(score);
// Prepare for next block
lastBlock = curr;
// If block is too small, game over
if (curr.blockWidth < BLOCK_MIN_WIDTH) {
endGame();
return;
}
// If tower reaches top, do nothing (game continues)
// Spawn next block
spawnNextBlock();
}
};
// End the game
function endGame() {
isGameOver = true;
// Update high score if needed
if (score > highScore) {
highScore = score;
storage.set('citybloxx_highscore', highScore);
highScoreTxt.setText('BEST: ' + highScore);
// Submit to leaderboard if available
if (typeof LK.submitScore === 'function') {
LK.submitScore(highScore);
}
}
// Flash screen red
LK.effects.flashScreen(0xff0000, 800);
// Show game over popup
LK.showGameOver();
}
// Asset initialization (shapes)
// Start the game on load
startGame();
;
// Play relaxing background music (loops by default)
LK.playMusic('relaxing_music'); ===================================================================
--- original.js
+++ change.js
@@ -1,8 +1,9 @@
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
@@ -159,8 +160,17 @@
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
+// High score display
+var highScore = storage.get('citybloxx_highscore') || 0;
+var highScoreTxt = new Text2('BEST: ' + highScore, {
+ size: 60,
+ fill: 0xFFD700
+});
+highScoreTxt.anchor.set(0.5, 0);
+highScoreTxt.y = 110;
+LK.gui.top.addChild(highScoreTxt);
// Helper: get random color for block
function getBlockColor(idx) {
var palette = [0x4a90e2, 0xf5a623, 0x7ed321, 0xd0021b, 0x9013fe, 0x50e3c2];
return palette[idx % palette.length];
@@ -188,8 +198,10 @@
lastBlock = null;
isGameOver = false;
score = 0;
scoreTxt.setText(score);
+ highScore = storage.get('citybloxx_highscore') || 0;
+ highScoreTxt.setText('BEST: ' + highScore);
// Reset combo system
combo = 0;
maxCombo = 0;
comboTxt.setText('');
@@ -362,8 +374,18 @@
};
// End the game
function endGame() {
isGameOver = true;
+ // Update high score if needed
+ if (score > highScore) {
+ highScore = score;
+ storage.set('citybloxx_highscore', highScore);
+ highScoreTxt.setText('BEST: ' + highScore);
+ // Submit to leaderboard if available
+ if (typeof LK.submitScore === 'function') {
+ LK.submitScore(highScore);
+ }
+ }
// Flash screen red
LK.effects.flashScreen(0xff0000, 800);
// Show game over popup
LK.showGameOver();