/****
* 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();
}
};