/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
// Define a class for the down button
var DownButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('downButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
LK.getSound('Kok').play(); // Play 'Kok' sound when button is pressed
if (player.y + 100 <= 2732) {
player.y += 100;
// Check if player is intersecting with NewEnemy
for (var i = 0; i < enemies.length; i++) {
if (enemies[i] instanceof NewEnemy && player.intersects(enemies[i])) {
LK.setScore(LK.getScore() + 10); // Increase score by 10
scoreTxt.setText(LK.getScore()); // Update the score text display
break; // Exit loop after finding the first intersecting NewEnemy
}
}
}
};
});
// Define a class for enemies
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = Math.random() * 2 + 1; // Random speed between 1 and 3
self.update = function () {
self.x -= self.speed; // Move from right to left
self.y += Math.sin(self.x / 150) * 15; // Further reduce vertical oscillation amplitude
for (var k = walls.length - 1; k >= 0; k--) {
if (self.intersects(walls[k])) {
// If enemy intersects with a wall, adjust its position to prevent passing through
if (self.x > walls[k].x) {
self.x = walls[k].x + walls[k].width / 2 + enemyGraphics.width / 2;
} else {
self.x = walls[k].x - walls[k].width / 2 - enemyGraphics.width / 2;
}
}
}
if (self.y < 0) {
self.y = 0; // Prevent moving above the top of the scene
}
if (self.x < -50) {
self.destroy();
}
};
});
var Kaplu = Container.expand(function () {
var self = Container.call(this);
// Store frame asset ids
var kapluFrames = ['Kaplu1', 'Kaplu2', 'Kaplu3'];
var currentFrame = 0;
// Attach all frames, but only show the first one
var kapluGraphicsArr = [];
for (var i = 0; i < kapluFrames.length; i++) {
var g = self.attachAsset(kapluFrames[i], {
anchorX: 0.5,
anchorY: 0.5
});
g.visible = i === 0;
kapluGraphicsArr.push(g);
}
var kapluGraphics = kapluGraphicsArr[0];
// Animation timing
var frameInterval = 120; // ms per frame (~8 FPS)
var lastFrameTime = Date.now();
self.update = function () {
self.x -= 5; // Move 'kaplu' from right to left faster
// Animate frames
var now = Date.now();
if (now - lastFrameTime >= frameInterval) {
// Hide current frame
kapluGraphicsArr[currentFrame].visible = false;
// Advance frame
currentFrame = (currentFrame + 1) % kapluFrames.length;
// Show new frame
kapluGraphicsArr[currentFrame].visible = true;
kapluGraphics = kapluGraphicsArr[currentFrame];
lastFrameTime = now;
}
for (var k = walls.length - 1; k >= 0; k--) {
if (self.intersects(walls[k])) {
// If 'kaplu' intersects with a wall, adjust its position to prevent passing through
if (self.x > walls[k].x) {
self.x = walls[k].x + walls[k].width / 2 + kapluGraphics.width / 2;
} else {
self.x = walls[k].x - walls[k].width / 2 - kapluGraphics.width / 2;
}
}
}
if (self.x < -kapluGraphics.width / 2) {
self.destroy(); // Remove 'kaplu' when it goes off-screen
}
};
});
// Define a class for the left button
var LeftButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('leftButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
LK.getSound('Kok').play(); // Play 'Kok' sound when button is pressed
character.speedX = -moveSpeed;
character.removeChild(character.children[0]); // Remove current player image
character.attachAsset('leftImage', {
// Change character image to 'leftImage'
anchorX: 0.5,
anchorY: 0.5
});
};
self.up = function (x, y, obj) {
character.speedX = 0;
character.removeChild(character.children[0]); // Remove current leftImage
character.attachAsset('player', {
// Revert character image to original
anchorX: 0.5,
anchorY: 0.5
});
};
});
var LifeIcon = Container.expand(function () {
var self = Container.call(this);
var lifeIconGraphics = self.attachAsset('lifeIcon', {
anchorX: 0.5,
anchorY: 0.5
});
self.updatePosition = function (index) {
self.x = 50 + index * 60; // Position each icon with a gap
self.y = 50; // Position at the top-left corner
};
});
var MenuSystem = Container.expand(function () {
var self = Container.call(this);
// Background overlay for menu
var menuBg = LK.getAsset('dusman', {
anchorX: 0.5,
anchorY: 0.5,
width: 2948,
height: 3932
});
menuBg.alpha = 0.8;
menuBg.tint = 0x000000;
self.addChild(menuBg);
// Create menu title
var menuTitle = new Text2('Game Menu', {
size: 100,
fill: 0xFFFFFF
});
menuTitle.anchor.set(0.5, 0);
menuTitle.x = 2048 / 3;
menuTitle.y = 400;
self.addChild(menuTitle);
// Sound button
var soundBtn = new Text2('Sound: ON', {
size: 50,
fill: 0xFFFFFF
});
soundBtn.anchor.set(0.5, 0.5);
soundBtn.x = 2048 / 3;
soundBtn.y = 700;
self.addChild(soundBtn);
// Button for game rules
var rulesBtn = new Text2('Game Rules', {
size: 50,
fill: 0xFFFFFF
});
rulesBtn.anchor.set(0.5, 0.5);
rulesBtn.x = 2048 / 3;
rulesBtn.y = 850;
self.addChild(rulesBtn);
// Market button
var marketBtn = new Text2('Market', {
size: 50,
fill: 0xFFFFFF
});
marketBtn.anchor.set(0.5, 0.5);
marketBtn.x = 2048 / 3;
marketBtn.y = 1000;
self.addChild(marketBtn);
// Back to game button
var backBtn = new Text2('Back to Game', {
size: 50,
fill: 0xFFFFFF
});
backBtn.anchor.set(0.5, 0.5);
backBtn.x = 2048 / 3;
backBtn.y = 1150;
self.addChild(backBtn);
// Creator button
var creatorBtn = new Text2('Creator', {
size: 50,
fill: 0xFFFFFF
});
creatorBtn.anchor.set(0.5, 0.5);
creatorBtn.x = 2048 / 3;
creatorBtn.y = 1400;
self.addChild(creatorBtn);
// Creator modal
var creatorModal = new Container();
creatorModal.visible = false;
self.addChild(creatorModal);
// Creator modal background
var creatorModalBg = LK.getAsset('dusman', {
anchorX: 0.5,
anchorY: 0.5,
width: 1600,
height: 800
});
creatorModalBg.tint = 0x333333;
creatorModalBg.x = 2048 / 3;
creatorModalBg.y = 2732 / 2;
creatorModal.addChild(creatorModalBg);
// Creator name
var creatorName = new Text2('Akif Uraz Aydın', {
size: 100,
fill: 0xFFFFFF
});
creatorName.anchor.set(0.5, 0);
creatorName.x = 2048 / 3;
creatorName.y = 2732 / 2 - 100;
creatorModal.addChild(creatorName);
// Close button for creator modal
var closeCreatorBtn = new Text2('Close', {
size: 50,
fill: 0xFFFFFF
});
closeCreatorBtn.anchor.set(0.5, 0.5);
closeCreatorBtn.x = 2048 / 3;
closeCreatorBtn.y = 2732 / 2 + 200;
creatorModal.addChild(closeCreatorBtn);
// Market modal
var marketModal = new Container();
marketModal.visible = false;
self.addChild(marketModal);
// Market modal background
var marketModalBg = LK.getAsset('dusman', {
anchorX: 0.5,
anchorY: 0.5,
width: 1600,
height: 1600 // Increased height to accommodate power-up option
});
marketModalBg.tint = 0x333333;
marketModalBg.x = 2048 / 3;
marketModalBg.y = 2732 / 2;
marketModal.addChild(marketModalBg);
// Market title
var marketTitle = new Text2('Market', {
size: 180,
fill: 0xFFFFFF
});
marketTitle.anchor.set(0.5, 0);
marketTitle.x = 2048 / 3;
marketTitle.y = 700; // Moved up to make room for new items
marketModal.addChild(marketTitle);
// Life icon in market
var marketLifeIcon = LK.getAsset('lifeIcon', {
anchorX: 0.5,
anchorY: 0.5
});
marketLifeIcon.x = 2048 / 3 - 200;
marketLifeIcon.y = 950; // Adjusted position
marketLifeIcon.scale.set(2);
marketModal.addChild(marketLifeIcon);
// Life description
var lifeDescription = new Text2('Extra Life\nCost: 100 Score', {
size: 60,
fill: 0xFFFFFF
});
lifeDescription.anchor.set(0, 0.5);
lifeDescription.x = 2048 / 3 - 100;
lifeDescription.y = 950; // Adjusted position
marketModal.addChild(lifeDescription);
// Buy life button
var buyLifeBtn = new Text2('Buy', {
size: 80,
fill: 0x00FF00
});
buyLifeBtn.anchor.set(0.5, 0.5);
buyLifeBtn.x = 2048 / 3;
buyLifeBtn.y = 1050; // Adjusted position
// Set initial interactive state based on score
buyLifeBtn.interactive = LK.getScore() >= 100;
buyLifeBtn.alpha = buyLifeBtn.interactive ? 1.0 : 0.5; // Visual indicator for disabled state
marketModal.addChild(buyLifeBtn);
// Power-up section
// Power-up icon in market
var marketPowerUpIcon = LK.getAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
marketPowerUpIcon.x = 2048 / 3 - 200;
marketPowerUpIcon.y = 1250; // Position below life option
marketPowerUpIcon.scale.set(0.8);
marketModal.addChild(marketPowerUpIcon);
// Power-up description
var powerUpDescription = new Text2('Power Up Box\nCost: 100 Score', {
size: 60,
fill: 0xFFFFFF
});
powerUpDescription.anchor.set(0, 0.5);
powerUpDescription.x = 2048 / 3 - 100;
powerUpDescription.y = 1250;
marketModal.addChild(powerUpDescription);
// Buy power-up button
var buyPowerUpBtn = new Text2('Buy', {
size: 80,
fill: 0x00FF00
});
buyPowerUpBtn.anchor.set(0.5, 0.5);
buyPowerUpBtn.x = 2048 / 3;
buyPowerUpBtn.y = 1350;
// Set initial interactive state based on score
buyPowerUpBtn.interactive = LK.getScore() >= 100;
buyPowerUpBtn.alpha = buyPowerUpBtn.interactive ? 1.0 : 0.5;
marketModal.addChild(buyPowerUpBtn);
// Status message for purchases
var statusMessage = new Text2('', {
size: 50,
fill: 0xFFFFFF
});
statusMessage.anchor.set(0.5, 0.5);
statusMessage.x = 2048 / 3;
statusMessage.y = 1500; //{2p} // Adjusted position
marketModal.addChild(statusMessage);
// Close button for market modal
var closeMarketBtn = new Text2('Close', {
size: 100,
fill: 0xFFFFFF
});
closeMarketBtn.anchor.set(0.5, 0.5);
closeMarketBtn.x = 2048 / 3;
closeMarketBtn.y = 1700; // Adjusted position
marketModal.addChild(closeMarketBtn);
// Button handlers
creatorBtn.interactive = true;
creatorBtn.buttonMode = true;
creatorBtn.down = function () {
creatorModal.visible = true;
marketModal.visible = false;
};
closeCreatorBtn.interactive = true;
closeCreatorBtn.buttonMode = true;
closeCreatorBtn.down = function () {
creatorModal.visible = false;
};
// Market button handlers
marketBtn.interactive = true;
marketBtn.buttonMode = true;
marketBtn.down = function () {
marketModal.visible = true;
creatorModal.visible = false;
statusMessage.setText('');
// Update buy buttons state based on current score
var currentScore = LK.getScore();
buyLifeBtn.interactive = currentScore >= 100;
buyLifeBtn.alpha = buyLifeBtn.interactive ? 1.0 : 0.5;
buyPowerUpBtn.interactive = currentScore >= 100;
buyPowerUpBtn.alpha = buyPowerUpBtn.interactive ? 1.0 : 0.5;
};
// Buy life button handler
buyLifeBtn.buttonMode = true;
buyLifeBtn.down = function () {
var currentScore = LK.getScore();
if (currentScore >= 100) {
// Deduct score
LK.setScore(currentScore - 100);
scoreTxt.setText(LK.getScore());
// Add life
playerHealth.lives++;
// Create new life icon
var lifeIcon = new LifeIcon();
lifeIcon.updatePosition(playerHealth.lives - 1);
LK.gui.topLeft.addChild(lifeIcon);
lifeIcons.push(lifeIcon);
// Show success message
statusMessage.setText('Successfully purchased 1 life!');
// Use the constructor to create a new Text2 with updated fill color
var successStyle = {
size: 50,
fill: 0x00FF00
};
marketModal.removeChild(statusMessage);
statusMessage = new Text2('Successfully purchased 1 life!', successStyle);
statusMessage.anchor.set(0.5, 0.5);
statusMessage.x = 2048 / 3;
statusMessage.y = 1500; //{2P} // Adjusted position
marketModal.addChild(statusMessage);
// Play purchase sound
LK.getSound('Moneyses').play();
// Update button states after purchase
var updatedScore = LK.getScore();
buyLifeBtn.interactive = updatedScore >= 100;
buyLifeBtn.alpha = buyLifeBtn.interactive ? 1.0 : 0.5;
buyPowerUpBtn.interactive = updatedScore >= 100;
buyPowerUpBtn.alpha = buyPowerUpBtn.interactive ? 1.0 : 0.5;
} else {
// Show error message
// Use the constructor to create a new Text2 with updated fill color
var errorStyle = {
size: 50,
fill: 0xFF0000
};
marketModal.removeChild(statusMessage);
statusMessage = new Text2('Not enough score! Need 100.', errorStyle);
statusMessage.anchor.set(0.5, 0.5);
statusMessage.x = 2048 / 3;
statusMessage.y = 1500; //{30} // Adjusted position
marketModal.addChild(statusMessage);
// Play error sound
LK.getSound('Damage').play();
}
};
// Buy power-up button handler
buyPowerUpBtn.buttonMode = true;
buyPowerUpBtn.down = function () {
var currentScore = LK.getScore();
if (currentScore >= 100) {
// Deduct score
LK.setScore(currentScore - 100);
scoreTxt.setText(LK.getScore());
// Spawn a power-up at the player's position
spawnPowerUpAtPlayer();
// Show success message
var successStyle = {
size: 50,
fill: 0x00FF00
};
marketModal.removeChild(statusMessage);
statusMessage = new Text2('Successfully purchased Power-Up!', successStyle);
statusMessage.anchor.set(0.5, 0.5);
statusMessage.x = 2048 / 3;
statusMessage.y = 1500;
marketModal.addChild(statusMessage);
// Play purchase sound
LK.getSound('Moneyses').play();
// Update button states after purchase
var updatedScore = LK.getScore();
buyLifeBtn.interactive = updatedScore >= 100;
buyLifeBtn.alpha = buyLifeBtn.interactive ? 1.0 : 0.5;
buyPowerUpBtn.interactive = updatedScore >= 100;
buyPowerUpBtn.alpha = buyPowerUpBtn.interactive ? 1.0 : 0.5;
} else {
// Show error message
var errorStyle = {
size: 50,
fill: 0xFF0000
};
marketModal.removeChild(statusMessage);
statusMessage = new Text2('Not enough score! Need 100.', errorStyle);
statusMessage.anchor.set(0.5, 0.5);
statusMessage.x = 2048 / 3;
statusMessage.y = 1500;
marketModal.addChild(statusMessage);
// Play error sound
LK.getSound('Damage').play();
}
};
closeMarketBtn.interactive = true;
closeMarketBtn.buttonMode = true;
closeMarketBtn.down = function () {
marketModal.visible = false;
};
// Rules modal
var rulesModal = new Container();
this.children.forEach(function (child) {
if (child === rulesModal) {
child.visible = false;
}
});
self.addChild(rulesModal);
// Rules modal background
var modalBg = LK.getAsset('dusman', {
anchorX: 0.5,
anchorY: 0.5,
width: 1600,
height: 1800
});
modalBg.tint = 0x333333;
modalBg.x = 2048 / 3;
modalBg.y = 2732 / 2;
rulesModal.addChild(modalBg);
// Rules title
var rulesTitle = new Text2('Game Rules', {
size: 180,
fill: 0xFFFFFF
});
rulesTitle.anchor.set(0.5, 0);
rulesTitle.x = 2048 / 3;
rulesTitle.y = 500;
rulesModal.addChild(rulesTitle);
// Rules content
var rulesContent = new Text2('- Killing the monster bees (+2)\n' + '- Collecting the money (+1)\n' + '- Getting caught by the turtle (-1 life)\n' + '- Touching the wires on the left (game over)\n' + '- Visit the market to buy extra lives for 100 score\n' + '- Buy power-ups in the market for special abilities\n' + '- PowerUp prevents turtle spawns for 30 seconds\n' + '- Money Rain occurs every 30 seconds for 10 seconds', {
size: 60,
fill: 0xFFFFFF
});
rulesContent.anchor.set(0.5, 0);
rulesContent.x = 2048 / 3;
rulesContent.y = 750;
rulesModal.addChild(rulesContent);
// Close button for rules modal
var closeBtn = new Text2('Close', {
size: 150,
fill: 0xFFFFFF
});
closeBtn.anchor.set(0.5, 0.5);
closeBtn.x = 2048 / 3;
closeBtn.y = 1800;
rulesModal.addChild(closeBtn);
// State tracking
self.isOpen = false;
self.isSoundOn = true;
// Button handlers
soundBtn.interactive = true;
soundBtn.buttonMode = true;
soundBtn.down = function () {
self.isSoundOn = !self.isSoundOn;
soundBtn.setText(self.isSoundOn ? 'Sound: ON' : 'Sound: OFF');
// Toggle game music
if (self.isSoundOn) {
LK.playMusic('gameMusic', {
volume: 0.4
});
} else {
LK.stopMusic();
}
};
rulesBtn.interactive = true;
rulesBtn.buttonMode = true;
rulesBtn.down = function () {
rulesModal.visible = true;
marketModal.visible = false;
};
closeBtn.interactive = true;
closeBtn.buttonMode = true;
closeBtn.down = function () {
rulesModal.visible = false;
};
backBtn.interactive = true;
backBtn.buttonMode = true;
backBtn.down = function () {
self.toggle();
};
// Toggle menu visibility
self.toggle = function () {
self.isOpen = !self.isOpen;
self.visible = self.isOpen;
// Pause/unpause game functionality
if (self.isOpen) {
// Pause game when menu is open
if (typeof pauseGame === 'function') {
pauseGame();
}
} else {
// Resume game when menu is closed
if (typeof resumeGame === 'function') {
resumeGame();
}
// Hide all modals when closing menu
if (rulesModal) {
rulesModal.visible = false;
}
if (marketModal) {
marketModal.visible = false;
}
if (creatorModal) {
creatorModal.visible = false;
}
}
};
// Initialize as hidden
self.visible = false;
return self;
});
var Money = Container.expand(function () {
var self = Container.call(this);
var moneyGraphics = self.attachAsset('money', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = Math.random() * 3 + 2; // Random speed between 2 and 5
self.update = function () {
self.y += self.speed;
self.x += Math.sin(self.y / 100) * 20; // Increased sine wave amplitude
moneyGraphics.rotation += 0.05; // Rotate the money
if (self.y > 2732) {
self.destroy();
}
};
});
// Define a class for managing periodic money rain
var MoneyRain = Container.expand(function () {
var self = Container.call(this);
// Time between money rain events in milliseconds (60 seconds)
self.rainInterval = 60000;
// Duration of each money rain in milliseconds (10 seconds)
self.rainDuration = 10000;
// Track if rain is active
self.isRaining = false;
// Track the interval ID for spawning money during rain
self.moneySpawnInterval = null;
// Function to start money rain
self.startRain = function () {
if (isGamePaused || self.isRaining) {
return;
}
self.isRaining = true;
// Create animated Money Rain text
var moneyRainText = new MoneyRainText();
game.addChild(moneyRainText);
moneyRainText.show(self.rainDuration);
// Create update interval for the animated text
var textUpdateInterval = LK.setInterval(function () {
if (isGamePaused) {
return;
}
moneyRainText.update();
}, 16); // Update at 60fps
// Spawn money at regular intervals during the rain duration
self.moneySpawnInterval = LK.setInterval(function () {
if (isGamePaused) {
return;
}
// Reduced number of money to spawn each time
var moneyCount = Math.floor(Math.random() * 2) + 1; // 1-2 money objects
for (var i = 0; i < moneyCount; i++) {
var money = new Money();
money.x = Math.random() * 2048; // Random horizontal position
money.y = -50; // Start above the screen
game.addChild(money);
}
}, 500); // Spawn every 0.5 seconds during rain
// Stop rain after duration
LK.setTimeout(function () {
if (self.moneySpawnInterval !== null) {
LK.clearInterval(self.moneySpawnInterval);
self.moneySpawnInterval = null;
}
if (textUpdateInterval !== null) {
LK.clearInterval(textUpdateInterval);
}
self.isRaining = false;
}, self.rainDuration);
};
// Initialize rain cycle
self.initialize = function () {
// Start first rain after 60 seconds
LK.setTimeout(function () {
self.startRain();
// Set up recurring rain cycle
LK.setInterval(function () {
if (!isGamePaused) {
self.startRain();
}
}, self.rainInterval);
}, 60000); // Delay the first rain by 60 seconds - no money will spawn before this
};
return self;
});
var MoneyRainText = Container.expand(function () {
var self = Container.call(this);
// Create the "Money Rain" text
var rainText = new Text2('Money Rain', {
size: 250,
fill: 0xFFD700 // Gold color
});
// Set anchor to center
rainText.anchor.set(0.5, 0.5);
// Add text to container
self.addChild(rainText);
// Initialize with horizontal motion parameters
self.speed = 5;
self.direction = 1; // 1 = right, -1 = left
self.amplitude = 30;
self.frequency = 0.05;
self.oscillationOffset = 0;
// Update position each frame
self.update = function () {
// Move horizontally
self.x += self.speed * self.direction;
// Bounce when reaching screen edges
if (self.x > 1800) {
self.direction = -1;
} else if (self.x < 200) {
self.direction = 1;
}
// Add sine wave motion for vertical movement
self.oscillationOffset += self.frequency;
self.y = self.baseY + Math.sin(self.oscillationOffset) * self.amplitude;
};
// Show the text with animation
self.show = function (duration) {
// Position at center initially
self.x = 2048 / 2;
self.y = 400;
self.baseY = self.y;
self.oscillationOffset = 0;
// Add scaling effect
self.scale.set(0);
tween(self.scale, {
x: 1,
y: 1
}, {
duration: 500,
easing: tween.elasticOut
});
// Set auto-removal timer
LK.setTimeout(function () {
// Scale down and remove
tween(self.scale, {
x: 0,
y: 0
}, {
duration: 500,
easing: tween.easeInBack,
onFinish: function onFinish() {
self.destroy();
}
});
}, duration);
};
return self;
});
// Define the missing NewEnemy class to fix the reference error
var NewEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = Math.random() * 3 + 2; // Random speed between 2 and 5
self.update = function () {
self.x -= self.speed; // Move from right to left
self.y += Math.sin(self.x / 100) * 10; // Add sine wave movement
if (self.x < -50) {
self.destroy();
}
};
return self;
});
//<Assets used in the game will automatically appear here>
// Define a class for the player character
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.jumpHeight = 15;
self.isJumping = false;
self.velocityY = 0;
self.update = function () {
// Check if the player is outside the scene boundaries
if (self.isJumping) {
if (self.lastY > self.y) {
LK.getSound('Fly').play(); // Play 'Fly' sound when moving upwards
}
self.lastY = self.y; // Update lastY to current y position
self.y -= self.velocityY;
self.velocityY -= gravity;
if (self.velocityY <= 0 && self.y < 1366) {
self.x += 7; // Move right by 7 units at peak
}
if (self.y >= 1366) {
self.y = 1366;
self.isJumping = false;
self.velocityY = 0;
}
// Prevent player from being pushed when touching the top of a wall
for (var k = walls.length - 1; k >= 0; k--) {
if (self.intersects(walls[k])) {
if (self.y < walls[k].y - walls[k].height / 2) {
self.y = walls[k].y - walls[k].height / 2;
self.velocityY = 0;
self.isJumping = false;
}
}
}
}
// Check if the player touches the left edge of the screen
if (self.x <= 0) {
LK.effects.flashScreen(0xff0000, 1000); // Flash red light across the entire scene
LK.showGameOver(); // End the game if the player touches the wires on the left
}
self.x += self.speedX;
if (self.x > 2048 - playerGraphics.width / 2) {
self.x = 2048 - playerGraphics.width / 2; // Prevent moving outside the right edge
}
// Removed vertical oscillation when the player is not jumping and not moving horizontally
if (self.isJumping) {
self.y -= self.velocityY;
self.velocityY -= gravity;
if (self.y >= 1366) {
self.y = 1366;
self.isJumping = false;
self.velocityY = 0;
}
// Check if the player touches the top edge of the screen
if (self.y <= 0) {
LK.effects.flashScreen(0xff0000, 1000); // Flash red light across the entire scene
LK.showGameOver(); // End the game if the player touches the top edge
}
}
};
self.jump = function () {
if (!self.isJumping && self.y > 0) {
self.isJumping = true;
self.velocityY = 20; // Set initial jump velocity
self.speedX = 0; // Reset horizontal speed
}
};
});
var PlayerHealth = Container.expand(function () {
var self = Container.call(this);
self.lives = 5; // Default initial lives
self.initialize = function (initialLives) {
self.lives = initialLives || 5;
};
self.decreaseLife = function () {
self.lives--;
if (self.lives <= 0) {
LK.showGameOver(); // End the game if no lives are left
}
};
self.getLives = function () {
return self.lives;
};
return self;
});
// Define a class for the right button
var RightButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('rightButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
LK.getSound('Kok').play(); // Play 'Kok' sound when button is pressed
character.speedX = moveSpeed;
character.removeChild(character.children[0]); // Remove current player image
character.attachAsset('rightImage', {
anchorX: 0.5,
anchorY: 0.5
}); // Change character image to 'rightImage'
character.y += 100; // Move character down by 100px
};
self.up = function (x, y, obj) {
character.speedX = 0;
character.removeChild(character.children[0]); // Remove current rightImage
character.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
}); // Revert character image to original
};
});
var ScrollingBackground = Container.expand(function () {
var self = Container.call(this);
var layer1_1 = self.attachAsset('Layer1', {
anchorX: 0.5,
anchorY: 0.5
});
var layer1_2 = self.attachAsset('Layer1', {
anchorX: 0.5,
anchorY: 0.5
});
var layer2_1 = self.attachAsset('Layer2', {
anchorX: 0.5,
anchorY: 0.5
});
var layer2_2 = self.attachAsset('Layer2', {
anchorX: 0.5,
anchorY: 0.5
});
var layer3_1 = self.attachAsset('Layer3', {
anchorX: 0.5,
anchorY: 0.5
});
var layer3_2 = self.attachAsset('Layer3', {
anchorX: 0.5,
anchorY: 0.5
});
var bg1 = self.attachAsset('arkaplan', {
anchorX: 0.5,
anchorY: 0.5
});
var bg2 = self.attachAsset('arkaplan', {
anchorX: 0.5,
anchorY: 0.5
});
bg1.x = 2048 / 2;
bg1.y = 2732 / 2 - 60; // Move 30 units upward
bg2.x = 2048 / 2 + 2048;
bg2.y = 2732 / 2 - 60; // Move 30 units upward
// Scale Layer1 to fit the entire screen
var layer1ScaleX = 2048 / layer1_1.width;
var layer1ScaleY = 2732 / layer1_1.height;
var layer1Scale = Math.max(layer1ScaleX, layer1ScaleY);
layer1_1.x = 2048 / 2;
layer1_1.y = 2732 / 2;
layer1_1.scale.set(layer1Scale);
layer1_2.x = 2048 / 2 + 2048;
layer1_2.y = 2732 / 2;
layer1_2.scale.set(layer1Scale);
layer2_1.x = 2048 / 2;
layer2_1.y = 2732 / 2 - 120; // Move 120 units upward
layer2_1.scale.set(15); // Scale up slightly less than Layer1
layer2_2.x = 2048 / 2 + 2048;
layer2_2.y = 2732 / 2 - 120; // Move 120 units upward
layer2_2.scale.set(15); // Scale up slightly less than Layer1
layer3_1.x = 2048 / 2;
layer3_1.y = 2732 / 2 - 400; // Move 400 units upward
layer3_1.scale.set(10); // Scale up slightly less than Layer2
layer3_2.x = 2048 / 2 + 2048;
layer3_2.y = 2732 / 2 - 400; // Move 400 units upward
layer3_2.scale.set(10); // Scale up slightly less than Layer2
self.update = function () {
bg1.x -= 2; // Move from right to left
bg2.x -= 2; // Move from right to left
// Move Layer1 slowly from right to left
layer1_1.x -= 0.5; // Slower movement for layer1_1
layer1_2.x -= 0.5; // Slower movement for layer1_2
// Layer2 also doesn't move like Layer1
// Layer3 also doesn't move like Layer1 and Layer2
if (bg1.x < -2048 / 2) {
// Change condition for leftward movement
bg1.x = bg2.x + 2048; // Reposition to the right of bg2
}
if (bg2.x < -2048 / 2) {
// Change condition for leftward movement
bg2.x = bg1.x + 2048; // Reposition to the right of bg1
}
// Reposition Layer1 when it moves off-screen
if (layer1_1.x < -2048 / 2) {
layer1_1.x = layer1_2.x + 2048; // Reposition to the right of layer1_2
}
if (layer1_2.x < -2048 / 2) {
layer1_2.x = layer1_1.x + 2048; // Reposition to the right of layer1_1
}
};
});
// Define a class for the sine wave enemy
var SineWaveEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3; // Constant speed
self.amplitude = 50; // Amplitude of the sine wave
self.frequency = 100; // Frequency of the sine wave
self.update = function () {
self.x -= self.speed;
self.y += Math.sin(self.x / self.frequency) * self.amplitude;
for (var k = walls.length - 1; k >= 0; k--) {
if (self.intersects(walls[k])) {
// If SineWaveEnemy intersects with a wall, adjust its position to prevent passing through
if (self.x > walls[k].x) {
self.x = walls[k].x + walls[k].width / 2 + enemyGraphics.width / 2;
} else {
self.x = walls[k].x - walls[k].width / 2 - enemyGraphics.width / 2;
}
}
}
if (self.x < -50) {
self.destroy();
}
};
});
// Define a class for the up button
var UpButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('upButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
LK.getSound('Kok').play(); // Play 'Kok' sound when button is pressed
player.jump();
};
});
var Wall = Container.expand(function () {
var self = Container.call(this);
var wallGraphics = self.attachAsset('wall', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5; // Speed at which the wall moves from right to left
self.update = function () {
self.x -= self.speed;
if (self.x < -wallGraphics.width) {
self.destroy();
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
// No title, no description
// Always backgroundColor is black
backgroundColor: 0x000000
});
/****
* Game Code
****/
//Storage library which should be used for persistent game data
//Minimalistic tween library which should be used for animations over time, including tinting / colouring an object, scaling, rotating, or changing any game object property.
// Initialize player health with 5 lives
// Define a class for managing player health
// Function removed as it was unused
function _typeof(o) {
"@babel/helpers - typeof";
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
return typeof o;
} : function (o) {
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
}, _typeof(o);
}
function _classCallCheck(a, n) {
if (!(a instanceof n)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _defineProperties(e, r) {
for (var t = 0; t < r.length; t++) {
var o = r[t];
o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o);
}
}
function _createClass(e, r, t) {
return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", {
writable: !1
}), e;
}
function _toPropertyKey(t) {
var i = _toPrimitive(t, "string");
return "symbol" == _typeof(i) ? i : i + "";
}
function _toPrimitive(t, r) {
if ("object" != _typeof(t) || !t) {
return t;
}
var e = t[Symbol.toPrimitive];
if (void 0 !== e) {
var i = e.call(t, r || "default");
if ("object" != _typeof(i)) {
return i;
}
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return ("string" === r ? String : Number)(t);
}
var playerHealth = new PlayerHealth();
playerHealth.initialize(5);
// Create and display life icons
var lifeIcons = [];
for (var i = 0; i < playerHealth.getLives(); i++) {
var lifeIcon = new LifeIcon();
lifeIcon.updatePosition(i);
LK.gui.topLeft.addChild(lifeIcon);
lifeIcons.push(lifeIcon);
}
// Store original decrease life function
var originalDecreaseLife = playerHealth.decreaseLife;
// Override the decrease life function
playerHealth.decreaseLife = function () {
// Call the original function
originalDecreaseLife.call(playerHealth);
// Remove a life icon
if (lifeIcons.length > 0) {
var iconToRemove = lifeIcons.pop();
iconToRemove.destroy();
}
};
LK.setInterval(createKaplu, 5000); // Spawn 'kaplu' every 5 seconds
var walls = [];
function spawnWall() {
if (isGamePaused) {
return;
}
if (!powerUpActive) {
var wall = new Wall();
wall.x = 2048 + wall.width / 2; // Start from the right edge of the screen
wall.y = Math.random() * (2732 / 2 - wall.height) + wall.height / 2; // Random vertical position above the center
game.addChild(wall);
walls.push(wall);
}
}
LK.setInterval(spawnWall, 10000); // Set interval to spawn walls every 10 seconds
// Function to create sine wave enemies
function createSineWaveEnemy() {
if (isGamePaused) {
return;
}
var enemy = new SineWaveEnemy();
enemy.x = 2048; // Start from the right edge of the screen
enemy.y = Math.random() * 2732; // Random vertical position
game.addChild(enemy);
enemies.push(enemy);
}
// Set interval to spawn sine wave enemies
LK.setInterval(createSineWaveEnemy, 5000); // Spawn every 5 seconds
// MoneyRain now starts automatically every 60 seconds from MoneyRain.initialize()
// Function to create enemies with different types and behaviors
function createEnemy() {
if (isGamePaused) {
return;
}
var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "enemy";
var enemy;
enemy = new Enemy();
enemy.x = 2048; // Start from the right edge of the screen
enemy.y = Math.random() * (2732 - enemy.height) + enemy.height / 2; // Random vertical position within screen bounds
game.addChild(enemy);
enemies.push(enemy);
}
// Set intervals to spawn enemies
LK.setInterval(function () {
createEnemy("enemy"); // Normal enemy every 4 seconds
}, 4000);
// Function to spawn money on the screen
function spawnMoney() {
if (isGamePaused) {
return;
}
// Number of money to spawn
var moneyCount = LK.getScore() > 200 ? Math.floor(Math.random() * 1) + 1 : Math.floor(Math.random() * 3) + 2;
for (var i = 0; i < moneyCount; i++) {
// Create a new money object
var money = new Money();
// Set random initial position
money.x = Math.random() * 2048; // Random horizontal position
money.y = -50; // Start above the screen
// Add money to the game scene
game.addChild(money);
}
}
// Money spawning is only managed by MoneyRain system
// No regular money spawning in the game
var scrollingBackground = game.addChild(new ScrollingBackground());
// Variable to track game over state
var gameOver = false;
// Play background music when the game starts
LK.playMusic('gameMusic', {
volume: 0.8,
loop: true
});
// Variable to track power-up states
var powerUpActive = false;
var powerUpCooldown = false;
// Function to spawn a super power-up
function spawnSuperPowerUp() {
if (powerUpActive || powerUpCooldown) {
return;
}
// Create a new power-up asset
var powerUp = LK.getAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
// Random x position within the scene width
var x = Math.random() * (2048 - 50);
powerUp.x = x;
powerUp.y = -60; // Start above the screen
// Add power-up to the game scene
game.addChild(powerUp);
// Move the power-up downwards
var fall = LK.setInterval(function () {
powerUp.y += 4;
powerUp.x += Math.sin(powerUp.y / 100) * 10; // Sine wave pattern
// Remove power-up if it goes off-screen
if (powerUp.y > 2732) {
LK.clearInterval(fall);
powerUp.destroy();
}
// Check for collision with player
if (player.intersects(powerUp)) {
LK.clearInterval(fall);
powerUp.destroy();
activateSuperPower();
}
}, 16);
}
// Function to activate the super power
function activateSuperPower() {
if (powerUpActive) {
return;
}
powerUpActive = true;
// Create and show power-up status indicator
var powerUpIndicator = new Text2('PowerUp Active!', {
size: 80,
fill: 0x00FF00
});
powerUpIndicator.anchor.set(0.5, 0.5);
powerUpIndicator.x = 2048 / 2;
powerUpIndicator.y = 2732 / 2;
LK.gui.center.addChild(powerUpIndicator);
// Add pulsing effect to power-up indicator
var _pulseIndicator = function pulseIndicator() {
tween(powerUpIndicator.scale, {
x: 1.2,
y: 1.2
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(powerUpIndicator.scale, {
x: 1,
y: 1
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: _pulseIndicator
});
}
});
};
_pulseIndicator();
// Add glowing effect to player
tween(player, {
alpha: 0.7
}, {
duration: 500,
easing: tween.easeInOut,
yoyo: true,
loop: true
});
// Power-Up does not affect money spawn rate
// since money only spawns during Money Rain events
powerUpCooldown = true;
// Scale up the player
player.scale.set(4);
// Show countdown timer
var remainingTime = 30;
var countdownTimer = new Text2(remainingTime + 's', {
size: 60,
fill: 0xFFFFFF
});
countdownTimer.anchor.set(0.5, 0);
countdownTimer.x = 2048 / 2;
countdownTimer.y = 230;
LK.gui.top.addChild(countdownTimer);
// Update timer every second
var timerInterval = LK.setInterval(function () {
remainingTime--;
// When time is 10 or less, recreate the text with red color
if (remainingTime <= 10) {
// Remove the old timer
LK.gui.top.removeChild(countdownTimer);
// Create a new timer with red color
countdownTimer = new Text2(remainingTime + 's', {
size: 60,
fill: 0xFF0000 // Red color for urgent countdown
});
countdownTimer.anchor.set(0.5, 0);
countdownTimer.x = 2048 / 2;
countdownTimer.y = 230;
LK.gui.top.addChild(countdownTimer);
} else {
// Just update the text for normal countdown
countdownTimer.setText(remainingTime + 's');
}
}, 1000);
// Revert player scale after 30 seconds
LK.setTimeout(function () {
player.scale.set(1);
powerUpActive = false;
LK.gui.top.removeChild(powerUpIndicator);
LK.gui.top.removeChild(countdownTimer);
LK.clearInterval(timerInterval);
player.alpha = 1; // Reset player alpha
// Remove any tweens on the player
tween.stop(player);
// Cooldown before another power-up can spawn
LK.setTimeout(function () {
powerUpCooldown = false;
}, 60000); // Set to 1 minute if player collects the power-up
}, 30000);
}
// Attempt to spawn a power-up every 40 seconds, ensuring only one is active at a time
if (!powerUpActive && !powerUpCooldown) {
LK.setTimeout(spawnSuperPowerUp, 40000);
}
// Array to hold spikes
var spikes = [];
// Function to create spikes
function createSpikes() {
var spikeHeight = 100; // Height of each spike
var spikeWidth = 30; // Width of each spike
var gap = 50; // Gap between spikes
// Create fixed spikes on the left edge of the scene
for (var y = 0; y < 2732; y += spikeHeight + gap) {
var spike = LK.getAsset('spike', {
anchorX: 0.5,
anchorY: 0.5
});
// Spike starting position (fixed to the left edge)
var startX = -spikeWidth; // Left edge
var startY = y; // Arranged with gap between them
spike.x = startX;
spike.y = startY;
// Add spikes to the game scene
game.addChild(spike);
// Add spike object to the array
spikes.push(spike);
}
}
// Create spikes (only run once)
createSpikes();
// Create and initialize money rain system
var moneyRain = new MoneyRain();
moneyRain.initialize();
// Create and initialize the score text display
var scoreTxt = new Text2('0', {
size: 150,
// Reduced size by 25% from 200
fill: 0x000000 // Black color for the score text
});
// Set the initial score text to zero
scoreTxt.setText(LK.getScore());
// Center the score text horizontally at the top of the screen
scoreTxt.anchor.set(0.5, 0); // Anchor at the center of the top edge
// Add the score text to the GUI overlay at a slightly left position from the top-right
var newVisual = LK.getAsset('newVisual', {
anchorX: 0.5,
anchorY: 0.5
});
newVisual.x -= 100; // Move the new visual 100 pixels to the left
newVisual.y += 100; // Move the new visual 100 pixels downwards
scoreTxt.x = newVisual.x - 180; // Position score text 180 pixels to the left of the new visual
scoreTxt.y = newVisual.y + 90 - 170;
LK.gui.topRight.addChild(scoreTxt);
LK.gui.topRight.addChild(newVisual);
// Display Best Score in the center of the scene
// Always show the highest score achieved, update if current score is higher
// Create a menu button in the center of the screen when game starts
var menuButton = LK.getAsset('menuButtonShape', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 200
});
menuButton.scale.set(3); // Set scale to 3 for 3x size
menuButton.tint = 0x3f51b5; // Nice blue color
menuButton.x = 2048 / 2; // Center horizontally
menuButton.y = 2732 / 2 + 1300; // Move 1300 units down from center
menuButton.visible = true; // Ensure menu button is visible when game starts
menuButton.alpha = 1; // Make sure button is fully opaque
menuButton.interactive = true;
menuButton.buttonMode = true;
// Removed menu label from menu button
// Create the menu system and add it to the GUI layer
var menuSystem = new MenuSystem();
LK.gui.addChild(menuSystem);
// Don't show menu automatically when game starts
menuSystem.isOpen = false;
menuSystem.visible = false;
// Game is not paused initially
isGamePaused = false;
// Add the menu button directly to the main game scene for full visibility
game.addChild(menuButton);
// Add animation effects for menu button
menuButton.down = function () {
// Scale down button when clicked
tween(menuButton.scale, {
x: 2.7,
y: 2.7
}, {
duration: 100,
easing: tween.easeOut
});
// Toggle menu system
menuSystem.toggle();
// Update button appearance based on menu state
menuButton.tint = menuSystem.isOpen ? 0x888888 : 0x444444;
};
menuButton.up = function () {
// Scale back to normal when released
tween(menuButton.scale, {
x: 3,
y: 3
}, {
duration: 100,
easing: tween.easeOut
});
};
// Add enhanced pulse animation to menu button to make it more visible
function pulseMenuButton() {
// Make sure menuButton is visible before animating
menuButton.visible = true;
// Ensure menu button is centered 1300 units below center
menuButton.x = 2048 / 2;
menuButton.y = 2732 / 2 + 1300;
tween(menuButton.scale, {
x: 3.6,
y: 3.6
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(menuButton.scale, {
x: 3,
y: 3
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: pulseMenuButton
});
}
});
// Also animate the button's alpha for a flashy effect
tween(menuButton, {
alpha: 0.8
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(menuButton, {
alpha: 1
}, {
duration: 800,
easing: tween.easeInOut
});
}
});
}
// Start pulse animation immediately
pulseMenuButton();
// Ensure menu button is on top of all other elements
if (game.children.indexOf(menuButton) !== -1) {
game.removeChild(menuButton);
game.addChild(menuButton);
}
// Set initial button state with a nice blue color
menuButton.tint = 0x3f51b5; // Blue color for visibility
// Get best score from storage with proper default
var bestScore = storage.bestScore !== undefined ? storage.bestScore : 0;
var bestScoreTxt = new Text2('Best Score: ' + bestScore, {
size: 121.5,
// 135'in %10 küçüğü
fill: 0x000000
});
bestScoreTxt.anchor.set(0.5, 0.5);
bestScoreTxt.x = 2048 / 2;
bestScoreTxt.y = 2732 / 2 + 920; // 30 units higher
game.addChild(bestScoreTxt);
// Update best score if current score exceeds it, and always show the highest
function updateBestScoreDisplay() {
var currentScore = LK.getScore();
var storedBest = storage.bestScore !== undefined ? storage.bestScore : 0;
if (currentScore > storedBest) {
storage.bestScore = currentScore;
bestScoreTxt.setText('Best Score: ' + currentScore);
} else {
bestScoreTxt.setText('Best Score: ' + storedBest);
}
}
var moveSpeed = 5; // Speed for character movement
var gravity = 0.8; // Decrease gravity for a lighter effect
var windSpeed = 2; // Reduce wind speed for horizontal movement
// Initialize player at the center of the screen
var player = game.addChild(new Player());
var character = player; // Define character as a reference to player
player.x = 1024;
player.y = 1366;
player.speedX = 0; // Prevent movement on spawn
player.speedY = 0; // Prevent movement on spawn
player.isJumping = false;
player.velocityY = 0;
// Initialize up button
var upButton = game.addChild(new UpButton());
upButton.x = 2048 / 2 - 500; // Middle point's x coordinate minus button width
upButton.y = 2732 / 2 + 600; // Middle point's y coordinate plus button height plus additional 100 pixels
// Add scaling effect to the up button when pressed and released
upButton.down = function () {
upButton.scale.set(0.9); // Scale down by 10%
};
upButton.up = function () {
upButton.scale.set(1); // Reset to original size
};
upButton.move = function () {
upButton.scale.set(1); // Reset to original size if mouse leaves
};
// Initialize left button
var leftButton = game.addChild(new LeftButton());
leftButton.x = 300; // Move slightly more to the right
leftButton.y = 2732 - 250; // Move slightly more upwards
// Initialize right button
var rightButton = game.addChild(new RightButton());
rightButton.x = 2048 - 300; // Move slightly more to the left
rightButton.y = 2732 - 250; // Move slightly more upwards
// Initialize down button
var downButton = game.addChild(new DownButton());
downButton.x = 2048 - 500 - 50; // Right edge minus button width and margin
downButton.y = 2732 - 500 - 250; // Move the down button slightly more upwards
// Initialize enemies
var enemies = [];
var enemySpawnInterval = 160; // Initial slower spawn rate for the first 30 seconds
var enemySpawnIncreaseInterval = 40000; // Increase spawn rate every 40 seconds
var enemySpawnCounter = 0;
// Variables to track button presses
var isPressingUp = false;
var isPressingDown = false;
// Event listeners for button presses
upButton.down = function () {
isPressingUp = true;
character.removeChild(character.children[0]); // Remove current player image
character.attachAsset('playerup', {
anchorX: 0.5,
anchorY: 0.5
}); // Change character image to 'up'
};
upButton.up = function () {
isPressingUp = false;
character.removeChild(character.children[0]); // Remove current playerup image
character.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
}); // Revert character image to original
};
downButton.down = function () {
isPressingDown = true;
character.removeChild(character.children[0]); // Remove current player image
character.attachAsset('player_down', {
anchorX: 0.5,
anchorY: 0.5
}); // Change character image to 'dow'
character.y += 50; // Move character down by 50px
character.x += 160; // Move character right by 160px
};
downButton.up = function () {
isPressingDown = false;
character.removeChild(character.children[0]); // Remove current player_down image
character.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
}); // Revert character image to original
character.y -= 50; // Move character back to original position
};
// Update player movement based on button presses
function updatePlayerMovement() {
if (isPressingUp) {
player.velocityY = -20; // Increase upward speed
player.x += 8; // Move right by 8 units
}
// Removed upward movement when the down button is pressed
player.y += player.velocityY;
if (!isPressingUp && !isPressingDown) {
player.velocityY += gravity;
}
if (player.y > 1366) {
player.y = 1366;
player.velocityY = 0;
}
if (player.y < 0) {
player.y = 0;
player.velocityY = 0;
}
}
// Set interval for updating player movement
LK.setInterval(updatePlayerMovement, 16);
// Set interval to increase enemy spawn rate
LK.setInterval(function () {
if (enemySpawnInterval > 20) {
// Ensure a minimum spawn interval
enemySpawnInterval -= 10; // Decrease interval to increase spawn rate
}
}, enemySpawnIncreaseInterval);
// Set interval for updating player movement
LK.setInterval(function () {
player.update();
}, 16);
// Game state tracking
var isGamePaused = false;
// Function to pause the game
function pauseGame() {
isGamePaused = true;
// Optional: Stop or pause background music
// LK.stopMusic();
}
// Function to resume the game
function resumeGame() {
isGamePaused = false;
// Optional: Resume background music if it was playing
if (menuSystem.isSoundOn) {
LK.playMusic('gameMusic', {
volume: 0.4
});
}
}
// Update menu system toggle to pause/resume game
menuSystem.toggle = function () {
this.isOpen = !this.isOpen;
this.visible = this.isOpen;
// Ensure menu button is always visible
menuButton.visible = true;
if (this.isOpen) {
// When menu opens, move the menu button to top right
tween(menuButton, {
x: 2048 - 150,
y: 150,
scaleX: 3,
scaleY: 3
}, {
duration: 300,
easing: tween.easeOut
});
pauseGame();
} else {
// Always keep button centered 1300 units below center when menu is closed
tween(menuButton, {
x: 2048 / 2,
y: 2732 / 2 + 1300,
scaleX: 3,
scaleY: 3
}, {
duration: 300,
easing: tween.easeOut
});
resumeGame();
// Find rulesModal in children and hide it
this.children.forEach(function (child) {
if (child.children && child.children[0] && child.children[0].tint === 0x333333) {
child.visible = false;
}
});
}
};
// Handle game updates
game.update = function () {
// Skip updates if game is paused
if (isGamePaused) {
return;
}
player.update();
scrollingBackground.update();
for (var k = walls.length - 1; k >= 0; k--) {
walls[k].update();
if (player.intersects(walls[k])) {
// Allow player to approach walls without collision
if (player.x > walls[k].x) {
if (player.x < walls[k].x + walls[k].width / 2 + player.width / 2 - 10) {
player.x = walls[k].x + walls[k].width / 2 + player.width / 2 - 10;
}
} else {
if (player.x > walls[k].x - walls[k].width / 2 - player.width / 2 + 10) {
player.x = walls[k].x - walls[k].width / 2 - player.width / 2 + 10;
}
}
// Do not trigger game over when intersecting with walls
}
}
for (var i = game.children.length - 1; i >= 0; i--) {
if (game.children[i] instanceof Money) {
var money = game.children[i];
money.update();
if (player.intersects(money)) {
money.destroy(); // Remove money from the scene
LK.setScore(LK.getScore() + 1); // Increase score by 1 for collecting money
scoreTxt.setText(LK.getScore()); // Update the score text display
updateBestScoreDisplay(); // Update best score if needed
// Update buy button state if market is visible
if (menuSystem.isOpen && menuSystem.children[4] && menuSystem.children[4].visible) {
buyLifeBtn.interactive = LK.getScore() >= 100;
buyLifeBtn.alpha = buyLifeBtn.interactive ? 1.0 : 0.5;
}
LK.getSound('Moneyses').play(); // Play 'Moneyses' sound when player intersects with money
}
}
}
// Check if the player is completely out of the scene
if (player.x < -player.width || player.x > 2048 + player.width || player.y < -player.height || player.y > 2732 + player.height) {
LK.showGameOver(); // End the game if the player is completely out of bounds
}
player.x -= windSpeed; // Apply wind effect to move player left
// Spawn enemies
enemySpawnCounter++;
if (enemySpawnCounter >= enemySpawnInterval * 6 && !powerUpActive) {
if (LK.ticks >= 1800) {
// 30 seconds * 60 FPS
enemySpawnInterval = 80; // Increase spawn rate after 30 seconds
}
if (enemySpawnCounter % 2 === 0) {
// Introduce a delay between spawns
return;
}
// Increase interval to reduce new enemy spawn rate
var enemy = new Enemy();
enemy.x = 2048; // Spawn from the right edge of the screen
enemy.y = Math.random() * (2732 / 2) + 100; // Random y position slightly lower from the top half of the screen
enemies.push(enemy);
game.addChild(enemy);
enemySpawnCounter = 0;
}
// Update enemies
for (var j = enemies.length - 1; j >= 0; j--) {
enemies[j].update();
if (player.intersects(enemies[j])) {
LK.getSound('Kick').play(); // Play 'Kick' sound when player intersects with an enemy
// Show 'kan' image at the collision point for 1 second
var kanVisual = LK.getAsset('kan', {
anchorX: 0.5,
anchorY: 0.5
});
kanVisual.x = enemies[j].x;
kanVisual.y = enemies[j].y;
game.addChild(kanVisual);
// Remove enemy from scene and array
enemies[j].destroy();
enemies.splice(j, 1);
// Ensure player is above kan visual
game.addChild(player);
// Remove 'kan' visual after 1 second
LK.setTimeout(function () {
kanVisual.destroy();
}, 1000);
if (enemies[j] instanceof NewEnemy) {
LK.effects.flashScreen(0xff0000, 1000); // Flash red light across the entire scene
if (LK.ticks >= 3600) {
// 60 seconds * 60 FPS
LK.setScore(LK.getScore() - 10); // Decrease score by 10 after 60 seconds
} else {
LK.setScore(LK.getScore() - 3); // Decrease score by 3 for newEnemy
}
if (LK.getScore() < 0) {
LK.getSound('End').play(); // Play 'End' sound
LK.showGameOver(); // End the game if the score goes below zero
}
} else {
LK.setScore(LK.getScore() + 2); // Increase score by 2 for killing monster bees
}
scoreTxt.setText(LK.getScore()); // Update the score text display
updateBestScoreDisplay(); // Update best score if needed
// Update buy buttons state if market is visible
if (menuSystem.isOpen && menuSystem.children[4] && menuSystem.children[4].visible) {
var currentScore = LK.getScore();
buyLifeBtn.interactive = currentScore >= 100;
buyLifeBtn.alpha = buyLifeBtn.interactive ? 1.0 : 0.5;
buyPowerUpBtn.interactive = currentScore >= 100;
buyPowerUpBtn.alpha = buyPowerUpBtn.interactive ? 1.0 : 0.5;
}
if (LK.getScore() % 20 === 0) {
enemySpawnInterval = Math.max(20, enemySpawnInterval - 10); // Increase spawn rate by decreasing interval
}
if (LK.getScore() % 100 === 0 && LK.getScore() !== 0) {
LK.effects.flashScreen(0x00ff00, 1000); // Flash green light across the entire scene
}
if (LK.getScore() >= 40) {
enemySpawnInterval = Math.max(10, enemySpawnInterval - 5); // Further increase spawn rate when score is 40 or more
}
}
}
for (var i = game.children.length - 1; i >= 0; i--) {
if (game.children[i] instanceof Kaplu) {
var kaplu = game.children[i];
kaplu.update();
if (player.intersects(kaplu)) {
LK.effects.flashScreen(0xff0000, 1000); // Flash red light across the entire scene
LK.setScore(LK.getScore() - 5); // Decrease score by 5
scoreTxt.setText(LK.getScore()); // Update the score text display
updateBestScoreDisplay(); // Update best score if needed
playerHealth.decreaseLife(); // Decrease player health by 1 for getting caught by the turtle
LK.getSound('Damage').play(); // Play 'Damage' sound when player intersects with 'kaplu'
kaplu.destroy(); // Remove 'kaplu' from the scene
}
}
}
};
// Handle player movement with touch
game.down = function (x, y, obj) {
if (y < 1366) {
// Check if the touch is in the upper half
player.x = x;
player.y = y;
}
};
game.move = function (x, y, obj) {
if (y < 1366) {
// Check if the touch is in the upper half
player.x = x;
player.y = y;
}
};
function createKaplu() {
if (isGamePaused) {
return;
}
if (!powerUpActive) {
var kaplu = new Kaplu();
kaplu.x = 2048 + kaplu.width / 2; // Start from the right edge of the screen
kaplu.y = Math.random() * (2732 / 2 - kaplu.height) + kaplu.height / 2; // Random vertical position above the center
game.addChild(kaplu);
}
}
// Function to spawn a power-up at player's position
function spawnPowerUpAtPlayer() {
// Create a new power-up asset
var powerUp = LK.getAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
// Position at player location with slight offset
powerUp.x = player.x;
powerUp.y = player.y - 100; // Position above the player
// Add power-up to the game scene
game.addChild(powerUp);
// Add rotating animation
var rotationTween = tween(powerUp, {
rotation: Math.PI * 2 // Full rotation (360 degrees)
}, {
duration: 2000,
easing: tween.easeInOut,
loop: true
});
// Add pulsing effect
var _pulseAnimation = function pulseAnimation() {
tween(powerUp.scale, {
x: 1.2,
y: 1.2
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(powerUp.scale, {
x: 1,
y: 1
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: _pulseAnimation
});
}
});
};
_pulseAnimation();
// Make it automatically activate after 5 seconds if not collected
LK.setTimeout(function () {
if (powerUp.parent) {
// Check if power-up still exists
powerUp.destroy();
activateSuperPower(); // Activate the power-up
}
}, 5000);
// Add collision detection for faster collection
var collisionInterval = LK.setInterval(function () {
if (powerUp.parent && player.intersects(powerUp)) {
powerUp.destroy();
LK.clearInterval(collisionInterval);
activateSuperPower(); // Activate the power-up when collected
}
}, 16);
} /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
// Define a class for the down button
var DownButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('downButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
LK.getSound('Kok').play(); // Play 'Kok' sound when button is pressed
if (player.y + 100 <= 2732) {
player.y += 100;
// Check if player is intersecting with NewEnemy
for (var i = 0; i < enemies.length; i++) {
if (enemies[i] instanceof NewEnemy && player.intersects(enemies[i])) {
LK.setScore(LK.getScore() + 10); // Increase score by 10
scoreTxt.setText(LK.getScore()); // Update the score text display
break; // Exit loop after finding the first intersecting NewEnemy
}
}
}
};
});
// Define a class for enemies
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = Math.random() * 2 + 1; // Random speed between 1 and 3
self.update = function () {
self.x -= self.speed; // Move from right to left
self.y += Math.sin(self.x / 150) * 15; // Further reduce vertical oscillation amplitude
for (var k = walls.length - 1; k >= 0; k--) {
if (self.intersects(walls[k])) {
// If enemy intersects with a wall, adjust its position to prevent passing through
if (self.x > walls[k].x) {
self.x = walls[k].x + walls[k].width / 2 + enemyGraphics.width / 2;
} else {
self.x = walls[k].x - walls[k].width / 2 - enemyGraphics.width / 2;
}
}
}
if (self.y < 0) {
self.y = 0; // Prevent moving above the top of the scene
}
if (self.x < -50) {
self.destroy();
}
};
});
var Kaplu = Container.expand(function () {
var self = Container.call(this);
// Store frame asset ids
var kapluFrames = ['Kaplu1', 'Kaplu2', 'Kaplu3'];
var currentFrame = 0;
// Attach all frames, but only show the first one
var kapluGraphicsArr = [];
for (var i = 0; i < kapluFrames.length; i++) {
var g = self.attachAsset(kapluFrames[i], {
anchorX: 0.5,
anchorY: 0.5
});
g.visible = i === 0;
kapluGraphicsArr.push(g);
}
var kapluGraphics = kapluGraphicsArr[0];
// Animation timing
var frameInterval = 120; // ms per frame (~8 FPS)
var lastFrameTime = Date.now();
self.update = function () {
self.x -= 5; // Move 'kaplu' from right to left faster
// Animate frames
var now = Date.now();
if (now - lastFrameTime >= frameInterval) {
// Hide current frame
kapluGraphicsArr[currentFrame].visible = false;
// Advance frame
currentFrame = (currentFrame + 1) % kapluFrames.length;
// Show new frame
kapluGraphicsArr[currentFrame].visible = true;
kapluGraphics = kapluGraphicsArr[currentFrame];
lastFrameTime = now;
}
for (var k = walls.length - 1; k >= 0; k--) {
if (self.intersects(walls[k])) {
// If 'kaplu' intersects with a wall, adjust its position to prevent passing through
if (self.x > walls[k].x) {
self.x = walls[k].x + walls[k].width / 2 + kapluGraphics.width / 2;
} else {
self.x = walls[k].x - walls[k].width / 2 - kapluGraphics.width / 2;
}
}
}
if (self.x < -kapluGraphics.width / 2) {
self.destroy(); // Remove 'kaplu' when it goes off-screen
}
};
});
// Define a class for the left button
var LeftButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('leftButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
LK.getSound('Kok').play(); // Play 'Kok' sound when button is pressed
character.speedX = -moveSpeed;
character.removeChild(character.children[0]); // Remove current player image
character.attachAsset('leftImage', {
// Change character image to 'leftImage'
anchorX: 0.5,
anchorY: 0.5
});
};
self.up = function (x, y, obj) {
character.speedX = 0;
character.removeChild(character.children[0]); // Remove current leftImage
character.attachAsset('player', {
// Revert character image to original
anchorX: 0.5,
anchorY: 0.5
});
};
});
var LifeIcon = Container.expand(function () {
var self = Container.call(this);
var lifeIconGraphics = self.attachAsset('lifeIcon', {
anchorX: 0.5,
anchorY: 0.5
});
self.updatePosition = function (index) {
self.x = 50 + index * 60; // Position each icon with a gap
self.y = 50; // Position at the top-left corner
};
});
var MenuSystem = Container.expand(function () {
var self = Container.call(this);
// Background overlay for menu
var menuBg = LK.getAsset('dusman', {
anchorX: 0.5,
anchorY: 0.5,
width: 2948,
height: 3932
});
menuBg.alpha = 0.8;
menuBg.tint = 0x000000;
self.addChild(menuBg);
// Create menu title
var menuTitle = new Text2('Game Menu', {
size: 100,
fill: 0xFFFFFF
});
menuTitle.anchor.set(0.5, 0);
menuTitle.x = 2048 / 3;
menuTitle.y = 400;
self.addChild(menuTitle);
// Sound button
var soundBtn = new Text2('Sound: ON', {
size: 50,
fill: 0xFFFFFF
});
soundBtn.anchor.set(0.5, 0.5);
soundBtn.x = 2048 / 3;
soundBtn.y = 700;
self.addChild(soundBtn);
// Button for game rules
var rulesBtn = new Text2('Game Rules', {
size: 50,
fill: 0xFFFFFF
});
rulesBtn.anchor.set(0.5, 0.5);
rulesBtn.x = 2048 / 3;
rulesBtn.y = 850;
self.addChild(rulesBtn);
// Market button
var marketBtn = new Text2('Market', {
size: 50,
fill: 0xFFFFFF
});
marketBtn.anchor.set(0.5, 0.5);
marketBtn.x = 2048 / 3;
marketBtn.y = 1000;
self.addChild(marketBtn);
// Back to game button
var backBtn = new Text2('Back to Game', {
size: 50,
fill: 0xFFFFFF
});
backBtn.anchor.set(0.5, 0.5);
backBtn.x = 2048 / 3;
backBtn.y = 1150;
self.addChild(backBtn);
// Creator button
var creatorBtn = new Text2('Creator', {
size: 50,
fill: 0xFFFFFF
});
creatorBtn.anchor.set(0.5, 0.5);
creatorBtn.x = 2048 / 3;
creatorBtn.y = 1400;
self.addChild(creatorBtn);
// Creator modal
var creatorModal = new Container();
creatorModal.visible = false;
self.addChild(creatorModal);
// Creator modal background
var creatorModalBg = LK.getAsset('dusman', {
anchorX: 0.5,
anchorY: 0.5,
width: 1600,
height: 800
});
creatorModalBg.tint = 0x333333;
creatorModalBg.x = 2048 / 3;
creatorModalBg.y = 2732 / 2;
creatorModal.addChild(creatorModalBg);
// Creator name
var creatorName = new Text2('Akif Uraz Aydın', {
size: 100,
fill: 0xFFFFFF
});
creatorName.anchor.set(0.5, 0);
creatorName.x = 2048 / 3;
creatorName.y = 2732 / 2 - 100;
creatorModal.addChild(creatorName);
// Close button for creator modal
var closeCreatorBtn = new Text2('Close', {
size: 50,
fill: 0xFFFFFF
});
closeCreatorBtn.anchor.set(0.5, 0.5);
closeCreatorBtn.x = 2048 / 3;
closeCreatorBtn.y = 2732 / 2 + 200;
creatorModal.addChild(closeCreatorBtn);
// Market modal
var marketModal = new Container();
marketModal.visible = false;
self.addChild(marketModal);
// Market modal background
var marketModalBg = LK.getAsset('dusman', {
anchorX: 0.5,
anchorY: 0.5,
width: 1600,
height: 1600 // Increased height to accommodate power-up option
});
marketModalBg.tint = 0x333333;
marketModalBg.x = 2048 / 3;
marketModalBg.y = 2732 / 2;
marketModal.addChild(marketModalBg);
// Market title
var marketTitle = new Text2('Market', {
size: 180,
fill: 0xFFFFFF
});
marketTitle.anchor.set(0.5, 0);
marketTitle.x = 2048 / 3;
marketTitle.y = 700; // Moved up to make room for new items
marketModal.addChild(marketTitle);
// Life icon in market
var marketLifeIcon = LK.getAsset('lifeIcon', {
anchorX: 0.5,
anchorY: 0.5
});
marketLifeIcon.x = 2048 / 3 - 200;
marketLifeIcon.y = 950; // Adjusted position
marketLifeIcon.scale.set(2);
marketModal.addChild(marketLifeIcon);
// Life description
var lifeDescription = new Text2('Extra Life\nCost: 100 Score', {
size: 60,
fill: 0xFFFFFF
});
lifeDescription.anchor.set(0, 0.5);
lifeDescription.x = 2048 / 3 - 100;
lifeDescription.y = 950; // Adjusted position
marketModal.addChild(lifeDescription);
// Buy life button
var buyLifeBtn = new Text2('Buy', {
size: 80,
fill: 0x00FF00
});
buyLifeBtn.anchor.set(0.5, 0.5);
buyLifeBtn.x = 2048 / 3;
buyLifeBtn.y = 1050; // Adjusted position
// Set initial interactive state based on score
buyLifeBtn.interactive = LK.getScore() >= 100;
buyLifeBtn.alpha = buyLifeBtn.interactive ? 1.0 : 0.5; // Visual indicator for disabled state
marketModal.addChild(buyLifeBtn);
// Power-up section
// Power-up icon in market
var marketPowerUpIcon = LK.getAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
marketPowerUpIcon.x = 2048 / 3 - 200;
marketPowerUpIcon.y = 1250; // Position below life option
marketPowerUpIcon.scale.set(0.8);
marketModal.addChild(marketPowerUpIcon);
// Power-up description
var powerUpDescription = new Text2('Power Up Box\nCost: 100 Score', {
size: 60,
fill: 0xFFFFFF
});
powerUpDescription.anchor.set(0, 0.5);
powerUpDescription.x = 2048 / 3 - 100;
powerUpDescription.y = 1250;
marketModal.addChild(powerUpDescription);
// Buy power-up button
var buyPowerUpBtn = new Text2('Buy', {
size: 80,
fill: 0x00FF00
});
buyPowerUpBtn.anchor.set(0.5, 0.5);
buyPowerUpBtn.x = 2048 / 3;
buyPowerUpBtn.y = 1350;
// Set initial interactive state based on score
buyPowerUpBtn.interactive = LK.getScore() >= 100;
buyPowerUpBtn.alpha = buyPowerUpBtn.interactive ? 1.0 : 0.5;
marketModal.addChild(buyPowerUpBtn);
// Status message for purchases
var statusMessage = new Text2('', {
size: 50,
fill: 0xFFFFFF
});
statusMessage.anchor.set(0.5, 0.5);
statusMessage.x = 2048 / 3;
statusMessage.y = 1500; //{2p} // Adjusted position
marketModal.addChild(statusMessage);
// Close button for market modal
var closeMarketBtn = new Text2('Close', {
size: 100,
fill: 0xFFFFFF
});
closeMarketBtn.anchor.set(0.5, 0.5);
closeMarketBtn.x = 2048 / 3;
closeMarketBtn.y = 1700; // Adjusted position
marketModal.addChild(closeMarketBtn);
// Button handlers
creatorBtn.interactive = true;
creatorBtn.buttonMode = true;
creatorBtn.down = function () {
creatorModal.visible = true;
marketModal.visible = false;
};
closeCreatorBtn.interactive = true;
closeCreatorBtn.buttonMode = true;
closeCreatorBtn.down = function () {
creatorModal.visible = false;
};
// Market button handlers
marketBtn.interactive = true;
marketBtn.buttonMode = true;
marketBtn.down = function () {
marketModal.visible = true;
creatorModal.visible = false;
statusMessage.setText('');
// Update buy buttons state based on current score
var currentScore = LK.getScore();
buyLifeBtn.interactive = currentScore >= 100;
buyLifeBtn.alpha = buyLifeBtn.interactive ? 1.0 : 0.5;
buyPowerUpBtn.interactive = currentScore >= 100;
buyPowerUpBtn.alpha = buyPowerUpBtn.interactive ? 1.0 : 0.5;
};
// Buy life button handler
buyLifeBtn.buttonMode = true;
buyLifeBtn.down = function () {
var currentScore = LK.getScore();
if (currentScore >= 100) {
// Deduct score
LK.setScore(currentScore - 100);
scoreTxt.setText(LK.getScore());
// Add life
playerHealth.lives++;
// Create new life icon
var lifeIcon = new LifeIcon();
lifeIcon.updatePosition(playerHealth.lives - 1);
LK.gui.topLeft.addChild(lifeIcon);
lifeIcons.push(lifeIcon);
// Show success message
statusMessage.setText('Successfully purchased 1 life!');
// Use the constructor to create a new Text2 with updated fill color
var successStyle = {
size: 50,
fill: 0x00FF00
};
marketModal.removeChild(statusMessage);
statusMessage = new Text2('Successfully purchased 1 life!', successStyle);
statusMessage.anchor.set(0.5, 0.5);
statusMessage.x = 2048 / 3;
statusMessage.y = 1500; //{2P} // Adjusted position
marketModal.addChild(statusMessage);
// Play purchase sound
LK.getSound('Moneyses').play();
// Update button states after purchase
var updatedScore = LK.getScore();
buyLifeBtn.interactive = updatedScore >= 100;
buyLifeBtn.alpha = buyLifeBtn.interactive ? 1.0 : 0.5;
buyPowerUpBtn.interactive = updatedScore >= 100;
buyPowerUpBtn.alpha = buyPowerUpBtn.interactive ? 1.0 : 0.5;
} else {
// Show error message
// Use the constructor to create a new Text2 with updated fill color
var errorStyle = {
size: 50,
fill: 0xFF0000
};
marketModal.removeChild(statusMessage);
statusMessage = new Text2('Not enough score! Need 100.', errorStyle);
statusMessage.anchor.set(0.5, 0.5);
statusMessage.x = 2048 / 3;
statusMessage.y = 1500; //{30} // Adjusted position
marketModal.addChild(statusMessage);
// Play error sound
LK.getSound('Damage').play();
}
};
// Buy power-up button handler
buyPowerUpBtn.buttonMode = true;
buyPowerUpBtn.down = function () {
var currentScore = LK.getScore();
if (currentScore >= 100) {
// Deduct score
LK.setScore(currentScore - 100);
scoreTxt.setText(LK.getScore());
// Spawn a power-up at the player's position
spawnPowerUpAtPlayer();
// Show success message
var successStyle = {
size: 50,
fill: 0x00FF00
};
marketModal.removeChild(statusMessage);
statusMessage = new Text2('Successfully purchased Power-Up!', successStyle);
statusMessage.anchor.set(0.5, 0.5);
statusMessage.x = 2048 / 3;
statusMessage.y = 1500;
marketModal.addChild(statusMessage);
// Play purchase sound
LK.getSound('Moneyses').play();
// Update button states after purchase
var updatedScore = LK.getScore();
buyLifeBtn.interactive = updatedScore >= 100;
buyLifeBtn.alpha = buyLifeBtn.interactive ? 1.0 : 0.5;
buyPowerUpBtn.interactive = updatedScore >= 100;
buyPowerUpBtn.alpha = buyPowerUpBtn.interactive ? 1.0 : 0.5;
} else {
// Show error message
var errorStyle = {
size: 50,
fill: 0xFF0000
};
marketModal.removeChild(statusMessage);
statusMessage = new Text2('Not enough score! Need 100.', errorStyle);
statusMessage.anchor.set(0.5, 0.5);
statusMessage.x = 2048 / 3;
statusMessage.y = 1500;
marketModal.addChild(statusMessage);
// Play error sound
LK.getSound('Damage').play();
}
};
closeMarketBtn.interactive = true;
closeMarketBtn.buttonMode = true;
closeMarketBtn.down = function () {
marketModal.visible = false;
};
// Rules modal
var rulesModal = new Container();
this.children.forEach(function (child) {
if (child === rulesModal) {
child.visible = false;
}
});
self.addChild(rulesModal);
// Rules modal background
var modalBg = LK.getAsset('dusman', {
anchorX: 0.5,
anchorY: 0.5,
width: 1600,
height: 1800
});
modalBg.tint = 0x333333;
modalBg.x = 2048 / 3;
modalBg.y = 2732 / 2;
rulesModal.addChild(modalBg);
// Rules title
var rulesTitle = new Text2('Game Rules', {
size: 180,
fill: 0xFFFFFF
});
rulesTitle.anchor.set(0.5, 0);
rulesTitle.x = 2048 / 3;
rulesTitle.y = 500;
rulesModal.addChild(rulesTitle);
// Rules content
var rulesContent = new Text2('- Killing the monster bees (+2)\n' + '- Collecting the money (+1)\n' + '- Getting caught by the turtle (-1 life)\n' + '- Touching the wires on the left (game over)\n' + '- Visit the market to buy extra lives for 100 score\n' + '- Buy power-ups in the market for special abilities\n' + '- PowerUp prevents turtle spawns for 30 seconds\n' + '- Money Rain occurs every 30 seconds for 10 seconds', {
size: 60,
fill: 0xFFFFFF
});
rulesContent.anchor.set(0.5, 0);
rulesContent.x = 2048 / 3;
rulesContent.y = 750;
rulesModal.addChild(rulesContent);
// Close button for rules modal
var closeBtn = new Text2('Close', {
size: 150,
fill: 0xFFFFFF
});
closeBtn.anchor.set(0.5, 0.5);
closeBtn.x = 2048 / 3;
closeBtn.y = 1800;
rulesModal.addChild(closeBtn);
// State tracking
self.isOpen = false;
self.isSoundOn = true;
// Button handlers
soundBtn.interactive = true;
soundBtn.buttonMode = true;
soundBtn.down = function () {
self.isSoundOn = !self.isSoundOn;
soundBtn.setText(self.isSoundOn ? 'Sound: ON' : 'Sound: OFF');
// Toggle game music
if (self.isSoundOn) {
LK.playMusic('gameMusic', {
volume: 0.4
});
} else {
LK.stopMusic();
}
};
rulesBtn.interactive = true;
rulesBtn.buttonMode = true;
rulesBtn.down = function () {
rulesModal.visible = true;
marketModal.visible = false;
};
closeBtn.interactive = true;
closeBtn.buttonMode = true;
closeBtn.down = function () {
rulesModal.visible = false;
};
backBtn.interactive = true;
backBtn.buttonMode = true;
backBtn.down = function () {
self.toggle();
};
// Toggle menu visibility
self.toggle = function () {
self.isOpen = !self.isOpen;
self.visible = self.isOpen;
// Pause/unpause game functionality
if (self.isOpen) {
// Pause game when menu is open
if (typeof pauseGame === 'function') {
pauseGame();
}
} else {
// Resume game when menu is closed
if (typeof resumeGame === 'function') {
resumeGame();
}
// Hide all modals when closing menu
if (rulesModal) {
rulesModal.visible = false;
}
if (marketModal) {
marketModal.visible = false;
}
if (creatorModal) {
creatorModal.visible = false;
}
}
};
// Initialize as hidden
self.visible = false;
return self;
});
var Money = Container.expand(function () {
var self = Container.call(this);
var moneyGraphics = self.attachAsset('money', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = Math.random() * 3 + 2; // Random speed between 2 and 5
self.update = function () {
self.y += self.speed;
self.x += Math.sin(self.y / 100) * 20; // Increased sine wave amplitude
moneyGraphics.rotation += 0.05; // Rotate the money
if (self.y > 2732) {
self.destroy();
}
};
});
// Define a class for managing periodic money rain
var MoneyRain = Container.expand(function () {
var self = Container.call(this);
// Time between money rain events in milliseconds (60 seconds)
self.rainInterval = 60000;
// Duration of each money rain in milliseconds (10 seconds)
self.rainDuration = 10000;
// Track if rain is active
self.isRaining = false;
// Track the interval ID for spawning money during rain
self.moneySpawnInterval = null;
// Function to start money rain
self.startRain = function () {
if (isGamePaused || self.isRaining) {
return;
}
self.isRaining = true;
// Create animated Money Rain text
var moneyRainText = new MoneyRainText();
game.addChild(moneyRainText);
moneyRainText.show(self.rainDuration);
// Create update interval for the animated text
var textUpdateInterval = LK.setInterval(function () {
if (isGamePaused) {
return;
}
moneyRainText.update();
}, 16); // Update at 60fps
// Spawn money at regular intervals during the rain duration
self.moneySpawnInterval = LK.setInterval(function () {
if (isGamePaused) {
return;
}
// Reduced number of money to spawn each time
var moneyCount = Math.floor(Math.random() * 2) + 1; // 1-2 money objects
for (var i = 0; i < moneyCount; i++) {
var money = new Money();
money.x = Math.random() * 2048; // Random horizontal position
money.y = -50; // Start above the screen
game.addChild(money);
}
}, 500); // Spawn every 0.5 seconds during rain
// Stop rain after duration
LK.setTimeout(function () {
if (self.moneySpawnInterval !== null) {
LK.clearInterval(self.moneySpawnInterval);
self.moneySpawnInterval = null;
}
if (textUpdateInterval !== null) {
LK.clearInterval(textUpdateInterval);
}
self.isRaining = false;
}, self.rainDuration);
};
// Initialize rain cycle
self.initialize = function () {
// Start first rain after 60 seconds
LK.setTimeout(function () {
self.startRain();
// Set up recurring rain cycle
LK.setInterval(function () {
if (!isGamePaused) {
self.startRain();
}
}, self.rainInterval);
}, 60000); // Delay the first rain by 60 seconds - no money will spawn before this
};
return self;
});
var MoneyRainText = Container.expand(function () {
var self = Container.call(this);
// Create the "Money Rain" text
var rainText = new Text2('Money Rain', {
size: 250,
fill: 0xFFD700 // Gold color
});
// Set anchor to center
rainText.anchor.set(0.5, 0.5);
// Add text to container
self.addChild(rainText);
// Initialize with horizontal motion parameters
self.speed = 5;
self.direction = 1; // 1 = right, -1 = left
self.amplitude = 30;
self.frequency = 0.05;
self.oscillationOffset = 0;
// Update position each frame
self.update = function () {
// Move horizontally
self.x += self.speed * self.direction;
// Bounce when reaching screen edges
if (self.x > 1800) {
self.direction = -1;
} else if (self.x < 200) {
self.direction = 1;
}
// Add sine wave motion for vertical movement
self.oscillationOffset += self.frequency;
self.y = self.baseY + Math.sin(self.oscillationOffset) * self.amplitude;
};
// Show the text with animation
self.show = function (duration) {
// Position at center initially
self.x = 2048 / 2;
self.y = 400;
self.baseY = self.y;
self.oscillationOffset = 0;
// Add scaling effect
self.scale.set(0);
tween(self.scale, {
x: 1,
y: 1
}, {
duration: 500,
easing: tween.elasticOut
});
// Set auto-removal timer
LK.setTimeout(function () {
// Scale down and remove
tween(self.scale, {
x: 0,
y: 0
}, {
duration: 500,
easing: tween.easeInBack,
onFinish: function onFinish() {
self.destroy();
}
});
}, duration);
};
return self;
});
// Define the missing NewEnemy class to fix the reference error
var NewEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = Math.random() * 3 + 2; // Random speed between 2 and 5
self.update = function () {
self.x -= self.speed; // Move from right to left
self.y += Math.sin(self.x / 100) * 10; // Add sine wave movement
if (self.x < -50) {
self.destroy();
}
};
return self;
});
//<Assets used in the game will automatically appear here>
// Define a class for the player character
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.jumpHeight = 15;
self.isJumping = false;
self.velocityY = 0;
self.update = function () {
// Check if the player is outside the scene boundaries
if (self.isJumping) {
if (self.lastY > self.y) {
LK.getSound('Fly').play(); // Play 'Fly' sound when moving upwards
}
self.lastY = self.y; // Update lastY to current y position
self.y -= self.velocityY;
self.velocityY -= gravity;
if (self.velocityY <= 0 && self.y < 1366) {
self.x += 7; // Move right by 7 units at peak
}
if (self.y >= 1366) {
self.y = 1366;
self.isJumping = false;
self.velocityY = 0;
}
// Prevent player from being pushed when touching the top of a wall
for (var k = walls.length - 1; k >= 0; k--) {
if (self.intersects(walls[k])) {
if (self.y < walls[k].y - walls[k].height / 2) {
self.y = walls[k].y - walls[k].height / 2;
self.velocityY = 0;
self.isJumping = false;
}
}
}
}
// Check if the player touches the left edge of the screen
if (self.x <= 0) {
LK.effects.flashScreen(0xff0000, 1000); // Flash red light across the entire scene
LK.showGameOver(); // End the game if the player touches the wires on the left
}
self.x += self.speedX;
if (self.x > 2048 - playerGraphics.width / 2) {
self.x = 2048 - playerGraphics.width / 2; // Prevent moving outside the right edge
}
// Removed vertical oscillation when the player is not jumping and not moving horizontally
if (self.isJumping) {
self.y -= self.velocityY;
self.velocityY -= gravity;
if (self.y >= 1366) {
self.y = 1366;
self.isJumping = false;
self.velocityY = 0;
}
// Check if the player touches the top edge of the screen
if (self.y <= 0) {
LK.effects.flashScreen(0xff0000, 1000); // Flash red light across the entire scene
LK.showGameOver(); // End the game if the player touches the top edge
}
}
};
self.jump = function () {
if (!self.isJumping && self.y > 0) {
self.isJumping = true;
self.velocityY = 20; // Set initial jump velocity
self.speedX = 0; // Reset horizontal speed
}
};
});
var PlayerHealth = Container.expand(function () {
var self = Container.call(this);
self.lives = 5; // Default initial lives
self.initialize = function (initialLives) {
self.lives = initialLives || 5;
};
self.decreaseLife = function () {
self.lives--;
if (self.lives <= 0) {
LK.showGameOver(); // End the game if no lives are left
}
};
self.getLives = function () {
return self.lives;
};
return self;
});
// Define a class for the right button
var RightButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('rightButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
LK.getSound('Kok').play(); // Play 'Kok' sound when button is pressed
character.speedX = moveSpeed;
character.removeChild(character.children[0]); // Remove current player image
character.attachAsset('rightImage', {
anchorX: 0.5,
anchorY: 0.5
}); // Change character image to 'rightImage'
character.y += 100; // Move character down by 100px
};
self.up = function (x, y, obj) {
character.speedX = 0;
character.removeChild(character.children[0]); // Remove current rightImage
character.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
}); // Revert character image to original
};
});
var ScrollingBackground = Container.expand(function () {
var self = Container.call(this);
var layer1_1 = self.attachAsset('Layer1', {
anchorX: 0.5,
anchorY: 0.5
});
var layer1_2 = self.attachAsset('Layer1', {
anchorX: 0.5,
anchorY: 0.5
});
var layer2_1 = self.attachAsset('Layer2', {
anchorX: 0.5,
anchorY: 0.5
});
var layer2_2 = self.attachAsset('Layer2', {
anchorX: 0.5,
anchorY: 0.5
});
var layer3_1 = self.attachAsset('Layer3', {
anchorX: 0.5,
anchorY: 0.5
});
var layer3_2 = self.attachAsset('Layer3', {
anchorX: 0.5,
anchorY: 0.5
});
var bg1 = self.attachAsset('arkaplan', {
anchorX: 0.5,
anchorY: 0.5
});
var bg2 = self.attachAsset('arkaplan', {
anchorX: 0.5,
anchorY: 0.5
});
bg1.x = 2048 / 2;
bg1.y = 2732 / 2 - 60; // Move 30 units upward
bg2.x = 2048 / 2 + 2048;
bg2.y = 2732 / 2 - 60; // Move 30 units upward
// Scale Layer1 to fit the entire screen
var layer1ScaleX = 2048 / layer1_1.width;
var layer1ScaleY = 2732 / layer1_1.height;
var layer1Scale = Math.max(layer1ScaleX, layer1ScaleY);
layer1_1.x = 2048 / 2;
layer1_1.y = 2732 / 2;
layer1_1.scale.set(layer1Scale);
layer1_2.x = 2048 / 2 + 2048;
layer1_2.y = 2732 / 2;
layer1_2.scale.set(layer1Scale);
layer2_1.x = 2048 / 2;
layer2_1.y = 2732 / 2 - 120; // Move 120 units upward
layer2_1.scale.set(15); // Scale up slightly less than Layer1
layer2_2.x = 2048 / 2 + 2048;
layer2_2.y = 2732 / 2 - 120; // Move 120 units upward
layer2_2.scale.set(15); // Scale up slightly less than Layer1
layer3_1.x = 2048 / 2;
layer3_1.y = 2732 / 2 - 400; // Move 400 units upward
layer3_1.scale.set(10); // Scale up slightly less than Layer2
layer3_2.x = 2048 / 2 + 2048;
layer3_2.y = 2732 / 2 - 400; // Move 400 units upward
layer3_2.scale.set(10); // Scale up slightly less than Layer2
self.update = function () {
bg1.x -= 2; // Move from right to left
bg2.x -= 2; // Move from right to left
// Move Layer1 slowly from right to left
layer1_1.x -= 0.5; // Slower movement for layer1_1
layer1_2.x -= 0.5; // Slower movement for layer1_2
// Layer2 also doesn't move like Layer1
// Layer3 also doesn't move like Layer1 and Layer2
if (bg1.x < -2048 / 2) {
// Change condition for leftward movement
bg1.x = bg2.x + 2048; // Reposition to the right of bg2
}
if (bg2.x < -2048 / 2) {
// Change condition for leftward movement
bg2.x = bg1.x + 2048; // Reposition to the right of bg1
}
// Reposition Layer1 when it moves off-screen
if (layer1_1.x < -2048 / 2) {
layer1_1.x = layer1_2.x + 2048; // Reposition to the right of layer1_2
}
if (layer1_2.x < -2048 / 2) {
layer1_2.x = layer1_1.x + 2048; // Reposition to the right of layer1_1
}
};
});
// Define a class for the sine wave enemy
var SineWaveEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3; // Constant speed
self.amplitude = 50; // Amplitude of the sine wave
self.frequency = 100; // Frequency of the sine wave
self.update = function () {
self.x -= self.speed;
self.y += Math.sin(self.x / self.frequency) * self.amplitude;
for (var k = walls.length - 1; k >= 0; k--) {
if (self.intersects(walls[k])) {
// If SineWaveEnemy intersects with a wall, adjust its position to prevent passing through
if (self.x > walls[k].x) {
self.x = walls[k].x + walls[k].width / 2 + enemyGraphics.width / 2;
} else {
self.x = walls[k].x - walls[k].width / 2 - enemyGraphics.width / 2;
}
}
}
if (self.x < -50) {
self.destroy();
}
};
});
// Define a class for the up button
var UpButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('upButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
LK.getSound('Kok').play(); // Play 'Kok' sound when button is pressed
player.jump();
};
});
var Wall = Container.expand(function () {
var self = Container.call(this);
var wallGraphics = self.attachAsset('wall', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5; // Speed at which the wall moves from right to left
self.update = function () {
self.x -= self.speed;
if (self.x < -wallGraphics.width) {
self.destroy();
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
// No title, no description
// Always backgroundColor is black
backgroundColor: 0x000000
});
/****
* Game Code
****/
//Storage library which should be used for persistent game data
//Minimalistic tween library which should be used for animations over time, including tinting / colouring an object, scaling, rotating, or changing any game object property.
// Initialize player health with 5 lives
// Define a class for managing player health
// Function removed as it was unused
function _typeof(o) {
"@babel/helpers - typeof";
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
return typeof o;
} : function (o) {
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
}, _typeof(o);
}
function _classCallCheck(a, n) {
if (!(a instanceof n)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _defineProperties(e, r) {
for (var t = 0; t < r.length; t++) {
var o = r[t];
o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o);
}
}
function _createClass(e, r, t) {
return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", {
writable: !1
}), e;
}
function _toPropertyKey(t) {
var i = _toPrimitive(t, "string");
return "symbol" == _typeof(i) ? i : i + "";
}
function _toPrimitive(t, r) {
if ("object" != _typeof(t) || !t) {
return t;
}
var e = t[Symbol.toPrimitive];
if (void 0 !== e) {
var i = e.call(t, r || "default");
if ("object" != _typeof(i)) {
return i;
}
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return ("string" === r ? String : Number)(t);
}
var playerHealth = new PlayerHealth();
playerHealth.initialize(5);
// Create and display life icons
var lifeIcons = [];
for (var i = 0; i < playerHealth.getLives(); i++) {
var lifeIcon = new LifeIcon();
lifeIcon.updatePosition(i);
LK.gui.topLeft.addChild(lifeIcon);
lifeIcons.push(lifeIcon);
}
// Store original decrease life function
var originalDecreaseLife = playerHealth.decreaseLife;
// Override the decrease life function
playerHealth.decreaseLife = function () {
// Call the original function
originalDecreaseLife.call(playerHealth);
// Remove a life icon
if (lifeIcons.length > 0) {
var iconToRemove = lifeIcons.pop();
iconToRemove.destroy();
}
};
LK.setInterval(createKaplu, 5000); // Spawn 'kaplu' every 5 seconds
var walls = [];
function spawnWall() {
if (isGamePaused) {
return;
}
if (!powerUpActive) {
var wall = new Wall();
wall.x = 2048 + wall.width / 2; // Start from the right edge of the screen
wall.y = Math.random() * (2732 / 2 - wall.height) + wall.height / 2; // Random vertical position above the center
game.addChild(wall);
walls.push(wall);
}
}
LK.setInterval(spawnWall, 10000); // Set interval to spawn walls every 10 seconds
// Function to create sine wave enemies
function createSineWaveEnemy() {
if (isGamePaused) {
return;
}
var enemy = new SineWaveEnemy();
enemy.x = 2048; // Start from the right edge of the screen
enemy.y = Math.random() * 2732; // Random vertical position
game.addChild(enemy);
enemies.push(enemy);
}
// Set interval to spawn sine wave enemies
LK.setInterval(createSineWaveEnemy, 5000); // Spawn every 5 seconds
// MoneyRain now starts automatically every 60 seconds from MoneyRain.initialize()
// Function to create enemies with different types and behaviors
function createEnemy() {
if (isGamePaused) {
return;
}
var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "enemy";
var enemy;
enemy = new Enemy();
enemy.x = 2048; // Start from the right edge of the screen
enemy.y = Math.random() * (2732 - enemy.height) + enemy.height / 2; // Random vertical position within screen bounds
game.addChild(enemy);
enemies.push(enemy);
}
// Set intervals to spawn enemies
LK.setInterval(function () {
createEnemy("enemy"); // Normal enemy every 4 seconds
}, 4000);
// Function to spawn money on the screen
function spawnMoney() {
if (isGamePaused) {
return;
}
// Number of money to spawn
var moneyCount = LK.getScore() > 200 ? Math.floor(Math.random() * 1) + 1 : Math.floor(Math.random() * 3) + 2;
for (var i = 0; i < moneyCount; i++) {
// Create a new money object
var money = new Money();
// Set random initial position
money.x = Math.random() * 2048; // Random horizontal position
money.y = -50; // Start above the screen
// Add money to the game scene
game.addChild(money);
}
}
// Money spawning is only managed by MoneyRain system
// No regular money spawning in the game
var scrollingBackground = game.addChild(new ScrollingBackground());
// Variable to track game over state
var gameOver = false;
// Play background music when the game starts
LK.playMusic('gameMusic', {
volume: 0.8,
loop: true
});
// Variable to track power-up states
var powerUpActive = false;
var powerUpCooldown = false;
// Function to spawn a super power-up
function spawnSuperPowerUp() {
if (powerUpActive || powerUpCooldown) {
return;
}
// Create a new power-up asset
var powerUp = LK.getAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
// Random x position within the scene width
var x = Math.random() * (2048 - 50);
powerUp.x = x;
powerUp.y = -60; // Start above the screen
// Add power-up to the game scene
game.addChild(powerUp);
// Move the power-up downwards
var fall = LK.setInterval(function () {
powerUp.y += 4;
powerUp.x += Math.sin(powerUp.y / 100) * 10; // Sine wave pattern
// Remove power-up if it goes off-screen
if (powerUp.y > 2732) {
LK.clearInterval(fall);
powerUp.destroy();
}
// Check for collision with player
if (player.intersects(powerUp)) {
LK.clearInterval(fall);
powerUp.destroy();
activateSuperPower();
}
}, 16);
}
// Function to activate the super power
function activateSuperPower() {
if (powerUpActive) {
return;
}
powerUpActive = true;
// Create and show power-up status indicator
var powerUpIndicator = new Text2('PowerUp Active!', {
size: 80,
fill: 0x00FF00
});
powerUpIndicator.anchor.set(0.5, 0.5);
powerUpIndicator.x = 2048 / 2;
powerUpIndicator.y = 2732 / 2;
LK.gui.center.addChild(powerUpIndicator);
// Add pulsing effect to power-up indicator
var _pulseIndicator = function pulseIndicator() {
tween(powerUpIndicator.scale, {
x: 1.2,
y: 1.2
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(powerUpIndicator.scale, {
x: 1,
y: 1
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: _pulseIndicator
});
}
});
};
_pulseIndicator();
// Add glowing effect to player
tween(player, {
alpha: 0.7
}, {
duration: 500,
easing: tween.easeInOut,
yoyo: true,
loop: true
});
// Power-Up does not affect money spawn rate
// since money only spawns during Money Rain events
powerUpCooldown = true;
// Scale up the player
player.scale.set(4);
// Show countdown timer
var remainingTime = 30;
var countdownTimer = new Text2(remainingTime + 's', {
size: 60,
fill: 0xFFFFFF
});
countdownTimer.anchor.set(0.5, 0);
countdownTimer.x = 2048 / 2;
countdownTimer.y = 230;
LK.gui.top.addChild(countdownTimer);
// Update timer every second
var timerInterval = LK.setInterval(function () {
remainingTime--;
// When time is 10 or less, recreate the text with red color
if (remainingTime <= 10) {
// Remove the old timer
LK.gui.top.removeChild(countdownTimer);
// Create a new timer with red color
countdownTimer = new Text2(remainingTime + 's', {
size: 60,
fill: 0xFF0000 // Red color for urgent countdown
});
countdownTimer.anchor.set(0.5, 0);
countdownTimer.x = 2048 / 2;
countdownTimer.y = 230;
LK.gui.top.addChild(countdownTimer);
} else {
// Just update the text for normal countdown
countdownTimer.setText(remainingTime + 's');
}
}, 1000);
// Revert player scale after 30 seconds
LK.setTimeout(function () {
player.scale.set(1);
powerUpActive = false;
LK.gui.top.removeChild(powerUpIndicator);
LK.gui.top.removeChild(countdownTimer);
LK.clearInterval(timerInterval);
player.alpha = 1; // Reset player alpha
// Remove any tweens on the player
tween.stop(player);
// Cooldown before another power-up can spawn
LK.setTimeout(function () {
powerUpCooldown = false;
}, 60000); // Set to 1 minute if player collects the power-up
}, 30000);
}
// Attempt to spawn a power-up every 40 seconds, ensuring only one is active at a time
if (!powerUpActive && !powerUpCooldown) {
LK.setTimeout(spawnSuperPowerUp, 40000);
}
// Array to hold spikes
var spikes = [];
// Function to create spikes
function createSpikes() {
var spikeHeight = 100; // Height of each spike
var spikeWidth = 30; // Width of each spike
var gap = 50; // Gap between spikes
// Create fixed spikes on the left edge of the scene
for (var y = 0; y < 2732; y += spikeHeight + gap) {
var spike = LK.getAsset('spike', {
anchorX: 0.5,
anchorY: 0.5
});
// Spike starting position (fixed to the left edge)
var startX = -spikeWidth; // Left edge
var startY = y; // Arranged with gap between them
spike.x = startX;
spike.y = startY;
// Add spikes to the game scene
game.addChild(spike);
// Add spike object to the array
spikes.push(spike);
}
}
// Create spikes (only run once)
createSpikes();
// Create and initialize money rain system
var moneyRain = new MoneyRain();
moneyRain.initialize();
// Create and initialize the score text display
var scoreTxt = new Text2('0', {
size: 150,
// Reduced size by 25% from 200
fill: 0x000000 // Black color for the score text
});
// Set the initial score text to zero
scoreTxt.setText(LK.getScore());
// Center the score text horizontally at the top of the screen
scoreTxt.anchor.set(0.5, 0); // Anchor at the center of the top edge
// Add the score text to the GUI overlay at a slightly left position from the top-right
var newVisual = LK.getAsset('newVisual', {
anchorX: 0.5,
anchorY: 0.5
});
newVisual.x -= 100; // Move the new visual 100 pixels to the left
newVisual.y += 100; // Move the new visual 100 pixels downwards
scoreTxt.x = newVisual.x - 180; // Position score text 180 pixels to the left of the new visual
scoreTxt.y = newVisual.y + 90 - 170;
LK.gui.topRight.addChild(scoreTxt);
LK.gui.topRight.addChild(newVisual);
// Display Best Score in the center of the scene
// Always show the highest score achieved, update if current score is higher
// Create a menu button in the center of the screen when game starts
var menuButton = LK.getAsset('menuButtonShape', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 200
});
menuButton.scale.set(3); // Set scale to 3 for 3x size
menuButton.tint = 0x3f51b5; // Nice blue color
menuButton.x = 2048 / 2; // Center horizontally
menuButton.y = 2732 / 2 + 1300; // Move 1300 units down from center
menuButton.visible = true; // Ensure menu button is visible when game starts
menuButton.alpha = 1; // Make sure button is fully opaque
menuButton.interactive = true;
menuButton.buttonMode = true;
// Removed menu label from menu button
// Create the menu system and add it to the GUI layer
var menuSystem = new MenuSystem();
LK.gui.addChild(menuSystem);
// Don't show menu automatically when game starts
menuSystem.isOpen = false;
menuSystem.visible = false;
// Game is not paused initially
isGamePaused = false;
// Add the menu button directly to the main game scene for full visibility
game.addChild(menuButton);
// Add animation effects for menu button
menuButton.down = function () {
// Scale down button when clicked
tween(menuButton.scale, {
x: 2.7,
y: 2.7
}, {
duration: 100,
easing: tween.easeOut
});
// Toggle menu system
menuSystem.toggle();
// Update button appearance based on menu state
menuButton.tint = menuSystem.isOpen ? 0x888888 : 0x444444;
};
menuButton.up = function () {
// Scale back to normal when released
tween(menuButton.scale, {
x: 3,
y: 3
}, {
duration: 100,
easing: tween.easeOut
});
};
// Add enhanced pulse animation to menu button to make it more visible
function pulseMenuButton() {
// Make sure menuButton is visible before animating
menuButton.visible = true;
// Ensure menu button is centered 1300 units below center
menuButton.x = 2048 / 2;
menuButton.y = 2732 / 2 + 1300;
tween(menuButton.scale, {
x: 3.6,
y: 3.6
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(menuButton.scale, {
x: 3,
y: 3
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: pulseMenuButton
});
}
});
// Also animate the button's alpha for a flashy effect
tween(menuButton, {
alpha: 0.8
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(menuButton, {
alpha: 1
}, {
duration: 800,
easing: tween.easeInOut
});
}
});
}
// Start pulse animation immediately
pulseMenuButton();
// Ensure menu button is on top of all other elements
if (game.children.indexOf(menuButton) !== -1) {
game.removeChild(menuButton);
game.addChild(menuButton);
}
// Set initial button state with a nice blue color
menuButton.tint = 0x3f51b5; // Blue color for visibility
// Get best score from storage with proper default
var bestScore = storage.bestScore !== undefined ? storage.bestScore : 0;
var bestScoreTxt = new Text2('Best Score: ' + bestScore, {
size: 121.5,
// 135'in %10 küçüğü
fill: 0x000000
});
bestScoreTxt.anchor.set(0.5, 0.5);
bestScoreTxt.x = 2048 / 2;
bestScoreTxt.y = 2732 / 2 + 920; // 30 units higher
game.addChild(bestScoreTxt);
// Update best score if current score exceeds it, and always show the highest
function updateBestScoreDisplay() {
var currentScore = LK.getScore();
var storedBest = storage.bestScore !== undefined ? storage.bestScore : 0;
if (currentScore > storedBest) {
storage.bestScore = currentScore;
bestScoreTxt.setText('Best Score: ' + currentScore);
} else {
bestScoreTxt.setText('Best Score: ' + storedBest);
}
}
var moveSpeed = 5; // Speed for character movement
var gravity = 0.8; // Decrease gravity for a lighter effect
var windSpeed = 2; // Reduce wind speed for horizontal movement
// Initialize player at the center of the screen
var player = game.addChild(new Player());
var character = player; // Define character as a reference to player
player.x = 1024;
player.y = 1366;
player.speedX = 0; // Prevent movement on spawn
player.speedY = 0; // Prevent movement on spawn
player.isJumping = false;
player.velocityY = 0;
// Initialize up button
var upButton = game.addChild(new UpButton());
upButton.x = 2048 / 2 - 500; // Middle point's x coordinate minus button width
upButton.y = 2732 / 2 + 600; // Middle point's y coordinate plus button height plus additional 100 pixels
// Add scaling effect to the up button when pressed and released
upButton.down = function () {
upButton.scale.set(0.9); // Scale down by 10%
};
upButton.up = function () {
upButton.scale.set(1); // Reset to original size
};
upButton.move = function () {
upButton.scale.set(1); // Reset to original size if mouse leaves
};
// Initialize left button
var leftButton = game.addChild(new LeftButton());
leftButton.x = 300; // Move slightly more to the right
leftButton.y = 2732 - 250; // Move slightly more upwards
// Initialize right button
var rightButton = game.addChild(new RightButton());
rightButton.x = 2048 - 300; // Move slightly more to the left
rightButton.y = 2732 - 250; // Move slightly more upwards
// Initialize down button
var downButton = game.addChild(new DownButton());
downButton.x = 2048 - 500 - 50; // Right edge minus button width and margin
downButton.y = 2732 - 500 - 250; // Move the down button slightly more upwards
// Initialize enemies
var enemies = [];
var enemySpawnInterval = 160; // Initial slower spawn rate for the first 30 seconds
var enemySpawnIncreaseInterval = 40000; // Increase spawn rate every 40 seconds
var enemySpawnCounter = 0;
// Variables to track button presses
var isPressingUp = false;
var isPressingDown = false;
// Event listeners for button presses
upButton.down = function () {
isPressingUp = true;
character.removeChild(character.children[0]); // Remove current player image
character.attachAsset('playerup', {
anchorX: 0.5,
anchorY: 0.5
}); // Change character image to 'up'
};
upButton.up = function () {
isPressingUp = false;
character.removeChild(character.children[0]); // Remove current playerup image
character.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
}); // Revert character image to original
};
downButton.down = function () {
isPressingDown = true;
character.removeChild(character.children[0]); // Remove current player image
character.attachAsset('player_down', {
anchorX: 0.5,
anchorY: 0.5
}); // Change character image to 'dow'
character.y += 50; // Move character down by 50px
character.x += 160; // Move character right by 160px
};
downButton.up = function () {
isPressingDown = false;
character.removeChild(character.children[0]); // Remove current player_down image
character.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
}); // Revert character image to original
character.y -= 50; // Move character back to original position
};
// Update player movement based on button presses
function updatePlayerMovement() {
if (isPressingUp) {
player.velocityY = -20; // Increase upward speed
player.x += 8; // Move right by 8 units
}
// Removed upward movement when the down button is pressed
player.y += player.velocityY;
if (!isPressingUp && !isPressingDown) {
player.velocityY += gravity;
}
if (player.y > 1366) {
player.y = 1366;
player.velocityY = 0;
}
if (player.y < 0) {
player.y = 0;
player.velocityY = 0;
}
}
// Set interval for updating player movement
LK.setInterval(updatePlayerMovement, 16);
// Set interval to increase enemy spawn rate
LK.setInterval(function () {
if (enemySpawnInterval > 20) {
// Ensure a minimum spawn interval
enemySpawnInterval -= 10; // Decrease interval to increase spawn rate
}
}, enemySpawnIncreaseInterval);
// Set interval for updating player movement
LK.setInterval(function () {
player.update();
}, 16);
// Game state tracking
var isGamePaused = false;
// Function to pause the game
function pauseGame() {
isGamePaused = true;
// Optional: Stop or pause background music
// LK.stopMusic();
}
// Function to resume the game
function resumeGame() {
isGamePaused = false;
// Optional: Resume background music if it was playing
if (menuSystem.isSoundOn) {
LK.playMusic('gameMusic', {
volume: 0.4
});
}
}
// Update menu system toggle to pause/resume game
menuSystem.toggle = function () {
this.isOpen = !this.isOpen;
this.visible = this.isOpen;
// Ensure menu button is always visible
menuButton.visible = true;
if (this.isOpen) {
// When menu opens, move the menu button to top right
tween(menuButton, {
x: 2048 - 150,
y: 150,
scaleX: 3,
scaleY: 3
}, {
duration: 300,
easing: tween.easeOut
});
pauseGame();
} else {
// Always keep button centered 1300 units below center when menu is closed
tween(menuButton, {
x: 2048 / 2,
y: 2732 / 2 + 1300,
scaleX: 3,
scaleY: 3
}, {
duration: 300,
easing: tween.easeOut
});
resumeGame();
// Find rulesModal in children and hide it
this.children.forEach(function (child) {
if (child.children && child.children[0] && child.children[0].tint === 0x333333) {
child.visible = false;
}
});
}
};
// Handle game updates
game.update = function () {
// Skip updates if game is paused
if (isGamePaused) {
return;
}
player.update();
scrollingBackground.update();
for (var k = walls.length - 1; k >= 0; k--) {
walls[k].update();
if (player.intersects(walls[k])) {
// Allow player to approach walls without collision
if (player.x > walls[k].x) {
if (player.x < walls[k].x + walls[k].width / 2 + player.width / 2 - 10) {
player.x = walls[k].x + walls[k].width / 2 + player.width / 2 - 10;
}
} else {
if (player.x > walls[k].x - walls[k].width / 2 - player.width / 2 + 10) {
player.x = walls[k].x - walls[k].width / 2 - player.width / 2 + 10;
}
}
// Do not trigger game over when intersecting with walls
}
}
for (var i = game.children.length - 1; i >= 0; i--) {
if (game.children[i] instanceof Money) {
var money = game.children[i];
money.update();
if (player.intersects(money)) {
money.destroy(); // Remove money from the scene
LK.setScore(LK.getScore() + 1); // Increase score by 1 for collecting money
scoreTxt.setText(LK.getScore()); // Update the score text display
updateBestScoreDisplay(); // Update best score if needed
// Update buy button state if market is visible
if (menuSystem.isOpen && menuSystem.children[4] && menuSystem.children[4].visible) {
buyLifeBtn.interactive = LK.getScore() >= 100;
buyLifeBtn.alpha = buyLifeBtn.interactive ? 1.0 : 0.5;
}
LK.getSound('Moneyses').play(); // Play 'Moneyses' sound when player intersects with money
}
}
}
// Check if the player is completely out of the scene
if (player.x < -player.width || player.x > 2048 + player.width || player.y < -player.height || player.y > 2732 + player.height) {
LK.showGameOver(); // End the game if the player is completely out of bounds
}
player.x -= windSpeed; // Apply wind effect to move player left
// Spawn enemies
enemySpawnCounter++;
if (enemySpawnCounter >= enemySpawnInterval * 6 && !powerUpActive) {
if (LK.ticks >= 1800) {
// 30 seconds * 60 FPS
enemySpawnInterval = 80; // Increase spawn rate after 30 seconds
}
if (enemySpawnCounter % 2 === 0) {
// Introduce a delay between spawns
return;
}
// Increase interval to reduce new enemy spawn rate
var enemy = new Enemy();
enemy.x = 2048; // Spawn from the right edge of the screen
enemy.y = Math.random() * (2732 / 2) + 100; // Random y position slightly lower from the top half of the screen
enemies.push(enemy);
game.addChild(enemy);
enemySpawnCounter = 0;
}
// Update enemies
for (var j = enemies.length - 1; j >= 0; j--) {
enemies[j].update();
if (player.intersects(enemies[j])) {
LK.getSound('Kick').play(); // Play 'Kick' sound when player intersects with an enemy
// Show 'kan' image at the collision point for 1 second
var kanVisual = LK.getAsset('kan', {
anchorX: 0.5,
anchorY: 0.5
});
kanVisual.x = enemies[j].x;
kanVisual.y = enemies[j].y;
game.addChild(kanVisual);
// Remove enemy from scene and array
enemies[j].destroy();
enemies.splice(j, 1);
// Ensure player is above kan visual
game.addChild(player);
// Remove 'kan' visual after 1 second
LK.setTimeout(function () {
kanVisual.destroy();
}, 1000);
if (enemies[j] instanceof NewEnemy) {
LK.effects.flashScreen(0xff0000, 1000); // Flash red light across the entire scene
if (LK.ticks >= 3600) {
// 60 seconds * 60 FPS
LK.setScore(LK.getScore() - 10); // Decrease score by 10 after 60 seconds
} else {
LK.setScore(LK.getScore() - 3); // Decrease score by 3 for newEnemy
}
if (LK.getScore() < 0) {
LK.getSound('End').play(); // Play 'End' sound
LK.showGameOver(); // End the game if the score goes below zero
}
} else {
LK.setScore(LK.getScore() + 2); // Increase score by 2 for killing monster bees
}
scoreTxt.setText(LK.getScore()); // Update the score text display
updateBestScoreDisplay(); // Update best score if needed
// Update buy buttons state if market is visible
if (menuSystem.isOpen && menuSystem.children[4] && menuSystem.children[4].visible) {
var currentScore = LK.getScore();
buyLifeBtn.interactive = currentScore >= 100;
buyLifeBtn.alpha = buyLifeBtn.interactive ? 1.0 : 0.5;
buyPowerUpBtn.interactive = currentScore >= 100;
buyPowerUpBtn.alpha = buyPowerUpBtn.interactive ? 1.0 : 0.5;
}
if (LK.getScore() % 20 === 0) {
enemySpawnInterval = Math.max(20, enemySpawnInterval - 10); // Increase spawn rate by decreasing interval
}
if (LK.getScore() % 100 === 0 && LK.getScore() !== 0) {
LK.effects.flashScreen(0x00ff00, 1000); // Flash green light across the entire scene
}
if (LK.getScore() >= 40) {
enemySpawnInterval = Math.max(10, enemySpawnInterval - 5); // Further increase spawn rate when score is 40 or more
}
}
}
for (var i = game.children.length - 1; i >= 0; i--) {
if (game.children[i] instanceof Kaplu) {
var kaplu = game.children[i];
kaplu.update();
if (player.intersects(kaplu)) {
LK.effects.flashScreen(0xff0000, 1000); // Flash red light across the entire scene
LK.setScore(LK.getScore() - 5); // Decrease score by 5
scoreTxt.setText(LK.getScore()); // Update the score text display
updateBestScoreDisplay(); // Update best score if needed
playerHealth.decreaseLife(); // Decrease player health by 1 for getting caught by the turtle
LK.getSound('Damage').play(); // Play 'Damage' sound when player intersects with 'kaplu'
kaplu.destroy(); // Remove 'kaplu' from the scene
}
}
}
};
// Handle player movement with touch
game.down = function (x, y, obj) {
if (y < 1366) {
// Check if the touch is in the upper half
player.x = x;
player.y = y;
}
};
game.move = function (x, y, obj) {
if (y < 1366) {
// Check if the touch is in the upper half
player.x = x;
player.y = y;
}
};
function createKaplu() {
if (isGamePaused) {
return;
}
if (!powerUpActive) {
var kaplu = new Kaplu();
kaplu.x = 2048 + kaplu.width / 2; // Start from the right edge of the screen
kaplu.y = Math.random() * (2732 / 2 - kaplu.height) + kaplu.height / 2; // Random vertical position above the center
game.addChild(kaplu);
}
}
// Function to spawn a power-up at player's position
function spawnPowerUpAtPlayer() {
// Create a new power-up asset
var powerUp = LK.getAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
// Position at player location with slight offset
powerUp.x = player.x;
powerUp.y = player.y - 100; // Position above the player
// Add power-up to the game scene
game.addChild(powerUp);
// Add rotating animation
var rotationTween = tween(powerUp, {
rotation: Math.PI * 2 // Full rotation (360 degrees)
}, {
duration: 2000,
easing: tween.easeInOut,
loop: true
});
// Add pulsing effect
var _pulseAnimation = function pulseAnimation() {
tween(powerUp.scale, {
x: 1.2,
y: 1.2
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(powerUp.scale, {
x: 1,
y: 1
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: _pulseAnimation
});
}
});
};
_pulseAnimation();
// Make it automatically activate after 5 seconds if not collected
LK.setTimeout(function () {
if (powerUp.parent) {
// Check if power-up still exists
powerUp.destroy();
activateSuperPower(); // Activate the power-up
}
}, 5000);
// Add collision detection for faster collection
var collisionInterval = LK.setInterval(function () {
if (powerUp.parent && player.intersects(powerUp)) {
powerUp.destroy();
LK.clearInterval(collisionInterval);
activateSuperPower(); // Activate the power-up when collected
}
}, 16);
}