/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var BackgroundStar = Container.expand(function () {
var self = Container.call(this);
var starGraphics = self.attachAsset('star_bg', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -0.3;
self.twinkleTimer = Math.random() * 100;
self.update = function () {
self.x += self.speed;
self.twinkleTimer += 0.05;
starGraphics.alpha = 0.3 + Math.sin(self.twinkleTimer) * 0.7;
};
return self;
});
var Cloud = Container.expand(function () {
var self = Container.call(this);
var cloudGraphics = self.attachAsset('cloud', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -0.5; // Very slow parallax
self.floatTimer = Math.random() * 100;
self.update = function () {
self.x += self.speed;
self.floatTimer += 0.02;
cloudGraphics.y = Math.sin(self.floatTimer) * 20;
};
return self;
});
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -8;
self.value = 10;
self.bobOffset = 0;
self.update = function () {
self.x += self.speed;
// Add bobbing animation
self.bobOffset += 0.1;
coinGraphics.y = Math.sin(self.bobOffset) * 10;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 1.0,
scaleX: 1.5,
scaleY: 1.5
});
self.velocityY = 0;
self.isJumping = false;
self.jumpForce = -50;
self.gravity = 1.2;
self.groundY = 2532; // Ground level
self.update = function () {
// Apply gravity
self.velocityY += self.gravity;
self.y += self.velocityY;
// Check ground collision
if (self.y >= self.groundY) {
self.y = self.groundY;
self.velocityY = 0;
self.isJumping = false;
}
};
self.jump = function () {
if (!self.isJumping) {
self.velocityY = self.jumpForce;
self.isJumping = true;
LK.getSound('jump').play();
}
};
return self;
});
var Pyramid = Container.expand(function () {
var self = Container.call(this);
var pyramidType = Math.floor(Math.random() * 3) + 1;
var pyramidGraphics = self.attachAsset('pyramid' + pyramidType, {
anchorX: 0.5,
anchorY: 1.0
});
self.speed = -2; // Slower parallax speed
// Add stone blocks around pyramid
for (var i = 0; i < 5; i++) {
if (Math.random() > 0.4) {
var stoneBlock = self.attachAsset('stone_block', {
anchorX: 0.5,
anchorY: 0.5
});
stoneBlock.x = (Math.random() - 0.5) * pyramidGraphics.width * 1.2;
stoneBlock.y = -Math.random() * 100;
}
}
// Add palm trees around pyramid
if (Math.random() > 0.3) {
var palmTrunk = self.attachAsset('palm_trunk', {
anchorX: 0.5,
anchorY: 1.0
});
var palmLeaves = self.attachAsset('palm_leaves', {
anchorX: 0.5,
anchorY: 0.5
});
palmTrunk.x = (Math.random() - 0.5) * pyramidGraphics.width * 1.5;
palmTrunk.y = 0;
palmLeaves.x = palmTrunk.x;
palmLeaves.y = palmTrunk.y - palmTrunk.height;
}
self.update = function () {
self.x += self.speed;
};
return self;
});
var Robot = Container.expand(function () {
var self = Container.call(this);
var robotGraphics = self.attachAsset('robot', {
anchorX: 0.5,
anchorY: 1.0
});
self.speed = -8;
self.groundY = 2532;
// Enhanced AI robot lights for Istanbul 2071
for (var i = 0; i < 5; i++) {
var light = self.attachAsset('neon_light', {
anchorX: 0.5,
anchorY: 0.5
});
light.x = (Math.random() - 0.5) * 80;
light.y = -Math.random() * 60 - 10;
// AI robot eye colors
var aiColors = [0x00ffff, 0xff0040, 0x40ff00];
light.tint = aiColors[Math.floor(Math.random() * aiColors.length)];
}
// Add AI scanner beam
var scanner = self.attachAsset('neon_light', {
anchorX: 0,
anchorY: 0.5
});
scanner.x = 50;
scanner.y = -40;
scanner.scaleX = 3;
scanner.scaleY = 0.2;
scanner.tint = 0xff0000;
scanner.alpha = 0.7;
self.scanTimer = 0;
self.update = function () {
self.x += self.speed;
// Animate AI scanner
self.scanTimer += 0.1;
scanner.alpha = 0.3 + Math.sin(self.scanTimer) * 0.4;
};
return self;
});
var Star = Container.expand(function () {
var self = Container.call(this);
var starGraphics = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -8;
self.value = 50;
self.rotationSpeed = 0.1;
self.update = function () {
self.x += self.speed;
starGraphics.rotation += self.rotationSpeed;
};
return self;
});
var Tower = Container.expand(function () {
var self = Container.call(this);
var towerType = Math.floor(Math.random() * 3) + 1;
var towerGraphics = self.attachAsset('tower' + towerType, {
anchorX: 0.5,
anchorY: 1.0
});
self.speed = -2;
// Enhanced neon lights for Istanbul 2071 towers
for (var i = 0; i < 12; i++) {
if (Math.random() > 0.2) {
var light = self.attachAsset('neon_light', {
anchorX: 0.5,
anchorY: 0.5
});
light.x = (Math.random() - 0.5) * towerGraphics.width;
light.y = -Math.random() * towerGraphics.height;
// Add tinting for variety in Istanbul skyline
var colors = [0x00ffff, 0xff0080, 0x8000ff, 0x00ff80];
light.tint = colors[Math.floor(Math.random() * colors.length)];
}
}
// Add antenna/spire details for Istanbul futuristic skyline
if (Math.random() > 0.4) {
var antenna = self.attachAsset('neon_light', {
anchorX: 0.5,
anchorY: 1.0
});
antenna.x = 0;
antenna.y = -towerGraphics.height - 20;
antenna.scaleX = 0.3;
antenna.scaleY = 3;
antenna.tint = 0xff0000; // Red antenna light
}
self.update = function () {
self.x += self.speed;
};
return self;
});
var TurkishFlag = Container.expand(function () {
var self = Container.call(this);
var flagGraphics = self.attachAsset('turkish_flag', {
anchorX: 0.5,
anchorY: 0.5
});
var moon = self.attachAsset('flag_moon', {
anchorX: 0.5,
anchorY: 0.5
});
var star = self.attachAsset('flag_star', {
anchorX: 0.5,
anchorY: 0.5
});
moon.x = -15;
moon.y = 0;
star.x = -5;
star.y = 0;
star.rotation = 0.785; // 45 degrees
self.waveTimer = 0;
self.update = function () {
self.waveTimer += 0.1;
flagGraphics.skew.x = Math.sin(self.waveTimer) * 0.05;
};
return self;
});
var Turtle = Container.expand(function () {
var self = Container.call(this);
var turtleGraphics = self.attachAsset('turtle', {
anchorX: 0.5,
anchorY: 1.0
});
self.speed = -8;
self.groundY = 2532;
self.update = function () {
self.x += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
// Futuristic theme assets
// Game variables
var gameSpeed = 8;
var spawnTimer = 0;
var difficultyTimer = 0;
var distance = 0;
var scoreMultiplier = 1;
// Theme selection variables
var gameStarted = false;
var selectedTheme = null; // 'ancient' or 'futuristic'
var themeSelectionUI = null;
// Game objects
var player;
var ground;
var sun;
var turtles = [];
var coins = [];
var stars = [];
var pyramids = [];
var clouds = [];
// UI elements
var scoreTxt = new Text2('0', {
size: 100,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var distanceTxt = new Text2('0m', {
size: 80,
fill: 0xFFFFFF
});
distanceTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(distanceTxt);
// Initialize game elements
function initializeGame() {
// Initialize based on selected theme
if (selectedTheme === 'ancient') {
initializeAncientTheme();
} else if (selectedTheme === 'futuristic') {
initializeFuturisticTheme();
}
// Create player
player = game.addChild(new Player());
player.x = 300;
player.y = 2532;
// Start background music
LK.playMusic('bgmusic');
}
// Spawn enemy (turtle or robot based on theme)
function spawnTurtle() {
if (selectedTheme === 'ancient') {
var turtle = new Turtle();
turtle.x = 2200;
turtle.y = 2532;
turtle.speed = -(gameSpeed + Math.random() * 4);
turtles.push(turtle);
game.addChild(turtle);
} else if (selectedTheme === 'futuristic') {
var robot = new Robot();
robot.x = 2200;
robot.y = 2532;
robot.speed = -(gameSpeed + Math.random() * 4);
turtles.push(robot); // Reuse turtles array for robots
game.addChild(robot);
}
}
// Spawn coin
function spawnCoin() {
var coin = new Coin();
coin.x = 2200;
coin.y = 2400 - Math.random() * 300;
coin.speed = -gameSpeed;
coins.push(coin);
game.addChild(coin);
}
// Spawn star
function spawnStar() {
var star = new Star();
star.x = 2200;
star.y = 2300 - Math.random() * 200;
star.speed = -gameSpeed;
stars.push(star);
game.addChild(star);
}
// Spawn background structure (pyramid or tower based on theme)
function spawnPyramid() {
if (selectedTheme === 'ancient') {
var pyramid = new Pyramid();
pyramid.x = 2200;
pyramid.y = 2732;
pyramids.push(pyramid);
game.addChild(pyramid);
} else if (selectedTheme === 'futuristic') {
var tower = new Tower();
tower.x = 2200;
tower.y = 2732;
pyramids.push(tower); // Reuse pyramids array for towers
game.addChild(tower);
}
}
// Touch controls
game.down = function (x, y, obj) {
if (player && gameStarted) {
player.jump();
}
};
// Main game loop
game.update = function () {
// Only run game logic if game has started
if (!gameStarted) return;
// Update distance
distance += gameSpeed / 10;
distanceTxt.setText(Math.floor(distance) + 'm');
// Increase difficulty over time
difficultyTimer++;
if (difficultyTimer % 1800 === 0) {
// Every 30 seconds
gameSpeed += 0.5;
}
// Spawn enemies and collectibles
spawnTimer++;
// Spawn turtles
if (spawnTimer % 120 === 0) {
spawnTurtle();
}
// Spawn coins
if (spawnTimer % 180 === 0) {
spawnCoin();
}
// Spawn stars (less frequent)
if (spawnTimer % 480 === 0) {
spawnStar();
}
// Spawn pyramids for background
if (spawnTimer % 350 === 0) {
spawnPyramid();
}
// Update and check turtles
for (var i = turtles.length - 1; i >= 0; i--) {
var turtle = turtles[i];
// Remove if off screen
if (turtle.x < -100) {
turtle.destroy();
turtles.splice(i, 1);
continue;
}
// Check collision with player
if (turtle.intersects(player)) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
// Update and check coins
for (var i = coins.length - 1; i >= 0; i--) {
var coin = coins[i];
// Remove if off screen
if (coin.x < -100) {
coin.destroy();
coins.splice(i, 1);
continue;
}
// Check collection
if (coin.intersects(player)) {
LK.setScore(LK.getScore() + coin.value * scoreMultiplier);
scoreTxt.setText(LK.getScore());
LK.getSound('coin').play();
coin.destroy();
coins.splice(i, 1);
}
}
// Update and check stars
for (var i = stars.length - 1; i >= 0; i--) {
var star = stars[i];
// Remove if off screen
if (star.x < -100) {
star.destroy();
stars.splice(i, 1);
continue;
}
// Check collection
if (star.intersects(player)) {
LK.setScore(LK.getScore() + star.value * scoreMultiplier);
scoreTxt.setText(LK.getScore());
scoreMultiplier += 0.1;
LK.getSound('star').play();
LK.effects.flashObject(star, 0xFFFFFF, 500);
star.destroy();
stars.splice(i, 1);
}
}
// Update and cleanup pyramids
for (var i = pyramids.length - 1; i >= 0; i--) {
var pyramid = pyramids[i];
if (pyramid.x < -400) {
pyramid.destroy();
pyramids.splice(i, 1);
}
}
// Update and cleanup clouds/stars
for (var i = clouds.length - 1; i >= 0; i--) {
var cloud = clouds[i];
if (cloud.x < -150) {
cloud.destroy();
clouds.splice(i, 1);
// Spawn new cloud or star based on theme
if (selectedTheme === 'ancient') {
var newCloud = new Cloud();
newCloud.x = 2100 + Math.random() * 200;
newCloud.y = Math.random() * 600 + 200;
clouds.push(newCloud);
game.addChild(newCloud);
} else if (selectedTheme === 'futuristic') {
var newStar = new BackgroundStar();
newStar.x = 2100 + Math.random() * 200;
newStar.y = Math.random() * 1000 + 200;
clouds.push(newStar);
game.addChild(newStar);
}
}
}
// Add distance to score
LK.setScore(LK.getScore() + Math.floor(gameSpeed / 10));
scoreTxt.setText(LK.getScore());
// Check victory condition
if (LK.getScore() >= 500) {
// Victory celebration with tween animations
tween(player, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 500,
easing: tween.bounceOut
});
tween(player, {
rotation: Math.PI * 2
}, {
duration: 1000,
easing: tween.easeInOut
});
// Flash screen with victory colors
LK.effects.flashScreen(0x00ff00, 1500);
// Animate score text celebration
tween(scoreTxt, {
scaleX: 2,
scaleY: 2
}, {
duration: 800,
easing: tween.elasticOut
});
tween(scoreTxt, {
rotation: 0.3
}, {
duration: 300,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(scoreTxt, {
rotation: -0.3
}, {
duration: 300,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(scoreTxt, {
rotation: 0
}, {
duration: 300,
easing: tween.easeInOut
});
}
});
}
});
// Create confetti effect by animating multiple coins and stars as confetti
for (var confettiIndex = 0; confettiIndex < 20; confettiIndex++) {
var confettiCoin = new Coin();
confettiCoin.x = 1024 + (Math.random() - 0.5) * 400;
confettiCoin.y = 1000;
game.addChild(confettiCoin);
tween(confettiCoin, {
x: confettiCoin.x + (Math.random() - 0.5) * 800,
y: confettiCoin.y + Math.random() * 800 + 400,
scaleX: 2 + Math.random(),
scaleY: 2 + Math.random(),
rotation: Math.PI * (4 + Math.random() * 4)
}, {
duration: 1500 + Math.random() * 1000,
easing: tween.bounceOut
});
}
for (var confettiIndex = 0; confettiIndex < 15; confettiIndex++) {
var confettiStar = new Star();
confettiStar.x = 1024 + (Math.random() - 0.5) * 600;
confettiStar.y = 800;
game.addChild(confettiStar);
tween(confettiStar, {
x: confettiStar.x + (Math.random() - 0.5) * 1000,
y: confettiStar.y + Math.random() * 1000 + 600,
scaleX: 3 + Math.random() * 2,
scaleY: 3 + Math.random() * 2,
rotation: Math.PI * (6 + Math.random() * 6)
}, {
duration: 2000 + Math.random() * 1000,
easing: tween.elasticOut
});
}
// Animate all remaining coins and stars
for (var i = 0; i < coins.length; i++) {
var coin = coins[i];
tween(coin, {
scaleX: 2,
scaleY: 2,
rotation: Math.PI * 4
}, {
duration: 1000,
easing: tween.bounceOut
});
}
for (var i = 0; i < stars.length; i++) {
var star = stars[i];
tween(star, {
scaleX: 3,
scaleY: 3,
rotation: Math.PI * 6
}, {
duration: 1200,
easing: tween.elasticOut
});
}
// Show victory after animations
LK.setTimeout(function () {
LK.showYouWin();
}, 2000);
return; // Stop game loop
}
};
// Create theme selection screen
function createThemeSelection() {
// Create selection container
themeSelectionUI = game.addChild(new Container());
// Title
var titleTxt = new Text2('TEMA SEÇ / CHOOSE THEME', {
size: 120,
fill: 0x000000
});
titleTxt.anchor.set(0.5, 0.5);
titleTxt.x = 1024;
titleTxt.y = 800;
themeSelectionUI.addChild(titleTxt);
// Ancient theme button
var ancientBtn = themeSelectionUI.addChild(new Container());
var ancientBg = ancientBtn.attachAsset('pyramid1', {
anchorX: 0.5,
anchorY: 0.5
});
var ancientTxt = new Text2('M.Ö 3000', {
size: 80,
fill: 0x000000
});
ancientTxt.anchor.set(0.5, 0.5);
ancientBtn.addChild(ancientTxt);
ancientBtn.x = 600;
ancientBtn.y = 1400;
// Futuristic theme button
var futuristicBtn = themeSelectionUI.addChild(new Container());
var futuristicBg = futuristicBtn.attachAsset('tower1', {
anchorX: 0.5,
anchorY: 0.5
});
var futuristicTxt = new Text2('2071', {
size: 70,
fill: 0x00ffff
});
futuristicTxt.anchor.set(0.5, 0.5);
futuristicBtn.addChild(futuristicTxt);
futuristicBtn.x = 1448;
futuristicBtn.y = 1400;
// Event handlers
ancientBtn.down = function () {
selectedTheme = 'ancient';
startGameWithTheme();
};
futuristicBtn.down = function () {
selectedTheme = 'futuristic';
startGameWithTheme();
};
}
// Start game with selected theme
function startGameWithTheme() {
if (themeSelectionUI) {
themeSelectionUI.destroy();
themeSelectionUI = null;
}
gameStarted = true;
initializeGame();
}
// Modified initialization for themes
function initializeAncientTheme() {
// Set daytime background
game.setBackgroundColor(0x87ceeb);
// Create sun
sun = game.addChild(LK.getAsset('sun', {
anchorX: 0.5,
anchorY: 0.5
}));
sun.x = 1700;
sun.y = 400;
// Create background clouds
for (var i = 0; i < 15; i++) {
var cloud = new Cloud();
cloud.x = Math.random() * 2500;
cloud.y = Math.random() * 600 + 200;
clouds.push(cloud);
game.addChild(cloud);
}
// Create initial pyramids
for (var i = 0; i < 8; i++) {
var pyramid = new Pyramid();
pyramid.x = i * 300 + Math.random() * 100;
pyramid.y = 2732;
pyramids.push(pyramid);
game.addChild(pyramid);
}
// Create ground
ground = game.addChild(LK.getAsset('ground', {
anchorX: 0,
anchorY: 1
}));
ground.x = 0;
ground.y = 2732;
}
function initializeFuturisticTheme() {
// Set Istanbul night background - dark night sky
game.setBackgroundColor(0x0a0a1a);
// Create large Turkish moon and star symbol in the sky - prominent position
var moonSymbol = game.addChild(LK.getAsset('flag_moon', {
anchorX: 0.5,
anchorY: 0.5
}));
moonSymbol.x = 1600;
moonSymbol.y = 400;
moonSymbol.scaleX = 20; // Make moon large and prominent
moonSymbol.scaleY = 20;
moonSymbol.tint = 0xffffff; // Bright white moon
var starSymbol = game.addChild(LK.getAsset('flag_star', {
anchorX: 0.5,
anchorY: 0.5
}));
starSymbol.x = 1750;
starSymbol.y = 400;
starSymbol.scaleX = 15; // Large star
starSymbol.scaleY = 15;
starSymbol.rotation = 0.785; // 45 degrees
starSymbol.tint = 0xffffff; // Bright white star
// Create background stars for night Istanbul skyline
for (var i = 0; i < 120; i++) {
var star = new BackgroundStar();
star.x = Math.random() * 2500;
star.y = Math.random() * 800 + 100;
clouds.push(star); // Reuse clouds array for stars
game.addChild(star);
}
// Create initial futuristic Istanbul towers with more variety
for (var i = 0; i < 15; i++) {
var tower = new Tower();
tower.x = i * 150 + Math.random() * 80;
tower.y = 2732;
// Make some towers taller for Istanbul skyline effect
if (Math.random() > 0.3) {
tower.scaleY = 1.3 + Math.random() * 1.2;
}
pyramids.push(tower); // Reuse pyramids array for towers
game.addChild(tower);
}
// Create futuristic Istanbul ground with neon effects
ground = game.addChild(LK.getAsset('ground', {
anchorX: 0,
anchorY: 1
}));
ground.x = 0;
ground.y = 2732;
ground.tint = 0x1a1a2e; // Dark futuristic Istanbul ground with blue tint
}
// Create theme selection screen instead of initializing game
createThemeSelection(); ===================================================================
--- original.js
+++ change.js
@@ -268,10 +268,10 @@
/****
* Game Code
****/
-// Game variables
// Futuristic theme assets
+// Game variables
var gameSpeed = 8;
var spawnTimer = 0;
var difficultyTimer = 0;
var distance = 0;
@@ -493,9 +493,9 @@
// Add distance to score
LK.setScore(LK.getScore() + Math.floor(gameSpeed / 10));
scoreTxt.setText(LK.getScore());
// Check victory condition
- if (LK.getScore() >= 100) {
+ if (LK.getScore() >= 500) {
// Victory celebration with tween animations
tween(player, {
scaleX: 1.5,
scaleY: 1.5
@@ -540,8 +540,41 @@
}
});
}
});
+ // Create confetti effect by animating multiple coins and stars as confetti
+ for (var confettiIndex = 0; confettiIndex < 20; confettiIndex++) {
+ var confettiCoin = new Coin();
+ confettiCoin.x = 1024 + (Math.random() - 0.5) * 400;
+ confettiCoin.y = 1000;
+ game.addChild(confettiCoin);
+ tween(confettiCoin, {
+ x: confettiCoin.x + (Math.random() - 0.5) * 800,
+ y: confettiCoin.y + Math.random() * 800 + 400,
+ scaleX: 2 + Math.random(),
+ scaleY: 2 + Math.random(),
+ rotation: Math.PI * (4 + Math.random() * 4)
+ }, {
+ duration: 1500 + Math.random() * 1000,
+ easing: tween.bounceOut
+ });
+ }
+ for (var confettiIndex = 0; confettiIndex < 15; confettiIndex++) {
+ var confettiStar = new Star();
+ confettiStar.x = 1024 + (Math.random() - 0.5) * 600;
+ confettiStar.y = 800;
+ game.addChild(confettiStar);
+ tween(confettiStar, {
+ x: confettiStar.x + (Math.random() - 0.5) * 1000,
+ y: confettiStar.y + Math.random() * 1000 + 600,
+ scaleX: 3 + Math.random() * 2,
+ scaleY: 3 + Math.random() * 2,
+ rotation: Math.PI * (6 + Math.random() * 6)
+ }, {
+ duration: 2000 + Math.random() * 1000,
+ easing: tween.elasticOut
+ });
+ }
// Animate all remaining coins and stars
for (var i = 0; i < coins.length; i++) {
var coin = coins[i];
tween(coin, {
@@ -589,9 +622,9 @@
var ancientBg = ancientBtn.attachAsset('pyramid1', {
anchorX: 0.5,
anchorY: 0.5
});
- var ancientTxt = new Text2('M.Ö. 3000\nANTİK MISIR', {
+ var ancientTxt = new Text2('M.Ö 3000', {
size: 80,
fill: 0x000000
});
ancientTxt.anchor.set(0.5, 0.5);
@@ -603,9 +636,9 @@
var futuristicBg = futuristicBtn.attachAsset('tower1', {
anchorX: 0.5,
anchorY: 0.5
});
- var futuristicTxt = new Text2('2071\nİSTANBUL\nGELECEK ŞEHRİ', {
+ var futuristicTxt = new Text2('2071', {
size: 70,
fill: 0x00ffff
});
futuristicTxt.anchor.set(0.5, 0.5);