User prompt
Reduce arena shrink time to 45 seconds
User prompt
If you knock your opponent down the sensitivity returns to normal
User prompt
If you knock your opponent down the vulnerability is reset
User prompt
each hit makes you sensitive by a small amount ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Code edit (1 edits merged)
Please save this source code
User prompt
Sumo Showdown Arena
Initial prompt
an arena this arena is sometimes round, sometimes square, sometimes rectangular 4 players everyone is single everyone has the right to fall 4 times everyone tries to throw each other down if it exceeds 1 minute the arena gradually shrinks
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Player = Container.expand(function (id, color, x, y) { var self = Container.call(this); self.id = id; self.lives = 4; self.isDragging = false; self.isAI = id !== 1; // Player 1 is human, others are AI self.respawning = false; self.speed = 5; self.pushForce = 15; self.mass = 1; self.velocity = { x: 0, y: 0 }; self.canMove = true; // Attach the player graphic self.graphic = self.attachAsset('player' + id, { anchorX: 0.5, anchorY: 0.5, x: 0, y: 0 }); // Create lives display self.livesContainer = new Container(); self.addChild(self.livesContainer); self.livesDisplay = []; for (var i = 0; i < self.lives; i++) { var life = LK.getAsset('life', { anchorX: 0.5, anchorY: 0.5 }); life.x = i * 35 - (self.lives - 1) * 35 / 2; life.y = -70; self.livesDisplay.push(life); self.livesContainer.addChild(life); } // Position player self.x = x; self.y = y; // Handle input events self.down = function (x, y, obj) { if (self.id === 1 && self.canMove && !self.respawning) { self.isDragging = true; console.log("Player dragging started"); } }; self.up = function (x, y, obj) { self.isDragging = false; }; // Method to lose a life self.loseLife = function () { if (self.respawning) return; self.lives--; if (self.lives >= 0 && self.livesDisplay[self.lives]) { self.livesContainer.removeChild(self.livesDisplay[self.lives]); } LK.getSound('fall').play(); if (self.lives <= 0) { // Player is eliminated self.canMove = false; self.visible = false; self.eliminated = true; return true; // Player eliminated } else { // Respawn player self.respawn(); return false; // Player still in game } }; // Method to respawn player self.respawn = function () { self.respawning = true; self.alpha = 0.5; // Place player in a safe position var angle = Math.random() * Math.PI * 2; var radius = arena.width * 0.3; self.x = arena.x + Math.cos(angle) * radius; self.y = arena.y + Math.sin(angle) * radius; // Reset velocity self.velocity.x = 0; self.velocity.y = 0; // Make player immune for a short time LK.setTimeout(function () { self.respawning = false; self.alpha = 1; }, 2000); }; // Method to check if player is off the arena self.checkOffArena = function () { if (self.respawning) return false; var dx = self.x - arena.x; var dy = self.y - arena.y; var distanceSquared = dx * dx + dy * dy; // Different check depending on arena shape if (gameState.arenaShape === 'circle') { var radiusSquared = Math.pow(arena.width / 2, 2); return distanceSquared > radiusSquared; } else if (gameState.arenaShape === 'square') { var halfWidth = arena.width / 2; return Math.abs(dx) > halfWidth || Math.abs(dy) > halfWidth; } else if (gameState.arenaShape === 'rectangle') { var halfWidth = arena.width / 2; var halfHeight = arena.height / 2; return Math.abs(dx) > halfWidth || Math.abs(dy) > halfHeight; } return false; }; // AI movement logic self.updateAI = function () { if (!self.isAI || !self.canMove || self.respawning) return; // Simple AI behavior: // 1. Move toward center if close to edge // 2. Otherwise move toward nearest player to push them off var dx = self.x - arena.x; var dy = self.y - arena.y; var distanceToCenter = Math.sqrt(dx * dx + dy * dy); // If close to edge, move toward center if (distanceToCenter > arena.width * 0.4) { var angleToCenter = Math.atan2(arena.y - self.y, arena.x - self.x); self.velocity.x += Math.cos(angleToCenter) * 0.5; self.velocity.y += Math.sin(angleToCenter) * 0.5; } else { // Find nearest player var nearestPlayer = null; var minDistance = Infinity; for (var i = 0; i < players.length; i++) { var otherPlayer = players[i]; if (otherPlayer === self || !otherPlayer.canMove || otherPlayer.respawning) continue; var otherDx = otherPlayer.x - self.x; var otherDy = otherPlayer.y - self.y; var distance = Math.sqrt(otherDx * otherDx + otherDy * otherDy); if (distance < minDistance) { minDistance = distance; nearestPlayer = otherPlayer; } } // Move toward nearest player if (nearestPlayer) { var angleToPlayer = Math.atan2(nearestPlayer.y - self.y, nearestPlayer.x - self.x); self.velocity.x += Math.cos(angleToPlayer) * 0.5; self.velocity.y += Math.sin(angleToPlayer) * 0.5; } } }; // Physics update self.update = function () { if (!self.canMove) return; // Update AI movement self.updateAI(); // Apply physics self.velocity.x *= 0.95; // Apply friction self.velocity.y *= 0.95; self.x += self.velocity.x; self.y += self.velocity.y; // Check if off arena if (self.checkOffArena()) { var eliminated = self.loseLife(); if (eliminated) { checkGameEnd(); } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Game variables var players = []; var arena; var timerBar; var timerBarFill; var timerText; var statusText; var matchTimer = 60; // 60 seconds until arena starts shrinking var totalMatchTime = 180; // 3 minutes total match time var gameState = { started: false, shrinking: false, ended: false, arenaShape: 'circle', // 'circle', 'square', or 'rectangle' shrinkAmount: 0.995, // Arena shrinks to 0.5% per frame when shrinking roundNumber: 1 }; // Initialize arena function initArena() { // Remove old arena if it exists if (arena) { game.removeChild(arena); } // Create new arena based on current shape arena = LK.getAsset('arena', { anchorX: 0.5, anchorY: 0.5 }); // Set arena dimensions based on shape if (gameState.arenaShape === 'circle') { arena.width = 1800; arena.height = 1800; } else if (gameState.arenaShape === 'square') { arena.width = 1600; arena.height = 1600; arena.tint = 0x8B4513; // Slightly different color for square } else if (gameState.arenaShape === 'rectangle') { arena.width = 2000; arena.height = 1200; arena.tint = 0x996633; // Slightly different color for rectangle } arena.x = 2048 / 2; arena.y = 2732 / 2; game.addChild(arena); // Make sure arena is behind players for (var i = 0; i < players.length; i++) { if (players[i]) { game.removeChild(players[i]); game.addChild(players[i]); } } } // Initialize players function initPlayers() { // Clear existing players for (var i = 0; i < players.length; i++) { if (players[i]) { game.removeChild(players[i]); } } players = []; // Create 4 players var positions = [{ x: arena.x - arena.width * 0.3, y: arena.y - arena.height * 0.3 }, { x: arena.x + arena.width * 0.3, y: arena.y - arena.height * 0.3 }, { x: arena.x - arena.width * 0.3, y: arena.y + arena.height * 0.3 }, { x: arena.x + arena.width * 0.3, y: arena.y + arena.height * 0.3 }]; for (var i = 0; i < 4; i++) { var player = new Player(i + 1, i + 1, positions[i].x, positions[i].y); players.push(player); game.addChild(player); } } // Initialize UI function initUI() { // Create timer bar timerBar = LK.getAsset('timer', { anchorX: 0.5, anchorY: 0.5 }); timerBar.x = 2048 / 2; timerBar.y = 80; timerBarFill = LK.getAsset('timerFill', { anchorX: 0, anchorY: 0.5 }); timerBarFill.x = -timerBarFill.width / 2; timerBarFill.y = 0; timerBar.addChild(timerBarFill); game.addChild(timerBar); // Create timer text timerText = new Text2("01:00", { size: 50, fill: 0xFFFFFF }); timerText.anchor.set(0.5, 0.5); timerText.x = 2048 / 2; timerText.y = 150; game.addChild(timerText); // Create status text statusText = new Text2("Round " + gameState.roundNumber + " - Push opponents off the arena!", { size: 60, fill: 0xFFFFFF }); statusText.anchor.set(0.5, 0.5); statusText.x = 2048 / 2; statusText.y = 220; game.addChild(statusText); } // Check for game end function checkGameEnd() { var playersAlive = 0; var lastAlivePlayer = null; for (var i = 0; i < players.length; i++) { if (players[i] && players[i].lives > 0) { playersAlive++; lastAlivePlayer = players[i]; } } if (playersAlive <= 1 && !gameState.ended) { gameState.ended = true; if (lastAlivePlayer) { statusText.setText("Player " + lastAlivePlayer.id + " wins!"); LK.setScore(lastAlivePlayer.id); // Show win screen after a short delay LK.setTimeout(function () { LK.showYouWin(); }, 2000); } else { statusText.setText("Draw!"); // Show game over after a short delay LK.setTimeout(function () { LK.showGameOver(); }, 2000); } } } // Reset game for a new round function startNewRound() { // Increment round number gameState.roundNumber++; // Change arena shape for the next round if (gameState.arenaShape === 'circle') { gameState.arenaShape = 'square'; } else if (gameState.arenaShape === 'square') { gameState.arenaShape = 'rectangle'; } else { gameState.arenaShape = 'circle'; } // Reset game state gameState.started = false; gameState.shrinking = false; gameState.ended = false; matchTimer = 60; // Initialize game elements initArena(); initPlayers(); // Update UI statusText.setText("Round " + gameState.roundNumber + " - Push opponents off the arena!"); // Start the game gameState.started = true; } // Handle dragging the human player function handleDrag(x, y) { if (players[0] && players[0].isDragging && players[0].canMove && !players[0].respawning) { // Calculate direction vector var dx = x - players[0].x; var dy = y - players[0].y; var distance = Math.sqrt(dx * dx + dy * dy); // Apply force toward the touch position if (distance > 0) { var maxSpeed = 10; var speedX = Math.min(dx, maxSpeed); var speedY = Math.min(dy, maxSpeed); players[0].velocity.x += speedX * 0.1; players[0].velocity.y += speedY * 0.1; } } } // Collision detection and resolution between players function handleCollisions() { for (var i = 0; i < players.length; i++) { var playerA = players[i]; if (!playerA || !playerA.canMove || playerA.respawning) continue; for (var j = i + 1; j < players.length; j++) { var playerB = players[j]; if (!playerB || !playerB.canMove || playerB.respawning) continue; var dx = playerB.x - playerA.x; var dy = playerB.y - playerA.y; var distance = Math.sqrt(dx * dx + dy * dy); var minDistance = playerA.graphic.width / 2 + playerB.graphic.width / 2; if (distance < minDistance) { // Collision detected LK.getSound('push').play(); // Calculate collision response var angle = Math.atan2(dy, dx); var overlap = minDistance - distance; // Move players apart var moveX = Math.cos(angle) * overlap * 0.5; var moveY = Math.sin(angle) * overlap * 0.5; playerA.x -= moveX; playerA.y -= moveY; playerB.x += moveX; playerB.y += moveY; // Calculate impulse var impulse = 2 * (playerA.velocity.x * Math.cos(angle) + playerA.velocity.y * Math.sin(angle) - playerB.velocity.x * Math.cos(angle) - playerB.velocity.y * Math.sin(angle)) / (playerA.mass + playerB.mass); // Apply impulse playerA.velocity.x -= impulse * playerA.mass * Math.cos(angle) * 1.5; playerA.velocity.y -= impulse * playerA.mass * Math.sin(angle) * 1.5; playerB.velocity.x += impulse * playerB.mass * Math.cos(angle) * 1.5; playerB.velocity.y += impulse * playerB.mass * Math.sin(angle) * 1.5; } } } } // Format time as MM:SS function formatTime(seconds) { var minutes = Math.floor(seconds / 60); var remainingSeconds = Math.floor(seconds % 60); return (minutes < 10 ? "0" : "") + minutes + ":" + (remainingSeconds < 10 ? "0" : "") + remainingSeconds; } // Update timer function updateTimer() { matchTimer -= 1 / 60; // Decrease by 1/60th of a second (assuming 60 FPS) if (matchTimer <= 0 && !gameState.shrinking) { // Start shrinking the arena gameState.shrinking = true; statusText.setText("Arena is shrinking!"); LK.getSound('warning').play(); // Flash the status text tween(statusText, { alpha: 0 }, { duration: 300, onFinish: function onFinish() { tween(statusText, { alpha: 1 }, { duration: 300 }); } }); } // Update timer display timerText.setText(formatTime(Math.max(0, matchTimer))); // Update timer bar var progress = Math.max(0, matchTimer / 60); timerBarFill.width = 496 * progress; // If arena is shrinking, change timer color to red if (gameState.shrinking) { timerBarFill.tint = 0xFF0000; } } // Initialize the game function initGame() { // Set arena shape to circle for first round gameState.arenaShape = 'circle'; gameState.roundNumber = 1; // Initialize game elements initArena(); initPlayers(); initUI(); // Reset game state gameState.started = true; gameState.shrinking = false; gameState.ended = false; matchTimer = 60; // Play background music LK.playMusic('background'); } // Handle game events game.down = function (x, y, obj) { // Forward touch events to the human player if (players[0]) { players[0].down(x, y, obj); } }; game.up = function (x, y, obj) { // Forward touch events to the human player if (players[0]) { players[0].up(x, y, obj); } }; game.move = function (x, y, obj) { handleDrag(x, y); }; // Main game loop game.update = function () { // Initialize game on first update if (!gameState.started) { initGame(); return; } // Don't update if game ended if (gameState.ended) return; // Update timer updateTimer(); // Update players for (var i = 0; i < players.length; i++) { if (players[i]) { players[i].update(); } } // Handle collisions between players handleCollisions(); // Shrink arena if time has run out if (gameState.shrinking && arena.width > 400) { arena.width *= gameState.shrinkAmount; arena.height *= gameState.shrinkAmount; } }; // Initialize game initGame();
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,507 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Player = Container.expand(function (id, color, x, y) {
+ var self = Container.call(this);
+ self.id = id;
+ self.lives = 4;
+ self.isDragging = false;
+ self.isAI = id !== 1; // Player 1 is human, others are AI
+ self.respawning = false;
+ self.speed = 5;
+ self.pushForce = 15;
+ self.mass = 1;
+ self.velocity = {
+ x: 0,
+ y: 0
+ };
+ self.canMove = true;
+ // Attach the player graphic
+ self.graphic = self.attachAsset('player' + id, {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 0,
+ y: 0
+ });
+ // Create lives display
+ self.livesContainer = new Container();
+ self.addChild(self.livesContainer);
+ self.livesDisplay = [];
+ for (var i = 0; i < self.lives; i++) {
+ var life = LK.getAsset('life', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ life.x = i * 35 - (self.lives - 1) * 35 / 2;
+ life.y = -70;
+ self.livesDisplay.push(life);
+ self.livesContainer.addChild(life);
+ }
+ // Position player
+ self.x = x;
+ self.y = y;
+ // Handle input events
+ self.down = function (x, y, obj) {
+ if (self.id === 1 && self.canMove && !self.respawning) {
+ self.isDragging = true;
+ console.log("Player dragging started");
+ }
+ };
+ self.up = function (x, y, obj) {
+ self.isDragging = false;
+ };
+ // Method to lose a life
+ self.loseLife = function () {
+ if (self.respawning) return;
+ self.lives--;
+ if (self.lives >= 0 && self.livesDisplay[self.lives]) {
+ self.livesContainer.removeChild(self.livesDisplay[self.lives]);
+ }
+ LK.getSound('fall').play();
+ if (self.lives <= 0) {
+ // Player is eliminated
+ self.canMove = false;
+ self.visible = false;
+ self.eliminated = true;
+ return true; // Player eliminated
+ } else {
+ // Respawn player
+ self.respawn();
+ return false; // Player still in game
+ }
+ };
+ // Method to respawn player
+ self.respawn = function () {
+ self.respawning = true;
+ self.alpha = 0.5;
+ // Place player in a safe position
+ var angle = Math.random() * Math.PI * 2;
+ var radius = arena.width * 0.3;
+ self.x = arena.x + Math.cos(angle) * radius;
+ self.y = arena.y + Math.sin(angle) * radius;
+ // Reset velocity
+ self.velocity.x = 0;
+ self.velocity.y = 0;
+ // Make player immune for a short time
+ LK.setTimeout(function () {
+ self.respawning = false;
+ self.alpha = 1;
+ }, 2000);
+ };
+ // Method to check if player is off the arena
+ self.checkOffArena = function () {
+ if (self.respawning) return false;
+ var dx = self.x - arena.x;
+ var dy = self.y - arena.y;
+ var distanceSquared = dx * dx + dy * dy;
+ // Different check depending on arena shape
+ if (gameState.arenaShape === 'circle') {
+ var radiusSquared = Math.pow(arena.width / 2, 2);
+ return distanceSquared > radiusSquared;
+ } else if (gameState.arenaShape === 'square') {
+ var halfWidth = arena.width / 2;
+ return Math.abs(dx) > halfWidth || Math.abs(dy) > halfWidth;
+ } else if (gameState.arenaShape === 'rectangle') {
+ var halfWidth = arena.width / 2;
+ var halfHeight = arena.height / 2;
+ return Math.abs(dx) > halfWidth || Math.abs(dy) > halfHeight;
+ }
+ return false;
+ };
+ // AI movement logic
+ self.updateAI = function () {
+ if (!self.isAI || !self.canMove || self.respawning) return;
+ // Simple AI behavior:
+ // 1. Move toward center if close to edge
+ // 2. Otherwise move toward nearest player to push them off
+ var dx = self.x - arena.x;
+ var dy = self.y - arena.y;
+ var distanceToCenter = Math.sqrt(dx * dx + dy * dy);
+ // If close to edge, move toward center
+ if (distanceToCenter > arena.width * 0.4) {
+ var angleToCenter = Math.atan2(arena.y - self.y, arena.x - self.x);
+ self.velocity.x += Math.cos(angleToCenter) * 0.5;
+ self.velocity.y += Math.sin(angleToCenter) * 0.5;
+ } else {
+ // Find nearest player
+ var nearestPlayer = null;
+ var minDistance = Infinity;
+ for (var i = 0; i < players.length; i++) {
+ var otherPlayer = players[i];
+ if (otherPlayer === self || !otherPlayer.canMove || otherPlayer.respawning) continue;
+ var otherDx = otherPlayer.x - self.x;
+ var otherDy = otherPlayer.y - self.y;
+ var distance = Math.sqrt(otherDx * otherDx + otherDy * otherDy);
+ if (distance < minDistance) {
+ minDistance = distance;
+ nearestPlayer = otherPlayer;
+ }
+ }
+ // Move toward nearest player
+ if (nearestPlayer) {
+ var angleToPlayer = Math.atan2(nearestPlayer.y - self.y, nearestPlayer.x - self.x);
+ self.velocity.x += Math.cos(angleToPlayer) * 0.5;
+ self.velocity.y += Math.sin(angleToPlayer) * 0.5;
+ }
+ }
+ };
+ // Physics update
+ self.update = function () {
+ if (!self.canMove) return;
+ // Update AI movement
+ self.updateAI();
+ // Apply physics
+ self.velocity.x *= 0.95; // Apply friction
+ self.velocity.y *= 0.95;
+ self.x += self.velocity.x;
+ self.y += self.velocity.y;
+ // Check if off arena
+ if (self.checkOffArena()) {
+ var eliminated = self.loseLife();
+ if (eliminated) {
+ checkGameEnd();
+ }
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87CEEB
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var players = [];
+var arena;
+var timerBar;
+var timerBarFill;
+var timerText;
+var statusText;
+var matchTimer = 60; // 60 seconds until arena starts shrinking
+var totalMatchTime = 180; // 3 minutes total match time
+var gameState = {
+ started: false,
+ shrinking: false,
+ ended: false,
+ arenaShape: 'circle',
+ // 'circle', 'square', or 'rectangle'
+ shrinkAmount: 0.995,
+ // Arena shrinks to 0.5% per frame when shrinking
+ roundNumber: 1
+};
+// Initialize arena
+function initArena() {
+ // Remove old arena if it exists
+ if (arena) {
+ game.removeChild(arena);
+ }
+ // Create new arena based on current shape
+ arena = LK.getAsset('arena', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Set arena dimensions based on shape
+ if (gameState.arenaShape === 'circle') {
+ arena.width = 1800;
+ arena.height = 1800;
+ } else if (gameState.arenaShape === 'square') {
+ arena.width = 1600;
+ arena.height = 1600;
+ arena.tint = 0x8B4513; // Slightly different color for square
+ } else if (gameState.arenaShape === 'rectangle') {
+ arena.width = 2000;
+ arena.height = 1200;
+ arena.tint = 0x996633; // Slightly different color for rectangle
+ }
+ arena.x = 2048 / 2;
+ arena.y = 2732 / 2;
+ game.addChild(arena);
+ // Make sure arena is behind players
+ for (var i = 0; i < players.length; i++) {
+ if (players[i]) {
+ game.removeChild(players[i]);
+ game.addChild(players[i]);
+ }
+ }
+}
+// Initialize players
+function initPlayers() {
+ // Clear existing players
+ for (var i = 0; i < players.length; i++) {
+ if (players[i]) {
+ game.removeChild(players[i]);
+ }
+ }
+ players = [];
+ // Create 4 players
+ var positions = [{
+ x: arena.x - arena.width * 0.3,
+ y: arena.y - arena.height * 0.3
+ }, {
+ x: arena.x + arena.width * 0.3,
+ y: arena.y - arena.height * 0.3
+ }, {
+ x: arena.x - arena.width * 0.3,
+ y: arena.y + arena.height * 0.3
+ }, {
+ x: arena.x + arena.width * 0.3,
+ y: arena.y + arena.height * 0.3
+ }];
+ for (var i = 0; i < 4; i++) {
+ var player = new Player(i + 1, i + 1, positions[i].x, positions[i].y);
+ players.push(player);
+ game.addChild(player);
+ }
+}
+// Initialize UI
+function initUI() {
+ // Create timer bar
+ timerBar = LK.getAsset('timer', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ timerBar.x = 2048 / 2;
+ timerBar.y = 80;
+ timerBarFill = LK.getAsset('timerFill', {
+ anchorX: 0,
+ anchorY: 0.5
+ });
+ timerBarFill.x = -timerBarFill.width / 2;
+ timerBarFill.y = 0;
+ timerBar.addChild(timerBarFill);
+ game.addChild(timerBar);
+ // Create timer text
+ timerText = new Text2("01:00", {
+ size: 50,
+ fill: 0xFFFFFF
+ });
+ timerText.anchor.set(0.5, 0.5);
+ timerText.x = 2048 / 2;
+ timerText.y = 150;
+ game.addChild(timerText);
+ // Create status text
+ statusText = new Text2("Round " + gameState.roundNumber + " - Push opponents off the arena!", {
+ size: 60,
+ fill: 0xFFFFFF
+ });
+ statusText.anchor.set(0.5, 0.5);
+ statusText.x = 2048 / 2;
+ statusText.y = 220;
+ game.addChild(statusText);
+}
+// Check for game end
+function checkGameEnd() {
+ var playersAlive = 0;
+ var lastAlivePlayer = null;
+ for (var i = 0; i < players.length; i++) {
+ if (players[i] && players[i].lives > 0) {
+ playersAlive++;
+ lastAlivePlayer = players[i];
+ }
+ }
+ if (playersAlive <= 1 && !gameState.ended) {
+ gameState.ended = true;
+ if (lastAlivePlayer) {
+ statusText.setText("Player " + lastAlivePlayer.id + " wins!");
+ LK.setScore(lastAlivePlayer.id);
+ // Show win screen after a short delay
+ LK.setTimeout(function () {
+ LK.showYouWin();
+ }, 2000);
+ } else {
+ statusText.setText("Draw!");
+ // Show game over after a short delay
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 2000);
+ }
+ }
+}
+// Reset game for a new round
+function startNewRound() {
+ // Increment round number
+ gameState.roundNumber++;
+ // Change arena shape for the next round
+ if (gameState.arenaShape === 'circle') {
+ gameState.arenaShape = 'square';
+ } else if (gameState.arenaShape === 'square') {
+ gameState.arenaShape = 'rectangle';
+ } else {
+ gameState.arenaShape = 'circle';
+ }
+ // Reset game state
+ gameState.started = false;
+ gameState.shrinking = false;
+ gameState.ended = false;
+ matchTimer = 60;
+ // Initialize game elements
+ initArena();
+ initPlayers();
+ // Update UI
+ statusText.setText("Round " + gameState.roundNumber + " - Push opponents off the arena!");
+ // Start the game
+ gameState.started = true;
+}
+// Handle dragging the human player
+function handleDrag(x, y) {
+ if (players[0] && players[0].isDragging && players[0].canMove && !players[0].respawning) {
+ // Calculate direction vector
+ var dx = x - players[0].x;
+ var dy = y - players[0].y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ // Apply force toward the touch position
+ if (distance > 0) {
+ var maxSpeed = 10;
+ var speedX = Math.min(dx, maxSpeed);
+ var speedY = Math.min(dy, maxSpeed);
+ players[0].velocity.x += speedX * 0.1;
+ players[0].velocity.y += speedY * 0.1;
+ }
+ }
+}
+// Collision detection and resolution between players
+function handleCollisions() {
+ for (var i = 0; i < players.length; i++) {
+ var playerA = players[i];
+ if (!playerA || !playerA.canMove || playerA.respawning) continue;
+ for (var j = i + 1; j < players.length; j++) {
+ var playerB = players[j];
+ if (!playerB || !playerB.canMove || playerB.respawning) continue;
+ var dx = playerB.x - playerA.x;
+ var dy = playerB.y - playerA.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ var minDistance = playerA.graphic.width / 2 + playerB.graphic.width / 2;
+ if (distance < minDistance) {
+ // Collision detected
+ LK.getSound('push').play();
+ // Calculate collision response
+ var angle = Math.atan2(dy, dx);
+ var overlap = minDistance - distance;
+ // Move players apart
+ var moveX = Math.cos(angle) * overlap * 0.5;
+ var moveY = Math.sin(angle) * overlap * 0.5;
+ playerA.x -= moveX;
+ playerA.y -= moveY;
+ playerB.x += moveX;
+ playerB.y += moveY;
+ // Calculate impulse
+ var impulse = 2 * (playerA.velocity.x * Math.cos(angle) + playerA.velocity.y * Math.sin(angle) - playerB.velocity.x * Math.cos(angle) - playerB.velocity.y * Math.sin(angle)) / (playerA.mass + playerB.mass);
+ // Apply impulse
+ playerA.velocity.x -= impulse * playerA.mass * Math.cos(angle) * 1.5;
+ playerA.velocity.y -= impulse * playerA.mass * Math.sin(angle) * 1.5;
+ playerB.velocity.x += impulse * playerB.mass * Math.cos(angle) * 1.5;
+ playerB.velocity.y += impulse * playerB.mass * Math.sin(angle) * 1.5;
+ }
+ }
+ }
+}
+// Format time as MM:SS
+function formatTime(seconds) {
+ var minutes = Math.floor(seconds / 60);
+ var remainingSeconds = Math.floor(seconds % 60);
+ return (minutes < 10 ? "0" : "") + minutes + ":" + (remainingSeconds < 10 ? "0" : "") + remainingSeconds;
+}
+// Update timer
+function updateTimer() {
+ matchTimer -= 1 / 60; // Decrease by 1/60th of a second (assuming 60 FPS)
+ if (matchTimer <= 0 && !gameState.shrinking) {
+ // Start shrinking the arena
+ gameState.shrinking = true;
+ statusText.setText("Arena is shrinking!");
+ LK.getSound('warning').play();
+ // Flash the status text
+ tween(statusText, {
+ alpha: 0
+ }, {
+ duration: 300,
+ onFinish: function onFinish() {
+ tween(statusText, {
+ alpha: 1
+ }, {
+ duration: 300
+ });
+ }
+ });
+ }
+ // Update timer display
+ timerText.setText(formatTime(Math.max(0, matchTimer)));
+ // Update timer bar
+ var progress = Math.max(0, matchTimer / 60);
+ timerBarFill.width = 496 * progress;
+ // If arena is shrinking, change timer color to red
+ if (gameState.shrinking) {
+ timerBarFill.tint = 0xFF0000;
+ }
+}
+// Initialize the game
+function initGame() {
+ // Set arena shape to circle for first round
+ gameState.arenaShape = 'circle';
+ gameState.roundNumber = 1;
+ // Initialize game elements
+ initArena();
+ initPlayers();
+ initUI();
+ // Reset game state
+ gameState.started = true;
+ gameState.shrinking = false;
+ gameState.ended = false;
+ matchTimer = 60;
+ // Play background music
+ LK.playMusic('background');
+}
+// Handle game events
+game.down = function (x, y, obj) {
+ // Forward touch events to the human player
+ if (players[0]) {
+ players[0].down(x, y, obj);
+ }
+};
+game.up = function (x, y, obj) {
+ // Forward touch events to the human player
+ if (players[0]) {
+ players[0].up(x, y, obj);
+ }
+};
+game.move = function (x, y, obj) {
+ handleDrag(x, y);
+};
+// Main game loop
+game.update = function () {
+ // Initialize game on first update
+ if (!gameState.started) {
+ initGame();
+ return;
+ }
+ // Don't update if game ended
+ if (gameState.ended) return;
+ // Update timer
+ updateTimer();
+ // Update players
+ for (var i = 0; i < players.length; i++) {
+ if (players[i]) {
+ players[i].update();
+ }
+ }
+ // Handle collisions between players
+ handleCollisions();
+ // Shrink arena if time has run out
+ if (gameState.shrinking && arena.width > 400) {
+ arena.width *= gameState.shrinkAmount;
+ arena.height *= gameState.shrinkAmount;
+ }
+};
+// Initialize game
+initGame();
\ No newline at end of file
bird's eye view of a round rocky arena surrounded by flames decorated with red lava. In-Game asset. 2d. High contrast. No shadows
hearth. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
fighter 1. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
fighter 2. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
fighter 3 . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
fighter 4. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat