/**** * 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('KÜRT', { 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 }); // Removed trumpHair asset as requested // 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(); // Removed Trump's hair bounce animation as trumpHair is no longer present // 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(); }, 1346); // 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();
===================================================================
--- original.js
+++ change.js
@@ -53,9 +53,9 @@
anchorY: 0.5,
alpha: 0
});
// Add text to stamp
- self.stampText = new Text2('TARIFF', {
+ self.stampText = new Text2('KÜRT', {
size: 40,
fill: 0xFFFFFF,
font: "Impact, Charcoal, sans-serif"
});