Code edit (1 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
User prompt
Change color of pull trigger to light grey
User prompt
Please fix the bug: 'undefined is not an object (evaluating 'instructionsTxt.setText("Select a chamber or spin!").setStyle')' in or related to this line: 'instructionsTxt.setText("Select a chamber or spin!").setStyle({' Line Number: 439
User prompt
The press trigger is not clear and when you choose a chamber make the text bigger and make it simpler to understand
User prompt
Games a bit buggy, make it fr spin, make the text color better and make the choose the chamber system better
User prompt
Please fix the bug: 'TypeError: undefined is not an object (evaluating 'pullTriggerBtn.style.fill = "#550000"')' in or related to this line: 'pullTriggerBtn.style.fill = "#550000";' Line Number: 571
User prompt
Please fix the bug: 'undefined is not an object (evaluating 'timerText.style.fill = "#ffffff"')' in or related to this line: 'timerText.style.fill = "#ffffff";' Line Number: 276
Code edit (1 edits merged)
Please save this source code
User prompt
Nerve Rush Roulette
Initial prompt
Make a Russian roullet game with levels
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0, currentLevel: 1 }); /**** * Classes ****/ var BulletIndicator = Container.expand(function () { var self = Container.call(this); var bulletShape = self.attachAsset('bulletIndicator', { anchorX: 0.5, anchorY: 0.5 }); self.setActive = function (active) { bulletShape.alpha = active ? 1 : 0.3; }; return self; }); var Chamber = Container.expand(function () { var self = Container.call(this); // Chamber properties self.loaded = false; self.selected = false; self.angle = 0; // Chamber visuals var chamberBg = self.attachAsset('chamber', { anchorX: 0.5, anchorY: 0.5 }); var chamberHole = self.attachAsset('chamberHole', { anchorX: 0.5, anchorY: 0.5 }); self.setLoaded = function (isLoaded) { self.loaded = isLoaded; // Only show the red bullet indicator if revealed if (self.revealed && isLoaded) { chamberHole.destroy(); chamberHole = self.attachAsset('chamberLoaded', { anchorX: 0.5, anchorY: 0.5 }); } }; self.setRevealed = function (isRevealed) { self.revealed = isRevealed; if (isRevealed && self.loaded) { chamberHole.destroy(); chamberHole = self.attachAsset('chamberLoaded', { anchorX: 0.5, anchorY: 0.5 }); } }; self.setSelected = function (isSelected) { self.selected = isSelected; if (isSelected) { tween(chamberBg, { alpha: 0.7 }, { duration: 200 }); LK.getSound('click').play(); // Play sound when chamber is selected } else { tween(chamberBg, { alpha: 1 }, { duration: 200 }); } }; self.setAngle = function (newAngle) { self.angle = newAngle; }; self.down = function (x, y, obj) { if (!gameActive || spinningCylinder) { return; } self.setSelected(true); selectedChamber = self; }; return self; }); var Gun = Container.expand(function () { var self = Container.call(this); // Gun body var gunBody = self.attachAsset('gun', { anchorX: 0.5, anchorY: 0.5 }); // Gun handle var gunHandle = self.attachAsset('gunHandle', { anchorX: 0.5, anchorY: 0, y: 150 }); // Cylinder var cylinder = self.attachAsset('cylinder', { anchorX: 0.5, anchorY: 0.5, x: 50, y: -50 }); // Create chambers self.chambers = []; self.setupLevel = function (level) { // Clear existing chambers for (var i = 0; i < self.chambers.length; i++) { self.chambers[i].destroy(); } self.chambers = []; // Number of chambers based on level var chamberCount = 6; if (level > 5) { chamberCount = 8; } if (level > 10) { chamberCount = 10; } // Number of bullets based on level var bulletCount = Math.min(Math.floor(level / 2) + 1, chamberCount - 1); // Create chambers for (var i = 0; i < chamberCount; i++) { var chamber = new Chamber(); var angle = i / chamberCount * Math.PI * 2; var radius = 180; chamber.x = Math.cos(angle) * radius + 50; chamber.y = Math.sin(angle) * radius - 50; chamber.setAngle(angle); self.chambers.push(chamber); self.addChild(chamber); } // Randomly load chambers var loadedIndexes = []; while (loadedIndexes.length < bulletCount) { var randomIndex = Math.floor(Math.random() * chamberCount); if (loadedIndexes.indexOf(randomIndex) === -1) { loadedIndexes.push(randomIndex); } } for (var i = 0; i < loadedIndexes.length; i++) { self.chambers[loadedIndexes[i]].setLoaded(true); } return { chamberCount: chamberCount, bulletCount: bulletCount }; }; self.spinCylinder = function (callback) { var spinDuration = 1500; LK.getSound('spin').play(); // Add visual effect for spinning tween(cylinder, { scaleX: 1.1, scaleY: 1.1 }, { duration: 200, yoyo: true, repeat: 3 }); // Spin animation var rotations = 3 + Math.random() * 2; var startRotation = cylinder.rotation; var endRotation = startRotation + rotations * Math.PI * 2; tween(cylinder, { rotation: endRotation }, { duration: spinDuration, easing: tween.easeOutQuad, onFinish: function onFinish() { if (callback) { callback(); } } }); // Reorder the chambers randomly var newOrder = []; for (var i = 0; i < self.chambers.length; i++) { newOrder.push(i); } // Fisher-Yates shuffle for (var i = newOrder.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = newOrder[i]; newOrder[i] = newOrder[j]; newOrder[j] = temp; } // Store the chamber properties var loadedStates = []; for (var i = 0; i < self.chambers.length; i++) { loadedStates.push({ loaded: self.chambers[i].loaded, revealed: self.chambers[i].revealed }); } // Apply new order for (var i = 0; i < self.chambers.length; i++) { self.chambers[i].setLoaded(loadedStates[newOrder[i]].loaded); self.chambers[i].setRevealed(loadedStates[newOrder[i]].revealed); } }; return self; }); var LevelDisplay = Container.expand(function () { var self = Container.call(this); var bg = self.attachAsset('levelIndicator', { anchorX: 0.5, anchorY: 0.5 }); var levelText = new Text2("Level 1", { size: 40, fill: 0xFFFFFF }); levelText.anchor.set(0.5, 0.5); self.addChild(levelText); self.updateLevel = function (level) { levelText.setText("Level " + level); }; return self; }); var Timer = Container.expand(function () { var self = Container.call(this); var timerText = new Text2("", { size: 50, fill: 0xFFFFFF }); timerText.anchor.set(0.5, 0.5); self.addChild(timerText); self.timeRemaining = 0; self.active = false; self.timerInterval = null; self.startTimer = function (seconds) { self.timeRemaining = seconds; self.active = true; self.updateDisplay(); if (self.timerInterval) { LK.clearInterval(self.timerInterval); } self.timerInterval = LK.setInterval(function () { if (self.active) { self.timeRemaining -= 0.1; if (self.timeRemaining <= 0) { self.timeRemaining = 0; self.active = false; if (self.onTimeUp) { self.onTimeUp(); } } self.updateDisplay(); } }, 100); }; self.stopTimer = function () { self.active = false; if (self.timerInterval) { LK.clearInterval(self.timerInterval); self.timerInterval = null; } }; self.updateDisplay = function () { timerText.setText(Math.ceil(self.timeRemaining).toString()); // Change color based on time remaining if (self.timeRemaining <= 5) { timerText.setStyle({ fill: 0xFF3333 //{20} // Slightly lighter red for better visibility }); } else if (self.timeRemaining <= 10) { timerText.setStyle({ fill: 0xFFCC33 //{23} // Brighter orange for better visibility }); } else { timerText.setStyle({ fill: 0xDDDDDD //{27} // Softer white for better contrast }); } }; self.onTimeUp = null; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000022 }); /**** * Game Code ****/ // Game state variables var currentLevel = storage.currentLevel || 1; var score = 0; var highScore = storage.highScore || 0; var gameActive = false; var spinningCylinder = false; var selectedChamber = null; var levelData = null; var timePerTurn = 0; var remainingEmptyChambers = 0; // Game elements var gun = new Gun(); var levelDisplay = new LevelDisplay(); var timer = new Timer(); var bulletIndicators = []; // Score display var scoreTxt = new Text2("Score: 0", { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); // High score display var highScoreTxt = new Text2("High Score: " + highScore, { size: 40, fill: 0xFFAA00 }); highScoreTxt.anchor.set(0.5, 0); // Game message text var messageTxt = new Text2("", { size: 70, fill: 0xFFFFFF }); messageTxt.anchor.set(0.5, 0.5); // Instructions text var instructionsTxt = new Text2("", { size: 50, fill: 0xFFFFFF }); instructionsTxt.anchor.set(0.5, 0); // "Pull Trigger" button var pullTriggerBtn = new Text2("PULL TRIGGER", { size: 80, fill: 0xFF0000 }); pullTriggerBtn.anchor.set(0.5, 0.5); pullTriggerBtn.interactive = true; // "Spin" button var spinBtn = new Text2("SPIN CYLINDER", { size: 60, fill: 0xFFFFFF }); spinBtn.anchor.set(0.5, 0.5); spinBtn.interactive = true; function setupGame() { // Add game elements game.addChild(gun); gun.x = 2048 / 2; gun.y = 2732 / 2 - 200; // Add level display game.addChild(levelDisplay); levelDisplay.x = 2048 / 2; levelDisplay.y = 150; // Add timer game.addChild(timer); timer.x = 2048 / 2; timer.y = 250; // Add score text LK.gui.top.addChild(scoreTxt); scoreTxt.y = 20; // Add high score text LK.gui.top.addChild(highScoreTxt); highScoreTxt.y = 90; // Add message text game.addChild(messageTxt); messageTxt.x = 2048 / 2; messageTxt.y = 2732 / 2 - 600; // Add instructions text game.addChild(instructionsTxt); instructionsTxt.x = 2048 / 2; instructionsTxt.y = 2732 - 200; // Add pull trigger button game.addChild(pullTriggerBtn); pullTriggerBtn.x = 2048 / 2; pullTriggerBtn.y = 2732 - 350; // Add spin button game.addChild(spinBtn); spinBtn.x = 2048 / 2; spinBtn.y = 2732 - 450; // Button events pullTriggerBtn.down = onPullTrigger; spinBtn.down = onSpinCylinder; // Timer event timer.onTimeUp = function () { if (gameActive) { showMessage("Time's up!"); LK.setTimeout(function () { endGame(); }, 1500); } }; // Start level startLevel(currentLevel); // Play background music LK.playMusic('tensionMusic', { loop: true }); } function startLevel(level) { // Reset state gameActive = true; spinningCylinder = false; selectedChamber = null; currentLevel = level; // Update level display levelDisplay.updateLevel(level); // Set up gun with current level difficulty levelData = gun.setupLevel(level); // Calculate time per turn based on level timePerTurn = Math.max(30 - level * 1.5, 10); // Set remaining empty chambers remainingEmptyChambers = levelData.chamberCount - levelData.bulletCount; // Create bullet indicators createBulletIndicators(levelData.bulletCount); // Update score display updateScoreDisplay(); // Update instructions instructionsTxt.setText("Select a chamber or spin!").setStyle({ size: 60 }); // Show level start message showMessage("Level " + level + " - " + levelData.bulletCount + " bullet" + (levelData.bulletCount > 1 ? "s" : "")); // Start timer timer.startTimer(timePerTurn); // Save current level storage.currentLevel = currentLevel; } function createBulletIndicators(bulletCount) { // Remove existing indicators for (var i = 0; i < bulletIndicators.length; i++) { bulletIndicators[i].destroy(); } bulletIndicators = []; // Create new indicators var spacing = 50; var totalWidth = (bulletCount - 1) * spacing; var startX = 2048 / 2 - totalWidth / 2; for (var i = 0; i < bulletCount; i++) { var indicator = new BulletIndicator(); indicator.x = startX + i * spacing; indicator.y = 350; indicator.setActive(true); game.addChild(indicator); bulletIndicators.push(indicator); } } function onSpinCylinder() { if (!gameActive || spinningCylinder) { return; } spinningCylinder = true; instructionsTxt.setText("Spinning..."); // Reset selection if (selectedChamber) { selectedChamber.setSelected(false); selectedChamber = null; } gun.spinCylinder(function () { spinningCylinder = false; instructionsTxt.setText("Choose a chamber!"); // Reset timer for this turn timer.startTimer(timePerTurn); }); } function onPullTrigger() { if (!gameActive || spinningCylinder || !selectedChamber) { return; } gameActive = false; // Temporarily disable game while animation plays // Reveal the chamber selectedChamber.setRevealed(true); LK.setTimeout(function () { if (selectedChamber.loaded) { // Chamber was loaded - game over LK.getSound('bang').play(); // Flash screen red LK.effects.flashScreen(0xff0000, 1000); showMessage("BANG! Game Over!"); // Update bullet indicator updateBulletIndicator(); LK.setTimeout(function () { endGame(); }, 2000); } else { // Chamber was empty - continue game LK.getSound('click').play(); // Disable the selected chamber selectedChamber.setSelected(false); selectedChamber.alpha = 0.3; selectedChamber.interactive = false; // Update score score += currentLevel * 10; updateScoreDisplay(); // Update remaining empty chambers remainingEmptyChambers--; // Check if level completed if (remainingEmptyChambers <= 0) { LK.getSound('win').play(); showMessage("Level Complete!"); LK.setTimeout(function () { startLevel(currentLevel + 1); }, 2000); } else { // Reset for next turn selectedChamber = null; gameActive = true; // Reset timer for this turn timer.startTimer(timePerTurn); // Update instructions instructionsTxt.setText("Choose another chamber!"); } } }, 1000); } function updateBulletIndicator() { // Find the first active indicator and deactivate it for (var i = 0; i < bulletIndicators.length; i++) { if (bulletIndicators[i].alpha === 1) { bulletIndicators[i].setActive(false); break; } } } function showMessage(text) { messageTxt.setText(text); messageTxt.alpha = 1; // Fade out after 2 seconds LK.setTimeout(function () { tween(messageTxt, { alpha: 0 }, { duration: 500 }); }, 2000); } function updateScoreDisplay() { scoreTxt.setText("Score: " + score); // Update high score if needed if (score > highScore) { highScore = score; storage.highScore = highScore; highScoreTxt.setText("High Score: " + highScore); } } function endGame() { // Game over logic LK.showGameOver(); // Reset variables for next game currentLevel = 1; score = 0; gameActive = false; } // Game update function game.update = function () { // This function is called every frame (60 times per second) // Pulse effect for the pull trigger button if (gameActive && selectedChamber) { pullTriggerBtn.alpha = 0.7 + Math.sin(LK.ticks / 10) * 0.3; pullTriggerBtn.setStyle({ fill: 0xff0000, size: 100 }); } else { pullTriggerBtn.alpha = 0.5; pullTriggerBtn.setStyle({ fill: 0x550000, size: 100 }); } // Spin button visibility if (gameActive && !spinningCylinder) { spinBtn.alpha = 1; } else { spinBtn.alpha = 0.5; } }; // Mouse or touch events game.down = function (x, y, obj) { // Handle global down events }; game.up = function (x, y, obj) { // Handle global up events }; // Initialize the game setupGame();
===================================================================
--- original.js
+++ change.js
@@ -418,9 +418,11 @@
createBulletIndicators(levelData.bulletCount);
// Update score display
updateScoreDisplay();
// Update instructions
- instructionsTxt.setText("Choose a chamber or spin the cylinder!");
+ instructionsTxt.setText("Select a chamber or spin!").setStyle({
+ size: 60
+ });
// Show level start message
showMessage("Level " + level + " - " + levelData.bulletCount + " bullet" + (levelData.bulletCount > 1 ? "s" : ""));
// Start timer
timer.startTimer(timePerTurn);
@@ -558,14 +560,16 @@
// Pulse effect for the pull trigger button
if (gameActive && selectedChamber) {
pullTriggerBtn.alpha = 0.7 + Math.sin(LK.ticks / 10) * 0.3;
pullTriggerBtn.setStyle({
- fill: 0xff0000
+ fill: 0xff0000,
+ size: 100
});
} else {
pullTriggerBtn.alpha = 0.5;
pullTriggerBtn.setStyle({
- fill: 0x550000
+ fill: 0x550000,
+ size: 100
});
}
// Spin button visibility
if (gameActive && !spinningCylinder) {