/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
/**** 
* Classes
****/ 
// Enemy
var Enemy = Container.expand(function () {
	var self = Container.call(this);
	var enemy = self.attachAsset('enemy', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = enemy.width;
	self.height = enemy.height;
	self.speed = 4 + Math.random() * 2;
	self.update = function () {
		self.x -= self.speed;
	};
	return self;
});
// Exit Door
var ExitDoor = Container.expand(function () {
	var self = Container.call(this);
	var exit = self.attachAsset('exit', {
		anchorX: 0.5,
		anchorY: 1
	});
	self.width = exit.width;
	self.height = exit.height;
	return self;
});
// Gold
var Gold = Container.expand(function () {
	var self = Container.call(this);
	var gold = self.attachAsset('gold', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = gold.width;
	self.height = gold.height;
	self.collected = false;
	return self;
});
// MagicCarpet: Player
var MagicCarpet = Container.expand(function () {
	var self = Container.call(this);
	var carpet = self.attachAsset('carpet', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 2,
		scaleY: 2
	});
	self.width = carpet.width;
	self.height = carpet.height;
	self.baseY = 0;
	self.swayTick = 0;
	self.update = function () {
		// Sway up and down
		self.swayTick += 0.07;
		self.y = self.baseY + Math.sin(self.swayTick) * 18;
	};
	return self;
});
// ParallaxLayer: For background movement
var ParallaxLayer = Container.expand(function () {
	var self = Container.call(this);
	self.speed = 0;
	self.sprites = [];
	self.assetId = '';
	self.y = 0;
	self.height = 0;
	self.init = function (assetId, y, speed, count) {
		self.assetId = assetId;
		self.y = y;
		self.speed = speed;
		self.height = LK.getAsset(assetId, {}).height;
		for (var i = 0; i < count; i++) {
			var sprite = self.attachAsset(assetId, {
				anchorX: 0,
				anchorY: 0,
				x: i * LK.getAsset(assetId, {}).width,
				y: 0
			});
			self.sprites.push(sprite);
		}
	};
	self.update = function () {
		for (var i = 0; i < self.sprites.length; i++) {
			var s = self.sprites[i];
			s.x -= self.speed;
			if (s.x <= -s.width) {
				// Move to right
				s.x += s.width * self.sprites.length;
			}
		}
	};
	return self;
});
// Potion
var Potion = Container.expand(function () {
	var self = Container.call(this);
	var potion = self.attachAsset('potion', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = potion.width;
	self.height = potion.height;
	self.collected = false;
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x87ceeb // Sky blue
});
/**** 
* Game Code
****/ 
// Uzun arkaplan müziği (örnek id: 'longbgmusic', gerçek id asset pipeline'dan gelir)
// --- Parallax Layers --- 
// Arkaplan müziğini başlat (loop açık, fade ile yumuşak başlat)
LK.playMusic('longbgmusic', {
	fade: {
		start: 0,
		end: 0.7,
		duration: 1800
	}
});
// Sihirli Halı (Magic Carpet)
// Altın (Gold)
// İksir (Potion)
// Düşman (Enemy)
// Çıkış Kapısı (Exit Door)
// Zemin (Ground, parallax layer 1)
// Dağlar (Mountains, parallax layer 2)
// Bulut (Cloud, parallax layer 3)
// Joystick tabanı
// Joystick topu
var parallaxLayers = [];
// Layer 1: Ground (closest)
var groundLayer = new ParallaxLayer();
groundLayer.init('ground', 2732 - 300, 2.5, 2);
game.addChild(groundLayer);
parallaxLayers.push(groundLayer);
// Layer 2: Mountains (middle)
var mountainLayer = new ParallaxLayer();
mountainLayer.init('mountain', 2732 - 300 - 180, 1.2, 2);
game.addChild(mountainLayer);
parallaxLayers.push(mountainLayer);
// Layer 3: Clouds (farthest, randomized positions and sizes, more scattered)
var cloudSprites = [];
var cloudCount = 12 + Math.floor(Math.random() * 5); // 12-16 clouds for more density
for (var i = 0; i < cloudCount; i++) {
	// More variety in scale and position, allow overlap and wide spread
	var scale = 0.5 + Math.random() * 2.0; // 0.5x to 2.5x
	var y = 40 + Math.random() * 900; // Spread vertically in upper 940px
	var x = Math.random() * 2048;
	var cloud = LK.getAsset('cloud', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: scale,
		scaleY: scale,
		x: x,
		y: y
	});
	cloud._cloudSpeed = 0.25 + Math.random() * 0.7; // 0.25-0.95 px/frame
	game.addChild(cloud);
	cloudSprites.push(cloud);
}
parallaxLayers.push({
	// Dummy for compatibility, update will be handled below
	update: function update() {
		for (var i = 0; i < cloudSprites.length; i++) {
			var c = cloudSprites[i];
			c.x -= c._cloudSpeed;
			if (c.x < -c.width / 2) {
				// When respawning, randomize both X and Y for more scattered effect
				c.x = 2048 + c.width / 2 + Math.random() * 300;
				c.y = 40 + Math.random() * 900;
				c._cloudSpeed = 0.25 + Math.random() * 0.7;
				var scale = 0.5 + Math.random() * 2.0;
				c.scaleX = scale;
				c.scaleY = scale;
			}
		}
	}
});
// --- Exit Door ---
var exitDoor = new ExitDoor();
exitDoor.x = 2048 - 200;
exitDoor.y = 2732 - 300 - 10;
exitDoor.visible = false;
game.addChild(exitDoor);
// --- Magic Carpet (Player) ---
var carpet = new MagicCarpet();
carpet.x = 320;
carpet.baseY = 2732 / 2;
carpet.y = carpet.baseY;
carpet.targetX = carpet.x;
carpet.targetBaseY = carpet.baseY;
game.addChild(carpet);
// --- Collectibles ---
var golds = [];
var potions = [];
// Gold positions (spread out, not overlapping, not too close to edges)
var goldPositions = [{
	x: 700,
	y: 700
}, {
	x: 1200,
	y: 900
}, {
	x: 900,
	y: 1700
}, {
	x: 1500,
	y: 1200
}, {
	x: 1800,
	y: 2100
}];
for (var i = 0; i < 5; i++) {
	var g = new Gold();
	g.x = goldPositions[i].x;
	g.y = goldPositions[i].y;
	golds.push(g);
	game.addChild(g);
}
// Potion positions
var potionPositions = [{
	x: 1100,
	y: 2200
}, {
	x: 1700,
	y: 600
}];
for (var i = 0; i < 2; i++) {
	var p = new Potion();
	p.x = potionPositions[i].x;
	p.y = potionPositions[i].y;
	potions.push(p);
	game.addChild(p);
}
// --- Enemies ---
var enemies = [];
function spawnEnemies() {
	// 3 enemies, random vertical positions, spaced horizontally
	enemies.length = 0;
	for (var i = 0; i < 3; i++) {
		var e = new Enemy();
		e.x = 2048 + 200 + i * 300;
		e.y = 600 + Math.random() * (2732 - 1200);
		enemies.push(e);
		game.addChild(e);
	}
}
spawnEnemies();
// --- GUI: Score/Progress ---
var progressTxt = new Text2('', {
	size: 80,
	fill: "#fff"
});
progressTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(progressTxt);
// --- State ---
var collectedGold = 0;
var collectedPotion = 0;
var allCollected = false;
var gameOver = false;
var youWin = false;
// --- Helper: Update Progress Text ---
function updateProgressText() {
	progressTxt.setText("Altın: " + collectedGold + "/5   İksir: " + collectedPotion + "/2");
}
updateProgressText();
// --- Helper: Reset Game State ---
function resetGame() {
	// Reset collectibles
	for (var i = 0; i < golds.length; i++) {
		golds[i].collected = false;
		golds[i].visible = true;
	}
	for (var i = 0; i < potions.length; i++) {
		potions[i].collected = false;
		potions[i].visible = true;
	}
	collectedGold = 0;
	collectedPotion = 0;
	allCollected = false;
	updateProgressText();
	// Reset player
	carpet.x = 320;
	carpet.baseY = 2732 / 2;
	carpet.swayTick = 0;
	carpet.targetX = carpet.x;
	carpet.targetBaseY = carpet.baseY;
	// Reset enemies
	for (var i = 0; i < enemies.length; i++) {
		enemies[i].destroy();
	}
	spawnEnemies();
	// Hide exit
	exitDoor.visible = false;
	gameOver = false;
	youWin = false;
}
// --- Main Game Move Handler (for mobile drag outside joystick) ---
// Touch/drag anywhere on the game area (except joystick) to move the player directly
var draggingPlayer = false;
game.down = function (x, y, obj) {
	draggingPlayer = true;
	// Set target position for smooth movement
	var margin = 60;
	var px = x;
	var py = y;
	if (px < margin + carpet.width / 2) px = margin + carpet.width / 2;
	if (px > 2048 - margin - carpet.width / 2) px = 2048 - margin - carpet.width / 2;
	if (py < margin + carpet.height / 2) py = margin + carpet.height / 2;
	if (py > 2732 - 300 - margin - carpet.height / 2) py = 2732 - 300 - margin - carpet.height / 2;
	carpet.targetX = px;
	carpet.targetBaseY = py;
};
game.move = function (x, y, obj) {
	if (draggingPlayer) {
		// Set target position for smooth movement
		var margin = 60;
		var px = x;
		var py = y;
		if (px < margin + carpet.width / 2) px = margin + carpet.width / 2;
		if (px > 2048 - margin - carpet.width / 2) px = 2048 - margin - carpet.width / 2;
		if (py < margin + carpet.height / 2) py = margin + carpet.height / 2;
		if (py > 2732 - 300 - margin - carpet.height / 2) py = 2732 - 300 - margin - carpet.height / 2;
		carpet.targetX = px;
		carpet.targetBaseY = py;
	}
};
game.up = function (x, y, obj) {
	draggingPlayer = false;
	carpet.targetX = undefined;
	carpet.targetBaseY = undefined;
};
// --- Main Game Update Loop ---
game.update = function () {
	if (gameOver || youWin) return;
	// Parallax layers
	for (var i = 0; i < parallaxLayers.length; i++) {
		parallaxLayers[i].update();
	}
	// Smooth movement toward target if dragging
	if (typeof carpet.targetX === "number" && typeof carpet.targetBaseY === "number") {
		// Only move if not already at target
		var dx = carpet.targetX - carpet.x;
		var dy = carpet.targetBaseY - carpet.baseY;
		var dist = Math.sqrt(dx * dx + dy * dy);
		if (dist > 2) {
			// Move a fraction toward target (lerp)
			var moveSpeed = 0.22; // 0..1, higher = faster
			carpet.x += dx * moveSpeed;
			carpet.baseY += dy * moveSpeed;
		} else {
			// Snap to target if close enough
			carpet.x = carpet.targetX;
			carpet.baseY = carpet.targetBaseY;
		}
	}
	// Clamp inside play area (not too close to edges)
	var margin = 60;
	if (carpet.x < margin + carpet.width / 2) carpet.x = margin + carpet.width / 2;
	if (carpet.x > 2048 - margin - carpet.width / 2) carpet.x = 2048 - margin - carpet.width / 2;
	if (carpet.baseY < margin + carpet.height / 2) carpet.baseY = margin + carpet.height / 2;
	if (carpet.baseY > 2732 - 300 - margin - carpet.height / 2) carpet.baseY = 2732 - 300 - margin - carpet.height / 2;
	// Sway
	carpet.update();
	// Collectibles: Gold
	for (var i = 0; i < golds.length; i++) {
		var g = golds[i];
		if (!g.collected && carpet.intersects(g)) {
			g.collected = true;
			g.visible = false;
			// Play gold collect sound
			LK.getSound('gold_collect').play();
			// Sparkle effect: create a large, fully opaque yellow circle at gold position
			var sparkle = LK.getAsset('shape', {
				width: g.width * 2.5,
				height: g.height * 2.5,
				anchorX: 0.5,
				anchorY: 0.5,
				alpha: 1,
				x: g.x,
				y: g.y,
				color: 0xf7d13b,
				shape: 'ellipse'
			});
			game.addChild(sparkle);
			// Animate: scale up and fade out quickly, then remove
			tween(sparkle, {
				scaleX: 2.8,
				scaleY: 2.8,
				alpha: 0
			}, {
				duration: 340,
				easing: tween.easeOut,
				complete: function complete() {
					sparkle.destroy();
				}
			});
			collectedGold++;
			updateProgressText();
		}
	}
	// Collectibles: Potion
	for (var i = 0; i < potions.length; i++) {
		var p = potions[i];
		if (!p.collected && carpet.intersects(p)) {
			p.collected = true;
			p.visible = false;
			// Play potion collect sound
			LK.getSound('potion_collect').play();
			// --- Blue circle explosion effect for potion ---
			var sparkle = LK.getAsset('blue_ellipse', {
				width: p.width * 2.5,
				height: p.width * 2.5,
				// Make it a perfect circle
				anchorX: 0.5,
				anchorY: 0.5,
				alpha: 1,
				x: p.x,
				y: p.y
			});
			game.addChild(sparkle);
			// Animate: scale up and fade out quickly, then remove
			tween(sparkle, {
				scaleX: 2.8,
				scaleY: 2.8,
				alpha: 0
			}, {
				duration: 340,
				easing: tween.easeOut,
				complete: function complete() {
					sparkle.destroy();
				}
			});
			collectedPotion++;
			updateProgressText();
		}
	}
	// All collected?
	if (!allCollected && collectedGold === 5 && collectedPotion === 2) {
		allCollected = true;
		// Show exit door
		exitDoor.visible = true;
		// Animate door (flash green)
		tween(exitDoor, {
			tint: 0x00ff00
		}, {
			duration: 600,
			easing: tween.bounceOut
		});
	}
	// Enemies
	for (var i = 0; i < enemies.length; i++) {
		var e = enemies[i];
		e.update();
		// If off screen left, respawn to right
		if (e.x < -e.width) {
			e.x = 2048 + 200 + Math.random() * 200;
			e.y = 600 + Math.random() * (2732 - 1200);
			e.speed = 4 + Math.random() * 2;
		}
		// Collision with player
		if (carpet.intersects(e)) {
			// Game over
			gameOver = true;
			// Play lose sound
			LK.getSound('lose').play();
			LK.effects.flashScreen(0xff0000, 900);
			LK.setTimeout(function () {
				LK.showGameOver();
			}, 900);
			return;
		}
	}
	// Win condition: All collected and reached exit
	if (allCollected && carpet.intersects(exitDoor)) {
		youWin = true;
		// Play win sound
		LK.getSound('win').play();
		LK.effects.flashScreen(0x00ff00, 700);
		LK.setTimeout(function () {
			LK.showYouWin();
		}, 700);
		return;
	}
};
// --- Game Over/Win Reset Handler ---
LK.on('gameover', function () {
	resetGame();
});
LK.on('youwin', function () {
	resetGame();
}); /**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
/**** 
* Classes
****/ 
// Enemy
var Enemy = Container.expand(function () {
	var self = Container.call(this);
	var enemy = self.attachAsset('enemy', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = enemy.width;
	self.height = enemy.height;
	self.speed = 4 + Math.random() * 2;
	self.update = function () {
		self.x -= self.speed;
	};
	return self;
});
// Exit Door
var ExitDoor = Container.expand(function () {
	var self = Container.call(this);
	var exit = self.attachAsset('exit', {
		anchorX: 0.5,
		anchorY: 1
	});
	self.width = exit.width;
	self.height = exit.height;
	return self;
});
// Gold
var Gold = Container.expand(function () {
	var self = Container.call(this);
	var gold = self.attachAsset('gold', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = gold.width;
	self.height = gold.height;
	self.collected = false;
	return self;
});
// MagicCarpet: Player
var MagicCarpet = Container.expand(function () {
	var self = Container.call(this);
	var carpet = self.attachAsset('carpet', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 2,
		scaleY: 2
	});
	self.width = carpet.width;
	self.height = carpet.height;
	self.baseY = 0;
	self.swayTick = 0;
	self.update = function () {
		// Sway up and down
		self.swayTick += 0.07;
		self.y = self.baseY + Math.sin(self.swayTick) * 18;
	};
	return self;
});
// ParallaxLayer: For background movement
var ParallaxLayer = Container.expand(function () {
	var self = Container.call(this);
	self.speed = 0;
	self.sprites = [];
	self.assetId = '';
	self.y = 0;
	self.height = 0;
	self.init = function (assetId, y, speed, count) {
		self.assetId = assetId;
		self.y = y;
		self.speed = speed;
		self.height = LK.getAsset(assetId, {}).height;
		for (var i = 0; i < count; i++) {
			var sprite = self.attachAsset(assetId, {
				anchorX: 0,
				anchorY: 0,
				x: i * LK.getAsset(assetId, {}).width,
				y: 0
			});
			self.sprites.push(sprite);
		}
	};
	self.update = function () {
		for (var i = 0; i < self.sprites.length; i++) {
			var s = self.sprites[i];
			s.x -= self.speed;
			if (s.x <= -s.width) {
				// Move to right
				s.x += s.width * self.sprites.length;
			}
		}
	};
	return self;
});
// Potion
var Potion = Container.expand(function () {
	var self = Container.call(this);
	var potion = self.attachAsset('potion', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.width = potion.width;
	self.height = potion.height;
	self.collected = false;
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x87ceeb // Sky blue
});
/**** 
* Game Code
****/ 
// Uzun arkaplan müziği (örnek id: 'longbgmusic', gerçek id asset pipeline'dan gelir)
// --- Parallax Layers --- 
// Arkaplan müziğini başlat (loop açık, fade ile yumuşak başlat)
LK.playMusic('longbgmusic', {
	fade: {
		start: 0,
		end: 0.7,
		duration: 1800
	}
});
// Sihirli Halı (Magic Carpet)
// Altın (Gold)
// İksir (Potion)
// Düşman (Enemy)
// Çıkış Kapısı (Exit Door)
// Zemin (Ground, parallax layer 1)
// Dağlar (Mountains, parallax layer 2)
// Bulut (Cloud, parallax layer 3)
// Joystick tabanı
// Joystick topu
var parallaxLayers = [];
// Layer 1: Ground (closest)
var groundLayer = new ParallaxLayer();
groundLayer.init('ground', 2732 - 300, 2.5, 2);
game.addChild(groundLayer);
parallaxLayers.push(groundLayer);
// Layer 2: Mountains (middle)
var mountainLayer = new ParallaxLayer();
mountainLayer.init('mountain', 2732 - 300 - 180, 1.2, 2);
game.addChild(mountainLayer);
parallaxLayers.push(mountainLayer);
// Layer 3: Clouds (farthest, randomized positions and sizes, more scattered)
var cloudSprites = [];
var cloudCount = 12 + Math.floor(Math.random() * 5); // 12-16 clouds for more density
for (var i = 0; i < cloudCount; i++) {
	// More variety in scale and position, allow overlap and wide spread
	var scale = 0.5 + Math.random() * 2.0; // 0.5x to 2.5x
	var y = 40 + Math.random() * 900; // Spread vertically in upper 940px
	var x = Math.random() * 2048;
	var cloud = LK.getAsset('cloud', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: scale,
		scaleY: scale,
		x: x,
		y: y
	});
	cloud._cloudSpeed = 0.25 + Math.random() * 0.7; // 0.25-0.95 px/frame
	game.addChild(cloud);
	cloudSprites.push(cloud);
}
parallaxLayers.push({
	// Dummy for compatibility, update will be handled below
	update: function update() {
		for (var i = 0; i < cloudSprites.length; i++) {
			var c = cloudSprites[i];
			c.x -= c._cloudSpeed;
			if (c.x < -c.width / 2) {
				// When respawning, randomize both X and Y for more scattered effect
				c.x = 2048 + c.width / 2 + Math.random() * 300;
				c.y = 40 + Math.random() * 900;
				c._cloudSpeed = 0.25 + Math.random() * 0.7;
				var scale = 0.5 + Math.random() * 2.0;
				c.scaleX = scale;
				c.scaleY = scale;
			}
		}
	}
});
// --- Exit Door ---
var exitDoor = new ExitDoor();
exitDoor.x = 2048 - 200;
exitDoor.y = 2732 - 300 - 10;
exitDoor.visible = false;
game.addChild(exitDoor);
// --- Magic Carpet (Player) ---
var carpet = new MagicCarpet();
carpet.x = 320;
carpet.baseY = 2732 / 2;
carpet.y = carpet.baseY;
carpet.targetX = carpet.x;
carpet.targetBaseY = carpet.baseY;
game.addChild(carpet);
// --- Collectibles ---
var golds = [];
var potions = [];
// Gold positions (spread out, not overlapping, not too close to edges)
var goldPositions = [{
	x: 700,
	y: 700
}, {
	x: 1200,
	y: 900
}, {
	x: 900,
	y: 1700
}, {
	x: 1500,
	y: 1200
}, {
	x: 1800,
	y: 2100
}];
for (var i = 0; i < 5; i++) {
	var g = new Gold();
	g.x = goldPositions[i].x;
	g.y = goldPositions[i].y;
	golds.push(g);
	game.addChild(g);
}
// Potion positions
var potionPositions = [{
	x: 1100,
	y: 2200
}, {
	x: 1700,
	y: 600
}];
for (var i = 0; i < 2; i++) {
	var p = new Potion();
	p.x = potionPositions[i].x;
	p.y = potionPositions[i].y;
	potions.push(p);
	game.addChild(p);
}
// --- Enemies ---
var enemies = [];
function spawnEnemies() {
	// 3 enemies, random vertical positions, spaced horizontally
	enemies.length = 0;
	for (var i = 0; i < 3; i++) {
		var e = new Enemy();
		e.x = 2048 + 200 + i * 300;
		e.y = 600 + Math.random() * (2732 - 1200);
		enemies.push(e);
		game.addChild(e);
	}
}
spawnEnemies();
// --- GUI: Score/Progress ---
var progressTxt = new Text2('', {
	size: 80,
	fill: "#fff"
});
progressTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(progressTxt);
// --- State ---
var collectedGold = 0;
var collectedPotion = 0;
var allCollected = false;
var gameOver = false;
var youWin = false;
// --- Helper: Update Progress Text ---
function updateProgressText() {
	progressTxt.setText("Altın: " + collectedGold + "/5   İksir: " + collectedPotion + "/2");
}
updateProgressText();
// --- Helper: Reset Game State ---
function resetGame() {
	// Reset collectibles
	for (var i = 0; i < golds.length; i++) {
		golds[i].collected = false;
		golds[i].visible = true;
	}
	for (var i = 0; i < potions.length; i++) {
		potions[i].collected = false;
		potions[i].visible = true;
	}
	collectedGold = 0;
	collectedPotion = 0;
	allCollected = false;
	updateProgressText();
	// Reset player
	carpet.x = 320;
	carpet.baseY = 2732 / 2;
	carpet.swayTick = 0;
	carpet.targetX = carpet.x;
	carpet.targetBaseY = carpet.baseY;
	// Reset enemies
	for (var i = 0; i < enemies.length; i++) {
		enemies[i].destroy();
	}
	spawnEnemies();
	// Hide exit
	exitDoor.visible = false;
	gameOver = false;
	youWin = false;
}
// --- Main Game Move Handler (for mobile drag outside joystick) ---
// Touch/drag anywhere on the game area (except joystick) to move the player directly
var draggingPlayer = false;
game.down = function (x, y, obj) {
	draggingPlayer = true;
	// Set target position for smooth movement
	var margin = 60;
	var px = x;
	var py = y;
	if (px < margin + carpet.width / 2) px = margin + carpet.width / 2;
	if (px > 2048 - margin - carpet.width / 2) px = 2048 - margin - carpet.width / 2;
	if (py < margin + carpet.height / 2) py = margin + carpet.height / 2;
	if (py > 2732 - 300 - margin - carpet.height / 2) py = 2732 - 300 - margin - carpet.height / 2;
	carpet.targetX = px;
	carpet.targetBaseY = py;
};
game.move = function (x, y, obj) {
	if (draggingPlayer) {
		// Set target position for smooth movement
		var margin = 60;
		var px = x;
		var py = y;
		if (px < margin + carpet.width / 2) px = margin + carpet.width / 2;
		if (px > 2048 - margin - carpet.width / 2) px = 2048 - margin - carpet.width / 2;
		if (py < margin + carpet.height / 2) py = margin + carpet.height / 2;
		if (py > 2732 - 300 - margin - carpet.height / 2) py = 2732 - 300 - margin - carpet.height / 2;
		carpet.targetX = px;
		carpet.targetBaseY = py;
	}
};
game.up = function (x, y, obj) {
	draggingPlayer = false;
	carpet.targetX = undefined;
	carpet.targetBaseY = undefined;
};
// --- Main Game Update Loop ---
game.update = function () {
	if (gameOver || youWin) return;
	// Parallax layers
	for (var i = 0; i < parallaxLayers.length; i++) {
		parallaxLayers[i].update();
	}
	// Smooth movement toward target if dragging
	if (typeof carpet.targetX === "number" && typeof carpet.targetBaseY === "number") {
		// Only move if not already at target
		var dx = carpet.targetX - carpet.x;
		var dy = carpet.targetBaseY - carpet.baseY;
		var dist = Math.sqrt(dx * dx + dy * dy);
		if (dist > 2) {
			// Move a fraction toward target (lerp)
			var moveSpeed = 0.22; // 0..1, higher = faster
			carpet.x += dx * moveSpeed;
			carpet.baseY += dy * moveSpeed;
		} else {
			// Snap to target if close enough
			carpet.x = carpet.targetX;
			carpet.baseY = carpet.targetBaseY;
		}
	}
	// Clamp inside play area (not too close to edges)
	var margin = 60;
	if (carpet.x < margin + carpet.width / 2) carpet.x = margin + carpet.width / 2;
	if (carpet.x > 2048 - margin - carpet.width / 2) carpet.x = 2048 - margin - carpet.width / 2;
	if (carpet.baseY < margin + carpet.height / 2) carpet.baseY = margin + carpet.height / 2;
	if (carpet.baseY > 2732 - 300 - margin - carpet.height / 2) carpet.baseY = 2732 - 300 - margin - carpet.height / 2;
	// Sway
	carpet.update();
	// Collectibles: Gold
	for (var i = 0; i < golds.length; i++) {
		var g = golds[i];
		if (!g.collected && carpet.intersects(g)) {
			g.collected = true;
			g.visible = false;
			// Play gold collect sound
			LK.getSound('gold_collect').play();
			// Sparkle effect: create a large, fully opaque yellow circle at gold position
			var sparkle = LK.getAsset('shape', {
				width: g.width * 2.5,
				height: g.height * 2.5,
				anchorX: 0.5,
				anchorY: 0.5,
				alpha: 1,
				x: g.x,
				y: g.y,
				color: 0xf7d13b,
				shape: 'ellipse'
			});
			game.addChild(sparkle);
			// Animate: scale up and fade out quickly, then remove
			tween(sparkle, {
				scaleX: 2.8,
				scaleY: 2.8,
				alpha: 0
			}, {
				duration: 340,
				easing: tween.easeOut,
				complete: function complete() {
					sparkle.destroy();
				}
			});
			collectedGold++;
			updateProgressText();
		}
	}
	// Collectibles: Potion
	for (var i = 0; i < potions.length; i++) {
		var p = potions[i];
		if (!p.collected && carpet.intersects(p)) {
			p.collected = true;
			p.visible = false;
			// Play potion collect sound
			LK.getSound('potion_collect').play();
			// --- Blue circle explosion effect for potion ---
			var sparkle = LK.getAsset('blue_ellipse', {
				width: p.width * 2.5,
				height: p.width * 2.5,
				// Make it a perfect circle
				anchorX: 0.5,
				anchorY: 0.5,
				alpha: 1,
				x: p.x,
				y: p.y
			});
			game.addChild(sparkle);
			// Animate: scale up and fade out quickly, then remove
			tween(sparkle, {
				scaleX: 2.8,
				scaleY: 2.8,
				alpha: 0
			}, {
				duration: 340,
				easing: tween.easeOut,
				complete: function complete() {
					sparkle.destroy();
				}
			});
			collectedPotion++;
			updateProgressText();
		}
	}
	// All collected?
	if (!allCollected && collectedGold === 5 && collectedPotion === 2) {
		allCollected = true;
		// Show exit door
		exitDoor.visible = true;
		// Animate door (flash green)
		tween(exitDoor, {
			tint: 0x00ff00
		}, {
			duration: 600,
			easing: tween.bounceOut
		});
	}
	// Enemies
	for (var i = 0; i < enemies.length; i++) {
		var e = enemies[i];
		e.update();
		// If off screen left, respawn to right
		if (e.x < -e.width) {
			e.x = 2048 + 200 + Math.random() * 200;
			e.y = 600 + Math.random() * (2732 - 1200);
			e.speed = 4 + Math.random() * 2;
		}
		// Collision with player
		if (carpet.intersects(e)) {
			// Game over
			gameOver = true;
			// Play lose sound
			LK.getSound('lose').play();
			LK.effects.flashScreen(0xff0000, 900);
			LK.setTimeout(function () {
				LK.showGameOver();
			}, 900);
			return;
		}
	}
	// Win condition: All collected and reached exit
	if (allCollected && carpet.intersects(exitDoor)) {
		youWin = true;
		// Play win sound
		LK.getSound('win').play();
		LK.effects.flashScreen(0x00ff00, 700);
		LK.setTimeout(function () {
			LK.showYouWin();
		}, 700);
		return;
	}
};
// --- Game Over/Win Reset Handler ---
LK.on('gameover', function () {
	resetGame();
});
LK.on('youwin', function () {
	resetGame();
});
:quality(85)/https://cdn.frvr.ai/683ee653f8e9a224aa95f65b.png%3F3) 
 Fullscreen modern App Store landscape banner, 16:9, high definition, for a game titled "Sihirli Halı: Çöl Macerası" and with the description "Sihirli halı ile çöl manzarasında süzül, altın ve iksirleri topla, düşmanlardan kaç ve çıkış kapısına ulaş!". No text on banner!
:quality(85)/https://cdn.frvr.ai/683ef7034da4619081d4878a.png%3F3) 
 Pofuduk yumuşacık bulut. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/683f3f9b4da4619081d48a54.png%3F3) 
 sihirli iksir mavi renk. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/683f42c44da4619081d48a81.png%3F3) 
 red angry bird transparan. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/683f49884da4619081d48b51.png%3F3) 
 Green wood arabic door. In-Game asset. 2d. High contrast. No shadows
:quality(85)/https://cdn.frvr.ai/683f49f94da4619081d48b77.png%3F3) 
 Gold coin up view tranparent. In-Game asset. 2d. High contrast. No shadows no text