/**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/**** 
* Classes
****/ 
var Unit = Container.expand(function () {
	var self = Container.call(this);
	self.type = 'infantry';
	self.health = 100;
	self.maxHealth = 100;
	self.damage = 10;
	self.cost = 50;
	self.isEnemy = false;
	self.targetX = 0;
	self.targetY = 0;
	self.speed = 1;
	self.takeDamage = function (amount) {
		self.health -= amount;
		if (self.health <= 0) {
			self.health = 0;
			return true; // Unit died
		}
		return false;
	};
	self.moveToward = function (x, y) {
		var dx = x - self.x;
		var dy = y - self.y;
		var distance = Math.sqrt(dx * dx + dy * dy);
		if (distance > 5) {
			self.x += dx / distance * self.speed;
			self.y += dy / distance * self.speed;
		}
	};
	return self;
});
var Infantry = Unit.expand(function () {
	var self = Unit.call(this);
	var graphics = self.attachAsset('soldier', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.type = 'infantry';
	self.health = 100;
	self.maxHealth = 100;
	self.damage = 15;
	self.cost = 50;
	self.speed = 1.5;
	return self;
});
var EnemyUnit = Unit.expand(function () {
	var self = Unit.call(this);
	self.isEnemy = true;
	return self;
});
var EnemyInfantry = EnemyUnit.expand(function () {
	var self = EnemyUnit.call(this);
	var graphics = self.attachAsset('enemy', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.type = 'infantry';
	self.health = 100;
	self.maxHealth = 100;
	self.damage = 12;
	self.speed = 1.3;
	return self;
});
var EnemyCavalry = EnemyUnit.expand(function () {
	var self = EnemyUnit.call(this);
	var graphics = self.attachAsset('enemyCavalry', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.type = 'cavalry';
	self.health = 140;
	self.maxHealth = 140;
	self.damage = 22;
	self.speed = 2.8;
	return self;
});
var EnemyArtillery = EnemyUnit.expand(function () {
	var self = EnemyUnit.call(this);
	var graphics = self.attachAsset('enemyArtillery', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.type = 'artillery';
	self.health = 75;
	self.maxHealth = 75;
	self.damage = 35;
	self.speed = 0.7;
	return self;
});
var Cavalry = Unit.expand(function () {
	var self = Unit.call(this);
	var graphics = self.attachAsset('cavalry', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.type = 'cavalry';
	self.health = 150;
	self.maxHealth = 150;
	self.damage = 25;
	self.cost = 100;
	self.speed = 3;
	return self;
});
var Artillery = Unit.expand(function () {
	var self = Unit.call(this);
	var graphics = self.attachAsset('artillery', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.type = 'artillery';
	self.health = 80;
	self.maxHealth = 80;
	self.damage = 40;
	self.cost = 200;
	self.speed = 0.8;
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x2c3e50
});
/**** 
* Game Code
****/ 
// Game state variables
var money = storage.money || 1000;
var playerUnits = [];
var enemyUnits = [];
var gameState = 'menu'; // menu, battle, event
var battleTimer = 0;
var eventTimer = 0;
var waveNumber = 1;
var lastEventTime = 0;
// Unit costs (affected by events)
var unitCosts = {
	infantry: 50,
	cavalry: 100,
	artillery: 200
};
// Law system
var activeLaws = [];
var maxActiveLaws = 3; // Maximum number of active laws at once
var lawTypes = [{
	name: 'Military Conscription',
	description: 'Reduce infantry cost by 30%',
	cost: 500,
	effect: function effect() {
		unitCosts.infantry = Math.floor(unitCosts.infantry * 0.7);
	},
	active: false
}, {
	name: 'Arms Manufacturing',
	description: 'Reduce artillery cost by 25%',
	cost: 800,
	effect: function effect() {
		unitCosts.artillery = Math.floor(unitCosts.artillery * 0.75);
	},
	active: false
}, {
	name: 'Trade Agreements',
	description: 'Increase passive income by 100%',
	cost: 1000,
	effect: function effect() {
		// Effect handled in passive income section
	},
	active: false
}, {
	name: 'War Economy',
	description: 'All units cost 20% more but deal 50% more damage',
	cost: 1200,
	effect: function effect() {
		unitCosts.infantry = Math.floor(unitCosts.infantry * 1.2);
		unitCosts.cavalry = Math.floor(unitCosts.cavalry * 1.2);
		unitCosts.artillery = Math.floor(unitCosts.artillery * 1.2);
		// Damage boost handled in combat
	},
	active: false
}];
// AI Generated Laws Templates
var aiLawTemplates = [{
	namePrefix: 'Economic Stimulus',
	descriptions: ['Boost trade revenue', 'Increase tax efficiency', 'Stimulate market growth'],
	effects: [function () {/* Income boost handled in passive income */}, function () {
		unitCosts.infantry = Math.floor(unitCosts.infantry * 0.9);
	}, function () {
		unitCosts.cavalry = Math.floor(unitCosts.cavalry * 0.85);
	}]
}, {
	namePrefix: 'Military Doctrine',
	descriptions: ['Enhanced training programs', 'Advanced tactics', 'Superior logistics'],
	effects: [function () {
		unitCosts.artillery = Math.floor(unitCosts.artillery * 0.8);
	}, function () {/* Damage boost handled in combat */}, function () {
		unitCosts.infantry = Math.floor(unitCosts.infantry * 0.8);
		unitCosts.cavalry = Math.floor(unitCosts.cavalry * 0.8);
	}]
}, {
	namePrefix: 'Defense Initiative',
	descriptions: ['Fortification programs', 'Homeland security', 'Strategic reserves'],
	effects: [function () {/* Health boost handled in unit creation */}, function () {
		unitCosts.artillery = Math.floor(unitCosts.artillery * 1.1);
	}, function () {/* Speed boost handled in combat */}]
}, {
	namePrefix: 'Industrial Reform',
	descriptions: ['Factory modernization', 'Resource optimization', 'Production efficiency'],
	effects: [function () {
		unitCosts.infantry = Math.floor(unitCosts.infantry * 0.75);
		unitCosts.cavalry = Math.floor(unitCosts.cavalry * 0.75);
	}, function () {/* Income boost handled in passive income */}, function () {
		unitCosts.artillery = Math.floor(unitCosts.artillery * 0.7);
	}]
}];
// Event system
var activeEvents = [];
var eventTypes = [{
	name: 'Plague',
	description: 'A plague reduces all unit health by 20%',
	effect: function effect() {
		for (var i = 0; i < playerUnits.length; i++) {
			playerUnits[i].health = Math.max(1, Math.floor(playerUnits[i].health * 0.8));
		}
	}
}, {
	name: 'Revolution',
	description: 'Economic upheaval reduces income by 30%',
	effect: function effect() {
		money = Math.floor(money * 0.7);
		// Revolution also disables all active laws
		for (var i = 0; i < lawTypes.length; i++) {
			lawTypes[i].active = false;
		}
		activeLaws = [];
		resetUnitCosts();
	}
}, {
	name: 'Military Reform',
	description: 'Government increases unit costs by 50%',
	effect: function effect() {
		unitCosts.infantry = Math.floor(unitCosts.infantry * 1.5);
		unitCosts.cavalry = Math.floor(unitCosts.cavalry * 1.5);
		unitCosts.artillery = Math.floor(unitCosts.artillery * 1.5);
	}
}, {
	name: 'Government Coup',
	description: 'New government allows creation of beneficial laws',
	effect: function effect() {
		// Reset all laws to available
		for (var i = 0; i < lawTypes.length; i++) {
			lawTypes[i].active = false;
		}
		activeLaws = [];
		resetUnitCosts();
	}
}];
// UI Elements
var moneyText = new Text2(money.toString(), {
	size: 60,
	fill: 0xFFFFFF
});
moneyText.anchor.set(0, 0);
LK.gui.top.addChild(moneyText);
moneyText.x = 200;
moneyText.y = 20;
var waveText = new Text2('Wave: ' + waveNumber, {
	size: 50,
	fill: 0xFFFFFF
});
waveText.anchor.set(0.5, 0);
LK.gui.top.addChild(waveText);
var eventText = new Text2('', {
	size: 40,
	fill: 0xFF6B6B
});
eventText.anchor.set(0.5, 0.5);
LK.gui.center.addChild(eventText);
// Buy buttons
var infantryButton = new Text2('Infantry ($' + unitCosts.infantry + ')', {
	size: 45,
	fill: 0x4A90E2
});
infantryButton.anchor.set(0, 1);
LK.gui.bottomLeft.addChild(infantryButton);
infantryButton.x = 50;
infantryButton.y = -200;
var cavalryButton = new Text2('Cavalry ($' + unitCosts.cavalry + ')', {
	size: 45,
	fill: 0x7ED321
});
cavalryButton.anchor.set(0, 1);
LK.gui.bottomLeft.addChild(cavalryButton);
cavalryButton.x = 50;
cavalryButton.y = -150;
var artilleryButton = new Text2('Artillery ($' + unitCosts.artillery + ')', {
	size: 45,
	fill: 0xD0021B
});
artilleryButton.anchor.set(0, 1);
LK.gui.bottomLeft.addChild(artilleryButton);
artilleryButton.x = 50;
artilleryButton.y = -100;
var startBattleButton = new Text2('Start Battle', {
	size: 50,
	fill: 0xF39C12
});
startBattleButton.anchor.set(0.5, 1);
LK.gui.bottom.addChild(startBattleButton);
startBattleButton.y = -50;
// Laws UI
var lawsTitle = new Text2('LAWS', {
	size: 40,
	fill: 0xE74C3C
});
lawsTitle.anchor.set(1, 0);
LK.gui.topRight.addChild(lawsTitle);
lawsTitle.x = -50;
lawsTitle.y = 20;
var lawButtons = [];
for (var i = 0; i < lawTypes.length; i++) {
	var lawButton = new Text2(lawTypes[i].name + ' ($' + lawTypes[i].cost + ')', {
		size: 35,
		fill: 0x95A5A6
	});
	lawButton.anchor.set(1, 0);
	LK.gui.topRight.addChild(lawButton);
	lawButton.x = -50;
	lawButton.y = 80 + i * 60;
	lawButton.lawIndex = i;
	lawButtons.push(lawButton);
}
// Functions
function updateMoney() {
	moneyText.setText('$' + money);
	storage.money = money;
}
function updateButtonTexts() {
	infantryButton.setText('Infantry ($' + unitCosts.infantry + ')');
	cavalryButton.setText('Cavalry ($' + unitCosts.cavalry + ')');
	artilleryButton.setText('Artillery ($' + unitCosts.artillery + ')');
}
function resetUnitCosts() {
	unitCosts.infantry = 50;
	unitCosts.cavalry = 100;
	unitCosts.artillery = 200;
}
function applyAllActiveLaws() {
	resetUnitCosts();
	for (var i = 0; i < activeLaws.length; i++) {
		activeLaws[i].effect();
	}
	updateButtonTexts();
}
function enactLaw(lawIndex) {
	var law = lawTypes[lawIndex];
	if (!law.active && money >= law.cost) {
		money -= law.cost;
		// If we're at max capacity, replace the oldest law with a new AI-generated law
		if (activeLaws.length >= maxActiveLaws) {
			var oldestLaw = activeLaws[0];
			oldestLaw.active = false;
			activeLaws.splice(0, 1);
			// Generate new AI law to replace the old spot
			var newAILaw = generateAILaw();
			lawTypes[lawTypes.indexOf(oldestLaw)] = newAILaw;
			eventText.setText('Law Replaced: ' + oldestLaw.name + ' → ' + newAILaw.name);
		} else {
			eventText.setText('Law Enacted: ' + law.name);
		}
		law.active = true;
		activeLaws.push(law);
		// AI replaces currently active laws with new ones
		if (Math.random() < 0.4) {
			// 40% chance
			for (var i = 0; i < activeLaws.length; i++) {
				if (activeLaws[i] !== law && Math.random() < 0.3) {
					// 30% chance per active law (excluding the one just enacted)
					var oldLaw = activeLaws[i];
					oldLaw.active = false;
					var replacementLaw = generateAILaw();
					lawTypes[lawTypes.indexOf(oldLaw)] = replacementLaw;
					replacementLaw.active = true;
					activeLaws[i] = replacementLaw;
					eventText.setText(eventText.text + ' | AI Replaced: ' + oldLaw.name + ' → ' + replacementLaw.name);
				}
			}
		}
		applyAllActiveLaws();
		updateMoney();
		updateLawButtons();
		LK.getSound('event').play();
		LK.setTimeout(function () {
			eventText.setText('');
		}, 3000);
	}
}
function generateAILaw() {
	var template = aiLawTemplates[Math.floor(Math.random() * aiLawTemplates.length)];
	var effectIndex = Math.floor(Math.random() * template.effects.length);
	var lawNumber = Math.floor(Math.random() * 999) + 1;
	var newLaw = {
		name: template.namePrefix + ' #' + lawNumber,
		description: template.descriptions[effectIndex],
		cost: Math.floor(Math.random() * 800) + 400,
		// 400-1200 cost range
		effect: template.effects[effectIndex],
		active: false,
		isAIGenerated: true,
		damageBoost: Math.random() < 0.3 ? 1.3 + Math.random() * 0.4 : 1,
		// 30% chance for damage boost
		incomeBoost: Math.random() < 0.25 ? 1.5 + Math.random() * 0.5 : 1,
		// 25% chance for income boost
		healthBoost: Math.random() < 0.2 ? 1.2 + Math.random() * 0.3 : 1,
		// 20% chance for health boost
		speedBoost: Math.random() < 0.15 ? 1.4 + Math.random() * 0.6 : 1 // 15% chance for speed boost
	};
	return newLaw;
}
function updateLawButtons() {
	for (var i = 0; i < lawButtons.length; i++) {
		var law = lawTypes[i];
		var button = lawButtons[i];
		if (law.active) {
			button.fill = 0x27AE60;
			button.setText(law.name + ' (ACTIVE)');
		} else {
			button.fill = money >= law.cost ? 0x3498DB : 0x95A5A6;
			button.setText(law.name + ' ($' + law.cost + ')');
		}
	}
}
function buyUnit(type) {
	var cost = unitCosts[type];
	if (money >= cost) {
		money -= cost;
		updateMoney();
		var unit;
		if (type === 'infantry') {
			unit = new Infantry();
		} else if (type === 'cavalry') {
			unit = new Cavalry();
		} else if (type === 'artillery') {
			unit = new Artillery();
		}
		// Apply AI-generated law effects to new units
		for (var i = 0; i < activeLaws.length; i++) {
			if (activeLaws[i].isAIGenerated) {
				if (activeLaws[i].healthBoost > 1) {
					unit.health = Math.floor(unit.health * activeLaws[i].healthBoost);
					unit.maxHealth = Math.floor(unit.maxHealth * activeLaws[i].healthBoost);
				}
				if (activeLaws[i].speedBoost > 1) {
					unit.speed = unit.speed * activeLaws[i].speedBoost;
				}
			}
		}
		unit.x = 200 + Math.random() * 400;
		unit.y = 2000 + Math.random() * 200;
		playerUnits.push(unit);
		game.addChild(unit);
		LK.getSound('purchase').play();
	}
}
function spawnEnemyWave() {
	var enemyCount = waveNumber + 2;
	for (var i = 0; i < enemyCount; i++) {
		var enemy;
		var rand = Math.random();
		if (rand < 0.6) {
			enemy = new EnemyInfantry();
		} else if (rand < 0.8) {
			enemy = new EnemyCavalry();
		} else {
			enemy = new EnemyArtillery();
		}
		enemy.x = 800 + Math.random() * 800;
		enemy.y = 500 + Math.random() * 200;
		enemyUnits.push(enemy);
		game.addChild(enemy);
	}
}
function startBattle() {
	if (playerUnits.length === 0) return;
	gameState = 'battle';
	battleTimer = 0;
	spawnEnemyWave();
	LK.getSound('battle').play();
}
function triggerRandomEvent() {
	if (Math.random() < 0.3 && LK.ticks - lastEventTime > 1800) {
		// 30 seconds
		var eventIndex = Math.floor(Math.random() * eventTypes.length);
		var event = eventTypes[eventIndex];
		eventText.setText(event.name + ': ' + event.description);
		event.effect();
		updateButtonTexts();
		LK.getSound('event').play();
		lastEventTime = LK.ticks;
		// Clear event text after 3 seconds
		LK.setTimeout(function () {
			eventText.setText('');
		}, 3000);
	}
}
function findNearestEnemy(unit) {
	var nearest = null;
	var nearestDistance = Infinity;
	var targets = unit.isEnemy ? playerUnits : enemyUnits;
	for (var i = 0; i < targets.length; i++) {
		var target = targets[i];
		var dx = target.x - unit.x;
		var dy = target.y - unit.y;
		var distance = Math.sqrt(dx * dx + dy * dy);
		if (distance < nearestDistance) {
			nearestDistance = distance;
			nearest = target;
		}
	}
	return nearest;
}
function updateBattle() {
	// Move and attack player units
	for (var i = playerUnits.length - 1; i >= 0; i--) {
		var unit = playerUnits[i];
		var target = findNearestEnemy(unit);
		if (target) {
			var dx = target.x - unit.x;
			var dy = target.y - unit.y;
			var distance = Math.sqrt(dx * dx + dy * dy);
			if (distance > 100) {
				unit.moveToward(target.x, target.y);
			} else if (battleTimer % 60 === 0) {
				// Attack once per second
				var damage = unit.damage;
				// Check if War Economy law is active
				for (var j = 0; j < activeLaws.length; j++) {
					if (activeLaws[j].name === 'War Economy') {
						damage = Math.floor(damage * 1.5);
						break;
					}
					// Apply AI-generated law damage boosts
					if (activeLaws[j].isAIGenerated && activeLaws[j].damageBoost > 1) {
						damage = Math.floor(damage * activeLaws[j].damageBoost);
					}
				}
				var killed = target.takeDamage(damage);
				if (killed) {
					var targetIndex = enemyUnits.indexOf(target);
					if (targetIndex !== -1) {
						enemyUnits[targetIndex].destroy();
						enemyUnits.splice(targetIndex, 1);
						money += 25; // Reward for killing enemy
						updateMoney();
					}
				}
			}
		}
	}
	// Move and attack enemy units
	for (var i = enemyUnits.length - 1; i >= 0; i--) {
		var unit = enemyUnits[i];
		var target = findNearestEnemy(unit);
		if (target) {
			var dx = target.x - unit.x;
			var dy = target.y - unit.y;
			var distance = Math.sqrt(dx * dx + dy * dy);
			if (distance > 100) {
				unit.moveToward(target.x, target.y);
			} else if (battleTimer % 60 === 0) {
				// Attack once per second
				var killed = target.takeDamage(unit.damage);
				if (killed) {
					var targetIndex = playerUnits.indexOf(target);
					if (targetIndex !== -1) {
						playerUnits[targetIndex].destroy();
						playerUnits.splice(targetIndex, 1);
					}
				}
			}
		}
	}
	// Check battle end conditions
	if (enemyUnits.length === 0) {
		// Player won
		gameState = 'menu';
		waveNumber++;
		waveText.setText('Wave: ' + waveNumber);
		money += 100 * waveNumber; // Wave completion bonus
		updateMoney();
	} else if (playerUnits.length === 0) {
		// Player lost
		LK.showGameOver();
	}
}
// Event handlers
infantryButton.down = function () {
	buyUnit('infantry');
};
cavalryButton.down = function () {
	buyUnit('cavalry');
};
artilleryButton.down = function () {
	buyUnit('artillery');
};
startBattleButton.down = function () {
	if (gameState === 'menu') {
		startBattle();
	}
};
// Law button handlers
for (var i = 0; i < lawButtons.length; i++) {
	lawButtons[i].down = function (index) {
		return function () {
			enactLaw(index);
		};
	}(i);
}
// Main game update loop
game.update = function () {
	if (gameState === 'battle') {
		battleTimer++;
		updateBattle();
	}
	// Passive income every 3 seconds
	if (LK.ticks % 180 === 0) {
		var income = 50;
		// Check if Trade Agreements law is active
		for (var i = 0; i < activeLaws.length; i++) {
			if (activeLaws[i].name === 'Trade Agreements') {
				income *= 2;
				break;
			}
			// Apply AI-generated law income boosts
			if (activeLaws[i].isAIGenerated && activeLaws[i].incomeBoost > 1) {
				income = Math.floor(income * activeLaws[i].incomeBoost);
			}
		}
		money += income;
		updateMoney();
	}
	// Trigger random events
	triggerRandomEvent();
	// Update law button states
	updateLawButtons();
	// Check for bankruptcy
	if (money < 0) {
		LK.showGameOver();
	}
}; /**** 
* Plugins
****/ 
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/**** 
* Classes
****/ 
var Unit = Container.expand(function () {
	var self = Container.call(this);
	self.type = 'infantry';
	self.health = 100;
	self.maxHealth = 100;
	self.damage = 10;
	self.cost = 50;
	self.isEnemy = false;
	self.targetX = 0;
	self.targetY = 0;
	self.speed = 1;
	self.takeDamage = function (amount) {
		self.health -= amount;
		if (self.health <= 0) {
			self.health = 0;
			return true; // Unit died
		}
		return false;
	};
	self.moveToward = function (x, y) {
		var dx = x - self.x;
		var dy = y - self.y;
		var distance = Math.sqrt(dx * dx + dy * dy);
		if (distance > 5) {
			self.x += dx / distance * self.speed;
			self.y += dy / distance * self.speed;
		}
	};
	return self;
});
var Infantry = Unit.expand(function () {
	var self = Unit.call(this);
	var graphics = self.attachAsset('soldier', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.type = 'infantry';
	self.health = 100;
	self.maxHealth = 100;
	self.damage = 15;
	self.cost = 50;
	self.speed = 1.5;
	return self;
});
var EnemyUnit = Unit.expand(function () {
	var self = Unit.call(this);
	self.isEnemy = true;
	return self;
});
var EnemyInfantry = EnemyUnit.expand(function () {
	var self = EnemyUnit.call(this);
	var graphics = self.attachAsset('enemy', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.type = 'infantry';
	self.health = 100;
	self.maxHealth = 100;
	self.damage = 12;
	self.speed = 1.3;
	return self;
});
var EnemyCavalry = EnemyUnit.expand(function () {
	var self = EnemyUnit.call(this);
	var graphics = self.attachAsset('enemyCavalry', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.type = 'cavalry';
	self.health = 140;
	self.maxHealth = 140;
	self.damage = 22;
	self.speed = 2.8;
	return self;
});
var EnemyArtillery = EnemyUnit.expand(function () {
	var self = EnemyUnit.call(this);
	var graphics = self.attachAsset('enemyArtillery', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.type = 'artillery';
	self.health = 75;
	self.maxHealth = 75;
	self.damage = 35;
	self.speed = 0.7;
	return self;
});
var Cavalry = Unit.expand(function () {
	var self = Unit.call(this);
	var graphics = self.attachAsset('cavalry', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.type = 'cavalry';
	self.health = 150;
	self.maxHealth = 150;
	self.damage = 25;
	self.cost = 100;
	self.speed = 3;
	return self;
});
var Artillery = Unit.expand(function () {
	var self = Unit.call(this);
	var graphics = self.attachAsset('artillery', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.type = 'artillery';
	self.health = 80;
	self.maxHealth = 80;
	self.damage = 40;
	self.cost = 200;
	self.speed = 0.8;
	return self;
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x2c3e50
});
/**** 
* Game Code
****/ 
// Game state variables
var money = storage.money || 1000;
var playerUnits = [];
var enemyUnits = [];
var gameState = 'menu'; // menu, battle, event
var battleTimer = 0;
var eventTimer = 0;
var waveNumber = 1;
var lastEventTime = 0;
// Unit costs (affected by events)
var unitCosts = {
	infantry: 50,
	cavalry: 100,
	artillery: 200
};
// Law system
var activeLaws = [];
var maxActiveLaws = 3; // Maximum number of active laws at once
var lawTypes = [{
	name: 'Military Conscription',
	description: 'Reduce infantry cost by 30%',
	cost: 500,
	effect: function effect() {
		unitCosts.infantry = Math.floor(unitCosts.infantry * 0.7);
	},
	active: false
}, {
	name: 'Arms Manufacturing',
	description: 'Reduce artillery cost by 25%',
	cost: 800,
	effect: function effect() {
		unitCosts.artillery = Math.floor(unitCosts.artillery * 0.75);
	},
	active: false
}, {
	name: 'Trade Agreements',
	description: 'Increase passive income by 100%',
	cost: 1000,
	effect: function effect() {
		// Effect handled in passive income section
	},
	active: false
}, {
	name: 'War Economy',
	description: 'All units cost 20% more but deal 50% more damage',
	cost: 1200,
	effect: function effect() {
		unitCosts.infantry = Math.floor(unitCosts.infantry * 1.2);
		unitCosts.cavalry = Math.floor(unitCosts.cavalry * 1.2);
		unitCosts.artillery = Math.floor(unitCosts.artillery * 1.2);
		// Damage boost handled in combat
	},
	active: false
}];
// AI Generated Laws Templates
var aiLawTemplates = [{
	namePrefix: 'Economic Stimulus',
	descriptions: ['Boost trade revenue', 'Increase tax efficiency', 'Stimulate market growth'],
	effects: [function () {/* Income boost handled in passive income */}, function () {
		unitCosts.infantry = Math.floor(unitCosts.infantry * 0.9);
	}, function () {
		unitCosts.cavalry = Math.floor(unitCosts.cavalry * 0.85);
	}]
}, {
	namePrefix: 'Military Doctrine',
	descriptions: ['Enhanced training programs', 'Advanced tactics', 'Superior logistics'],
	effects: [function () {
		unitCosts.artillery = Math.floor(unitCosts.artillery * 0.8);
	}, function () {/* Damage boost handled in combat */}, function () {
		unitCosts.infantry = Math.floor(unitCosts.infantry * 0.8);
		unitCosts.cavalry = Math.floor(unitCosts.cavalry * 0.8);
	}]
}, {
	namePrefix: 'Defense Initiative',
	descriptions: ['Fortification programs', 'Homeland security', 'Strategic reserves'],
	effects: [function () {/* Health boost handled in unit creation */}, function () {
		unitCosts.artillery = Math.floor(unitCosts.artillery * 1.1);
	}, function () {/* Speed boost handled in combat */}]
}, {
	namePrefix: 'Industrial Reform',
	descriptions: ['Factory modernization', 'Resource optimization', 'Production efficiency'],
	effects: [function () {
		unitCosts.infantry = Math.floor(unitCosts.infantry * 0.75);
		unitCosts.cavalry = Math.floor(unitCosts.cavalry * 0.75);
	}, function () {/* Income boost handled in passive income */}, function () {
		unitCosts.artillery = Math.floor(unitCosts.artillery * 0.7);
	}]
}];
// Event system
var activeEvents = [];
var eventTypes = [{
	name: 'Plague',
	description: 'A plague reduces all unit health by 20%',
	effect: function effect() {
		for (var i = 0; i < playerUnits.length; i++) {
			playerUnits[i].health = Math.max(1, Math.floor(playerUnits[i].health * 0.8));
		}
	}
}, {
	name: 'Revolution',
	description: 'Economic upheaval reduces income by 30%',
	effect: function effect() {
		money = Math.floor(money * 0.7);
		// Revolution also disables all active laws
		for (var i = 0; i < lawTypes.length; i++) {
			lawTypes[i].active = false;
		}
		activeLaws = [];
		resetUnitCosts();
	}
}, {
	name: 'Military Reform',
	description: 'Government increases unit costs by 50%',
	effect: function effect() {
		unitCosts.infantry = Math.floor(unitCosts.infantry * 1.5);
		unitCosts.cavalry = Math.floor(unitCosts.cavalry * 1.5);
		unitCosts.artillery = Math.floor(unitCosts.artillery * 1.5);
	}
}, {
	name: 'Government Coup',
	description: 'New government allows creation of beneficial laws',
	effect: function effect() {
		// Reset all laws to available
		for (var i = 0; i < lawTypes.length; i++) {
			lawTypes[i].active = false;
		}
		activeLaws = [];
		resetUnitCosts();
	}
}];
// UI Elements
var moneyText = new Text2(money.toString(), {
	size: 60,
	fill: 0xFFFFFF
});
moneyText.anchor.set(0, 0);
LK.gui.top.addChild(moneyText);
moneyText.x = 200;
moneyText.y = 20;
var waveText = new Text2('Wave: ' + waveNumber, {
	size: 50,
	fill: 0xFFFFFF
});
waveText.anchor.set(0.5, 0);
LK.gui.top.addChild(waveText);
var eventText = new Text2('', {
	size: 40,
	fill: 0xFF6B6B
});
eventText.anchor.set(0.5, 0.5);
LK.gui.center.addChild(eventText);
// Buy buttons
var infantryButton = new Text2('Infantry ($' + unitCosts.infantry + ')', {
	size: 45,
	fill: 0x4A90E2
});
infantryButton.anchor.set(0, 1);
LK.gui.bottomLeft.addChild(infantryButton);
infantryButton.x = 50;
infantryButton.y = -200;
var cavalryButton = new Text2('Cavalry ($' + unitCosts.cavalry + ')', {
	size: 45,
	fill: 0x7ED321
});
cavalryButton.anchor.set(0, 1);
LK.gui.bottomLeft.addChild(cavalryButton);
cavalryButton.x = 50;
cavalryButton.y = -150;
var artilleryButton = new Text2('Artillery ($' + unitCosts.artillery + ')', {
	size: 45,
	fill: 0xD0021B
});
artilleryButton.anchor.set(0, 1);
LK.gui.bottomLeft.addChild(artilleryButton);
artilleryButton.x = 50;
artilleryButton.y = -100;
var startBattleButton = new Text2('Start Battle', {
	size: 50,
	fill: 0xF39C12
});
startBattleButton.anchor.set(0.5, 1);
LK.gui.bottom.addChild(startBattleButton);
startBattleButton.y = -50;
// Laws UI
var lawsTitle = new Text2('LAWS', {
	size: 40,
	fill: 0xE74C3C
});
lawsTitle.anchor.set(1, 0);
LK.gui.topRight.addChild(lawsTitle);
lawsTitle.x = -50;
lawsTitle.y = 20;
var lawButtons = [];
for (var i = 0; i < lawTypes.length; i++) {
	var lawButton = new Text2(lawTypes[i].name + ' ($' + lawTypes[i].cost + ')', {
		size: 35,
		fill: 0x95A5A6
	});
	lawButton.anchor.set(1, 0);
	LK.gui.topRight.addChild(lawButton);
	lawButton.x = -50;
	lawButton.y = 80 + i * 60;
	lawButton.lawIndex = i;
	lawButtons.push(lawButton);
}
// Functions
function updateMoney() {
	moneyText.setText('$' + money);
	storage.money = money;
}
function updateButtonTexts() {
	infantryButton.setText('Infantry ($' + unitCosts.infantry + ')');
	cavalryButton.setText('Cavalry ($' + unitCosts.cavalry + ')');
	artilleryButton.setText('Artillery ($' + unitCosts.artillery + ')');
}
function resetUnitCosts() {
	unitCosts.infantry = 50;
	unitCosts.cavalry = 100;
	unitCosts.artillery = 200;
}
function applyAllActiveLaws() {
	resetUnitCosts();
	for (var i = 0; i < activeLaws.length; i++) {
		activeLaws[i].effect();
	}
	updateButtonTexts();
}
function enactLaw(lawIndex) {
	var law = lawTypes[lawIndex];
	if (!law.active && money >= law.cost) {
		money -= law.cost;
		// If we're at max capacity, replace the oldest law with a new AI-generated law
		if (activeLaws.length >= maxActiveLaws) {
			var oldestLaw = activeLaws[0];
			oldestLaw.active = false;
			activeLaws.splice(0, 1);
			// Generate new AI law to replace the old spot
			var newAILaw = generateAILaw();
			lawTypes[lawTypes.indexOf(oldestLaw)] = newAILaw;
			eventText.setText('Law Replaced: ' + oldestLaw.name + ' → ' + newAILaw.name);
		} else {
			eventText.setText('Law Enacted: ' + law.name);
		}
		law.active = true;
		activeLaws.push(law);
		// AI replaces currently active laws with new ones
		if (Math.random() < 0.4) {
			// 40% chance
			for (var i = 0; i < activeLaws.length; i++) {
				if (activeLaws[i] !== law && Math.random() < 0.3) {
					// 30% chance per active law (excluding the one just enacted)
					var oldLaw = activeLaws[i];
					oldLaw.active = false;
					var replacementLaw = generateAILaw();
					lawTypes[lawTypes.indexOf(oldLaw)] = replacementLaw;
					replacementLaw.active = true;
					activeLaws[i] = replacementLaw;
					eventText.setText(eventText.text + ' | AI Replaced: ' + oldLaw.name + ' → ' + replacementLaw.name);
				}
			}
		}
		applyAllActiveLaws();
		updateMoney();
		updateLawButtons();
		LK.getSound('event').play();
		LK.setTimeout(function () {
			eventText.setText('');
		}, 3000);
	}
}
function generateAILaw() {
	var template = aiLawTemplates[Math.floor(Math.random() * aiLawTemplates.length)];
	var effectIndex = Math.floor(Math.random() * template.effects.length);
	var lawNumber = Math.floor(Math.random() * 999) + 1;
	var newLaw = {
		name: template.namePrefix + ' #' + lawNumber,
		description: template.descriptions[effectIndex],
		cost: Math.floor(Math.random() * 800) + 400,
		// 400-1200 cost range
		effect: template.effects[effectIndex],
		active: false,
		isAIGenerated: true,
		damageBoost: Math.random() < 0.3 ? 1.3 + Math.random() * 0.4 : 1,
		// 30% chance for damage boost
		incomeBoost: Math.random() < 0.25 ? 1.5 + Math.random() * 0.5 : 1,
		// 25% chance for income boost
		healthBoost: Math.random() < 0.2 ? 1.2 + Math.random() * 0.3 : 1,
		// 20% chance for health boost
		speedBoost: Math.random() < 0.15 ? 1.4 + Math.random() * 0.6 : 1 // 15% chance for speed boost
	};
	return newLaw;
}
function updateLawButtons() {
	for (var i = 0; i < lawButtons.length; i++) {
		var law = lawTypes[i];
		var button = lawButtons[i];
		if (law.active) {
			button.fill = 0x27AE60;
			button.setText(law.name + ' (ACTIVE)');
		} else {
			button.fill = money >= law.cost ? 0x3498DB : 0x95A5A6;
			button.setText(law.name + ' ($' + law.cost + ')');
		}
	}
}
function buyUnit(type) {
	var cost = unitCosts[type];
	if (money >= cost) {
		money -= cost;
		updateMoney();
		var unit;
		if (type === 'infantry') {
			unit = new Infantry();
		} else if (type === 'cavalry') {
			unit = new Cavalry();
		} else if (type === 'artillery') {
			unit = new Artillery();
		}
		// Apply AI-generated law effects to new units
		for (var i = 0; i < activeLaws.length; i++) {
			if (activeLaws[i].isAIGenerated) {
				if (activeLaws[i].healthBoost > 1) {
					unit.health = Math.floor(unit.health * activeLaws[i].healthBoost);
					unit.maxHealth = Math.floor(unit.maxHealth * activeLaws[i].healthBoost);
				}
				if (activeLaws[i].speedBoost > 1) {
					unit.speed = unit.speed * activeLaws[i].speedBoost;
				}
			}
		}
		unit.x = 200 + Math.random() * 400;
		unit.y = 2000 + Math.random() * 200;
		playerUnits.push(unit);
		game.addChild(unit);
		LK.getSound('purchase').play();
	}
}
function spawnEnemyWave() {
	var enemyCount = waveNumber + 2;
	for (var i = 0; i < enemyCount; i++) {
		var enemy;
		var rand = Math.random();
		if (rand < 0.6) {
			enemy = new EnemyInfantry();
		} else if (rand < 0.8) {
			enemy = new EnemyCavalry();
		} else {
			enemy = new EnemyArtillery();
		}
		enemy.x = 800 + Math.random() * 800;
		enemy.y = 500 + Math.random() * 200;
		enemyUnits.push(enemy);
		game.addChild(enemy);
	}
}
function startBattle() {
	if (playerUnits.length === 0) return;
	gameState = 'battle';
	battleTimer = 0;
	spawnEnemyWave();
	LK.getSound('battle').play();
}
function triggerRandomEvent() {
	if (Math.random() < 0.3 && LK.ticks - lastEventTime > 1800) {
		// 30 seconds
		var eventIndex = Math.floor(Math.random() * eventTypes.length);
		var event = eventTypes[eventIndex];
		eventText.setText(event.name + ': ' + event.description);
		event.effect();
		updateButtonTexts();
		LK.getSound('event').play();
		lastEventTime = LK.ticks;
		// Clear event text after 3 seconds
		LK.setTimeout(function () {
			eventText.setText('');
		}, 3000);
	}
}
function findNearestEnemy(unit) {
	var nearest = null;
	var nearestDistance = Infinity;
	var targets = unit.isEnemy ? playerUnits : enemyUnits;
	for (var i = 0; i < targets.length; i++) {
		var target = targets[i];
		var dx = target.x - unit.x;
		var dy = target.y - unit.y;
		var distance = Math.sqrt(dx * dx + dy * dy);
		if (distance < nearestDistance) {
			nearestDistance = distance;
			nearest = target;
		}
	}
	return nearest;
}
function updateBattle() {
	// Move and attack player units
	for (var i = playerUnits.length - 1; i >= 0; i--) {
		var unit = playerUnits[i];
		var target = findNearestEnemy(unit);
		if (target) {
			var dx = target.x - unit.x;
			var dy = target.y - unit.y;
			var distance = Math.sqrt(dx * dx + dy * dy);
			if (distance > 100) {
				unit.moveToward(target.x, target.y);
			} else if (battleTimer % 60 === 0) {
				// Attack once per second
				var damage = unit.damage;
				// Check if War Economy law is active
				for (var j = 0; j < activeLaws.length; j++) {
					if (activeLaws[j].name === 'War Economy') {
						damage = Math.floor(damage * 1.5);
						break;
					}
					// Apply AI-generated law damage boosts
					if (activeLaws[j].isAIGenerated && activeLaws[j].damageBoost > 1) {
						damage = Math.floor(damage * activeLaws[j].damageBoost);
					}
				}
				var killed = target.takeDamage(damage);
				if (killed) {
					var targetIndex = enemyUnits.indexOf(target);
					if (targetIndex !== -1) {
						enemyUnits[targetIndex].destroy();
						enemyUnits.splice(targetIndex, 1);
						money += 25; // Reward for killing enemy
						updateMoney();
					}
				}
			}
		}
	}
	// Move and attack enemy units
	for (var i = enemyUnits.length - 1; i >= 0; i--) {
		var unit = enemyUnits[i];
		var target = findNearestEnemy(unit);
		if (target) {
			var dx = target.x - unit.x;
			var dy = target.y - unit.y;
			var distance = Math.sqrt(dx * dx + dy * dy);
			if (distance > 100) {
				unit.moveToward(target.x, target.y);
			} else if (battleTimer % 60 === 0) {
				// Attack once per second
				var killed = target.takeDamage(unit.damage);
				if (killed) {
					var targetIndex = playerUnits.indexOf(target);
					if (targetIndex !== -1) {
						playerUnits[targetIndex].destroy();
						playerUnits.splice(targetIndex, 1);
					}
				}
			}
		}
	}
	// Check battle end conditions
	if (enemyUnits.length === 0) {
		// Player won
		gameState = 'menu';
		waveNumber++;
		waveText.setText('Wave: ' + waveNumber);
		money += 100 * waveNumber; // Wave completion bonus
		updateMoney();
	} else if (playerUnits.length === 0) {
		// Player lost
		LK.showGameOver();
	}
}
// Event handlers
infantryButton.down = function () {
	buyUnit('infantry');
};
cavalryButton.down = function () {
	buyUnit('cavalry');
};
artilleryButton.down = function () {
	buyUnit('artillery');
};
startBattleButton.down = function () {
	if (gameState === 'menu') {
		startBattle();
	}
};
// Law button handlers
for (var i = 0; i < lawButtons.length; i++) {
	lawButtons[i].down = function (index) {
		return function () {
			enactLaw(index);
		};
	}(i);
}
// Main game update loop
game.update = function () {
	if (gameState === 'battle') {
		battleTimer++;
		updateBattle();
	}
	// Passive income every 3 seconds
	if (LK.ticks % 180 === 0) {
		var income = 50;
		// Check if Trade Agreements law is active
		for (var i = 0; i < activeLaws.length; i++) {
			if (activeLaws[i].name === 'Trade Agreements') {
				income *= 2;
				break;
			}
			// Apply AI-generated law income boosts
			if (activeLaws[i].isAIGenerated && activeLaws[i].incomeBoost > 1) {
				income = Math.floor(income * activeLaws[i].incomeBoost);
			}
		}
		money += income;
		updateMoney();
	}
	// Trigger random events
	triggerRandomEvent();
	// Update law button states
	updateLawButtons();
	// Check for bankruptcy
	if (money < 0) {
		LK.showGameOver();
	}
};