User prompt
show final score if lose to be saved in scorebackground. ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
show the win with final score to be saved on scorebackround ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
save high scores of the logged in players to be appeared in the score background. ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
save the recent scores from last gameplay then update in scorebackground ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Add score of the recent gameplay always on the scorebackground ↪💡 Consider importing and using the following plugins: @upit/storage.v1
Code edit (1 edits merged)
Please save this source code
User prompt
Add 'high score :' text before 300 from the top screen and show the scores for the recent gameplaying below it. ↪💡 Consider importing and using the following plugins: @upit/storage.v1
Code edit (6 edits merged)
Please save this source code
User prompt
startbutton is showing after the scorebackground! and add close button to scorebackground, and option of tap to close
User prompt
add scorebackground to the game when scorebutton is clicked show it.
User prompt
Please fix the bug: 'Uncaught TypeError: LK.showLeaderboard is not a function' in or related to this line: 'LK.showLeaderboard();' Line Number: 1258
User prompt
do more spacing like 50/50 from the middle between start button & score button !!
User prompt
Add Scorebutton beside Startbutton in the intro but make the middle of the screen between it.
User prompt
Add Scorebutton beside Startbutton in the intro but make the middle of the screen between it.
Code edit (1 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
User prompt
the health bar new position is in the top left side not on the right so check and reposition its text again.
User prompt
center the healthbar text in the middle of its 4 edges
User prompt
let the health regenerated each time reaching 1000 score.
User prompt
maxed the health only per time when reach 1000 score don't keep it full so it can be decreased by respawning assets and when they pass top screen!
User prompt
the text is not in the middle of the bar move it to its middle
User prompt
move it to the middle of the healthbar
User prompt
decrease the health bar in level3 to decrease the text its not working!
User prompt
Fix the health text not decreasing in level3!
User prompt
fix it in other levels 3 4 5 to be decreased by touch dragon and by passing top edges of the screen
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var AirBlock = Container.expand(function () { var self = Container.call(this); var airBlockGraphics = self.attachAsset('AirBlockAsset', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.0, scaleY: 1.0, smooth: true, filterQuality: 1 }); self.speed = level === 5 ? 18 : 12; // Increased speed for AirBlocks in Level 5 self.update = function () { self.y -= self.speed; }; return self; }); //<Assets used in the game will automatically appear here> //<Write imports for supported plugins here> // Dragon class to represent the player character var Dragon = Container.expand(function () { var self = Container.call(this); // Function to get the appropriate dragon asset based on level self.getDragonAsset = function () { if (level === 2) { return 'Lavadragon'; } if (level === 3) { return 'Snowdragon'; } if (level === 4) { return 'Stonedragon'; } if (level === 5) { return 'Airdragon'; } return 'dragon'; // Default for level 1 }; var dragonGraphics = self.attachAsset(self.getDragonAsset(), { anchorX: 0.5, anchorY: 0.5, scaleX: 2.0, scaleY: 2.0, smooth: true, filterQuality: 2 }); self.speed = 20; // Further increase the speed of the dragon self.currentLevel = level; // Track current level for asset changes // Function to update dragon asset when level changes self.updateDragonAsset = function () { if (self.currentLevel !== level) { self.currentLevel = level; // Remove old graphics dragonGraphics.destroy(); // Create new graphics with appropriate asset dragonGraphics = self.attachAsset(self.getDragonAsset(), { anchorX: 0.5, anchorY: 0.5, scaleX: self.x < 2048 / 2 ? -2.0 : 2.0, scaleY: 2.0, smooth: true, filterQuality: 2 }); } }; self.update = function () { // Update dragon asset if level changed self.updateDragonAsset(); // Update logic for the dragon to flip based on movement direction if (self.x < 2048 / 2) { dragonGraphics.scaleX = -2.0; // Flip horizontally when on the left side of the screen } else { dragonGraphics.scaleX = 2.0; // Normal orientation when on the right side of the screen } // Removed unnecessary variable to optimize performance }; return self; }); var Explosion = Container.expand(function () { var self = Container.call(this); var explosionGraphics = self.attachAsset('explosion', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.0, scaleY: 1.0, smooth: true, filterQuality: 1 }); self.speed = 10; self.update = function () { self.y -= self.speed; }; return self; }); // Fireball class to represent the fireballs that the dragon shoots var Fireball = Container.expand(function (assetId) { var self = Container.call(this); var fireballGraphics = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5, scaleX: 0.6, scaleY: 0.9, smooth: true, filterQuality: 1 }); self.speed = 20; // Increase the speed of the fireballs self.update = function () { self.y += self.speed; }; }); // HealthBar class to represent the player's health var HealthBar = Container.expand(function () { var self = Container.call(this); var healthBarGraphics = self.attachAsset('healthBar', { anchorX: 0.0, anchorY: 0.0, scaleX: 2530 / 1000, // Scale to fit the game width scaleY: 0.1 }); self.maxHealth = 500; self.currentHealth = self.maxHealth; self.update = function () { healthBarGraphics.scaleX = self.currentHealth / self.maxHealth * (2530 / 1000); healthBarGraphics.scaleY = 0.05; // Resize the health bar to fit the top of the screen }; }); var Icerocks = Container.expand(function () { var self = Container.call(this); var icerocksGraphics = self.attachAsset('Icerocks', { anchorX: 0.5, anchorY: 0.5, scaleX: level === 3 ? 1.5 : 1.0, scaleY: level === 3 ? 1.5 : 1.0, smooth: true, filterQuality: 1 }); self.speed = level === 3 ? 15 : 5; // Further increase speed for level 3 self.update = function () { self.y -= self.speed; }; }); var Icerocks1 = Container.expand(function () { var self = Container.call(this); var icerocks1Graphics = self.attachAsset('Icerocks1', { anchorX: 0.5, anchorY: 0.5, scaleX: level === 3 ? 1.5 : 1.0, scaleY: level === 3 ? 1.5 : 1.0, smooth: true, filterQuality: 1 }); self.speed = level === 3 ? 15 : 5; // Further increase speed for level 3 self.update = function () { // Move the icerocks upwards self.y -= self.speed; }; }); var Icerocks2 = Container.expand(function () { var self = Container.call(this); var icerocks2Graphics = self.attachAsset('Icerocks2', { anchorX: 0.5, anchorY: 0.5, scaleX: level === 3 ? 1.5 : 1.0, scaleY: level === 3 ? 1.5 : 1.0, smooth: true, filterQuality: 1 }); self.speed = level === 3 ? 15 : 5; // Further increase speed for level 3 self.update = function () { // Move the icerocks upwards self.y -= self.speed; }; }); var Lavarocks = Container.expand(function () { var self = Container.call(this); var lavarocksGraphics = self.attachAsset('Lavarocks', { anchorX: 0.5, anchorY: 0.5, scaleX: level === 2 ? 1.5 : 1.0, scaleY: level === 2 ? 1.5 : 1.0, smooth: true, filterQuality: 1 }); self.speed = level === 2 ? 20 : 5; // Maximum increase speed for level 2 self.update = function () { self.y -= self.speed; }; }); var Lavarocks1 = Container.expand(function () { var self = Container.call(this); var lavarocks1Graphics = self.attachAsset('Lavarocks1', { anchorX: 0.5, anchorY: 0.5, scaleX: level === 2 ? 1.5 : 1.0, scaleY: level === 2 ? 1.5 : 1.0, smooth: true, filterQuality: 1 }); self.speed = level === 2 ? 20 : 5; // Maximum increase speed for level 2 self.update = function () { // Move the lavarocks1 upwards self.y -= self.speed; }; }); var Lavarocks2 = Container.expand(function () { var self = Container.call(this); var lavarocks2Graphics = self.attachAsset('Lavarocks2', { anchorX: 0.5, anchorY: 0.5, scaleX: level === 2 ? 1.5 : 1.0, scaleY: level === 2 ? 1.5 : 1.0, smooth: true, filterQuality: 1 }); self.speed = level === 2 ? 20 : 5; // Maximum increase speed for level 2 self.update = function () { // Move the lavarocks2 upwards self.y -= self.speed; }; }); var Stone = Container.expand(function () { var self = Container.call(this); var stoneGraphics = self.attachAsset('Stone', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.3, scaleY: 0.3, smooth: true, filterQuality: 1 }); self.speed = level === 4 ? 15 : 10; // Further increase speed for Stone objects in level 4 self.update = function () { self.y -= self.speed; }; }); var StoneCircle = Container.expand(function () { var self = Container.call(this); var stoneCircleGraphics = self.attachAsset('StoneCircle', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.5, scaleY: 0.5, smooth: true, filterQuality: 1 }); self.speed = level === 4 ? 15 : 10; // Further increase speed for StoneCircle objects in level 4 self.update = function () { // Move the stones upwards self.y -= self.speed; }; }); var StoneSquare = Container.expand(function () { var self = Container.call(this); var stoneSquareGraphics = self.attachAsset('StoneSquare', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.5, scaleY: 0.5, smooth: true, filterQuality: 1 }); self.speed = level === 4 ? 15 : 10; // Further increase speed for StoneSquare objects in level 4 self.update = function () { // Move the stones upwards self.y -= self.speed; }; }); var Tree = Container.expand(function () { var self = Container.call(this); var treeGraphics = self.attachAsset('Land01', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.0, scaleY: 1.0, smooth: true, filterQuality: 1 }); self.speed = 15; // Further increase the speed of the tree self.update = function () { self.y -= self.speed; }; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000, //Init game with black background height: 3000 // Increase the game screen height }); /**** * Game Code ****/ // or via static code analysis based on their usage in the code. // Function to show the level text once function showLevelTextOnce() { // Make sure levelTxtOrange is defined and visible if (levelTxtOrange) { levelTxtOrange.setText('Level: ' + level); // Update text content levelTxtOrange.visible = true; LK.setTimeout(function () { if (levelTxtOrange) { levelTxtOrange.visible = false; } // Start respawning objects after the text has hidden // This ensures objects for the new level start appearing after the level announcement startRespawningObjects(); }, 1500); // Show text for 1.5 seconds } else { // Fallback or error logging if levelTxtOrange is not ready console.log("Error: levelTxtOrange not initialized before showLevelTextOnce call."); startRespawningObjects(); // Still try to start respawning } } function startRespawningObjects() { // Logic to start respawning objects based on the current level if (level === 1) { // Respawn Explosions randomly in level 1 if (!LK.gameOver && LK.ticks % 50 == 0 && levelTxtOrange.visible === false) { var newExplosion; for (var i = 0; i < spheres.length; i++) { if (spheres[i] instanceof Explosion && spheres[i].y < -200) { newExplosion = spheres[i]; break; } } if (!newExplosion) { newExplosion = new Explosion(); spheres.push(newExplosion); game.addChild(newExplosion); } newExplosion.x = Math.random() * (2048 - newExplosion.width) + newExplosion.width / 2; newExplosion.y = 2732; } } else if (level === 2) { // Respawn Lavarocks, Lavarocks1, and Lavarocks2 randomly in level 2 if (!LK.gameOver && LK.ticks % 50 == 0) { var newLavarock; for (var i = 0; i < spheres.length; i++) { if ((spheres[i] instanceof Lavarocks || spheres[i] instanceof Lavarocks1 || spheres[i] instanceof Lavarocks2) && spheres[i].y < -200) { newLavarock = spheres[i]; break; } } if (!newLavarock) { var randomType = Math.floor(Math.random() * 5); if (randomType === 0) { newLavarock = new Lavarocks(); } else if (randomType === 1) { newLavarock = new Lavarocks1(); } else { newLavarock = new Lavarocks2(); } spheres.push(newLavarock); game.addChild(newLavarock); } newLavarock.x = Math.random() * (2048 - newLavarock.width) + newLavarock.width / 2; newLavarock.y = 2732; var randomScale = 1.0 + Math.random() * 1.0; // Random scale between 1.0 and 2.0 newLavarock.scaleX = randomScale; newLavarock.scaleY = randomScale; } } else if (level === 3) { // Respawn Icerocks randomly in level 3 if (!LK.gameOver && LK.ticks % 50 == 0) { var newIcerock; for (var i = 0; i < spheres.length; i++) { if ((spheres[i] instanceof Icerocks || spheres[i] instanceof Icerocks1 || spheres[i] instanceof Icerocks2) && spheres[i].y < -200) { newIcerock = spheres[i]; break; } } if (!newIcerock) { var randomType = Math.floor(Math.random() * 3); if (randomType === 0) { newIcerock = new Icerocks(); } else if (randomType === 1) { newIcerock = new Icerocks1(); } else { newIcerock = new Icerocks2(); } spheres.push(newIcerock); game.addChild(newIcerock); } newIcerock.x = Math.random() * (2048 - newIcerock.width) + newIcerock.width / 2; newIcerock.y = 2732; var randomScaleX = 1.0 + Math.random() * 1.0; // Random scale between 1.0 and 2.0 for width var randomScaleY = 1.0 + Math.random() * 1.5; // Random scale between 1.0 and 2.5 for height newIcerock.scaleX = randomScaleX; newIcerock.scaleY = randomScaleY; } } else if (level === 5) { // Respawn AirBlocks randomly in level 5 if (!LK.gameOver && LK.ticks % 50 == 0) { // Retaining tick condition for consistency var newAirBlock; for (var i = 0; i < spheres.length; i++) { if (spheres[i] instanceof AirBlock && spheres[i].y < -200) { newAirBlock = spheres[i]; break; } } if (!newAirBlock) { newAirBlock = new AirBlock(); spheres.push(newAirBlock); game.addChild(newAirBlock); } newAirBlock.x = Math.random() * (2048 - newAirBlock.width) + newAirBlock.width / 2; newAirBlock.y = 2732; var randomScaleAir = 1.0 + Math.random() * 1.0; newAirBlock.scaleX = randomScaleAir; newAirBlock.scaleY = randomScaleAir; // Add continuous rotation animation to the right for AirBlock tween(newAirBlock, { rotation: Math.PI * 2 }, { duration: 2000, easing: tween.linear, onFinish: function onFinish() { // Start the animation again for continuous rotation function rotateAirBlock() { if (newAirBlock && !newAirBlock.destroyed) { tween(newAirBlock, { rotation: newAirBlock.rotation + Math.PI * 2 }, { duration: 2000, easing: tween.linear, onFinish: rotateAirBlock }); } } rotateAirBlock(); } }); } } } // Function to show the level text twice function showLevelTextTwice() { levelTxtOrange.fill = 0x0000ff; // Blue color levelTxtOrange.visible = true; LK.setTimeout(function () { levelTxtOrange.visible = false; LK.setTimeout(function () { levelTxtOrange.visible = true; LK.setTimeout(function () { levelTxtOrange.visible = false; // Start respawning objects after the text has shown and hidden for the last time startRespawningObjects(); }, 500); }, 500); }, 500); } // Add background image for level 4 var backgroundLevel4 = LK.getAsset('Stone_lands', { anchorX: 0.0, anchorY: 0.0 }); backgroundLevel4.smooth = true; backgroundLevel4.filterQuality = 0; // Further increase the filter quality for better clarity backgroundLevel4.scale.set(2048 / 800, 2732 / 800); backgroundLevel4.smooth = true; // Enable smoothing to remove pixelation backgroundLevel4.filterQuality = 0; // Adjust filter quality for better clarity backgroundLevel4.visible = false; // Initially hidden game.addChild(backgroundLevel4); // Add background image for level 5 var backgroundLevel5 = LK.getAsset('SkyBackground', { anchorX: 0.0, anchorY: 0.0 }); backgroundLevel5.smooth = true; backgroundLevel5.filterQuality = 0; backgroundLevel5.scale.set(2048 / 800, 2732 / 800); backgroundLevel5.visible = false; // Initially hidden game.addChild(backgroundLevel5); // Initialize game variables var dragon; var spheres = []; var fireballs = []; // Initialize fireballs array var score = 0; // Initialize score to 0 var scoreTxt; var level = 1; // Initialize level to 1 var introBackground, startButton, gameStarted = false; var healthBar; // Declare healthBar globally, will be initialized in setupActiveGame var healthTxt; // Declare healthTxt globally for health text display // Add background image to the game for level 1 var backgroundLevel1 = LK.getAsset('Green_lands', { anchorX: 0.0, anchorY: 0.0 }); backgroundLevel1.smooth = true; // Enable smoothing to remove pixelation backgroundLevel1.filterQuality = 0; // Adjust filter quality for better clarity backgroundLevel1.scale.set(2048 / 800, 2732 / 800); // Scale the background to fit the screen backgroundLevel1.smooth = true; // Enable smoothing to remove pixelation backgroundLevel1.filterQuality = 0; // Further increase the filter quality for better clarity backgroundLevel1.visible = true; // Initially visible game.addChild(backgroundLevel1); // Add background image for level 2 var backgroundLevel2 = LK.getAsset('Lava_lands', { anchorX: 0.0, anchorY: 0.0 }); backgroundLevel2.smooth = true; backgroundLevel2.filterQuality = 0; // Further increase the filter quality for better clarity backgroundLevel2.scale.set(2048 / 800, 2732 / 800); backgroundLevel2.smooth = true; // Enable smoothing to remove pixelation backgroundLevel2.filterQuality = 2; // Increase filter quality for better clarity backgroundLevel2.visible = false; // Initially hidden game.addChild(backgroundLevel2); // Add background image for level 3 var backgroundLevel3 = LK.getAsset('Ice_lands', { anchorX: 0.0, anchorY: 0.0 }); backgroundLevel3.smooth = true; backgroundLevel3.filterQuality = 2; // Increase filter quality for better clarity backgroundLevel3.scale.set(2048 / 800, 2732 / 800); // Scale the background to fit the screen backgroundLevel3.smooth = true; // Enable smoothing to remove pixelation backgroundLevel3.filterQuality = 2; // Further increase the filter quality for better clarity backgroundLevel3.visible = false; // Initially hidden game.addChild(backgroundLevel3); // Refresh the background to be clearer & fit to screen every 60 ticks game.update = function () { backgroundLevel1.x = 2048 / 2; // Center the background horizontally backgroundLevel1.y = 2732 / 2; // Center the background vertically if (backgroundLevel1.y >= 2732) { backgroundLevel1.y = -2732; } }; // Function to handle game updates game.update = function () { if (!gameStarted) { // Game has not started, do nothing in the main update loop. // If intro elements had animations, they could be updated here. return; } // Reuse off-screen stones or spawn new ones if necessary if (level === 4 && !LK.gameOver && LK.ticks % 50 == 0) { var newStone; for (var i = 0; i < spheres.length; i++) { if ((spheres[i] instanceof Stone || spheres[i] instanceof StoneCircle || spheres[i] instanceof StoneSquare) && spheres[i].y < -200) { newStone = spheres[i]; break; } } if (!newStone) { var randomType = Math.floor(Math.random() * 3); if (randomType === 0) { newStone = new Stone(); } else if (randomType === 1) { newStone = new StoneCircle(); } else { newStone = new StoneSquare(); } spheres.push(newStone); game.addChild(newStone); } var randomScale = 1.0 + Math.random() * 1.0; // Random scale between 1.0 and 2.0 newStone.scaleX = randomScale; newStone.scaleY = randomScale; newStone.x = Math.random() * (2048 - newStone.width) + newStone.width / 2; newStone.y = 2732; } // Check for collisions between fireballs and stones for (var i = fireballs.length - 1; i >= 0; i--) { if (fireballs[i].y > 2732) { fireballs[i].destroy(); fireballs.splice(i, 1); continue; } for (var j = spheres.length - 1; j >= 0; j--) { if (fireballs[i].intersects(spheres[j]) && (spheres[j] instanceof Stone || spheres[j] instanceof StoneCircle || spheres[j] instanceof StoneSquare)) { var explosion4 = LK.getAsset('Explosion4', { anchorX: 0.5, anchorY: 0.5, scaleX: spheres[j].scaleX, scaleY: spheres[j].scaleY }); explosion4.x = spheres[j].x; explosion4.y = spheres[j].y; game.addChild(explosion4); tween(explosion4, { alpha: 0 }, { duration: 1000, onFinish: function onFinish() { explosion4.destroy(); } }); // Add random points from 0-40 when the dragon shoots the stones var points = Math.floor(Math.random() * 41); score += points; // Remove the fireball and the object from the game fireballs[i].destroy(); fireballs.splice(i, 1); spheres[j].destroy(); spheres.splice(j, 1); break; } } } // Check for spheres passing the top of the screen for all levels for (var j = spheres.length - 1; j >= 0; j--) { if (spheres[j].y < -200) { healthBar.currentHealth -= 10; // Decrease health by 10 for each object that passes spheres[j].destroy(); spheres.splice(j, 1); } } if (!LK.gameOver && dragNode && dragNode.global) { dragNode.x = game.toLocal(dragNode.global).x; } // Reuse off-screen trees or spawn new ones if necessary if (level === 1 && !LK.gameOver && LK.ticks % 50 == 0) { // Further reduce the interval for spawning trees to add more tree objects // Reduce the interval for spawning trees var newTree; for (var i = 0; i < spheres.length; i++) { if (spheres[i] instanceof Tree && spheres[i].y < -200) { // Check if the tree is off-screen newTree = spheres[i]; break; } } if (!newTree) { newTree = new Tree(); spheres.push(newTree); game.addChild(newTree); } var randomScale = 1.0 + Math.random() * 1.0; // Random scale between 1.0 and 2.0 newTree.scaleX = randomScale; newTree.scaleY = randomScale; newTree.x = Math.random() * (2048 - newTree.width) + newTree.width / 2; newTree.y = 2732; } // Check for collisions between fireballs and trees or Lavarocks for (var i = fireballs.length - 1; i >= 0; i--) { if (fireballs[i].y > 2732) { fireballs[i].destroy(); fireballs.splice(i, 1); continue; } for (var j = spheres.length - 1; j >= 0; j--) { if (fireballs[i].intersects(spheres[j])) { if (spheres[j] instanceof Tree) { var explosion = LK.getAsset('explosion', { anchorX: 0.5, anchorY: 0.5, scaleX: spheres[j].scaleX, // Match the scale of the Tree object scaleY: spheres[j].scaleY // Match the scale of the Tree object }); explosion.x = spheres[j].x; explosion.y = spheres[j].y; game.addChild(explosion); tween(explosion, { alpha: 0 }, { duration: 1000, onFinish: function onFinish() { explosion.destroy(); } }); } else if (spheres[j] instanceof Lavarocks || spheres[j] instanceof Lavarocks1 || spheres[j] instanceof Lavarocks2) { var explosion2 = LK.getAsset('Explosion2', { anchorX: 0.5, anchorY: 0.5, scaleX: spheres[j].scaleX, // Match the scale of the Lavarocks object scaleY: spheres[j].scaleY // Match the scale of the Lavarocks object }); explosion2.x = spheres[j].x; explosion2.y = spheres[j].y; game.addChild(explosion2); tween(explosion2, { alpha: 0 }, { duration: 1000, onFinish: function onFinish() { explosion2.destroy(); } }); } else if (spheres[j] instanceof Icerocks || spheres[j] instanceof Icerocks1 || spheres[j] instanceof Icerocks2) { var explosion3 = LK.getAsset('Explosion3', { anchorX: 0.5, anchorY: 0.5, scaleX: spheres[j].scaleX, // Match the scale of the Icerocks object scaleY: spheres[j].scaleY // Match the scale of the Icerocks object }); explosion3.x = spheres[j].x; explosion3.y = spheres[j].y; game.addChild(explosion3); tween(explosion3, { alpha: 0 }, { duration: 1000, onFinish: function onFinish() { explosion3.destroy(); } }); } else if (spheres[j] instanceof AirBlock) { var explosion5 = LK.getAsset('Explosion5', { anchorX: 0.5, anchorY: 0.5, scaleX: spheres[j].scaleX, scaleY: spheres[j].scaleY }); explosion5.x = spheres[j].x; explosion5.y = spheres[j].y; game.addChild(explosion5); tween(explosion5, { alpha: 0 }, { duration: 1000, onFinish: function onFinish() { explosion5.destroy(); } }); } // Add random points from 0-40 when the dragon shoots the trees or Lavarocks var points = Math.floor(Math.random() * 41); score += points; // Remove the fireball and the object from the game fireballs[i].destroy(); fireballs.splice(i, 1); spheres[j].destroy(); spheres.splice(j, 1); break; } } } // Check for collisions between dragon and all obstacles for (var j = spheres.length - 1; j >= 0; j--) { if (dragon.intersects(spheres[j])) { var explosionAsset; if (spheres[j] instanceof Tree) { explosionAsset = 'explosion'; } else if (spheres[j] instanceof Lavarocks || spheres[j] instanceof Lavarocks1 || spheres[j] instanceof Lavarocks2) { explosionAsset = 'Explosion2'; } else if (spheres[j] instanceof Icerocks || spheres[j] instanceof Icerocks1 || spheres[j] instanceof Icerocks2) { explosionAsset = 'Explosion3'; } else if (spheres[j] instanceof Stone || spheres[j] instanceof StoneCircle || spheres[j] instanceof StoneSquare) { explosionAsset = 'Explosion4'; } else if (spheres[j] instanceof AirBlock) { explosionAsset = 'Explosion5'; } if (explosionAsset) { var explosion = LK.getAsset(explosionAsset, { anchorX: 0.5, anchorY: 0.5, scaleX: spheres[j].scaleX, scaleY: spheres[j].scaleY }); explosion.x = spheres[j].x; explosion.y = spheres[j].y; game.addChild(explosion); tween(explosion, { alpha: 0 }, { duration: 1000, onFinish: function onFinish() { explosion.destroy(); } }); } // Decrease the dragon's health healthBar.currentHealth -= 20; // Remove the rock from the game spheres[j].destroy(); spheres.splice(j, 1); break; // One collision per frame } } // Update the score display when the dragon gets points scoreTxt.setText('Score: ' + score); // Update the health text display if (healthTxt && healthBar) { healthTxt.setText(healthBar.currentHealth.toString()); } // Check if health bar reaches 0 to trigger game over if (healthBar.currentHealth <= 0 && !LK.gameOver) { LK.effects.flashScreen(0xff0000, 1000); // Flash screen red for 1 second LK.showGameOver(); // Show game over screen } // Regenerate player's health to max when score reaches 1000 if (score >= 1000) { healthBar.currentHealth = healthBar.maxHealth; } // Transition to the next level var scoreThresholds = [532, 1064, 1596, 2128, 2660]; // Score to complete level 1, 2, 3, 4, 5 respectively if (level <= 5 && score >= scoreThresholds[level - 1]) { level++; if (level > 5) { LK.showYouWin(); // Player wins after completing level 5 // Potentially add 'return;' here if no other logic should run after winning in this tick } else { levelTxt.setText('Level: ' + level); levelTxtOrange.setText('Level: ' + level); showLevelTextOnce(); // This function calls startRespawningObjects // Hide all backgrounds backgroundLevel1.visible = false; backgroundLevel2.visible = false; backgroundLevel3.visible = false; backgroundLevel4.visible = false; if (backgroundLevel5) { backgroundLevel5.visible = false; } // Show the current level background and spawn an initial object if (level === 2) { backgroundLevel2.visible = true; var newLavarocks = new Lavarocks(); spheres.push(newLavarocks); game.addChild(newLavarocks); newLavarocks.x = Math.random() * (2048 - newLavarocks.width) + newLavarocks.width / 2; newLavarocks.y = -100; // Initial position off-screen top } else if (level === 3) { backgroundLevel3.visible = true; var newIcerocks = new Icerocks(); spheres.push(newIcerocks); game.addChild(newIcerocks); newIcerocks.x = Math.random() * (2048 - newIcerocks.width) + newIcerocks.width / 2; newIcerocks.y = -100; } else if (level === 4) { backgroundLevel4.visible = true; var newStone = new Stone(); spheres.push(newStone); game.addChild(newStone); newStone.x = Math.random() * (2048 - newStone.width) + newStone.width / 2; newStone.y = -100; } else if (level === 5) { if (backgroundLevel5) { backgroundLevel5.visible = true; } var newAirBlock = new AirBlock(); spheres.push(newAirBlock); game.addChild(newAirBlock); newAirBlock.x = Math.random() * (2048 - newAirBlock.width) + newAirBlock.width / 2; newAirBlock.y = -100; // Add continuous rotation animation to the right for AirBlock tween(newAirBlock, { rotation: Math.PI * 2 }, { duration: 2000, easing: tween.linear, onFinish: function onFinish() { // Start the animation again for continuous rotation function rotateAirBlock() { if (newAirBlock && !newAirBlock.destroyed) { tween(newAirBlock, { rotation: newAirBlock.rotation + Math.PI * 2 }, { duration: 2000, easing: tween.linear, onFinish: rotateAirBlock }); } } rotateAirBlock(); } }); } } } // Respawn Lavarocks, Lavarocks1, and Lavarocks2 randomly in level 2 if (level === 2 && !LK.gameOver && LK.ticks % 50 == 0) { var newLavarock; for (var i = 0; i < spheres.length; i++) { if ((spheres[i] instanceof Lavarocks || spheres[i] instanceof Lavarocks1 || spheres[i] instanceof Lavarocks2) && spheres[i].y < -200) { newLavarock = spheres[i]; break; } } if (!newLavarock) { var randomType = Math.floor(Math.random() * 3); if (randomType === 0) { newLavarock = new Lavarocks(); } else if (randomType === 1) { newLavarock = new Lavarocks1(); } else { newLavarock = new Lavarocks2(); } spheres.push(newLavarock); game.addChild(newLavarock); } var randomScale = 1.0 + Math.random() * 1.0; // Random scale between 1.0 and 2.0 newLavarock.scaleX = randomScale; newLavarock.scaleY = randomScale; newLavarock.x = Math.random() * (2048 - newLavarock.width) + newLavarock.width / 2; newLavarock.y = 2732; } // Respawn Icerocks randomly in level 3 if (level === 3 && !LK.gameOver && LK.ticks % 50 == 0) { var newIcerock; for (var i = 0; i < spheres.length; i++) { if ((spheres[i] instanceof Icerocks || spheres[i] instanceof Icerocks1 || spheres[i] instanceof Icerocks2) && spheres[i].y < -200) { newIcerock = spheres[i]; break; } } if (!newIcerock) { var randomType = Math.floor(Math.random() * 3); if (randomType === 0) { newIcerock = new Icerocks(); } else if (randomType === 1) { newIcerock = new Icerocks1(); } else { newIcerock = new Icerocks2(); } spheres.push(newIcerock); game.addChild(newIcerock); } var randomScaleX = 1.0 + Math.random() * 1.0; // Random scale between 1.0 and 2.0 for width var randomScaleY = 1.0 + Math.random() * 1.5; // Random scale between 1.0 and 2.5 for height newIcerock.scaleX = randomScaleX; newIcerock.scaleY = randomScaleY; newIcerock.x = Math.random() * (2048 - newIcerock.width) + newIcerock.width / 2; newIcerock.y = 2732; } // Respawn AirBlocks randomly in level 5 (continuous spawning) if (level === 5 && !LK.gameOver && LK.ticks % 50 == 0) { var newAirBlock; for (var i = 0; i < spheres.length; i++) { if (spheres[i] instanceof AirBlock && spheres[i].y < -200) { // Check if AirBlock is off-screen newAirBlock = spheres[i]; break; } } if (!newAirBlock) { newAirBlock = new AirBlock(); spheres.push(newAirBlock); game.addChild(newAirBlock); } var randomScaleAir = 1.0 + Math.random() * 1.0; // Random scale between 1.0 and 2.0 newAirBlock.scaleX = randomScaleAir; newAirBlock.scaleY = randomScaleAir; newAirBlock.x = Math.random() * (2048 - newAirBlock.width) + newAirBlock.width / 2; newAirBlock.y = 2732; // Spawn at the bottom // Add continuous rotation animation to the right for AirBlock tween(newAirBlock, { rotation: Math.PI * 2 }, { duration: 2000, easing: tween.linear, onFinish: function onFinish() { // Start the animation again for continuous rotation function rotateAirBlock() { if (newAirBlock && !newAirBlock.destroyed) { tween(newAirBlock, { rotation: newAirBlock.rotation + Math.PI * 2 }, { duration: 2000, easing: tween.linear, onFinish: rotateAirBlock }); } } rotateAirBlock(); } }); } }; // Declare dragNode globally as it's used in event handlers set up in setupActiveGame var dragNode = null; // Function to set up and start the actual game after intro function setupActiveGame() { // Ensure game backgrounds are set up for level 1 backgroundLevel1.visible = true; backgroundLevel2.visible = false; backgroundLevel3.visible = false; backgroundLevel4.visible = false; if (backgroundLevel5) { // Check existence for safety backgroundLevel5.visible = false; } // Play background music LK.playMusic('Gamemusic1'); // Initialize dragon dragon = game.addChild(new Dragon()); dragon.x = 2048 / 2; dragon.y = 200; // Initialize the animated "Start" text that appears after button press var animatedStartTxt = new Text2('Start', { size: 150, fill: 0xffa500, // Orange color font: "'Time new roman',Impact,'Arial Black',Tahoma" //{aF} // Copied from original startTxt }); //{aG} // Copied from original startTxt animatedStartTxt.anchor.set(0.5, 0.5); LK.gui.center.addChild(animatedStartTxt); // Local function to show the animated "Start" text, then proceed to level announcements function showAnimatedStartText() { animatedStartTxt.visible = true; LK.setTimeout(function () { animatedStartTxt.visible = false; // The global showLevelTextTwice function handles level announcements and then calls startRespawningObjects showLevelTextTwice(); }, 2000); } // Initialize level display text (purple) levelTxt = new Text2('Level: 1', { // Assign to global levelTxt size: 100, fill: 0x800080, //{aK} // Purple color font: "'Time new roman',Impact,'Arial Black',Tahoma" }); levelTxt.anchor.set(1, 1); LK.gui.bottomRight.addChild(levelTxt); levelTxt.x = -50; levelTxt.y = -50; // Call the function to show the animated "Start" text sequence showAnimatedStartText(); // Initialize second level display text (orange/yellow, for level announcements) levelTxtOrange = new Text2('Level: ' + level, { // Assign to global levelTxtOrange size: 100, fill: 0xffff00, // Yellow color font: "'Time new roman',Impact,'Arial Black',Tahoma" }); levelTxtOrange.anchor.set(0.5, 0.5); LK.gui.center.addChild(levelTxtOrange); levelTxtOrange.visible = false; // Initially hidden, showLevelTextTwice will manage it // Initialize score display scoreTxt = new Text2('Score: 0', { // Assign to global scoreTxt size: 100, fill: 0x800080, //{bs} // Purple color font: "'Time new roman',Impact,'Arial Black',Tahoma" }); scoreTxt.anchor.set(0, 1); // Using the bottom-left positioning from original code LK.gui.bottomLeft.addChild(scoreTxt); scoreTxt.x = 50; scoreTxt.y = -50; // Initialize health bar healthBar = game.addChild(new HealthBar()); // Assign to global healthBar healthBar.x = 120; // Position in top left corner (avoiding platform menu) healthBar.y = 50; // Position in top left corner // Initialize health text display healthTxt = new Text2('500', { size: 60, fill: 0xffffff, // White color font: "'Time new roman',Impact,'Arial Black',Tahoma" }); healthTxt.anchor.set(0.5, 0.5); // Center anchor for middle positioning LK.gui.topLeft.addChild(healthTxt); healthTxt.x = 120; // Same X position as health bar healthTxt.y = 50; // Same Y position as health bar // Setup touch input for dragging the dragon game.down = function (x, y, obj) { if (!gameStarted) { return; } // Should not be needed here as game.down is set after game starts dragNode = dragon; }; game.up = function (x, y, obj) { if (!gameStarted) { return; } dragNode = null; }; game.move = function (x, y, obj) { if (!gameStarted || !dragNode) { return; } var newX = Math.max(dragon.width / 2, Math.min(2048 - dragon.width / 2, x)); var newY = Math.max(dragon.height / 2, Math.min(2732 - dragon.height / 2, y)); dragon.x = newX; dragon.y = newY; if (LK.ticks % 15 == 0) { for (var i = 0; i < 1; i++) { var assetId; if (level === 2) { assetId = 'Shout2'; } else if (level === 3) { assetId = 'Shout3'; } else if (level === 4) { assetId = 'Shout4'; } else if (level === 5) { assetId = 'Shout5'; } else { assetId = 'Shout1'; } var fireball = new Fireball(assetId); if (dragon.x < 2048 / 2) { fireball.x = dragon.x - 80; } else { fireball.x = dragon.x + 80; } fireball.y = dragon.y; tween(fireball, { rotation: Math.PI * 4 }, { duration: 1500, easing: tween.linear }); fireballs.push(fireball); game.addChild(fireball); } } }; } // === Intro Screen Setup (runs when Game Code is parsed) === introBackground = LK.getAsset('Introbackground', { anchorX: 0.5, anchorY: 0.5 }); introBackground.x = 2048 / 2; introBackground.y = 2732 / 2; // Scale intro background to cover the screen, using its own dimensions after LK.getAsset introBackground.scale.set(2048 / introBackground.width, 2732 / introBackground.height); game.addChild(introBackground); // Play intro music during the intro screen LK.playMusic('Intromusic1'); startButton = LK.getAsset('Startbutton', { anchorX: 0.5, anchorY: 0.5 }); startButton.x = 2048 / 2; startButton.y = 2732 - startButton.height / 2 - 100; // 100px from bottom edge to center of button startButton.interactive = true; // Essential for the 'down' event game.addChild(startButton); startButton.down = function () { if (gameStarted) { return; } // Prevent multiple starts if clicked again rapidly gameStarted = true; introBackground.visible = false; startButton.visible = false; // For performance, you might want to destroy them if they are truly one-time use: // introBackground.destroy(); // startButton.destroy(); setupActiveGame(); // This will initialize and start the actual game }; // The original global showStartText, showLevelTextOnce, showLevelTextTwice, startRespawningObjects functions // are assumed to be defined elsewhere in the "Game Code" section or are part of what was replaced. // If showStartText was the one replaced, its logic is now within setupActiveGame as showAnimatedStartText. // The other functions (showLevelTextOnce, showLevelTextTwice, startRespawningObjects) should still be globally available.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var AirBlock = Container.expand(function () {
var self = Container.call(this);
var airBlockGraphics = self.attachAsset('AirBlockAsset', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.0,
scaleY: 1.0,
smooth: true,
filterQuality: 1
});
self.speed = level === 5 ? 18 : 12; // Increased speed for AirBlocks in Level 5
self.update = function () {
self.y -= self.speed;
};
return self;
});
//<Assets used in the game will automatically appear here>
//<Write imports for supported plugins here>
// Dragon class to represent the player character
var Dragon = Container.expand(function () {
var self = Container.call(this);
// Function to get the appropriate dragon asset based on level
self.getDragonAsset = function () {
if (level === 2) {
return 'Lavadragon';
}
if (level === 3) {
return 'Snowdragon';
}
if (level === 4) {
return 'Stonedragon';
}
if (level === 5) {
return 'Airdragon';
}
return 'dragon'; // Default for level 1
};
var dragonGraphics = self.attachAsset(self.getDragonAsset(), {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2.0,
scaleY: 2.0,
smooth: true,
filterQuality: 2
});
self.speed = 20; // Further increase the speed of the dragon
self.currentLevel = level; // Track current level for asset changes
// Function to update dragon asset when level changes
self.updateDragonAsset = function () {
if (self.currentLevel !== level) {
self.currentLevel = level;
// Remove old graphics
dragonGraphics.destroy();
// Create new graphics with appropriate asset
dragonGraphics = self.attachAsset(self.getDragonAsset(), {
anchorX: 0.5,
anchorY: 0.5,
scaleX: self.x < 2048 / 2 ? -2.0 : 2.0,
scaleY: 2.0,
smooth: true,
filterQuality: 2
});
}
};
self.update = function () {
// Update dragon asset if level changed
self.updateDragonAsset();
// Update logic for the dragon to flip based on movement direction
if (self.x < 2048 / 2) {
dragonGraphics.scaleX = -2.0; // Flip horizontally when on the left side of the screen
} else {
dragonGraphics.scaleX = 2.0; // Normal orientation when on the right side of the screen
}
// Removed unnecessary variable to optimize performance
};
return self;
});
var Explosion = Container.expand(function () {
var self = Container.call(this);
var explosionGraphics = self.attachAsset('explosion', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.0,
scaleY: 1.0,
smooth: true,
filterQuality: 1
});
self.speed = 10;
self.update = function () {
self.y -= self.speed;
};
return self;
});
// Fireball class to represent the fireballs that the dragon shoots
var Fireball = Container.expand(function (assetId) {
var self = Container.call(this);
var fireballGraphics = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.6,
scaleY: 0.9,
smooth: true,
filterQuality: 1
});
self.speed = 20; // Increase the speed of the fireballs
self.update = function () {
self.y += self.speed;
};
});
// HealthBar class to represent the player's health
var HealthBar = Container.expand(function () {
var self = Container.call(this);
var healthBarGraphics = self.attachAsset('healthBar', {
anchorX: 0.0,
anchorY: 0.0,
scaleX: 2530 / 1000,
// Scale to fit the game width
scaleY: 0.1
});
self.maxHealth = 500;
self.currentHealth = self.maxHealth;
self.update = function () {
healthBarGraphics.scaleX = self.currentHealth / self.maxHealth * (2530 / 1000);
healthBarGraphics.scaleY = 0.05; // Resize the health bar to fit the top of the screen
};
});
var Icerocks = Container.expand(function () {
var self = Container.call(this);
var icerocksGraphics = self.attachAsset('Icerocks', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: level === 3 ? 1.5 : 1.0,
scaleY: level === 3 ? 1.5 : 1.0,
smooth: true,
filterQuality: 1
});
self.speed = level === 3 ? 15 : 5; // Further increase speed for level 3
self.update = function () {
self.y -= self.speed;
};
});
var Icerocks1 = Container.expand(function () {
var self = Container.call(this);
var icerocks1Graphics = self.attachAsset('Icerocks1', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: level === 3 ? 1.5 : 1.0,
scaleY: level === 3 ? 1.5 : 1.0,
smooth: true,
filterQuality: 1
});
self.speed = level === 3 ? 15 : 5; // Further increase speed for level 3
self.update = function () {
// Move the icerocks upwards
self.y -= self.speed;
};
});
var Icerocks2 = Container.expand(function () {
var self = Container.call(this);
var icerocks2Graphics = self.attachAsset('Icerocks2', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: level === 3 ? 1.5 : 1.0,
scaleY: level === 3 ? 1.5 : 1.0,
smooth: true,
filterQuality: 1
});
self.speed = level === 3 ? 15 : 5; // Further increase speed for level 3
self.update = function () {
// Move the icerocks upwards
self.y -= self.speed;
};
});
var Lavarocks = Container.expand(function () {
var self = Container.call(this);
var lavarocksGraphics = self.attachAsset('Lavarocks', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: level === 2 ? 1.5 : 1.0,
scaleY: level === 2 ? 1.5 : 1.0,
smooth: true,
filterQuality: 1
});
self.speed = level === 2 ? 20 : 5; // Maximum increase speed for level 2
self.update = function () {
self.y -= self.speed;
};
});
var Lavarocks1 = Container.expand(function () {
var self = Container.call(this);
var lavarocks1Graphics = self.attachAsset('Lavarocks1', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: level === 2 ? 1.5 : 1.0,
scaleY: level === 2 ? 1.5 : 1.0,
smooth: true,
filterQuality: 1
});
self.speed = level === 2 ? 20 : 5; // Maximum increase speed for level 2
self.update = function () {
// Move the lavarocks1 upwards
self.y -= self.speed;
};
});
var Lavarocks2 = Container.expand(function () {
var self = Container.call(this);
var lavarocks2Graphics = self.attachAsset('Lavarocks2', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: level === 2 ? 1.5 : 1.0,
scaleY: level === 2 ? 1.5 : 1.0,
smooth: true,
filterQuality: 1
});
self.speed = level === 2 ? 20 : 5; // Maximum increase speed for level 2
self.update = function () {
// Move the lavarocks2 upwards
self.y -= self.speed;
};
});
var Stone = Container.expand(function () {
var self = Container.call(this);
var stoneGraphics = self.attachAsset('Stone', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.3,
scaleY: 0.3,
smooth: true,
filterQuality: 1
});
self.speed = level === 4 ? 15 : 10; // Further increase speed for Stone objects in level 4
self.update = function () {
self.y -= self.speed;
};
});
var StoneCircle = Container.expand(function () {
var self = Container.call(this);
var stoneCircleGraphics = self.attachAsset('StoneCircle', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.5,
scaleY: 0.5,
smooth: true,
filterQuality: 1
});
self.speed = level === 4 ? 15 : 10; // Further increase speed for StoneCircle objects in level 4
self.update = function () {
// Move the stones upwards
self.y -= self.speed;
};
});
var StoneSquare = Container.expand(function () {
var self = Container.call(this);
var stoneSquareGraphics = self.attachAsset('StoneSquare', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.5,
scaleY: 0.5,
smooth: true,
filterQuality: 1
});
self.speed = level === 4 ? 15 : 10; // Further increase speed for StoneSquare objects in level 4
self.update = function () {
// Move the stones upwards
self.y -= self.speed;
};
});
var Tree = Container.expand(function () {
var self = Container.call(this);
var treeGraphics = self.attachAsset('Land01', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.0,
scaleY: 1.0,
smooth: true,
filterQuality: 1
});
self.speed = 15; // Further increase the speed of the tree
self.update = function () {
self.y -= self.speed;
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000,
//Init game with black background
height: 3000 // Increase the game screen height
});
/****
* Game Code
****/
// or via static code analysis based on their usage in the code.
// Function to show the level text once
function showLevelTextOnce() {
// Make sure levelTxtOrange is defined and visible
if (levelTxtOrange) {
levelTxtOrange.setText('Level: ' + level); // Update text content
levelTxtOrange.visible = true;
LK.setTimeout(function () {
if (levelTxtOrange) {
levelTxtOrange.visible = false;
}
// Start respawning objects after the text has hidden
// This ensures objects for the new level start appearing after the level announcement
startRespawningObjects();
}, 1500); // Show text for 1.5 seconds
} else {
// Fallback or error logging if levelTxtOrange is not ready
console.log("Error: levelTxtOrange not initialized before showLevelTextOnce call.");
startRespawningObjects(); // Still try to start respawning
}
}
function startRespawningObjects() {
// Logic to start respawning objects based on the current level
if (level === 1) {
// Respawn Explosions randomly in level 1
if (!LK.gameOver && LK.ticks % 50 == 0 && levelTxtOrange.visible === false) {
var newExplosion;
for (var i = 0; i < spheres.length; i++) {
if (spheres[i] instanceof Explosion && spheres[i].y < -200) {
newExplosion = spheres[i];
break;
}
}
if (!newExplosion) {
newExplosion = new Explosion();
spheres.push(newExplosion);
game.addChild(newExplosion);
}
newExplosion.x = Math.random() * (2048 - newExplosion.width) + newExplosion.width / 2;
newExplosion.y = 2732;
}
} else if (level === 2) {
// Respawn Lavarocks, Lavarocks1, and Lavarocks2 randomly in level 2
if (!LK.gameOver && LK.ticks % 50 == 0) {
var newLavarock;
for (var i = 0; i < spheres.length; i++) {
if ((spheres[i] instanceof Lavarocks || spheres[i] instanceof Lavarocks1 || spheres[i] instanceof Lavarocks2) && spheres[i].y < -200) {
newLavarock = spheres[i];
break;
}
}
if (!newLavarock) {
var randomType = Math.floor(Math.random() * 5);
if (randomType === 0) {
newLavarock = new Lavarocks();
} else if (randomType === 1) {
newLavarock = new Lavarocks1();
} else {
newLavarock = new Lavarocks2();
}
spheres.push(newLavarock);
game.addChild(newLavarock);
}
newLavarock.x = Math.random() * (2048 - newLavarock.width) + newLavarock.width / 2;
newLavarock.y = 2732;
var randomScale = 1.0 + Math.random() * 1.0; // Random scale between 1.0 and 2.0
newLavarock.scaleX = randomScale;
newLavarock.scaleY = randomScale;
}
} else if (level === 3) {
// Respawn Icerocks randomly in level 3
if (!LK.gameOver && LK.ticks % 50 == 0) {
var newIcerock;
for (var i = 0; i < spheres.length; i++) {
if ((spheres[i] instanceof Icerocks || spheres[i] instanceof Icerocks1 || spheres[i] instanceof Icerocks2) && spheres[i].y < -200) {
newIcerock = spheres[i];
break;
}
}
if (!newIcerock) {
var randomType = Math.floor(Math.random() * 3);
if (randomType === 0) {
newIcerock = new Icerocks();
} else if (randomType === 1) {
newIcerock = new Icerocks1();
} else {
newIcerock = new Icerocks2();
}
spheres.push(newIcerock);
game.addChild(newIcerock);
}
newIcerock.x = Math.random() * (2048 - newIcerock.width) + newIcerock.width / 2;
newIcerock.y = 2732;
var randomScaleX = 1.0 + Math.random() * 1.0; // Random scale between 1.0 and 2.0 for width
var randomScaleY = 1.0 + Math.random() * 1.5; // Random scale between 1.0 and 2.5 for height
newIcerock.scaleX = randomScaleX;
newIcerock.scaleY = randomScaleY;
}
} else if (level === 5) {
// Respawn AirBlocks randomly in level 5
if (!LK.gameOver && LK.ticks % 50 == 0) {
// Retaining tick condition for consistency
var newAirBlock;
for (var i = 0; i < spheres.length; i++) {
if (spheres[i] instanceof AirBlock && spheres[i].y < -200) {
newAirBlock = spheres[i];
break;
}
}
if (!newAirBlock) {
newAirBlock = new AirBlock();
spheres.push(newAirBlock);
game.addChild(newAirBlock);
}
newAirBlock.x = Math.random() * (2048 - newAirBlock.width) + newAirBlock.width / 2;
newAirBlock.y = 2732;
var randomScaleAir = 1.0 + Math.random() * 1.0;
newAirBlock.scaleX = randomScaleAir;
newAirBlock.scaleY = randomScaleAir;
// Add continuous rotation animation to the right for AirBlock
tween(newAirBlock, {
rotation: Math.PI * 2
}, {
duration: 2000,
easing: tween.linear,
onFinish: function onFinish() {
// Start the animation again for continuous rotation
function rotateAirBlock() {
if (newAirBlock && !newAirBlock.destroyed) {
tween(newAirBlock, {
rotation: newAirBlock.rotation + Math.PI * 2
}, {
duration: 2000,
easing: tween.linear,
onFinish: rotateAirBlock
});
}
}
rotateAirBlock();
}
});
}
}
}
// Function to show the level text twice
function showLevelTextTwice() {
levelTxtOrange.fill = 0x0000ff; // Blue color
levelTxtOrange.visible = true;
LK.setTimeout(function () {
levelTxtOrange.visible = false;
LK.setTimeout(function () {
levelTxtOrange.visible = true;
LK.setTimeout(function () {
levelTxtOrange.visible = false;
// Start respawning objects after the text has shown and hidden for the last time
startRespawningObjects();
}, 500);
}, 500);
}, 500);
}
// Add background image for level 4
var backgroundLevel4 = LK.getAsset('Stone_lands', {
anchorX: 0.0,
anchorY: 0.0
});
backgroundLevel4.smooth = true;
backgroundLevel4.filterQuality = 0; // Further increase the filter quality for better clarity
backgroundLevel4.scale.set(2048 / 800, 2732 / 800);
backgroundLevel4.smooth = true; // Enable smoothing to remove pixelation
backgroundLevel4.filterQuality = 0; // Adjust filter quality for better clarity
backgroundLevel4.visible = false; // Initially hidden
game.addChild(backgroundLevel4);
// Add background image for level 5
var backgroundLevel5 = LK.getAsset('SkyBackground', {
anchorX: 0.0,
anchorY: 0.0
});
backgroundLevel5.smooth = true;
backgroundLevel5.filterQuality = 0;
backgroundLevel5.scale.set(2048 / 800, 2732 / 800);
backgroundLevel5.visible = false; // Initially hidden
game.addChild(backgroundLevel5);
// Initialize game variables
var dragon;
var spheres = [];
var fireballs = []; // Initialize fireballs array
var score = 0; // Initialize score to 0
var scoreTxt;
var level = 1; // Initialize level to 1
var introBackground,
startButton,
gameStarted = false;
var healthBar; // Declare healthBar globally, will be initialized in setupActiveGame
var healthTxt; // Declare healthTxt globally for health text display
// Add background image to the game for level 1
var backgroundLevel1 = LK.getAsset('Green_lands', {
anchorX: 0.0,
anchorY: 0.0
});
backgroundLevel1.smooth = true; // Enable smoothing to remove pixelation
backgroundLevel1.filterQuality = 0; // Adjust filter quality for better clarity
backgroundLevel1.scale.set(2048 / 800, 2732 / 800); // Scale the background to fit the screen
backgroundLevel1.smooth = true; // Enable smoothing to remove pixelation
backgroundLevel1.filterQuality = 0; // Further increase the filter quality for better clarity
backgroundLevel1.visible = true; // Initially visible
game.addChild(backgroundLevel1);
// Add background image for level 2
var backgroundLevel2 = LK.getAsset('Lava_lands', {
anchorX: 0.0,
anchorY: 0.0
});
backgroundLevel2.smooth = true;
backgroundLevel2.filterQuality = 0; // Further increase the filter quality for better clarity
backgroundLevel2.scale.set(2048 / 800, 2732 / 800);
backgroundLevel2.smooth = true; // Enable smoothing to remove pixelation
backgroundLevel2.filterQuality = 2; // Increase filter quality for better clarity
backgroundLevel2.visible = false; // Initially hidden
game.addChild(backgroundLevel2);
// Add background image for level 3
var backgroundLevel3 = LK.getAsset('Ice_lands', {
anchorX: 0.0,
anchorY: 0.0
});
backgroundLevel3.smooth = true;
backgroundLevel3.filterQuality = 2; // Increase filter quality for better clarity
backgroundLevel3.scale.set(2048 / 800, 2732 / 800); // Scale the background to fit the screen
backgroundLevel3.smooth = true; // Enable smoothing to remove pixelation
backgroundLevel3.filterQuality = 2; // Further increase the filter quality for better clarity
backgroundLevel3.visible = false; // Initially hidden
game.addChild(backgroundLevel3);
// Refresh the background to be clearer & fit to screen every 60 ticks
game.update = function () {
backgroundLevel1.x = 2048 / 2; // Center the background horizontally
backgroundLevel1.y = 2732 / 2; // Center the background vertically
if (backgroundLevel1.y >= 2732) {
backgroundLevel1.y = -2732;
}
};
// Function to handle game updates
game.update = function () {
if (!gameStarted) {
// Game has not started, do nothing in the main update loop.
// If intro elements had animations, they could be updated here.
return;
}
// Reuse off-screen stones or spawn new ones if necessary
if (level === 4 && !LK.gameOver && LK.ticks % 50 == 0) {
var newStone;
for (var i = 0; i < spheres.length; i++) {
if ((spheres[i] instanceof Stone || spheres[i] instanceof StoneCircle || spheres[i] instanceof StoneSquare) && spheres[i].y < -200) {
newStone = spheres[i];
break;
}
}
if (!newStone) {
var randomType = Math.floor(Math.random() * 3);
if (randomType === 0) {
newStone = new Stone();
} else if (randomType === 1) {
newStone = new StoneCircle();
} else {
newStone = new StoneSquare();
}
spheres.push(newStone);
game.addChild(newStone);
}
var randomScale = 1.0 + Math.random() * 1.0; // Random scale between 1.0 and 2.0
newStone.scaleX = randomScale;
newStone.scaleY = randomScale;
newStone.x = Math.random() * (2048 - newStone.width) + newStone.width / 2;
newStone.y = 2732;
}
// Check for collisions between fireballs and stones
for (var i = fireballs.length - 1; i >= 0; i--) {
if (fireballs[i].y > 2732) {
fireballs[i].destroy();
fireballs.splice(i, 1);
continue;
}
for (var j = spheres.length - 1; j >= 0; j--) {
if (fireballs[i].intersects(spheres[j]) && (spheres[j] instanceof Stone || spheres[j] instanceof StoneCircle || spheres[j] instanceof StoneSquare)) {
var explosion4 = LK.getAsset('Explosion4', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: spheres[j].scaleX,
scaleY: spheres[j].scaleY
});
explosion4.x = spheres[j].x;
explosion4.y = spheres[j].y;
game.addChild(explosion4);
tween(explosion4, {
alpha: 0
}, {
duration: 1000,
onFinish: function onFinish() {
explosion4.destroy();
}
});
// Add random points from 0-40 when the dragon shoots the stones
var points = Math.floor(Math.random() * 41);
score += points;
// Remove the fireball and the object from the game
fireballs[i].destroy();
fireballs.splice(i, 1);
spheres[j].destroy();
spheres.splice(j, 1);
break;
}
}
}
// Check for spheres passing the top of the screen for all levels
for (var j = spheres.length - 1; j >= 0; j--) {
if (spheres[j].y < -200) {
healthBar.currentHealth -= 10; // Decrease health by 10 for each object that passes
spheres[j].destroy();
spheres.splice(j, 1);
}
}
if (!LK.gameOver && dragNode && dragNode.global) {
dragNode.x = game.toLocal(dragNode.global).x;
}
// Reuse off-screen trees or spawn new ones if necessary
if (level === 1 && !LK.gameOver && LK.ticks % 50 == 0) {
// Further reduce the interval for spawning trees to add more tree objects
// Reduce the interval for spawning trees
var newTree;
for (var i = 0; i < spheres.length; i++) {
if (spheres[i] instanceof Tree && spheres[i].y < -200) {
// Check if the tree is off-screen
newTree = spheres[i];
break;
}
}
if (!newTree) {
newTree = new Tree();
spheres.push(newTree);
game.addChild(newTree);
}
var randomScale = 1.0 + Math.random() * 1.0; // Random scale between 1.0 and 2.0
newTree.scaleX = randomScale;
newTree.scaleY = randomScale;
newTree.x = Math.random() * (2048 - newTree.width) + newTree.width / 2;
newTree.y = 2732;
}
// Check for collisions between fireballs and trees or Lavarocks
for (var i = fireballs.length - 1; i >= 0; i--) {
if (fireballs[i].y > 2732) {
fireballs[i].destroy();
fireballs.splice(i, 1);
continue;
}
for (var j = spheres.length - 1; j >= 0; j--) {
if (fireballs[i].intersects(spheres[j])) {
if (spheres[j] instanceof Tree) {
var explosion = LK.getAsset('explosion', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: spheres[j].scaleX,
// Match the scale of the Tree object
scaleY: spheres[j].scaleY // Match the scale of the Tree object
});
explosion.x = spheres[j].x;
explosion.y = spheres[j].y;
game.addChild(explosion);
tween(explosion, {
alpha: 0
}, {
duration: 1000,
onFinish: function onFinish() {
explosion.destroy();
}
});
} else if (spheres[j] instanceof Lavarocks || spheres[j] instanceof Lavarocks1 || spheres[j] instanceof Lavarocks2) {
var explosion2 = LK.getAsset('Explosion2', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: spheres[j].scaleX,
// Match the scale of the Lavarocks object
scaleY: spheres[j].scaleY // Match the scale of the Lavarocks object
});
explosion2.x = spheres[j].x;
explosion2.y = spheres[j].y;
game.addChild(explosion2);
tween(explosion2, {
alpha: 0
}, {
duration: 1000,
onFinish: function onFinish() {
explosion2.destroy();
}
});
} else if (spheres[j] instanceof Icerocks || spheres[j] instanceof Icerocks1 || spheres[j] instanceof Icerocks2) {
var explosion3 = LK.getAsset('Explosion3', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: spheres[j].scaleX,
// Match the scale of the Icerocks object
scaleY: spheres[j].scaleY // Match the scale of the Icerocks object
});
explosion3.x = spheres[j].x;
explosion3.y = spheres[j].y;
game.addChild(explosion3);
tween(explosion3, {
alpha: 0
}, {
duration: 1000,
onFinish: function onFinish() {
explosion3.destroy();
}
});
} else if (spheres[j] instanceof AirBlock) {
var explosion5 = LK.getAsset('Explosion5', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: spheres[j].scaleX,
scaleY: spheres[j].scaleY
});
explosion5.x = spheres[j].x;
explosion5.y = spheres[j].y;
game.addChild(explosion5);
tween(explosion5, {
alpha: 0
}, {
duration: 1000,
onFinish: function onFinish() {
explosion5.destroy();
}
});
}
// Add random points from 0-40 when the dragon shoots the trees or Lavarocks
var points = Math.floor(Math.random() * 41);
score += points;
// Remove the fireball and the object from the game
fireballs[i].destroy();
fireballs.splice(i, 1);
spheres[j].destroy();
spheres.splice(j, 1);
break;
}
}
}
// Check for collisions between dragon and all obstacles
for (var j = spheres.length - 1; j >= 0; j--) {
if (dragon.intersects(spheres[j])) {
var explosionAsset;
if (spheres[j] instanceof Tree) {
explosionAsset = 'explosion';
} else if (spheres[j] instanceof Lavarocks || spheres[j] instanceof Lavarocks1 || spheres[j] instanceof Lavarocks2) {
explosionAsset = 'Explosion2';
} else if (spheres[j] instanceof Icerocks || spheres[j] instanceof Icerocks1 || spheres[j] instanceof Icerocks2) {
explosionAsset = 'Explosion3';
} else if (spheres[j] instanceof Stone || spheres[j] instanceof StoneCircle || spheres[j] instanceof StoneSquare) {
explosionAsset = 'Explosion4';
} else if (spheres[j] instanceof AirBlock) {
explosionAsset = 'Explosion5';
}
if (explosionAsset) {
var explosion = LK.getAsset(explosionAsset, {
anchorX: 0.5,
anchorY: 0.5,
scaleX: spheres[j].scaleX,
scaleY: spheres[j].scaleY
});
explosion.x = spheres[j].x;
explosion.y = spheres[j].y;
game.addChild(explosion);
tween(explosion, {
alpha: 0
}, {
duration: 1000,
onFinish: function onFinish() {
explosion.destroy();
}
});
}
// Decrease the dragon's health
healthBar.currentHealth -= 20;
// Remove the rock from the game
spheres[j].destroy();
spheres.splice(j, 1);
break; // One collision per frame
}
}
// Update the score display when the dragon gets points
scoreTxt.setText('Score: ' + score);
// Update the health text display
if (healthTxt && healthBar) {
healthTxt.setText(healthBar.currentHealth.toString());
}
// Check if health bar reaches 0 to trigger game over
if (healthBar.currentHealth <= 0 && !LK.gameOver) {
LK.effects.flashScreen(0xff0000, 1000); // Flash screen red for 1 second
LK.showGameOver(); // Show game over screen
}
// Regenerate player's health to max when score reaches 1000
if (score >= 1000) {
healthBar.currentHealth = healthBar.maxHealth;
}
// Transition to the next level
var scoreThresholds = [532, 1064, 1596, 2128, 2660]; // Score to complete level 1, 2, 3, 4, 5 respectively
if (level <= 5 && score >= scoreThresholds[level - 1]) {
level++;
if (level > 5) {
LK.showYouWin(); // Player wins after completing level 5
// Potentially add 'return;' here if no other logic should run after winning in this tick
} else {
levelTxt.setText('Level: ' + level);
levelTxtOrange.setText('Level: ' + level);
showLevelTextOnce(); // This function calls startRespawningObjects
// Hide all backgrounds
backgroundLevel1.visible = false;
backgroundLevel2.visible = false;
backgroundLevel3.visible = false;
backgroundLevel4.visible = false;
if (backgroundLevel5) {
backgroundLevel5.visible = false;
}
// Show the current level background and spawn an initial object
if (level === 2) {
backgroundLevel2.visible = true;
var newLavarocks = new Lavarocks();
spheres.push(newLavarocks);
game.addChild(newLavarocks);
newLavarocks.x = Math.random() * (2048 - newLavarocks.width) + newLavarocks.width / 2;
newLavarocks.y = -100; // Initial position off-screen top
} else if (level === 3) {
backgroundLevel3.visible = true;
var newIcerocks = new Icerocks();
spheres.push(newIcerocks);
game.addChild(newIcerocks);
newIcerocks.x = Math.random() * (2048 - newIcerocks.width) + newIcerocks.width / 2;
newIcerocks.y = -100;
} else if (level === 4) {
backgroundLevel4.visible = true;
var newStone = new Stone();
spheres.push(newStone);
game.addChild(newStone);
newStone.x = Math.random() * (2048 - newStone.width) + newStone.width / 2;
newStone.y = -100;
} else if (level === 5) {
if (backgroundLevel5) {
backgroundLevel5.visible = true;
}
var newAirBlock = new AirBlock();
spheres.push(newAirBlock);
game.addChild(newAirBlock);
newAirBlock.x = Math.random() * (2048 - newAirBlock.width) + newAirBlock.width / 2;
newAirBlock.y = -100;
// Add continuous rotation animation to the right for AirBlock
tween(newAirBlock, {
rotation: Math.PI * 2
}, {
duration: 2000,
easing: tween.linear,
onFinish: function onFinish() {
// Start the animation again for continuous rotation
function rotateAirBlock() {
if (newAirBlock && !newAirBlock.destroyed) {
tween(newAirBlock, {
rotation: newAirBlock.rotation + Math.PI * 2
}, {
duration: 2000,
easing: tween.linear,
onFinish: rotateAirBlock
});
}
}
rotateAirBlock();
}
});
}
}
}
// Respawn Lavarocks, Lavarocks1, and Lavarocks2 randomly in level 2
if (level === 2 && !LK.gameOver && LK.ticks % 50 == 0) {
var newLavarock;
for (var i = 0; i < spheres.length; i++) {
if ((spheres[i] instanceof Lavarocks || spheres[i] instanceof Lavarocks1 || spheres[i] instanceof Lavarocks2) && spheres[i].y < -200) {
newLavarock = spheres[i];
break;
}
}
if (!newLavarock) {
var randomType = Math.floor(Math.random() * 3);
if (randomType === 0) {
newLavarock = new Lavarocks();
} else if (randomType === 1) {
newLavarock = new Lavarocks1();
} else {
newLavarock = new Lavarocks2();
}
spheres.push(newLavarock);
game.addChild(newLavarock);
}
var randomScale = 1.0 + Math.random() * 1.0; // Random scale between 1.0 and 2.0
newLavarock.scaleX = randomScale;
newLavarock.scaleY = randomScale;
newLavarock.x = Math.random() * (2048 - newLavarock.width) + newLavarock.width / 2;
newLavarock.y = 2732;
}
// Respawn Icerocks randomly in level 3
if (level === 3 && !LK.gameOver && LK.ticks % 50 == 0) {
var newIcerock;
for (var i = 0; i < spheres.length; i++) {
if ((spheres[i] instanceof Icerocks || spheres[i] instanceof Icerocks1 || spheres[i] instanceof Icerocks2) && spheres[i].y < -200) {
newIcerock = spheres[i];
break;
}
}
if (!newIcerock) {
var randomType = Math.floor(Math.random() * 3);
if (randomType === 0) {
newIcerock = new Icerocks();
} else if (randomType === 1) {
newIcerock = new Icerocks1();
} else {
newIcerock = new Icerocks2();
}
spheres.push(newIcerock);
game.addChild(newIcerock);
}
var randomScaleX = 1.0 + Math.random() * 1.0; // Random scale between 1.0 and 2.0 for width
var randomScaleY = 1.0 + Math.random() * 1.5; // Random scale between 1.0 and 2.5 for height
newIcerock.scaleX = randomScaleX;
newIcerock.scaleY = randomScaleY;
newIcerock.x = Math.random() * (2048 - newIcerock.width) + newIcerock.width / 2;
newIcerock.y = 2732;
}
// Respawn AirBlocks randomly in level 5 (continuous spawning)
if (level === 5 && !LK.gameOver && LK.ticks % 50 == 0) {
var newAirBlock;
for (var i = 0; i < spheres.length; i++) {
if (spheres[i] instanceof AirBlock && spheres[i].y < -200) {
// Check if AirBlock is off-screen
newAirBlock = spheres[i];
break;
}
}
if (!newAirBlock) {
newAirBlock = new AirBlock();
spheres.push(newAirBlock);
game.addChild(newAirBlock);
}
var randomScaleAir = 1.0 + Math.random() * 1.0; // Random scale between 1.0 and 2.0
newAirBlock.scaleX = randomScaleAir;
newAirBlock.scaleY = randomScaleAir;
newAirBlock.x = Math.random() * (2048 - newAirBlock.width) + newAirBlock.width / 2;
newAirBlock.y = 2732; // Spawn at the bottom
// Add continuous rotation animation to the right for AirBlock
tween(newAirBlock, {
rotation: Math.PI * 2
}, {
duration: 2000,
easing: tween.linear,
onFinish: function onFinish() {
// Start the animation again for continuous rotation
function rotateAirBlock() {
if (newAirBlock && !newAirBlock.destroyed) {
tween(newAirBlock, {
rotation: newAirBlock.rotation + Math.PI * 2
}, {
duration: 2000,
easing: tween.linear,
onFinish: rotateAirBlock
});
}
}
rotateAirBlock();
}
});
}
};
// Declare dragNode globally as it's used in event handlers set up in setupActiveGame
var dragNode = null;
// Function to set up and start the actual game after intro
function setupActiveGame() {
// Ensure game backgrounds are set up for level 1
backgroundLevel1.visible = true;
backgroundLevel2.visible = false;
backgroundLevel3.visible = false;
backgroundLevel4.visible = false;
if (backgroundLevel5) {
// Check existence for safety
backgroundLevel5.visible = false;
}
// Play background music
LK.playMusic('Gamemusic1');
// Initialize dragon
dragon = game.addChild(new Dragon());
dragon.x = 2048 / 2;
dragon.y = 200;
// Initialize the animated "Start" text that appears after button press
var animatedStartTxt = new Text2('Start', {
size: 150,
fill: 0xffa500,
// Orange color
font: "'Time new roman',Impact,'Arial Black',Tahoma" //{aF} // Copied from original startTxt
}); //{aG} // Copied from original startTxt
animatedStartTxt.anchor.set(0.5, 0.5);
LK.gui.center.addChild(animatedStartTxt);
// Local function to show the animated "Start" text, then proceed to level announcements
function showAnimatedStartText() {
animatedStartTxt.visible = true;
LK.setTimeout(function () {
animatedStartTxt.visible = false;
// The global showLevelTextTwice function handles level announcements and then calls startRespawningObjects
showLevelTextTwice();
}, 2000);
}
// Initialize level display text (purple)
levelTxt = new Text2('Level: 1', {
// Assign to global levelTxt
size: 100,
fill: 0x800080,
//{aK} // Purple color
font: "'Time new roman',Impact,'Arial Black',Tahoma"
});
levelTxt.anchor.set(1, 1);
LK.gui.bottomRight.addChild(levelTxt);
levelTxt.x = -50;
levelTxt.y = -50;
// Call the function to show the animated "Start" text sequence
showAnimatedStartText();
// Initialize second level display text (orange/yellow, for level announcements)
levelTxtOrange = new Text2('Level: ' + level, {
// Assign to global levelTxtOrange
size: 100,
fill: 0xffff00,
// Yellow color
font: "'Time new roman',Impact,'Arial Black',Tahoma"
});
levelTxtOrange.anchor.set(0.5, 0.5);
LK.gui.center.addChild(levelTxtOrange);
levelTxtOrange.visible = false; // Initially hidden, showLevelTextTwice will manage it
// Initialize score display
scoreTxt = new Text2('Score: 0', {
// Assign to global scoreTxt
size: 100,
fill: 0x800080,
//{bs} // Purple color
font: "'Time new roman',Impact,'Arial Black',Tahoma"
});
scoreTxt.anchor.set(0, 1); // Using the bottom-left positioning from original code
LK.gui.bottomLeft.addChild(scoreTxt);
scoreTxt.x = 50;
scoreTxt.y = -50;
// Initialize health bar
healthBar = game.addChild(new HealthBar()); // Assign to global healthBar
healthBar.x = 120; // Position in top left corner (avoiding platform menu)
healthBar.y = 50; // Position in top left corner
// Initialize health text display
healthTxt = new Text2('500', {
size: 60,
fill: 0xffffff,
// White color
font: "'Time new roman',Impact,'Arial Black',Tahoma"
});
healthTxt.anchor.set(0.5, 0.5); // Center anchor for middle positioning
LK.gui.topLeft.addChild(healthTxt);
healthTxt.x = 120; // Same X position as health bar
healthTxt.y = 50; // Same Y position as health bar
// Setup touch input for dragging the dragon
game.down = function (x, y, obj) {
if (!gameStarted) {
return;
} // Should not be needed here as game.down is set after game starts
dragNode = dragon;
};
game.up = function (x, y, obj) {
if (!gameStarted) {
return;
}
dragNode = null;
};
game.move = function (x, y, obj) {
if (!gameStarted || !dragNode) {
return;
}
var newX = Math.max(dragon.width / 2, Math.min(2048 - dragon.width / 2, x));
var newY = Math.max(dragon.height / 2, Math.min(2732 - dragon.height / 2, y));
dragon.x = newX;
dragon.y = newY;
if (LK.ticks % 15 == 0) {
for (var i = 0; i < 1; i++) {
var assetId;
if (level === 2) {
assetId = 'Shout2';
} else if (level === 3) {
assetId = 'Shout3';
} else if (level === 4) {
assetId = 'Shout4';
} else if (level === 5) {
assetId = 'Shout5';
} else {
assetId = 'Shout1';
}
var fireball = new Fireball(assetId);
if (dragon.x < 2048 / 2) {
fireball.x = dragon.x - 80;
} else {
fireball.x = dragon.x + 80;
}
fireball.y = dragon.y;
tween(fireball, {
rotation: Math.PI * 4
}, {
duration: 1500,
easing: tween.linear
});
fireballs.push(fireball);
game.addChild(fireball);
}
}
};
}
// === Intro Screen Setup (runs when Game Code is parsed) ===
introBackground = LK.getAsset('Introbackground', {
anchorX: 0.5,
anchorY: 0.5
});
introBackground.x = 2048 / 2;
introBackground.y = 2732 / 2;
// Scale intro background to cover the screen, using its own dimensions after LK.getAsset
introBackground.scale.set(2048 / introBackground.width, 2732 / introBackground.height);
game.addChild(introBackground);
// Play intro music during the intro screen
LK.playMusic('Intromusic1');
startButton = LK.getAsset('Startbutton', {
anchorX: 0.5,
anchorY: 0.5
});
startButton.x = 2048 / 2;
startButton.y = 2732 - startButton.height / 2 - 100; // 100px from bottom edge to center of button
startButton.interactive = true; // Essential for the 'down' event
game.addChild(startButton);
startButton.down = function () {
if (gameStarted) {
return;
} // Prevent multiple starts if clicked again rapidly
gameStarted = true;
introBackground.visible = false;
startButton.visible = false;
// For performance, you might want to destroy them if they are truly one-time use:
// introBackground.destroy();
// startButton.destroy();
setupActiveGame(); // This will initialize and start the actual game
};
// The original global showStartText, showLevelTextOnce, showLevelTextTwice, startRespawningObjects functions
// are assumed to be defined elsewhere in the "Game Code" section or are part of what was replaced.
// If showStartText was the one replaced, its logic is now within setupActiveGame as showAnimatedStartText.
// The other functions (showLevelTextOnce, showLevelTextTwice, startRespawningObjects) should still be globally available.
floating land world imagination green colors not pixels no text in the image. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Pack of different standing white dragon of stone on four legs, looking down. HD different mixed colors. Blur. not a sculpt model! the dragon is a real dragon have all things of dragon with opened mouth like he ready to shoot, have eyes opened . Single Game Texture. In-Game asset. 2D. Blank background. High contrast. No shadows.
Different standing dragon on four legs, looking down. have mixed colors. Blur. the dragon is opened mouth like he is ready to shout. Single Game Texture. In-Game asset. 3D. Blank background. High contrast. No shadows.
Different standing dragon of forest on four legs, he's head is down and opened mouth to shout. HD colors. Single Game Texture. In-Game asset. 3D. Blank background. High contrast. No shadows.
Airball of dragon shout. sphere. HD colors.. In-Game asset. 2d. High contrast. No shadows
Airball explosion. sphere. mixed grey with white & blue colors. HD colors In-Game asset. 2d. High contrast. No shadows
Air airball shout of a dragon. sphere. mixed grey with white & blue colors. HD colors In-Game asset. 2d. High contrast. No shadows
Different standing dragons on four legs, looking down. HD colors. the dragon is opened mouth like he is ready to shout. Single Game Texture. In-Game asset. 3D. Blank background. High contrast. No shadows.
standing air dragons on four legs, looking down. HD blue color. the dragon is opened mouth like he is ready to shout. Single Game Texture. In-Game asset. 3D. Blank background. High contrast. No shadows.
Medieval "start game" buttons. HD colors. In-Game asset. High contrast. No shadows. 3D
Medieval 'High score' buttons. HD colors. In-Game asset. High contrast. No shadows. 3D
Airball of dragon shout. sphere. HD colors.. In-Game asset. 2d. High contrast. No shadows