User prompt
Move the play button 45px up
User prompt
200px up
User prompt
move play 350 px down
User prompt
move the a game about pretending everythnig is ok 35 px down.
User prompt
Bug. When I cling the play button the How to play screen appear but there instances of the problems also showing, they shouldnt show now only after the hot to play screen has disapeared.
User prompt
When I press the play button there is a delay. The game does not start immediately. The How to play screen shows. Once the how to play has been tapped ( no longer showing ) then the game starts and the assets ender the screen.
User prompt
70 pixels down
User prompt
145 pixels down
User prompt
move the Play button 450 pixels up
User prompt
The DAY will also appear after the play button has been pressed
User prompt
The player aset and the I'm fine text under it will appear when the play button hass been pressed
Code edit (4 edits merged)
Please save this source code
User prompt
Move the How to play text 300 px up
Code edit (1 edits merged)
Please save this source code
User prompt
("(a game about pretending everything is OK)" make the text white
User prompt
Keep it white
Code edit (3 edits merged)
Please save this source code
User prompt
("(a game about pretending everything is OK)" make the fill dark blue
User prompt
Please fix the bug: 'black is not defined' in or related to this line: 'var subtitleText = new Text2("(a game about pretending everything is OK)", {' Line Number: 579
Code edit (9 edits merged)
Please save this source code
User prompt
(a game about pretending everything is OK) change the fond style to be like it's handwritten !
User prompt
make the paly button a bit bigger and add an underline that matches the style of the Play text.
User prompt
Move the play button at the center of the screen
Code edit (1 edits merged)
Please save this source code
User prompt
Change the I'm fine text to look like the Play but with a light blue-green filling.
/**** * 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: 0x000000, align: 'center', stroke: 0xFFFFFF, strokeThickness: 5 }); 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: 100, fill: 0x66cccc, // Light blue-green fill align: 'center', stroke: 0xFFFFFF, strokeThickness: 5 }; // 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 }; // 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 }; // 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: 130, fill: 0xFF0000, align: 'center', stroke: 0x000000, strokeThickness: 6 }; // 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); // Problem types with text, color, and stress impact var problemTypes = [{ text: "WiFi Down!", color: 0xff4d4d, stress: 8 }, { text: "Coffee Spill!", color: 0x8b4513, stress: 6 }, { text: "Deadline Changed!", color: 0xff9900, stress: 10 }, { text: "Surprise Meeting!", color: 0x9933cc, stress: 12 }, { text: "Traffic Jam!", color: 0x666666, stress: 7 }, { text: "Phone Died!", color: 0x000000, stress: 9 }, { text: "Email Overload!", color: 0x3366ff, stress: 8 }, { text: "Printer Error!", color: 0xcc0000, stress: 7 }, { text: "Noisy Neighbors!", color: 0x99cc00, stress: 6 }, { text: "Low Battery!", color: 0xff6600, 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 var problemGraphic = self.attachAsset('problem', { anchorX: 0.5, anchorY: 0.5, tint: type.color }); // Create problem text var problemText = new Text2(type.text, { size: 36, fill: 0xFFFFFF, align: 'center', wordWrap: true, wordWrapWidth: 180 }); problemText.anchor.set(0.5, 0.5); self.addChild(problemText); // Create timer bar self.timerBar = self.attachAsset('timer', { anchorX: 0, anchorY: 0, x: -100, y: 70, width: 200, tint: 0x00ff00 }); // Add timer text self.timerText = new Text2(self.timeRemaining.toFixed(1), { size: 30, fill: 0xFFFFFF, align: 'center' }); self.timerText.anchor.set(0.5, 0.5); self.timerText.x = 0; self.timerText.y = 70; self.addChild(self.timerText); // 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 tween(self, { alpha: 0, scaleX: 0.2, scaleY: 0.2, rotation: Math.random() * 2 - 1 // Random rotation for variety }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { self.destroy(); } }); // Award points based on time remaining var pointsAwarded = Math.ceil(self.points * (self.timeRemaining / self.maxTime)); score += pointsAwarded; scoreText.setText("SCORE: " + score); // Show points popup var pointsPopup = new Text2("+" + pointsAwarded, { size: 50, fill: 0x00ff00, stroke: 0x000000, strokeThickness: 4 }); pointsPopup.anchor.set(0.5, 0.5); pointsPopup.x = self.x; pointsPopup.y = self.y; game.addChild(pointsPopup); // Animate points popup tween(pointsPopup, { y: pointsPopup.y - 100, alpha: 0 }, { duration: 800, easing: tween.easeOut, onFinish: function onFinish() { pointsPopup.destroy(); } }); }; // Update timer self.update = function (delta) { if (!self.active) { return; } // Decrease timer self.timeRemaining -= delta; // Update timer bar width var timerPercent = Math.max(0, self.timeRemaining / self.maxTime); self.timerBar.width = 200 * 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); // Shrink and fade out tween(self, { alpha: 0, scaleX: 0.2, scaleY: 0.2 }, { 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 }); stressPopup.anchor.set(0.5, 0.5); stressPopup.x = self.x; stressPopup.y = self.y; game.addChild(stressPopup); // Animate stress popup tween(stressPopup, { y: stressPopup.y - 100, alpha: 0 }, { duration: 800, easing: tween.easeOut, onFinish: function onFinish() { stressPopup.destroy(); } }); } }; // Spawn animation self.scale.set(0); tween(self, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.elasticOut }); 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 }); 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; }); /**** * Initialize Game ****/ 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 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; 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 }); levelText.anchor.set(0.5, 0); levelText.x = 2048 / 2 - 400 + 200 - 75 - 50 - 20 + 10; levelText.y = 30; LK.gui.addChild(levelText); // Game title var titleText = new Text2("I'M FINE!", { size: 200, fill: 0xff4d4d, fontWeight: 'bold', stroke: 0xFFFFFF, strokeThickness: 10 }); 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, fontStyle: 'italic' }); subtitleText.anchor.set(0.5, 0.5); subtitleText.x = 2048 / 2 - 300; // Move 300 pixels to the left subtitleText.y = 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: 70, fill: 0xff4d4d, fontWeight: 'bold', stroke: 0xFFFFFF, strokeThickness: 5 }); 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; 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() { // Check if instructions are visible (a tutorial container exists in GUI) var instructionsVisible = false; for (var i = 0; i < LK.gui.children.length; i++) { if (LK.gui.children[i] instanceof Container && LK.gui.children[i].children.length > 0) { // Check for tutorial or instruction screens if (LK.gui.children[i].children[0].width >= 1600) { instructionsVisible = true; break; } } } // Don't spawn problems if game not running, not started, or instructions visible if (!gameRunning || !gameStarted || instructionsVisible) { 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() { gameStarted = true; gameRunning = true; // 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() { // Show game UI tween(stressBar, { alpha: 1 }, { duration: 500 }); tween(instructionsButton, { alpha: 1 }, { duration: 500 }); // Show tutorial showTutorial(); // Start music LK.playMusic('bgmusic'); } }); } // Show tutorial function showTutorial() { var tutorialContainer = new Container(); // 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' }); tutorialTitle.anchor.set(0.5, 0.5); tutorialTitle.x = 1500 / 2; tutorialTitle.y = 500; tutorialContainer.addChild(tutorialTitle); // 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: 'center', lineHeight: 80 }); instructions.anchor.set(0.5, 0.5); instructions.x = 1500 / 2; instructions.y = 1000; tutorialContainer.addChild(instructions); // Example problem var exampleProblem = new Problem(); exampleProblem.x = 2048 / 2; exampleProblem.y = 1500; tutorialContainer.addChild(exampleProblem); // Continue button var continueButton = new Container(); continueButton.interactive = true; var continueBg = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 400, height: 120, tint: 0x00cc00 }); continueButton.addChild(continueBg); var continueText = new Text2("START!", { size: 70, fill: 0xFFFFFF, fontWeight: 'bold' }); continueText.anchor.set(0.5, 0.5); continueText.x = 0; continueText.y = 0; continueButton.addChild(continueText); continueButton.x = 2048 / 2; continueButton.y = 2000; tutorialContainer.addChild(continueButton); // Add to GUI LK.gui.addChild(tutorialContainer); // Make the entire tutorial container interactive to close on tap tutorialContainer.interactive = true; tutorialContainer.down = function () { tutorialContainer.destroy(); }; } // Instructions popup function showInstructions() { var popup = new Container(); // Darken background var bg = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 2048, height: 2732, tint: 0x000000, alpha: 0.7 }); popup.addChild(bg); // Panel background var panel = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 1600, height: 1800, tint: 0xFFFFFF, alpha: 0.9 }); panel.x = 2048 / 2; panel.y = 2732 / 2; popup.addChild(panel); // Title var title = new Text2("HOW TO PLAY", { size: 100, fill: 0xff4d4d, fontWeight: 'bold', stroke: 0x000000, strokeThickness: 5 }); title.anchor.set(0.5, 0); title.x = 2048 / 2; title.y = panel.y - 800; popup.addChild(title); // Instructions var instructions = new Text2("1. PROBLEMS will appear randomly on screen\n\n" + "2. Each problem has a COUNTDOWN TIMER\n\n" + "3. TAP problems before their timer runs out\n\n" + "4. If time runs out, your STRESS increases\n\n" + "5. Don't let your stress reach 100%\n\n" + "6. LEVEL UP every 10 points\n\n" + "7. Just keep telling yourself \"I'M FINE!\"", { size: 50, fill: 0x000000, align: 'left', lineHeight: 70, wordWrap: true, wordWrapWidth: panel.width - 200 }); instructions.anchor.set(0, 0); instructions.x = panel.x - 700; instructions.y = panel.y - 600; popup.addChild(instructions); // Close button var closeButton = new Container(); closeButton.interactive = true; var closeBg = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 400, height: 120, tint: 0xff4d4d }); closeButton.addChild(closeBg); var closeText = new Text2("RESUME", { size: 60, fill: 0xFFFFFF, fontWeight: 'bold' }); 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; closeButton.down = function () { popup.destroy(); 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 }); 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 var gameOverText = new Text2("YOU'RE NOT FINE!", { size: 120, fill: 0xff0000, fontWeight: 'bold', stroke: 0xFFFFFF, strokeThickness: 8 }); gameOverText.anchor.set(0.5, 0.5); gameOverText.x = 2048 / 2; gameOverText.y = 700; gameOverContainer.addChild(gameOverText); // Meme text var memeText = new Text2("(But we've all been there...)", { size: 70, fill: 0xFFFFFF, fontStyle: 'italic' }); memeText.anchor.set(0.5, 0.5); memeText.x = 2048 / 2; memeText.y = 850; 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 = 1100; gameOverContainer.addChild(finalScoreText); // Level reached var levelReachedText = new Text2("DAY REACHED: " + gameLevel, { size: 80, fill: 0xFFFFFF }); levelReachedText.anchor.set(0.5, 0.5); levelReachedText.x = 2048 / 2; levelReachedText.y = 1250; gameOverContainer.addChild(levelReachedText); // Restart button var restartButton = new Container(); restartButton.interactive = true; var restartBg = LK.getAsset('problem', { anchorX: 0.5, anchorY: 0.5, width: 500, height: 120, tint: 0x00cc00 }); 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 = 1500; gameOverContainer.addChild(restartButton); // Add fun meme image or message 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 = 1800; gameOverContainer.addChild(memeQuote); // Animate in 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: 500 }); tween(finalScoreText, { alpha: 1 }, { duration: 500, delay: 1000 }); tween(levelReachedText, { alpha: 1 }, { duration: 500, delay: 1500 }); tween(restartButton, { alpha: 1 }, { duration: 500, delay: 2000 }); tween(memeQuote, { alpha: 1 }, { duration: 500, delay: 2500 }); // 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 = true; // Clear any existing problems for (var i = 0; i < problems.length; i++) { if (problems[i].parent) { problems[i].destroy(); } } problems = []; // Reset UI scoreText.setText("SCORE: 0"); levelText.setText("DAY: 1"); updateStressBar(); // Reset player player.updateAppearance(0); // Restart music LK.playMusic('bgmusic'); // Show tutorial again showTutorial(); } // Get random meme quote for game over screen function getRandomMemeQuote() { var quotes = ["This is fine. Everything is fine.", "When someone asks how you're doing and you say 'fine' for the 47th time today.", "Me pretending my life isn't falling apart.", "Monday: I'm fine. Tuesday: I'M FINE! Friday: EVERYTHING IS FINE!!!", "When the deadline is tomorrow and you haven't started yet: I'M FINE!", "Adult life is saying 'I'm fine' when people ask how you are until you actually are.", "No one: \nMe: I'M FINE!!! EVERYTHING IS FINE!!!", "When your coffee spills, WiFi drops, and deadline changes all at once: I'M TOTALLY FINE!"]; return quotes[Math.floor(Math.random() * quotes.length)]; } // Screen shake effect function shakeScreen(intensity) { if (!gameRunning) { return; } tween(game, { x: Math.random() * intensity - intensity / 2 }, { duration: 50, easing: tween.linear, onFinish: function onFinish() { tween(game, { x: Math.random() * intensity - intensity / 2 }, { duration: 50, easing: tween.linear, onFinish: function onFinish() { tween(game, { x: 0 }, { duration: 50, easing: tween.linear }); } }); } }); } // Clean up problems array function cleanupProblems() { for (var i = problems.length - 1; i >= 0; i--) { if (!problems[i].parent) { problems.splice(i, 1); } } } // Handle instructions button instructionsButton.down = function () { if (gameStarted) { showInstructions(); } }; // Handle start button startButton.down = function () { startGame(); }; // Main game update function game.update = function () { // Calculate delta time for consistent updates var now = Date.now(); var delta = (now - lastUpdate) / 1000; // Convert to seconds lastUpdate = now; // Update code background for visual effect codeBackground.update(); if (!gameRunning || !gameStarted) { return; } // Check if it's time to spawn a new problem if (now - lastProblemTime > problemSpawnInterval) { spawnProblem(); lastProblemTime = now; } // Update all problems for (var i = 0; i < problems.length; i++) { if (problems[i] && problems[i].update) { problems[i].update(delta); } } // Clean up problems array cleanupProblems(); // Check level progress checkLevelProgress(); // Randomly reduce stress (small recovery chance) if (Math.random() < 0.001 * delta * 60 && stressLevel > 0) { stressLevel = Math.max(0, stressLevel - 0.5); updateStressBar(); } // Add screen shake when stress is high if (stressLevel >= 70 && Math.random() < 0.05) { var intensity = (stressLevel - 70) / 30 * 20; shakeScreen(intensity); } }; // Start the music (lower volume) LK.playMusic('bgmusic');
/****
* 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: 0x000000,
align: 'center',
stroke: 0xFFFFFF,
strokeThickness: 5
});
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: 100,
fill: 0x66cccc,
// Light blue-green fill
align: 'center',
stroke: 0xFFFFFF,
strokeThickness: 5
};
// 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
};
// 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
};
// 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: 130,
fill: 0xFF0000,
align: 'center',
stroke: 0x000000,
strokeThickness: 6
};
// 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);
// Problem types with text, color, and stress impact
var problemTypes = [{
text: "WiFi Down!",
color: 0xff4d4d,
stress: 8
}, {
text: "Coffee Spill!",
color: 0x8b4513,
stress: 6
}, {
text: "Deadline Changed!",
color: 0xff9900,
stress: 10
}, {
text: "Surprise Meeting!",
color: 0x9933cc,
stress: 12
}, {
text: "Traffic Jam!",
color: 0x666666,
stress: 7
}, {
text: "Phone Died!",
color: 0x000000,
stress: 9
}, {
text: "Email Overload!",
color: 0x3366ff,
stress: 8
}, {
text: "Printer Error!",
color: 0xcc0000,
stress: 7
}, {
text: "Noisy Neighbors!",
color: 0x99cc00,
stress: 6
}, {
text: "Low Battery!",
color: 0xff6600,
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
var problemGraphic = self.attachAsset('problem', {
anchorX: 0.5,
anchorY: 0.5,
tint: type.color
});
// Create problem text
var problemText = new Text2(type.text, {
size: 36,
fill: 0xFFFFFF,
align: 'center',
wordWrap: true,
wordWrapWidth: 180
});
problemText.anchor.set(0.5, 0.5);
self.addChild(problemText);
// Create timer bar
self.timerBar = self.attachAsset('timer', {
anchorX: 0,
anchorY: 0,
x: -100,
y: 70,
width: 200,
tint: 0x00ff00
});
// Add timer text
self.timerText = new Text2(self.timeRemaining.toFixed(1), {
size: 30,
fill: 0xFFFFFF,
align: 'center'
});
self.timerText.anchor.set(0.5, 0.5);
self.timerText.x = 0;
self.timerText.y = 70;
self.addChild(self.timerText);
// 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
tween(self, {
alpha: 0,
scaleX: 0.2,
scaleY: 0.2,
rotation: Math.random() * 2 - 1 // Random rotation for variety
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
// Award points based on time remaining
var pointsAwarded = Math.ceil(self.points * (self.timeRemaining / self.maxTime));
score += pointsAwarded;
scoreText.setText("SCORE: " + score);
// Show points popup
var pointsPopup = new Text2("+" + pointsAwarded, {
size: 50,
fill: 0x00ff00,
stroke: 0x000000,
strokeThickness: 4
});
pointsPopup.anchor.set(0.5, 0.5);
pointsPopup.x = self.x;
pointsPopup.y = self.y;
game.addChild(pointsPopup);
// Animate points popup
tween(pointsPopup, {
y: pointsPopup.y - 100,
alpha: 0
}, {
duration: 800,
easing: tween.easeOut,
onFinish: function onFinish() {
pointsPopup.destroy();
}
});
};
// Update timer
self.update = function (delta) {
if (!self.active) {
return;
}
// Decrease timer
self.timeRemaining -= delta;
// Update timer bar width
var timerPercent = Math.max(0, self.timeRemaining / self.maxTime);
self.timerBar.width = 200 * 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);
// Shrink and fade out
tween(self, {
alpha: 0,
scaleX: 0.2,
scaleY: 0.2
}, {
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
});
stressPopup.anchor.set(0.5, 0.5);
stressPopup.x = self.x;
stressPopup.y = self.y;
game.addChild(stressPopup);
// Animate stress popup
tween(stressPopup, {
y: stressPopup.y - 100,
alpha: 0
}, {
duration: 800,
easing: tween.easeOut,
onFinish: function onFinish() {
stressPopup.destroy();
}
});
}
};
// Spawn animation
self.scale.set(0);
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.elasticOut
});
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
});
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;
});
/****
* Initialize Game
****/
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 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;
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
});
levelText.anchor.set(0.5, 0);
levelText.x = 2048 / 2 - 400 + 200 - 75 - 50 - 20 + 10;
levelText.y = 30;
LK.gui.addChild(levelText);
// Game title
var titleText = new Text2("I'M FINE!", {
size: 200,
fill: 0xff4d4d,
fontWeight: 'bold',
stroke: 0xFFFFFF,
strokeThickness: 10
});
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,
fontStyle: 'italic'
});
subtitleText.anchor.set(0.5, 0.5);
subtitleText.x = 2048 / 2 - 300; // Move 300 pixels to the left
subtitleText.y = 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: 70,
fill: 0xff4d4d,
fontWeight: 'bold',
stroke: 0xFFFFFF,
strokeThickness: 5
});
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;
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() {
// Check if instructions are visible (a tutorial container exists in GUI)
var instructionsVisible = false;
for (var i = 0; i < LK.gui.children.length; i++) {
if (LK.gui.children[i] instanceof Container && LK.gui.children[i].children.length > 0) {
// Check for tutorial or instruction screens
if (LK.gui.children[i].children[0].width >= 1600) {
instructionsVisible = true;
break;
}
}
}
// Don't spawn problems if game not running, not started, or instructions visible
if (!gameRunning || !gameStarted || instructionsVisible) {
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() {
gameStarted = true;
gameRunning = true;
// 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() {
// Show game UI
tween(stressBar, {
alpha: 1
}, {
duration: 500
});
tween(instructionsButton, {
alpha: 1
}, {
duration: 500
});
// Show tutorial
showTutorial();
// Start music
LK.playMusic('bgmusic');
}
});
}
// Show tutorial
function showTutorial() {
var tutorialContainer = new Container();
// 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'
});
tutorialTitle.anchor.set(0.5, 0.5);
tutorialTitle.x = 1500 / 2;
tutorialTitle.y = 500;
tutorialContainer.addChild(tutorialTitle);
// 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: 'center',
lineHeight: 80
});
instructions.anchor.set(0.5, 0.5);
instructions.x = 1500 / 2;
instructions.y = 1000;
tutorialContainer.addChild(instructions);
// Example problem
var exampleProblem = new Problem();
exampleProblem.x = 2048 / 2;
exampleProblem.y = 1500;
tutorialContainer.addChild(exampleProblem);
// Continue button
var continueButton = new Container();
continueButton.interactive = true;
var continueBg = LK.getAsset('problem', {
anchorX: 0.5,
anchorY: 0.5,
width: 400,
height: 120,
tint: 0x00cc00
});
continueButton.addChild(continueBg);
var continueText = new Text2("START!", {
size: 70,
fill: 0xFFFFFF,
fontWeight: 'bold'
});
continueText.anchor.set(0.5, 0.5);
continueText.x = 0;
continueText.y = 0;
continueButton.addChild(continueText);
continueButton.x = 2048 / 2;
continueButton.y = 2000;
tutorialContainer.addChild(continueButton);
// Add to GUI
LK.gui.addChild(tutorialContainer);
// Make the entire tutorial container interactive to close on tap
tutorialContainer.interactive = true;
tutorialContainer.down = function () {
tutorialContainer.destroy();
};
}
// Instructions popup
function showInstructions() {
var popup = new Container();
// Darken background
var bg = LK.getAsset('problem', {
anchorX: 0.5,
anchorY: 0.5,
width: 2048,
height: 2732,
tint: 0x000000,
alpha: 0.7
});
popup.addChild(bg);
// Panel background
var panel = LK.getAsset('problem', {
anchorX: 0.5,
anchorY: 0.5,
width: 1600,
height: 1800,
tint: 0xFFFFFF,
alpha: 0.9
});
panel.x = 2048 / 2;
panel.y = 2732 / 2;
popup.addChild(panel);
// Title
var title = new Text2("HOW TO PLAY", {
size: 100,
fill: 0xff4d4d,
fontWeight: 'bold',
stroke: 0x000000,
strokeThickness: 5
});
title.anchor.set(0.5, 0);
title.x = 2048 / 2;
title.y = panel.y - 800;
popup.addChild(title);
// Instructions
var instructions = new Text2("1. PROBLEMS will appear randomly on screen\n\n" + "2. Each problem has a COUNTDOWN TIMER\n\n" + "3. TAP problems before their timer runs out\n\n" + "4. If time runs out, your STRESS increases\n\n" + "5. Don't let your stress reach 100%\n\n" + "6. LEVEL UP every 10 points\n\n" + "7. Just keep telling yourself \"I'M FINE!\"", {
size: 50,
fill: 0x000000,
align: 'left',
lineHeight: 70,
wordWrap: true,
wordWrapWidth: panel.width - 200
});
instructions.anchor.set(0, 0);
instructions.x = panel.x - 700;
instructions.y = panel.y - 600;
popup.addChild(instructions);
// Close button
var closeButton = new Container();
closeButton.interactive = true;
var closeBg = LK.getAsset('problem', {
anchorX: 0.5,
anchorY: 0.5,
width: 400,
height: 120,
tint: 0xff4d4d
});
closeButton.addChild(closeBg);
var closeText = new Text2("RESUME", {
size: 60,
fill: 0xFFFFFF,
fontWeight: 'bold'
});
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;
closeButton.down = function () {
popup.destroy();
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
});
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
var gameOverText = new Text2("YOU'RE NOT FINE!", {
size: 120,
fill: 0xff0000,
fontWeight: 'bold',
stroke: 0xFFFFFF,
strokeThickness: 8
});
gameOverText.anchor.set(0.5, 0.5);
gameOverText.x = 2048 / 2;
gameOverText.y = 700;
gameOverContainer.addChild(gameOverText);
// Meme text
var memeText = new Text2("(But we've all been there...)", {
size: 70,
fill: 0xFFFFFF,
fontStyle: 'italic'
});
memeText.anchor.set(0.5, 0.5);
memeText.x = 2048 / 2;
memeText.y = 850;
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 = 1100;
gameOverContainer.addChild(finalScoreText);
// Level reached
var levelReachedText = new Text2("DAY REACHED: " + gameLevel, {
size: 80,
fill: 0xFFFFFF
});
levelReachedText.anchor.set(0.5, 0.5);
levelReachedText.x = 2048 / 2;
levelReachedText.y = 1250;
gameOverContainer.addChild(levelReachedText);
// Restart button
var restartButton = new Container();
restartButton.interactive = true;
var restartBg = LK.getAsset('problem', {
anchorX: 0.5,
anchorY: 0.5,
width: 500,
height: 120,
tint: 0x00cc00
});
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 = 1500;
gameOverContainer.addChild(restartButton);
// Add fun meme image or message
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 = 1800;
gameOverContainer.addChild(memeQuote);
// Animate in
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: 500
});
tween(finalScoreText, {
alpha: 1
}, {
duration: 500,
delay: 1000
});
tween(levelReachedText, {
alpha: 1
}, {
duration: 500,
delay: 1500
});
tween(restartButton, {
alpha: 1
}, {
duration: 500,
delay: 2000
});
tween(memeQuote, {
alpha: 1
}, {
duration: 500,
delay: 2500
});
// 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 = true;
// Clear any existing problems
for (var i = 0; i < problems.length; i++) {
if (problems[i].parent) {
problems[i].destroy();
}
}
problems = [];
// Reset UI
scoreText.setText("SCORE: 0");
levelText.setText("DAY: 1");
updateStressBar();
// Reset player
player.updateAppearance(0);
// Restart music
LK.playMusic('bgmusic');
// Show tutorial again
showTutorial();
}
// Get random meme quote for game over screen
function getRandomMemeQuote() {
var quotes = ["This is fine. Everything is fine.", "When someone asks how you're doing and you say 'fine' for the 47th time today.", "Me pretending my life isn't falling apart.", "Monday: I'm fine. Tuesday: I'M FINE! Friday: EVERYTHING IS FINE!!!", "When the deadline is tomorrow and you haven't started yet: I'M FINE!", "Adult life is saying 'I'm fine' when people ask how you are until you actually are.", "No one: \nMe: I'M FINE!!! EVERYTHING IS FINE!!!", "When your coffee spills, WiFi drops, and deadline changes all at once: I'M TOTALLY FINE!"];
return quotes[Math.floor(Math.random() * quotes.length)];
}
// Screen shake effect
function shakeScreen(intensity) {
if (!gameRunning) {
return;
}
tween(game, {
x: Math.random() * intensity - intensity / 2
}, {
duration: 50,
easing: tween.linear,
onFinish: function onFinish() {
tween(game, {
x: Math.random() * intensity - intensity / 2
}, {
duration: 50,
easing: tween.linear,
onFinish: function onFinish() {
tween(game, {
x: 0
}, {
duration: 50,
easing: tween.linear
});
}
});
}
});
}
// Clean up problems array
function cleanupProblems() {
for (var i = problems.length - 1; i >= 0; i--) {
if (!problems[i].parent) {
problems.splice(i, 1);
}
}
}
// Handle instructions button
instructionsButton.down = function () {
if (gameStarted) {
showInstructions();
}
};
// Handle start button
startButton.down = function () {
startGame();
};
// Main game update function
game.update = function () {
// Calculate delta time for consistent updates
var now = Date.now();
var delta = (now - lastUpdate) / 1000; // Convert to seconds
lastUpdate = now;
// Update code background for visual effect
codeBackground.update();
if (!gameRunning || !gameStarted) {
return;
}
// Check if it's time to spawn a new problem
if (now - lastProblemTime > problemSpawnInterval) {
spawnProblem();
lastProblemTime = now;
}
// Update all problems
for (var i = 0; i < problems.length; i++) {
if (problems[i] && problems[i].update) {
problems[i].update(delta);
}
}
// Clean up problems array
cleanupProblems();
// Check level progress
checkLevelProgress();
// Randomly reduce stress (small recovery chance)
if (Math.random() < 0.001 * delta * 60 && stressLevel > 0) {
stressLevel = Math.max(0, stressLevel - 0.5);
updateStressBar();
}
// Add screen shake when stress is high
if (stressLevel >= 70 && Math.random() < 0.05) {
var intensity = (stressLevel - 70) / 30 * 20;
shakeScreen(intensity);
}
};
// Start the music (lower volume)
LK.playMusic('bgmusic');
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