User prompt
accuracy upgrades should increase accuracy by 4 instead of 2
User prompt
start the tanks accuracy at 80%
User prompt
there's a duplicate mention of the tanks accuracy, delete the duplicate mentions
User prompt
both tanks needs to start with their accuracy at 80%
User prompt
hp upgrades should increase health by 20 instead of 10
User prompt
health upgrades should only increase hp by 10 instead of 20
User prompt
change the text that says HP to say Health instead
User prompt
the sound that should play when upgrading the HP no longer plays. fix this
User prompt
change the stat terminology from HP to Health
User prompt
when the button that upgrades the maximum damage is pressed, play the Upg_Dmg_Max sound
User prompt
when the button that upgrades the minimum damage is pressed, play the Upg_Dmg_Min sound
User prompt
when the button that upgrades the Accuracy is pressed, play the Upg_Acc sound
User prompt
when the button that upgrades the HP is pressed, play the Upg_HP sound
User prompt
there's a bug with the round text, as it increases by 2 instead of just 1
Code edit (4 edits merged)
Please save this source code
User prompt
the text for the round has duplicate mentions, remove this redundant part of the code "var roundText = new Text2('Round: ' + gameState.currentRound.toString(), { size: 100, fill: "#ffffff", stroke: "#000000", strokeThickness: 15, anchorX: 0.5, anchorY: 0.5, align: "center", x: 2048 / 2 - 200, y: 2732 / 2 });"
User prompt
center the text for the roudn tio the center of the screen
User prompt
there's duplicate information for the score text "var roundText = new Text2('Round: ' + gameState.currentRound.toString(), { size: 100, fill: "#ffffff", stroke: "#000000", strokeThickness: 15, anchorX: 0.5, anchorY: 0.5, align: "center", x: 2048 / 2 - 200, y: 2732 / 2 }); foregroundContainer.addChild(roundText); roundText.x = 2048 / 2 - 200; roundText.y = 2732 / 2; var statTextProperties = { size: 60, fill: "#ffffff", stroke: "#000000", strokeThickness: 10, width: 400, align: "center" };" remove the duplicates
Code edit (1 edits merged)
Please save this source code
User prompt
move the text showing the round 100 pixels to the left
/****
* Classes
****/
// BackgroundContainer class to handle background elements
var BackgroundContainer = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('gameBackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2,
width: 2048,
height: 2732
});
return self;
});
var EnemyBullet = Container.expand(function (shooter, target) {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 50;
self.shooter = shooter;
self.target = target;
self._move_migrated = function () {
var dx = self.target.x - self.shooter.x;
var dy = self.target.y - self.shooter.y;
var distance = Math.sqrt(dx * dx + dy * dy);
self.x += self.speed * dx / distance;
self.y += self.speed * dy / distance;
};
});
// ForegroundContainer class to handle foreground elements
var ForegroundContainer = Container.expand(function () {
var self = Container.call(this);
// Add foreground elements here
return self;
});
// ForegroundContainer class to handle foreground elements
// MidgroundContainer class to handle midground elements
var MidgroundContainer = Container.expand(function () {
var self = Container.call(this);
// Add midground elements here
return self;
});
var Platform = Container.expand(function () {
var self = Container.call(this);
var platformGraphics = self.attachAsset('Platform', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var Platform_Enemy = Container.expand(function () {
var self = Container.call(this);
var platformGraphics = self.attachAsset('Platform_Enemy', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
// Projectile class
var Projectile = Container.expand(function (shooter, target) {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 50;
self.shooter = shooter;
self.target = target;
self._move_migrated = function () {
var dx = self.target.x - self.shooter.x;
var dy = self.target.y - self.shooter.y;
var distance = Math.sqrt(dx * dx + dy * dy);
self.x += self.speed * dx / distance;
self.y += self.speed * dy / distance;
};
});
// Assets will be automatically generated based on usage in the code.
// Tank class
var Tank = Container.expand(function (isEnemy) {
var self = Container.call(this);
this.isEnemy = isEnemy || false;
self.baseHP = 100; // Base health points of the tank
self.HP = self.baseHP; // Current health points of the tank
self.Accuracy = 0.90; // Accuracy of the tank's shots
self.minDmg = 10; // Minimum damage the tank can inflict
self.maxDmg = 20; // Maximum damage the tank can inflict
self.isEnemy = self.isEnemy ? true : false;
var tankGraphics = self.attachAsset(self.isEnemy ? 'enemyTank' : 'tank', {
anchorX: 0.5,
anchorY: 0.5
});
self.direction = self.isEnemy ? 2 : 0; // 0: up, 1: right, 2: down, 3: left
self.shoot = function (targetTank) {
// Calculate damage based on minDmg and maxDmg
var damage = Math.floor(Math.random() * (self.maxDmg - self.minDmg + 1)) + self.minDmg;
// Simulate accuracy
var hit = Math.random() < self.Accuracy;
if (hit) {
LK.getSound('Shoot_Player').play();
// Apply damage to targetTank.HP
targetTank.HP -= damage;
gameState.isAnimating = true;
}
};
});
// TankStatsHUD class for displaying tank stats
var TankStatsHUD = Container.expand(function (x, y, tank) {
var self = Container.call(this);
self.x = x;
self.y = y;
self.tank = tank;
// Initialize HUD texts as properties to avoid redundancy
// Initialize HUD texts as properties to avoid redundancy
// Helper function to create HUD text elements
function createHUDTextElement() {
return self.addChild(new Text2('', {
size: statTextProperties.size,
fill: statTextProperties.fill,
stroke: statTextProperties.stroke,
strokeThickness: statTextProperties.strokeThickness,
width: statTextProperties.width,
align: statTextProperties.align
}));
}
self.hpText = createHUDTextElement();
self.accuracyText = createHUDTextElement();
self.minDmgText = createHUDTextElement();
self.maxDmgText = createHUDTextElement();
// Set initial positions
self.hpText.y = 0;
self.accuracyText.y = 130;
self.minDmgText.y = 260;
self.maxDmgText.y = 390;
// Consolidated method to update HUD with tank stats
self.updateHUD = function () {
// Update all stats in a single method to streamline HUD updates
self.hpText.setText("HP: ".concat(self.tank.HP));
self.accuracyText.setText("Accuracy: ".concat(Math.round(self.tank.Accuracy * 100), "%"));
self.minDmgText.setText("Min Dmg: ".concat(self.tank.minDmg));
self.maxDmgText.setText("Max Dmg: ".concat(self.tank.maxDmg));
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 // Init game with black background
});
/****
* Game Code
****/
// Define roundText for displaying current round
function _typeof(o) {
"@babel/helpers - typeof";
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
return typeof o;
} : function (o) {
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
}, _typeof(o);
}
function _defineProperty(e, r, t) {
return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
value: t,
enumerable: !0,
configurable: !0,
writable: !0
}) : e[r] = t, e;
}
function _toPropertyKey(t) {
var i = _toPrimitive(t, "string");
return "symbol" == _typeof(i) ? i : i + "";
}
function _toPrimitive(t, r) {
if ("object" != _typeof(t) || !t) {
return t;
}
var e = t[Symbol.toPrimitive];
if (void 0 !== e) {
var i = e.call(t, r || "default");
if ("object" != _typeof(i)) {
return i;
}
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return ("string" === r ? String : Number)(t);
}
// Initialize gameState before defining roundText
var backgroundContainer = new BackgroundContainer();
var midgroundContainer = new MidgroundContainer();
var platform = new Platform();
platform.x = 2048 / 2;
platform.y = 2732 / 2 + 1050;
midgroundContainer.addChild(platform);
var platformEnemy = new Platform_Enemy();
platformEnemy.x = 2048 / 2;
platformEnemy.y = 2732 / 2 - 1050;
midgroundContainer.addChild(platformEnemy);
var foregroundContainer = new ForegroundContainer();
game.addChild(backgroundContainer);
game.addChild(midgroundContainer);
game.addChild(foregroundContainer);
var gameState = {
currentRound: 1,
tanks: [] // Initialize tanks as an empty array
// other gameState properties
};
var roundText = new Text2('Round: ' + gameState.currentRound.toString(), {
size: 60,
fill: "#ffffff",
stroke: "#000000",
strokeThickness: 10,
anchorX: 0.5,
anchorY: 0.5,
align: "center",
x: 2048 / 2 - 100,
y: 2732 / 2
});
foregroundContainer.addChild(roundText);
roundText.x = 2048 / 2 - 100;
roundText.y = 2732 / 2;
var statTextProperties = {
size: 60,
fill: "#ffffff",
stroke: "#000000",
strokeThickness: 10,
width: 400,
align: "left"
};
// Define a single source of truth for stat upgrades
var statUpgrades = {
'HP': 20,
// Match player's tank upgrade value
'Accuracy': 0.02,
// Match player's tank upgrade value
'MinDmg': 5,
// Match player's tank upgrade value
'MaxDmg': 5 // Match player's tank upgrade value
};
function applyStatUpgrade(selectedUpgrade, tank) {
if (statUpgrades.hasOwnProperty(selectedUpgrade)) {
var upgradeValue = statUpgrades[selectedUpgrade];
switch (selectedUpgrade) {
case 'HP':
tank.baseHP += upgradeValue;
tank.HP += upgradeValue; // Increase current HP by upgradeValue instead of setting it to new baseHP
break;
case 'Accuracy':
tank.Accuracy = Math.min(1.0, tank.Accuracy + upgradeValue);
break;
case 'MinDmg':
tank.minDmg += upgradeValue;
break;
case 'MaxDmg':
tank.maxDmg += upgradeValue;
break;
}
}
// Listen for stat change events to dynamically update available upgrades and refresh upgrade buttons
game.on('statChange', function (tank) {
gameState.upgradesAvailable = allUpgrades.filter(function (upgrade) {
if (upgrade === 'Accuracy' && tank.Accuracy >= 1.0) {
return false; // Exclude Accuracy if it's already at or above 100%
}
if (upgrade === 'MinDmg' && tank.minDmg >= tank.maxDmg) {
return false; // Exclude MinDmg if it's equal to or greater than MaxDmg
}
if (upgrade === 'MaxDmg' && tank.maxDmg <= tank.minDmg) {
return false; // Exclude MaxDmg if it's not greater than MinDmg
}
return true; // Include all other upgrades
});
handleUpgradesAndButtons(); // Refresh upgrade buttons based on updated available upgrades
});
}
// This function now applies to both player and enemy tanks using the same stat upgrades
// Consolidated upgrade logic into a single function for clarity and maintainability
function applyUpgrades(tank) {
// Consolidated upgrade logic into a single function for clarity and maintainability
// This function now applies to both player and enemy tanks using the same stat upgrades
// Dynamically update and manage upgrade button visibility within this function
gameState.upgradesAvailable.forEach(function (upgrade) {
applyStatUpgrade(upgrade, tank);
});
// Refresh upgrade buttons to reflect current game state and available upgrades
handleUpgradesAndButtons();
}
// Consolidated function to handle upgrades and dynamically create buttons
function handleUpgradesAndButtons() {
// Remove existing upgrade buttons before creating new ones
game.children.forEach(function (child) {
if (child.id && child.id.startsWith('Upgrade_')) {
child.destroy();
}
});
LK.getSound('Upgrade_Screen').play();
// Updated to check and update upgrade button visibility based on tank stats
// Emit statChange event whenever a stat is upgraded
game.emit('statChange', tank);
gameState.upgradesAvailable = allUpgrades.filter(function (upgrade) {
if (upgrade === 'Accuracy' && gameState.playerTank.Accuracy >= 1.0) {
return false; // Exclude Accuracy if it's already at or above 100%
}
if (upgrade === 'MinDmg') {
return gameState.playerTank.minDmg < gameState.playerTank.maxDmg;
}
// After MaxDmg upgrade, check if MinDmg upgrade should be visible
if (upgrade === 'MaxDmg') {
// After MaxDmg upgrade, check if MinDmg upgrade should be visible
if (gameState.playerTank.minDmg < gameState.playerTank.maxDmg) {
// Ensure MinDmg upgrade button is visible if conditions are met
if (!gameState.upgradesAvailable.includes('MinDmg')) {
gameState.upgradesAvailable.push('MinDmg');
}
}
}
return true; // Include all other upgrades
}).forEach(function (upgrade, index) {
var upgradeBtn = new Container();
var btnGraphics = upgradeBtn.attachAsset('Upgrade_Btn', {
anchorX: 0.5,
anchorY: 0.5
});
// Positioning and event listener for upgradeBtn omitted for brevity
game.addChild(upgradeBtn);
});
}
// Helper function to select a random upgrade for the enemy
function selectRandomUpgrade(tank) {
var validUpgrades = gameState.upgradesAvailable.filter(function (upgrade) {
// Example condition to filter out upgrades, can be expanded
return !(upgrade === 'Accuracy' && tank.Accuracy >= 1.0);
});
var randomIndex = Math.floor(Math.random() * validUpgrades.length);
return validUpgrades[randomIndex];
}
// Initialize gameState before defining tanks to avoid 'currentRound' being undefined
// Redundant upgrade text display code successfully removed
// Function to reset game state for a new round
function resetGameStateForNewRound() {
// Select a single random upgrade for the enemy ensuring only one stat is upgraded per round
function selectSingleRandomUpgradeForEnemy() {
// Ensure only one stat is upgraded per round
if (gameState.currentRound === gameState.lastUpgradedRound) {
return;
} // Exit if upgrade already applied this round
var validUpgrades = Object.keys(statUpgrades).filter(function (upgrade) {
// Conditions to filter out maximized stats
if (upgrade === 'Accuracy' && gameState.enemyTank.Accuracy >= 1.0) {
return false;
}
if (upgrade === 'HP' && gameState.enemyTank.HP >= gameState.enemyTank.baseHP) {
return false;
}
if (upgrade === 'MinDmg' && (gameState.enemyTank.minDmg >= gameState.enemyTank.maxDmg - 5 || gameState.enemyTank.minDmg === gameState.enemyTank.maxDmg)) {
return false;
}
if (upgrade === 'MaxDmg' && (gameState.enemyTank.maxDmg >= 50 || gameState.enemyTank.minDmg === gameState.enemyTank.maxDmg)) {
return false;
}
return true;
});
if (validUpgrades.length > 0) {
var randomUpgrade = validUpgrades[Math.floor(Math.random() * validUpgrades.length)];
applyStatUpgrade(randomUpgrade, gameState.enemyTank);
gameState.lastUpgradedRound = gameState.currentRound; // Mark this round as upgraded
}
}
// Reset the flag to false at the end of the round to allow for a single upgrade in the next round
gameState.playerTurn = true; // Give the turn back to the player
gameState.roundIncremented = false; // Reset the round increment flag
gameState.isAnimating = false; // Ensure no animations are running
// Define startingHP for both tanks to ensure it's available for resetting
// Clear all bullets from the previous round to prevent applying damage from the last bullet
bullets.forEach(function (bullet) {
bullet.destroy();
});
bullets = [];
// Reset both tanks' HP to their baseHP at the beginning of a new round
gameState.playerTank.HP = gameState.playerTank.baseHP;
gameState.enemyTank.HP = gameState.enemyTank.baseHP;
// Update both player and enemy HUDs to reflect the reset state
playerTankHUD.updateHUD();
enemyTankHUD.updateHUD();
}
// Consolidated function for damage calculation and text display
function calculateDamage(shooter, target) {
var hit = Math.random() < shooter.Accuracy;
if (hit) {
var damage = Math.floor(Math.random() * (shooter.maxDmg - shooter.minDmg + 1)) + shooter.minDmg;
target.HP = Math.max(0, target.HP - damage);
// Initiate shake effect
var originalX = target.x;
var originalY = target.y;
var shakeDuration = 200; // Duration in milliseconds
var shakeStartTime = Date.now();
var shake = function shake() {
if (Date.now() - shakeStartTime < shakeDuration) {
// Randomly adjust target's position to simulate stronger shaking
target.x = originalX + Math.random() * 20 - 10; // Shake range -10 to 10 pixels on x-axis
target.y = originalY + Math.random() * 20 - 10; // Shake range -10 to 10 pixels on y-axis
LK.setTimeout(shake, 16); // Approximately 60 frames per second
} else {
// Reset target's position after shaking
target.x = originalX;
target.y = originalY;
}
};
shake();
displayDamageText(damage, target.x, target.y);
if (target === gameState.playerTank) {
playerTankHUD.updateHUD();
}
return true;
} else {
displayMissIndicator(target.x, target.y);
return false;
}
}
// Helper function to display damage text
function displayDamageText(damage, x, y) {
var damageText = new Text2(damage.toString(), {
size: 150,
// Increased size from 120 to 180
fill: "#ff0000",
stroke: "#000000",
strokeThickness: 15,
anchorX: 0.5,
anchorY: 0.5
});
damageText.position.set(x - 80, y - 80);
game.addChild(damageText);
LK.setTimeout(function () {
return damageText.destroy();
}, 600);
}
// Helper function to display miss indicator
function displayMissIndicator(x, y) {
var missIndicator = LK.getAsset('miss', {
anchorX: 0.5,
anchorY: 0.5,
x: x,
y: y
});
game.addChild(missIndicator);
LK.setTimeout(function () {
return missIndicator.destroy();
}, 1000);
}
// Define triggerPlayerShoot function globally to ensure it's accessible throughout the script
function triggerPlayerShoot() {
LK.getSound('Shoot_Player').play();
var projectile = new Projectile(playerTank, enemyTank);
projectile.x = playerTank.x;
projectile.y = playerTank.y - 150; // Positioning logic for shooting upwards
game.addChild(projectile);
bullets.push(projectile);
gameState.isAnimating = true; // Indicate an action is taking place, requiring animation.
}
// Define triggerEnemyShoot function globally to ensure it's accessible throughout the script
// Define triggerEnemyShoot function globally to ensure it's accessible throughout the script
function triggerEnemyShoot() {
LK.getSound('Shoot_Enemy').play();
var enemyProjectile = new EnemyBullet(gameState.enemyTank, gameState.playerTank);
enemyProjectile.x = gameState.enemyTank.x;
enemyProjectile.y = gameState.enemyTank.y + 100; // Adjusted positioning for enemy shooting logic
game.addChild(enemyProjectile);
bullets.push(enemyProjectile);
gameState.isAnimating = true; // Ensure this is set to true to prevent immediate subsequent actions
}
// Initialize gameState with unique identifiers to prevent global scope conflicts
var allUpgrades = ['HP', 'Accuracy', 'MinDmg', 'MaxDmg'];
// Define shootingInterval in the global scope to manage shooting intervals
var shootingInterval = null;
// Define bullets array in the global scope for easy access and manipulation
var bullets = [];
// Initialize player and enemy tanks within the gameState to ensure a single source of truth
gameState.playerTank = new Tank(false); // Player's tank
gameState.enemyTank = new Tank(true); // Enemy's tank
// Initialize player tank
var playerTank = new Tank(false); // Player's tank
playerTank.x = 1024; // Center horizontally
playerTank.y = 2732 - 300; // Moved 100 pixels higher
gameState.playerTank = playerTank; // Assign playerTank to gameState
game.addChild(gameState.playerTank);
gameState.tanks.push(gameState.playerTank);
game.addChild(gameState.playerTank);
gameState.tanks.push(gameState.playerTank);
// Initialize enemy tank
var enemyTank = new Tank(true); // Enemy's tank
enemyTank.x = 1024; // Center horizontally
enemyTank.y = 300; // Moved 100 pixels lower
gameState.enemyTank = enemyTank; // Assign enemyTank to gameState
game.addChild(gameState.enemyTank);
gameState.tanks.push(gameState.enemyTank);
game.addChild(gameState.enemyTank);
gameState.tanks.push(gameState.enemyTank);
// Instantiate TankStatsHUD for the player tank
var playerTankHUD = new TankStatsHUD(-600, -515, gameState.playerTank); // Center above the player tank
LK.gui.bottom.addChild(playerTankHUD);
// Instantiate TankStatsHUD for the enemy tank and ensure it's visible from the start
var enemyTankHUD = new TankStatsHUD(-600, +50, gameState.enemyTank); // Position at the top of the screen
enemyTankHUD.updateHUD(); // Update HUD to make it visible from the start
LK.gui.top.addChild(enemyTankHUD);
// Handle touch events to rotate and move the tank
// Removed tank rotation on screen tap
// Define a function to manage the shooting interval
function manageShootingInterval(action) {
if (action === 'start') {
// Clear existing interval if any
if (shootingInterval) {
manageShootingInterval('stop'); // Use the dedicated function to stop shooting
}
// Start a new shooting interval
shootingInterval = LK.setInterval(function () {
if (gameState.isAnimating || gameState.playerTank.HP <= 0 || gameState.enemyTank.HP <= 0) {
return; // Prevent firing if any condition is met.
}
if (gameState.currentRound === 1 || gameState.playerTurn) {
triggerPlayerShoot();
} else {
triggerEnemyShoot();
}
}, 1000);
} else if (action === 'stop') {
// Clear the shooting interval
if (shootingInterval) {
LK.clearInterval(shootingInterval);
}
}
}
// Initially start the shooting interval
manageShootingInterval('start');
// Move bullets
LK.on('tick', function () {
// Implement a pre-check at the beginning of this function to halt actions if a tank's HP is 0.
if (gameState.playerTank.HP <= 0 || gameState.enemyTank.HP <= 0) {
// Consider implementing logic here to pause the game and trigger any end-of-round or game over logic.
gameState.isAnimating = false; // Halt animations.
return; // Exit the tick function early.
}
playerTankHUD.updateHUD();
var _loop = function _loop() {
if (bullets[i]) {
bullets[i]._move_migrated();
}
// Check for collision with tanks
if (bullets[i].intersects(playerTank) && bullets[i] instanceof EnemyBullet) {
// Correctly identify shooter as enemyTank and target as playerTank for damage calculation
if (calculateDamage(enemyTank, playerTank)) {
// Ensure enemyTank is the shooter and playerTank is the target
playerTankHUD.updateHUD(); // Update player tank HUD stats
// Check if either tank's HP reaches 0 to pause game and show upgrades
if (playerTank.HP === 0) {
gameState.isPaused = true; // Stop all actions immediately
LK.clearInterval(shootingInterval); // Stop shooting immediately
game.off('down'); // Disable movement immediately
LK.showGameOver(); // End game if player tank HP drops to 0
} else if (enemyTank.HP === 0) {
// Delay pausing the game until after the bullet is destroyed
bullets[i].destroy(); // Remove bullet from game
bullets.splice(i, 1); // Remove bullet from bullets array
gameState.isPaused = true; // Stop all actions immediately
LK.clearInterval(shootingInterval); // Stop shooting immediately
game.off('down'); // Disable movement immediately
LK.setTimeout(showUpgradeOptions, 100); // Delay showing upgrade options to ensure bullet is removed
}
}
bullets[i].destroy(); // Remove bullet from game
bullets.splice(i, 1); // Remove bullet from bullets array
gameState.playerTurn = true; // Switch turn to player
gameState.isAnimating = false; // End animation state
return {
v: void 0
}; // Exit the loop
} else if (bullets[i].intersects(enemyTank) && bullets[i] instanceof Projectile) {
// Invoke calculateDamage for player bullet hitting enemy tank
if (calculateDamage(gameState.playerTank, enemyTank)) {
enemyTankHUD.updateHUD(); // Refresh enemy tank HUD stats
if (enemyTank.HP === 0) {
LK.getSound('Upgrade_Screen').play(); // Play Upgrade_Screen sound when enemy tank reaches 0 HP
// Set game state to paused
gameState.isPaused = true;
// Clear shooting interval to pause shooting
LK.clearInterval(shootingInterval);
// Disable movement by removing event listeners
game.off('down');
// Display upgrade options for the player to select
// Initialize upgrade buttons for player selection
// Dynamically update the list of available upgrades based on current tank stats
// After applying the upgrade, update the player and enemy tank HUD to reflect changes
playerTankHUD.updateHUD();
enemyTankHUD.updateHUD();
// Filter upgrades based on new stats
gameState.upgradesAvailable = allUpgrades.filter(function (upgrade) {
if (upgrade === 'Accuracy' && gameState.playerTank.Accuracy >= 1.0) {
return false; // Exclude Accuracy if it's already at or above 100%
}
if (upgrade === 'MinDmg' && gameState.playerTank.minDmg >= gameState.playerTank.maxDmg) {
return false; // Exclude MinDmg if it's equal to or greater than MaxDmg
}
return true; // Include all other upgrades
});
// Iterate over the filtered list of upgrades to display upgrade buttons
// Define individual positions for each upgrade button
var upgradePositions = {
'HP': {
x: 80,
y: 2040
},
'Accuracy': {
x: 80,
y: 2225
},
'MinDmg': {
x: 80,
y: 2410
},
'MaxDmg': {
x: 80,
y: 2595
}
};
gameState.upgradesAvailable.forEach(function (upgrade) {
var pos = upgradePositions[upgrade];
var upgradeBtn = LK.getAsset('Upgrade_Btn', {
x: pos.x,
y: pos.y,
anchorX: 0.5,
anchorY: 0.5,
id: 'Upgrade_' + upgrade
});
upgradeBtn.on('down', function () {
LK.getSound('Upgrade_Btn').play(); // Play Upgrade_Btn sound when any upgrade button is pressed
gameState.playerSelectedUpgrade = upgrade;
applyStatUpgrade(gameState.playerSelectedUpgrade, gameState.playerTank);
var filteredUpgrades = gameState.upgradesAvailable.filter(function (upgrade) {
return !(upgrade === 'Accuracy' && gameState.enemyTank.Accuracy >= 1.0);
});
var randomUpgradeIndex = Math.floor(Math.random() * filteredUpgrades.length);
gameState.enemySelectedUpgrade = filteredUpgrades[randomUpgradeIndex];
applyStatUpgrade(gameState.enemySelectedUpgrade, gameState.enemyTank);
// Remove all upgrade buttons after selection
game.children = game.children.filter(function (child) {
return !child.id || !child.id.startsWith('Upgrade_');
});
manageShootingInterval('start');
gameState.isPaused = false;
gameState.playerTurn = true;
gameState.isAnimating = false;
gameState.currentRound += 1; // Increment the round number
roundText.setText('Round: ' + gameState.currentRound.toString()); // Update the round text
gameState.currentRound += 1; // Increment the round number
roundText.setText('Round: ' + gameState.currentRound.toString()); // Update the round text
resetGameStateForNewRound();
});
game.addChild(upgradeBtn);
});
// Ensure round management is correctly handled at the end of each round
if (!gameState.isAnimating && gameState.playerTank.HP > 0 && gameState.enemyTank.HP > 0) {
manageGameRound(); // Correctly increment and manage round transitions only when conditions are met
}
return {
v: void 0
}; // Exit the loop to avoid executing further code in this tick
}
}
bullets[i].destroy();
bullets.splice(i, 1);
gameState.playerTurn = false; // Switch to enemy's turn after player bullet hits
triggerEnemyShoot(); // Trigger enemy to shoot immediately after player's bullet hits
return {
v: void 0
};
}
// Remove bullets that go off-screen
if (bullets[i].y < 0) {
bullets[i].destroy();
bullets.splice(i, 1);
// gameState.isAnimating = false; // Moved to a more appropriate location after enemy's turn
gameState.playerTurn = !gameState.playerTurn;
// Reset gameState.isAnimating to false after ensuring all animations and hit calculations are complete
if (!gameState.playerTurn) {
LK.setTimeout(function () {
gameState.isAnimating = false;
}, 1000); // Assuming 1 second is enough for the enemy's bullet to reach the player or go off-screen
}
}
},
_ret;
for (var i = bullets.length - 1; i >= 0; i--) {
_ret = _loop();
if (_ret) {
return _ret.v;
}
}
});
function showUpgradeOptions() {
LK.getSound('Upgrade_Screen').play();
// Display upgrade options for the player to select
gameState.upgradesAvailable.forEach(function (upgrade, index) {
// Removed incorrect positioning logic for upgrade buttons to ensure they appear correctly relative to their corresponding stats
upgradeBtn.on('down', function () {
gameState.playerSelectedUpgrade = upgrade;
// Define applyPlayerUpgrade function to apply the selected upgrade to the player's tank
function applyPlayerUpgrade() {
applyStatUpgrade(gameState.playerSelectedUpgrade, gameState.playerTank);
// Directly call handleUpgradesAndButtons to update upgrade button visibility based on stat changes
handleUpgradesAndButtons();
// Listen for stat change events to dynamically update available upgrades and refresh upgrade buttons
game.on('statChange', function (tank) {
gameState.upgradesAvailable = allUpgrades.filter(function (upgrade) {
if (upgrade === 'Accuracy' && tank.Accuracy >= 1.0) {
return false; // Exclude Accuracy if it's already at or above 100%
}
if (upgrade === 'MinDmg' && tank.minDmg >= tank.maxDmg) {
return false; // Exclude MinDmg if it's equal to or greater than MaxDmg
}
if (upgrade === 'MaxDmg' && tank.maxDmg <= tank.minDmg) {
return false; // Exclude MaxDmg if it's not greater than MinDmg
}
return true; // Include all other upgrades
});
handleUpgradesAndButtons(); // Refresh upgrade buttons based on updated available upgrades
});
}
// Dynamically create upgrade buttons based on updated available upgrades
gameState.upgradesAvailable.forEach(function (upgrade, index) {
var upgradeBtn = LK.getAsset('Upgrade_Btn', {
// Correct positioning logic will be applied elsewhere
id: 'Upgrade_' + upgrade // Assign a unique ID based on the upgrade type
});
upgradeBtn.on('down', function () {
gameState.playerSelectedUpgrade = upgrade;
applyStatUpgrade(gameState.playerSelectedUpgrade, gameState.playerTank);
// Filter out Accuracy upgrade if enemy's Accuracy is already at 100%, then randomly select and apply an upgrade
var filteredUpgrades = gameState.upgradesAvailable.filter(function (upgrade) {
return !(upgrade === 'Accuracy' && gameState.enemyTank.Accuracy >= 1.0);
});
var randomUpgradeIndex = Math.floor(Math.random() * filteredUpgrades.length);
gameState.enemySelectedUpgrade = filteredUpgrades[randomUpgradeIndex];
applyStatUpgrade(gameState.enemySelectedUpgrade, gameState.enemyTank);
// Hide all upgrade buttons and texts
game.children.forEach(function (child) {
if (child.id && child.id.startsWith('Upgrade_')) {
child.destroy();
}
});
// Restart shooting interval after upgrade selection using the dedicated function
manageShootingInterval('start');
// Resume game after upgrade selection
gameState.isPaused = false;
// Ensure Game State is Correctly Managed
gameState.playerTurn = true; // It's player's turn after selecting an upgrade
gameState.isAnimating = false; // No animations are running at the start of a new round
resetGameStateForNewRound();
});
game.addChild(upgradeBtn);
var upgradeText = new Text2(upgrade, {
size: 40,
fill: "#000000",
x: upgradeBtn.x,
y: upgradeBtn.y,
anchorX: 0.5,
anchorY: 0.5,
id: 'Upgrade_Text_' + upgrade // Assign a unique ID for the text based on the upgrade type
});
game.addChild(upgradeText);
});
// Resume game after upgrade selection
gameState.isPaused = false; // Allow game actions to continue
// Clear existing shooting interval before setting a new one
if (shootingInterval) {
LK.clearInterval(shootingInterval);
}
// Set up a new shooting interval
shootingInterval = LK.setInterval(function () {
if (!gameState.isPaused) {
if (gameState.playerTurn) {
triggerPlayerShoot();
} else {
triggerEnemyShoot();
}
}
}, 1000); // Adjust timing as necessary
// Re-attach event listeners for player movement and actions
game.on('down', function (x, y, obj) {
// Movement and action logic here, ensuring it only executes when the game is not paused
});
resetGameStateForNewRound(); // Reset the game state for a new round
gameState.playerTurn = true; // Player starts shooting after selecting an upgrade
});
game.addChild(upgradeBtn);
var upgradeText = new Text2(upgrade, {
size: 40,
fill: "#000000",
x: upgradeBtn.x,
y: upgradeBtn.y,
anchorX: 0.5,
anchorY: 0.5
});
game.addChild(upgradeText);
});
function applyRandomUpgradeToEnemy() {
var filteredUpgrades = gameState.upgradesAvailable.filter(function (upgrade) {
return !(upgrade === 'Accuracy' && gameState.enemyTank.Accuracy >= 1.0);
});
var randomUpgrade = filteredUpgrades[Math.floor(Math.random() * filteredUpgrades.length)];
applyStatUpgrade(randomUpgrade, gameState.enemyTank);
}
// Define roundText for displaying current round
var roundText = new Text2('Round: ' + gameState.currentRound.toString(), {
size: 60,
fill: "#ffffff",
stroke: "#000000",
strokeThickness: 10,
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
foregroundContainer.addChild(roundText);
// Ensure round management is handled in a single function to prevent multiple increments
function manageGameRound() {
if (!gameState.roundIncremented) {
gameState.currentRound += 1; // Increment the current round number
gameState.roundIncremented = true; // Ensure round is only incremented once per logical game round
}
roundText.setText('Round: ' + gameState.currentRound.toString()); // Update the round text to display the new round number
LK.effects.flashScreen(0x00FF00, 500); // Flash the screen green to indicate round advancement
}
// Call manageGameRound() where necessary instead of directly manipulating gameState.currentRound
}
; // Display upgrade options for the player to select
blue upgrade button with a "+" sign on it. pixelated. 8 bit. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
dragon shaped firing turret. top-down bird-eye perspective seen directly from above. 8-bit pixelated. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
dragon shaped firing turret. top-down bird-eye perspective seen directly from above. 8-bit pixelated. blue soft-palette colored. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
chunky frost magical projectile. 8-bit pixelated. blue soft-palette colored. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
top-down bird-eye view perspective off a magical land, divided into two distinct elements of magma and ice. 8-bit pixelated. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
isometric stone wall platform. top-down bird-eye view perspective. 8-bit pixelated. grey soft-color palette.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.