User prompt
Give container label text a black background
Code edit (21 edits merged)
Please save this source code
User prompt
Please fix the bug: 'undefined is not an object (evaluating 'self.containerPositions[i]')' in or related to this line: 'container.y = self.containerPositions[i].y;' Line Number: 142
Code edit (1 edits merged)
Please save this source code
User prompt
Adjust x positions of containers to ensure a 40px space between each container
Code edit (1 edits merged)
Please save this source code
User prompt
Set leveltxt to scale 100 at start of game
User prompt
Set leveltxt to scale 1 at start of game
User prompt
Why does level text vanish when leveling up
User prompt
Prevent ships from spawning in a lane that’s already occupied
User prompt
When spawning a ship, pick a random position from possible y positions
User prompt
Spawn ships more often
User prompt
Spawn ships more often
Code edit (4 edits merged)
Please save this source code
User prompt
Up to 4 ships can be on screen at a time with different y coordinates
Code edit (1 edits merged)
Please save this source code
User prompt
Containers should be placed 200px from the left of the ship
User prompt
Containers should move at the same speed as the ship
Code edit (1 edits merged)
Please save this source code
User prompt
Tariff Slapper: Trump Edition
Initial prompt
You play as Donald Trump. An increasing number of shipments are coming to the US and you must slap tariffs on them as quickly as possible. Shipments include household essentials like food, toilet paper, diapers, and car parts
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0, lastScore: 0 }); /**** * Classes ****/ var ShippingContainer = Container.expand(function (type) { var self = Container.call(this); // Set container type and properties self.type = type || 'container'; self.targetted = false; self.speed = 3 + Math.random() * 2; self.value = 10; // Adjust value based on container type if (self.type === 'foodContainer') { self.value = 15; } else if (self.type === 'paperContainer') { self.value = 20; } else if (self.type === 'diaperContainer') { self.value = 25; } else if (self.type === 'carPartsContainer') { self.value = 30; } // Get and automatically addChild appropriate asset with anchor set var containerGraphics = self.attachAsset(self.type, { anchorX: 0.5, anchorY: 0.5 }); // Create shadow effect beneath container self.shadow = new Container(); var shadowAsset = LK.getAsset(self.type, { anchorX: 0.5, anchorY: 0.5, tint: 0x000000, alpha: 0.5, scaleX: 1.0, scaleY: 0.9 }); self.shadow.addChild(shadowAsset); self.shadow.y = 25; // Position shadow further below container for more obvious effect self.shadow.x = 10; // Slight x offset for 3D shadow effect self.addChildAt(self.shadow, 0); // Add shadow behind container // Label removed as requested // Tariff stamp that appears when tapped self.tariffStamp = self.attachAsset('tariffStamp', { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); // Add text to stamp self.stampText = new Text2('TARIFF', { size: 40, fill: 0xFFFFFF, font: "Impact, Charcoal, sans-serif" }); self.stampText.anchor.set(0.5, 0.5); self.tariffStamp.addChild(self.stampText); // Update method called automatically each frame self.update = function () { // This method is now empty as container movement is controlled by the ship // Container position is relative to ship and doesn't need its own movement }; // Apply tariff to container self.applyTariff = function () { if (self.targetted) { return false; } self.targetted = true; // Show tariff stamp with animation self.tariffStamp.alpha = 1; self.tariffStamp.rotation = -0.3; tween(self.tariffStamp, { rotation: 0 }, { duration: 300, easing: tween.easeOut }); // Animate shadow when tariff is applied tween(self.shadow, { scaleX: 1.15, scaleY: 1.15, alpha: 0.7, y: 35 // Push shadow further down during animation }, { duration: 150, easing: tween.easeOut, onFinish: function onFinish() { tween(self.shadow, { scaleX: 1.0, scaleY: 0.9, alpha: 0.5, y: 25 }, { duration: 300, easing: tween.easeOut }); } }); // Play one of 3 slap sounds randomly var slapSounds = ['slap', 'slap2', 'slap3']; // Get a random sound from the array var randomIndex = Math.floor(Math.random() * slapSounds.length); var soundToPlay = slapSounds[randomIndex]; // Play the randomly selected sound LK.getSound(soundToPlay).play(); return true; }; // Tap/click handler self.down = function (x, y, obj) { // Add temporary shadow effect on press if (!self.targetted) { tween(self.shadow, { scaleX: 1.2, scaleY: 1.2, alpha: 0.8, y: 30, // Push shadow down on press for more dramatic effect x: 15 // Increase horizontal offset for 3D shadow effect }, { duration: 100, easing: tween.easeOut }); } // Call the global applyTariffToContainer function passing this container applyTariffToContainer(self); }; return self; }); var ShippingShip = Container.expand(function () { var self = Container.call(this); // Get and automatically addChild ship asset with anchor set var shipGraphics = self.attachAsset('ship', { anchorX: 0.5, anchorY: 0.5 }); // Store reference to ship graphics for resizing self.shipGraphics = shipGraphics; // Add containers to the ship self.containers = []; // Create containers for the ship self.createContainers = function (level) { // Clear existing containers for (var i = 0; i < self.containers.length; i++) { if (self.containers[i]) { self.removeChild(self.containers[i]); } } self.containers = []; // Determine how many containers to create based on level var containerCount = Math.min(Math.floor(2 + level / 2), 5); // Randomly decide which container types to use var containerTypes = ['foodContainer', 'paperContainer', 'diaperContainer', 'carPartsContainer']; // Create and position containers for (var i = 0; i < containerCount; i++) { var randomType = containerTypes[Math.floor(Math.random() * containerTypes.length)]; var container = new ShippingContainer(randomType); // Set fixed positions relative to the ship // Adjust X position based on total containers to center them on the extended ship var totalWidth = containerCount * 220; var startX = -totalWidth / 2 + 100; container.x = startX + i * 220; container.y = 0; self.addChild(container); self.containers.push(container); } // Adjust ship length based on container count var baseLength = 1.0; // Base scale factor var lengthPerContainer = 0.26; // Additional length per container var newLength = baseLength + (containerCount - 1) * lengthPerContainer; // Only adjust x-scale to change length, not height self.shipGraphics.scaleX = newLength; }; return self; }); var TrumpCharacter = Container.expand(function () { var self = Container.call(this); // Create Trump's face using shapes var face = self.attachAsset('trumpFace', { anchorX: 0.5, anchorY: 0.5, y: -150 }); self.hair = self.attachAsset('trumpHair', { anchorX: 0.5, anchorY: 0.5, y: -200 }); // Add speech bubble for occasional quotes self.speechBubble = new Container(); var bubbleText = new Text2('America First!', { size: 80, fill: 0x000000, font: "'Comic Sans MS', 'Comic Sans', cursive" }); bubbleText.anchor.set(0, 0.5); self.speechBubble.addChild(bubbleText); self.speechBubble.x = 140; self.speechBubble.y = -80; self.speechBubble.alpha = 0; self.addChild(self.speechBubble); // Method to show a random Trump quote self.showRandomQuote = function () { // Don't show a new quote if speech bubble is still visible if (self.speechBubble.alpha > 0) { return; } var quotes = ["America First!", "Beautiful Tariffs!", "Huge Tariffs!", "The Best Tariffs!", "China!", "Russia!", "Tremendous!", "Huge Profits!"]; bubbleText.setText(quotes[Math.floor(Math.random() * quotes.length)]); // Show speech bubble with animation tween(self.speechBubble, { alpha: 1 }, { duration: 300, easing: tween.easeOut }); // Hide speech bubble after delay LK.setTimeout(function () { tween(self.speechBubble, { alpha: 0 }, { duration: 300, easing: tween.easeIn }); }, 2000); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB // Sky blue background }); /**** * Game Code ****/ // Game variables var score = 0; var level = 1; var combo = 0; var maxCombo = 0; var missedContainers = 0; var levelContainerCount = 0; var containersToNextLevel = 10; var isGameOver = false; var currentShip = null; var nextShipTimer = null; var ships = []; var trump = null; // Create UI elements var scoreTxt = new Text2('$0', { size: 60, fill: 0x00FF00 }); scoreTxt.anchor.set(0, 0); LK.gui.topRight.addChild(scoreTxt); scoreTxt.x = -300; scoreTxt.y = 20; var levelTxt = new Text2('Level: 1', { size: 60, fill: 0xFFFFFF }); levelTxt.anchor.set(0, 0); LK.gui.top.addChild(levelTxt); levelTxt.x = -50; levelTxt.y = 20; var comboTxt = new Text2('Combo: 0', { size: 40, fill: 0xFFFF00 }); comboTxt.anchor.set(0, 0); comboTxt.alpha = 0; LK.gui.topRight.addChild(comboTxt); comboTxt.x = -250; comboTxt.y = 90; // Initialize game function initGame() { // Reset game variables score = 0; LK.setScore(0); // Initialize score in LK system level = 1; combo = 0; maxCombo = 0; missedContainers = 0; levelContainerCount = 0; containersToNextLevel = 10; isGameOver = false; ships = []; currentShip = null; if (nextShipTimer) { LK.clearTimeout(nextShipTimer); } nextShipTimer = null; // Update UI scoreTxt.setText('$0'); levelTxt.setText('Level: 1'); comboTxt.setText('Combo: 0'); comboTxt.alpha = 0; // Create Trump character if (!trump) { trump = new TrumpCharacter(); trump.x = 300; trump.y = 400; game.addChild(trump); } // Start the game by spawning the first ship spawnNewShip(); // Play background music LK.playMusic('gameMusic'); } // Spawn a new shipping ship function spawnNewShip() { // Check if we already have 4 ships if (ships.length >= 4) { return; } // Create a new ship currentShip = new ShippingShip(); currentShip.x = 2048 + 600; // Start off-screen to the right // Assign different y coordinates for each ship // Define possible y positions var possibleYPositions = [700, 1000, 1700, 2400]; // Different y positions // Filter out positions that are already occupied by existing ships var availablePositions = possibleYPositions.filter(function (position) { // Check if any existing ship is at this y position for (var i = 0; i < ships.length; i++) { if (Math.abs(ships[i].y - position) < 10) { // Using a small threshold to account for floating point differences return false; // Position is occupied } } return true; // Position is available }); // If all positions are occupied, use the original list (should rarely happen since we limit to 4 ships) if (availablePositions.length === 0) { availablePositions = possibleYPositions; } // Choose a random position from the available options var randomIndex = Math.floor(Math.random() * availablePositions.length); var yPosition = availablePositions[randomIndex]; currentShip.y = yPosition; // Create containers for the ship based on current level currentShip.createContainers(level); // Add ship to game and tracking array game.addChild(currentShip); ships.push(currentShip); } // Apply tariff to a container when tapped function applyTariffToContainer(container) { if (!isGameOver && container && !container.targetted) { if (container.applyTariff()) { // Increase score based on container value and combo var pointsGained = container.value * (1 + combo * 0.1); score += Math.floor(pointsGained); // Update LK score system LK.setScore(score); // Update score text to show money scoreTxt.setText('$' + score); // Increase combo combo++; if (combo > maxCombo) { maxCombo = combo; } // Show combo text if combo is greater than 1 if (combo > 1) { comboTxt.setText('Combo: ' + combo + 'x'); comboTxt.alpha = 1; // Animate combo text tween(comboTxt, { size: 100 }, { duration: 200, easing: tween.easeOut, onFinish: function onFinish() { tween(comboTxt, { size: 60 }, { duration: 200, easing: tween.easeIn }); } }); } // Track containers for level progression levelContainerCount++; // Check if we should level up if (levelContainerCount >= containersToNextLevel) { levelUp(); } // Occasionally make Trump say something if (Math.random() < 0.2) { trump.showRandomQuote(); } } } } // Level up function function levelUp() { level++; levelContainerCount = 0; containersToNextLevel = 10 + level * 2; // Save current level text for animation var levelValue = level; // Flash level text to indicate level up tween(levelTxt, { size: 100 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { // Update level text after scaling up levelTxt.setText('Level: ' + levelValue); tween(levelTxt, { size: 60 }, { duration: 300, easing: tween.easeIn }); } }); // Play one of the level up sounds randomly var levelUpSounds = ['levelUp', 'LevelUp2', 'LevelUp3']; var randomIndex = Math.floor(Math.random() * levelUpSounds.length); var soundToPlay = levelUpSounds[randomIndex]; LK.getSound(soundToPlay).play(); // Make Trump's hair bounce if (trump && trump.hair) { // Starting position var originalY = trump.hair.y; // Bounce up tween(trump.hair, { y: originalY - 50, scaleY: 1.2 }, { duration: 300, easing: tween.bounceOut, onFinish: function onFinish() { // Bounce down tween(trump.hair, { y: originalY, scaleY: 1 }, { duration: 400, easing: tween.bounceOut }); } }); } // Make Trump say something about the level up trump.showRandomQuote(); } // Game over function function endGame() { if (!isGameOver) { isGameOver = true; // Save high score if current score is higher if (score > storage.highScore) { storage.highScore = score; } // Save last score storage.lastScore = score; // Set the score using LK.setScore before showing game over LK.setScore(score); // Play game over sound and wait for it to finish before showing game over screen LK.getSound('Gameover').play(); // Delay showing game over screen slightly to allow sound to play LK.setTimeout(function () { // Show game over screen with high score LK.showGameOver(); }, 1000); // Short delay for sound to start playing } } // Check if all containers on a ship have tariffs function checkShipCompleted(ship) { if (!ship) { return false; } var allTariffed = true; for (var i = 0; i < ship.containers.length; i++) { if (!ship.containers[i].targetted) { allTariffed = false; break; } } return allTariffed; } // Game update function called every frame game.update = function () { // Skip if game is over if (isGameOver) { return; } // Update all ships for (var i = ships.length - 1; i >= 0; i--) { var ship = ships[i]; // Check if ship is completely off screen if (ship.x < -1000) { // Count missed containers for (var j = 0; j < ship.containers.length; j++) { if (!ship.containers[j].targetted) { missedContainers++; // Reset combo when containers are missed combo = 0; comboTxt.setText('Combo: 0'); comboTxt.alpha = 0; // Play miss sound LK.getSound('miss').play(); } } // Remove ship game.removeChild(ship); ships.splice(i, 1); // Check if game over (missed too many containers) if (missedContainers >= 10) { endGame(); return; } // Schedule next ship if we have fewer than 4 if (ship === currentShip) { currentShip = null; // Clear any existing timer if (nextShipTimer) { LK.clearTimeout(nextShipTimer); } nextShipTimer = LK.setTimeout(spawnNewShip, 200); // Reduced from 400ms to 200ms for even faster respawning } } // If ship is off-screen to the right, move it into view else if (ship.x > 2048) { ship.x -= 10; } // Normal ship movement else { ship.x -= 5 + level; // Check if ship is completed and speed it up if (checkShipCompleted(ship)) { ship.x -= 10; } } } // Spawn new ships until we have up to 4 ships if (ships.length < 4) { if (!nextShipTimer) { nextShipTimer = LK.setTimeout(spawnNewShip, 150); // Reduced from 300ms to 150ms for more frequent spawning } // More frequently spawn a ship immediately if we have fewer than 2 ships on screen if (ships.length < 3 && LK.ticks % 30 === 0) { // Check twice as often spawnNewShip(); } } }; // Initialize the game initGame();
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0,
lastScore: 0
});
/****
* Classes
****/
var ShippingContainer = Container.expand(function (type) {
var self = Container.call(this);
// Set container type and properties
self.type = type || 'container';
self.targetted = false;
self.speed = 3 + Math.random() * 2;
self.value = 10;
// Adjust value based on container type
if (self.type === 'foodContainer') {
self.value = 15;
} else if (self.type === 'paperContainer') {
self.value = 20;
} else if (self.type === 'diaperContainer') {
self.value = 25;
} else if (self.type === 'carPartsContainer') {
self.value = 30;
}
// Get and automatically addChild appropriate asset with anchor set
var containerGraphics = self.attachAsset(self.type, {
anchorX: 0.5,
anchorY: 0.5
});
// Create shadow effect beneath container
self.shadow = new Container();
var shadowAsset = LK.getAsset(self.type, {
anchorX: 0.5,
anchorY: 0.5,
tint: 0x000000,
alpha: 0.5,
scaleX: 1.0,
scaleY: 0.9
});
self.shadow.addChild(shadowAsset);
self.shadow.y = 25; // Position shadow further below container for more obvious effect
self.shadow.x = 10; // Slight x offset for 3D shadow effect
self.addChildAt(self.shadow, 0); // Add shadow behind container
// Label removed as requested
// Tariff stamp that appears when tapped
self.tariffStamp = self.attachAsset('tariffStamp', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
// Add text to stamp
self.stampText = new Text2('TARIFF', {
size: 40,
fill: 0xFFFFFF,
font: "Impact, Charcoal, sans-serif"
});
self.stampText.anchor.set(0.5, 0.5);
self.tariffStamp.addChild(self.stampText);
// Update method called automatically each frame
self.update = function () {
// This method is now empty as container movement is controlled by the ship
// Container position is relative to ship and doesn't need its own movement
};
// Apply tariff to container
self.applyTariff = function () {
if (self.targetted) {
return false;
}
self.targetted = true;
// Show tariff stamp with animation
self.tariffStamp.alpha = 1;
self.tariffStamp.rotation = -0.3;
tween(self.tariffStamp, {
rotation: 0
}, {
duration: 300,
easing: tween.easeOut
});
// Animate shadow when tariff is applied
tween(self.shadow, {
scaleX: 1.15,
scaleY: 1.15,
alpha: 0.7,
y: 35 // Push shadow further down during animation
}, {
duration: 150,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self.shadow, {
scaleX: 1.0,
scaleY: 0.9,
alpha: 0.5,
y: 25
}, {
duration: 300,
easing: tween.easeOut
});
}
});
// Play one of 3 slap sounds randomly
var slapSounds = ['slap', 'slap2', 'slap3'];
// Get a random sound from the array
var randomIndex = Math.floor(Math.random() * slapSounds.length);
var soundToPlay = slapSounds[randomIndex];
// Play the randomly selected sound
LK.getSound(soundToPlay).play();
return true;
};
// Tap/click handler
self.down = function (x, y, obj) {
// Add temporary shadow effect on press
if (!self.targetted) {
tween(self.shadow, {
scaleX: 1.2,
scaleY: 1.2,
alpha: 0.8,
y: 30,
// Push shadow down on press for more dramatic effect
x: 15 // Increase horizontal offset for 3D shadow effect
}, {
duration: 100,
easing: tween.easeOut
});
}
// Call the global applyTariffToContainer function passing this container
applyTariffToContainer(self);
};
return self;
});
var ShippingShip = Container.expand(function () {
var self = Container.call(this);
// Get and automatically addChild ship asset with anchor set
var shipGraphics = self.attachAsset('ship', {
anchorX: 0.5,
anchorY: 0.5
});
// Store reference to ship graphics for resizing
self.shipGraphics = shipGraphics;
// Add containers to the ship
self.containers = [];
// Create containers for the ship
self.createContainers = function (level) {
// Clear existing containers
for (var i = 0; i < self.containers.length; i++) {
if (self.containers[i]) {
self.removeChild(self.containers[i]);
}
}
self.containers = [];
// Determine how many containers to create based on level
var containerCount = Math.min(Math.floor(2 + level / 2), 5);
// Randomly decide which container types to use
var containerTypes = ['foodContainer', 'paperContainer', 'diaperContainer', 'carPartsContainer'];
// Create and position containers
for (var i = 0; i < containerCount; i++) {
var randomType = containerTypes[Math.floor(Math.random() * containerTypes.length)];
var container = new ShippingContainer(randomType);
// Set fixed positions relative to the ship
// Adjust X position based on total containers to center them on the extended ship
var totalWidth = containerCount * 220;
var startX = -totalWidth / 2 + 100;
container.x = startX + i * 220;
container.y = 0;
self.addChild(container);
self.containers.push(container);
}
// Adjust ship length based on container count
var baseLength = 1.0; // Base scale factor
var lengthPerContainer = 0.26; // Additional length per container
var newLength = baseLength + (containerCount - 1) * lengthPerContainer;
// Only adjust x-scale to change length, not height
self.shipGraphics.scaleX = newLength;
};
return self;
});
var TrumpCharacter = Container.expand(function () {
var self = Container.call(this);
// Create Trump's face using shapes
var face = self.attachAsset('trumpFace', {
anchorX: 0.5,
anchorY: 0.5,
y: -150
});
self.hair = self.attachAsset('trumpHair', {
anchorX: 0.5,
anchorY: 0.5,
y: -200
});
// Add speech bubble for occasional quotes
self.speechBubble = new Container();
var bubbleText = new Text2('America First!', {
size: 80,
fill: 0x000000,
font: "'Comic Sans MS', 'Comic Sans', cursive"
});
bubbleText.anchor.set(0, 0.5);
self.speechBubble.addChild(bubbleText);
self.speechBubble.x = 140;
self.speechBubble.y = -80;
self.speechBubble.alpha = 0;
self.addChild(self.speechBubble);
// Method to show a random Trump quote
self.showRandomQuote = function () {
// Don't show a new quote if speech bubble is still visible
if (self.speechBubble.alpha > 0) {
return;
}
var quotes = ["America First!", "Beautiful Tariffs!", "Huge Tariffs!", "The Best Tariffs!", "China!", "Russia!", "Tremendous!", "Huge Profits!"];
bubbleText.setText(quotes[Math.floor(Math.random() * quotes.length)]);
// Show speech bubble with animation
tween(self.speechBubble, {
alpha: 1
}, {
duration: 300,
easing: tween.easeOut
});
// Hide speech bubble after delay
LK.setTimeout(function () {
tween(self.speechBubble, {
alpha: 0
}, {
duration: 300,
easing: tween.easeIn
});
}, 2000);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Sky blue background
});
/****
* Game Code
****/
// Game variables
var score = 0;
var level = 1;
var combo = 0;
var maxCombo = 0;
var missedContainers = 0;
var levelContainerCount = 0;
var containersToNextLevel = 10;
var isGameOver = false;
var currentShip = null;
var nextShipTimer = null;
var ships = [];
var trump = null;
// Create UI elements
var scoreTxt = new Text2('$0', {
size: 60,
fill: 0x00FF00
});
scoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreTxt);
scoreTxt.x = -300;
scoreTxt.y = 20;
var levelTxt = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelTxt.anchor.set(0, 0);
LK.gui.top.addChild(levelTxt);
levelTxt.x = -50;
levelTxt.y = 20;
var comboTxt = new Text2('Combo: 0', {
size: 40,
fill: 0xFFFF00
});
comboTxt.anchor.set(0, 0);
comboTxt.alpha = 0;
LK.gui.topRight.addChild(comboTxt);
comboTxt.x = -250;
comboTxt.y = 90;
// Initialize game
function initGame() {
// Reset game variables
score = 0;
LK.setScore(0); // Initialize score in LK system
level = 1;
combo = 0;
maxCombo = 0;
missedContainers = 0;
levelContainerCount = 0;
containersToNextLevel = 10;
isGameOver = false;
ships = [];
currentShip = null;
if (nextShipTimer) {
LK.clearTimeout(nextShipTimer);
}
nextShipTimer = null;
// Update UI
scoreTxt.setText('$0');
levelTxt.setText('Level: 1');
comboTxt.setText('Combo: 0');
comboTxt.alpha = 0;
// Create Trump character
if (!trump) {
trump = new TrumpCharacter();
trump.x = 300;
trump.y = 400;
game.addChild(trump);
}
// Start the game by spawning the first ship
spawnNewShip();
// Play background music
LK.playMusic('gameMusic');
}
// Spawn a new shipping ship
function spawnNewShip() {
// Check if we already have 4 ships
if (ships.length >= 4) {
return;
}
// Create a new ship
currentShip = new ShippingShip();
currentShip.x = 2048 + 600; // Start off-screen to the right
// Assign different y coordinates for each ship
// Define possible y positions
var possibleYPositions = [700, 1000, 1700, 2400]; // Different y positions
// Filter out positions that are already occupied by existing ships
var availablePositions = possibleYPositions.filter(function (position) {
// Check if any existing ship is at this y position
for (var i = 0; i < ships.length; i++) {
if (Math.abs(ships[i].y - position) < 10) {
// Using a small threshold to account for floating point differences
return false; // Position is occupied
}
}
return true; // Position is available
});
// If all positions are occupied, use the original list (should rarely happen since we limit to 4 ships)
if (availablePositions.length === 0) {
availablePositions = possibleYPositions;
}
// Choose a random position from the available options
var randomIndex = Math.floor(Math.random() * availablePositions.length);
var yPosition = availablePositions[randomIndex];
currentShip.y = yPosition;
// Create containers for the ship based on current level
currentShip.createContainers(level);
// Add ship to game and tracking array
game.addChild(currentShip);
ships.push(currentShip);
}
// Apply tariff to a container when tapped
function applyTariffToContainer(container) {
if (!isGameOver && container && !container.targetted) {
if (container.applyTariff()) {
// Increase score based on container value and combo
var pointsGained = container.value * (1 + combo * 0.1);
score += Math.floor(pointsGained);
// Update LK score system
LK.setScore(score);
// Update score text to show money
scoreTxt.setText('$' + score);
// Increase combo
combo++;
if (combo > maxCombo) {
maxCombo = combo;
}
// Show combo text if combo is greater than 1
if (combo > 1) {
comboTxt.setText('Combo: ' + combo + 'x');
comboTxt.alpha = 1;
// Animate combo text
tween(comboTxt, {
size: 100
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(comboTxt, {
size: 60
}, {
duration: 200,
easing: tween.easeIn
});
}
});
}
// Track containers for level progression
levelContainerCount++;
// Check if we should level up
if (levelContainerCount >= containersToNextLevel) {
levelUp();
}
// Occasionally make Trump say something
if (Math.random() < 0.2) {
trump.showRandomQuote();
}
}
}
}
// Level up function
function levelUp() {
level++;
levelContainerCount = 0;
containersToNextLevel = 10 + level * 2;
// Save current level text for animation
var levelValue = level;
// Flash level text to indicate level up
tween(levelTxt, {
size: 100
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
// Update level text after scaling up
levelTxt.setText('Level: ' + levelValue);
tween(levelTxt, {
size: 60
}, {
duration: 300,
easing: tween.easeIn
});
}
});
// Play one of the level up sounds randomly
var levelUpSounds = ['levelUp', 'LevelUp2', 'LevelUp3'];
var randomIndex = Math.floor(Math.random() * levelUpSounds.length);
var soundToPlay = levelUpSounds[randomIndex];
LK.getSound(soundToPlay).play();
// Make Trump's hair bounce
if (trump && trump.hair) {
// Starting position
var originalY = trump.hair.y;
// Bounce up
tween(trump.hair, {
y: originalY - 50,
scaleY: 1.2
}, {
duration: 300,
easing: tween.bounceOut,
onFinish: function onFinish() {
// Bounce down
tween(trump.hair, {
y: originalY,
scaleY: 1
}, {
duration: 400,
easing: tween.bounceOut
});
}
});
}
// Make Trump say something about the level up
trump.showRandomQuote();
}
// Game over function
function endGame() {
if (!isGameOver) {
isGameOver = true;
// Save high score if current score is higher
if (score > storage.highScore) {
storage.highScore = score;
}
// Save last score
storage.lastScore = score;
// Set the score using LK.setScore before showing game over
LK.setScore(score);
// Play game over sound and wait for it to finish before showing game over screen
LK.getSound('Gameover').play();
// Delay showing game over screen slightly to allow sound to play
LK.setTimeout(function () {
// Show game over screen with high score
LK.showGameOver();
}, 1000); // Short delay for sound to start playing
}
}
// Check if all containers on a ship have tariffs
function checkShipCompleted(ship) {
if (!ship) {
return false;
}
var allTariffed = true;
for (var i = 0; i < ship.containers.length; i++) {
if (!ship.containers[i].targetted) {
allTariffed = false;
break;
}
}
return allTariffed;
}
// Game update function called every frame
game.update = function () {
// Skip if game is over
if (isGameOver) {
return;
}
// Update all ships
for (var i = ships.length - 1; i >= 0; i--) {
var ship = ships[i];
// Check if ship is completely off screen
if (ship.x < -1000) {
// Count missed containers
for (var j = 0; j < ship.containers.length; j++) {
if (!ship.containers[j].targetted) {
missedContainers++;
// Reset combo when containers are missed
combo = 0;
comboTxt.setText('Combo: 0');
comboTxt.alpha = 0;
// Play miss sound
LK.getSound('miss').play();
}
}
// Remove ship
game.removeChild(ship);
ships.splice(i, 1);
// Check if game over (missed too many containers)
if (missedContainers >= 10) {
endGame();
return;
}
// Schedule next ship if we have fewer than 4
if (ship === currentShip) {
currentShip = null;
// Clear any existing timer
if (nextShipTimer) {
LK.clearTimeout(nextShipTimer);
}
nextShipTimer = LK.setTimeout(spawnNewShip, 200); // Reduced from 400ms to 200ms for even faster respawning
}
}
// If ship is off-screen to the right, move it into view
else if (ship.x > 2048) {
ship.x -= 10;
}
// Normal ship movement
else {
ship.x -= 5 + level;
// Check if ship is completed and speed it up
if (checkShipCompleted(ship)) {
ship.x -= 10;
}
}
}
// Spawn new ships until we have up to 4 ships
if (ships.length < 4) {
if (!nextShipTimer) {
nextShipTimer = LK.setTimeout(spawnNewShip, 150); // Reduced from 300ms to 150ms for more frequent spawning
}
// More frequently spawn a ship immediately if we have fewer than 2 ships on screen
if (ships.length < 3 && LK.ticks % 30 === 0) {
// Check twice as often
spawnNewShip();
}
}
};
// Initialize the game
initGame();
Long Cargo ship top down. In-Game asset. 2d. High contrast. No shadows
Trump face oval no hair. In-Game asset. 2d. High contrast. No shadows
Box of toilet paper top down. In-Game asset. 2d. High contrast. No shadows
Diaper container top down. In-Game asset. 2d. High contrast. No shadows
Bag of rice top down. In-Game asset. 2d. High contrast. No shadows
Car parts in crate top down. In-Game asset. 2d. High contrast. No shadows