User prompt
correct, nice guess should be above pointguy not below
User prompt
move pointguy to the left of doge and tailz, not above it else we see everything overlapping
User prompt
use pointguy when the player guesses correctly in meme flip
User prompt
do it
User prompt
doesn't work, the character does not flip anymore
User prompt
do it
User prompt
can the walls that slowly expand be transformed so it looks like the rainbow road? (glows rainbow colors) ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
do it !
User prompt
instead of FlipRunnerObstacle use obstaclerunner visuals
User prompt
okay, do it!
User prompt
can you animate cat player to give it a running vibe ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
instead of attachasset selection button, use doge, trollface and pepe
User prompt
in meme runner polarity shift, instead of creating selection button, create doge, pepe or trollface
User prompt
invert cats players X when its on the top side of the screen
User prompt
LK.setTimeout(function () { LK.setScore(coinFlipStreak); LK.showGameOver(); }, 1000);
User prompt
Please fix the bug: 'Timeout.tick error: tween.interpolateColor is not a function' in or related to this line: 'epicStreakText.tint = tween.interpolateColor(0xFF0000, 0x00FF00, hue);' Line Number: 1473 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Instead of relying on child indices, modify setupCoinFlip to store references to the buttons in variables with wider scope. For example: At the top of your file (with other game-wide vars): var flipButton, headsButton, tailsButton; Then in setupCoinFlip(): headsButton = new Button("HEADZ", 350, 180); // ... tailsButton = new Button("TAILZ", 350, 180); // ... flipButton = new Button("FLIP IT!!1!", 450, 180); Then in your coin.onFlipComplete: if (flipButton) flipButton.interactive = true; if (headsButton) headsButton.interactive = true; if (tailsButton) tailsButton.interactive = true;
User prompt
✅ Disable coin flip button after pressing flip it ✅ Disable headz button after pressing flip it ✅ Disable tailz button after pressing flip it
User prompt
the player shouldn't be able to press on heads, tailz or flip it when the spinning animation is playing,
User prompt
Inside MemeCoin: Add a self.onFlipComplete handler: self.onFlipComplete = null; And in the final doFlip() callback (after self.isFlipping = false;), add: if (typeof self.onFlipComplete === 'function') { self.onFlipComplete(self.isHeads); } Then in flipButton.up: Replace LK.setTimeout(...) with: coin.onFlipComplete = function (result) { let correct = coinFlipGuess === result; // Now run the meme reaction logic here };
User prompt
Delay Meme Reactions Until After Flip ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
wait for the spinning animation to finish before telling the result and also everything else ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Only Show the Final Coin Side
Code edit (1 edits merged)
Please save this source code
User prompt
the coin flip game is bugged, if tailz win, do not show doge which is used for heads, and if ever head wins, do not show tailz
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore1: 0, highScore2: 0, highScore3: 0 }); /**** * Classes ****/ var Button = Container.expand(function (text, width, height) { var self = Container.call(this); var buttonShape = self.attachAsset('selectionButton', { anchorX: 0.5, anchorY: 0.5, width: width || 400, height: height || 300 }); // Add gradient and shadow effect to button buttonShape.tint = 0x4287f5; // Create enhanced text with shadow and better styling var buttonText = new Text2(text, { size: 50, fill: 0xFFFFFF, align: 'center', stroke: 0x000000, strokeThickness: 5, dropShadow: true, dropShadowColor: 0x000000, dropShadowAngle: Math.PI / 6, dropShadowDistance: 4 }); buttonText.anchor.set(0.5, 0.5); self.addChild(buttonText); // Enhanced down effect with scale self.down = function () { buttonShape.alpha = 0.8; LK.getSound('buttonClick').play(); // Add scale effect on press tween(self.scale, { x: 0.95, y: 0.95 }, { duration: 100, easing: tween.easeOutQuad }); // Add glow effect LK.effects.flashObject(buttonShape, 0x66ccff, 300); }; // Enhanced up effect self.up = function () { buttonShape.alpha = 1.0; // Return to normal scale with slight bounce tween(self.scale, { x: 1.0, y: 1.0 }, { duration: 200, easing: tween.bounceOut }); }; return self; }); // Add prototype method for Button so Button.prototype.up can be called // CatNinja classes var CatPlayer = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('catPlayer', { anchorX: 0.5, anchorY: 0.5 }); self.score = 0; self.lives = 3; self.slash = function (cucumber) { LK.getSound('slice').play(); LK.effects.flashObject(cucumber, 0xFFFFFF, 300); self.score += 1; return true; }; return self; }); // CoinFlip classes var Coin = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); self.isHeads = true; self.isFlipping = false; self.flip = function () { if (self.isFlipping) { return; } self.isFlipping = true; LK.getSound('flip').play(); var flips = Math.floor(Math.random() * 10) + 5; var flipDuration = 1500; function doFlip(flipsLeft) { if (flipsLeft <= 0) { self.isFlipping = false; self.isHeads = Math.random() >= 0.5; return; } tween(coinGraphics, { scaleX: 0 }, { duration: flipDuration / (flipsLeft * 2), onFinish: function onFinish() { self.isHeads = !self.isHeads; coinGraphics.tint = self.isHeads ? 0xF1C40F : 0xE67E22; tween(coinGraphics, { scaleX: 1 }, { duration: flipDuration / (flipsLeft * 2), onFinish: function onFinish() { doFlip(flipsLeft - 1); } }); } }); } doFlip(flips); }; return self; }); var Cucumber = Container.expand(function () { var self = Container.call(this); var cucumberGraphics = self.attachAsset('cucumber', { anchorX: 0.5, anchorY: 0.5 }); self.speed = Math.random() * 5 + 5; self.rotationSpeed = (Math.random() - 0.5) * 0.2; self.update = function () { self.y += self.speed; self.rotation += self.rotationSpeed; }; return self; }); var DoodlePlatform = Container.expand(function (x, y) { var self = Container.call(this); var platformGraphics = self.attachAsset('doodlePlatform', { anchorX: 0.5, anchorY: 0.5 }); self.x = x; self.y = y; self.speed = 0; self.isMoving = Math.random() > 0.7; if (self.isMoving) { self.speed = Math.random() * 4 + 2; self.direction = Math.random() > 0.5 ? 1 : -1; platformGraphics.tint = 0xE74C3C; } self.update = function () { if (self.isMoving) { self.x += self.speed * self.direction; if (self.x > 1900 || self.x < 150) { self.direction *= -1; } } }; return self; }); // DoodleJump classes var DoodlePlayer = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('doodlePlayer', { anchorX: 0.5, anchorY: 0.5 }); self.velocityY = 0; self.gravity = 0.5; self.jumpPower = -15; self.jump = function () { self.velocityY = self.jumpPower; LK.getSound('jump').play(); }; self.update = function () { self.velocityY += self.gravity; self.y += self.velocityY; }; return self; }); var FlipRunnerObstacle = Container.expand(function (yPosition, speed) { var self = Container.call(this); var obstacleGraphics = self.attachAsset('doodlePlatform', { anchorX: 0.5, anchorY: 0.5, width: 100, height: 40 }); self.polarity = yPosition > 1366 ? -1 : 1; // Determines if obstacle is on top or bottom self.speed = speed || 15; self.x = 2200; // Start just off-screen self.y = yPosition; // Color based on polarity obstacleGraphics.tint = self.polarity > 0 ? 0x27ae60 : 0xe74c3c; self.update = function () { self.x -= self.speed; }; return self; }); var FlipRunnerPlayer = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('catPlayer', { anchorX: 0.5, anchorY: 0.5 }); self.polarity = 1; // 1 for top, -1 for bottom self.speed = 10; self.score = 0; self.isAlive = true; self.flip = function () { if (!self.isAlive) { return; } self.polarity *= -1; LK.getSound('flip').play(); // Animate the flip tween(self, { y: self.polarity > 0 ? 600 : 2132 }, { duration: 300, easing: tween.bounceOut }); // Visual effect when flipping tween(playerGraphics, { rotation: self.polarity > 0 ? 0 : Math.PI }, { duration: 300, easing: tween.bounceOut }); }; self.update = function () { self.score += 0.1; // Invert player's X when on top side of the screen if (self.polarity > 0) { // Top side - flip X playerGraphics.scale.x = -1; } else { // Bottom side - normal X playerGraphics.scale.x = 1; } }; self.die = function () { if (!self.isAlive) { return; } self.isAlive = false; LK.effects.flashObject(self, 0xFF0000, 500); }; return self; }); var FlipRunnerTunnel = Container.expand(function () { var self = Container.call(this); // Top wall var topWall = self.attachAsset('doodlePlatform', { anchorX: 0, anchorY: 0, width: 2048, height: 400 }); topWall.tint = 0x34495e; // Bottom wall var bottomWall = self.attachAsset('doodlePlatform', { anchorX: 0, anchorY: 1, width: 2048, height: 400 }); bottomWall.tint = 0x34495e; bottomWall.y = 2732; this.topWall = topWall; this.bottomWall = bottomWall; this.initialGap = bottomWall.y - bottomWall.height - topWall.height; this.gap = this.initialGap; this.shrinkRate = 0.1; // pixels per frame (tweak as desired) this.update = function () { // shrink the gap, but don't go below 400px this.gap = Math.max(400, this.gap - this.shrinkRate); // recalc each wall's height so the total gap is correct var newWallHeight = (2732 - this.gap) / 2; this.topWall.height = newWallHeight; this.bottomWall.height = newWallHeight; this.bottomWall.y = 2732; // anchorY=1 keeps it flush to bottom // expose gap edges for collision detection this.topY = this.topWall.height; this.bottomY = this.bottomWall.y - this.bottomWall.height; }; return self; }); var HomeButton = Container.expand(function () { var self = Container.call(this); var buttonShape = self.attachAsset('homeButton', { anchorX: 0.5, anchorY: 0.5 }); var buttonText = new Text2("HOME", { size: 40, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); self.addChild(buttonText); self.down = function () { buttonShape.alpha = 0.7; LK.getSound('buttonClick').play(); }; self.up = function () { buttonShape.alpha = 1.0; switchToMainMenu(); }; return self; }); var MemeCoin = Container.expand(function () { var self = Container.call(this); // Create both sides of the coin with meme faces var headsSide = self.attachAsset('Doge', { anchorX: 0.5, anchorY: 0.5, width: 200, height: 200 }); var tailsSide = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5, width: 200, height: 200 }); // Only show heads initially tailsSide.alpha = 0; self.isHeads = true; self.isFlipping = false; self.onFlipComplete = null; // Add coin background circle var coinBg = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5, width: 220, height: 220 }); // Place circle behind faces // Implement our own swapChildren since it doesn't exist function swapChildren(parent, child1, child2) { var index1 = parent.children.indexOf(child1); var index2 = parent.children.indexOf(child2); if (index1 !== -1 && index2 !== -1) { // Remove both children parent.removeChild(child1); parent.removeChild(child2); // Add them back in swapped order if (index1 < index2) { parent.addChildAt(child2, index1); parent.addChildAt(child1, index2); } else { parent.addChildAt(child1, index2); parent.addChildAt(child2, index1); } } } swapChildren(self, coinBg, headsSide); swapChildren(self, coinBg, tailsSide); // Enhanced coin flip with meme animations self.flip = function () { if (self.isFlipping) { return; } // Start countdown before flipping var countdownText = new Text2("3", { size: 150, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 8 }); countdownText.anchor.set(0.5, 0.5); self.addChild(countdownText); // Play countdown sound LK.getSound('countdown').play(); // Countdown animation function countdown(num) { if (num > 0) { countdownText.setText(num.toString()); // Pulse animation for countdown tween(countdownText.scale, { x: 1.5, y: 1.5 }, { duration: 300, yoyo: true, repeat: 1, onFinish: function onFinish() { LK.setTimeout(function () { countdown(num - 1); }, 200); } }); } else { countdownText.setText("FLIP!"); // Flash and scale animation for "FLIP!" LK.effects.flashObject(countdownText, 0xFFFF00, 300); tween(countdownText.scale, { x: 2, y: 2 }, { duration: 300, onFinish: function onFinish() { LK.getSound('buzzer').play(); LK.setTimeout(function () { self.removeChild(countdownText); self.startFlip(); }, 300); } }); } } countdown(3); }; self.startFlip = function () { self.isFlipping = true; LK.getSound('flip').play(); // Random number of flips (more than original for drama) var flips = Math.floor(Math.random() * 10) + 8; var flipDuration = 2000; // Longer flip for more suspense // Shake screen effect LK.effects.shakeScreen(10, 500); // Initial position for bounce effect var originalY = self.y; // Make the coin bounce up first tween(self, { y: originalY - 200 }, { duration: 300, easing: tween.easeOutQuad, onFinish: function onFinish() { // Now start the flipping as coin comes down doFlip(flips); // Return to original position with bounce tween(self, { y: originalY }, { duration: 600, easing: tween.bounceOut }); } }); function doFlip(flipsLeft) { if (flipsLeft <= 0) { self.isFlipping = false; self.isHeads = Math.random() >= 0.5; // Only show the side that the coin landed on // If heads, show Doge; if tails, show coin headsSide.alpha = self.isHeads ? 1 : 0; tailsSide.alpha = self.isHeads ? 0 : 1; // Final bounce effect tween(self.scale, { x: 1.3, y: 1.3 }, { duration: 200, yoyo: true, repeat: 1, onFinish: function onFinish() { if (typeof self.onFlipComplete === 'function') { self.onFlipComplete(self.isHeads); // Re-enable all buttons after flip completes if (flipButton) { flipButton.interactive = true; } if (headsButton) { headsButton.interactive = true; } if (tailsButton) { tailsButton.interactive = true; } } } }); return; } // Make coin appear to flip in 3D by scaling in X direction tween(self, { scaleX: 0 }, { duration: flipDuration / (flipsLeft * 2), onFinish: function onFinish() { // Switch sides when flat self.isHeads = !self.isHeads; headsSide.alpha = self.isHeads ? 1 : 0; tailsSide.alpha = self.isHeads ? 0 : 1; // Flip back to full width tween(self, { scaleX: 1 }, { duration: flipDuration / (flipsLeft * 2), onFinish: function onFinish() { doFlip(flipsLeft - 1); } }); } }); } }; return self; }); var MemeReaction = Container.expand(function (memeType, size) { var self = Container.call(this); // Get the appropriate asset based on type var assetId = memeType === 'doge' ? 'Doge' : memeType === 'troll' ? 'Trollface' : 'Pepe'; var memeGraphics = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5, width: size || 300, height: size || 300 }); self.alpha = 0; // Start invisible for entrance animation // Animate entrance based on type self.show = function () { // Different animation for each meme type if (memeType === 'doge') { // Doge bounces in happily self.y -= 200; // Start above target position tween(self, { alpha: 1, y: self.y + 200 }, { duration: 500, easing: tween.bounceOut }); // Play appropriate sound LK.getSound('wow').play(); } else if (memeType === 'troll') { // Trollface slides in from side with rotation self.x += 300; // Start to the right self.rotation = Math.PI * 2; // Full rotation tween(self, { alpha: 1, x: self.x - 300, rotation: 0 }, { duration: 600, easing: tween.easeOutQuad }); // Play appropriate sound LK.getSound('bruh').play(); } else { // Pepe // Pepe fades in with a sad wobble tween(self, { alpha: 1 }, { duration: 300, onFinish: function onFinish() { // Sad wobble animation tween(self, { rotation: -0.1 }, { duration: 200, yoyo: true, repeat: 3, easing: tween.easeInOutSine }); } }); // Play appropriate sound LK.getSound('wednesday').play(); } }; // Animate exit self.hide = function (callback) { tween(self, { alpha: 0, y: self.y - 100 }, { duration: 500, easing: tween.easeInQuad, onFinish: function onFinish() { if (callback) { callback(); } self.destroy(); } }); }; return self; }); var Sanic = Container.expand(function () { var self = Container.call(this); var sanicGraphics = self.attachAsset('Sanic', { anchorX: 0.5, anchorY: 0.5 }); // Speed of Sanic's movement self.speed = 12; self.x = -100; // Start off-screen to the left // Update called every frame self.update = function () { // Initialize bobbing variables if not set if (self.bobOffset === undefined) { self.bobOffset = 0; self.bobSpeed = 0.1; self.bobAmount = 30; self.originalY = self.y; } // Update bobbing animation self.bobOffset += self.bobSpeed; self.y = self.originalY + Math.sin(self.bobOffset) * self.bobAmount; // Add slight rotation to match the bobbing movement self.rotation = Math.sin(self.bobOffset) * 0.08; // Move Sanic from left to right self.x += self.speed; // Destroy Sanic when he moves off-screen to the right if (self.x > 2148) { // 2048 + half of Sanic's width self.destroy(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2C3E50 }); /**** * Game Code ****/ // Game state variables // DoodleJump assets // CoinFlip assets // CatNinja assets // Sound effects // Background music var flipTunnel = null; var flipButton, headsButton, tailsButton; // Button references for coin flip game // Add prototype method for Button so Button.prototype.up can be called Button.prototype.up = function () { this.children[0].alpha = 1.0; }; var currentScene = "mainMenu"; var currentGame = null; var dragNode = null; // Score variables var score = 0; var platformsPassed = 0; // Game-specific variables var platforms = []; var cucumbers = []; var coin = null; var player = null; var gameTimer = null; var coinFlipGuess = null; var coinFlipStreak = 0; var obstacles = []; var tunnelSpeed = 15; var lastObstacleTime = 0; var flipScoreText = null; // Game backgrounds and containers var mainMenuContainer = new Container(); var gameSelectionContainer = new Container(); var doodleJumpContainer = new Container(); var coinFlipContainer = new Container(); var catNinjaContainer = new Container(); var flipRunnerContainer = new Container(); function setupMainMenu() { // Add splash background var splashBackground = mainMenuContainer.attachAsset('SplashBackground', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2 + 100 }); // Play and loop splash music LK.playMusic('splashmusic', { loop: true }); // Animate the splash background with a dance effect function animateSplashBackground() { // Move right and down with slight rotation tween(splashBackground, { x: 2048 / 2 + 30, y: 2732 / 2 + 20, rotation: 0.03 }, { duration: 1800, easing: tween.easeInOutQuad, onFinish: function onFinish() { // Move left and up with opposite rotation tween(splashBackground, { x: 2048 / 2 - 30, y: 2732 / 2 - 20, rotation: -0.03 }, { duration: 1800, easing: tween.easeInOutQuad, onFinish: function onFinish() { // Move center and down with slight scale change tween(splashBackground, { x: 2048 / 2, y: 2732 / 2 + 15, rotation: 0, scaleX: 1.02, scaleY: 1.02 }, { duration: 1800, easing: tween.easeInOutSine, onFinish: function onFinish() { // Return to original position and scale tween(splashBackground, { x: 2048 / 2, y: 2732 / 2, scaleX: 1, scaleY: 1 }, { duration: 1800, easing: tween.easeInOutSine, onFinish: function onFinish() { // Repeat the animation animateSplashBackground(); } }); } }); } }); } }); } // Start the background animation animateSplashBackground(); // Create empty title text first var titleText = new Text2("", { size: 200, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 10, fontWeight: 'bold', dropShadow: true, dropShadowColor: 0x000000, dropShadowAngle: Math.PI / 4, dropShadowDistance: 12 }); titleText.anchor.set(0.5, 0.5); titleText.x = 2048 / 2; titleText.y = 400; // Prepare for character-by-character reveal var fullTitleText = "NOX PRESENTS:"; var currentCharIndex = 0; var charRevealInterval = LK.setInterval(function () { if (currentCharIndex <= fullTitleText.length) { titleText.setText(fullTitleText.substring(0, currentCharIndex)); currentCharIndex++; // Add a small scale bounce effect for each new character if (currentCharIndex > 1) { titleText.scale.set(1.1, 1.1); tween(titleText.scale, { x: 1.0, y: 1.0 }, { duration: 200, easing: tween.bounceOut }); } } else { var _bounceTitleContinuously = function bounceTitleContinuously() { // Bounce up tween(titleText, { y: 380 }, { duration: 600, easing: tween.easeInOutQuad, onFinish: function onFinish() { // Bounce down tween(titleText, { y: 400 }, { duration: 600, easing: tween.easeInOutQuad, onFinish: _bounceTitleContinuously // Loop the animation }); } }); }; // Start continuous bouncing // Animation complete, clear interval LK.clearInterval(charRevealInterval); // Start continuous bouncing animation _bounceTitleContinuously(); } }, 150); // Reveal a new character every 150ms var startButton = new Button("START", 600, 220); startButton.x = 2048 / 2; startButton.y = 2732 - 300; // Position at bottom middle of screen // Add stroke to the button text // Make sure style object exists before setting properties if (!startButton.children[1].style) { startButton.children[1].style = {}; } startButton.children[1].style.stroke = 0x000000; startButton.children[1].style.strokeThickness = 10; startButton.children[1].style.fontSize = 70; // Increase text size too startButton.up = function () { Button.prototype.up.call(this); LK.getSound('yahoo').play(); switchToGameSelection(); }; // Add squash and stretch animation to the start button function animateStartButton() { // Squash (wider horizontally, shorter vertically) tween(startButton.scale, { x: 1.2, y: 0.8 }, { duration: 700, easing: tween.easeInOutQuad, onFinish: function onFinish() { // Stretch (taller vertically, narrower horizontally) tween(startButton.scale, { x: 0.9, y: 1.2 }, { duration: 700, easing: tween.easeInOutQuad, onFinish: function onFinish() { // Return to normal scale tween(startButton.scale, { x: 1.0, y: 1.0 }, { duration: 700, easing: tween.easeInOutQuad, onFinish: animateStartButton }); } }); } }); } // Start the button animation animateStartButton(); mainMenuContainer.addChild(titleText); mainMenuContainer.addChild(startButton); } function setupGameSelection() { // Add MenuBackground behind all elements var menuBackground = gameSelectionContainer.attachAsset('MenuBackground', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2 }); // Add Pointguy in front of MenuBackground var pointguy = gameSelectionContainer.attachAsset('Pointguy', { anchorX: 0.5, anchorY: 0.5, x: 465, y: 1366 }); // Add bobbing animation to Pointguy function animatePointguy() { // Bob up with stretch tween(pointguy, { y: 1100, // Move up by 50px (increased from 40px) scaleX: 0.95, // Stretch taller and thinner (reduced from 0.9) scaleY: 1.05 // Reduced from 1.1 }, { duration: 2000, easing: tween.easeInOutQuad, onFinish: function onFinish() { // Bob down with squash tween(pointguy, { y: 1850, // Down by 50px from center (increased from original position) scaleX: 1.05, // Squash wider and shorter (reduced from 1.1) scaleY: 0.95 // Reduced from 0.9 }, { duration: 2000, easing: tween.easeInOutQuad, onFinish: animatePointguy // Continue the loop }); } }); } // Start the bobbing animation animatePointguy(); // Periodically spawn Sanic running across the screen function spawnSanic() { var sanic = new Sanic(); sanic.y = 2500; // Position Sanic at a good height on screen gameSelectionContainer.addChild(sanic); // Schedule next Sanic to appear after this one leaves LK.setTimeout(spawnSanic, 4000 + Math.random() * 2000); } // Start spawning Sanic characters spawnSanic(); // Create animated title with shadow and effects var titleText = new Text2("SELECT A GAME", { size: 200, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 10, fontWeight: 'bold', dropShadow: true, dropShadowColor: 0x000000, dropShadowAngle: Math.PI / 4, dropShadowDistance: 8 }); titleText.anchor.set(0.5, 0.5); titleText.x = 2048 / 2; titleText.y = 300; titleText.alpha = 0; // Animate title entrance tween(titleText, { alpha: 1, y: 250 }, { duration: 800, easing: tween.bounceOut }); // Setup continuous subtle title animation function animateTitle() { tween(titleText, { y: 270 }, { duration: 1500, easing: tween.easeInOutQuad, onFinish: function onFinish() { tween(titleText, { y: 250 }, { duration: 1500, easing: tween.easeInOutQuad, onFinish: animateTitle }); } }); } LK.setTimeout(animateTitle, 1000); // Create game selection buttons with staggered animations - 25% smaller and repositioned var game1Button = new Button("Meme Runner\nPolarity Shift", 375, 262); // 25% smaller (500*0.75=375, 350*0.75=262.5) game1Button.x = 2300; // Start off-screen game1Button.y = 1100; // Moved up slightly game1Button.alpha = 0; var game2Button = new Button("Meme Flip\nChallenge", 375, 262); // 25% smaller game2Button.x = 2300; // Start off-screen game2Button.y = 1425; // Centered vertically in the TV screen game2Button.alpha = 0; var game3Button = new Button("Cat Ninja\nCucumber Escape", 375, 262); // 25% smaller game3Button.x = 2300; // Start off-screen game3Button.y = 1775; // Moved up slightly game3Button.alpha = 0; // Add hover/pulse effects to buttons function setupButtonAnimations(button) { // Create pulsing animation function pulseButton(btn) { tween(btn.scale, { x: 1.05, y: 1.05 }, { duration: 1000, easing: tween.easeInOutQuad, onFinish: function onFinish() { tween(btn.scale, { x: 1.0, y: 1.0 }, { duration: 1000, easing: tween.easeInOutQuad, onFinish: function onFinish() { pulseButton(btn); } }); } }); } // Start pulsing after entrance animation LK.setTimeout(function () { pulseButton(button); }, 1500); } // Animate buttons entering one after another tween(game1Button, { x: 2048 / 2 + 125, alpha: 1 }, { duration: 700, easing: tween.bounceOut, onFinish: function onFinish() { setupButtonAnimations(game1Button); // Animate second button after first tween(game2Button, { x: 2048 / 2 + 125, alpha: 1 }, { duration: 700, easing: tween.bounceOut, onFinish: function onFinish() { setupButtonAnimations(game2Button); // Animate third button after second tween(game3Button, { x: 2048 / 2 + 125, alpha: 1 }, { duration: 700, easing: tween.bounceOut, onFinish: function onFinish() { setupButtonAnimations(game3Button); } }); } }); } }); game1Button.up = function () { Button.prototype.up.call(this); // Flash button and add scale effect before starting game LK.effects.flashObject(this, 0xFFFFFF, 300); tween(this.scale, { x: 1.2, y: 1.2 }, { duration: 200, onFinish: function onFinish() { startFlipRunner(); } }); }; game2Button.up = function () { Button.prototype.up.call(this); // Flash button and add scale effect before starting game LK.effects.flashObject(this, 0xFFFFFF, 300); tween(this.scale, { x: 1.2, y: 1.2 }, { duration: 200, onFinish: function onFinish() { startCoinFlip(); } }); }; game3Button.up = function () { Button.prototype.up.call(this); // Flash button and add scale effect before starting game LK.effects.flashObject(this, 0xFFFFFF, 300); tween(this.scale, { x: 1.2, y: 1.2 }, { duration: 200, onFinish: function onFinish() { startCatNinja(); } }); }; gameSelectionContainer.addChild(titleText); gameSelectionContainer.addChild(game1Button); gameSelectionContainer.addChild(game2Button); gameSelectionContainer.addChild(game3Button); } // DoodleJump game implementation function setupDoodleJump() { var background = doodleJumpContainer.attachAsset('gameBackground', { anchorX: 0, anchorY: 0 }); var homeBtn = new HomeButton(); homeBtn.x = 150; homeBtn.y = 100; doodleJumpContainer.addChild(homeBtn); var scoreText = new Text2("Score: 0", { size: 50, fill: 0x000000 }); scoreText.anchor.set(0.5, 0); scoreText.x = 2048 / 2; scoreText.y = 50; doodleJumpContainer.addChild(scoreText); var highScoreText = new Text2("Best: " + storage.highScore1, { size: 30, fill: 0x000000 }); highScoreText.anchor.set(0.5, 0); highScoreText.x = 2048 / 2; highScoreText.y = 110; doodleJumpContainer.addChild(highScoreText); player = new DoodlePlayer(); player.x = 2048 / 2; player.y = 2000; doodleJumpContainer.addChild(player); // Generate initial platforms platforms = []; for (var i = 0; i < 10; i++) { var platform = new DoodlePlatform(Math.random() * 1800 + 100, 2600 - i * 250); platforms.push(platform); doodleJumpContainer.addChild(platform); } // First platform is directly under player platforms[0].x = player.x; platforms[0].y = player.y + 100; platforms[0].isMoving = false; score = 0; platformsPassed = 0; } function updateDoodleJump() { if (currentScene !== "doodleJump") { return; } player.update(); // Handle platform collision var onPlatform = false; for (var i = 0; i < platforms.length; i++) { var platform = platforms[i]; platform.update(); if (player.velocityY > 0 && player.y < platform.y && player.y + player.velocityY >= platform.y - 70 && Math.abs(player.x - platform.x) < 150) { player.y = platform.y - 70; player.jump(); onPlatform = true; } } // Handle screen wrapping for player if (player.x < 0) { player.x = 2048; } if (player.x > 2048) { player.x = 0; } // Scroll the world when player gets too high if (player.y < 1000) { var diff = 1000 - player.y; player.y = 1000; // Move platforms down for (var i = 0; i < platforms.length; i++) { platforms[i].y += diff; // If platform is off-screen, reposition it at the top if (platforms[i].y > 2732) { platforms[i].y = platforms[i].y - 2732; platforms[i].x = Math.random() * 1800 + 100; platforms[i].isMoving = Math.random() > 0.7; platformsPassed++; score = platformsPassed * 10; } } } // Handle game over if player falls off the bottom if (player.y > 2732) { // Update high score if (score > storage.highScore1) { storage.highScore1 = score; } LK.setScore(score); LK.showGameOver(); } // Update score display var scoreText = doodleJumpContainer.children[2]; scoreText.setText("Score: " + score); } // Add screen shake effect to LK.effects namespace if (!LK.effects.shakeScreen) { LK.effects.shakeScreen = function (intensity, duration) { var originalX = game.x; var originalY = game.y; var shakeInterval = LK.setInterval(function () { game.x = originalX + (Math.random() * 2 - 1) * intensity; game.y = originalY + (Math.random() * 2 - 1) * intensity; }, 16); LK.setTimeout(function () { LK.clearInterval(shakeInterval); game.x = originalX; game.y = originalY; }, duration); }; } // Add rainbow flash effect to LK.effects namespace if (!LK.effects.rainbowFlash) { LK.effects.rainbowFlash = function (obj, duration) { var colors = [0xFF0000, 0xFF7F00, 0xFFFF00, 0x00FF00, 0x0000FF, 0x4B0082, 0x9400D3]; var colorIndex = 0; var originalTint = obj.tint; var flashInterval = LK.setInterval(function () { obj.tint = colors[colorIndex]; colorIndex = (colorIndex + 1) % colors.length; }, duration / colors.length); LK.setTimeout(function () { LK.clearInterval(flashInterval); obj.tint = originalTint; }, duration); }; } // CoinFlip game implementation function setupCoinFlip() { // Create animated background with floating emojis var background = coinFlipContainer.attachAsset('gameBackground', { anchorX: 0, anchorY: 0, width: 2048, height: 2732 }); background.tint = 0x3498db; // Blue background // Add animated floating emoji backgrounds function createFloatingEmoji(emoji, size) { var emojiText = new Text2(emoji, { size: size || 40, fill: 0xFFFFFF, alpha: 0.3 }); emojiText.x = Math.random() * 2048; emojiText.y = Math.random() * 2732; // Random movement direction emojiText.vx = (Math.random() - 0.5) * 2; emojiText.vy = (Math.random() - 0.5) * 2; coinFlipContainer.addChild(emojiText); return emojiText; } // Create 20 random emojis in the background var emojis = ['💯', '🔥', '🤣', '👌', '💪', '😂', '✨', '🚀', '🎯', '💰']; var floatingEmojis = []; for (var i = 0; i < 20; i++) { var emoji = emojis[Math.floor(Math.random() * emojis.length)]; var size = Math.random() * 30 + 30; // Random size between 30-60 floatingEmojis.push(createFloatingEmoji(emoji, size)); } // Store emoji update function for game.update coinFlipContainer.updateEmojis = function () { for (var i = 0; i < floatingEmojis.length; i++) { var emoji = floatingEmojis[i]; emoji.x += emoji.vx; emoji.y += emoji.vy; // Bounce off edges if (emoji.x < 0 || emoji.x > 2048) { emoji.vx *= -1; } if (emoji.y < 0 || emoji.y > 2732) { emoji.vy *= -1; } // Slight rotation emoji.rotation += 0.01; } }; // Create enhanced title with meme style font var titleText = new Text2("MEME FLIP CHALLENGE", { size: 80, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 15, dropShadow: true, dropShadowColor: 0x000000, dropShadowDistance: 10, fontWeight: 'bold', fontStyle: 'italic' }); titleText.anchor.set(0.5, 0); titleText.x = 2048 / 2; titleText.y = 150; coinFlipContainer.addChild(titleText); // Make title pulse with rainbow colors LK.setInterval(function () { // Cycle through hues titleText.tint = Math.random() * 0xFFFFFF; }, 1000); var streakText = new Text2("Current Streak: 0", { size: 60, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 8, dropShadow: true }); streakText.anchor.set(0.5, 0); streakText.x = 2048 / 2; streakText.y = 280; coinFlipContainer.addChild(streakText); var highScoreText = new Text2("Best Streak: " + storage.highScore2, { size: 40, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 5, dropShadow: true }); highScoreText.anchor.set(0.5, 0); highScoreText.x = 2048 / 2; highScoreText.y = 350; coinFlipContainer.addChild(highScoreText); // Use the new MemeCoin instead of regular Coin coin = new MemeCoin(); coin.x = 2048 / 2; coin.y = 900; coinFlipContainer.addChild(coin); var instructionText = new Text2("Select your guess before flipping", { size: 50, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 6, dropShadow: true }); instructionText.anchor.set(0.5, 0); instructionText.x = 2048 / 2; instructionText.y = 1200; coinFlipContainer.addChild(instructionText); // Create meme-styled buttons with "HEADZ" and "TAILZ" headsButton = new Button("HEADZ", 350, 180); headsButton.x = 2048 / 2 - 230; headsButton.y = 1400; headsButton.children[0].tint = 0xF1C40F; // Gold color for heads coinFlipContainer.addChild(headsButton); tailsButton = new Button("TAILZ", 350, 180); tailsButton.x = 2048 / 2 + 230; tailsButton.y = 1400; tailsButton.children[0].tint = 0xE74C3C; // Red color for tails coinFlipContainer.addChild(tailsButton); flipButton = new Button("FLIP IT!!1!", 450, 180); flipButton.x = 2048 / 2; flipButton.y = 1600; flipButton.children[0].tint = 0x2ECC71; // Green color for flip coinFlipContainer.addChild(flipButton); var resultText = new Text2("", { size: 80, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 10, dropShadow: true, dropShadowDistance: 8 }); resultText.anchor.set(0.5, 0); resultText.x = 2048 / 2; resultText.y = 1800; coinFlipContainer.addChild(resultText); // Container for meme reactions var memeContainer = new Container(); memeContainer.x = 2048 / 2; memeContainer.y = 650; coinFlipContainer.addChild(memeContainer); // Container for streak bonus effects var streakBonusContainer = new Container(); streakBonusContainer.x = 2048 / 2; streakBonusContainer.y = 500; coinFlipContainer.addChild(streakBonusContainer); headsButton.up = function () { Button.prototype.up.call(this); // Don't do anything if coin is currently flipping if (coin.isFlipping) { return; } coinFlipGuess = true; instructionText.setText("You chose: HEADZ"); // Flash button for selection feedback LK.effects.flashObject(this, 0xF1C40F, 300); }; tailsButton.up = function () { Button.prototype.up.call(this); // Don't do anything if coin is currently flipping if (coin.isFlipping) { return; } coinFlipGuess = false; instructionText.setText("You chose: TAILZ"); // Flash button for selection feedback LK.effects.flashObject(this, 0xE74C3C, 300); }; flipButton.up = function () { Button.prototype.up.call(this); // If already flipping, don't do anything if (coin.isFlipping) { return; } // If no guess selected, show error message if (coinFlipGuess === null) { instructionText.setText("PICK HEADZ OR TAILZ FIRST, BRUH!!"); // Shake text for emphasis tween(instructionText, { x: 2048 / 2 + 10 }, { duration: 50, yoyo: true, repeat: 5 }); return; } // Clear any existing meme reactions memeContainer.removeChildren(); // Flash button when pressed LK.effects.flashObject(this, 0x2ECC71, 300); // Start the enhanced coin flip coin.flip(); // Disable all buttons while flipping flipButton.interactive = false; headsButton.interactive = false; tailsButton.interactive = false; // Use onFlipComplete handler instead of setTimeout coin.onFlipComplete = function (result) { var correct = coinFlipGuess === result; // Clear any previous meme reactions memeContainer.removeChildren(); if (correct) { resultText.setText("CORRECT!"); if (resultText && resultText.style) { resultText.style.fill = "#27AE60"; } coinFlipStreak++; // Play random success sound var sounds = ['wow', 'collect']; LK.getSound(sounds[Math.floor(Math.random() * sounds.length)]).play(); // Show Doge meme reaction var dogeReaction = new MemeReaction('doge', 300); dogeReaction.x = 0; dogeReaction.y = 0; memeContainer.addChild(dogeReaction); dogeReaction.show(); // Add text bubble with meme saying var textBubble = new Text2("Much lucky. So streak.", { size: 40, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 4 }); textBubble.anchor.set(0, 0); textBubble.x = 100; textBubble.y = -100; dogeReaction.addChild(textBubble); // Check for streak bonus at 3 correct flips if (coinFlipStreak % 3 === 0 && coinFlipStreak > 0) { // Epic streak celebration LK.setTimeout(function () { // Clear existing bonus effects streakBonusContainer.removeChildren(); // Create rainbow text var epicStreakText = new Text2("EPIC STREAK: " + coinFlipStreak + "!", { size: 100, fill: 0xFFFF00, stroke: 0xFF00FF, strokeThickness: 10 }); epicStreakText.anchor.set(0.5, 0.5); streakBonusContainer.addChild(epicStreakText); // Rainbow color cycle animation var hue = 0; var colorInterval = LK.setInterval(function () { hue = (hue + 0.05) % 1; // Manually interpolate colors since tween doesn't have interpolateColor method var r1 = 0xFF0000 >> 16 & 0xFF; var g1 = 0xFF0000 >> 8 & 0xFF; var b1 = 0xFF0000 & 0xFF; var r2 = 0x00FF00 >> 16 & 0xFF; var g2 = 0x00FF00 >> 8 & 0xFF; var b2 = 0x00FF00 & 0xFF; var r = Math.floor(r1 + (r2 - r1) * hue); var g = Math.floor(g1 + (g2 - g1) * hue); var b = Math.floor(b1 + (b2 - b1) * hue); epicStreakText.tint = r << 16 | g << 8 | b; }, 50); // Make text grow and then shrink tween(epicStreakText.scale, { x: 1.5, y: 1.5 }, { duration: 1000, yoyo: true, repeat: 1, onFinish: function onFinish() { // Fade out and remove after effect completes LK.setTimeout(function () { LK.clearInterval(colorInterval); tween(epicStreakText, { alpha: 0 }, { duration: 500, onFinish: function onFinish() { streakBonusContainer.removeChildren(); } }); }, 1000); } }); // Add dab animation on high streak var dabPepe = new MemeReaction('doge', 200); dabPepe.x = 300; dabPepe.y = 0; streakBonusContainer.addChild(dabPepe); dabPepe.show(); // Shake screen for emphasis LK.effects.shakeScreen(10, 500); }, 1000); } if (coinFlipStreak > storage.highScore2) { storage.highScore2 = coinFlipStreak; highScoreText.setText("Best Streak: " + storage.highScore2); // Flash high score LK.effects.flashObject(highScoreText, 0xFFD700, 1000); } } else { resultText.setText("WRONG! Streak wrecked!"); if (resultText && resultText.style) { resultText.style.fill = "#E74C3C"; } // Play failure sound LK.getSound('bruh').play(); // Show different meme reactions based on streak length if (coinFlipStreak >= 3) { // Show sad Pepe for losing a good streak var pepeReaction = new MemeReaction('pepe', 300); pepeReaction.x = 0; pepeReaction.y = 0; memeContainer.addChild(pepeReaction); pepeReaction.show(); // Add crying text var sadText = new Text2("Streak of " + coinFlipStreak + " gone...", { size: 40, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 4 }); sadText.anchor.set(0, 0); sadText.x = 100; sadText.y = -100; pepeReaction.addChild(sadText); } else { // Show trollface for short streaks var trollReaction = new MemeReaction('troll', 300); trollReaction.x = 0; trollReaction.y = 0; memeContainer.addChild(trollReaction); trollReaction.show(); // Add u mad text var madText = new Text2("U mad?", { size: 50, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 4 }); madText.anchor.set(0, 0); madText.x = 100; madText.y = -100; trollReaction.addChild(madText); } LK.setTimeout(function () { LK.setScore(coinFlipStreak); LK.showGameOver(); }, 1000); coinFlipStreak = 0; // Shake screen on failure LK.effects.shakeScreen(15, 500); } streakText.setText("Current Streak: " + coinFlipStreak); coinFlipGuess = null; instructionText.setText("Select your guess before flipping"); // Auto-hide meme reaction after delay LK.setTimeout(function () { if (memeContainer.children.length > 0 && memeContainer.children[0] instanceof MemeReaction) { memeContainer.children[0].hide(); } }, 3000); }; }; coinFlipStreak = 0; } // CatNinja game implementation function setupCatNinja() { var background = catNinjaContainer.attachAsset('gameBackground', { anchorX: 0, anchorY: 0 }); var homeBtn = new HomeButton(); homeBtn.x = 150; homeBtn.y = 100; catNinjaContainer.addChild(homeBtn); var scoreText = new Text2("Score: 0", { size: 50, fill: 0x000000 }); scoreText.anchor.set(0.5, 0); scoreText.x = 2048 / 2; scoreText.y = 50; catNinjaContainer.addChild(scoreText); var livesText = new Text2("Lives: 3", { size: 50, fill: 0x000000 }); livesText.anchor.set(0, 0); livesText.x = 1600; livesText.y = 50; catNinjaContainer.addChild(livesText); var highScoreText = new Text2("Best: " + storage.highScore3, { size: 30, fill: 0x000000 }); highScoreText.anchor.set(0.5, 0); highScoreText.x = 2048 / 2; highScoreText.y = 110; catNinjaContainer.addChild(highScoreText); var instructionText = new Text2("SWIPE TO SLASH CUCUMBERS!", { size: 40, fill: 0x000000 }); instructionText.anchor.set(0.5, 0); instructionText.x = 2048 / 2; instructionText.y = 200; catNinjaContainer.addChild(instructionText); player = new CatPlayer(); player.x = 2048 / 2; player.y = 2200; catNinjaContainer.addChild(player); cucumbers = []; gameTimer = LK.setInterval(function () { spawnCucumber(); }, 1000); } function spawnCucumber() { if (currentScene !== "catNinja") { return; } var cucumber = new Cucumber(); cucumber.x = Math.random() * 1800 + 100; cucumber.y = -200; cucumbers.push(cucumber); catNinjaContainer.addChild(cucumber); } function updateCatNinja() { if (currentScene !== "catNinja") { return; } for (var i = cucumbers.length - 1; i >= 0; i--) { var cucumber = cucumbers[i]; cucumber.update(); // Remove cucumber if it goes off screen if (cucumber.y > 2900) { catNinjaContainer.removeChild(cucumber); cucumbers.splice(i, 1); // Player loses a life if cucumber not slashed player.lives--; catNinjaContainer.children[2].setText("Lives: " + player.lives); if (player.lives <= 0) { // Game over LK.clearInterval(gameTimer); if (player.score > storage.highScore3) { storage.highScore3 = player.score; } LK.setScore(player.score); LK.showGameOver(); } } } // Update score display var scoreText = catNinjaContainer.children[1]; if (scoreText && scoreText instanceof Text2) { scoreText.setText("Score: " + player.score); } } // Scene management functions function switchToMainMenu() { clearCurrentScene(); currentScene = "mainMenu"; game.addChild(mainMenuContainer); LK.playMusic('menuMusic'); } function switchToGameSelection() { clearCurrentScene(); currentScene = "gameSelection"; game.addChild(gameSelectionContainer); // Add a flash effect for transition LK.effects.flashScreen(0xFFFFFF, 500); // Play transition sound LK.getSound('buttonClick').play(); // Don't start menu music - keep splash music playing } function startDoodleJump() { clearCurrentScene(); currentScene = "doodleJump"; setupDoodleJump(); game.addChild(doodleJumpContainer); LK.playMusic('gameMusic'); } function startCoinFlip() { clearCurrentScene(); currentScene = "coinFlip"; setupCoinFlip(); game.addChild(coinFlipContainer); LK.playMusic('gameMusic'); } function startCatNinja() { clearCurrentScene(); currentScene = "catNinja"; setupCatNinja(); game.addChild(catNinjaContainer); LK.playMusic('gameMusic'); } function scheduleRandomEvent() { // pick a delay between 5 000 and 8 000 ms var delay = 5000 + Math.random() * 3000; LK.setTimeout(function () { triggerEvent(); scheduleRandomEvent(); // loop }, delay); } function triggerEvent() { // Pick a random count between 1 and 3 var count = 1 + Math.floor(Math.random() * 3); // Create multiple effects based on count for (var i = 0; i < count; i++) { // create a temporary sprite for each effect var fx = new Container(); var gfx = fx.attachAsset('selectionButton', { anchorX: 0.5, anchorY: 0.5, width: 200, height: 200 }); // Capture the base scale var baseSX = fx.scale.x; var baseSY = fx.scale.y; // Calculate random position with margins for each effect var maxX = 2048; var maxY = 2732; var margin = 100; // half of effect's max dimension fx.x = margin + Math.random() * (maxX - margin * 2); fx.y = margin + Math.random() * (maxY - margin * 2); flipRunnerContainer.addChild(fx); // pick spin or pulse at random if (Math.random() < 0.5) { // spin for 2s tween(fx, { rotation: Math.PI * 2 }, { duration: 2000 }); } else { // Compute a random increase between 1% and 25% var inc = 0.01 + Math.random() * 0.24; // anywhere from 0.01 to 0.25 var scaleFactor = 1 + inc; // final multiplier // grow & shrink for 2s tween(fx.scale, { x: baseSX * scaleFactor, y: baseSY * scaleFactor }, { duration: 1000, yoyo: true, repeat: 1 }); } // remove after 2s using IIFE to properly capture the fx reference (function (fxToRemove) { LK.setTimeout(function () { flipRunnerContainer.removeChild(fxToRemove); }, 2000); })(fx); } } function setupFlipRunner() { var background = flipRunnerContainer.attachAsset('gameBackground', { anchorX: 0, anchorY: 0 }); background.tint = 0x2c3e50; // Add tunnel flipTunnel = new FlipRunnerTunnel(); flipRunnerContainer.addChild(flipTunnel); // Add player player = new FlipRunnerPlayer(); player.x = 500; // Player's y position will be set in updateFlipRunner based on tunnel gap flipRunnerContainer.addChild(player); // HomeButton removed var scoreText = new Text2("Score: 0", { size: 50, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); scoreText.x = 2048 / 2; scoreText.y = 50; flipScoreText = scoreText; var highScoreText = new Text2("Best: " + (storage.highScoreFlipRunner || 0), { size: 30, fill: 0xFFFFFF }); highScoreText.anchor.set(0.5, 0); highScoreText.x = 2048 / 2; highScoreText.y = 110; var instructionText = new Text2("TAP TO FLIP POLARITY!", { size: 40, fill: 0xFFFFFF }); instructionText.anchor.set(0.5, 0); instructionText.x = 2048 / 2; instructionText.y = 200; flipRunnerContainer.addChild(highScoreText); flipRunnerContainer.addChild(scoreText); flipRunnerContainer.addChild(instructionText); // HomeButton not needed // Initialize obstacles array obstacles = []; tunnelSpeed = 15; lastObstacleTime = 0; // Start the obstacle spawner gameTimer = LK.setInterval(function () { if (tunnelSpeed < 30) { tunnelSpeed += 0.05; // Gradually increase speed } // Random obstacle generation if (Date.now() - lastObstacleTime > 800) { spawnObstacle(); lastObstacleTime = Date.now(); } }, 100); // Start random event scheduler scheduleRandomEvent(); } function startFlipRunner() { clearCurrentScene(); currentScene = "flipRunner"; setupFlipRunner(); game.addChild(flipRunnerContainer); LK.playMusic('gameMusic'); } function spawnObstacle() { if (currentScene !== "flipRunner") { return; } // decide top or bottom path var isTop = Math.random() > 0.5; var halfObs = 20; // half of obstacle height (40/2) var yPos = isTop ? flipTunnel.topY + halfObs : flipTunnel.bottomY - halfObs; var obstacle = new FlipRunnerObstacle(yPos, tunnelSpeed); obstacles.push(obstacle); flipRunnerContainer.addChild(obstacle); } function updateFlipRunner() { if (currentScene !== "flipRunner") { return; } flipTunnel.update(); // reposition player to follow the shrinking tunnel var halfPlayer = 60; // half of your catPlayer height (120/2) player.y = player.polarity > 0 ? flipTunnel.topY + halfPlayer : flipTunnel.bottomY - halfPlayer; // Update player if (player && player.isAlive) { player.update(); // Update score display var score = Math.floor(player.score); // Properly update the score text using global flipScoreText if (flipScoreText) { flipScoreText.setText("Score: " + score); } // Check for collisions for (var i = obstacles.length - 1; i >= 0; i--) { var obstacle = obstacles[i]; obstacle.update(); // Remove obstacles that have gone off-screen if (obstacle.x < -100) { flipRunnerContainer.removeChild(obstacle); obstacles.splice(i, 1); continue; } // Check for collision with player (same polarity) if (player.intersects(obstacle) && player.polarity === obstacle.polarity) { player.die(); // Update high score var score = Math.floor(player.score); if (!storage.highScoreFlipRunner || score > storage.highScoreFlipRunner) { storage.highScoreFlipRunner = score; var highScoreText = flipRunnerContainer.children[2]; if (highScoreText && highScoreText instanceof Text2) { highScoreText.setText("Best: " + storage.highScoreFlipRunner); } } LK.setScore(score); LK.setTimeout(function () { LK.showGameOver(); }, 1000); } } } } function clearCurrentScene() { if (gameTimer) { LK.clearInterval(gameTimer); gameTimer = null; } game.removeChildren(); if (currentScene === "doodleJump") { // Clean up doodleJump specific resources platforms = []; } else if (currentScene === "catNinja") { // Clean up catNinja specific resources cucumbers = []; } else if (currentScene === "flipRunner") { // Clean up flipRunner specific resources obstacles = []; } } // Input handling game.down = function (x, y, obj) { if (currentScene === "doodleJump") { dragNode = player; } else if (currentScene === "catNinja") { // Start tracking swipe for cat ninja dragNode = { startX: x, startY: y, startTime: Date.now() }; } else if (currentScene === "flipRunner" && player && player.isAlive) { // Flip player polarity on tap player.flip(); } }; game.up = function (x, y, obj) { if (currentScene === "catNinja" && dragNode) { // Calculate swipe var dx = x - dragNode.startX; var dy = y - dragNode.startY; var distance = Math.sqrt(dx * dx + dy * dy); var time = Date.now() - dragNode.startTime; // If it's a fast swipe (speed threshold) if (distance > 100 && time < 300) { var angle = Math.atan2(dy, dx); // Check for cucumber slashes for (var i = cucumbers.length - 1; i >= 0; i--) { var cucumber = cucumbers[i]; // Simple line intersection with cucumber boundary var hit = false; var mx = dragNode.startX + (x - dragNode.startX) * 0.5; var my = dragNode.startY + (y - dragNode.startY) * 0.5; if (Math.abs(mx - cucumber.x) < 100 && Math.abs(my - cucumber.y) < 150) { hit = true; } if (hit) { player.slash(cucumber); catNinjaContainer.removeChild(cucumber); cucumbers.splice(i, 1); } } } } dragNode = null; }; game.move = function (x, y, obj) { if (currentScene === "doodleJump" && dragNode) { dragNode.x = x; } }; // Main game update loop game.update = function () { if (currentScene === "doodleJump") { updateDoodleJump(); } else if (currentScene === "catNinja") { updateCatNinja(); } else if (currentScene === "flipRunner") { updateFlipRunner(); } else if (currentScene === "coinFlip") { // Update floating emoji backgrounds if (coinFlipContainer.updateEmojis) { coinFlipContainer.updateEmojis(); } } else if (currentScene === "gameSelection" || currentScene === "mainMenu") { // Update all Sanic instances in menu screens for (var i = 0; i < gameSelectionContainer.children.length; i++) { var child = gameSelectionContainer.children[i]; if (child instanceof Sanic) { child.update(); } } } }; // Initialize game setupMainMenu(); setupGameSelection(); switchToMainMenu();
===================================================================
--- original.js
+++ change.js
@@ -237,8 +237,16 @@
});
};
self.update = function () {
self.score += 0.1;
+ // Invert player's X when on top side of the screen
+ if (self.polarity > 0) {
+ // Top side - flip X
+ playerGraphics.scale.x = -1;
+ } else {
+ // Bottom side - normal X
+ playerGraphics.scale.x = 1;
+ }
};
self.die = function () {
if (!self.isAlive) {
return;
@@ -622,14 +630,14 @@
/****
* Game Code
****/
-// Background music
-// Sound effects
-// CatNinja assets
-// CoinFlip assets
-// DoodleJump assets
// Game state variables
+// DoodleJump assets
+// CoinFlip assets
+// CatNinja assets
+// Sound effects
+// Background music
var flipTunnel = null;
var flipButton, headsButton, tailsButton; // Button references for coin flip game
// Add prototype method for Button so Button.prototype.up can be called
Button.prototype.up = function () {
a ’90s-retro living room: bean-bag, Super Nintendo wired to the tube TV, “3-in-1 Meme Games” written on-screen, while a mix of meme characters crash the couch mashing SNES controllers wired to the super nintendo. In-Game asset. 2d. High contrast. No shadows
retro tube tv with crt scan lines. add a living room background behind the tv, front facing so i can use it as a menu selection screen In-Game asset. 2d. High contrast. No shadows
pointing soyjak meme. In-Game asset. 2d. High contrast. No shadows
hedgehog running fast meme. In-Game asset. 2d. High contrast. No shadows
trollface. In-Game asset. 2d. High contrast. No shadows
doge. In-Game asset. 2d. High contrast. No shadows
fluffy tail. In-Game asset. 2d. High contrast. No shadows
pepe frog. In-Game asset. 2d. High contrast. No shadows
running pepe frog. In-Game asset. 2d. High contrast. No shadows
3d button empty. In-Game asset. 2d. High contrast. No shadows
keyboard cat meme. In-Game asset. 2d. High contrast. No shadows
shiba inu coin. In-Game asset. 2d. High contrast. No shadows