User prompt
When I click on "ship1" icon or touch it while on phone, make "ship1" playable, do the same for "ship" Do not make the picture of the asset "ship" and the picture of the asset "ship1" disappear
User prompt
Make the picture of asset "boomeffect" and the picture of asset "smokeeffect" appear with animations for 2 seconds Add the pictures of the assets "ship" and "ship1" on the picture of the asset "customwhitewall" Add the picture of the asset "behindshipcustom" right behind the pictures of the assets "ship" and "ship1" When the mouse icon is on the picture of the asset "behindshipcustom", replace it with the picture of the asset "behindshipcustom1" When the mouse icon is not on the picture of the asset "behindshipcustom", do not replace it with the picture of the asset "behindshipcustom1" When I click When I click on "ship1" icon or touch it while on phone, make "ship1" playable, do the same for "ship" ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
When the picture of asset "ship" hits the picture of asset "islandreal" or "stone", if the amount of heart is 1, then make the picture of asset "boomeffect" and the picture of asset "smokeeffect" appear with animations. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
When the amount of the picture of the asset "heart" is 0 and when the picture of the asset "ship" hits the picture of the asset "stone" or the picture of the asset "islandreal", show the pictures of the assets "boomeffect".
User prompt
When the amount of the picture of the asset "heart" is 0, then stop the game entirely. Decrease the amount of the pictures of the assets "stone", "wave", "obstacle" Make the pictures of the assets "stone" stable
User prompt
Remove the picture of the asset "customizationcaptainlogo" from the right down corner of the picture of the asset "marketwall" Add the picture of the asset "customizationcaptainlogo" to the right down corner of the picture of the asset "customwhitewall"
User prompt
When the picture of asset "ship" hits the picture of asset "islandreal", if the amount of heart is 1, then make the picture of asset "boomeffect" and the picture of asset "smokeeffect" appear with animations. And stop the game and every other thing that moves. Add the pictures of assets "coinreal", "coinreal1", "coinreal2", "coinreal3" When the picture of asset "ship" gets picture of asset "coinreal", add 5 to the coins. When the picture of asset "ship" gets picture of asset "coinreal1", add 4 to the coins. When the picture of asset "ship" gets picture of asset "coinreal2", add 3 to the coins. When the picture of asset "ship" gets picture of asset "coinreal3", add 2 to the coins. Do not ask any question at the beggining of the game. When a question pops out, if the question is not answered during the given limited duration, then remove 1 heart. Show less amount of the picture of asset "seagullreal" during the game. Use the picture of asset "redbartime" as a time bar for questions, and make the colour inside the bar it fade from right to left as the time runs out. Put the picture of asset "customizationshiplogo" at the right bottom corner, put it on the word "Coins". When I click on "customizationshiplogo" icon or touch it while on phone, I want you to open the picture of the asset "customwhitewall". Add the picture of the asset "blackxkapatma" to the left upper corner of the picture of the asset "customwhitewall". Add the picture of the asset "customizationcaptainlogo" to the right down corner of the picture of the asset "marketwall" When I click on "blackxkapatma" icon or touch it while on phone, I want you to close the picture of the asset "customwhitewall". Do not close the picture of the asset "marketwall" until I click on "xkapatma" icon or touch it while on phone. When I click on "customizationshiplogo" and "marketreal" icon or touch it while on phone, do not open the pictures of assets, "xkapatma", "blackxkapatma", "brickwall", "customwhitewall". ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
When distance shows a number between 5000 and 8000, spawn the picture of the asset "port1" to direct right or left part of the game, make it look sticked to the sides. And remove the picture of the asset "islandreal", "pirate", "stone", "wave", and "obstacle" nearby the picture of the asset "port1". So that, the picture of the asset "ship" get close to the picture of the asset "port1". When the picture of the asset "ship" touches the picture of the asset "port1", open the picture of the asset "brickwall" Add the picture of the asset "xkapatma" to the left upper corner of the picture of the asset "brickwall" When I click on "xkapatma" icon or touch it while on phone, I want you to close the picture of the asset "brickwall"
User prompt
Do not close the picture of the asset "marketwall" until I click on "xkapatma" icon or touch it while on phone
User prompt
Add the picture of the asset "xkapatma" to the left upper corner of the picture of the asset "marketwall" When I click on "xkapatma" icon or touch it while on phone, I want you to close the picture of the asset "marketwall" Add the picture of the asset "sellermarket" to the right down corner of the picture of the asset "marketwall"
User prompt
As I collect the coins, sum up their value and show it in "Coins" part at the down right corner of the game. Put the "crew" text to the down left corner When I click on "marketreal" icon or touch it while on phone, I want you to open the picture of the asset "marketwall"
User prompt
Put the icon of the asset "marketreal" above the "crew" text, but leave some distance between them, do not make them stick together.
User prompt
Make the seagulls appear often. Add the icon of the asset "marketreal" and place it right on the "crew" text, but leave some distance between them, do not make them stick together. Change the value of coins from 2 to 5, and make the coin look bigger as the number increases. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Use the asset named "rainreal" as rain, add a raining animation to it, and create many of them to make it look like it is raining. When the main ship hits the "islandreal" asset, remove one heart. Add a heart to the game that we can grab to heal ourselves, but do not add many, only a few. Make the hearts appear rarely. Change the time bar color to red, it is black at the moment. Use the asset named "seagullreal", make them fly straight without blocking the view of the ship, and create their shadows opposite to the sun which is on the right side of the game. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Make some waves bigger than their normal size. Also, use the new asset named "coinreal" as a coin. Add an island using the asset named "islandreal", keep it stable without movement, and make it a little smaller than the main ship. Add times of day: morning, noon, and night, and change them slowly instead of quickly. Do not forget to add rain but make it appear rarely, not always. Add a group of seagulls flying straight without blocking the view of the ship, and create their shadows opposite to the sun which is on the right side of the game. When a question pops up, add a red stick time bar, and make the red color fade from right to left as time runs out. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Remix started
Copy Maritime Quiz Navigator
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coinreal', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.coinValue = 5; // Default coin value
self.update = function () {
if (gamePaused) {
return;
} // Freeze movement during quiz
self.y += self.speed;
coinGraphics.rotation += 0.1;
};
return self;
});
var Coin1 = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coinreal1', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.coinValue = 4; // Coin1 value
self.update = function () {
if (gamePaused) {
return;
}
self.y += self.speed;
coinGraphics.rotation += 0.1;
};
return self;
});
var Coin2 = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coinreal2', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.coinValue = 3; // Coin2 value
self.update = function () {
if (gamePaused) {
return;
}
self.y += self.speed;
coinGraphics.rotation += 0.1;
};
return self;
});
var Coin3 = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coinreal3', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.coinValue = 2; // Coin3 value
self.update = function () {
if (gamePaused) {
return;
}
self.y += self.speed;
coinGraphics.rotation += 0.1;
};
return self;
});
var CrewMember = Container.expand(function () {
var self = Container.call(this);
var crewGraphics = self.attachAsset('crew', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.update = function () {
if (gamePaused) {
return;
} // Freeze movement during quiz
self.y += self.speed;
};
return self;
});
var HealHeart = Container.expand(function () {
var self = Container.call(this);
var heartGraphics = self.attachAsset('heart', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1.5
});
self.speed = 3;
self.bobPhase = Math.random() * Math.PI * 2;
self.update = function () {
if (gamePaused) {
return;
}
self.y += self.speed;
// Heart floating animation
var time = LK.ticks * 0.08;
heartGraphics.y = Math.sin(time + self.bobPhase) * 2;
heartGraphics.scaleX = 1.5 + Math.sin(time * 2 + self.bobPhase) * 0.2;
heartGraphics.scaleY = 1.5 + Math.sin(time * 2 + self.bobPhase) * 0.2;
// Gentle glow effect
heartGraphics.alpha = 0.9 + Math.sin(time * 3) * 0.1;
};
return self;
});
var Island = Container.expand(function () {
var self = Container.call(this);
var islandGraphics = self.attachAsset('islandreal', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8
});
self.speed = 2;
self.update = function () {
if (gamePaused) {
return;
}
self.y += self.speed;
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.update = function () {
if (gamePaused) {
return;
} // Freeze movement during quiz
self.y += self.speed;
};
return self;
});
var Pirate = Container.expand(function () {
var self = Container.call(this);
var pirateGraphics = self.attachAsset('pirate', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.update = function () {
if (gamePaused) {
return;
} // Freeze movement during quiz
self.y += self.speed;
};
return self;
});
var Port = Container.expand(function () {
var self = Container.call(this);
var portGraphics = self.attachAsset('port1', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.update = function () {
if (gamePaused) {
return;
}
self.y += self.speed;
};
return self;
});
var Rain = Container.expand(function () {
var self = Container.call(this);
var rainGraphics = self.attachAsset('rainreal', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8,
alpha: 0.7
});
self.speed = 12 + Math.random() * 8;
self.angle = -0.3 + Math.random() * 0.6;
self.rotationSpeed = 0.1 + Math.random() * 0.1;
self.update = function () {
if (gamePaused) {
return;
}
self.y += self.speed;
self.x += Math.sin(self.angle) * 3;
rainGraphics.rotation += self.rotationSpeed;
// Add falling animation effect
rainGraphics.alpha = 0.4 + Math.sin(LK.ticks * 0.2 + self.x * 0.01) * 0.3;
};
return self;
});
var Seagull = Container.expand(function () {
var self = Container.call(this);
var seagullGraphics = self.attachAsset('seagullreal', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.0,
scaleY: 1.0
});
self.speed = 1.5;
self.horizontalSpeed = 0.5; // Fly straight, not blocking view
self.bobAmplitude = 1.0 + Math.random() * 0.5;
self.bobPhase = Math.random() * Math.PI * 2;
self.update = function () {
if (gamePaused) {
return;
}
self.y += self.speed;
self.x += self.horizontalSpeed;
// Add bobbing motion
var time = LK.ticks * 0.05;
seagullGraphics.y = Math.sin(time + self.bobPhase) * self.bobAmplitude;
// Wing flapping animation
seagullGraphics.scaleY = 1.0 + Math.sin(time * 4 + self.bobPhase) * 0.1;
};
return self;
});
var SeagullShadow = Container.expand(function () {
var self = Container.call(this);
var shadowGraphics = self.attachAsset('seagullreal', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8,
alpha: 0.4
});
shadowGraphics.tint = 0x111111;
self.speed = 1.5;
self.horizontalSpeed = 0.5;
self.update = function () {
if (gamePaused) {
return;
}
self.y += self.speed;
self.x += self.horizontalSpeed;
// Subtle shadow movement
var time = LK.ticks * 0.03;
shadowGraphics.alpha = 0.2 + Math.sin(time) * 0.1;
};
return self;
});
var Ship = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('ship', {
anchorX: 0.5,
anchorY: 0.5
});
self.baseSpeed = 3;
self.currentSpeed = self.baseSpeed;
self.isShielded = false;
self.shieldTime = 0;
self.stickyTime = 0;
self.isSizeModified = false;
self.sizeTime = 0;
self.originalScale = 1;
var shieldGraphics = self.attachAsset('shield', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.5
});
shieldGraphics.visible = false;
self.activateShield = function () {
self.isShielded = true;
self.shieldTime = 300;
shieldGraphics.visible = true;
};
self.activateStickyControls = function () {
self.stickyTime = 300;
};
self.setSizeModifier = function (scale, duration) {
self.isSizeModified = true;
self.sizeTime = duration;
tween(shipGraphics, {
scaleX: scale,
scaleY: scale
}, {
duration: 200
});
tween(shieldGraphics, {
scaleX: scale,
scaleY: scale
}, {
duration: 200
});
};
self.update = function () {
if (gamePaused) {
return;
} // Freeze movement when game is paused
if (self.shieldTime > 0) {
self.shieldTime--;
if (self.shieldTime <= 0) {
self.isShielded = false;
shieldGraphics.visible = false;
}
}
if (self.stickyTime > 0) {
self.stickyTime--;
}
if (self.sizeTime > 0) {
self.sizeTime--;
if (self.sizeTime <= 0) {
self.isSizeModified = false;
tween(shipGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 200
});
tween(shieldGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 200
});
}
}
// Ship stays in place - world moves around it
};
return self;
});
var Stone = Container.expand(function () {
var self = Container.call(this);
var stoneGraphics = self.attachAsset('stone', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 7;
self.update = function () {
if (gamePaused) {
return;
} // Freeze movement during quiz
self.y += self.speed;
stoneGraphics.rotation += 0.08;
};
return self;
});
var Sunlight = Container.expand(function () {
var self = Container.call(this);
var sunGraphics = self.attachAsset('sunlight', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1;
self.intensity = 0.4 + Math.random() * 0.3;
self.rayWidth = 0.8 + Math.random() * 0.4;
self.flickerSpeed = 0.03 + Math.random() * 0.02;
self.update = function () {
if (gamePaused) {
return;
}
self.y += self.speed;
// Realistic sunlight ray animation with flickering and depth
var time = LK.ticks * self.flickerSpeed;
var flicker = Math.sin(time + self.x * 0.02) * 0.15;
var depth = Math.sin(time * 0.7 + self.y * 0.001) * 0.1;
// Dynamic alpha for realistic light penetration
sunGraphics.alpha = self.intensity + flicker + depth;
// Width variation for light scattering effect
sunGraphics.scaleX = self.rayWidth + Math.sin(time * 1.2) * 0.2;
// Subtle rotation for light movement
sunGraphics.rotation = Math.sin(time * 0.5) * 0.05;
// Color temperature variation
var warmth = 0.1 + Math.sin(time * 0.3) * 0.05;
if (level === 1) {
sunGraphics.tint = 0xFFFF99; // Bright daylight
} else if (level === 2) {
sunGraphics.tint = 0xFFCC66; // Warm sunset
} else if (level === 3) {
sunGraphics.tint = 0x9999FF; // Cool moonlight
} else {
sunGraphics.tint = 0xCCCCCC; // Storm light
}
};
return self;
});
var WaterTile = Container.expand(function () {
var self = Container.call(this);
var tileGraphics = self.attachAsset('waterTile', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.baseColor = 0x0066cc;
self.waveOffset = Math.random() * Math.PI * 2;
self.update = function () {
if (gamePaused) {
return;
}
self.y += self.speed;
// Create realistic water movement with multiple wave layers
var time = LK.ticks * 0.02;
var waveHeight = Math.sin(time + self.x * 0.005 + self.waveOffset) * 0.3;
var waveHeight2 = Math.sin(time * 1.3 + self.x * 0.008 + self.waveOffset + 1.5) * 0.2;
var combinedWave = waveHeight + waveHeight2;
// Dynamic alpha for wave depth simulation
tileGraphics.alpha = 0.85 + combinedWave * 0.15;
// Scale variation for wave surface texture
tileGraphics.scaleY = 1 + combinedWave * 0.1;
// Subtle horizontal movement for water flow
tileGraphics.x = Math.sin(time * 0.5 + self.y * 0.002) * 3;
};
return self;
});
var Wave = Container.expand(function () {
var self = Container.call(this);
var waveGraphics = self.attachAsset('wave', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.wavePhase = Math.random() * Math.PI * 2;
self.waveAmplitude = 0.8 + Math.random() * 0.4;
self.baseScale = 1 + Math.random() * 1.5; // Make some waves bigger
waveGraphics.scaleX = self.baseScale;
waveGraphics.scaleY = self.baseScale;
self.update = function () {
if (gamePaused) {
return;
} // Freeze movement during quiz
self.y += self.speed;
// Realistic wave motion with multiple frequencies
var time = LK.ticks * 0.08;
var primaryWave = Math.sin(time + self.wavePhase) * self.waveAmplitude;
var secondaryWave = Math.sin(time * 1.7 + self.wavePhase + 1) * 0.3;
var tertiaryWave = Math.sin(time * 2.3 + self.wavePhase + 2) * 0.15;
var combinedWave = primaryWave + secondaryWave + tertiaryWave;
// Dynamic scaling for wave height
waveGraphics.scaleX = self.baseScale + combinedWave * 0.2;
waveGraphics.scaleY = 1 + Math.abs(combinedWave) * 0.1;
// Wave crest highlighting
var crestIntensity = Math.max(0, combinedWave * 0.5);
waveGraphics.alpha = 0.8 + crestIntensity * 0.3;
// Subtle rotation for natural wave movement
waveGraphics.rotation = combinedWave * 0.1;
// Add foam effect on wave crests
if (combinedWave > 0.6) {
waveGraphics.tint = 0xFFFFFF; // White foam
} else {
// Water color based on level
if (level === 1) {
waveGraphics.tint = 0x4A90E2; // Bright blue
} else if (level === 2) {
waveGraphics.tint = 0x3A7BD5; // Darker blue
} else if (level === 3) {
waveGraphics.tint = 0x2A5AA0; // Night blue
} else {
waveGraphics.tint = 0x1A4A80; // Storm blue
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
var ship;
var obstacles = [];
var crewMembers = [];
var coins = [];
var hearts = [];
var waterTiles = [];
var sunlightRays = [];
var level = 1;
var health = 3;
var crewCount = 0;
var coinCount = 0;
var distance = 0;
var gamePaused = false;
var gameStarted = false;
var menuContainer = null;
var distanceText = new Text2('Distance: 0m', {
size: 50,
fill: 0x00FFFF,
stroke: 0x000033,
strokeThickness: 2
});
distanceText.anchor.set(0.5, 0);
distanceText.x = 0;
distanceText.y = 120;
LK.gui.top.addChild(distanceText);
var gameSpeed = 2;
var quizActive = false;
var quizTimer = 0;
var nextQuizTime = 48000; // Start first quiz after 8 seconds
var doubleCoinsTime = 0;
var extraObstaclesTime = 0;
var clearPathTime = 0;
var scoreFreezeTime = 0;
var timeOfDay = 'morning'; // morning, noon, night
var timeOfDayTimer = 0;
var weatherType = 'clear'; // clear, rain
var rainParticles = [];
var islands = [];
var seagulls = [];
var seagullShadows = [];
var healingHearts = [];
var ports = [];
var portSpawned = false;
var isRaining = false;
var rainTimer = 0;
// Quiz system
var quizQuestions = [{
question: "What does FOB stand for in shipping terms?",
answers: ["Free On Board", "Freight on Boat", "Foreign Object Bureau", "Full Ocean Bill"],
correct: 0
}, {
question: "Which maritime organization sets international shipping standards?",
answers: ["WHO", "IMO", "WTO", "ILO"],
correct: 1
}, {
question: "What is the front of a ship called?",
answers: ["Stern", "Port", "Bow", "Starboard"],
correct: 2
}, {
question: "EXW means the seller delivers when goods are:",
answers: ["At seller's premises", "On the ship", "At destination", "In transit"],
correct: 0
}, {
question: "What does CIF include in shipping terms?",
answers: ["Cost only", "Insurance only", "Freight only", "Cost, Insurance, Freight"],
correct: 3
}, {
question: "What is the right side of a ship called?",
answers: ["Port", "Starboard", "Bow", "Stern"],
correct: 1
}, {
question: "DDP means the seller is responsible for:",
answers: ["Delivery at port", "Delivery duty paid", "Dock departure point", "Direct delivery purchase"],
correct: 1
}, {
question: "What does TEU stand for in container shipping?",
answers: ["Total Export Unit", "Twenty-foot Equivalent Unit", "Terminal Exchange Unit", "Transport Equipment Unit"],
correct: 1
}, {
question: "Which term means 'Carrier alongside ship'?",
answers: ["CAS", "FAS", "DAS", "PAS"],
correct: 1
}, {
question: "What is the kitchen area on a ship called?",
answers: ["Mess", "Galley", "Cabin", "Hold"],
correct: 1
}, {
question: "CFR includes which costs?",
answers: ["Cost and freight", "Cost, freight, risk", "Customs, freight, rate", "Container freight rate"],
correct: 0
}, {
question: "What does DAP stand for?",
answers: ["Delivery at place", "Dock arrival point", "Delivered at place", "Direct arrival point"],
correct: 2
}, {
question: "The left side of a ship is called:",
answers: ["Starboard", "Port", "Bow", "Stern"],
correct: 1
}, {
question: "What is a ship's maximum cargo capacity called?",
answers: ["Deadweight", "Gross tonnage", "Net tonnage", "Displacement"],
correct: 0
}, {
question: "FCA means:",
answers: ["Free carrier", "Freight cost allowance", "Full container access", "Forward cargo arrangement"],
correct: 0
}];
var currentQuiz = null;
var quizContainer = null;
var quizTimeRemaining = 600; // 10 seconds
var effectDisplay = null;
var lastAppliedEffect = '';
var effectExpirationDisplay = null;
var atmosphericParticles = [];
function spawnAtmosphericParticles(weatherType) {
// Clear existing particles
for (var i = atmosphericParticles.length - 1; i >= 0; i--) {
atmosphericParticles[i].destroy();
}
atmosphericParticles = [];
// Spawn new particles based on weather
var particleCount = weatherType === 'storm' ? 8 : 4;
for (var i = 0; i < particleCount; i++) {
var particle = createAtmosphericParticle(weatherType);
atmosphericParticles.push(particle);
game.addChild(particle);
}
}
function createAtmosphericParticle(weatherType) {
var particle = new Container();
var particleGraphics;
if (weatherType === 'day') {
// Light sparkles on water
particleGraphics = particle.attachAsset('sunlight', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.1,
scaleY: 0.3,
alpha: 0.3
});
particleGraphics.tint = 0xFFFFAA;
} else if (weatherType === 'sunset') {
// Warm light reflections
particleGraphics = particle.attachAsset('sunlight', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.15,
scaleY: 0.4,
alpha: 0.4
});
particleGraphics.tint = 0xFF9966;
} else if (weatherType === 'night') {
// Moonlight streaks
particleGraphics = particle.attachAsset('sunlight', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.08,
scaleY: 0.5,
alpha: 0.2
});
particleGraphics.tint = 0xCCDDFF;
} else {
// Storm effects
particleGraphics = particle.attachAsset('sunlight', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.05,
scaleY: 0.8,
alpha: 0.1
});
particleGraphics.tint = 0x888888;
}
particle.x = Math.random() * 2048;
particle.y = Math.random() * 2732;
particle.speed = 0.5 + Math.random() * 1.5;
particle.weatherType = weatherType;
particle.animationOffset = Math.random() * Math.PI * 2;
particle.update = function () {
if (gamePaused) {
return;
}
// Move particles slowly
this.y += this.speed;
if (this.y > 2800) {
this.y = -100;
this.x = Math.random() * 2048;
}
// Animate based on weather type
var time = LK.ticks * 0.02 + this.animationOffset;
if (this.weatherType === 'day') {
particleGraphics.alpha = 0.2 + Math.sin(time * 2) * 0.15;
} else if (this.weatherType === 'sunset') {
particleGraphics.alpha = 0.3 + Math.sin(time * 1.5) * 0.2;
particleGraphics.scaleX = 0.15 + Math.sin(time) * 0.05;
} else if (this.weatherType === 'night') {
particleGraphics.alpha = 0.15 + Math.sin(time * 3) * 0.1;
} else {
particleGraphics.alpha = 0.05 + Math.sin(time * 4) * 0.08;
particleGraphics.rotation = Math.sin(time * 2) * 0.3;
}
};
return particle;
}
// UI Elements - Better separated and positioned
var scoreText = new Text2('Score: 0', {
size: 65,
fill: 0x00FF00,
stroke: 0x000033,
strokeThickness: 2
});
scoreText.anchor.set(0.5, 0);
scoreText.x = 0;
scoreText.y = 20;
LK.gui.top.addChild(scoreText);
var levelText = new Text2('Level: 1', {
size: 60,
fill: 0xFFD700
});
levelText.anchor.set(1, 0);
levelText.x = -20;
levelText.y = 20;
LK.gui.topRight.addChild(levelText);
var crewText = new Text2('Crew: 0', {
size: 50,
fill: 0x00BFFF
});
crewText.anchor.set(0, 1);
crewText.x = 20;
crewText.y = -20;
LK.gui.bottomLeft.addChild(crewText);
var marketIcon = LK.getAsset('marketreal', {
anchorX: 0,
anchorY: 1
});
marketIcon.x = 20;
marketIcon.y = -80; // Move above crew text with spacing
marketIcon.down = function (x, y, obj) {
// Show market wall when market icon is clicked
var marketWall = LK.getAsset('marketwall', {
anchorX: 0.5,
anchorY: 0.5
});
marketWall.x = 1024;
marketWall.y = 1366;
marketWall.scaleX = 15;
marketWall.scaleY = 25;
game.addChild(marketWall);
// Add xkapatma icon to top left of marketwall
var xkapatmaIcon = LK.getAsset('xkapatma', {
anchorX: 0.5,
anchorY: 0.5
});
xkapatmaIcon.x = marketWall.x - marketWall.width * marketWall.scaleX / 2 + 100;
xkapatmaIcon.y = marketWall.y - marketWall.height * marketWall.scaleY / 2 + 100;
xkapatmaIcon.scaleX = 2;
xkapatmaIcon.scaleY = 2;
xkapatmaIcon.down = function (x, y, obj) {
// Close marketwall when xkapatma is clicked
if (marketWall) {
marketWall.destroy();
}
if (xkapatmaIcon) {
xkapatmaIcon.destroy();
}
if (sellerIcon) {
sellerIcon.destroy();
}
if (captainLogo) {
captainLogo.destroy();
}
};
game.addChild(xkapatmaIcon);
// Add sellermarket icon to bottom right of marketwall
var sellerIcon = LK.getAsset('sellermarket', {
anchorX: 0.5,
anchorY: 0.5
});
sellerIcon.x = marketWall.x + marketWall.width * marketWall.scaleX / 2 - 100;
sellerIcon.y = marketWall.y + marketWall.height * marketWall.scaleY / 2 - 100;
sellerIcon.scaleX = 2;
sellerIcon.scaleY = 2;
game.addChild(sellerIcon);
// Add customization captain logo to bottom right of marketwall
var captainLogo = LK.getAsset('customizationcaptainlogo', {
anchorX: 0.5,
anchorY: 0.5
});
captainLogo.x = marketWall.x + marketWall.width * marketWall.scaleX / 2 - 200;
captainLogo.y = marketWall.y + marketWall.height * marketWall.scaleY / 2 - 200;
captainLogo.scaleX = 1.5;
captainLogo.scaleY = 1.5;
game.addChild(captainLogo);
// Marketwall stays open until xkapatma is clicked
};
LK.gui.bottomLeft.addChild(marketIcon);
var coinText = new Text2('Coins: 0', {
size: 50,
fill: 0xffd700
});
coinText.anchor.set(1, 1);
coinText.x = -20;
coinText.y = -20;
LK.gui.bottomRight.addChild(coinText);
// Add customization ship logo on top of coins text
var customizationShipLogo = LK.getAsset('customizationshiplogo', {
anchorX: 1,
anchorY: 1
});
customizationShipLogo.x = -20;
customizationShipLogo.y = -80; // Above coins text
customizationShipLogo.down = function (x, y, obj) {
// Show custom white wall when customization ship logo is clicked
var customWhiteWall = LK.getAsset('customwhitewall', {
anchorX: 0.5,
anchorY: 0.5
});
customWhiteWall.x = 1024;
customWhiteWall.y = 1366;
customWhiteWall.scaleX = 15;
customWhiteWall.scaleY = 25;
game.addChild(customWhiteWall);
// Add blackxkapatma icon to top left of customwhitewall
var blackXkapatmaIcon = LK.getAsset('blackxkapatma', {
anchorX: 0.5,
anchorY: 0.5
});
blackXkapatmaIcon.x = customWhiteWall.x - customWhiteWall.width * customWhiteWall.scaleX / 2 + 100;
blackXkapatmaIcon.y = customWhiteWall.y - customWhiteWall.height * customWhiteWall.scaleY / 2 + 100;
blackXkapatmaIcon.scaleX = 2;
blackXkapatmaIcon.scaleY = 2;
blackXkapatmaIcon.down = function (x, y, obj) {
// Close customwhitewall when blackxkapatma is clicked
if (customWhiteWall) {
customWhiteWall.destroy();
}
if (blackXkapatmaIcon) {
blackXkapatmaIcon.destroy();
}
};
game.addChild(blackXkapatmaIcon);
};
LK.gui.bottomRight.addChild(customizationShipLogo);
// Initialize pixelated ocean background
createWaterTileGrid();
// Initialize game elements
ship = game.addChild(new Ship());
ship.x = 1024;
ship.y = 2400;
// Show main menu on start
showMainMenu();
// Create hearts display
for (var i = 0; i < 3; i++) {
var heart = LK.getAsset('heart', {
anchorX: 0,
anchorY: 0
});
hearts.push(heart);
LK.gui.topLeft.addChild(heart);
}
function updateScore() {
if (scoreFreezeTime <= 0) {
var score = Math.floor(distance) + crewCount * 100;
LK.setScore(score);
scoreText.setText('Score: ' + score);
}
}
function updateTimeOfDay() {
timeOfDayTimer++;
if (timeOfDayTimer >= 1800) {
// Change every 30 seconds (slow transitions)
timeOfDayTimer = 0;
if (timeOfDay === 'morning') {
timeOfDay = 'noon';
game.setBackgroundColor(0x87CEEB); // Bright blue sky
updateWaterTileColors(0x0066cc);
updateSunlightColors(0xFFFF99, 0.6);
} else if (timeOfDay === 'noon') {
timeOfDay = 'night';
game.setBackgroundColor(0x1a237e); // Dark night sky
updateWaterTileColors(0x1a2e5c);
updateSunlightColors(0xB8C5FF, 0.25);
} else {
timeOfDay = 'morning';
game.setBackgroundColor(0xFF8A65); // Morning orange
updateWaterTileColors(0x4A90E2);
updateSunlightColors(0xFFD54F, 0.45);
}
spawnAtmosphericParticles(timeOfDay);
}
// Rain logic - appears rarely
if (!isRaining && Math.random() < 0.0002) {
// Very rare chance each frame
isRaining = true;
rainTimer = 600 + Math.random() * 1200; // Rain for 10-30 seconds
}
if (isRaining) {
rainTimer--;
if (rainTimer <= 0) {
isRaining = false;
}
}
}
function updateLevel() {
var newLevel = Math.floor(distance / 3000) + 1; // Level up faster for increased difficulty
if (newLevel > level && newLevel <= 4) {
level = newLevel;
levelText.setText('Level: ' + level);
gameSpeed += 0.3; // More moderate speed boost per level
// Change background color and lighting based on level with realistic gradients
if (level === 1) {
game.setBackgroundColor(0x87CEEB); // Day - bright sky blue with gradient feel
updateWaterTileColors(0x0066cc); // Crystal clear tropical water
updateSunlightColors(0xFFF4AA, 0.5); // Warm golden sunlight
// Add atmospheric particles for day
spawnAtmosphericParticles('day');
} else if (level === 2) {
game.setBackgroundColor(0xFF6B47); // Sunset - warm orange with red tints
updateWaterTileColors(0x2E5984); // Sunset reflected water
updateSunlightColors(0xFFB366, 0.6); // Intense sunset rays
// Add atmospheric particles for sunset
spawnAtmosphericParticles('sunset');
} else if (level === 3) {
game.setBackgroundColor(0x0F1B3C); // Deep night - dark navy
updateWaterTileColors(0x1A2E5C); // Moonlit water with silver reflections
updateSunlightColors(0xB8C5FF, 0.3); // Cool moonbeams
// Add atmospheric particles for night
spawnAtmosphericParticles('night');
} else if (level === 4) {
game.setBackgroundColor(0x2C3E50); // Storm - dark slate with green tints
updateWaterTileColors(0x34495E); // Turbulent storm water
updateSunlightColors(0x95A5A6, 0.15); // Harsh storm lighting
// Add atmospheric particles for storm
spawnAtmosphericParticles('storm');
}
}
}
function updateWaterTileColors(color) {
for (var i = 0; i < waterTiles.length; i++) {
if (waterTiles[i] && waterTiles[i].children[0]) {
// Calculate depth-based color variation
var depthVariation = Math.sin(waterTiles[i].x * 0.01 + waterTiles[i].y * 0.005) * 0.1;
var adjustedColor = color;
// Add depth gradient effect
if (level === 1) {
adjustedColor = 0x0066CC + Math.floor(depthVariation * 0x001122);
} else if (level === 2) {
adjustedColor = 0x004499 + Math.floor(depthVariation * 0x001111);
} else if (level === 3) {
adjustedColor = 0x002266 + Math.floor(depthVariation * 0x000011);
} else {
adjustedColor = 0x003344 + Math.floor(depthVariation * 0x000022);
}
tween(waterTiles[i].children[0], {
tint: adjustedColor
}, {
duration: 2000
});
waterTiles[i].baseColor = adjustedColor;
}
}
}
function updateSunlightColors(color, maxAlpha) {
for (var i = 0; i < sunlightRays.length; i++) {
if (sunlightRays[i] && sunlightRays[i].children[0]) {
tween(sunlightRays[i].children[0], {
tint: color
}, {
duration: 2000
});
sunlightRays[i].maxAlpha = maxAlpha;
}
}
}
function createWaterTileGrid() {
// Create a grid of water tiles for pixelated ocean background
for (var x = 0; x < 22; x++) {
// Cover full width with some overlap
for (var y = -5; y < 35; y++) {
// Cover full height with extra tiles
var waterTile = new WaterTile();
waterTile.x = x * 95; // Slight overlap for seamless look
waterTile.y = y * 95;
waterTiles.push(waterTile);
game.addChild(waterTile);
}
}
}
function spawnSunlightRay() {
var sunray = new Sunlight();
sunray.x = Math.random() * 2048;
sunray.y = -400;
sunray.maxAlpha = level === 1 ? 0.4 : level === 2 ? 0.5 : level === 3 ? 0.2 : 0.1;
sunlightRays.push(sunray);
game.addChild(sunray);
}
function spawnObstacle() {
if (clearPathTime > 0) {
return;
}
var obstacleType = Math.floor(Math.random() * 4);
var obstacle;
switch (obstacleType) {
case 0:
obstacle = new Obstacle();
break;
case 1:
obstacle = new Pirate();
break;
case 2:
obstacle = new Wave();
break;
case 3:
obstacle = new Stone();
break;
}
obstacle.x = Math.random() * 1800 + 124;
obstacle.y = -100;
obstacle.speed = obstacle.speed + gameSpeed * 0.6 + level * 0.4; // Much gentler speed increases
obstacles.push(obstacle);
game.addChild(obstacle);
}
function spawnCrewMember() {
var crew = new CrewMember();
crew.x = Math.random() * 1800 + 124;
crew.y = -100;
crew.speed = 3 + gameSpeed;
crewMembers.push(crew);
game.addChild(crew);
}
function spawnCoin() {
var coin = new Coin();
coin.x = Math.random() * 1800 + 124;
coin.y = -100;
coin.speed = 3 + gameSpeed;
coins.push(coin);
game.addChild(coin);
}
function spawnCoin1() {
var coin = new Coin1();
coin.x = Math.random() * 1800 + 124;
coin.y = -100;
coin.speed = 3 + gameSpeed;
coins.push(coin);
game.addChild(coin);
}
function spawnCoin2() {
var coin = new Coin2();
coin.x = Math.random() * 1800 + 124;
coin.y = -100;
coin.speed = 3 + gameSpeed;
coins.push(coin);
game.addChild(coin);
}
function spawnCoin3() {
var coin = new Coin3();
coin.x = Math.random() * 1800 + 124;
coin.y = -100;
coin.speed = 3 + gameSpeed;
coins.push(coin);
game.addChild(coin);
}
function spawnIsland() {
var island = new Island();
island.x = Math.random() * 1600 + 224;
island.y = -150;
islands.push(island);
game.addChild(island);
}
function spawnSeagullGroup() {
var groupSize = 3 + Math.floor(Math.random() * 3);
var startX = Math.random() * 1000 + 200;
var startY = -100 - Math.random() * 200;
for (var i = 0; i < groupSize; i++) {
var seagull = new Seagull();
seagull.x = startX + i * 80 + Math.random() * 40 - 20;
seagull.y = startY + Math.random() * 60 - 30;
seagulls.push(seagull);
game.addChild(seagull);
// Create shadow on water (opposite side from sun which is on right)
var shadow = new SeagullShadow();
shadow.x = seagull.x - 120 - i * 25; // Shadow to the left (opposite of sun)
shadow.y = seagull.y + 200; // Shadows appear on water surface
seagullShadows.push(shadow);
game.addChild(shadow);
}
}
function spawnRain() {
if (!isRaining) return;
for (var i = 0; i < 8; i++) {
var rain = new Rain();
rain.x = Math.random() * 2400 - 200;
rain.y = -100 - Math.random() * 200;
rainParticles.push(rain);
game.addChild(rain);
}
}
function showQuiz() {
if (quizActive) {
return;
}
quizActive = true;
gamePaused = true; // Freeze all game movement
quizTimeRemaining = 1200; // 20 seconds
currentQuiz = quizQuestions[Math.floor(Math.random() * quizQuestions.length)];
quizContainer = game.addChild(new Container());
quizContainer.alpha = 0; // Start invisible for smooth entrance
var bg = quizContainer.attachAsset('quizBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
alpha: 0.95
});
// Animate quiz entrance
tween(quizContainer, {
alpha: 1
}, {
duration: 300
});
// Show current active effects
var effectsText = getActiveEffectsText();
if (effectsText) {
var effectDisplay = new Text2(effectsText, {
size: 45,
fill: 0xFFFF00
});
effectDisplay.anchor.set(0.5, 0.5);
effectDisplay.x = 1024;
effectDisplay.y = 900;
quizContainer.addChild(effectDisplay);
}
var questionText = new Text2(currentQuiz.question, {
size: 65,
fill: 0xFFFFFF,
stroke: 0x000000,
strokeThickness: 2,
wordWrap: true,
wordWrapWidth: 1600
});
questionText.anchor.set(0.5, 0.5);
questionText.x = 1024;
questionText.y = 1150;
quizContainer.addChild(questionText);
var timerText = new Text2('Time: 20', {
size: 80,
fill: 0xFFFF00,
stroke: 0x000000,
strokeThickness: 3
});
timerText.anchor.set(0.5, 0.5);
timerText.x = 1024;
timerText.y = 950;
quizContainer.addChild(timerText);
quizContainer.timerText = timerText;
// Add red timer bar
var timerBarBg = quizContainer.attachAsset('quizBg', {
anchorX: 0,
anchorY: 0.5,
x: 200,
y: 900,
scaleX: 0.8,
scaleY: 0.05
});
timerBarBg.tint = 0x333333;
var timerBar = quizContainer.attachAsset('quizBg', {
anchorX: 0,
anchorY: 0.5,
x: 200,
y: 900,
scaleX: 0.8,
scaleY: 0.05
});
timerBar.tint = 0xFF0000;
quizContainer.timerBar = timerBar;
// Create answer buttons with improved styling
quizContainer.answerButtons = [];
for (var i = 0; i < 4; i++) {
var answerContainer = new Container();
answerContainer.x = 1024;
answerContainer.y = 1350 + i * 140;
answerContainer.answerIndex = i;
var answerBg = answerContainer.attachAsset('quizBg', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.9,
scaleY: 0.25,
alpha: 0.8
});
var answerText = new Text2(String.fromCharCode(65 + i) + ') ' + currentQuiz.answers[i], {
size: 55,
fill: 0xFFFFFF,
stroke: 0x000000,
strokeThickness: 2
});
answerText.anchor.set(0.5, 0.5);
answerContainer.addChild(answerText);
// Store references for animations
answerContainer.bg = answerBg;
answerContainer.text = answerText;
// Store index in closure to avoid reference issues
answerContainer.down = function (index) {
return function (x, y, obj) {
// Animate button press - use the stored references instead of obj properties
tween(answerContainer.bg, {
scaleX: 0.95,
scaleY: 0.22
}, {
duration: 100
});
tween(answerContainer.text, {
alpha: 0.8
}, {
duration: 100
});
handleQuizAnswer(index);
};
}(i);
quizContainer.answerButtons.push(answerContainer);
quizContainer.addChild(answerContainer);
}
}
function handleQuizAnswer(answerIndex) {
if (!quizActive) {
return;
}
// Prevent multiple answers
quizActive = false;
var isCorrect = answerIndex === currentQuiz.correct;
if (isCorrect) {
LK.getSound('correct').play();
applyPowerUp();
} else {
LK.getSound('wrong').play();
applyPenalty();
}
// Show effect feedback for 2 seconds
if (lastAppliedEffect) {
showEffectFeedback(lastAppliedEffect, isCorrect);
}
hideQuiz();
nextQuizTime = LK.ticks + 4800000; // Every 8 seconds
}
function getActiveEffectsText() {
var effects = [];
if (ship.isShielded) {
effects.push('🛡️ Shield Active');
}
if (doubleCoinsTime > 0) {
effects.push('💰 Double Coins');
}
if (ship.isSizeModified && ship.children[0].scaleX < 1) {
effects.push('⬇️ Smaller Ship');
}
if (ship.isSizeModified && ship.children[0].scaleX > 1) {
effects.push('⬆️ Bigger Ship');
}
if (ship.stickyTime > 0) {
effects.push('🐌 Sticky Controls');
}
if (extraObstaclesTime > 0) {
effects.push('⚠️ Extra Obstacles');
}
if (scoreFreezeTime > 0) {
effects.push('❄️ Score Frozen');
}
if (clearPathTime > 0) {
effects.push('🚫 Clear Path');
}
if (effects.length === 0) {
return null;
}
return 'Active Effects:\n' + effects.join('\n');
}
function applyPowerUp() {
var powerUps = ['shield', 'doubleCoins', 'extraLife', 'clearPath', 'smallerShip'];
var powerUp = powerUps[Math.floor(Math.random() * powerUps.length)];
switch (powerUp) {
case 'shield':
ship.activateShield();
lastAppliedEffect = '🛡️ Shield Activated!';
break;
case 'doubleCoins':
doubleCoinsTime = 600;
lastAppliedEffect = '💰 Double Coins for 10s!';
break;
case 'extraLife':
if (health < 5) {
health++;
updateHearts();
lastAppliedEffect = '❤️ Extra Life Gained!';
} else {
lastAppliedEffect = '❤️ Life Full Already!';
}
break;
case 'clearPath':
clearPathTime = 240;
lastAppliedEffect = '🚫 Clear Path for 4s!';
// Remove existing obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
obstacles[i].destroy();
obstacles.splice(i, 1);
}
break;
case 'smallerShip':
ship.setSizeModifier(0.7, 300);
lastAppliedEffect = '⬇️ Smaller Ship for 5s!';
break;
}
}
function applyPenalty() {
var penalties = ['extraObstacles', 'healthLoss', 'stickyControls', 'scoreFreeze', 'biggerShip'];
var penalty = penalties[Math.floor(Math.random() * penalties.length)];
switch (penalty) {
case 'extraObstacles':
extraObstaclesTime = 480;
lastAppliedEffect = '⚠️ Extra Obstacles for 8s!';
break;
case 'healthLoss':
takeDamage();
lastAppliedEffect = '💔 Lost 1 Heart!';
break;
case 'stickyControls':
ship.activateStickyControls();
lastAppliedEffect = '🐌 Sticky Controls for 5s!';
break;
case 'scoreFreeze':
scoreFreezeTime = 300;
lastAppliedEffect = '❄️ Score Frozen for 5s!';
break;
case 'biggerShip':
ship.setSizeModifier(1.4, 240);
lastAppliedEffect = '⬆️ Bigger Ship for 4s!';
break;
}
}
function showEffectExpiration(effectName) {
if (effectExpirationDisplay) {
effectExpirationDisplay.destroy();
}
effectExpirationDisplay = game.addChild(new Container());
var expirationBg = effectExpirationDisplay.attachAsset('quizBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 400,
scaleX: 0.5,
scaleY: 0.2,
alpha: 0.8
});
var expirationText = new Text2(effectName + ' Expired!', {
size: 45,
fill: 0xFFAA00
});
expirationText.anchor.set(0.5, 0.5);
expirationText.x = 1024;
expirationText.y = 400;
effectExpirationDisplay.addChild(expirationText);
// Auto-hide after 1.5 seconds
LK.setTimeout(function () {
if (effectExpirationDisplay) {
effectExpirationDisplay.destroy();
effectExpirationDisplay = null;
}
}, 1500);
}
function showEffectFeedback(effectText, isPositive) {
if (effectDisplay) {
effectDisplay.destroy();
}
effectDisplay = game.addChild(new Container());
var feedbackBg = effectDisplay.attachAsset('quizBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: 0.6,
scaleY: 0.3,
alpha: 0.8
});
var feedbackText = new Text2(effectText, {
size: 60,
fill: isPositive ? 0x00FF00 : 0xFF4444
});
feedbackText.anchor.set(0.5, 0.5);
feedbackText.x = 1024;
feedbackText.y = 1366;
effectDisplay.addChild(feedbackText);
// Auto-hide after 2 seconds
LK.setTimeout(function () {
if (effectDisplay) {
effectDisplay.destroy();
effectDisplay = null;
}
}, 2000);
}
function hideQuiz() {
quizActive = false;
gamePaused = false; // Resume game movement
if (quizContainer) {
// Animate quiz exit
tween(quizContainer, {
alpha: 0
}, {
duration: 200,
onFinish: function onFinish() {
if (quizContainer) {
quizContainer.destroy();
quizContainer = null;
}
}
});
}
}
function takeDamage() {
if (ship.isShielded) {
return;
}
health--;
updateHearts();
LK.getSound('hit').play();
LK.effects.flashScreen(0xff0000, 500);
if (health <= 0) {
// Create custom game over display with statistics
var gameOverContainer = game.addChild(new Container());
var gameOverBg = gameOverContainer.attachAsset('quizBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: 1.2,
scaleY: 1.4,
alpha: 0.95
});
var finalScore = Math.floor(distance) + crewCount * 100;
var statsText = 'GAME OVER\n\n' + 'Final Statistics:\n' + 'Score: ' + finalScore + '\n' + 'Distance: ' + Math.floor(distance) + 'm\n' + 'Crew Members: ' + crewCount + '\n' + 'Coins: ' + coinCount + '\n' + 'Level Reached: ' + level;
var statsDisplay = new Text2(statsText, {
size: 60,
fill: 0xFFFFFF
});
statsDisplay.anchor.set(0.5, 0.5);
statsDisplay.x = 1024;
statsDisplay.y = 1366;
gameOverContainer.addChild(statsDisplay);
// Show standard game over after 3 seconds
LK.setTimeout(function () {
LK.showGameOver();
// Show menu again after game over
LK.setTimeout(function () {
showMainMenu();
}, 1000);
}, 3000);
}
}
function updateHearts() {
for (var i = 0; i < hearts.length; i++) {
hearts[i].visible = i < health;
hearts[i].x = 120 + i * 50;
hearts[i].y = 120;
}
}
var targetX = 1024;
game.move = function (x, y, obj) {
if (!gameStarted || quizActive) {
return;
}
targetX = x;
};
game.update = function () {
if (!gameStarted) {
return;
} // Don't update until game starts
if (quizActive) {
// Update quiz timer
if (quizTimeRemaining > 0) {
quizTimeRemaining--;
var secondsLeft = Math.ceil(quizTimeRemaining / 60);
var timeProgress = quizTimeRemaining / 1200; // Progress from 1 to 0
if (quizContainer && quizContainer.timerText) {
quizContainer.timerText.setText('Time: ' + secondsLeft);
// Update timer bar - red fades from right to left
if (quizContainer.timerBar) {
quizContainer.timerBar.scaleX = 0.8 * timeProgress;
}
// Change timer color as time runs out
if (secondsLeft <= 5) {
quizContainer.timerText.tint = 0xFF0000; // Red when almost out of time
tween(quizContainer.timerText, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 100
});
tween(quizContainer.timerText, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
} else if (secondsLeft <= 10) {
quizContainer.timerText.tint = 0xFFAA00; // Orange warning
} else {
quizContainer.timerText.tint = 0xFFFF00; // Yellow normal
}
}
if (quizTimeRemaining <= 0) {
// Time's up - remove 1 heart and apply penalty
health--;
updateHearts();
LK.getSound('wrong').play();
applyPenalty();
hideQuiz();
nextQuizTime = LK.ticks + 4800; // 8 seconds after timeout
}
}
return; // Completely freeze game while quiz is active
}
// Move ship towards target
if (ship.stickyTime <= 0) {
var diff = targetX - ship.x;
ship.x += diff * 0.1;
// Add tilting animation based on movement direction
var shipGraphics = ship.children[0];
if (Math.abs(diff) > 10) {
// Only tilt if moving significantly
if (diff > 0) {
// Moving right - tilt right
tween(shipGraphics, {
rotation: 0.2
}, {
duration: 200,
easing: tween.easeOut
});
} else {
// Moving left - tilt left
tween(shipGraphics, {
rotation: -0.2
}, {
duration: 200,
easing: tween.easeOut
});
}
} else if (Math.abs(diff) < 5) {
// Return to upright position when not moving much
tween(shipGraphics, {
rotation: 0
}, {
duration: 300,
easing: tween.easeOut
});
}
} else {
var stickyDiff = targetX - ship.x;
ship.x += stickyDiff * 0.02; // Much slower movement
// Add tilting animation for sticky controls too
var shipGraphics = ship.children[0];
if (Math.abs(stickyDiff) > 20) {
// Higher threshold for sticky controls
if (stickyDiff > 0) {
// Moving right - tilt right
tween(shipGraphics, {
rotation: 0.15
}, {
duration: 400,
easing: tween.easeOut
});
} else {
// Moving left - tilt left
tween(shipGraphics, {
rotation: -0.15
}, {
duration: 400,
easing: tween.easeOut
});
}
} else if (Math.abs(stickyDiff) < 10) {
// Return to upright position when not moving much
tween(shipGraphics, {
rotation: 0
}, {
duration: 500,
easing: tween.easeOut
});
}
}
// Keep ship in bounds
if (ship.x < 60) {
ship.x = 60;
}
if (ship.x > 1988) {
ship.x = 1988;
}
// Update distance and score
distance += gameSpeed;
updateScore();
updateLevel();
updateTimeOfDay();
// Update distance display
distanceText.setText('Distance: ' + Math.floor(distance) + 'm');
// Progressive difficulty scaling based on distance - more gradual
var difficultyMultiplier = 1 + Math.floor(distance / 1000) * 0.2; // Increase difficulty every 1000m, smaller increments
gameSpeed = Math.min(5, 2 + difficultyMultiplier); // Cap max speed at 5 instead of 8
// Update timers and show expiration notifications
if (doubleCoinsTime > 0) {
doubleCoinsTime--;
if (doubleCoinsTime === 0) {
showEffectExpiration('💰 Double Coins');
}
}
if (extraObstaclesTime > 0) {
extraObstaclesTime--;
if (extraObstaclesTime === 0) {
showEffectExpiration('⚠️ Extra Obstacles');
}
}
if (clearPathTime > 0) {
clearPathTime--;
if (clearPathTime === 0) {
showEffectExpiration('🛡️ Clear Path');
}
}
if (scoreFreezeTime > 0) {
scoreFreezeTime--;
if (scoreFreezeTime === 0) {
showEffectExpiration('❄️ Score Freeze');
}
}
// Show quiz
if (LK.ticks >= nextQuizTime) {
showQuiz();
}
// Spawn objects - more manageable difficulty progression
var baseSpawnRate = Math.max(20, 60 - Math.floor(distance / 800)); // Slower base spawning, less frequent increases
var obstacleSpawnRate = Math.max(15, baseSpawnRate - level * 2); // Gentler level-based increase
if (LK.ticks % obstacleSpawnRate === 0) {
spawnObstacle();
// Spawn additional obstacles based on distance traveled - much more manageable
if (distance > 2000 && LK.ticks % (obstacleSpawnRate * 3) === 0) {
spawnObstacle(); // Extra obstacle after 2000m only
}
if (distance > 4000 && LK.ticks % (obstacleSpawnRate * 4) === 0) {
spawnObstacle(); // Even more obstacles after 4000m
}
if (extraObstaclesTime > 0 && LK.ticks % Math.max(10, obstacleSpawnRate / 2) === 0) {
spawnObstacle(); // Reduced extra obstacles during penalty
}
}
if (LK.ticks % 600 === 0) {
// Every 10 seconds - less frequent crew
spawnCrewMember();
}
if (LK.ticks % 150 === 0) {
// Every 2.5 seconds - spawn different types of coins
var coinType = Math.floor(Math.random() * 4);
switch (coinType) {
case 0:
spawnCoin();
break;
case 1:
spawnCoin1();
break;
case 2:
spawnCoin2();
break;
case 3:
spawnCoin3();
break;
}
}
// Spawn islands occasionally
if (LK.ticks % 1800 === 0) {
// Every 30 seconds
spawnIsland();
}
// Spawn seagull groups - less frequently
if (LK.ticks % 900 === 0) {
// Every 15 seconds - seagulls appear less often
spawnSeagullGroup();
}
// Spawn rain when raining
if (isRaining && LK.ticks % 5 === 0) {
spawnRain();
}
// Update obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
if (obstacle.y > 2800) {
obstacle.destroy();
obstacles.splice(i, 1);
continue;
}
if (ship.intersects(obstacle)) {
obstacle.destroy();
obstacles.splice(i, 1);
takeDamage();
continue;
}
}
// Update crew members
for (var i = crewMembers.length - 1; i >= 0; i--) {
var crew = crewMembers[i];
if (crew.y > 2800) {
crew.destroy();
crewMembers.splice(i, 1);
continue;
}
if (ship.intersects(crew)) {
crewCount++;
crewText.setText('Crew: ' + crewCount);
crew.destroy();
crewMembers.splice(i, 1);
LK.getSound('collect').play();
continue;
}
}
// Update water tiles for infinite scrolling
for (var i = waterTiles.length - 1; i >= 0; i--) {
var tile = waterTiles[i];
if (tile.y > 2800) {
// Reset tile position to top for infinite scrolling
tile.y = -100;
}
}
// Spawn sunlight rays periodically
if (LK.ticks % 180 === 0) {
// Every 3 seconds
spawnSunlightRay();
}
// Update sunlight rays
for (var i = sunlightRays.length - 1; i >= 0; i--) {
var ray = sunlightRays[i];
if (ray.y > 2800) {
ray.destroy();
sunlightRays.splice(i, 1);
continue;
}
// Update alpha based on level and animation
if (ray.children[0]) {
ray.children[0].alpha = (ray.maxAlpha || 0.3) + Math.sin(LK.ticks * 0.05 + ray.x * 0.02) * 0.2;
}
}
// Update coins
for (var i = coins.length - 1; i >= 0; i--) {
var coin = coins[i];
if (coin.y > 2800) {
coin.destroy();
coins.splice(i, 1);
continue;
}
if (ship.intersects(coin)) {
var baseCoinValue = coin.coinValue || 5; // Use coin's specific value
var coinValue = doubleCoinsTime > 0 ? baseCoinValue * 2 : baseCoinValue;
coinCount += coinValue;
coinText.setText('Coins: ' + coinCount);
// Make coin bigger as number increases
var coinScale = 1 + Math.min(coinCount * 0.02, 0.8); // Scale up to 1.8x max
var coinGraphics = coin.children[0];
tween(coinGraphics, {
scaleX: coinScale,
scaleY: coinScale
}, {
duration: 200
});
if (scoreFreezeTime <= 0) {
distance += coinValue;
}
coin.destroy();
coins.splice(i, 1);
LK.getSound('collect').play();
continue;
}
}
// Update islands
for (var i = islands.length - 1; i >= 0; i--) {
var island = islands[i];
if (island.y > 2800) {
island.destroy();
islands.splice(i, 1);
continue;
}
// Check collision with ship
if (ship.intersects(island)) {
if (health === 1) {
// Game over with effects when hitting island with 1 heart
gamePaused = true; // Stop everything
// Create boom effect
var boomEffect = LK.getAsset('boomeffect', {
anchorX: 0.5,
anchorY: 0.5
});
boomEffect.x = ship.x;
boomEffect.y = ship.y;
boomEffect.scaleX = 0.1;
boomEffect.scaleY = 0.1;
game.addChild(boomEffect);
// Animate boom effect
tween(boomEffect, {
scaleX: 3,
scaleY: 3,
alpha: 0
}, {
duration: 1000
});
// Create smoke effect
var smokeEffect = LK.getAsset('smokeeffect', {
anchorX: 0.5,
anchorY: 0.5
});
smokeEffect.x = ship.x;
smokeEffect.y = ship.y;
smokeEffect.scaleX = 0.1;
smokeEffect.scaleY = 0.1;
game.addChild(smokeEffect);
// Animate smoke effect
tween(smokeEffect, {
scaleX: 2,
scaleY: 2,
alpha: 0.3
}, {
duration: 1500
});
// Stop all movement by setting speeds to 0
for (var j = 0; j < obstacles.length; j++) {
obstacles[j].speed = 0;
}
for (var j = 0; j < coins.length; j++) {
coins[j].speed = 0;
}
for (var j = 0; j < crewMembers.length; j++) {
crewMembers[j].speed = 0;
}
for (var j = 0; j < islands.length; j++) {
islands[j].speed = 0;
}
for (var j = 0; j < waterTiles.length; j++) {
waterTiles[j].speed = 0;
}
// Show game over after effects
LK.setTimeout(function () {
takeDamage();
}, 2000);
} else {
takeDamage();
}
island.destroy();
islands.splice(i, 1);
continue;
}
}
// Update seagulls
for (var i = seagulls.length - 1; i >= 0; i--) {
var seagull = seagulls[i];
if (seagull.y > 2800 || seagull.x < -100 || seagull.x > 2148) {
seagull.destroy();
seagulls.splice(i, 1);
}
}
// Update seagull shadows
for (var i = seagullShadows.length - 1; i >= 0; i--) {
var shadow = seagullShadows[i];
if (shadow.y > 2800) {
shadow.destroy();
seagullShadows.splice(i, 1);
}
}
// Update rain particles
for (var i = rainParticles.length - 1; i >= 0; i--) {
var rain = rainParticles[i];
if (rain.y > 2800 || rain.x < -100 || rain.x > 2148) {
rain.destroy();
rainParticles.splice(i, 1);
}
}
// Update healing hearts
for (var i = healingHearts.length - 1; i >= 0; i--) {
var healHeart = healingHearts[i];
if (healHeart.y > 2800) {
healHeart.destroy();
healingHearts.splice(i, 1);
continue;
}
if (ship.intersects(healHeart)) {
if (health < 5) {
health++;
updateHearts();
LK.getSound('collect').play();
}
healHeart.destroy();
healingHearts.splice(i, 1);
continue;
}
}
// Spawn healing hearts rarely (every 45 seconds on average)
if (LK.ticks % 2700 === 0 && Math.random() < 0.3) {
var healHeart = new HealHeart();
healHeart.x = Math.random() * 1800 + 124;
healHeart.y = -100;
healingHearts.push(healHeart);
game.addChild(healHeart);
}
// Update ports
for (var i = ports.length - 1; i >= 0; i--) {
var port = ports[i];
if (port.y > 2800) {
port.destroy();
ports.splice(i, 1);
continue;
}
if (ship.intersects(port)) {
// Show brick wall when ship touches port
var brickWall = LK.getAsset('brickwall', {
anchorX: 0.5,
anchorY: 0.5
});
brickWall.x = 1024;
brickWall.y = 1366;
brickWall.scaleX = 15;
brickWall.scaleY = 25;
game.addChild(brickWall);
// Add xkapatma icon to top left of brickwall
var xkapatmaIcon = LK.getAsset('xkapatma', {
anchorX: 0.5,
anchorY: 0.5
});
xkapatmaIcon.x = brickWall.x - brickWall.width * brickWall.scaleX / 2 + 100;
xkapatmaIcon.y = brickWall.y - brickWall.height * brickWall.scaleY / 2 + 100;
xkapatmaIcon.scaleX = 2;
xkapatmaIcon.scaleY = 2;
xkapatmaIcon.down = function (x, y, obj) {
// Close brickwall when xkapatma is clicked
if (brickWall) {
brickWall.destroy();
}
if (xkapatmaIcon) {
xkapatmaIcon.destroy();
}
};
game.addChild(xkapatmaIcon);
port.destroy();
ports.splice(i, 1);
continue;
}
}
// Spawn port when distance is between 5000-8000
if (distance >= 5000 && distance <= 8000 && !portSpawned) {
var port = new Port();
// Position port on left or right side
if (Math.random() < 0.5) {
port.x = 50; // Left side, stuck to edge
} else {
port.x = 1998; // Right side, stuck to edge
}
port.y = -200;
ports.push(port);
game.addChild(port);
portSpawned = true;
// Clear nearby obstacles, islands, pirates, stones, waves
for (var j = obstacles.length - 1; j >= 0; j--) {
var obs = obstacles[j];
if (Math.abs(obs.x - port.x) < 500 && obs.y > port.y - 400 && obs.y < port.y + 400) {
obs.destroy();
obstacles.splice(j, 1);
}
}
for (var j = islands.length - 1; j >= 0; j--) {
var island = islands[j];
if (Math.abs(island.x - port.x) < 500 && island.y > port.y - 400 && island.y < port.y + 400) {
island.destroy();
islands.splice(j, 1);
}
}
}
// Reset port spawning flag when outside distance range
if (distance < 5000 || distance > 8000) {
portSpawned = false;
}
};
function showMainMenu() {
if (menuContainer) {
return;
}
gameStarted = false;
gamePaused = true;
menuContainer = game.addChild(new Container());
menuContainer.alpha = 0;
// Main background
var menuBg = menuContainer.attachAsset('quizBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: 1.3,
scaleY: 1.6,
alpha: 0.95
});
// Title
var titleText = new Text2('QUIZ NAVIGATOR', {
size: 120,
fill: 0xFFD700,
stroke: 0x000033,
strokeThickness: 4
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 800;
menuContainer.addChild(titleText);
// Subtitle
var subtitleText = new Text2('Navigate the seas while answering maritime quizzes!', {
size: 45,
fill: 0xFFFFFF,
stroke: 0x000000,
strokeThickness: 2,
wordWrap: true,
wordWrapWidth: 1400
});
subtitleText.anchor.set(0.5, 0.5);
subtitleText.x = 1024;
subtitleText.y = 950;
menuContainer.addChild(subtitleText);
// Instructions
var instructionsText = new Text2('• Drag to move your ship\n• Collect crew members and coins\n• Answer quiz questions correctly for power-ups\n• Wrong answers give penalties\n• Survive as long as possible!', {
size: 40,
fill: 0xCCFFFF,
wordWrap: true,
wordWrapWidth: 1400
});
instructionsText.anchor.set(0.5, 0.5);
instructionsText.x = 1024;
instructionsText.y = 1200;
menuContainer.addChild(instructionsText);
// Start button
var startButton = new Container();
startButton.x = 1024;
startButton.y = 1600;
var startBg = startButton.attachAsset('quizBg', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.3,
scaleY: 0.15,
alpha: 0.9
});
startBg.tint = 0x00AA00;
var startText = new Text2('TAP TO START', {
size: 70,
fill: 0xFFFFFF,
stroke: 0x000000,
strokeThickness: 3
});
startText.anchor.set(0.5, 0.5);
startButton.addChild(startText);
startButton.down = function (x, y, obj) {
tween(startBg, {
scaleX: 0.65,
scaleY: 0.35
}, {
duration: 100
});
tween(startText, {
alpha: 0.7
}, {
duration: 100,
onFinish: function onFinish() {
hideMainMenu();
startGame();
}
});
};
menuContainer.addChild(startButton);
// High score display
var highScore = storage.highScore || 0;
var highScoreText = new Text2('High Score: ' + highScore, {
size: 50,
fill: 0xFFAA00
});
highScoreText.anchor.set(0.5, 0.5);
highScoreText.x = 1024;
highScoreText.y = 1800;
menuContainer.addChild(highScoreText);
// Animate menu entrance
tween(menuContainer, {
alpha: 1
}, {
duration: 500
});
// Animate title
tween(titleText, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 1000,
easing: tween.easeInOut
});
tween(titleText, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 1000,
easing: tween.easeInOut
});
}
function hideMainMenu() {
if (!menuContainer) {
return;
}
tween(menuContainer, {
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
if (menuContainer) {
menuContainer.destroy();
menuContainer = null;
}
}
});
}
function startGame() {
gameStarted = true;
gamePaused = false;
// Reset game state
level = 1;
health = 3;
crewCount = 0;
coinCount = 0;
distance = 0;
gameSpeed = 2;
quizActive = false;
nextQuizTime = 480;
// Clear all arrays
for (var i = obstacles.length - 1; i >= 0; i--) {
obstacles[i].destroy();
}
obstacles = [];
for (var i = crewMembers.length - 1; i >= 0; i--) {
crewMembers[i].destroy();
}
crewMembers = [];
for (var i = coins.length - 1; i >= 0; i--) {
coins[i].destroy();
}
coins = [];
// Clear islands
for (var i = islands.length - 1; i >= 0; i--) {
islands[i].destroy();
}
islands = [];
// Clear seagulls
for (var i = seagulls.length - 1; i >= 0; i--) {
seagulls[i].destroy();
}
seagulls = [];
// Clear seagull shadows
for (var i = seagullShadows.length - 1; i >= 0; i--) {
seagullShadows[i].destroy();
}
seagullShadows = [];
// Clear rain
for (var i = rainParticles.length - 1; i >= 0; i--) {
rainParticles[i].destroy();
}
rainParticles = [];
// Clear healing hearts
for (var i = healingHearts.length - 1; i >= 0; i--) {
healingHearts[i].destroy();
}
healingHearts = [];
// Clear ports
for (var i = ports.length - 1; i >= 0; i--) {
ports[i].destroy();
}
ports = [];
portSpawned = false;
// Reset weather and time
timeOfDay = 'morning';
timeOfDayTimer = 0;
isRaining = false;
rainTimer = 0;
// Reset ship position
ship.x = 1024;
ship.y = 2400;
// Update UI
updateScore();
updateHearts();
levelText.setText('Level: ' + level);
crewText.setText('Crew: ' + crewCount);
coinText.setText('Coins: ' + coinCount);
distanceText.setText('Distance: 0m');
} ===================================================================
--- original.js
+++ change.js
@@ -13,8 +13,9 @@
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
+ self.coinValue = 5; // Default coin value
self.update = function () {
if (gamePaused) {
return;
} // Freeze movement during quiz
@@ -22,8 +23,59 @@
coinGraphics.rotation += 0.1;
};
return self;
});
+var Coin1 = Container.expand(function () {
+ var self = Container.call(this);
+ var coinGraphics = self.attachAsset('coinreal1', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 4;
+ self.coinValue = 4; // Coin1 value
+ self.update = function () {
+ if (gamePaused) {
+ return;
+ }
+ self.y += self.speed;
+ coinGraphics.rotation += 0.1;
+ };
+ return self;
+});
+var Coin2 = Container.expand(function () {
+ var self = Container.call(this);
+ var coinGraphics = self.attachAsset('coinreal2', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 4;
+ self.coinValue = 3; // Coin2 value
+ self.update = function () {
+ if (gamePaused) {
+ return;
+ }
+ self.y += self.speed;
+ coinGraphics.rotation += 0.1;
+ };
+ return self;
+});
+var Coin3 = Container.expand(function () {
+ var self = Container.call(this);
+ var coinGraphics = self.attachAsset('coinreal3', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 4;
+ self.coinValue = 2; // Coin3 value
+ self.update = function () {
+ if (gamePaused) {
+ return;
+ }
+ self.y += self.speed;
+ coinGraphics.rotation += 0.1;
+ };
+ return self;
+});
var CrewMember = Container.expand(function () {
var self = Container.call(this);
var crewGraphics = self.attachAsset('crew', {
anchorX: 0.5,
@@ -688,8 +740,11 @@
}
if (sellerIcon) {
sellerIcon.destroy();
}
+ if (captainLogo) {
+ captainLogo.destroy();
+ }
};
game.addChild(xkapatmaIcon);
// Add sellermarket icon to bottom right of marketwall
var sellerIcon = LK.getAsset('sellermarket', {
@@ -700,8 +755,18 @@
sellerIcon.y = marketWall.y + marketWall.height * marketWall.scaleY / 2 - 100;
sellerIcon.scaleX = 2;
sellerIcon.scaleY = 2;
game.addChild(sellerIcon);
+ // Add customization captain logo to bottom right of marketwall
+ var captainLogo = LK.getAsset('customizationcaptainlogo', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ captainLogo.x = marketWall.x + marketWall.width * marketWall.scaleX / 2 - 200;
+ captainLogo.y = marketWall.y + marketWall.height * marketWall.scaleY / 2 - 200;
+ captainLogo.scaleX = 1.5;
+ captainLogo.scaleY = 1.5;
+ game.addChild(captainLogo);
// Marketwall stays open until xkapatma is clicked
};
LK.gui.bottomLeft.addChild(marketIcon);
var coinText = new Text2('Coins: 0', {
@@ -711,8 +776,47 @@
coinText.anchor.set(1, 1);
coinText.x = -20;
coinText.y = -20;
LK.gui.bottomRight.addChild(coinText);
+// Add customization ship logo on top of coins text
+var customizationShipLogo = LK.getAsset('customizationshiplogo', {
+ anchorX: 1,
+ anchorY: 1
+});
+customizationShipLogo.x = -20;
+customizationShipLogo.y = -80; // Above coins text
+customizationShipLogo.down = function (x, y, obj) {
+ // Show custom white wall when customization ship logo is clicked
+ var customWhiteWall = LK.getAsset('customwhitewall', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ customWhiteWall.x = 1024;
+ customWhiteWall.y = 1366;
+ customWhiteWall.scaleX = 15;
+ customWhiteWall.scaleY = 25;
+ game.addChild(customWhiteWall);
+ // Add blackxkapatma icon to top left of customwhitewall
+ var blackXkapatmaIcon = LK.getAsset('blackxkapatma', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ blackXkapatmaIcon.x = customWhiteWall.x - customWhiteWall.width * customWhiteWall.scaleX / 2 + 100;
+ blackXkapatmaIcon.y = customWhiteWall.y - customWhiteWall.height * customWhiteWall.scaleY / 2 + 100;
+ blackXkapatmaIcon.scaleX = 2;
+ blackXkapatmaIcon.scaleY = 2;
+ blackXkapatmaIcon.down = function (x, y, obj) {
+ // Close customwhitewall when blackxkapatma is clicked
+ if (customWhiteWall) {
+ customWhiteWall.destroy();
+ }
+ if (blackXkapatmaIcon) {
+ blackXkapatmaIcon.destroy();
+ }
+ };
+ game.addChild(blackXkapatmaIcon);
+};
+LK.gui.bottomRight.addChild(customizationShipLogo);
// Initialize pixelated ocean background
createWaterTileGrid();
// Initialize game elements
ship = game.addChild(new Ship());
@@ -906,8 +1010,32 @@
coin.speed = 3 + gameSpeed;
coins.push(coin);
game.addChild(coin);
}
+function spawnCoin1() {
+ var coin = new Coin1();
+ coin.x = Math.random() * 1800 + 124;
+ coin.y = -100;
+ coin.speed = 3 + gameSpeed;
+ coins.push(coin);
+ game.addChild(coin);
+}
+function spawnCoin2() {
+ var coin = new Coin2();
+ coin.x = Math.random() * 1800 + 124;
+ coin.y = -100;
+ coin.speed = 3 + gameSpeed;
+ coins.push(coin);
+ game.addChild(coin);
+}
+function spawnCoin3() {
+ var coin = new Coin3();
+ coin.x = Math.random() * 1800 + 124;
+ coin.y = -100;
+ coin.speed = 3 + gameSpeed;
+ coins.push(coin);
+ game.addChild(coin);
+}
function spawnIsland() {
var island = new Island();
island.x = Math.random() * 1600 + 224;
island.y = -150;
@@ -1350,13 +1478,15 @@
quizContainer.timerText.tint = 0xFFFF00; // Yellow normal
}
}
if (quizTimeRemaining <= 0) {
- // Time's up - apply penalty
+ // Time's up - remove 1 heart and apply penalty
+ health--;
+ updateHearts();
LK.getSound('wrong').play();
applyPenalty();
hideQuiz();
- nextQuizTime = LK.ticks + 480; // 8 seconds after timeout
+ nextQuizTime = LK.ticks + 4800; // 8 seconds after timeout
}
}
return; // Completely freeze game while quiz is active
}
@@ -1494,19 +1624,33 @@
// Every 10 seconds - less frequent crew
spawnCrewMember();
}
if (LK.ticks % 150 === 0) {
- // Every 2.5 seconds - slightly more frequent coins
- spawnCoin();
+ // Every 2.5 seconds - spawn different types of coins
+ var coinType = Math.floor(Math.random() * 4);
+ switch (coinType) {
+ case 0:
+ spawnCoin();
+ break;
+ case 1:
+ spawnCoin1();
+ break;
+ case 2:
+ spawnCoin2();
+ break;
+ case 3:
+ spawnCoin3();
+ break;
+ }
}
// Spawn islands occasionally
if (LK.ticks % 1800 === 0) {
// Every 30 seconds
spawnIsland();
}
- // Spawn seagull groups
- if (LK.ticks % 300 === 0) {
- // Every 5 seconds - seagulls appear often
+ // Spawn seagull groups - less frequently
+ if (LK.ticks % 900 === 0) {
+ // Every 15 seconds - seagulls appear less often
spawnSeagullGroup();
}
// Spawn rain when raining
if (isRaining && LK.ticks % 5 === 0) {
@@ -1578,9 +1722,10 @@
coins.splice(i, 1);
continue;
}
if (ship.intersects(coin)) {
- var coinValue = doubleCoinsTime > 0 ? 10 : 5; // Changed from 2 to 5
+ var baseCoinValue = coin.coinValue || 5; // Use coin's specific value
+ var coinValue = doubleCoinsTime > 0 ? baseCoinValue * 2 : baseCoinValue;
coinCount += coinValue;
coinText.setText('Coins: ' + coinCount);
// Make coin bigger as number increases
var coinScale = 1 + Math.min(coinCount * 0.02, 0.8); // Scale up to 1.8x max
@@ -1609,9 +1754,70 @@
continue;
}
// Check collision with ship
if (ship.intersects(island)) {
- takeDamage();
+ if (health === 1) {
+ // Game over with effects when hitting island with 1 heart
+ gamePaused = true; // Stop everything
+ // Create boom effect
+ var boomEffect = LK.getAsset('boomeffect', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ boomEffect.x = ship.x;
+ boomEffect.y = ship.y;
+ boomEffect.scaleX = 0.1;
+ boomEffect.scaleY = 0.1;
+ game.addChild(boomEffect);
+ // Animate boom effect
+ tween(boomEffect, {
+ scaleX: 3,
+ scaleY: 3,
+ alpha: 0
+ }, {
+ duration: 1000
+ });
+ // Create smoke effect
+ var smokeEffect = LK.getAsset('smokeeffect', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ smokeEffect.x = ship.x;
+ smokeEffect.y = ship.y;
+ smokeEffect.scaleX = 0.1;
+ smokeEffect.scaleY = 0.1;
+ game.addChild(smokeEffect);
+ // Animate smoke effect
+ tween(smokeEffect, {
+ scaleX: 2,
+ scaleY: 2,
+ alpha: 0.3
+ }, {
+ duration: 1500
+ });
+ // Stop all movement by setting speeds to 0
+ for (var j = 0; j < obstacles.length; j++) {
+ obstacles[j].speed = 0;
+ }
+ for (var j = 0; j < coins.length; j++) {
+ coins[j].speed = 0;
+ }
+ for (var j = 0; j < crewMembers.length; j++) {
+ crewMembers[j].speed = 0;
+ }
+ for (var j = 0; j < islands.length; j++) {
+ islands[j].speed = 0;
+ }
+ for (var j = 0; j < waterTiles.length; j++) {
+ waterTiles[j].speed = 0;
+ }
+ // Show game over after effects
+ LK.setTimeout(function () {
+ takeDamage();
+ }, 2000);
+ } else {
+ takeDamage();
+ }
island.destroy();
islands.splice(i, 1);
continue;
}
heart, 3d pixel art, no background. In-Game asset. 2d. High contrast. No shadows
tsunami wave no background. In-Game asset. 2d. High contrast. No shadows
stone 2d no background. In-Game asset. 2d. High contrast. No shadows
2D vector illustration of a ship from top view perspective, minimalistic flat design, clean lines, no background (transparent), realistic ship shape, visible deck, helm, and other top-side details, symmetrical composition.. In-Game asset. High contrast. No shadows
2D vector illustration of a pirate ship from top view perspective, minimalistic flat design, clean lines, no background (transparent), realistic ship shape, visible deck, helm, and other top-side details, symmetrical composition.. In-Game asset.. In-Game asset. 2d. High contrast. No shadows