Code edit (7 edits merged)
Please save this source code
User prompt
I can see that there are several issues with the End Game screen text. Let's fix those problems! Looking at the updated code in your second paste and the screenshot, I can identify the following issues with the End Game screen text: Text alignment issues - the Game Over text and meme text aren't properly aligned The "DAYS WITHOUT BURNOUT: X" text isn't showing completely The meme quote at the bottom isn't properly positioned or formatted The text animations might not be working properly Here's how to fix these issues: javascript// Fix the Game Over function function gameOver() { gameRunning = false; // Visual effects LK.effects.flashScreen(0xff0000, 1000); // Game over container var gameOverContainer = new Container(); // Darken background var darkOverlay = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 2048, height: 2732, tint: 0x000000, alpha: 0.8 }); darkOverlay.x = 2048 / 2; darkOverlay.y = 2732 / 2; gameOverContainer.addChild(darkOverlay); // Game over text - CENTER IT PROPERLY var gameOverText = new Text2("YOU'RE NOT FINE!", { size: 120, // Increase size for better visibility fill: 0xff0000, fontWeight: 'bold', stroke: 0xFFFFFF, strokeThickness: 8, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); gameOverText.anchor.set(0.5, 0.5); // Center anchor gameOverText.x = 2048 / 2; // Center horizontally gameOverText.y = 300; // Position from top gameOverContainer.addChild(gameOverText); // Meme text - position BELOW main text var memeText = new Text2("(But we've all been there...)", { size: 70, fill: 0xFFFFFF, fontStyle: 'italic', align: 'center', stroke: 0x000000, strokeThickness: 2, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); memeText.anchor.set(0.5, 0.5); memeText.x = 2048 / 2; // Center horizontally memeText.y = gameOverText.y + 100; // Position below game over text gameOverContainer.addChild(memeText); // Final score text var finalScoreText = new Text2("FINAL SCORE: " + score, { size: 100, fill: 0xffff00, stroke: 0x000000, strokeThickness: 5, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" // Add font }); finalScoreText.anchor.set(0.5, 0.5); finalScoreText.x = 2048 / 2; // Center horizontally finalScoreText.y = 700; // Position from top gameOverContainer.addChild(finalScoreText); // Level reached - FIX POSITION AND CENTERING var levelReachedText = new Text2("DAYS WITHOUT BURNOUT: " + gameLevel, { size: 70, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 3, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" // Add font }); levelReachedText.anchor.set(0.5, 0.5); levelReachedText.x = 2048 / 2; // Center horizontally levelReachedText.y = 800; // Position below score gameOverContainer.addChild(levelReachedText); // Restart button - centered var restartButton = new Container(); restartButton.interactive = true; var restartBg = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 500, height: 120, tint: 0x00aa00 // Darker green for better visibility }); restartButton.addChild(restartBg); var restartText = new Text2("PLAY AGAIN", { size: 70, fill: 0xFFFFFF, fontWeight: 'bold', font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); restartText.anchor.set(0.5, 0.5); restartText.x = 0; restartText.y = 0; restartButton.addChild(restartText); restartButton.x = 2048 / 2; // Center horizontally restartButton.y = 1000; // Position below level text gameOverContainer.addChild(restartButton); // Add meme quote at the bottom - FIX POSITIONING AND TEXT WRAPPING var memeQuote = new Text2(getRandomMemeQuote(), { size: 60, fill: 0xFFFFFF, fontStyle: 'italic', align: 'center', wordWrap: true, wordWrapWidth: 1600, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" // Add font }); memeQuote.anchor.set(0.5, 0.5); memeQuote.x = 2048 / 2; // Center horizontally memeQuote.y = 1200; // Position from top gameOverContainer.addChild(memeQuote); // Animate in with improved timing gameOverText.alpha = 0; gameOverText.y -= 100; memeText.alpha = 0; finalScoreText.alpha = 0; levelReachedText.alpha = 0; restartButton.alpha = 0; memeQuote.alpha = 0; // Animation sequence tween(gameOverText, { alpha: 1, y: gameOverText.y + 100 }, { duration: 500, easing: tween.elasticOut }); tween(memeText, { alpha: 1 }, { duration: 500, delay: 200 }); tween(finalScoreText, { alpha: 1 }, { duration: 500, delay: 400 }); tween(levelReachedText, { alpha: 1 }, { duration: 500, delay: 600 }); tween(restartButton, { alpha: 1 }, { duration: 500, delay: 800 }); tween(memeQuote, { alpha: 1 }, { duration: 500, delay: 1000 }); // Handle restart restartButton.down = function () { restartGame(); gameOverContainer.destroy(); }; LK.gui.addChild(gameOverContainer); } The key changes I've made: Properly centered all text elements using anchor.set(0.5, 0.5) and positioning them relative to the screen center (2048/2) Added consistent font styling to all text elements Increased the size of the "YOU'RE NOT FINE!" text for better visibility Fixed the vertical positioning to ensure all elements are visible and properly spaced Added the custom font to all text elements that were missing it Improved the positioning of elements to prevent overlap and make sure everything is visible These changes should fix the game over screen so all the text appears correctly centered and all UI elements are properly visible and aligned.
User prompt
I can see that there are several issues with the End Game screen text. Let's fix those problems! Looking at the updated code in your second paste and the screenshot, I can identify the following issues with the End Game screen text: Text alignment issues - the Game Over text and meme text aren't properly aligned The "DAYS WITHOUT BURNOUT: X" text isn't showing completely The meme quote at the bottom isn't properly positioned or formatted The text animations might not be working properly Here's how to fix these issues: javascript// Fix the Game Over function function gameOver() { gameRunning = false; // Visual effects LK.effects.flashScreen(0xff0000, 1000); // Game over container var gameOverContainer = new Container(); // Darken background var darkOverlay = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 2048, height: 2732, tint: 0x000000, alpha: 0.8 }); darkOverlay.x = 2048 / 2; darkOverlay.y = 2732 / 2; gameOverContainer.addChild(darkOverlay); // Game over text - CENTER IT PROPERLY var gameOverText = new Text2("YOU'RE NOT FINE!", { size: 120, // Increase size for better visibility fill: 0xff0000, fontWeight: 'bold', stroke: 0xFFFFFF, strokeThickness: 8, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); gameOverText.anchor.set(0.5, 0.5); // Center anchor gameOverText.x = 2048 / 2; // Center horizontally gameOverText.y = 300; // Position from top gameOverContainer.addChild(gameOverText); // Meme text - position BELOW main text var memeText = new Text2("(But we've all been there...)", { size: 70, fill: 0xFFFFFF, fontStyle: 'italic', align: 'center', stroke: 0x000000, strokeThickness: 2, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); memeText.anchor.set(0.5, 0.5); memeText.x = 2048 / 2; // Center horizontally memeText.y = gameOverText.y + 100; // Position below game over text gameOverContainer.addChild(memeText); // Final score text var finalScoreText = new Text2("FINAL SCORE: " + score, { size: 100, fill: 0xffff00, stroke: 0x000000, strokeThickness: 5, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" // Add font }); finalScoreText.anchor.set(0.5, 0.5); finalScoreText.x = 2048 / 2; // Center horizontally finalScoreText.y = 700; // Position from top gameOverContainer.addChild(finalScoreText); // Level reached - FIX POSITION AND CENTERING var levelReachedText = new Text2("DAYS WITHOUT BURNOUT: " + gameLevel, { size: 70, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 3, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" // Add font }); levelReachedText.anchor.set(0.5, 0.5); levelReachedText.x = 2048 / 2; // Center horizontally levelReachedText.y = 800; // Position below score gameOverContainer.addChild(levelReachedText); // Restart button - centered var restartButton = new Container(); restartButton.interactive = true; var restartBg = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 500, height: 120, tint: 0x00aa00 // Darker green for better visibility }); restartButton.addChild(restartBg); var restartText = new Text2("PLAY AGAIN", { size: 70, fill: 0xFFFFFF, fontWeight: 'bold', font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); restartText.anchor.set(0.5, 0.5); restartText.x = 0; restartText.y = 0; restartButton.addChild(restartText); restartButton.x = 2048 / 2; // Center horizontally restartButton.y = 1000; // Position below level text gameOverContainer.addChild(restartButton); // Add meme quote at the bottom - FIX POSITIONING AND TEXT WRAPPING var memeQuote = new Text2(getRandomMemeQuote(), { size: 60, fill: 0xFFFFFF, fontStyle: 'italic', align: 'center', wordWrap: true, wordWrapWidth: 1600, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" // Add font }); memeQuote.anchor.set(0.5, 0.5); memeQuote.x = 2048 / 2; // Center horizontally memeQuote.y = 1200; // Position from top gameOverContainer.addChild(memeQuote); // Animate in with improved timing gameOverText.alpha = 0; gameOverText.y -= 100; memeText.alpha = 0; finalScoreText.alpha = 0; levelReachedText.alpha = 0; restartButton.alpha = 0; memeQuote.alpha = 0; // Animation sequence tween(gameOverText, { alpha: 1, y: gameOverText.y + 100 }, { duration: 500, easing: tween.elasticOut }); tween(memeText, { alpha: 1 }, { duration: 500, delay: 200 }); tween(finalScoreText, { alpha: 1 }, { duration: 500, delay: 400 }); tween(levelReachedText, { alpha: 1 }, { duration: 500, delay: 600 }); tween(restartButton, { alpha: 1 }, { duration: 500, delay: 800 }); tween(memeQuote, { alpha: 1 }, { duration: 500, delay: 1000 }); // Handle restart restartButton.down = function () { restartGame(); gameOverContainer.destroy(); }; LK.gui.addChild(gameOverContainer); } The key changes I've made: Properly centered all text elements using anchor.set(0.5, 0.5) and positioning them relative to the screen center (2048/2) Added consistent font styling to all text elements Increased the size of the "YOU'RE NOT FINE!" text for better visibility Fixed the vertical positioning to ensure all elements are visible and properly spaced Added the custom font to all text elements that were missing it Improved the positioning of elements to prevent overlap and make sure everything is visible These changes should fix the game over screen so all the text appears correctly centered and all UI elements are properly visible and aligned. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Here are the solutions to fix the issues in the code: 1. Fix Duplicate Stress Reduction Code Remove the second occurrence of the stress reduction block (approximately lines 557-583). This will prevent the stress from reducing twice as fast when there are no problems. javascript// Keep only one instance of this block: if (problems.length === 0 && stressLevel > 0) { // Reduce stress at a higher rate when no problems are present stressLevel = Math.max(0, stressLevel - 1.0 * delta); updateStressBar(); // Visual feedback for stress reduction when no problems if (Math.random() < 0.05) { // Occasional visual feedback var relaxPopup = new Text2("-1 STRESS", { size: 30, fill: 0x00cc00, stroke: 0x000000, strokeThickness: 2, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); relaxPopup.anchor.set(0.5, 0.5); relaxPopup.x = player.x; relaxPopup.y = player.y - 100; game.addChild(relaxPopup); // Animate relaxation popup tween(relaxPopup, { y: relaxPopup.y - 50, alpha: 0 }, { duration: 800, easing: tween.easeOut, onFinish: function onFinish() { relaxPopup.destroy(); } }); } } 2. Fix Duplicate Problem Stress Popup Remove the duplicate popup creation at the end of the Problem constructor. There are two instances of: javascript// NEW: Show stress increase popup when problem appears var appearanceStressPopup = new Text2("+" + initialStress + " STRESS!", { // ... style properties ... }); // ... positioning and animation ... Keep only one of these sections, preferably the later one (approximately lines 433-450) that has proper font styling. 3. Fix Player Status Text Font Size Correct the font size in the player's updateAppearance method when stress is low: javascript// Change this: self.statusText.style = { fontSize: 500, // This is likely a typo fill: 0xFF0000, align: 'center', stroke: 0xFFFFFF, strokeThickness: 5, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }; // To this: self.statusText.style = { fontSize: 100, // More reasonable size, matching the initial size fill: 0x89ffd4, // Keeping the original color align: 'center', stroke: 0x000000, strokeThickness: 5, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }; 4. Fix Timer Logic in Problem Update The timer logic already has safety checks, but to ensure it works correctly: javascriptself.update = function (delta) { if (!self.active) { return; } // CRITICAL FIX: Ensure delta is a valid number var safeTimeDelta = isNaN(delta) ? 0.016 : delta; // CRITICAL FIX: Ensure timeRemaining is a valid number if (isNaN(self.timeRemaining)) { self.timeRemaining = self.maxTime; } // CRITICAL FIX: Ensure maxTime is valid if (isNaN(self.maxTime) || self.maxTime <= 0) { self.maxTime = 3.0; } // Decrease timer with safety checks self.timeRemaining = Math.max(0, self.timeRemaining - safeTimeDelta); // Rest of the update function... } 5. Fix Animation Callback Recursion Update the animation callbacks in the player's updateAppearance method to prevent potential recursion issues: javascript// For each animation block, modify the onFinish callback to check if the stress level is still in the same range // For example, in the medium stress range: onFinish: function onFinish() { // Only continue animation if still in the same stress range if (stressLevel >= 30 && stressLevel < 60) { // Use a new tween rather than recursively calling updateAppearance tween(self, { scaleX: 0.98, scaleY: 1.02 }, { duration: 1000, easing: tween.easeInOut, onFinish: function onFinish() { if (stressLevel >= 30 && stressLevel < 60) { // Start over with first animation instead of full updateAppearance tween(self, { scaleX: 1.02, scaleY: 0.98 }, /* same animation config */); } } }); } } 6. Ensure Consistent Font Usage Add the custom font family to all text elements for consistency: javascript// For any Text2 elements missing the font property: font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" 7. Fix Initial Stress Application There's a duplicate stress application when a problem appears. Remove the second instance: javascript// At the beginning of the Problem constructor: self.stressValue = type.stress; self.maxTime = Math.random() * 3 + 1; // Random time between 1-4 seconds self.timeRemaining = self.maxTime; self.points = Math.ceil(10 / self.maxTime); // Shorter times = more points // NEW: Add initial stress when problem appears (KEEP THIS ONE) var initialStress = Math.ceil(self.stressValue * 0.3); // 30% of the full stress value stressLevel += initialStress; updateStressBar(); Then remove the duplicate declaration near the end of the constructor (around line 413-415). These changes will fix the major issues in the code and make the game function as intended with balanced stress reduction, proper visual feedback, and consistent styling.
User prompt
the codebackground overlay is removed totally ! Only the bg asset is shown
User prompt
Not only the code background stops but it is removed from the screen after the START! button has been pressed !
User prompt
when I click the START! button the code background stops. It doesn't show on the screen anymore.
User prompt
When I click a problem and it shows how much my stress was reduced. That text shows moves a bit up and then disappears does not stay on the screen.
Code edit (1 edits merged)
Please save this source code
User prompt
fix the game over text The ("(But we've all been there...)" "DAYS WITHOUT BURNOUT "FINAL SCORE Should be in a bit more left. They are outside of the screen on the right. Half of them is out. Bring them to the middle
User prompt
Fix the how to tutorial. The text is outside of the screen. It should be under the HOW to Play title smaller and condensed.
User prompt
Follow this code // MODIFICATION 1: Update the Problem class to add stress when it appears // and modify the tap handler to reduce stress when solved var Problem = Container.expand(function () { var self = Container.call(this); // Sticky note colors - authentic sticky note colors only var stickyColors = [ 0xFFFF99, // Light yellow 0xFFB6C1, // Light pink 0x90EE90, // Light green 0xADD8E6, // Light blue 0xFFCC99 // Light orange ]; // Choose random sticky note color var colorIndex = Math.floor(Math.random() * stickyColors.length); var stickyColor = stickyColors[colorIndex]; // Problem types with text and stress impact var problemTypes = [ { text: "WiFi Down!", stress: 8 }, { text: "Coffee Spill!", stress: 6 }, { text: "Deadline Changed!", stress: 10 }, { text: "Surprise Meeting!", stress: 12 }, { text: "Traffic Jam!", stress: 7 }, { text: "Phone Died!", stress: 9 }, { text: "Email Overload!", stress: 8 }, { text: "Printer Error!", stress: 7 }, { text: "Noisy Neighbors!", stress: 6 }, { text: "Low Battery!", stress: 5 } ]; // Choose random problem type var typeIndex = Math.floor(Math.random() * problemTypes.length); var type = problemTypes[typeIndex]; // Problem properties self.active = true; self.stressValue = type.stress; self.maxTime = Math.random() * 3 + 1; // Random time between 1-4 seconds self.timeRemaining = self.maxTime; self.points = Math.ceil(10 / self.maxTime); // Shorter times = more points // NEW: Add initial stress when problem appears var initialStress = Math.ceil(self.stressValue * 0.3); // 30% of the full stress value stressLevel += initialStress; updateStressBar(); // NEW: Show stress increase popup when problem appears var appearanceStressPopup = new Text2("+" + initialStress + " STRESS!", { size: 30, fill: 0xff6600, // Orange for initial stress stroke: 0x000000, strokeThickness: 3, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); appearanceStressPopup.anchor.set(0.5, 0.5); appearanceStressPopup.x = self.x; appearanceStressPopup.y = self.y - 40; game.addChild(appearanceStressPopup); // Animate initial stress popup tween(appearanceStressPopup, { y: appearanceStressPopup.y - 50, alpha: 0 }, { duration: 500, easing: tween.easeOut, onFinish: function() { appearanceStressPopup.destroy(); } }); // Create problem background (sticky note) var problemGraphic = self.attachAsset('problem', { anchorX: 0.5, anchorY: 0.5, tint: stickyColor }); // Create problem text var problemText = new Text2(type.text, { size: 36, fill: 0x000000, // Black text for readability align: 'center', wordWrap: true, wordWrapWidth: 180, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" // Handwritten-style font }); problemText.anchor.set(0.5, 0.5); problemText.y = -20; // Move text up to make room for timer self.addChild(problemText); // Create timer bar self.timerBar = self.attachAsset('timer', { anchorX: 0, anchorY: 0.5, x: -90, // Center the timer bar y: 40, // Position below the text width: 180, // Full width for new timer height: 20, tint: 0x00ff00 }); // Add timer text self.timerText = new Text2(self.timeRemaining.toFixed(1), { size: 30, fill: 0x000000, // Black text for consistency align: 'center', font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); self.timerText.anchor.set(0.5, 0.5); self.timerText.x = 0; self.timerText.y = 70; self.addChild(self.timerText); // Add a slight rotation to make it look more like a sticky note self.rotation = (Math.random() - 0.5) * 0.2; // Random slight tilt // Handle tap/click - MODIFIED to reduce stress when tapped self.down = function (x, y, obj) { if (!self.active) return; self.active = false; LK.getSound('tap').play(); // NEW: Reduce stress when problem is solved var stressReduction = Math.ceil(self.stressValue * 0.5); // 50% of the full stress value stressLevel = Math.max(0, stressLevel - stressReduction); updateStressBar(); // Visual feedback for successful tap - peeling off animation tween(self, { alpha: 0, scaleX: 0.2, scaleY: 0.2, rotation: self.rotation + Math.PI/4 // Rotate like peeling off }, { duration: 300, easing: tween.easeOut, onFinish: function() { self.destroy(); } }); // Award points based on time remaining var pointsAwarded = Math.ceil(self.points * (self.timeRemaining / self.maxTime)); score += pointsAwarded; scoreText.setText("SCORE: " + score); // Show points popup var pointsPopup = new Text2("+" + pointsAwarded, { size: 50, fill: 0x00ff00, stroke: 0x000000, strokeThickness: 4 }); pointsPopup.anchor.set(0.5, 0.5); pointsPopup.x = self.x; pointsPopup.y = self.y; game.addChild(pointsPopup); // NEW: Show stress reduction popup var stressReductionPopup = new Text2("-" + stressReduction + " STRESS!", { size: 40, fill: 0x00cc00, // Green for stress reduction stroke: 0x000000, strokeThickness: 3, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); stressReductionPopup.anchor.set(0.5, 0.5); stressReductionPopup.x = self.x; stressReductionPopup.y = self.y + 50; game.addChild(stressReductionPopup); // Animate points popup tween(pointsPopup, { y: pointsPopup.y - 100, alpha: 0 }, { duration: 800, easing: tween.easeOut, onFinish: function() { pointsPopup.destroy(); } }); // Animate stress reduction popup tween(stressReductionPopup, { y: stressReductionPopup.y + 100, alpha: 0 }, { duration: 800, easing: tween.easeOut, onFinish: function() { stressReductionPopup.destroy(); } }); }; // Update timer function remains the same self.update = function(delta) { if (!self.active) return; // Safety checks for delta time and timer values var safeTimeDelta = isNaN(delta) ? 0.016 : delta; if (isNaN(self.timeRemaining)) { self.timeRemaining = self.maxTime; } if (isNaN(self.maxTime) || self.maxTime <= 0) { self.maxTime = 3.0; } // Decrease timer self.timeRemaining = Math.max(0, self.timeRemaining - safeTimeDelta); // Calculate percentage for timer display var timerPercent = self.timeRemaining && self.maxTime ? self.timeRemaining / self.maxTime : 0; timerPercent = Math.max(0, Math.min(1, timerPercent)); // Update timer bar width var timerWidth = Math.max(0, Math.floor(180 * timerPercent)); self.timerBar.width = timerWidth; // Change timer color as time runs out if (timerPercent > 0.6) { self.timerBar.tint = 0x00ff00; // Green } else if (timerPercent > 0.3) { self.timerBar.tint = 0xffff00; // Yellow } else { self.timerBar.tint = 0xff0000; // Red } // Update timer text var timerText = self.timeRemaining >= 0 ? self.timeRemaining.toFixed(1) : "0.0"; self.timerText.setText(timerText); // Check if timer expired - MODIFIED for full stress impact when expired if (self.timeRemaining <= 0) { self.active = false; // Visual feedback for expired timer LK.getSound('stress').play(); // Add the remaining 70% of stress when timer expires // (since 30% was added when the problem appeared) var finalStress = Math.ceil(self.stressValue * 0.7); stressLevel += finalStress; updateStressBar(); // Flash screen red LK.effects.flashScreen(0xff0000, 200, 0.3); // Crumpling animation for sticky note tween(self, { alpha: 0, scaleX: 0.1, scaleY: 0.1, rotation: Math.random() * Math.PI - Math.PI/2 // Random rotation like crumpling }, { duration: 300, easing: tween.easeOut, onFinish: function() { self.destroy(); } }); // Show stress increase popup var stressPopup = new Text2("+" + finalStress + " STRESS!", { size: 40, fill: 0xff0000, stroke: 0x000000, strokeThickness: 4, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); stressPopup.anchor.set(0.5, 0.5); stressPopup.x = self.x; stressPopup.y = self.y; game.addChild(stressPopup); // Animate stress popup tween(stressPopup, { y: stressPopup.y - 100, alpha: 0 }, { duration: 800, easing: tween.easeOut, onFinish: function() { stressPopup.destroy(); } }); } }; // Spawn animation - "sticking" effect self.scale.set(1.2); tween(self, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.backOut }); return self; }); // MODIFICATION 2: Update the game update function to reduce stress when there are no problems // Replace the game.update function with this enhanced version game.update = function() { // Calculate delta time for consistent updates var now = Date.now(); var delta = (now - lastUpdate) / 1000; // Convert to seconds lastUpdate = now; // Update code background for visual effect codeBackground.update(); if (!gameRunning || !gameStarted || tutorialActive) { // Check if there are any problems to remove (during tutorial) for (var i = problems.length - 1; i >= 0; i--) { if (problems[i].parent) { problems[i].destroy(); } } problems = []; return; } // Check if it's time to spawn a new problem if (now - lastProblemTime > problemSpawnInterval) { spawnProblem(); lastProblemTime = now; } // Update all problems for (var i = 0; i < problems.length; i++) { if (problems[i] && problems[i].update) { problems[i].update(delta); } } // Clean up problems array cleanupProblems(); // NEW: Reduce stress faster when there are no problems if (problems.length === 0 && stressLevel > 0) { // Reduce stress at a higher rate when no problems are present stressLevel = Math.max(0, stressLevel - (1.0 * delta)); updateStressBar(); // Visual feedback for stress reduction when no problems if (Math.random() < 0.05) { // Occasional visual feedback var relaxPopup = new Text2("-1 STRESS", { size: 30, fill: 0x00cc00, stroke: 0x000000, strokeThickness: 2, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); relaxPopup.anchor.set(0.5, 0.5); relaxPopup.x = player.x; relaxPopup.y = player.y - 100; game.addChild(relaxPopup); tween(relaxPopup, { y: relaxPopup.y - 50, alpha: 0 }, { duration: 1000, easing: tween.easeOut, onFinish: function() { relaxPopup.destroy(); } }); } } else { // NEW: Small stress reduction even with problems (but smaller than before) // This replaces the original random stress reduction if (Math.random() < 0.001 * delta * 60 && stressLevel > 0) { stressLevel = Math.max(0, stressLevel - 0.2); // Reduced from 0.5 updateStressBar(); } } // Check level progress checkLevelProgress(); // Add screen shake when stress is high if (stressLevel >= 70 && Math.random() < 0.05) { var intensity = (stressLevel - 70) / 30 * 20; shakeScreen(intensity); } }; // BONUS MODIFICATION: Update the tutorial to explain the new mechanics function showTutorial() { var tutorialContainer = new Container(); // Set tutorial active flag to prevent problems from spawning tutorialActive = true; gameRunning = false; // Hide player and other game elements player.alpha = 0; stressBar.alpha = 0; levelText.alpha = 0; // Darken background var tutorialBg = LK.getAsset('problem', { width: 2048, height: 2732, tint: 0x000000, alpha: 0.7 }); tutorialContainer.addChild(tutorialBg); // Title var tutorialTitle = new Text2("HOW TO PLAY", { size: 100, fill: 0xFFFFFF, fontWeight: 'bold', stroke: 0x000000, strokeThickness: 4, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); tutorialTitle.anchor.set(0.5, 0.5); tutorialTitle.x = 2048 / 2; tutorialTitle.y = 200; tutorialContainer.addChild(tutorialTitle); // UPDATED: Instructions with new mechanics var instructions = new Text2( "• PROBLEMS appear randomly and add STRESS\n\n" + "• Each problem has a COUNTDOWN TIMER\n\n" + "• TAP problems before their timer runs out\n\n" + "• Tapping reduces STRESS, but timer expiry adds more\n\n" + "• Clearing all problems reduces stress faster\n\n" + "• Don't let your stress reach 100%\n\n" + "• Just keep telling yourself \"I'M FINE!\"", { size: 55, fill: 0xFFFFFF, align: 'left', lineHeight: 70, stroke: 0x000000, strokeThickness: 2, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" } ); instructions.anchor.set(0.5, 0.5); instructions.x = 2048 / 2; instructions.y = 700; tutorialContainer.addChild(instructions); // Create a tutorial-only example problem and add it to tutorial container var exampleProblem = new TutorialProblem(); exampleProblem.x = 2048 / 2; exampleProblem.y = 1300; tutorialContainer.addChild(exampleProblem); // Continue button with improved styling var continueButton = new Container(); continueButton.interactive = true; var continueBg = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 400, height: 120, tint: 0x00cc00, radius: 20 }); continueButton.addChild(continueBg); var continueText = new Text2("START!", { size: 70, fill: 0xFFFFFF, fontWeight: 'bold', stroke: 0x000000, strokeThickness: 3 }); continueText.anchor.set(0.5, 0.5); continueText.x = 0; continueText.y = 0; continueButton.addChild(continueText); continueButton.x = 2048 / 2; continueButton.y = 1700; tutorialContainer.addChild(continueButton); // Add to GUI LK.gui.addChild(tutorialContainer); // Make the continue button interactive to close tutorial continueButton.down = function() { tutorialContainer.destroy(); // Clean up any remaining problems for (var i = problems.length - 1; i >= 0; i--) { if (problems[i] && problems[i].parent) { problems[i].destroy(); } } problems = []; // Reset the timer lastProblemTime = Date.now(); // Clear tutorial flag and start the game tutorialActive = false; gameRunning = true; // Show player and elements with animation tween(player, { alpha: 1 }, { duration: 800, easing: tween.elasticOut }); // Show stress bar tween(stressBar, { alpha: 1 }, { duration: 500 }); // Show level text tween(levelText, { alpha: 1 }, { duration: 800, easing: tween.elasticOut }); }; // Make the tutorial container interactive tutorialContainer.interactive = true; tutorialContainer.down = function(x, y, obj) { // Only trigger if clicked on the container background, not on buttons or text if (obj === tutorialContainer || obj === tutorialBg) { continueButton.down(); } }; } // BONUS MODIFICATION: Also update the instructions popup function showInstructions() { var popup = new Container(); // Darken background var bg = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 2048, height: 2732, tint: 0x000000, alpha: 0.7 }); popup.addChild(bg); // Panel background var panel = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 1600, height: 1800, tint: 0xFFFFFF, alpha: 0.9 }); panel.x = 2048 / 2; panel.y = 2732 / 2; popup.addChild(panel); // Title var title = new Text2("HOW TO PLAY", { size: 100, fill: 0xff4d4d, fontWeight: 'bold', stroke: 0x000000, strokeThickness: 5 }); title.anchor.set(0.5, 0); title.x = 2048 / 2; title.y = panel.y - 800; popup.addChild(title); // UPDATED: Instructions with new mechanics var instructions = new Text2( "1. PROBLEMS appear and add STRESS immediately\n\n" + "2. Each problem has a COUNTDOWN TIMER\n\n" + "3. TAP problems to reduce your STRESS\n\n" + "4. If time runs out, your STRESS increases more\n\n" + "5. Clear all problems to reduce STRESS faster\n\n" + "6. Don't let your stress reach 100%\n\n" + "7. LEVEL UP every 10 points\n\n" + "8. Just keep telling yourself \"I'M FINE!\"", { size: 48, fill: 0x000000, align: 'left', lineHeight: 65, wordWrap: true, wordWrapWidth: panel.width - 200 } ); instructions.anchor.set(0, 0); instructions.x = panel.x - 700; instructions.y = panel.y - 600; popup.addChild(instructions); // Rest of the function remains the same... // [Rest of the function code] // Close button var closeButton = new Container(); closeButton.interactive = true; var closeBg = LK.getAsset('problem', { width: 400, height: 120, tint: 0xff4d4d }); closeButton.addChild(closeBg); var closeText = new Text2("RESUME", { size: 60, fill: 0xFFFFFF, fontWeight: 'bold', font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); closeText.anchor.set(0.5, 0.5); closeText.x = 0; closeText.y = 0; closeButton.addChild(closeText); closeButton.x = panel.x; closeButton.y = panel.y + 700; popup.addChild(closeButton); // Pause game while instructions are open var wasPaused = !gameRunning; gameRunning = false; tutorialActive = true; // Set tutorial active to prevent problems closeButton.down = function() { popup.destroy(); // Clean up any problems that might have been created for (var i = problems.length - 1; i >= 0; i--) { if (problems[i] && problems[i].parent) { problems[i].destroy(); } } problems = []; tutorialActive = false; // Clear tutorial active flag if (!wasPaused) { gameRunning = true; } }; LK.gui.addChild(popup); } ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Stress Recovery Mechanics Code New Game Mechanics Added! I've implemented all the stress mechanics you requested, creating a more dynamic and strategic gameplay experience. Here's what I added: 1. Problems Now Add Stress When They Appear When a problem appears on screen, it immediately adds 30% of its stress value: javascript // NEW: Add initial stress when problem appears var initialStress = Math.ceil(self.stressValue * 0.3); // 30% of the full stress value stressLevel += initialStress; updateStressBar(); // NEW: Show stress increase popup when problem appears var appearanceStressPopup = new Text2("+" + initialStress + " STRESS!", { size: 30, fill: 0xff6600, // Orange for initial stress stroke: 0x000000, strokeThickness: 3 }); 2. Tapping Problems Reduces Stress When you tap a problem to resolve it, you now get a stress reduction: javascript // NEW: Reduce stress when problem is solved var stressReduction = Math.ceil(self.stressValue * 0.5); // 50% of the full stress value stressLevel = Math.max(0, stressLevel - stressReduction); updateStressBar(); // NEW: Show stress reduction popup var stressReductionPopup = new Text2("-" + stressReduction + " STRESS!", { size: 40, fill: 0x00cc00, // Green for stress reduction stroke: 0x000000, strokeThickness: 3 }); 3. Faster Stress Reduction When No Problems Exist I've added a special mechanic that significantly reduces stress when all problems are cleared: javascript // NEW: Reduce stress faster when there are no problems if (problems.length === 0 && stressLevel > 0) { // Reduce stress at a higher rate when no problems are present stressLevel = Math.max(0, stressLevel - (1.0 * delta)); updateStressBar(); // Visual feedback for stress reduction when no problems if (Math.random() < 0.05) { // Occasional visual feedback var relaxPopup = new Text2("-1 STRESS", { size: 30, fill: 0x00cc00, stroke: 0x000000, strokeThickness: 2 }); } } Game Balance Improvements To keep the game balanced with these new mechanics: Split Stress Impact: 30% of stress is added when a problem appears 70% more is added if the timer expires 50% is removed if you tap it successfully Strategic Choices: Players now have to decide whether to risk letting easy problems expire to focus on high-stress ones Clearing all problems creates a moment of recovery There's now a greater incentive to tap problems quickly Updated Tutorial: I've updated both the tutorial and instructions screens to explain these new mechanics Visual Feedback For better player feedback, I've added: Orange "+X STRESS!" popups when problems appear Green "-X STRESS!" popups when problems are tapped Occasional "-1 STRESS" popups during zero-problem recovery periods Updated tutorial text explaining the mechanics Implementation Instructions Replace your current Problem class, game.update function, showTutorial function, and showInstructions function with the ones I've provided. The new mechanics will then be fully integrated into your game. These changes create a more strategic and balanced gameplay experience that: Rewards quick reflexes Creates moments of stress recovery Adds more visual feedback Makes the game more challenging but fair This enhanced gameplay will make your game more engaging and increase your chances of winning the competition!
User prompt
The scroling code on the background stops when the game has started. This means when the tutorial is not on the screen.
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'ReferenceError: finalScoreText is not defined' in or related to this line: 'finalScoreText.alpha = 0;' Line Number: 1189
Code edit (6 edits merged)
Please save this source code
User prompt
Light red
User prompt
Make the START! Button fill red !
User prompt
Make the start button lookLike the Play button but the outline whoul be white not black
User prompt
Remove the Green background for the START! Button!
Code edit (2 edits merged)
Please save this source code
User prompt
// 1. Fix for the Game Over text layout // Update the gameOver function to properly position and format text function gameOver() { gameRunning = false; // Visual effects LK.effects.flashScreen(0xff0000, 1000); // Game over container var gameOverContainer = new Container(); // Darken background var darkOverlay = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 2048, height: 2732, tint: 0x000000, alpha: 0.8 }); darkOverlay.x = 2048 / 2; darkOverlay.y = 2732 / 2; gameOverContainer.addChild(darkOverlay); // Game over text - FIXED: Added proper spacing and layout var gameOverText = new Text2("YOU'RE\nNOT\nFINE!", { size: 120, fill: 0xff0000, fontWeight: 'bold', stroke: 0xFFFFFF, strokeThickness: 8, align: 'center', font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); gameOverText.anchor.set(0.5, 0.5); gameOverText.x = 2048 / 2 - 300; // Moved left to make room for parens text gameOverText.y = 600; gameOverContainer.addChild(gameOverText); // Meme text - FIXED: Position next to main text, not overlapping var memeText = new Text2("(But\nwe've\nall\nbeen\nthere...)", { size: 70, fill: 0xFFFFFF, fontStyle: 'italic', align: 'left', font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); memeText.anchor.set(0, 0.5); memeText.x = 2048 / 2 + 50; // Position to the right of main text memeText.y = 600; gameOverContainer.addChild(memeText); // Final score var finalScoreText = new Text2("FINAL SCORE: " + score, { size: 100, fill: 0xffff00, stroke: 0x000000, strokeThickness: 5 }); finalScoreText.anchor.set(0.5, 0.5); finalScoreText.x = 2048 / 2; finalScoreText.y = 1000; gameOverContainer.addChild(finalScoreText); // Level reached - FIXED: Updated text var levelReachedText = new Text2("DAY REACHED WITHOUT BURNOUT: " + gameLevel, { size: 70, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 3 }); levelReachedText.anchor.set(0.5, 0.5); levelReachedText.x = 2048 / 2; levelReachedText.y = 1100; gameOverContainer.addChild(levelReachedText); // Restart button - FIXED: Made it more visible var restartButton = new Container(); restartButton.interactive = true; var restartBg = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 500, height: 120, tint: 0x00aa00 // Darker green for better visibility }); restartButton.addChild(restartBg); var restartText = new Text2("PLAY AGAIN", { size: 70, fill: 0xFFFFFF, fontWeight: 'bold' }); restartText.anchor.set(0.5, 0.5); restartText.x = 0; restartText.y = 0; restartButton.addChild(restartText); restartButton.x = 2048 / 2; restartButton.y = 1300; gameOverContainer.addChild(restartButton); // Add fun meme quote at the bottom var memeQuote = new Text2(getRandomMemeQuote(), { size: 60, fill: 0xFFFFFF, fontStyle: 'italic', align: 'center', wordWrap: true, wordWrapWidth: 1600 }); memeQuote.anchor.set(0.5, 0.5); memeQuote.x = 2048 / 2; memeQuote.y = 1500; gameOverContainer.addChild(memeQuote); // Animate in with improved timing gameOverText.alpha = 0; gameOverText.y -= 100; memeText.alpha = 0; finalScoreText.alpha = 0; levelReachedText.alpha = 0; restartButton.alpha = 0; memeQuote.alpha = 0; tween(gameOverText, { alpha: 1, y: gameOverText.y + 100 }, { duration: 500, easing: tween.elasticOut }); tween(memeText, { alpha: 1 }, { duration: 500, delay: 200 // Reduced delay for better flow }); tween(finalScoreText, { alpha: 1 }, { duration: 500, delay: 400 // Reduced delay }); tween(levelReachedText, { alpha: 1 }, { duration: 500, delay: 600 // Reduced delay }); tween(restartButton, { alpha: 1 }, { duration: 500, delay: 800 // Reduced delay }); tween(memeQuote, { alpha: 1 }, { duration: 500, delay: 1000 // Reduced delay }); // Handle restart restartButton.down = function() { restartGame(); gameOverContainer.destroy(); }; LK.gui.addChild(gameOverContainer); } // 2. Fix for the tutorial text formatting consistency function showTutorial() { var tutorialContainer = new Container(); // Set tutorial active flag to prevent problems from spawning tutorialActive = true; gameRunning = false; // Hide player and other game elements player.alpha = 0; stressBar.alpha = 0; levelText.alpha = 0; // Darken background var tutorialBg = LK.getAsset('problem', { width: 2048, height: 2732, tint: 0x000000, alpha: 0.7 }); tutorialContainer.addChild(tutorialBg); // Title var tutorialTitle = new Text2("HOW TO PLAY", { size: 100, fill: 0xFFFFFF, fontWeight: 'bold', stroke: 0x000000, strokeThickness: 4, // Added stroke for consistency and visibility font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); tutorialTitle.anchor.set(0.5, 0.5); tutorialTitle.x = 2048 / 2; tutorialTitle.y = 200; tutorialContainer.addChild(tutorialTitle); // FIXED: Consistent formatting for tutorial instructions var instructions = new Text2( "• PROBLEMS will appear randomly on screen\n\n" + "• Each problem has a COUNTDOWN TIMER\n\n" + "• TAP problems before their timer runs out\n\n" + "• If time runs out, your STRESS increases\n\n" + "• Don't let your stress reach 100%\n\n" + "• Just keep telling yourself \"I'M FINE!\"", { size: 60, fill: 0xFFFFFF, align: 'left', lineHeight: 80, stroke: 0x000000, // Added stroke for consistency strokeThickness: 2, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" } ); instructions.anchor.set(0.5, 0.5); instructions.x = 2048 / 2; instructions.y = 800; // Adjusted position tutorialContainer.addChild(instructions); // Create a tutorial-only example problem and add it to tutorial container var exampleProblem = new TutorialProblem(); exampleProblem.x = 2048 / 2; exampleProblem.y = 1400; // Adjusted position tutorialContainer.addChild(exampleProblem); // Continue button with improved styling var continueButton = new Container(); continueButton.interactive = true; var continueBg = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 400, height: 120, tint: 0x00cc00, radius: 20 // Added radius for rounded corners }); continueButton.addChild(continueBg); var continueText = new Text2("START!", { size: 70, fill: 0xFFFFFF, fontWeight: 'bold', stroke: 0x000000, strokeThickness: 3 }); continueText.anchor.set(0.5, 0.5); continueText.x = 0; continueText.y = 0; continueButton.addChild(continueText); continueButton.x = 2048 / 2; continueButton.y = 1800; tutorialContainer.addChild(continueButton); // Add to GUI LK.gui.addChild(tutorialContainer); // Make the continue button interactive to close tutorial continueButton.down = function() { tutorialContainer.destroy(); // Clean up any remaining problems for (var i = problems.length - 1; i >= 0; i--) { if (problems[i] && problems[i].parent) { problems[i].destroy(); } } problems = []; // Reset the timer lastProblemTime = Date.now(); // Clear tutorial flag and start the game tutorialActive = false; gameRunning = true; // Show player and elements with animation tween(player, { alpha: 1 }, { duration: 800, easing: tween.elasticOut }); // Show stress bar tween(stressBar, { alpha: 1 }, { duration: 500 }); // Show level text tween(levelText, { alpha: 1 }, { duration: 800, easing: tween.elasticOut }); }; // Make the tutorial container interactive tutorialContainer.interactive = true; tutorialContainer.down = function(x, y, obj) { // Only trigger if clicked on the container background, not on buttons or text if (obj === tutorialContainer || obj === tutorialBg) { continueButton.down(); } }; } // Make sure the restart game function preserves text formatting function restartGame() { // Reset game variables score = 0; stressLevel = 0; gameLevel = 1; problemSpawnInterval = 1800; maxProblemsOnScreen = 4; lastProblemTime = 0; gameRunning = false; // Start paused for tutorial tutorialActive = true; // Show tutorial first // Clear any existing problems for (var i = 0; i < problems.length; i++) { if (problems[i] && problems[i].parent) { problems[i].destroy(); } } problems = []; // Reset UI scoreText.setText("SCORE: 0"); levelText.setText("DAY: 1"); updateStressBar(); // Reset player player.updateAppearance(0); player.alpha = 0; // Hide until tutorial closes // Restart music LK.playMusic('bgmusic'); // Show tutorial again with proper formatting showTutorial(); } Use this code. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
I've identified and fixed both text issues in your game! Here's what was happening and how the fixes work: Issue 1: Jumbled Game Over Text In your first screenshot, the "YOU'RE NOT FINE!" text and the "(But we've all been there...)" text are overlapping and mixed together, making it hard to read. The Fix: Separate Text Positioning: I've repositioned the main "YOU'RE NOT FINE!" text to the left side and the "(But we've all been there...)" text to the right with proper spacing. Linebreak Formatting: I added proper line breaks to both text elements: javascriptvar gameOverText = new Text2("YOU'RE\nNOT\nFINE!", {...}); var memeText = new Text2("(But\nwe've\nall\nbeen\nthere...)", {...}); Adjusted Anchors: Changed the anchoring of the "But we've all been there..." text to better position it alongside the main text. Improved Animation Timing: Reduced the delay between animations to create a smoother experience. Issue 2: Inconsistent Tutorial Text Formatting In your screenshots, the tutorial text appears differently between the initial tutorial and when you restart the game. The Fix: Consistent Text Style: Added stroke properties to ensure the text looks consistently bold: javascript{ size: 60, fill: 0xFFFFFF, align: 'left', lineHeight: 80, stroke: 0x000000, // Added stroke for consistency strokeThickness: 2, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" } Fixed Positioning: Updated the position values to ensure text appears in the same place every time. Improved Button Styling: Added a radius to the start button for a more polished look. Enhanced Container Interactivity: Modified the container click behavior to only trigger on background clicks, not on buttons or text. Additional Improvements: Better "Day Reached" Text: Changed "DAY REACHED" to "DAY REACHED WITHOUT BURNOUT" for better clarity and game theme. More Visible Restart Button: Used a darker green for better visibility against the background. More Consistent Animation Flow: Adjusted animation timing to create a smoother experience. Implementation Instructions: Replace your current gameOver(), showTutorial(), and restartGame() functions with the versions I've provided. These changes ensure: The game over screen has properly formatted, readable text The tutorial text appears consistently formatted each time The restart process maintains proper text formatting These fixes will make your game look more polished and professional while improving the player experience. The text will now be properly formatted and readable throughout the entire game flow!
Code edit (1 edits merged)
Please save this source code
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var CodeBackground = Container.expand(function () { var self = Container.call(this); var lines = []; var lineSpacing = 40; // Initialize with random code lines self.initialize = function () { for (var i = 0; i < 100; i++) { var line = new CodeLine(Math.random() * 1000 + 100, i * lineSpacing); line.x = Math.random() * (2048 - line.width); self.addChild(line); lines.push(line); } }; // Move lines upward self.update = function () { for (var i = 0; i < lines.length; i++) { lines[i].y -= 1; // If line moved off screen, reset to bottom if (lines[i].y < -20) { lines[i].y = 2732 + Math.random() * 100; lines[i].x = Math.random() * (2048 - lines[i].width); } } }; return self; }); // Code for creating scrolling code in the background var CodeLine = Container.expand(function (length, yPos) { var self = Container.call(this); // Random line properties var colors = [0x00ff00, 0x3498db, 0xff9900, 0x9b59b6, 0xf1c40f]; var randomColor = colors[Math.floor(Math.random() * colors.length)]; // Create line var line = self.attachAsset('timer', { anchorX: 0, anchorY: 0.5, width: length || Math.random() * 500 + 100, height: 10, tint: randomColor }); self.y = yPos || 0; return self; }); var Player = Container.expand(function () { var self = Container.call(this); // Create player visual var playerGraphic = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5, width: 500, height: 632 }); // Create status text self.statusText = new Text2("I'm fine!", { size: 100, fill: 0x89ffd4, align: 'center', stroke: 0x000000, strokeThickness: 5, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); self.statusText.anchor.set(0.5, 0); self.statusText.y = 350; // Position the text below the player self.addChild(self.statusText); // Update appearance based on stress level self.updateAppearance = function (stress) { // Visual changes based on stress if (stress < 30) { // Calm - normal color playerGraphic.tint = 0xFFFFFF; self.statusText.setText("I'm fine!"); self.statusText.style = { fontSize: 500, fill: 0xf07f92, align: 'center', stroke: 0xFFFFFF, strokeThickness: 5, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }; // Reset animations tween.stop(self); tween(self, { rotation: 0, scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.easeOut }); } else if (stress < 60) { // Getting stressed - slight tint playerGraphic.tint = 0x9b59b6; // Purple tint self.statusText.setText("I'm FINE!"); self.statusText.style = { fontSize: 110, fill: 0x660000, align: 'center', stroke: 0xFFFFFF, strokeThickness: 5, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }; // Add slight animation tween.stop(self); tween(self, { scaleX: 1.02, scaleY: 0.98 }, { duration: 1000, easing: tween.easeInOut, onFinish: function onFinish() { tween(self, { scaleX: 0.98, scaleY: 1.02 }, { duration: 1000, easing: tween.easeInOut, onFinish: function onFinish() { if (stressLevel >= 30 && stressLevel < 60) { self.updateAppearance(stressLevel); } } }); } }); } else if (stress < 90) { // Very stressed - red tint playerGraphic.tint = 0xe74c3c; // Red self.statusText.setText("I'M FINE!!"); self.statusText.style = { fontSize: 120, fill: 0xFF0000, align: 'center', stroke: 0x000000, strokeThickness: 5, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }; // Add wobble tween.stop(self); tween(self, { rotation: 0.05, scaleX: 1.05, scaleY: 0.95 }, { duration: 300, easing: tween.easeInOut, onFinish: function onFinish() { tween(self, { rotation: -0.05, scaleX: 0.95, scaleY: 1.05 }, { duration: 300, easing: tween.easeInOut, onFinish: function onFinish() { if (stressLevel >= 60 && stressLevel < 90) { self.updateAppearance(stressLevel); } } }); } }); } else { // Maximum stress - bright red playerGraphic.tint = 0xff0000; self.statusText.setText("I'M TOTALLY FINE!!!"); self.statusText.style = { fontSize: 75, fill: 0xFF0000, align: 'center', stroke: 0x000000, strokeThickness: 6, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }; // Dramatic animation tween.stop(self); tween(self, { rotation: 0.1, scaleX: 1.1, scaleY: 0.9 }, { duration: 200, easing: tween.easeInOut, onFinish: function onFinish() { tween(self, { rotation: -0.1, scaleX: 0.9, scaleY: 1.1 }, { duration: 200, easing: tween.easeInOut, onFinish: function onFinish() { if (stressLevel >= 90) { self.updateAppearance(stressLevel); } } }); } }); } }; return self; }); var Problem = Container.expand(function () { var self = Container.call(this); // Sticky note colors - authentic sticky note colors only var stickyColors = [0xFFFF99, // Light yellow 0xFFB6C1, // Light pink 0x90EE90, // Light green 0xADD8E6, // Light blue 0xFFCC99 // Light orange ]; // Choose random sticky note color var colorIndex = Math.floor(Math.random() * stickyColors.length); var stickyColor = stickyColors[colorIndex]; // Problem types with text and stress impact var problemTypes = [{ text: "WiFi Down!", stress: 8 }, { text: "Coffee Spill!", stress: 6 }, { text: "Deadline Changed!", stress: 10 }, { text: "Surprise Meeting!", stress: 12 }, { text: "Traffic Jam!", stress: 7 }, { text: "Phone Died!", stress: 9 }, { text: "Email Overload!", stress: 8 }, { text: "Printer Error!", stress: 7 }, { text: "Noisy Neighbors!", stress: 6 }, { text: "Low Battery!", stress: 5 }]; // Choose random problem type var typeIndex = Math.floor(Math.random() * problemTypes.length); var type = problemTypes[typeIndex]; // Problem properties self.active = true; self.stressValue = type.stress; self.maxTime = Math.random() * 3 + 1; // Random time between 1-4 seconds self.timeRemaining = self.maxTime; self.points = Math.ceil(10 / self.maxTime); // Shorter times = more points // Create problem background (sticky note) var problemGraphic = self.attachAsset('problem', { anchorX: 0.5, anchorY: 0.5, tint: stickyColor }); // Create problem text var problemText = new Text2(type.text, { size: 36, fill: 0x000000, // Black text for readability align: 'center', wordWrap: true, wordWrapWidth: 180, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" // Handwritten-style font }); problemText.anchor.set(0.5, 0.5); problemText.y = -20; // Move text up to make room for timer self.addChild(problemText); // Create timer bar self.timerBar = self.attachAsset('timer', { anchorX: 0, anchorY: 0.5, x: -90, // Center the timer bar y: 40, // Position below the text width: 180, // Full width for new timer height: 20, tint: 0x00ff00 }); // Add timer text self.timerText = new Text2(self.timeRemaining.toFixed(1), { size: 30, fill: 0x000000, // Black text for consistency align: 'center', font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); self.timerText.anchor.set(0.5, 0.5); self.timerText.x = 0; self.timerText.y = 70; self.addChild(self.timerText); // Add a slight rotation to make it look more like a sticky note self.rotation = (Math.random() - 0.5) * 0.2; // Random slight tilt // Handle tap/click self.down = function (x, y, obj) { if (!self.active) { return; } self.active = false; LK.getSound('tap').play(); // Visual feedback for successful tap - peeling off animation tween(self, { alpha: 0, scaleX: 0.2, scaleY: 0.2, rotation: self.rotation + Math.PI / 4 // Rotate like peeling off }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { self.destroy(); } }); // Award points based on time remaining var pointsAwarded = Math.ceil(self.points * (self.timeRemaining / self.maxTime)); score += pointsAwarded; scoreText.setText("SCORE: " + score); // Show points popup var pointsPopup = new Text2("+" + pointsAwarded, { size: 50, fill: 0x00ff00, stroke: 0x000000, strokeThickness: 4 }); pointsPopup.anchor.set(0.5, 0.5); pointsPopup.x = self.x; pointsPopup.y = self.y; game.addChild(pointsPopup); // Animate points popup tween(pointsPopup, { y: pointsPopup.y - 100, alpha: 0 }, { duration: 800, easing: tween.easeOut, onFinish: function onFinish() { pointsPopup.destroy(); } }); }; // Update timer - THIS IS THE CRITICAL PART THAT WASN'T WORKING self.update = function (delta) { if (!self.active) { return; } // CRITICAL FIX: Ensure delta is a valid number var safeTimeDelta = isNaN(delta) ? 0.016 : delta; // Default to 60fps if delta is invalid // CRITICAL FIX: Ensure timeRemaining is a valid number if (isNaN(self.timeRemaining)) { self.timeRemaining = self.maxTime; // Reset to max time if invalid } // CRITICAL FIX: Ensure maxTime is valid if (isNaN(self.maxTime) || self.maxTime <= 0) { self.maxTime = 3.0; // Default to 3 seconds if invalid } // Decrease timer with safety checks self.timeRemaining = Math.max(0, self.timeRemaining - safeTimeDelta); // Calculate timer percentage with safety checks var timerPercent = self.timeRemaining && self.maxTime ? self.timeRemaining / self.maxTime : 0; timerPercent = Math.max(0, Math.min(1, timerPercent)); // Clamp between 0-1 // Update timer bar width var timerWidth = Math.max(0, Math.floor(180 * timerPercent)); self.timerBar.width = timerWidth; // Change timer color as time runs out if (timerPercent > 0.6) { self.timerBar.tint = 0x00ff00; // Green } else if (timerPercent > 0.3) { self.timerBar.tint = 0xffff00; // Yellow } else { self.timerBar.tint = 0xff0000; // Red } // CRITICAL FIX: Update timer text with safety check var timerText = self.timeRemaining >= 0 ? self.timeRemaining.toFixed(1) : "0.0"; self.timerText.setText(timerText); // Check if timer expired if (self.timeRemaining <= 0) { self.active = false; // Visual feedback for expired timer LK.getSound('stress').play(); // Increase stress stressLevel += self.stressValue; updateStressBar(); // Flash screen red LK.effects.flashScreen(0xff0000, 200, 0.3); // Crumpling animation for sticky note tween(self, { alpha: 0, scaleX: 0.1, scaleY: 0.1, rotation: Math.random() * Math.PI - Math.PI / 2 // Random rotation like crumpling }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { self.destroy(); } }); // Show stress increase popup var stressPopup = new Text2("+" + self.stressValue + " STRESS!", { size: 40, fill: 0xff0000, stroke: 0x000000, strokeThickness: 4, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); stressPopup.anchor.set(0.5, 0.5); stressPopup.x = self.x; stressPopup.y = self.y; game.addChild(stressPopup); // Animate stress popup tween(stressPopup, { y: stressPopup.y - 100, alpha: 0 }, { duration: 800, easing: tween.easeOut, onFinish: function onFinish() { stressPopup.destroy(); } }); } }; // Spawn animation - "sticking" effect self.scale.set(1.2); tween(self, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.backOut }); return self; }); var StressBar = Container.expand(function () { var self = Container.call(this); self.interactive = true; var dragOffsetX = 0; var dragOffsetY = 0; // Create stress bar elements var background = self.attachAsset('progressBar', { anchorX: 0.5, anchorY: 0.5, width: 1000, height: 80 }); var fill = self.attachAsset('progressFill', { anchorX: 0, anchorY: 0.5, x: -background.width / 2, y: 0, width: 0 // Start with 0 width }); // Add stress label var label = new Text2("STRESS LEVEL", { size: 40, fill: 0xFFFFFF, fontWeight: 'bold', stroke: 0x000000, strokeThickness: 4, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); label.anchor.set(0.5, 0.5); label.x = 0; label.y = 0; self.addChild(label); // Add drag functionality self.down = function (x, y, obj) { // No-op: stress bar should not be draggable return false; }; self.up = function (x, y, obj) { // Clear drag state dragOffsetX = 0; dragOffsetY = 0; }; self.move = function (x, y, obj) { // No-op: stress bar should not be draggable return false; }; // Update fill based on stress level self.updateFill = function (stressLevel) { var maxWidth = background.width; var newWidth = stressLevel / 100 * maxWidth; // Tween the fill bar tween(fill, { width: newWidth }, { duration: 300, easing: tween.easeOut }); // Change fill color based on stress level if (stressLevel < 30) { fill.tint = 0x00ff00; // Green } else if (stressLevel < 60) { fill.tint = 0xffff00; // Yellow } else if (stressLevel < 90) { fill.tint = 0xff9900; // Orange } else { fill.tint = 0xff0000; // Red } }; return self; }); // Create a special problem just for the tutorial that has no timer or functionality var TutorialProblem = Container.expand(function () { var self = Container.call(this); // Use yellow sticky note color for consistency var stickyColor = 0xFFFF99; // Create problem background (sticky note) var problemGraphic = self.attachAsset('problem', { anchorX: 0.5, anchorY: 0.5, tint: stickyColor }); // Add slight rotation for natural look self.rotation = 0.05; // Create problem text var problemText = new Text2("Deadline Changed!", { size: 36, fill: 0x000000, // Black text for readability align: 'center', wordWrap: true, wordWrapWidth: 180, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" // Handwritten-style font }); problemText.anchor.set(0.5, 0.5); problemText.y = -20; // Move text up to make room for timer self.addChild(problemText); // Create static timer bar var timerBar = self.attachAsset('timer', { anchorX: 0, anchorY: 0.5, x: -90, // Center the timer bar y: 40, // Position below the text width: 120, // Show as partially depleted height: 20, tint: 0xffff00 // Yellow to show it's in progress }); // Add static timer text var timerText = new Text2("2.5", { size: 30, fill: 0x000000, // Black text for consistency align: 'center', font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); timerText.anchor.set(0.5, 0.5); timerText.x = 0; timerText.y = 70; self.addChild(timerText); return self; }); /**** * Initialize Game ****/ // Create a tutorial-only example problem and add it to tutorial container var game = new LK.Game({ backgroundColor: 0x192a56 // Dark blue background }); /**** * Game Code ****/ // Game state variables var score = 0; var stressLevel = 0; var gameLevel = 1; var problems = []; var lastProblemTime = 0; var problemSpawnInterval = 1800; // ms between problem spawns var maxProblemsOnScreen = 4; // Maximum problems on screen at once var gameRunning = true; var gameStarted = false; var tutorialActive = false; // Flag to track when tutorial is active var lastUpdate = Date.now(); // Set up code background var codeBackground = new CodeBackground(); codeBackground.initialize(); codeBackground.alpha = 0.2; game.addChild(codeBackground); // Set up regular background var background = LK.getAsset('background', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2, alpha: 0.8 // Semi-transparent to show code background }); game.addChild(background); // Set up player var player = new Player(); player.x = 350; // Move to left side player.y = 2732 - 500; player.alpha = 0; // Initially hidden until game starts game.addChild(player); // Set up score text var scoreText = new Text2("SCORE: 0", { size: 70, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 5 }); scoreText.anchor.set(0.5, 0); scoreText.x = 2048 / 2; scoreText.y = 20; LK.gui.top.addChild(scoreText); // Set up level text var levelText = new Text2("DAY: 1", { size: 50, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 3, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); levelText.anchor.set(0.5, 0); levelText.x = 2048 / 2 - 400 + 200 - 75 - 50 - 20 + 10; levelText.y = 30; levelText.alpha = 0; // Hide initially until game starts LK.gui.addChild(levelText); // Game title var titleText = new Text2("I'M FINE!", { size: 200, fill: 0xff4d4d, fontWeight: 'bold', stroke: 0xFFFFFF, strokeThickness: 10, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); titleText.anchor.set(0.5, 0.5); titleText.x = 2048 / 2 - 300; // Move 300 pixels to the left titleText.y = 500; LK.gui.addChild(titleText); // Game subtitle var subtitleText = new Text2("(a game about pretending everything is OK)", { size: 60, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 3, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); subtitleText.anchor.set(0.5, 0.5); subtitleText.x = 2048 / 2 - 300; // Move 300 pixels to the left subtitleText.y = 635; // Moved 35 pixels down from 600 LK.gui.addChild(subtitleText); // Create start button var startButton = new Container(); startButton.interactive = true; var startBg = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 500, height: 120, tint: 0x444444, alpha: 0, radius: 30 // Rounded corners }); startButton.addChild(startBg); // No triangle needed var startText = new Text2("PLAY", { size: 85, fill: 0xff4d4d, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive", fontWeight: 'bold', stroke: 0xFFFFFF, strokeThickness: 5, underline: true }); startText.anchor.set(0.5, 0.5); startText.x = 0; // Center text after triangle removal startText.y = 0; startButton.addChild(startText); startButton.x = 2048 / 2 - 300; // Move 300 pixels to the left startButton.y = 2732 / 2 - 450 + 145 + 70 + 350 - 45; // Move 305 pixels down from previous position (45px up from previous position) LK.gui.addChild(startButton); // Create and position stress bar var stressBar = new StressBar(); stressBar.x = player.x + player.statusText.width / 2 + 733; // Position next to the status text with 703px more to the right stressBar.y = player.y + 420; // Move down 70px from original position stressBar.alpha = gameStarted ? 1 : 0; // Show if game started, otherwise hide game.addChild(stressBar); // Add to game instead of gui to ensure visibility // Instructions button var instructionsButton = new Container(); instructionsButton.interactive = true; var instructionsBg = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 80, height: 80, tint: 0x333333, alpha: 0.9 }); instructionsButton.addChild(instructionsBg); var questionText = new Text2("?", { size: 60, fill: 0xFFFFFF, fontWeight: 'bold' }); questionText.anchor.set(0.5, 0.5); questionText.x = 0; questionText.y = 0; instructionsButton.addChild(questionText); instructionsButton.x = 100; instructionsButton.y = 100; instructionsButton.alpha = 0; // Hidden until game starts LK.gui.addChild(instructionsButton); // Update stress bar function updateStressBar() { // Clamp stress level between 0-100 stressLevel = Math.min(100, Math.max(0, stressLevel)); // Update stress bar fill stressBar.updateFill(stressLevel); // Update player appearance player.updateAppearance(stressLevel); // Check for game over if (stressLevel >= 100 && gameRunning) { gameOver(); } } // Spawn a new problem function spawnProblem() { // Don't spawn if tutorial is active, game not running, or not started if (tutorialActive || !gameRunning || !gameStarted) { // Clear any existing problems if tutorial is visible for (var i = problems.length - 1; i >= 0; i--) { if (problems[i].parent) { problems[i].destroy(); } } problems = []; return; } // Don't spawn if we already have max problems if (problems.length >= maxProblemsOnScreen) { return; } // Create new problem var problem = new Problem(); // Position randomly, but keep away from edges problem.x = Math.random() * (2048 - 400) + 200; problem.y = Math.random() * (2732 - 800) + 400; // Make sure it doesn't overlap with player var distToPlayer = Math.sqrt(Math.pow(problem.x - player.x, 2) + Math.pow(problem.y - player.y, 2)); if (distToPlayer < 500) { // Too close to player, adjust position var angle = Math.random() * Math.PI * 2; problem.x = player.x + Math.cos(angle) * 600; problem.y = player.y + Math.sin(angle) * 600; // Keep within screen bounds problem.x = Math.max(200, Math.min(problem.x, 2048 - 200)); problem.y = Math.max(400, Math.min(problem.y, 2732 - 400)); } game.addChild(problem); problems.push(problem); } // Start game function function startGame() { // Set gameStarted to true but not running yet (tutorial will show first) gameStarted = true; gameRunning = false; tutorialActive = true; // Set tutorial flag // Hide start screen elements tween(titleText, { y: -200, alpha: 0 }, { duration: 500, easing: tween.easeIn }); tween(subtitleText, { y: -200, alpha: 0 }, { duration: 500, easing: tween.easeIn }); tween(startButton, { y: 2732 + 200, alpha: 0 }, { duration: 500, easing: tween.easeIn, onFinish: function onFinish() { // Clean up any problems that might exist for (var i = problems.length - 1; i >= 0; i--) { if (problems[i] && problems[i].parent) { problems[i].destroy(); } } problems = []; // Reset the timer lastProblemTime = Date.now(); // Show tutorial first - the game will start when tutorial is closed showTutorial(); // Show instructions button for later use tween(instructionsButton, { alpha: 1 }, { duration: 500 }); // Start music LK.playMusic('bgmusic'); } }); } // Show tutorial function showTutorial() { var tutorialContainer = new Container(); // Set tutorial active flag to prevent problems from spawning tutorialActive = true; gameRunning = false; // Hide player and other game elements player.alpha = 0; stressBar.alpha = 0; levelText.alpha = 0; // Darken background var tutorialBg = LK.getAsset('problem', { width: 2048, height: 2732, tint: 0x000000, alpha: 0.7 }); tutorialContainer.addChild(tutorialBg); // Title var tutorialTitle = new Text2("HOW TO PLAY", { size: 100, fill: 0xFFFFFF, fontWeight: 'bold', stroke: 0x000000, // Added stroke for consistency and visibility strokeThickness: 4, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); tutorialTitle.anchor.set(0.5, 0.5); tutorialTitle.x = 2048 / 2 - 300; tutorialTitle.y = 100; tutorialContainer.addChild(tutorialTitle); // FIXED: Consistent formatting for tutorial instructions var instructions = new Text2("• PROBLEMS will appear randomly on screen\n\n" + "• Each problem has a COUNTDOWN TIMER\n\n" + "• TAP problems before their timer runs out\n\n" + "• If time runs out, your STRESS increases\n\n" + "• Don't let your stress reach 100%\n\n" + "• Just keep telling yourself \"I'M FINE!\"", { size: 60, fill: 0xFFFFFF, align: 'left', lineHeight: 80, stroke: 0x000000, strokeThickness: 2, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); instructions.anchor.set(0.5, 0.5); instructions.x = 2048 / 2 - 300; instructions.y = 800; // Adjusted position tutorialContainer.addChild(instructions); // Create a tutorial-only example problem and add it to tutorial container var exampleProblem = new TutorialProblem(); exampleProblem.x = 2048 / 2 - 300; exampleProblem.y = 1500; // Adjusted position tutorialContainer.addChild(exampleProblem); // Continue button with improved styling var continueButton = new Container(); continueButton.interactive = true; var continueText = new Text2("START!", { size: 70, fill: 0xFFFFFF, fontWeight: 'bold', stroke: 0xFFFFFF, strokeThickness: 3, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); var continueText = new Text2("START!", { size: 70, fill: 0xFFFFFF, fontWeight: 'bold', stroke: 0x000000, strokeThickness: 3, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); continueText.anchor.set(0.5, 0.5); continueText.x = 0; continueText.y = 0; continueButton.addChild(continueText); continueButton.x = 2048 / 2 - 300; continueButton.y = 1800; tutorialContainer.addChild(continueButton); // Add to GUI LK.gui.addChild(tutorialContainer); // Make the continue button interactive to close tutorial continueButton.down = function () { tutorialContainer.destroy(); // Clean up any remaining problems for (var i = problems.length - 1; i >= 0; i--) { if (problems[i] && problems[i].parent) { problems[i].destroy(); } } problems = []; // Reset the timer lastProblemTime = Date.now(); // Clear tutorial flag and start the game tutorialActive = false; gameRunning = true; // Show player and elements with animation tween(player, { alpha: 1 }, { duration: 800, easing: tween.elasticOut }); // Show stress bar tween(stressBar, { alpha: 1 }, { duration: 500 }); // Show level text tween(levelText, { alpha: 1 }, { duration: 800, easing: tween.elasticOut }); }; // Make the tutorial container interactive tutorialContainer.interactive = true; tutorialContainer.down = function (x, y, obj) { // Only trigger if clicked on the container background, not on buttons or text if (obj === tutorialContainer || obj === tutorialBg) { continueButton.down(); } }; } // Instructions popup function showInstructions() { var popup = new Container(); // Darken background var bg = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 2048, height: 2732, tint: 0x000000, alpha: 0.7 }); popup.addChild(bg); // Panel background var panel = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 1600, height: 1800, tint: 0xFFFFFF, alpha: 0.9 }); panel.x = 2048 / 2; panel.y = 2732 / 2; popup.addChild(panel); // Title var title = new Text2("HOW TO PLAY", { size: 100, fill: 0xff4d4d, fontWeight: 'bold', stroke: 0x000000, strokeThickness: 5 }); title.anchor.set(0.5, 0); title.x = 2048 / 2; title.y = panel.y - 800; popup.addChild(title); // Instructions var instructions = new Text2("1. PROBLEMS will appear randomly on screen\n\n" + "2. Each problem has a COUNTDOWN TIMER\n\n" + "3. TAP problems before their timer runs out\n\n" + "4. If time runs out, your STRESS increases\n\n" + "5. Don't let your stress reach 100%\n\n" + "6. LEVEL UP every 10 points\n\n" + "7. Just keep telling yourself \"I'M FINE!\"", { size: 50, fill: 0x000000, align: 'left', lineHeight: 70, wordWrap: true, wordWrapWidth: panel.width - 200 }); instructions.anchor.set(0, 0); instructions.x = panel.x - 700; instructions.y = panel.y - 600; popup.addChild(instructions); // Close button var closeButton = new Container(); closeButton.interactive = true; var closeBg = LK.getAsset('problem', { width: 400, height: 120, tint: 0xff4d4d }); closeButton.addChild(closeBg); var closeText = new Text2("RESUME", { size: 60, fill: 0xFFFFFF, fontWeight: 'bold', font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); closeText.anchor.set(0.5, 0.5); closeText.x = 0; closeText.y = 0; closeButton.addChild(closeText); closeButton.x = panel.x; closeButton.y = panel.y + 700; popup.addChild(closeButton); // Pause game while instructions are open var wasPaused = !gameRunning; gameRunning = false; tutorialActive = true; // Set tutorial active to prevent problems closeButton.down = function () { popup.destroy(); // Clean up any problems that might have been created for (var i = problems.length - 1; i >= 0; i--) { if (problems[i] && problems[i].parent) { problems[i].destroy(); } } problems = []; tutorialActive = false; // Clear tutorial active flag if (!wasPaused) { gameRunning = true; } }; LK.gui.addChild(popup); } // Check if level should increase function checkLevelProgress() { var newLevel = Math.floor(score / 10) + 1; if (newLevel > gameLevel) { gameLevel = newLevel; levelText.setText("DAY: " + gameLevel); // Make game harder as level increases problemSpawnInterval = Math.max(500, 1800 - gameLevel * 100); maxProblemsOnScreen = Math.min(8, 4 + Math.floor(gameLevel / 2)); // Visual and audio feedback LK.effects.flashScreen(0x00ff00, 500, 0.3); LK.getSound('levelup').play(); // Show level up text var levelUpText = new Text2("LEVEL UP!", { size: 100, fill: 0x00ff00, stroke: 0x000000, strokeThickness: 6, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); levelUpText.anchor.set(0.5, 0.5); levelUpText.x = 2048 / 2; levelUpText.y = 2732 / 2; LK.gui.addChild(levelUpText); // Animate and remove tween(levelUpText, { scaleX: 2, scaleY: 2, alpha: 0 }, { duration: 1000, easing: tween.easeOut, onFinish: function onFinish() { levelUpText.destroy(); } }); } } // Game over function function gameOver() { gameRunning = false; // Visual effects LK.effects.flashScreen(0xff0000, 1000); // Game over container var gameOverContainer = new Container(); // Darken background var darkOverlay = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 2048, height: 2732, tint: 0x000000, alpha: 0.8 }); darkOverlay.x = 2048 / 2; darkOverlay.y = 2732 / 2; gameOverContainer.addChild(darkOverlay); // Game over text - FIXED: Added proper spacing and layout var gameOverText = new Text2("YOU'RE\nNOT\nFINE!", { size: 120, fill: 0xff0000, fontWeight: 'bold', stroke: 0xFFFFFF, strokeThickness: 8, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); gameOverText.anchor.set(0.5, 0.5); gameOverText.x = 2048 / 2 - 300; // Moved left to make room for parens text gameOverText.y = 600; gameOverContainer.addChild(gameOverText); // Meme text - FIXED: Position next to main text, not overlapping var memeText = new Text2("(But\nwe've\nall\nbeen\nthere...)", { size: 70, fill: 0xFFFFFF, fontStyle: 'italic', align: 'left', stroke: 0x000000, strokeThickness: 2, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); memeText.anchor.set(0, 0.5); memeText.x = 2048 / 2 + 50; // Position to the right of main text memeText.y = 600; gameOverContainer.addChild(memeText); // Final score var finalScoreText = new Text2("FINAL SCORE: " + score, { size: 100, fill: 0xffff00, stroke: 0x000000, strokeThickness: 5 }); finalScoreText.anchor.set(0.5, 0.5); finalScoreText.x = 2048 / 2; finalScoreText.y = 1000; gameOverContainer.addChild(finalScoreText); // Level reached - FIXED: Updated text and positioning var levelReachedText = new Text2("DAY REACHED WITHOUT BURNOUT: " + gameLevel, { size: 70, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 3 }); levelReachedText.anchor.set(0.5, 0.5); levelReachedText.x = 2048 / 2; levelReachedText.y = 1100; gameOverContainer.addChild(levelReachedText); // Restart button - FIXED: Made it more visible var restartButton = new Container(); restartButton.interactive = true; var restartBg = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 500, height: 120, tint: 0x00aa00 // Darker green for better visibility }); restartButton.addChild(restartBg); var restartText = new Text2("PLAY AGAIN", { size: 70, fill: 0xFFFFFF, fontWeight: 'bold' }); restartText.anchor.set(0.5, 0.5); restartText.x = 0; restartText.y = 0; restartButton.addChild(restartText); restartButton.x = 2048 / 2; restartButton.y = 1300; gameOverContainer.addChild(restartButton); // Add fun meme quote at the bottom var memeQuote = new Text2(getRandomMemeQuote(), { size: 60, fill: 0xFFFFFF, fontStyle: 'italic', align: 'center', wordWrap: true, wordWrapWidth: 1600 }); memeQuote.anchor.set(0.5, 0.5); memeQuote.x = 2048 / 2; memeQuote.y = 1500; gameOverContainer.addChild(memeQuote); // Animate in with improved timing gameOverText.alpha = 0; gameOverText.y -= 100; memeText.alpha = 0; finalScoreText.alpha = 0; levelReachedText.alpha = 0; restartButton.alpha = 0; memeQuote.alpha = 0; tween(gameOverText, { alpha: 1, y: gameOverText.y + 100 }, { duration: 500, easing: tween.elasticOut }); tween(memeText, { alpha: 1 }, { duration: 500, delay: 200 // Reduced delay for better flow }); tween(finalScoreText, { alpha: 1 }, { duration: 500, delay: 400 // Reduced delay }); tween(levelReachedText, { alpha: 1 }, { duration: 500, delay: 600 // Reduced delay }); tween(restartButton, { alpha: 1 }, { duration: 500, delay: 800 // Reduced delay }); tween(memeQuote, { alpha: 1 }, { duration: 500, delay: 1000 // Reduced delay }); // Handle restart restartButton.down = function () { restartGame(); gameOverContainer.destroy(); }; LK.gui.addChild(gameOverContainer); } // Restart game function restartGame() { // Reset game variables score = 0; stressLevel = 0; gameLevel = 1; problemSpawnInterval = 1800; maxProblemsOnScreen = 4; lastProblemTime = 0; gameRunning = false; // Start paused for tutorial tutorialActive = true; // Show tutorial first // Clear any existing problems for (var i = 0; i < problems.length; i++) { if (problems[i] && problems[i].parent) { problems[i].destroy(); } } problems = []; // Reset UI scoreText.setText("SCORE: 0"); levelText.setText("DAY: 1"); updateStressBar(); // Reset player player.updateAppearance(0); player.alpha = 0; // Hide until tutorial closes // Restart music LK.playMusic('bgmusic'); // Show tutorial again with proper formatting showTutorial(); } // Get random meme quote for game over screen function getRandomMemeQuote() { var quotes = ["This is fine. Everything is fine.", "When someone asks how you're doing and you say 'fine' for the 47th time today.", "Me pretending my life isn't falling apart.", "Monday: I'm fine. Tuesday: I'M FINE! Friday: EVERYTHING IS FINE!!!", "When the deadline is tomorrow and you haven't started yet: I'M FINE!", "Adult life is saying 'I'm fine' when people ask how you are until you actually are.", "No one: \nMe: I'M FINE!!! EVERYTHING IS FINE!!!", "When your coffee spills, WiFi drops, and deadline changes all at once: I'M TOTALLY FINE!"]; return quotes[Math.floor(Math.random() * quotes.length)]; } // Screen shake effect function shakeScreen(intensity) { if (!gameRunning) { return; } tween(game, { x: Math.random() * intensity - intensity / 2 }, { duration: 50, easing: tween.linear, onFinish: function onFinish() { tween(game, { x: Math.random() * intensity - intensity / 2 }, { duration: 50, easing: tween.linear, onFinish: function onFinish() { tween(game, { x: 0 }, { duration: 50, easing: tween.linear }); } }); } }); } // Clean up problems array function cleanupProblems() { for (var i = problems.length - 1; i >= 0; i--) { if (!problems[i].parent) { problems.splice(i, 1); } } } // Handle instructions button instructionsButton.down = function () { if (gameStarted) { showInstructions(); } }; // Handle start button startButton.down = function () { startGame(); }; // Main game update function game.update = function () { // Calculate delta time for consistent updates var now = Date.now(); var delta = (now - lastUpdate) / 1000; // Convert to seconds lastUpdate = now; // Update code background for visual effect codeBackground.update(); if (!gameRunning || !gameStarted || tutorialActive) { // Check if there are any problems to remove (during tutorial) for (var i = problems.length - 1; i >= 0; i--) { if (problems[i].parent) { problems[i].destroy(); } } problems = []; return; } // Check if it's time to spawn a new problem if (now - lastProblemTime > problemSpawnInterval) { spawnProblem(); lastProblemTime = now; } // Update all problems for (var i = 0; i < problems.length; i++) { if (problems[i] && problems[i].update) { problems[i].update(delta); } } // Clean up problems array cleanupProblems(); // Check level progress checkLevelProgress(); // Randomly reduce stress (small recovery chance) if (Math.random() < 0.001 * delta * 60 && stressLevel > 0) { stressLevel = Math.max(0, stressLevel - 0.5); updateStressBar(); } // Add screen shake when stress is high if (stressLevel >= 70 && Math.random() < 0.05) { var intensity = (stressLevel - 70) / 30 * 20; shakeScreen(intensity); } }; // Start the music (lower volume) LK.playMusic('bgmusic');
===================================================================
--- original.js
+++ change.js
@@ -881,16 +881,16 @@
tutorialContainer.addChild(exampleProblem);
// Continue button with improved styling
var continueButton = new Container();
continueButton.interactive = true;
- var continueBg = LK.getAsset('problem', {
- anchorX: 0.5,
- anchorY: 0.5,
- width: 400,
- height: 120,
- radius: 20 // Added radius for rounded corners
+ var continueText = new Text2("START!", {
+ size: 70,
+ fill: 0xFFFFFF,
+ fontWeight: 'bold',
+ stroke: 0xFFFFFF,
+ strokeThickness: 3,
+ font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive"
});
- continueButton.addChild(continueBg);
var continueText = new Text2("START!", {
size: 70,
fill: 0xFFFFFF,
fontWeight: 'bold',
Modern office/workspace with subtle chaotic elements Include desk with scattered papers, coffee stains, overflowing inbox, sticky notes Light, neutral color palette (pale blue/gray) with professional appearance Should look slightly overwhelming but clean enough to not distract from gameplay. In-Game asset. 2d. High contrast. No shadows
Fullscreen modern App Store landscape banner, 16:9, high definition, for a game titled "FOMO Simulator: The Meeting That Could've Been An Email" and with the description "A fast-paced office simulator where you collect meetings, emails, and notifications while managing your energy levels. Strategic decisions must be made about which workplace items to prioritize as your energy depletes. Grab coffee for boosts, avoid missing important meetings, and survive the chaotic 60-second workday!". No text on banner!. In-Game asset. 2d. High contrast. No shadows
Modern App Store icon, high definition, square with rounded corners, for a game titled "FOMO Simulator: The Meeting That Could've Been An Email" and with the description "A fast-paced office simulator where you collect meetings, emails, and notifications while managing your energy levels. Strategic decisions must be made about which workplace items to prioritize as your energy depletes. Grab coffee for boosts, avoid missing important meetings, and survive the chaotic 60-second workday!". No text on icon!. In-Game asset. 2d. High contrast. No shadows