User prompt
make sure this line is not executed twice in a row:if (currentChallenge.every(function (challenge) { console.log("All objectives complete for current challenge set."); return challenge.completed; }))
Code edit (3 edits merged)
Please save this source code
User prompt
add a console log to understand what is executed when an objective is complete in a challenge
User prompt
make sure to flag individually each objective in each challenge and make sure all objectives are completed before bounces remaining are refreshed
User prompt
there is still one scenario where remaining bounces is being updated after completing the first objective of the challenge, console log that even too
User prompt
please find more places where remaining bounces is refreshed
User prompt
add console log where remaining bounces are incremented
User prompt
add console log in any other part where the remaining bounces are updated
User prompt
add console log when remaining bounces are refreshed
User prompt
console log when score is increased in challenge
User prompt
refactor updateprogress method in the challenge class, to make sure that per challenge, the remaining bounce are not refreshed, only when the challenge is completed, meaning all obstacles have been completed.
Code edit (1 edits merged)
Please save this source code
User prompt
make sure obstacles iscons are text are removed from challenge container when we move to the next challegne
User prompt
when the firsts obstacle of the challenge is completed, do not add more bounces
User prompt
make sure challenge container is deleted after a challenge is completed
Code edit (4 edits merged)
Please save this source code
User prompt
bounding collision box sould have some margin
User prompt
improve collision detection between dot aand obstacles.
Code edit (1 edits merged)
Please save this source code
User prompt
after first player bounce, the stars, obstacles and orbit should not move downwards
Code edit (9 edits merged)
Please save this source code
User prompt
move hand and initial dot position 50 pixels down
User prompt
obstacles challenge should have a color
User prompt
refactor challenges logic and how they are updated
Code edit (1 edits merged)
Please save this source code
/****
* Classes
****/
var BounceEffect = Container.expand(function (x, y, color) {
var self = Container.call(this);
self.x = x;
self.y = y;
var bounceGraphics = self.attachAsset('bounceEffect', {
anchorX: 0.5,
anchorY: 0.5
});
bounceGraphics.tint = color;
var duration = 30;
self._update_migrated = function () {
duration--;
bounceGraphics.scaleX += 0.1;
bounceGraphics.scaleY += 0.1;
bounceGraphics.alpha -= 0.033;
bounceGraphics.scaleX -= 0.01;
bounceGraphics.scaleY -= 0.01;
if (duration <= 0) {
self.destroy();
}
};
game.addChild(self);
});
var Challenge = Container.expand(function (color, amount, bounceLimit) {
var self = Container.call(this);
self.color = color;
self.amount = amount;
self.bounceLimit = bounceLimit;
self.remainingBounces = bounceLimit; // Initialize remainingBounces correctly
self.completed = false;
var obstacleIcon = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5,
tint: color,
scaleX: 0.5,
scaleY: 0.5
});
obstacleIcon.x = 250;
obstacleIcon.y = 40;
var challengeText = new Text2('0/' + amount, {
size: 75,
fill: "#ffffff",
stroke: "#000000",
strokeThickness: 8,
anchorX: 0.5,
anchorY: 0.5
});
challengeText.x = 300;
challengeText.y -= 10;
self.addChild(obstacleIcon);
self.addChild(challengeText);
self.updateProgress = function () {
self.amount -= 1;
challengeText.setText(amount - self.amount + '/' + amount);
if (self.amount <= 0) {
self.completed = true;
if (currentChallenge.every(function (challenge) {
return challenge.completed;
})) {
if (gameMode === 'challenges') {
LK.setScore(LK.getScore() + 1);
}
hud.updateScore(LK.getScore());
showChallengeCompletePopup(self.color);
currentChallenge.forEach(function (challenge) {
hud.removeChild(challenge);
challenge.destroy();
});
currentChallenge = [];
hud.updateChallenges(currentChallenge);
resetGameToStartingPoint();
startNextChallenge();
} else {
self.remainingBounces = self.bounceLimit; // Reset remaining bounces only when the whole challenge is completed
}
}
};
});
var CircularObstacle = Container.expand(function (starX, starY, radius, angleSpeed, initialAngle) {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5,
tint: getRandomTint()
});
self.angle = initialAngle || 0;
self.radius = radius;
self.angleSpeed = angleSpeed * 0.75;
self.starX = starX;
self.starY = starY;
self.updatePosition = function () {
self.x = self.starX + Math.cos(self.angle) * self.radius;
self.y = self.starY + Math.sin(self.angle) * self.radius;
self.angle += self.angleSpeed * 0.35;
obstacleGraphics.rotation += self.angleSpeed * 0.35;
};
self.moveDown = function (distance, dotY) {
self.starY += distance * getSpeedMultiplier(dotY);
};
self.updatePosition();
});
var Dot = Container.expand(function () {
var self = Container.call(this);
var dotGraphics = self.attachAsset('dot', {
anchorX: 0.5,
anchorY: 0.5
});
self.destroyed = false;
self.velocityY = 0;
self.gravity = 0.7;
self.bounce = -15;
self._update_migrated = function () {
if (!dotBouncing) {
return;
}
var previousY = self.y;
self.velocityY += self.gravity;
if (self.velocityY > 0 && dotGraphics.scaleX < 1) {
dotGraphics.scaleX += 0.02;
dotGraphics.scaleY -= 0.02;
} else if (self.velocityY < 0 && dotGraphics.scaleX > 0.9) {
dotGraphics.scaleX -= 0.01;
dotGraphics.scaleY += 0.01;
}
self.y += self.velocityY;
if (!self.firstTouch && !self.intersects(hand)) {
self.y = 2732 - self.height / 2 - 500;
} else if (self.intersects(hand)) {
self.bounceUp();
} else if (self.y > 2232 - self.height / 2 && self.firstTouch && !self.firstStarDestroyed) {
self.velocityY = self.bounce;
} else if (self.y > 2832 && !self.destroyed) {
handleDotDestruction();
}
self.movedDistance = self.y - previousY;
};
self.bounceUp = function () {
if (!self.destroyed) {
self.velocityY = self.bounce;
dot.scale.x *= 0.9;
dot.scale.y = 1.2;
LK.setTimeout(function () {
dot.scale.x = 1;
dot.scale.y = 1;
}, 90);
LK.getSound('bounce').play();
if (!self.intersects(hand)) {
createBounceEffect(self.x, self.y, dotGraphics.tint);
}
self.firstTouch = true;
if (!self.firstStarDestroyed) {
self.firstStarDestroyed = true;
}
if (gameMode === 'challenges' && !self.intersects(hand)) {
currentChallenge[0].remainingBounces--;
hud.remainingBouncesTxt.setText(currentChallenge[0].remainingBounces.toString());
if (currentChallenge[0].remainingBounces <= 0) {
handleDotDestruction();
}
}
}
};
self.inheritStarColor = function (star) {
dotGraphics.tint = star.children[0].tint;
};
});
var DotParticleEffect = Container.expand(function (x, y) {
var self = Container.call(this);
self.x = x;
self.y = y;
var particles = [];
var angleIncrement = Math.PI * 2 / 20;
var speed = 30;
var colors = [0xffe066, 0xcc66ff, 0xff6666, 0x99ccff, 0xffa500].slice(0, CONFIG.numColors);
for (var i = 0; i < 20; i++) {
var particle = self.attachAsset('dot', {
anchorX: 0.5,
anchorY: 0.5,
tint: colors[Math.floor(Math.random() * colors.length)]
});
particle.scaleX = particle.scaleY = 0.5;
particle.alpha = 1;
var angle = i * angleIncrement;
particle.vx = Math.cos(angle) * speed;
particle.vy = Math.sin(angle) * speed;
particles.push(particle);
}
self._update_migrated = function () {
for (var i = particles.length - 1; i >= 0; i--) {
particles[i].x += particles[i].vx;
particles[i].y += particles[i].vy;
particles[i].rotation += 0.1; // Rotate the particle
particles[i].alpha -= 0.0167;
if (particles[i].alpha <= 0) {
particles[i].destroy();
particles.splice(i, 1);
}
}
if (particles.length === 0) {
self.destroy();
}
};
game.addChild(self);
});
var HUD = Container.expand(function () {
var self = Container.call(this);
// Create background line for HUD
var backgroundLine = self.attachAsset('backgroundLine', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5,
alpha: 0.5
});
backgroundLine.x = 2048 / 2;
backgroundLine.y = 75;
// Create score text
scoreTxt = new Text2('0', {
size: 150,
// Reduced size to fit within the HUD
fill: "#ffffff",
stroke: "#000000",
strokeThickness: 8
});
scoreTxt.anchor.set(0.5, 0);
scoreTxt.x = 2048 - 200; // Adjusted position to fit within the HUD
scoreTxt.y = -10; // Adjusted position to fit within the HUD
self.addChild(scoreTxt);
// Create challenge level text
self.challengeLevelTxt = new Text2('LVL 0', {
size: 75,
fill: "#ffffff",
stroke: "#000000",
strokeThickness: 8
});
self.challengeLevelTxt.anchor.set(0, 0);
self.challengeLevelTxt.x = 320;
self.challengeLevelTxt.y = 80;
self.addChild(self.challengeLevelTxt);
// Create remaining bounces text
self.remainingBouncesIcon = self.attachAsset('dot', {
anchorX: 1,
anchorY: 0,
scaleX: 0.5,
scaleY: 0.5
});
self.remainingBouncesIcon.x = 2048 - 30;
self.remainingBouncesIcon.y = 40;
self.remainingBouncesIcon.visible = true; // Ensure the remaining bounces icon is always visible
self.addChild(self.remainingBouncesIcon);
self.remainingBouncesTxt = new Text2('0', {
size: 75,
fill: "#ffffff",
stroke: "#000000",
strokeThickness: 8
});
self.remainingBouncesTxt.anchor.set(1, 0);
self.remainingBouncesTxt.x = 2048 + 70;
self.remainingBouncesTxt.y = 30;
self.remainingBouncesTxt.visible = true; // Ensure the remaining bounces text is always visible
self.addChild(self.remainingBouncesTxt);
// Removed challenges container
self.updateScore = function (score) {
scoreTxt.setText(score.toString());
};
self.updateChallenges = function (challenges) {
var totalWidth = challenges.reduce(function (acc, challenge) {
return acc + challenge.width + 20; // 20px gap
}, -20); // Subtract the last gap
var startX = (2048 - totalWidth) / 2;
challenges.forEach(function (challenge, i) {
challenge.x = startX + i * (challenge.width + 20);
challenge.y = 40; // Ensure all challenges are aligned vertically
self.addChild(challenge);
});
// Keep the level text fixed in the initial spot
self.challengeLevelTxt.x = 320;
self.challengeLevelTxt.y = 30;
self.challengeLevelTxt.visible = true; // Ensure the level text is always visible
};
return self;
});
// Add Hand asset below the dot
var Hand = Container.expand(function () {
var self = Container.call(this);
var handGraphics = self.attachAsset('hand', {
anchorX: 0.5,
anchorY: 0,
alpha: 0.9
});
self._update_migrated = function (distance) {
if (distance) {
self.y += distance;
}
};
});
var MainMenu = Container.expand(function () {
var self = Container.call(this);
// Create background
var background = self.attachAsset('mainMenuBackground', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 1.0
});
background.x = 0;
background.y = 600;
// Create Endless button using endless asset
var endlessButton = self.attachAsset('Endless', {
anchorX: 0.5,
anchorY: 0.5
});
endlessButton.x = 0;
endlessButton.y = 1200;
endlessButton.floatDirection = 1;
endlessButton.floatSpeed = 0.5;
endlessButton.floatRange = 10;
endlessButton.down = function () {
LK.getSound('button').play();
LK.getSound('bounce').play();
self.destroy();
startGame('endless');
};
endlessButton._update_migrated = function () {
endlessButton.y += endlessButton.floatSpeed * endlessButton.floatDirection;
if (endlessButton.y >= 1200 + endlessButton.floatRange || endlessButton.y <= 1200 - endlessButton.floatRange) {
endlessButton.floatDirection *= -1;
}
};
LK.on('tick', function () {
endlessButton._update_migrated();
});
// Create Challenges button using challenges asset
var challengesButton = self.attachAsset('Challenges', {
anchorX: 0.5,
anchorY: 0.5
});
challengesButton.x = 0;
challengesButton.y = 1450;
challengesButton.floatDirection = 1;
challengesButton.floatSpeed = 0.5;
challengesButton.floatRange = 10;
challengesButton.down = function () {
LK.getSound('button').play();
LK.getSound('bounce').play();
self.destroy();
startGame('challenges');
};
challengesButton._update_migrated = function () {
challengesButton.y += challengesButton.floatSpeed * challengesButton.floatDirection;
if (challengesButton.y >= 1450 + challengesButton.floatRange || challengesButton.y <= 1450 - challengesButton.floatRange) {
challengesButton.floatDirection *= -1;
}
};
LK.on('tick', function () {
challengesButton._update_migrated();
});
// Create game title using gametitle asset
var gameTitle = self.attachAsset('gametitle', {
anchorX: 0.5,
anchorY: 0.5
});
gameTitle.x = 0;
gameTitle.y = 600;
self.addChild(background);
// Create How to Play button using a new asset
var howToPlayButton = new Text2('how to play', {
size: 50,
// Reduced size to half
fill: "#ffffff",
anchorX: 0.5,
anchorY: 0.5,
align: 'center' // Center justify the text
});
howToPlayButton.x = -125;
howToPlayButton.y = 1700;
howToPlayButton.blinking = true;
howToPlayButton.blinkSpeed = 0.005;
howToPlayButton.blinkDirection = 1;
howToPlayButton.down = function () {
LK.getSound('button').play();
showHowToPlay();
};
howToPlayButton._update_migrated = function () {
if (howToPlayButton.blinking) {
howToPlayButton.alpha += howToPlayButton.blinkSpeed * howToPlayButton.blinkDirection;
if (howToPlayButton.alpha >= 1) {
howToPlayButton.alpha = 1;
howToPlayButton.blinkDirection = -1;
} else if (howToPlayButton.alpha <= 0.1) {
howToPlayButton.alpha = 0.1;
howToPlayButton.blinkDirection = 1;
}
}
};
LK.on('tick', function () {
howToPlayButton._update_migrated();
});
gameTitle.tiltDirection = 1;
gameTitle.tiltSpeed = 0.001;
gameTitle.maxTilt = 0.1;
gameTitle._update_migrated = function () {
gameTitle.rotation += gameTitle.tiltSpeed * gameTitle.tiltDirection;
if (gameTitle.rotation >= gameTitle.maxTilt || gameTitle.rotation <= -gameTitle.maxTilt) {
gameTitle.tiltDirection *= -1;
}
};
LK.on('tick', function () {
gameTitle._update_migrated();
});
self.addChild(gameTitle);
self.addChild(endlessButton);
self.addChild(challengesButton);
self.addChild(howToPlayButton);
});
var ObstacleParticleEffect = Container.expand(function (x, y) {
var self = Container.call(this);
self.x = x;
self.y = y;
var particles = [];
var angleIncrement = Math.PI * 2 / 30;
var speed = 20;
var colors = [0xff6666, 0x00ff00, 0x0000ff, 0xffe066, 0xcc66ff, 0x99ccff].slice(0, CONFIG.numColors);
for (var i = 0; i < 30; i++) {
var particle = self.attachAsset('smallObstacle', {
anchorX: 0.5,
anchorY: 0.5,
tint: colors[Math.floor(Math.random() * colors.length)]
});
particle.scaleX = particle.scaleY = 0.5;
particle.alpha = 1;
var angle = i * angleIncrement;
particle.vx = Math.cos(angle) * speed;
particle.vy = Math.sin(angle) * speed;
particles.push(particle);
}
self._update_migrated = function () {
for (var i = particles.length - 1; i >= 0; i--) {
particles[i].x += particles[i].vx;
particles[i].y += particles[i].vy;
particles[i].alpha -= 0.0167;
if (particles[i].alpha <= 0) {
particles[i].destroy();
particles.splice(i, 1);
}
}
if (particles.length === 0) {
self.destroy();
}
};
game.addChild(self);
});
var ObstacleScorePopup = Container.expand(function (x, y) {
var self = Container.call(this);
self.x = x;
self.y = y;
var scoreText = new Text2('+10', {
size: 100,
fill: "#ffffff",
anchorX: 0.5,
anchorY: 0.5
});
scoreText.x = -scoreText.width / 2;
scoreText.y = -scoreText.height / 2;
self.addChild(scoreText);
self.alpha = 1;
var duration = 120;
self._update_migrated = function () {
duration--;
self.y -= 2;
self.alpha -= 1 / 120;
if (duration <= 0) {
self.destroy();
}
};
game.addChild(self);
});
var OrbitLine = Container.expand(function (starX, starY, radius) {
var self = Container.call(this);
self.starX = starX;
self.starY = starY;
self.radius = radius;
var segments = 50;
var angleIncrement = Math.PI * 2 / segments;
for (var i = 0; i < segments; i++) {
var angle = i * angleIncrement;
var dot = self.attachAsset('smallObstacle', {
x: starX + Math.cos(angle) * radius,
y: starY + Math.sin(angle) * radius,
anchorX: 0.5,
anchorY: 0.5,
tint: [0xffe066, 0xcc66ff, 0xff6666, 0x99ccff, 0xffa500][Math.floor(Math.random() * 5)]
});
if (i % 2 === 0) {
dot.alpha = 0;
}
}
self.moveDown = function (distance, dotY) {
var speedMultiplier = dotY < 1200 ? 3 : dotY < 1400 ? 2 : dotY < 2000 ? 1.3 : dotY < 2300 ? 1.2 : 1;
self.y += distance * speedMultiplier;
};
});
var ParticleEffect = Container.expand(function (x, y, color) {
var self = Container.call(this);
self.x = x;
self.y = y;
var particles = [];
for (var i = 0; i < 20; i++) {
var particle = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5,
tint: color
});
particle.scaleX = particle.scaleY = Math.random() * 0.5 + 0.5;
particle.alpha = 0.7;
particle.vx = (Math.random() - 0.5) * 10;
particle.vy = (Math.random() - 0.5) * 10;
particles.push(particle);
}
self._update_migrated = function () {
for (var i = particles.length - 1; i >= 0; i--) {
particles[i].x += particles[i].vx;
particles[i].y += particles[i].vy;
particles[i].alpha -= 0.02;
if (particles[i].alpha <= 0) {
particles[i].destroy();
particles.splice(i, 1);
}
}
if (particles.length === 0) {
self.destroy();
}
};
game.addChild(self);
});
var ScorePopup = Container.expand(function (x, y) {
var self = Container.call(this);
self.x = x;
self.y = y;
var scoreText = new Text2('+' + (10 * (starCount + 1)).toString(), {
size: 100,
fill: "#ffffff",
anchorX: 0.5,
anchorY: 0.5
});
scoreText.x = -scoreText.width / 2;
scoreText.y = -scoreText.height / 2;
self.addChild(scoreText);
self.alpha = 1;
var duration = 120;
self._update_migrated = function () {
duration--;
self.y -= 2;
self.alpha -= 1 / 120;
if (duration <= 0) {
self.destroy();
}
};
game.addChild(self);
});
var Star = Container.expand(function (starNumber) {
var self = Container.call(this);
self.starNumber = starNumber;
var starGraphics = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5,
tint: getRandomTint()
});
self.scaleDirection = 1;
self.scaleSpeed = 0.005;
self.minScale = 1;
self.maxScale = 1.2;
self.moveDown = function (distance, dotY) {
self.y += distance * getSpeedMultiplier(dotY);
if (self.y > 2732 - self.height / 2) {
self.y = -self.height / 2;
}
};
self.updateScale = function () {
if (self.scaleDirection === 1 && starGraphics.scale.x < self.maxScale) {
starGraphics.scale.x += self.scaleSpeed;
starGraphics.scale.y += self.scaleSpeed;
} else if (self.scaleDirection === -1 && starGraphics.scale.x > self.minScale) {
starGraphics.scale.x -= self.scaleSpeed;
starGraphics.scale.y -= self.scaleSpeed;
}
if (starGraphics.scale.x >= self.maxScale || starGraphics.scale.x <= self.minScale) {
self.scaleDirection *= -1;
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 // Black color
});
/****
* Game Code
****/
// Play background music on game load
LK.getSound('backgroundmusic').play();
function showHowToPlay() {
var howToPlayScreen = new Container({
width: 2048,
height: 2732,
alpha: 0.5
});
var background = howToPlayScreen.attachAsset('mainMenuBackground', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.8,
width: 2048,
height: 2732
});
background.x = 2048 / 4;
background.y = 2732 / 2;
var endlessModeText = new Text2('Endless:\n\n1. Tap to make the dot bounce.\n2. Avoid obstacles.\n3. Collect stars to score points. \n4. Destroy same colored obstacles to clear the path and extra points!', {
size: 50,
fill: "#ffffff",
anchorX: 0.5,
anchorY: 0.5,
align: 'left',
wordWrap: true,
wordWrapWidth: 900
});
endlessModeText.x = 2048 / 4 - 900;
endlessModeText.y = 2732 / 2 - 900;
var challengesText = new Text2('Challenges:\n\n1. Complete objectives by destroying obstacles.\n2. Watch out for you reamining bounces. \n3. Reach the higher level possible!', {
size: 50,
fill: "#ffffff",
anchorX: 0.5,
anchorY: 0.5,
align: 'left',
wordWrap: true,
wordWrapWidth: 900
});
challengesText.x = 2048 / 4 - 900;
challengesText.y = 2732 / 2 - 300;
var backButton = new Text2('Back', {
size: 50,
fill: "#ffffff",
anchorX: 0.5,
anchorY: 0.5
});
backButton.x = 2048 / 4;
backButton.y = 2732 - 200;
backButton.down = function () {
howToPlayScreen.destroy();
};
howToPlayScreen.addChild(background);
howToPlayScreen.addChild(endlessModeText);
howToPlayScreen.addChild(challengesText);
howToPlayScreen.addChild(backButton);
// Add event listener to close overlay when screen is touched
howToPlayScreen.down = function () {
howToPlayScreen.destroy();
};
LK.gui.top.addChild(howToPlayScreen);
}
function isValidStar(star) {
return star && star.children && star.children[0] && typeof star.children[0].tint !== 'undefined' && star.y !== null && typeof star.y !== 'undefined';
}
function resetGameToStartingPoint() {
// Destroy all existing stars, obstacles, and the dot
stars.forEach(function (star) {
star.destroy();
});
stars = [];
obstacles.forEach(function (obstacle) {
obstacle.destroy();
});
obstacles = [];
if (dot) {
dot.destroy();
dot = null;
}
// Reset star count
starCount = 0;
// Add initial star
var star = game.addChildAt(new Star(), 1);
star.x = 2048 / 2;
star.y = 2732 / 2 - 500;
stars.push(star);
// Add initial dot
if (!dot) {
dot = game.addChild(new Dot());
dot.x = 2048 / 2;
dot.y = 2732 - dot.height / 2 - 150;
dotBouncing = true;
}
if (!hand) {
createHand();
}
handMoved = false;
// Add initial orbit line
var orbitLine = game.addChild(new OrbitLine(star.x, star.y, 300));
obstacles.push(orbitLine);
// Add initial circular obstacle
var starX = 2048 / 2;
var starY = 2732 / 2 - 500;
var radius = 300;
var angleSpeed = 0.05;
var obstacle = new CircularObstacle(starX, starY, radius, angleSpeed);
game.addChildAt(obstacle, 1);
obstacles.push(obstacle);
// Check if the first star has at least one obstacle, if not, create it
if (obstacles.length === 0) {
var newObstacle = new CircularObstacle(starX, starY, radius, angleSpeed);
game.addChildAt(newObstacle, 1);
obstacles.push(newObstacle);
}
}
// Ensure HUD is still over the rest of the elements
game.addChild(hud);
var CONFIG = {
numColors: 2 // Default number of colors, can be set between 2 and 5
};
var gameMode = 'challenges'; // Default game mode
var mainMenu = new MainMenu();
LK.gui.top.addChild(mainMenu);
var scoreTxt;
var hud = new HUD();
game.addChild(hud);
function getRandomTint() {
var colors = [0xffe066, 0xcc66ff, 0xff6666, 0x99ccff, 0xffa500].slice(0, CONFIG.numColors);
return colors[Math.floor(Math.random() * Math.min(CONFIG.numColors, colors.length))];
}
function showChallengeCompletePopup(color) {
var successAssets = ['success', 'success2', 'success3'];
var randomSuccessAsset = successAssets[Math.floor(Math.random() * successAssets.length)];
var challengeCompletePopup = LK.getAsset(randomSuccessAsset, {
anchorX: 0.5,
anchorY: 0.5,
tint: color,
alpha: 0
});
challengeCompletePopup.x = 2048 / 2;
challengeCompletePopup.y = 2732 / 2;
game.addChild(challengeCompletePopup);
var animationDuration = 120;
var animationFrame = 0;
var animationInterval = LK.setInterval(function () {
if (animationFrame < animationDuration / 2) {
if (animationFrame === 0) {
challengeCompletePopup.alpha = 1;
}
challengeCompletePopup.scaleX = challengeCompletePopup.scaleY = 1 + 0.5 * (animationFrame / (animationDuration / 2));
} else {
challengeCompletePopup.alpha = 1 - (animationFrame - animationDuration / 2) / (animationDuration / 2);
challengeCompletePopup.scaleX = challengeCompletePopup.scaleY = 1.5 - 0.5 * (animationFrame - animationDuration / 2) / (animationDuration / 2);
}
animationFrame++;
if (animationFrame >= animationDuration) {
LK.clearInterval(animationInterval);
challengeCompletePopup.destroy();
}
}, 1000 / 60);
}
function getStarColor(starNumber) {
var colors = [0xffe066, 0xcc66ff, 0xff6666, 0x99ccff, 0xffa500].slice(0, CONFIG.numColors);
return colors[starNumber % Math.min(CONFIG.numColors, colors.length)];
}
function getSpeedMultiplier(dotY) {
if (dotY < 1200) {
return 3;
}
if (dotY < 1400) {
return 2;
}
if (dotY < 2000) {
return 1.3;
}
return 1.2;
}
function handleDotDestruction() {
createDotParticleEffect(dot.x, dot.y);
LK.getSound('explosion').play();
dot.destroyed = true;
dot.destroy();
LK.setTimeout(function () {
LK.showGameOver();
}, 1000);
}
function createBounceEffect(x, y, color) {
var effect = new BounceEffect(x, y + 80, color); // Adjust y position to start from a little more lower on the ball
LK.on('tick', function () {
// Ensure HUD is on top of everything
if (game.children.indexOf(hud) !== game.children.length - 1) {
game.addChild(hud);
}
effect._update_migrated();
});
}
var shrinkFrame = 0;
var shrinkDuration = 60;
function startGame(mode) {
gameMode = mode;
LK.getSound('backgroundmusic').stop();
if (!dot) {
dot = game.addChild(new Dot());
dot.x = 2048 / 2;
dot.y = 2732 - dot.height / 2 - 200;
dotBouncing = true;
}
if (!hand) {
hand = new Hand();
game.addChild(hand);
hand.x = dot.x;
hand.y = dot.y + dot.height / 2;
}
if (mode === 'endless') {
CONFIG.numColors = 5;
// Start endless mode
// Add your endless mode initialization code here
hud.removeChild(hud.children[0]); // Remove HUD background
hud.challengeLevelTxt.visible = false; // Hide level text in endless mode
hud.remainingBouncesIcon.visible = false; // Hide remaining bounces icon in endless mode
hud.remainingBouncesTxt.visible = false; // Hide remaining bounces text in endless mode
scoreTxt.visible = true; // Show score text in endless mode
} else if (mode === 'challenges') {
CONFIG.numColors = 2;
// Start challenges mode
hud.challengeLevelTxt.visible = true; // Show level text in challenge mode
hud.remainingBouncesIcon.visible = true; // Show remaining bounces icon in challenge mode
hud.remainingBouncesTxt.visible = true; // Show remaining bounces text in challenge mode
scoreTxt.visible = false; // Hide score text in challenge mode
startNextChallenge();
}
}
// Pregame screen removed
var challenges = [{
id: 1,
numColors: 2,
remainingBounces: 30,
obstacles: [1]
}, {
id: 2,
numColors: 2,
remainingBounces: 40,
obstacles: [2, 1]
}, {
id: 3,
numColors: 3,
remainingBounces: 40,
obstacles: [1, 1, 1]
}, {
id: 4,
numColors: 3,
remainingBounces: 40,
obstacles: [4]
}, {
id: 5,
numColors: 5,
remainingBounces: 40,
obstacles: [5]
}];
var currentChallengeIndex = 0;
var currentChallenge = null;
function startNextChallenge() {
if (gameMode === 'endless') {
return;
}
if (currentChallengeIndex < challenges.length) {
// Clear previous challenge obstacles
if (currentChallenge) {
currentChallenge.forEach(function (challenge) {
hud.removeChild(challenge);
challenge.destroy();
});
currentChallenge = [];
hud.updateChallenges(currentChallenge);
}
// Clear the challenges container
hud.children.forEach(function (child) {
if (child instanceof Challenge) {
hud.removeChild(child);
child.destroy();
}
});
CONFIG.numColors = challenges[currentChallengeIndex].numColors;
var challengeData = challenges[currentChallengeIndex];
var colors = [0xffe066, 0xcc66ff, 0xff6666, 0x99ccff, 0xffa500].slice(0, CONFIG.numColors);
currentChallenge = [];
challengeData.obstacles.forEach(function (amount, i) {
var challengeColor = colors[i % colors.length];
var challenge = new Challenge(challengeColor, amount, challengeData.remainingBounces);
currentChallenge.push(challenge);
game.addChild(challenge);
});
bounceCount = 0;
var totalWidth = currentChallenge.reduce(function (acc, challenge) {
return acc + challenge.width + 20; // 20px gap
}, -20); // Subtract the last gap
hud.updateChallenges(currentChallenge);
hud.challengeLevelTxt.setText('LVL ' + currentChallengeIndex);
hud.updateScore(LK.getScore()); // Ensure score is updated in the HUD
hud.remainingBouncesTxt.setText(challengeData.remainingBounces.toString()); // Reset remaining bounces text
// Ensure HUD is still over the rest of the elements
if (hud.y < 0) {
hud.y = 0;
}
if (hud.x < 0) {
hud.x = 0;
}
if (hud.x + hud.width > 2048) {
hud.x = 2048 - hud.width;
}
if (hud.y + hud.height > 2732) {
hud.y = 2732 - hud.height;
}
}
currentChallengeIndex++;
}
// startNextChallenge(); // Removed initial call to startNextChallenge
function createObstacleParticleEffect(x, y) {
var effect = new ObstacleParticleEffect(x, y);
LK.on('tick', function () {
effect._update_migrated();
});
}
function changeStarColor(star) {
var colors = [0xffe066, 0xcc66ff, 0xff6666, 0x99ccff, 0xffa500].slice(0, CONFIG.numColors);
var currentColorIndex = colors.indexOf(star.children[0].tint);
var nextColorIndex = (currentColorIndex + 1) % Math.min(CONFIG.numColors, colors.length);
star.children[0].tint = colors[nextColorIndex];
}
function updateStarColors() {
for (var i = 0; i < stars.length; i++) {
changeStarColor(stars[i]);
}
}
LK.setInterval(updateStarColors, 2000);
var starCount = 0;
// Initialize the offscreen threshold for destroying obstacles
var offscreenThreshold = 2732 + 1000;
function createParticleEffect(x, y, color) {
var effect = new ParticleEffect(x, y, color);
LK.on('tick', function () {
effect._update_migrated();
});
}
function createDotParticleEffect(x, y) {
var effect = new DotParticleEffect(x, y);
LK.on('tick', function () {
effect._update_migrated();
});
}
var obstacles = [];
function updateObstacles() {
var obstacleCount = 5 + starCount;
while (obstacles.length < obstacleCount) {
var obstacle = game.addChild(new Obstacle());
obstacle.x = obstacle.direction === 1 ? -obstacle.width / 2 : 2048 + obstacle.width / 2;
obstacle.y = Math.random() * (2732 - obstacle.height) + obstacle.height / 2;
obstacles.push(obstacle);
}
}
// Removed duplicate score text initialization and addition to the screen
game.on('down', function (x, y, obj) {
if (dot) {
dot.bounceUp();
}
});
var stars = [];
var star = game.addChildAt(new Star(), 1);
star.x = 2048 / 2;
star.y = 2732 / 2 - 500;
stars.push(star);
LK.setInterval(function () {
changeStarColor(star);
}, 1000); // Initialize star with a random color from the obstacles
// Add dotted orbit for the first star
var orbitLine = game.addChild(new OrbitLine(star.x, star.y, 300));
obstacles.push(orbitLine);
function spawnInitialObstacles() {
var starX = 2048 / 2;
var starY = 2732 / 2 - 500;
var radius = 300;
var angleSpeed = 0.05;
var obstacle = new CircularObstacle(starX, starY, radius, angleSpeed);
game.addChildAt(obstacle, 1);
obstacles.push(obstacle);
// No additional obstacles for the first star
}
spawnInitialObstacles();
game.addChild(hud);
LK.on('tick', function () {
if (dot) {
dot._update_migrated();
}
for (var i = 0; i < obstacles.length; i++) {
if (obstacles[i] instanceof CircularObstacle) {
obstacles[i].updatePosition();
} else {
if (typeof obstacles[i]._move_migrated === 'function') {
obstacles[i]._move_migrated();
}
}
if (dot && dot.y < 2300 && dot.movedDistance < 0) {
obstacles[i].moveDown(-dot.movedDistance, dot.y);
}
if (dot && dot.intersects && obstacles[i] && dot.intersects(obstacles[i]) && !(obstacles[i] instanceof OrbitLine) && dot !== null && obstacles[i] !== null && typeof dot.intersects === 'function') {
if (dot.children[0].tint === obstacles[i].children[0].tint) {
createObstacleParticleEffect(obstacles[i].x, obstacles[i].y);
if (gameMode === 'endless') {
if (gameMode === 'endless') {
LK.setScore(LK.getScore() + 10);
} else if (gameMode === 'challenges') {
// Do not display points addition in challenge mode
}
}
hud.updateScore(LK.getScore());
if (gameMode === 'endless') {
var obstacleScorePopup = new ObstacleScorePopup(obstacles[i].x, obstacles[i].y);
LK.on('tick', function () {
obstacleScorePopup._update_migrated();
});
}
LK.getSound('obstacle').play();
// Update challenge progress before destroying the obstacle
if (currentChallenge) {
for (var j = 0; j < currentChallenge.length; j++) {
if (obstacles[i].children[0].tint === currentChallenge[j].color) {
currentChallenge[j].updateProgress();
if (currentChallenge[j].completed) {
currentChallenge.splice(j, 1);
if (currentChallenge.length === 0) {
startNextChallenge();
}
}
break;
}
}
}
if (obstacles[i]) {
obstacles[i].destroy();
}
obstacles.splice(i, 1);
} else {
if (!dot.destroyed) {
createDotParticleEffect(dot.x, dot.y);
LK.getSound('explosion').play();
dot.destroyed = true;
}
dot.destroy();
LK.setTimeout(function () {
LK.showGameOver();
}, 1500);
}
} else if (obstacles[i] && obstacles[i].y > offscreenThreshold) {
if (obstacles[i] && typeof obstacles[i].destroy === 'function') {
obstacles[i].destroy();
}
obstacles.splice(i, 1);
}
}
for (var j = stars.length - 1; j >= 0; j--) {
if (!dot || !stars[j]) {
continue;
}
stars[j].updateScale();
if (dot && dot.intersects && stars[j] && isValidStar(stars[j]) && dot.intersects(stars[j]) && dot.y != null && stars[j].y != null && typeof dot.intersects === 'function' && dot.children && dot.children[0] && dot.children[0].y != null && stars[j].children && stars[j].children[0]) {
if (hand) {
hand.destroy();
hand = null;
}
dot.inheritStarColor(stars[j]);
if (gameMode === 'endless') {
LK.setScore(LK.getScore() + 10 * (starCount + 1));
} else if (gameMode === 'challenges') {
// Do not display points addition in challenge mode
}
hud.updateScore(LK.getScore());
var oldStarY = stars[j].y;
createParticleEffect(stars[j].x, stars[j].y, stars[j].children[0].tint);
LK.getSound('star').play();
if (gameMode === 'endless') {
var scorePopup = new ScorePopup(stars[j].x, stars[j].y);
LK.on('tick', function () {
scorePopup._update_migrated();
});
}
stars[j].destroy();
stars.splice(j, 1);
starCount += 1;
var newStar = game.addChildAt(new Star(), 1);
newStar.x = 2048 / 2;
var additionalYOffset = starCount > 1 ? (starCount - 1) * 200 : 0;
newStar.y = oldStarY - 2000 - additionalYOffset;
stars.push(newStar);
// Ensure new star also has the color change function
changeStarColor(newStar);
if (!handMoved && hand) {
var handMoveDistance = 0;
var handMoveInterval = LK.setInterval(function () {
handMoveDistance += 1;
hand._update_migrated(handMoveDistance);
if (handMoveDistance >= 1000) {
LK.clearInterval(handMoveInterval);
}
}, 10);
handMoved = true;
}
// Increase the offscreen threshold for destroying obstacles
offscreenThreshold += 300;
// Add a cumulative number of CircularObstacles at random positions around the new star
var cumulativeObstacles = 1 + starCount;
for (var k = 0; k < cumulativeObstacles; k++) {
var randomAngle = Math.random() * Math.PI * 2; // Random angle in radians
var radiusOffset = k * 100;
var circularObstacle = game.addChildAt(new CircularObstacle(newStar.x, newStar.y, 300 + radiusOffset, 0.05 * (k % 2 === 0 ? 1 : -1), randomAngle), 1);
obstacles.push(circularObstacle);
}
// Add orbit line before creating all obstacles
var orbitLine = new OrbitLine(newStar.x, newStar.y, 300 + radiusOffset);
game.addChildAt(orbitLine, 1);
obstacles.push(orbitLine);
} else if (dot.y < 2300 && dot.movedDistance < 0) {
stars[j].moveDown(-dot.movedDistance, dot.y);
}
}
});
var dot = null;
var dotBouncing = false;
var hand;
var handMoved = false;
function createHand() {
hand = new Hand();
game.addChild(hand);
hand.x = dot.x;
hand.y = dot.y + dot.height / 2 + 50;
}
var motivationalWords = ["Great Job!", "Well Done!", "Keep Going!", "Awesome!", "Fantastic!", "Superb!", "Excellent!", "Nice Work!", "Bravo!"]; ===================================================================
--- original.js
+++ change.js
@@ -23,21 +23,21 @@
}
};
game.addChild(self);
});
-var Challenge = Container.expand(function (amount, bounceLimit, color) {
+var Challenge = Container.expand(function (color, amount, bounceLimit) {
var self = Container.call(this);
+ self.color = color;
self.amount = amount;
self.bounceLimit = bounceLimit;
self.remainingBounces = bounceLimit; // Initialize remainingBounces correctly
self.completed = false;
- self.color = color; // Add color property
var obstacleIcon = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5,
+ tint: color,
scaleX: 0.5,
- scaleY: 0.5,
- tint: color // Use color for obstacleIcon tint
+ scaleY: 0.5
});
obstacleIcon.x = 250;
obstacleIcon.y = 40;
var challengeText = new Text2('0/' + amount, {
@@ -63,9 +63,9 @@
if (gameMode === 'challenges') {
LK.setScore(LK.getScore() + 1);
}
hud.updateScore(LK.getScore());
- showChallengeCompletePopup();
+ showChallengeCompletePopup(self.color);
currentChallenge.forEach(function (challenge) {
hud.removeChild(challenge);
challenge.destroy();
});
@@ -689,9 +689,9 @@
// Add initial dot
if (!dot) {
dot = game.addChild(new Dot());
dot.x = 2048 / 2;
- dot.y = 2732 - dot.height / 2 - 200;
+ dot.y = 2732 - dot.height / 2 - 150;
dotBouncing = true;
}
if (!hand) {
createHand();
@@ -883,12 +883,13 @@
}
});
CONFIG.numColors = challenges[currentChallengeIndex].numColors;
var challengeData = challenges[currentChallengeIndex];
+ var colors = [0xffe066, 0xcc66ff, 0xff6666, 0x99ccff, 0xffa500].slice(0, CONFIG.numColors);
currentChallenge = [];
- challengeData.obstacles.forEach(function (amount) {
- var color = getRandomTint(); // Get a random color for the challenge
- var challenge = new Challenge(amount, challengeData.remainingBounces, color);
+ challengeData.obstacles.forEach(function (amount, i) {
+ var challengeColor = colors[i % colors.length];
+ var challenge = new Challenge(challengeColor, amount, challengeData.remainingBounces);
currentChallenge.push(challenge);
game.addChild(challenge);
});
bounceCount = 0;
@@ -1131,7 +1132,7 @@
function createHand() {
hand = new Hand();
game.addChild(hand);
hand.x = dot.x;
- hand.y = dot.y + dot.height / 2;
+ hand.y = dot.y + dot.height / 2 + 50;
}
var motivationalWords = ["Great Job!", "Well Done!", "Keep Going!", "Awesome!", "Fantastic!", "Superb!", "Excellent!", "Nice Work!", "Bravo!"];
\ No newline at end of file
Cartoon, white star. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Cartoon. white circle. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
cartoon white dot with eyes (just black dots).. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
cartoon white ring. simple.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
cartoon white cloud.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.