User prompt
Make the fill of The start game light blue
User prompt
Make the start game button background transparent gray. Shape the corners to be rounded.
User prompt
Make the background for the START GAME button invisible.
User prompt
Remove the square from the start game
User prompt
Keep "START GAME" text the same size. Change its style to match the "I'm Fine" text. Make the button background semi-transparent gray instead of red. Round the corners of the rectangle.
User prompt
Currently the start game button is red and the start game letters are white. The Box housing the start game text is a rectangle. Keep the same size for the START GAME text but change it to look Like I'm Fine text. Make the rectangles corners round. Make the rectangle from red to transparent grey/opaque.
Code edit (1 edits merged)
Please save this source code
User prompt
Same issue !
User prompt
Before the instructions appear problems pop up ! That should not be happening.
User prompt
It's not working though !
User prompt
When I click the start game button the instructions appear. The problems should not appear when the instructions are on the screen. Only after I have tapped the screen and the instructions have disappeared !
User prompt
I should not be able to move the stress bar! Remove the drag functionality!
User prompt
ON the start game button round the corners of the box.
User prompt
Name Level to DAY
User prompt
10px to the right
User prompt
20px to the left
User prompt
50px to the left
User prompt
move the level 75 px to the left
User prompt
move the level 200px to the right.
User prompt
123 px to the right
User prompt
80px more to th eright
User prompt
move the level 400px to the right
User prompt
move the level a bit to the left lie 800px
User prompt
move the level at the center.
User prompt
move it 20 more px down
/****
* 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: 0x000000,
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) {
// Store the offset between click position and container position
dragOffsetX = self.x - x;
dragOffsetY = self.y - y;
};
self.up = function (x, y, obj) {
// Clear drag state
dragOffsetX = 0;
dragOffsetY = 0;
};
self.move = function (x, y, obj) {
// Only move if being dragged (down event happened)
if (dragOffsetX !== 0 || dragOffsetY !== 0) {
self.x = x + dragOffsetX;
self.y = y + dragOffsetY;
// Keep within screen bounds
self.x = Math.max(self.width / 2, Math.min(self.x, 2048 - self.width / 2));
self.y = Math.max(50, Math.min(self.y, 2732 - 50));
}
};
// 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("LEVEL: 1", {
size: 50,
fill: 0xFFFFFF,
stroke: 0x000000,
strokeThickness: 3
});
levelText.anchor.set(0.5, 0);
levelText.x = 2048 / 2 - 400;
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: 0xff4d4d
});
startButton.addChild(startBg);
var startText = new Text2("START GAME", {
size: 70,
fill: 0xFFFFFF,
fontWeight: 'bold'
});
startText.anchor.set(0.5, 0.5);
startText.x = 0;
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() {
if (!gameRunning || !gameStarted) 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', {
anchorX: 0.5,
anchorY: 0.5,
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 = 2048 / 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 = 2048 / 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("LEVEL: " + 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("LEVEL 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("LEVEL: 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'); ===================================================================
--- original.js
+++ change.js
@@ -597,9 +597,9 @@
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 + 610; // Position next to the status text with 580px more to the right
+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
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