User prompt
Ajoute un systeĢme de noms aux enfants dans le jeu! Les noms sont seulement deĢcoratifs, voilaĢ la liste des noms : Pour les petites filles : Mia, Sara, Laura, maya, Julie, Olivia, Martine, Paula, Daisy, Juliette, Margot, Tina, AbigaiĢl, cleĢmence, AmeĢlie, Amina, Laurence, Ilona, gloria, valentina, Victoria, Ninon, Manon, Violette, rose, ZeĢlie, Ylenia, Sabrina, Harper, Valentine, EĢlodie, GraĢce, Jade, Eva, MaeĢva, Anna, Alice, Louise,ZoeĢ, ChloeĢ, Julia, Romy,Iris, ambre, Agathe,Inaya,Lea, adele,Clara , Emily, Eveline, Dorine, Lou, amelia, Isabella, charlotte, Delphine, dona, Yasmine,Marie, Carine, Kimberly, Erina, MaeĢlle , JoseĢphine, jacqueline, Françoise, TheĢa ou Denise ! (On pourra en ajouter d'autres par la suite) Pour les petits garçons : Hugo, Louis, Karim, Julien, thomas, Thom, Lucas, CleĢment, Laurent, Ibrahim, Mohamed, LeĢo, Willy, Moris, Mathieu, Marius, Paul, Valentin, Bernard, Eric, Jules, Claude, Quentin, Gabriel, Dimitri, RaphaeĢl, noa, MaeĢl, Arthur, Adam, Isaac, Eden, LeĢon, Sacha, Aaron, liam, NaeĢl, malo, Baptiste, Corentin, Diego, Alexandre, Felix, Gaspard, Alain, Albert, Adrien, Achille, Dorian, Alexis, Alex, Mylan, Pierre, Yann, axel, charles, David, Joseph, jacques, Antoine, François, TheĢo, maxime, victor, Anthony, AndreĢ, William, Jacob, Nathan, sam ou Logan! Les noms des enfants sont aleĢatoires pour chaque enfant, et le nom dun enfant est afficheĢ en dessus de sa teĢte juste au-dessus de son aĢge , ajoute aussi un message lorsque le serpent mange un enfant qui affiche "feĢlicitations ! Vous avez mangeĢ (avec le nom de l'enfant) ce petit deĢsastre ambulant", le message disparaiĢt au bout de 5 secondes, Ou encore quand un enfant reĢussit a s'enfuir un message s'affiche en mode "Oh non! (avec le nom de l'enfant) a reĢussi a s'enfuir !" Qui disparaiĢt aussi au bout de 5 secondes āŖš” Consider importing and using the following plugins: @upit/tween.v1
User prompt
Ajoute les assets pour le biberon quand un enfant le lance (le biberon est lanceĢ aleĢatoirement dans la direction du serpent, le joueur pert les points correspondants si le biberon le touche), le biberon disparaiĢt ensuite , et pour l'appelle des adultes aussi (un adulte apparaiĢt quand un enfant de l'aĢge correspondant l'appel, et disparaiĢt au bout de 3 secondes quand le serpent a perdu les points correspondants), ajoute aussi le fusil qui apparaiĢt de la meĢme façon pour les enfants de l'aĢge requis āŖš” Consider importing and using the following plugins: @upit/tween.v1
User prompt
Ajoute les assets pour le biberon quand un enfant le lance (le biberon est lanceĢ aleĢatoirement dans la direction du serpent, le joueur pert les points correspondants si le biberon le touche), le biberon disparaiĢt ensuite , et pour l'appelle des adultes aussi āŖš” Consider importing and using the following plugins: @upit/tween.v1
User prompt
Ajoute un systeĢme d'aĢge pour les enfants : les enfants ont aleĢatoirement entre 2 et 13 ans, et la faciliteĢ que le serpent (le joueur) a pour les manger varie selon leur aĢge, car certains enfants de certains aĢges ont des capaciteĢs speĢciales qui ralentissent, empeĢche le serpent de les manger et meĢme certains enfants plus aĢgeĢs sont plus rapides que les plus jeunes, voici la liste des capaciteĢs speĢciales selon l'aĢge des enfants : 2 - 4 ans : les enfants de cet aĢge sont des beĢbeĢs dans le jeu, ils n'ont aucune capaciteĢ, ils se contentent de fuir le serpent a une vitesse lente 4 a 6 ans : ces enfants laĢ ont la capaciteĢ de lancer aleĢatoirement leur biberon sur le serpent, ce qui fait perdre 2 points au joueur a chaque fois qu'il le vont , si le joueur perd trop de points, il reĢgresse de niveau 6 aĢ 9 ans : ces enfants-laĢ sont les plus rapides, ils fuient 2 fois plus vite que les enfants plus jeunes, et ont aleĢatoirement meĢme la capaciteĢ d'appeler un adulte , lorsqu'un adulte est appeleĢ, le joueur perd aleĢatoirement entre 5 et 10 points , et pareil le joueur peut reĢgresser de niveau si il perd trop de points ! 9 a 13 ans : ce sont les enfants les plus grands, ceux la sont les plus dangereux, car ils ont des fusils, et ils peuvent aleĢatoirement envoyeĢ des coups de fusils sur le serpent (mais il le font rarement, il y a seulement une chance sur 5 qu'ils le fassent) Ce qui fait perdre 15 a 30 points au joueur quand ils le font L'aĢge des enfants qui apparaissent est aleatoire (sauf que seul les enfants de moins de 5 ans apparaissent quand le joueur est de niveau infeĢrieur a 5, les autres aĢges peuvent apparaiĢtre quand le joueur est au moins niveau 5!), L'aĢge de chaque enfant qui est apparu est afficheĢ au dessus de sa teĢte
User prompt
Ajoute un systeĢme d'aĢge pour les enfants : les enfants ont aleĢatoirement entre 2 et 13 ans, et la faciliteĢ que le serpent (le joueur) a pour les manger varie selon leur aĢge, car certains enfants de certains aĢges ont des capaciteĢs speĢciales qui ralentissent, empeĢche le serpent de les manger et meĢme certains enfants plus aĢgeĢs sont plus rapides que les plus jeunes, voici la liste des capaciteĢs speĢciales selon l'aĢge des enfants : 2 - 4 ans : les enfants de cet aĢge sont des beĢbeĢs dans le jeu, ils n'ont aucune capaciteĢ, ils se contentent de fuir le serpent a une vitesse lente 4 a 6 ans : ces enfants laĢ ont la capaciteĢ de lancer aleĢatoirement leur biberon sur le serpent, ce qui fait perdre 2 points au joueur a chaque fois qu'il le vont , si le joueur perd trop de points, il reĢgresse de niveau 6 aĢ 9 ans : ces enfants-laĢ sont les plus rapides, ils fuient 2 fois plus vite que les enfants plus jeunes, et ont aleĢatoirement meĢme la capaciteĢ d'appeler un adulte , lorsqu'un adulte est appeleĢ, le joueur perd aleĢatoirement entre 5 et 10 points , et pareil le joueur peut reĢgresser de niveau si il perd trop de points ! 9 a 13 ans : ce sont les enfants les plus grands, ceux la sont les plus dangereux, car ils ont des fusils, et ils peuvent aleĢatoirement envoyeĢ des coups de fusils sur le serpent (mais il le font rarement, il y a seulement une chance sur 5 qu'ils le fassent) Ce qui fait perdre 15 a 30 points au joueur quand ils le font L'aĢge des enfants qui apparaissent est aleatoire (sauf que seul les enfants de moins de 5 ans apparaissent quand le joueur est de niveau infeĢrieur a 5, les autres aĢges peuvent apparaiĢtre quand le joueur est au moins niveau 5!), L'aĢge de chaque enfant qui est apparu est afficheĢ au dessus de sa teĢte
User prompt
Ajoute une musique de fond en boucle au jeu
User prompt
Fait en sorte que le nombre de points a obtenir pour monter au niveau supeĢrieur monte de + 5 requis par rapport au niveau preĢceĢdent a chaque nouveau niveau
User prompt
Fait en sorte que le joueur ne monte que d'un seul niveau a la fois, et que le nombre de points et d'enfants a manger pour monter au niveau suivant soient reset pour le niveau actuel
Code edit (1 edits merged)
Please save this source code
User prompt
Roi Serpent
Initial prompt
Bonjour ! CreĢe mon jeu "Roi serpent", Voici les meĢcaniques et le but du jeu : C'est un jeu aĢ la snake, mais avec une touche vraiment personnelle et creĢative : le joueur controĢle un serpent parmi d'autres se deĢplaçant dans une foreĢt amazonienne, des humains deĢbarquent dans la foreĢt, le but du jeu est de manger les humains en rentrant en collision avec eux avant qu'ils fuient , et de monter jusqu'au niveau 35 pour devenir le roi des serpents mangeurs d'humains!, Voici les meĢcaniques du jeu et comment il se preĢsente : Le joueur deĢplace son serpent en appuyant sur son eĢcran tactile ,; le serpent se deĢplace par petit bond a chaque appuie, et se dirige toujours vers l'endroit ouĢ le joueur a appuyeĢ (gauche, droite, en arrieĢre, en avant), Des enfants humains (petite fille et petit garçon aleĢatoirement de 1 aĢ 6 enfants de chacun des deux types), se promeĢnent souvent a l'eĢcran, le but du jeu, pour le joueur est de deĢplacer son serpent vers les enfants, et de les manger en rentrant en collision avec, pour gagner des points et monter en niveau ! Il faut 50 points pour passer au niveau 2, puis a chaque fois le nombre requis de points monte de 10 points, A chaque enfant manger, le joueur gagne 5 points, Mais les enfants ne se laissent pas faire, certaines fois quand ils voient le serpent, ils essayent de fuir!, Et ils sont de plus en plus rapides avec les niveaux! VoilaĢ! Le niveau du joueur et ses points doivent eĢtre afficheĢ a lui, et le joueur doit pouvoir faire en sorte que son serpent deviennent plus rapide que les enfants !
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Adult = Container.expand(function (x, y) { var self = Container.call(this); self.lifetime = 180; // 3 seconds at 60fps self.age = 0; var adultGraphics = self.attachAsset('adult', { anchorX: 0.5, anchorY: 0.5 }); self.x = x; self.y = y; // Add warning text above adult self.warningText = new Text2('ADULT!', { size: 32, fill: 0xFF0000 }); self.warningText.anchor.set(0.5, 1); self.warningText.x = 0; self.warningText.y = -50; self.addChild(self.warningText); // Flash effect self.alpha = 0; tween(self, { alpha: 1 }, { duration: 300, easing: tween.easeOut }); self.update = function () { self.age++; // Pulsing effect adultGraphics.scaleX = 1 + Math.sin(self.age * 0.2) * 0.1; adultGraphics.scaleY = 1 + Math.sin(self.age * 0.2) * 0.1; if (self.age >= self.lifetime) { self.shouldDestroy = true; } }; return self; }); var Bottle = Container.expand(function (startX, startY, targetX, targetY) { var self = Container.call(this); self.speed = 3; self.targetX = targetX; self.targetY = targetY; self.lifetime = 180; // 3 seconds at 60fps self.age = 0; var bottleGraphics = self.attachAsset('bottle', { anchorX: 0.5, anchorY: 0.5 }); self.x = startX; self.y = startY; // Calculate direction to target var dx = targetX - startX; var dy = targetY - startY; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.directionX = dx / distance; self.directionY = dy / distance; } else { self.directionX = 0; self.directionY = 0; } self.update = function () { self.age++; // Move towards target self.x += self.directionX * self.speed; self.y += self.directionY * self.speed; // Rotate bottle for effect bottleGraphics.rotation += 0.2; // Check bounds and lifetime if (self.age >= self.lifetime || self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) { self.shouldDestroy = true; } }; return self; }); var Child = Container.expand(function (type) { var self = Container.call(this); self.type = type || 'boy'; self.isEscaping = false; self.speed = 1; self.detectionRange = 150; // Age system: 2-4 years for levels < 5, 2-13 years for levels >= 5 if (currentLevel < 5) { self.age = Math.floor(Math.random() * 3) + 2; // 2-4 years } else { self.age = Math.floor(Math.random() * 12) + 2; // 2-13 years } // Set speed based on age if (self.age >= 6 && self.age < 9) { self.speed = 2; // 6-9 year olds are fastest (2x speed) } else { self.speed = 1; // Others have normal speed } // Assign random name based on type if (self.type === 'girl') { self.name = girlNames[Math.floor(Math.random() * girlNames.length)]; } else { self.name = boyNames[Math.floor(Math.random() * boyNames.length)]; } self.specialAbilityTimer = 0; self.specialAbilityCooldown = 180 + Math.random() * 240; // 3-7 seconds at 60fps var childGraphics = self.attachAsset(self.type, { anchorX: 0.5, anchorY: 0.5 }); // Add name text above child self.nameText = new Text2(self.name, { size: 20, fill: 0xFFFF00 }); self.nameText.anchor.set(0.5, 1); self.nameText.x = 0; self.nameText.y = -55; self.addChild(self.nameText); // Add age text above child self.ageText = new Text2(self.age.toString(), { size: 24, fill: 0xFFFFFF }); self.ageText.anchor.set(0.5, 1); self.ageText.x = 0; self.ageText.y = -35; self.addChild(self.ageText); self.wanderDirection = Math.random() * Math.PI * 2; self.wanderTimer = 0; self.wanderChangeTime = 60 + Math.random() * 120; self.update = function () { // Handle special abilities based on age self.specialAbilityTimer++; if (self.specialAbilityTimer >= self.specialAbilityCooldown) { if (self.age >= 4 && self.age < 6) { // 4-6 year olds throw bottles randomly if (Math.random() < 0.3) { // 30% chance // Create bottle projectile aimed at snake var bottle = new Bottle(self.x, self.y, snake.x, snake.y); game.addChild(bottle); bottles.push(bottle); // Play throw sound and flash child LK.getSound('bottle_throw').play(); LK.effects.flashObject(self, 0xFFFF00, 500); } } else if (self.age >= 6 && self.age < 9) { // 6-9 year olds call adults randomly if (Math.random() < 0.25) { // 25% chance var pointsLost = Math.floor(Math.random() * 6) + 5; // 5-10 points LK.setScore(Math.max(0, LK.getScore() - pointsLost)); // Play adult call sound and visual effects LK.getSound('adult_call').play(); LK.effects.flashObject(self, 0xFF8800, 800); // Create adult visual effect near the child var adult = new Adult(self.x + (Math.random() - 0.5) * 100, self.y + (Math.random() - 0.5) * 100); game.addChild(adult); adults.push(adult); checkLevelDown(); } } else if (self.age >= 9 && self.age <= 13) { // 9-13 year olds shoot guns - only 1 in 5 chance when they activate ability if (Math.random() < 0.2) { // 20% chance (1 in 5) var pointsLost = Math.floor(Math.random() * 16) + 15; // 15-30 points LK.setScore(Math.max(0, LK.getScore() - pointsLost)); // Create rifle visual effect var rifle = new Rifle(self.x, self.y, snake.x, snake.y); game.addChild(rifle); rifles.push(rifle); // Play rifle shot sound and effects LK.getSound('rifle_shot').play(); LK.effects.flashObject(self, 0xFF0000, 1000); LK.effects.flashScreen(0xFF0000, 300); checkLevelDown(); } } self.specialAbilityTimer = 0; self.specialAbilityCooldown = 180 + Math.random() * 240; } if (self.isEscaping) { var dx = self.x - snake.x; var dy = self.y - snake.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { var escapeSpeed = self.speed * 3; self.x += dx / distance * escapeSpeed; self.y += dy / distance * escapeSpeed; } } else { var distanceToSnake = Math.sqrt(Math.pow(self.x - snake.x, 2) + Math.pow(self.y - snake.y, 2)); if (distanceToSnake < self.detectionRange) { self.isEscaping = true; LK.effects.flashObject(self, 0xFF0000, 300); } else { self.wanderTimer++; if (self.wanderTimer >= self.wanderChangeTime) { self.wanderDirection = Math.random() * Math.PI * 2; self.wanderTimer = 0; self.wanderChangeTime = 60 + Math.random() * 120; } self.x += Math.cos(self.wanderDirection) * self.speed; self.y += Math.sin(self.wanderDirection) * self.speed; } } if (self.x < 50) self.x = 50; if (self.x > 1998) self.x = 1998; if (self.y < 50) self.y = 50; if (self.y > 2682) self.y = 2682; }; return self; }); var Message = Container.expand(function (text, color) { var self = Container.call(this); self.lifetime = 300; // 5 seconds at 60fps self.age = 0; self.fadeStartTime = 240; // Start fading after 4 seconds var messageText = new Text2(text, { size: 40, fill: color || 0xFFFFFF }); messageText.anchor.set(0.5, 0.5); self.addChild(messageText); // Position at center of screen self.x = 1024; self.y = 1366; // Initial fade in effect self.alpha = 0; tween(self, { alpha: 1 }, { duration: 500, easing: tween.easeOut }); self.update = function () { self.age++; // Start fading out if (self.age >= self.fadeStartTime && self.alpha > 0) { var fadeProgress = (self.age - self.fadeStartTime) / (self.lifetime - self.fadeStartTime); self.alpha = Math.max(0, 1 - fadeProgress); } if (self.age >= self.lifetime) { self.shouldDestroy = true; } }; return self; }); var Rifle = Container.expand(function (x, y, targetX, targetY) { var self = Container.call(this); self.lifetime = 120; // 2 seconds at 60fps self.age = 0; var rifleGraphics = self.attachAsset('rifle', { anchorX: 0.5, anchorY: 0.5 }); self.x = x; self.y = y; // Calculate angle to target var dx = targetX - x; var dy = targetY - y; rifleGraphics.rotation = Math.atan2(dy, dx); // Muzzle flash effect LK.effects.flashObject(self, 0xFFFF00, 200); self.update = function () { self.age++; // Recoil animation if (self.age < 10) { rifleGraphics.x = -self.age; } else if (self.age < 20) { rifleGraphics.x = -(20 - self.age); } else { rifleGraphics.x = 0; } if (self.age >= self.lifetime) { self.shouldDestroy = true; } }; return self; }); var Snake = Container.expand(function () { var self = Container.call(this); self.isMoving = false; self.targetX = 0; self.targetY = 0; self.moveSpeed = 4; var snakeGraphics = self.attachAsset('snake', { anchorX: 0.5, anchorY: 0.5 }); self.moveTo = function (x, y) { self.targetX = x; self.targetY = y; self.isMoving = true; }; self.update = function () { if (self.isMoving) { var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < self.moveSpeed) { self.x = self.targetX; self.y = self.targetY; self.isMoving = false; } else { self.x += dx / distance * self.moveSpeed; self.y += dy / distance * self.moveSpeed; } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x006400 }); /**** * Game Code ****/ var background = game.attachAsset('background', { x: 0, y: 0 }); var snake = game.addChild(new Snake()); snake.x = 1024; snake.y = 1366; var children = []; var bottles = []; var adults = []; var rifles = []; var currentLevel = 1; var pointsNeeded = 50; // Arrays of names for children var girlNames = ['Mia', 'Sara', 'Laura', 'Maya', 'Julie', 'Olivia', 'Martine', 'Paula', 'Daisy', 'Juliette', 'Margot', 'Tina', 'AbigaĆÆl', 'ClĆ©mence', 'AmĆ©lie', 'Amina', 'Laurence', 'Ilona', 'Gloria', 'Valentina', 'Victoria', 'Ninon', 'Manon', 'Violette', 'Rose', 'ZĆ©lie', 'Ylenia', 'Sabrina', 'Harper', 'Valentine', 'Ćlodie', 'GrĆ¢ce', 'Jade', 'Eva', 'MaĆ«va', 'Anna', 'Alice', 'Louise', 'ZoĆ©', 'ChloĆ©', 'Julia', 'Romy', 'Iris', 'Ambre', 'Agathe', 'Inaya', 'Lea', 'Adele', 'Clara', 'Emily', 'Eveline', 'Dorine', 'Lou', 'Amelia', 'Isabella', 'Charlotte', 'Delphine', 'Dona', 'Yasmine', 'Marie', 'Carine', 'Kimberly', 'Erina', 'MaĆ«lle', 'JosĆ©phine', 'Jacqueline', 'FranƧoise', 'ThĆ©a', 'Denise']; var boyNames = ['Hugo', 'Louis', 'Karim', 'Julien', 'Thomas', 'Thom', 'Lucas', 'ClĆ©ment', 'Laurent', 'Ibrahim', 'Mohamed', 'LĆ©o', 'Willy', 'Moris', 'Mathieu', 'Marius', 'Paul', 'Valentin', 'Bernard', 'Eric', 'Jules', 'Claude', 'Quentin', 'Gabriel', 'Dimitri', 'RaphaĆ«l', 'Noa', 'MaĆ«l', 'Arthur', 'Adam', 'Isaac', 'Eden', 'LĆ©on', 'Sacha', 'Aaron', 'Liam', 'NaĆ«l', 'Malo', 'Baptiste', 'Corentin', 'Diego', 'Alexandre', 'Felix', 'Gaspard', 'Alain', 'Albert', 'Adrien', 'Achille', 'Dorian', 'Alexis', 'Alex', 'Mylan', 'Pierre', 'Yann', 'Axel', 'Charles', 'David', 'Joseph', 'Jacques', 'Antoine', 'FranƧois', 'ThĆ©o', 'Maxime', 'Victor', 'Anthony', 'AndrĆ©', 'William', 'Jacob', 'Nathan', 'Sam', 'Logan']; var messages = []; var levelText = new Text2('Level: 1', { size: 60, fill: 0xFFFFFF }); levelText.anchor.set(0, 0); levelText.x = 150; levelText.y = 50; LK.gui.topLeft.addChild(levelText); var scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); var targetText = new Text2('Target: ' + pointsNeeded, { size: 50, fill: 0xFFFF00 }); targetText.anchor.set(1, 0); targetText.x = -50; targetText.y = 50; LK.gui.topRight.addChild(targetText); function spawnChildren() { var boyCount = Math.floor(Math.random() * 6) + 1; var girlCount = Math.floor(Math.random() * 6) + 1; for (var i = 0; i < boyCount; i++) { var boy = game.addChild(new Child('boy')); boy.x = Math.random() * 1800 + 124; boy.y = Math.random() * 2400 + 166; // Speed is now calculated in Child constructor based on age boy.speed += (currentLevel - 1) * 0.2; children.push(boy); } for (var j = 0; j < girlCount; j++) { var girl = game.addChild(new Child('girl')); girl.x = Math.random() * 1800 + 124; girl.y = Math.random() * 2400 + 166; // Speed is now calculated in Child constructor based on age girl.speed += (currentLevel - 1) * 0.2; children.push(girl); } } function updateUI() { levelText.setText('Level: ' + currentLevel); scoreText.setText('Score: ' + LK.getScore()); targetText.setText('Target: ' + pointsNeeded); } function checkLevelUp() { if (LK.getScore() >= pointsNeeded) { currentLevel++; if (currentLevel > 35) { LK.showYouWin(); return; } // Reset score to 0 and calculate new points needed for next level LK.setScore(0); pointsNeeded = 50 + (currentLevel - 2) * 5; for (var i = 0; i < children.length; i++) { children[i].destroy(); } children = []; spawnChildren(); updateUI(); LK.effects.flashScreen(0x00FF00, 500); } } function checkLevelDown() { if (LK.getScore() < 0) { LK.setScore(0); } // Check if we need to go down a level (if score becomes very low compared to target) var minScoreForLevel = Math.max(0, pointsNeeded - 50); if (LK.getScore() < minScoreForLevel && currentLevel > 1) { currentLevel--; pointsNeeded = 50 + (currentLevel - 2) * 5; if (pointsNeeded < 50) pointsNeeded = 50; for (var i = 0; i < children.length; i++) { children[i].destroy(); } children = []; spawnChildren(); updateUI(); LK.effects.flashScreen(0xFF4444, 500); } } spawnChildren(); updateUI(); game.down = function (x, y, obj) { snake.moveTo(x, y); }; game.update = function () { for (var i = children.length - 1; i >= 0; i--) { var child = children[i]; if (snake.intersects(child)) { LK.setScore(LK.getScore() + 5); LK.getSound('catch').play(); // Display congratulations message var congratsMessage = new Message('FĆ©licitations ! Vous avez mangĆ© ' + child.name + ' ce petit dĆ©sastre ambulant', 0x00FF00); game.addChild(congratsMessage); messages.push(congratsMessage); child.destroy(); children.splice(i, 1); checkLevelUp(); continue; } var distanceFromCenter = Math.sqrt(Math.pow(child.x - 1024, 2) + Math.pow(child.y - 1366, 2)); if (distanceFromCenter > 1500) { // Display escape message var escapeMessage = new Message('Oh non! ' + child.name + ' a rĆ©ussi Ć s\'enfuir !', 0xFF4444); game.addChild(escapeMessage); messages.push(escapeMessage); child.destroy(); children.splice(i, 1); } } // Handle bottle collisions and cleanup for (var b = bottles.length - 1; b >= 0; b--) { var bottle = bottles[b]; // Check collision with snake if (snake.intersects(bottle)) { LK.setScore(Math.max(0, LK.getScore() - 2)); LK.effects.flashObject(snake, 0xFF0000, 500); bottle.destroy(); bottles.splice(b, 1); checkLevelDown(); continue; } // Check if bottle should be destroyed if (bottle.shouldDestroy) { bottle.destroy(); bottles.splice(b, 1); } } // Handle adult cleanup for (var a = adults.length - 1; a >= 0; a--) { var adult = adults[a]; if (adult.shouldDestroy) { adult.destroy(); adults.splice(a, 1); } } // Handle rifle cleanup for (var r = rifles.length - 1; r >= 0; r--) { var rifle = rifles[r]; if (rifle.shouldDestroy) { rifle.destroy(); rifles.splice(r, 1); } } // Handle message cleanup for (var m = messages.length - 1; m >= 0; m--) { var message = messages[m]; if (message.shouldDestroy) { message.destroy(); messages.splice(m, 1); } } if (children.length === 0) { spawnChildren(); } updateUI(); }; LK.playMusic('jungle');
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Adult = Container.expand(function (x, y) {
var self = Container.call(this);
self.lifetime = 180; // 3 seconds at 60fps
self.age = 0;
var adultGraphics = self.attachAsset('adult', {
anchorX: 0.5,
anchorY: 0.5
});
self.x = x;
self.y = y;
// Add warning text above adult
self.warningText = new Text2('ADULT!', {
size: 32,
fill: 0xFF0000
});
self.warningText.anchor.set(0.5, 1);
self.warningText.x = 0;
self.warningText.y = -50;
self.addChild(self.warningText);
// Flash effect
self.alpha = 0;
tween(self, {
alpha: 1
}, {
duration: 300,
easing: tween.easeOut
});
self.update = function () {
self.age++;
// Pulsing effect
adultGraphics.scaleX = 1 + Math.sin(self.age * 0.2) * 0.1;
adultGraphics.scaleY = 1 + Math.sin(self.age * 0.2) * 0.1;
if (self.age >= self.lifetime) {
self.shouldDestroy = true;
}
};
return self;
});
var Bottle = Container.expand(function (startX, startY, targetX, targetY) {
var self = Container.call(this);
self.speed = 3;
self.targetX = targetX;
self.targetY = targetY;
self.lifetime = 180; // 3 seconds at 60fps
self.age = 0;
var bottleGraphics = self.attachAsset('bottle', {
anchorX: 0.5,
anchorY: 0.5
});
self.x = startX;
self.y = startY;
// Calculate direction to target
var dx = targetX - startX;
var dy = targetY - startY;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.directionX = dx / distance;
self.directionY = dy / distance;
} else {
self.directionX = 0;
self.directionY = 0;
}
self.update = function () {
self.age++;
// Move towards target
self.x += self.directionX * self.speed;
self.y += self.directionY * self.speed;
// Rotate bottle for effect
bottleGraphics.rotation += 0.2;
// Check bounds and lifetime
if (self.age >= self.lifetime || self.x < -50 || self.x > 2098 || self.y < -50 || self.y > 2782) {
self.shouldDestroy = true;
}
};
return self;
});
var Child = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'boy';
self.isEscaping = false;
self.speed = 1;
self.detectionRange = 150;
// Age system: 2-4 years for levels < 5, 2-13 years for levels >= 5
if (currentLevel < 5) {
self.age = Math.floor(Math.random() * 3) + 2; // 2-4 years
} else {
self.age = Math.floor(Math.random() * 12) + 2; // 2-13 years
}
// Set speed based on age
if (self.age >= 6 && self.age < 9) {
self.speed = 2; // 6-9 year olds are fastest (2x speed)
} else {
self.speed = 1; // Others have normal speed
}
// Assign random name based on type
if (self.type === 'girl') {
self.name = girlNames[Math.floor(Math.random() * girlNames.length)];
} else {
self.name = boyNames[Math.floor(Math.random() * boyNames.length)];
}
self.specialAbilityTimer = 0;
self.specialAbilityCooldown = 180 + Math.random() * 240; // 3-7 seconds at 60fps
var childGraphics = self.attachAsset(self.type, {
anchorX: 0.5,
anchorY: 0.5
});
// Add name text above child
self.nameText = new Text2(self.name, {
size: 20,
fill: 0xFFFF00
});
self.nameText.anchor.set(0.5, 1);
self.nameText.x = 0;
self.nameText.y = -55;
self.addChild(self.nameText);
// Add age text above child
self.ageText = new Text2(self.age.toString(), {
size: 24,
fill: 0xFFFFFF
});
self.ageText.anchor.set(0.5, 1);
self.ageText.x = 0;
self.ageText.y = -35;
self.addChild(self.ageText);
self.wanderDirection = Math.random() * Math.PI * 2;
self.wanderTimer = 0;
self.wanderChangeTime = 60 + Math.random() * 120;
self.update = function () {
// Handle special abilities based on age
self.specialAbilityTimer++;
if (self.specialAbilityTimer >= self.specialAbilityCooldown) {
if (self.age >= 4 && self.age < 6) {
// 4-6 year olds throw bottles randomly
if (Math.random() < 0.3) {
// 30% chance
// Create bottle projectile aimed at snake
var bottle = new Bottle(self.x, self.y, snake.x, snake.y);
game.addChild(bottle);
bottles.push(bottle);
// Play throw sound and flash child
LK.getSound('bottle_throw').play();
LK.effects.flashObject(self, 0xFFFF00, 500);
}
} else if (self.age >= 6 && self.age < 9) {
// 6-9 year olds call adults randomly
if (Math.random() < 0.25) {
// 25% chance
var pointsLost = Math.floor(Math.random() * 6) + 5; // 5-10 points
LK.setScore(Math.max(0, LK.getScore() - pointsLost));
// Play adult call sound and visual effects
LK.getSound('adult_call').play();
LK.effects.flashObject(self, 0xFF8800, 800);
// Create adult visual effect near the child
var adult = new Adult(self.x + (Math.random() - 0.5) * 100, self.y + (Math.random() - 0.5) * 100);
game.addChild(adult);
adults.push(adult);
checkLevelDown();
}
} else if (self.age >= 9 && self.age <= 13) {
// 9-13 year olds shoot guns - only 1 in 5 chance when they activate ability
if (Math.random() < 0.2) {
// 20% chance (1 in 5)
var pointsLost = Math.floor(Math.random() * 16) + 15; // 15-30 points
LK.setScore(Math.max(0, LK.getScore() - pointsLost));
// Create rifle visual effect
var rifle = new Rifle(self.x, self.y, snake.x, snake.y);
game.addChild(rifle);
rifles.push(rifle);
// Play rifle shot sound and effects
LK.getSound('rifle_shot').play();
LK.effects.flashObject(self, 0xFF0000, 1000);
LK.effects.flashScreen(0xFF0000, 300);
checkLevelDown();
}
}
self.specialAbilityTimer = 0;
self.specialAbilityCooldown = 180 + Math.random() * 240;
}
if (self.isEscaping) {
var dx = self.x - snake.x;
var dy = self.y - snake.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
var escapeSpeed = self.speed * 3;
self.x += dx / distance * escapeSpeed;
self.y += dy / distance * escapeSpeed;
}
} else {
var distanceToSnake = Math.sqrt(Math.pow(self.x - snake.x, 2) + Math.pow(self.y - snake.y, 2));
if (distanceToSnake < self.detectionRange) {
self.isEscaping = true;
LK.effects.flashObject(self, 0xFF0000, 300);
} else {
self.wanderTimer++;
if (self.wanderTimer >= self.wanderChangeTime) {
self.wanderDirection = Math.random() * Math.PI * 2;
self.wanderTimer = 0;
self.wanderChangeTime = 60 + Math.random() * 120;
}
self.x += Math.cos(self.wanderDirection) * self.speed;
self.y += Math.sin(self.wanderDirection) * self.speed;
}
}
if (self.x < 50) self.x = 50;
if (self.x > 1998) self.x = 1998;
if (self.y < 50) self.y = 50;
if (self.y > 2682) self.y = 2682;
};
return self;
});
var Message = Container.expand(function (text, color) {
var self = Container.call(this);
self.lifetime = 300; // 5 seconds at 60fps
self.age = 0;
self.fadeStartTime = 240; // Start fading after 4 seconds
var messageText = new Text2(text, {
size: 40,
fill: color || 0xFFFFFF
});
messageText.anchor.set(0.5, 0.5);
self.addChild(messageText);
// Position at center of screen
self.x = 1024;
self.y = 1366;
// Initial fade in effect
self.alpha = 0;
tween(self, {
alpha: 1
}, {
duration: 500,
easing: tween.easeOut
});
self.update = function () {
self.age++;
// Start fading out
if (self.age >= self.fadeStartTime && self.alpha > 0) {
var fadeProgress = (self.age - self.fadeStartTime) / (self.lifetime - self.fadeStartTime);
self.alpha = Math.max(0, 1 - fadeProgress);
}
if (self.age >= self.lifetime) {
self.shouldDestroy = true;
}
};
return self;
});
var Rifle = Container.expand(function (x, y, targetX, targetY) {
var self = Container.call(this);
self.lifetime = 120; // 2 seconds at 60fps
self.age = 0;
var rifleGraphics = self.attachAsset('rifle', {
anchorX: 0.5,
anchorY: 0.5
});
self.x = x;
self.y = y;
// Calculate angle to target
var dx = targetX - x;
var dy = targetY - y;
rifleGraphics.rotation = Math.atan2(dy, dx);
// Muzzle flash effect
LK.effects.flashObject(self, 0xFFFF00, 200);
self.update = function () {
self.age++;
// Recoil animation
if (self.age < 10) {
rifleGraphics.x = -self.age;
} else if (self.age < 20) {
rifleGraphics.x = -(20 - self.age);
} else {
rifleGraphics.x = 0;
}
if (self.age >= self.lifetime) {
self.shouldDestroy = true;
}
};
return self;
});
var Snake = Container.expand(function () {
var self = Container.call(this);
self.isMoving = false;
self.targetX = 0;
self.targetY = 0;
self.moveSpeed = 4;
var snakeGraphics = self.attachAsset('snake', {
anchorX: 0.5,
anchorY: 0.5
});
self.moveTo = function (x, y) {
self.targetX = x;
self.targetY = y;
self.isMoving = true;
};
self.update = function () {
if (self.isMoving) {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < self.moveSpeed) {
self.x = self.targetX;
self.y = self.targetY;
self.isMoving = false;
} else {
self.x += dx / distance * self.moveSpeed;
self.y += dy / distance * self.moveSpeed;
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x006400
});
/****
* Game Code
****/
var background = game.attachAsset('background', {
x: 0,
y: 0
});
var snake = game.addChild(new Snake());
snake.x = 1024;
snake.y = 1366;
var children = [];
var bottles = [];
var adults = [];
var rifles = [];
var currentLevel = 1;
var pointsNeeded = 50;
// Arrays of names for children
var girlNames = ['Mia', 'Sara', 'Laura', 'Maya', 'Julie', 'Olivia', 'Martine', 'Paula', 'Daisy', 'Juliette', 'Margot', 'Tina', 'AbigaĆÆl', 'ClĆ©mence', 'AmĆ©lie', 'Amina', 'Laurence', 'Ilona', 'Gloria', 'Valentina', 'Victoria', 'Ninon', 'Manon', 'Violette', 'Rose', 'ZĆ©lie', 'Ylenia', 'Sabrina', 'Harper', 'Valentine', 'Ćlodie', 'GrĆ¢ce', 'Jade', 'Eva', 'MaĆ«va', 'Anna', 'Alice', 'Louise', 'ZoĆ©', 'ChloĆ©', 'Julia', 'Romy', 'Iris', 'Ambre', 'Agathe', 'Inaya', 'Lea', 'Adele', 'Clara', 'Emily', 'Eveline', 'Dorine', 'Lou', 'Amelia', 'Isabella', 'Charlotte', 'Delphine', 'Dona', 'Yasmine', 'Marie', 'Carine', 'Kimberly', 'Erina', 'MaĆ«lle', 'JosĆ©phine', 'Jacqueline', 'FranƧoise', 'ThĆ©a', 'Denise'];
var boyNames = ['Hugo', 'Louis', 'Karim', 'Julien', 'Thomas', 'Thom', 'Lucas', 'ClƩment', 'Laurent', 'Ibrahim', 'Mohamed', 'LƩo', 'Willy', 'Moris', 'Mathieu', 'Marius', 'Paul', 'Valentin', 'Bernard', 'Eric', 'Jules', 'Claude', 'Quentin', 'Gabriel', 'Dimitri', 'Raphaƫl', 'Noa', 'Maƫl', 'Arthur', 'Adam', 'Isaac', 'Eden', 'LƩon', 'Sacha', 'Aaron', 'Liam', 'Naƫl', 'Malo', 'Baptiste', 'Corentin', 'Diego', 'Alexandre', 'Felix', 'Gaspard', 'Alain', 'Albert', 'Adrien', 'Achille', 'Dorian', 'Alexis', 'Alex', 'Mylan', 'Pierre', 'Yann', 'Axel', 'Charles', 'David', 'Joseph', 'Jacques', 'Antoine', 'FranƧois', 'ThƩo', 'Maxime', 'Victor', 'Anthony', 'AndrƩ', 'William', 'Jacob', 'Nathan', 'Sam', 'Logan'];
var messages = [];
var levelText = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelText.anchor.set(0, 0);
levelText.x = 150;
levelText.y = 50;
LK.gui.topLeft.addChild(levelText);
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var targetText = new Text2('Target: ' + pointsNeeded, {
size: 50,
fill: 0xFFFF00
});
targetText.anchor.set(1, 0);
targetText.x = -50;
targetText.y = 50;
LK.gui.topRight.addChild(targetText);
function spawnChildren() {
var boyCount = Math.floor(Math.random() * 6) + 1;
var girlCount = Math.floor(Math.random() * 6) + 1;
for (var i = 0; i < boyCount; i++) {
var boy = game.addChild(new Child('boy'));
boy.x = Math.random() * 1800 + 124;
boy.y = Math.random() * 2400 + 166;
// Speed is now calculated in Child constructor based on age
boy.speed += (currentLevel - 1) * 0.2;
children.push(boy);
}
for (var j = 0; j < girlCount; j++) {
var girl = game.addChild(new Child('girl'));
girl.x = Math.random() * 1800 + 124;
girl.y = Math.random() * 2400 + 166;
// Speed is now calculated in Child constructor based on age
girl.speed += (currentLevel - 1) * 0.2;
children.push(girl);
}
}
function updateUI() {
levelText.setText('Level: ' + currentLevel);
scoreText.setText('Score: ' + LK.getScore());
targetText.setText('Target: ' + pointsNeeded);
}
function checkLevelUp() {
if (LK.getScore() >= pointsNeeded) {
currentLevel++;
if (currentLevel > 35) {
LK.showYouWin();
return;
}
// Reset score to 0 and calculate new points needed for next level
LK.setScore(0);
pointsNeeded = 50 + (currentLevel - 2) * 5;
for (var i = 0; i < children.length; i++) {
children[i].destroy();
}
children = [];
spawnChildren();
updateUI();
LK.effects.flashScreen(0x00FF00, 500);
}
}
function checkLevelDown() {
if (LK.getScore() < 0) {
LK.setScore(0);
}
// Check if we need to go down a level (if score becomes very low compared to target)
var minScoreForLevel = Math.max(0, pointsNeeded - 50);
if (LK.getScore() < minScoreForLevel && currentLevel > 1) {
currentLevel--;
pointsNeeded = 50 + (currentLevel - 2) * 5;
if (pointsNeeded < 50) pointsNeeded = 50;
for (var i = 0; i < children.length; i++) {
children[i].destroy();
}
children = [];
spawnChildren();
updateUI();
LK.effects.flashScreen(0xFF4444, 500);
}
}
spawnChildren();
updateUI();
game.down = function (x, y, obj) {
snake.moveTo(x, y);
};
game.update = function () {
for (var i = children.length - 1; i >= 0; i--) {
var child = children[i];
if (snake.intersects(child)) {
LK.setScore(LK.getScore() + 5);
LK.getSound('catch').play();
// Display congratulations message
var congratsMessage = new Message('FƩlicitations ! Vous avez mangƩ ' + child.name + ' ce petit dƩsastre ambulant', 0x00FF00);
game.addChild(congratsMessage);
messages.push(congratsMessage);
child.destroy();
children.splice(i, 1);
checkLevelUp();
continue;
}
var distanceFromCenter = Math.sqrt(Math.pow(child.x - 1024, 2) + Math.pow(child.y - 1366, 2));
if (distanceFromCenter > 1500) {
// Display escape message
var escapeMessage = new Message('Oh non! ' + child.name + ' a réussi à s\'enfuir !', 0xFF4444);
game.addChild(escapeMessage);
messages.push(escapeMessage);
child.destroy();
children.splice(i, 1);
}
}
// Handle bottle collisions and cleanup
for (var b = bottles.length - 1; b >= 0; b--) {
var bottle = bottles[b];
// Check collision with snake
if (snake.intersects(bottle)) {
LK.setScore(Math.max(0, LK.getScore() - 2));
LK.effects.flashObject(snake, 0xFF0000, 500);
bottle.destroy();
bottles.splice(b, 1);
checkLevelDown();
continue;
}
// Check if bottle should be destroyed
if (bottle.shouldDestroy) {
bottle.destroy();
bottles.splice(b, 1);
}
}
// Handle adult cleanup
for (var a = adults.length - 1; a >= 0; a--) {
var adult = adults[a];
if (adult.shouldDestroy) {
adult.destroy();
adults.splice(a, 1);
}
}
// Handle rifle cleanup
for (var r = rifles.length - 1; r >= 0; r--) {
var rifle = rifles[r];
if (rifle.shouldDestroy) {
rifle.destroy();
rifles.splice(r, 1);
}
}
// Handle message cleanup
for (var m = messages.length - 1; m >= 0; m--) {
var message = messages[m];
if (message.shouldDestroy) {
message.destroy();
messages.splice(m, 1);
}
}
if (children.length === 0) {
spawnChildren();
}
updateUI();
};
LK.playMusic('jungle');
Fond d'eĢcran foreĢt amazonienne. In-Game asset. 2d. High contrast. No shadows
Petite fille. In-Game asset. 2d. High contrast. No shadows
Petit garçon. In-Game asset. 2d. High contrast. No shadows
Serpent. In-Game asset. 2d. High contrast. No shadows
Biberon. In-Game asset. 2d. High contrast. No shadows
Fusil. In-Game asset. 2d. High contrast. No shadows
Adulte de 30 ans. In-Game asset. 2d. High contrast. No shadows