User prompt
Edit the number of boxes according to the level and make them lower
User prompt
There should be no space between the boxes. There is a 50% chance of 1 space. There is a 35% chance of 2 spaces. There is a 25% chance of 3 spaces. There is a 10% chance of 4 spaces. There is a 5% chance of 5 spaces.
User prompt
Let's change the spawning percentages: 50% chance 2 times, 25% chance 4 times, 15% chance 8 times, 5% chance 16 times, according to the level
User prompt
There is a 20% chance that you will get a box that is twice the level number, and a 3% chance that you will get a box that is 4 times the level number.
User prompt
Make the number of balls thrown equal to the level number
Code edit (2 edits merged)
Please save this source code
User prompt
The problem occurs when you reach level 4.
User prompt
again the bug has entered, find the problem and solve it
User prompt
Level 4 is also bugged, it doesn't start again when the balls run out, fix this
User prompt
No, it's not like that, start from one again, go up to 100 and the boxes are proportional to the level, even double the level number with a 15% chance.
User prompt
Keep the level and the number of balls equal and make the level number 100
User prompt
the game is bugged, start the levels properly and edit them
User prompt
Coins and +1 balls should stay fixed between the boxes and not fall.
User prompt
Let's also throw a ball equal to the level.
User prompt
add things like coins and extra balls +1 that are placed behind the boxes
User prompt
Make the boxes a little bigger with the text and zoom in
Code edit (1 edits merged)
Please save this source code
User prompt
Ball Blast Brick Breaker
Initial prompt
Make me a game very similar to BBTAN and research it with everything and make it completely similar to it.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Ball = Container.expand(function () {
var self = Container.call(this);
var ballGraphics = self.attachAsset('ball', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 0;
self.velocityY = 0;
self.speed = 20;
self.isActive = false;
self.hasHitBlock = false;
self.update = function () {
if (!self.isActive) {
return;
}
self.x += self.velocityX;
self.y += self.velocityY;
// Bounce off walls
if (self.x <= 20 || self.x >= 2028) {
self.velocityX = -self.velocityX;
self.x = Math.max(20, Math.min(2028, self.x));
}
// Bounce off top
if (self.y <= 20) {
self.velocityY = -self.velocityY;
self.y = 20;
}
// Check if ball reached bottom
if (self.y >= 2700) {
self.isActive = false;
ballsActive--;
}
};
return self;
});
var Block = Container.expand(function () {
var self = Container.call(this);
var blockGraphics = self.attachAsset('block', {
anchorX: 0.5,
anchorY: 0.5
});
self.hitPoints = 1;
self.maxHitPoints = 1;
self.numberText = new Text2('1', {
size: 45,
fill: 0xFFFFFF
});
self.numberText.anchor.set(0.5, 0.5);
self.addChild(self.numberText);
self.setHitPoints = function (points) {
self.hitPoints = points;
self.maxHitPoints = points;
self.numberText.setText(points.toString());
// Color based on hit points
var intensity = Math.min(points / 10, 1);
var red = Math.floor(255 * intensity);
var green = Math.floor(100 * (1 - intensity));
var blue = Math.floor(100 * (1 - intensity));
var color = red << 16 | green << 8 | blue;
blockGraphics.tint = color;
};
self.hit = function () {
self.hitPoints--;
self.numberText.setText(self.hitPoints.toString());
if (self.hitPoints <= 0) {
LK.getSound('blockDestroy').play();
return true; // Block destroyed
} else {
LK.getSound('blockHit').play();
// Flash effect
tween(blockGraphics, {
tint: 0xffffff
}, {
duration: 100,
onFinish: function onFinish() {
var intensity = Math.min(self.hitPoints / 10, 1);
var red = Math.floor(255 * intensity);
var green = Math.floor(100 * (1 - intensity));
var blue = Math.floor(100 * (1 - intensity));
var color = red << 16 | green << 8 | blue;
tween(blockGraphics, {
tint: color
}, {
duration: 100
});
}
});
return false; // Block still alive
}
};
return self;
});
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityY = 2; // Slow downward movement
self.collected = false;
self.update = function () {
if (self.collected) {
return;
}
self.y += self.velocityY;
// Remove if goes off screen
if (self.y > 2800) {
self.collected = true;
}
};
return self;
});
var ExtraBall = Container.expand(function () {
var self = Container.call(this);
var ballGraphics = self.attachAsset('extraBall', {
anchorX: 0.5,
anchorY: 0.5
});
var plusText = new Text2('+1', {
size: 30,
fill: 0xFFFFFF
});
plusText.anchor.set(0.5, 0.5);
plusText.y = -40;
self.addChild(plusText);
self.velocityY = 2; // Slow downward movement
self.collected = false;
self.update = function () {
if (self.collected) {
return;
}
self.y += self.velocityY;
// Remove if goes off screen
if (self.y > 2800) {
self.collected = true;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a2e
});
/****
* Game Code
****/
// Game state variables
var blocks = [];
var balls = [];
var coins = [];
var extraBalls = [];
var ballsActive = 0;
var maxBalls = 0;
var gameState = 'aiming'; // 'aiming', 'shooting', 'waiting'
var aimAngle = 0;
var shooterX = 1024;
var shooterY = 2600;
var level = 1;
var ballsToShoot = 1;
var aimLine = null;
// UI Elements
var ballCountText = new Text2('1', {
size: 40,
fill: 0xFFFFFF
});
ballCountText.anchor.set(0.5, 0.5);
ballCountText.x = 150;
ballCountText.y = 2650;
game.addChild(ballCountText);
var levelText = new Text2('Level 1', {
size: 50,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0);
LK.gui.top.addChild(levelText);
// Create aim line
aimLine = LK.getAsset('aimLine', {
anchorX: 0.5,
anchorY: 1
});
aimLine.x = shooterX;
aimLine.y = shooterY;
aimLine.visible = false;
game.addChild(aimLine);
// Initialize first level
function createBlockRow(rowY, startLevel) {
var blocksPerRow = 7;
var blockWidth = 160;
var spacing = (2048 - 100) / blocksPerRow;
for (var i = 0; i < blocksPerRow; i++) {
var xPos = 100 + i * spacing + spacing / 2;
// 15% chance for coin behind block position
if (Math.random() < 0.15) {
var coin = new Coin();
coin.x = xPos;
coin.y = rowY;
coins.push(coin);
game.addChild(coin);
}
// 10% chance for extra ball behind block position
else if (Math.random() < 0.10) {
var extraBall = new ExtraBall();
extraBall.x = xPos;
extraBall.y = rowY;
extraBalls.push(extraBall);
game.addChild(extraBall);
}
if (Math.random() < 0.7) {
// 70% chance for block
var block = new Block();
block.x = xPos;
block.y = rowY;
// Hit points proportional to level (1 to level number)
var hitPoints = Math.floor(Math.random() * startLevel) + 1;
// 15% chance for double the level number
if (Math.random() < 0.15) {
hitPoints = startLevel * 2;
}
block.setHitPoints(hitPoints);
blocks.push(block);
game.addChild(block);
}
}
}
// Create initial blocks
createBlockRow(300, level);
function checkBallBlockCollisions() {
for (var i = balls.length - 1; i >= 0; i--) {
var ball = balls[i];
if (!ball.isActive) {
continue;
}
// Check coin collisions
for (var k = coins.length - 1; k >= 0; k--) {
var coin = coins[k];
if (!coin.collected && ball.intersects(coin)) {
coin.collected = true;
coin.destroy();
coins.splice(k, 1);
LK.setScore(LK.getScore() + 10);
LK.getSound('coinCollect').play();
}
}
// Check extra ball collisions
for (var l = extraBalls.length - 1; l >= 0; l--) {
var extraBall = extraBalls[l];
if (!extraBall.collected && ball.intersects(extraBall)) {
extraBall.collected = true;
extraBall.destroy();
extraBalls.splice(l, 1);
ballsToShoot++;
ballCountText.setText(ballsToShoot.toString());
LK.getSound('extraBallCollect').play();
}
}
for (var j = blocks.length - 1; j >= 0; j--) {
var block = blocks[j];
if (ball.intersects(block)) {
// Simple bounce physics
var dx = ball.x - block.x;
var dy = ball.y - block.y;
if (Math.abs(dx) > Math.abs(dy)) {
ball.velocityX = -ball.velocityX;
} else {
ball.velocityY = -ball.velocityY;
}
// Hit the block
if (block.hit()) {
// Block destroyed
block.destroy();
blocks.splice(j, 1);
}
ball.hasHitBlock = true;
break;
}
}
}
}
function moveBlocksDown() {
for (var i = 0; i < blocks.length; i++) {
blocks[i].y += 160; // Move down by block height
}
// Move power-ups down too
for (var i = 0; i < coins.length; i++) {
coins[i].y += 160;
}
for (var i = 0; i < extraBalls.length; i++) {
extraBalls[i].y += 160;
}
// Check if any block reached bottom
for (var i = 0; i < blocks.length; i++) {
if (blocks[i].y >= 2500) {
LK.showGameOver();
return;
}
}
}
function nextLevel() {
level++;
ballsToShoot++;
ballCountText.setText(ballsToShoot.toString());
levelText.setText('Level ' + level);
// Move existing blocks down
moveBlocksDown();
// Add new row at top
createBlockRow(300, level);
// Check win condition
if (blocks.length === 0) {
// Add multiple rows for next level
for (var row = 0; row < 3; row++) {
createBlockRow(300 + row * 160, level);
}
}
gameState = 'aiming';
}
function shootBall() {
if (ballsToShoot <= 0) {
return;
}
var ball = new Ball();
ball.x = shooterX;
ball.y = shooterY;
ball.velocityX = Math.cos(aimAngle) * ball.speed;
ball.velocityY = Math.sin(aimAngle) * ball.speed;
ball.isActive = true;
balls.push(ball);
game.addChild(ball);
ballsActive++;
maxBalls++;
ballsToShoot--;
ballCountText.setText(ballsToShoot.toString());
LK.getSound('shoot').play();
}
game.move = function (x, y, obj) {
if (gameState !== 'aiming') {
return;
}
var dx = x - shooterX;
var dy = y - shooterY;
aimAngle = Math.atan2(dy, dx);
// Limit aim angle to upward direction
if (aimAngle > -0.1 && aimAngle < Math.PI + 0.1) {
aimAngle = Math.max(Math.min(aimAngle, -0.1), -Math.PI + 0.1);
}
// Update aim line
aimLine.rotation = aimAngle + Math.PI / 2;
aimLine.visible = true;
};
game.down = function (x, y, obj) {
if (gameState === 'aiming' && ballsToShoot > 0) {
gameState = 'shooting';
aimLine.visible = false;
// Shoot first ball immediately
shootBall();
// Set up timer for remaining balls
if (ballsToShoot > 0) {
var shootTimer = LK.setInterval(function () {
if (ballsToShoot > 0) {
shootBall();
} else {
LK.clearInterval(shootTimer);
}
}, 150);
}
}
};
game.update = function () {
// Update balls
for (var i = balls.length - 1; i >= 0; i--) {
var ball = balls[i];
if (!ball.isActive) {
ball.destroy();
balls.splice(i, 1);
}
}
// Clean up collected coins
for (var i = coins.length - 1; i >= 0; i--) {
var coin = coins[i];
if (coin.collected) {
coin.destroy();
coins.splice(i, 1);
}
}
// Clean up collected extra balls
for (var i = extraBalls.length - 1; i >= 0; i--) {
var extraBall = extraBalls[i];
if (extraBall.collected) {
extraBall.destroy();
extraBalls.splice(i, 1);
}
}
// Check collisions
checkBallBlockCollisions();
// Check if all balls are done
if (gameState === 'shooting' && ballsActive === 0 && ballsToShoot === 0) {
ballsToShoot = maxBalls + 1;
ballCountText.setText(ballsToShoot.toString());
maxBalls = 0;
// Wait a moment then start next level
LK.setTimeout(function () {
nextLevel();
}, 500);
}
// Reset ballsActive counter
ballsActive = 0;
for (var i = 0; i < balls.length; i++) {
if (balls[i].isActive) {
ballsActive++;
}
}
}; ===================================================================
--- original.js
+++ change.js