/**** * 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