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