User prompt
1- kolonize edilebilir bölgeler ekle fakat haritaya bağlı bir şekilde 2- gemiye tıklanınca çıkan colonize distant islands yazısını sil.
User prompt
gemilerin gidebileceği mümkün yerleri gemiye tıklanınca belirmesini sağla
User prompt
1-gemilerin gidebileceği sınırlı yerleri belirt 2- 2 deniz arasındaki bağlantıyı sağla
User prompt
gemilerin bir turda gidebileceği alanı kısıtla
User prompt
add more army types to the game
User prompt
Update army type icon when recruiting
User prompt
delete colonizable lands
User prompt
the colonizable states should be together with the land states
User prompt
Ensure that the ships are able to land on the mainland.
User prompt
Fix the ships being under the water estate asset.
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'setText')' in or related to this line: 'turnText.setText("Your Turn");' Line Number: 1022
User prompt
ensure that everyone starts the game on the ship
User prompt
Ensure that the water states do not overlap.
User prompt
make the surrounding of the colonizable states a sea state
User prompt
1- Make places without states into seas 2- fix colonization by ship
User prompt
use a different asset for colonizable lands
User prompt
make the color of the colonizable lands gray
User prompt
make the colonizable territories neutral
User prompt
Add colonizable territories far away from the main map. Colonization is only possible with ships.
User prompt
Let's be able to choose how much we can exert the soldier and ship power in one turn.
User prompt
make the feature of naval battles
User prompt
give the ai the ability to build ships and an army
User prompt
add sea territories and ships
User prompt
Let's be able to choose which border state we can attack through the state.
User prompt
If we declare war on ai, ensure that it can attack us.
/****
* Classes
****/
var ActionButton = Container.expand(function () {
var self = Container.call(this);
self.init = function (text, action, x, y) {
self.action = action;
// Button graphics
self.buttonGraphics = self.attachAsset('actionButton', {
anchorX: 0.5,
anchorY: 0.5
});
// Button text
self.buttonText = new Text2(text, {
size: 28,
fill: 0xFFFFFF
});
self.buttonText.anchor.set(0.5, 0.5);
self.addChild(self.buttonText);
self.x = x;
self.y = y;
return self;
};
self.down = function (x, y, obj) {
if (self.action) {
self.action();
}
};
return self;
});
var DiplomacyPanel = Container.expand(function () {
var self = Container.call(this);
self.init = function (targetCountry) {
self.targetCountry = targetCountry;
self.visible = false;
// Panel background
self.panelBg = LK.getAsset('actionButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 3,
scaleY: 4
});
self.panelBg.tint = 0x2c3e50;
self.addChild(self.panelBg);
// Panel title
self.titleText = new Text2("Diplomacy with Country " + targetCountry, {
size: 32,
fill: 0xFFFFFF
});
self.titleText.anchor.set(0.5, 0.5);
self.titleText.y = -80;
self.addChild(self.titleText);
// Declare war button
self.warButton = new ActionButton();
self.warButton.init("Declare War", function () {
declareWar(targetCountry);
self.hide();
}, 0, 0);
self.addChild(self.warButton);
// Close button
self.closeButton = new ActionButton();
self.closeButton.init("Close", function () {
self.hide();
}, 0, 60);
self.addChild(self.closeButton);
// Position panel in center of screen
self.x = 2048 / 2;
self.y = 2732 / 2;
return self;
};
self.show = function () {
self.visible = true;
game.addChild(self);
};
self.hide = function () {
self.visible = false;
if (self.parent) {
self.parent.removeChild(self);
}
};
return self;
});
// Game state variables
var Territory = Container.expand(function () {
var self = Container.call(this);
self.init = function (id, x, y, owner) {
self.id = id;
self.owner = owner; // 0 = neutral, 1 = player, 2 = enemy
self.armies = owner === 0 ? 0 : Math.floor(Math.random() * 3) + 1;
self.selected = false;
self.lastSelected = false;
// Create territory graphics
self.updateGraphics();
// Position
self.x = x;
self.y = y;
// Army display
self.armyText = new Text2(self.armies.toString(), {
size: 24,
fill: 0x000000
});
self.armyText.anchor.set(0.5, 0.5);
self.armyText.x = 0;
self.armyText.y = 0;
self.addChild(self.armyText);
return self;
};
self.updateGraphics = function () {
// Remove existing graphics
if (self.graphics) {
self.removeChild(self.graphics);
}
var assetName = 'country1Territory';
if (self.selected) {
assetName = 'selectedTerritory';
} else if (self.showAsTarget) {
assetName = 'targetTerritory';
} else {
// Assign different country colors based on owner
if (self.owner === 1) {
assetName = 'country1Territory'; // Green for player
} else if (self.owner === 2) {
assetName = 'country2Territory'; // Red for enemy
} else if (self.owner === 3) {
assetName = 'country3Territory'; // Blue
} else if (self.owner === 4) {
assetName = 'country4Territory'; // Purple
} else if (self.owner === 5) {
assetName = 'country5Territory'; // Orange
} else if (self.owner === 6) {
assetName = 'country6Territory'; // Cyan
} else {
assetName = 'country1Territory'; // Default fallback
}
}
self.graphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
};
self.setOwner = function (newOwner, armies) {
self.owner = newOwner;
self.armies = armies || 1;
self.updateGraphics();
self.armyText.setText(self.armies.toString());
};
self.addArmies = function (count) {
self.armies += count;
self.armyText.setText(self.armies.toString());
};
self.down = function (x, y, obj) {
if (gameState === 'playing') {
selectTerritory(self);
} else if (gameState === 'selectingTarget' && self.showAsTarget) {
executeAttack(self);
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2c3e50
});
/****
* Game Code
****/
// Territory and game assets
// Game state variables
var gameState = 'playing'; // 'playing', 'gameOver', 'victory', 'selectingTarget'
var attackTargets = []; // Available targets for attack
var currentTurn = 1; // 1 = player, 2 = enemy
var selectedTerritory = null;
var territories = [];
var playerTerritories = 0;
var enemyTerritories = 0;
var totalTerritories = 0;
var playerMoney = 100; // Starting money
var incomePerTerritory = 10; // Money generated per territory per turn
// Diplomacy variables
var warDeclarations = {}; // Track which countries we're at war with
var diplomacyPanel = null;
// UI elements
var turnText, scoreText, instructionText, playerArmyText, playerMoneyText;
var actionButtons = [];
// Game settings
var mapWidth = 8;
var mapHeight = 12;
var territorySpacing = 140;
var startX = 2048 / 2 - mapWidth * territorySpacing / 2 + territorySpacing / 2;
var startY = 300;
// Create the game map
function createMap() {
var id = 0;
// Create contiguous regions for each country
// Divide the map into regions for 6 countries
for (var row = 0; row < mapHeight; row++) {
for (var col = 0; col < mapWidth; col++) {
var x = startX + col * territorySpacing;
var y = startY + row * territorySpacing;
// Determine owner based on map regions to create contiguous countries
var owner = 1; // default
if (row < mapHeight / 3) {
// Top third - countries 1 and 2
if (col < mapWidth / 2) {
owner = 1; // Country 1 (Green) - top left
} else {
owner = 2; // Country 2 (Red) - top right
}
} else if (row < mapHeight * 2 / 3) {
// Middle third - countries 3 and 4
if (col < mapWidth / 2) {
owner = 3; // Country 3 (Blue) - middle left
} else {
owner = 4; // Country 4 (Purple) - middle right
}
} else {
// Bottom third - countries 5 and 6
if (col < mapWidth / 2) {
owner = 5; // Country 5 (Orange) - bottom left
} else {
owner = 6; // Country 6 (Cyan) - bottom right
}
}
var territory = new Territory();
territory.init(id, x, y, owner);
territories.push(territory);
game.addChild(territory);
id++;
}
}
updateTerritoryCount();
}
// Generate income based on territories owned
function generateIncome() {
var income = playerTerritories * incomePerTerritory;
playerMoney += income;
if (playerMoneyText) {
playerMoneyText.setText("Money: " + playerMoney + " (+$" + income + ")");
}
}
// Update territory ownership counts
function updateTerritoryCount() {
playerTerritories = 0;
enemyTerritories = 0;
var playerTotalArmies = 0;
var country1Count = 0,
country2Count = 0,
country3Count = 0;
var country4Count = 0,
country5Count = 0,
country6Count = 0;
totalTerritories = territories.length;
for (var i = 0; i < territories.length; i++) {
if (territories[i].owner === 1) {
playerTerritories++;
country1Count++;
playerTotalArmies += territories[i].armies;
} else if (territories[i].owner === 2) {
enemyTerritories++;
country2Count++;
} else if (territories[i].owner === 3) {
country3Count++;
} else if (territories[i].owner === 4) {
country4Count++;
} else if (territories[i].owner === 5) {
country5Count++;
} else if (territories[i].owner === 6) {
country6Count++;
}
}
// Update score display
if (scoreText) {
scoreText.setText("Countries - Green: " + country1Count + " | Red: " + country2Count + " | Blue: " + country3Count + " | Purple: " + country4Count + " | Orange: " + country5Count + " | Cyan: " + country6Count);
}
// Update player army display
if (playerArmyText) {
playerArmyText.setText("Total Armies: " + playerTotalArmies);
}
// Update money display
if (playerMoneyText) {
playerMoneyText.setText("Money: " + playerMoney);
}
// Check victory conditions
if (playerTerritories >= Math.floor(totalTerritories * 0.75)) {
gameState = 'victory';
LK.showYouWin();
} else if (enemyTerritories >= Math.floor(totalTerritories * 0.75)) {
gameState = 'gameOver';
LK.showGameOver();
}
}
// Declare war function
function declareWar(countryId) {
warDeclarations[countryId] = true;
if (instructionText) {
instructionText.setText("War declared on Country " + countryId + "! You can now attack their territories.");
}
}
// Territory selection
function selectTerritory(territory) {
if (currentTurn !== 1) return; // Only during player turn
// If we're in target selection mode, cancel it
if (gameState === 'selectingTarget') {
// Clear target highlighting
for (var i = 0; i < attackTargets.length; i++) {
attackTargets[i].showAsTarget = false;
attackTargets[i].updateGraphics();
}
gameState = 'playing';
attackTargets = [];
}
// Deselect previous territory
if (selectedTerritory) {
selectedTerritory.selected = false;
selectedTerritory.updateGraphics();
// Ensure previous territory's army text remains visible
selectedTerritory.armyText.setText(selectedTerritory.armies.toString());
// Re-add army text to ensure it's visible
selectedTerritory.removeChild(selectedTerritory.armyText);
selectedTerritory.addChild(selectedTerritory.armyText);
}
// Handle enemy territory clicks - show diplomacy panel
if (territory.owner !== 1 && territory.owner !== 0) {
// Create diplomacy panel if it doesn't exist
if (!diplomacyPanel) {
diplomacyPanel = new DiplomacyPanel();
diplomacyPanel.init(territory.owner);
} else {
// Update existing panel for new country
diplomacyPanel.targetCountry = territory.owner;
diplomacyPanel.titleText.setText("Diplomacy with Country " + territory.owner);
}
diplomacyPanel.show();
return;
}
// Select new territory
if (territory.owner === 1) {
// Only select player territories
selectedTerritory = territory;
territory.selected = true;
territory.updateGraphics();
// Ensure army text is visible and updated
territory.armyText.setText(territory.armies.toString());
// Bring army text to front to ensure it's visible
territory.removeChild(territory.armyText);
territory.addChild(territory.armyText);
updateInstructions();
}
}
// Get neighboring territories
function getNeighbors(territory) {
var neighbors = [];
var index = territories.indexOf(territory);
var row = Math.floor(index / mapWidth);
var col = index % mapWidth;
// Check all 4 directions
var directions = [{
row: -1,
col: 0
},
// up
{
row: 1,
col: 0
},
// down
{
row: 0,
col: -1
},
// left
{
row: 0,
col: 1
} // right
];
for (var i = 0; i < directions.length; i++) {
var newRow = row + directions[i].row;
var newCol = col + directions[i].col;
if (newRow >= 0 && newRow < mapHeight && newCol >= 0 && newCol < mapWidth) {
var neighborIndex = newRow * mapWidth + newCol;
neighbors.push(territories[neighborIndex]);
}
}
return neighbors;
}
// Attack action
function attackTerritory() {
if (!selectedTerritory || selectedTerritory.armies <= 1) return;
var neighbors = getNeighbors(selectedTerritory);
var targets = [];
for (var i = 0; i < neighbors.length; i++) {
if (neighbors[i].owner !== 1) {
// Check if we can attack this country (either neutral or at war)
if (neighbors[i].owner === 0 || warDeclarations[neighbors[i].owner]) {
targets.push(neighbors[i]);
}
}
}
if (targets.length > 0) {
// Show target selection mode
gameState = 'selectingTarget';
attackTargets = targets;
// Highlight all possible targets
for (var i = 0; i < targets.length; i++) {
targets[i].showAsTarget = true;
targets[i].updateGraphics();
}
if (instructionText) {
instructionText.setText("Select a territory to attack");
}
}
}
// Execute attack on selected target
function executeAttack(target) {
if (!selectedTerritory || !target) return;
// Clear target highlighting
for (var i = 0; i < attackTargets.length; i++) {
attackTargets[i].showAsTarget = false;
attackTargets[i].updateGraphics();
}
// Simple combat resolution
var attackPower = selectedTerritory.armies - 1;
var defensePower = target.armies;
if (attackPower > defensePower) {
// Victory
target.setOwner(1, attackPower - defensePower);
selectedTerritory.armies = 1;
selectedTerritory.armyText.setText(selectedTerritory.armies.toString());
LK.getSound('capture').play();
} else {
// Defeat
selectedTerritory.armies = 1;
selectedTerritory.armyText.setText(selectedTerritory.armies.toString());
if (defensePower > attackPower) {
target.armies = defensePower - attackPower;
target.armyText.setText(target.armies.toString());
}
}
LK.getSound('attack').play();
updateTerritoryCount();
// Reset game state
gameState = 'playing';
attackTargets = [];
endPlayerTurn();
}
// Recruit armies action
function recruitArmies() {
if (!selectedTerritory) return;
var recruitCost = 50; // Cost to recruit armies
if (playerMoney >= recruitCost) {
playerMoney -= recruitCost;
selectedTerritory.addArmies(2);
if (playerMoneyText) {
playerMoneyText.setText("Money: " + playerMoney);
}
endPlayerTurn();
} else {
// Not enough money - show feedback but don't end turn
if (instructionText) {
instructionText.setText("Not enough money! Need $" + recruitCost + " to recruit");
}
}
}
// End player turn
function endPlayerTurn() {
if (selectedTerritory) {
selectedTerritory.selected = false;
selectedTerritory.updateGraphics();
selectedTerritory = null;
}
// Generate income based on territories owned
generateIncome();
currentTurn = 2;
updateInstructions();
// AI turn after short delay
LK.setTimeout(function () {
aiTurn();
}, 1000);
}
// Simple AI turn
function aiTurn() {
var enemyTerrs = [];
for (var i = 0; i < territories.length; i++) {
if (territories[i].owner === 2) {
enemyTerrs.push(territories[i]);
}
}
if (enemyTerrs.length > 0) {
var aiTerritory = enemyTerrs[Math.floor(Math.random() * enemyTerrs.length)];
var neighbors = getNeighbors(aiTerritory);
var playerTargets = [];
for (var j = 0; j < neighbors.length; j++) {
// AI can attack player territories if war is declared on AI (country 2)
if (neighbors[j].owner === 1 && warDeclarations[2]) {
playerTargets.push(neighbors[j]);
}
}
if (playerTargets.length > 0 && aiTerritory.armies > 1) {
// AI attacks
var target = playerTargets[Math.floor(Math.random() * playerTargets.length)];
var attackPower = aiTerritory.armies - 1;
var defensePower = target.armies;
if (attackPower > defensePower) {
target.setOwner(2, attackPower - defensePower);
aiTerritory.armies = 1;
aiTerritory.armyText.setText(aiTerritory.armies.toString());
} else {
aiTerritory.armies = 1;
aiTerritory.armyText.setText(aiTerritory.armies.toString());
if (defensePower > attackPower) {
target.armies = defensePower - attackPower;
target.armyText.setText(target.armies.toString());
}
}
} else {
// AI recruits
aiTerritory.addArmies(1);
}
}
updateTerritoryCount();
currentTurn = 1;
updateInstructions();
}
// Create UI elements
function createUI() {
// Turn indicator
turnText = new Text2("Your Turn", {
size: 40,
fill: 0xFFFFFF
});
turnText.anchor.set(0.5, 0);
LK.gui.top.addChild(turnText);
turnText.y = 100;
// Score display
scoreText = new Text2("Player: 0 | Enemy: 0", {
size: 32,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
scoreText.y = 150;
// Player army count display
playerArmyText = new Text2("Total Armies: 0", {
size: 32,
fill: 0x7ed321
});
playerArmyText.anchor.set(0.5, 0);
LK.gui.top.addChild(playerArmyText);
playerArmyText.y = 190;
// Player money display
playerMoneyText = new Text2("Money: " + playerMoney, {
size: 32,
fill: 0xf5a623
});
playerMoneyText.anchor.set(0.5, 0);
LK.gui.top.addChild(playerMoneyText);
playerMoneyText.y = 230;
// Instructions
instructionText = new Text2("Select your territory, then choose an action", {
size: 28,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(instructionText);
instructionText.y = -200;
// Action buttons
var attackBtn = new ActionButton();
attackBtn.init("Attack", attackTerritory, 2048 / 2 - 100, 2732 - 120);
actionButtons.push(attackBtn);
game.addChild(attackBtn);
var recruitBtn = new ActionButton();
recruitBtn.init("Recruit", recruitArmies, 2048 / 2 + 100, 2732 - 120);
actionButtons.push(recruitBtn);
game.addChild(recruitBtn);
}
// Update instruction text
function updateInstructions() {
if (currentTurn === 1) {
turnText.setText("Your Turn");
if (selectedTerritory) {
instructionText.setText("Territory selected - Attack or Recruit ($50)");
} else {
instructionText.setText("Select your territory (green), then choose an action");
}
} else {
turnText.setText("Enemy Turn");
instructionText.setText("Enemy is thinking...");
}
}
// Initialize the game
createMap();
createUI();
updateInstructions(); ===================================================================
--- original.js
+++ change.js
@@ -112,8 +112,10 @@
}
var assetName = 'country1Territory';
if (self.selected) {
assetName = 'selectedTerritory';
+ } else if (self.showAsTarget) {
+ assetName = 'targetTerritory';
} else {
// Assign different country colors based on owner
if (self.owner === 1) {
assetName = 'country1Territory'; // Green for player
@@ -148,8 +150,10 @@
};
self.down = function (x, y, obj) {
if (gameState === 'playing') {
selectTerritory(self);
+ } else if (gameState === 'selectingTarget' && self.showAsTarget) {
+ executeAttack(self);
}
};
return self;
});
@@ -165,9 +169,10 @@
* Game Code
****/
// Territory and game assets
// Game state variables
-var gameState = 'playing'; // 'playing', 'gameOver', 'victory'
+var gameState = 'playing'; // 'playing', 'gameOver', 'victory', 'selectingTarget'
+var attackTargets = []; // Available targets for attack
var currentTurn = 1; // 1 = player, 2 = enemy
var selectedTerritory = null;
var territories = [];
var playerTerritories = 0;
@@ -297,8 +302,18 @@
}
// Territory selection
function selectTerritory(territory) {
if (currentTurn !== 1) return; // Only during player turn
+ // If we're in target selection mode, cancel it
+ if (gameState === 'selectingTarget') {
+ // Clear target highlighting
+ for (var i = 0; i < attackTargets.length; i++) {
+ attackTargets[i].showAsTarget = false;
+ attackTargets[i].updateGraphics();
+ }
+ gameState = 'playing';
+ attackTargets = [];
+ }
// Deselect previous territory
if (selectedTerritory) {
selectedTerritory.selected = false;
selectedTerritory.updateGraphics();
@@ -386,32 +401,54 @@
}
}
}
if (targets.length > 0) {
- var target = targets[Math.floor(Math.random() * targets.length)];
- // Simple combat resolution
- var attackPower = selectedTerritory.armies - 1;
- var defensePower = target.armies;
- if (attackPower > defensePower) {
- // Victory
- target.setOwner(1, attackPower - defensePower);
- selectedTerritory.armies = 1;
- selectedTerritory.armyText.setText(selectedTerritory.armies.toString());
- LK.getSound('capture').play();
- } else {
- // Defeat
- selectedTerritory.armies = 1;
- selectedTerritory.armyText.setText(selectedTerritory.armies.toString());
- if (defensePower > attackPower) {
- target.armies = defensePower - attackPower;
- target.armyText.setText(target.armies.toString());
- }
+ // Show target selection mode
+ gameState = 'selectingTarget';
+ attackTargets = targets;
+ // Highlight all possible targets
+ for (var i = 0; i < targets.length; i++) {
+ targets[i].showAsTarget = true;
+ targets[i].updateGraphics();
}
- LK.getSound('attack').play();
- updateTerritoryCount();
- endPlayerTurn();
+ if (instructionText) {
+ instructionText.setText("Select a territory to attack");
+ }
}
}
+// Execute attack on selected target
+function executeAttack(target) {
+ if (!selectedTerritory || !target) return;
+ // Clear target highlighting
+ for (var i = 0; i < attackTargets.length; i++) {
+ attackTargets[i].showAsTarget = false;
+ attackTargets[i].updateGraphics();
+ }
+ // Simple combat resolution
+ var attackPower = selectedTerritory.armies - 1;
+ var defensePower = target.armies;
+ if (attackPower > defensePower) {
+ // Victory
+ target.setOwner(1, attackPower - defensePower);
+ selectedTerritory.armies = 1;
+ selectedTerritory.armyText.setText(selectedTerritory.armies.toString());
+ LK.getSound('capture').play();
+ } else {
+ // Defeat
+ selectedTerritory.armies = 1;
+ selectedTerritory.armyText.setText(selectedTerritory.armies.toString());
+ if (defensePower > attackPower) {
+ target.armies = defensePower - attackPower;
+ target.armyText.setText(target.armies.toString());
+ }
+ }
+ LK.getSound('attack').play();
+ updateTerritoryCount();
+ // Reset game state
+ gameState = 'playing';
+ attackTargets = [];
+ endPlayerTurn();
+}
// Recruit armies action
function recruitArmies() {
if (!selectedTerritory) return;
var recruitCost = 50; // Cost to recruit armies
green grass. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
cyan grass. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
gray grass. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
sea territory. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
soldier. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
blue grass. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
white grass. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
red grass. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
yellow grass. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
pixelart empty button. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
paper piece pixel. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
pixel ship. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
swords pixelart. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat