/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var MuteButton = Container.expand(function () { var self = Container.call(this); self.isMuted = false; // Button background self.buttonBg = self.attachAsset('unmuteButton', { anchorX: 0.5, anchorY: 0.5 }); // Button text self.buttonText = new Text2('🔊', { size: 40, fill: 0xFFFFFF }); self.buttonText.anchor.set(0.5, 0.5); self.addChild(self.buttonText); // Position button at top right self.x = 2048 - 120; self.y = 120; self.toggleMute = function () { self.isMuted = !self.isMuted; // Update button appearance self.removeChild(self.buttonBg); self.buttonBg = self.attachAsset(self.isMuted ? 'muteButton' : 'unmuteButton', { anchorX: 0.5, anchorY: 0.5 }); // Update button text self.buttonText.setText(self.isMuted ? '🔇' : '🔊'); // Ensure text stays on top self.removeChild(self.buttonText); self.addChild(self.buttonText); // Toggle music using stop/play to reset position if (self.isMuted) { // Stop music completely LK.stopMusic(); } else { // Start music from beginning LK.playMusic('chill'); } }; self.down = function (x, y, obj) { if (!menuActive) { self.toggleMute(); } }; return self; }); var SpeedButton = Container.expand(function (speed, text, xPos) { var self = Container.call(this); self.speed = speed; self.active = speed === 1; // 1x speed is active by default // Button background var buttonAsset = 'speedButton'; var activeButtonAsset = 'activeSpeedButton'; if (speed === 5) { buttonAsset = 'speedButton5x'; activeButtonAsset = 'activeSpeedButton5x'; } else if (speed === 10) { buttonAsset = 'speedButton10x'; activeButtonAsset = 'activeSpeedButton10x'; } self.buttonBg = self.attachAsset(self.active ? activeButtonAsset : buttonAsset, { anchorX: 0.5, anchorY: 0.5 }); // Button text self.speedText = new Text2(text, { size: 40, fill: 0xFFFFFF }); self.speedText.anchor.set(0.5, 0.5); self.addChild(self.speedText); // Position button self.x = xPos; self.y = 2732 - 100; // Bottom of screen with some padding self.setActive = function (active) { self.active = active; self.removeChild(self.buttonBg); var buttonAsset = 'speedButton'; var activeButtonAsset = 'activeSpeedButton'; if (self.speed === 5) { buttonAsset = 'speedButton5x'; activeButtonAsset = 'activeSpeedButton5x'; } else if (self.speed === 10) { buttonAsset = 'speedButton10x'; activeButtonAsset = 'activeSpeedButton10x'; } self.buttonBg = self.attachAsset(active ? activeButtonAsset : buttonAsset, { anchorX: 0.5, anchorY: 0.5 }); // Ensure text stays on top of button background self.removeChild(self.speedText); self.addChild(self.speedText); }; self.down = function (x, y, obj) { if (!menuActive && !gameEnded) { setGameSpeed(self.speed); } }; return self; }); var TeamButton = Container.expand(function (teamType, yPosition) { var self = Container.call(this); self.teamType = teamType; self.selected = false; // Button background self.buttonBg = self.attachAsset('menuButton', { anchorX: 0.5, anchorY: 0.5 }); // Team icon var assetNames = ['rock', 'paper', 'scissors']; self.teamIcon = self.attachAsset(assetNames[teamType], { anchorX: 0.5, anchorY: 0.5, x: -100, scaleX: 1.5, scaleY: 1.5 }); // Team name text var teamNames = ['ROCK', 'PAPER', 'SCISSORS']; self.teamText = new Text2(teamNames[teamType], { size: 60, fill: 0xFFFFFF }); self.teamText.anchor.set(0.5, 0.5); self.teamText.x = 50; self.addChild(self.teamText); // Position button self.x = 2048 / 2; self.y = yPosition; self.setSelected = function (selected) { self.selected = selected; if (selected) { self.removeChild(self.buttonBg); self.buttonBg = self.attachAsset('selectedButton', { anchorX: 0.5, anchorY: 0.5 }); } else { self.removeChild(self.buttonBg); self.buttonBg = self.attachAsset('menuButton', { anchorX: 0.5, anchorY: 0.5 }); } }; self.down = function (x, y, obj) { if (menuActive) { selectTeam(self.teamType); } }; return self; }); var Unit = Container.expand(function (type) { var self = Container.call(this); // Store unit type (0=rock, 1=paper, 2=scissors) self.type = type; // Create visual representation var assetNames = ['rock', 'paper', 'scissors']; var graphics = self.attachAsset(assetNames[type], { anchorX: 0.5, anchorY: 0.5 }); // Movement properties self.speedX = (Math.random() - 0.5) * 4; self.speedY = (Math.random() - 0.5) * 4; // Ensure minimum speed if (Math.abs(self.speedX) < 1) self.speedX = self.speedX > 0 ? 1 : -1; if (Math.abs(self.speedY) < 1) self.speedY = self.speedY > 0 ? 1 : -1; // Collision state tracking self.lastColliding = {}; self.update = function () { // Move unit self.x += self.speedX * gameSpeed; self.y += self.speedY * gameSpeed; // Bounce off circular arena walls var centerX = 2048 / 2; var centerY = 2732 / 2; var arenaRadius = 900; // Arena radius // Calculate distance from center var dx = self.x - centerX; var dy = self.y - centerY; var distanceFromCenter = Math.sqrt(dx * dx + dy * dy); // If unit is outside arena, bounce it back if (distanceFromCenter > arenaRadius) { // Calculate angle from center to unit var angle = Math.atan2(dy, dx); // Position unit at arena edge self.x = centerX + Math.cos(angle) * arenaRadius; self.y = centerY + Math.sin(angle) * arenaRadius; // Reflect velocity vector off the circular boundary var normalX = Math.cos(angle); var normalY = Math.sin(angle); var dotProduct = self.speedX * normalX + self.speedY * normalY; self.speedX = self.speedX - 2 * dotProduct * normalX; self.speedY = self.speedY - 2 * dotProduct * normalY; } }; self.convertTo = function (newType) { if (self.type === newType) return; self.type = newType; // Remove old graphics while (self.children.length > 0) { self.removeChild(self.children[0]); } // Add new graphics var assetNames = ['rock', 'paper', 'scissors']; var newGraphics = self.attachAsset(assetNames[newType], { anchorX: 0.5, anchorY: 0.5 }); // Conversion animation newGraphics.scaleX = 0.1; newGraphics.scaleY = 0.1; tween(newGraphics, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.bounceOut }); LK.getSound('convert').play(); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2C3E50 }); /**** * Game Code ****/ // Add forest background var background = game.addChild(LK.getAsset('forest_bg', { anchorX: 0, anchorY: 0, x: 0, y: 0 })); var units = []; var rockCount = 15; var paperCount = 15; var scissorsCount = 15; var gameEnded = false; var menuActive = true; var selectedTeam = -1; var teamButtons = []; var scoreText; var gameSpeed = 1; var speedButtons = []; var muteButton; // Create menu title var menuTitle = new Text2('Choose Your Team', { size: 120, fill: 0xFFFFFF }); menuTitle.anchor.set(0.5, 0.5); menuTitle.x = 2048 / 2; menuTitle.y = 400; game.addChild(menuTitle); // Create team selection buttons for (var i = 0; i < 3; i++) { var button = new TeamButton(i, 800 + i * 200); teamButtons.push(button); game.addChild(button); } // Create start button var startButton = new Text2('START BATTLE', { size: 80, fill: 0x27ae60 }); startButton.anchor.set(0.5, 0.5); startButton.x = 2048 / 2; startButton.y = 1800; game.addChild(startButton); function selectTeam(teamType) { selectedTeam = teamType; // Update button states for (var i = 0; i < teamButtons.length; i++) { teamButtons[i].setSelected(i === teamType); } // Make start button clickable startButton.tint = 0x27ae60; } function setGameSpeed(speed) { gameSpeed = speed; // Update button states for (var i = 0; i < speedButtons.length; i++) { speedButtons[i].setActive(speedButtons[i].speed === speed); } } function startGame() { if (selectedTeam === -1) return; menuActive = false; // Remove menu elements game.removeChild(menuTitle); game.removeChild(startButton); for (var i = 0; i < teamButtons.length; i++) { game.removeChild(teamButtons[i]); } // Create arena boundary visual var arena = game.addChild(LK.getAsset('arena', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2, alpha: 0.3 })); // Initialize game initializeGame(); } // Add click handler for start button game.down = function (x, y, obj) { if (menuActive) { // Check if start button was clicked var startBounds = { left: startButton.x - 200, right: startButton.x + 200, top: startButton.y - 50, bottom: startButton.y + 50 }; if (x >= startBounds.left && x <= startBounds.right && y >= startBounds.top && y <= startBounds.bottom) { startGame(); } } }; function initializeGame() { // Create score display scoreText = new Text2('Rock: 15 Paper: 15 Scissors: 15', { size: 80, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); // Show selected team indicator var teamNames = ['ROCK', 'PAPER', 'SCISSORS']; var teamIndicator = new Text2('You chose: ' + teamNames[selectedTeam], { size: 60, fill: 0xFFD700 }); teamIndicator.anchor.set(0.5, 0); teamIndicator.y = 100; LK.gui.top.addChild(teamIndicator); // Create speed control buttons var speed1Button = new SpeedButton(1, '1x', 2048 / 2 - 300); var speed2Button = new SpeedButton(2, '2x', 2048 / 2 - 100); var speed5Button = new SpeedButton(5, '5x', 2048 / 2 + 100); var speed10Button = new SpeedButton(10, '10x', 2048 / 2 + 300); speedButtons.push(speed1Button); speedButtons.push(speed2Button); speedButtons.push(speed5Button); speedButtons.push(speed10Button); game.addChild(speed1Button); game.addChild(speed2Button); game.addChild(speed5Button); game.addChild(speed10Button); // Create mute button muteButton = new MuteButton(); game.addChild(muteButton); // Create units for (var i = 0; i < 45; i++) { var type = Math.floor(i / 15); // 0-14 = rock, 15-29 = paper, 30-44 = scissors var unit = new Unit(type); // Random position within circular arena var centerX = 2048 / 2; var centerY = 2732 / 2; var arenaRadius = 850; // Slightly smaller than boundary for spawning // Generate random position within circle var angle = Math.random() * Math.PI * 2; var distance = Math.random() * arenaRadius; unit.x = centerX + Math.cos(angle) * distance; unit.y = centerY + Math.sin(angle) * distance; units.push(unit); game.addChild(unit); } } function updateScore() { rockCount = 0; paperCount = 0; scissorsCount = 0; for (var i = 0; i < units.length; i++) { if (units[i].type === 0) rockCount++;else if (units[i].type === 1) paperCount++;else if (units[i].type === 2) scissorsCount++; } scoreText.setText('Rock: ' + rockCount + ' Paper: ' + paperCount + ' Scissors: ' + scissorsCount); } function checkWinCondition() { if (gameEnded) return; var activeTypes = 0; if (rockCount > 0) activeTypes++; if (paperCount > 0) activeTypes++; if (scissorsCount > 0) activeTypes++; if (activeTypes === 1) { gameEnded = true; var winnerType = -1; var winner = ''; if (rockCount > 0) { winnerType = 0; winner = 'Rock'; } else if (paperCount > 0) { winnerType = 1; winner = 'Paper'; } else { winnerType = 2; winner = 'Scissors'; } // Check if selected team won if (selectedTeam === winnerType) { LK.getSound('victory').play(); // Flash victory effect LK.effects.flashScreen(0xFFD700, 2000); LK.setTimeout(function () { LK.showYouWin(); }, 2000); } else { // Selected team lost LK.getSound('victory').play(); // Flash loss effect LK.effects.flashScreen(0xFF0000, 2000); LK.setTimeout(function () { LK.showGameOver(); }, 2000); } } } function checkCollisions() { for (var i = 0; i < units.length; i++) { var unit1 = units[i]; for (var j = i + 1; j < units.length; j++) { var unit2 = units[j]; // Check if units are colliding var dx = unit1.x - unit2.x; var dy = unit1.y - unit2.y; var distance = Math.sqrt(dx * dx + dy * dy); var isColliding = distance < 50; var wasColliding = unit1.lastColliding[j] || false; if (isColliding && !wasColliding) { // Collision just started if (unit1.type !== unit2.type) { // Different types - battle! var winner = -1; // Rock (0) beats Scissors (2) if (unit1.type === 0 && unit2.type === 2) winner = 0;else if (unit1.type === 2 && unit2.type === 0) winner = 1; // Paper (1) beats Rock (0) else if (unit1.type === 1 && unit2.type === 0) winner = 0;else if (unit1.type === 0 && unit2.type === 1) winner = 1; // Scissors (2) beats Paper (1) else if (unit1.type === 2 && unit2.type === 1) winner = 0;else if (unit1.type === 1 && unit2.type === 2) winner = 1; if (winner === 0) { unit2.convertTo(unit1.type); } else if (winner === 1) { unit1.convertTo(unit2.type); } } // Bounce units apart var bounceForce = 2; var angle = Math.atan2(dy, dx); unit1.speedX = Math.cos(angle) * bounceForce; unit1.speedY = Math.sin(angle) * bounceForce; unit2.speedX = -Math.cos(angle) * bounceForce; unit2.speedY = -Math.sin(angle) * bounceForce; } // Update collision state unit1.lastColliding[j] = isColliding; if (!unit2.lastColliding) unit2.lastColliding = {}; unit2.lastColliding[i] = isColliding; } } } // Play background music LK.playMusic('chill'); game.update = function () { if (menuActive || gameEnded) return; checkCollisions(); // Update score every 30 ticks (0.5 seconds) if (LK.ticks % 30 === 0) { updateScore(); checkWinCondition(); } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var MuteButton = Container.expand(function () {
var self = Container.call(this);
self.isMuted = false;
// Button background
self.buttonBg = self.attachAsset('unmuteButton', {
anchorX: 0.5,
anchorY: 0.5
});
// Button text
self.buttonText = new Text2('🔊', {
size: 40,
fill: 0xFFFFFF
});
self.buttonText.anchor.set(0.5, 0.5);
self.addChild(self.buttonText);
// Position button at top right
self.x = 2048 - 120;
self.y = 120;
self.toggleMute = function () {
self.isMuted = !self.isMuted;
// Update button appearance
self.removeChild(self.buttonBg);
self.buttonBg = self.attachAsset(self.isMuted ? 'muteButton' : 'unmuteButton', {
anchorX: 0.5,
anchorY: 0.5
});
// Update button text
self.buttonText.setText(self.isMuted ? '🔇' : '🔊');
// Ensure text stays on top
self.removeChild(self.buttonText);
self.addChild(self.buttonText);
// Toggle music using stop/play to reset position
if (self.isMuted) {
// Stop music completely
LK.stopMusic();
} else {
// Start music from beginning
LK.playMusic('chill');
}
};
self.down = function (x, y, obj) {
if (!menuActive) {
self.toggleMute();
}
};
return self;
});
var SpeedButton = Container.expand(function (speed, text, xPos) {
var self = Container.call(this);
self.speed = speed;
self.active = speed === 1; // 1x speed is active by default
// Button background
var buttonAsset = 'speedButton';
var activeButtonAsset = 'activeSpeedButton';
if (speed === 5) {
buttonAsset = 'speedButton5x';
activeButtonAsset = 'activeSpeedButton5x';
} else if (speed === 10) {
buttonAsset = 'speedButton10x';
activeButtonAsset = 'activeSpeedButton10x';
}
self.buttonBg = self.attachAsset(self.active ? activeButtonAsset : buttonAsset, {
anchorX: 0.5,
anchorY: 0.5
});
// Button text
self.speedText = new Text2(text, {
size: 40,
fill: 0xFFFFFF
});
self.speedText.anchor.set(0.5, 0.5);
self.addChild(self.speedText);
// Position button
self.x = xPos;
self.y = 2732 - 100; // Bottom of screen with some padding
self.setActive = function (active) {
self.active = active;
self.removeChild(self.buttonBg);
var buttonAsset = 'speedButton';
var activeButtonAsset = 'activeSpeedButton';
if (self.speed === 5) {
buttonAsset = 'speedButton5x';
activeButtonAsset = 'activeSpeedButton5x';
} else if (self.speed === 10) {
buttonAsset = 'speedButton10x';
activeButtonAsset = 'activeSpeedButton10x';
}
self.buttonBg = self.attachAsset(active ? activeButtonAsset : buttonAsset, {
anchorX: 0.5,
anchorY: 0.5
});
// Ensure text stays on top of button background
self.removeChild(self.speedText);
self.addChild(self.speedText);
};
self.down = function (x, y, obj) {
if (!menuActive && !gameEnded) {
setGameSpeed(self.speed);
}
};
return self;
});
var TeamButton = Container.expand(function (teamType, yPosition) {
var self = Container.call(this);
self.teamType = teamType;
self.selected = false;
// Button background
self.buttonBg = self.attachAsset('menuButton', {
anchorX: 0.5,
anchorY: 0.5
});
// Team icon
var assetNames = ['rock', 'paper', 'scissors'];
self.teamIcon = self.attachAsset(assetNames[teamType], {
anchorX: 0.5,
anchorY: 0.5,
x: -100,
scaleX: 1.5,
scaleY: 1.5
});
// Team name text
var teamNames = ['ROCK', 'PAPER', 'SCISSORS'];
self.teamText = new Text2(teamNames[teamType], {
size: 60,
fill: 0xFFFFFF
});
self.teamText.anchor.set(0.5, 0.5);
self.teamText.x = 50;
self.addChild(self.teamText);
// Position button
self.x = 2048 / 2;
self.y = yPosition;
self.setSelected = function (selected) {
self.selected = selected;
if (selected) {
self.removeChild(self.buttonBg);
self.buttonBg = self.attachAsset('selectedButton', {
anchorX: 0.5,
anchorY: 0.5
});
} else {
self.removeChild(self.buttonBg);
self.buttonBg = self.attachAsset('menuButton', {
anchorX: 0.5,
anchorY: 0.5
});
}
};
self.down = function (x, y, obj) {
if (menuActive) {
selectTeam(self.teamType);
}
};
return self;
});
var Unit = Container.expand(function (type) {
var self = Container.call(this);
// Store unit type (0=rock, 1=paper, 2=scissors)
self.type = type;
// Create visual representation
var assetNames = ['rock', 'paper', 'scissors'];
var graphics = self.attachAsset(assetNames[type], {
anchorX: 0.5,
anchorY: 0.5
});
// Movement properties
self.speedX = (Math.random() - 0.5) * 4;
self.speedY = (Math.random() - 0.5) * 4;
// Ensure minimum speed
if (Math.abs(self.speedX) < 1) self.speedX = self.speedX > 0 ? 1 : -1;
if (Math.abs(self.speedY) < 1) self.speedY = self.speedY > 0 ? 1 : -1;
// Collision state tracking
self.lastColliding = {};
self.update = function () {
// Move unit
self.x += self.speedX * gameSpeed;
self.y += self.speedY * gameSpeed;
// Bounce off circular arena walls
var centerX = 2048 / 2;
var centerY = 2732 / 2;
var arenaRadius = 900; // Arena radius
// Calculate distance from center
var dx = self.x - centerX;
var dy = self.y - centerY;
var distanceFromCenter = Math.sqrt(dx * dx + dy * dy);
// If unit is outside arena, bounce it back
if (distanceFromCenter > arenaRadius) {
// Calculate angle from center to unit
var angle = Math.atan2(dy, dx);
// Position unit at arena edge
self.x = centerX + Math.cos(angle) * arenaRadius;
self.y = centerY + Math.sin(angle) * arenaRadius;
// Reflect velocity vector off the circular boundary
var normalX = Math.cos(angle);
var normalY = Math.sin(angle);
var dotProduct = self.speedX * normalX + self.speedY * normalY;
self.speedX = self.speedX - 2 * dotProduct * normalX;
self.speedY = self.speedY - 2 * dotProduct * normalY;
}
};
self.convertTo = function (newType) {
if (self.type === newType) return;
self.type = newType;
// Remove old graphics
while (self.children.length > 0) {
self.removeChild(self.children[0]);
}
// Add new graphics
var assetNames = ['rock', 'paper', 'scissors'];
var newGraphics = self.attachAsset(assetNames[newType], {
anchorX: 0.5,
anchorY: 0.5
});
// Conversion animation
newGraphics.scaleX = 0.1;
newGraphics.scaleY = 0.1;
tween(newGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.bounceOut
});
LK.getSound('convert').play();
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2C3E50
});
/****
* Game Code
****/
// Add forest background
var background = game.addChild(LK.getAsset('forest_bg', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}));
var units = [];
var rockCount = 15;
var paperCount = 15;
var scissorsCount = 15;
var gameEnded = false;
var menuActive = true;
var selectedTeam = -1;
var teamButtons = [];
var scoreText;
var gameSpeed = 1;
var speedButtons = [];
var muteButton;
// Create menu title
var menuTitle = new Text2('Choose Your Team', {
size: 120,
fill: 0xFFFFFF
});
menuTitle.anchor.set(0.5, 0.5);
menuTitle.x = 2048 / 2;
menuTitle.y = 400;
game.addChild(menuTitle);
// Create team selection buttons
for (var i = 0; i < 3; i++) {
var button = new TeamButton(i, 800 + i * 200);
teamButtons.push(button);
game.addChild(button);
}
// Create start button
var startButton = new Text2('START BATTLE', {
size: 80,
fill: 0x27ae60
});
startButton.anchor.set(0.5, 0.5);
startButton.x = 2048 / 2;
startButton.y = 1800;
game.addChild(startButton);
function selectTeam(teamType) {
selectedTeam = teamType;
// Update button states
for (var i = 0; i < teamButtons.length; i++) {
teamButtons[i].setSelected(i === teamType);
}
// Make start button clickable
startButton.tint = 0x27ae60;
}
function setGameSpeed(speed) {
gameSpeed = speed;
// Update button states
for (var i = 0; i < speedButtons.length; i++) {
speedButtons[i].setActive(speedButtons[i].speed === speed);
}
}
function startGame() {
if (selectedTeam === -1) return;
menuActive = false;
// Remove menu elements
game.removeChild(menuTitle);
game.removeChild(startButton);
for (var i = 0; i < teamButtons.length; i++) {
game.removeChild(teamButtons[i]);
}
// Create arena boundary visual
var arena = game.addChild(LK.getAsset('arena', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2,
alpha: 0.3
}));
// Initialize game
initializeGame();
}
// Add click handler for start button
game.down = function (x, y, obj) {
if (menuActive) {
// Check if start button was clicked
var startBounds = {
left: startButton.x - 200,
right: startButton.x + 200,
top: startButton.y - 50,
bottom: startButton.y + 50
};
if (x >= startBounds.left && x <= startBounds.right && y >= startBounds.top && y <= startBounds.bottom) {
startGame();
}
}
};
function initializeGame() {
// Create score display
scoreText = new Text2('Rock: 15 Paper: 15 Scissors: 15', {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
// Show selected team indicator
var teamNames = ['ROCK', 'PAPER', 'SCISSORS'];
var teamIndicator = new Text2('You chose: ' + teamNames[selectedTeam], {
size: 60,
fill: 0xFFD700
});
teamIndicator.anchor.set(0.5, 0);
teamIndicator.y = 100;
LK.gui.top.addChild(teamIndicator);
// Create speed control buttons
var speed1Button = new SpeedButton(1, '1x', 2048 / 2 - 300);
var speed2Button = new SpeedButton(2, '2x', 2048 / 2 - 100);
var speed5Button = new SpeedButton(5, '5x', 2048 / 2 + 100);
var speed10Button = new SpeedButton(10, '10x', 2048 / 2 + 300);
speedButtons.push(speed1Button);
speedButtons.push(speed2Button);
speedButtons.push(speed5Button);
speedButtons.push(speed10Button);
game.addChild(speed1Button);
game.addChild(speed2Button);
game.addChild(speed5Button);
game.addChild(speed10Button);
// Create mute button
muteButton = new MuteButton();
game.addChild(muteButton);
// Create units
for (var i = 0; i < 45; i++) {
var type = Math.floor(i / 15); // 0-14 = rock, 15-29 = paper, 30-44 = scissors
var unit = new Unit(type);
// Random position within circular arena
var centerX = 2048 / 2;
var centerY = 2732 / 2;
var arenaRadius = 850; // Slightly smaller than boundary for spawning
// Generate random position within circle
var angle = Math.random() * Math.PI * 2;
var distance = Math.random() * arenaRadius;
unit.x = centerX + Math.cos(angle) * distance;
unit.y = centerY + Math.sin(angle) * distance;
units.push(unit);
game.addChild(unit);
}
}
function updateScore() {
rockCount = 0;
paperCount = 0;
scissorsCount = 0;
for (var i = 0; i < units.length; i++) {
if (units[i].type === 0) rockCount++;else if (units[i].type === 1) paperCount++;else if (units[i].type === 2) scissorsCount++;
}
scoreText.setText('Rock: ' + rockCount + ' Paper: ' + paperCount + ' Scissors: ' + scissorsCount);
}
function checkWinCondition() {
if (gameEnded) return;
var activeTypes = 0;
if (rockCount > 0) activeTypes++;
if (paperCount > 0) activeTypes++;
if (scissorsCount > 0) activeTypes++;
if (activeTypes === 1) {
gameEnded = true;
var winnerType = -1;
var winner = '';
if (rockCount > 0) {
winnerType = 0;
winner = 'Rock';
} else if (paperCount > 0) {
winnerType = 1;
winner = 'Paper';
} else {
winnerType = 2;
winner = 'Scissors';
}
// Check if selected team won
if (selectedTeam === winnerType) {
LK.getSound('victory').play();
// Flash victory effect
LK.effects.flashScreen(0xFFD700, 2000);
LK.setTimeout(function () {
LK.showYouWin();
}, 2000);
} else {
// Selected team lost
LK.getSound('victory').play();
// Flash loss effect
LK.effects.flashScreen(0xFF0000, 2000);
LK.setTimeout(function () {
LK.showGameOver();
}, 2000);
}
}
}
function checkCollisions() {
for (var i = 0; i < units.length; i++) {
var unit1 = units[i];
for (var j = i + 1; j < units.length; j++) {
var unit2 = units[j];
// Check if units are colliding
var dx = unit1.x - unit2.x;
var dy = unit1.y - unit2.y;
var distance = Math.sqrt(dx * dx + dy * dy);
var isColliding = distance < 50;
var wasColliding = unit1.lastColliding[j] || false;
if (isColliding && !wasColliding) {
// Collision just started
if (unit1.type !== unit2.type) {
// Different types - battle!
var winner = -1;
// Rock (0) beats Scissors (2)
if (unit1.type === 0 && unit2.type === 2) winner = 0;else if (unit1.type === 2 && unit2.type === 0) winner = 1;
// Paper (1) beats Rock (0)
else if (unit1.type === 1 && unit2.type === 0) winner = 0;else if (unit1.type === 0 && unit2.type === 1) winner = 1;
// Scissors (2) beats Paper (1)
else if (unit1.type === 2 && unit2.type === 1) winner = 0;else if (unit1.type === 1 && unit2.type === 2) winner = 1;
if (winner === 0) {
unit2.convertTo(unit1.type);
} else if (winner === 1) {
unit1.convertTo(unit2.type);
}
}
// Bounce units apart
var bounceForce = 2;
var angle = Math.atan2(dy, dx);
unit1.speedX = Math.cos(angle) * bounceForce;
unit1.speedY = Math.sin(angle) * bounceForce;
unit2.speedX = -Math.cos(angle) * bounceForce;
unit2.speedY = -Math.sin(angle) * bounceForce;
}
// Update collision state
unit1.lastColliding[j] = isColliding;
if (!unit2.lastColliding) unit2.lastColliding = {};
unit2.lastColliding[i] = isColliding;
}
}
}
// Play background music
LK.playMusic('chill');
game.update = function () {
if (menuActive || gameEnded) return;
checkCollisions();
// Update score every 30 ticks (0.5 seconds)
if (LK.ticks % 30 === 0) {
updateScore();
checkWinCondition();
}
};