User prompt
Eso es lo que necesitamos para el juego especialmente las 1 2 3 4 ideas que me diste me gustaría si las agregaras porque es lo que falta en el juego
Code edit (1 edits merged)
Please save this source code
User prompt
Countryball Warfare
Initial prompt
Bueno me gustaría un de países en guerra con countryballs
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var ActionButton = Container.expand(function (text, action, color) {
var self = Container.call(this);
var buttonGraphics = self.attachAsset(action + 'Button', {
anchorX: 0.5,
anchorY: 0.5
});
var buttonLabel = new Text2(text, {
size: 28,
fill: 0xFFFFFF
});
buttonLabel.anchor.set(0.5, 0.5);
self.addChild(buttonLabel);
self.action = action;
self.down = function (x, y, obj) {
game.handleActionButton(self);
};
return self;
});
var Countryball = Container.expand(function (country) {
var self = Container.call(this);
self.country = country;
self.selected = false;
self.territory = null;
self.alliances = [];
self.power = country.basePower || 10;
self.resources = country.baseResources || 20;
self.isAI = country.isAI || false;
var ballGraphics = self.attachAsset('countryball', {
anchorX: 0.5,
anchorY: 0.5,
tint: country.color
});
var countryLabel = new Text2(country.name, {
size: 24,
fill: 0x000000
});
countryLabel.anchor.set(0.5, 0);
countryLabel.y = 60;
self.addChild(countryLabel);
var highlight = self.attachAsset('selectHighlight', {
anchorX: 0.5,
anchorY: 0.5
});
highlight.alpha = 0;
self.setSelected = function (selected) {
self.selected = selected;
highlight.alpha = selected ? 0.5 : 0;
};
self.attack = function (target) {
if (self.resources < 5) {
return false;
}
// Apply special abilities
var attackMultiplier = 1;
var defenseMultiplier = 1;
if (self.country.specialAbility && typeof self.country.specialAbility.effect === 'function') {
attackMultiplier = self.country.specialAbility.effect(self, target, "attack");
}
if (target.country.specialAbility && typeof target.country.specialAbility.effect === 'function') {
defenseMultiplier = target.country.specialAbility.effect(target, self, "defense");
}
var attackStrength = (self.power + Math.floor(Math.random() * 10)) * attackMultiplier;
var defenseStrength = (target.power + Math.floor(Math.random() * 10)) * defenseMultiplier;
self.resources -= 5;
// Animate the attack with scaling
tween.to(self, 0.1, {
scaleX: 1.2,
scaleY: 1.2
});
tween.to(self, 0.1, {
scaleX: 1,
scaleY: 1,
delay: 0.1
});
if (attackStrength > defenseStrength) {
// Successful attack animation
tween.to(target, 0.2, {
rotation: 0.2
});
tween.to(target, 0.2, {
rotation: -0.2,
delay: 0.2
});
tween.to(target, 0.2, {
rotation: 0,
delay: 0.4
});
target.power = Math.max(1, target.power - 5);
self.power += 3;
return true;
} else {
// Failed attack animation
tween.to(self, 0.2, {
rotation: 0.2
});
tween.to(self, 0.2, {
rotation: -0.2,
delay: 0.2
});
tween.to(self, 0.2, {
rotation: 0,
delay: 0.4
});
self.power = Math.max(1, self.power - 2);
target.power += 1;
return false;
}
};
self.formAlliance = function (target) {
if (self.alliances.indexOf(target) === -1) {
self.alliances.push(target);
target.alliances.push(self);
return true;
}
return false;
};
self.update = function () {
if (self.territory) {
// Apply resource generation special ability if it exists
var resourceMultiplier = 1;
if (self.country.specialAbility && typeof self.country.specialAbility.effect === 'function') {
resourceMultiplier = self.country.specialAbility.effect(self, null, "resources");
}
self.resources += 0.05 * resourceMultiplier;
// Visual effect for resource generation (subtle pulse)
if (LK.ticks % 120 === 0) {
tween.to(self, 0.5, {
scaleX: 1.05,
scaleY: 1.05
});
tween.to(self, 0.5, {
scaleX: 1,
scaleY: 1,
delay: 0.5
});
}
}
// Simple AI behavior
if (self.isAI && Math.random() < 0.01) {
// AI decides to attack or form alliance
var action = Math.random() > 0.7 ? "alliance" : "attack";
var possibleTargets = [];
for (var i = 0; i < countryballs.length; i++) {
var target = countryballs[i];
if (target !== self) {
possibleTargets.push(target);
}
}
if (possibleTargets.length > 0) {
var randomTarget = possibleTargets[Math.floor(Math.random() * possibleTargets.length)];
if (action === "attack" && self.resources >= 5) {
// Don't attack allies
if (self.alliances.indexOf(randomTarget) === -1) {
self.attack(randomTarget);
}
} else if (action === "alliance") {
self.formAlliance(randomTarget);
}
}
}
};
self.down = function (x, y, obj) {
game.handleCountryballSelect(self);
};
return self;
});
var StatsDisplay = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('menuBackground', {
anchorX: 0.5,
anchorY: 0
});
background.alpha = 0.7;
self.titleText = new Text2("COUNTRY STATS", {
size: 36,
fill: 0x000000
});
self.titleText.anchor.set(0.5, 0);
self.titleText.y = 20;
self.addChild(self.titleText);
self.nameText = new Text2("", {
size: 30,
fill: 0x000000
});
self.nameText.anchor.set(0.5, 0);
self.nameText.y = 80;
self.addChild(self.nameText);
self.powerText = new Text2("", {
size: 24,
fill: 0x000000
});
self.powerText.anchor.set(0.5, 0);
self.powerText.y = 120;
self.addChild(self.powerText);
self.resourcesText = new Text2("", {
size: 24,
fill: 0x000000
});
self.resourcesText.anchor.set(0.5, 0);
self.resourcesText.y = 160;
self.addChild(self.resourcesText);
self.alliancesText = new Text2("", {
size: 24,
fill: 0x000000
});
self.alliancesText.anchor.set(0.5, 0);
self.alliancesText.y = 200;
self.addChild(self.alliancesText);
self.update = function (countryball) {
if (!countryball) {
self.visible = false;
return;
}
self.visible = true;
self.nameText.setText(countryball.country.name);
self.powerText.setText("Military Power: " + Math.floor(countryball.power));
self.resourcesText.setText("Resources: " + Math.floor(countryball.resources));
var allianceText = "Alliances: ";
if (countryball.alliances.length === 0) {
allianceText += "None";
} else {
for (var i = 0; i < countryball.alliances.length; i++) {
if (i > 0) {
allianceText += ", ";
}
allianceText += countryball.alliances[i].country.name;
}
}
self.alliancesText.setText(allianceText);
};
return self;
});
var TechUpgrade = Container.expand(function (name, cost, effect, description) {
var self = Container.call(this);
self.name = name;
self.cost = cost;
self.effect = effect;
self.description = description;
self.purchased = false;
var background = self.attachAsset('menuBackground', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 120
});
background.alpha = 0.8;
var nameText = new Text2(name, {
size: 20,
fill: 0x000000
});
nameText.anchor.set(0.5, 0);
nameText.y = -40;
self.addChild(nameText);
var costText = new Text2("Cost: " + cost, {
size: 16,
fill: 0x000000
});
costText.anchor.set(0.5, 0);
costText.y = -15;
self.addChild(costText);
var descText = new Text2(description, {
size: 12,
fill: 0x000000
});
descText.anchor.set(0.5, 0.5);
descText.y = 10;
self.addChild(descText);
self.down = function (x, y, obj) {
game.purchaseTechUpgrade(self);
};
return self;
});
var Territory = Container.expand(function (position, value) {
var self = Container.call(this);
self.value = value || 1;
self.owner = null;
var territoryGraphics = self.attachAsset('territory', {
anchorX: 0.5,
anchorY: 0.5
});
var valueText = new Text2("+" + self.value, {
size: 24,
fill: 0xFFFFFF
});
valueText.anchor.set(0.5, 0.5);
self.addChild(valueText);
self.x = position.x;
self.y = position.y;
self.claim = function (countryball) {
if (self.owner) {
self.owner.territory = null;
}
self.owner = countryball;
countryball.territory = self;
territoryGraphics.tint = countryball.country.color;
};
self.down = function (x, y, obj) {
game.handleTerritorySelect(self);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Sky blue background
});
/****
* Game Code
****/
// Game configuration
var countryData = [{
name: "USAball",
color: 0xff0000,
basePower: 15,
baseResources: 30,
isAI: false,
specialAbility: {
name: "Air Superiority",
description: "25% more effective when attacking",
effect: function effect(self, target, action) {
if (action === "attack") {
return 1.25;
}
return 1;
}
}
}, {
name: "UKball",
color: 0x0000ff,
basePower: 12,
baseResources: 25,
isAI: true,
specialAbility: {
name: "Naval Power",
description: "Generates 20% more resources",
effect: function effect(self, target, action) {
if (action === "resources") {
return 1.2;
}
return 1;
}
}
}, {
name: "Germanyball",
color: 0x000000,
basePower: 13,
baseResources: 28,
isAI: true,
specialAbility: {
name: "Industrial Efficiency",
description: "Technology costs 15% less",
effect: function effect(self, target, action) {
if (action === "tech") {
return 0.85;
}
return 1;
}
}
}, {
name: "Franceball",
color: 0x0055ff,
basePower: 11,
baseResources: 22,
isAI: true,
specialAbility: {
name: "Diplomatic Influence",
description: "Alliance bonuses increased by 20%",
effect: function effect(self, target, action) {
if (action === "alliance") {
return 1.2;
}
return 1;
}
}
}, {
name: "Russiaball",
color: 0xffffff,
basePower: 14,
baseResources: 20,
isAI: true,
specialAbility: {
name: "Winter Resistance",
description: "30% more effective when defending",
effect: function effect(self, target, action) {
if (action === "defense") {
return 1.3;
}
return 1;
}
}
}, {
name: "Chinaball",
color: 0xffff00,
basePower: 15,
baseResources: 35,
isAI: true,
specialAbility: {
name: "Population Advantage",
description: "Territories provide 25% more power",
effect: function effect(self, target, action) {
if (action === "territory") {
return 1.25;
}
return 1;
}
}
}];
// Game variables
var countryballs = [];
var territories = [];
var selectedCountryball = null;
var targetCountryball = null;
var statsDisplay = null;
var attackButton = null;
var allianceButton = null;
var scoreText = null;
var techUpgrades = [];
var techMenuOpen = false;
var techButton = null;
var eventDisplay = null;
var lastEventTime = 0;
var worldEvents = [{
name: "Economic Crisis",
description: "Resources reduced by 20% for all nations",
effect: function effect() {
for (var i = 0; i < countryballs.length; i++) {
countryballs[i].resources *= 0.8;
}
return "Economic Crisis hit all nations!";
}
}, {
name: "Natural Disaster",
description: "Random territory loses value",
effect: function effect() {
var randomTerritory = territories[Math.floor(Math.random() * territories.length)];
randomTerritory.value = Math.max(1, randomTerritory.value - 1);
var message = "Natural disaster in " + (randomTerritory.owner ? randomTerritory.owner.country.name : "unclaimed territory");
return message;
}
}, {
name: "Technological Breakthrough",
description: "Random nation gains power",
effect: function effect() {
var randomCountry = countryballs[Math.floor(Math.random() * countryballs.length)];
randomCountry.power += 5;
return randomCountry.country.name + " achieved a technological breakthrough!";
}
}, {
name: "Peace Summit",
description: "Relations improve between nations",
effect: function effect() {
for (var i = 0; i < countryballs.length; i++) {
if (Math.random() < 0.3 && !countryballs[i].isAI) {
for (var j = 0; j < countryballs.length; j++) {
if (i !== j && countryballs[i].alliances.indexOf(countryballs[j]) === -1) {
countryballs[i].formAlliance(countryballs[j]);
return countryballs[i].country.name + " and " + countryballs[j].country.name + " formed an alliance at the Peace Summit!";
}
}
}
}
return "Peace Summit ended with minor agreements.";
}
}];
// Initialize the game
game.init = function () {
// Play background music
LK.playMusic('battleMusic');
// Create score display
scoreText = new Text2("Score: 0", {
size: 36,
fill: 0xFFFFFF
});
scoreText.anchor.set(0, 0);
scoreText.x = 120;
scoreText.y = 30;
LK.gui.addChild(scoreText);
// Create the title
var titleText = new Text2("COUNTRYBALL WARFARE", {
size: 48,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0);
titleText.x = 2048 / 2;
titleText.y = 30;
LK.gui.addChild(titleText);
// Create territories
var territoryPositions = [{
x: 400,
y: 500
}, {
x: 800,
y: 400
}, {
x: 1200,
y: 500
}, {
x: 1600,
y: 400
}, {
x: 400,
y: 1000
}, {
x: 800,
y: 900
}, {
x: 1200,
y: 1000
}, {
x: 1600,
y: 900
}, {
x: 600,
y: 1500
}, {
x: 1000,
y: 1400
}, {
x: 1400,
y: 1500
}, {
x: 1800,
y: 1400
}];
for (var i = 0; i < territoryPositions.length; i++) {
var territory = new Territory(territoryPositions[i], Math.floor(Math.random() * 3) + 1);
territories.push(territory);
game.addChild(territory);
}
// Create countryballs
for (var i = 0; i < countryData.length; i++) {
var countryball = new Countryball(countryData[i]);
// Position countryballs in a circle around the center
var angle = i / countryData.length * Math.PI * 2;
var radius = 700;
countryball.x = 2048 / 2 + Math.cos(angle) * radius;
countryball.y = 2732 / 2 + Math.sin(angle) * radius;
countryballs.push(countryball);
game.addChild(countryball);
// Give each countryball a starting territory
if (i < territories.length) {
territories[i].claim(countryball);
}
}
// The player controls the first countryball
selectedCountryball = countryballs[0];
selectedCountryball.setSelected(true);
// Create stats display
statsDisplay = new StatsDisplay();
statsDisplay.x = 2048 / 2;
statsDisplay.y = 2732 - 450;
statsDisplay.update(selectedCountryball);
game.addChild(statsDisplay);
// Create buttons
attackButton = new ActionButton("ATTACK", "attack");
attackButton.x = 2048 / 2 - 200;
attackButton.y = 2732 - 100;
game.addChild(attackButton);
allianceButton = new ActionButton("ALLIANCE", "alliance");
allianceButton.x = 2048 / 2;
allianceButton.y = 2732 - 100;
game.addChild(allianceButton);
// Add tech button
techButton = new ActionButton("TECH", "tech");
techButton.x = 2048 / 2 + 200;
techButton.y = 2732 - 100;
game.addChild(techButton);
// Create tech upgrades
var techList = [{
name: "Advanced Weaponry",
cost: 50,
effect: function effect(countryball) {
countryball.power += 10;
},
description: "Increases military power by 10"
}, {
name: "Economic Reforms",
cost: 40,
effect: function effect(countryball) {
countryball.resources += 20;
},
description: "Adds 20 resources immediately"
}, {
name: "Diplomacy",
cost: 35,
effect: function effect(countryball) {
// Form alliances with two random countries
var unalliedCountries = countryballs.filter(function (c) {
return c !== countryball && countryball.alliances.indexOf(c) === -1;
});
for (var i = 0; i < Math.min(2, unalliedCountries.length); i++) {
countryball.formAlliance(unalliedCountries[i]);
}
},
description: "Form alliances with 2 random countries"
}, {
name: "Espionage",
cost: 45,
effect: function effect(countryball) {
// Reduce power of all enemies
for (var i = 0; i < countryballs.length; i++) {
if (countryballs[i] !== countryball && countryball.alliances.indexOf(countryballs[i]) === -1) {
countryballs[i].power = Math.max(5, countryballs[i].power - 3);
}
}
},
description: "Reduces enemy power by 3"
}];
// Create tech upgrades but don't add them to the stage yet
for (var i = 0; i < techList.length; i++) {
var tech = new TechUpgrade(techList[i].name, techList[i].cost, techList[i].effect, techList[i].description);
tech.x = 2048 / 2;
tech.y = 800 + i * 150;
tech.visible = false;
techUpgrades.push(tech);
game.addChild(tech);
}
// Create event display
eventDisplay = new Text2("", {
size: 28,
fill: 0xFFFFFF
});
eventDisplay.anchor.set(0.5, 0);
eventDisplay.x = 2048 / 2;
eventDisplay.y = 100;
eventDisplay.alpha = 0;
LK.gui.addChild(eventDisplay);
// Initial score
game.updateScore();
};
game.handleCountryballSelect = function (countryball) {
// Don't allow selecting AI countryballs as the active player
if (countryball.isAI) {
if (selectedCountryball) {
// If we already have a selected countryball, set this as target
if (targetCountryball) {
targetCountryball.setSelected(false);
}
targetCountryball = countryball;
targetCountryball.setSelected(true);
}
} else {
// Set as the active player
if (selectedCountryball) {
selectedCountryball.setSelected(false);
}
if (targetCountryball) {
targetCountryball.setSelected(false);
targetCountryball = null;
}
selectedCountryball = countryball;
selectedCountryball.setSelected(true);
statsDisplay.update(selectedCountryball);
}
};
game.handleTerritorySelect = function (territory) {
// If we have a selected countryball, claim the territory
if (selectedCountryball) {
// Check if territory is already owned by this countryball
if (territory.owner === selectedCountryball) {
return;
}
// Check if we have enough resources to claim it
if (selectedCountryball.resources >= 10) {
territory.claim(selectedCountryball);
selectedCountryball.resources -= 10;
selectedCountryball.power += territory.value;
statsDisplay.update(selectedCountryball);
game.updateScore();
}
}
};
game.handleActionButton = function (button) {
if (button.action === "tech") {
// Toggle tech menu visibility
techMenuOpen = !techMenuOpen;
for (var i = 0; i < techUpgrades.length; i++) {
techUpgrades[i].visible = techMenuOpen;
}
return;
}
if (!selectedCountryball || !targetCountryball && button.action !== "tech") {
return;
}
if (button.action === "attack") {
if (selectedCountryball.attack(targetCountryball)) {
// Successful attack
LK.getSound('attack').play();
LK.effects.flashObject(targetCountryball, 0xff0000, 500);
// Check if we defeated the target
if (targetCountryball.power <= 5) {
// Take their territory if they have one
if (targetCountryball.territory) {
targetCountryball.territory.claim(selectedCountryball);
}
}
} else {
// Failed attack
LK.effects.flashObject(selectedCountryball, 0xff0000, 500);
}
statsDisplay.update(selectedCountryball);
game.updateScore();
} else if (button.action === "alliance") {
// Apply alliance special ability if it exists
var allianceMultiplier = 1;
if (selectedCountryball.country.specialAbility && typeof selectedCountryball.country.specialAbility.effect === 'function') {
allianceMultiplier = selectedCountryball.country.specialAbility.effect(selectedCountryball, targetCountryball, "alliance");
}
if (selectedCountryball.formAlliance(targetCountryball)) {
LK.getSound('alliance').play();
LK.effects.flashObject(targetCountryball, 0x00ff00, 500);
// Alliance bonus - both countries get a small power boost
var powerBoost = 2 * allianceMultiplier;
selectedCountryball.power += powerBoost;
targetCountryball.power += powerBoost;
statsDisplay.update(selectedCountryball);
}
}
};
// Add tech upgrade handler
game.purchaseTechUpgrade = function (techUpgrade) {
if (!selectedCountryball) {
return;
}
// Apply tech cost special ability if it exists
var techCostMultiplier = 1;
if (selectedCountryball.country.specialAbility && typeof selectedCountryball.country.specialAbility.effect === 'function') {
techCostMultiplier = selectedCountryball.country.specialAbility.effect(selectedCountryball, null, "tech");
}
var adjustedCost = Math.floor(techUpgrade.cost * techCostMultiplier);
// Check if player has enough resources and hasn't purchased it yet
if (selectedCountryball.resources >= adjustedCost && !techUpgrade.purchased) {
selectedCountryball.resources -= adjustedCost;
techUpgrade.purchased = true;
// Apply the upgrade effect
if (typeof techUpgrade.effect === 'function') {
techUpgrade.effect(selectedCountryball);
}
// Visual feedback
LK.effects.flashObject(techUpgrade, 0x00ff00, 500);
tween.to(techUpgrade, 0.3, {
alpha: 0.5
});
// Update stats
statsDisplay.update(selectedCountryball);
game.updateScore();
// Show event notification
game.showEventNotification(selectedCountryball.country.name + " acquired " + techUpgrade.name + " technology!");
} else if (techUpgrade.purchased) {
// Already purchased feedback
LK.effects.flashObject(techUpgrade, 0xff0000, 500);
} else {
// Not enough resources feedback
LK.effects.flashObject(techUpgrade, 0xffff00, 500);
}
};
// Add world events system
game.triggerRandomEvent = function () {
// Only trigger events if some time has passed since the last one
if (LK.ticks - lastEventTime < 600) {
return;
}
// 5% chance each update to trigger an event
if (Math.random() < 0.05) {
var randomEvent = worldEvents[Math.floor(Math.random() * worldEvents.length)];
var message = randomEvent.effect();
game.showEventNotification(message);
lastEventTime = LK.ticks;
}
};
// Add notification display
game.showEventNotification = function (message) {
eventDisplay.setText(message);
eventDisplay.alpha = 1;
tween.to(eventDisplay, 0.5, {
y: 120
});
tween.to(eventDisplay, 0.5, {
alpha: 0,
delay: 3
});
tween.to(eventDisplay, 0.5, {
y: 100,
delay: 3.5
});
};
game.updateScore = function () {
var playerScore = 0;
// Calculate score based on power, resources, territories and alliances
var playerBall = countryballs[0]; // First countryball is the player
playerScore += playerBall.power * 5;
playerScore += playerBall.resources * 2;
playerScore += playerBall.alliances.length * 50;
// Add score for territories
for (var i = 0; i < territories.length; i++) {
if (territories[i].owner === playerBall) {
playerScore += territories[i].value * 20;
}
}
LK.setScore(Math.floor(playerScore));
scoreText.setText("Score: " + LK.getScore());
// Check win condition
var playerTerritories = 0;
for (var i = 0; i < territories.length; i++) {
if (territories[i].owner === playerBall) {
playerTerritories++;
}
}
if (playerTerritories >= territories.length / 2) {
LK.showYouWin();
}
// Check lose condition
var playerHasTerritories = false;
for (var i = 0; i < territories.length; i++) {
if (territories[i].owner === playerBall) {
playerHasTerritories = true;
break;
}
}
if (!playerHasTerritories && playerBall.power < 5) {
LK.showGameOver();
}
};
// Start the game
game.init();
// Move event handler
game.move = function (x, y, obj) {
// Nothing to do for move events in this game
};
// Update function
game.update = function () {
// Update all countryballs
for (var i = 0; i < countryballs.length; i++) {
countryballs[i].update();
}
// Update stats display
if (selectedCountryball) {
statsDisplay.update(selectedCountryball);
}
// Trigger random world events
game.triggerRandomEvent();
// Apply territory special ability for China
if (selectedCountryball && selectedCountryball.country.name === "Chinaball" && selectedCountryball.territory) {
var territoryMultiplier = 1;
if (selectedCountryball.country.specialAbility && typeof selectedCountryball.country.specialAbility.effect === 'function') {
territoryMultiplier = selectedCountryball.country.specialAbility.effect(selectedCountryball, null, "territory");
}
// Apply the bonus every 10 seconds
if (LK.ticks % 600 === 0) {
selectedCountryball.power += selectedCountryball.territory.value * territoryMultiplier;
statsDisplay.update(selectedCountryball);
}
}
// Check if anyone has won the game
var remainingCountries = 0;
var mostPowerfulCountry = null;
for (var i = 0; i < countryballs.length; i++) {
var countryball = countryballs[i];
if (countryball.power > 0) {
remainingCountries++;
if (!mostPowerfulCountry || countryball.power > mostPowerfulCountry.power) {
mostPowerfulCountry = countryball;
}
}
}
// Update game state every 5 seconds
if (LK.ticks % 300 === 0) {
game.updateScore();
}
// Add visual effects to territories every 2 seconds
if (LK.ticks % 120 === 0) {
for (var i = 0; i < territories.length; i++) {
if (territories[i].owner) {
tween.to(territories[i], 0.3, {
scaleX: 1.1,
scaleY: 1.1
});
tween.to(territories[i], 0.3, {
scaleX: 1,
scaleY: 1,
delay: 0.3
});
}
}
}
}; ===================================================================
--- original.js
+++ change.js
@@ -58,16 +58,59 @@
self.attack = function (target) {
if (self.resources < 5) {
return false;
}
- var attackStrength = self.power + Math.floor(Math.random() * 10);
- var defenseStrength = target.power + Math.floor(Math.random() * 10);
+ // Apply special abilities
+ var attackMultiplier = 1;
+ var defenseMultiplier = 1;
+ if (self.country.specialAbility && typeof self.country.specialAbility.effect === 'function') {
+ attackMultiplier = self.country.specialAbility.effect(self, target, "attack");
+ }
+ if (target.country.specialAbility && typeof target.country.specialAbility.effect === 'function') {
+ defenseMultiplier = target.country.specialAbility.effect(target, self, "defense");
+ }
+ var attackStrength = (self.power + Math.floor(Math.random() * 10)) * attackMultiplier;
+ var defenseStrength = (target.power + Math.floor(Math.random() * 10)) * defenseMultiplier;
self.resources -= 5;
+ // Animate the attack with scaling
+ tween.to(self, 0.1, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ });
+ tween.to(self, 0.1, {
+ scaleX: 1,
+ scaleY: 1,
+ delay: 0.1
+ });
if (attackStrength > defenseStrength) {
+ // Successful attack animation
+ tween.to(target, 0.2, {
+ rotation: 0.2
+ });
+ tween.to(target, 0.2, {
+ rotation: -0.2,
+ delay: 0.2
+ });
+ tween.to(target, 0.2, {
+ rotation: 0,
+ delay: 0.4
+ });
target.power = Math.max(1, target.power - 5);
self.power += 3;
return true;
} else {
+ // Failed attack animation
+ tween.to(self, 0.2, {
+ rotation: 0.2
+ });
+ tween.to(self, 0.2, {
+ rotation: -0.2,
+ delay: 0.2
+ });
+ tween.to(self, 0.2, {
+ rotation: 0,
+ delay: 0.4
+ });
self.power = Math.max(1, self.power - 2);
target.power += 1;
return false;
}
@@ -81,9 +124,26 @@
return false;
};
self.update = function () {
if (self.territory) {
- self.resources += 0.05;
+ // Apply resource generation special ability if it exists
+ var resourceMultiplier = 1;
+ if (self.country.specialAbility && typeof self.country.specialAbility.effect === 'function') {
+ resourceMultiplier = self.country.specialAbility.effect(self, null, "resources");
+ }
+ self.resources += 0.05 * resourceMultiplier;
+ // Visual effect for resource generation (subtle pulse)
+ if (LK.ticks % 120 === 0) {
+ tween.to(self, 0.5, {
+ scaleX: 1.05,
+ scaleY: 1.05
+ });
+ tween.to(self, 0.5, {
+ scaleX: 1,
+ scaleY: 1,
+ delay: 0.5
+ });
+ }
}
// Simple AI behavior
if (self.isAI && Math.random() < 0.01) {
// AI decides to attack or form alliance
@@ -178,8 +238,48 @@
self.alliancesText.setText(allianceText);
};
return self;
});
+var TechUpgrade = Container.expand(function (name, cost, effect, description) {
+ var self = Container.call(this);
+ self.name = name;
+ self.cost = cost;
+ self.effect = effect;
+ self.description = description;
+ self.purchased = false;
+ var background = self.attachAsset('menuBackground', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ width: 200,
+ height: 120
+ });
+ background.alpha = 0.8;
+ var nameText = new Text2(name, {
+ size: 20,
+ fill: 0x000000
+ });
+ nameText.anchor.set(0.5, 0);
+ nameText.y = -40;
+ self.addChild(nameText);
+ var costText = new Text2("Cost: " + cost, {
+ size: 16,
+ fill: 0x000000
+ });
+ costText.anchor.set(0.5, 0);
+ costText.y = -15;
+ self.addChild(costText);
+ var descText = new Text2(description, {
+ size: 12,
+ fill: 0x000000
+ });
+ descText.anchor.set(0.5, 0.5);
+ descText.y = 10;
+ self.addChild(descText);
+ self.down = function (x, y, obj) {
+ game.purchaseTechUpgrade(self);
+ };
+ return self;
+});
var Territory = Container.expand(function (position, value) {
var self = Container.call(this);
self.value = value || 1;
self.owner = null;
@@ -224,39 +324,99 @@
name: "USAball",
color: 0xff0000,
basePower: 15,
baseResources: 30,
- isAI: false
+ isAI: false,
+ specialAbility: {
+ name: "Air Superiority",
+ description: "25% more effective when attacking",
+ effect: function effect(self, target, action) {
+ if (action === "attack") {
+ return 1.25;
+ }
+ return 1;
+ }
+ }
}, {
name: "UKball",
color: 0x0000ff,
basePower: 12,
baseResources: 25,
- isAI: true
+ isAI: true,
+ specialAbility: {
+ name: "Naval Power",
+ description: "Generates 20% more resources",
+ effect: function effect(self, target, action) {
+ if (action === "resources") {
+ return 1.2;
+ }
+ return 1;
+ }
+ }
}, {
name: "Germanyball",
color: 0x000000,
basePower: 13,
baseResources: 28,
- isAI: true
+ isAI: true,
+ specialAbility: {
+ name: "Industrial Efficiency",
+ description: "Technology costs 15% less",
+ effect: function effect(self, target, action) {
+ if (action === "tech") {
+ return 0.85;
+ }
+ return 1;
+ }
+ }
}, {
name: "Franceball",
color: 0x0055ff,
basePower: 11,
baseResources: 22,
- isAI: true
+ isAI: true,
+ specialAbility: {
+ name: "Diplomatic Influence",
+ description: "Alliance bonuses increased by 20%",
+ effect: function effect(self, target, action) {
+ if (action === "alliance") {
+ return 1.2;
+ }
+ return 1;
+ }
+ }
}, {
name: "Russiaball",
color: 0xffffff,
basePower: 14,
baseResources: 20,
- isAI: true
+ isAI: true,
+ specialAbility: {
+ name: "Winter Resistance",
+ description: "30% more effective when defending",
+ effect: function effect(self, target, action) {
+ if (action === "defense") {
+ return 1.3;
+ }
+ return 1;
+ }
+ }
}, {
name: "Chinaball",
color: 0xffff00,
basePower: 15,
baseResources: 35,
- isAI: true
+ isAI: true,
+ specialAbility: {
+ name: "Population Advantage",
+ description: "Territories provide 25% more power",
+ effect: function effect(self, target, action) {
+ if (action === "territory") {
+ return 1.25;
+ }
+ return 1;
+ }
+ }
}];
// Game variables
var countryballs = [];
var territories = [];
@@ -265,8 +425,56 @@
var statsDisplay = null;
var attackButton = null;
var allianceButton = null;
var scoreText = null;
+var techUpgrades = [];
+var techMenuOpen = false;
+var techButton = null;
+var eventDisplay = null;
+var lastEventTime = 0;
+var worldEvents = [{
+ name: "Economic Crisis",
+ description: "Resources reduced by 20% for all nations",
+ effect: function effect() {
+ for (var i = 0; i < countryballs.length; i++) {
+ countryballs[i].resources *= 0.8;
+ }
+ return "Economic Crisis hit all nations!";
+ }
+}, {
+ name: "Natural Disaster",
+ description: "Random territory loses value",
+ effect: function effect() {
+ var randomTerritory = territories[Math.floor(Math.random() * territories.length)];
+ randomTerritory.value = Math.max(1, randomTerritory.value - 1);
+ var message = "Natural disaster in " + (randomTerritory.owner ? randomTerritory.owner.country.name : "unclaimed territory");
+ return message;
+ }
+}, {
+ name: "Technological Breakthrough",
+ description: "Random nation gains power",
+ effect: function effect() {
+ var randomCountry = countryballs[Math.floor(Math.random() * countryballs.length)];
+ randomCountry.power += 5;
+ return randomCountry.country.name + " achieved a technological breakthrough!";
+ }
+}, {
+ name: "Peace Summit",
+ description: "Relations improve between nations",
+ effect: function effect() {
+ for (var i = 0; i < countryballs.length; i++) {
+ if (Math.random() < 0.3 && !countryballs[i].isAI) {
+ for (var j = 0; j < countryballs.length; j++) {
+ if (i !== j && countryballs[i].alliances.indexOf(countryballs[j]) === -1) {
+ countryballs[i].formAlliance(countryballs[j]);
+ return countryballs[i].country.name + " and " + countryballs[j].country.name + " formed an alliance at the Peace Summit!";
+ }
+ }
+ }
+ }
+ return "Peace Summit ended with minor agreements.";
+ }
+}];
// Initialize the game
game.init = function () {
// Play background music
LK.playMusic('battleMusic');
@@ -356,15 +564,80 @@
statsDisplay.update(selectedCountryball);
game.addChild(statsDisplay);
// Create buttons
attackButton = new ActionButton("ATTACK", "attack");
- attackButton.x = 2048 / 2 - 100;
+ attackButton.x = 2048 / 2 - 200;
attackButton.y = 2732 - 100;
game.addChild(attackButton);
allianceButton = new ActionButton("ALLIANCE", "alliance");
- allianceButton.x = 2048 / 2 + 100;
+ allianceButton.x = 2048 / 2;
allianceButton.y = 2732 - 100;
game.addChild(allianceButton);
+ // Add tech button
+ techButton = new ActionButton("TECH", "tech");
+ techButton.x = 2048 / 2 + 200;
+ techButton.y = 2732 - 100;
+ game.addChild(techButton);
+ // Create tech upgrades
+ var techList = [{
+ name: "Advanced Weaponry",
+ cost: 50,
+ effect: function effect(countryball) {
+ countryball.power += 10;
+ },
+ description: "Increases military power by 10"
+ }, {
+ name: "Economic Reforms",
+ cost: 40,
+ effect: function effect(countryball) {
+ countryball.resources += 20;
+ },
+ description: "Adds 20 resources immediately"
+ }, {
+ name: "Diplomacy",
+ cost: 35,
+ effect: function effect(countryball) {
+ // Form alliances with two random countries
+ var unalliedCountries = countryballs.filter(function (c) {
+ return c !== countryball && countryball.alliances.indexOf(c) === -1;
+ });
+ for (var i = 0; i < Math.min(2, unalliedCountries.length); i++) {
+ countryball.formAlliance(unalliedCountries[i]);
+ }
+ },
+ description: "Form alliances with 2 random countries"
+ }, {
+ name: "Espionage",
+ cost: 45,
+ effect: function effect(countryball) {
+ // Reduce power of all enemies
+ for (var i = 0; i < countryballs.length; i++) {
+ if (countryballs[i] !== countryball && countryball.alliances.indexOf(countryballs[i]) === -1) {
+ countryballs[i].power = Math.max(5, countryballs[i].power - 3);
+ }
+ }
+ },
+ description: "Reduces enemy power by 3"
+ }];
+ // Create tech upgrades but don't add them to the stage yet
+ for (var i = 0; i < techList.length; i++) {
+ var tech = new TechUpgrade(techList[i].name, techList[i].cost, techList[i].effect, techList[i].description);
+ tech.x = 2048 / 2;
+ tech.y = 800 + i * 150;
+ tech.visible = false;
+ techUpgrades.push(tech);
+ game.addChild(tech);
+ }
+ // Create event display
+ eventDisplay = new Text2("", {
+ size: 28,
+ fill: 0xFFFFFF
+ });
+ eventDisplay.anchor.set(0.5, 0);
+ eventDisplay.x = 2048 / 2;
+ eventDisplay.y = 100;
+ eventDisplay.alpha = 0;
+ LK.gui.addChild(eventDisplay);
// Initial score
game.updateScore();
};
game.handleCountryballSelect = function (countryball) {
@@ -409,11 +682,19 @@
}
}
};
game.handleActionButton = function (button) {
- if (!selectedCountryball || !targetCountryball) {
+ if (button.action === "tech") {
+ // Toggle tech menu visibility
+ techMenuOpen = !techMenuOpen;
+ for (var i = 0; i < techUpgrades.length; i++) {
+ techUpgrades[i].visible = techMenuOpen;
+ }
return;
}
+ if (!selectedCountryball || !targetCountryball && button.action !== "tech") {
+ return;
+ }
if (button.action === "attack") {
if (selectedCountryball.attack(targetCountryball)) {
// Successful attack
LK.getSound('attack').play();
@@ -431,15 +712,91 @@
}
statsDisplay.update(selectedCountryball);
game.updateScore();
} else if (button.action === "alliance") {
+ // Apply alliance special ability if it exists
+ var allianceMultiplier = 1;
+ if (selectedCountryball.country.specialAbility && typeof selectedCountryball.country.specialAbility.effect === 'function') {
+ allianceMultiplier = selectedCountryball.country.specialAbility.effect(selectedCountryball, targetCountryball, "alliance");
+ }
if (selectedCountryball.formAlliance(targetCountryball)) {
LK.getSound('alliance').play();
LK.effects.flashObject(targetCountryball, 0x00ff00, 500);
+ // Alliance bonus - both countries get a small power boost
+ var powerBoost = 2 * allianceMultiplier;
+ selectedCountryball.power += powerBoost;
+ targetCountryball.power += powerBoost;
statsDisplay.update(selectedCountryball);
}
}
};
+// Add tech upgrade handler
+game.purchaseTechUpgrade = function (techUpgrade) {
+ if (!selectedCountryball) {
+ return;
+ }
+ // Apply tech cost special ability if it exists
+ var techCostMultiplier = 1;
+ if (selectedCountryball.country.specialAbility && typeof selectedCountryball.country.specialAbility.effect === 'function') {
+ techCostMultiplier = selectedCountryball.country.specialAbility.effect(selectedCountryball, null, "tech");
+ }
+ var adjustedCost = Math.floor(techUpgrade.cost * techCostMultiplier);
+ // Check if player has enough resources and hasn't purchased it yet
+ if (selectedCountryball.resources >= adjustedCost && !techUpgrade.purchased) {
+ selectedCountryball.resources -= adjustedCost;
+ techUpgrade.purchased = true;
+ // Apply the upgrade effect
+ if (typeof techUpgrade.effect === 'function') {
+ techUpgrade.effect(selectedCountryball);
+ }
+ // Visual feedback
+ LK.effects.flashObject(techUpgrade, 0x00ff00, 500);
+ tween.to(techUpgrade, 0.3, {
+ alpha: 0.5
+ });
+ // Update stats
+ statsDisplay.update(selectedCountryball);
+ game.updateScore();
+ // Show event notification
+ game.showEventNotification(selectedCountryball.country.name + " acquired " + techUpgrade.name + " technology!");
+ } else if (techUpgrade.purchased) {
+ // Already purchased feedback
+ LK.effects.flashObject(techUpgrade, 0xff0000, 500);
+ } else {
+ // Not enough resources feedback
+ LK.effects.flashObject(techUpgrade, 0xffff00, 500);
+ }
+};
+// Add world events system
+game.triggerRandomEvent = function () {
+ // Only trigger events if some time has passed since the last one
+ if (LK.ticks - lastEventTime < 600) {
+ return;
+ }
+ // 5% chance each update to trigger an event
+ if (Math.random() < 0.05) {
+ var randomEvent = worldEvents[Math.floor(Math.random() * worldEvents.length)];
+ var message = randomEvent.effect();
+ game.showEventNotification(message);
+ lastEventTime = LK.ticks;
+ }
+};
+// Add notification display
+game.showEventNotification = function (message) {
+ eventDisplay.setText(message);
+ eventDisplay.alpha = 1;
+ tween.to(eventDisplay, 0.5, {
+ y: 120
+ });
+ tween.to(eventDisplay, 0.5, {
+ alpha: 0,
+ delay: 3
+ });
+ tween.to(eventDisplay, 0.5, {
+ y: 100,
+ delay: 3.5
+ });
+};
game.updateScore = function () {
var playerScore = 0;
// Calculate score based on power, resources, territories and alliances
var playerBall = countryballs[0]; // First countryball is the player
@@ -491,8 +848,22 @@
// Update stats display
if (selectedCountryball) {
statsDisplay.update(selectedCountryball);
}
+ // Trigger random world events
+ game.triggerRandomEvent();
+ // Apply territory special ability for China
+ if (selectedCountryball && selectedCountryball.country.name === "Chinaball" && selectedCountryball.territory) {
+ var territoryMultiplier = 1;
+ if (selectedCountryball.country.specialAbility && typeof selectedCountryball.country.specialAbility.effect === 'function') {
+ territoryMultiplier = selectedCountryball.country.specialAbility.effect(selectedCountryball, null, "territory");
+ }
+ // Apply the bonus every 10 seconds
+ if (LK.ticks % 600 === 0) {
+ selectedCountryball.power += selectedCountryball.territory.value * territoryMultiplier;
+ statsDisplay.update(selectedCountryball);
+ }
+ }
// Check if anyone has won the game
var remainingCountries = 0;
var mostPowerfulCountry = null;
for (var i = 0; i < countryballs.length; i++) {
@@ -507,5 +878,21 @@
// Update game state every 5 seconds
if (LK.ticks % 300 === 0) {
game.updateScore();
}
+ // Add visual effects to territories every 2 seconds
+ if (LK.ticks % 120 === 0) {
+ for (var i = 0; i < territories.length; i++) {
+ if (territories[i].owner) {
+ tween.to(territories[i], 0.3, {
+ scaleX: 1.1,
+ scaleY: 1.1
+ });
+ tween.to(territories[i], 0.3, {
+ scaleX: 1,
+ scaleY: 1,
+ delay: 0.3
+ });
+ }
+ }
+ }
};
\ No newline at end of file
Fullscreen modern App Store landscape banner, 16:9, high definition, for a game titled "Countryball Warfare" and with the description "A humorous strategic war game featuring Countryballs – the spherical national characters with unique abilities and traits. Command your nation, form alliances, conquer territories, and rise to global dominance through military tactics, resource management, and diplomatic maneuvering.". No text on banner!
Bola con contorno negro. In-Game asset. 2d. High contrast. No shadows
Un pedazo de tierra con árboles y formar de cuadrado y irregular