User prompt
Please fix the bug: 'null is not an object (evaluating 'tomato.x = 1024')' in or related to this line: 'tomato.x = 1024;' Line Number: 1560
User prompt
Please fix the bug: 'null is not an object (evaluating 'tomato.setCreepy')' in or related to this line: 'tomato.setCreepy();' Line Number: 1557
User prompt
Please fix the bug: 'null is not an object (evaluating 'tomato.setCreepy')' in or related to this line: 'tomato.setCreepy();' Line Number: 1550
User prompt
Please fix the bug: 'null is not an object (evaluating 'tomato.setCreepy')' in or related to this line: 'tomato.setCreepy();' Line Number: 1548
User prompt
Please fix the bug: 'null is not an object (evaluating 'messageTxt.setText')' in or related to this line: 'messageTxt.setText("");' Line Number: 1535
User prompt
Please fix the bug: 'null is not an object (evaluating 'messageTxt.setText')' in or related to this line: 'messageTxt.setText("");' Line Number: 1529
User prompt
Please fix the bug: 'null is not an object (evaluating 'messageTxt.setText')' in or related to this line: 'messageTxt.setText("");' Line Number: 1521
User prompt
Please fix the bug: 'null is not an object (evaluating 'messageTxt.setText')' in or related to this line: 'messageTxt.setText("");' Line Number: 1519
User prompt
Please fix the bug: 'null is not an object (evaluating 'stateTxt.visible = false')' in or related to this line: 'stateTxt.visible = false;' Line Number: 961
User prompt
Please fix the bug: 'null is not an object (evaluating 'scoreTxt.setText')' in or related to this line: 'scoreTxt.setText('0 / ' + maxCorrect);' Line Number: 952
User prompt
make sure there’s a one percent chance that there will be text that shows up that says you’re permanently banned from this game and there’s no buttons whatsoever. There’s no console and there’s no shop there’s only the text that says don’t banned from this game in red color and if you restart, it’s the same thing ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
remove the code that has anything to do with text saying your banned from this game
User prompt
Please fix the bug: 'null is not an object (evaluating 'shopBtn.down = function (x, y, obj) { __$(173); if (shopOverlay) { __$(175); return; } __$(176); shopOverlay = new Container(); __$(177); game.addChild(shopOverlay); // Dimmed background __$(178); var shopBg = LK.getAsset('table', { anchorX: 0.5, anchorY: 0.5, scaleX: 20, scaleY: 30, x: 1024, y: 1366 }); __$(179); shopBg.tint = 0x222222; __$(180); shopBg.alpha = 0.85; __$(181); shopOverlay.addChild(shopBg); // Shop title __$(182); var shopTitle = new Text2('Shop', { size: 160, fill: 0xffffff }); __$(183); shopTitle.anchor.set(0.5, 0.5); __$(184); shopTitle.x = 1024; __$(185); shopTitle.y = 400; __$(186); shopOverlay.addChild(shopTitle); // Knives icon __$(187); var knifeIcon = LK.getAsset('fork', { anchorX: 0.5, anchorY: 0.5, x: 900, y: 700, scaleX: 1.2, scaleY: 1.2 }); __$(188); shopOverlay.addChild(knifeIcon); // Knives label __$(189); var knifeLabel = new Text2('Knives: ' + shopKnives, { size: 90, fill: 0xffffff }); __$(190); knifeLabel.anchor.set(0, 0.5); __$(191); knifeLabel.x = 1000; __$(192); knifeLabel.y = 700; __$(193); shopOverlay.addChild(knifeLabel); // Buy knife button __$(194); var buyBtn = new Text2('Buy Knife (Free!)', { size: 80, fill: 0x00ff00 }); __$(195); buyBtn.anchor.set(0.5, 0.5); __$(196); buyBtn.x = 1024; __$(197); buyBtn.y = 950; __$(198); shopOverlay.addChild(buyBtn); __$(199); buyBtn.down = function () { __$(200); shopKnives++; __$(201); storage.knives = shopKnives; __$(202); knifeLabel.setText('Knives: ' + shopKnives); __$(203); showMessage("You bought a knife!"); }; // --- ID SHOP ITEM --- // Only allow one free ID ever __$(204); var hasId = !!storage.hasId; __$(205); var idIcon = LK.getAsset('googleBlock', { anchorX: 0.5, anchorY: 0.5, x: 900, y: 1050, scaleX: 0.18, scaleY: 0.18 }); __$(206); shopOverlay.addChild(idIcon); __$(207); var idLabel = new Text2('ID: ' + (hasId ? 'Owned' : 'Not owned'), { size: 90, fill: 0xffffff }); __$(208); idLabel.anchor.set(0, 0.5); __$(209); idLabel.x = 1000; __$(210); idLabel.y = 1050; __$(211); shopOverlay.addChild(idLabel); __$(212); var buyIdBtn = new Text2(hasId ? 'ID Claimed' : 'Claim ID (Free!)', { size: 80, fill: hasId ? 0x888888 : 0x00ffff }); __$(213); buyIdBtn.anchor.set(0.5, 0.5); __$(214); buyIdBtn.x = 1024; __$(215); buyIdBtn.y = 1200; __$(216); shopOverlay.addChild(buyIdBtn); __$(217); buyIdBtn.down = function () { __$(218); if (!hasId) { __$(219); storage.hasId = true; __$(220); hasId = true; __$(221); idLabel.setText('ID: Owned'); __$(222); buyIdBtn.setText('ID Claimed'); __$(223); buyIdBtn.fill = 0x888888; __$(224); showMessage("You got the ID! Try the console..."); } else { __$(225); showMessage("You already have the ID."); } }; // Use knife button __$(226); var useKnifeBtn = new Text2('Use Knife', { size: 80, fill: 0xff0000 }); __$(227); useKnifeBtn.anchor.set(0.5, 0.5); __$(228); useKnifeBtn.x = 1024; __$(229); useKnifeBtn.y = 1350; __$(230); shopOverlay.addChild(useKnifeBtn); __$(231); useKnifeBtn.down = function () { __$(232); if (shopKnives > 0 && tomato && !isHaunted && game.state !== 'jumpscare' && game.state !== 'haunt' && game.state !== 'blocked') { __$(233); shopKnives--; __$(234); storage.knives = shopKnives; __$(235); knifeLabel.setText('Knives: ' + shopKnives); __$(236); shopOverlay.destroy(); __$(237); shopOverlay = null; __$(238); stabTomato(); } else if (shopKnives <= 0) { __$(239); showMessage("You have no knives!"); } }; // Close button __$(240); var closeBtn = new Text2('Close', { size: 80, fill: 0xff4444 }); __$(241); closeBtn.anchor.set(0.5, 0.5); __$(242); closeBtn.x = 1024; __$(243); closeBtn.y = 1500; __$(244); shopOverlay.addChild(closeBtn); __$(245); closeBtn.down = function () { __$(246); if (shopOverlay) { __$(247); shopOverlay.destroy(); __$(248); shopOverlay = null; } }; }')' in or related to this line: 'shopBtn.down = function (x, y, obj) {' Line Number: 413
User prompt
make it so there’s no console button or shop button if you get banned ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
make that a 99% chance of happenin
User prompt
not like there’s a chance for the tomato to spine in and he will say never come back and next time you leave the game I’ll just say you’ll permanently banned ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Make that a 99% chance ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
They so there’s a one percent chance of having the tomato say never come back ever again and next time you load into the game, they’ll be texting. You’re banned from this game and read text and there’s no button at all except the black background with your banned from this game. ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'null is not an object (evaluating 'messageTxt.setText')' in or related to this line: 'messageTxt.setText("");' Line Number: 1855
User prompt
Please fix the bug: 'null is not an object (evaluating 'messageTxt.setText')' in or related to this line: 'messageTxt.setText("");' Line Number: 1855
User prompt
Please fix the bug: 'null is not an object (evaluating 'messageTxt.setText')' in or related to this line: 'messageTxt.setText("");' Line Number: 1855
User prompt
Please fix the bug: 'null is not an object (evaluating 'messageTxt.setText')' in or related to this line: 'messageTxt.setText("");' Line Number: 1853
User prompt
Please fix the bug: 'null is not an object (evaluating 'messageTxt.setText')' in or related to this line: 'messageTxt.setText("");' Line Number: 1851
User prompt
Please fix the bug: 'null is not an object (evaluating 'messageTxt.setText')' in or related to this line: 'messageTxt.setText("");' Line Number: 1851
User prompt
Please fix the bug: 'null is not an object (evaluating 'messageTxt.setText')' in or related to this line: 'messageTxt.setText("");' Line Number: 1851
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { creepy: false }); /**** * Classes ****/ // Food class var Food = Container.expand(function () { var self = Container.call(this); self.foodId = null; self.isGood = true; self.isCreepy = false; self.asset = null; self.eaten = false; self.init = function (foodId, isGood, isCreepy) { self.foodId = foodId; self.isGood = isGood; self.isCreepy = isCreepy; self.asset = self.attachAsset(foodId, { anchorX: 0.5, anchorY: 0.5 }); }; // Animate food being eaten self.eat = function (_onFinish) { if (self.eaten) return; self.eaten = true; tween(self, { scaleX: 0, scaleY: 0, alpha: 0 }, { duration: 350, easing: tween.easeIn, onFinish: function onFinish() { if (_onFinish) _onFinish(); self.destroy(); } }); }; // Touch event self.down = function (x, y, obj) { if (game.state !== 'playing' && game.state !== 'creepy') return; game.handleFoodSelect(self); }; return self; }); // Knife class var Knife = Container.expand(function () { var self = Container.call(this); self.asset = self.attachAsset('fork', { anchorX: 0.5, anchorY: 0.5 }); self.stabbing = false; self.target = null; self.update = function () { // Animate knife toward tomato if stabbing if (self.stabbing && self.target) { var dx = self.target.x - self.x; var dy = self.target.y - 120 - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 30) { self.x += dx * 0.25; self.y += dy * 0.25; self.rotation = Math.atan2(dy, dx) + Math.PI / 2; } else { // Hit! self.stabbing = false; self.visible = false; if (typeof self.onStab === "function") self.onStab(); self.destroy(); } } }; return self; }); // Tomato class var Tomato = Container.expand(function () { var self = Container.call(this); self.face = null; self.creepy = false; self.jumpscare = false; self.init = function () { self.face = self.attachAsset('tomatoNormal', { anchorX: 0.5, anchorY: 1 }); }; self.setNormal = function () { self.creepy = false; self.jumpscare = false; self.face.assetId = 'tomatoNormal'; self.face.setAsset('tomatoNormal'); }; self.setCreepy = function () { self.creepy = true; self.jumpscare = false; self.face.assetId = 'tomatoCreepy'; self.face.setAsset('tomatoCreepy'); }; self.setJumpscare = function () { self.jumpscare = true; self.face.assetId = 'tomatoJumpscare'; self.face.setAsset('tomatoJumpscare'); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xf7e7c1 }); /**** * Game Code ****/ // Map food ids to voice sound ids for "give me X" lines // placeholder id // placeholder id // placeholder id // placeholder id // placeholder id // Music // Sounds // Creepy foods // Bad foods // Good foods // Spoon // Fork // Plate // Table // Tomato (jumpscare) // Tomato (creepy) // Tomato (normal) // --- GLOBALS --- var foodVoiceMap = { foodApple: 'appleVoice', foodBread: 'breadVoice', foodCheese: 'cheeseVoice', foodEgg: 'eggVoice', foodCarrot: 'carrotVoice' }; var tomato = null; var table = null; var plate = null; var utensils = []; var foodObjs = []; var foodSlots = []; var messageTxt = null; var scoreTxt = null; var stateTxt = null; var jumpscareTimeout = null; var mistakeCount = 0; var correctCount = 0; var maxMistakes = 10; var maxCorrect = 10; var isJumpscare = false; var isHaunted = false; var lastFoodIds = []; var creepyFoodsFed = 0; var creepyFoodsNeeded = 3; var foodY = 2000; var foodSlotY = 2000; var foodSlotXStart = 524; var foodSlotSpacing = 250; var foodSlotCount = 5; var foodTypes = [{ id: 'foodApple', isGood: true, isCreepy: false }, { id: 'foodCheese', isGood: true, isCreepy: false }, { id: 'foodBread', isGood: true, isCreepy: false }, { id: 'foodEgg', isGood: true, isCreepy: false }, { id: 'foodCarrot', isGood: true, isCreepy: false }, { id: 'foodSoap', isGood: false, isCreepy: false }, { id: 'foodRock', isGood: false, isCreepy: false }, { id: 'foodBattery', isGood: false, isCreepy: false }, { id: 'foodShoe', isGood: false, isCreepy: false }, { id: 'foodBug', isGood: false, isCreepy: false }]; var creepyFoodTypes = [{ id: 'foodEyeball', isGood: false, isCreepy: true }, { id: 'foodWorm', isGood: false, isCreepy: true }, { id: 'foodFingertip', isGood: false, isCreepy: true }, { id: 'foodTooth', isGood: false, isCreepy: true }, { id: 'foodHeart', isGood: false, isCreepy: true }]; // --- HAUNTED STATE --- if (storage.creepy) { isHaunted = true; } // --- SETUP SCENE --- function setupScene() { // Table table = LK.getAsset('table', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 2200 }); game.addChild(table); // Plate plate = LK.getAsset('plate', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 2100 }); game.addChild(plate); // Utensils var fork = LK.getAsset('fork', { anchorX: 0.5, anchorY: 0.5, x: 900, y: 2180 }); var spoon = LK.getAsset('spoon', { anchorX: 0.5, anchorY: 0.5, x: 1150, y: 2180 }); utensils = [fork, spoon]; game.addChild(fork); game.addChild(spoon); // Tomato tomato = new Tomato(); tomato.init(); tomato.x = 1024; tomato.y = 900; game.addChild(tomato); // Message text messageTxt = new Text2('', { size: 90, fill: 0x222222 }); messageTxt.anchor.set(0.5, 0); LK.gui.top.addChild(messageTxt); // Score text (hidden, but used for state) scoreTxt = new Text2('0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.topRight.addChild(scoreTxt); // Console button var consoleBtn = new Text2('console', { size: 60, fill: 0x333333 }); consoleBtn.anchor.set(1, 0); consoleBtn.x = -20; consoleBtn.y = 20; LK.gui.topRight.addChild(consoleBtn); // Shop button var shopBtn = new Text2('shop', { size: 60, fill: 0x333333 }); shopBtn.anchor.set(1, 0); shopBtn.x = -20; shopBtn.y = 110; LK.gui.topRight.addChild(shopBtn); // --- SHOP STATE --- var shopOverlay = null; var shopKnives = typeof storage.knives === "number" ? storage.knives : 0; // Shop button handler shopBtn.down = function (x, y, obj) { if (shopOverlay) return; shopOverlay = new Container(); game.addChild(shopOverlay); // Dimmed background var shopBg = LK.getAsset('table', { anchorX: 0.5, anchorY: 0.5, scaleX: 20, scaleY: 30, x: 1024, y: 1366 }); shopBg.tint = 0x222222; shopBg.alpha = 0.85; shopOverlay.addChild(shopBg); // Shop title var shopTitle = new Text2('Shop', { size: 160, fill: 0xffffff }); shopTitle.anchor.set(0.5, 0.5); shopTitle.x = 1024; shopTitle.y = 400; shopOverlay.addChild(shopTitle); // Knives icon var knifeIcon = LK.getAsset('fork', { anchorX: 0.5, anchorY: 0.5, x: 900, y: 700, scaleX: 1.2, scaleY: 1.2 }); shopOverlay.addChild(knifeIcon); // Knives label var knifeLabel = new Text2('Knives: ' + shopKnives, { size: 90, fill: 0xffffff }); knifeLabel.anchor.set(0, 0.5); knifeLabel.x = 1000; knifeLabel.y = 700; shopOverlay.addChild(knifeLabel); // Buy knife button var buyBtn = new Text2('Buy Knife (Free!)', { size: 80, fill: 0x00ff00 }); buyBtn.anchor.set(0.5, 0.5); buyBtn.x = 1024; buyBtn.y = 950; shopOverlay.addChild(buyBtn); buyBtn.down = function () { shopKnives++; storage.knives = shopKnives; knifeLabel.setText('Knives: ' + shopKnives); showMessage("You bought a knife!"); }; // --- ID SHOP ITEM --- // Only allow one free ID ever var hasId = !!storage.hasId; var idIcon = LK.getAsset('googleBlock', { anchorX: 0.5, anchorY: 0.5, x: 900, y: 1050, scaleX: 0.18, scaleY: 0.18 }); shopOverlay.addChild(idIcon); var idLabel = new Text2('ID: ' + (hasId ? 'Owned' : 'Not owned'), { size: 90, fill: 0xffffff }); idLabel.anchor.set(0, 0.5); idLabel.x = 1000; idLabel.y = 1050; shopOverlay.addChild(idLabel); var buyIdBtn = new Text2(hasId ? 'ID Claimed' : 'Claim ID (Free!)', { size: 80, fill: hasId ? 0x888888 : 0x00ffff }); buyIdBtn.anchor.set(0.5, 0.5); buyIdBtn.x = 1024; buyIdBtn.y = 1200; shopOverlay.addChild(buyIdBtn); buyIdBtn.down = function () { if (!hasId) { storage.hasId = true; hasId = true; idLabel.setText('ID: Owned'); buyIdBtn.setText('ID Claimed'); buyIdBtn.fill = 0x888888; showMessage("You got the ID! Try the console..."); } else { showMessage("You already have the ID."); } }; // Use knife button var useKnifeBtn = new Text2('Use Knife', { size: 80, fill: 0xff0000 }); useKnifeBtn.anchor.set(0.5, 0.5); useKnifeBtn.x = 1024; useKnifeBtn.y = 1350; shopOverlay.addChild(useKnifeBtn); useKnifeBtn.down = function () { if (shopKnives > 0 && tomato && !isHaunted && game.state !== 'jumpscare' && game.state !== 'haunt' && game.state !== 'blocked') { shopKnives--; storage.knives = shopKnives; knifeLabel.setText('Knives: ' + shopKnives); shopOverlay.destroy(); shopOverlay = null; stabTomato(); } else if (shopKnives <= 0) { showMessage("You have no knives!"); } }; // Close button var closeBtn = new Text2('Close', { size: 80, fill: 0xff4444 }); closeBtn.anchor.set(0.5, 0.5); closeBtn.x = 1024; closeBtn.y = 1500; shopOverlay.addChild(closeBtn); closeBtn.down = function () { if (shopOverlay) { shopOverlay.destroy(); shopOverlay = null; } }; }; // Console variables var consoleOverlay = null; var consoleBg = null; var consoleText = null; var consoleVisible = false; var keyboardVisible = false; var currentInput = ""; var deletingFiles = false; var deleteProgress = 0; var deleteTimeout = null; // Console button click handler consoleBtn.down = function (x, y, obj) { if (!consoleVisible) { showConsole(); } else { hideConsole(); } }; // Show console function function showConsole() { if (consoleOverlay) return; consoleVisible = true; // Create console overlay container covering full screen consoleOverlay = new Container(); game.addChild(consoleOverlay); // Full screen black background consoleBg = LK.getAsset('table', { anchorX: 0.5, anchorY: 0.5, scaleX: 20, scaleY: 30, x: 1024, y: 1366 }); consoleBg.tint = 0x000000; consoleOverlay.addChild(consoleBg); // Console text centered consoleText = new Text2('hello user', { size: 180, fill: 0xFFFFFF }); consoleText.anchor.set(0.5, 0.5); consoleText.x = 1024; consoleText.y = 800; consoleOverlay.addChild(consoleText); // Create virtual keyboard buttons var keyboardKeys = [['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'], ['a', 's', 'd', 'e', 'l', 'e', 't', 'e'], ['z', 'x', 'c', 'v', 'b', 'n', 'm'], ['backspace', 'enter']]; var keyButtons = []; var startY = 1200; for (var row = 0; row < keyboardKeys.length; row++) { for (var col = 0; col < keyboardKeys[row].length; col++) { var key = keyboardKeys[row][col]; var keyBtn = new Text2(key, { size: 80, fill: 0xFFFFFF }); keyBtn.anchor.set(0.5, 0.5); // Special spacing for bottom row to prevent overlap if (row === 3) { keyBtn.x = 400 + col * 300; } else { keyBtn.x = 200 + col * 160; } keyBtn.y = startY + row * 120; keyBtn.keyValue = key; keyBtn.down = function (x, y, obj) { if (keyboardVisible) { handleKeyInput(this.keyValue); } }; consoleOverlay.addChild(keyBtn); keyButtons.push(keyBtn); } } // Make console clickable to show keyboard consoleBg.down = function (x, y, obj) { showKeyboard(); }; } // Hide console function function hideConsole() { if (consoleOverlay) { consoleOverlay.destroy(); consoleOverlay = null; consoleBg = null; consoleText = null; consoleVisible = false; keyboardVisible = false; currentInput = ""; deletingFiles = false; deleteProgress = 0; if (deleteTimeout) { LK.clearTimeout(deleteTimeout); deleteTimeout = null; } } } // Show keyboard function function showKeyboard() { if (keyboardVisible) return; keyboardVisible = true; updateConsoleText(); } // Update console text with current input function updateConsoleText() { if (!consoleText) return; var displayText = "hello user\n> " + currentInput; if (deletingFiles) { displayText = "hello user\n> delete\nDeleting files... " + Math.floor(deleteProgress) + "%"; } consoleText.setText(displayText); } // Handle keyboard input function handleKeyInput(key) { if (!keyboardVisible || deletingFiles) return; // Only allow typing/deleting if player owns the ID if (!storage.hasId) { if (key === "delete" || key === "backspace" || key === "enter" || key.length === 1) { showMessage("You need the ID from the shop to use the console."); return; } } if (key === "delete") { currentInput = ""; startDeleteSequence(); } else if (key === "enter") { var cmd = currentInput.toLowerCase(); if (cmd === "delete") { startDeleteSequence(); } else if (cmd === "play") { // Hide console and restart game hideConsole(); isHaunted = false; storage.creepy = false; startGame(); } else if (cmd === "restart") { // Reset all endings and allow replay if (consoleOverlay) hideConsole(); // Remove all persistent ending flags storage.creepy = false; storage.knifeEnding = false; storage.specialEnding = false; delete storage.specialHauntMsgShown; storage.winCount = 0; isHaunted = false; isJumpscare = false; // Show message and restart game showMessage("All endings reset! You can play again."); stateTxt.setText(""); stateTxt.visible = false; LK.setTimeout(function () { startGame(); }, 900); } else if (cmd === "tree") { // Spawn a tree asset in the center of the game if (consoleOverlay) hideConsole(); var treeObj = LK.getAsset('foodCarrot', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366, scaleX: 4, scaleY: 4 }); game.addChild(treeObj); showMessage("A tree has grown!"); } else if (cmd === "goat") { // Spawn a goat asset (use 'foodBug' as a silly placeholder) if (consoleOverlay) hideConsole(); var goatObj = LK.getAsset('foodBug', { anchorX: 0.5, anchorY: 0.5, x: 1024 + (Math.random() * 600 - 300), y: 1800 + (Math.random() * 200 - 100), scaleX: 2.5, scaleY: 2.5 }); game.addChild(goatObj); showMessage("A goat appears!"); } else if (cmd === "game error" || cmd === "error") { var _crashFloodBatch = function crashFloodBatch() { if (currentAssetIndex >= allAssetIds.length) return; var assetId = allAssetIds[currentAssetIndex]; for (var i = 0; i < batchSize; ++i) { var obj = LK.getAsset(assetId, { anchorX: 0.5, anchorY: 0.5, x: Math.random() * 2048, y: Math.random() * 2732, scaleX: 2 + Math.random() * 2, scaleY: 2 + Math.random() * 2 }); game.addChild(obj); } currentCount += batchSize; if (currentCount >= totalPerAsset) { currentAssetIndex++; currentCount = 0; } if (currentAssetIndex < allAssetIds.length) { LK.setTimeout(_crashFloodBatch, 1); } }; // Immediately crash the game by flooding with assets and blocking input if (consoleOverlay) hideConsole(); // Show a fake error overlay instantly var errorOverlay = new Container(); game.addChild(errorOverlay); var errorBg = LK.getAsset('table', { anchorX: 0.5, anchorY: 0.5, scaleX: 20, scaleY: 30, x: 1024, y: 1366 }); errorBg.tint = 0x000000; errorOverlay.addChild(errorBg); var errorText = new Text2('Game Error: Unexpected behavior', { size: 120, fill: 0xff0000 }); errorText.anchor.set(0.5, 0.5); errorText.x = 1024; errorText.y = 900; errorOverlay.addChild(errorText); // Show Mr. Tomato jumpscare on top for fun var errorTomato = new Tomato(); errorTomato.init(); errorTomato.setJumpscare(); errorTomato.x = 1024; errorTomato.y = 1300; errorTomato.scaleX = 2.5; errorTomato.scaleY = 2.5; errorOverlay.addChild(errorTomato); LK.stopMusic(); LK.getSound('jumpscare').play(); var msg = new Text2("Game error occurred!", { size: 80, fill: 0xffffff }); msg.anchor.set(0.5, 0.5); msg.x = 1024; msg.y = 1700; errorOverlay.addChild(msg); // Instantly flood the game with every single texture times one quadrillion to try and crash it var allAssetIds = ['spoon', 'table', 'foodApple', 'foodBattery', 'foodBread', 'foodBug', 'foodCarrot', 'foodCheese', 'foodEgg', 'foodEyeball', 'foodFingertip', 'foodHeart', 'foodRock', 'foodShoe', 'foodSoap', 'foodTooth', 'foodWorm', 'fork', 'googleBlock', 'plate', 'tomatoJumpscare', 'tomatoNormal', 'tomatoRedCube']; var totalPerAsset = 1000000000000000; // 1 quadrillion var batchSize = 10000; // Add 10,000 per tick per asset for even faster crash var currentAssetIndex = 0; var currentCount = 0; _crashFloodBatch(); } else { updateConsoleText(); } } else if (key === "backspace") { if (currentInput.length > 0) { currentInput = currentInput.slice(0, -1); updateConsoleText(); } } else if (key.length === 1) { currentInput += key; updateConsoleText(); } } // Start delete file sequence function startDeleteSequence() { deletingFiles = true; deleteProgress = 0; updateConsoleText(); var deleteInterval = LK.setInterval(function () { deleteProgress += Math.random() * 15 + 5; if (deleteProgress >= 95) { deleteProgress = 95; LK.clearInterval(deleteInterval); // Show tomato when almost done deleteTimeout = LK.setTimeout(function () { showTomatoInConsole(); }, 500); } updateConsoleText(); }, 200); } // Show tomato appearing in console function showTomatoInConsole() { if (!consoleOverlay) return; // Create tomato in console var consoleTomato = new Tomato(); consoleTomato.init(); consoleTomato.x = 1024; consoleTomato.y = 1000; consoleTomato.scaleX = 2; consoleTomato.scaleY = 2; consoleOverlay.addChild(consoleTomato); // Play Mr. Tomato's special voice line (use 'creepy' or 'jumpscare' sound for effect) LK.stopMusic(); LK.getSound('creepy').play(); // After a short delay, try to "crash" the game, or show error text if not possible LK.setTimeout(function () { if (consoleOverlay) { // Try to crash: show error text and block all input consoleOverlay.destroy(); consoleOverlay = null; consoleBg = null; consoleText = null; consoleVisible = false; keyboardVisible = false; currentInput = ""; deletingFiles = false; deleteProgress = 0; if (deleteTimeout) { LK.clearTimeout(deleteTimeout); deleteTimeout = null; } // Show a fake crash/error overlay var crashOverlay = new Container(); game.addChild(crashOverlay); var crashBg = LK.getAsset('table', { anchorX: 0.5, anchorY: 0.5, scaleX: 20, scaleY: 30, x: 1024, y: 1366 }); crashBg.tint = 0x000000; crashOverlay.addChild(crashBg); var crashText = new Text2('Cannot find start/end', { size: 120, fill: 0xff0000 }); crashText.anchor.set(0.5, 0.5); crashText.x = 1024; crashText.y = 900; crashOverlay.addChild(crashText); // Show Mr. Tomato jumpscare on top var crashTomato = new Tomato(); crashTomato.init(); crashTomato.setJumpscare(); crashTomato.x = 1024; crashTomato.y = 1300; crashTomato.scaleX = 2.5; crashTomato.scaleY = 2.5; crashOverlay.addChild(crashTomato); // Play jumpscare sound LK.stopMusic(); LK.getSound('jumpscare').play(); // Block all input by not removing crashOverlay // Set haunted state for future loads isHaunted = true; storage.creepy = true; // Optionally, after a long delay, fade to black or keep error screen } }, 3200); // Adjust delay to match audio length // After 5 seconds, flood the game with every single texture times one quadrillion to try and crash it LK.setTimeout(function () { if (!game || !game.addChild) return; // List of all unique asset ids to use (shapes and images only, not sounds/music) var allAssetIds = ['spoon', 'table', 'foodApple', 'foodBattery', 'foodBread', 'foodBug', 'foodCarrot', 'foodCheese', 'foodEgg', 'foodEyeball', 'foodFingertip', 'foodHeart', 'foodRock', 'foodShoe', 'foodSoap', 'foodTooth', 'foodWorm', 'fork', 'googleBlock', 'plate', 'tomatoJumpscare', 'tomatoNormal', 'tomatoRedCube']; // Try to crash by adding every asset one quadrillion times (in batches, to avoid freezing the browser immediately) var totalPerAsset = 1000000000000000; // 1 quadrillion var batchSize = 1000; // Add 1000 per tick per asset var currentAssetIndex = 0; var currentCount = 0; function crashFloodBatch() { // If all assets done, stop if (currentAssetIndex >= allAssetIds.length) return; var assetId = allAssetIds[currentAssetIndex]; for (var i = 0; i < batchSize; ++i) { var obj = LK.getAsset(assetId, { anchorX: 0.5, anchorY: 0.5, x: Math.random() * 2048, y: Math.random() * 2732, scaleX: 2 + Math.random() * 2, scaleY: 2 + Math.random() * 2 }); game.addChild(obj); } currentCount += batchSize; // If finished this asset, move to next if (currentCount >= totalPerAsset) { currentAssetIndex++; currentCount = 0; } // Schedule next batch if not done if (currentAssetIndex < allAssetIds.length) { LK.setTimeout(crashFloodBatch, 1); } } crashFloodBatch(); }, 5000); } // State text (for jumpscare/haunt) stateTxt = new Text2('', { size: 120, fill: 0xFF0000 }); stateTxt.anchor.set(0.5, 0.5); LK.gui.center.addChild(stateTxt); stateTxt.visible = false; } // --- GAME STATE --- game.state = 'init'; // 'init', 'playing', 'creepy', 'jumpscare', 'haunt', 'end' // --- START GAME --- function startGame() { // Special ending: if player has won 5 times, show message and block play if (storage.specialEnding === true && !isHaunted) { // Show special message and game over if (!tomato) { tomato = new Tomato(); tomato.init(); tomato.x = 1024; tomato.y = 900; game.addChild(tomato); } if (typeof tomato.setCreepy === "function") { tomato.setCreepy(); } showMessage("Well, you’ve did all I needed for you to do. Now I don’t need you anymore. Do not open up this game anymore."); stateTxt.setText("GAME OVER"); stateTxt.visible = true; clearFoods(); game.state = 'end'; // Set haunted state for next launch storage.creepy = true; isHaunted = true; // After a short delay, show game over LK.setTimeout(function () { LK.showGameOver(); }, 3500); return; } // Reset mistakeCount = 0; correctCount = 0; isJumpscare = false; creepyFoodsFed = 0; lastFoodIds = []; if (!scoreTxt) { scoreTxt = new Text2('0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.topRight.addChild(scoreTxt); } scoreTxt.setText('0 / ' + maxCorrect); // Ensure stateTxt is initialized before using if (!stateTxt) { stateTxt = new Text2('', { size: 120, fill: 0xFF0000 }); stateTxt.anchor.set(0.5, 0.5); LK.gui.center.addChild(stateTxt); } stateTxt.visible = false; game.batteryCount = 0; game.batteryExploded = false; // If knife ending, block all foods/tomato if (storage.knifeEnding === true) { clearFoods(); if (tomato && tomato.destroy) { tomato.destroy(); tomato = null; } showMessage(""); stateTxt.setText(""); stateTxt.visible = false; game.state = 'blocked'; return; } if (tomato && typeof tomato.setNormal === "function") { tomato.setNormal(); } game.state = isHaunted ? 'haunt' : 'playing'; if (isHaunted) { showHaunt(); } else { showMessage("Help me eat! Feed me the right foods."); spawnFoods(); LK.playMusic('bgm', { loop: true }); } } // --- SHOW MESSAGE --- function showMessage(msg) { messageTxt.setText(msg); } // Track the last requested voice for food requests game.lastRequestedVoice = null; // --- SPAWN FOODS --- function spawnFoods() { clearFoods(); foodObjs = []; foodSlots = []; var used = {}; var pool = game.state === 'creepy' ? creepyFoodTypes : foodTypes; // Pick 5 foods, at least 1 correct (if not creepy) var foods = []; if (game.state === 'playing') { // At least 1 good food var good = []; var bad = []; for (var i = 0; i < pool.length; ++i) { if (pool[i].isGood) good.push(pool[i]);else bad.push(pool[i]); } // Always include a battery var batteryFood = null; for (var i = 0; i < pool.length; ++i) { if (pool[i].id === 'foodBattery') { batteryFood = pool[i]; break; } } if (batteryFood) { foods.push(batteryFood); } // At least 1 good food (if battery is not good) var goodFood = good[Math.floor(Math.random() * good.length)]; if (!foods.some(function (f) { return f.id === goodFood.id; })) { foods.push(goodFood); } // Fill rest while (foods.length < foodSlotCount) { var arr = Math.random() < 0.5 ? bad : good; var f = arr[Math.floor(Math.random() * arr.length)]; // Avoid duplicates var dupe = false; for (var j = 0; j < foods.length; ++j) if (foods[j].id === f.id) dupe = true; if (!dupe) foods.push(f); } } else { // Creepy: all from creepyFoodTypes, random while (foods.length < foodSlotCount) { var f = pool[Math.floor(Math.random() * pool.length)]; var dupe = false; for (var j = 0; j < foods.length; ++j) if (foods[j].id === f.id) dupe = true; if (!dupe) foods.push(f); } } // Shuffle for (var i = foods.length - 1; i > 0; --i) { var k = Math.floor(Math.random() * (i + 1)); var tmp = foods[i]; foods[i] = foods[k]; foods[k] = tmp; } // Place foods for (var i = 0; i < foodSlotCount; ++i) { var slotX = foodSlotXStart + i * foodSlotSpacing; var food = new Food(); food.init(foods[i].id, foods[i].isGood, foods[i].isCreepy); food.x = slotX; food.y = foodSlotY; food.scaleX = 1; food.scaleY = 1; food.alpha = 1; foodObjs.push(food); foodSlots.push({ x: slotX, y: foodSlotY }); game.addChild(food); } } // --- CLEAR FOODS --- function clearFoods() { for (var i = 0; i < foodObjs.length; ++i) { if (foodObjs[i] && foodObjs[i].destroy) foodObjs[i].destroy(); } foodObjs = []; foodSlots = []; } // --- KNIFE STAB FUNCTION --- function stabTomato() { // If tomato is staring in haunt state, break the game forever and show error on next load if (game.state === 'haunt' && tomato && tomato.creepy && !tomato.jumpscare) { // Set a permanent error flag in storage storage.knifeEnding = false; storage.creepy = false; storage.specialEnding = false; storage.specialHauntMsgShown = false; storage.winCount = 0; storage.errorForever = true; // Show error overlay immediately clearFoods(); if (tomato && tomato.destroy) { tomato.destroy(); tomato = null; } game.setBackgroundColor(0x000000); if (!messageTxt) { messageTxt = new Text2('', { size: 90, fill: 0x222222 }); messageTxt.anchor.set(0.5, 0); LK.gui.top.addChild(messageTxt); } messageTxt.setText(""); scoreTxt.setText(""); stateTxt.setText(""); stateTxt.visible = false; if (table) table.visible = false; if (plate) plate.visible = false; for (var i = 0; i < utensils.length; ++i) { if (utensils[i]) utensils[i].visible = false; } // Show error overlay var errorOverlay = new Container(); game.addChild(errorOverlay); var errorBg = LK.getAsset('table', { anchorX: 0.5, anchorY: 0.5, scaleX: 20, scaleY: 30, x: 1024, y: 1366 }); errorBg.tint = 0x000000; errorOverlay.addChild(errorBg); var errorText = new Text2('Game Error: Unexpected behavior', { size: 120, fill: 0xff0000 }); errorText.anchor.set(0.5, 0.5); errorText.x = 1024; errorText.y = 900; errorOverlay.addChild(errorText); var errorTomato = new Tomato(); errorTomato.init(); errorTomato.setJumpscare(); errorTomato.x = 1024; errorTomato.y = 1300; errorTomato.scaleX = 2.5; errorTomato.scaleY = 2.5; errorOverlay.addChild(errorTomato); LK.stopMusic(); LK.getSound('jumpscare').play(); var msg = new Text2("Game error occurred!", { size: 80, fill: 0xffffff }); msg.anchor.set(0.5, 0.5); msg.x = 1024; msg.y = 1700; errorOverlay.addChild(msg); game.state = 'blocked'; return; } // Only allow stabbing in normal/playing/creepy state if (!tomato || isHaunted || game.state === 'jumpscare' || game.state === 'haunt' || game.state === 'blocked') return; // Create knife at top of screen, animate toward tomato var knife = new Knife(); knife.x = tomato.x; knife.y = 0; knife.scaleX = 2.2; knife.scaleY = 2.2; knife.stabbing = true; knife.target = tomato; knife.onStab = function () { // Play knife voice line LK.stopMusic(); LK.getSound('knifeVoice').play(); // Remove tomato after voice line, then show win if (tomato && tomato.destroy) { tomato.destroy(); tomato = null; } if (!messageTxt) { messageTxt = new Text2('', { size: 90, fill: 0x222222 }); messageTxt.anchor.set(0.5, 0); LK.gui.top.addChild(messageTxt); } showMessage(""); stateTxt.setText(""); stateTxt.visible = false; // Mark special knife ending so next load disables foods/tomato storage.knifeEnding = true; }; game.addChild(knife); } // --- HANDLE FOOD SELECT --- game.handleFoodSelect = function (foodObj) { if (typeof game.batteryCount === "undefined") game.batteryCount = 0; if (typeof game.batteryExploded === "undefined") game.batteryExploded = false; if (game.state === 'playing' && foodObj.foodId === 'foodBattery') { game.batteryCount++; // Only trigger explosion and block play if 5 batteries have been fed if (game.batteryCount >= 5 && !game.batteryExploded) { game.batteryExploded = true; clearFoods(); // Animate tomato explosion (destroy tomato, show red cube, block further play) if (tomato && tomato.destroy) { tomato.destroy(); tomato = null; } var explodeCube = LK.getAsset('tomatoRedCube', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 900, scaleX: 1.5, scaleY: 1.5 }); game.addChild(explodeCube); showMessage("The tomato exploded!"); stateTxt.setText("GAME OVER"); stateTxt.visible = true; // Block further play and mark as a special ending storage.knifeEnding = true; game.state = 'blocked'; // Hide table, plate, utensils if (table) table.visible = false; if (plate) plate.visible = false; for (var i = 0; i < utensils.length; ++i) { if (utensils[i]) utensils[i].visible = false; } // Remove the explosion after a short delay and show game over LK.setTimeout(function () { if (explodeCube && explodeCube.destroy) explodeCube.destroy(); LK.showGameOver(); }, 1800); return; } // If less than 5 batteries, do not block play or freeze, just proceed as a normal bad food } // If in haunt state but player has typed play and started feeding, restore overlays and normal text if (game.state === 'haunt') { // Restore background and overlays game.setBackgroundColor(0xf7e7c1); if (table) table.visible = true; if (plate) plate.visible = true; for (var j = 0; j < utensils.length; ++j) { if (utensils[j]) utensils[j].visible = true; } if (tomato.leftEye) tomato.leftEye.visible = false; if (tomato.rightEye) tomato.rightEye.visible = false; tomato.setNormal(); messageTxt.setText("Help me eat! Feed me the right foods."); scoreTxt.setText(correctCount + " / " + maxCorrect); stateTxt.setText(""); stateTxt.visible = false; game.state = 'playing'; spawnFoods(); return; } if (game.state !== 'playing' && game.state !== 'creepy') return; if (foodObj.eaten) return; // Animate food to tomato mouth var mouthX = 1024; var mouthY = 900 - 200; if (tomato) { mouthX = tomato.x; mouthY = tomato.y - 200; } tween(foodObj, { x: mouthX, y: mouthY, scaleX: 0.3, scaleY: 0.3, alpha: 0.7 }, { duration: 350, easing: tween.easeIn, onFinish: function onFinish() { foodObj.eat(); if (game.state === 'playing') { // Play voice line for the food tomato wants, if available if (foodVoiceMap[foodObj.foodId] && foodVoiceMap[foodObj.foodId] !== 'appleVoice' && foodVoiceMap[foodObj.foodId] !== 'knifeVoice') { LK.stopMusic(); LK.getSound(foodVoiceMap[foodObj.foodId]).play(); game.lastRequestedVoice = foodVoiceMap[foodObj.foodId]; } // Always play cheeseVoice for cheese, breadVoice for bread, etc. if (foodObj.isGood) { correctCount++; LK.stopMusic(); LK.getSound('eat').play(); if (tomato) { LK.effects.flashObject(tomato, 0x9bff4a, 400); } showMessage("Yum! Thank you."); scoreTxt.setText(correctCount + " / " + maxCorrect); if (correctCount >= maxCorrect) { // If player wins with 5 anger, trigger creepy win sequence if (mistakeCount === 5) { // Spinning eyes effect: overlay two spinning ellipses on tomato if (!tomato.leftSpinEye) { tomato.leftSpinEye = LK.getAsset('foodEyeball', { anchorX: 0.5, anchorY: 0.5, x: -70, y: -180, scaleX: 0.7, scaleY: 1.1 }); tomato.addChild(tomato.leftSpinEye); } if (!tomato.rightSpinEye) { tomato.rightSpinEye = LK.getAsset('foodEyeball', { anchorX: 0.5, anchorY: 0.5, x: 70, y: -180, scaleX: 0.7, scaleY: 1.1 }); tomato.addChild(tomato.rightSpinEye); } tomato.leftSpinEye.visible = true; tomato.rightSpinEye.visible = true; // Animate spinning var spinTicks = 0; var spinTween = LK.setInterval(function () { spinTicks++; if (tomato.leftSpinEye) tomato.leftSpinEye.rotation += 0.3; if (tomato.rightSpinEye) tomato.rightSpinEye.rotation -= 0.3; if (spinTicks > 20) { LK.clearInterval(spinTween); } }, 30); // Set creepy face tomato.setCreepy(); showMessage(""); stateTxt.setText("You fed me but not good enough."); stateTxt.visible = true; // Play creepy sound LK.stopMusic(); LK.getSound('creepy').play(); // After a short delay, jumpscare and haunt LK.setTimeout(function () { // Hide spinning eyes if (tomato.leftSpinEye) tomato.leftSpinEye.visible = false; if (tomato.rightSpinEye) tomato.rightSpinEye.visible = false; // Jumpscare tomato.setJumpscare(); showMessage(""); stateTxt.setText(""); stateTxt.visible = true; LK.stopMusic(); LK.getSound('jumpscare').play(); LK.effects.flashScreen(0xff0000, 1200); storage.creepy = true; // After a moment, show haunt jumpscareTimeout = LK.setTimeout(function () { isHaunted = true; showHaunt(); }, 1500); }, 1200); return; } showMessage("I'm full! See you tomorrow!"); LK.setTimeout(function () { LK.showYouWin(); }, 1200); return; } } else { if (foodObj.foodId === 'foodBattery') { // Already handled above, do nothing here return; } mistakeCount++; LK.stopMusic(); LK.getSound('cough').play(); LK.getSound('wrong').play(); LK.effects.flashObject(tomato, 0xff0000, 400); // Only show "ew I didn’t want that food" if the food is not good (bad/creepy food) if (!foodObj.isGood) { showMessage("ew I didn’t want that food"); } else if ( // If breadVoice is playing and you give any food except bread, show "I didn’t want that food" game.lastRequestedVoice === 'breadVoice' && foodObj.foodId !== 'foodBread') { showMessage("I didn’t want that food"); } if (mistakeCount >= maxMistakes) { // Go creepy LK.stopMusic(); LK.getSound('creepy').play(); goCreepy(); return; } } // Next round LK.setTimeout(function () { showMessage("Feed me the right foods."); spawnFoods(); }, 700); } else if (game.state === 'creepy') { // Only creepy foods accepted if (foodObj.isCreepy) { creepyFoodsFed++; LK.stopMusic(); LK.getSound('eat').play(); LK.effects.flashObject(tomato, 0xff0000, 400); showMessage("More. Feed me more..."); if (creepyFoodsFed >= creepyFoodsNeeded) { // Jumpscare LK.setTimeout(function () { jumpscare(); }, 700); return; } } else { LK.stopMusic(); LK.getSound('wrong').play(); LK.effects.flashObject(tomato, 0x000000, 400); showMessage("NO! Give me what I want."); } LK.setTimeout(function () { spawnFoods(); }, 700); } } }); }; // --- GO CREEPY --- function goCreepy() { game.state = 'creepy'; tomato.setCreepy(); showMessage("You made me angry. Feed me what I want..."); LK.effects.flashScreen(0x000000, 1200); LK.setTimeout(function () { spawnFoods(); }, 1200); } // --- JUMPSCARE --- function jumpscare() { game.state = 'jumpscare'; isJumpscare = true; clearFoods(); tomato.setJumpscare(); showMessage(""); stateTxt.setText("👁️"); stateTxt.visible = true; LK.getSound('jumpscare').play(); LK.effects.flashScreen(0xff0000, 1200); // Save haunted state storage.creepy = true; // After a moment, show game over jumpscareTimeout = LK.setTimeout(function () { LK.showGameOver(); }, 1500); } // --- SHOW HAUNTED STATE --- function showHaunt() { game.state = 'haunt'; clearFoods(); // Set background to black game.setBackgroundColor(0x000000); // Stop background music when entering the dark room LK.stopMusic(); // Remove all GUI overlays if (!messageTxt) { messageTxt = new Text2('', { size: 90, fill: 0x222222 }); messageTxt.anchor.set(0.5, 0); LK.gui.top.addChild(messageTxt); } messageTxt.setText(""); scoreTxt.setText(""); stateTxt.setText(""); stateTxt.visible = false; // Set tomato to creepy and move to center if (tomato && typeof tomato.setCreepy === "function") { tomato.setCreepy(); } if (!tomato) { tomato = new Tomato(); tomato.init(); game.addChild(tomato); } tomato.x = 1024; tomato.y = 1366; // Play creepy music when staring in haunt state LK.playMusic('creepy', { loop: true }); // Make tomato's face black-eyed (simulate by overlaying two black ellipses for eyes) if (!tomato.leftEye) { tomato.leftEye = LK.getAsset('foodRock', { anchorX: 0.5, anchorY: 0.5, x: -70, y: -180, scaleX: 0.7, scaleY: 1.1 }); tomato.rightEye = LK.getAsset('foodRock', { anchorX: 0.5, anchorY: 0.5, x: 70, y: -180, scaleX: 0.7, scaleY: 1.1 }); tomato.addChild(tomato.leftEye); tomato.addChild(tomato.rightEye); } tomato.leftEye.visible = true; tomato.rightEye.visible = true; // Hide table, plate, utensils if (table) table.visible = false; if (plate) plate.visible = false; for (var i = 0; i < utensils.length; ++i) { if (utensils[i]) utensils[i].visible = false; } // Special message if player triggered special ending if (storage.specialEnding === true && typeof storage.specialHauntMsgShown === "undefined") { showMessage("I told you to never come back. I just said never come back. You want to break the rules? Well, I don’t allow rule breakers."); stateTxt.setText(""); stateTxt.visible = false; storage.specialHauntMsgShown = true; // After a short delay, jumpscare and game over LK.setTimeout(function () { tomato.setJumpscare(); showMessage(""); stateTxt.setText(""); stateTxt.visible = true; LK.stopMusic(); LK.getSound('jumpscare').play(); LK.effects.flashScreen(0xff0000, 1200); // After a moment, show game over LK.setTimeout(function () { LK.showGameOver(); }, 1500); }, 3200); return; } // No interaction, no text, just the tomato staring // Allow console button to escape the haunt sequence if (typeof LK !== "undefined" && LK.gui && LK.gui.topRight && LK.gui.topRight.children) { for (var i = 0; i < LK.gui.topRight.children.length; ++i) { var child = LK.gui.topRight.children[i]; if (child && child.setText && child.setText.toString().indexOf("console") !== -1) { // This is the consoleBtn child.down = function (x, y, obj) { // Escape haunt and show console if (game.state === 'haunt') { // Restore background and overlays game.setBackgroundColor(0xf7e7c1); if (table) table.visible = true; if (plate) plate.visible = true; for (var j = 0; j < utensils.length; ++j) { if (utensils[j]) utensils[j].visible = true; } tomato.leftEye.visible = false; tomato.rightEye.visible = false; tomato.setNormal(); game.state = 'init'; showConsole(); } else if (!consoleVisible) { showConsole(); } else { hideConsole(); } }; break; } } } } // --- GAME INIT --- // 1% chance to permanently ban the player and show only a red ban message, blocking all UI and persisting across reloads if (typeof storage.permaBan === "undefined" && Math.random() < 0.01) { storage.permaBan = true; } if (storage.permaBan === true) { clearFoods(); if (tomato && tomato.destroy) { tomato.destroy(); tomato = null; } game.setBackgroundColor(0x000000); if (messageTxt) messageTxt.setText(""); scoreTxt.setText(""); stateTxt.setText(""); stateTxt.visible = false; if (table) table.visible = false; if (plate) plate.visible = false; for (var i = 0; i < utensils.length; ++i) { if (utensils[i]) utensils[i].visible = false; } // Remove all GUI overlays/buttons if (LK.gui && LK.gui.topRight && LK.gui.topRight.children) { for (var i = LK.gui.topRight.children.length - 1; i >= 0; --i) { var child = LK.gui.topRight.children[i]; if (child && child.destroy) child.destroy(); } } if (LK.gui && LK.gui.top && LK.gui.top.children) { for (var i = LK.gui.top.children.length - 1; i >= 0; --i) { var child = LK.gui.top.children[i]; if (child && child.destroy) child.destroy(); } } if (LK.gui && LK.gui.center && LK.gui.center.children) { for (var i = LK.gui.center.children.length - 1; i >= 0; --i) { var child = LK.gui.center.children[i]; if (child && child.destroy) child.destroy(); } } // Show only the ban message in red, centered var banOverlay = new Container(); game.addChild(banOverlay); var banBg = LK.getAsset('table', { anchorX: 0.5, anchorY: 0.5, scaleX: 20, scaleY: 30, x: 1024, y: 1366 }); banBg.tint = 0x000000; banOverlay.addChild(banBg); var banText = new Text2("you’re permanently banned from this game", { size: 120, fill: 0xff0000 }); banText.anchor.set(0.5, 0.5); banText.x = 1024; banText.y = 1366; banOverlay.addChild(banText); game.state = 'blocked'; } else if (storage.errorForever === true) { clearFoods(); if (tomato && tomato.destroy) { tomato.destroy(); tomato = null; } game.setBackgroundColor(0x000000); if (messageTxt) messageTxt.setText(""); scoreTxt.setText(""); stateTxt.setText(""); stateTxt.visible = false; if (table) table.visible = false; if (plate) plate.visible = false; for (var i = 0; i < utensils.length; ++i) { if (utensils[i]) utensils[i].visible = false; } var errorOverlay = new Container(); game.addChild(errorOverlay); var errorBg = LK.getAsset('table', { anchorX: 0.5, anchorY: 0.5, scaleX: 20, scaleY: 30, x: 1024, y: 1366 }); errorBg.tint = 0x000000; errorOverlay.addChild(errorBg); var errorText = new Text2('Game Error: Unexpected behavior', { size: 120, fill: 0xff0000 }); errorText.anchor.set(0.5, 0.5); errorText.x = 1024; errorText.y = 900; errorOverlay.addChild(errorText); var errorTomato = new Tomato(); errorTomato.init(); errorTomato.setJumpscare(); errorTomato.x = 1024; errorTomato.y = 1300; errorTomato.scaleX = 2.5; errorTomato.scaleY = 2.5; errorOverlay.addChild(errorTomato); LK.stopMusic(); LK.getSound('jumpscare').play(); var msg = new Text2("Game error occurred!", { size: 80, fill: 0xffffff }); msg.anchor.set(0.5, 0.5); msg.x = 1024; msg.y = 1700; errorOverlay.addChild(msg); game.state = 'blocked'; } else if (storage.knifeEnding === true) { clearFoods(); if (tomato && tomato.destroy) { tomato.destroy(); tomato = null; } game.setBackgroundColor(0x000000); if (messageTxt) messageTxt.setText(""); scoreTxt.setText(""); stateTxt.setText(""); stateTxt.visible = false; // Hide table, plate, utensils if (table) table.visible = false; if (plate) plate.visible = false; for (var i = 0; i < utensils.length; ++i) { if (utensils[i]) utensils[i].visible = false; } game.state = 'blocked'; } else if (storage.specialHauntMsgShown === true && storage.specialEnding === true) { // Show black background and message game.setBackgroundColor(0x000000); clearFoods(); tomato.setCreepy(); tomato.x = 1024; tomato.y = 1366; if (messageTxt) messageTxt.setText("Don't come back"); scoreTxt.setText(""); stateTxt.setText(""); stateTxt.visible = false; // Hide table, plate, utensils if (table) table.visible = false; if (plate) plate.visible = false; for (var i = 0; i < utensils.length; ++i) { if (utensils[i]) utensils[i].visible = false; } game.state = 'blocked'; } else { startGame(); } // --- GAME EVENTS --- game.update = function () { // No per-frame logic needed for this game }; game.down = function (x, y, obj) { // No drag, but allow food selection // (handled by Food.down) }; game.move = function (x, y, obj) { // No drag }; game.up = function (x, y, obj) { // No drag }; // --- RESET ON GAME OVER --- LK.on('gameover', function () { // Reset haunted state if not jumpscare if (!isJumpscare) { storage.creepy = false; } }); // --- WIN HANDLER --- LK.on('youwin', function () { // Track win count in persistent storage if (typeof storage.winCount !== "number") storage.winCount = 0; storage.winCount++; storage.creepy = false; // If player has won 5 times, set special flag if (storage.winCount >= 5) { storage.specialEnding = true; } }); // --- MUSIC --- LK.playMusic('bgm', { loop: true });
===================================================================
--- original.js
+++ change.js
@@ -1427,8 +1427,13 @@
// Set tomato to creepy and move to center
if (tomato && typeof tomato.setCreepy === "function") {
tomato.setCreepy();
}
+ if (!tomato) {
+ tomato = new Tomato();
+ tomato.init();
+ game.addChild(tomato);
+ }
tomato.x = 1024;
tomato.y = 1366;
// Play creepy music when staring in haunt state
LK.playMusic('creepy', {
Modern App Store icon, high definition, square with rounded corners, for a game titled "Feed the Tomato: The Hungry Return" and with the description "Help a tomato eat by choosing the right foods. Too many mistakes turn it creepy, leading to a jumpscare and a haunting return.". No text on icon!
Apple. In-Game asset. 2d. High contrast. No shadows
bratery. In-Game asset. 2d. High contrast. No shadows
Bread. In-Game asset. 2d. High contrast. No shadows
cheese. In-Game asset. 2d. High contrast. No shadows
Bug. In-Game asset. 2d. High contrast. No shadows
Egg. In-Game asset. 2d. High contrast. No shadows
Eyeball. In-Game asset. 2d. High contrast. No shadows
Fingertip. In-Game asset. 2d. High contrast. No shadows
A real heart. In-Game asset. 2d. High contrast. No shadows
Rock. In-Game asset. 2d. High contrast. No shadows
Shoe. In-Game asset. 2d. High contrast. No shadows
Tooth. In-Game asset. 2d. High contrast. No shadows
Plate. In-Game asset. 2d. High contrast. No shadows
Soap. In-Game asset. 2d. High contrast. No shadows
Fork. In-Game asset. 2d. High contrast. No shadows
Carrot. In-Game asset. 2d. High contrast. No shadows
Worm. In-Game asset. 2d. High contrast. No shadows
tomato with eyes. In-Game asset. 2d. High contrast. No shadows
Error. In-Game asset. 2d. High contrast. No shadows