User prompt
implement these changes Reduced timer acceleration: Changed max speed increase from 40ms to 20ms per tick, and made it trigger every 10 points instead of 5. Keep timer visible during number pad: Removed the line that clears the timer display during NumberPadOverride, and pause the main timer while the mini-game is active. Reasonable malfunction chance: Capped at 35% instead of 60% and reduced the increase rate. Consistent timer display: Removed unnecessary timer resets that were causing display issues.
User prompt
Sometimes, when doing the screwing puzzle, the wire pops up, making the players to click the wire unfortunately fix it
User prompt
after completing any puzzles, like the screwing or the num pad one, add 3 more seconds to the timer
User prompt
add Run music on the background
User prompt
When the screwing puzzle comes instead of ending the game if I click somewhere else, flash red on the screen and reduce the timer instead
User prompt
Decrease the text size now
User prompt
little more
User prompt
bring the "Cut the correct wire to defuse the bomb" little down
User prompt
On the starter put "Ready to Defuse the bomb", On top of the screen before the game starts put "Cut the correct wire to defuse the bomb" Make these words disappear when the Starter is clicked
User prompt
I want to make like this, the Starter asset is like a closing plate for panel_border, meaning that Starter is just like a closed panel, clicking it opens the bomb, and let's us defuse it
User prompt
If the starter asset is the there, don't hide other assets on the screen
User prompt
put the Starter in the middle of the screen at the background everything should exist
User prompt
Have everything with the Starter as well, take out the timer, screen display
User prompt
Put the Starter asset in the middle of the screen, pause the timer until that when clicked on the Starter asset, the game should start letting the timer to resume.
User prompt
Only trigger the num pad event or puzzle after the wires are reset
User prompt
Sometimes, the num pad appears without resetting the countdown even after cutting the wire ( fix that)
Code edit (1 edits merged)
Please save this source code
User prompt
Do not shuffle the numbers in the num pad, let it stay static, and also don't make the code disappear
User prompt
looks like the wires can be clicked after the num pad override appears, fix that. And also trigger randomly this event as soon as the wires are reset
User prompt
center the numpadoverlay, it is in the top left away from the screen
User prompt
Puzzle Name: Number Pad Override 🎮 Event Type: Random timed event during gameplay 🧠 Description / Prompt: A Number Pad Override puzzle appears as a surprise challenge. The screen displays a number pad (0–9), and a side note flashes a 4-digit code (e.g., 4827). The player must click the numbers in the exact order shown on the side note within a short time limit (e.g., 5–7 seconds). If the player clicks incorrectly or runs out of time, the bomb explodes and the game ends. If done correctly, the player is allowed to continue defusing the bomb. 🎯 Goal: Add tension and force quick recognition + reaction skills. ⚠️ Fail Condition: Wrong input = instant loss Timeout = instant loss ✨ Optional Variations: Numbers on the pad shuffle positions after each click. The displayed code fades out after 2 seconds. A distracting sound or screen flicker effect plays during the puzzle.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// NumberPadOverride class (Number Pad Override puzzle)
var NumberPadOverride = Container.expand(function () {
var self = Container.call(this);
// Puzzle state
self.active = false;
self.code = [];
self.input = [];
self.timeLimit = 6000; // ms, can be randomized 5000-7000
self.timer = null;
self.codeText = null;
self.padButtons = [];
self.onResult = null; // function(success)
self.shufflePad = false; // do not shuffle after each click
self.fadeCode = false; // code does not fade after 2s
self.flicker = true; // screen flicker effect
self._codeFadeTimeout = null;
self._flickerTimeout = null;
// Background overlay
var overlay = self.attachAsset('GrabPannel', {
anchorX: 0.5,
anchorY: 0.5,
width: 2048,
height: 2732,
alpha: 0.92,
x: 0,
y: 0
});
// Center the whole overlay container in the game area
self.x = 2048 / 2;
self.y = 2732 / 2;
// Puzzle panel
var panel = new Container();
panel.x = 0;
panel.y = 0;
self.addChild(panel);
// Panel background
var panelBg = panel.attachAsset('panel_bg', {
anchorX: 0.5,
anchorY: 0.5,
width: 900,
height: 1100,
x: 0,
y: 0
});
// Code display
self.codeText = new Text2('', {
size: 120,
fill: '#fc1100'
});
self.codeText.anchor.set(0.5, 0.5);
self.codeText.x = 0;
self.codeText.y = -400;
panel.addChild(self.codeText);
// Timer number
self.timerText = new Text2('', {
size: 90,
fill: '#fc1100'
});
self.timerText.anchor.set(0.5, 0.5);
self.timerText.x = 0;
self.timerText.y = -250;
panel.addChild(self.timerText);
// Pad buttons (0-9)
self._createPad = function (numbers) {
// Remove old buttons
for (var i = 0; i < self.padButtons.length; i++) {
self.padButtons[i].destroy();
}
self.padButtons = [];
// Layout: 3x4 grid (0 at bottom center)
var padOrder = numbers || [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
var positions = [[-180, -60], [0, -60], [180, -60], [-180, 120], [0, 120], [180, 120], [-180, 300], [0, 300], [180, 300], [0, 480]];
for (var i = 0; i < 10; i++) {
var n = padOrder[i];
var btn = new Container();
var btnBg = btn.attachAsset('button', {
anchorX: 0.5,
anchorY: 0.5,
width: 160,
height: 160,
x: 0,
y: 0
});
var btnText = new Text2('' + n, {
size: 90,
fill: '#222'
});
btnText.anchor.set(0.5, 0.5);
btnText.x = 0;
btnText.y = 0;
btn.addChild(btnText);
btn.x = positions[i][0];
btn.y = positions[i][1];
// Touch/click event
(function (num) {
btn.down = function (x, y, obj) {
self._handleInput(num);
};
})(n);
panel.addChild(btn);
self.padButtons.push(btn);
}
};
// Shuffle pad numbers
self._shufflePadNumbers = function () {
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
for (var i = arr.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
return arr;
};
// Start the puzzle
self.start = function (code, timeLimit, onResult) {
self.active = true;
self.code = code.slice();
self.input = [];
self.timeLimit = timeLimit || 5000 + Math.floor(Math.random() * 2000);
self.onResult = onResult;
self.visible = true;
// Show code
self.codeText.setText(code.join(''));
self.codeText.visible = true;
// Timer
self._startTime = Date.now();
self._endTime = self._startTime + self.timeLimit;
self._updateTimer();
if (self.timer) {
LK.clearInterval(self.timer);
}
self.timer = LK.setInterval(self._updateTimer, 60);
// Pad
var padNums = self.shufflePad ? self._shufflePadNumbers() : [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
self._createPad(padNums);
// Fade code after 2s
if (self.fadeCode) {
if (self._codeFadeTimeout) {
LK.clearTimeout(self._codeFadeTimeout);
}
self._codeFadeTimeout = LK.setTimeout(function () {
self.codeText.visible = false;
}, 2000);
}
// Flicker effect
if (self.flicker) {
if (self._flickerTimeout) {
LK.clearTimeout(self._flickerTimeout);
}
self._flickerTimeout = LK.setTimeout(function () {
LK.effects.flashScreen(0xffffff, 120);
}, 800 + Math.floor(Math.random() * 800));
}
};
// Handle input
self._handleInput = function (num) {
if (!self.active) {
return;
}
self.input.push(num);
// Animate button press
for (var i = 0; i < self.padButtons.length; i++) {
var btn = self.padButtons[i];
var btnText = btn.children[1];
if (btnText && btnText.text == num) {
tween(btn, {
scaleX: 0.85,
scaleY: 0.85
}, {
duration: 60,
yoyo: true,
repeat: 1
});
}
}
// Shuffle pad after each click
if (self.shufflePad) {
var padNums = self._shufflePadNumbers();
self._createPad(padNums);
}
// Check input
for (var i = 0; i < self.input.length; i++) {
if (self.input[i] !== self.code[i]) {
// Wrong input: fail instantly
self._fail();
return;
}
}
if (self.input.length === self.code.length) {
// Success!
self._success();
}
};
// Timer update
self._updateTimer = function () {
if (!self.active) {
return;
}
var now = Date.now();
var msLeft = Math.max(0, self._endTime - now);
var secLeft = Math.ceil(msLeft / 1000);
self.timerText.setText(secLeft);
self.timerText.setStyle({
fill: '#fc1100'
});
if (msLeft <= 0) {
self._fail();
}
};
// Success
self._success = function () {
self.active = false;
if (self.timer) {
LK.clearInterval(self.timer);
}
if (self._codeFadeTimeout) {
LK.clearTimeout(self._codeFadeTimeout);
}
if (self._flickerTimeout) {
LK.clearTimeout(self._flickerTimeout);
}
self.visible = false;
// Add 3 seconds to timer after puzzle completion
if (typeof timeLeft !== "undefined") {
timeLeft += 3000;
if (typeof updateTimerBar === "function") updateTimerBar();
}
if (typeof self.onResult === 'function') {
self.onResult(true);
}
};
// Fail
self._fail = function () {
self.active = false;
if (self.timer) {
LK.clearInterval(self.timer);
}
if (self._codeFadeTimeout) {
LK.clearTimeout(self._codeFadeTimeout);
}
if (self._flickerTimeout) {
LK.clearTimeout(self._flickerTimeout);
}
self.visible = false;
// Play fail sound and flash
LK.getSound('fail').play();
LK.effects.flashScreen(0xff0000, 600);
if (typeof self.onResult === 'function') {
self.onResult(false);
}
};
// Clean up
self.destroy = function () {
if (self.timer) {
LK.clearInterval(self.timer);
}
if (self._codeFadeTimeout) {
LK.clearTimeout(self._codeFadeTimeout);
}
if (self._flickerTimeout) {
LK.clearTimeout(self._flickerTimeout);
}
for (var i = 0; i < self.padButtons.length; i++) {
self.padButtons[i].destroy();
}
self.padButtons = [];
self.visible = false;
};
self.visible = false;
return self;
});
// Screw class (for malfunction minigame)
var Screw = Container.expand(function () {
var self = Container.call(this);
self.fixed = false;
self.screwAsset = self.attachAsset('screw', {
anchorX: 0.5,
anchorY: 0.5
});
// Touch/click event
self.down = function (x, y, obj) {
if (self.fixed) {
return;
}
self.fixed = true;
// Animate: fade out and shrink
tween(self, {
scaleX: 0.1,
scaleY: 0.1,
alpha: 0
}, {
duration: 200,
easing: tween.cubicIn,
onFinish: function onFinish() {
self.visible = false;
}
});
if (typeof self.onFix === 'function') {
self.onFix(self);
}
};
return self;
});
// Wire class
var Wire = Container.expand(function () {
var self = Container.call(this);
// Properties
self.color = 'red'; // default, will be set on init
self.cut = false;
// Attach asset
self.wireAsset = null;
self.init = function (color) {
self.color = color;
self.cut = false;
var assetId = 'wire_' + color;
self.wireAsset = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
};
// Cut animation
self.cutWire = function () {
if (self.cut) {
return;
}
self.cut = true;
// Animate: fade out and shrink
tween(self, {
scaleX: 0.1,
scaleY: 0.1,
alpha: 0
}, {
duration: 300,
easing: tween.cubicIn,
onFinish: function onFinish() {
self.visible = false;
}
});
};
// Touch/click event
self.down = function (x, y, obj) {
// Prevent cutting if NumberPadOverride is active
if (typeof game !== "undefined" && game._numberPadOverride && game._numberPadOverride.active) {
return;
}
// Prevent cutting if malfunction/screw minigame is active
if (typeof malfunctionActive !== "undefined" && malfunctionActive) {
return;
}
if (self.cut) {
return;
}
if (typeof self.onCut === 'function') {
self.onCut(self);
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x181818
});
/****
* Game Code
****/
// Sounds
// Malfunction overlay
// Screw (for malfunction minigame)
// Communication screen
// Panel
// Wires: red, blue, green, yellow, black, white
// --- Game constants ---
var WIRE_COLORS = ['red', 'blue', 'green', 'yellow', 'black', 'white'];
var WIRES_PER_PANEL = 4;
var PANEL_X = 2048 / 2;
var PANEL_Y = 2732 / 2;
var PANEL_W = 700;
var PANEL_H = 500;
var SCREEN_H = 180;
var ROUND_TIME = 8000; // ms per round
var MALFUNCTION_CHANCE = 0.18; // 18% chance per round
// --- Game state ---
var wires = [];
var panel = null;
var screen = null;
var screenText = null;
var malOverlay = null;
var screws = [];
var screwBox = null; // Box for screws during malfunction minigame
var malfunctionActive = false;
var roundTimer = null;
var timeLeft = 0;
var timerBar = null;
var correctWireColor = '';
var canCut = true;
var scoreText = null;
var roundNum = 0;
var tickingSoundTimer = null;
// --- GUI ---
scoreText = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(scoreText);
// Timer bar
timerBar = LK.getAsset('panel_bg', {
width: 600,
height: 24,
color: 0x44ff44,
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 180
});
game.addChild(timerBar);
// --- Panel setup ---
panel = new Container();
var panelBorder = panel.attachAsset('panel_border', {
anchorX: 0.5,
anchorY: 0.5
});
var panelBg = panel.attachAsset('panel_bg', {
anchorX: 0.5,
anchorY: 0.5
});
// Add a box inside the panel_bg (steel panel)
var innerBox = panel.attachAsset('panel_border', {
anchorX: 0.5,
anchorY: 0.5,
width: 900,
// slightly smaller than panel_bg (1500x2000), visually inside
height: 1200,
x: 0,
y: 50 // move it down a bit to be inside the panel visually
});
panel.x = PANEL_X;
panel.y = PANEL_Y;
game.addChild(panel);
// --- Communication screen ---
screen = new Container();
var screenBg = screen.attachAsset('screen', {
anchorX: 0.5,
anchorY: 0.5
});
screen.x = 0;
// Place the screen at the top of the panel, matching the panel_bg aspect ratio (panel_bg is 1500x2000, so screen should be near the top edge)
screen.y = -1000 + SCREEN_H / 2 + 60 + 40; // -1000 is half of 2000 (panel_bg height), add some margin
panel.addChild(screen);
screenText = new Text2('', {
size: 60,
fill: "#fff"
});
screenText.anchor.set(0.5, 0.5);
screen.addChild(screenText);
// Malfunction overlay (hidden by default)
malOverlay = LK.getAsset('mal_overlay', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 0,
alpha: 0.8
});
// Center malOverlay in the middle of the screen container
malOverlay.x = 0;
malOverlay.y = 0;
malOverlay.visible = false;
screen.addChild(malOverlay);
// --- Functions ---
function shuffle(arr) {
// Fisher-Yates shuffle
for (var i = arr.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
return arr;
}
function startRound() {
roundNum += 1;
canCut = true;
malfunctionActive = false;
// Remove old wires
for (var i = 0; i < wires.length; i++) {
wires[i].destroy();
}
wires = [];
// Remove screws if any
for (var i = 0; i < screws.length; i++) {
screws[i].destroy();
}
screws = [];
// Randomize wires
var colorPool = shuffle(WIRE_COLORS.slice());
var roundWires = colorPool.slice(0, WIRES_PER_PANEL);
// Pick correct wire
correctWireColor = roundWires[Math.floor(Math.random() * roundWires.length)];
// Place wires vertically in panel
var spacing = PANEL_H / (WIRES_PER_PANEL + 1);
for (var i = 0; i < roundWires.length; i++) {
var w = new Wire();
w.init(roundWires[i]);
w.x = 0;
w.y = -PANEL_H / 2 + spacing * (i + 1) + 40;
w.onCut = handleWireCut;
panel.addChild(w);
wires.push(w);
}
// Set screen text
screenText.setText(correctWireColor.toUpperCase() + ' WIRE!');
screenText.visible = true;
screenText.setStyle({
fill: '#309191'
}); // Always set text color to black for correctWireColor
malOverlay.visible = false;
// Malfunction?
var malfunctionChance = MALFUNCTION_CHANCE;
if (LK.getScore() > 30) {
// Gradually increase malfunction chance after score 30, up to 35%
malfunctionChance = Math.min(0.35, MALFUNCTION_CHANCE + 0.01 * (LK.getScore() - 30));
}
// Immediately trigger malfunction after wires are reset
if (Math.random() < malfunctionChance) {
// 50% chance to trigger NumberPadOverride, 50% fallback to normal malfunction
if (Math.random() < 0.5) {
// Trigger NumberPadOverride ONLY here, after wires are reset
if (typeof game._numberPadOverride === "undefined" || !game._numberPadOverride) {
game._numberPadOverride = new NumberPadOverride();
game.addChild(game._numberPadOverride);
}
// Keep timer visible during NumberPadOverride
var code = [];
for (var i = 0; i < 4; i++) {
code.push(Math.floor(Math.random() * 10));
}
var timeLimit = 5000 + Math.floor(Math.random() * 2000); // 5-7s
// Pause main timer during NumberPadOverride
canCut = false;
game._numberPadOverride.start(code, timeLimit, function (success) {
malfunctionActive = false;
malOverlay.visible = false;
screenText.visible = true;
canCut = true;
if (!success) {
LK.setTimeout(function () {
LK.showGameOver();
}, 600);
}
});
LK.getSound('beep').play();
// Do not trigger other malfunctions this round
return;
} else {
LK.setTimeout(triggerMalfunction, 600 + Math.floor(Math.random() * 800));
}
}
// Start timer
timeLeft = ROUND_TIME;
updateTimerBar();
if (roundTimer) {
LK.clearInterval(roundTimer);
}
roundTimer = LK.setInterval(tickTimer, 30);
// Ticking sound
if (tickingSoundTimer) {
LK.clearInterval(tickingSoundTimer);
}
tickingSoundTimer = LK.setInterval(function () {
LK.getSound('tick').play();
}, 1000);
}
function handleWireCut(wire) {
if (!canCut || malfunctionActive && !screws.length) {
return;
}
canCut = false;
wire.cutWire();
if (wire.color === correctWireColor) {
// Success!
LK.getSound('cut').play();
LK.setScore(LK.getScore() + 1);
scoreText.setText(LK.getScore());
// Animate panel flash green
LK.effects.flashObject(panel, 0x44ff44, 300);
// Next round after short delay
LK.setTimeout(function () {
startRound();
}, 700);
} else {
// Wrong wire!
LK.getSound('fail').play();
LK.effects.flashScreen(0xff0000, 600);
LK.setScore(Math.max(0, LK.getScore() - 1));
scoreText.setText(LK.getScore());
// Game over
LK.setTimeout(function () {
LK.showGameOver();
}, 600);
}
}
function tickTimer() {
if (!canCut) {
return;
}
// Gradually speed up timer after score > 20
var timerDecrement = 30;
var score = LK.getScore();
if (score > 20) {
// Increase speed: for every 10 points above 20, timerDecrement increases by 2ms, up to a max of 20ms per tick
var extra = Math.min(20, Math.floor((score - 20) / 10) * 2);
timerDecrement += extra;
}
timeLeft -= timerDecrement;
// --- Add: Score increases with time (every 1000ms, +1 score) ---
if (typeof tickTimer._accum === "undefined") {
tickTimer._accum = 0;
tickTimer._lastScoreTime = 0;
}
tickTimer._accum += timerDecrement;
if (tickTimer._accum - tickTimer._lastScoreTime >= 1000) {
LK.setScore(LK.getScore() + 1);
scoreText.setText(LK.getScore());
tickTimer._lastScoreTime += 1000;
}
updateTimerBar();
if (timeLeft <= 0) {
canCut = false;
LK.getSound('fail').play();
LK.effects.flashScreen(0xff0000, 600);
LK.setTimeout(function () {
LK.showGameOver();
}, 600);
}
}
function updateTimerBar() {
// Remove bar visual, show countdown number instead
timerBar.visible = false;
// Add or update a countdown number Text2 object
if (typeof updateTimerBar.timerNumber === "undefined") {
updateTimerBar.timerNumber = new Text2('', {
size: 100,
fill: '#fc1100'
});
updateTimerBar.timerNumber.anchor.set(0.5, 0.5);
updateTimerBar.timerNumber.x = 2048 / 2;
updateTimerBar.timerNumber.y = 180;
game.addChild(updateTimerBar.timerNumber);
}
var secondsLeft = Math.ceil(Math.max(0, timeLeft) / 1000);
updateTimerBar.timerNumber.setText(secondsLeft);
// Always set timer number text color to red
updateTimerBar.timerNumber.setStyle({
fill: '#fc1100'
});
}
function triggerMalfunction() {
if (!canCut) {
return;
}
malfunctionActive = true;
screenText.visible = false;
malOverlay.visible = true;
// Hide screws for now, only show after click
for (var i = 0; i < screws.length; i++) {
screws[i].destroy();
}
screws = [];
// Always use screw minigame here; NumberPadOverride is only triggered after wires are reset
// --- Screw minigame fallback ---
// Add a click handler to the screen to show the screw minigame or penalize misclicks
screen.down = function (x, y, obj) {
// If the screw minigame is not yet started, start it
if (!screwBox) {
// Remove this handler after first click (but will be re-added below for misclicks)
screen.down = undefined;
// Create a new box (screwBox) that will contain the screws, centered on the bomb/panel
if (typeof screwBox !== "undefined" && screwBox && screwBox.parent) {
screwBox.parent.removeChild(screwBox);
}
screwBox = new Container();
// Add a background for the screwBox (use panel_border for visual consistency)
var screwBoxBg = screwBox.attachAsset('CommBack', {
anchorX: 0.5,
anchorY: 0.5,
width: 1500,
// Match panel_bg width
height: 1000,
// Half of panel_bg height (2000px)
x: 0,
y: 0
});
// Center the screwBox on the panel
screwBox.x = 0;
screwBox.y = 0;
panel.addChild(screwBox);
// Show screws at random positions inside the screwBox
var screwCount = 3 + Math.floor(Math.random() * 2); // 3 or 4
screws = [];
for (var i = 0; i < screwCount; i++) {
var s = new Screw();
// Place randomly within the screwBox area
s.x = -220 + Math.random() * 440;
s.y = -120 + Math.random() * 240;
s.onFix = function (screw) {
handleScrewFix(screw);
// If all screws are fixed, remove the screwBox and return to bomb screen
var allFixed = true;
for (var j = 0; j < screws.length; j++) {
if (!screws[j].fixed) {
allFixed = false;
break;
}
}
if (allFixed) {
if (screwBox && screwBox.parent) {
screwBox.parent.removeChild(screwBox);
}
screwBox = null;
// Remove misclick handler when done
screen.down = undefined;
}
};
screwBox.addChild(s);
screws.push(s);
}
LK.getSound('beep').play();
// Add a misclick handler to penalize clicks outside screws
screen.down = function (x, y, obj) {
// Only penalize if screws are still present and not all fixed
var allFixed = true;
for (var i = 0; i < screws.length; i++) {
if (!screws[i].fixed) {
allFixed = false;
break;
}
}
if (allFixed) {
// Remove handler if all fixed
screen.down = undefined;
return;
}
// Check if click is on any visible, unfixed screw
var local = screwBox.toLocal({
x: x,
y: y
});
var hitScrew = false;
for (var i = 0; i < screws.length; i++) {
var s = screws[i];
if (!s.fixed && s.visible) {
// Check bounding box hit (screw asset is centered, 59x59)
var dx = local.x - s.x;
var dy = local.y - s.y;
if (Math.abs(dx) <= 40 && Math.abs(dy) <= 40) {
hitScrew = true;
break;
}
}
}
if (!hitScrew) {
// Flash red and reduce timer
LK.effects.flashScreen(0xff0000, 300);
// Reduce timer by 1 second (1000ms), but not below 0
timeLeft = Math.max(0, timeLeft - 1000);
updateTimerBar();
}
};
}
};
}
function handleScrewFix(screw) {
// Don't allow fixing screws if the minigame hasn't started (blank screen)
if (!screws.length) {
return;
}
LK.getSound('fix').play();
// Check if all screws fixed
var allFixed = true;
for (var i = 0; i < screws.length; i++) {
if (!screws[i].fixed) {
allFixed = false;
break;
}
}
if (allFixed) {
// Add 3 seconds to timer after screw minigame completion
if (typeof timeLeft !== "undefined") {
timeLeft += 3000;
if (typeof updateTimerBar === "function") updateTimerBar();
}
malfunctionActive = false;
malOverlay.visible = false;
screenText.visible = true;
// Remove screws from screen
for (var i = 0; i < screws.length; i++) {
screws[i].destroy();
}
screws = [];
// Remove any leftover click handler
screen.down = undefined;
}
}
// --- Game event handlers ---
// Drag prevention: no drag in this game
game.move = function (x, y, obj) {};
// --- Game update loop ---
game.update = function () {
// Win condition: e.g. 20 points
if (LK.getScore() >= 99999999999) {
LK.showYouWin();
}
};
// --- Start game ---
// Add Starter asset as a closing plate visually covering the panel (add as top child of panel)
var starterAsset = LK.getAsset('Starter', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 0
});
panel.addChild(starterAsset); // Add as top child so it covers the panel visually
// Add "Ready to Defuse the bomb" text on top of the Starter asset
var starterText = new Text2('Ready to Defuse the bomb', {
size: 60,
fill: "#fff"
});
starterText.anchor.set(0.5, 0.5);
starterText.x = 0;
starterText.y = 0;
panel.addChild(starterText);
// Add "Cut the correct wire to defuse the bomb" at the top of the screen (GUI)
var instructionText = new Text2('Cut the correct wire to defuse the bomb', {
size: 48,
fill: "#fff"
});
instructionText.anchor.set(0.5, 0);
instructionText.y = 120; // Move it 120px down from the top for more space
LK.gui.top.addChild(instructionText);
// Hide timer and panel content until game starts, but do NOT hide any other assets
// Instead of hiding the panel, hide its children except the starterAsset and starterText
for (var i = 0; i < panel.children.length; i++) {
if (panel.children[i] !== starterAsset && panel.children[i] !== starterText) {
panel.children[i].visible = false;
}
}
if (typeof updateTimerBar.timerNumber !== "undefined") {
updateTimerBar.timerNumber.visible = false;
}
timerBar.visible = false;
// Do not hide or remove any other assets when Starter is present
// Pause all game logic until Starter is clicked
var gameStarted = false;
var startGame = function startGame() {
if (gameStarted) return;
gameStarted = true;
// Remove starter asset (the closing plate)
if (starterAsset && starterAsset.parent) {
starterAsset.parent.removeChild(starterAsset);
}
// Remove starter text
if (starterText && starterText.parent) {
starterText.parent.removeChild(starterText);
}
// Remove instruction text from GUI
if (instructionText && instructionText.parent) {
instructionText.parent.removeChild(instructionText);
}
// Show panel content and timer
for (var i = 0; i < panel.children.length; i++) {
if (panel.children[i] !== starterAsset && panel.children[i] !== starterText) {
panel.children[i].visible = true;
}
}
if (typeof updateTimerBar.timerNumber !== "undefined") {
updateTimerBar.timerNumber.visible = true;
}
timerBar.visible = false; // timerBar is always hidden, only timerNumber is shown
// Actually start the game
LK.playMusic('Run');
LK.setScore(0);
scoreText.setText('0');
startRound();
};
// Only start game on click/tap of Starter asset
starterAsset.down = function (x, y, obj) {
startGame();
}; ===================================================================
--- original.js
+++ change.js
@@ -529,10 +529,10 @@
malOverlay.visible = false;
// Malfunction?
var malfunctionChance = MALFUNCTION_CHANCE;
if (LK.getScore() > 30) {
- // Gradually increase malfunction chance after score 30, up to 60%
- malfunctionChance = Math.min(0.6, MALFUNCTION_CHANCE + 0.02 * (LK.getScore() - 30));
+ // Gradually increase malfunction chance after score 30, up to 35%
+ malfunctionChance = Math.min(0.35, MALFUNCTION_CHANCE + 0.01 * (LK.getScore() - 30));
}
// Immediately trigger malfunction after wires are reset
if (Math.random() < malfunctionChance) {
// 50% chance to trigger NumberPadOverride, 50% fallback to normal malfunction
@@ -541,21 +541,21 @@
if (typeof game._numberPadOverride === "undefined" || !game._numberPadOverride) {
game._numberPadOverride = new NumberPadOverride();
game.addChild(game._numberPadOverride);
}
- // Reset timer number display before showing NumberPadOverride
- if (typeof updateTimerBar.timerNumber !== "undefined") {
- updateTimerBar.timerNumber.setText('');
- }
+ // Keep timer visible during NumberPadOverride
var code = [];
for (var i = 0; i < 4; i++) {
code.push(Math.floor(Math.random() * 10));
}
var timeLimit = 5000 + Math.floor(Math.random() * 2000); // 5-7s
+ // Pause main timer during NumberPadOverride
+ canCut = false;
game._numberPadOverride.start(code, timeLimit, function (success) {
malfunctionActive = false;
malOverlay.visible = false;
screenText.visible = true;
+ canCut = true;
if (!success) {
LK.setTimeout(function () {
LK.showGameOver();
}, 600);
@@ -597,12 +597,8 @@
// Animate panel flash green
LK.effects.flashObject(panel, 0x44ff44, 300);
// Next round after short delay
LK.setTimeout(function () {
- // Reset timer number display before starting the next round (fixes num pad not resetting timer)
- if (typeof updateTimerBar.timerNumber !== "undefined") {
- updateTimerBar.timerNumber.setText('');
- }
startRound();
}, 700);
} else {
// Wrong wire!
@@ -623,10 +619,10 @@
// Gradually speed up timer after score > 20
var timerDecrement = 30;
var score = LK.getScore();
if (score > 20) {
- // Increase speed: for every 5 points above 20, timerDecrement increases by 2ms, up to a max of 60ms per tick
- var extra = Math.min(40, Math.floor((score - 20) / 5) * 2);
+ // Increase speed: for every 10 points above 20, timerDecrement increases by 2ms, up to a max of 20ms per tick
+ var extra = Math.min(20, Math.floor((score - 20) / 10) * 2);
timerDecrement += extra;
}
timeLeft -= timerDecrement;
// --- Add: Score increases with time (every 1000ms, +1 score) ---
It is like the back of a bomb, wires on the side. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
It's a screen, very chip like, light blue screen. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
“Top-down view of a steel box with a smooth metallic surface, subtle reflections, and sharp clean edges. The box should appear sturdy and industrial, with a slightly brushed texture on the steel. Lighting highlights the metal’s cool gray color and gives depth to the edges. Minimal shadows inside the box, set against a plain light background.”. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
it's a black wire. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
it's a blue wire. Don't cut it open, just blue nothing else. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
it's a green wire. Don't cut it open, just blue nothing else. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
it's a red wire. Don't cut it open, just blue nothing else. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
it's a yellow wire. Don't cut it open, just blue nothing else. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
paint it white
It's like back of a chip display. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Make it light greyish black
It is a black screen, like a glass pane. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Make it steel
That's a button, imagine a keyboard button. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
make it as a perfect rectangle, screws on all the corners. no background, transparent background