User prompt
Please fix the bug: 'neighborHives is not defined' in or related to this line: 'for (var i = 0; i < neighborHives.length; i++) {' Line Number: 508
User prompt
Ajoute ces fonctionnaliteĢs a bee wars : - ruche voisine : De temps en temps, aleĢatoirement dans le jeu , Des ruches apparaissent sur les plateformes, Quand l'abeille rentre en contact avec ces ruches la, Le joueur peut acheter une abeille suppleĢmentaire pour le jeu (couĢte 50 ml) : L'abeille suppleĢmentaire est une abeille, qui, en tant , normal avance sur la plateforme automatiquement a la suite de l'abeille principale, mais l'abeille suppleĢmentaire ne combat pas les araigneĢes et ne perd pas de points de vies Mais si l'abeille principale viens aĢ mourir (ne plus avoir de points de vies), L'abeille suppleĢmentaire prend sa place, et le joueur peut continuer aĢ jouer avec l'abeille suppleĢmentaire sur la plateforme, pour les combats (l'abeille suppleĢmentaire a donc le meĢme systeĢme de points de vie que l'abeille principale), si le joueur rencontre une ruche et a deĢjaĢ une abeille suppleĢmentaire, il peut en acheter une autre (ou deĢcliner l'abeille suppleĢmentaire), le joueur peut avoir jusqu'aĢ 6 abeilles suppleĢmentaires en jeu, les abeilles suppleĢmentaires sont petites en taille āŖš” Consider importing and using the following plugins: @upit/storage.v1
User prompt
Le boutton reset ne fonctionne pas, corrige ça
User prompt
Au pire fait en sorte que les donneĢes du joueur par rapport au jeu dans localstorage soient remises a 0 depuis le deĢbut du jeu quand le joueur appuie sur le bouton reset , Et fait en sorte que un eĢcran de confirmation s'affiche quand le joueur appuie sur le bouton reset Et quand le joueur appuie sur "oui" sa progression est reĢinitialiser, Par contre s'il appuie sur "non" sur l'eĢcran de confirmation, l'eĢcran de confirmation ce ferme sans reĢinitialiser sa progression āŖš” Consider importing and using the following plugins: @upit/storage.v1
User prompt
Au pire fait en sorte que les donneĢes du joueur par rapport au jeu dans localstorage soient remises a 0 depuis le deĢbut du jeu quand le joueur appuie sur le bouton reset , Et fait en sorte que un eĢcran de confirmation s'affiche quand le joueur appuie sur le bouton reset Et quand le joueur appuie sur "oui" sa progression est reĢinitialiser, Par contre s'il appuie sur "non" sur l'eĢcran de confirmation, l'eĢcran de confirmation ce ferme sans reĢinitialiser sa progression āŖš” Consider importing and using the following plugins: @upit/storage.v1
User prompt
Le boutton reset ne fonctionne pas actuellement, Il doit eĢtre cliquable et doit reĢinitialiser la progression du joueur
User prompt
Maintenant fait en sorte que ce bouton reset fasse revenir le joueur au tout deĢbut du jeu (en faisant un game over qui reĢinitialise la progression), apreĢs une confirmation du joueur āŖš” Consider importing and using the following plugins: @upit/storage.v1
User prompt
Fait en sorte que le boutton reset fonctionne et deĢplace le juste en bas de la bannieĢre affichant le score
User prompt
Fait en sorte que le joueur puisse cliquer sur le bouton reset en appuyant dessus pour recommencer le jeu depuis le deĢbut (niveau 1 ,0 mlk et 0 araigneĢe vaincus) āŖš” Consider importing and using the following plugins: @upit/storage.v1
User prompt
Fait en sorte que le bouton rouge reset soient cliquable pour reĢinitialiser la progression du joueur (recommencer le jeu depuis le deĢbut), Et que le boutton demande une confirmation : EĢtes vous suĢr de reĢinitialiser votre progression depuis le deĢbut ? (je te demande d'implanter tout ça dans le jeu) āŖš” Consider importing and using the following plugins: @upit/storage.v1
User prompt
Fait en sorte que le bouton rouge reset soient cliquable pour reĢinitialiser la progression du joueur (recommencer le jeu depuis le deĢbut), Et que le boutton demande une confirmation : EĢtes vous suĢr de reĢinitialiser votre progression depuis le deĢbut ? (Je te demande d'implanter ça dans le jeu) āŖš” Consider importing and using the following plugins: @upit/storage.v1
User prompt
Fait en sorte que chaque araigneĢe doive eĢtre vaincu individuellement tour par tour pour eĢtre comptabiliseĢs dans les araigneĢes vaincus
User prompt
Ajoute une fonctionnaliteĢ a bee wars : le nombre de plateformes (les trons d'arbres) passeĢs sont deĢsormais compteĢs, Et le joueur peut alors gagner des ML (monnaie du jeu), pour gagner des points de vie! VoilaĢ comment ça fonctionne : Le nombre de ML est afficheĢ dans un petit coin de l'eĢcran , se met a jour deĢs que le joueur en gagne ou en utilise. L'abeille peut gagner des ML de ces façons la : - en passant un certain nombre de plateformes (2 ml gagneĢs tout les 5 trons d'arbres passeĢs sans araigneĢes), - en reĢcompense aĢ chaque niveau atteint (3 ml par niveau atteint avec succeĢs pour les niveaux infeĢrieurs a 10, et 8 ml par niveau atteint pour les niveaux supeĢrieurs a 10) - en reĢcompense de chaque araigneĢe vaincu (1 ml par araigneĢe vaincu) Les ml servent a acheter des points de vie pour l'abeille, afin d'en reĢcupeĢrer, Pour utiliser les ml et acheter des points de vies, Le joueur peut cliquer sur un Boutton blanc avec texte noir "Boutique", et peut choisir entre divers articles de points en fonction de son nombre de ML, voici les articles : 1) 30 points de vie, prix : 2 ml 2) 50 points de vie, prix : 3 ml 3) reĢcupeĢrer 10% de ses points de vie ,sans utiliser de revitalisation, prix : 6 ml 3) reĢcupeĢreĢ 20% de ses points de vie, sans utiliser de revitalisation, prix : 10 ml 4) reĢcupeĢrer 30% de ses points de vie, sans utiliser de revitalisation, prix : 12 ml le nombre de ML est sauvegardeĢ d'un niveau aĢ un autre! Affiche le bouton boutique et le nombre de ML posseĢder juste au dessous de la bannieĢre de niveaux
User prompt
Ajoute une fonctionnaliteĢ a bee wars : le nombre de plateformes (les trons d'arbres) passeĢs sont deĢsormais compteĢs, Et le joueur peut alors gagner des ML (monnaie du jeu), pour gagner des points de vie! VoilaĢ comment ça fonctionne : Le nombre de ML est afficheĢ dans un petit coin de l'eĢcran , se met a jour deĢs que le joueur en gagne ou en utilise. L'abeille peut gagner des ML de ces façons la : - en passant un certain nombre de plateformes (2 ml gagneĢs tout les 5 trons d'arbres passeĢs sans araigneĢes), - en reĢcompense aĢ chaque niveau atteint (3 ml par niveau atteint avec succeĢs pour les niveaux infeĢrieurs a 10, et 8 ml par niveau atteint pour les niveaux supeĢrieurs a 10) - en reĢcompense de chaque araigneĢe vaincu (1 ml par araigneĢe vaincu) Les ml servent a acheter des points de vie pour l'abeille, afin d'en reĢcupeĢrer, Pour utiliser les ml et acheter des points de vies, Le joueur peut cliquer sur un Boutton blanc avec texte noir "Boutique", et peut choisir entre divers articles de points en fonction de son nombre de ML, voici les articles : 1) 30 points de vie, prix : 2 ml 2) 50 points de vie, prix : 3 ml 3) reĢcupeĢrer 10% de ses points de vie ,sans utiliser de revitalisation, prix : 6 ml 3) reĢcupeĢreĢ 20% de ses points de vie, sans utiliser de revitalisation, prix : 10 ml 4) reĢcupeĢrer 30% de ses points de vie, sans utiliser de revitalisation, prix : 12 ml le nombre de ML est sauvegardeĢ d'un niveau aĢ un autre! āŖš” Consider importing and using the following plugins: @upit/storage.v1
User prompt
fait en sorte que l'abeille ne reĢcupeĢre pas ses points de vie sauf : Si le joueur utilise la revitalisation sur le bouton revitaliser (utilisable seulement 2/3 fois par niveau comme j'ai dit) Ou aĢ chaque nouveau niveau atteint
User prompt
Fait en sorte que la bannieĢre qui affiche le niveau soit mise a jour a chaque nouveau niveau atteint pour mettre le niveau actuel
User prompt
Regles les probleĢmes d'affichage lieĢs au niveau du joueur Et fait en sorte d'extendre le niveau maximal du jeu au niveau 100
User prompt
Personnalise le game over par : L'araigneĢe ta vaincu , tu es morte, petite abeille šš! fait en sorte que l'abeille ne puisse reĢcupeĢrer 20 % de ses points de vie seulement 3 fois par niveau, et que pour que l'abeille reĢcupeĢre 20 % de ses points de vie le joueur doit appuyer sur le boutton bleu "Revitaliser" juste sous le boutton d'attaque quand il est en train d'attaquer une araigneĢe, l'abeille doit aussi avoir vaincu au moins 3 araigneĢes si elle est niveau infeĢrieur a 3 pour pouvoir reĢcupeĢrer ses points de vies, Si elle est de niveau infeĢrieur a 3, ce nombre monte aĢ 6 araigneĢes requises
User prompt
Fait en sorte que le joueur ne puisse monter que d'1 seul niveau a la fois
User prompt
Fait en sorte que le boutton reset fait redeĢmarrer le joueur a partir du deĢbut du jeu et du niveau 1
User prompt
Le boutton reset fonctionne pas, regle ça
User prompt
Regle les probleĢmes, le boutton reset doit reĢinitialiser le jeu a partir du niveau 1 lorsque le joueur appuie dessus , et le boutton doit etre appuyable nimporte quand sur teĢleĢphone
User prompt
Fait en sorte que ce boutton reset permettent, lorsque le joueur appuie dessus, au joueur de reĢinitialiser sa progression et de retourner au niveau 1
User prompt
Affiche le boutton reset qui permet au joueur de reĢinitialiser sa progression a partir du niveau 1 quand il le veut, quelque part a l'eĢcran, le joueur peut alors appuyer dessus pour reĢinitialiser sa progression, mets le juste en dessous du texte du nombre d'araigneĢes vaincu
User prompt
Affiche le boutton reset qui permet au joueur de reĢinitialiser sa progression a partir du niveau 1 quand il le veut, quelque part a l'eĢcran, le joueur peut alors appuyer dessus pour reĢinitialiser sa progression, affiche ce boutton dans L'ui du jeu, juste dans un coin accessible
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { currentLevel: 1 }); /**** * Classes ****/ var BattleUI = Container.expand(function () { var self = Container.call(this); var panel = self.attachAsset('battlePanel', { anchorX: 0.5, anchorY: 0.5, alpha: 0.8 }); var attackBtn = self.attachAsset('attackButton', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 200 }); self.beeHealthBar = self.attachAsset('healthBar', { anchorX: 0, anchorY: 0.5, x: -300, y: -150 }); self.spiderHealthBar = self.attachAsset('healthBar', { anchorX: 0, anchorY: 0.5, x: 0, y: -150 }); var beeHealthText = new Text2("Bee: 100/100", { size: 40, fill: 0xFFFFFF }); beeHealthText.anchor.set(0, 0.5); beeHealthText.x = -300; beeHealthText.y = -200; self.addChild(beeHealthText); var spiderHealthText = new Text2("Spider: 50/50", { size: 40, fill: 0xFFFFFF }); spiderHealthText.anchor.set(0, 0.5); spiderHealthText.x = 0; spiderHealthText.y = -200; self.addChild(spiderHealthText); var turnText = new Text2("Your Turn", { size: 60, fill: 0xFFFFFF }); turnText.anchor.set(0.5, 0.5); turnText.y = -300; self.addChild(turnText); var attackText = new Text2("Attack", { size: 50, fill: 0xFFFFFF }); attackText.anchor.set(0.5, 0.5); attackText.x = 0; attackText.y = 200; self.addChild(attackText); self.updateHealth = function (beeHealth, beeMaxHealth, spiderHealth, spiderMaxHealth) { // Update health bars self.beeHealthBar.scale.x = beeHealth / beeMaxHealth; self.spiderHealthBar.scale.x = spiderHealth / spiderMaxHealth; // Update text beeHealthText.setText("Bee: " + beeHealth + "/" + beeMaxHealth); spiderHealthText.setText("Spider: " + spiderHealth + "/" + spiderMaxHealth); }; self.setTurnText = function (isPlayerTurn) { turnText.setText(isPlayerTurn ? "Your Turn" : "Spider's Turn"); }; self.down = function (x, y, obj) { // Check if attack button was pressed if (x >= attackBtn.x - attackBtn.width / 2 && x <= attackBtn.x + attackBtn.width / 2 && y >= attackBtn.y - attackBtn.height / 2 && y <= attackBtn.y + attackBtn.height / 2) { if (self.onAttackPressed && game.battleState.isPlayerTurn) { self.onAttackPressed(); } } }; return self; }); var Bee = Container.expand(function () { var self = Container.call(this); var beeGraphic = self.attachAsset('bee', { anchorX: 0.5, anchorY: 0.5 }); self.velocityX = 0; self.velocityY = 0; self.speed = 8; self.jumpForce = -20; self.gravity = 1; self.onGround = false; self.health = 100; self.maxHealth = 100; self.baseMaxHealth = 100; // Base health value self.isJumping = false; self.fallingInVoid = false; self.update = function () { // Apply gravity if (!self.onGround) { self.velocityY += self.gravity; } // Update position self.x += self.velocityX; self.y += self.velocityY; // Reset onGround flag for next frame collision detection self.onGround = false; }; self.moveUp = function () { // Only allow moving up when not jumping if (!self.isJumping) { self.velocityY = -self.speed * 0.8; // Slower than horizontal movement } }; self.jump = function () { if (self.onGround) { self.velocityY = self.jumpForce; self.onGround = false; self.isJumping = true; LK.getSound('jump').play(); } }; self.moveLeft = function () { self.velocityX = -self.speed; }; self.moveRight = function () { self.velocityX = self.speed; }; self.stopMoving = function () { self.velocityX = 0; }; self.takeDamage = function (amount) { self.health -= amount; if (self.health < 0) { self.health = 0; } LK.getSound('hurt').play(); }; self.heal = function (amount) { self.health += amount; if (self.health > self.maxHealth) { self.health = self.maxHealth; } }; return self; }); var ControlsUI = Container.expand(function () { var self = Container.call(this); // Left button var leftBtn = self.attachAsset('attackButton', { anchorX: 0.5, anchorY: 0.5, x: -800, y: 0, tint: 0x0000FF }); var leftText = new Text2("<", { size: 80, fill: 0xFFFFFF }); leftText.anchor.set(0.5, 0.5); leftText.x = -800; self.addChild(leftText); // Right button var rightBtn = self.attachAsset('attackButton', { anchorX: 0.5, anchorY: 0.5, x: -400, y: 0, tint: 0x0000FF }); var rightText = new Text2(">", { size: 80, fill: 0xFFFFFF }); rightText.anchor.set(0.5, 0.5); rightText.x = -400; self.addChild(rightText); // Jump button var jumpBtn = self.attachAsset('attackButton', { anchorX: 0.5, anchorY: 0.5, x: 800, y: 0, tint: 0x00FF00 }); var jumpText = new Text2("Jump", { size: 50, fill: 0xFFFFFF }); jumpText.anchor.set(0.5, 0.5); jumpText.x = 800; self.addChild(jumpText); // Up button var upBtn = self.attachAsset('attackButton', { anchorX: 0.5, anchorY: 0.5, x: 0, y: -80, tint: 0x0099FF }); var upText = new Text2("Up", { size: 50, fill: 0xFFFFFF }); upText.anchor.set(0.5, 0.5); upText.x = 0; upText.y = -80; self.addChild(upText); self.down = function (x, y, obj) { // Check if left button was pressed if (x >= leftBtn.x - leftBtn.width / 2 && x <= leftBtn.x + leftBtn.width / 2 && y >= leftBtn.y - leftBtn.height / 2 && y <= leftBtn.y + leftBtn.height / 2) { if (self.onLeftPressed) { self.onLeftPressed(); } } // Check if right button was pressed if (x >= rightBtn.x - rightBtn.width / 2 && x <= rightBtn.x + rightBtn.width / 2 && y >= rightBtn.y - rightBtn.height / 2 && y <= rightBtn.y + rightBtn.height / 2) { if (self.onRightPressed) { self.onRightPressed(); } } // Check if jump button was pressed if (x >= jumpBtn.x - jumpBtn.width / 2 && x <= jumpBtn.x + jumpBtn.width / 2 && y >= jumpBtn.y - jumpBtn.height / 2 && y <= jumpBtn.y + jumpBtn.height / 2) { if (self.onJumpPressed) { self.onJumpPressed(); } } // Check if up button was pressed if (x >= upBtn.x - upBtn.width / 2 && x <= upBtn.x + upBtn.width / 2 && y >= upBtn.y - upBtn.height / 2 && y <= upBtn.y + upBtn.height / 2) { if (self.onUpPressed) { self.onUpPressed(); } } }; self.up = function (x, y, obj) { // When buttons are released, stop movement if (self.onControlsReleased) { self.onControlsReleased(); } }; return self; }); var FinishLine = Container.expand(function () { var self = Container.call(this); var finishLineGraphic = self.attachAsset('finishLine', { anchorX: 0.5, anchorY: 0.5 }); self.width = finishLineGraphic.width; self.height = finishLineGraphic.height; return self; }); var Platform = Container.expand(function () { var self = Container.call(this); var platformGraphic = self.attachAsset('platform', { anchorX: 0.5, anchorY: 0.5 }); self.width = platformGraphic.width; self.height = platformGraphic.height; // Handle touch on platform self.down = function (x, y, obj) { if (gameState === "platform" && !dragTarget) { // Move bee to this platform self.moveBeeToThisPlatform(); } }; // Function to move the bee to this platform self.moveBeeToThisPlatform = function () { // Stop current movement bee.velocityX = 0; bee.velocityY = 0; // Play jump sound LK.getSound('jump').play(); // Calculate target position on top of platform var targetX = self.x; var targetY = self.y - self.height / 2 - bee.height / 2; // Create a tween animation for bee to jump to the platform tween(bee, { x: targetX, y: targetY }, { duration: 800, easing: tween.easeOutQuad, onFinish: function onFinish() { bee.onGround = true; bee.isJumping = false; bee.fallingInVoid = false; // Ensure the bee stays on this platform by locking position bee.x = targetX; bee.y = targetY; // Make sure velocity is zero so it doesn't start moving/falling bee.velocityX = 0; bee.velocityY = 0; // Check if there's a spider on this platform and make it move away for (var i = 0; i < spiders.length; i++) { var spider = spiders[i]; if (!spider.defeated && spider.currentPlatform === self) { spider.moveAwayFromBee(bee); } } } }); }; return self; }); var Spider = Container.expand(function () { var self = Container.call(this); var spiderGraphic = self.attachAsset('spider', { anchorX: 0.5, anchorY: 0.5 }); self.baseMaxHealth = 50; // Base health that will be scaled with level self.health = 50; self.maxHealth = 50; self.attackDamage = 15; self.defeated = false; self.currentPlatform = null; self.moving = false; self.encounteredByPlayer = false; // Track if player has encountered this spider self.moveAwayFromBee = function (bee) { if (self.moving || self.defeated) { return; } self.moving = true; // Store bee's original position to ensure it doesn't fall var originalBeeY = bee.y; var originalBeeX = bee.x; var isOnSamePlatform = bee.onGround && Math.abs(bee.x - self.x) < self.currentPlatform.width * 0.8; var keepBeeOnPlatform = isOnSamePlatform; // Find nearby platforms to move to var nearbyPlatforms = []; for (var i = 0; i < platforms.length; i++) { // Don't include current platform or platforms too far away if (platforms[i] !== self.currentPlatform && Math.abs(platforms[i].x - self.x) < 800) { nearbyPlatforms.push(platforms[i]); } } // If no nearby platforms, just return if (nearbyPlatforms.length === 0) { self.moving = false; return; } // Sort platforms by distance from bee nearbyPlatforms.sort(function (a, b) { var distA = Math.abs(a.x - bee.x); var distB = Math.abs(b.x - bee.x); return distB - distA; // Further platforms first }); // Get target platform (furthest from bee) var targetPlatform = nearbyPlatforms[0]; var targetX = targetPlatform.x; var targetY = targetPlatform.y - targetPlatform.height / 2 - self.height / 2; // Animate spider moving to new platform tween(self, { x: targetX, y: targetY }, { duration: 500, easing: tween.easeOutQuad, onFinish: function onFinish() { self.currentPlatform = targetPlatform; self.moving = false; // Ensure bee stays on platform if it was on the same platform as spider if (keepBeeOnPlatform) { bee.x = originalBeeX; bee.y = originalBeeY; bee.onGround = true; bee.velocityY = 0; bee.isJumping = false; } } }); }; self.takeDamage = function (amount) { self.health -= amount; if (self.health <= 0) { self.health = 0; self.defeated = true; } }; self.attack = function () { return self.attackDamage; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB // Sky blue background }); /**** * Game Code ****/ // Game state variables // Initialize bee asset // Initialize spider assets // Initialize platform assets // Initialize finish line // Initialize battle UI elements // Initialize sounds // Initialize music var currentLevel = storage.currentLevel || 1; var maxLevels = 100; var gameState = "platform"; // "platform" or "battle" var platforms = []; var spiders = []; var finishLine; var bee; var battleUI; var controlsUI; var levelText; var spidersDefeatedText; // Text element for displaying spiders defeated count var dragTarget = null; // Track if the bee is being dragged var levelScrolling = false; // Whether the platforms are moving var scrollSpeed = -3; // Horizontal scroll speed var platformGenerationTimer = null; // Timer for platform generation var spiderGenerationTimer = null; // Timer for spider generation var lastPlatformX = 0; // Track last platform position for generation // ML (monnaie du jeu) system var ml = typeof storage.ml === "number" ? storage.ml : 0; var mlText = null; var platformsPassed = 0; var platformsPassedSinceLastML = 0; var lastBeePlatform = null; var boutiqueButton = null; var boutiquePanel = null; var boutiqueItems = []; var boutiqueOpen = false; // Battle state game.battleState = { currentSpider: null, isPlayerTurn: true, turnDelay: 1000 // ms }; // Initialize level function initLevel(level) { // Reset level scrolling levelScrolling = false; if (platformGenerationTimer) { LK.clearInterval(platformGenerationTimer); platformGenerationTimer = null; } if (spiderGenerationTimer) { LK.clearInterval(spiderGenerationTimer); spiderGenerationTimer = null; } // Clear existing elements platforms = []; spiders = []; // Remove old elements from game while (game.children.length > 0) { game.removeChild(game.children[0]); } // Create bee bee = new Bee(); bee.x = 150; // Update bee's max health based on level (50 more health per level) bee.maxHealth = bee.baseMaxHealth + (level - 1) * 50; bee.health = bee.maxHealth; // Réinitialise le compteur d'utilisations de Revitaliser à chaque niveau bee.healUses = 0; // Create first platform to ensure bee starts on a platform var firstPlatform = new Platform(); firstPlatform.x = 200; firstPlatform.y = 2732 / 2 + 100; platforms.push(firstPlatform); game.addChild(firstPlatform); // Position bee on first platform bee.x = firstPlatform.x; bee.y = firstPlatform.y - firstPlatform.height / 2 - bee.height / 2; bee.onGround = true; game.addChild(bee); // Create platforms based on level var platformCount = 5 + level; var platformWidth = 400; var platformHeight = 30; var minPlatformY = 500; var maxPlatformY = 2732 - 500; var platformSpacing = 2048 / platformCount; for (var i = 0; i < platformCount; i++) { var platform = new Platform(); platform.x = i * platformSpacing + platformSpacing / 2; platform.y = minPlatformY + Math.random() * (maxPlatformY - minPlatformY); platforms.push(platform); game.addChild(platform); } // Create spiders based on level var spiderCount = level; for (var i = 0; i < spiderCount; i++) { var spider = new Spider(); // Update spider's max health based on level (20 more health per level) spider.maxHealth = spider.baseMaxHealth + (level - 1) * 20; spider.health = spider.maxHealth; // Position spiders on platforms, starting from the second platform var platformIndex = Math.floor((i + 1) * (platformCount - 1) / spiderCount); spider.x = platforms[platformIndex].x; spider.y = platforms[platformIndex].y - platforms[platformIndex].height / 2 - spider.height / 2; spider.currentPlatform = platforms[platformIndex]; spiders.push(spider); game.addChild(spider); } // Create finish line finishLine = new FinishLine(); finishLine.x = 2048 - 100; finishLine.y = platforms[platformCount - 1].y - platforms[platformCount - 1].height / 2 - finishLine.height / 2; game.addChild(finishLine); // Create controls UI controlsUI = new ControlsUI(); controlsUI.x = 2048 / 2; controlsUI.y = 2732 - 150; LK.gui.addChild(controlsUI); // Set up controls controlsUI.onLeftPressed = function () { bee.moveLeft(); }; controlsUI.onRightPressed = function () { bee.moveRight(); }; controlsUI.onJumpPressed = function () { bee.jump(); }; controlsUI.onUpPressed = function () { bee.moveUp(); }; controlsUI.onControlsReleased = function () { bee.stopMoving(); }; // Create spiders defeated counter spidersDefeated = 0; spidersDefeatedText = new Text2("Spiders: 0", { size: 40, fill: 0xFFFFFF }); spidersDefeatedText.anchor.set(0, 0); spidersDefeatedText.x = 50; spidersDefeatedText.y = 100; LK.gui.topLeft.addChild(spidersDefeatedText); // Always reset spidersDefeated to 0 at the start of each level spidersDefeated = 0; spidersDefeatedText.setText("Spiders: " + spidersDefeated); // Reset platform counters for ML platformsPassed = 0; platformsPassedSinceLastML = 0; lastBeePlatform = null; // Remove previous levelText if it exists if (levelText && levelText.parent) { levelText.parent.removeChild(levelText); } levelText = null; // Remove previous spidersDefeatedText if it exists if (spidersDefeatedText && spidersDefeatedText.parent) { spidersDefeatedText.parent.removeChild(spidersDefeatedText); } spidersDefeatedText = null; // Remove previous ML text if it exists if (mlText && mlText.parent) { mlText.parent.removeChild(mlText); } mlText = null; // Remove previous boutique button/panel if they exist if (boutiqueButton && boutiqueButton.parent) { boutiqueButton.parent.removeChild(boutiqueButton); } boutiqueButton = null; if (boutiquePanel && boutiquePanel.parent) { boutiquePanel.parent.removeChild(boutiquePanel); } boutiquePanel = null; boutiqueOpen = false; // Create level display text levelText = new Text2("Niveau : " + currentLevel + " / " + maxLevels, { size: 60, fill: 0xFFFFFF }); levelText.anchor.set(0.5, 0); LK.gui.top.addChild(levelText); // Create spiders defeated counter spidersDefeatedText = new Text2("Spiders: " + spidersDefeated, { size: 40, fill: 0xFFFFFF }); spidersDefeatedText.anchor.set(0, 0); spidersDefeatedText.x = 50; spidersDefeatedText.y = 100; LK.gui.topLeft.addChild(spidersDefeatedText); // ML counter (just below the level banner, left-aligned to levelText) mlText = new Text2("ML: " + ml, { size: 40, fill: 0x000000 }); mlText.anchor.set(0.5, 0); mlText.x = levelText.x; mlText.y = levelText.y + levelText.height + 10; LK.gui.top.addChild(mlText); // Boutique button (just below ML counter, left-aligned to levelText) boutiqueButton = LK.getAsset('attackButton', { anchorX: 0.5, anchorY: 0.0, scaleX: 0.4, scaleY: 0.4, x: levelText.x, y: mlText.y + mlText.height + 10, tint: 0xffffff }); var boutiqueBtnText = new Text2("Boutique", { size: 30, fill: 0x000000 }); boutiqueBtnText.anchor.set(0.5, 0.5); boutiqueBtnText.x = levelText.x; boutiqueBtnText.y = boutiqueButton.y + boutiqueButton.height * boutiqueButton.scaleY / 2; LK.gui.top.addChild(boutiqueButton); LK.gui.top.addChild(boutiqueBtnText); // Create reset button just below the spiders defeated counter in the UI var resetButton = LK.getAsset('attackButton', { anchorX: 0.0, anchorY: 0.0, scaleX: 0.5, scaleY: 0.5, x: 50, y: 100 + spidersDefeatedText.height + 20, // 20px below the spiders counter tint: 0xFF4444 }); var resetText = new Text2("Reset", { size: 30, fill: 0xFFFFFF }); resetText.anchor.set(0, 0.5); resetText.x = 50 + resetButton.width * resetButton.scaleX / 2; resetText.y = resetButton.y + resetButton.height * resetButton.scaleY / 2; // Add to the same UI container as spidersDefeatedText (topLeft) LK.gui.topLeft.addChild(resetButton); LK.gui.topLeft.addChild(resetText); // Make reset button interactive and always tappable resetButton.interactive = true; resetButton.down = function (x, y, obj) { // Always allow reset, regardless of game state, and always check bounds if (x >= resetButton.x && x <= resetButton.x + resetButton.width * resetButton.scaleX && y >= resetButton.y && y <= resetButton.y + resetButton.height * resetButton.scaleY) { // Reset to level 1 and reset progression, and fully restart the game currentLevel = 1; storage.currentLevel = 1; spidersDefeated = 0; LK.setScore(0); // Remove previous levelText if it exists if (levelText && levelText.parent) { levelText.parent.removeChild(levelText); } levelText = null; // Remove previous spidersDefeatedText if it exists if (spidersDefeatedText && spidersDefeatedText.parent) { spidersDefeatedText.parent.removeChild(spidersDefeatedText); } spidersDefeatedText = null; // Defensive: Remove reset button and text if they exist to avoid duplicates if (resetButton && resetButton.parent) { resetButton.parent.removeChild(resetButton); } if (resetText && resetText.parent) { resetText.parent.removeChild(resetText); } // Remove all children from game and GUI overlays to ensure a full reset while (game.children.length > 0) { game.removeChild(game.children[0]); } if (LK.gui && LK.gui.topLeft && LK.gui.topLeft.children) { for (var i = LK.gui.topLeft.children.length - 1; i >= 0; i--) { LK.gui.topLeft.removeChild(LK.gui.topLeft.children[i]); } } if (LK.gui && LK.gui.top && LK.gui.top.children) { for (var i = LK.gui.top.children.length - 1; i >= 0; i--) { LK.gui.top.removeChild(LK.gui.top.children[i]); } } if (LK.gui && LK.gui.topRight && LK.gui.topRight.children) { for (var i = LK.gui.topRight.children.length - 1; i >= 0; i--) { LK.gui.topRight.removeChild(LK.gui.topRight.children[i]); } } // Re-initialize the level and UI from the very beginning initLevel(currentLevel); } }; // Boutique button handler boutiqueButton.interactive = true; boutiqueButton.down = function (x, y, obj) { if (boutiqueOpen) { // Hide boutique if (boutiquePanel && boutiquePanel.parent) { boutiquePanel.parent.removeChild(boutiquePanel); } boutiquePanel = null; boutiqueOpen = false; return; } // Show boutique if (boutiquePanel && boutiquePanel.parent) { boutiquePanel.parent.removeChild(boutiquePanel); } boutiquePanel = new Container(); boutiquePanel.x = 2048 / 2; boutiquePanel.y = 2732 / 2; // Background var bg = LK.getAsset('battlePanel', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7, alpha: 0.95 }); boutiquePanel.addChild(bg); // Title var title = new Text2("Boutique", { size: 70, fill: 0x000000 }); title.anchor.set(0.5, 0); title.y = -bg.height * 0.3 + 40; boutiquePanel.addChild(title); // Items var items = [{ label: "30 points de vie", price: 2, heal: 30, percent: 0 }, { label: "50 points de vie", price: 3, heal: 50, percent: 0 }, { label: "Récupérer 10% de vie", price: 6, heal: 0, percent: 0.10 }, { label: "Récupérer 20% de vie", price: 10, heal: 0, percent: 0.20 }, { label: "Récupérer 30% de vie", price: 12, heal: 0, percent: 0.30 }]; boutiqueItems = []; for (var i = 0; i < items.length; i++) { (function (idx) { var item = items[idx]; var y = -bg.height * 0.15 + idx * 120; var btn = LK.getAsset('attackButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.5, x: 0, y: y, tint: 0xffffff }); var txt = new Text2(item.label + " (" + item.price + " ML)", { size: 40, fill: 0x000000 }); txt.anchor.set(0.5, 0.5); txt.x = 0; txt.y = y; boutiquePanel.addChild(btn); boutiquePanel.addChild(txt); btn.interactive = true; btn.down = function (xx, yy, obj2) { // Check ML if (ml < item.price) { title.setText("Pas assez de ML !"); return; } // Heal logic var healAmount = item.heal; if (item.percent > 0) { healAmount = Math.floor(bee.maxHealth * item.percent); } if (healAmount > 0) { bee.heal(healAmount); } // Deduct ML ml -= item.price; if (ml < 0) ml = 0; storage.ml = ml; if (mlText) mlText.setText("ML: " + ml); title.setText("Achat réussi !"); // Hide boutique after purchase LK.setTimeout(function () { if (boutiquePanel && boutiquePanel.parent) { boutiquePanel.parent.removeChild(boutiquePanel); } boutiquePanel = null; boutiqueOpen = false; }, 700); }; boutiqueItems.push(btn); })(i); } // Close button var closeBtn = LK.getAsset('attackButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.5, scaleY: 0.5, x: 0, y: bg.height * 0.3 - 60, tint: 0x000000 }); var closeTxt = new Text2("Fermer", { size: 35, fill: 0xffffff }); closeTxt.anchor.set(0.5, 0.5); closeTxt.x = 0; closeTxt.y = bg.height * 0.3 - 60; boutiquePanel.addChild(closeBtn); boutiquePanel.addChild(closeTxt); closeBtn.interactive = true; closeBtn.down = function (xx, yy, obj2) { if (boutiquePanel && boutiquePanel.parent) { boutiquePanel.parent.removeChild(boutiquePanel); } boutiquePanel = null; boutiqueOpen = false; }; LK.gui.addChild(boutiquePanel); boutiqueOpen = true; }; // Reset spiders defeated counter for this level spidersDefeated = 0; // Create score display scoreText = new Text2("Score: " + LK.getScore(), { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(1, 0); scoreText.x = -50; LK.gui.topRight.addChild(scoreText); // Set game state gameState = "platform"; // Play background music LK.playMusic('gameMusic'); } // Start battle with a spider function startBattle(spider) { // Check if already in battle mode - prevent multiple battles at once if (gameState === "battle") { return; } // Store bee's position and ground state before battle var originalBeeX = bee.x; var originalBeeY = bee.y; var originalOnGround = bee.onGround; gameState = "battle"; game.battleState.currentSpider = spider; // Mark spider as encountered by player spider.encounteredByPlayer = true; game.battleState.isPlayerTurn = true; // Keep bee in place by setting velocities to zero bee.velocityX = 0; bee.velocityY = 0; // Create battle UI battleUI = new BattleUI(); battleUI.x = 2048 / 2; battleUI.y = 2732 / 2; battleUI.updateHealth(bee.health, bee.maxHealth, spider.health, spider.maxHealth); battleUI.setTurnText(true); game.addChild(battleUI); // --- Ajout du bouton Revitaliser --- if (typeof bee.healUses === "undefined") bee.healUses = 0; bee.healUses = 0; // Reset heal uses at start of each battle // Crée le bouton bleu "Revitaliser" sous le bouton d'attaque var healBtn = LK.getAsset('attackButton', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 320, tint: 0x3399FF }); battleUI.addChild(healBtn); var healText = new Text2("Revitaliser", { size: 40, fill: 0xFFFFFF }); healText.anchor.set(0.5, 0.5); healText.x = 0; healText.y = 320; battleUI.addChild(healText); // Affichage du nombre d'utilisations restantes var healUsesText = new Text2("3 utilisations restantes", { size: 30, fill: 0xFFFFFF }); healUsesText.anchor.set(0.5, 0.5); healUsesText.x = 0; healUsesText.y = 370; battleUI.addChild(healUsesText); // Handler pour le bouton Revitaliser healBtn.interactive = true; healBtn.down = function (x, y, obj) { // Conditions pour pouvoir se soigner var canHeal = false; var spidersRequired = currentLevel < 3 ? 3 : 6; if (spidersDefeated >= spidersRequired && bee.healUses < 3 && game.battleState.isPlayerTurn) { canHeal = true; } if (canHeal) { var healAmount = Math.floor(bee.maxHealth * 0.2); bee.heal(healAmount); bee.healUses++; battleUI.updateHealth(bee.health, bee.maxHealth, game.battleState.currentSpider.health, game.battleState.currentSpider.maxHealth); // Feedback visuel LK.effects.flashObject(bee, 0x00ccff, 300); } // Met à jour le texte d'utilisation var usesLeft = 3 - bee.healUses; healUsesText.setText(usesLeft + " utilisation" + (usesLeft === 1 ? "" : "s") + " restante" + (usesLeft > 1 ? "s" : "")); // Message si non autorisé if (!canHeal && game.battleState.isPlayerTurn) { if (bee.healUses >= 3) { healUsesText.setText("Limite atteinte ce niveau"); } else if (spidersDefeated < spidersRequired) { healUsesText.setText("Vaincs " + spidersRequired + " araignées pour te soigner"); } } }; // Set up attack button handler battleUI.onAttackPressed = function () { if (game.battleState.isPlayerTurn) { playerAttack(); } }; // Store original position and state in battle state for recovery after battle game.battleState.originalBeeX = originalBeeX; game.battleState.originalBeeY = originalBeeY; game.battleState.originalOnGround = originalOnGround; } // Player attacks in battle function playerAttack() { var damage = 20 + Math.floor(Math.random() * 10); // 20-29 damage game.battleState.currentSpider.takeDamage(damage); LK.getSound('attack').play(); // Update battle UI battleUI.updateHealth(bee.health, bee.maxHealth, game.battleState.currentSpider.health, game.battleState.currentSpider.maxHealth); // Flash effect on spider LK.effects.flashObject(game.battleState.currentSpider, 0xFF0000, 300); // Check if spider is defeated if (game.battleState.currentSpider.defeated) { LK.setTimeout(function () { endBattle(true); }, 1000); return; } // Switch turns game.battleState.isPlayerTurn = false; battleUI.setTurnText(false); // Spider attacks after delay LK.setTimeout(function () { spiderAttack(); }, game.battleState.turnDelay); } // Spider attacks in battle function spiderAttack() { // Spider attack now deals random damage between 1 and 20 var damage = 1 + Math.floor(Math.random() * 20); bee.takeDamage(damage); LK.getSound('hurt').play(); // Update battle UI battleUI.updateHealth(bee.health, bee.maxHealth, game.battleState.currentSpider.health, game.battleState.currentSpider.maxHealth); // Flash effect on bee LK.effects.flashObject(bee, 0xFF0000, 300); // Check if bee is defeated if (bee.health <= 0) { LK.setTimeout(function () { endBattle(false); }, 1000); return; } // Switch turns game.battleState.isPlayerTurn = true; battleUI.setTurnText(true); } // End battle function endBattle(playerWon) { // Remove battle UI game.removeChild(battleUI); if (playerWon) { // Mark spider as defeated game.battleState.currentSpider.defeated = true; // Make spider invisible game.battleState.currentSpider.alpha = 0; // Increase score LK.setScore(LK.getScore() + 100); scoreText.setText("Score: " + LK.getScore()); // Only increment spiders defeated counter if the spider was properly encountered and defeated manually in battle // Ensure only one spider is counted at a time if (game.battleState.currentSpider.encounteredByPlayer && !game.battleState.currentSpider.countedAsDefeated) { spidersDefeated++; game.battleState.currentSpider.countedAsDefeated = true; spidersDefeatedText.setText("Spiders: " + spidersDefeated); // Award 1 ML per spider defeated ml += 1; storage.ml = ml; if (mlText) mlText.setText("ML: " + ml); } // Bee ne récupère plus de points de vie automatiquement après victoire (sauf lors du passage de niveau ou revitaliser) // (Bloc supprimé pour respecter la nouvelle règle) // Only allow one level up at a time and require progressive spider defeats // Level 1: 5 spiders, Level 2: 10, Level 3: 20, Level 4: 40, Level 5: 80, etc. (doubles each level) var spidersNeededForNextLevel = 5 * Math.pow(2, currentLevel - 1); // Game now has 100 levels var maxLevels = 100; // Check if player is at max level and has defeated enough spiders if (currentLevel >= maxLevels && spidersDefeated >= spidersNeededForNextLevel) { // Display victory message var victoryContainer = new Container(); victoryContainer.x = 2048 / 2; victoryContainer.y = 2732 / 2; var victoryBackground = LK.getAsset('battlePanel', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.2, scaleY: 1.2, alpha: 0.9 }); victoryContainer.addChild(victoryBackground); var victoryText = new Text2("Merci d'avoir joué a Bee Wars!\nFélicitations tu as compléter le jeu!\nA bientÓt pour de futures jeux de clem27games !", { size: 80, fill: 0xFF69B4 // Pink color }); victoryText.anchor.set(0.5, 0.5); victoryContainer.addChild(victoryText); game.addChild(victoryContainer); // Create OK button to reset game var okButton = LK.getAsset('attackButton', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 200, tint: 0x00FF00 }); victoryContainer.addChild(okButton); var okText = new Text2("OK", { size: 60, fill: 0xFFFFFF }); okText.anchor.set(0.5, 0.5); okText.x = 0; okText.y = 200; victoryContainer.addChild(okText); // Add down handler to the container victoryContainer.down = function (x, y, obj) { // Check if OK button was pressed if (x >= okButton.x - okButton.width / 2 && x <= okButton.x + okButton.width / 2 && y >= okButton.y - okButton.height / 2 && y <= okButton.y + okButton.height / 2) { // Reset to level 1 currentLevel = 1; storage.currentLevel = 1; // Remove previous levelText if it exists if (levelText && levelText.parent) { levelText.parent.removeChild(levelText); } levelText = null; // Remove previous spidersDefeatedText if it exists if (spidersDefeatedText && spidersDefeatedText.parent) { spidersDefeatedText.parent.removeChild(spidersDefeatedText); } spidersDefeatedText = null; initLevel(currentLevel); game.removeChild(victoryContainer); } }; return; // Exit function early } else if (spidersDefeated >= spidersNeededForNextLevel && currentLevel < maxLevels) { // Only allow a single level up at a time, even if player has defeated more spiders than needed // Restore bee health before advancing to next level bee.health = bee.maxHealth; LK.setTimeout(function () { currentLevel++; storage.currentLevel = currentLevel; // Reset spiders defeated for the new level spidersDefeated = 0; spidersDefeatedText.setText("Spiders: " + spidersDefeated); // Update the level banner to show the new level if (levelText) { levelText.setText("Niveau : " + currentLevel + " / " + maxLevels); } initLevel(currentLevel); }, 1000); } } else { // Reset to level 1 on defeat currentLevel = 1; storage.currentLevel = 1; // Remove previous levelText if it exists if (levelText && levelText.parent) { levelText.parent.removeChild(levelText); } levelText = null; // Remove previous spidersDefeatedText if it exists if (spidersDefeatedText && spidersDefeatedText.parent) { spidersDefeatedText.parent.removeChild(spidersDefeatedText); } spidersDefeatedText = null; initLevel(currentLevel); // Game over if player lost LK.showGameOver({ message: "L'araign\xE9e t'a vaincu, tu es morte, petite abeille\u202F!" }); return; } // Restore bee's position and state from before the battle bee.x = game.battleState.originalBeeX; bee.y = game.battleState.originalBeeY; bee.onGround = game.battleState.originalOnGround; // Ensure bee doesn't fall by zeroing velocities bee.velocityX = 0; bee.velocityY = 0; // Return to platform mode gameState = "platform"; } // Start level scrolling function startLevelScrolling() { levelScrolling = true; lastPlatformX = platforms[platforms.length - 1].x; // Start platform generation timer platformGenerationTimer = LK.setInterval(function () { generateNewPlatform(); }, 2000); // Start spider generation timer spiderGenerationTimer = LK.setInterval(function () { generateNewSpider(); }, 5000); // Move finish line further ahead tween(finishLine, { x: 2048 + 3000 }, { duration: 1000, easing: tween.linear }); } // Generate a new platform ahead function generateNewPlatform() { if (!levelScrolling) { return; } var platform = new Platform(); // Position new platform off screen to the right platform.x = 2048 + platform.width / 2; // Randomize y position within screen bounds var minPlatformY = 500; var maxPlatformY = 2732 - 500; platform.y = minPlatformY + Math.random() * (maxPlatformY - minPlatformY); // Add platform to game platforms.push(platform); game.addChild(platform); // Update last platform x position lastPlatformX = platform.x; } // Generate a new spider on a platform function generateNewSpider() { if (!levelScrolling) { return; } // Find suitable platform for new spider (one that's just entered the screen) var suitablePlatforms = []; for (var i = 0; i < platforms.length; i++) { if (platforms[i].x > 1500 && platforms[i].x < 2500) { suitablePlatforms.push(platforms[i]); } } if (suitablePlatforms.length === 0) { return; } // Choose a random platform var platform = suitablePlatforms[Math.floor(Math.random() * suitablePlatforms.length)]; // Create new spider var spider = new Spider(); // Update spider's max health based on current level (20 more health per level) spider.maxHealth = spider.baseMaxHealth + (currentLevel - 1) * 20; spider.health = spider.maxHealth; spider.x = platform.x; spider.y = platform.y - platform.height / 2 - spider.height / 2; spider.currentPlatform = platform; // Add spider to game spiders.push(spider); game.addChild(spider); } // Stop level scrolling function stopLevelScrolling() { levelScrolling = false; // Clear timers if (platformGenerationTimer) { LK.clearInterval(platformGenerationTimer); platformGenerationTimer = null; } if (spiderGenerationTimer) { LK.clearInterval(spiderGenerationTimer); spiderGenerationTimer = null; } } // Complete level function completeLevel() { LK.getSound('levelComplete').play(); // Stop level scrolling stopLevelScrolling(); // Increase level currentLevel++; storage.currentLevel = currentLevel; // Award ML for level completion if (currentLevel < 10) { ml += 3; } else { ml += 8; } storage.ml = ml; if (mlText) mlText.setText("ML: " + ml); // Update bee's max health based on new level and restore health (seul moment où l'abeille récupère toute sa vie) bee.maxHealth = bee.baseMaxHealth + (currentLevel - 1) * 50; bee.health = bee.maxHealth; // Update the level banner to show the new level if (levelText) { levelText.setText("Niveau : " + currentLevel + " / " + maxLevels); } // Check if player has reached the max level if (currentLevel >= maxLevels) { // Reset to level 1 and show victory message currentLevel = 1; storage.currentLevel = 1; // Remove previous levelText if it exists if (levelText && levelText.parent) { levelText.parent.removeChild(levelText); } levelText = null; // Remove previous spidersDefeatedText if it exists if (spidersDefeatedText && spidersDefeatedText.parent) { spidersDefeatedText.parent.removeChild(spidersDefeatedText); } spidersDefeatedText = null; initLevel(currentLevel); // Create victory message var victoryContainer = new Container(); victoryContainer.x = 2048 / 2; victoryContainer.y = 2732 / 2; var victoryBackground = LK.getAsset('battlePanel', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.2, scaleY: 1.2, alpha: 0.9 }); victoryContainer.addChild(victoryBackground); var victoryText = new Text2("Félicitations vous avez complété Bee Wars !\nA bientÓt pour de nouveaux jeu de clem27games", { size: 80, fill: 0xFF69B4 // Pink color }); victoryText.anchor.set(0.5, 0.5); victoryContainer.addChild(victoryText); game.addChild(victoryContainer); // Create OK button to reset game var okButton = LK.getAsset('attackButton', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 200, tint: 0x00FF00 }); victoryContainer.addChild(okButton); var okText = new Text2("OK", { size: 60, fill: 0xFFFFFF }); okText.anchor.set(0.5, 0.5); okText.x = 0; okText.y = 200; victoryContainer.addChild(okText); // Add down handler to the container victoryContainer.down = function (x, y, obj) { // Check if OK button was pressed if (x >= okButton.x - okButton.width / 2 && x <= okButton.x + okButton.width / 2 && y >= okButton.y - okButton.height / 2 && y <= okButton.y + okButton.height / 2) { // Reset to level 1 currentLevel = 1; storage.currentLevel = 1; // Reset spiders defeated for new level spidersDefeated = 0; spidersDefeatedText.setText("Spiders: " + spidersDefeated); initLevel(currentLevel); game.removeChild(victoryContainer); } }; // Show win screen after showing message for a few seconds if player doesn't click OK LK.setTimeout(function () { LK.showYouWin(); }, 30000); return; } // Initialize next level LK.setTimeout(function () { initLevel(currentLevel); // Remove previous levelText if it exists if (levelText && levelText.parent) { levelText.parent.removeChild(levelText); } levelText = null; // Remove previous spidersDefeatedText if it exists if (spidersDefeatedText && spidersDefeatedText.parent) { spidersDefeatedText.parent.removeChild(spidersDefeatedText); } spidersDefeatedText = null; initLevel(currentLevel); }, 1000); } // Check collision between bee and platform function checkPlatformCollision(bee, platform) { // Simple rectangle collision var beeLeft = bee.x - bee.width / 2; var beeRight = bee.x + bee.width / 2; var beeTop = bee.y - bee.height / 2; var beeBottom = bee.y + bee.height / 2; var platformLeft = platform.x - platform.width / 2; var platformRight = platform.x + platform.width / 2; var platformTop = platform.y - platform.height / 2; var platformBottom = platform.y + platform.height / 2; // Check for collision if (beeRight > platformLeft && beeLeft < platformRight && beeBottom > platformTop && beeTop < platformBottom) { // Check if landing on top of platform if (beeBottom > platformTop && bee.velocityY > 0 && beeTop < platformTop) { bee.y = platformTop - bee.height / 2; bee.velocityY = 0; bee.onGround = true; bee.isJumping = false; // Check for spiders on this platform to battle for (var i = 0; i < spiders.length; i++) { var spider = spiders[i]; if (!spider.defeated && spider.currentPlatform === platform) { // If we landed on a platform with a spider, start battle LK.setTimeout(function () { startBattle(spider); }, 100); break; } } return true; } } return false; } // Find and jump to the nearest platform function findAndJumpToNearestPlatform() { var nearestPlatform = null; var shortestDistance = Infinity; // Find the nearest platform for (var i = 0; i < platforms.length; i++) { var platform = platforms[i]; var horizontalDistance = Math.abs(platform.x - bee.x); // Only consider platforms that are reasonably within reach horizontally if (horizontalDistance < 500) { var verticalDistance = platform.y - platform.height / 2 - bee.y; // Prefer platforms slightly above the bee or at the same level var distance = horizontalDistance + (verticalDistance > 0 ? verticalDistance * 2 : Math.abs(verticalDistance) * 0.5); if (distance < shortestDistance) { shortestDistance = distance; nearestPlatform = platform; } } } // If we found a platform, animate jumping to it if (nearestPlatform) { // Stop current movement bee.velocityX = 0; bee.velocityY = 0; // Play jump sound LK.getSound('jump').play(); // Tween to the platform position with a nice arc var targetX = nearestPlatform.x; var targetY = nearestPlatform.y - nearestPlatform.height / 2 - bee.height / 2; // Create an animation that looks like a jump tween(bee, { x: targetX, y: targetY }, { duration: 800, easing: tween.easeOutQuad, onFinish: function onFinish() { bee.onGround = true; bee.isJumping = false; } }); } } // Handle bee dragging - mouse/touch down game.down = function (x, y, obj) { if (gameState === "platform") { // Check if tap is on the bee var beeLeft = bee.x - bee.width / 2; var beeRight = bee.x + bee.width / 2; var beeTop = bee.y - bee.height / 2; var beeBottom = bee.y + bee.height / 2; if (x >= beeLeft && x <= beeRight && y >= beeTop && y <= beeBottom) { dragTarget = bee; // Stop current movement when starting to drag bee.velocityX = 0; bee.velocityY = 0; } } }; // Handle game movement game.move = function (x, y, obj) { // Only process movement in platform mode if (gameState === "platform") { // If dragging the bee, update its position if (dragTarget) { dragTarget.x = x; dragTarget.y = y; // Reset falling flags when manually dragging bee.fallingInVoid = false; return; } // Check if bee is falling in void and rescue it with any tap if (bee.fallingInVoid) { findAndJumpToNearestPlatform(); return; } // If tap is on the top fifth of the screen, jump if (y < 2732 / 5) { bee.jump(); } // If tap is in the top-mid section of the screen, move up else if (y < 2732 / 3) { bee.moveUp(); } // If tap is on the right half of the screen, move right else if (x > 2048 / 2) { bee.moveRight(); } // If tap is on the left half of the screen, move left else { bee.moveLeft(); } } }; // Initialize first level initLevel(currentLevel); // Handle touch release to stop bee movement or place bee on platform when dragging game.up = function (x, y, obj) { if (gameState === "platform") { if (dragTarget) { // Check if bee is over a platform to place it properly var platformFound = false; for (var i = 0; i < platforms.length; i++) { var platform = platforms[i]; var platformLeft = platform.x - platform.width / 2; var platformRight = platform.x + platform.width / 2; var platformTop = platform.y - platform.height / 2; // If bee is above platform horizontally, place it on the platform if (bee.x >= platformLeft && bee.x <= platformRight) { bee.y = platformTop - bee.height / 2; bee.velocityY = 0; bee.onGround = true; bee.isJumping = false; platformFound = true; break; } } // If no platform found beneath the bee, it starts falling if (!platformFound) { bee.onGround = false; bee.velocityY = 1; // Start falling gently } // Release drag target dragTarget = null; } else { bee.stopMoving(); } } }; // Game update loop game.update = function () { // Skip update if in battle mode if (gameState === "battle") { return; } // Only update bee physics if not being dragged if (!dragTarget) { // Update bee bee.update(); } // Add visual indication when bee is falling in void if (bee.fallingInVoid) { // Flash the bee to indicate it can be rescued if (LK.ticks % 10 < 5) { bee.alpha = 0.5; } else { bee.alpha = 1.0; } } else { bee.alpha = 1.0; } // Check for platform collisions if bee is not being dragged if (!dragTarget) { // Check for platform collisions for (var i = 0; i < platforms.length; i++) { var collided = checkPlatformCollision(bee, platforms[i]); // Platform ML logic: count platforms passed (without spider) if (collided) { if (lastBeePlatform !== platforms[i]) { // Only count if platform has no spider on it var hasSpider = false; for (var s = 0; s < spiders.length; s++) { if (!spiders[s].defeated && spiders[s].currentPlatform === platforms[i]) { hasSpider = true; break; } } if (!hasSpider) { platformsPassed++; platformsPassedSinceLastML++; // Award 2 ML every 5 platforms passed (without spider) if (platformsPassedSinceLastML >= 5) { ml += 2; storage.ml = ml; if (mlText) mlText.setText("ML: " + ml); platformsPassedSinceLastML = 0; } } lastBeePlatform = platforms[i]; } } // Defensive: if bee is not on any platform, reset lastBeePlatform if (!collided && lastBeePlatform === platforms[i]) { lastBeePlatform = null; } checkPlatformCollision(bee, platforms[i]); } } // Check for screen boundaries if (bee.x < bee.width / 2) { bee.x = bee.width / 2; } else if (bee.x > 2048 - bee.width / 2) { bee.x = 2048 - bee.width / 2; } // Check if bee is falling with no platform below if (bee.y > 2732 - 400 && bee.velocityY > 0 && !bee.onGround) { // Set a flag that bee is falling in void to allow rescue by tap bee.fallingInVoid = true; } else if (bee.y > 2732 + bee.height) { // Fell off the screen LK.showGameOver(); return; } else { // Reset falling flag when not in danger zone bee.fallingInVoid = false; } // Check for spiders on the same platform as bee for (var i = 0; i < spiders.length; i++) { var spider = spiders[i]; if (!spider.defeated) { // Check if bee and spider are on the same platform if (spider.currentPlatform) { var onSamePlatform = Math.abs(bee.x - spider.x) < spider.currentPlatform.width * 0.8 && Math.abs(bee.y - spider.y) < 20; if (onSamePlatform && !spider.moving) { // Spider should move away spider.moveAwayFromBee(bee); } } // Check for collision or shared platform to start battle if (bee.intersects(spider) || spider.currentPlatform && bee.onGround && Math.abs(bee.x - spider.x) < spider.currentPlatform.width * 0.5) { startBattle(spider); return; } } } // Check if all spiders on screen are defeated to start scrolling var visibleSpiders = false; for (var i = 0; i < spiders.length; i++) { if (!spiders[i].defeated && spiders[i].x < 2048) { visibleSpiders = true; break; } } // Start level scrolling if all visible spiders are defeated and not already scrolling if (!visibleSpiders && !levelScrolling && bee.onGround) { startLevelScrolling(); } // Handle platform and object movement when scrolling if (levelScrolling) { // Move platforms for (var i = 0; i < platforms.length; i++) { platforms[i].x += scrollSpeed; // Remove platforms that have gone off screen if (platforms[i].x < -platforms[i].width) { game.removeChild(platforms[i]); platforms.splice(i, 1); i--; } } // Move spiders with their platforms for (var i = 0; i < spiders.length; i++) { if (spiders[i].currentPlatform) { spiders[i].x = spiders[i].currentPlatform.x; } } // Move finish line finishLine.x += scrollSpeed; // If bee is on a platform, move it with the platform if (bee.onGround) { bee.x += scrollSpeed; } } // Check for finish line collision if (bee.intersects(finishLine)) { // Check if all spiders are defeated var allSpidersDefeated = true; for (var i = 0; i < spiders.length; i++) { if (!spiders[i].defeated) { allSpidersDefeated = false; break; } } if (allSpidersDefeated) { completeLevel(); } } };
===================================================================
--- original.js
+++ change.js
@@ -403,16 +403,16 @@
/****
* Game Code
****/
-// Initialize music
-// Initialize sounds
-// Initialize battle UI elements
-// Initialize finish line
-// Initialize platform assets
-// Initialize spider assets
-// Initialize bee asset
// Game state variables
+// Initialize bee asset
+// Initialize spider assets
+// Initialize platform assets
+// Initialize finish line
+// Initialize battle UI elements
+// Initialize sounds
+// Initialize music
var currentLevel = storage.currentLevel || 1;
var maxLevels = 100;
var gameState = "platform"; // "platform" or "battle"
var platforms = [];
tron d'arbre mignon de plateforme. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
Abeille. In-Game asset. 2d. High contrast. No shadows
AraigneĢe. In-Game asset. 2d. High contrast. No shadows
Fond d'eĢcran ruche. In-Game asset. 2d. High contrast. No shadows
Fond d'eĢcran maiĢs. In-Game asset. 2d. High contrast. No shadows
Fond d'eĢcran roche. In-Game asset. 2d. High contrast. No shadows
Fond d'eĢcran campagne. In-Game asset. 2d. High contrast. No shadows
Fond d'eĢcran nid des araigneĢes. In-Game asset. 2d. High contrast. No shadows
Fond d'eĢcran foreĢt enchanteĢe. In-Game asset. 2d. High contrast. No shadows
Fond d'eĢcran muguet. In-Game asset. 2d. High contrast. No shadows
Fond d'eĢcran roses epineuses. In-Game asset. 2d. High contrast. No shadows
Fond d'eĢcran prairie manga. In-Game asset. 2d. High contrast. No shadows
Fond d'eĢcran ortis. In-Game asset. 2d. High contrast. No shadows
Frelon. In-Game asset. 2d. High contrast. No shadows
GueĢpe. In-Game asset. 2d. High contrast. No shadows
Libellule. In-Game asset. 2d. High contrast. No shadows
Oiseau. In-Game asset. 2d. High contrast. No shadows