/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Country = Container.expand(function (name, x, y, power, neighbors) {
var self = Container.call(this);
self.countryName = name;
self.power = power;
self.neighbors = neighbors || [];
self.owner = 'neutral'; // 'player', 'enemy', 'neutral'
self.isSelected = false;
// Create visual representation
self.graphics = self.attachAsset('neutralCountry', {
anchorX: 0.5,
anchorY: 0.5
});
// Country name text
self.nameText = new Text2(name, {
size: 24,
fill: 0x000000
});
self.nameText.anchor.set(0.5, 0.5);
self.nameText.y = -15;
self.addChild(self.nameText);
// Power text
self.powerText = new Text2(power.toString(), {
size: 20,
fill: 0x000000
});
self.powerText.anchor.set(0.5, 0.5);
self.powerText.y = 15;
self.addChild(self.powerText);
self.x = x;
self.y = y;
self.updateVisual = function () {
var newAsset = 'neutralCountry';
if (self.owner === 'player') {
newAsset = 'playerCountry';
} else if (self.owner === 'enemy') {
newAsset = 'enemyCountry';
} else if (self.isSelected) {
newAsset = 'selectedCountry';
}
self.removeChild(self.graphics);
self.graphics = self.attachAsset(newAsset, {
anchorX: 0.5,
anchorY: 0.5
});
// Re-add texts on top
self.removeChild(self.nameText);
self.removeChild(self.powerText);
self.addChild(self.nameText);
self.addChild(self.powerText);
self.powerText.setText(self.power.toString());
};
self.down = function (x, y, obj) {
if (gameState === 'selection') {
selectCountry(self);
} else if (gameState === 'playing') {
// Direct attack by clicking on enemy/neutral countries
if (self.owner === 'neutral' || self.owner === 'enemy') {
performDirectAttack(self);
} else if (self.owner === 'player') {
// Select player country for visual feedback
selectCountryForBattle(self);
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x4682B4
});
/****
* Game Code
****/
// No changes needed as the country is already implemented
// with neighbors: Finland, Latvia, Russia
// Estonia already exists in the game with power 35 at position (1200, 800)
var mapBg = game.attachAsset('mapBackground', {
anchorX: 0.5,
anchorY: 0.5
});
mapBg.x = 1024;
mapBg.y = 1366;
var gameState = 'selection'; // 'selection', 'playing', 'gameOver'
var battleState = 'none'; // 'none', 'selecting_target'
var playerCountry = null;
var countries = [];
var playerPower = 0;
var conqueredCount = 0;
var totalCountries = 0;
var battleButton = null;
var selectedCountryForUI = null;
// European countries data (positioned to accurately match the map background)
var countryData = [{
name: 'Iceland',
x: 400,
y: 300,
power: 1,
neighbors: ['Norway']
}, {
name: 'Ireland',
x: 340,
y: 1250,
power: 30,
neighbors: ['UK']
}, {
name: 'UK',
x: 570,
y: 1300,
power: 65,
neighbors: ['France', 'Ireland']
}, {
name: 'Portugal',
x: 90,
y: 2100,
power: 35,
neighbors: ['Spain']
}, {
name: 'Spain',
x: 300,
y: 2150,
power: 55,
neighbors: ['France', 'Portugal']
}, {
name: 'France',
x: 600,
y: 1700,
power: 70,
neighbors: ['Germany', 'Spain', 'Italy', 'UK', 'Belgium', 'Switzerland', 'Luxembourg']
}, {
name: 'Belgium',
x: 750,
y: 1500,
power: 40,
neighbors: ['Netherlands', 'France', 'Luxembourg']
}, {
name: 'Luxembourg',
x: 800,
y: 1600,
power: 20,
neighbors: ['Belgium', 'France', 'Germany']
}, {
name: 'Netherlands',
x: 750,
y: 1400,
power: 45,
neighbors: ['Germany', 'Belgium']
}, {
name: 'Switzerland',
x: 780,
y: 1800,
power: 45,
neighbors: ['France', 'Germany', 'Austria', 'Italy']
}, {
name: 'Germany',
x: 875,
y: 1450,
power: 75,
neighbors: ['France', 'Poland', 'Austria', 'Netherlands', 'Denmark', 'Czech', 'Luxembourg']
}, {
name: 'Denmark',
x: 880,
y: 1200,
power: 40,
neighbors: ['Sweden', 'Norway', 'Germany']
}, {
name: 'Norway',
x: 850,
y: 850,
power: 45,
neighbors: ['Sweden', 'Denmark', 'Finland', 'Iceland']
}, {
name: 'Sweden',
x: 1050,
y: 950,
power: 50,
neighbors: ['Norway', 'Denmark', 'Finland']
}, {
name: 'Finland',
x: 1300,
y: 700,
power: 30,
neighbors: ['Sweden', 'Norway', 'Russia', 'Estonia']
}, {
name: 'Italy',
x: 950,
y: 2050,
power: 60,
neighbors: ['France', 'Austria', 'Greece', 'Switzerland']
}, {
name: 'Austria',
x: 1000,
y: 1750,
power: 45,
neighbors: ['Germany', 'Italy', 'Czech', 'Hungary', 'Switzerland', 'Slovakia']
}, {
name: 'Czech',
x: 1000,
y: 1600,
power: 40,
neighbors: ['Poland', 'Austria', 'Germany', 'Slovakia']
}, {
name: 'Slovakia',
x: 1150,
y: 1700,
power: 35,
neighbors: ['Czech', 'Austria', 'Hungary']
}, {
name: 'Hungary',
x: 1200,
y: 1800,
power: 40,
neighbors: ['Austria', 'Romania', 'Slovakia', 'Serbia']
}, {
name: 'Poland',
x: 1180,
y: 1450,
power: 50,
neighbors: ['Germany', 'Czech', 'Ukraine', 'Belarus', 'Lithuania']
}, {
name: 'Belarus',
x: 1475,
y: 1350,
power: 40,
neighbors: ['Poland', 'Ukraine', 'Russia']
}, {
name: 'Ukraine',
x: 1600,
y: 1600,
power: 55,
neighbors: ['Poland', 'Romania', 'Russia', 'Belarus']
}, {
name: 'Russia',
x: 1800,
y: 1000,
power: 90,
neighbors: ['Finland', 'Ukraine', 'Belarus', 'Estonia']
}, {
name: 'Romania',
x: 1425,
y: 1900,
power: 45,
neighbors: ['Ukraine', 'Turkiye', 'Hungary', 'Bulgaria', 'Serbia']
}, {
name: 'Bulgaria',
x: 1400,
y: 2100,
power: 25,
neighbors: ['Romania', 'Greece', 'Serbia', 'Turkiye']
}, {
name: 'Greece',
x: 1300,
y: 2350,
power: 40,
neighbors: ['Italy', 'Turkiye', 'Bulgaria']
}, {
name: 'Turkiye',
x: 1700,
y: 2250,
power: 65,
neighbors: ['Greece', 'Romania', 'Bulgaria', 'Free Syria']
}, {
name: 'Yugoslavia',
x: 1250,
y: 2000,
power: 50,
neighbors: ['Hungary', 'Romania', 'Bulgaria', 'Greece']
}, {
name: 'Estonia',
x: 1290,
y: 1000,
power: 35,
neighbors: ['Finland', 'Latvia', 'Russia']
}, {
name: 'Latvia',
x: 1300,
y: 1100,
power: 25,
neighbors: ['Estonia', 'Lithuania']
}, {
name: 'Lithuania',
x: 1250,
y: 1200,
power: 30,
neighbors: ['Latvia', 'Poland']
}, {
name: 'Free Syria',
x: 2000,
y: 2400,
power: 30,
neighbors: ['Turkiye']
}];
// Create countries
for (var i = 0; i < countryData.length; i++) {
var data = countryData[i];
var country = new Country(data.name, data.x, data.y, data.power, data.neighbors);
countries.push(country);
game.addChild(country);
}
totalCountries = countries.length;
// UI Elements
var instructionText = new Text2('Select your starting country', {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
var scoreText = new Text2('Power: 0 | Conquered: 0/' + totalCountries, {
size: 40,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
scoreText.y = 80;
LK.gui.top.addChild(scoreText);
// Battle button removed - normal attack by clicking implemented
// Battle button click handler removed - direct clicking implemented
function selectCountry(country) {
if (gameState !== 'selection') {
return;
}
// Deselect all countries
for (var i = 0; i < countries.length; i++) {
countries[i].isSelected = false;
countries[i].updateVisual();
}
// Select this country
country.isSelected = true;
country.owner = 'player';
country.updateVisual();
playerCountry = country;
playerPower = country.power;
conqueredCount = 1;
// Start the game
gameState = 'playing';
instructionText.setText('Conquer neighboring territories!');
updateScore();
// Battle button removed - no need to hide
// Make some countries enemy controlled
var enemyCount = Math.floor(totalCountries * 0.3);
var availableCountries = [];
for (var j = 0; j < countries.length; j++) {
if (countries[j] !== playerCountry) {
availableCountries.push(countries[j]);
}
}
for (var k = 0; k < enemyCount && k < availableCountries.length; k++) {
var randomIndex = Math.floor(Math.random() * availableCountries.length);
var enemyCountry = availableCountries[randomIndex];
enemyCountry.owner = 'enemy';
enemyCountry.updateVisual();
availableCountries.splice(randomIndex, 1);
}
}
function attemptConquest(targetCountry) {
if (gameState !== 'playing') {
return;
}
// Check if target is neighboring a player country
var canAttack = false;
for (var i = 0; i < countries.length; i++) {
var country = countries[i];
if (country.owner === 'player') {
for (var j = 0; j < country.neighbors.length; j++) {
if (country.neighbors[j] === targetCountry.countryName) {
canAttack = true;
break;
}
}
}
if (canAttack) {
break;
}
}
if (!canAttack) {
// Flash the target red to indicate invalid move
LK.effects.flashObject(targetCountry, 0xFF0000, 500);
return;
}
// Check if player has enough power to attack this country
if (playerPower < targetCountry.power) {
// Flash the target red to indicate insufficient power
LK.effects.flashObject(targetCountry, 0xFF0000, 500);
return;
}
// Calculate conquest success based on power differential
var attackPower = playerPower;
var defensePower = targetCountry.power;
var successChance = Math.min(0.9, Math.max(0.1, attackPower / (attackPower + defensePower)));
if (Math.random() < successChance) {
// Successful conquest
targetCountry.owner = 'player';
targetCountry.updateVisual();
playerPower += Math.floor(targetCountry.power * 0.3);
conqueredCount++;
LK.getSound('conquest').play();
LK.effects.flashObject(targetCountry, 0x00FF00, 1000);
// Check win condition
if (conqueredCount >= Math.ceil(totalCountries * 0.7)) {
LK.setScore(playerPower);
LK.showYouWin();
}
} else {
// Failed conquest
playerPower = Math.max(10, playerPower - Math.floor(targetCountry.power * 0.1));
LK.getSound('defeat').play();
LK.effects.flashObject(targetCountry, 0xFF0000, 1000);
// Check lose condition
if (playerPower < 20) {
LK.showGameOver();
}
}
updateScore();
}
function selectCountryForBattle(country) {
if (gameState !== 'playing' || country.owner !== 'player') {
return;
}
// Deselect all countries
for (var i = 0; i < countries.length; i++) {
countries[i].isSelected = false;
countries[i].updateVisual();
}
// Select this country and show battle button
country.isSelected = true;
country.updateVisual();
selectedCountryForUI = country;
// Battle button removed - direct clicking enabled
}
function performBattle(targetCountry) {
if (gameState !== 'playing' || !selectedCountryForUI) {
return;
}
// Check if target is neighboring the selected player country
var canAttack = false;
for (var j = 0; j < selectedCountryForUI.neighbors.length; j++) {
if (selectedCountryForUI.neighbors[j] === targetCountry.countryName) {
canAttack = true;
break;
}
}
if (!canAttack) {
// Flash the target red to indicate invalid move
LK.effects.flashObject(targetCountry, 0xFF0000, 500);
return;
}
// Battle logic - if player power is over 100, automatically win; otherwise normal battle
if (playerPower > 100) {
// Auto-win when power exceeds 100
targetCountry.owner = 'player';
targetCountry.updateVisual();
playerPower += Math.floor(targetCountry.power * 0.3);
conqueredCount++;
LK.getSound('conquest').play();
LK.effects.flashObject(targetCountry, 0x00FF00, 1000);
// Check win condition
if (conqueredCount >= Math.ceil(totalCountries * 0.7)) {
LK.setScore(playerPower);
LK.showYouWin();
}
} else if (playerPower >= targetCountry.power) {
// We win - take over the country
targetCountry.owner = 'player';
targetCountry.updateVisual();
playerPower += Math.floor(targetCountry.power * 0.3);
conqueredCount++;
LK.getSound('conquest').play();
LK.effects.flashObject(targetCountry, 0x00FF00, 1000);
// Check win condition
if (conqueredCount >= Math.ceil(totalCountries * 0.7)) {
LK.setScore(playerPower);
LK.showYouWin();
}
} else {
// We lose - reduce our power significantly
playerPower = Math.max(10, playerPower - Math.floor(targetCountry.power * 0.2));
LK.getSound('defeat').play();
LK.effects.flashObject(targetCountry, 0xFF0000, 1000);
// Check lose condition
if (playerPower < 20) {
LK.showGameOver();
}
}
updateScore();
}
function updateScore() {
scoreText.setText('Power: ' + playerPower + ' | Conquered: ' + conqueredCount + '/' + totalCountries);
}
// AI behavior for enemy expansion
var aiTimer = 0;
game.update = function () {
if (gameState === 'playing') {
aiTimer++;
// AI acts every 3 seconds
if (aiTimer >= 180) {
aiTimer = 0;
performAIAction();
}
}
};
function performDirectAttack(targetCountry) {
if (gameState !== 'playing') {
return;
}
// Check if target is neighboring any player country
var canAttack = false;
var attackingCountry = null;
for (var i = 0; i < countries.length; i++) {
var country = countries[i];
if (country.owner === 'player') {
for (var j = 0; j < country.neighbors.length; j++) {
if (country.neighbors[j] === targetCountry.countryName) {
canAttack = true;
attackingCountry = country;
break;
}
}
if (canAttack) {
break;
}
}
}
if (!canAttack) {
// Flash the target red to indicate invalid move
LK.effects.flashObject(targetCountry, 0xFF0000, 500);
return;
}
// Battle logic - if player power is over 100, automatically win; otherwise normal battle
if (playerPower > 100) {
// Auto-win when power exceeds 100
targetCountry.owner = 'player';
targetCountry.updateVisual();
playerPower += Math.floor(targetCountry.power * 0.3);
conqueredCount++;
LK.getSound('conquest').play();
LK.effects.flashObject(targetCountry, 0x00FF00, 1000);
// Check win condition
if (conqueredCount >= Math.ceil(totalCountries * 0.7)) {
LK.setScore(playerPower);
LK.showYouWin();
}
} else if (playerPower >= targetCountry.power) {
// We win - take over the country
targetCountry.owner = 'player';
targetCountry.updateVisual();
playerPower += Math.floor(targetCountry.power * 0.3);
conqueredCount++;
LK.getSound('conquest').play();
LK.effects.flashObject(targetCountry, 0x00FF00, 1000);
// Check win condition
if (conqueredCount >= Math.ceil(totalCountries * 0.7)) {
LK.setScore(playerPower);
LK.showYouWin();
}
} else {
// We lose - reduce our power significantly
playerPower = Math.max(10, playerPower - Math.floor(targetCountry.power * 0.2));
LK.getSound('defeat').play();
LK.effects.flashObject(targetCountry, 0xFF0000, 1000);
// Check lose condition
if (playerPower < 20) {
LK.showGameOver();
}
}
updateScore();
}
function performAIAction() {
// Find enemy countries that can expand
var enemyCountries = [];
var neutralTargets = [];
for (var i = 0; i < countries.length; i++) {
if (countries[i].owner === 'enemy') {
enemyCountries.push(countries[i]);
} else if (countries[i].owner === 'neutral') {
neutralTargets.push(countries[i]);
}
}
if (enemyCountries.length === 0 || neutralTargets.length === 0) {
return;
}
// Random enemy country attempts to conquer a neutral neighbor
var randomEnemy = enemyCountries[Math.floor(Math.random() * enemyCountries.length)];
var validTargets = [];
for (var j = 0; j < neutralTargets.length; j++) {
var target = neutralTargets[j];
for (var k = 0; k < randomEnemy.neighbors.length; k++) {
if (randomEnemy.neighbors[k] === target.countryName) {
validTargets.push(target);
break;
}
}
}
if (validTargets.length > 0) {
var target = validTargets[Math.floor(Math.random() * validTargets.length)];
var successChance = randomEnemy.power / (randomEnemy.power + target.power);
if (Math.random() < successChance) {
target.owner = 'enemy';
target.updateVisual();
LK.effects.flashObject(target, 0xFF6B6B, 800);
}
}
} /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Country = Container.expand(function (name, x, y, power, neighbors) {
var self = Container.call(this);
self.countryName = name;
self.power = power;
self.neighbors = neighbors || [];
self.owner = 'neutral'; // 'player', 'enemy', 'neutral'
self.isSelected = false;
// Create visual representation
self.graphics = self.attachAsset('neutralCountry', {
anchorX: 0.5,
anchorY: 0.5
});
// Country name text
self.nameText = new Text2(name, {
size: 24,
fill: 0x000000
});
self.nameText.anchor.set(0.5, 0.5);
self.nameText.y = -15;
self.addChild(self.nameText);
// Power text
self.powerText = new Text2(power.toString(), {
size: 20,
fill: 0x000000
});
self.powerText.anchor.set(0.5, 0.5);
self.powerText.y = 15;
self.addChild(self.powerText);
self.x = x;
self.y = y;
self.updateVisual = function () {
var newAsset = 'neutralCountry';
if (self.owner === 'player') {
newAsset = 'playerCountry';
} else if (self.owner === 'enemy') {
newAsset = 'enemyCountry';
} else if (self.isSelected) {
newAsset = 'selectedCountry';
}
self.removeChild(self.graphics);
self.graphics = self.attachAsset(newAsset, {
anchorX: 0.5,
anchorY: 0.5
});
// Re-add texts on top
self.removeChild(self.nameText);
self.removeChild(self.powerText);
self.addChild(self.nameText);
self.addChild(self.powerText);
self.powerText.setText(self.power.toString());
};
self.down = function (x, y, obj) {
if (gameState === 'selection') {
selectCountry(self);
} else if (gameState === 'playing') {
// Direct attack by clicking on enemy/neutral countries
if (self.owner === 'neutral' || self.owner === 'enemy') {
performDirectAttack(self);
} else if (self.owner === 'player') {
// Select player country for visual feedback
selectCountryForBattle(self);
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x4682B4
});
/****
* Game Code
****/
// No changes needed as the country is already implemented
// with neighbors: Finland, Latvia, Russia
// Estonia already exists in the game with power 35 at position (1200, 800)
var mapBg = game.attachAsset('mapBackground', {
anchorX: 0.5,
anchorY: 0.5
});
mapBg.x = 1024;
mapBg.y = 1366;
var gameState = 'selection'; // 'selection', 'playing', 'gameOver'
var battleState = 'none'; // 'none', 'selecting_target'
var playerCountry = null;
var countries = [];
var playerPower = 0;
var conqueredCount = 0;
var totalCountries = 0;
var battleButton = null;
var selectedCountryForUI = null;
// European countries data (positioned to accurately match the map background)
var countryData = [{
name: 'Iceland',
x: 400,
y: 300,
power: 1,
neighbors: ['Norway']
}, {
name: 'Ireland',
x: 340,
y: 1250,
power: 30,
neighbors: ['UK']
}, {
name: 'UK',
x: 570,
y: 1300,
power: 65,
neighbors: ['France', 'Ireland']
}, {
name: 'Portugal',
x: 90,
y: 2100,
power: 35,
neighbors: ['Spain']
}, {
name: 'Spain',
x: 300,
y: 2150,
power: 55,
neighbors: ['France', 'Portugal']
}, {
name: 'France',
x: 600,
y: 1700,
power: 70,
neighbors: ['Germany', 'Spain', 'Italy', 'UK', 'Belgium', 'Switzerland', 'Luxembourg']
}, {
name: 'Belgium',
x: 750,
y: 1500,
power: 40,
neighbors: ['Netherlands', 'France', 'Luxembourg']
}, {
name: 'Luxembourg',
x: 800,
y: 1600,
power: 20,
neighbors: ['Belgium', 'France', 'Germany']
}, {
name: 'Netherlands',
x: 750,
y: 1400,
power: 45,
neighbors: ['Germany', 'Belgium']
}, {
name: 'Switzerland',
x: 780,
y: 1800,
power: 45,
neighbors: ['France', 'Germany', 'Austria', 'Italy']
}, {
name: 'Germany',
x: 875,
y: 1450,
power: 75,
neighbors: ['France', 'Poland', 'Austria', 'Netherlands', 'Denmark', 'Czech', 'Luxembourg']
}, {
name: 'Denmark',
x: 880,
y: 1200,
power: 40,
neighbors: ['Sweden', 'Norway', 'Germany']
}, {
name: 'Norway',
x: 850,
y: 850,
power: 45,
neighbors: ['Sweden', 'Denmark', 'Finland', 'Iceland']
}, {
name: 'Sweden',
x: 1050,
y: 950,
power: 50,
neighbors: ['Norway', 'Denmark', 'Finland']
}, {
name: 'Finland',
x: 1300,
y: 700,
power: 30,
neighbors: ['Sweden', 'Norway', 'Russia', 'Estonia']
}, {
name: 'Italy',
x: 950,
y: 2050,
power: 60,
neighbors: ['France', 'Austria', 'Greece', 'Switzerland']
}, {
name: 'Austria',
x: 1000,
y: 1750,
power: 45,
neighbors: ['Germany', 'Italy', 'Czech', 'Hungary', 'Switzerland', 'Slovakia']
}, {
name: 'Czech',
x: 1000,
y: 1600,
power: 40,
neighbors: ['Poland', 'Austria', 'Germany', 'Slovakia']
}, {
name: 'Slovakia',
x: 1150,
y: 1700,
power: 35,
neighbors: ['Czech', 'Austria', 'Hungary']
}, {
name: 'Hungary',
x: 1200,
y: 1800,
power: 40,
neighbors: ['Austria', 'Romania', 'Slovakia', 'Serbia']
}, {
name: 'Poland',
x: 1180,
y: 1450,
power: 50,
neighbors: ['Germany', 'Czech', 'Ukraine', 'Belarus', 'Lithuania']
}, {
name: 'Belarus',
x: 1475,
y: 1350,
power: 40,
neighbors: ['Poland', 'Ukraine', 'Russia']
}, {
name: 'Ukraine',
x: 1600,
y: 1600,
power: 55,
neighbors: ['Poland', 'Romania', 'Russia', 'Belarus']
}, {
name: 'Russia',
x: 1800,
y: 1000,
power: 90,
neighbors: ['Finland', 'Ukraine', 'Belarus', 'Estonia']
}, {
name: 'Romania',
x: 1425,
y: 1900,
power: 45,
neighbors: ['Ukraine', 'Turkiye', 'Hungary', 'Bulgaria', 'Serbia']
}, {
name: 'Bulgaria',
x: 1400,
y: 2100,
power: 25,
neighbors: ['Romania', 'Greece', 'Serbia', 'Turkiye']
}, {
name: 'Greece',
x: 1300,
y: 2350,
power: 40,
neighbors: ['Italy', 'Turkiye', 'Bulgaria']
}, {
name: 'Turkiye',
x: 1700,
y: 2250,
power: 65,
neighbors: ['Greece', 'Romania', 'Bulgaria', 'Free Syria']
}, {
name: 'Yugoslavia',
x: 1250,
y: 2000,
power: 50,
neighbors: ['Hungary', 'Romania', 'Bulgaria', 'Greece']
}, {
name: 'Estonia',
x: 1290,
y: 1000,
power: 35,
neighbors: ['Finland', 'Latvia', 'Russia']
}, {
name: 'Latvia',
x: 1300,
y: 1100,
power: 25,
neighbors: ['Estonia', 'Lithuania']
}, {
name: 'Lithuania',
x: 1250,
y: 1200,
power: 30,
neighbors: ['Latvia', 'Poland']
}, {
name: 'Free Syria',
x: 2000,
y: 2400,
power: 30,
neighbors: ['Turkiye']
}];
// Create countries
for (var i = 0; i < countryData.length; i++) {
var data = countryData[i];
var country = new Country(data.name, data.x, data.y, data.power, data.neighbors);
countries.push(country);
game.addChild(country);
}
totalCountries = countries.length;
// UI Elements
var instructionText = new Text2('Select your starting country', {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
var scoreText = new Text2('Power: 0 | Conquered: 0/' + totalCountries, {
size: 40,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
scoreText.y = 80;
LK.gui.top.addChild(scoreText);
// Battle button removed - normal attack by clicking implemented
// Battle button click handler removed - direct clicking implemented
function selectCountry(country) {
if (gameState !== 'selection') {
return;
}
// Deselect all countries
for (var i = 0; i < countries.length; i++) {
countries[i].isSelected = false;
countries[i].updateVisual();
}
// Select this country
country.isSelected = true;
country.owner = 'player';
country.updateVisual();
playerCountry = country;
playerPower = country.power;
conqueredCount = 1;
// Start the game
gameState = 'playing';
instructionText.setText('Conquer neighboring territories!');
updateScore();
// Battle button removed - no need to hide
// Make some countries enemy controlled
var enemyCount = Math.floor(totalCountries * 0.3);
var availableCountries = [];
for (var j = 0; j < countries.length; j++) {
if (countries[j] !== playerCountry) {
availableCountries.push(countries[j]);
}
}
for (var k = 0; k < enemyCount && k < availableCountries.length; k++) {
var randomIndex = Math.floor(Math.random() * availableCountries.length);
var enemyCountry = availableCountries[randomIndex];
enemyCountry.owner = 'enemy';
enemyCountry.updateVisual();
availableCountries.splice(randomIndex, 1);
}
}
function attemptConquest(targetCountry) {
if (gameState !== 'playing') {
return;
}
// Check if target is neighboring a player country
var canAttack = false;
for (var i = 0; i < countries.length; i++) {
var country = countries[i];
if (country.owner === 'player') {
for (var j = 0; j < country.neighbors.length; j++) {
if (country.neighbors[j] === targetCountry.countryName) {
canAttack = true;
break;
}
}
}
if (canAttack) {
break;
}
}
if (!canAttack) {
// Flash the target red to indicate invalid move
LK.effects.flashObject(targetCountry, 0xFF0000, 500);
return;
}
// Check if player has enough power to attack this country
if (playerPower < targetCountry.power) {
// Flash the target red to indicate insufficient power
LK.effects.flashObject(targetCountry, 0xFF0000, 500);
return;
}
// Calculate conquest success based on power differential
var attackPower = playerPower;
var defensePower = targetCountry.power;
var successChance = Math.min(0.9, Math.max(0.1, attackPower / (attackPower + defensePower)));
if (Math.random() < successChance) {
// Successful conquest
targetCountry.owner = 'player';
targetCountry.updateVisual();
playerPower += Math.floor(targetCountry.power * 0.3);
conqueredCount++;
LK.getSound('conquest').play();
LK.effects.flashObject(targetCountry, 0x00FF00, 1000);
// Check win condition
if (conqueredCount >= Math.ceil(totalCountries * 0.7)) {
LK.setScore(playerPower);
LK.showYouWin();
}
} else {
// Failed conquest
playerPower = Math.max(10, playerPower - Math.floor(targetCountry.power * 0.1));
LK.getSound('defeat').play();
LK.effects.flashObject(targetCountry, 0xFF0000, 1000);
// Check lose condition
if (playerPower < 20) {
LK.showGameOver();
}
}
updateScore();
}
function selectCountryForBattle(country) {
if (gameState !== 'playing' || country.owner !== 'player') {
return;
}
// Deselect all countries
for (var i = 0; i < countries.length; i++) {
countries[i].isSelected = false;
countries[i].updateVisual();
}
// Select this country and show battle button
country.isSelected = true;
country.updateVisual();
selectedCountryForUI = country;
// Battle button removed - direct clicking enabled
}
function performBattle(targetCountry) {
if (gameState !== 'playing' || !selectedCountryForUI) {
return;
}
// Check if target is neighboring the selected player country
var canAttack = false;
for (var j = 0; j < selectedCountryForUI.neighbors.length; j++) {
if (selectedCountryForUI.neighbors[j] === targetCountry.countryName) {
canAttack = true;
break;
}
}
if (!canAttack) {
// Flash the target red to indicate invalid move
LK.effects.flashObject(targetCountry, 0xFF0000, 500);
return;
}
// Battle logic - if player power is over 100, automatically win; otherwise normal battle
if (playerPower > 100) {
// Auto-win when power exceeds 100
targetCountry.owner = 'player';
targetCountry.updateVisual();
playerPower += Math.floor(targetCountry.power * 0.3);
conqueredCount++;
LK.getSound('conquest').play();
LK.effects.flashObject(targetCountry, 0x00FF00, 1000);
// Check win condition
if (conqueredCount >= Math.ceil(totalCountries * 0.7)) {
LK.setScore(playerPower);
LK.showYouWin();
}
} else if (playerPower >= targetCountry.power) {
// We win - take over the country
targetCountry.owner = 'player';
targetCountry.updateVisual();
playerPower += Math.floor(targetCountry.power * 0.3);
conqueredCount++;
LK.getSound('conquest').play();
LK.effects.flashObject(targetCountry, 0x00FF00, 1000);
// Check win condition
if (conqueredCount >= Math.ceil(totalCountries * 0.7)) {
LK.setScore(playerPower);
LK.showYouWin();
}
} else {
// We lose - reduce our power significantly
playerPower = Math.max(10, playerPower - Math.floor(targetCountry.power * 0.2));
LK.getSound('defeat').play();
LK.effects.flashObject(targetCountry, 0xFF0000, 1000);
// Check lose condition
if (playerPower < 20) {
LK.showGameOver();
}
}
updateScore();
}
function updateScore() {
scoreText.setText('Power: ' + playerPower + ' | Conquered: ' + conqueredCount + '/' + totalCountries);
}
// AI behavior for enemy expansion
var aiTimer = 0;
game.update = function () {
if (gameState === 'playing') {
aiTimer++;
// AI acts every 3 seconds
if (aiTimer >= 180) {
aiTimer = 0;
performAIAction();
}
}
};
function performDirectAttack(targetCountry) {
if (gameState !== 'playing') {
return;
}
// Check if target is neighboring any player country
var canAttack = false;
var attackingCountry = null;
for (var i = 0; i < countries.length; i++) {
var country = countries[i];
if (country.owner === 'player') {
for (var j = 0; j < country.neighbors.length; j++) {
if (country.neighbors[j] === targetCountry.countryName) {
canAttack = true;
attackingCountry = country;
break;
}
}
if (canAttack) {
break;
}
}
}
if (!canAttack) {
// Flash the target red to indicate invalid move
LK.effects.flashObject(targetCountry, 0xFF0000, 500);
return;
}
// Battle logic - if player power is over 100, automatically win; otherwise normal battle
if (playerPower > 100) {
// Auto-win when power exceeds 100
targetCountry.owner = 'player';
targetCountry.updateVisual();
playerPower += Math.floor(targetCountry.power * 0.3);
conqueredCount++;
LK.getSound('conquest').play();
LK.effects.flashObject(targetCountry, 0x00FF00, 1000);
// Check win condition
if (conqueredCount >= Math.ceil(totalCountries * 0.7)) {
LK.setScore(playerPower);
LK.showYouWin();
}
} else if (playerPower >= targetCountry.power) {
// We win - take over the country
targetCountry.owner = 'player';
targetCountry.updateVisual();
playerPower += Math.floor(targetCountry.power * 0.3);
conqueredCount++;
LK.getSound('conquest').play();
LK.effects.flashObject(targetCountry, 0x00FF00, 1000);
// Check win condition
if (conqueredCount >= Math.ceil(totalCountries * 0.7)) {
LK.setScore(playerPower);
LK.showYouWin();
}
} else {
// We lose - reduce our power significantly
playerPower = Math.max(10, playerPower - Math.floor(targetCountry.power * 0.2));
LK.getSound('defeat').play();
LK.effects.flashObject(targetCountry, 0xFF0000, 1000);
// Check lose condition
if (playerPower < 20) {
LK.showGameOver();
}
}
updateScore();
}
function performAIAction() {
// Find enemy countries that can expand
var enemyCountries = [];
var neutralTargets = [];
for (var i = 0; i < countries.length; i++) {
if (countries[i].owner === 'enemy') {
enemyCountries.push(countries[i]);
} else if (countries[i].owner === 'neutral') {
neutralTargets.push(countries[i]);
}
}
if (enemyCountries.length === 0 || neutralTargets.length === 0) {
return;
}
// Random enemy country attempts to conquer a neutral neighbor
var randomEnemy = enemyCountries[Math.floor(Math.random() * enemyCountries.length)];
var validTargets = [];
for (var j = 0; j < neutralTargets.length; j++) {
var target = neutralTargets[j];
for (var k = 0; k < randomEnemy.neighbors.length; k++) {
if (randomEnemy.neighbors[k] === target.countryName) {
validTargets.push(target);
break;
}
}
}
if (validTargets.length > 0) {
var target = validTargets[Math.floor(Math.random() * validTargets.length)];
var successChance = randomEnemy.power / (randomEnemy.power + target.power);
if (Math.random() < successChance) {
target.owner = 'enemy';
target.updateVisual();
LK.effects.flashObject(target, 0xFF6B6B, 800);
}
}
}