/**** 
* Classes
****/ 
/**** 
* Character: Dokunulduğunda zıplar.
****/ 
var Character = Container.expand(function () {
	var self = Container.call(this);
	// Preload both character and characteranim assets, keep animAsset hidden initially
	self.mainAsset = self.attachAsset('character', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.animAsset = self.attachAsset('characteranim', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.animAsset.visible = false;
	self.zIndex = 4;
	self.velocityY = 0;
	self.gravity = 0.3;
	self.jumpStrength = -12.1;
	self.width = 350;
	self.height = 300;
	// Animation gösterme fonksiyonu
	self.showAnimation = function () {
		self.mainAsset.visible = false;
		self.animAsset.visible = true;
		LK.setTimeout(function () {
			if (self.mainAsset && self.animAsset) {
				self.mainAsset.visible = true;
				self.animAsset.visible = false;
			}
		}, 100);
	};
	self.update = function () {
		if (gameStarted && !gameOver) {
			self.velocityY += self.gravity;
			self.y += self.velocityY;
			if (self.y > groundY - 100) {
				self.y = groundY - 100;
				self.velocityY = 0;
				if (!self.intersects(underscoreAsset) && !self.preventDeath) {
					gameOver = true;
					endGame();
				}
			}
			var characterLeft = self.x - self.width / 2;
			var characterRight = self.x + self.width / 2;
			var characterTop = self.y - self.height / 2;
			var characterBottom = self.y + self.height / 2;
			if (characterLeft + self.width / 2 < 0 || characterRight - self.width / 2 > screenRight || characterTop + self.height / 2 < 0 || characterBottom - self.height / 2 > groundY) {
				gameOver = true;
				endGame();
			}
			game.children.forEach(function (child) {
				if (child instanceof Tube) {
					var tubeLeft = child.x - child.bottomTube.width / 2;
					var tubeRight = child.x + child.bottomTube.width / 2;
					var safeGapLowerEdge = child.y - child.bottomTube.height;
					var safeGapUpperEdge = -gapOffset + child.topTube.height;
					if (self.x + self.width / 2 > tubeLeft && self.x - self.width / 2 < tubeRight) {
						if (self.y < safeGapUpperEdge || self.y > safeGapLowerEdge) {
							if (!self.intersects(underscoreAsset) && !self.preventDeath) {
								gameOver = true;
								endGame();
							}
						}
					}
				} else if (child instanceof Tree) {
					var treeLeft = child.x - child.bottomTree.width / 2;
					var treeRight = child.x + child.bottomTree.width / 2;
					var safeGapLowerEdge = child.y - child.bottomTree.height;
					var safeGapUpperEdge = -gapOffset + child.topTree.height;
					if (self.x + self.width / 2 > treeLeft && self.x - self.width / 2 < treeRight) {
						if (self.y < safeGapUpperEdge || self.y > safeGapLowerEdge) {
							if (!self.intersects(underscoreAsset) && !self.preventTreeDeath) {
								gameOver = true;
								endGame();
							}
						}
					}
				}
			});
		}
	};
	self.jump = function () {
		if (!gameOver && gameStarted) {
			self.velocityY = self.jumpStrength;
			LK.getSound('wingeffect').play();
			// Karakter zıpladığında background ve bg2'ye de jump etkisi uyguluyoruz:
			background.velocityY = background.jumpStrength;
			bg2.velocityY = bg2.jumpStrength;
			background3DContainer.velocityY = background3DContainer.jumpStrength;
			bgEffect3DContainer.velocityY = bgEffect3DContainer.jumpStrength;
			// Animation göster
			self.showAnimation();
		}
	};
	return self;
});
/**** 
* GameOverText class
****/ 
var GameOverText = Container.expand(function () {
	var self = Container.call(this);
	self.text = new Text2("GAME OVER", {
		fontFamily: "Arial",
		fontSize: 2250,
		fill: 0xFF0000,
		align: "center",
		fontWeight: "bold"
	});
	self.text.anchorX = 0.5;
	self.text.anchorY = 0.5;
	self.addChild(self.text);
	self.zIndex = 100;
	return self;
});
/**** 
* Tree class: Üst ve alt ağaç oluşturma
****/ 
var Tree = Container.expand(function () {
	var self = Container.call(this);
	var bottomUnit = Math.floor(Math.random() * 8) + 1;
	var topUnit = 9 - bottomUnit;
	var unitSize = groundY / totalUnits;
	var bottomHeight = bottomUnit * unitSize;
	var topHeight = topUnit * unitSize;
	self.y = groundY;
	self.bottomTree = self.attachAsset('tree', {
		anchorX: 0.5,
		anchorY: 1,
		width: 321,
		//{Y} // Increased by 7%
		height: bottomHeight,
		flipY: false
	});
	self.topTree = self.attachAsset('tree', {
		anchorX: 0.5,
		anchorY: 0.5,
		width: 321,
		//{14} // Increased by 7%
		height: topHeight,
		flipY: false
	});
	self.topTree.rotation = Math.PI;
	self.topTree.y = -groundY - gapOffset + topHeight / 2;
	self.zIndex = 1;
	self.x = 2048 + 800;
	self.velocityX = -3.6;
	self.spawned = false;
	self.prevX = self.x;
	self.update = function () {
		if (gameStarted && !gameOver) {
			self.x += self.velocityX;
			if (!self.spawned && self.prevX > objectSpawnThreshold && self.x <= objectSpawnThreshold) {
				self.spawned = true;
				var newTube = new Tube();
				newTube.x = 2048 + 640;
				game.addChild(newTube);
				lastSpawner = newTube;
			}
			self.prevX = self.x;
			if (!self.passed && character.x > self.x + self.bottomTree.width / 2) {
				self.passed = true;
				updateScore();
			}
		}
	};
	return self;
});
/**** 
* Tube class: Üst ve alt boru oluşturma
****/ 
var Tube = Container.expand(function () {
	var self = Container.call(this);
	var bottomUnit = Math.floor(Math.random() * 8) + 1;
	var topUnit = 9 - bottomUnit;
	var unitSize = groundY / totalUnits;
	var bottomHeight = bottomUnit * unitSize;
	var topHeight = topUnit * unitSize;
	self.y = groundY;
	self.bottomTube = self.attachAsset('tube', {
		anchorX: 0.5,
		anchorY: 1,
		width: 285,
		//{1C} // 5% thinner
		height: bottomHeight,
		flipY: false
	});
	self.topTube = self.attachAsset('tube', {
		anchorX: 0.5,
		anchorY: 0.5,
		width: 285,
		//{1I} // 5% thinner
		height: topHeight,
		flipY: false
	});
	self.topTube.rotation = Math.PI;
	self.topTube.y = -groundY - gapOffset + topHeight / 2;
	self.zIndex = 1;
	self.x = 2048 + 800;
	self.velocityX = -3.6;
	self.spawned = false;
	self.prevX = self.x;
	self.update = function () {
		if (gameStarted && !gameOver) {
			self.x += self.velocityX;
			if (self.velocityX === 0) {
				background.velocityX = 0;
				bg2.velocityX = 0;
			}
			if (!self.spawned && self.prevX > objectSpawnThreshold && self.x <= objectSpawnThreshold) {
				self.spawned = true;
				var newTree = new Tree();
				newTree.x = 2048 + 640;
				game.addChild(newTree);
				lastSpawner = newTree;
			}
			self.prevX = self.x;
			if (!self.passed && character.x > self.x + self.bottomTube.width / 2) {
				self.passed = true;
				updateScore();
			}
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000
});
/**** 
* Game Code
****/ 
/**** 
* Global Variables & Helper Functions
****/ 
var groundY = 2732;
var menuOpen = true;
var volumeOn = true;
var records = [];
var gapOffset = 400;
var gameStarted = false;
var gameOver = false;
var gameWait = false;
var screenRight = 2048;
var totalUnits = 10;
var tubeSpawnThreshold, treeSpawnThreshold;
var lastSpawner = null;
var gameOverText = null;
var passCounter = 0;
var lastScore = 0;
var backgroundScrollSpeed = 7.2;
var containerScrollSpeed = 5; // Tanımlandı
var underscoreTouchCount = 0;
var flipped = false;
function centerX() {
	return 2048 / 2;
}
function centerY() {
	return groundY / 2;
}
var objectSpawnThreshold = centerX() + (screenRight - centerX()) / 2;
// Örnek container oluşturuluyor
var myContainer = new Container();
myContainer.x = centerX(); // Ekranın yatay ortasında
myContainer.y = 1900; // Başlangıçta y = 2000 (örneğin en üst sınır)
// Sabit yukarı doğru hareket hızı (update fonksiyonunda uygulanacak)
var containerUpwardSpeed = -0.5;
// Her tıklamada ek olarak uygulanacak aşağı doğru kayma miktarı
var extraDownDelta = 50;
// Container'ın update fonksiyonu: her frame sabit hızda aşağıya doğru hareket eder
myContainer.update = function () {
	// Oyun başlamışsa yukarı doğru hareket et
	if (gameStarted) {
		this.y += containerUpwardSpeed;
		// Minimum y sınırını 100 olarak ayarlıyoruz
		if (this.y < 100) {
			this.y = 100;
		}
	}
};
// Container'a tıklama (touch/down) olayı ekliyoruz
myContainer.on('down', function () {
	// Tıklamada ekstra aşağı kayma ekliyoruz
	this.y += extraDownDelta;
	if (this.y > 2600) {
		this.y = 2600;
	}
});
// Oluşturulan container'ı oyuna ekleyelim
game.addChild(myContainer);
var menuContainer = new Container();
menuContainer.zIndex = 200;
var menuBackground = LK.getAsset('menu_background', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: centerX(),
	y: centerY() + 625
});
menuBackground.zIndex = 1000;
menuContainer.addChild(menuBackground);
var menuBackgroundPart = LK.getAsset('menu_background_part', {
	anchorX: 0.5,
	anchorY: 0.19,
	x: centerX() - 1030,
	y: centerY() - 2866 - 300 // Raised by 300 pixels
});
menuBackgroundPart.zIndex = menuBackground.zIndex + 1;
menuBackground.addChild(menuBackgroundPart);
var playButton = LK.getAsset('button_play', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: centerX() - 20,
	y: centerY() + 205
});
playButton.visible = false;
menuContainer.addChild(playButton);
var playLabel = new Text2("PLAY", {
	fontFamily: "Arial",
	fontSize: 630.25 * 1.1 * 1.08 * 1.5,
	fill: 0xffffff
});
playLabel.anchorX = 0.5;
playLabel.anchorY = 0.5;
playLabel.x = playButton.x - 45;
playLabel.y = playButton.y - -25;
playLabel.visible = true;
playLabel.zIndex = 1000;
menuContainer.addChild(playLabel);
var volumeButton = LK.getAsset('button_volume', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: centerX() - 28,
	y: centerY() + 320
});
volumeButton.visible = false;
menuContainer.addChild(volumeButton);
var volumeLabel = new Text2("VOLUME", {
	fontFamily: "Arial",
	fontSize: 63.25 * 1.1 * 1.05 * 1.05 * 1.05 * 1.5,
	fill: 0xffffff
});
volumeLabel.anchorX = 0.5;
volumeLabel.anchorY = 0.5;
volumeLabel.x = volumeButton.x - 58;
volumeLabel.y = volumeButton.y + 30;
volumeLabel.visible = true;
volumeLabel.zIndex = 1000;
menuContainer.addChild(volumeLabel);
var creditsButton = LK.getAsset('button_credits', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: centerX() - 30,
	y: centerY() + 429
});
creditsButton.visible = false;
menuContainer.addChild(creditsButton);
var creditsLabel = new Text2("CREDITS", {
	fontFamily: "Arial",
	fontSize: 630.25 * 1.05 * 1.05 * 1.05 * 1.5,
	fill: 0xffffff
});
creditsLabel.anchorX = 0.5;
creditsLabel.anchorY = 0.5;
creditsLabel.x = creditsButton.x - 60;
creditsLabel.y = creditsButton.y + 28;
creditsLabel.visible = true;
creditsLabel.zIndex = 1000;
menuContainer.addChild(creditsLabel);
var recordsButton = LK.getAsset('button_records', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: centerX() - 30,
	y: centerY() + 540
});
recordsButton.visible = false;
menuContainer.addChild(recordsButton);
var recordsLabel = new Text2("RECORDS", {
	fontFamily: "Arial",
	fontSize: 150.25 * 1.05 * 1.05 * 1.03 * 1.05 * 1.5,
	fill: 0xffffff
});
recordsLabel.anchorX = 0.5;
recordsLabel.anchorY = 0.5;
recordsLabel.x = recordsButton.x - 67;
recordsLabel.y = recordsButton.y + 28;
recordsLabel.visible = true;
recordsLabel.zIndex = 1000;
menuContainer.addChild(recordsLabel);
var counterText = new Text2('0', {
	size: 124.2,
	fill: 0xFFFFFF
});
counterText.anchor.set(0, 0);
counterText.x = 1315;
counterText.y = 15;
LK.gui.topLeft.addChild(counterText);
var background = LK.getAsset('background', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: centerX(),
	y: groundY / 2
});
background.zIndex = 0;
background.velocityY = 0;
background.gravity = 0.033; // 0'a çok yakın bir değer
background.jumpStrength = 0.66; // 0'dan daha uzak ama azıcık
game.addChild(background);
var bg2 = LK.getAsset('bg2', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: centerX() + 2807.2,
	y: groundY / 2
});
bg2.zIndex = 0;
bg2.velocityY = 0;
bg2.gravity = 0.033;
bg2.jumpStrength = 0.66;
game.addChild(bg2);
var sky = LK.getAsset('sky', {
	anchorX: 0.5,
	anchorY: 0,
	x: centerX(),
	y: 0
});
sky.zIndex = 2;
game.addChild(sky);
var groundAsset = LK.getAsset('ground', {
	anchorX: 0.5,
	anchorY: 0.4,
	x: centerX(),
	y: groundY - -25
});
groundAsset.zIndex = 4.1;
game.addChild(groundAsset);
var ground2Asset = LK.getAsset('ground2', {
	anchorX: 0.5,
	anchorY: 0.05,
	x: centerX(),
	y: groundY - 40
});
ground2Asset.zIndex = 0.5;
game.addChild(ground2Asset);
function updateScore() {
	passCounter++;
	counterText.setText(passCounter);
	if (passCounter > 9) {
		counterText.x = 1315 - 25; // Move 25 pixels to the left
	} else {
		counterText.x = 1315; // Reset to original position
	}
}
// Karakter bağlı 3D arka plan ve efekt – başlangıçta container y = 2400 (en alt sınır)
var background3D = LK.getAsset('3dlikebackground', {
	anchorX: 0.5,
	anchorY: 0.5
});
var background3DContainer = new Container();
background3DContainer.offsetY = 0;
background3DContainer.velocityY = 0;
background3DContainer.gravity = 0.3 * 0.178; //0.6 Ay atmosferi benzeri yer çekimi
background3DContainer.jumpStrength = 2.15; // Daha hafif yer çekimi için zıplama kuvveti
background3DContainer.isInverted = false;
background3DContainer.addChild(background3D);
background3DContainer.x = centerX();
// Başlangıçta container'lar en altta (2400)
background3DContainer.y = 2350;
// Container update: oyun başladığında gravity uygulanır, ve y değeri 2000 ile 2400 arasında clamp edilir.
background3DContainer.update = function () {
	if (!gameStarted) {
		return;
	}
	this.velocityY -= this.gravity;
	this.y += this.velocityY;
	this.y = Math.max(1900, Math.min(this.y, 2900));
};
game.addChild(background3DContainer);
var bgEffect3D = LK.getAsset('3dbgeffect', {
	anchorX: 0.5,
	anchorY: 0.5
});
var bgEffect3DContainer = new Container();
bgEffect3DContainer.offsetY = 0;
bgEffect3DContainer.velocityY = 0;
bgEffect3DContainer.gravity = 0.3 * 0.178; //0.6 Ay atmosferi benzeri yer çekimi
bgEffect3DContainer.jumpStrength = 2.15; // Daha hafif yer çekimi için zıplama kuvveti
bgEffect3DContainer.isInverted = false;
bgEffect3DContainer.addChild(bgEffect3D);
bgEffect3DContainer.x = background3DContainer.x + 2807;
bgEffect3DContainer.y = 2350;
bgEffect3DContainer.update = function () {
	if (!gameStarted) {
		return;
	}
	this.velocityY -= this.gravity;
	this.y += this.velocityY;
	this.y = Math.max(1900, Math.min(this.y, 2900));
};
game.addChild(bgEffect3DContainer);
var underscoreAsset = LK.getAsset('_', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: centerX() + 1000,
	y: centerY() - 1500 // Moved 500 pixels up 
});
underscoreAsset.zIndex = 15000;
game.addChild(underscoreAsset);
underscoreAsset.on('down', function () {
	underscoreTouchCount++;
	if (underscoreTouchCount >= 5) {
		character.preventDeath = true;
		character.preventTreeDeath = true;
	}
});
game.children.sort(function (a, b) {
	return (a.zIndex || 0) - (b.zIndex || 0);
});
// Create and add the character
var character = game.addChild(new Character());
character.x = centerX();
character.y = centerY();
// No longer needed: showCharacterAnimOnce is now handled by Character.showAnimation
// Menü konumunu ayarla
menuContainer.y += 100;
game.addChild(menuContainer);
/**** 
* Helper Functions: Credits, Volume & Records
****/ 
function createCommonCloseElements(modalWidth, modalHeight) {
	var closeLabel = LK.getAsset('justX', {
		anchorX: 0.5,
		anchorY: 0.5,
		zIndex: 100000,
		x: -9,
		y: 6
	});
	var radius = 50;
	var closeButton = LK.getAsset('button_close', {
		anchorX: 0.5,
		anchorY: 0.5,
		width: radius * 2.3 * 1.2,
		height: radius * 2.3 * 1.2
	});
	closeButton.zIndex = 10000;
	closeButton.x = 0;
	closeButton.y = 0;
	closeButton.addChild(closeLabel);
	return closeButton;
}
function showCredits() {
	menuOpen = false;
	var creditsContainer = new Container();
	creditsContainer.zIndex = 300;
	var modalWidth = 1500,
		modalHeight = 2200;
	var bg = LK.getAsset('second_menu', {
		anchorX: 0.5,
		anchorY: 0.5,
		width: modalWidth,
		height: modalHeight,
		color: 0x000000
	});
	bg.x = centerX();
	bg.y = centerY();
	creditsContainer.addChild(bg);
	var creditsText = new Text2("Game by\nMustafa Talha ŞEN", {
		fontFamily: "Arial",
		fontSize: 5000 * 1.03,
		fill: 0xffffff,
		align: "center"
	});
	creditsText.anchorX = 0.5;
	creditsText.anchorY = 0.5;
	creditsText.x = centerX() - 359;
	creditsText.y = centerY() - 800 + 40;
	creditsText.scale.set(3, 3);
	creditsContainer.addChild(creditsText);
	// Add ig:shantgame text 240px below the Game by text
	var igText = new Text2("ig:shantgame", {
		fontFamily: "Arial",
		fontSize: 5000 * 1.03,
		fill: 0xffffff,
		align: "center"
	});
	igText.anchorX = 0.5;
	igText.anchorY = 0.5;
	igText.x = creditsText.x + 70;
	igText.y = creditsText.y + 235;
	igText.scale.set(3, 3);
	creditsContainer.addChild(igText);
	game.addChild(creditsContainer);
	var closeButton = createCommonCloseElements(modalWidth, modalHeight);
	closeButton.x = bg.x + modalWidth / 2 - closeButton.width / 2 - 185;
	closeButton.y = bg.y - modalHeight / 2 + closeButton.height / 2 + 230;
	creditsContainer.addChild(closeButton);
	closeButton.on('down', function () {
		game.removeChild(creditsContainer);
		menuOpen = true;
		menuContainer.visible = true;
	});
}
function showVolume() {
	menuOpen = false;
	var volumeContainer = new Container();
	volumeContainer.zIndex = 300;
	var modalWidth = 1500,
		modalHeight = 2200;
	var bg = LK.getAsset('second_menu', {
		anchorX: 0.5,
		anchorY: 0.5,
		width: modalWidth,
		height: modalHeight,
		color: 0x000000
	});
	bg.x = centerX();
	bg.y = centerY();
	volumeContainer.addChild(bg);
	var currentMusicName = new Text2("Next Music", {
		fontFamily: "Arial",
		fontSize: 5000 * 1.103,
		fill: 0xffffff,
		align: "center"
	});
	currentMusicName.anchorX = 0.5;
	currentMusicName.anchorY = 0.5;
	currentMusicName.x = centerX() - 250;
	currentMusicName.y = centerY() - 650 + 40 - 300 + 100;
	currentMusicName.scale.set(3, 3);
	volumeContainer.addChild(currentMusicName);
	var musicButton = LK.getAsset('Musicbutton', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: centerX() - 280 + 250,
		y: centerY() - 350 + 40 - 150
	});
	musicButton.on('down', function () {
		playNextMusic();
	});
	volumeContainer.addChild(musicButton);
	game.addChild(volumeContainer);
	var closeButton = createCommonCloseElements(modalWidth, modalHeight);
	closeButton.x = bg.x + modalWidth / 2 - closeButton.width / 2 - 185;
	closeButton.y = bg.y - modalHeight / 2 + closeButton.height / 2 + 230;
	volumeContainer.addChild(closeButton);
	closeButton.on('down', function () {
		game.removeChild(volumeContainer);
		menuOpen = true;
		menuContainer.visible = true;
	});
}
function showRecords() {
	menuOpen = false;
	var recordsContainer = new Container();
	recordsContainer.zIndex = 300;
	var modalWidth = 1500,
		modalHeight = 2200;
	var bg = LK.getAsset('second_menu', {
		anchorX: 0.5,
		anchorY: 0.5,
		width: modalWidth,
		height: modalHeight,
		color: 0x000000
	});
	bg.x = centerX();
	bg.y = centerY();
	recordsContainer.addChild(bg);
	var recordsTextStr = "Top Scores:\n";
	for (var i = 0; i < records.length; i++) {
		recordsTextStr += i + 1 + ". " + records[i].score + " (Attempt " + records[i].attempt + ")\n";
	}
	if (records.length === 0) {
		recordsTextStr += "No records yet.";
	}
	recordsTextStr += "\nAttempts: " + records.length;
	recordsTextStr += "\nLast Score: " + lastScore;
	var recordsText = new Text2(recordsTextStr, {
		fontFamily: "Arial",
		fontSize: 5000 * 1.103,
		fill: 0xffffff,
		align: "center"
	});
	recordsText.anchorX = 0.5;
	recordsText.anchorY = 0.5;
	recordsText.x = centerX() - 280;
	recordsText.y = centerY() - 850 + 40;
	recordsText.scale.set(3, 3);
	recordsContainer.addChild(recordsText);
	game.addChild(recordsContainer);
	var closeButton = createCommonCloseElements(modalWidth, modalHeight);
	closeButton.x = bg.x + modalWidth / 2 - closeButton.width / 2 - 185;
	closeButton.y = bg.y - modalHeight / 2 + closeButton.height / 2 + 230;
	recordsContainer.addChild(closeButton);
	closeButton.on('down', function () {
		game.removeChild(recordsContainer);
		menuOpen = true;
		menuContainer.visible = true;
	});
}
/**** 
* End Game & Reset Functions
****/ 
function playNextMusic() {
	musicCycle++;
	if (musicCycle === 1) {
		LK.stopMusic();
		LK.playMusic(musicSequence[1]);
	} else if (musicCycle === 2) {
		LK.stopMusic();
		LK.playMusic(musicSequence[2]);
	} else if (musicCycle === 3) {
		LK.stopMusic();
	} else {
		musicCycle = 0;
		LK.stopMusic();
		LK.playMusic(musicSequence[0]);
	}
}
var musicSequence = ['m_1', 'M_2', 'M_3'];
var musicCycle = 0;
LK.playMusic(musicSequence[0]);
function endGame() {
	LK.effects.flashScreen(0xFF0000, 500);
	LK.getSound('deatheffect').play();
	character.velocityY = character.jumpStrength;
	character.update = function () {
		if (gameOver) {
			character.velocityY += character.gravity;
			character.y += character.velocityY;
			if (character.y > groundY + character.height) {
				character.y = groundY + character.height;
				character.velocityY = 0;
			}
		}
	};
	game.children.forEach(function (child) {
		if (child.velocityX) {
			child.velocityX = 0;
		}
		if (child === background || child === bg2) {
			LK.setTimeout(function () {
				child.velocityY = 0;
			}, 300);
		}
	});
	game.touchDisabled = true;
	lastScore = passCounter;
	records.push({
		score: passCounter,
		attempt: records.length + 1
	});
	records.sort(function (a, b) {
		return b.score - a.score;
	});
	if (records.length > 5) {
		records = records.slice(0, 5);
	}
	LK.setTimeout(function () {
		game.touchDisabled = false;
		menuOpen = true;
		menuContainer.visible = true;
		var startY = groundY + 100;
		var endY = centerY() - 1270;
		var animationDuration = 16.5 * 5 / 1.5;
		var startTime = Date.now();
		function animateMenu() {
			var currentTime = Date.now();
			var elapsedTime = currentTime - startTime;
			var progress = Math.min(elapsedTime / animationDuration, 1);
			menuContainer.y = startY + (endY - startY) * progress;
			if (progress < 1) {
				LK.setTimeout(animateMenu, 16);
			}
		}
		animateMenu();
	}, 1700);
	LK.setTimeout(function () {
		resetGame();
	}, 1750);
}
function resetGame() {
	if (gameOverText) {
		game.removeChild(gameOverText);
		gameOverText = null;
	}
	unflipWorld();
	var objectsToRemove = [];
	game.children.forEach(function (child) {
		if (child instanceof Tree || child instanceof Tube) {
			objectsToRemove.push(child);
		}
	});
	objectsToRemove.forEach(function (obj) {
		game.removeChild(obj);
	});
	game.removeChild(character);
	character = game.addChild(new Character());
	character.x = centerX();
	character.y = centerY();
	background.x = centerX();
	background.y = groundY / 2;
	bg2.x = centerX() + 2807.2;
	bg2.y = groundY / 2;
	background.velocityX = -3.6;
	bg2.velocityX = -3.6;
	bg2.scale.x = 1;
	gameStarted = false;
	gameOver = false;
	character.preventDeath = false;
	underscoreAsset.preventDeath = false;
	lastSpawner = null;
	passCounter = 0;
	underscoreTouchCount = 0;
	counterText.setText(passCounter);
	// Reset container'ların konumunu ve velocity değerlerini
	background3DContainer.y = 2350;
	bgEffect3DContainer.y = 2350;
	background3DContainer.velocityY = 0;
	bgEffect3DContainer.velocityY = 0;
}
/**** 
* Eliptik hit testi için yardımcı fonksiyon
****/ 
function checkEllipseHover(button, lx, ly) {
	var scaleFactorX = 1;
	var scaleFactorY = 0.53;
	var offsetY = 40;
	var dx = lx - button.x;
	var dy = ly - (button.y + offsetY);
	var rx = button.width / 2 * scaleFactorX;
	var ry = button.height / 2 * scaleFactorY;
	return dx * dx / (rx * rx) + dy * dy / (ry * ry) <= 1;
}
/**** 
* Fare hareketinde hover kontrolü
****/ 
game.move = function (x, y, obj) {
	if (!menuOpen) {
		return;
	}
	var localX = x - menuContainer.x;
	var localY = y - menuContainer.y;
	playButton.visible = checkEllipseHover(playButton, localX, localY);
	volumeButton.visible = checkEllipseHover(volumeButton, localX, localY);
	creditsButton.visible = checkEllipseHover(creditsButton, localX, localY);
	recordsButton.visible = checkEllipseHover(recordsButton, localX, localY);
};
/**** 
* Touch Event
****/ 
game.down = function (x, y, obj) {
	if (menuOpen) {
		var localX = x - menuContainer.x;
		var localY = y - menuContainer.y;
		if (checkEllipseHover(playButton, localX, localY)) {
			var _animateMenu = function animateMenu() {
				var currentTime = Date.now();
				var elapsedTime = currentTime - startTime;
				var progress = Math.min(elapsedTime / animationDuration, 1);
				menuContainer.y = startY + (endY - startY) * progress;
				if (progress < 1) {
					LK.setTimeout(_animateMenu, 1);
				} else {
					menuOpen = false;
					menuContainer.visible = false;
					gameWait = true;
				}
			};
			var animationDuration = 16.5 * 5 * 2 / 1.5;
			var startTime = Date.now();
			var startY = menuContainer.y;
			var endY = centerY() + 100;
			_animateMenu();
			return;
		} else if (checkEllipseHover(volumeButton, localX, localY)) {
			showVolume();
		} else if (checkEllipseHover(creditsButton, localX, localY)) {
			showCredits();
		} else if (checkEllipseHover(recordsButton, localX, localY)) {
			showRecords();
		}
		return;
	} else if (gameOver) {
		if (!game.touchDisabled) {
			menuOpen = true;
			menuContainer.visible = true;
			resetGame();
		}
	} else {
		if (gameWait) {
			gameWait = false;
			gameStarted = true;
			var initialTube = new Tube();
			game.addChild(initialTube);
			lastSpawner = initialTube;
			character.jump();
		} else {
			character.jump();
			character.showAnimation();
			// Reduce rotation change for less rotation on tap
			character.rotation = 0.04;
			LK.setTimeout(function () {
				character.rotation = 0;
			}, 200);
		}
	}
};
/**** 
* Game Loop
****/ 
game.update = function () {
	game.children.forEach(function (child) {
		if (child.update) {
			child.update();
		}
		if (child === background || child === bg2) {
			if (!gameOver && !menuOpen && gameStarted) {
				child.x -= 3.0;
				child.velocityY -= child.gravity;
				child.y += child.velocityY;
			}
			if (child.x < -2807.2 / 2) {
				child.x += 2807.2 * 2;
			}
		}
		if (child === background3DContainer || child === bgEffect3DContainer) {
			if (!gameOver && !menuOpen && gameStarted) {
				child.x -= containerScrollSpeed * 1.2;
			}
			if (child.x < -2807.2 / 2) {
				child.x += 2807.2 * 2;
			}
		}
	});
	game.children.sort(function (a, b) {
		return (a.zIndex || 0) - (b.zIndex || 0);
	});
};
function unflipWorld() {
	if (!flipped) {
		return;
	}
	flipped = false;
	character.gravity = 0;
	character.jumpStrength = 0;
	zoomEffect();
	LK.setTimeout(function () {
		character.gravity = 0.3;
		character.jumpStrength = -12;
	}, 300);
	background.scale.y *= -1;
	bg2.scale.y *= -1;
	sky.scale.y *= -1;
	groundAsset.scale.y *= -1;
	ground2Asset.scale.y *= -1;
}
function zoomEffect() {
	var originalScale = character.scale.x;
	character.scale.set(originalScale * 1.2);
	LK.setTimeout(function () {
		character.scale.set(originalScale);
	}, 300);
}
function flipWorld() {
	if (flipped) {
		return;
	}
	flipped = true;
	character.gravity = 0;
	character.jumpStrength = 0;
	zoomEffect();
	LK.setTimeout(function () {
		character.gravity = 0.3;
		character.jumpStrength = -12;
	}, 300);
	background.scale.y *= -1;
	bg2.scale.y *= -1;
	sky.scale.y *= -1;
	groundAsset.scale.y *= -1;
	ground2Asset.scale.y *= -1;
} /**** 
* Classes
****/ 
/**** 
* Character: Dokunulduğunda zıplar.
****/ 
var Character = Container.expand(function () {
	var self = Container.call(this);
	// Preload both character and characteranim assets, keep animAsset hidden initially
	self.mainAsset = self.attachAsset('character', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.animAsset = self.attachAsset('characteranim', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.animAsset.visible = false;
	self.zIndex = 4;
	self.velocityY = 0;
	self.gravity = 0.3;
	self.jumpStrength = -12.1;
	self.width = 350;
	self.height = 300;
	// Animation gösterme fonksiyonu
	self.showAnimation = function () {
		self.mainAsset.visible = false;
		self.animAsset.visible = true;
		LK.setTimeout(function () {
			if (self.mainAsset && self.animAsset) {
				self.mainAsset.visible = true;
				self.animAsset.visible = false;
			}
		}, 100);
	};
	self.update = function () {
		if (gameStarted && !gameOver) {
			self.velocityY += self.gravity;
			self.y += self.velocityY;
			if (self.y > groundY - 100) {
				self.y = groundY - 100;
				self.velocityY = 0;
				if (!self.intersects(underscoreAsset) && !self.preventDeath) {
					gameOver = true;
					endGame();
				}
			}
			var characterLeft = self.x - self.width / 2;
			var characterRight = self.x + self.width / 2;
			var characterTop = self.y - self.height / 2;
			var characterBottom = self.y + self.height / 2;
			if (characterLeft + self.width / 2 < 0 || characterRight - self.width / 2 > screenRight || characterTop + self.height / 2 < 0 || characterBottom - self.height / 2 > groundY) {
				gameOver = true;
				endGame();
			}
			game.children.forEach(function (child) {
				if (child instanceof Tube) {
					var tubeLeft = child.x - child.bottomTube.width / 2;
					var tubeRight = child.x + child.bottomTube.width / 2;
					var safeGapLowerEdge = child.y - child.bottomTube.height;
					var safeGapUpperEdge = -gapOffset + child.topTube.height;
					if (self.x + self.width / 2 > tubeLeft && self.x - self.width / 2 < tubeRight) {
						if (self.y < safeGapUpperEdge || self.y > safeGapLowerEdge) {
							if (!self.intersects(underscoreAsset) && !self.preventDeath) {
								gameOver = true;
								endGame();
							}
						}
					}
				} else if (child instanceof Tree) {
					var treeLeft = child.x - child.bottomTree.width / 2;
					var treeRight = child.x + child.bottomTree.width / 2;
					var safeGapLowerEdge = child.y - child.bottomTree.height;
					var safeGapUpperEdge = -gapOffset + child.topTree.height;
					if (self.x + self.width / 2 > treeLeft && self.x - self.width / 2 < treeRight) {
						if (self.y < safeGapUpperEdge || self.y > safeGapLowerEdge) {
							if (!self.intersects(underscoreAsset) && !self.preventTreeDeath) {
								gameOver = true;
								endGame();
							}
						}
					}
				}
			});
		}
	};
	self.jump = function () {
		if (!gameOver && gameStarted) {
			self.velocityY = self.jumpStrength;
			LK.getSound('wingeffect').play();
			// Karakter zıpladığında background ve bg2'ye de jump etkisi uyguluyoruz:
			background.velocityY = background.jumpStrength;
			bg2.velocityY = bg2.jumpStrength;
			background3DContainer.velocityY = background3DContainer.jumpStrength;
			bgEffect3DContainer.velocityY = bgEffect3DContainer.jumpStrength;
			// Animation göster
			self.showAnimation();
		}
	};
	return self;
});
/**** 
* GameOverText class
****/ 
var GameOverText = Container.expand(function () {
	var self = Container.call(this);
	self.text = new Text2("GAME OVER", {
		fontFamily: "Arial",
		fontSize: 2250,
		fill: 0xFF0000,
		align: "center",
		fontWeight: "bold"
	});
	self.text.anchorX = 0.5;
	self.text.anchorY = 0.5;
	self.addChild(self.text);
	self.zIndex = 100;
	return self;
});
/**** 
* Tree class: Üst ve alt ağaç oluşturma
****/ 
var Tree = Container.expand(function () {
	var self = Container.call(this);
	var bottomUnit = Math.floor(Math.random() * 8) + 1;
	var topUnit = 9 - bottomUnit;
	var unitSize = groundY / totalUnits;
	var bottomHeight = bottomUnit * unitSize;
	var topHeight = topUnit * unitSize;
	self.y = groundY;
	self.bottomTree = self.attachAsset('tree', {
		anchorX: 0.5,
		anchorY: 1,
		width: 321,
		//{Y} // Increased by 7%
		height: bottomHeight,
		flipY: false
	});
	self.topTree = self.attachAsset('tree', {
		anchorX: 0.5,
		anchorY: 0.5,
		width: 321,
		//{14} // Increased by 7%
		height: topHeight,
		flipY: false
	});
	self.topTree.rotation = Math.PI;
	self.topTree.y = -groundY - gapOffset + topHeight / 2;
	self.zIndex = 1;
	self.x = 2048 + 800;
	self.velocityX = -3.6;
	self.spawned = false;
	self.prevX = self.x;
	self.update = function () {
		if (gameStarted && !gameOver) {
			self.x += self.velocityX;
			if (!self.spawned && self.prevX > objectSpawnThreshold && self.x <= objectSpawnThreshold) {
				self.spawned = true;
				var newTube = new Tube();
				newTube.x = 2048 + 640;
				game.addChild(newTube);
				lastSpawner = newTube;
			}
			self.prevX = self.x;
			if (!self.passed && character.x > self.x + self.bottomTree.width / 2) {
				self.passed = true;
				updateScore();
			}
		}
	};
	return self;
});
/**** 
* Tube class: Üst ve alt boru oluşturma
****/ 
var Tube = Container.expand(function () {
	var self = Container.call(this);
	var bottomUnit = Math.floor(Math.random() * 8) + 1;
	var topUnit = 9 - bottomUnit;
	var unitSize = groundY / totalUnits;
	var bottomHeight = bottomUnit * unitSize;
	var topHeight = topUnit * unitSize;
	self.y = groundY;
	self.bottomTube = self.attachAsset('tube', {
		anchorX: 0.5,
		anchorY: 1,
		width: 285,
		//{1C} // 5% thinner
		height: bottomHeight,
		flipY: false
	});
	self.topTube = self.attachAsset('tube', {
		anchorX: 0.5,
		anchorY: 0.5,
		width: 285,
		//{1I} // 5% thinner
		height: topHeight,
		flipY: false
	});
	self.topTube.rotation = Math.PI;
	self.topTube.y = -groundY - gapOffset + topHeight / 2;
	self.zIndex = 1;
	self.x = 2048 + 800;
	self.velocityX = -3.6;
	self.spawned = false;
	self.prevX = self.x;
	self.update = function () {
		if (gameStarted && !gameOver) {
			self.x += self.velocityX;
			if (self.velocityX === 0) {
				background.velocityX = 0;
				bg2.velocityX = 0;
			}
			if (!self.spawned && self.prevX > objectSpawnThreshold && self.x <= objectSpawnThreshold) {
				self.spawned = true;
				var newTree = new Tree();
				newTree.x = 2048 + 640;
				game.addChild(newTree);
				lastSpawner = newTree;
			}
			self.prevX = self.x;
			if (!self.passed && character.x > self.x + self.bottomTube.width / 2) {
				self.passed = true;
				updateScore();
			}
		}
	};
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000
});
/**** 
* Game Code
****/ 
/**** 
* Global Variables & Helper Functions
****/ 
var groundY = 2732;
var menuOpen = true;
var volumeOn = true;
var records = [];
var gapOffset = 400;
var gameStarted = false;
var gameOver = false;
var gameWait = false;
var screenRight = 2048;
var totalUnits = 10;
var tubeSpawnThreshold, treeSpawnThreshold;
var lastSpawner = null;
var gameOverText = null;
var passCounter = 0;
var lastScore = 0;
var backgroundScrollSpeed = 7.2;
var containerScrollSpeed = 5; // Tanımlandı
var underscoreTouchCount = 0;
var flipped = false;
function centerX() {
	return 2048 / 2;
}
function centerY() {
	return groundY / 2;
}
var objectSpawnThreshold = centerX() + (screenRight - centerX()) / 2;
// Örnek container oluşturuluyor
var myContainer = new Container();
myContainer.x = centerX(); // Ekranın yatay ortasında
myContainer.y = 1900; // Başlangıçta y = 2000 (örneğin en üst sınır)
// Sabit yukarı doğru hareket hızı (update fonksiyonunda uygulanacak)
var containerUpwardSpeed = -0.5;
// Her tıklamada ek olarak uygulanacak aşağı doğru kayma miktarı
var extraDownDelta = 50;
// Container'ın update fonksiyonu: her frame sabit hızda aşağıya doğru hareket eder
myContainer.update = function () {
	// Oyun başlamışsa yukarı doğru hareket et
	if (gameStarted) {
		this.y += containerUpwardSpeed;
		// Minimum y sınırını 100 olarak ayarlıyoruz
		if (this.y < 100) {
			this.y = 100;
		}
	}
};
// Container'a tıklama (touch/down) olayı ekliyoruz
myContainer.on('down', function () {
	// Tıklamada ekstra aşağı kayma ekliyoruz
	this.y += extraDownDelta;
	if (this.y > 2600) {
		this.y = 2600;
	}
});
// Oluşturulan container'ı oyuna ekleyelim
game.addChild(myContainer);
var menuContainer = new Container();
menuContainer.zIndex = 200;
var menuBackground = LK.getAsset('menu_background', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: centerX(),
	y: centerY() + 625
});
menuBackground.zIndex = 1000;
menuContainer.addChild(menuBackground);
var menuBackgroundPart = LK.getAsset('menu_background_part', {
	anchorX: 0.5,
	anchorY: 0.19,
	x: centerX() - 1030,
	y: centerY() - 2866 - 300 // Raised by 300 pixels
});
menuBackgroundPart.zIndex = menuBackground.zIndex + 1;
menuBackground.addChild(menuBackgroundPart);
var playButton = LK.getAsset('button_play', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: centerX() - 20,
	y: centerY() + 205
});
playButton.visible = false;
menuContainer.addChild(playButton);
var playLabel = new Text2("PLAY", {
	fontFamily: "Arial",
	fontSize: 630.25 * 1.1 * 1.08 * 1.5,
	fill: 0xffffff
});
playLabel.anchorX = 0.5;
playLabel.anchorY = 0.5;
playLabel.x = playButton.x - 45;
playLabel.y = playButton.y - -25;
playLabel.visible = true;
playLabel.zIndex = 1000;
menuContainer.addChild(playLabel);
var volumeButton = LK.getAsset('button_volume', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: centerX() - 28,
	y: centerY() + 320
});
volumeButton.visible = false;
menuContainer.addChild(volumeButton);
var volumeLabel = new Text2("VOLUME", {
	fontFamily: "Arial",
	fontSize: 63.25 * 1.1 * 1.05 * 1.05 * 1.05 * 1.5,
	fill: 0xffffff
});
volumeLabel.anchorX = 0.5;
volumeLabel.anchorY = 0.5;
volumeLabel.x = volumeButton.x - 58;
volumeLabel.y = volumeButton.y + 30;
volumeLabel.visible = true;
volumeLabel.zIndex = 1000;
menuContainer.addChild(volumeLabel);
var creditsButton = LK.getAsset('button_credits', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: centerX() - 30,
	y: centerY() + 429
});
creditsButton.visible = false;
menuContainer.addChild(creditsButton);
var creditsLabel = new Text2("CREDITS", {
	fontFamily: "Arial",
	fontSize: 630.25 * 1.05 * 1.05 * 1.05 * 1.5,
	fill: 0xffffff
});
creditsLabel.anchorX = 0.5;
creditsLabel.anchorY = 0.5;
creditsLabel.x = creditsButton.x - 60;
creditsLabel.y = creditsButton.y + 28;
creditsLabel.visible = true;
creditsLabel.zIndex = 1000;
menuContainer.addChild(creditsLabel);
var recordsButton = LK.getAsset('button_records', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: centerX() - 30,
	y: centerY() + 540
});
recordsButton.visible = false;
menuContainer.addChild(recordsButton);
var recordsLabel = new Text2("RECORDS", {
	fontFamily: "Arial",
	fontSize: 150.25 * 1.05 * 1.05 * 1.03 * 1.05 * 1.5,
	fill: 0xffffff
});
recordsLabel.anchorX = 0.5;
recordsLabel.anchorY = 0.5;
recordsLabel.x = recordsButton.x - 67;
recordsLabel.y = recordsButton.y + 28;
recordsLabel.visible = true;
recordsLabel.zIndex = 1000;
menuContainer.addChild(recordsLabel);
var counterText = new Text2('0', {
	size: 124.2,
	fill: 0xFFFFFF
});
counterText.anchor.set(0, 0);
counterText.x = 1315;
counterText.y = 15;
LK.gui.topLeft.addChild(counterText);
var background = LK.getAsset('background', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: centerX(),
	y: groundY / 2
});
background.zIndex = 0;
background.velocityY = 0;
background.gravity = 0.033; // 0'a çok yakın bir değer
background.jumpStrength = 0.66; // 0'dan daha uzak ama azıcık
game.addChild(background);
var bg2 = LK.getAsset('bg2', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: centerX() + 2807.2,
	y: groundY / 2
});
bg2.zIndex = 0;
bg2.velocityY = 0;
bg2.gravity = 0.033;
bg2.jumpStrength = 0.66;
game.addChild(bg2);
var sky = LK.getAsset('sky', {
	anchorX: 0.5,
	anchorY: 0,
	x: centerX(),
	y: 0
});
sky.zIndex = 2;
game.addChild(sky);
var groundAsset = LK.getAsset('ground', {
	anchorX: 0.5,
	anchorY: 0.4,
	x: centerX(),
	y: groundY - -25
});
groundAsset.zIndex = 4.1;
game.addChild(groundAsset);
var ground2Asset = LK.getAsset('ground2', {
	anchorX: 0.5,
	anchorY: 0.05,
	x: centerX(),
	y: groundY - 40
});
ground2Asset.zIndex = 0.5;
game.addChild(ground2Asset);
function updateScore() {
	passCounter++;
	counterText.setText(passCounter);
	if (passCounter > 9) {
		counterText.x = 1315 - 25; // Move 25 pixels to the left
	} else {
		counterText.x = 1315; // Reset to original position
	}
}
// Karakter bağlı 3D arka plan ve efekt – başlangıçta container y = 2400 (en alt sınır)
var background3D = LK.getAsset('3dlikebackground', {
	anchorX: 0.5,
	anchorY: 0.5
});
var background3DContainer = new Container();
background3DContainer.offsetY = 0;
background3DContainer.velocityY = 0;
background3DContainer.gravity = 0.3 * 0.178; //0.6 Ay atmosferi benzeri yer çekimi
background3DContainer.jumpStrength = 2.15; // Daha hafif yer çekimi için zıplama kuvveti
background3DContainer.isInverted = false;
background3DContainer.addChild(background3D);
background3DContainer.x = centerX();
// Başlangıçta container'lar en altta (2400)
background3DContainer.y = 2350;
// Container update: oyun başladığında gravity uygulanır, ve y değeri 2000 ile 2400 arasında clamp edilir.
background3DContainer.update = function () {
	if (!gameStarted) {
		return;
	}
	this.velocityY -= this.gravity;
	this.y += this.velocityY;
	this.y = Math.max(1900, Math.min(this.y, 2900));
};
game.addChild(background3DContainer);
var bgEffect3D = LK.getAsset('3dbgeffect', {
	anchorX: 0.5,
	anchorY: 0.5
});
var bgEffect3DContainer = new Container();
bgEffect3DContainer.offsetY = 0;
bgEffect3DContainer.velocityY = 0;
bgEffect3DContainer.gravity = 0.3 * 0.178; //0.6 Ay atmosferi benzeri yer çekimi
bgEffect3DContainer.jumpStrength = 2.15; // Daha hafif yer çekimi için zıplama kuvveti
bgEffect3DContainer.isInverted = false;
bgEffect3DContainer.addChild(bgEffect3D);
bgEffect3DContainer.x = background3DContainer.x + 2807;
bgEffect3DContainer.y = 2350;
bgEffect3DContainer.update = function () {
	if (!gameStarted) {
		return;
	}
	this.velocityY -= this.gravity;
	this.y += this.velocityY;
	this.y = Math.max(1900, Math.min(this.y, 2900));
};
game.addChild(bgEffect3DContainer);
var underscoreAsset = LK.getAsset('_', {
	anchorX: 0.5,
	anchorY: 0.5,
	x: centerX() + 1000,
	y: centerY() - 1500 // Moved 500 pixels up 
});
underscoreAsset.zIndex = 15000;
game.addChild(underscoreAsset);
underscoreAsset.on('down', function () {
	underscoreTouchCount++;
	if (underscoreTouchCount >= 5) {
		character.preventDeath = true;
		character.preventTreeDeath = true;
	}
});
game.children.sort(function (a, b) {
	return (a.zIndex || 0) - (b.zIndex || 0);
});
// Create and add the character
var character = game.addChild(new Character());
character.x = centerX();
character.y = centerY();
// No longer needed: showCharacterAnimOnce is now handled by Character.showAnimation
// Menü konumunu ayarla
menuContainer.y += 100;
game.addChild(menuContainer);
/**** 
* Helper Functions: Credits, Volume & Records
****/ 
function createCommonCloseElements(modalWidth, modalHeight) {
	var closeLabel = LK.getAsset('justX', {
		anchorX: 0.5,
		anchorY: 0.5,
		zIndex: 100000,
		x: -9,
		y: 6
	});
	var radius = 50;
	var closeButton = LK.getAsset('button_close', {
		anchorX: 0.5,
		anchorY: 0.5,
		width: radius * 2.3 * 1.2,
		height: radius * 2.3 * 1.2
	});
	closeButton.zIndex = 10000;
	closeButton.x = 0;
	closeButton.y = 0;
	closeButton.addChild(closeLabel);
	return closeButton;
}
function showCredits() {
	menuOpen = false;
	var creditsContainer = new Container();
	creditsContainer.zIndex = 300;
	var modalWidth = 1500,
		modalHeight = 2200;
	var bg = LK.getAsset('second_menu', {
		anchorX: 0.5,
		anchorY: 0.5,
		width: modalWidth,
		height: modalHeight,
		color: 0x000000
	});
	bg.x = centerX();
	bg.y = centerY();
	creditsContainer.addChild(bg);
	var creditsText = new Text2("Game by\nMustafa Talha ŞEN", {
		fontFamily: "Arial",
		fontSize: 5000 * 1.03,
		fill: 0xffffff,
		align: "center"
	});
	creditsText.anchorX = 0.5;
	creditsText.anchorY = 0.5;
	creditsText.x = centerX() - 359;
	creditsText.y = centerY() - 800 + 40;
	creditsText.scale.set(3, 3);
	creditsContainer.addChild(creditsText);
	// Add ig:shantgame text 240px below the Game by text
	var igText = new Text2("ig:shantgame", {
		fontFamily: "Arial",
		fontSize: 5000 * 1.03,
		fill: 0xffffff,
		align: "center"
	});
	igText.anchorX = 0.5;
	igText.anchorY = 0.5;
	igText.x = creditsText.x + 70;
	igText.y = creditsText.y + 235;
	igText.scale.set(3, 3);
	creditsContainer.addChild(igText);
	game.addChild(creditsContainer);
	var closeButton = createCommonCloseElements(modalWidth, modalHeight);
	closeButton.x = bg.x + modalWidth / 2 - closeButton.width / 2 - 185;
	closeButton.y = bg.y - modalHeight / 2 + closeButton.height / 2 + 230;
	creditsContainer.addChild(closeButton);
	closeButton.on('down', function () {
		game.removeChild(creditsContainer);
		menuOpen = true;
		menuContainer.visible = true;
	});
}
function showVolume() {
	menuOpen = false;
	var volumeContainer = new Container();
	volumeContainer.zIndex = 300;
	var modalWidth = 1500,
		modalHeight = 2200;
	var bg = LK.getAsset('second_menu', {
		anchorX: 0.5,
		anchorY: 0.5,
		width: modalWidth,
		height: modalHeight,
		color: 0x000000
	});
	bg.x = centerX();
	bg.y = centerY();
	volumeContainer.addChild(bg);
	var currentMusicName = new Text2("Next Music", {
		fontFamily: "Arial",
		fontSize: 5000 * 1.103,
		fill: 0xffffff,
		align: "center"
	});
	currentMusicName.anchorX = 0.5;
	currentMusicName.anchorY = 0.5;
	currentMusicName.x = centerX() - 250;
	currentMusicName.y = centerY() - 650 + 40 - 300 + 100;
	currentMusicName.scale.set(3, 3);
	volumeContainer.addChild(currentMusicName);
	var musicButton = LK.getAsset('Musicbutton', {
		anchorX: 0.5,
		anchorY: 0.5,
		x: centerX() - 280 + 250,
		y: centerY() - 350 + 40 - 150
	});
	musicButton.on('down', function () {
		playNextMusic();
	});
	volumeContainer.addChild(musicButton);
	game.addChild(volumeContainer);
	var closeButton = createCommonCloseElements(modalWidth, modalHeight);
	closeButton.x = bg.x + modalWidth / 2 - closeButton.width / 2 - 185;
	closeButton.y = bg.y - modalHeight / 2 + closeButton.height / 2 + 230;
	volumeContainer.addChild(closeButton);
	closeButton.on('down', function () {
		game.removeChild(volumeContainer);
		menuOpen = true;
		menuContainer.visible = true;
	});
}
function showRecords() {
	menuOpen = false;
	var recordsContainer = new Container();
	recordsContainer.zIndex = 300;
	var modalWidth = 1500,
		modalHeight = 2200;
	var bg = LK.getAsset('second_menu', {
		anchorX: 0.5,
		anchorY: 0.5,
		width: modalWidth,
		height: modalHeight,
		color: 0x000000
	});
	bg.x = centerX();
	bg.y = centerY();
	recordsContainer.addChild(bg);
	var recordsTextStr = "Top Scores:\n";
	for (var i = 0; i < records.length; i++) {
		recordsTextStr += i + 1 + ". " + records[i].score + " (Attempt " + records[i].attempt + ")\n";
	}
	if (records.length === 0) {
		recordsTextStr += "No records yet.";
	}
	recordsTextStr += "\nAttempts: " + records.length;
	recordsTextStr += "\nLast Score: " + lastScore;
	var recordsText = new Text2(recordsTextStr, {
		fontFamily: "Arial",
		fontSize: 5000 * 1.103,
		fill: 0xffffff,
		align: "center"
	});
	recordsText.anchorX = 0.5;
	recordsText.anchorY = 0.5;
	recordsText.x = centerX() - 280;
	recordsText.y = centerY() - 850 + 40;
	recordsText.scale.set(3, 3);
	recordsContainer.addChild(recordsText);
	game.addChild(recordsContainer);
	var closeButton = createCommonCloseElements(modalWidth, modalHeight);
	closeButton.x = bg.x + modalWidth / 2 - closeButton.width / 2 - 185;
	closeButton.y = bg.y - modalHeight / 2 + closeButton.height / 2 + 230;
	recordsContainer.addChild(closeButton);
	closeButton.on('down', function () {
		game.removeChild(recordsContainer);
		menuOpen = true;
		menuContainer.visible = true;
	});
}
/**** 
* End Game & Reset Functions
****/ 
function playNextMusic() {
	musicCycle++;
	if (musicCycle === 1) {
		LK.stopMusic();
		LK.playMusic(musicSequence[1]);
	} else if (musicCycle === 2) {
		LK.stopMusic();
		LK.playMusic(musicSequence[2]);
	} else if (musicCycle === 3) {
		LK.stopMusic();
	} else {
		musicCycle = 0;
		LK.stopMusic();
		LK.playMusic(musicSequence[0]);
	}
}
var musicSequence = ['m_1', 'M_2', 'M_3'];
var musicCycle = 0;
LK.playMusic(musicSequence[0]);
function endGame() {
	LK.effects.flashScreen(0xFF0000, 500);
	LK.getSound('deatheffect').play();
	character.velocityY = character.jumpStrength;
	character.update = function () {
		if (gameOver) {
			character.velocityY += character.gravity;
			character.y += character.velocityY;
			if (character.y > groundY + character.height) {
				character.y = groundY + character.height;
				character.velocityY = 0;
			}
		}
	};
	game.children.forEach(function (child) {
		if (child.velocityX) {
			child.velocityX = 0;
		}
		if (child === background || child === bg2) {
			LK.setTimeout(function () {
				child.velocityY = 0;
			}, 300);
		}
	});
	game.touchDisabled = true;
	lastScore = passCounter;
	records.push({
		score: passCounter,
		attempt: records.length + 1
	});
	records.sort(function (a, b) {
		return b.score - a.score;
	});
	if (records.length > 5) {
		records = records.slice(0, 5);
	}
	LK.setTimeout(function () {
		game.touchDisabled = false;
		menuOpen = true;
		menuContainer.visible = true;
		var startY = groundY + 100;
		var endY = centerY() - 1270;
		var animationDuration = 16.5 * 5 / 1.5;
		var startTime = Date.now();
		function animateMenu() {
			var currentTime = Date.now();
			var elapsedTime = currentTime - startTime;
			var progress = Math.min(elapsedTime / animationDuration, 1);
			menuContainer.y = startY + (endY - startY) * progress;
			if (progress < 1) {
				LK.setTimeout(animateMenu, 16);
			}
		}
		animateMenu();
	}, 1700);
	LK.setTimeout(function () {
		resetGame();
	}, 1750);
}
function resetGame() {
	if (gameOverText) {
		game.removeChild(gameOverText);
		gameOverText = null;
	}
	unflipWorld();
	var objectsToRemove = [];
	game.children.forEach(function (child) {
		if (child instanceof Tree || child instanceof Tube) {
			objectsToRemove.push(child);
		}
	});
	objectsToRemove.forEach(function (obj) {
		game.removeChild(obj);
	});
	game.removeChild(character);
	character = game.addChild(new Character());
	character.x = centerX();
	character.y = centerY();
	background.x = centerX();
	background.y = groundY / 2;
	bg2.x = centerX() + 2807.2;
	bg2.y = groundY / 2;
	background.velocityX = -3.6;
	bg2.velocityX = -3.6;
	bg2.scale.x = 1;
	gameStarted = false;
	gameOver = false;
	character.preventDeath = false;
	underscoreAsset.preventDeath = false;
	lastSpawner = null;
	passCounter = 0;
	underscoreTouchCount = 0;
	counterText.setText(passCounter);
	// Reset container'ların konumunu ve velocity değerlerini
	background3DContainer.y = 2350;
	bgEffect3DContainer.y = 2350;
	background3DContainer.velocityY = 0;
	bgEffect3DContainer.velocityY = 0;
}
/**** 
* Eliptik hit testi için yardımcı fonksiyon
****/ 
function checkEllipseHover(button, lx, ly) {
	var scaleFactorX = 1;
	var scaleFactorY = 0.53;
	var offsetY = 40;
	var dx = lx - button.x;
	var dy = ly - (button.y + offsetY);
	var rx = button.width / 2 * scaleFactorX;
	var ry = button.height / 2 * scaleFactorY;
	return dx * dx / (rx * rx) + dy * dy / (ry * ry) <= 1;
}
/**** 
* Fare hareketinde hover kontrolü
****/ 
game.move = function (x, y, obj) {
	if (!menuOpen) {
		return;
	}
	var localX = x - menuContainer.x;
	var localY = y - menuContainer.y;
	playButton.visible = checkEllipseHover(playButton, localX, localY);
	volumeButton.visible = checkEllipseHover(volumeButton, localX, localY);
	creditsButton.visible = checkEllipseHover(creditsButton, localX, localY);
	recordsButton.visible = checkEllipseHover(recordsButton, localX, localY);
};
/**** 
* Touch Event
****/ 
game.down = function (x, y, obj) {
	if (menuOpen) {
		var localX = x - menuContainer.x;
		var localY = y - menuContainer.y;
		if (checkEllipseHover(playButton, localX, localY)) {
			var _animateMenu = function animateMenu() {
				var currentTime = Date.now();
				var elapsedTime = currentTime - startTime;
				var progress = Math.min(elapsedTime / animationDuration, 1);
				menuContainer.y = startY + (endY - startY) * progress;
				if (progress < 1) {
					LK.setTimeout(_animateMenu, 1);
				} else {
					menuOpen = false;
					menuContainer.visible = false;
					gameWait = true;
				}
			};
			var animationDuration = 16.5 * 5 * 2 / 1.5;
			var startTime = Date.now();
			var startY = menuContainer.y;
			var endY = centerY() + 100;
			_animateMenu();
			return;
		} else if (checkEllipseHover(volumeButton, localX, localY)) {
			showVolume();
		} else if (checkEllipseHover(creditsButton, localX, localY)) {
			showCredits();
		} else if (checkEllipseHover(recordsButton, localX, localY)) {
			showRecords();
		}
		return;
	} else if (gameOver) {
		if (!game.touchDisabled) {
			menuOpen = true;
			menuContainer.visible = true;
			resetGame();
		}
	} else {
		if (gameWait) {
			gameWait = false;
			gameStarted = true;
			var initialTube = new Tube();
			game.addChild(initialTube);
			lastSpawner = initialTube;
			character.jump();
		} else {
			character.jump();
			character.showAnimation();
			// Reduce rotation change for less rotation on tap
			character.rotation = 0.04;
			LK.setTimeout(function () {
				character.rotation = 0;
			}, 200);
		}
	}
};
/**** 
* Game Loop
****/ 
game.update = function () {
	game.children.forEach(function (child) {
		if (child.update) {
			child.update();
		}
		if (child === background || child === bg2) {
			if (!gameOver && !menuOpen && gameStarted) {
				child.x -= 3.0;
				child.velocityY -= child.gravity;
				child.y += child.velocityY;
			}
			if (child.x < -2807.2 / 2) {
				child.x += 2807.2 * 2;
			}
		}
		if (child === background3DContainer || child === bgEffect3DContainer) {
			if (!gameOver && !menuOpen && gameStarted) {
				child.x -= containerScrollSpeed * 1.2;
			}
			if (child.x < -2807.2 / 2) {
				child.x += 2807.2 * 2;
			}
		}
	});
	game.children.sort(function (a, b) {
		return (a.zIndex || 0) - (b.zIndex || 0);
	});
};
function unflipWorld() {
	if (!flipped) {
		return;
	}
	flipped = false;
	character.gravity = 0;
	character.jumpStrength = 0;
	zoomEffect();
	LK.setTimeout(function () {
		character.gravity = 0.3;
		character.jumpStrength = -12;
	}, 300);
	background.scale.y *= -1;
	bg2.scale.y *= -1;
	sky.scale.y *= -1;
	groundAsset.scale.y *= -1;
	ground2Asset.scale.y *= -1;
}
function zoomEffect() {
	var originalScale = character.scale.x;
	character.scale.set(originalScale * 1.2);
	LK.setTimeout(function () {
		character.scale.set(originalScale);
	}, 300);
}
function flipWorld() {
	if (flipped) {
		return;
	}
	flipped = true;
	character.gravity = 0;
	character.jumpStrength = 0;
	zoomEffect();
	LK.setTimeout(function () {
		character.gravity = 0.3;
		character.jumpStrength = -12;
	}, 300);
	background.scale.y *= -1;
	bg2.scale.y *= -1;
	sky.scale.y *= -1;
	groundAsset.scale.y *= -1;
	ground2Asset.scale.y *= -1;
}
:quality(85)/https://cdn.frvr.ai/67ca66e43b19280b799c63f5.png%3F3) 
 green theme forest by green tones to the sky , not to much detail just simple tree shadows trees has no details just shadowed green and shadowless places, beautiful view. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/67dded40660402a845b054ae.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6831d6e02430dd37916b738c.png%3F3) 
 :quality(85)/https://cdn.frvr.ai/6831d9572430dd37916b740b.png%3F3) 
 hyper realistic nature too reallistic proffational blue sky white clouds yellow sun an over realistic mountain view with full of trees and sun and clouds view a forest of a mountain challangeing mountain road. No background.cool background. view background. No shadows. 2d. In-Game asset. flat