/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Ball = Container.expand(function () {
var self = Container.call(this);
var ballGraphics = self.attachAsset('ball', {
anchorX: 0.5,
anchorY: 0.5
});
self.x = 1024;
self.y = 1366;
self.velocityX = 0;
self.velocityY = 0;
self.maxSpeed = 12;
self.friction = 0.98;
self.bounce = 0.8;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityX *= self.friction;
self.velocityY *= self.friction;
if (self.x < arenaLeft + 40) {
self.x = arenaLeft + 40;
self.velocityX = Math.abs(self.velocityX) * self.bounce;
}
if (self.x > arenaRight - 40) {
self.x = arenaRight - 40;
self.velocityX = -Math.abs(self.velocityX) * self.bounce;
}
if (self.y < arenaTop + 40) {
self.y = arenaTop + 40;
self.velocityY = Math.abs(self.velocityY) * self.bounce;
}
if (self.y > arenaBottom - 40) {
self.y = arenaBottom - 40;
self.velocityY = -Math.abs(self.velocityY) * self.bounce;
}
// Check if ball is stuck in top corners and teleport to center
var isInTopLeftCorner = self.x < arenaLeft + 200 && self.y < arenaTop + 200;
var isInTopRightCorner = self.x > arenaRight - 200 && self.y < arenaTop + 200;
var isMovingSlowly = Math.abs(self.velocityX) < 1 && Math.abs(self.velocityY) < 1;
if ((isInTopLeftCorner || isInTopRightCorner) && isMovingSlowly) {
// Teleport ball to center
self.x = 1024;
self.y = 1366;
self.velocityX = 0;
self.velocityY = 0;
// Visual effect for teleportation
LK.effects.flashObject(self, 0x00ffff, 500);
}
ballGraphics.rotation += self.velocityX * 0.01;
};
return self;
});
var Car = Container.expand(function (colorId, startX, startY) {
var self = Container.call(this);
var carGraphics = self.attachAsset(colorId, {
anchorX: 0.5,
anchorY: 0.5
});
self.x = startX;
self.y = startY;
self.velocityX = 0;
self.velocityY = 0;
self.maxSpeed = 8;
self.acceleration = 0.3;
self.friction = 0.92;
self.isDragging = false;
self.targetX = startX;
self.targetY = startY;
self.update = function () {
// Apply turbo speed boost for car2 (player)
var currentMaxSpeed = self.maxSpeed;
var currentAcceleration = self.acceleration;
if (self.isDragging) {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.velocityX += dx * currentAcceleration * 0.1;
self.velocityY += dy * currentAcceleration * 0.1;
var angle = Math.atan2(dy, dx);
carGraphics.rotation = angle;
}
}
if (self === car2 && turboActive) {
currentMaxSpeed = self.maxSpeed * 2.5; // 2.5x speed boost during turbo
} else if (self === car1 && tournamentMode) {
// Scale bot speed and acceleration based on tournament progress
var botDifficulty = 1 + (tournamentMatches - 1) * 0.15;
if (botDifficulty > 2.5) botDifficulty = 2.5;
currentMaxSpeed = self.maxSpeed * (1 + (botDifficulty - 1) * 0.8); // Up to 1.8x speed
currentAcceleration = self.acceleration * (1 + (botDifficulty - 1) * 0.6); // Up to 1.6x acceleration
}
var speed = Math.sqrt(self.velocityX * self.velocityX + self.velocityY * self.velocityY);
if (speed > currentMaxSpeed) {
self.velocityX = self.velocityX / speed * currentMaxSpeed;
self.velocityY = self.velocityY / speed * currentMaxSpeed;
}
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityX *= self.friction;
self.velocityY *= self.friction;
if (self.x < arenaLeft + 60) {
self.x = arenaLeft + 60;
self.velocityX = Math.abs(self.velocityX) * 0.5;
}
if (self.x > arenaRight - 60) {
self.x = arenaRight - 60;
self.velocityX = -Math.abs(self.velocityX) * 0.5;
}
if (self.y < arenaTop + 30) {
self.y = arenaTop + 30;
self.velocityY = Math.abs(self.velocityY) * 0.5;
}
if (self.y > arenaBottom - 30) {
self.y = arenaBottom - 30;
self.velocityY = -Math.abs(self.velocityY) * 0.5;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x27ae60
});
/****
* Game Code
****/
var arenaWidth = 1800;
var arenaHeight = 1200;
var arenaLeft = (2048 - arenaWidth) / 2;
var arenaRight = arenaLeft + arenaWidth;
var arenaTop = (2732 - arenaHeight) / 2;
var arenaBottom = arenaTop + arenaHeight;
var arena = game.attachAsset('arena', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
var goal1 = game.attachAsset('goal1', {
anchorX: 0.5,
anchorY: 0.5,
x: arenaLeft,
y: 1366
});
var goal2 = game.attachAsset('goal2', {
anchorX: 0.5,
anchorY: 0.5,
x: arenaRight,
y: 1366
});
var car1 = game.addChild(new Car('car1', arenaLeft + 200, 1366));
var car2 = game.addChild(new Car('car2', arenaRight - 200, 1366));
var ball = game.addChild(new Ball());
var score1 = 0;
var score2 = 0;
var gameTime = 120000;
var gameStartTime = Date.now();
var gameStarted = false;
var score1Text = new Text2('Bot: 0', {
size: 60,
fill: 0x3498DB
});
score1Text.anchor.set(0, 0);
LK.gui.topLeft.addChild(score1Text);
score1Text.x = 120;
var score2Text = new Text2('Player: 0', {
size: 60,
fill: 0xE74C3C
});
score2Text.anchor.set(1, 0);
LK.gui.topRight.addChild(score2Text);
var timeText = new Text2('2:00', {
size: 80,
fill: 0xFFFFFF
});
timeText.anchor.set(0.5, 0);
LK.gui.top.addChild(timeText);
var dragCar = null;
var lastBallGoalCheck = false;
// Turbo system variables
var turboActive = false;
var turboRemaining = 0; // in milliseconds
var turboRecharging = false;
var turboRechargeRemaining = 0; // in milliseconds
var turboDuration = 5000; // 5 seconds
var turboRechargeDuration = 7000; // 7 seconds
// Tournament system variables
var tournamentMode = false;
var tournamentWins = 0;
var tournamentMatches = 0;
var tournamentTeam = '';
// Turbo UI
var turboText = new Text2('TURBO READY', {
size: 50,
fill: 0x00FF00
});
turboText.anchor.set(0.5, 0);
turboText.y = 100;
LK.gui.top.addChild(turboText);
// Tournament match counter UI
var tournamentText = new Text2('', {
size: 50,
fill: 0xFFFFFF
});
tournamentText.anchor.set(0.5, 0);
tournamentText.y = 160;
LK.gui.top.addChild(tournamentText);
// Hide game elements initially
arena.visible = false;
goal1.visible = false;
goal2.visible = false;
car1.visible = false;
car2.visible = false;
ball.visible = false;
score1Text.visible = false;
score2Text.visible = false;
timeText.visible = false;
turboText.visible = false;
tournamentText.visible = false;
// Start screen elements
var startScreen = new Container();
var startBackground = LK.getAsset('arena', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
startScreen.addChild(startBackground);
var playButton = new Container();
var playButtonBg = LK.getAsset('goal1', {
anchorX: 0.5,
anchorY: 0.5,
width: 300,
height: 120
});
playButton.addChild(playButtonBg);
var playButtonText = new Text2('OYNA', {
size: 80,
fill: 0xFFFFFF
});
playButtonText.anchor.set(0.5, 0.5);
playButton.addChild(playButtonText);
playButton.x = 1024;
playButton.y = 1266;
startScreen.addChild(playButton);
var tournamentButton = new Container();
var tournamentButtonBg = LK.getAsset('goal1', {
anchorX: 0.5,
anchorY: 0.5,
width: 300,
height: 120
});
tournamentButton.addChild(tournamentButtonBg);
var tournamentButtonText = new Text2('TURNUVA', {
size: 60,
fill: 0xFFFFFF
});
tournamentButtonText.anchor.set(0.5, 0.5);
tournamentButton.addChild(tournamentButtonText);
tournamentButton.x = 1024;
tournamentButton.y = 1466;
startScreen.addChild(tournamentButton);
// Team selection screen
var teamSelectScreen = new Container();
var teamSelectBackground = LK.getAsset('arena', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
teamSelectScreen.addChild(teamSelectBackground);
var selectTeamText = new Text2('TAKIMINI SEÇ', {
size: 80,
fill: 0xFFFFFF
});
selectTeamText.anchor.set(0.5, 0.5);
selectTeamText.x = 1024;
selectTeamText.y = 1000;
teamSelectScreen.addChild(selectTeamText);
// Ultra Macor team button
var ultraMacorButton = new Container();
var ultraMacorButtonBg = LK.getAsset('goal1', {
anchorX: 0.5,
anchorY: 0.5,
width: 400,
height: 120
});
ultraMacorButton.addChild(ultraMacorButtonBg);
var ultraMacorText = new Text2('ULTRA MACOR', {
size: 60,
fill: 0xFFFFFF
});
ultraMacorText.anchor.set(0.5, 0.5);
ultraMacorButton.addChild(ultraMacorText);
ultraMacorButton.x = 1024;
ultraMacorButton.y = 1300;
teamSelectScreen.addChild(ultraMacorButton);
// Magic Team button
var magicTeamButton = new Container();
var magicTeamButtonBg = LK.getAsset('goal2', {
anchorX: 0.5,
anchorY: 0.5,
width: 400,
height: 120
});
magicTeamButton.addChild(magicTeamButtonBg);
var magicTeamText = new Text2('MAGIC TEAM', {
size: 60,
fill: 0xFFFFFF
});
magicTeamText.anchor.set(0.5, 0.5);
magicTeamButton.addChild(magicTeamText);
magicTeamButton.x = 1024;
magicTeamButton.y = 1500;
teamSelectScreen.addChild(magicTeamButton);
teamSelectScreen.visible = false;
game.addChild(teamSelectScreen);
game.addChild(startScreen);
function handleMove(x, y, obj) {
if (dragCar) {
dragCar.targetX = x;
dragCar.targetY = y;
dragCar.isDragging = true;
}
}
function resetBall() {
ball.x = 1024;
ball.y = 1366;
ball.velocityX = 0;
ball.velocityY = 0;
}
function checkGoal() {
var ballInGoal1 = ball.x < arenaLeft + 60 && ball.y > 1366 - 150 && ball.y < 1366 + 150;
var ballInGoal2 = ball.x > arenaRight - 60 && ball.y > 1366 - 150 && ball.y < 1366 + 150;
if (ballInGoal1 && !lastBallGoalCheck) {
score2++;
score2Text.setText('Player: ' + score2);
LK.getSound('goal').play();
LK.effects.flashScreen(0xe74c3c, 500);
resetBall();
}
if (ballInGoal2 && !lastBallGoalCheck) {
score1++;
score1Text.setText('Bot: ' + score1);
LK.getSound('goal').play();
LK.effects.flashScreen(0x3498db, 500);
resetBall();
}
lastBallGoalCheck = ballInGoal1 || ballInGoal2;
}
function checkCollisions() {
if (car1.intersects(ball)) {
var dx = ball.x - car1.x;
var dy = ball.y - car1.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
var force = 0.5;
var carSpeed = Math.sqrt(car1.velocityX * car1.velocityX + car1.velocityY * car1.velocityY);
force += carSpeed * 0.1;
ball.velocityX += dx / distance * force;
ball.velocityY += dy / distance * force;
var separation = 100;
ball.x = car1.x + dx / distance * separation;
ball.y = car1.y + dy / distance * separation;
LK.getSound('hit').play();
}
}
if (car2.intersects(ball)) {
var dx = ball.x - car2.x;
var dy = ball.y - car2.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
var force = 0.5;
var carSpeed = Math.sqrt(car2.velocityX * car2.velocityX + car2.velocityY * car2.velocityY);
force += carSpeed * 0.1;
ball.velocityX += dx / distance * force;
ball.velocityY += dy / distance * force;
var separation = 100;
ball.x = car2.x + dx / distance * separation;
ball.y = car2.y + dy / distance * separation;
LK.getSound('hit').play();
}
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
// Check if game hasn't started and buttons are clicked
if (!gameStarted) {
var playButtonDistance = Math.sqrt((x - playButton.x) * (x - playButton.x) + (y - playButton.y) * (y - playButton.y));
var tournamentButtonDistance = Math.sqrt((x - tournamentButton.x) * (x - tournamentButton.x) + (y - tournamentButton.y) * (y - tournamentButton.y));
if (playButtonDistance < 150) {
// Start the game
gameStarted = true;
gameStartTime = Date.now(); // Reset game start time
startScreen.visible = false;
// Show game elements
arena.visible = true;
goal1.visible = true;
goal2.visible = true;
car1.visible = true;
car2.visible = true;
ball.visible = true;
score1Text.visible = true;
score2Text.visible = true;
timeText.visible = true;
turboText.visible = true;
} else if (tournamentButtonDistance < 150) {
// Show team selection screen
startScreen.visible = false;
teamSelectScreen.visible = true;
}
return;
}
// Check if team selection screen is visible and handle team clicks
if (teamSelectScreen.visible) {
var ultraMacorDistance = Math.sqrt((x - ultraMacorButton.x) * (x - ultraMacorButton.x) + (y - ultraMacorButton.y) * (y - ultraMacorButton.y));
var magicTeamDistance = Math.sqrt((x - magicTeamButton.x) * (x - magicTeamButton.x) + (y - magicTeamButton.y) * (y - magicTeamButton.y));
if (ultraMacorDistance < 200 || magicTeamDistance < 200) {
// Select team and enable tournament mode
if (ultraMacorDistance < 200) {
tournamentTeam = 'Ultra Macor';
} else {
tournamentTeam = 'Magic Team';
}
tournamentMode = true;
tournamentWins = 0;
tournamentMatches = 1;
// Start first tournament match
gameStarted = true;
gameStartTime = Date.now();
teamSelectScreen.visible = false;
// Show game elements
arena.visible = true;
goal1.visible = true;
goal2.visible = true;
car1.visible = true;
car2.visible = true;
ball.visible = true;
score1Text.visible = true;
score2Text.visible = true;
timeText.visible = true;
turboText.visible = true;
tournamentText.visible = true;
tournamentText.setText(tournamentMatches + '/10');
}
return;
}
var car1Distance = Math.sqrt((x - car1.x) * (x - car1.x) + (y - car1.y) * (y - car1.y));
var car2Distance = Math.sqrt((x - car2.x) * (x - car2.x) + (y - car2.y) * (y - car2.y));
// Check for turbo activation (tap anywhere when not recharging)
if (!turboActive && !turboRecharging) {
turboActive = true;
turboRemaining = turboDuration;
// Visual feedback for turbo activation
tween(car2, {
tint: 0xFFFF00
}, {
duration: 200
});
tween(car2, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
if (car2Distance < car1Distance && car2Distance < 150) {
dragCar = car2;
} else if (car1Distance < 150) {
dragCar = car1;
}
if (dragCar) {
handleMove(x, y, obj);
}
};
game.up = function (x, y, obj) {
if (dragCar) {
dragCar.isDragging = false;
}
dragCar = null;
};
game.update = function () {
if (!gameStarted) {
return; // Don't run game logic until game starts
}
var currentTime = Date.now();
var elapsedTime = currentTime - gameStartTime;
var remainingTime = gameTime - elapsedTime;
if (remainingTime <= 0) {
if (tournamentMode) {
if (score2 > score1 || score1 === score2) {
// Player won or tied - continue tournament
tournamentWins++;
tournamentMatches++;
if (tournamentWins >= 10) {
// Tournament completed successfully - 10 wins achieved
LK.showYouWin();
return;
}
// Show win message for tournament match
var winMessage = new Text2('KAZANDIN\nSONRAKİ TUR', {
size: 80,
fill: 0x00FF00
});
winMessage.anchor.set(0.5, 0.5);
winMessage.x = 1024;
winMessage.y = 1366;
game.addChild(winMessage);
// Hide the win message after 2 seconds and continue to next match
LK.setTimeout(function () {
game.removeChild(winMessage);
// Reset for next match
score1 = 0;
score2 = 0;
score1Text.setText('Bot: 0');
score2Text.setText('Player: 0');
gameStartTime = Date.now();
resetBall();
tournamentText.setText(tournamentMatches + '/10');
}, 2000);
return; // Pause game update while showing message
} else {
// Player lost - show game over with loss message
var loseMessage = new Text2('KAYBETTIN', {
size: 100,
fill: 0xFF0000
});
loseMessage.anchor.set(0.5, 0.5);
loseMessage.x = 1024;
loseMessage.y = 1366;
game.addChild(loseMessage);
LK.setTimeout(function () {
LK.showGameOver();
}, 2000);
}
} else {
// Normal game mode
if (score1 > score2) {
LK.showGameOver();
} else if (score2 > score1) {
LK.showYouWin();
} else {
// In case of tie, player wins
LK.showYouWin();
}
}
return;
}
var minutes = Math.floor(remainingTime / 60000);
var seconds = Math.floor(remainingTime % 60000 / 1000);
timeText.setText(minutes + ':' + (seconds < 10 ? '0' : '') + seconds);
// Simple AI for car1 (blue car - bot) with tournament difficulty scaling
var dx = ball.x - car1.x;
var dy = ball.y - car1.y;
var distance = Math.sqrt(dx * dx + dy * dy);
// Calculate bot difficulty based on tournament progress
var botDifficulty = 1; // Default difficulty for normal games
if (tournamentMode) {
// Scale difficulty from 1.0 to 2.5 based on tournament matches (1-10)
botDifficulty = 1 + (tournamentMatches - 1) * 0.15; // Increases by 0.15 each match
// Cap at 2.5x difficulty
if (botDifficulty > 2.5) botDifficulty = 2.5;
}
// Apply difficulty scaling to bot behavior
var adjustedDistance = 100 / botDifficulty; // Bot reacts from further away as difficulty increases
if (distance > adjustedDistance) {
car1.targetX = ball.x;
car1.targetY = ball.y;
car1.isDragging = true;
} else {
car1.isDragging = false;
}
// Turbo system update
if (turboActive) {
turboRemaining -= 16; // Approximate frame time at 60fps
if (turboRemaining <= 0) {
turboActive = false;
turboRecharging = true;
turboRechargeRemaining = turboRechargeDuration;
car2.tint = 0xFFFFFF; // Reset car color
}
}
if (turboRecharging) {
turboRechargeRemaining -= 16;
if (turboRechargeRemaining <= 0) {
turboRecharging = false;
}
}
// Update turbo UI
if (turboActive) {
var turboSeconds = Math.ceil(turboRemaining / 1000);
turboText.setText('TURBO: ' + turboSeconds + 's');
turboText.fill = 0xFFFF00; // Yellow during active
} else if (turboRecharging) {
var rechargeSeconds = Math.ceil(turboRechargeRemaining / 1000);
turboText.setText('RECHARGING: ' + rechargeSeconds + 's');
turboText.fill = 0xFF0000; // Red during recharge
} else {
turboText.setText('TURBO READY - TAP TO ACTIVATE');
turboText.fill = 0x00FF00; // Green when ready
}
checkCollisions();
checkGoal();
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Ball = Container.expand(function () {
var self = Container.call(this);
var ballGraphics = self.attachAsset('ball', {
anchorX: 0.5,
anchorY: 0.5
});
self.x = 1024;
self.y = 1366;
self.velocityX = 0;
self.velocityY = 0;
self.maxSpeed = 12;
self.friction = 0.98;
self.bounce = 0.8;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityX *= self.friction;
self.velocityY *= self.friction;
if (self.x < arenaLeft + 40) {
self.x = arenaLeft + 40;
self.velocityX = Math.abs(self.velocityX) * self.bounce;
}
if (self.x > arenaRight - 40) {
self.x = arenaRight - 40;
self.velocityX = -Math.abs(self.velocityX) * self.bounce;
}
if (self.y < arenaTop + 40) {
self.y = arenaTop + 40;
self.velocityY = Math.abs(self.velocityY) * self.bounce;
}
if (self.y > arenaBottom - 40) {
self.y = arenaBottom - 40;
self.velocityY = -Math.abs(self.velocityY) * self.bounce;
}
// Check if ball is stuck in top corners and teleport to center
var isInTopLeftCorner = self.x < arenaLeft + 200 && self.y < arenaTop + 200;
var isInTopRightCorner = self.x > arenaRight - 200 && self.y < arenaTop + 200;
var isMovingSlowly = Math.abs(self.velocityX) < 1 && Math.abs(self.velocityY) < 1;
if ((isInTopLeftCorner || isInTopRightCorner) && isMovingSlowly) {
// Teleport ball to center
self.x = 1024;
self.y = 1366;
self.velocityX = 0;
self.velocityY = 0;
// Visual effect for teleportation
LK.effects.flashObject(self, 0x00ffff, 500);
}
ballGraphics.rotation += self.velocityX * 0.01;
};
return self;
});
var Car = Container.expand(function (colorId, startX, startY) {
var self = Container.call(this);
var carGraphics = self.attachAsset(colorId, {
anchorX: 0.5,
anchorY: 0.5
});
self.x = startX;
self.y = startY;
self.velocityX = 0;
self.velocityY = 0;
self.maxSpeed = 8;
self.acceleration = 0.3;
self.friction = 0.92;
self.isDragging = false;
self.targetX = startX;
self.targetY = startY;
self.update = function () {
// Apply turbo speed boost for car2 (player)
var currentMaxSpeed = self.maxSpeed;
var currentAcceleration = self.acceleration;
if (self.isDragging) {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.velocityX += dx * currentAcceleration * 0.1;
self.velocityY += dy * currentAcceleration * 0.1;
var angle = Math.atan2(dy, dx);
carGraphics.rotation = angle;
}
}
if (self === car2 && turboActive) {
currentMaxSpeed = self.maxSpeed * 2.5; // 2.5x speed boost during turbo
} else if (self === car1 && tournamentMode) {
// Scale bot speed and acceleration based on tournament progress
var botDifficulty = 1 + (tournamentMatches - 1) * 0.15;
if (botDifficulty > 2.5) botDifficulty = 2.5;
currentMaxSpeed = self.maxSpeed * (1 + (botDifficulty - 1) * 0.8); // Up to 1.8x speed
currentAcceleration = self.acceleration * (1 + (botDifficulty - 1) * 0.6); // Up to 1.6x acceleration
}
var speed = Math.sqrt(self.velocityX * self.velocityX + self.velocityY * self.velocityY);
if (speed > currentMaxSpeed) {
self.velocityX = self.velocityX / speed * currentMaxSpeed;
self.velocityY = self.velocityY / speed * currentMaxSpeed;
}
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityX *= self.friction;
self.velocityY *= self.friction;
if (self.x < arenaLeft + 60) {
self.x = arenaLeft + 60;
self.velocityX = Math.abs(self.velocityX) * 0.5;
}
if (self.x > arenaRight - 60) {
self.x = arenaRight - 60;
self.velocityX = -Math.abs(self.velocityX) * 0.5;
}
if (self.y < arenaTop + 30) {
self.y = arenaTop + 30;
self.velocityY = Math.abs(self.velocityY) * 0.5;
}
if (self.y > arenaBottom - 30) {
self.y = arenaBottom - 30;
self.velocityY = -Math.abs(self.velocityY) * 0.5;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x27ae60
});
/****
* Game Code
****/
var arenaWidth = 1800;
var arenaHeight = 1200;
var arenaLeft = (2048 - arenaWidth) / 2;
var arenaRight = arenaLeft + arenaWidth;
var arenaTop = (2732 - arenaHeight) / 2;
var arenaBottom = arenaTop + arenaHeight;
var arena = game.attachAsset('arena', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
var goal1 = game.attachAsset('goal1', {
anchorX: 0.5,
anchorY: 0.5,
x: arenaLeft,
y: 1366
});
var goal2 = game.attachAsset('goal2', {
anchorX: 0.5,
anchorY: 0.5,
x: arenaRight,
y: 1366
});
var car1 = game.addChild(new Car('car1', arenaLeft + 200, 1366));
var car2 = game.addChild(new Car('car2', arenaRight - 200, 1366));
var ball = game.addChild(new Ball());
var score1 = 0;
var score2 = 0;
var gameTime = 120000;
var gameStartTime = Date.now();
var gameStarted = false;
var score1Text = new Text2('Bot: 0', {
size: 60,
fill: 0x3498DB
});
score1Text.anchor.set(0, 0);
LK.gui.topLeft.addChild(score1Text);
score1Text.x = 120;
var score2Text = new Text2('Player: 0', {
size: 60,
fill: 0xE74C3C
});
score2Text.anchor.set(1, 0);
LK.gui.topRight.addChild(score2Text);
var timeText = new Text2('2:00', {
size: 80,
fill: 0xFFFFFF
});
timeText.anchor.set(0.5, 0);
LK.gui.top.addChild(timeText);
var dragCar = null;
var lastBallGoalCheck = false;
// Turbo system variables
var turboActive = false;
var turboRemaining = 0; // in milliseconds
var turboRecharging = false;
var turboRechargeRemaining = 0; // in milliseconds
var turboDuration = 5000; // 5 seconds
var turboRechargeDuration = 7000; // 7 seconds
// Tournament system variables
var tournamentMode = false;
var tournamentWins = 0;
var tournamentMatches = 0;
var tournamentTeam = '';
// Turbo UI
var turboText = new Text2('TURBO READY', {
size: 50,
fill: 0x00FF00
});
turboText.anchor.set(0.5, 0);
turboText.y = 100;
LK.gui.top.addChild(turboText);
// Tournament match counter UI
var tournamentText = new Text2('', {
size: 50,
fill: 0xFFFFFF
});
tournamentText.anchor.set(0.5, 0);
tournamentText.y = 160;
LK.gui.top.addChild(tournamentText);
// Hide game elements initially
arena.visible = false;
goal1.visible = false;
goal2.visible = false;
car1.visible = false;
car2.visible = false;
ball.visible = false;
score1Text.visible = false;
score2Text.visible = false;
timeText.visible = false;
turboText.visible = false;
tournamentText.visible = false;
// Start screen elements
var startScreen = new Container();
var startBackground = LK.getAsset('arena', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
startScreen.addChild(startBackground);
var playButton = new Container();
var playButtonBg = LK.getAsset('goal1', {
anchorX: 0.5,
anchorY: 0.5,
width: 300,
height: 120
});
playButton.addChild(playButtonBg);
var playButtonText = new Text2('OYNA', {
size: 80,
fill: 0xFFFFFF
});
playButtonText.anchor.set(0.5, 0.5);
playButton.addChild(playButtonText);
playButton.x = 1024;
playButton.y = 1266;
startScreen.addChild(playButton);
var tournamentButton = new Container();
var tournamentButtonBg = LK.getAsset('goal1', {
anchorX: 0.5,
anchorY: 0.5,
width: 300,
height: 120
});
tournamentButton.addChild(tournamentButtonBg);
var tournamentButtonText = new Text2('TURNUVA', {
size: 60,
fill: 0xFFFFFF
});
tournamentButtonText.anchor.set(0.5, 0.5);
tournamentButton.addChild(tournamentButtonText);
tournamentButton.x = 1024;
tournamentButton.y = 1466;
startScreen.addChild(tournamentButton);
// Team selection screen
var teamSelectScreen = new Container();
var teamSelectBackground = LK.getAsset('arena', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
teamSelectScreen.addChild(teamSelectBackground);
var selectTeamText = new Text2('TAKIMINI SEÇ', {
size: 80,
fill: 0xFFFFFF
});
selectTeamText.anchor.set(0.5, 0.5);
selectTeamText.x = 1024;
selectTeamText.y = 1000;
teamSelectScreen.addChild(selectTeamText);
// Ultra Macor team button
var ultraMacorButton = new Container();
var ultraMacorButtonBg = LK.getAsset('goal1', {
anchorX: 0.5,
anchorY: 0.5,
width: 400,
height: 120
});
ultraMacorButton.addChild(ultraMacorButtonBg);
var ultraMacorText = new Text2('ULTRA MACOR', {
size: 60,
fill: 0xFFFFFF
});
ultraMacorText.anchor.set(0.5, 0.5);
ultraMacorButton.addChild(ultraMacorText);
ultraMacorButton.x = 1024;
ultraMacorButton.y = 1300;
teamSelectScreen.addChild(ultraMacorButton);
// Magic Team button
var magicTeamButton = new Container();
var magicTeamButtonBg = LK.getAsset('goal2', {
anchorX: 0.5,
anchorY: 0.5,
width: 400,
height: 120
});
magicTeamButton.addChild(magicTeamButtonBg);
var magicTeamText = new Text2('MAGIC TEAM', {
size: 60,
fill: 0xFFFFFF
});
magicTeamText.anchor.set(0.5, 0.5);
magicTeamButton.addChild(magicTeamText);
magicTeamButton.x = 1024;
magicTeamButton.y = 1500;
teamSelectScreen.addChild(magicTeamButton);
teamSelectScreen.visible = false;
game.addChild(teamSelectScreen);
game.addChild(startScreen);
function handleMove(x, y, obj) {
if (dragCar) {
dragCar.targetX = x;
dragCar.targetY = y;
dragCar.isDragging = true;
}
}
function resetBall() {
ball.x = 1024;
ball.y = 1366;
ball.velocityX = 0;
ball.velocityY = 0;
}
function checkGoal() {
var ballInGoal1 = ball.x < arenaLeft + 60 && ball.y > 1366 - 150 && ball.y < 1366 + 150;
var ballInGoal2 = ball.x > arenaRight - 60 && ball.y > 1366 - 150 && ball.y < 1366 + 150;
if (ballInGoal1 && !lastBallGoalCheck) {
score2++;
score2Text.setText('Player: ' + score2);
LK.getSound('goal').play();
LK.effects.flashScreen(0xe74c3c, 500);
resetBall();
}
if (ballInGoal2 && !lastBallGoalCheck) {
score1++;
score1Text.setText('Bot: ' + score1);
LK.getSound('goal').play();
LK.effects.flashScreen(0x3498db, 500);
resetBall();
}
lastBallGoalCheck = ballInGoal1 || ballInGoal2;
}
function checkCollisions() {
if (car1.intersects(ball)) {
var dx = ball.x - car1.x;
var dy = ball.y - car1.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
var force = 0.5;
var carSpeed = Math.sqrt(car1.velocityX * car1.velocityX + car1.velocityY * car1.velocityY);
force += carSpeed * 0.1;
ball.velocityX += dx / distance * force;
ball.velocityY += dy / distance * force;
var separation = 100;
ball.x = car1.x + dx / distance * separation;
ball.y = car1.y + dy / distance * separation;
LK.getSound('hit').play();
}
}
if (car2.intersects(ball)) {
var dx = ball.x - car2.x;
var dy = ball.y - car2.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
var force = 0.5;
var carSpeed = Math.sqrt(car2.velocityX * car2.velocityX + car2.velocityY * car2.velocityY);
force += carSpeed * 0.1;
ball.velocityX += dx / distance * force;
ball.velocityY += dy / distance * force;
var separation = 100;
ball.x = car2.x + dx / distance * separation;
ball.y = car2.y + dy / distance * separation;
LK.getSound('hit').play();
}
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
// Check if game hasn't started and buttons are clicked
if (!gameStarted) {
var playButtonDistance = Math.sqrt((x - playButton.x) * (x - playButton.x) + (y - playButton.y) * (y - playButton.y));
var tournamentButtonDistance = Math.sqrt((x - tournamentButton.x) * (x - tournamentButton.x) + (y - tournamentButton.y) * (y - tournamentButton.y));
if (playButtonDistance < 150) {
// Start the game
gameStarted = true;
gameStartTime = Date.now(); // Reset game start time
startScreen.visible = false;
// Show game elements
arena.visible = true;
goal1.visible = true;
goal2.visible = true;
car1.visible = true;
car2.visible = true;
ball.visible = true;
score1Text.visible = true;
score2Text.visible = true;
timeText.visible = true;
turboText.visible = true;
} else if (tournamentButtonDistance < 150) {
// Show team selection screen
startScreen.visible = false;
teamSelectScreen.visible = true;
}
return;
}
// Check if team selection screen is visible and handle team clicks
if (teamSelectScreen.visible) {
var ultraMacorDistance = Math.sqrt((x - ultraMacorButton.x) * (x - ultraMacorButton.x) + (y - ultraMacorButton.y) * (y - ultraMacorButton.y));
var magicTeamDistance = Math.sqrt((x - magicTeamButton.x) * (x - magicTeamButton.x) + (y - magicTeamButton.y) * (y - magicTeamButton.y));
if (ultraMacorDistance < 200 || magicTeamDistance < 200) {
// Select team and enable tournament mode
if (ultraMacorDistance < 200) {
tournamentTeam = 'Ultra Macor';
} else {
tournamentTeam = 'Magic Team';
}
tournamentMode = true;
tournamentWins = 0;
tournamentMatches = 1;
// Start first tournament match
gameStarted = true;
gameStartTime = Date.now();
teamSelectScreen.visible = false;
// Show game elements
arena.visible = true;
goal1.visible = true;
goal2.visible = true;
car1.visible = true;
car2.visible = true;
ball.visible = true;
score1Text.visible = true;
score2Text.visible = true;
timeText.visible = true;
turboText.visible = true;
tournamentText.visible = true;
tournamentText.setText(tournamentMatches + '/10');
}
return;
}
var car1Distance = Math.sqrt((x - car1.x) * (x - car1.x) + (y - car1.y) * (y - car1.y));
var car2Distance = Math.sqrt((x - car2.x) * (x - car2.x) + (y - car2.y) * (y - car2.y));
// Check for turbo activation (tap anywhere when not recharging)
if (!turboActive && !turboRecharging) {
turboActive = true;
turboRemaining = turboDuration;
// Visual feedback for turbo activation
tween(car2, {
tint: 0xFFFF00
}, {
duration: 200
});
tween(car2, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
if (car2Distance < car1Distance && car2Distance < 150) {
dragCar = car2;
} else if (car1Distance < 150) {
dragCar = car1;
}
if (dragCar) {
handleMove(x, y, obj);
}
};
game.up = function (x, y, obj) {
if (dragCar) {
dragCar.isDragging = false;
}
dragCar = null;
};
game.update = function () {
if (!gameStarted) {
return; // Don't run game logic until game starts
}
var currentTime = Date.now();
var elapsedTime = currentTime - gameStartTime;
var remainingTime = gameTime - elapsedTime;
if (remainingTime <= 0) {
if (tournamentMode) {
if (score2 > score1 || score1 === score2) {
// Player won or tied - continue tournament
tournamentWins++;
tournamentMatches++;
if (tournamentWins >= 10) {
// Tournament completed successfully - 10 wins achieved
LK.showYouWin();
return;
}
// Show win message for tournament match
var winMessage = new Text2('KAZANDIN\nSONRAKİ TUR', {
size: 80,
fill: 0x00FF00
});
winMessage.anchor.set(0.5, 0.5);
winMessage.x = 1024;
winMessage.y = 1366;
game.addChild(winMessage);
// Hide the win message after 2 seconds and continue to next match
LK.setTimeout(function () {
game.removeChild(winMessage);
// Reset for next match
score1 = 0;
score2 = 0;
score1Text.setText('Bot: 0');
score2Text.setText('Player: 0');
gameStartTime = Date.now();
resetBall();
tournamentText.setText(tournamentMatches + '/10');
}, 2000);
return; // Pause game update while showing message
} else {
// Player lost - show game over with loss message
var loseMessage = new Text2('KAYBETTIN', {
size: 100,
fill: 0xFF0000
});
loseMessage.anchor.set(0.5, 0.5);
loseMessage.x = 1024;
loseMessage.y = 1366;
game.addChild(loseMessage);
LK.setTimeout(function () {
LK.showGameOver();
}, 2000);
}
} else {
// Normal game mode
if (score1 > score2) {
LK.showGameOver();
} else if (score2 > score1) {
LK.showYouWin();
} else {
// In case of tie, player wins
LK.showYouWin();
}
}
return;
}
var minutes = Math.floor(remainingTime / 60000);
var seconds = Math.floor(remainingTime % 60000 / 1000);
timeText.setText(minutes + ':' + (seconds < 10 ? '0' : '') + seconds);
// Simple AI for car1 (blue car - bot) with tournament difficulty scaling
var dx = ball.x - car1.x;
var dy = ball.y - car1.y;
var distance = Math.sqrt(dx * dx + dy * dy);
// Calculate bot difficulty based on tournament progress
var botDifficulty = 1; // Default difficulty for normal games
if (tournamentMode) {
// Scale difficulty from 1.0 to 2.5 based on tournament matches (1-10)
botDifficulty = 1 + (tournamentMatches - 1) * 0.15; // Increases by 0.15 each match
// Cap at 2.5x difficulty
if (botDifficulty > 2.5) botDifficulty = 2.5;
}
// Apply difficulty scaling to bot behavior
var adjustedDistance = 100 / botDifficulty; // Bot reacts from further away as difficulty increases
if (distance > adjustedDistance) {
car1.targetX = ball.x;
car1.targetY = ball.y;
car1.isDragging = true;
} else {
car1.isDragging = false;
}
// Turbo system update
if (turboActive) {
turboRemaining -= 16; // Approximate frame time at 60fps
if (turboRemaining <= 0) {
turboActive = false;
turboRecharging = true;
turboRechargeRemaining = turboRechargeDuration;
car2.tint = 0xFFFFFF; // Reset car color
}
}
if (turboRecharging) {
turboRechargeRemaining -= 16;
if (turboRechargeRemaining <= 0) {
turboRecharging = false;
}
}
// Update turbo UI
if (turboActive) {
var turboSeconds = Math.ceil(turboRemaining / 1000);
turboText.setText('TURBO: ' + turboSeconds + 's');
turboText.fill = 0xFFFF00; // Yellow during active
} else if (turboRecharging) {
var rechargeSeconds = Math.ceil(turboRechargeRemaining / 1000);
turboText.setText('RECHARGING: ' + rechargeSeconds + 's');
turboText.fill = 0xFF0000; // Red during recharge
} else {
turboText.setText('TURBO READY - TAP TO ACTIVATE');
turboText.fill = 0x00FF00; // Green when ready
}
checkCollisions();
checkGoal();
};