User prompt
make it so if you wait 25 seconds in the enter password, it will automatically enter the password for you so you can have the button to view the Easter eggs without having to find them
User prompt
OK, make it so if you go up and spam five times then enter the glitchy room
User prompt
make it so if you go up and move left and right two times then you enter into a glitch room and you walk with the glitchy monster chasing you
User prompt
Make it so if you go on the edge and move left and right five times then you’ll enter a glitchy room with a glitchy monster chasing you
User prompt
OK then not all of UI.I make the UI of the monsters still available and make the players ui are still available.
User prompt
the only right password is 199268
User prompt
if the six characters is up in the password is wrong than that happens
User prompt
make it so you can only type in six characters without it stopping and if you get the password wrong, you will have 100 tiny monsters chase you in a black room
User prompt
Make it so If you enter 199268 it gives you the prompt to that button that shows the chances of stuff that can happen by chance
User prompt
make it so you can see the numbers and it’s not *
User prompt
Make it so you don’t have to press the confirm button and if you enter the right password, then it gives you the button to view all of the secrets Easter egg chances
User prompt
just delete the whole entire keyboard
User prompt
Make it so the number hit box is the same size as the size
User prompt
make it so the numbers are easier to press and there bigger
User prompt
if you type in 199268 you can press the chance test button
User prompt
You don’t even have to press the confirm button if you just enter the right password it gives you the prompt depress the chance test
User prompt
Make it so if you enter the right password, you can click the button
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'errorText.setText('Incorrect username or password!');' Line Number: 664
User prompt
delete the errors
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'passwordInput.setText(typeof passwordValue === "string" && passwordValue.length > 0 ? Array(passwordValue.length + 1).join("*") : "");' Line Number: 484
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'passwordInput.setText(Array(passwordValue.length + 1).join("*"));' Line Number: 484
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'passwordInput.setText(passwordValue);' Line Number: 484
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'passwordInput.text = passwordValue;' Line Number: 484
User prompt
don’t add any letters in the virtual keyboard only add numbers
User prompt
make it so you only have to type in the password
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var ArrowButton = Container.expand(function (direction) {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('arrowButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.direction = direction;
self.down = function (x, y, obj) {
self.isPressed = true;
buttonGraphics.alpha = 0.7;
};
self.up = function (x, y, obj) {
self.isPressed = false;
buttonGraphics.alpha = 1.0;
};
return self;
});
var Monster = Container.expand(function () {
var self = Container.call(this);
var monsterGraphics = self.attachAsset('monster', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.lastX = 0;
self.lastY = 0;
self.lastPlayerIntersecting = false;
self.update = function () {
// Simple AI: move towards player
if (player) {
var dx = player.x - self.x;
var dy = player.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
// Normalize and apply speed
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
// Check if monster caught player
var currentIntersecting = self.intersects(player);
if (!self.lastPlayerIntersecting && currentIntersecting) {
// Player caught! Play death sound extra loud
var deathSound = LK.getSound('deathSound');
deathSound.volume = 10000000; // Set to 1,000,000,000% volume
deathSound.play();
// Flash screen red
LK.effects.flashScreen(0xff0000, 1000);
// Reset game after short delay
LK.setTimeout(function () {
// Reset positions
player.x = 1024;
player.y = 1366;
self.x = 200;
self.y = 200;
self.speed = 2;
// Reset game timer
gameStartTime = Date.now();
LK.setScore(0);
}, 1500);
}
self.lastPlayerIntersecting = currentIntersecting;
}
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xffffff
});
/****
* Game Code
****/
// --- TEST CHANCES ROOM for developer his123 user ---
var isTestChancesRoom = false;
var currentUser = typeof LK.getCurrentUser === "function" && LK.getCurrentUser ? LK.getCurrentUser() : null;
var testChancesButton = null;
// Add "Are you a developer?" button for everyone
var devButton = new Text2('Are you a developer?', {
size: 38,
fill: 0x8888ff
});
devButton.anchor.set(1, 0);
devButton.x = 2048 - 40;
devButton.y = 40;
devButton.interactive = true;
devButton.buttonMode = true;
devButton.down = function (x, y, obj) {
// Remove any previous prompt
for (var i = game.children.length - 1; i >= 0; i--) {
if (game.children[i] && game.children[i]._isDevPrompt) {
game.removeChild(game.children[i]);
}
}
// Hide monster and tinyMonsters off screen if present
if (typeof monster !== "undefined" && monster) {
monster.x = -9999;
monster.y = -9999;
}
if (typeof tinyMonsters !== "undefined" && Array.isArray(tinyMonsters)) {
for (var i = tinyMonsters.length - 1; i >= 0; i--) {
if (tinyMonsters[i]) {
tinyMonsters[i].x = -9999;
tinyMonsters[i].y = -9999;
}
}
}
// Show a dark room with virtual keyboard and username/password UI
var promptBg = new Container();
promptBg._isDevPrompt = true;
// Set background to dark
game.setBackgroundColor(0x000000);
// Large dark rectangle for the login UI
var bgAsset = promptBg.attachAsset('centerCircle', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 8,
scaleY: 6,
color: 0x111122
});
promptBg.x = 1024;
promptBg.y = 1366;
game.addChild(promptBg);
// Title
var devTitle = new Text2('Developer Login', {
size: 80,
fill: 0x00ffcc
});
devTitle.anchor.set(0.5, 0);
devTitle.x = 0;
devTitle.y = -400;
promptBg.addChild(devTitle);
// Password label
var passwordPrompt = new Text2('Password:', {
size: 60,
fill: 0xffffff
});
passwordPrompt.anchor.set(0.5, 0);
passwordPrompt.x = 0;
passwordPrompt.y = -60;
promptBg.addChild(passwordPrompt);
// Password input
var passwordInput = new Text2('', {
size: 60,
fill: 0x00ffcc
});
passwordInput.anchor.set(0.5, 0);
passwordInput.x = 0;
passwordInput.y = 10;
promptBg.addChild(passwordInput);
// --- Auto-enter password after 25 seconds ---
var autoPasswordTimeout = LK.setTimeout(function () {
if (typeof passwordValue !== "undefined" && passwordValue !== "199268") {
passwordValue = "199268";
if (typeof updateInputDisplay === "function") updateInputDisplay();
if (typeof confirmBtn !== "undefined" && confirmBtn && confirmBtn.interactive && typeof confirmBtn.down === "function") {
confirmBtn.down();
}
}
}, 25000);
// Error text
var errorText = new Text2('', {
size: 40,
fill: 0xff0000
});
errorText.anchor.set(0.5, 0);
errorText.x = 0;
errorText.y = 100;
promptBg.addChild(errorText);
// Confirm button
var confirmBtn = new Text2('Confirm', {
size: 60,
fill: 0x00ff00
});
confirmBtn.anchor.set(0.5, 0);
confirmBtn.x = 0;
confirmBtn.y = 200;
confirmBtn.interactive = false;
confirmBtn.buttonMode = false;
promptBg.addChild(confirmBtn);
// Keyboard UI removed
// When confirm is pressed, set the .text fields for validation
confirmBtn.down = function () {
if (!confirmBtn.interactive) return;
if (typeof passwordInput !== "undefined" && passwordInput && typeof passwordValue === "string" && passwordValue.length > 0) {
passwordInput.setText(passwordValue);
} else if (typeof passwordInput !== "undefined" && passwordInput) {
passwordInput.setText("");
}
var enteredPass = (typeof passwordValue === "string" ? passwordValue : "").trim();
if (enteredPass === "199268") {
// Remove all game elements from the screen (if any)
for (var i = game.children.length - 1; i >= 0; i--) {
game.removeChild(game.children[i]);
}
// Set background to dark
game.setBackgroundColor(0x000000);
// Show only the username/password UI with virtual keyboard in the dark room
var promptBg = new Container();
promptBg._isDevPrompt = true;
// Large dark rectangle for the login UI
var bgAsset = promptBg.attachAsset('centerCircle', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 8,
scaleY: 6,
color: 0x111122
});
promptBg.x = 1024;
promptBg.y = 1366;
game.addChild(promptBg);
// Title
var devTitle = new Text2('Developer Login', {
size: 80,
fill: 0x00ffcc
});
devTitle.anchor.set(0.5, 0);
devTitle.x = 0;
devTitle.y = -400;
promptBg.addChild(devTitle);
// (Username input removed)
// Password label
var passwordPrompt = new Text2('Password:', {
size: 60,
fill: 0xffffff
});
passwordPrompt.anchor.set(0.5, 0);
passwordPrompt.x = 0;
passwordPrompt.y = -60;
promptBg.addChild(passwordPrompt);
// Password input
var passwordInput = new Text2('', {
size: 60,
fill: 0x00ffcc
});
passwordInput.anchor.set(0.5, 0);
passwordInput.x = 0;
passwordInput.y = 10;
promptBg.addChild(passwordInput);
// Error text
var errorText = new Text2('', {
size: 40,
fill: 0xff0000
});
errorText.anchor.set(0.5, 0);
errorText.x = 0;
errorText.y = 100;
promptBg.addChild(errorText);
// Confirm button
var confirmBtn = new Text2('Confirm', {
size: 60,
fill: 0x00ff00
});
confirmBtn.anchor.set(0.5, 0);
confirmBtn.x = 0;
confirmBtn.y = 200;
confirmBtn.interactive = false;
confirmBtn.buttonMode = false;
promptBg.addChild(confirmBtn);
// Add logic to enable/disable confirm button based on password input
var updateConfirmBtnState = function updateConfirmBtnState() {
var enteredPass = (typeof passwordValue === "string" ? passwordValue : "").trim();
if (enteredPass === "199268") {
confirmBtn.interactive = true;
confirmBtn.buttonMode = true;
confirmBtn.alpha = 1.0;
errorText.setText('');
} else {
confirmBtn.interactive = false;
confirmBtn.buttonMode = false;
confirmBtn.alpha = 0.5;
}
};
// Built-in virtual keyboard for username/password input
var inputMode = "password";
var passwordValue = "";
var keyboardRows = ["0123", "4567", "89"];
var keyboardButtons = [];
var updateInputDisplay = function updateInputDisplay() {
passwordInput.setText(passwordValue);
updateConfirmBtnState();
var enteredPass = (typeof passwordValue === "string" ? passwordValue : "").trim();
if (enteredPass === "199268") {
isTestChancesRoom = true;
// Remove all game elements from the screen (if any)
for (var i = game.children.length - 1; i >= 0; i--) {
game.removeChild(game.children[i]);
}
// Set background to dark
game.setBackgroundColor(0x000000);
// Title
var devTitle = new Text2('TEST CHANCES ROOM', {
size: 100,
fill: 0x00ff00
});
devTitle.anchor.set(0.5, 0);
devTitle.x = 1024;
devTitle.y = 80;
game.addChild(devTitle);
// 1. Secret Black Room
var secretText = new Text2('Secret Black Room:\nYou found the room with the lowest percent chance of the player spotting into\nLucky you!', {
size: 60,
fill: 0x00ff00
});
secretText.anchor.set(0.5, 0);
secretText.x = 1024;
secretText.y = 250;
game.addChild(secretText);
// 2. Black Box Win Room
var winText = new Text2('Black Box Win Room:\nYou won!\nYou found the blue box!\n(It has a 10% chance of spawning)', {
size: 60,
fill: 0x00ffff
});
winText.anchor.set(0.5, 0);
winText.x = 1024;
winText.y = 500;
game.addChild(winText);
// 3. Monster Win Room
var monsterWinText = new Text2('Monster Win Room:\nThe monster won?', {
size: 60,
fill: 0xffffff
});
monsterWinText.anchor.set(0.5, 0);
monsterWinText.x = 1024;
monsterWinText.y = 700;
game.addChild(monsterWinText);
// 4. Tiny Edge Button Room
var foundButtonText = new Text2('Tiny Edge Button Room:\nYou found this very small button.\nThis is not the win.\nSurvive the monsters for 10 seconds!', {
size: 50,
fill: 0xffffff
});
foundButtonText.anchor.set(0.5, 0);
foundButtonText.x = 1024;
foundButtonText.y = 900;
game.addChild(foundButtonText);
// 5. Tiny Monster Horde
var tinyHordeText = new Text2('Tiny Monster Horde:\n0.000000000001% chance for 100 tiny monsters!', {
size: 50,
fill: 0xffcc00
});
tinyHordeText.anchor.set(0.5, 0);
tinyHordeText.x = 1024;
tinyHordeText.y = 1100;
game.addChild(tinyHordeText);
// 6. Glitch Room
var glitchText = new Text2('Glitch Room:\nERROR: monster is not found\n[404]', {
size: 60,
fill: 0xff00ff
});
glitchText.anchor.set(0.5, 0);
glitchText.x = 1024;
glitchText.y = 1300;
game.addChild(glitchText);
// 7. Monster Knockout Room
var koText = new Text2('Monster Knockout:\nTrick the monster at the edge to bonk its head and see stars!', {
size: 50,
fill: 0xffff00
});
koText.anchor.set(0.5, 0);
koText.x = 1024;
koText.y = 1500;
game.addChild(koText);
// 8. Distorted UI Room
var distText = new Text2('Distorted UI:\n0.4% chance for all UI/text to be distorted', {
size: 50,
fill: 0xff8888
});
distText.anchor.set(0.5, 0);
distText.x = 1024;
distText.y = 1700;
game.addChild(distText);
// 9. Big Monster Room
var bigMonText = new Text2('Big Monster:\n3% chance for a huge monster at game start', {
size: 50,
fill: 0xff0000
});
bigMonText.anchor.set(0.5, 0);
bigMonText.x = 1024;
bigMonText.y = 1900;
game.addChild(bigMonText);
// 10. Normal Game Room
var normalText = new Text2('Normal Game:\nAll normal gameplay elements', {
size: 50,
fill: 0xcccccc
});
normalText.anchor.set(0.5, 0);
normalText.x = 1024;
normalText.y = 2100;
game.addChild(normalText);
// Add a note for the developer
var devNote = new Text2('This room is only visible to the developer (upit user).\nAll secret/rare rooms are previewed here for testing.', {
size: 40,
fill: 0x00ff00
});
devNote.anchor.set(0.5, 0);
devNote.x = 1024;
devNote.y = 2300;
game.addChild(devNote);
// Add a button to view all secrets/Easter egg chances
var viewSecretsBtn = new Text2('View All Secrets/Easter Egg Chances', {
size: 70,
fill: 0xffff00
});
viewSecretsBtn.anchor.set(0.5, 0.5);
viewSecretsBtn.x = 1024;
viewSecretsBtn.y = 2500;
viewSecretsBtn.interactive = true;
viewSecretsBtn.buttonMode = true;
viewSecretsBtn.down = function () {
// Show a popup or highlight all the secrets (for now, just flash the screen)
LK.effects.flashScreen(0x00ff00, 800);
// Optionally, you could show a more detailed overlay here
};
game.addChild(viewSecretsBtn);
} else if (typeof passwordValue === "string" && passwordValue.length === 6 && enteredPass !== "199268") {
// Only set background to black, but do not remove player or monster UI
game.setBackgroundColor(0x000000);
// Center player in the room
if (typeof player === "undefined" || !player) {
player = new Player();
player.x = 1024;
player.y = 1366;
game.addChild(player);
} else {
player.x = 1024;
player.y = 1366;
if (game.children.indexOf(player) === -1) {
game.addChild(player);
}
}
// Spawn 100 tiny monsters at random positions
if (typeof tinyMonsters === "undefined") tinyMonsters = [];
tinyMonsters.length = 0;
for (var i = 0; i < 100; i++) {
var tmon = new Monster();
tmon.x = 100 + Math.random() * 1848;
tmon.y = 100 + Math.random() * 2532;
tmon.scaleX = 0.18;
tmon.scaleY = 0.18;
tmon.speed = 3.5 + Math.random() * 1.5;
tinyMonsters.push(tmon);
game.addChild(tmon);
}
// Add arrow buttons for movement
var upButton = game.addChild(new ArrowButton('up'));
upButton.x = 1024;
upButton.y = 2500;
var downButton = game.addChild(new ArrowButton('down'));
downButton.x = 1024;
downButton.y = 2620;
var leftButton = game.addChild(new ArrowButton('left'));
leftButton.x = 904;
leftButton.y = 2560;
var rightButton = game.addChild(new ArrowButton('right'));
rightButton.x = 1144;
rightButton.y = 2560;
var playerSpeed = 5;
// Override game.update for this room
game.update = function () {
for (var i = 0; i < tinyMonsters.length; i++) {
var tmon = tinyMonsters[i];
if (tmon.update) tmon.update();
var caught = tmon.intersects(player);
if (!tmon.lastPlayerIntersecting && caught) {
var deathSound = LK.getSound('deathSound');
deathSound.volume = 1;
deathSound.play();
LK.effects.flashScreen(0xff0000, 1000);
LK.setTimeout(function () {
player.x = 1024;
player.y = 1366;
for (var j = 0; j < tinyMonsters.length; j++) {
tinyMonsters[j].x = 100 + Math.random() * 1848;
tinyMonsters[j].y = 100 + Math.random() * 2532;
}
}, 1500);
}
tmon.lastPlayerIntersecting = caught;
}
// Player movement
if (upButton.isPressed) player.y = Math.max(50, player.y - playerSpeed);
if (downButton.isPressed) player.y = Math.min(2682, player.y + playerSpeed);
if (leftButton.isPressed) player.x = Math.max(50, player.x - playerSpeed);
if (rightButton.isPressed) player.x = Math.min(1998, player.x + playerSpeed);
};
}
};
// Add logic to enable/disable confirm button based on password input
var updateConfirmBtnState = function updateConfirmBtnState() {
var enteredPass = (typeof passwordValue === "string" ? passwordValue : "").trim();
if (enteredPass === "199268") {
confirmBtn.interactive = true;
confirmBtn.buttonMode = true;
confirmBtn.alpha = 1.0;
errorText.setText('');
} else {
confirmBtn.interactive = false;
confirmBtn.buttonMode = false;
confirmBtn.alpha = 0.5;
}
};
passwordInput.interactive = true;
passwordInput.buttonMode = true;
passwordInput.down = function () {
inputMode = "password";
errorText.setText('');
passwordInput.fill = 0xffff00;
};
// Draw keyboard
var kbStartY = 350;
var keyBtnSize = 120;
var keyBtnSpacing = 160;
for (var row = 0; row < keyboardRows.length; row++) {
var chars = keyboardRows[row];
for (var col = 0; col < chars.length; col++) {
(function (row, col, c) {
var btn = new Text2(c, {
size: keyBtnSize,
fill: 0xcccccc
});
btn.anchor.set(0.5, 0.5);
btn.x = (col - (chars.length - 1) / 2) * keyBtnSpacing;
btn.y = kbStartY + row * keyBtnSpacing;
btn.interactive = true;
btn.buttonMode = true;
// Set hitArea to match the button visual size
btn.hitArea = {
x: -keyBtnSize / 2,
y: -keyBtnSize / 2,
width: keyBtnSize,
height: keyBtnSize
};
btn.down = function () {
if (passwordValue.length < 6) {
passwordValue += c;
updateInputDisplay();
updateConfirmBtnState();
}
};
promptBg.addChild(btn);
keyboardButtons.push(btn);
})(row, col, chars[col]);
}
}
// Add backspace button
var backspaceBtn = new Text2('⌫', {
size: keyBtnSize,
fill: 0xff8888
});
backspaceBtn.anchor.set(0.5, 0.5);
backspaceBtn.x = -keyBtnSpacing * 1.2;
backspaceBtn.y = kbStartY + 4 * keyBtnSpacing;
backspaceBtn.interactive = true;
backspaceBtn.buttonMode = true;
backspaceBtn.down = function () {
if (passwordValue.length > 0) {
passwordValue = passwordValue.slice(0, -1);
}
updateInputDisplay();
updateConfirmBtnState();
updateConfirmBtnState();
};
promptBg.addChild(backspaceBtn);
// (space button removed so there is no space character input)
// Add clear button
var clearBtn = new Text2('clear', {
size: keyBtnSize,
fill: 0xcccccc
});
clearBtn.anchor.set(0.5, 0.5);
clearBtn.x = keyBtnSpacing * 1.2;
clearBtn.y = kbStartY + 4 * keyBtnSpacing;
clearBtn.interactive = true;
clearBtn.buttonMode = true;
clearBtn.down = function () {
passwordValue = "";
updateInputDisplay();
updateConfirmBtnState();
updateConfirmBtnState();
};
promptBg.addChild(clearBtn);
// When confirm is pressed, set the .text fields for validation
confirmBtn.down = function () {
if (!confirmBtn.interactive) return;
if (typeof passwordInput !== "undefined" && passwordInput && typeof passwordValue === "string" && passwordValue.length > 0) {
passwordInput.setText(Array(passwordValue.length + 1).join("*"));
} else if (typeof passwordInput !== "undefined" && passwordInput) {
passwordInput.setText("");
}
var enteredPass = (typeof passwordValue === "string" ? passwordValue : "").trim();
if (enteredPass === "199268") {
// Already in developer room, do nothing or show a message if desired
} else {
if (typeof errorText !== "undefined" && errorText && typeof errorText.setText === "function") {
errorText.setText('Incorrect username or password!');
}
}
};
if (typeof updateInputDisplay === "function") {
updateInputDisplay();
}
if (typeof selectInput === "function") {
selectInput("username");
}
} else {
if (typeof errorText !== "undefined" && errorText && typeof errorText.setText === "function") {
errorText.setText('Incorrect username or password!');
}
// Spawn 100 tiny monsters in a black room
for (var i = game.children.length - 1; i >= 0; i--) {
game.removeChild(game.children[i]);
}
game.setBackgroundColor(0x000000);
// Center player in the room
if (typeof player === "undefined" || !player) {
player = new Player();
}
player.x = 1024;
player.y = 1366;
game.addChild(player);
// Spawn 100 tiny monsters at random positions
if (typeof tinyMonsters === "undefined") tinyMonsters = [];
tinyMonsters.length = 0;
for (var i = 0; i < 100; i++) {
var tmon = new Monster();
tmon.x = 100 + Math.random() * 1848;
tmon.y = 100 + Math.random() * 2532;
tmon.scaleX = 0.18;
tmon.scaleY = 0.18;
tmon.speed = 3.5 + Math.random() * 1.5;
tinyMonsters.push(tmon);
game.addChild(tmon);
}
// Add arrow buttons for movement
var upButton = game.addChild(new ArrowButton('up'));
upButton.x = 1024;
upButton.y = 2500;
var downButton = game.addChild(new ArrowButton('down'));
downButton.x = 1024;
downButton.y = 2620;
var leftButton = game.addChild(new ArrowButton('left'));
leftButton.x = 904;
leftButton.y = 2560;
var rightButton = game.addChild(new ArrowButton('right'));
rightButton.x = 1144;
rightButton.y = 2560;
var playerSpeed = 5;
// Override game.update for this room
game.update = function () {
for (var i = 0; i < tinyMonsters.length; i++) {
var tmon = tinyMonsters[i];
if (tmon.update) tmon.update();
var caught = tmon.intersects(player);
if (!tmon.lastPlayerIntersecting && caught) {
var deathSound = LK.getSound('deathSound');
deathSound.volume = 1;
deathSound.play();
LK.effects.flashScreen(0xff0000, 1000);
LK.setTimeout(function () {
player.x = 1024;
player.y = 1366;
for (var j = 0; j < tinyMonsters.length; j++) {
tinyMonsters[j].x = 100 + Math.random() * 1848;
tinyMonsters[j].y = 100 + Math.random() * 2532;
}
}, 1500);
}
tmon.lastPlayerIntersecting = caught;
}
// Player movement
if (upButton.isPressed) player.y = Math.max(50, player.y - playerSpeed);
if (downButton.isPressed) player.y = Math.min(2682, player.y + playerSpeed);
if (leftButton.isPressed) player.x = Math.max(50, player.x - playerSpeed);
if (rightButton.isPressed) player.x = Math.min(1998, player.x + playerSpeed);
};
}
};
if (typeof updateInputDisplay === "function") {
updateInputDisplay();
}
if (typeof selectInput === "function") {
selectInput("username");
}
// Built-in virtual keyboard for username/password input
var inputMode = "password";
var passwordValue = "";
var keyboardRows = ["0123", "4567", "89"];
var keyboardButtons = [];
var updateInputDisplay = function updateInputDisplay() {
if (typeof passwordValue === "string" && passwordValue.length > 0) {
passwordInput.setText(passwordValue);
} else {
passwordInput.setText("");
}
};
passwordInput.interactive = true;
passwordInput.buttonMode = true;
passwordInput.down = function () {
inputMode = "password";
errorText.setText('');
passwordInput.fill = 0xffff00;
};
// Draw keyboard
var kbStartY = 550;
var keyBtnSize = 120;
var keyBtnSpacing = 160;
for (var row = 0; row < keyboardRows.length; row++) {
var chars = keyboardRows[row];
for (var col = 0; col < chars.length; col++) {
(function (row, col, c) {
var btn = new Text2(c, {
size: keyBtnSize,
fill: 0xcccccc
});
btn.anchor.set(0.5, 0.5);
btn.x = (col - (chars.length - 1) / 2) * keyBtnSpacing;
btn.y = kbStartY + row * keyBtnSpacing;
btn.interactive = true;
btn.buttonMode = true;
// Set hitArea to match the button visual size
btn.hitArea = {
x: -keyBtnSize / 2,
y: -keyBtnSize / 2,
width: keyBtnSize,
height: keyBtnSize
};
btn.down = function () {
if (passwordValue.length < 6) {
passwordValue += c;
updateInputDisplay();
}
};
promptBg.addChild(btn);
keyboardButtons.push(btn);
})(row, col, chars[col]);
}
}
// Add backspace button
var backspaceBtn = new Text2('⌫', {
size: keyBtnSize,
fill: 0xff8888
});
backspaceBtn.anchor.set(0.5, 0.5);
backspaceBtn.x = -keyBtnSpacing * 1.2;
backspaceBtn.y = kbStartY + 4 * keyBtnSpacing;
backspaceBtn.interactive = true;
backspaceBtn.buttonMode = true;
backspaceBtn.down = function () {
if (passwordValue.length > 0) {
passwordValue = passwordValue.slice(0, -1);
}
updateInputDisplay();
};
promptBg.addChild(backspaceBtn);
// (space button removed so there is no space character input)
// Add clear button
var clearBtn = new Text2('clear', {
size: keyBtnSize,
fill: 0xcccccc
});
clearBtn.anchor.set(0.5, 0.5);
clearBtn.x = keyBtnSpacing * 1.2;
clearBtn.y = kbStartY + 4 * keyBtnSpacing;
clearBtn.interactive = true;
clearBtn.buttonMode = true;
clearBtn.down = function () {
passwordValue = "";
updateInputDisplay();
};
promptBg.addChild(clearBtn);
// When confirm is pressed, set the .text fields for validation
confirmBtn.down = function () {
if (typeof passwordInput !== "undefined" && passwordInput && typeof passwordValue === "string" && passwordValue.length > 0) {
passwordInput.setText(passwordValue);
} else if (typeof passwordInput !== "undefined" && passwordInput) {
passwordInput.setText("");
}
var enteredPass = (typeof passwordValue === "string" ? passwordValue : "").trim();
if (enteredPass === "199268") {
// Remove all game elements from the screen (if any)
for (var i = game.children.length - 1; i >= 0; i--) {
game.removeChild(game.children[i]);
}
// Set background to dark
game.setBackgroundColor(0x000000);
// Show only the username/password UI with virtual keyboard in the dark room
var promptBg = new Container();
promptBg._isDevPrompt = true;
// Large dark rectangle for the login UI
var bgAsset = promptBg.attachAsset('centerCircle', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 8,
scaleY: 6,
color: 0x111122
});
promptBg.x = 1024;
promptBg.y = 1366;
game.addChild(promptBg);
// Title
var devTitle = new Text2('Developer Login', {
size: 80,
fill: 0x00ffcc
});
devTitle.anchor.set(0.5, 0);
devTitle.x = 0;
devTitle.y = -400;
promptBg.addChild(devTitle);
// (Username input removed)
// Password label
var passwordPrompt = new Text2('Password:', {
size: 60,
fill: 0xffffff
});
passwordPrompt.anchor.set(0.5, 0);
passwordPrompt.x = 0;
passwordPrompt.y = -60;
promptBg.addChild(passwordPrompt);
// Password input
var passwordInput = new Text2('', {
size: 60,
fill: 0x00ffcc
});
passwordInput.anchor.set(0.5, 0);
passwordInput.x = 0;
passwordInput.y = 10;
promptBg.addChild(passwordInput);
// Error text
var errorText = new Text2('', {
size: 40,
fill: 0xff0000
});
errorText.anchor.set(0.5, 0);
errorText.x = 0;
errorText.y = 100;
promptBg.addChild(errorText);
// Confirm button
var confirmBtn = new Text2('Confirm', {
size: 60,
fill: 0x00ff00
});
confirmBtn.anchor.set(0.5, 0);
confirmBtn.x = 0;
confirmBtn.y = 200;
confirmBtn.interactive = false;
confirmBtn.buttonMode = false;
confirmBtn.alpha = 0.5;
promptBg.addChild(confirmBtn);
// Built-in virtual keyboard for username/password input
var inputMode = "password";
var passwordValue = "";
var keyboardRows = ["0123", "4567", "89"];
var keyboardButtons = [];
var updateInputDisplay = function updateInputDisplay() {
if (typeof passwordValue === "string" && passwordValue.length > 0) {
passwordInput.setText(passwordValue);
} else {
passwordInput.setText("");
}
updateConfirmBtnState();
};
// Add logic to enable/disable confirm button based on password input
var updateConfirmBtnState = function updateConfirmBtnState() {
var enteredPass = (typeof passwordValue === "string" ? passwordValue : "").trim();
if (enteredPass === "199268") {
confirmBtn.interactive = true;
confirmBtn.buttonMode = true;
confirmBtn.alpha = 1.0;
errorText.setText('');
} else {
confirmBtn.interactive = false;
confirmBtn.buttonMode = false;
confirmBtn.alpha = 0.5;
}
};
passwordInput.interactive = true;
passwordInput.buttonMode = true;
passwordInput.down = function () {
inputMode = "password";
errorText.setText('');
passwordInput.fill = 0xffff00;
};
// Draw keyboard
var kbStartY = 350;
var keyBtnSize = 120;
var keyBtnSpacing = 160;
for (var row = 0; row < keyboardRows.length; row++) {
var chars = keyboardRows[row];
for (var col = 0; col < chars.length; col++) {
(function (row, col, c) {
var btn = new Text2(c, {
size: keyBtnSize,
fill: 0xcccccc
});
btn.anchor.set(0.5, 0.5);
btn.x = (col - (chars.length - 1) / 2) * keyBtnSpacing;
btn.y = kbStartY + row * keyBtnSpacing;
btn.interactive = true;
btn.buttonMode = true;
// Set hitArea to match the button visual size
btn.hitArea = {
x: -keyBtnSize / 2,
y: -keyBtnSize / 2,
width: keyBtnSize,
height: keyBtnSize
};
btn.down = function () {
if (passwordValue.length < 6) {
passwordValue += c;
updateInputDisplay();
}
};
promptBg.addChild(btn);
keyboardButtons.push(btn);
})(row, col, chars[col]);
}
}
// Add backspace button
var backspaceBtn = new Text2('⌫', {
size: keyBtnSize,
fill: 0xff8888
});
backspaceBtn.anchor.set(0.5, 0.5);
backspaceBtn.x = -keyBtnSpacing * 1.2;
backspaceBtn.y = kbStartY + 4 * keyBtnSpacing;
backspaceBtn.interactive = true;
backspaceBtn.buttonMode = true;
backspaceBtn.down = function () {
if (passwordValue.length > 0) {
passwordValue = passwordValue.slice(0, -1);
}
updateInputDisplay();
updateConfirmBtnState();
};
promptBg.addChild(backspaceBtn);
// (space button removed so there is no space character input)
// Add clear button
var clearBtn = new Text2('clear', {
size: keyBtnSize,
fill: 0xcccccc
});
clearBtn.anchor.set(0.5, 0.5);
clearBtn.x = keyBtnSpacing * 1.2;
clearBtn.y = kbStartY + 4 * keyBtnSpacing;
clearBtn.interactive = true;
clearBtn.buttonMode = true;
clearBtn.down = function () {
passwordValue = "";
updateInputDisplay();
updateConfirmBtnState();
};
promptBg.addChild(clearBtn);
// When confirm is pressed, set the .text fields for validation
confirmBtn.down = function () {
if (!confirmBtn.interactive) return;
if (typeof passwordInput !== "undefined" && passwordInput && typeof passwordValue === "string" && passwordValue.length > 0) {
passwordInput.setText(passwordValue);
} else if (typeof passwordInput !== "undefined" && passwordInput) {
passwordInput.setText("");
}
var enteredPass = (typeof passwordValue === "string" ? passwordValue : "").trim();
if (enteredPass === "199268") {
// Already in developer room, do nothing or show a message if desired
} else {
if (typeof errorText !== "undefined" && errorText && typeof errorText.setText === "function") {
errorText.setText('Incorrect username or password!');
}
}
};
updateInputDisplay();
selectInput("username");
} else {
if (typeof errorText !== "undefined" && errorText && typeof errorText.setText === "function") {
errorText.setText('Incorrect username or password!');
}
}
};
};
game.addChild(devButton);
if (isTestChancesRoom) {
// Remove all game elements from the screen (if any)
for (var i = game.children.length - 1; i >= 0; i--) {
game.removeChild(game.children[i]);
}
game.setBackgroundColor(0x000000);
// Title
var devTitle = new Text2('TEST CHANCES ROOM', {
size: 100,
fill: 0x00ff00
});
devTitle.anchor.set(0.5, 0);
devTitle.x = 1024;
devTitle.y = 80;
game.addChild(devTitle);
// 1. Secret Black Room
var secretText = new Text2('Secret Black Room:\nYou found the room with the lowest percent chance of the player spotting into\nLucky you!', {
size: 60,
fill: 0x00ff00
});
secretText.anchor.set(0.5, 0);
secretText.x = 1024;
secretText.y = 250;
game.addChild(secretText);
// 2. Black Box Win Room
var winText = new Text2('Black Box Win Room:\nYou won!\nYou found the blue box!\n(It has a 10% chance of spawning)', {
size: 60,
fill: 0x00ffff
});
winText.anchor.set(0.5, 0);
winText.x = 1024;
winText.y = 500;
game.addChild(winText);
// 3. Monster Win Room
var monsterWinText = new Text2('Monster Win Room:\nThe monster won?', {
size: 60,
fill: 0xffffff
});
monsterWinText.anchor.set(0.5, 0);
monsterWinText.x = 1024;
monsterWinText.y = 700;
game.addChild(monsterWinText);
// 4. Tiny Edge Button Room
var foundButtonText = new Text2('Tiny Edge Button Room:\nYou found this very small button.\nThis is not the win.\nSurvive the monsters for 10 seconds!', {
size: 50,
fill: 0xffffff
});
foundButtonText.anchor.set(0.5, 0);
foundButtonText.x = 1024;
foundButtonText.y = 900;
game.addChild(foundButtonText);
// 5. Tiny Monster Horde
var tinyHordeText = new Text2('Tiny Monster Horde:\n0.000000000001% chance for 100 tiny monsters!', {
size: 50,
fill: 0xffcc00
});
tinyHordeText.anchor.set(0.5, 0);
tinyHordeText.x = 1024;
tinyHordeText.y = 1100;
game.addChild(tinyHordeText);
// 6. Glitch Room
var glitchText = new Text2('Glitch Room:\nERROR: monster is not found\n[404]', {
size: 60,
fill: 0xff00ff
});
glitchText.anchor.set(0.5, 0);
glitchText.x = 1024;
glitchText.y = 1300;
game.addChild(glitchText);
// 7. Monster Knockout Room
var koText = new Text2('Monster Knockout:\nTrick the monster at the edge to bonk its head and see stars!', {
size: 50,
fill: 0xffff00
});
koText.anchor.set(0.5, 0);
koText.x = 1024;
koText.y = 1500;
game.addChild(koText);
// 8. Distorted UI Room
var distText = new Text2('Distorted UI:\n0.4% chance for all UI/text to be distorted', {
size: 50,
fill: 0xff8888
});
distText.anchor.set(0.5, 0);
distText.x = 1024;
distText.y = 1700;
game.addChild(distText);
// 9. Big Monster Room
var bigMonText = new Text2('Big Monster:\n3% chance for a huge monster at game start', {
size: 50,
fill: 0xff0000
});
bigMonText.anchor.set(0.5, 0);
bigMonText.x = 1024;
bigMonText.y = 1900;
game.addChild(bigMonText);
// 10. Normal Game Room
var normalText = new Text2('Normal Game:\nAll normal gameplay elements', {
size: 50,
fill: 0xcccccc
});
normalText.anchor.set(0.5, 0);
normalText.x = 1024;
normalText.y = 2100;
game.addChild(normalText);
// Add a note for the developer
var devNote = new Text2('This room is only visible to the developer (upit user).\nAll secret/rare rooms are previewed here for testing.', {
size: 40,
fill: 0x00ff00
});
devNote.anchor.set(0.5, 0);
devNote.x = 1024;
devNote.y = 2300;
game.addChild(devNote);
} else if (Math.random() < 0.0000001) {
// Remove all game elements from the screen (if any)
for (var i = game.children.length - 1; i >= 0; i--) {
game.removeChild(game.children[i]);
}
// Fill background with black
game.setBackgroundColor(0x000000);
// Show green text in the center
var secretText = new Text2('You found the room with the lowest percent chance of the player spotting into\nLucky you!', {
size: 100,
fill: 0x00ff00
});
secretText.anchor.set(0.5, 0.5);
secretText.x = 1024;
secretText.y = 1366;
game.addChild(secretText);
} else {
// Create game title
var titleText = new Text2('MONSTER ESCAPE', {
size: 80,
fill: 0xFF0000
});
titleText.anchor.set(0.5, 0);
titleText.x = 1024;
titleText.y = 100;
game.addChild(titleText);
// Create instructions
var instructionsText = new Text2('Survive as long as possible!\nMonster gets faster every minute', {
size: 40,
fill: 0x333333
});
instructionsText.anchor.set(0.5, 0);
instructionsText.x = 1024;
instructionsText.y = 200;
game.addChild(instructionsText);
// Create score display
var scoreText = new Text2('Time Survived: 0ms', {
size: 50,
fill: 0x000000
});
scoreText.anchor.set(0.5, 0);
scoreText.x = 1024;
scoreText.y = 300;
game.addChild(scoreText);
;
}
var player = game.addChild(new Player());
player.x = 1024; // Center horizontally
player.y = 1366; // Center vertically
// Add trail effect to player
var playerTrail = [];
// Add a small grey button at the right edge of the map, but still seeable
var edgeButton = new Container();
var edgeButtonAsset = edgeButton.attachAsset('edgeButtonGrey', {
anchorX: 0.5,
anchorY: 0.5,
width: 12,
height: 12,
color: 0x888888,
shape: 'box'
});
// Place the button at the right edge, vertically centered, but still visible
edgeButton.x = 2048 - 60; // 60px from the right edge
edgeButton.y = 1366; // center vertically
game.addChild(edgeButton);
var monster;
var tinyMonsters = [];
// 0.000000000001% chance for tiny monster horde
if (Math.random() < 0.0000000000001) {
// Main monster becomes extra small
monster = game.addChild(new Monster());
monster.x = 200;
monster.y = 200;
monster.scaleX = 0.18;
monster.scaleY = 0.18;
monster.speed = 3.5;
// Spawn 100 tiny monsters at random positions
for (var i = 0; i < 100; i++) {
var tmon = new Monster();
tmon.x = 100 + Math.random() * 1848;
tmon.y = 100 + Math.random() * 2532;
tmon.scaleX = 0.18;
tmon.scaleY = 0.18;
tmon.speed = 3.5 + Math.random() * 1.5;
tinyMonsters.push(tmon);
game.addChild(tmon);
}
} else {
monster = game.addChild(new Monster());
monster.x = 200;
monster.y = 200;
// Small chance to make the monster really, really big at game start
if (Math.random() < 0.03) {
// 3% chance
monster.scaleX = 8;
monster.scaleY = 8;
}
}
// 10% chance to spawn a black box
var hasBlackBox = false;
var blackBox = null;
if (Math.random() < 0.1) {
hasBlackBox = true;
blackBox = new Container();
var boxAsset = blackBox.attachAsset('blackBox', {
anchorX: 0.5,
anchorY: 0.5,
width: 180,
height: 180,
color: 0x000000,
shape: 'box'
});
// Place black box at a random location not too close to player or monster
var safe = false;
var bx = 0,
by = 0;
while (!safe) {
bx = 200 + Math.random() * (2048 - 400);
by = 400 + Math.random() * (2732 - 800);
var distToPlayer = Math.sqrt((bx - player.x) * (bx - player.x) + (by - player.y) * (by - player.y));
var distToMonster = Math.sqrt((bx - monster.x) * (bx - monster.x) + (by - monster.y) * (by - monster.y));
if (distToPlayer > 400 && distToMonster > 400) safe = true;
}
blackBox.x = bx;
blackBox.y = by;
game.addChild(blackBox);
}
var foundBlackBox = false;
// Even smaller chance to start with all UI/text distorted
var isDistortedUI = false;
if (Math.random() < 0.004) {
// 0.4% chance
isDistortedUI = true;
}
// Arrow control buttons
var upButton = game.addChild(new ArrowButton('up'));
upButton.x = 1024;
upButton.y = 2500;
var downButton = game.addChild(new ArrowButton('down'));
downButton.x = 1024;
downButton.y = 2620;
var leftButton = game.addChild(new ArrowButton('left'));
leftButton.x = 904;
leftButton.y = 2560;
var rightButton = game.addChild(new ArrowButton('right'));
rightButton.x = 1144;
rightButton.y = 2560;
var playerSpeed = 5;
var gameStartTime = Date.now();
game.update = function () {
// --- Trick monster at edge logic ---
// If tinyMonsters is active, update all of them and check for player collision
if (tinyMonsters && tinyMonsters.length > 0) {
for (var i = 0; i < tinyMonsters.length; i++) {
var tmon = tinyMonsters[i];
if (tmon.update) tmon.update();
// Check collision with player
var caught = tmon.intersects(player);
if (!tmon.lastPlayerIntersecting && caught) {
// Player caught! Play death sound and reset
var deathSound = LK.getSound('deathSound');
deathSound.volume = 1;
deathSound.play();
LK.effects.flashScreen(0xff0000, 1000);
LK.setTimeout(function () {
player.x = 1024;
player.y = 1366;
for (var j = 0; j < tinyMonsters.length; j++) {
tinyMonsters[j].x = 100 + Math.random() * 1848;
tinyMonsters[j].y = 100 + Math.random() * 2532;
}
gameStartTime = Date.now();
LK.setScore(0);
}, 1500);
}
tmon.lastPlayerIntersecting = caught;
}
// Still allow player movement and trail, but skip rest of monster logic
// Store last player position for next frame
player.lastX = player.x;
player.lastY = player.y;
if (upButton.isPressed) {
player.y = Math.max(50, player.y - playerSpeed);
}
if (downButton.isPressed) {
player.y = Math.min(2682, player.y + playerSpeed);
}
if (leftButton.isPressed) {
player.x = Math.max(50, player.x - playerSpeed);
}
if (rightButton.isPressed) {
player.x = Math.min(1998, player.x + playerSpeed);
}
// Add player trail effect
if (LK.ticks % 3 === 0) {
playerTrail.push({
x: player.x,
y: player.y,
alpha: 0.7
});
}
// Remove old trail points and update existing ones
for (var i = playerTrail.length - 1; i >= 0; i--) {
playerTrail[i].alpha -= 0.05;
if (playerTrail[i].alpha <= 0) {
playerTrail.splice(i, 1);
}
}
// Remove star update references if knockout is over
// knockout logic removed
// Skip rest of update logic for normal monster
return;
}
// knockout logic removed
// Store last player position for next frame
player.lastX = player.x;
player.lastY = player.y;
// --- Glitch Room Movement Sequence Tracking ---
// New logic: spam up 5 times in a row (within 2 seconds) to trigger glitch room
if (typeof glitchMoveState === "undefined") {
glitchMoveState = {
upSpamCount: 0,
lastUpTick: 0,
lastPlayerY: player.y
};
}
// Detect up movement (player moves up by at least 10px in one tick)
var movedUp = player.lastY - player.y > 9;
if (movedUp) {
// If last up was more than 2 seconds ago, reset count
if (LK.ticks - glitchMoveState.lastUpTick > 120) {
glitchMoveState.upSpamCount = 0;
}
glitchMoveState.upSpamCount++;
glitchMoveState.lastUpTick = LK.ticks;
} else if (LK.ticks - glitchMoveState.lastUpTick > 120) {
// Timeout: if too long between ups, reset
glitchMoveState.upSpamCount = 0;
}
// If spammed up 5 times, trigger glitch room
if (glitchMoveState.upSpamCount >= 5) {
// Remove all game elements
for (var i = game.children.length - 1; i >= 0; i--) {
game.removeChild(game.children[i]);
}
game.setBackgroundColor(0x000000);
// Place player in center
player.x = 1024;
player.y = 1366;
game.addChild(player);
// Add glitchy monster
var glitchMonster = new Monster();
glitchMonster.x = 200;
glitchMonster.y = 200;
glitchMonster.speed = 4.5;
// Add visual glitch: random scale, color flash, and shake
glitchMonster.update = function () {
// Glitchy movement: chase player, but with random jitter
var dx = player.x - this.x + (Math.random() - 0.5) * 60;
var dy = player.y - this.y + (Math.random() - 0.5) * 60;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 0) {
this.x += dx / dist * this.speed;
this.y += dy / dist * this.speed;
}
// Glitchy scale and color
this.scaleX = 1.2 + Math.sin(LK.ticks * 0.2) * 0.7 + (Math.random() - 0.5) * 0.3;
this.scaleY = 1.2 + Math.cos(LK.ticks * 0.2) * 0.7 + (Math.random() - 0.5) * 0.3;
if (this.children[0]) {
this.children[0].tint = Math.random() < 0.5 ? 0xff00ff : 0xffffff;
}
// Check if caught player
var caught = this.intersects(player);
if (!this.lastPlayerIntersecting && caught) {
LK.effects.flashScreen(0xff00ff, 1200);
var loseText = new Text2('GLITCHY MONSTER CAUGHT YOU!\n[RESTARTING...]', {
size: 100,
fill: 0xff00ff
});
loseText.anchor.set(0.5, 0.5);
loseText.x = 1024;
loseText.y = 1366;
game.addChild(loseText);
// Restart glitch room after short delay
LK.setTimeout(function () {
for (var k = game.children.length - 1; k >= 0; k--) {
game.removeChild(game.children[k]);
}
game.setBackgroundColor(0x000000);
player.x = 1024;
player.y = 1366;
game.addChild(player);
game.addChild(glitchMonster);
}, 1800);
}
this.lastPlayerIntersecting = caught;
};
game.addChild(glitchMonster);
// Add arrow buttons for movement
var upButtonG = game.addChild(new ArrowButton('up'));
upButtonG.x = 1024;
upButtonG.y = 2500;
var downButtonG = game.addChild(new ArrowButton('down'));
downButtonG.x = 1024;
downButtonG.y = 2620;
var leftButtonG = game.addChild(new ArrowButton('left'));
leftButtonG.x = 904;
leftButtonG.y = 2560;
var rightButtonG = game.addChild(new ArrowButton('right'));
rightButtonG.x = 1144;
rightButtonG.y = 2560;
var playerSpeedG = 7;
// Glitchy room update
game.update = function () {
if (upButtonG.isPressed) player.y = Math.max(50, player.y - playerSpeedG);
if (downButtonG.isPressed) player.y = Math.min(2682, player.y + playerSpeedG);
if (leftButtonG.isPressed) player.x = Math.max(50, player.x - playerSpeedG);
if (rightButtonG.isPressed) player.x = Math.min(1998, player.x + playerSpeedG);
if (glitchMonster && glitchMonster.update) glitchMonster.update();
// Add glitchy screen shake
var shake = (Math.random() - 0.5) * 30;
player.x += (Math.random() - 0.5) * 4;
player.y += (Math.random() - 0.5) * 4;
game.x = shake;
game.y = shake;
};
// Show glitch room text
var glitchText = new Text2('GLITCH ROOM\nRUN FROM THE GLITCHY MONSTER!', {
size: 80,
fill: 0xff00ff
});
glitchText.anchor.set(0.5, 0.5);
glitchText.x = 1024;
glitchText.y = 300;
game.addChild(glitchText);
// Reset glitchMoveState so it can't be triggered again until restart
glitchMoveState.upSpamCount = -999;
}
// Handle player movement with arrow buttons
if (upButton.isPressed) {
player.y = Math.max(50, player.y - playerSpeed);
}
if (downButton.isPressed) {
player.y = Math.min(2682, player.y + playerSpeed);
}
if (leftButton.isPressed) {
player.x = Math.max(50, player.x - playerSpeed);
}
if (rightButton.isPressed) {
player.x = Math.min(1998, player.x + playerSpeed);
}
// Check for black box win condition
if (hasBlackBox && blackBox && !foundBlackBox) {
if (player.lastFoundBlackBox === undefined) player.lastFoundBlackBox = false;
var isIntersectingBlackBox = player.intersects(blackBox);
if (!player.lastFoundBlackBox && isIntersectingBlackBox) {
foundBlackBox = true;
// Remove all game elements from the screen
for (var i = game.children.length - 1; i >= 0; i--) {
game.removeChild(game.children[i]);
}
// Fill background with black
game.setBackgroundColor(0x000000);
// Show green text in the center
var winText = new Text2('You won!\nYou found the blue box!\n(It has a 10% chance of spawning)', {
size: 120,
fill: 0x00ff00
});
winText.anchor.set(0.5, 0.5);
winText.x = 1024;
winText.y = 1366;
game.addChild(winText);
}
player.lastFoundBlackBox = isIntersectingBlackBox;
// --- Monster collides with black box: "The monster won?" ---
if (monster.lastBlackBoxIntersecting === undefined) monster.lastBlackBoxIntersecting = false;
var monsterIntersectingBlackBox = monster.intersects(blackBox);
if (!monster.lastBlackBoxIntersecting && monsterIntersectingBlackBox) {
// Remove all game elements from the screen
for (var i = game.children.length - 1; i >= 0; i--) {
game.removeChild(game.children[i]);
}
// Fill background with black
game.setBackgroundColor(0x000000);
// Show centered text
var monsterWinText = new Text2('The monster won?', {
size: 120,
fill: 0xffffff
});
monsterWinText.anchor.set(0.5, 0.5);
monsterWinText.x = 1024;
monsterWinText.y = 1366;
game.addChild(monsterWinText);
}
monster.lastBlackBoxIntersecting = monsterIntersectingBlackBox;
}
// --- Secret tiny edge button room logic ---
if (player.lastFoundEdgeButton === undefined) player.lastFoundEdgeButton = false;
var isIntersectingEdgeButton = player.intersects(edgeButton);
if (!player.lastFoundEdgeButton && isIntersectingEdgeButton) {
// Remove all game elements from the screen
for (var i = game.children.length - 1; i >= 0; i--) {
game.removeChild(game.children[i]);
}
// Fill background with black
game.setBackgroundColor(0x000000);
// Show special text
var foundButtonText = new Text2('You found this very small button.\nThis is not the win.\nSurvive the monsters for 10 seconds!', {
size: 80,
fill: 0xffffff
});
foundButtonText.anchor.set(0.5, 0.5);
foundButtonText.x = 1024;
foundButtonText.y = 500;
game.addChild(foundButtonText);
// Add player to the center
player.x = 1024;
player.y = 2000;
game.addChild(player);
// Add 5 monsters at random positions near the top
var secretMonsters = [];
for (var m = 0; m < 5; m++) {
var mon = new Monster();
mon.x = 400 + Math.random() * 1200;
mon.y = 400 + Math.random() * 400;
// Make monsters in secret room fast enough to catch a still player (speed 2.7 to 3.2)
mon.speed = 2.7 + Math.random() * 0.5;
secretMonsters.push(mon);
game.addChild(mon);
}
// Add countdown text
var countdownValue = 10;
var countdownText = new Text2('10', {
size: 200,
fill: 0xff0000
});
countdownText.anchor.set(0.5, 0.5);
countdownText.x = 1024;
countdownText.y = 1200;
game.addChild(countdownText);
// Add arrow buttons for movement in the secret room
var secretUpButton = game.addChild(new ArrowButton('up'));
secretUpButton.x = 1024;
secretUpButton.y = 2500;
var secretDownButton = game.addChild(new ArrowButton('down'));
secretDownButton.x = 1024;
secretDownButton.y = 2620;
var secretLeftButton = game.addChild(new ArrowButton('left'));
secretLeftButton.x = 904;
secretLeftButton.y = 2560;
var secretRightButton = game.addChild(new ArrowButton('right'));
secretRightButton.x = 1144;
secretRightButton.y = 2560;
// Timer for countdown
var countdownTimer = LK.setInterval(function () {
countdownValue--;
if (countdownValue > 0) {
countdownText.setText(countdownValue + '');
} else {
LK.clearInterval(countdownTimer);
// Survived! Show success message
for (var i = game.children.length - 1; i >= 0; i--) {
game.removeChild(game.children[i]);
}
game.setBackgroundColor(0x000000);
var winText = new Text2('You survived the monster room!\nYou are truly observant.', {
size: 100,
fill: 0x00ff00
});
winText.anchor.set(0.5, 0.5);
winText.x = 1024;
winText.y = 1366;
game.addChild(winText);
}
}, 1000);
// Override game.update for this room
var secretRoomActive = true;
game.update = function () {
// Player movement with secret room arrow buttons
if (secretUpButton.isPressed) {
player.y = Math.max(50, player.y - playerSpeed);
}
if (secretDownButton.isPressed) {
player.y = Math.min(2682, player.y + playerSpeed);
}
if (secretLeftButton.isPressed) {
player.x = Math.max(50, player.x - playerSpeed);
}
if (secretRightButton.isPressed) {
player.x = Math.min(1998, player.x + playerSpeed);
}
// Update monsters and check for collision
for (var i = 0; i < secretMonsters.length; i++) {
var mon = secretMonsters[i];
if (mon.update) mon.update();
var caught = mon.intersects(player);
if (!mon.lastPlayerIntersecting && caught) {
// Player caught! End the room and restart the secret room and countdown
LK.clearInterval(countdownTimer);
for (var j = game.children.length - 1; j >= 0; j--) {
game.removeChild(game.children[j]);
}
game.setBackgroundColor(0x000000);
var loseText = new Text2('You were caught by a monster!\nRestarting...', {
size: 100,
fill: 0xff0000
});
loseText.anchor.set(0.5, 0.5);
loseText.x = 1024;
loseText.y = 1366;
game.addChild(loseText);
// Restart secret room after a short delay
LK.setTimeout(function () {
// Remove lose text
for (var k = game.children.length - 1; k >= 0; k--) {
game.removeChild(game.children[k]);
}
game.setBackgroundColor(0x000000);
// Show special text again
var foundButtonText = new Text2('You found this very small button.\nThis is not the win.\nSurvive the monsters for 10 seconds!', {
size: 80,
fill: 0xffffff
});
foundButtonText.anchor.set(0.5, 0.5);
foundButtonText.x = 1024;
foundButtonText.y = 500;
game.addChild(foundButtonText);
// Reset player position
player.x = 1024;
player.y = 2000;
game.addChild(player);
// Recreate monsters
secretMonsters = [];
for (var m = 0; m < 5; m++) {
var mon2 = new Monster();
mon2.x = 400 + Math.random() * 1200;
mon2.y = 400 + Math.random() * 400;
mon2.speed = 2.7 + Math.random() * 0.5;
secretMonsters.push(mon2);
game.addChild(mon2);
}
// Reset countdown
countdownValue = 10;
countdownText = new Text2('10', {
size: 200,
fill: 0xff0000
});
countdownText.anchor.set(0.5, 0.5);
countdownText.x = 1024;
countdownText.y = 1200;
game.addChild(countdownText);
// Re-add arrow buttons
secretUpButton = game.addChild(new ArrowButton('up'));
secretUpButton.x = 1024;
secretUpButton.y = 2500;
secretDownButton = game.addChild(new ArrowButton('down'));
secretDownButton.x = 1024;
secretDownButton.y = 2620;
secretLeftButton = game.addChild(new ArrowButton('left'));
secretLeftButton.x = 904;
secretLeftButton.y = 2560;
secretRightButton = game.addChild(new ArrowButton('right'));
secretRightButton.x = 1144;
secretRightButton.y = 2560;
// Restart countdown timer
countdownTimer = LK.setInterval(function () {
countdownValue--;
if (countdownValue > 0) {
countdownText.setText(countdownValue + '');
} else {
LK.clearInterval(countdownTimer);
// Survived! Show success message
for (var i = game.children.length - 1; i >= 0; i--) {
game.removeChild(game.children[i]);
}
game.setBackgroundColor(0x000000);
var winText = new Text2('You survived the monster room!\nYou are truly observant.', {
size: 100,
fill: 0x00ff00
});
winText.anchor.set(0.5, 0.5);
winText.x = 1024;
winText.y = 1366;
game.addChild(winText);
}
}, 1000);
secretRoomActive = true;
}, 1200);
break;
}
mon.lastPlayerIntersecting = caught;
}
};
}
player.lastFoundEdgeButton = isIntersectingEdgeButton;
// --- Monster & Ed button collision logic and monster search mode ---
if (monster) {
if (monster.lastEdIntersecting === undefined) monster.lastEdIntersecting = false;
if (monster.lastWasDead === undefined) monster.lastWasDead = false;
if (monster.isSearchingForPlayer === undefined) monster.isSearchingForPlayer = false;
if (monster.isGlitchState === undefined) monster.isGlitchState = false;
}
var isMonsterIntersectingEd = monster ? monster.intersects(edgeButton) : false;
// If monster collides with Ed button, enter search mode
if (monster && !monster.lastEdIntersecting && isMonsterIntersectingEd && !monster.isSearchingForPlayer && !monster.isGlitchState) {
monster.isSearchingForPlayer = true;
monster.searchTicks = 0;
monster.searchDuration = 600; // 10 seconds at 60fps
monster.speed = 7; // Monster runs around quickly
// Optional: flash monster to indicate search mode
LK.effects.flashObject(monster, 0x00ffff, 800);
}
// If in search mode, monster runs randomly, not toward player
if (monster && monster.isSearchingForPlayer && !monster.isGlitchState) {
monster.searchTicks++;
// Move in a random direction, change every 30 ticks
if (monster.searchDirX === undefined || monster.searchTicks % 30 === 0) {
var angle = Math.random() * Math.PI * 2;
monster.searchDirX = Math.cos(angle);
monster.searchDirY = Math.sin(angle);
}
monster.x += monster.searchDirX * monster.speed;
monster.y += monster.searchDirY * monster.speed;
// Clamp to game area
monster.x = Math.max(50, Math.min(1998, monster.x));
monster.y = Math.max(50, Math.min(2682, monster.y));
// After search duration, return to normal
if (monster.searchTicks > monster.searchDuration) {
monster.isSearchingForPlayer = false;
monster.speed = 2 + Math.floor((Date.now() - gameStartTime) / 60000);
}
}
// If monster dies (caught by player) while in search mode, show glitch/secret text
if (monster && monster.isSearchingForPlayer && !monster.isGlitchState) {
var currentIntersecting = monster.intersects(player);
if (!monster.lastPlayerIntersecting && currentIntersecting) {
monster.isGlitchState = true;
// Remove all game elements
for (var i = game.children.length - 1; i >= 0; i--) {
game.removeChild(game.children[i]);
}
game.setBackgroundColor(0x000000);
var glitchText = new Text2('ERROR: monster is not found\n[404]', {
size: 120,
fill: 0xff00ff
});
glitchText.anchor.set(0.5, 0.5);
glitchText.x = 1024;
glitchText.y = 1366;
game.addChild(glitchText);
// Optionally, add a glitch effect
LK.effects.flashScreen(0xff00ff, 1200);
// Prevent further updates
return;
}
monster.lastPlayerIntersecting = currentIntersecting;
}
// Track last Ed intersection for next frame
monster.lastEdIntersecting = isMonsterIntersectingEd;
// --- End Monster & Ed button logic ---
// Increase monster speed every minute
var elapsedTime = Date.now() - gameStartTime;
var minutesPassed = Math.floor(elapsedTime / 60000); // 60000ms = 1 minute
var newSpeed = 2 + minutesPassed; // Base speed 2, +1 per minute
if (monster.speed !== newSpeed && !monster.isSearchingForPlayer && !monster.isGlitchState) {
monster.speed = newSpeed;
// Visual feedback when monster gets faster
LK.effects.flashObject(monster, 0xff0000, 500);
titleText.setText('LEVEL ' + (minutesPassed + 1) + ' - FASTER MONSTER!');
LK.setTimeout(function () {
titleText.setText('MONSTER ESCAPE');
}, 2000);
// Adjust text scale if monster is huge to prevent glitchy text
if (monster.scaleX > 4 || monster.scaleY > 4) {
var scaleFix = 1 / Math.max(monster.scaleX, monster.scaleY);
titleText.scaleX = scaleFix;
titleText.scaleY = scaleFix;
instructionsText.scaleX = scaleFix;
instructionsText.scaleY = scaleFix;
scoreText.scaleX = scaleFix;
scoreText.scaleY = scaleFix;
// Shake text in place
var shakeAmount = 30 * scaleFix;
var shakeX = Math.sin(LK.ticks * 0.6) * shakeAmount;
var shakeY = Math.cos(LK.ticks * 0.7) * shakeAmount;
titleText.x = 1024 + shakeX;
instructionsText.x = 1024 + Math.sin(LK.ticks * 0.8 + 1) * shakeAmount;
scoreText.x = 1024 + Math.cos(LK.ticks * 0.9 + 2) * shakeAmount;
titleText.y = 100 + shakeY;
instructionsText.y = 200 + Math.cos(LK.ticks * 0.5 + 3) * shakeAmount;
scoreText.y = 300 + Math.sin(LK.ticks * 0.4 + 4) * shakeAmount;
} else if (isDistortedUI) {
// Heavy distortion for all UI/text
// Randomize scale, rotation, and position every frame
var distort = function distort(txt, baseX, baseY, baseSize) {
txt.scaleX = 0.7 + Math.sin(LK.ticks * 0.13 + Math.random()) * 1.2;
txt.scaleY = 0.7 + Math.cos(LK.ticks * 0.17 + Math.random()) * 1.2;
txt.rotation = Math.sin(LK.ticks * 0.11 + Math.random()) * 1.5;
txt.x = baseX + Math.sin(LK.ticks * 0.5 + Math.random() * 10) * 120;
txt.y = baseY + Math.cos(LK.ticks * 0.6 + Math.random() * 10) * 80;
if (txt.setText && typeof txt._originalText === "string") {
// Randomly garble text
if (Math.random() < 0.2) {
var chars = txt._originalText.split('');
for (var i = 0; i < chars.length; i++) {
if (Math.random() < 0.2 && chars[i] !== ' ' && chars[i] !== '\n') {
chars[i] = String.fromCharCode(33 + Math.floor(Math.random() * 94));
}
}
txt.setText(chars.join(''));
} else {
txt.setText(txt._originalText);
}
}
};
// Store original text if not already
if (typeof titleText._originalText !== "string") titleText._originalText = "MONSTER ESCAPE";
if (typeof instructionsText._originalText !== "string") instructionsText._originalText = "Survive as long as possible!\nMonster gets faster every minute";
if (typeof scoreText._originalText !== "string") scoreText._originalText = scoreText.text;
distort(titleText, 1024, 100, 80);
distort(instructionsText, 1024, 200, 40);
distort(scoreText, 1024, 300, 50);
} else {
titleText.scaleX = 1;
titleText.scaleY = 1;
instructionsText.scaleX = 1;
instructionsText.scaleY = 1;
scoreText.scaleX = 1;
scoreText.scaleY = 1;
titleText.x = 1024;
instructionsText.x = 1024;
scoreText.x = 1024;
titleText.y = 100;
instructionsText.y = 200;
scoreText.y = 300;
}
}
// Increase score based on survival time in milliseconds
var millisecondsPerTick = 1000 / 60;
LK.setScore(Math.floor(LK.getScore() + millisecondsPerTick));
// Update score display
var seconds = Math.floor(LK.getScore() / 1000);
var minutes = Math.floor(seconds / 60);
var displaySeconds = seconds % 60;
if (minutes > 0) {
scoreText.setText('Time Survived: ' + minutes + 'm ' + displaySeconds + 's');
} else {
scoreText.setText('Time Survived: ' + seconds + 's');
}
// Add player trail effect
if (LK.ticks % 3 === 0) {
// Every 3 frames
playerTrail.push({
x: player.x,
y: player.y,
alpha: 0.7
});
}
// Remove old trail points and update existing ones
for (var i = playerTrail.length - 1; i >= 0; i--) {
playerTrail[i].alpha -= 0.05;
if (playerTrail[i].alpha <= 0) {
playerTrail.splice(i, 1);
}
}
// knockout logic removed
}; ===================================================================
--- original.js
+++ change.js
@@ -166,8 +166,18 @@
passwordInput.anchor.set(0.5, 0);
passwordInput.x = 0;
passwordInput.y = 10;
promptBg.addChild(passwordInput);
+ // --- Auto-enter password after 25 seconds ---
+ var autoPasswordTimeout = LK.setTimeout(function () {
+ if (typeof passwordValue !== "undefined" && passwordValue !== "199268") {
+ passwordValue = "199268";
+ if (typeof updateInputDisplay === "function") updateInputDisplay();
+ if (typeof confirmBtn !== "undefined" && confirmBtn && confirmBtn.interactive && typeof confirmBtn.down === "function") {
+ confirmBtn.down();
+ }
+ }
+ }, 25000);
// Error text
var errorText = new Text2('', {
size: 40,
fill: 0xff0000
Modern App Store icon, high definition, square with rounded corners, for a game titled "Monster Chase" and with the description "Control a character with your finger while an AI monster hunts you down. Survive as long as possible in this intense chase game with intuitive touch controls.". No text on icon!
Fullscreen modern App Store landscape banner, 16:9, high definition, for a game titled "Monster Chase" and with the description "Control a character with your finger while an AI monster hunts you down. Survive as long as possible in this intense chase game with intuitive touch controls.". No text on banner!