User prompt
skor 100 olduktan sonra kırmızı balıklar çoğalsın
User prompt
bir skor sistemi ekle, her bir balık yediğimizde 1 er artsın. Her 10 skorda mavi balıkların hızı artsın
User prompt
oyunda iken mouse imlecini yok et
User prompt
kırmızı renkte balıklar da ekle ve bunları yediğimizde karakterimiz küçülsün
User prompt
karakter aşağı ve yukarıda hareket etsin
User prompt
balık yedikçe büyüsün
User prompt
my character eat fish
User prompt
ı want up and down control
User prompt
my character mouse control with movement
User prompt
my character is shark
User prompt
make ocean and make fish
User prompt
Deniz Ortasında Yüzücü
Initial prompt
sadece bir karakter yap, denizin ortasında yüzsün
/**** * Classes ****/ // Fish class: represents a single fish swimming in the ocean var Fish = Container.expand(function () { var self = Container.call(this); // Create a simple ellipse as the fish var fishAsset = self.attachAsset('fish', { width: 120, height: 60, color: 0xffcc66, shape: 'ellipse', anchorX: 0.5, anchorY: 0.5 }); // Randomize initial position, speed, and direction self.direction = Math.random() < 0.5 ? 1 : -1; // 1: right, -1: left if (self.direction === 1) { self.x = Math.random() * 1024; // left half } else { self.x = 1024 + Math.random() * 1024; // right half } self.y = 400 + Math.random() * 1800; self.speed = (2 + Math.random() * 3) * self.direction; // Track lastX for edge detection self.lastX = self.x; // Fish swims in both directions, loops back when off screen self.update = function () { self.lastX = self.x; self.x += self.speed; // Flip fish asset horizontally if swimming left, normal if right if (self.direction === 1) { if (typeof fishAsset !== "undefined") fishAsset.scaleX = 1; } else { if (typeof fishAsset !== "undefined") fishAsset.scaleX = -1; } if (self.direction === 1) { // rightward if (self.lastX <= 2048 && self.x > 2048) { self.direction = Math.random() < 0.5 ? 1 : -1; self.x = self.direction === 1 ? -100 : 2048 + 100; self.y = 400 + Math.random() * 1800; self.speed = (2 + Math.random() * 3) * self.direction; } } else { // leftward if (self.lastX >= -100 && self.x < -100) { self.direction = Math.random() < 0.5 ? 1 : -1; self.x = self.direction === 1 ? -100 : 2048 + 100; self.y = 400 + Math.random() * 1800; self.speed = (2 + Math.random() * 3) * self.direction; } } }; return self; }); var Ocean = Container.expand(function () { var self = Container.call(this); // Create a large blue rectangle as the ocean background var oceanAsset = self.attachAsset('ocean', { width: 2048, height: 2732, color: 0x3399ff, shape: 'box', anchorX: 0, anchorY: 0, x: 0, y: 0 }); return self; }); // RareFish class: represents the rare black fish that appears every 10 seconds var RareFish = Container.expand(function () { var self = Container.call(this); // Attach rare fish asset (black) var rareFishAsset = self.attachAsset('rarefish', { width: 240, height: 120, color: 0x000000, shape: 'ellipse', anchorX: 0.5, anchorY: 0.5 }); // Randomize initial position, speed, and direction self.direction = Math.random() < 0.5 ? 1 : -1; // 1: right, -1: left if (self.direction === 1) { self.x = Math.random() * 1024; } else { self.x = 1024 + Math.random() * 1024; } self.y = 400 + Math.random() * 1800; self.speed = (2 + Math.random() * 3) * self.direction; self.lastX = self.x; // Rare fish swims in both directions, loops back when off screen self.update = function () { self.lastX = self.x; self.x += self.speed; // Flip rare fish asset horizontally if swimming left, normal if right if (self.direction === 1) { if (typeof rareFishAsset !== "undefined") rareFishAsset.scaleX = 1; } else { if (typeof rareFishAsset !== "undefined") rareFishAsset.scaleX = -1; } if (self.direction === 1) { // rightward if (self.lastX <= 2048 && self.x > 2048) { self.direction = Math.random() < 0.5 ? 1 : -1; self.x = self.direction === 1 ? -100 : 2048 + 100; self.y = 400 + Math.random() * 1800; self.speed = (2 + Math.random() * 3) * self.direction; } } else { // leftward if (self.lastX >= -100 && self.x < -100) { self.direction = Math.random() < 0.5 ? 1 : -1; self.x = self.direction === 1 ? -100 : 2048 + 100; self.y = 400 + Math.random() * 1800; self.speed = (2 + Math.random() * 3) * self.direction; } } }; return self; }); // Function to spawn rare fish // RedFish class: represents a red fish that shrinks the shark var RedFish = Container.expand(function () { var self = Container.call(this); // Attach red fish asset (nadir balığı is black) var redFishAsset = self.attachAsset('redfish', { width: 120, height: 60, color: 0x000000, shape: 'ellipse', anchorX: 0.5, anchorY: 0.5 }); // Randomize initial position, speed, and direction self.direction = Math.random() < 0.5 ? 1 : -1; // 1: right, -1: left if (self.direction === 1) { self.x = Math.random() * 1024; } else { self.x = 1024 + Math.random() * 1024; } self.y = 400 + Math.random() * 1800; self.speed = (2 + Math.random() * 3) * self.direction; // Track lastX for edge detection self.lastX = self.x; // Red fish swims in both directions, loops back when off screen self.update = function () { self.lastX = self.x; self.x += self.speed; // Flip red fish asset horizontally if swimming left, normal if right if (self.direction === 1) { if (typeof redFishAsset !== "undefined") redFishAsset.scaleX = 1; } else { if (typeof redFishAsset !== "undefined") redFishAsset.scaleX = -1; } if (self.direction === 1) { // rightward if (self.lastX <= 2048 && self.x > 2048) { self.direction = Math.random() < 0.5 ? 1 : -1; self.x = self.direction === 1 ? -100 : 2048 + 100; self.y = 400 + Math.random() * 1800; self.speed = (2 + Math.random() * 3) * self.direction; } } else { // leftward if (self.lastX >= -100 && self.x < -100) { self.direction = Math.random() < 0.5 ? 1 : -1; self.x = self.direction === 1 ? -100 : 2048 + 100; self.y = 400 + Math.random() * 1800; self.speed = (2 + Math.random() * 3) * self.direction; } } }; return self; }); // Shark class: represents the main character (shark) swimming in the ocean var Shark = Container.expand(function () { var self = Container.call(this); // Attach a shark asset (box for now, can be replaced with a shark image asset) var sharkAsset = self.attachAsset('shark', { width: 220, height: 100, color: 0x444444, shape: 'box', anchorX: 0.5, anchorY: 0.5 }); // Start in the center of the ocean self.x = 1024; self.y = 1366; // Track lastX and lastY for possible future movement logic self.lastX = self.x; self.lastY = self.y; // Shark update: just track lastX/lastY for drag movement self.update = function () { self.lastX = self.x; self.lastY = self.y; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Hide the mouse cursor during gameplay if (typeof LK.setCursor === "function") { LK.setCursor("none"); } else if (typeof stage !== "undefined" && stage.view && stage.view.style) { stage.view.style.cursor = "none"; } // Add ocean background var ocean = new Ocean(); game.addChild(ocean); // Play water sound as looping background music after first user interaction var waterMusicStarted = false; function startWaterMusic() { if (!waterMusicStarted) { LK.playMusic('water'); waterMusicStarted = true; } } game.down = function (origDown) { return function (x, y, obj) { startWaterMusic(); if (typeof origDown === "function") origDown(x, y, obj); }; }(game.down); // Score system var score = 0; var scoreTxt = new Text2('0', { size: 120, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); scoreTxt.x = LK.gui.top.width / 2; scoreTxt.y = 10; // Timer system var secondsLeft = 60; var targetScore = 30; var currentLevel = 1; // Check if player is on level 2 (after winning level 1) if (typeof storage !== "undefined" && typeof storage.getItem === "function") { var storedLevel = parseInt(storage.getItem("level")); if (!isNaN(storedLevel) && storedLevel === 2) { secondsLeft = 60; targetScore = 120; currentLevel = 2; } } var timerTxt = new Text2(secondsLeft + '', { size: 90, fill: 0xFFFFFF }); timerTxt.anchor.set(0.5, 1); LK.gui.bottom.addChild(timerTxt); // Place timer at bottom center, but a bit higher timerTxt.x = LK.gui.bottom.width / 2; timerTxt.y = LK.gui.bottom.height - 120; // Timer interval var timerInterval = LK.setInterval(function () { if (secondsLeft > 0) { secondsLeft--; timerTxt.setText(secondsLeft + ""); if (secondsLeft === 0 && score < targetScore) { LK.showGameOver(); } } }, 1000); // Add several fish swimming in the ocean var fishArray = []; for (var i = 0; i < 7; i++) { var fish = new Fish(); fishArray.push(fish); game.addChild(fish); } // Rare fish (nadir balığı) logic var rareFish = null; var rareFishTimer = null; // Function to spawn rare fish function spawnRareFish() { // Remove previous rare fish if exists if (rareFish && typeof rareFish.destroy === "function") { rareFish.destroy(); rareFish = null; } rareFish = new RareFish(); // Place rare fish at a random position, but ensure it's visible rareFish.direction = Math.random() < 0.5 ? 1 : -1; if (rareFish.direction === 1) { rareFish.x = Math.random() * 1024; } else { rareFish.x = 1024 + Math.random() * 1024; } rareFish.y = 400 + Math.random() * 1800; rareFish.speed = (2 + Math.random() * 3) * rareFish.direction; game.addChild(rareFish); } // Start timer to spawn rare fish every 30 seconds rareFishTimer = LK.setInterval(function () { spawnRareFish(); }, 30000); // Spawn the first rare fish immediately spawnRareFish(); // Add the shark character to the game var shark = new Shark(); game.addChild(shark); // Add several red fish swimming in the ocean var redFishArray = []; for (var i = 0; i < 3; i++) { var redFish = new RedFish(); redFishArray.push(redFish); game.addChild(redFish); } // Mouse/touch drag control for shark var draggingShark = false; // Handle drag start game.down = function (x, y, obj) { // Check if the press is on the shark (simple bounding box check) var dx = x - shark.x; var dy = y - shark.y; // Use shark asset size for hit area var halfW = 0.5 * shark.width; var halfH = 0.5 * shark.height; if (dx >= -halfW && dx <= halfW && dy >= -halfH && dy <= halfH) { draggingShark = true; // Move shark immediately to touch point shark.x = x; shark.y = y; } }; // Handle drag move game.move = function (x, y, obj) { if (draggingShark) { shark.x = x; shark.y = y; } }; // Handle drag end game.up = function (x, y, obj) { draggingShark = false; }; // Update fish and shark positions every frame game.update = function () { // Blue fish logic (grow) for (var i = 0; i < fishArray.length; i++) { var fish = fishArray[i]; fish.update(); // Track lastWasIntersecting for each fish if (typeof fish.lastWasIntersecting === "undefined") { fish.lastWasIntersecting = false; } var isIntersecting = shark.intersects(fish); // If shark just started intersecting with this fish, "eat" it if (!fish.lastWasIntersecting && isIntersecting) { // Move fish to a new random position and speed fish.x = -100; fish.y = 400 + Math.random() * 1800; fish.speed = 2 + Math.random() * 3; // Increment score and update display score++; scoreTxt.setText(score + ""); // Grow the shark a bit each time it eats a fish if (typeof shark._scaleX === "undefined") { shark._scaleX = 1; shark._scaleY = 1; } // Increase scale by 5% per fish eaten shark._scaleX *= 1.05; shark._scaleY *= 1.05; // Clamp max scale to avoid infinite growth if (shark._scaleX > 3) shark._scaleX = 3; if (shark._scaleY > 3) shark._scaleY = 3; shark.scaleX = shark._scaleX; shark.scaleY = shark._scaleY; } fish.lastWasIntersecting = isIntersecting; } // Increase blue fish speed every 10 score if (score > 0 && score % 10 === 0 && typeof game.lastSpeedUpScore !== "number") { for (var s = 0; s < fishArray.length; s++) { fishArray[s].speed += 1; } game.lastSpeedUpScore = score; } if (score % 10 !== 0) { game.lastSpeedUpScore = undefined; } // Red fish logic (shrink) for (var j = 0; j < redFishArray.length; j++) { var redFish = redFishArray[j]; redFish.update(); if (typeof redFish.lastWasIntersecting === "undefined") { redFish.lastWasIntersecting = false; } var isRedIntersecting = shark.intersects(redFish); // If shark just started intersecting with this red fish, "eat" it and shrink if (!redFish.lastWasIntersecting && isRedIntersecting) { // Move red fish to a new random position and speed redFish.x = -100; redFish.y = 400 + Math.random() * 1800; redFish.speed = 2 + Math.random() * 3; // Shrink the shark a bit each time it eats a red fish if (typeof shark._scaleX === "undefined") { shark._scaleX = 1; shark._scaleY = 1; } // Decrease scale by 10% per red fish eaten shark._scaleX *= 0.90; shark._scaleY *= 0.90; // Clamp min scale to avoid disappearing if (shark._scaleX < 0.4) shark._scaleX = 0.4; if (shark._scaleY < 0.4) shark._scaleY = 0.4; shark.scaleX = shark._scaleX; shark.scaleY = shark._scaleY; } redFish.lastWasIntersecting = isRedIntersecting; } // After score reaches 100, increase the number of red fish if not already done if (score >= 100 && !game.redFishIncreased) { // Add 5 more red fish for (var add = 0; add < 5; add++) { var extraRedFish = new RedFish(); redFishArray.push(extraRedFish); game.addChild(extraRedFish); } game.redFishIncreased = true; } // End game if score reaches targetScore before timer runs out (win condition) if (score >= targetScore && secondsLeft > 0) { // If currently on level 1, immediately start level 2 instead of showing win screen if (currentLevel === 1) { // Set persistent storage for level 2 if (typeof storage !== "undefined" && typeof storage.setItem === "function") { storage.setItem("level", 2); } // Reset level 2 parameters currentLevel = 2; secondsLeft = 60; targetScore = 30; // CHANGED: Level 2 target is 30 for transition to level 3 score = 0; scoreTxt.setText(score + ""); timerTxt.setText(secondsLeft + ""); // Clear and restart timer if (typeof timerInterval !== "undefined") { LK.clearInterval(timerInterval); timerInterval = undefined; } timerInterval = LK.setInterval(function () { if (secondsLeft > 0) { secondsLeft--; timerTxt.setText(secondsLeft + ""); if (secondsLeft === 0 && score < targetScore) { LK.showGameOver(); } } }, 1000); // Optionally reset shark size for new level if (typeof shark._scaleX !== "undefined") { shark._scaleX = 1; shark._scaleY = 1; shark.scaleX = 1; shark.scaleY = 1; } // Optionally reset red fish count for level 2 if (game.redFishIncreased) { // Remove extra red fish from game for (var i = redFishArray.length - 1; i >= 3; i--) { if (typeof redFishArray[i].destroy === "function") { redFishArray[i].destroy(); } redFishArray.splice(i, 1); } game.redFishIncreased = false; } // Move all fish and red fish to new random positions for (var i = 0; i < fishArray.length; i++) { fishArray[i].x = Math.random() < 0.5 ? -100 : 2048 + 100; fishArray[i].y = 400 + Math.random() * 1800; fishArray[i].speed = (2 + Math.random() * 3) * (Math.random() < 0.5 ? 1 : -1); } for (var j = 0; j < redFishArray.length; j++) { redFishArray[j].x = Math.random() < 0.5 ? -100 : 2048 + 100; redFishArray[j].y = 400 + Math.random() * 1800; redFishArray[j].speed = (2 + Math.random() * 3) * (Math.random() < 0.5 ? 1 : -1); } // Move shark to center shark.x = 1024; shark.y = 1366; // Return so win screen is not shown return; } // If currently on level 2, immediately start level 3 instead of showing win screen if (currentLevel === 2) { // Set persistent storage for level 3 if (typeof storage !== "undefined" && typeof storage.setItem === "function") { storage.setItem("level", 3); } // Reset level 3 parameters currentLevel = 3; secondsLeft = 60; targetScore = 30; // Level 3 target is now 30 score = 0; scoreTxt.setText(score + ""); timerTxt.setText(secondsLeft + ""); // Clear and restart timer if (typeof timerInterval !== "undefined") { LK.clearInterval(timerInterval); timerInterval = undefined; } timerInterval = LK.setInterval(function () { if (secondsLeft > 0) { secondsLeft--; timerTxt.setText(secondsLeft + ""); if (secondsLeft === 0 && score < targetScore) { LK.showGameOver(); } } }, 1000); // Optionally reset shark size for new level if (typeof shark._scaleX !== "undefined") { shark._scaleX = 1; shark._scaleY = 1; shark.scaleX = 1; shark.scaleY = 1; } // Optionally reset red fish count for level 3 if (game.redFishIncreased) { // Remove extra red fish from game for (var i = redFishArray.length - 1; i >= 3; i--) { if (typeof redFishArray[i].destroy === "function") { redFishArray[i].destroy(); } redFishArray.splice(i, 1); } game.redFishIncreased = false; } // Move all fish and red fish to new random positions for (var i = 0; i < fishArray.length; i++) { fishArray[i].x = Math.random() < 0.5 ? -100 : 2048 + 100; fishArray[i].y = 400 + Math.random() * 1800; fishArray[i].speed = (2 + Math.random() * 3) * (Math.random() < 0.5 ? 1 : -1); } for (var j = 0; j < redFishArray.length; j++) { redFishArray[j].x = Math.random() < 0.5 ? -100 : 2048 + 100; redFishArray[j].y = 400 + Math.random() * 1800; redFishArray[j].speed = (2 + Math.random() * 3) * (Math.random() < 0.5 ? 1 : -1); } // Move shark to center shark.x = 1024; shark.y = 1366; // Return so win screen is not shown return; } // End game if score reaches targetScore before timer runs out (win condition) in level 3 if (currentLevel === 3 && score >= targetScore && secondsLeft > 0) { if (typeof timerInterval !== "undefined") { LK.clearInterval(timerInterval); timerInterval = undefined; } if (typeof rareFishTimer !== "undefined") { LK.clearInterval(rareFishTimer); rareFishTimer = undefined; } LK.showYouWin(); return; } // Store level info in persistent storage for next game if (typeof storage !== "undefined") { var nextLevel = currentLevel; if (typeof storage.getItem === "function") { var storedLevel = parseInt(storage.getItem("level")); if (!isNaN(storedLevel)) { nextLevel = storedLevel; } } // If player just won level 1, set next level to 2 if (nextLevel === 1) { storage.setItem("level", 2); } } if (typeof timerInterval !== "undefined") { LK.clearInterval(timerInterval); timerInterval = undefined; } LK.showYouWin(); } // Always update shark to track lastX/lastY for movement shark.update(); // Rare fish (nadir balığı) collision and cleanup if (rareFish) { rareFish.update && rareFish.update(); if (typeof rareFish.lastWasIntersecting === "undefined") { rareFish.lastWasIntersecting = false; } var isRareIntersecting = shark.intersects(rareFish); if (!rareFish.lastWasIntersecting && isRareIntersecting) { // Play bomb sound if (typeof LK.getSound === "function") { var bombSound = LK.getSound('bomb'); if (bombSound && typeof bombSound.play === "function") { bombSound.play(); } } // Remove rare fish from game if (typeof rareFish.destroy === "function") { rareFish.destroy(); } rareFish = null; // End the game immediately when rare fish is eaten if (typeof timerInterval !== "undefined") { LK.clearInterval(timerInterval); timerInterval = undefined; } if (typeof rareFishTimer !== "undefined") { LK.clearInterval(rareFishTimer); rareFishTimer = undefined; } LK.showGameOver(); return; } if (rareFish) { rareFish.lastWasIntersecting = isRareIntersecting; } } // Clear timer if game is over (defensive, in case LK.showGameOver is called elsewhere) if (typeof timerInterval !== "undefined" && (secondsLeft === 0 || typeof LK._gameOver !== "undefined" && LK._gameOver)) { LK.clearInterval(timerInterval); timerInterval = undefined; } // Also clear rare fish timer if game is over if (typeof rareFishTimer !== "undefined" && (secondsLeft === 0 || typeof LK._gameOver !== "undefined" && LK._gameOver)) { LK.clearInterval(rareFishTimer); rareFishTimer = undefined; if (rareFish && typeof rareFish.destroy === "function") { rareFish.destroy(); rareFish = null; } } };
/****
* Classes
****/
// Fish class: represents a single fish swimming in the ocean
var Fish = Container.expand(function () {
var self = Container.call(this);
// Create a simple ellipse as the fish
var fishAsset = self.attachAsset('fish', {
width: 120,
height: 60,
color: 0xffcc66,
shape: 'ellipse',
anchorX: 0.5,
anchorY: 0.5
});
// Randomize initial position, speed, and direction
self.direction = Math.random() < 0.5 ? 1 : -1; // 1: right, -1: left
if (self.direction === 1) {
self.x = Math.random() * 1024; // left half
} else {
self.x = 1024 + Math.random() * 1024; // right half
}
self.y = 400 + Math.random() * 1800;
self.speed = (2 + Math.random() * 3) * self.direction;
// Track lastX for edge detection
self.lastX = self.x;
// Fish swims in both directions, loops back when off screen
self.update = function () {
self.lastX = self.x;
self.x += self.speed;
// Flip fish asset horizontally if swimming left, normal if right
if (self.direction === 1) {
if (typeof fishAsset !== "undefined") fishAsset.scaleX = 1;
} else {
if (typeof fishAsset !== "undefined") fishAsset.scaleX = -1;
}
if (self.direction === 1) {
// rightward
if (self.lastX <= 2048 && self.x > 2048) {
self.direction = Math.random() < 0.5 ? 1 : -1;
self.x = self.direction === 1 ? -100 : 2048 + 100;
self.y = 400 + Math.random() * 1800;
self.speed = (2 + Math.random() * 3) * self.direction;
}
} else {
// leftward
if (self.lastX >= -100 && self.x < -100) {
self.direction = Math.random() < 0.5 ? 1 : -1;
self.x = self.direction === 1 ? -100 : 2048 + 100;
self.y = 400 + Math.random() * 1800;
self.speed = (2 + Math.random() * 3) * self.direction;
}
}
};
return self;
});
var Ocean = Container.expand(function () {
var self = Container.call(this);
// Create a large blue rectangle as the ocean background
var oceanAsset = self.attachAsset('ocean', {
width: 2048,
height: 2732,
color: 0x3399ff,
shape: 'box',
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
return self;
});
// RareFish class: represents the rare black fish that appears every 10 seconds
var RareFish = Container.expand(function () {
var self = Container.call(this);
// Attach rare fish asset (black)
var rareFishAsset = self.attachAsset('rarefish', {
width: 240,
height: 120,
color: 0x000000,
shape: 'ellipse',
anchorX: 0.5,
anchorY: 0.5
});
// Randomize initial position, speed, and direction
self.direction = Math.random() < 0.5 ? 1 : -1; // 1: right, -1: left
if (self.direction === 1) {
self.x = Math.random() * 1024;
} else {
self.x = 1024 + Math.random() * 1024;
}
self.y = 400 + Math.random() * 1800;
self.speed = (2 + Math.random() * 3) * self.direction;
self.lastX = self.x;
// Rare fish swims in both directions, loops back when off screen
self.update = function () {
self.lastX = self.x;
self.x += self.speed;
// Flip rare fish asset horizontally if swimming left, normal if right
if (self.direction === 1) {
if (typeof rareFishAsset !== "undefined") rareFishAsset.scaleX = 1;
} else {
if (typeof rareFishAsset !== "undefined") rareFishAsset.scaleX = -1;
}
if (self.direction === 1) {
// rightward
if (self.lastX <= 2048 && self.x > 2048) {
self.direction = Math.random() < 0.5 ? 1 : -1;
self.x = self.direction === 1 ? -100 : 2048 + 100;
self.y = 400 + Math.random() * 1800;
self.speed = (2 + Math.random() * 3) * self.direction;
}
} else {
// leftward
if (self.lastX >= -100 && self.x < -100) {
self.direction = Math.random() < 0.5 ? 1 : -1;
self.x = self.direction === 1 ? -100 : 2048 + 100;
self.y = 400 + Math.random() * 1800;
self.speed = (2 + Math.random() * 3) * self.direction;
}
}
};
return self;
});
// Function to spawn rare fish
// RedFish class: represents a red fish that shrinks the shark
var RedFish = Container.expand(function () {
var self = Container.call(this);
// Attach red fish asset (nadir balığı is black)
var redFishAsset = self.attachAsset('redfish', {
width: 120,
height: 60,
color: 0x000000,
shape: 'ellipse',
anchorX: 0.5,
anchorY: 0.5
});
// Randomize initial position, speed, and direction
self.direction = Math.random() < 0.5 ? 1 : -1; // 1: right, -1: left
if (self.direction === 1) {
self.x = Math.random() * 1024;
} else {
self.x = 1024 + Math.random() * 1024;
}
self.y = 400 + Math.random() * 1800;
self.speed = (2 + Math.random() * 3) * self.direction;
// Track lastX for edge detection
self.lastX = self.x;
// Red fish swims in both directions, loops back when off screen
self.update = function () {
self.lastX = self.x;
self.x += self.speed;
// Flip red fish asset horizontally if swimming left, normal if right
if (self.direction === 1) {
if (typeof redFishAsset !== "undefined") redFishAsset.scaleX = 1;
} else {
if (typeof redFishAsset !== "undefined") redFishAsset.scaleX = -1;
}
if (self.direction === 1) {
// rightward
if (self.lastX <= 2048 && self.x > 2048) {
self.direction = Math.random() < 0.5 ? 1 : -1;
self.x = self.direction === 1 ? -100 : 2048 + 100;
self.y = 400 + Math.random() * 1800;
self.speed = (2 + Math.random() * 3) * self.direction;
}
} else {
// leftward
if (self.lastX >= -100 && self.x < -100) {
self.direction = Math.random() < 0.5 ? 1 : -1;
self.x = self.direction === 1 ? -100 : 2048 + 100;
self.y = 400 + Math.random() * 1800;
self.speed = (2 + Math.random() * 3) * self.direction;
}
}
};
return self;
});
// Shark class: represents the main character (shark) swimming in the ocean
var Shark = Container.expand(function () {
var self = Container.call(this);
// Attach a shark asset (box for now, can be replaced with a shark image asset)
var sharkAsset = self.attachAsset('shark', {
width: 220,
height: 100,
color: 0x444444,
shape: 'box',
anchorX: 0.5,
anchorY: 0.5
});
// Start in the center of the ocean
self.x = 1024;
self.y = 1366;
// Track lastX and lastY for possible future movement logic
self.lastX = self.x;
self.lastY = self.y;
// Shark update: just track lastX/lastY for drag movement
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Hide the mouse cursor during gameplay
if (typeof LK.setCursor === "function") {
LK.setCursor("none");
} else if (typeof stage !== "undefined" && stage.view && stage.view.style) {
stage.view.style.cursor = "none";
}
// Add ocean background
var ocean = new Ocean();
game.addChild(ocean);
// Play water sound as looping background music after first user interaction
var waterMusicStarted = false;
function startWaterMusic() {
if (!waterMusicStarted) {
LK.playMusic('water');
waterMusicStarted = true;
}
}
game.down = function (origDown) {
return function (x, y, obj) {
startWaterMusic();
if (typeof origDown === "function") origDown(x, y, obj);
};
}(game.down);
// Score system
var score = 0;
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
scoreTxt.x = LK.gui.top.width / 2;
scoreTxt.y = 10;
// Timer system
var secondsLeft = 60;
var targetScore = 30;
var currentLevel = 1;
// Check if player is on level 2 (after winning level 1)
if (typeof storage !== "undefined" && typeof storage.getItem === "function") {
var storedLevel = parseInt(storage.getItem("level"));
if (!isNaN(storedLevel) && storedLevel === 2) {
secondsLeft = 60;
targetScore = 120;
currentLevel = 2;
}
}
var timerTxt = new Text2(secondsLeft + '', {
size: 90,
fill: 0xFFFFFF
});
timerTxt.anchor.set(0.5, 1);
LK.gui.bottom.addChild(timerTxt);
// Place timer at bottom center, but a bit higher
timerTxt.x = LK.gui.bottom.width / 2;
timerTxt.y = LK.gui.bottom.height - 120;
// Timer interval
var timerInterval = LK.setInterval(function () {
if (secondsLeft > 0) {
secondsLeft--;
timerTxt.setText(secondsLeft + "");
if (secondsLeft === 0 && score < targetScore) {
LK.showGameOver();
}
}
}, 1000);
// Add several fish swimming in the ocean
var fishArray = [];
for (var i = 0; i < 7; i++) {
var fish = new Fish();
fishArray.push(fish);
game.addChild(fish);
}
// Rare fish (nadir balığı) logic
var rareFish = null;
var rareFishTimer = null;
// Function to spawn rare fish
function spawnRareFish() {
// Remove previous rare fish if exists
if (rareFish && typeof rareFish.destroy === "function") {
rareFish.destroy();
rareFish = null;
}
rareFish = new RareFish();
// Place rare fish at a random position, but ensure it's visible
rareFish.direction = Math.random() < 0.5 ? 1 : -1;
if (rareFish.direction === 1) {
rareFish.x = Math.random() * 1024;
} else {
rareFish.x = 1024 + Math.random() * 1024;
}
rareFish.y = 400 + Math.random() * 1800;
rareFish.speed = (2 + Math.random() * 3) * rareFish.direction;
game.addChild(rareFish);
}
// Start timer to spawn rare fish every 30 seconds
rareFishTimer = LK.setInterval(function () {
spawnRareFish();
}, 30000);
// Spawn the first rare fish immediately
spawnRareFish();
// Add the shark character to the game
var shark = new Shark();
game.addChild(shark);
// Add several red fish swimming in the ocean
var redFishArray = [];
for (var i = 0; i < 3; i++) {
var redFish = new RedFish();
redFishArray.push(redFish);
game.addChild(redFish);
}
// Mouse/touch drag control for shark
var draggingShark = false;
// Handle drag start
game.down = function (x, y, obj) {
// Check if the press is on the shark (simple bounding box check)
var dx = x - shark.x;
var dy = y - shark.y;
// Use shark asset size for hit area
var halfW = 0.5 * shark.width;
var halfH = 0.5 * shark.height;
if (dx >= -halfW && dx <= halfW && dy >= -halfH && dy <= halfH) {
draggingShark = true;
// Move shark immediately to touch point
shark.x = x;
shark.y = y;
}
};
// Handle drag move
game.move = function (x, y, obj) {
if (draggingShark) {
shark.x = x;
shark.y = y;
}
};
// Handle drag end
game.up = function (x, y, obj) {
draggingShark = false;
};
// Update fish and shark positions every frame
game.update = function () {
// Blue fish logic (grow)
for (var i = 0; i < fishArray.length; i++) {
var fish = fishArray[i];
fish.update();
// Track lastWasIntersecting for each fish
if (typeof fish.lastWasIntersecting === "undefined") {
fish.lastWasIntersecting = false;
}
var isIntersecting = shark.intersects(fish);
// If shark just started intersecting with this fish, "eat" it
if (!fish.lastWasIntersecting && isIntersecting) {
// Move fish to a new random position and speed
fish.x = -100;
fish.y = 400 + Math.random() * 1800;
fish.speed = 2 + Math.random() * 3;
// Increment score and update display
score++;
scoreTxt.setText(score + "");
// Grow the shark a bit each time it eats a fish
if (typeof shark._scaleX === "undefined") {
shark._scaleX = 1;
shark._scaleY = 1;
}
// Increase scale by 5% per fish eaten
shark._scaleX *= 1.05;
shark._scaleY *= 1.05;
// Clamp max scale to avoid infinite growth
if (shark._scaleX > 3) shark._scaleX = 3;
if (shark._scaleY > 3) shark._scaleY = 3;
shark.scaleX = shark._scaleX;
shark.scaleY = shark._scaleY;
}
fish.lastWasIntersecting = isIntersecting;
}
// Increase blue fish speed every 10 score
if (score > 0 && score % 10 === 0 && typeof game.lastSpeedUpScore !== "number") {
for (var s = 0; s < fishArray.length; s++) {
fishArray[s].speed += 1;
}
game.lastSpeedUpScore = score;
}
if (score % 10 !== 0) {
game.lastSpeedUpScore = undefined;
}
// Red fish logic (shrink)
for (var j = 0; j < redFishArray.length; j++) {
var redFish = redFishArray[j];
redFish.update();
if (typeof redFish.lastWasIntersecting === "undefined") {
redFish.lastWasIntersecting = false;
}
var isRedIntersecting = shark.intersects(redFish);
// If shark just started intersecting with this red fish, "eat" it and shrink
if (!redFish.lastWasIntersecting && isRedIntersecting) {
// Move red fish to a new random position and speed
redFish.x = -100;
redFish.y = 400 + Math.random() * 1800;
redFish.speed = 2 + Math.random() * 3;
// Shrink the shark a bit each time it eats a red fish
if (typeof shark._scaleX === "undefined") {
shark._scaleX = 1;
shark._scaleY = 1;
}
// Decrease scale by 10% per red fish eaten
shark._scaleX *= 0.90;
shark._scaleY *= 0.90;
// Clamp min scale to avoid disappearing
if (shark._scaleX < 0.4) shark._scaleX = 0.4;
if (shark._scaleY < 0.4) shark._scaleY = 0.4;
shark.scaleX = shark._scaleX;
shark.scaleY = shark._scaleY;
}
redFish.lastWasIntersecting = isRedIntersecting;
}
// After score reaches 100, increase the number of red fish if not already done
if (score >= 100 && !game.redFishIncreased) {
// Add 5 more red fish
for (var add = 0; add < 5; add++) {
var extraRedFish = new RedFish();
redFishArray.push(extraRedFish);
game.addChild(extraRedFish);
}
game.redFishIncreased = true;
}
// End game if score reaches targetScore before timer runs out (win condition)
if (score >= targetScore && secondsLeft > 0) {
// If currently on level 1, immediately start level 2 instead of showing win screen
if (currentLevel === 1) {
// Set persistent storage for level 2
if (typeof storage !== "undefined" && typeof storage.setItem === "function") {
storage.setItem("level", 2);
}
// Reset level 2 parameters
currentLevel = 2;
secondsLeft = 60;
targetScore = 30; // CHANGED: Level 2 target is 30 for transition to level 3
score = 0;
scoreTxt.setText(score + "");
timerTxt.setText(secondsLeft + "");
// Clear and restart timer
if (typeof timerInterval !== "undefined") {
LK.clearInterval(timerInterval);
timerInterval = undefined;
}
timerInterval = LK.setInterval(function () {
if (secondsLeft > 0) {
secondsLeft--;
timerTxt.setText(secondsLeft + "");
if (secondsLeft === 0 && score < targetScore) {
LK.showGameOver();
}
}
}, 1000);
// Optionally reset shark size for new level
if (typeof shark._scaleX !== "undefined") {
shark._scaleX = 1;
shark._scaleY = 1;
shark.scaleX = 1;
shark.scaleY = 1;
}
// Optionally reset red fish count for level 2
if (game.redFishIncreased) {
// Remove extra red fish from game
for (var i = redFishArray.length - 1; i >= 3; i--) {
if (typeof redFishArray[i].destroy === "function") {
redFishArray[i].destroy();
}
redFishArray.splice(i, 1);
}
game.redFishIncreased = false;
}
// Move all fish and red fish to new random positions
for (var i = 0; i < fishArray.length; i++) {
fishArray[i].x = Math.random() < 0.5 ? -100 : 2048 + 100;
fishArray[i].y = 400 + Math.random() * 1800;
fishArray[i].speed = (2 + Math.random() * 3) * (Math.random() < 0.5 ? 1 : -1);
}
for (var j = 0; j < redFishArray.length; j++) {
redFishArray[j].x = Math.random() < 0.5 ? -100 : 2048 + 100;
redFishArray[j].y = 400 + Math.random() * 1800;
redFishArray[j].speed = (2 + Math.random() * 3) * (Math.random() < 0.5 ? 1 : -1);
}
// Move shark to center
shark.x = 1024;
shark.y = 1366;
// Return so win screen is not shown
return;
}
// If currently on level 2, immediately start level 3 instead of showing win screen
if (currentLevel === 2) {
// Set persistent storage for level 3
if (typeof storage !== "undefined" && typeof storage.setItem === "function") {
storage.setItem("level", 3);
}
// Reset level 3 parameters
currentLevel = 3;
secondsLeft = 60;
targetScore = 30; // Level 3 target is now 30
score = 0;
scoreTxt.setText(score + "");
timerTxt.setText(secondsLeft + "");
// Clear and restart timer
if (typeof timerInterval !== "undefined") {
LK.clearInterval(timerInterval);
timerInterval = undefined;
}
timerInterval = LK.setInterval(function () {
if (secondsLeft > 0) {
secondsLeft--;
timerTxt.setText(secondsLeft + "");
if (secondsLeft === 0 && score < targetScore) {
LK.showGameOver();
}
}
}, 1000);
// Optionally reset shark size for new level
if (typeof shark._scaleX !== "undefined") {
shark._scaleX = 1;
shark._scaleY = 1;
shark.scaleX = 1;
shark.scaleY = 1;
}
// Optionally reset red fish count for level 3
if (game.redFishIncreased) {
// Remove extra red fish from game
for (var i = redFishArray.length - 1; i >= 3; i--) {
if (typeof redFishArray[i].destroy === "function") {
redFishArray[i].destroy();
}
redFishArray.splice(i, 1);
}
game.redFishIncreased = false;
}
// Move all fish and red fish to new random positions
for (var i = 0; i < fishArray.length; i++) {
fishArray[i].x = Math.random() < 0.5 ? -100 : 2048 + 100;
fishArray[i].y = 400 + Math.random() * 1800;
fishArray[i].speed = (2 + Math.random() * 3) * (Math.random() < 0.5 ? 1 : -1);
}
for (var j = 0; j < redFishArray.length; j++) {
redFishArray[j].x = Math.random() < 0.5 ? -100 : 2048 + 100;
redFishArray[j].y = 400 + Math.random() * 1800;
redFishArray[j].speed = (2 + Math.random() * 3) * (Math.random() < 0.5 ? 1 : -1);
}
// Move shark to center
shark.x = 1024;
shark.y = 1366;
// Return so win screen is not shown
return;
}
// End game if score reaches targetScore before timer runs out (win condition) in level 3
if (currentLevel === 3 && score >= targetScore && secondsLeft > 0) {
if (typeof timerInterval !== "undefined") {
LK.clearInterval(timerInterval);
timerInterval = undefined;
}
if (typeof rareFishTimer !== "undefined") {
LK.clearInterval(rareFishTimer);
rareFishTimer = undefined;
}
LK.showYouWin();
return;
}
// Store level info in persistent storage for next game
if (typeof storage !== "undefined") {
var nextLevel = currentLevel;
if (typeof storage.getItem === "function") {
var storedLevel = parseInt(storage.getItem("level"));
if (!isNaN(storedLevel)) {
nextLevel = storedLevel;
}
}
// If player just won level 1, set next level to 2
if (nextLevel === 1) {
storage.setItem("level", 2);
}
}
if (typeof timerInterval !== "undefined") {
LK.clearInterval(timerInterval);
timerInterval = undefined;
}
LK.showYouWin();
}
// Always update shark to track lastX/lastY for movement
shark.update();
// Rare fish (nadir balığı) collision and cleanup
if (rareFish) {
rareFish.update && rareFish.update();
if (typeof rareFish.lastWasIntersecting === "undefined") {
rareFish.lastWasIntersecting = false;
}
var isRareIntersecting = shark.intersects(rareFish);
if (!rareFish.lastWasIntersecting && isRareIntersecting) {
// Play bomb sound
if (typeof LK.getSound === "function") {
var bombSound = LK.getSound('bomb');
if (bombSound && typeof bombSound.play === "function") {
bombSound.play();
}
}
// Remove rare fish from game
if (typeof rareFish.destroy === "function") {
rareFish.destroy();
}
rareFish = null;
// End the game immediately when rare fish is eaten
if (typeof timerInterval !== "undefined") {
LK.clearInterval(timerInterval);
timerInterval = undefined;
}
if (typeof rareFishTimer !== "undefined") {
LK.clearInterval(rareFishTimer);
rareFishTimer = undefined;
}
LK.showGameOver();
return;
}
if (rareFish) {
rareFish.lastWasIntersecting = isRareIntersecting;
}
}
// Clear timer if game is over (defensive, in case LK.showGameOver is called elsewhere)
if (typeof timerInterval !== "undefined" && (secondsLeft === 0 || typeof LK._gameOver !== "undefined" && LK._gameOver)) {
LK.clearInterval(timerInterval);
timerInterval = undefined;
}
// Also clear rare fish timer if game is over
if (typeof rareFishTimer !== "undefined" && (secondsLeft === 0 || typeof LK._gameOver !== "undefined" && LK._gameOver)) {
LK.clearInterval(rareFishTimer);
rareFishTimer = undefined;
if (rareFish && typeof rareFish.destroy === "function") {
rareFish.destroy();
rareFish = null;
}
}
};