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
});
} 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();
// 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.style.fill = "#ff0000";
} else if (self.timeRemaining <= 10) {
timerText.style.fill = "#ffaa00";
} else {
timerText.style.fill = "#ffffff";
}
};
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("Choose a chamber or spin the cylinder!");
// 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.style.fill = "#ff0000";
} else {
pullTriggerBtn.alpha = 0.5;
pullTriggerBtn.style.fill = "#550000";
}
// 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
@@ -1,6 +1,565 @@
-/****
+/****
+* 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
+ });
+ } 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();
+ // 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.style.fill = "#ff0000";
+ } else if (self.timeRemaining <= 10) {
+ timerText.style.fill = "#ffaa00";
+ } else {
+ timerText.style.fill = "#ffffff";
+ }
+ };
+ self.onTimeUp = null;
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ 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("Choose a chamber or spin the cylinder!");
+ // 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.style.fill = "#ff0000";
+ } else {
+ pullTriggerBtn.alpha = 0.5;
+ pullTriggerBtn.style.fill = "#550000";
+ }
+ // 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();
\ No newline at end of file