/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var CharacterSelector = Container.expand(function (sprunkiId, name, health, attack, speed) { var self = Container.call(this); self.sprunkiId = sprunkiId; self.name = name; self.health = health; self.attack = attack; self.speed = speed; self.isSelected = false; // Character preview var characterPreview = self.attachAsset(sprunkiId, { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.8 }); // Selection highlight (initially hidden) var highlight = self.attachAsset('selectionHighlight', { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); self.highlight = highlight; // Name text var nameText = new Text2(name, { size: 40, fill: 0xFFFFFF }); nameText.anchor.set(0.5, 0); nameText.y = 100; self.addChild(nameText); self.select = function () { self.isSelected = true; tween(self.highlight, { alpha: 0.8 }, { duration: 300 }); }; self.deselect = function () { self.isSelected = false; tween(self.highlight, { alpha: 0 }, { duration: 300 }); }; self.down = function (x, y, obj) { if (gameState === 'characterSelection') { handleCharacterSelection(self); } }; return self; }); var HealthBar = Container.expand(function (maxHealth) { var self = Container.call(this); self.maxHealth = maxHealth; self.currentHealth = maxHealth; // Background var background = self.attachAsset('healthBarBg', { anchorX: 0, anchorY: 0 }); // Health fill var healthFill = self.attachAsset('healthBarFill', { anchorX: 0, anchorY: 0 }); self.healthFill = healthFill; self.updateHealth = function (newHealth) { self.currentHealth = Math.max(0, newHealth); var healthPercent = self.currentHealth / self.maxHealth; // Update width of health bar tween(self.healthFill, { scaleX: healthPercent }, { duration: 300 }); // Change color based on health if (healthPercent > 0.6) { self.healthFill.tint = 0x00FF00; // Green } else if (healthPercent > 0.3) { self.healthFill.tint = 0xFFFF00; // Yellow } else { self.healthFill.tint = 0xFF0000; // Red } }; return self; }); var SprunkiCharacter = Container.expand(function (sprunkiId, name, health, attack, speed) { var self = Container.call(this); // Store character properties self.sprunkiId = sprunkiId; self.name = name; self.maxHealth = health || 100; self.currentHealth = self.maxHealth; self.attack = attack || 20; self.speed = speed || 1; self.isAttacking = false; self.originalX = 0; // Create visual representation var characterGraphics = self.attachAsset(sprunkiId, { anchorX: 0.5, anchorY: 1 }); // Add a simple face to make it more character-like var face = self.attachAsset('hitEffect', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.3, scaleY: 0.3, y: -140 }); face.tint = 0x000000; self.takeDamage = function (damage) { self.currentHealth = Math.max(0, self.currentHealth - damage); // Flash red when taking damage tween(characterGraphics, { tint: 0xFF0000 }, { duration: 200, onFinish: function onFinish() { tween(characterGraphics, { tint: 0xFFFFFF }, { duration: 200 }); } }); // Shake effect var originalX = self.x; tween(self, { x: originalX - 10 }, { duration: 50, onFinish: function onFinish() { tween(self, { x: originalX + 10 }, { duration: 50, onFinish: function onFinish() { tween(self, { x: originalX }, { duration: 50 }); } }); } }); LK.getSound('hit').play(); }; self.performAttack = function () { if (self.isAttacking) return; self.isAttacking = true; // Define unique special effect colors for each character var specialColors = { 'sprunki1': 0x00FFFF, // Jevin - Cyan 'sprunki2': 0xFF69B4, // Sopez - Hot Pink 'sprunki3': 0x9370DB, // Wenda - Medium Purple 'sprunki4': 0xFF4500, // OREN.EXE - Orange Red 'sprunki5': 0x708090, // Gray - Slate Gray 'sprunki6': 0xFF1493, // Raddy - Deep Pink 'sprunki7': 0x800080, // Black - Purple 'sprunki8': 0xFFD700, // Burger Simon - Gold 'sprunki9': 0x00CED1, // Turk Jevin - Dark Turquoise 'sprunki10': 0xFFA500, // Oren - Orange 'sprunki11': 0x87CEEB // Sky - Sky Blue }; // Create special effect with character's unique color var specialEffect = self.attachAsset('specialEffect', { anchorX: 0.5, anchorY: 0.5, y: -90, alpha: 0, scaleX: 0, scaleY: 0 }); specialEffect.tint = specialColors[self.sprunkiId] || 0xFFFF00; // Animate special effect tween(specialEffect, { alpha: 1, scaleX: 1.5, scaleY: 1.5 }, { duration: 200, onFinish: function onFinish() { tween(specialEffect, { alpha: 0, scaleX: 2, scaleY: 2 }, { duration: 300, onFinish: function onFinish() { specialEffect.destroy(); } }); } }); // Attack animation - move forward var targetX = self.originalX + (self.originalX < 1024 ? 100 : -100); tween(self, { x: targetX }, { duration: 300, onFinish: function onFinish() { // Return to original position tween(self, { x: self.originalX }, { duration: 300, onFinish: function onFinish() { self.isAttacking = false; } }); } }); // Scale effect during attack tween(characterGraphics, { scaleX: 1.2, scaleY: 1.2 }, { duration: 150, onFinish: function onFinish() { tween(characterGraphics, { scaleX: 1, scaleY: 1 }, { duration: 150 }); } }); }; self.playVictoryAnimation = function () { // Jump animation tween(self, { y: self.y - 50 }, { duration: 400, easing: tween.easeOut, onFinish: function onFinish() { tween(self, { y: self.y + 50 }, { duration: 400, easing: tween.easeIn }); } }); // Color flash var colors = [0xFF6B6B, 0x4ECDC4, 0x45B7D1, 0xF9CA24]; var colorIndex = 0; var colorTimer = LK.setInterval(function () { characterGraphics.tint = colors[colorIndex % colors.length]; colorIndex++; }, 200); LK.setTimeout(function () { LK.clearInterval(colorTimer); characterGraphics.tint = 0xFFFFFF; }, 2000); LK.getSound('victory').play(); }; return self; }); var TabButton = Container.expand(function (text, tabType) { var self = Container.call(this); self.tabType = tabType; self.isActive = false; // Background var background = self.attachAsset('tabButton', { anchorX: 0.5, anchorY: 0.5 }); self.background = background; // Text var buttonText = new Text2(text, { size: 40, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); self.addChild(buttonText); self.buttonText = buttonText; self.setActive = function (active) { self.isActive = active; if (active) { self.background.tint = 0xFFD700; // Gold when active self.buttonText.tint = 0x000000; // Black text when active } else { self.background.tint = 0x444444; // Dark gray when inactive self.buttonText.tint = 0xFFFFFF; // White text when inactive } }; self.down = function (x, y, obj) { if (gameState === 'characterSelection') { switchTab(self.tabType); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1a1a2e }); /**** * Game Code ****/ // Sound effects // Effect shapes // Battle arena elements // Sprunki characters - colorful fighters with unique designs // Game state management var gameState = 'characterSelection'; // 'characterSelection', 'battle', 'victory' var selectedCharacters = []; var battleCharacters = []; var currentTurn = 0; var battleTimer = null; // Tab system var currentTab = 'sprunki'; // 'sprunki' or 'monster' var tabButtons = []; // Character data var sprunkiData = [{ id: 'sprunki1', name: 'Jevin', health: 120, attack: 25, speed: 1.2 }, { id: 'sprunki2', name: 'Sopez', health: 100, attack: 30, speed: 1.5 }, { id: 'sprunki3', name: 'Wenda', health: 110, attack: 28, speed: 1.3 }, { id: 'sprunki4', name: 'OREN.EXE', health: 90, attack: 35, speed: 1.8 }, { id: 'sprunki5', name: 'Gray', health: 130, attack: 22, speed: 1.0 }, { id: 'sprunki6', name: 'Raddy', health: 105, attack: 32, speed: 1.4 }, { id: 'sprunki7', name: 'Black', health: 95, attack: 38, speed: 1.6 }, { id: 'sprunki8', name: 'Burger Simon', health: 115, attack: 26, speed: 1.1 }, { id: 'sprunki9', name: 'Turk Jevin', health: 85, attack: 42, speed: 2.0 }, { id: 'sprunki10', name: 'Oren', health: 140, attack: 20, speed: 0.9 }, { id: 'sprunki11', name: 'Sky', health: 125, attack: 24, speed: 1.2 }]; var monsterData = [{ id: 'Monster1', name: '', health: 110, attack: 30, speed: 1.3 }, { id: 'Monster2', name: '', health: 95, attack: 35, speed: 1.7 }, { id: 'Monster3', name: '', health: 120, attack: 28, speed: 1.5 }, { id: 'Monster4', name: '', health: 100, attack: 32, speed: 1.6 }, { id: 'Monster5', name: '', health: 105, attack: 29, speed: 1.4 }]; var characterData = sprunkiData; // UI Elements var titleText = new Text2('Sprunki Battle Arena', { size: 80, fill: 0xFFD700 }); titleText.anchor.set(0.5, 0); LK.gui.top.addChild(titleText); titleText.y = 50; var instructionText = new Text2('Select your first fighter!', { size: 50, fill: 0xFFFFFF }); instructionText.anchor.set(0.5, 0); LK.gui.top.addChild(instructionText); instructionText.y = 150; // Create tab buttons var sprunkiTabButton = new TabButton('Sprunki', 'sprunki'); sprunkiTabButton.x = 400; sprunkiTabButton.y = 250; sprunkiTabButton.setActive(true); game.addChild(sprunkiTabButton); tabButtons.push(sprunkiTabButton); var monsterTabButton = new TabButton('Monster', 'monster'); monsterTabButton.x = 750; monsterTabButton.y = 250; monsterTabButton.setActive(false); game.addChild(monsterTabButton); tabButtons.push(monsterTabButton); function switchTab(tabType) { if (currentTab === tabType) return; currentTab = tabType; // Update tab button states for (var i = 0; i < tabButtons.length; i++) { tabButtons[i].setActive(tabButtons[i].tabType === tabType); } // Update character data if (tabType === 'sprunki') { characterData = sprunkiData; } else { characterData = monsterData; } // Clear existing character selectors for (var i = 0; i < characterSelectors.length; i++) { characterSelectors[i].destroy(); } characterSelectors = []; // Don't reset selections - keep existing selected characters for mixed battles // Create new character selection grid createCharacterGrid(); // Update instruction text based on current selection count if (selectedCharacters.length === 0) { instructionText.setText('Select your first fighter!'); } else if (selectedCharacters.length === 1) { instructionText.setText('Select your second fighter!'); } else if (selectedCharacters.length === 2) { instructionText.setText('Select your third fighter!'); } } function createCharacterGrid() { for (var i = 0; i < characterData.length; i++) { var data = characterData[i]; var selector = new CharacterSelector(data.id, data.name, data.health, data.attack, data.speed); var col = i % 4; var row = Math.floor(i / 4); selector.x = gridStartX + col * gridSpacing; selector.y = gridStartY + row * 300; game.addChild(selector); characterSelectors.push(selector); // Check if this character is already selected from another tab for (var j = 0; j < selectedCharacters.length; j++) { if (selectedCharacters[j].sprunkiId === data.id) { selector.select(); break; } } } } // Character selection grid var characterSelectors = []; var gridStartX = 250; var gridStartY = 400; var gridSpacing = 350; // Create character selection grid createCharacterGrid(); // Battle UI elements (initially hidden) var battleground = null; var healthBars = []; var battleUI = null; function handleCharacterSelection(selector) { if (selectedCharacters.length < 3) { // Check if character is already selected for (var k = 0; k < selectedCharacters.length; k++) { if (selectedCharacters[k].sprunkiId === selector.sprunkiId) { return; // Character already selected } } // Add to selection selectedCharacters.push(selector); selector.select(); if (selectedCharacters.length === 1) { instructionText.setText('Select your second fighter!'); } else if (selectedCharacters.length === 2) { instructionText.setText('Select your third fighter!'); } else if (selectedCharacters.length === 3) { instructionText.setText('Battle begins!'); // Start battle after short delay LK.setTimeout(function () { startBattle(); }, 1000); } } } function startBattle() { gameState = 'battle'; // Hide character selection for (var i = 0; i < characterSelectors.length; i++) { characterSelectors[i].visible = false; } // Hide tab buttons for (var i = 0; i < tabButtons.length; i++) { tabButtons[i].visible = false; } // Create battleground battleground = game.attachAsset('battleground', { anchorX: 0.5, anchorY: 1, x: 1024, y: 2000 }); // Create battle characters for (var i = 0; i < selectedCharacters.length; i++) { var selector = selectedCharacters[i]; var battleChar = new SprunkiCharacter(selector.sprunkiId, selector.name, selector.health, selector.attack, selector.speed); // Position characters for 3-character battle if (i === 0) { battleChar.x = 600; battleChar.originalX = 600; battleChar.y = 2000; } else if (i === 1) { battleChar.x = 1448; battleChar.originalX = 1448; battleChar.y = 2000; } else { battleChar.x = 1024; battleChar.originalX = 1024; battleChar.y = 1700; // Above the other two } game.addChild(battleChar); battleCharacters.push(battleChar); // Create health bars var healthBar = new HealthBar(selector.health); if (i === 0) { healthBar.x = 100; } else if (i === 1) { healthBar.x = 824; } else { healthBar.x = 1548; } healthBar.y = 300; LK.gui.addChild(healthBar); healthBars.push(healthBar); } // Update instruction instructionText.setText('Fight!'); // Start battle sequence currentTurn = 0; battleTimer = LK.setInterval(function () { performBattleTurn(); }, 1500); } function performBattleTurn() { if (battleCharacters.length !== 3) return; var attacker = battleCharacters[currentTurn]; // Find a random alive defender var aliveDefenders = []; for (var i = 0; i < battleCharacters.length; i++) { if (i !== currentTurn && battleCharacters[i].currentHealth > 0) { aliveDefenders.push(i); } } if (aliveDefenders.length === 0 || attacker.currentHealth <= 0) { endBattle(); return; } var defenderIndex = aliveDefenders[Math.floor(Math.random() * aliveDefenders.length)]; var defender = battleCharacters[defenderIndex]; var defenderHealthBar = healthBars[defenderIndex]; // Perform attack attacker.performAttack(); LK.setTimeout(function () { // Calculate damage with some randomness var baseDamage = attacker.attack; var randomFactor = 0.8 + Math.random() * 0.4; // 80% to 120% of base damage var damage = Math.floor(baseDamage * randomFactor); // Apply damage defender.takeDamage(damage); defenderHealthBar.updateHealth(defender.currentHealth); // Check for battle end var aliveCount = 0; for (var i = 0; i < battleCharacters.length; i++) { if (battleCharacters[i].currentHealth > 0) { aliveCount++; } } if (aliveCount <= 1) { LK.setTimeout(function () { endBattle(); }, 500); } }, 300); // Switch to next alive character do { currentTurn = (currentTurn + 1) % battleCharacters.length; } while (battleCharacters[currentTurn].currentHealth <= 0); } function endBattle() { gameState = 'victory'; LK.clearInterval(battleTimer); // Find winner var winner = null; for (var i = 0; i < battleCharacters.length; i++) { if (battleCharacters[i].currentHealth > 0) { winner = battleCharacters[i]; break; } } if (winner) { winner.playVictoryAnimation(); instructionText.setText(winner.name + ' Wins!'); // Add score LK.setScore(LK.getScore() + 1); } else { instructionText.setText('Draw!'); } // Return to character selection after delay LK.setTimeout(function () { resetGame(); }, 3000); } function resetGame() { gameState = 'characterSelection'; // Clear battle elements if (battleground) { battleground.destroy(); battleground = null; } for (var i = 0; i < battleCharacters.length; i++) { battleCharacters[i].destroy(); } battleCharacters = []; for (var i = 0; i < healthBars.length; i++) { healthBars[i].destroy(); } healthBars = []; // Reset selections for (var i = 0; i < selectedCharacters.length; i++) { selectedCharacters[i].deselect(); } selectedCharacters = []; // Show character selectors for (var i = 0; i < characterSelectors.length; i++) { characterSelectors[i].visible = true; } // Show tab buttons for (var i = 0; i < tabButtons.length; i++) { tabButtons[i].visible = true; } // Reset UI instructionText.setText('Select your first fighter!'); } // Update game game.update = function () { // Game logic handled by timers and events };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var CharacterSelector = Container.expand(function (sprunkiId, name, health, attack, speed) {
var self = Container.call(this);
self.sprunkiId = sprunkiId;
self.name = name;
self.health = health;
self.attack = attack;
self.speed = speed;
self.isSelected = false;
// Character preview
var characterPreview = self.attachAsset(sprunkiId, {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8
});
// Selection highlight (initially hidden)
var highlight = self.attachAsset('selectionHighlight', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
self.highlight = highlight;
// Name text
var nameText = new Text2(name, {
size: 40,
fill: 0xFFFFFF
});
nameText.anchor.set(0.5, 0);
nameText.y = 100;
self.addChild(nameText);
self.select = function () {
self.isSelected = true;
tween(self.highlight, {
alpha: 0.8
}, {
duration: 300
});
};
self.deselect = function () {
self.isSelected = false;
tween(self.highlight, {
alpha: 0
}, {
duration: 300
});
};
self.down = function (x, y, obj) {
if (gameState === 'characterSelection') {
handleCharacterSelection(self);
}
};
return self;
});
var HealthBar = Container.expand(function (maxHealth) {
var self = Container.call(this);
self.maxHealth = maxHealth;
self.currentHealth = maxHealth;
// Background
var background = self.attachAsset('healthBarBg', {
anchorX: 0,
anchorY: 0
});
// Health fill
var healthFill = self.attachAsset('healthBarFill', {
anchorX: 0,
anchorY: 0
});
self.healthFill = healthFill;
self.updateHealth = function (newHealth) {
self.currentHealth = Math.max(0, newHealth);
var healthPercent = self.currentHealth / self.maxHealth;
// Update width of health bar
tween(self.healthFill, {
scaleX: healthPercent
}, {
duration: 300
});
// Change color based on health
if (healthPercent > 0.6) {
self.healthFill.tint = 0x00FF00; // Green
} else if (healthPercent > 0.3) {
self.healthFill.tint = 0xFFFF00; // Yellow
} else {
self.healthFill.tint = 0xFF0000; // Red
}
};
return self;
});
var SprunkiCharacter = Container.expand(function (sprunkiId, name, health, attack, speed) {
var self = Container.call(this);
// Store character properties
self.sprunkiId = sprunkiId;
self.name = name;
self.maxHealth = health || 100;
self.currentHealth = self.maxHealth;
self.attack = attack || 20;
self.speed = speed || 1;
self.isAttacking = false;
self.originalX = 0;
// Create visual representation
var characterGraphics = self.attachAsset(sprunkiId, {
anchorX: 0.5,
anchorY: 1
});
// Add a simple face to make it more character-like
var face = self.attachAsset('hitEffect', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.3,
scaleY: 0.3,
y: -140
});
face.tint = 0x000000;
self.takeDamage = function (damage) {
self.currentHealth = Math.max(0, self.currentHealth - damage);
// Flash red when taking damage
tween(characterGraphics, {
tint: 0xFF0000
}, {
duration: 200,
onFinish: function onFinish() {
tween(characterGraphics, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
// Shake effect
var originalX = self.x;
tween(self, {
x: originalX - 10
}, {
duration: 50,
onFinish: function onFinish() {
tween(self, {
x: originalX + 10
}, {
duration: 50,
onFinish: function onFinish() {
tween(self, {
x: originalX
}, {
duration: 50
});
}
});
}
});
LK.getSound('hit').play();
};
self.performAttack = function () {
if (self.isAttacking) return;
self.isAttacking = true;
// Define unique special effect colors for each character
var specialColors = {
'sprunki1': 0x00FFFF,
// Jevin - Cyan
'sprunki2': 0xFF69B4,
// Sopez - Hot Pink
'sprunki3': 0x9370DB,
// Wenda - Medium Purple
'sprunki4': 0xFF4500,
// OREN.EXE - Orange Red
'sprunki5': 0x708090,
// Gray - Slate Gray
'sprunki6': 0xFF1493,
// Raddy - Deep Pink
'sprunki7': 0x800080,
// Black - Purple
'sprunki8': 0xFFD700,
// Burger Simon - Gold
'sprunki9': 0x00CED1,
// Turk Jevin - Dark Turquoise
'sprunki10': 0xFFA500,
// Oren - Orange
'sprunki11': 0x87CEEB // Sky - Sky Blue
};
// Create special effect with character's unique color
var specialEffect = self.attachAsset('specialEffect', {
anchorX: 0.5,
anchorY: 0.5,
y: -90,
alpha: 0,
scaleX: 0,
scaleY: 0
});
specialEffect.tint = specialColors[self.sprunkiId] || 0xFFFF00;
// Animate special effect
tween(specialEffect, {
alpha: 1,
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 200,
onFinish: function onFinish() {
tween(specialEffect, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 300,
onFinish: function onFinish() {
specialEffect.destroy();
}
});
}
});
// Attack animation - move forward
var targetX = self.originalX + (self.originalX < 1024 ? 100 : -100);
tween(self, {
x: targetX
}, {
duration: 300,
onFinish: function onFinish() {
// Return to original position
tween(self, {
x: self.originalX
}, {
duration: 300,
onFinish: function onFinish() {
self.isAttacking = false;
}
});
}
});
// Scale effect during attack
tween(characterGraphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 150,
onFinish: function onFinish() {
tween(characterGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 150
});
}
});
};
self.playVictoryAnimation = function () {
// Jump animation
tween(self, {
y: self.y - 50
}, {
duration: 400,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
y: self.y + 50
}, {
duration: 400,
easing: tween.easeIn
});
}
});
// Color flash
var colors = [0xFF6B6B, 0x4ECDC4, 0x45B7D1, 0xF9CA24];
var colorIndex = 0;
var colorTimer = LK.setInterval(function () {
characterGraphics.tint = colors[colorIndex % colors.length];
colorIndex++;
}, 200);
LK.setTimeout(function () {
LK.clearInterval(colorTimer);
characterGraphics.tint = 0xFFFFFF;
}, 2000);
LK.getSound('victory').play();
};
return self;
});
var TabButton = Container.expand(function (text, tabType) {
var self = Container.call(this);
self.tabType = tabType;
self.isActive = false;
// Background
var background = self.attachAsset('tabButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.background = background;
// Text
var buttonText = new Text2(text, {
size: 40,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.buttonText = buttonText;
self.setActive = function (active) {
self.isActive = active;
if (active) {
self.background.tint = 0xFFD700; // Gold when active
self.buttonText.tint = 0x000000; // Black text when active
} else {
self.background.tint = 0x444444; // Dark gray when inactive
self.buttonText.tint = 0xFFFFFF; // White text when inactive
}
};
self.down = function (x, y, obj) {
if (gameState === 'characterSelection') {
switchTab(self.tabType);
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a2e
});
/****
* Game Code
****/
// Sound effects
// Effect shapes
// Battle arena elements
// Sprunki characters - colorful fighters with unique designs
// Game state management
var gameState = 'characterSelection'; // 'characterSelection', 'battle', 'victory'
var selectedCharacters = [];
var battleCharacters = [];
var currentTurn = 0;
var battleTimer = null;
// Tab system
var currentTab = 'sprunki'; // 'sprunki' or 'monster'
var tabButtons = [];
// Character data
var sprunkiData = [{
id: 'sprunki1',
name: 'Jevin',
health: 120,
attack: 25,
speed: 1.2
}, {
id: 'sprunki2',
name: 'Sopez',
health: 100,
attack: 30,
speed: 1.5
}, {
id: 'sprunki3',
name: 'Wenda',
health: 110,
attack: 28,
speed: 1.3
}, {
id: 'sprunki4',
name: 'OREN.EXE',
health: 90,
attack: 35,
speed: 1.8
}, {
id: 'sprunki5',
name: 'Gray',
health: 130,
attack: 22,
speed: 1.0
}, {
id: 'sprunki6',
name: 'Raddy',
health: 105,
attack: 32,
speed: 1.4
}, {
id: 'sprunki7',
name: 'Black',
health: 95,
attack: 38,
speed: 1.6
}, {
id: 'sprunki8',
name: 'Burger Simon',
health: 115,
attack: 26,
speed: 1.1
}, {
id: 'sprunki9',
name: 'Turk Jevin',
health: 85,
attack: 42,
speed: 2.0
}, {
id: 'sprunki10',
name: 'Oren',
health: 140,
attack: 20,
speed: 0.9
}, {
id: 'sprunki11',
name: 'Sky',
health: 125,
attack: 24,
speed: 1.2
}];
var monsterData = [{
id: 'Monster1',
name: '',
health: 110,
attack: 30,
speed: 1.3
}, {
id: 'Monster2',
name: '',
health: 95,
attack: 35,
speed: 1.7
}, {
id: 'Monster3',
name: '',
health: 120,
attack: 28,
speed: 1.5
}, {
id: 'Monster4',
name: '',
health: 100,
attack: 32,
speed: 1.6
}, {
id: 'Monster5',
name: '',
health: 105,
attack: 29,
speed: 1.4
}];
var characterData = sprunkiData;
// UI Elements
var titleText = new Text2('Sprunki Battle Arena', {
size: 80,
fill: 0xFFD700
});
titleText.anchor.set(0.5, 0);
LK.gui.top.addChild(titleText);
titleText.y = 50;
var instructionText = new Text2('Select your first fighter!', {
size: 50,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
instructionText.y = 150;
// Create tab buttons
var sprunkiTabButton = new TabButton('Sprunki', 'sprunki');
sprunkiTabButton.x = 400;
sprunkiTabButton.y = 250;
sprunkiTabButton.setActive(true);
game.addChild(sprunkiTabButton);
tabButtons.push(sprunkiTabButton);
var monsterTabButton = new TabButton('Monster', 'monster');
monsterTabButton.x = 750;
monsterTabButton.y = 250;
monsterTabButton.setActive(false);
game.addChild(monsterTabButton);
tabButtons.push(monsterTabButton);
function switchTab(tabType) {
if (currentTab === tabType) return;
currentTab = tabType;
// Update tab button states
for (var i = 0; i < tabButtons.length; i++) {
tabButtons[i].setActive(tabButtons[i].tabType === tabType);
}
// Update character data
if (tabType === 'sprunki') {
characterData = sprunkiData;
} else {
characterData = monsterData;
}
// Clear existing character selectors
for (var i = 0; i < characterSelectors.length; i++) {
characterSelectors[i].destroy();
}
characterSelectors = [];
// Don't reset selections - keep existing selected characters for mixed battles
// Create new character selection grid
createCharacterGrid();
// Update instruction text based on current selection count
if (selectedCharacters.length === 0) {
instructionText.setText('Select your first fighter!');
} else if (selectedCharacters.length === 1) {
instructionText.setText('Select your second fighter!');
} else if (selectedCharacters.length === 2) {
instructionText.setText('Select your third fighter!');
}
}
function createCharacterGrid() {
for (var i = 0; i < characterData.length; i++) {
var data = characterData[i];
var selector = new CharacterSelector(data.id, data.name, data.health, data.attack, data.speed);
var col = i % 4;
var row = Math.floor(i / 4);
selector.x = gridStartX + col * gridSpacing;
selector.y = gridStartY + row * 300;
game.addChild(selector);
characterSelectors.push(selector);
// Check if this character is already selected from another tab
for (var j = 0; j < selectedCharacters.length; j++) {
if (selectedCharacters[j].sprunkiId === data.id) {
selector.select();
break;
}
}
}
}
// Character selection grid
var characterSelectors = [];
var gridStartX = 250;
var gridStartY = 400;
var gridSpacing = 350;
// Create character selection grid
createCharacterGrid();
// Battle UI elements (initially hidden)
var battleground = null;
var healthBars = [];
var battleUI = null;
function handleCharacterSelection(selector) {
if (selectedCharacters.length < 3) {
// Check if character is already selected
for (var k = 0; k < selectedCharacters.length; k++) {
if (selectedCharacters[k].sprunkiId === selector.sprunkiId) {
return; // Character already selected
}
}
// Add to selection
selectedCharacters.push(selector);
selector.select();
if (selectedCharacters.length === 1) {
instructionText.setText('Select your second fighter!');
} else if (selectedCharacters.length === 2) {
instructionText.setText('Select your third fighter!');
} else if (selectedCharacters.length === 3) {
instructionText.setText('Battle begins!');
// Start battle after short delay
LK.setTimeout(function () {
startBattle();
}, 1000);
}
}
}
function startBattle() {
gameState = 'battle';
// Hide character selection
for (var i = 0; i < characterSelectors.length; i++) {
characterSelectors[i].visible = false;
}
// Hide tab buttons
for (var i = 0; i < tabButtons.length; i++) {
tabButtons[i].visible = false;
}
// Create battleground
battleground = game.attachAsset('battleground', {
anchorX: 0.5,
anchorY: 1,
x: 1024,
y: 2000
});
// Create battle characters
for (var i = 0; i < selectedCharacters.length; i++) {
var selector = selectedCharacters[i];
var battleChar = new SprunkiCharacter(selector.sprunkiId, selector.name, selector.health, selector.attack, selector.speed);
// Position characters for 3-character battle
if (i === 0) {
battleChar.x = 600;
battleChar.originalX = 600;
battleChar.y = 2000;
} else if (i === 1) {
battleChar.x = 1448;
battleChar.originalX = 1448;
battleChar.y = 2000;
} else {
battleChar.x = 1024;
battleChar.originalX = 1024;
battleChar.y = 1700; // Above the other two
}
game.addChild(battleChar);
battleCharacters.push(battleChar);
// Create health bars
var healthBar = new HealthBar(selector.health);
if (i === 0) {
healthBar.x = 100;
} else if (i === 1) {
healthBar.x = 824;
} else {
healthBar.x = 1548;
}
healthBar.y = 300;
LK.gui.addChild(healthBar);
healthBars.push(healthBar);
}
// Update instruction
instructionText.setText('Fight!');
// Start battle sequence
currentTurn = 0;
battleTimer = LK.setInterval(function () {
performBattleTurn();
}, 1500);
}
function performBattleTurn() {
if (battleCharacters.length !== 3) return;
var attacker = battleCharacters[currentTurn];
// Find a random alive defender
var aliveDefenders = [];
for (var i = 0; i < battleCharacters.length; i++) {
if (i !== currentTurn && battleCharacters[i].currentHealth > 0) {
aliveDefenders.push(i);
}
}
if (aliveDefenders.length === 0 || attacker.currentHealth <= 0) {
endBattle();
return;
}
var defenderIndex = aliveDefenders[Math.floor(Math.random() * aliveDefenders.length)];
var defender = battleCharacters[defenderIndex];
var defenderHealthBar = healthBars[defenderIndex];
// Perform attack
attacker.performAttack();
LK.setTimeout(function () {
// Calculate damage with some randomness
var baseDamage = attacker.attack;
var randomFactor = 0.8 + Math.random() * 0.4; // 80% to 120% of base damage
var damage = Math.floor(baseDamage * randomFactor);
// Apply damage
defender.takeDamage(damage);
defenderHealthBar.updateHealth(defender.currentHealth);
// Check for battle end
var aliveCount = 0;
for (var i = 0; i < battleCharacters.length; i++) {
if (battleCharacters[i].currentHealth > 0) {
aliveCount++;
}
}
if (aliveCount <= 1) {
LK.setTimeout(function () {
endBattle();
}, 500);
}
}, 300);
// Switch to next alive character
do {
currentTurn = (currentTurn + 1) % battleCharacters.length;
} while (battleCharacters[currentTurn].currentHealth <= 0);
}
function endBattle() {
gameState = 'victory';
LK.clearInterval(battleTimer);
// Find winner
var winner = null;
for (var i = 0; i < battleCharacters.length; i++) {
if (battleCharacters[i].currentHealth > 0) {
winner = battleCharacters[i];
break;
}
}
if (winner) {
winner.playVictoryAnimation();
instructionText.setText(winner.name + ' Wins!');
// Add score
LK.setScore(LK.getScore() + 1);
} else {
instructionText.setText('Draw!');
}
// Return to character selection after delay
LK.setTimeout(function () {
resetGame();
}, 3000);
}
function resetGame() {
gameState = 'characterSelection';
// Clear battle elements
if (battleground) {
battleground.destroy();
battleground = null;
}
for (var i = 0; i < battleCharacters.length; i++) {
battleCharacters[i].destroy();
}
battleCharacters = [];
for (var i = 0; i < healthBars.length; i++) {
healthBars[i].destroy();
}
healthBars = [];
// Reset selections
for (var i = 0; i < selectedCharacters.length; i++) {
selectedCharacters[i].deselect();
}
selectedCharacters = [];
// Show character selectors
for (var i = 0; i < characterSelectors.length; i++) {
characterSelectors[i].visible = true;
}
// Show tab buttons
for (var i = 0; i < tabButtons.length; i++) {
tabButtons[i].visible = true;
}
// Reset UI
instructionText.setText('Select your first fighter!');
}
// Update game
game.update = function () {
// Game logic handled by timers and events
};