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
User prompt
I've found and fixed the NaN (Not a Number) issue in your timer display! This is a common issue in JavaScript when performing operations with undefined or non-numeric values. What's Causing the NaN Problem The NaN issue was likely occurring because: The timer values (timeRemaining or delta) might not be properly initialized or could become invalid during updates There weren't enough safety checks to prevent NaN values from appearing Division operations might involve zeros or undefined values The Fix: Adding Safety Checks I've completely rewritten the Problem class's update function with extensive safety checks: javascript// CRITICAL FIX: Completely rewritten update function 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) { // Timer expiration code... } }; Key Improvements Safety Checks for All Numeric Values: Check for NaN in delta time and provide a fallback Verify both timeRemaining and maxTime are valid numbers Reset to reasonable defaults if values become invalid Better Timer Text Formatting: Ensure we only call .toFixed(1) on a valid number Provide a default value ("0.0") if the value is invalid Percentage Calculation Safety: Added checks before dividing timeRemaining by maxTime Clamped percentages between 0-1 to prevent edge cases Initial Value Assignment: Used a safe initial value for the timer text display Implementation Instructions Simply replace your current Problem class with the fixed version I've provided. The core issue has been completely addressed with robust error checking that will prevent the NaN display from appearing. These changes should eliminate the NaN issue in your timer display and ensure it works correctly for your game. Now you'll have a properly functioning timer that counts down smoothly and doesn't display any error values!
User prompt
The problem timer is not fixed. I'm getting a NaN instead the timer !
User prompt
// Fixed Problem class with working timer 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() { 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() { pointsPopup.destroy(); } }); }; // Update timer - THIS IS THE CRITICAL PART THAT WASN'T WORKING self.update = function(delta) { if (!self.active) return; // Decrease timer self.timeRemaining = Math.max(0, self.timeRemaining - delta); // Update timer bar width based on time remaining var timerPercent = self.timeRemaining / self.maxTime; self.timerBar.width = Math.max(0, Math.floor(180 * timerPercent)); // 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 self.timerText.setText(Math.max(0, self.timeRemaining).toFixed(1)); // 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() { self.destroy(); } }); // Show stress increase popup var stressPopup = new Text2("+" + self.stressValue + " STRESS!", { size: 40, fill: 0xff0000, stroke: 0x000000, strokeThickness: 4 }); 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; }); // And make sure your TutorialProblem is also updated to match the styling 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; }); Use this code for the fix.
User prompt
Timer Fix Explanation The Main Issue: In your original code, the timer was defined correctly but there might have been issues with how the timer bar was being updated. I've completely revised the update function to ensure it works properly. Important Fixes: Made sure the timeRemaining is properly decreased using the delta time Simplified the timer bar width calculation to be more reliable Added proper bounds checking to ensure the timer width never goes negative Improved positioning of the timer elements for better visibility Sticky Note Colors: I also improved the sticky note colors to be more authentic. The yellow color is now a lighter shade (0xFFFF99) which looks more like a real sticky note. Implementation Instructions Replace your current Problem and TutorialProblem classes with the ones I've provided. The key difference is in the update function of the Problem class: javascript// Update timer - THIS IS THE CRITICAL PART THAT WASN'T WORKING self.update = function(delta) { if (!self.active) return; // Decrease timer self.timeRemaining = Math.max(0, self.timeRemaining - delta); // Update timer bar width based on time remaining var timerPercent = self.timeRemaining / self.maxTime; self.timerBar.width = Math.max(0, Math.floor(180 * timerPercent)); // 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 self.timerText.setText(Math.max(0, self.timeRemaining).toFixed(1)); // Check if timer expired if (self.timeRemaining <= 0) { // Timer expiration code... } }; This ensures that: The timer counts down correctly based on elapsed time The timer bar visually reflects the remaining time The timer text is updated with the correct value The color changes appropriately as time runs low I've also improved the styling of the sticky notes to make them look more authentic, with better colors and a more polished appearance. This should make your game look great and function properly
User prompt
Timer Fix Explanation The Main Issue: In your original code, the timer was defined correctly but there might have been issues with how the timer bar was being updated. I've completely revised the update function to ensure it works properly. Important Fixes: Made sure the timeRemaining is properly decreased using the delta time Simplified the timer bar width calculation to be more reliable Added proper bounds checking to ensure the timer width never goes negative Improved positioning of the timer elements for better visibility Sticky Note Colors: I also improved the sticky note colors to be more authentic. The yellow color is now a lighter shade (0xFFFF99) which looks more like a real sticky note. Implementation Instructions Replace your current Problem and TutorialProblem classes with the ones I've provided. The key difference is in the update function of the Problem class: javascript// Update timer - THIS IS THE CRITICAL PART THAT WASN'T WORKING self.update = function(delta) { if (!self.active) return; // Decrease timer self.timeRemaining = Math.max(0, self.timeRemaining - delta); // Update timer bar width based on time remaining var timerPercent = self.timeRemaining / self.maxTime; self.timerBar.width = Math.max(0, Math.floor(180 * timerPercent)); // 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 self.timerText.setText(Math.max(0, self.timeRemaining).toFixed(1)); // Check if timer expired if (self.timeRemaining <= 0) { // Timer expiration code... } }; This ensures that: The timer counts down correctly based on elapsed time The timer bar visually reflects the remaining time The timer text is updated with the correct value The color changes appropriately as time runs low I've also improved the styling of the sticky notes to make them look more authentic, with better colors and a more polished appearance. This should make your game look great and function properly // Fixed Problem class with working timer 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() { 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() { pointsPopup.destroy(); } }); }; // Update timer - THIS IS THE CRITICAL PART THAT WASN'T WORKING self.update = function(delta) { if (!self.active) return; // Decrease timer self.timeRemaining = Math.max(0, self.timeRemaining - delta); // Update timer bar width based on time remaining var timerPercent = self.timeRemaining / self.maxTime; self.timerBar.width = Math.max(0, Math.floor(180 * timerPercent)); // 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 self.timerText.setText(Math.max(0, self.timeRemaining).toFixed(1)); // 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() { self.destroy(); } }); // Show stress increase popup var stressPopup = new Text2("+" + self.stressValue + " STRESS!", { size: 40, fill: 0xff0000, stroke: 0x000000, strokeThickness: 4 }); 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; }); // And make sure your TutorialProblem is also updated to match the styling 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; });
User prompt
Sticky Note Problem Style Code I've redesigned your problems to look like authentic sticky notes with appropriate colors and styling! Here are the key changes I've made: Sticky Note Problems - Design Changes Authentic Sticky Note Colors: Yellow (classic sticky note) Pink (common pastel option) Light green (another standard color) Light blue (common office color) Orange (vibrant option) Text Styling: Dark blue text (0x000080) for better readability Used handwritten-style fonts like Caveat, Comic Sans, or Bradley Hand Bold text to make it more pronounced Visual Enhancements: Added subtle shadow behind each note for depth Random slight rotation to make them look naturally placed Larger text for better readability Animation Improvements: "Sticking" animation when notes appear (scaling from slightly larger) "Peeling off" animation when successfully tapped (rotating as if being pulled) "Crumpling" animation when time expires (rotating and shrinking) Code Implementation The code I provided replaces your current Problem and TutorialProblem classes. The key features are: javascript // Sticky note colors - authentic sticky note colors only var stickyColors = [ 0xFFD700, // Yellow sticky note 0xFFB6C1, // Pink sticky note 0x90EE90, // Light green sticky note 0xADD8E6, // Light blue sticky note 0xFFB347, // Orange sticky note ]; For the text styling: javascript var problemText = new Text2(type.text, { size: 36, fill: 0x000080, // Dark blue text align: 'center', wordWrap: true, wordWrapWidth: 180, fontWeight: 'bold', font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" // Handwritten font }); And for the shadow effect: javascript // Add shadow effect for depth var shadow = new Graphics(); shadow.beginFill(0x000000, 0.2); shadow.drawRect(-100, -100, 200, 200); shadow.endFill(); shadow.x = 10; shadow.y = 10; self.addChildAt(shadow, 0); // Add at the bottom layer Implementation Instructions Replace your current Problem class with the one I provided Replace your TutorialProblem class with the updated version Make sure the shadow effect works - if Graphics isn't working properly, you may need to create a shadow using another shape asset This redesign maintains all the functionality of your current problems but makes them look like authentic sticky notes, which fits perfectly with your office-themed stress game! The colors are now authentic sticky note colors, and the text is more readable with dark blue/black on lighter backgrounds. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Code edit (3 edits merged)
Please save this source code
User prompt
Add this for the color of all problems 0xfdfd03
Code edit (5 edits merged)
Please save this source code
User prompt
move the close button on the right
/**** * 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: 0xFF0000, 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 // NEW: Add initial stress when problem appears var initialStress = Math.ceil(self.stressValue * 0.3); // 30% of the full stress value stressLevel += initialStress; updateStressBar(); // 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); // 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(); // 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); // NEW: Show stress reduction popup var stressReductionPopup = new Text2("-" + stressReduction + " STRESS!", { size: 40, fill: 0x00cc00, // Green for stress reduction stroke: 0x000000, strokeThickness: 3 }); stressReductionPopup.anchor.set(0.5, 0.5); stressReductionPopup.x = self.x; stressReductionPopup.y = self.y + 50; game.addChild(stressReductionPopup); // Animate stress reduction popup tween(stressReductionPopup, { y: stressReductionPopup.y - 100, alpha: 0 }, { duration: 800, easing: tween.easeOut, onFinish: function onFinish() { stressReductionPopup.destroy(); } }); // Animate stress reduction popup tween(stressReductionPopup, { y: stressReductionPopup.y + 100, alpha: 0 }, { duration: 800, easing: tween.easeOut, onFinish: function onFinish() { stressReductionPopup.destroy(); } }); // 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(); // 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 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(); } }); } }; // 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 }); appearanceStressPopup.anchor.set(0.5, 0.5); appearanceStressPopup.x = self.x; appearanceStressPopup.y = self.y; game.addChild(appearanceStressPopup); // Animate stress popup tween(appearanceStressPopup, { y: appearanceStressPopup.y - 50, alpha: 0 }, { duration: 800, easing: tween.easeOut, onFinish: function onFinish() { appearanceStressPopup.destroy(); } }); // 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 onFinish() { appearanceStressPopup.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 with new stress mechanics var instructions = new Text2("• PROBLEMS appear randomly and add STRESS\n\n" + "• Each problem adds 30% of its stress when it appears\n\n" + "• Each problem has a COUNTDOWN TIMER\n\n" + "• TAP problems before their timer runs out\n\n" + "• Tapping reduces STRESS by 50%, but timer expiry adds 70% more\n\n" + "• Clear ALL problems to recover stress faster\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: 0xff0000, fontWeight: 'bold', stroke: 0xFFFFFF, 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 with new stress mechanics var instructions = new Text2("1. PROBLEMS appear and add 30% of their stress immediately\n\n" + "2. Each problem has a COUNTDOWN TIMER\n\n" + "3. TAP problems to reduce your STRESS by 50%\n\n" + "4. If timer runs out, your STRESS increases by 70% more\n\n" + "5. Clear ALL problems to recover 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: 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 NOT FINE!", { size: 120, fill: 0xff0000, fontWeight: 'bold', stroke: 0xFFFFFF, strokeThickness: 8, font: "Caveat, 'Comic Sans MS', 'Bradley Hand', cursive" }); gameOverText.x = 2048 / 2 - 300; // Moved left to make room for parens text gameOverText.y = 600; gameOverContainer.addChild(gameOverText); // Final score text var finalScoreText = new Text2("FINAL SCORE: " + score, { size: 100, fill: 0xffff00, stroke: 0x000000, strokeThickness: 5 }); finalScoreText.x = 2048 / 2 - 300; finalScoreText.y = 1000; gameOverContainer.addChild(finalScoreText); // Meme text - FIXED: Position next to main text, not overlapping var memeText = new Text2("(But we've all been there...)", { 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 - 300; // Position to the right of main text memeText.y = 600; gameOverContainer.addChild(memeText); // Level reached - FIXED: Updated text and positioning var levelReachedText = new Text2("DAYS WITHOUT BURNOUT: " + gameLevel, { size: 70, fill: 0xFFFFFF, stroke: 0x000000, strokeThickness: 3 }); levelReachedText.x = 2048 / 2 - 300; 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', 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 - 300; 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 - 300; 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; // Only update code background if game hasn't started or tutorial is active if (!gameStarted || tutorialActive) { 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(); // 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); // Animate relaxation popup tween(relaxPopup, { y: relaxPopup.y - 50, alpha: 0 }, { duration: 800, easing: tween.easeOut, onFinish: function onFinish() { relaxPopup.destroy(); } }); } } // 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 }); 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(); } }); } } else { // 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
@@ -265,8 +265,12 @@
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();
// Create problem background (sticky note)
var problemGraphic = self.attachAsset('problem', {
anchorX: 0.5,
anchorY: 0.5,
@@ -356,8 +360,21 @@
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);
+ // NEW: Show stress reduction popup
+ var stressReductionPopup = new Text2("-" + stressReduction + " STRESS!", {
+ size: 40,
+ fill: 0x00cc00,
+ // Green for stress reduction
+ stroke: 0x000000,
strokeThickness: 3
});
stressReductionPopup.anchor.set(0.5, 0.5);
stressReductionPopup.x = self.x;
@@ -373,8 +390,19 @@
onFinish: function onFinish() {
stressReductionPopup.destroy();
}
});
+ // Animate stress reduction popup
+ tween(stressReductionPopup, {
+ y: stressReductionPopup.y + 100,
+ alpha: 0
+ }, {
+ duration: 800,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ stressReductionPopup.destroy();
+ }
+ });
// Animate points popup
tween(pointsPopup, {
y: pointsPopup.y - 100,
alpha: 0
@@ -424,10 +452,11 @@
if (self.timeRemaining <= 0) {
self.active = false;
// Visual feedback for expired timer
LK.getSound('stress').play();
- // Increase stress
- stressLevel += self.stressValue;
+ // 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
@@ -494,8 +523,32 @@
onFinish: function onFinish() {
appearanceStressPopup.destroy();
}
});
+ // 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 onFinish() {
+ appearanceStressPopup.destroy();
+ }
+ });
// Spawn animation - "sticking" effect
self.scale.set(1.2);
tween(self, {
scaleX: 1,
@@ -914,9 +967,9 @@
tutorialTitle.x = 2048 / 2 - 300;
tutorialTitle.y = 100;
tutorialContainer.addChild(tutorialTitle);
// FIXED: Consistent formatting for tutorial instructions with new stress mechanics
- var instructions = new Text2("• PROBLEMS will appear randomly on screen\n\n" + "• PROBLEMS add 30% of their stress when they appear\n\n" + "• Each problem has a COUNTDOWN TIMER\n\n" + "• TAP problems to solve them and REDUCE stress by 50%\n\n" + "• If time runs out, your STRESS increases by 70% more\n\n" + "• Clear ALL problems to recover stress faster\n\n" + "• Don't let your stress reach 100%\n\n" + "• Just keep telling yourself \"I'M FINE!\"", {
+ var instructions = new Text2("• PROBLEMS appear randomly and add STRESS\n\n" + "• Each problem adds 30% of its stress when it appears\n\n" + "• Each problem has a COUNTDOWN TIMER\n\n" + "• TAP problems before their timer runs out\n\n" + "• Tapping reduces STRESS by 50%, but timer expiry adds 70% more\n\n" + "• Clear ALL problems to recover stress faster\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,
@@ -1035,9 +1088,9 @@
title.x = 2048 / 2;
title.y = panel.y - 800;
popup.addChild(title);
// Instructions with new stress mechanics
- var instructions = new Text2("1. PROBLEMS will appear randomly on screen\n\n" + "2. NEW: PROBLEMS immediately add 30% of their stress\n\n" + "3. Each problem has a COUNTDOWN TIMER\n\n" + "4. NEW: TAP problems to solve them and REDUCE stress by 50%\n\n" + "5. If time runs out, your STRESS increases by 70% more\n\n" + "6. NEW: Clear ALL problems to recover stress faster\n\n" + "7. Don't let your stress reach 100%\n\n" + "8. LEVEL UP every 10 points\n\n" + "9. Just keep telling yourself \"I'M FINE!\"", {
+ var instructions = new Text2("1. PROBLEMS appear and add 30% of their stress immediately\n\n" + "2. Each problem has a COUNTDOWN TIMER\n\n" + "3. TAP problems to reduce your STRESS by 50%\n\n" + "4. If timer runs out, your STRESS increases by 70% more\n\n" + "5. Clear ALL problems to recover 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: 50,
fill: 0x000000,
align: 'left',
lineHeight: 70,
@@ -1409,8 +1462,40 @@
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();
+ }
+ });
+ }
+ }
+ // 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
});
relaxPopup.anchor.set(0.5, 0.5);
relaxPopup.x = player.x;
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