/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Chafee = Container.expand(function () { var self = Container.call(this); var chafeeGraphics = self.attachAsset('chafee', { anchorX: 0.5, anchorY: 0.5 }); self.encountered = false; self.riddles = [{ question: "Je miaule mais je ne suis pas un chat, j'ai des ailes mais je ne vole pas. Qui suis-je ?", answers: ["Un oiseau", "Le ChafĂ©e", "Un dragon", "Un papillon"], correct: 1 }, { question: "Qu'est-ce qui est invisible mais fait du bruit quand on le casse ?", answers: ["Le vent", "Le silence", "Un rĂȘve", "Une bulle"], correct: 1 }, { question: "Je grandis en vieillissant mais je rapetisse en tombant. Qui suis-je ?", answers: ["Une bougie", "Un arbre", "La lune", "Une ombre"], correct: 0 }, { question: "Qu'est-ce qui a quatre pattes le matin, deux Ă midi et trois le soir, mais n'est pas un humain ?", answers: ["Un centaure malade", "Une chaise qui se transforme", "Mon cousin Gribouille", "Un sphinx paresseux"], correct: 2 }, { question: "Pourquoi les poissons ne jouent-ils jamais au poker ?", answers: ["Ils ont peur de l'eau", "Ils n'ont pas de poches", "Ils montrent toujours leurs Ă©cailles", "Ils prĂ©fĂšrent le bridge"], correct: 2 }, { question: "Que dit un escargot quand il croise une limace ?", answers: ["Regarde, un nudiste !", "Tu as perdu ta maison ?", "Salut cousin sans coquille !", "DĂ©pĂȘche-toi !"], correct: 0 }, { question: "Combien de chats faut-il pour visser une ampoule ?", answers: ["Aucun, ils prĂ©fĂšrent le noir", "Sept, un pour tenir et six pour tourner", "Deux, mais comment ils rentrent dedans ?", "Un seul, mais il faut qu'il soit motivĂ©"], correct: 2 }, { question: "Qu'est-ce qui est jaune et qui attend ?", answers: ["Jonathan Bananier", "Un citron patient", "Le soleil en retard", "Mon petit-dĂ©jeuner"], correct: 0 }, { question: "Pourquoi les plongeurs plongent-ils toujours en arriĂšre ?", answers: ["Parce qu'en avant ils tombent dans le bateau", "C'est plus joli", "Ils sont timides", "Pour faire des bulles"], correct: 0 }, { question: "Qu'est-ce qui est petit, vert et qui monte et descend ?", answers: ["Un petit pois dans un ascenseur", "Un martien qui fait du sport", "Une olive qui danse", "Mon voisin malade"], correct: 0 }, { question: "Comment appelle-t-on un chat tombĂ© dans un pot de peinture le jour de NoĂ«l ?", answers: ["Un chat-mallow", "Un chat-pin de NoĂ«l", "Un chat-touillĂ©", "Un chat-grin"], correct: 1 }, { question: "Que dit un tapis quand il se lĂšve ?", answers: ["J'ai mal au dos", "Oula, j'suis tout froissĂ© !", "Bonjour parquet !", "Il Ă©tait temps !"], correct: 1 }, { question: "Pourquoi les poules pondent-elles des Ćufs ?", answers: ["Parce que si elles les jetaient, ils se casseraient", "Elles n'ont pas le choix", "C'est leur hobby", "Pour embĂȘter les renards"], correct: 0 }, { question: "Qu'est-ce qui est transparent et qui sent la carotte ?", answers: ["Un pet de lapin", "Un fantĂŽme gourmand", "De l'eau de carotte", "L'haleine de Bugs Bunny"], correct: 0 }, { question: "Comment fait-on pour allumer un barbecue sous l'eau ?", answers: ["Avec un briquet Ă©tanche", "On ne peut pas, idiot !", "Avec du feu liquide", "En demandant Ă Aquaman"], correct: 1 }, { question: "Qu'est-ce qui est rouge et qui sourit dans un coin ?", answers: ["Une tomate heureuse", "Un clown coincĂ©", "Une fraise qui regarde la tĂ©lĂ©", "Mon nez aprĂšs un rhume"], correct: 0 }, { question: "Pourquoi les elephants ont-ils une excellente mĂ©moire ?", answers: ["Parce qu'ils racontent de bonnes histoires", "Ils ne peuvent pas oublier leur poids", "Ils Ă©crivent tout", "Sinon ils oublieraient oĂč ils ont mis leur trompe"], correct: 3 }, { question: "Qu'est-ce qui est pire qu'une girafe avec un mal de gorge ?", answers: ["Un mille-pattes avec des ampoules", "Un hippopotame qui fait rĂ©gime", "Une baleine qui a le hoquet", "Moi quand j'ai faim"], correct: 0 }, { question: "Comment appelle-t-on un boomerang qui ne revient pas ?", answers: ["Un boomewrong", "Un bĂąton", "Un boomerang paresseux", "Un boomerang en vacances"], correct: 1 }, { question: "Qu'est-ce qui a des dents mais ne mange jamais ?", answers: ["Un requin vĂ©gĂ©tarien", "Une scie", "Mon grand-pĂšre", "Un piano souriant"], correct: 1 }, { question: "Pourquoi les abeilles ont-elles des cheveux collants ?", answers: ["Elles utilisent du honey-shampooing", "Elles transpirent du miel", "C'est de la cire", "Elles ne se lavent jamais"], correct: 0 }, { question: "Qu'est-ce qui tombe mais ne se fait jamais mal ?", answers: ["La pluie", "Un parachutiste expert", "Mon moral le lundi", "Les feuilles d'automne"], correct: 0 }, { question: "Comment appelle-t-on un chien qui n'a pas de pattes ?", answers: ["On ne l'appelle pas, on va le chercher", "Un chien saucisse", "Roulette", "Un chat dĂ©guisĂ©"], correct: 0 }, { question: "Qu'est-ce qui est invisible et sent l'ail ?", answers: ["L'haleine d'un vampire", "Un pet d'italien", "L'air de la cuisine", "Mon ami invisible"], correct: 0 }, { question: "Pourquoi les bananes portent-elles de la crĂšme solaire ?", answers: ["Pour ne pas peler", "Elles sont Ă la plage", "Elles sont coquettes", "C'est leur peau naturelle"], correct: 0 }, { question: "Qu'est-ce qui crie plus fort qu'un cochon qu'on Ă©gorge ?", answers: ["Deux cochons qu'on Ă©gorge", "Un cochon avec un mĂ©gaphone", "Ma voisine qui regarde le foot", "Un micro qui larsen"], correct: 0 }, { question: "Comment fait-on pour qu'un canard marche sur la tĂȘte ?", answers: ["On retourne l'Ă©tang", "On lui met les pattes en l'air", "On lui demande poliment", "Impossible, ils ont le vertige"], correct: 0 }, { question: "Qu'est-ce qui a un chapeau mais pas de tĂȘte ?", answers: ["Un champignon", "Un Ă©pouvantail sans tĂȘte", "Une bouteille chic", "Mon cousin Albert"], correct: 0 }, { question: "Pourquoi les pingouins ne volent-ils pas ?", answers: ["Ils ont peur du mal des transports", "Leurs ailes sont trop petites", "Ils n'ont pas de permis", "Ils prĂ©fĂšrent nager"], correct: 1 }, { question: "Qu'est-ce qui court mais n'a pas de jambes ?", answers: ["L'eau", "Le temps", "Mon nez quand j'ai un rhume", "Toutes ces rĂ©ponses"], correct: 3 }, { question: "Comment appelle-t-on un dinosaure qui dort ?", answers: ["Un dodo-saure", "Un dinoronfle", "Un paresseux-rex", "Un fossile fatiguĂ©"], correct: 0 }, { question: "Qu'est-ce qui est blanc et noir et rouge partout ?", answers: ["Un zĂšbre qui rougit", "Un journal", "Un pingouin qui saigne du nez", "Ma conscience"], correct: 1 }, { question: "Pourquoi les chauves se lavent-ils le visage avec du shampooing ?", answers: ["Ils ne savent pas oĂč s'arrĂȘtent les cheveux", "C'est plus Ă©conomique", "Ils sont confus", "Par habitude"], correct: 0 }, { question: "Qu'est-ce qui a six pattes et qui vole ?", answers: ["Trois oiseaux attachĂ©s ensemble", "Un insecte", "Un avion avec des pattes", "Mon imagination"], correct: 1 }, { question: "Comment appelle-t-on un combat entre un chat et un chien ?", answers: ["Un miaule-ment", "Une bataille d'animaux", "Un chat-hu", "Un bordel monstre"], correct: 2 }, { question: "Qu'est-ce qui grandit mais ne vieillit jamais ?", answers: ["Les mensonges", "Les dettes", "L'ignorance", "Mes cheveux dans les oreilles"], correct: 0 }, { question: "Pourquoi les vampires ne vont-ils jamais Ă la plage ?", answers: ["Ils ont peur de bronzer", "Le sable rentre dans leur cercueil", "L'ail de mer", "Ils prĂ©fĂšrent les piscines"], correct: 0 }, { question: "Qu'est-ce qui a des ailes mais ne vole pas et nage mais n'a pas d'eau ?", answers: ["Un poulet dans un aquarium vide", "Un pingouin", "Mon rĂȘve de voler", "Une poule qui fait de la natation"], correct: 1 }, { question: "Comment fait-on pour rendre un mouchoir complĂštement carrĂ© ?", answers: ["On le plie bien", "On le dĂ©coupe", "On lui raconte une blague nulle", "Impossible, il sera toujours rond des coins"], correct: 2 }, { question: "Qu'est-ce qui monte et descend mais ne bouge jamais ?", answers: ["La tempĂ©rature", "L'escalier", "Mon humeur", "Le prix de l'essence"], correct: 1 }, { question: "Pourquoi est-ce qu'on dit que l'argent n'a pas d'odeur ?", answers: ["Parce qu'il est enrhumĂ©", "Il se lave souvent", "C'est faux, ça sent l'avarice", "Il porte du dĂ©odorant"], correct: 2 }, { question: "Qu'est-ce qui se casse dĂšs qu'on le nomme ?", answers: ["Le silence", "La vaisselle de ma mĂšre", "Un secret", "Mon cĆur quand on m'ignore"], correct: 0 }]; self.update = function () { self.x -= scrollSpeed; // Check collision with Lisa if (!self.encountered && self.intersects(lisa)) { self.encountered = true; self.startRiddle(); } }; self.startRiddle = function () { isPaused = true; self.currentRiddle = self.riddles[Math.floor(Math.random() * self.riddles.length)]; // Create riddle UI self.riddleContainer = game.addChild(new Container()); self.riddleContainer.x = 1024; self.riddleContainer.y = 1366; // Background var bg = self.riddleContainer.addChild(LK.getAsset('challengeBox', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.2, scaleY: 1.0 })); bg.alpha = 0.9; bg.tint = 0x9400D3; // Title var titleText = self.riddleContainer.addChild(new Text2('Le ChafĂ©e - Chat Malicieux', { size: 36, fill: 0xFFFFFF })); titleText.anchor.set(0.5, 0.5); titleText.y = -150; // Question var questionText = self.riddleContainer.addChild(new Text2(self.currentRiddle.question, { size: 32, fill: 0xFFFFFF })); questionText.anchor.set(0.5, 0.5); questionText.y = -80; // Answer buttons self.answerButtons = []; for (var i = 0; i < self.currentRiddle.answers.length; i++) { var buttonContainer = self.riddleContainer.addChild(new Container()); buttonContainer.x = 0; buttonContainer.y = -20 + i * 50; buttonContainer.answerIndex = i; var buttonBg = buttonContainer.addChild(LK.getAsset('challengeBox', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.15 })); buttonBg.tint = 0xDDA0DD; buttonBg.alpha = 0.8; var buttonText = buttonContainer.addChild(new Text2(i + 1 + '. ' + self.currentRiddle.answers[i], { size: 26, fill: 0x000000 })); buttonText.anchor.set(0.5, 0.5); buttonContainer.down = function (x, y, obj) { this.alpha = 0.7; var container = this; LK.setTimeout(function () { container.alpha = 1; }, 100); if (container.answerIndex === self.currentRiddle.correct) { self.onCorrectAnswer(); } else { self.onWrongAnswer(); } }; self.answerButtons.push(buttonContainer); } }; self.onCorrectAnswer = function () { var randomType = bubbleTypes[Math.floor(Math.random() * bubbleTypes.length)]; lipoints[randomType] += 40; updateLipointsDisplay(); checkLevelUp(); self.showResultMessage('Bravo ! Le ChafĂ©e t\'offre 40 LIPOINTS de ' + randomType + ' !', 0x00FF00); LK.getSound('success').play(); LK.setTimeout(function () { self.closeRiddle(); }, 5000); }; self.onWrongAnswer = function () { var stolenType = Math.random() < 0.5 ? 'destiny' : 'lollipop'; var stolenAmount = stolenType === 'destiny' ? 15 : 20; if (lipoints[stolenType] >= stolenAmount) { lipoints[stolenType] -= stolenAmount; } else { lipoints[stolenType] = 0; } updateLipointsDisplay(); self.showResultMessage('Dommage ! Le ChafĂ©e te vole ' + stolenAmount + ' LIPOINTS de ' + stolenType + ' !', 0xFF0000); LK.getSound('fail').play(); LK.setTimeout(function () { self.closeRiddle(); }, 5000); }; self.showResultMessage = function (message, color) { var resultText = self.riddleContainer.addChild(new Text2(message, { size: 32, fill: color })); resultText.anchor.set(0.5, 0.5); resultText.y = 120; }; self.closeRiddle = function () { if (self.riddleContainer) { self.riddleContainer.destroy(); } isPaused = false; self.destroy(); characters.splice(characters.indexOf(self), 1); }; return self; }); var Challenge = Container.expand(function (type) { var self = Container.call(this); var challengeGraphics = self.attachAsset('challengeBox', { anchorX: 0.5, anchorY: 0.5 }); challengeGraphics.alpha = 0.9; self.challengeType = type; self.attempts = 0; self.maxAttempts = 3; self.isActive = true; // Challenge text self.titleText = self.addChild(new Text2('', { size: 40, fill: 0xFFFFFF })); self.titleText.anchor.set(0.5, 0.5); self.titleText.y = -120; self.instructionText = self.addChild(new Text2('', { size: 24, fill: 0xFFFFFF })); self.instructionText.anchor.set(0.5, 0.5); self.instructionText.y = -60; self.resultText = self.addChild(new Text2('', { size: 30, fill: 0xFFFFFF })); self.resultText.anchor.set(0.5, 0.5); self.resultText.y = 100; self.setupChallenge = function () { switch (self.challengeType) { case 'light': self.setupLightChallenge(); break; case 'destiny': self.setupDestinyChallenge(); break; case 'shadow': self.setupShadowChallenge(); break; case 'lollipop': self.setupLollipopChallenge(); break; case 'ocean': self.setupOceanChallenge(); break; } }; self.setupLightChallenge = function () { self.titleText.setText('DĂ©fi de la LumiĂšre'); self.instructionText.setText('Appuie pour allumer les lampes par la force de ta pensĂ©e !'); // Create lamps self.lamps = []; for (var i = 0; i < 3; i++) { var lamp = self.addChild(LK.getAsset('lamp', { anchorX: 0.5, anchorY: 0.5 })); lamp.x = (i - 1) * 80; lamp.y = 20; lamp.lit = false; self.lamps.push(lamp); } }; self.setupDestinyChallenge = function () { self.titleText.setText('DĂ©fi du Destin'); self.currentQuestion = destinyQuestions[Math.floor(Math.random() * destinyQuestions.length)]; self.instructionText.setText(self.currentQuestion.question); self.instructionText.y = -100; // Create answer buttons self.answerButtons = []; for (var i = 0; i < self.currentQuestion.answers.length; i++) { // Create button container var buttonContainer = self.addChild(new Container()); buttonContainer.x = 0; buttonContainer.y = -20 + i * 60; buttonContainer.answerIndex = i; // Create button background shape var buttonBg = buttonContainer.addChild(LK.getAsset('challengeBox', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.2 })); buttonBg.tint = 0xE6E6FA; // Light lavender background buttonBg.alpha = 0.8; // Create button text var buttonText = buttonContainer.addChild(new Text2(i + 1 + '. ' + self.currentQuestion.answers[i], { size: 28, fill: 0x000000 })); buttonText.anchor.set(0.5, 0.5); // Add click handler to button container buttonContainer.down = function (x, y, obj) { // Visual feedback this.alpha = 0.7; var container = this; LK.setTimeout(function () { container.alpha = 1; }, 100); // Process answer if (container.answerIndex === self.currentQuestion.correct) { container.children[0].tint = 0x00FF00; // Green for correct self.onSuccess(); } else { container.children[0].tint = 0xFF0000; // Red for incorrect self.onFailure(); } }; self.answerButtons.push(buttonContainer); } self.isQuizChallenge = true; }; self.setupShadowChallenge = function () { self.titleText.setText('DĂ©fi de l\'Ombre'); self.instructionText.setText('Ăteins le soleil brillant avec la magie de l\'ombre !\nAppuie pour crĂ©er des ombres !'); }; self.setupLollipopChallenge = function () { self.titleText.setText('DĂ©fi des Sucettes'); self.currentQuestion = lollipopQuestions[Math.floor(Math.random() * lollipopQuestions.length)]; self.instructionText.setText(self.currentQuestion.question); self.instructionText.y = -100; // Create answer buttons self.answerButtons = []; for (var i = 0; i < self.currentQuestion.answers.length; i++) { // Create button container var buttonContainer = self.addChild(new Container()); buttonContainer.x = 0; buttonContainer.y = -20 + i * 60; buttonContainer.answerIndex = i; // Create button background shape var buttonBg = buttonContainer.addChild(LK.getAsset('challengeBox', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.2 })); buttonBg.tint = 0xFFB6C1; // Light pink background buttonBg.alpha = 0.8; // Create button text var buttonText = buttonContainer.addChild(new Text2(i + 1 + '. ' + self.currentQuestion.answers[i], { size: 28, fill: 0x000000 })); buttonText.anchor.set(0.5, 0.5); // Add click handler to button container buttonContainer.down = function (x, y, obj) { // Visual feedback this.alpha = 0.7; var container = this; LK.setTimeout(function () { container.alpha = 1; }, 100); // Process answer if (container.answerIndex === self.currentQuestion.correct) { container.children[0].tint = 0x00FF00; // Green for correct self.onSuccess(); } else { container.children[0].tint = 0xFF0000; // Red for incorrect self.onFailure(); } }; self.answerButtons.push(buttonContainer); } self.isQuizChallenge = true; }; self.setupOceanChallenge = function () { self.titleText.setText('DĂ©fi des OcĂ©ans'); self.currentQuestion = oceanQuestions[Math.floor(Math.random() * oceanQuestions.length)]; self.instructionText.setText(self.currentQuestion.question); self.instructionText.y = -100; // Create answer buttons self.answerButtons = []; for (var i = 0; i < self.currentQuestion.answers.length; i++) { // Create button container var buttonContainer = self.addChild(new Container()); buttonContainer.x = 0; buttonContainer.y = -20 + i * 60; buttonContainer.answerIndex = i; // Create button background shape var buttonBg = buttonContainer.addChild(LK.getAsset('challengeBox', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.2 })); buttonBg.tint = 0x87CEEB; // Sky blue background buttonBg.alpha = 0.8; // Create button text var buttonText = buttonContainer.addChild(new Text2(i + 1 + '. ' + self.currentQuestion.answers[i], { size: 28, fill: 0x000000 })); buttonText.anchor.set(0.5, 0.5); // Add click handler to button container buttonContainer.down = function (x, y, obj) { // Visual feedback this.alpha = 0.7; var container = this; LK.setTimeout(function () { container.alpha = 1; }, 100); // Process answer if (container.answerIndex === self.currentQuestion.correct) { container.children[0].tint = 0x00FF00; // Green for correct self.onSuccess(); } else { container.children[0].tint = 0xFF0000; // Red for incorrect self.onFailure(); } }; self.answerButtons.push(buttonContainer); } self.isQuizChallenge = true; }; self.down = function (x, y, obj) { if (!self.isActive) return; // Handle action challenges (light, shadow) - quiz challenges now handle clicks through individual button handlers if (self.challengeType === 'light' || self.challengeType === 'shadow') { self.attempts++; var success = Math.random() < 0.3; if (success) { self.onSuccess(); } else { self.onFailure(); } } }; self.onSuccess = function () { self.resultText.setText('RĂ©ussi ! +5 LIPOINTS'); self.resultText.fill = "#00FF00"; LK.getSound('success').play(); // Award LIPOINTS lipoints[self.challengeType] += 5; updateLipointsDisplay(); checkLevelUp(); LK.setTimeout(function () { self.closeChallenge(); }, 2000); }; self.onFailure = function () { if (self.isQuizChallenge || self.attempts >= self.maxAttempts) { self.resultText.setText('DĂ©fi ĂchouĂ© !'); self.resultText.fill = "#FF0000"; LK.getSound('fail').play(); LK.setTimeout(function () { self.closeChallenge(); }, 2000); } else { self.resultText.setText('RĂ©essaie ! (' + (self.maxAttempts - self.attempts) + ' essais restants)'); self.resultText.fill = "#FFFF00"; } }; self.closeChallenge = function () { self.isActive = false; activeChallenge = null; self.destroy(); isPaused = false; }; return self; }); var Dogie = Container.expand(function () { var self = Container.call(this); var dogieGraphics = self.attachAsset('dogie', { anchorX: 0.5, anchorY: 0.5 }); self.encountered = false; self.remarks = ["Attention Lisa ! Le ChafĂ©e prĂ©pare encore une de ses blagues pourries !", "Tu savais que le ChafĂ©e collectionne les devinettes ratĂ©es ? Il en a des millions !", "Le ChafĂ©e m'a dit qu'il connaĂźt la blague la plus nulle du monde... Je pense qu'il dit vrai !", "MĂ©fie-toi, Lisa ! Le ChafĂ©e a encore inventĂ© une Ă©nigme qui ne rime Ă rien !", "Le ChafĂ©e pense qu'il est drĂŽle, mais mĂȘme les pierres bĂąillent quand il raconte ses blagues !", "Tu veux entendre la pire blague du ChafĂ©e ? Non ? Tu as raison, garde tes oreilles !", "Le ChafĂ©e m'a demandĂ© si je trouvais ses blagues amusantes... J'ai fait le mort !", "Lisa, si le ChafĂ©e te pose une devinette, prĂ©pare-toi Ă perdre quelques neurones !", "Le ChafĂ©e croit qu'il est un gĂ©nie de l'humour... Moi je dis qu'il est un gĂ©nie du ridicule !", "Attention ! Le ChafĂ©e a encore trouvĂ© une Ă©nigme dans un paquet de cĂ©rĂ©ales !", "Le ChafĂ©e m'a dit qu'il Ă©crit un livre de blagues... Je pense qu'il devrait plutĂŽt Ă©crire des excuses !", "Tu sais pourquoi je n'aime pas le ChafĂ©e ? Parce que ses blagues me donnent mal aux oreilles !", "Le ChafĂ©e prĂ©tend connaĂźtre 1000 devinettes... Dommage qu'aucune ne soit drĂŽle !", "Lisa, le ChafĂ©e va sĂ»rement te raconter sa blague prĂ©fĂ©rĂ©e... Prends tes jambes Ă ton cou !", "Le ChafĂ©e pense qu'il peut me faire rire avec ses Ă©nigmes... Il se trompe de planĂšte !", "MĂ©fie-toi du ChafĂ©e ! Il cache ses blagues pourries partout dans la forĂȘt !", "Le ChafĂ©e m'a demandĂ© si je voulais entendre sa nouvelle devinette... J'ai dit ouaf, c'est NON !", "Lisa, le ChafĂ©e collectionne aussi les mauvaises blagues qu'il n'a pas encore inventĂ©es !", "Le ChafĂ©e croit qu'il est le roi de l'humour... Moi je dis qu'il est plutĂŽt le roi des nouilles !", "Attention ! Le ChafĂ©e prĂ©pare encore un de ses quiz impossibles !", "Le ChafĂ©e m'a dit qu'il avait une devinette gĂ©niale... Je lui ai dit d'aller voir un docteur !", "Tu veux savoir le secret du ChafĂ©e ? Il invente ses blagues en dormant... Et ça se voit !", "Lisa, si le ChafĂ©e te demande ton avis sur ses blagues, dis-lui que tu es muette !", "Le ChafĂ©e pense qu'il va devenir cĂ©lĂšbre avec ses Ă©nigmes... CĂ©lĂšbre pour les mauvaises raisons !", "MĂ©fie-toi ! Le ChafĂ©e a encore lu un livre de devinettes pour enfants de 3 ans !", "Le ChafĂ©e m'a proposĂ© de devenir son assistant... J'ai prĂ©fĂ©rĂ© rester avec ma dignitĂ© !", "Lisa, le ChafĂ©e va te dire qu'il connaĂźt LA blague du siĂšcle... Ne l'Ă©coute pas, il ment !", "Le ChafĂ©e croit que ses Ă©nigmes sont mystĂ©rieuses... Elles sont surtout incomprĂ©hensibles !", "Attention ! Le ChafĂ©e a trouvĂ© de nouvelles devinettes dans un magazine de 1982 !", "Le ChafĂ©e m'a dit qu'il allait rĂ©volutionner l'humour... J'ai dit qu'il ferait mieux de commencer par l'apprendre !", "Lisa, le ChafĂ©e va sĂ»rement te poser une Ă©nigme sur les chaussettes... C'est son truc bizarre !", "Le ChafĂ©e pense qu'il est plus malin que moi... Mais mĂȘme une sardine est plus drĂŽle que lui !", "MĂ©fie-toi du ChafĂ©e ! Il cache ses blagues ratĂ©es sous les feuilles mortes !", "Le ChafĂ©e m'a demandĂ© si je connaissais une bonne blague... Je lui ai dit de se regarder dans un miroir !", "Lisa, le ChafĂ©e collectionne les devinettes comme moi je collectionne les os... Mais au moins mes os sont utiles !", "Le ChafĂ©e croit qu'il peut m'impressionner avec ses Ă©nigmes... Il ferait mieux d'essayer avec une mĂ©duse !", "Attention ! Le ChafĂ©e prĂ©pare encore une de ses questions sans rĂ©ponse logique !", "Le ChafĂ©e m'a dit qu'il Ă©tait le maĂźtre des devinettes... Je lui ai dit qu'il Ă©tait plutĂŽt le maĂźtre des catastrophes !", "Lisa, si le ChafĂ©e te propose un duel de blagues, cours plus vite que moi quand je vois le vĂ©tĂ©rinaire !", "Le ChafĂ©e pense que ses Ă©nigmes sont profondes... Elles sont surtout profondĂ©ment ennuyeuses !", "MĂ©fie-toi ! Le ChafĂ©e a encore inventĂ© une devinette en mĂ©langeant deux blagues ratĂ©es !", "Le ChafĂ©e m'a proposĂ© de tester ses nouvelles Ă©nigmes... J'ai prĂ©fĂ©rĂ© aller chez le toiletteur !", "Lisa, le ChafĂ©e va te dire qu'il connaĂźt le secret de l'humour... Son secret c'est de ne pas en avoir !", "Le ChafĂ©e croit qu'il peut me rendre fou avec ses devinettes... Il y est presque arrivĂ© !", "Attention ! Le ChafĂ©e a trouvĂ© un livre de blagues dans une poubelle... Et ça se sent !", "Le ChafĂ©e m'a demandĂ© mon avis sur sa derniĂšre Ă©nigme... Je lui ai dit qu'elle Ă©tait parfaite... pour faire fuir les mouches !", "Lisa, le ChafĂ©e va sĂ»rement te raconter l'histoire de la blague qui n'a pas de fin... Comme toutes les siennes !", "Le ChafĂ©e pense qu'il est l'Einstein de l'humour... Moi je pense qu'il est plutĂŽt l'Einstein de la bĂȘtise !", "MĂ©fie-toi du ChafĂ©e ! Il prĂ©pare encore une Ă©nigme Ă base de fromage qui pue !", "Le ChafĂ©e m'a dit qu'il allait m'apprendre l'humour... Je lui ai dit que j'Ă©tais allergique !", "Lisa, le ChafĂ©e collectionne les devinettes comme moi je collectionne les puces... En moins utile !", "Le ChafĂ©e croit qu'il peut m'Ă©mouvoir avec ses blagues... Il m'Ă©meut... de pitiĂ© !", "Attention ! Le ChafĂ©e a encore mĂ©langĂ© une devinette avec une recette de cuisine !", "Le ChafĂ©e m'a proposĂ© d'Ă©crire un livre ensemble... 'Les pires blagues du monde' ça vous dit ?", "Lisa, si le ChafĂ©e te demande de deviner quelque chose, dis-lui que tu devines qu'il va dire n'importe quoi !", "Le ChafĂ©e pense que ses Ă©nigmes sont des Ćuvres d'art... Des Ćuvres d'art moderne trĂšs trĂšs moderne !", "MĂ©fie-toi ! Le ChafĂ©e a encore trouvĂ© une devinette dans un paquet de chips vide !", "Le ChafĂ©e m'a dit qu'il connaissait la rĂ©ponse Ă tout... Sauf Ă la question 'Comment ĂȘtre drĂŽle ?' !", "Lisa, le ChafĂ©e va te poser une Ă©nigme sur les escargots... C'est son obsession du moment !", "Le ChafĂ©e croit qu'il peut me faire pleurer de rire... Il me fait pleurer c'est sĂ»r, mais pas de rire !", "Attention ! Le ChafĂ©e prĂ©pare encore une de ses devinettes Ă rallonge sans queue ni tĂȘte !", "Le ChafĂ©e m'a demandĂ© si j'aimais les surprises... Je lui ai dit que ses blagues m'avaient vaccinĂ© contre !", "Lisa, le ChafĂ©e va sĂ»rement te dire qu'il a inventĂ© l'humour... Ne le crois pas, il a juste inventĂ© l'anti-humour !", "Le ChafĂ©e pense qu'il est le plus drĂŽle de la forĂȘt... Il a raison : il est tellement pas drĂŽle que c'en est drĂŽle !", "MĂ©fie-toi du ChafĂ©e ! Il cache ses Ă©nigmes ratĂ©es dans des boĂźtes Ă chaussures !", "Le ChafĂ©e m'a proposĂ© de devenir son public... J'ai dit que j'Ă©tais dĂ©jĂ occupĂ© Ă ĂȘtre un chien !", "Lisa, le dernier conseil de Dogie : si le ChafĂ©e commence une phrase par 'Tu connais celle-lĂ ?', cours trĂšs trĂšs vite !"]; self.update = function () { self.x -= scrollSpeed; // Check collision with Lisa if (!self.encountered && self.intersects(lisa)) { self.encountered = true; self.startDialogue(); } }; self.startDialogue = function () { isPaused = true; // Choose a random remark var randomRemark = self.remarks[Math.floor(Math.random() * self.remarks.length)]; // Create dialogue UI self.dialogueContainer = game.addChild(new Container()); self.dialogueContainer.x = 1024; self.dialogueContainer.y = 1366; // Background var bg = self.dialogueContainer.addChild(LK.getAsset('challengeBox', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.3, scaleY: 0.8 })); bg.alpha = 0.9; bg.tint = 0x8B4513; // Brown color for dog // Title var titleText = self.dialogueContainer.addChild(new Text2('Dogie - Le Chien Anti-ChafĂ©e', { size: 32, fill: 0xFFFFFF })); titleText.anchor.set(0.5, 0.5); titleText.y = -120; // Dialogue text self.dialogueText = self.dialogueContainer.addChild(new Text2(randomRemark, { size: 30, fill: 0xFFFFFF })); self.dialogueText.anchor.set(0.5, 0.5); self.dialogueText.y = -20; // OK button self.okButton = self.dialogueContainer.addChild(new Container()); self.okButton.x = 0; self.okButton.y = 80; var okBg = self.okButton.addChild(LK.getAsset('challengeBox', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.3, scaleY: 0.15 })); okBg.tint = 0x32CD32; var okText = self.okButton.addChild(new Text2('OK', { size: 26, fill: 0x000000 })); okText.anchor.set(0.5, 0.5); self.okButton.down = function () { self.closeDialogue(); }; }; self.closeDialogue = function () { if (self.dialogueContainer) { self.dialogueContainer.destroy(); } isPaused = false; self.destroy(); characters.splice(characters.indexOf(self), 1); }; return self; }); var Estella = Container.expand(function () { var self = Container.call(this); var estellaGraphics = self.attachAsset('estella', { anchorX: 0.5, anchorY: 0.5 }); self.encountered = false; self.update = function () { self.x -= scrollSpeed; // Check collision with Lisa if (!self.encountered && self.intersects(lisa)) { self.encountered = true; self.startPowerChoice(); } }; self.startPowerChoice = function () { isPaused = true; // Create choice UI self.choiceContainer = game.addChild(new Container()); self.choiceContainer.x = 1024; self.choiceContainer.y = 1366; // Background var bg = self.choiceContainer.addChild(LK.getAsset('challengeBox', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.2, scaleY: 1.0 })); bg.alpha = 0.9; bg.tint = 0x9370DB; // Purple color for Estella // Title var titleText = self.choiceContainer.addChild(new Text2('Estella - Dresseuse de Pouvoirs', { size: 32, fill: 0xFFD700 })); titleText.anchor.set(0.5, 0.5); titleText.y = -150; // Instructions var instructText = self.choiceContainer.addChild(new Text2('Je t\'offre 50 LIPOINTS de poussiĂšre d\'Ă©toiles !\nChoisis le type de pouvoir Ă renforcer :', { size: 28, fill: 0xFFFFFF })); instructText.anchor.set(0.5, 0.5); instructText.y = -80; // Create choice buttons for each LIPOINT type var choices = [{ type: 'light', name: 'LumiĂšre', color: 0xFFFF00 }, { type: 'destiny', name: 'Destin', color: 0x9370DB }, { type: 'shadow', name: 'Ombre', color: 0x2F4F4F }, { type: 'lollipop', name: 'Sucettes', color: 0xFF69B4 }, { type: 'ocean', name: 'OcĂ©ans', color: 0x1E90FF }]; for (var i = 0; i < choices.length; i++) { var choice = choices[i]; var buttonContainer = self.choiceContainer.addChild(new Container()); buttonContainer.x = 0; buttonContainer.y = -20 + i * 40; buttonContainer.choiceType = choice.type; var buttonBg = buttonContainer.addChild(LK.getAsset('challengeBox', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.15 })); buttonBg.tint = choice.color; buttonBg.alpha = 0.8; var buttonText = buttonContainer.addChild(new Text2(choice.name + ' (+50)', { size: 26, fill: 0x000000 })); buttonText.anchor.set(0.5, 0.5); buttonContainer.down = function (x, y, obj) { this.alpha = 0.7; var container = this; LK.setTimeout(function () { container.alpha = 1; }, 100); self.grantPower(container.choiceType); }; } }; self.grantPower = function (chosenType) { // Give 50 LIPOINTS of chosen type lipoints[chosenType] += 50; updateLipointsDisplay(); checkLevelUp(); // Show confirmation message var confirmText = self.choiceContainer.addChild(new Text2('Parfait ! Tu as reçu 50 LIPOINTS de ' + chosenType + ' !', { size: 28, fill: 0x00FF00 })); confirmText.anchor.set(0.5, 0.5); confirmText.y = 120; LK.getSound('success').play(); LK.setTimeout(function () { self.closeChoice(); }, 3000); }; self.closeChoice = function () { if (self.choiceContainer) { self.choiceContainer.destroy(); } isPaused = false; self.destroy(); characters.splice(characters.indexOf(self), 1); }; return self; }); var Lisa = Container.expand(function () { var self = Container.call(this); var lisaGraphics = self.attachAsset('lisa', { anchorX: 0.5, anchorY: 0.5 }); self.velocityY = 0; self.isJumping = false; self.onGround = false; self.update = function () { // Apply gravity if (!self.onGround) { self.velocityY += 0.8; } self.y += self.velocityY; // Check collision with trees self.onGround = false; for (var i = 0; i < trees.length; i++) { var tree = trees[i]; if (self.intersects(tree) && self.velocityY > 0) { self.y = tree.y - tree.height / 2 - self.height / 2; self.velocityY = 0; self.onGround = true; self.isJumping = false; break; } } // Fall off screen check if (self.y > 2732 + 100) { resetLisaPosition(); } }; self.jump = function () { if (self.onGround && !self.isJumping) { self.velocityY = -18; self.isJumping = true; self.onGround = false; LK.getSound('jump').play(); } }; return self; }); var Malicia = Container.expand(function () { var self = Container.call(this); var maliciaGraphics = self.attachAsset('malicia', { anchorX: 0.5, anchorY: 0.5 }); self.encountered = false; self.dialogues = ["Ah, Lisa ! Je vois dans mes cristaux que tu as un grand destin...", "Mes potions magiques Ă base d'Ă©corce de licorne et de bave de dragon pourraient t'aider !", "Hmm... Je sens que tu dĂ©velopperas bientĂŽt le pouvoir de parler aux Ă©toiles !", "Cette potion violette Ă base de pĂ©tales de roses Ă©ternelles rĂ©vĂšlera ta vraie nature !", "Les astres me disent que ton futur pouvoir sera... spectaculaire !", "Veux-tu que je te prĂ©pare une potion Ă base de champignons phosphorescents ?", "J'ai ici une recette secrĂšte avec des plumes de phoenix et du miel d'abeilles dorĂ©es...", "Ton aura me dit que tu maĂźtriseras bientĂŽt la magie des Ă©lĂ©ments !", "Les nuages violets me murmurent que tu dĂ©couvriras le secret des chaussettes qui dansent toutes seules !", "Ma boule de cristal Ă paillettes prĂ©dit que tu parleras couramment le langage des cuillĂšres enchantĂ©es !", "Je vois dans le marc de cafĂ© de licorne que tu deviendras l'amie des nuages grognons !", "Mes cartes en Ă©corce de dragon annoncent que tu contrĂŽleras l'art de faire pousser des arbres Ă bonbons !", "L'Ă©cho de ma grotte magique rĂ©vĂšle que tu sauras transformer les larmes en perles de lune !", "Ma potion Ă base de rires de gnomes indique que tu maĂźtriseras le pouvoir de faire chanter les pierres !", "Les vapeurs de ma marmite aux algues cosmiques prĂ©voient que tu ouvriras des portails vers le pays des chaussettes perdues !", "Je sens dans l'air parfumĂ© aux pets de fĂ©es que tu dĂ©velopperas le don de comprendre les disputes des fourchettes !", "Ma baguette en bois de rĂ©glisse magique vibre : tu sauras invoquer des pluies de gĂąteaux au chocolat !", "Les Ă©cailles de poisson-lune dans ma main rĂ©vĂšlent que tu commanderas une armĂ©e de brosses Ă dents rebelles !", "Mon pendule en dent de mammouth rose prĂ©dit que tu dĂ©couvriras la recette du parfum qui rend invisible aux moustiques !", "La fumĂ©e violette de mes herbes chelou annonce que tu parleras aux fantĂŽmes de pizzas mangĂ©es !", "Mes runes gravĂ©es sur des croĂ»tes de fromage magique prĂ©disent que tu chevaucheras des licornes Ă rayures !", "L'esprit de ma thĂ©iĂšre hantĂ©e murmure que tu possĂ©deras le pouvoir de faire rougir les tomates !", "Ma boussole qui pointe vers les rĂȘves bizarres indique que tu crĂ©eras des arc-en-ciel carrĂ©s !", "Les bulles de ma potion aux larmes de crocodile vĂ©gĂ©tarien rĂ©vĂšlent que tu sauras rĂ©parer les cĆurs brisĂ©s avec du scotch magique !", "Mon miroir qui ment toujours prĂ©dit que tu ne dĂ©couvriras jamais comment apprivoiser les chats-dragons volants !", "Les plumes de mes coqs Ă trois pattes annoncent que tu maĂźtriseras l'art de faire fondre les regards mĂ©chants !", "Ma casserole en mĂ©tal d'Ă©toile filante vibre : tu ouvriras une Ă©cole pour enseigner aux papillons Ă chanter !", "Les cailloux colorĂ©s de ma riviĂšre enchantĂ©e prĂ©disent que tu inventeras le premier parapluie anti-cauchemars !", "Mon livre qui s'Ă©crit tout seul rĂ©vĂšle que tu dĂ©couvriras pourquoi les chaussettes disparaissent dans la machine Ă laver !", "La poudre de mes escargots lumineux annonce que tu parleras couramment la langue des bulles de savon !", "Ma loupe qui grossit les Ă©motions prĂ©dit que tu sauras transformer les disputes en batailles de chatouilles !", "Les pĂ©tales de mes roses qui poussent Ă l'envers rĂ©vĂšlent que tu commanderas une flotte de bateaux en papier gĂ©ants !", "Mon sablier rempli de poussiĂšre de comĂštes indique que tu possĂ©deras le don de faire pleurer de joie les nuages !", "La mĂ©lodie de ma harpe en cheveux d'ange prĂ©dit que tu crĂ©eras des ponts en rayons de soleil solidifiĂ©s !", "Mes billes qui roulent vers l'avenir annoncent que tu sauras convaincre les montagnes de changer de place !", "Mon collier en perles de rosĂ©e magique vibre : tu dĂ©couvriras le secret pour faire pousser des fleurs qui sonnent comme des cloches !", "Les Ă©chos de ma caverne qui rit toute seule rĂ©vĂšlent que tu maĂźtriseras l'art de peindre avec des rayons de lune !", "Ma baguette qui ne marche qu'Ă l'envers prĂ©dit que tu ouvriras un cafĂ© pour les fantĂŽmes timides !", "Les vapeurs de ma potion aux sourires d'enfants indiquent que tu sauras faire danser les Ă©toiles en formation !", "Mon chapeau pointu qui change de couleur selon l'humeur annonce que tu parleras aux esprit des vieilles chaussures !", "La mousse magique de mon chaudron rĂ©vĂšle que tu crĂ©eras des nuages-coussins pour les anges fatiguĂ©s !", "Mes lunettes qui voient dans le passĂ© des objets prĂ©disent que tu dĂ©couvriras l'histoire secrĂšte de chaque grain de sable !"]; self.currentDialogueIndex = 0; self.update = function () { self.x -= scrollSpeed; // Check collision with Lisa if (!self.encountered && self.intersects(lisa)) { self.encountered = true; self.startDialogue(); } }; self.startDialogue = function () { isPaused = true; self.currentDialogueIndex = 0; self.showDialogue(); }; self.showDialogue = function () { // Create dialogue UI self.dialogueContainer = game.addChild(new Container()); self.dialogueContainer.x = 1024; self.dialogueContainer.y = 1366; // Background var bg = self.dialogueContainer.addChild(LK.getAsset('challengeBox', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.3, scaleY: 0.8 })); bg.alpha = 0.9; bg.tint = 0x4B0082; // Title var titleText = self.dialogueContainer.addChild(new Text2('Malicia - SorciĂšre aux Potions Bizarres', { size: 32, fill: 0x9370DB })); titleText.anchor.set(0.5, 0.5); titleText.y = -120; // Dialogue text self.dialogueText = self.dialogueContainer.addChild(new Text2(self.dialogues[self.currentDialogueIndex], { size: 30, fill: 0xFFFFFF })); self.dialogueText.anchor.set(0.5, 0.5); self.dialogueText.y = -20; // Next button if (self.currentDialogueIndex < self.dialogues.length - 1) { self.nextButton = self.dialogueContainer.addChild(new Container()); self.nextButton.x = 0; self.nextButton.y = 80; var nextBg = self.nextButton.addChild(LK.getAsset('challengeBox', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.3, scaleY: 0.15 })); nextBg.tint = 0x32CD32; var nextText = self.nextButton.addChild(new Text2('Suivant', { size: 26, fill: 0x000000 })); nextText.anchor.set(0.5, 0.5); self.nextButton.down = function () { self.nextDialogue(); }; } else { // OK button for final dialogue self.okButton = self.dialogueContainer.addChild(new Container()); self.okButton.x = 0; self.okButton.y = 80; var okBg = self.okButton.addChild(LK.getAsset('challengeBox', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.3, scaleY: 0.15 })); okBg.tint = 0xFF6347; var okText = self.okButton.addChild(new Text2('OK', { size: 26, fill: 0x000000 })); okText.anchor.set(0.5, 0.5); self.okButton.down = function () { self.closeDialogue(); }; } }; self.nextDialogue = function () { self.currentDialogueIndex++; self.dialogueContainer.destroy(); self.showDialogue(); }; self.closeDialogue = function () { if (self.dialogueContainer) { self.dialogueContainer.destroy(); } isPaused = false; self.destroy(); characters.splice(characters.indexOf(self), 1); }; return self; }); var Margot = Container.expand(function () { var self = Container.call(this); var margotGraphics = self.attachAsset('margot', { anchorX: 0.5, anchorY: 0.5 }); self.encountered = false; self.update = function () { self.x -= scrollSpeed; // Check collision with Lisa if (!self.encountered && self.intersects(lisa)) { self.encountered = true; self.giveGift(); } }; self.giveGift = function () { var randomType = bubbleTypes[Math.floor(Math.random() * bubbleTypes.length)]; lipoints[randomType] += 25; updateLipointsDisplay(); checkLevelUp(); self.showGiftMessage(randomType); LK.getSound('success').play(); LK.setTimeout(function () { self.destroy(); characters.splice(characters.indexOf(self), 1); }, 5000); }; self.showGiftMessage = function (type) { var messageContainer = game.addChild(new Container()); messageContainer.x = lisa.x; messageContainer.y = lisa.y - 100; var messageText = messageContainer.addChild(new Text2('Margot, ta sĆur, t\'offre 25 LIPOINTS de ' + type + ' !', { size: 28, fill: 0xFF69B4 })); messageText.anchor.set(0.5, 0.5); tween(messageContainer, { alpha: 0 }, { duration: 5000, onFinish: function onFinish() { messageContainer.destroy(); } }); }; return self; }); var Mazz = Container.expand(function () { var self = Container.call(this); var mazzGraphics = self.attachAsset('mazz', { anchorX: 0.5, anchorY: 0.5 }); self.encountered = false; self.update = function () { self.x -= scrollSpeed; // Check collision with Lisa if (!self.encountered && self.intersects(lisa)) { self.encountered = true; self.breatheFire(); } }; self.breatheFire = function () { // Choose random LIPOINT type to burn var burnableTypes = []; for (var type in lipoints) { if (lipoints[type] > 0) { burnableTypes.push(type); } } if (burnableTypes.length === 0) { // No LIPOINTS to burn self.showMessage('Mazz crache du feu mais tu n\'as pas de LIPOINTS Ă brĂ»ler !'); } else { var randomType = burnableTypes[Math.floor(Math.random() * burnableTypes.length)]; var stolenAmount = Math.min(30, lipoints[randomType]); lipoints[randomType] -= stolenAmount; updateLipointsDisplay(); var typeName = randomType === 'light' ? 'lumiĂšre' : randomType === 'destiny' ? 'destin' : randomType === 'shadow' ? 'ombre' : randomType === 'lollipop' ? 'sucettes' : 'ocĂ©ans'; self.showMessage('Mazz s\'amuse Ă cracher du feu ! Il a brĂ»lĂ© ' + stolenAmount + ' LIPOINTS de ' + typeName + ' par accident !'); } LK.setTimeout(function () { self.destroy(); characters.splice(characters.indexOf(self), 1); }, 10000); }; self.showMessage = function (message) { var messageContainer = game.addChild(new Container()); messageContainer.x = lisa.x; messageContainer.y = lisa.y - 100; var messageBg = messageContainer.addChild(LK.getAsset('challengeBox', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.0, scaleY: 0.3 })); messageBg.tint = 0xFF4500; // Orange-red for fire messageBg.alpha = 0.9; var messageText = messageContainer.addChild(new Text2(message, { size: 28, fill: 0xFFFFFF })); messageText.anchor.set(0.5, 0.5); // Add fire effect animation tween(messageBg, { scaleX: 1.1, scaleY: 0.35 }, { duration: 500, easing: tween.easeInOut }); tween(messageBg, { scaleX: 1.0, scaleY: 0.3 }, { duration: 500, easing: tween.easeInOut }); LK.setTimeout(function () { messageContainer.destroy(); }, 10000); }; return self; }); var PowerBubble = Container.expand(function (type) { var self = Container.call(this); var bubbleAsset = type + 'Bubble'; var bubbleGraphics = self.attachAsset(bubbleAsset, { anchorX: 0.5, anchorY: 0.5 }); self.bubbleType = type; self.collected = false; self.update = function () { self.x -= scrollSpeed; // Check collision with Lisa if (!self.collected && self.intersects(lisa)) { self.collected = true; LK.getSound('collect').play(); startChallenge(self.bubbleType); self.destroy(); bubbles.splice(bubbles.indexOf(self), 1); } }; return self; }); var Stella = Container.expand(function () { var self = Container.call(this); var stellaGraphics = self.attachAsset('stella', { anchorX: 0.5, anchorY: 0.5 }); self.encountered = false; self.pathChosen = false; self.update = function () { self.x -= scrollSpeed; // Check collision with Lisa if (!self.encountered && self.intersects(lisa)) { self.encountered = true; self.showPathChoice(); } }; self.showPathChoice = function () { isPaused = true; // Create path choice UI self.pathContainer = game.addChild(new Container()); self.pathContainer.x = 1024; self.pathContainer.y = 1366; // Background var bg = self.pathContainer.addChild(LK.getAsset('challengeBox', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.2, scaleY: 0.8 })); bg.alpha = 0.9; // Title var titleText = self.pathContainer.addChild(new Text2('FĂ©e Stella - Guide ĂtoilĂ©e', { size: 36, fill: 0xFFD700 })); titleText.anchor.set(0.5, 0.5); titleText.y = -120; // Instructions var instructText = self.pathContainer.addChild(new Text2('Choisis ton chemin mystĂ©rieux !', { size: 28, fill: 0xFFFFFF })); instructText.anchor.set(0.5, 0.5); instructText.y = -60; // Left path button var leftPath = self.pathContainer.addChild(new Container()); leftPath.x = -120; leftPath.y = 20; var leftArrow = leftPath.addChild(LK.getAsset('arrow', { anchorX: 0.5, anchorY: 0.5 })); leftArrow.rotation = Math.PI; var leftText = leftPath.addChild(new Text2('Chemin\nde Gauche', { size: 24, fill: 0xFFFFFF })); leftText.anchor.set(0.5, 0.5); leftText.y = 50; leftPath.down = function () { self.chooseLeftPath(); }; // Right path button var rightPath = self.pathContainer.addChild(new Container()); rightPath.x = 120; rightPath.y = 20; var rightArrow = rightPath.addChild(LK.getAsset('arrow', { anchorX: 0.5, anchorY: 0.5 })); var rightText = rightPath.addChild(new Text2('Chemin\nde Droite', { size: 24, fill: 0xFFFFFF })); rightText.anchor.set(0.5, 0.5); rightText.y = 50; rightPath.down = function () { self.chooseRightPath(); }; }; self.chooseLeftPath = function () { self.createMagicBubble(-100); self.closePath(); }; self.chooseRightPath = function () { self.createMagicBubble(100); self.closePath(); }; self.createMagicBubble = function (offsetX) { // Find a suitable tree platform for the magic bubble var suitableTrees = []; for (var i = 0; i < trees.length; i++) { var tree = trees[i]; if (tree.x > self.x && tree.x < self.x + 800) { suitableTrees.push(tree); } } var targetTree = null; if (suitableTrees.length > 0) { // Choose tree based on path direction if (offsetX < 0) { // Left path - choose leftmost suitable tree targetTree = suitableTrees[0]; for (var j = 1; j < suitableTrees.length; j++) { if (suitableTrees[j].x < targetTree.x) { targetTree = suitableTrees[j]; } } } else { // Right path - choose rightmost suitable tree targetTree = suitableTrees[0]; for (var j = 1; j < suitableTrees.length; j++) { if (suitableTrees[j].x > targetTree.x) { targetTree = suitableTrees[j]; } } } } var magicBubble = game.addChild(new Container()); var bubbleGraphics = magicBubble.attachAsset('magicBubble', { anchorX: 0.5, anchorY: 0.5 }); if (targetTree) { magicBubble.x = targetTree.x; magicBubble.y = targetTree.y - targetTree.height / 2 - 40; } else { magicBubble.x = self.x + offsetX; magicBubble.y = self.y - 60; } magicBubble.collected = false; // Sparkle effect tween(bubbleGraphics, { rotation: Math.PI * 2 }, { duration: 2000, easing: tween.linear }); magicBubble.update = function () { this.x -= scrollSpeed; if (!this.collected && this.intersects(lisa)) { this.collected = true; self.giveReward(); this.destroy(); } }; magicBubbles.push(magicBubble); }; self.giveReward = function () { var rewardAmount = 20 + Math.floor(Math.random() * 31); // 20-50 LIPOINTS var randomType = bubbleTypes[Math.floor(Math.random() * bubbleTypes.length)]; lipoints[randomType] += rewardAmount; updateLipointsDisplay(); checkLevelUp(); self.showRewardMessage(rewardAmount, randomType); LK.getSound('success').play(); }; self.showRewardMessage = function (amount, type) { var messageContainer = game.addChild(new Container()); messageContainer.x = lisa.x; messageContainer.y = lisa.y - 100; var messageText = messageContainer.addChild(new Text2('Stella t\'offre ' + amount + ' LIPOINTS de ' + type + ' !', { size: 28, fill: 0xFFD700 })); messageText.anchor.set(0.5, 0.5); LK.setTimeout(function () { messageContainer.destroy(); }, 5000); }; self.closePath = function () { if (self.pathContainer) { self.pathContainer.destroy(); } isPaused = false; self.destroy(); characters.splice(characters.indexOf(self), 1); }; return self; }); var Tree = Container.expand(function () { var self = Container.call(this); var treeGraphics = self.attachAsset('tree', { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { self.x -= scrollSpeed; }; return self; }); var Twins = Container.expand(function () { var self = Container.call(this); var twinsGraphics = self.attachAsset('twins', { anchorX: 0.5, anchorY: 0.5 }); self.encountered = false; self.questions = [{ question: "Quelle est ta couleur prĂ©fĂ©rĂ©e ?", answers: ["Rouge", "Bleu", "Vert", "Jaune"], difficulty: 1 }, { question: "Si tu pouvais avoir un super-pouvoir, lequel choisirais-tu ?", answers: ["Voler", "Lire les pensĂ©es", "Devenir invisible", "ContrĂŽler le temps"], difficulty: 2 }, { question: "Dans un monde parfait, que ferais-tu en premier ?", answers: ["Aider tous les animaux", "DĂ©couvrir de nouveaux mondes", "CrĂ©er de la beautĂ©", "Rassembler tous les peuples"], difficulty: 3 }, { question: "Quel est ton animal prĂ©fĂ©rĂ© ?", answers: ["Chat", "Chien", "Oiseau", "Poisson"], difficulty: 1 }, { question: "Que fais-tu quand tu es triste ?", answers: ["Je pleure", "Je me cache", "Je parle Ă quelqu'un", "Je dessine"], difficulty: 1 }, { question: "Quelle est ta saison favorite ?", answers: ["Printemps", "ĂtĂ©", "Automne", "Hiver"], difficulty: 1 }, { question: "OĂč aimerais-tu voyager ?", answers: ["Ă la plage", "En montagne", "Dans l'espace", "Sous l'ocĂ©an"], difficulty: 2 }, { question: "Quel mĂ©tier te fait rĂȘver ?", answers: ["Docteur", "Astronaute", "Artiste", "Enseignant"], difficulty: 2 }, { question: "Comment prĂ©fĂšres-tu apprendre ?", answers: ["En lisant", "En Ă©coutant", "En pratiquant", "En imaginant"], difficulty: 2 }, { question: "Quelle est ta plus grande peur ?", answers: ["Le noir", "Les monstres", "Ătre seul", "L'Ă©chec"], difficulty: 3 }, { question: "Si tu trouvais un trĂ©sor, que ferais-tu ?", answers: ["Le garder", "Le partager", "Le cacher", "L'Ă©changer"], difficulty: 2 }, { question: "Quel livre aimerais-tu Ă©crire ?", answers: ["Une aventure", "Une histoire d'amour", "Un livre de magie", "Une encyclopĂ©die"], difficulty: 3 }, { question: "Comment rĂ©sous-tu les problĂšmes ?", answers: ["Seul", "Avec de l'aide", "En rĂ©flĂ©chissant longtemps", "Rapidement"], difficulty: 3 }, { question: "Quel est ton rĂȘve le plus fou ?", answers: ["Devenir cĂ©lĂšbre", "Sauver le monde", "DĂ©couvrir un nouveau pays", "Parler aux animaux"], difficulty: 3 }, { question: "Que collectionnes-tu ?", answers: ["Des pierres", "Des autocollants", "Des livres", "Des souvenirs"], difficulty: 1 }, { question: "Comment te vois-tu dans 10 ans ?", answers: ["Heureux", "Riche", "CĂ©lĂšbre", "Sage"], difficulty: 3 }, { question: "Quel est ton jeu prĂ©fĂ©rĂ© ?", answers: ["Cache-cache", "Jeux vidĂ©o", "Sports", "Jeux de sociĂ©tĂ©"], difficulty: 1 }, { question: "Quelle invention aimerais-tu crĂ©er ?", answers: ["Un robot", "Une machine volante", "Un remĂšde magique", "Un tĂ©lĂ©porteur"], difficulty: 3 }, { question: "Comment exprimes-tu tes Ă©motions ?", answers: ["Par des mots", "Par l'art", "Par la musique", "Par le silence"], difficulty: 2 }, { question: "Quel don aimerais-tu avoir ?", answers: ["GuĂ©rir les gens", "PrĂ©dire l'avenir", "Comprendre les animaux", "Voler"], difficulty: 2 }, { question: "Comment organises-tu ta chambre ?", answers: ["TrĂšs rangĂ©e", "Un peu dĂ©sordonnĂ©e", "CrĂ©ative", "Pratique"], difficulty: 1 }, { question: "Quelle langue aimerais-tu parler ?", answers: ["Le langage des dauphins", "Le langage des arbres", "Le langage des Ă©toiles", "Toutes les langues"], difficulty: 2 }, { question: "Si tu Ă©tais invisible pour une journĂ©e ?", answers: ["J'aiderais les gens", "J'explorerais", "Je ferais des blagues", "J'apprendrais des secrets"], difficulty: 2 }, { question: "Quel Ă©lĂ©ment reprĂ©sente ton Ăąme ?", answers: ["Le feu", "L'eau", "La terre", "L'air"], difficulty: 3 }, { question: "Comment voudrais-tu ĂȘtre rappelĂ© ?", answers: ["Comme quelqu'un de gentil", "Comme un hĂ©ros", "Comme un gĂ©nie", "Comme un ami fidĂšle"], difficulty: 3 }, { question: "Quelle serait ta maison idĂ©ale ?", answers: ["Dans les arbres", "Sous l'eau", "Dans les nuages", "Sous terre"], difficulty: 2 }, { question: "Quel message voudrais-tu transmettre au monde ?", answers: ["Soyez gentils", "Suivez vos rĂȘves", "ProtĂ©gez la nature", "Aimez-vous les uns les autres"], difficulty: 3 }, { question: "Comment choisis-tu tes amis ?", answers: ["Par le cĆur", "Par les intĂ©rĂȘts communs", "Par la loyautĂ©", "Par le hasard"], difficulty: 2 }, { question: "Quelle serait ta devise ?", answers: ["Jamais abandonner", "Toujours sourire", "Aider les autres", "Rester curieux"], difficulty: 3 }, { question: "Si tu pouvais changer une chose dans le monde ?", answers: ["ArrĂȘter la pollution", "Ăliminer la tristesse", "Donner de la magie Ă tous", "CrĂ©er la paix"], difficulty: 3 }, { question: "Quel trait de caractĂšre te dĂ©finit le mieux ?", answers: ["La gĂ©nĂ©rositĂ©", "La curiositĂ©", "Le courage", "La crĂ©ativitĂ©"], difficulty: 2 }, { question: "Comment veux-tu passer ton temps libre ?", answers: ["En crĂ©ant", "En explorant", "En aidant", "En rĂȘvant"], difficulty: 2 }, { question: "Quelle serait ta baguette magique idĂ©ale ?", answers: ["En bois d'Ă©toile", "En cristal de lune", "En branche d'arbre ancien", "En rayon de soleil"], difficulty: 2 }, { question: "Quel est ton plus grand talent cachĂ© ?", answers: ["Faire rire", "Ăcouter", "Imaginer", "Comprendre"], difficulty: 2 }, { question: "Comment vois-tu l'avenir de l'humanitĂ© ?", answers: ["Plein d'espoir", "Technologique", "Magique", "Uni"], difficulty: 3 }]; self.currentQuestionIndex = 0; self.wrongAnswers = 0; self.update = function () { self.x -= scrollSpeed; // Check collision with Lisa if (!self.encountered && self.intersects(lisa)) { self.encountered = true; self.startQuiz(); } }; self.startQuiz = function () { isPaused = true; self.currentQuestionIndex = 0; self.wrongAnswers = 0; self.showQuestion(); }; self.showQuestion = function () { // Create quiz UI self.quizContainer = game.addChild(new Container()); self.quizContainer.x = 1024; self.quizContainer.y = 1366; // Background var bg = self.quizContainer.addChild(LK.getAsset('challengeBox', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.2, scaleY: 1.0 })); bg.alpha = 0.9; bg.tint = 0xFF1493; // Title var titleText = self.quizContainer.addChild(new Text2('Lylou et Sandra - Les Jumelles Curieuses', { size: 30, fill: 0xFFFFFF })); titleText.anchor.set(0.5, 0.5); titleText.y = -150; // Question var currentQuestion = self.questions[self.currentQuestionIndex]; var questionText = self.quizContainer.addChild(new Text2(currentQuestion.question, { size: 30, fill: 0xFFFFFF })); questionText.anchor.set(0.5, 0.5); questionText.y = -80; // Answer buttons self.answerButtons = []; for (var i = 0; i < currentQuestion.answers.length; i++) { var buttonContainer = self.quizContainer.addChild(new Container()); buttonContainer.x = 0; buttonContainer.y = -20 + i * 50; buttonContainer.answerIndex = i; var buttonBg = buttonContainer.addChild(LK.getAsset('challengeBox', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.15 })); buttonBg.tint = 0xFFB6C1; buttonBg.alpha = 0.8; var buttonText = buttonContainer.addChild(new Text2(i + 1 + '. ' + currentQuestion.answers[i], { size: 26, fill: 0x000000 })); buttonText.anchor.set(0.5, 0.5); buttonContainer.down = function (x, y, obj) { this.alpha = 0.7; var container = this; LK.setTimeout(function () { container.alpha = 1; }, 100); self.processAnswer(container.answerIndex); }; self.answerButtons.push(buttonContainer); } }; self.processAnswer = function (answerIndex) { // For the twins, any answer can be "wrong" to make it harder var isCorrect = Math.random() < 0.6; // 60% chance of being "correct" if (isCorrect || self.currentQuestionIndex >= self.questions.length - 1) { self.onSuccess(); } else { self.wrongAnswers++; self.onWrongAnswer(); } }; self.onSuccess = function () { lipoints.lollipop += 6; updateLipointsDisplay(); checkLevelUp(); self.showResultMessage('Bravo ! Les jumelles t\'offrent 6 LIPOINTS de sucettes !', 0x00FF00); LK.getSound('success').play(); LK.setTimeout(function () { self.closeQuiz(); }, 5000); }; self.onWrongAnswer = function () { if (self.currentQuestionIndex < self.questions.length - 1) { self.showResultMessage('Les jumelles veulent une question plus difficile !', 0xFFFF00); LK.setTimeout(function () { self.currentQuestionIndex++; self.quizContainer.destroy(); self.showQuestion(); }, 2000); } else { // If we've run out of questions, they have to accept the last answer self.onSuccess(); } }; self.showResultMessage = function (message, color) { var resultText = self.quizContainer.addChild(new Text2(message, { size: 30, fill: color })); resultText.anchor.set(0.5, 0.5); resultText.y = 120; }; self.closeQuiz = function () { if (self.quizContainer) { self.quizContainer.destroy(); } isPaused = false; self.destroy(); characters.splice(characters.indexOf(self), 1); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Game variables var lisa; var trees = []; var bubbles = []; var activeChallenge = null; var isPaused = false; var characters = []; var magicBubbles = []; // Character spawn tracking var stellaSpawnTracker = 0; var stellaSpawned = false; var margotSpawnCounter = 0; var margotSpawned = false; var chafeeCanSpawn = false; var chafeeSpawned = false; var chafeeCurrentCycle = -1; var maliciaSpawnCounter = 0; var maliciaSpawnedThisCycle = 0; var maliciaCurrentCycle = -1; var twinsSpawnCounter = 0; var twinsSpawned = false; // New character spawn tracking var dogieSpawnCounter = 0; var dogieSpawned = false; var estellaSpawnCounter = 0; var estellaSpawned = false; var mazzSpawnCounter = 0; var mazzSpawned = false; // Scrolling var scrollSpeed = 3; var cameraX = 0; // Quiz questions databases in French var destinyQuestions = [{ question: "Quel sera ton plus grand rĂȘve dans la vie ?", answers: ["Devenir cĂ©lĂšbre", "Aider les autres", "DĂ©couvrir le monde", "CrĂ©er quelque chose de beau"], correct: 1 }, { question: "Quelle couleur reprĂ©sente le mieux ton avenir ?", answers: ["Rouge passion", "Bleu sĂ©rĂ©nitĂ©", "Vert nature", "Jaune soleil"], correct: 2 }, { question: "Quel animal te guidera dans ta destinĂ©e ?", answers: ["Un chat mystĂ©rieux", "Un chien fidĂšle", "Un oiseau libre", "Un dauphin sage"], correct: 3 }, { question: "Dans quel endroit trouveras-tu ton bonheur ?", answers: ["En montagne", "Au bord de la mer", "Dans une forĂȘt", "Dans une grande ville"], correct: 1 }, { question: "Quel pouvoir magique aimerais-tu avoir ?", answers: ["Lire dans les pensĂ©es", "Voler dans le ciel", "Parler aux animaux", "ContrĂŽler le temps"], correct: 2 }, { question: "Quelle est ta plus grande peur Ă surmonter ?", answers: ["Le noir", "Les araignĂ©es", "Ătre seul(e)", "L'Ă©chec"], correct: 3 }, { question: "Quel mĂ©tier feras-tu plus tard ?", answers: ["MĂ©decin", "Artiste", "Enseignant", "Aventurier"], correct: 0 }, { question: "Combien d'enfants auras-tu ?", answers: ["Aucun", "Un ou deux", "Trois ou quatre", "Beaucoup"], correct: 1 }, { question: "Dans combien de pays voyageras-tu ?", answers: ["Moins de 5", "Entre 5 et 10", "Entre 10 et 20", "Plus de 20"], correct: 2 }, { question: "Ă quel Ăąge trouveras-tu l'amour ?", answers: ["Avant 20 ans", "Entre 20 et 30 ans", "Entre 30 et 40 ans", "AprĂšs 40 ans"], correct: 1 }, { question: "Quelle sera ta plus grande rĂ©ussite ?", answers: ["Professionnelle", "Familiale", "Artistique", "Sportive"], correct: 1 }, { question: "Quel trĂ©sor dĂ©couvriras-tu ?", answers: ["De l'or", "Des diamants", "Un livre magique", "Une carte secrĂšte"], correct: 2 }, { question: "Quelle planĂšte visiteras-tu en premier ?", answers: ["Mars", "Venus", "Jupiter", "Saturne"], correct: 0 }, { question: "Quel super-hĂ©ros deviendras-tu ?", answers: ["Captain Courage", "Wonder Wisdom", "Magic Master", "Super Smile"], correct: 1 }, { question: "Quelle invention crĂ©eras-tu ?", answers: ["Une machine Ă bonheur", "Un tĂ©lĂ©porteur", "Une potion magique", "Un robot ami"], correct: 0 }, { question: "Quel monstre amical rencontreras-tu ?", answers: ["Un dragon gentil", "Une licorne dorĂ©e", "Un gĂ©ant souriant", "Une fĂ©e malicieuse"], correct: 1 }, { question: "Quelle Ă©toile Ă©clairera ton chemin ?", answers: ["L'Ă©toile polaire", "Une Ă©toile filante", "L'Ă©toile du berger", "Une constellation magique"], correct: 3 }, { question: "Quel don dĂ©velopperas-tu ?", answers: ["Le chant", "La danse", "La peinture", "La cuisine"], correct: 2 }, { question: "Quelle surprise t'attend demain ?", answers: ["Un cadeau", "Une nouvelle amitiĂ©", "Une dĂ©couverte", "Une aventure"], correct: 1 }, { question: "Quel sera ton animal de compagnie ?", answers: ["Un chat magique", "Un chien volant", "Un lapin parlant", "Un oiseau chanteur"], correct: 0 }, { question: "Dans quel chĂąteau vivras-tu ?", answers: ["Un chĂąteau de glace", "Un chĂąteau de nuages", "Un chĂąteau sous-marin", "Un chĂąteau dans les arbres"], correct: 3 }, { question: "Quel fruit magique goĂ»teras-tu ?", answers: ["Une pomme dorĂ©e", "Une poire argentĂ©e", "Une fraise gĂ©ante", "Un raisin arc-en-ciel"], correct: 0 }, { question: "Quelle danse apprendras-tu ?", answers: ["La danse des Ă©toiles", "La danse des fleurs", "La danse des vagues", "La danse du vent"], correct: 1 }, { question: "Quel livre magique liras-tu ?", answers: ["Le livre des secrets", "Le livre des rĂȘves", "Le livre du temps", "Le livre des souhaits"], correct: 3 }, { question: "Quelle potion prĂ©pareras-tu ?", answers: ["Potion de courage", "Potion de sagesse", "Potion de joie", "Potion d'amitiĂ©"], correct: 2 }, { question: "Quel vĂ©hicule magique conduiras-tu ?", answers: ["Un tapis volant", "Une voiture nuage", "Un bateau-Ă©toile", "Un train-arc-en-ciel"], correct: 0 }, { question: "Quelle couronne porteras-tu ?", answers: ["Couronne de fleurs", "Couronne d'Ă©toiles", "Couronne de cristal", "Couronne de lumiĂšre"], correct: 1 }, { question: "Quel jardin secret dĂ©couvriras-tu ?", answers: ["Jardin de roses", "Jardin de papillons", "Jardin de cristaux", "Jardin de musique"], correct: 2 }, { question: "Quelle magie maĂźtriseras-tu ?", answers: ["Magie des Ă©lĂ©ments", "Magie des Ă©motions", "Magie des saisons", "Magie des rĂȘves"], correct: 3 }, { question: "Quel cadeau recevras-tu ?", answers: ["Une baguette magique", "Un collier enchantĂ©", "Des bottes de sept lieues", "Un miroir parlant"], correct: 0 }, { question: "Quelle pierre prĂ©cieuse guidera ta destinĂ©e ?", answers: ["Diamant de vĂ©ritĂ©", "Rubis d'amour", "Ămeraude d'espoir", "Saphir de sagesse"], correct: 2 }, { question: "Quel Ă©lĂ©ment naturel rĂ©sonne avec ton Ăąme ?", answers: ["Le feu passionnĂ©", "L'eau fluide", "La terre stable", "L'air libre"], correct: 1 }, { question: "Dans quelle Ă©poque aurais-tu vĂ©cu ?", answers: ["L'Ăgypte antique", "Le Moyen Ăge", "La Renaissance", "L'Ă©poque moderne"], correct: 2 }, { question: "Quel mystĂšre rĂ©soudras-tu ?", answers: ["L'Atlantide perdue", "Les pyramides", "Les crop circles", "Le triangle des Bermudes"], correct: 0 }, { question: "Quelle est ta mission secrĂšte ?", answers: ["ProtĂ©ger la nature", "Sauver les animaux", "DĂ©couvrir des trĂ©sors", "Unir les peuples"], correct: 3 }, { question: "Quel talent cachĂ© possĂšdes-tu ?", answers: ["TĂ©lĂ©pathie", "Clairvoyance", "GuĂ©rison", "PrĂ©monition"], correct: 1 }, { question: "Dans quel royaume magique appartiens-tu ?", answers: ["Royaume des nuages", "Royaume des ocĂ©ans", "Royaume des forĂȘts", "Royaume des Ă©toiles"], correct: 3 }, { question: "Quel sera ton compagnon de route ?", answers: ["Un phoenix", "Un dragon blanc", "Une licorne", "Un loup argentĂ©"], correct: 2 }, { question: "Quelle lĂ©gende incarneras-tu ?", answers: ["Le hĂ©ros courageux", "La sage protectrice", "L'explorateur intrĂ©pide", "Le guĂ©risseur bienveillant"], correct: 1 }, { question: "Quel secret de l'univers dĂ©couvriras-tu ?", answers: ["L'origine des Ă©toiles", "Le langage des planĂštes", "La musique des sphĂšres", "La danse du cosmos"], correct: 2 }, { question: "Quelle transformation t'attend ?", answers: ["Devenir immortel", "AcquĂ©rir la sagesse absolue", "MaĂźtriser tous les Ă©lĂ©ments", "Comprendre tous les langages"], correct: 1 }, { question: "Quel cadeau apporteras-tu au monde ?", answers: ["La paix Ă©ternelle", "La joie infinie", "L'amour universel", "La sagesse divine"], correct: 2 }, { question: "Dans quel temple trouveras-tu la vĂ©ritĂ© ?", answers: ["Temple du soleil", "Temple de la lune", "Temple des Ă©toiles", "Temple du cĆur"], correct: 3 }, { question: "Quelle prophĂ©tie se rĂ©alisera grĂące Ă toi ?", answers: ["Le retour de la lumiĂšre", "L'harmonie des Ă©lĂ©ments", "La rĂ©conciliation des mondes", "L'Ă©veil de la conscience"], correct: 3 }, { question: "Quel hĂ©ritage laisseras-tu ?", answers: ["Un royaume prospĂšre", "Une Ćuvre d'art Ă©ternelle", "Une dĂ©couverte rĂ©volutionnaire", "Un exemple d'amour"], correct: 3 }]; var lollipopQuestions = [{ question: "Quelle est la saveur de sucette la plus populaire ?", answers: ["Fraise", "Pomme", "Cerise", "Orange"], correct: 0 }, { question: "De quelle couleur est une sucette Ă la menthe ?", answers: ["Rouge", "Jaune", "Verte", "Bleue"], correct: 2 }, { question: "Combien de calories contient une petite sucette ?", answers: ["20-30", "50-60", "80-90", "100-110"], correct: 0 }, { question: "Dans quel pays a Ă©tĂ© inventĂ©e la sucette ?", answers: ["France", "Ătats-Unis", "Angleterre", "Allemagne"], correct: 1 }, { question: "Quel est l'ingrĂ©dient principal d'une sucette ?", answers: ["Chocolat", "Sucre", "Miel", "Sirop"], correct: 1 }, { question: "Comment appelle-t-on une sucette gĂ©ante ?", answers: ["Mega-pop", "Super-sucette", "Lolly gĂ©ante", "Maxi-pop"], correct: 0 }, { question: "Quelle forme ont la plupart des sucettes ?", answers: ["CarrĂ©e", "Triangulaire", "Ronde", "Ovale"], correct: 2 }, { question: "Combien de temps faut-il pour finir une sucette moyenne ?", answers: ["5 minutes", "15 minutes", "30 minutes", "1 heure"], correct: 1 }, { question: "Quelle sucette change de couleur en la lĂ©chant ?", answers: ["Rainbow pop", "Color-pop", "Magic pop", "Change-pop"], correct: 2 }, { question: "Quel animal trouve-t-on sur certaines sucettes ?", answers: ["Chat", "Chien", "Coq", "Tous"], correct: 3 }, { question: "Quelle sucette fait du bruit ?", answers: ["Whistle pop", "Sound pop", "Music pop", "Noise pop"], correct: 0 }, { question: "Dans quel film voit-on des sucettes magiques ?", answers: ["Charlie et la chocolaterie", "Harry Potter", "Shrek", "Frozen"], correct: 0 }, { question: "Quelle est la plus grosse sucette du monde ?", answers: ["1 kg", "5 kg", "10 kg", "37 kg"], correct: 3 }, { question: "Combien de saveurs peut avoir une sucette arc-en-ciel ?", answers: ["3", "5", "7", "10"], correct: 2 }, { question: "Quel goĂ»t bizarre peut avoir une sucette ?", answers: ["Pizza", "Fromage", "Poisson", "Tous"], correct: 3 }, { question: "Quelle sucette est bonne pour la gorge ?", answers: ["Au miel", "Au citron", "Ă l'eucalyptus", "Toutes"], correct: 3 }, { question: "Comment s'appelle le bĂąton de la sucette ?", answers: ["Stick", "Tige", "BĂątonnet", "Tous"], correct: 3 }, { question: "Quelle sucette peut exploser en bouche ?", answers: ["Pop rocks", "Bubble pop", "Crack pop", "Bang pop"], correct: 0 }, { question: "Dans quelle dĂ©cennie les sucettes sont devenues populaires ?", answers: ["1920", "1940", "1960", "1980"], correct: 1 }, { question: "Quelle forme de sucette est la plus rigolote ?", answers: ["Dinosaure", "Voiture", "Fleur", "Toutes"], correct: 3 }, { question: "Combien coĂ»te une sucette classique ?", answers: ["0,50âŹ", "1âŹ", "2âŹ", "5âŹ"], correct: 0 }, { question: "Quelle sucette a un goĂ»t piquant ?", answers: ["Piment", "Poivre", "Gingembre", "Toutes"], correct: 3 }, { question: "Dans quel magasin trouve-t-on le plus de sucettes ?", answers: ["Boulangerie", "Confiserie", "SupermarchĂ©", "Pharmacie"], correct: 1 }, { question: "Quelle sucette brille dans le noir ?", answers: ["Glow pop", "Fluo pop", "Light pop", "Bright pop"], correct: 0 }, { question: "Combien de sucettes mange un enfant par mois ?", answers: ["2-3", "5-6", "10-12", "15-20"], correct: 1 }, { question: "Quelle sucette a plusieurs couches ?", answers: ["Layer pop", "Multi pop", "Gobstopper", "Stack pop"], correct: 2 }, { question: "Quel est le problĂšme avec les sucettes ?", answers: ["Caries", "Mal au ventre", "Taches", "Tous"], correct: 3 }, { question: "Quelle sucette fond le plus vite ?", answers: ["Au chocolat", "Au caramel", "Aux fruits", "Ă la glace"], correct: 3 }, { question: "Combien de sucettes sont vendues par jour dans le monde ?", answers: ["1 million", "10 millions", "100 millions", "1 milliard"], correct: 2 }, { question: "Quelle sucette a Ă©tĂ© inventĂ©e par accident ?", answers: ["Sucette classique", "Chupa Chups", "Dum Dum", "Blow Pop"], correct: 0 }, { question: "Dans quelle saison mange-t-on le plus de sucettes ?", answers: ["Printemps", "ĂtĂ©", "Automne", "Hiver"], correct: 1 }, { question: "Quelle sucette peut servir de sifflet ?", answers: ["Whistle pop", "Sound stick", "Music lolly", "Sing pop"], correct: 0 }, { question: "Combien de temps peut se conserver une sucette ?", answers: ["1 semaine", "1 mois", "6 mois", "2 ans"], correct: 3 }, { question: "Quelle est la sucette la plus cĂ©lĂšbre ?", answers: ["Chupa Chups", "Lollipop", "Dum Dum", "Blow Pop"], correct: 0 }, { question: "Quel Ăąge a la plus vieille sucette retrouvĂ©e ?", answers: ["50 ans", "100 ans", "500 ans", "4000 ans"], correct: 3 }, { question: "Quelle sucette a une surprise Ă l'intĂ©rieur ?", answers: ["Surprise pop", "Chupa Chups Melody", "Wonder Ball", "Kinder pop"], correct: 2 }, { question: "Combien de lĂ©chouilles faut-il pour finir un Chupa Chups ?", answers: ["144", "252", "364", "500"], correct: 2 }, { question: "Quelle sucette contient de la vitamine C ?", answers: ["Citron", "Orange", "Tous les agrumes", "Toutes"], correct: 2 }, { question: "Quel est le record du monde de la plus petite sucette ?", answers: ["1mm", "3mm", "5mm", "1cm"], correct: 0 }, { question: "Quelle sucette peut changer de tempĂ©rature ?", answers: ["Ice pop", "Fire pop", "Thermo pop", "Magic temp"], correct: 2 }, { question: "Dans quel pays mange-t-on le plus de sucettes ?", answers: ["USA", "Japon", "BrĂ©sil", "Mexique"], correct: 3 }, { question: "Quelle sucette a Ă©tĂ© créée pour les astronautes ?", answers: ["Space pop", "Galaxy lolly", "Astro candy", "Zero-G pop"], correct: 0 }, { question: "Combien de sucettes peut-on faire avec 1kg de sucre ?", answers: ["50", "100", "200", "300"], correct: 1 }, { question: "Quelle sucette contient des insectes comestibles ?", answers: ["Cricket pop", "Ant lolly", "Scorpion candy", "Toutes"], correct: 3 }, { question: "Quel goĂ»t de sucette est le plus rare ?", answers: ["Bacon", "Ail", "Wasabi", "Durian"], correct: 3 }, { question: "Combien de temps faut-il pour fabriquer une sucette ?", answers: ["30 secondes", "2 minutes", "5 minutes", "10 minutes"], correct: 1 }, { question: "Quelle sucette peut servir de thermomĂštre ?", answers: ["Thermo pop", "Temp lolly", "Heat candy", "Fever pop"], correct: 0 }, { question: "Dans quelle usine produit-on le plus de sucettes ?", answers: ["Chupa Chups Espagne", "Perfetti Van Melle", "Tootsie Pop USA", "Haribo Allemagne"], correct: 0 }, { question: "Quelle sucette coĂ»te le plus cher au monde ?", answers: ["Or 24 carats", "Diamant lolly", "Truffe pop", "Caviar candy"], correct: 0 }, { question: "Combien de sucettes sont jetĂ©es chaque jour ?", answers: ["1 million", "5 millions", "10 millions", "50 millions"], correct: 2 }, { question: "Quelle sucette aide Ă arrĂȘter de fumer ?", answers: ["Nicotine pop", "Fresh lolly", "Stop candy", "Quit pop"], correct: 0 }, { question: "Quel animal ne peut pas manger de sucettes ?", answers: ["Chien", "Chat", "Oiseau", "Tous"], correct: 3 }, { question: "Combien de bactĂ©ries y a-t-il sur une sucette lĂ©chĂ©e ?", answers: ["1000", "10000", "100000", "1 million"], correct: 3 }, { question: "Quelle sucette contient de l'alcool ?", answers: ["Champagne pop", "Vodka lolly", "Whisky candy", "Toutes"], correct: 3 }, { question: "Dans quel musĂ©e peut-on voir des sucettes gĂ©antes ?", answers: ["MusĂ©e des bonbons", "Smithsonian", "Louvre", "British Museum"], correct: 0 }]; var oceanQuestions = [{ question: "Quel est le plus grand ocĂ©an du monde ?", answers: ["Atlantique", "Indien", "Pacifique", "Arctique"], correct: 2 }, { question: "Combien d'ocĂ©ans y a-t-il sur Terre ?", answers: ["3", "4", "5", "6"], correct: 2 }, { question: "Quel animal est le plus gros de l'ocĂ©an ?", answers: ["Requin", "Baleine bleue", "Pieuvre gĂ©ante", "Raie manta"], correct: 1 }, { question: "Ă quelle profondeur peut-on trouver la fosse des Mariannes ?", answers: ["5000m", "8000m", "11000m", "15000m"], correct: 2 }, { question: "Quel pourcentage de la Terre est couvert par les ocĂ©ans ?", answers: ["50%", "60%", "70%", "80%"], correct: 2 }, { question: "Comment s'appelle le mouvement de l'eau dans l'ocĂ©an ?", answers: ["Vague", "Courant", "MarĂ©e", "Tous"], correct: 3 }, { question: "Quel poisson peut voler au-dessus de l'eau ?", answers: ["Poisson-volant", "Thon", "Sardine", "Maquereau"], correct: 0 }, { question: "Quelle est la tempĂ©rature de l'eau au fond de l'ocĂ©an ?", answers: ["0°C", "4°C", "10°C", "20°C"], correct: 1 }, { question: "Combien de sel contient l'eau de mer ?", answers: ["1%", "3.5%", "7%", "10%"], correct: 1 }, { question: "Quel animal peut changer de couleur sous l'eau ?", answers: ["Poisson-clown", "Pieuvre", "Ătoile de mer", "Crabe"], correct: 1 }, { question: "Comment respire un dauphin ?", answers: ["Avec des branchies", "Par la peau", "Avec des poumons", "Par la bouche"], correct: 2 }, { question: "Quelle est la vitesse d'un tsunami ?", answers: ["50 km/h", "200 km/h", "500 km/h", "800 km/h"], correct: 3 }, { question: "Combien d'espĂšces marines sont encore inconnues ?", answers: ["50%", "70%", "80%", "95%"], correct: 2 }, { question: "Quel requin est le plus dangereux ?", answers: ["Requin blanc", "Requin tigre", "Requin marteau", "Tous Ă©gaux"], correct: 0 }, { question: "Ă quelle profondeur la lumiĂšre disparaĂźt-elle ?", answers: ["100m", "200m", "500m", "1000m"], correct: 3 }, { question: "Combien pĂšse une baleine bleue ?", answers: ["50 tonnes", "100 tonnes", "150 tonnes", "200 tonnes"], correct: 2 }, { question: "Quel est l'animal le plus intelligent de l'ocĂ©an ?", answers: ["Dauphin", "Pieuvre", "Baleine", "Tous"], correct: 3 }, { question: "Comment les poissons voient-ils sous l'eau ?", answers: ["En noir et blanc", "En couleurs", "Flou", "TrĂšs net"], correct: 1 }, { question: "Quelle tortue vit le plus longtemps ?", answers: ["Tortue verte", "Tortue imbriquĂ©e", "Tortue luth", "Tortue caouanne"], correct: 0 }, { question: "Combien de temps peut retenir sa respiration une baleine ?", answers: ["10 minutes", "30 minutes", "1 heure", "2 heures"], correct: 3 }, { question: "Quel corail construit des rĂ©cifs ?", answers: ["Corail dur", "Corail mou", "Corail noir", "Tous"], correct: 0 }, { question: "Ă quelle vitesse nage un thon ?", answers: ["20 km/h", "40 km/h", "70 km/h", "100 km/h"], correct: 2 }, { question: "Combien d'eau les ocĂ©ans contiennent-ils ?", answers: ["1 milliard de litres", "1 trillion de litres", "1 quintillion de litres", "Impossible Ă mesurer"], correct: 2 }, { question: "Quel animal produit des perles ?", answers: ["HuĂźtre", "Moule", "Coquille Saint-Jacques", "Toutes"], correct: 3 }, { question: "Comment les baleines communiquent-elles ?", answers: ["Par des cris", "Par des chants", "Par des gestes", "Toutes"], correct: 3 }, { question: "Quel poisson a des dents trĂšs pointues ?", answers: ["Piranha", "Barracuda", "Requin", "Tous"], correct: 3 }, { question: "Ă quelle profondeur vivent les poissons des abysses ?", answers: ["1000m", "2000m", "4000m", "6000m+"], correct: 3 }, { question: "Combien d'Ćufs pond une tortue de mer ?", answers: ["10-20", "50-100", "100-200", "200-300"], correct: 2 }, { question: "Quel mammifĂšre marin a une dĂ©fense ?", answers: ["Morse", "Narval", "Phoque", "Tous"], correct: 1 }, { question: "Comment s'appelle le bĂ©bĂ© de la baleine ?", answers: ["Baleineau", "Petit", "Veau", "Tous"], correct: 0 }, { question: "Quelle algue peut devenir trĂšs grande ?", answers: ["Kelp", "Varech", "Fucus", "Toutes"], correct: 0 }, { question: "Combien de cĆurs a une pieuvre ?", answers: ["1", "2", "3", "4"], correct: 2 }, { question: "Quel poisson peut survivre hors de l'eau ?", answers: ["Poisson-chat", "Anguille", "Mudskipper", "Tous"], correct: 3 }, { question: "Ă quelle tempĂ©rature gĂšle l'eau de mer ?", answers: ["-2°C", "0°C", "2°C", "4°C"], correct: 0 }, { question: "Combien de plastique y a-t-il dans les ocĂ©ans ?", answers: ["1 million de tonnes", "8 millions de tonnes", "50 millions de tonnes", "150 millions de tonnes"], correct: 3 }, { question: "Quel est l'animal marin le plus rapide ?", answers: ["Dauphin", "Espadon", "Requin mako", "Marlins"], correct: 1 }, { question: "Combien de tentacules a une mĂ©duse ?", answers: ["4", "8", "Variable", "Infini"], correct: 2 }, { question: "Quel poisson produit de l'Ă©lectricitĂ© ?", answers: ["Anguille Ă©lectrique", "Raie torpille", "Poisson-chat Ă©lectrique", "Tous"], correct: 3 }, { question: "Ă quelle profondeur vit le poisson le plus profond ?", answers: ["5000m", "7000m", "8000m", "11000m"], correct: 3 }, { question: "Combien de dents peut avoir un requin dans sa vie ?", answers: ["1000", "10000", "25000", "50000"], correct: 2 }, { question: "Quel est le plus petit poisson de l'ocĂ©an ?", answers: ["Gobie nain", "Poisson-lanterne", "Anchois", "Sardine"], correct: 0 }, { question: "Combien de kilomĂštres parcourt une baleine par an ?", answers: ["5000 km", "15000 km", "25000 km", "50000 km"], correct: 2 }, { question: "Quel pourcentage de l'ocĂ©an a Ă©tĂ© explorĂ© ?", answers: ["5%", "20%", "50%", "80%"], correct: 0 }, { question: "Combien d'annĂ©es peut vivre une tortue marine ?", answers: ["50 ans", "100 ans", "150 ans", "200 ans"], correct: 2 }, { question: "Quel animal marin a le cerveau le plus dĂ©veloppĂ© ?", answers: ["Dauphin", "Cachalot", "Pieuvre", "Orque"], correct: 1 }, { question: "Ă quelle vitesse remonte une bulle d'air dans l'ocĂ©an ?", answers: ["1 m/s", "5 m/s", "10 m/s", "Variable"], correct: 3 }, { question: "Combien de litres d'eau filtre une baleine bleue par jour ?", answers: ["1000 L", "10000 L", "100000 L", "1 million L"], correct: 3 }, { question: "Quel est le prĂ©dateur du grand requin blanc ?", answers: ["Orque", "Cachalot", "Aucun", "L'homme"], correct: 0 }, { question: "Combien de plancton une baleine mange-t-elle par jour ?", answers: ["100 kg", "1 tonne", "4 tonnes", "10 tonnes"], correct: 2 }, { question: "Quel poisson peut changer de sexe ?", answers: ["Poisson-clown", "MĂ©rou", "Labre", "Tous"], correct: 3 }, { question: "Ă quelle distance peut-on entendre le chant des baleines ?", answers: ["10 km", "100 km", "1000 km", "10000 km"], correct: 2 }, { question: "Combien de fois son poids une Ă©toile de mer peut-elle rĂ©gĂ©nĂ©rer ?", answers: ["1 fois", "2 fois", "5 fois", "EntiĂšrement"], correct: 3 }, { question: "Quel est l'Ăąge de la plus vieille crĂ©ature marine ?", answers: ["200 ans", "500 ans", "1000 ans", "4000 ans"], correct: 3 }, { question: "Combien de pression subit un poisson Ă 10000m ?", answers: ["100 fois", "500 fois", "1000 fois", "1100 fois"], correct: 3 }, { question: "Quel pourcentage d'oxygĂšne produit l'ocĂ©an ?", answers: ["30%", "50%", "70%", "90%"], correct: 2 }]; // LIPOINTS system var lipoints = storage.lipoints || { light: 0, destiny: 0, shadow: 0, lollipop: 0, ocean: 0 }; var currentLevel = storage.currentLevel || 1; var totalLipoints = storage.totalLipoints || 0; // UI elements var levelText = new Text2('Niveau: 1', { size: 36, fill: 0xFFFFFF }); levelText.anchor.set(1, 0); levelText.x = -20; levelText.y = 20; LK.gui.topRight.addChild(levelText); var lipointsText = new Text2('', { size: 24, fill: 0xFFFFFF }); lipointsText.anchor.set(1, 0); lipointsText.y = 50; LK.gui.topRight.addChild(lipointsText); // Add custom background var backgroundImage = game.addChild(LK.getAsset('customBackground', { anchorX: 0, anchorY: 0, scaleX: 1, scaleY: 1 })); backgroundImage.x = 0; backgroundImage.y = 0; // Make sure background is behind all other elements game.setChildIndex(backgroundImage, 0); // Initialize Lisa lisa = game.addChild(new Lisa()); lisa.x = 300; lisa.y = 2000; // Create initial trees function createTree(x, y) { var tree = game.addChild(new Tree()); tree.x = x; tree.y = y; trees.push(tree); return tree; } // Create starting platform createTree(300, 2200); createTree(600, 2100); createTree(900, 2000); createTree(1200, 2150); // Bubble types var bubbleTypes = ['light', 'destiny', 'shadow', 'lollipop', 'ocean']; function createBubble() { if (bubbles.length < 3) { var randomType = bubbleTypes[Math.floor(Math.random() * bubbleTypes.length)]; var bubble = game.addChild(new PowerBubble(randomType)); bubble.x = 2200 + Math.random() * 400; bubble.y = 1800 + Math.random() * 400; bubbles.push(bubble); } } function resetLisaPosition() { lisa.x = 300; lisa.y = 2000; lisa.velocityY = 0; lisa.onGround = false; } function startChallenge(type) { if (activeChallenge) return; isPaused = true; activeChallenge = game.addChild(new Challenge(type)); activeChallenge.x = 1024; activeChallenge.y = 1366; activeChallenge.setupChallenge(); } function updateLipointsDisplay() { var displayText = 'LIPOINTS:\n'; displayText += 'LumiĂšre: ' + lipoints.light + '\n'; displayText += 'Destin: ' + lipoints.destiny + '\n'; displayText += 'Ombre: ' + lipoints.shadow + '\n'; displayText += 'Sucettes: ' + lipoints.lollipop + '\n'; displayText += 'OcĂ©ans: ' + lipoints.ocean; lipointsText.setText(displayText); // Save to storage storage.lipoints = lipoints; } function checkLevelUp() { totalLipoints = lipoints.light + lipoints.destiny + lipoints.shadow + lipoints.lollipop + lipoints.ocean; var requiredPoints = 10 * Math.pow(2, currentLevel - 1); if (totalLipoints >= requiredPoints && currentLevel < 50) { currentLevel++; levelText.setText('Niveau: ' + currentLevel); storage.currentLevel = currentLevel; storage.totalLipoints = totalLipoints; // Check for game completion if (currentLevel >= 50) { var highestType = getHighestLipointType(); LK.setTimeout(function () { LK.showYouWin(); }, 1000); } } } function getHighestLipointType() { var highest = 0; var highestType = 'light'; for (var type in lipoints) { if (lipoints[type] > highest) { highest = lipoints[type]; highestType = type; } } return highestType; } function findSuitablePlatform() { // Find a tree platform ahead of Lisa that's suitable for character placement var minX = cameraX + 1000; // Spawn ahead of current view var maxX = cameraX + 2500; // But not too far ahead var suitableTrees = []; for (var i = 0; i < trees.length; i++) { var tree = trees[i]; if (tree.x >= minX && tree.x <= maxX) { suitableTrees.push(tree); } } if (suitableTrees.length > 0) { var chosenTree = suitableTrees[Math.floor(Math.random() * suitableTrees.length)]; return { x: chosenTree.x, y: chosenTree.y - chosenTree.height / 2 - 40 // Position on top of tree }; } // Fallback to random position if no suitable trees found return { x: cameraX + 2048 + Math.random() * 200, y: 1900 + Math.random() * 300 }; } // Game controls game.down = function (x, y, obj) { if (activeChallenge) return; lisa.jump(); }; // Game update loop var treeSpawnTimer = 0; var bubbleSpawnTimer = 0; game.update = function () { if (isPaused) return; // Update camera following Lisa cameraX = lisa.x - 400; // Update background position for parallax scrolling effect if (backgroundImage) { backgroundImage.x = cameraX * 0.3; // Slower parallax movement } // Spawn trees treeSpawnTimer++; if (treeSpawnTimer > 60) { // Spawn more frequently var lastTree = trees[trees.length - 1]; var rightmostX = cameraX + 2048; // Right edge of screen // Always ensure there are trees ahead of Lisa while (!lastTree || lastTree.x < rightmostX + 800) { var newX = lastTree ? lastTree.x + 250 + Math.random() * 150 : rightmostX + 300; var newY = 1900 + Math.random() * 400; var newTree = createTree(newX, newY); lastTree = newTree; // Prevent infinite loop - maximum 3 trees per update if (trees.length > 0 && trees[trees.length - 1].x > rightmostX + 1200) break; } treeSpawnTimer = 0; } // Spawn bubbles bubbleSpawnTimer++; if (bubbleSpawnTimer > 180) { createBubble(); bubbleSpawnTimer = 0; } // Clean up off-screen trees for (var i = trees.length - 1; i >= 0; i--) { if (trees[i].x < cameraX - 300) { trees[i].destroy(); trees.splice(i, 1); } } // Clean up off-screen bubbles for (var i = bubbles.length - 1; i >= 0; i--) { if (bubbles[i].x < cameraX - 300) { bubbles[i].destroy(); bubbles.splice(i, 1); } } // Clean up off-screen characters for (var i = characters.length - 1; i >= 0; i--) { if (characters[i].x < cameraX - 300) { characters[i].destroy(); characters.splice(i, 1); } } // Clean up off-screen magic bubbles for (var i = magicBubbles.length - 1; i >= 0; i--) { if (magicBubbles[i].x < cameraX - 300) { magicBubbles[i].destroy(); magicBubbles.splice(i, 1); } } // Character spawning logic game.spawnCharacters(); }; // Initialize display updateLipointsDisplay(); levelText.setText('Niveau: ' + currentLevel); // Character spawning function game.spawnCharacters = function () { // 1. Stella - every 1000 lipoints after level 10 if (currentLevel >= 10) { var currentTotalLipoints = lipoints.light + lipoints.destiny + lipoints.shadow + lipoints.lollipop + lipoints.ocean; var stellaThreshold = Math.floor(currentTotalLipoints / 1000); if (stellaThreshold > stellaSpawnTracker && !stellaSpawned) { stellaSpawnTracker = stellaThreshold; stellaSpawned = true; game.createStella(); // Reset spawn flag when reaching next threshold LK.setTimeout(function () { stellaSpawned = false; }, 10000); // Reset after 10 seconds to ensure one spawn per threshold } } // 2. Margot - every 2 levels if (currentLevel >= 2) { var margotLevelThreshold = Math.floor(currentLevel / 2); if (margotLevelThreshold > margotSpawnCounter && !margotSpawned) { margotSpawnCounter = margotLevelThreshold; margotSpawned = true; game.createMargot(); // Reset spawn flag when level increases LK.setTimeout(function () { if (Math.floor(currentLevel / 2) > margotLevelThreshold) { margotSpawned = false; } }, 3000); } } // 3. ChafĂ©e - randomly once every 4 levels starting from level 12 if (currentLevel >= 12) { var chafeeCycle = Math.floor((currentLevel - 12) / 4); if (chafeeCycle > chafeeCurrentCycle) { chafeeCurrentCycle = chafeeCycle; chafeeSpawned = false; // Reset for new cycle } if (!chafeeSpawned && Math.random() < 0.02) { // 2% chance per update, only once per cycle chafeeSpawned = true; game.createChafee(); } } // 4. Malicia - twice every 4 levels starting from level 19 if (currentLevel >= 19) { var maliciaCycle = Math.floor((currentLevel - 19) / 4); if (maliciaCycle > maliciaCurrentCycle) { maliciaCurrentCycle = maliciaCycle; maliciaSpawnedThisCycle = 0; // Reset for new cycle } if (maliciaSpawnedThisCycle < 2 && Math.random() < 0.01) { // 1% chance per update, maximum twice per cycle maliciaSpawnedThisCycle++; game.createMalicia(); } } // 5. Twins - once every 3 levels starting from level 8 if (currentLevel >= 8) { var twinsLevelThreshold = Math.floor((currentLevel - 8) / 3); if (twinsLevelThreshold > twinsSpawnCounter && !twinsSpawned) { twinsSpawnCounter = twinsLevelThreshold; twinsSpawned = true; game.createTwins(); // Reset spawn flag when level threshold increases LK.setTimeout(function () { if (Math.floor((currentLevel - 8) / 3) > twinsLevelThreshold) { twinsSpawned = false; } }, 3000); } } // 6. Dogie - once every level if (currentLevel >= 1) { if (currentLevel > dogieSpawnCounter && !dogieSpawned) { dogieSpawnCounter = currentLevel; dogieSpawned = true; game.createDogie(); // Reset spawn flag when level increases LK.setTimeout(function () { if (currentLevel > dogieSpawnCounter) { dogieSpawned = false; } }, 3000); } } // 7. Estella - once every 3 levels starting from level 21 if (currentLevel >= 21) { var estellaLevelThreshold = Math.floor((currentLevel - 21) / 3); if (estellaLevelThreshold > estellaSpawnCounter && !estellaSpawned) { estellaSpawnCounter = estellaLevelThreshold; estellaSpawned = true; game.createEstella(); // Reset spawn flag when level threshold increases LK.setTimeout(function () { if (Math.floor((currentLevel - 21) / 3) > estellaLevelThreshold) { estellaSpawned = false; } }, 3000); } } // 8. Mazz - once every 2 levels starting from level 24 if (currentLevel >= 24) { var mazzLevelThreshold = Math.floor((currentLevel - 24) / 2); if (mazzLevelThreshold > mazzSpawnCounter && !mazzSpawned) { mazzSpawnCounter = mazzLevelThreshold; mazzSpawned = true; game.createMazz(); // Reset spawn flag when level threshold increases LK.setTimeout(function () { if (Math.floor((currentLevel - 24) / 2) > mazzLevelThreshold) { mazzSpawned = false; } }, 3000); } } }; game.createStella = function () { var stella = game.addChild(new Stella()); var position = findSuitablePlatform(); stella.x = position.x; stella.y = position.y; characters.push(stella); }; game.createMargot = function () { var margot = game.addChild(new Margot()); var position = findSuitablePlatform(); margot.x = position.x; margot.y = position.y; characters.push(margot); }; game.createChafee = function () { var chafee = game.addChild(new Chafee()); var position = findSuitablePlatform(); chafee.x = position.x; chafee.y = position.y; characters.push(chafee); }; game.createMalicia = function () { var malicia = game.addChild(new Malicia()); var position = findSuitablePlatform(); malicia.x = position.x; malicia.y = position.y; characters.push(malicia); }; game.createTwins = function () { var twins = game.addChild(new Twins()); var position = findSuitablePlatform(); twins.x = position.x; twins.y = position.y; characters.push(twins); }; game.createDogie = function () { var dogie = game.addChild(new Dogie()); var position = findSuitablePlatform(); dogie.x = position.x; dogie.y = position.y; characters.push(dogie); }; game.createEstella = function () { var estella = game.addChild(new Estella()); var position = findSuitablePlatform(); estella.x = position.x; estella.y = position.y; characters.push(estella); }; game.createMazz = function () { var mazz = game.addChild(new Mazz()); var position = findSuitablePlatform(); mazz.x = position.x; mazz.y = position.y; characters.push(mazz); }; // Start background music LK.playMusic('background'); ;
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Chafee = Container.expand(function () {
var self = Container.call(this);
var chafeeGraphics = self.attachAsset('chafee', {
anchorX: 0.5,
anchorY: 0.5
});
self.encountered = false;
self.riddles = [{
question: "Je miaule mais je ne suis pas un chat, j'ai des ailes mais je ne vole pas. Qui suis-je ?",
answers: ["Un oiseau", "Le Chafée", "Un dragon", "Un papillon"],
correct: 1
}, {
question: "Qu'est-ce qui est invisible mais fait du bruit quand on le casse ?",
answers: ["Le vent", "Le silence", "Un rĂȘve", "Une bulle"],
correct: 1
}, {
question: "Je grandis en vieillissant mais je rapetisse en tombant. Qui suis-je ?",
answers: ["Une bougie", "Un arbre", "La lune", "Une ombre"],
correct: 0
}, {
question: "Qu'est-ce qui a quatre pattes le matin, deux Ă midi et trois le soir, mais n'est pas un humain ?",
answers: ["Un centaure malade", "Une chaise qui se transforme", "Mon cousin Gribouille", "Un sphinx paresseux"],
correct: 2
}, {
question: "Pourquoi les poissons ne jouent-ils jamais au poker ?",
answers: ["Ils ont peur de l'eau", "Ils n'ont pas de poches", "Ils montrent toujours leurs écailles", "Ils préfÚrent le bridge"],
correct: 2
}, {
question: "Que dit un escargot quand il croise une limace ?",
answers: ["Regarde, un nudiste !", "Tu as perdu ta maison ?", "Salut cousin sans coquille !", "DĂ©pĂȘche-toi !"],
correct: 0
}, {
question: "Combien de chats faut-il pour visser une ampoule ?",
answers: ["Aucun, ils préfÚrent le noir", "Sept, un pour tenir et six pour tourner", "Deux, mais comment ils rentrent dedans ?", "Un seul, mais il faut qu'il soit motivé"],
correct: 2
}, {
question: "Qu'est-ce qui est jaune et qui attend ?",
answers: ["Jonathan Bananier", "Un citron patient", "Le soleil en retard", "Mon petit-déjeuner"],
correct: 0
}, {
question: "Pourquoi les plongeurs plongent-ils toujours en arriĂšre ?",
answers: ["Parce qu'en avant ils tombent dans le bateau", "C'est plus joli", "Ils sont timides", "Pour faire des bulles"],
correct: 0
}, {
question: "Qu'est-ce qui est petit, vert et qui monte et descend ?",
answers: ["Un petit pois dans un ascenseur", "Un martien qui fait du sport", "Une olive qui danse", "Mon voisin malade"],
correct: 0
}, {
question: "Comment appelle-t-on un chat tombé dans un pot de peinture le jour de Noël ?",
answers: ["Un chat-mallow", "Un chat-pin de Noël", "Un chat-touillé", "Un chat-grin"],
correct: 1
}, {
question: "Que dit un tapis quand il se lĂšve ?",
answers: ["J'ai mal au dos", "Oula, j'suis tout froissé !", "Bonjour parquet !", "Il était temps !"],
correct: 1
}, {
question: "Pourquoi les poules pondent-elles des Ćufs ?",
answers: ["Parce que si elles les jetaient, ils se casseraient", "Elles n'ont pas le choix", "C'est leur hobby", "Pour embĂȘter les renards"],
correct: 0
}, {
question: "Qu'est-ce qui est transparent et qui sent la carotte ?",
answers: ["Un pet de lapin", "Un fantĂŽme gourmand", "De l'eau de carotte", "L'haleine de Bugs Bunny"],
correct: 0
}, {
question: "Comment fait-on pour allumer un barbecue sous l'eau ?",
answers: ["Avec un briquet étanche", "On ne peut pas, idiot !", "Avec du feu liquide", "En demandant à Aquaman"],
correct: 1
}, {
question: "Qu'est-ce qui est rouge et qui sourit dans un coin ?",
answers: ["Une tomate heureuse", "Un clown coincé", "Une fraise qui regarde la télé", "Mon nez aprÚs un rhume"],
correct: 0
}, {
question: "Pourquoi les elephants ont-ils une excellente mémoire ?",
answers: ["Parce qu'ils racontent de bonnes histoires", "Ils ne peuvent pas oublier leur poids", "Ils Ă©crivent tout", "Sinon ils oublieraient oĂč ils ont mis leur trompe"],
correct: 3
}, {
question: "Qu'est-ce qui est pire qu'une girafe avec un mal de gorge ?",
answers: ["Un mille-pattes avec des ampoules", "Un hippopotame qui fait régime", "Une baleine qui a le hoquet", "Moi quand j'ai faim"],
correct: 0
}, {
question: "Comment appelle-t-on un boomerang qui ne revient pas ?",
answers: ["Un boomewrong", "Un bĂąton", "Un boomerang paresseux", "Un boomerang en vacances"],
correct: 1
}, {
question: "Qu'est-ce qui a des dents mais ne mange jamais ?",
answers: ["Un requin végétarien", "Une scie", "Mon grand-pÚre", "Un piano souriant"],
correct: 1
}, {
question: "Pourquoi les abeilles ont-elles des cheveux collants ?",
answers: ["Elles utilisent du honey-shampooing", "Elles transpirent du miel", "C'est de la cire", "Elles ne se lavent jamais"],
correct: 0
}, {
question: "Qu'est-ce qui tombe mais ne se fait jamais mal ?",
answers: ["La pluie", "Un parachutiste expert", "Mon moral le lundi", "Les feuilles d'automne"],
correct: 0
}, {
question: "Comment appelle-t-on un chien qui n'a pas de pattes ?",
answers: ["On ne l'appelle pas, on va le chercher", "Un chien saucisse", "Roulette", "Un chat déguisé"],
correct: 0
}, {
question: "Qu'est-ce qui est invisible et sent l'ail ?",
answers: ["L'haleine d'un vampire", "Un pet d'italien", "L'air de la cuisine", "Mon ami invisible"],
correct: 0
}, {
question: "Pourquoi les bananes portent-elles de la crĂšme solaire ?",
answers: ["Pour ne pas peler", "Elles sont Ă la plage", "Elles sont coquettes", "C'est leur peau naturelle"],
correct: 0
}, {
question: "Qu'est-ce qui crie plus fort qu'un cochon qu'on égorge ?",
answers: ["Deux cochons qu'on égorge", "Un cochon avec un mégaphone", "Ma voisine qui regarde le foot", "Un micro qui larsen"],
correct: 0
}, {
question: "Comment fait-on pour qu'un canard marche sur la tĂȘte ?",
answers: ["On retourne l'étang", "On lui met les pattes en l'air", "On lui demande poliment", "Impossible, ils ont le vertige"],
correct: 0
}, {
question: "Qu'est-ce qui a un chapeau mais pas de tĂȘte ?",
answers: ["Un champignon", "Un Ă©pouvantail sans tĂȘte", "Une bouteille chic", "Mon cousin Albert"],
correct: 0
}, {
question: "Pourquoi les pingouins ne volent-ils pas ?",
answers: ["Ils ont peur du mal des transports", "Leurs ailes sont trop petites", "Ils n'ont pas de permis", "Ils préfÚrent nager"],
correct: 1
}, {
question: "Qu'est-ce qui court mais n'a pas de jambes ?",
answers: ["L'eau", "Le temps", "Mon nez quand j'ai un rhume", "Toutes ces réponses"],
correct: 3
}, {
question: "Comment appelle-t-on un dinosaure qui dort ?",
answers: ["Un dodo-saure", "Un dinoronfle", "Un paresseux-rex", "Un fossile fatigué"],
correct: 0
}, {
question: "Qu'est-ce qui est blanc et noir et rouge partout ?",
answers: ["Un zĂšbre qui rougit", "Un journal", "Un pingouin qui saigne du nez", "Ma conscience"],
correct: 1
}, {
question: "Pourquoi les chauves se lavent-ils le visage avec du shampooing ?",
answers: ["Ils ne savent pas oĂč s'arrĂȘtent les cheveux", "C'est plus Ă©conomique", "Ils sont confus", "Par habitude"],
correct: 0
}, {
question: "Qu'est-ce qui a six pattes et qui vole ?",
answers: ["Trois oiseaux attachés ensemble", "Un insecte", "Un avion avec des pattes", "Mon imagination"],
correct: 1
}, {
question: "Comment appelle-t-on un combat entre un chat et un chien ?",
answers: ["Un miaule-ment", "Une bataille d'animaux", "Un chat-hu", "Un bordel monstre"],
correct: 2
}, {
question: "Qu'est-ce qui grandit mais ne vieillit jamais ?",
answers: ["Les mensonges", "Les dettes", "L'ignorance", "Mes cheveux dans les oreilles"],
correct: 0
}, {
question: "Pourquoi les vampires ne vont-ils jamais Ă la plage ?",
answers: ["Ils ont peur de bronzer", "Le sable rentre dans leur cercueil", "L'ail de mer", "Ils préfÚrent les piscines"],
correct: 0
}, {
question: "Qu'est-ce qui a des ailes mais ne vole pas et nage mais n'a pas d'eau ?",
answers: ["Un poulet dans un aquarium vide", "Un pingouin", "Mon rĂȘve de voler", "Une poule qui fait de la natation"],
correct: 1
}, {
question: "Comment fait-on pour rendre un mouchoir complÚtement carré ?",
answers: ["On le plie bien", "On le découpe", "On lui raconte une blague nulle", "Impossible, il sera toujours rond des coins"],
correct: 2
}, {
question: "Qu'est-ce qui monte et descend mais ne bouge jamais ?",
answers: ["La température", "L'escalier", "Mon humeur", "Le prix de l'essence"],
correct: 1
}, {
question: "Pourquoi est-ce qu'on dit que l'argent n'a pas d'odeur ?",
answers: ["Parce qu'il est enrhumé", "Il se lave souvent", "C'est faux, ça sent l'avarice", "Il porte du déodorant"],
correct: 2
}, {
question: "Qu'est-ce qui se casse dĂšs qu'on le nomme ?",
answers: ["Le silence", "La vaisselle de ma mĂšre", "Un secret", "Mon cĆur quand on m'ignore"],
correct: 0
}];
self.update = function () {
self.x -= scrollSpeed;
// Check collision with Lisa
if (!self.encountered && self.intersects(lisa)) {
self.encountered = true;
self.startRiddle();
}
};
self.startRiddle = function () {
isPaused = true;
self.currentRiddle = self.riddles[Math.floor(Math.random() * self.riddles.length)];
// Create riddle UI
self.riddleContainer = game.addChild(new Container());
self.riddleContainer.x = 1024;
self.riddleContainer.y = 1366;
// Background
var bg = self.riddleContainer.addChild(LK.getAsset('challengeBox', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2,
scaleY: 1.0
}));
bg.alpha = 0.9;
bg.tint = 0x9400D3;
// Title
var titleText = self.riddleContainer.addChild(new Text2('Le Chafée - Chat Malicieux', {
size: 36,
fill: 0xFFFFFF
}));
titleText.anchor.set(0.5, 0.5);
titleText.y = -150;
// Question
var questionText = self.riddleContainer.addChild(new Text2(self.currentRiddle.question, {
size: 32,
fill: 0xFFFFFF
}));
questionText.anchor.set(0.5, 0.5);
questionText.y = -80;
// Answer buttons
self.answerButtons = [];
for (var i = 0; i < self.currentRiddle.answers.length; i++) {
var buttonContainer = self.riddleContainer.addChild(new Container());
buttonContainer.x = 0;
buttonContainer.y = -20 + i * 50;
buttonContainer.answerIndex = i;
var buttonBg = buttonContainer.addChild(LK.getAsset('challengeBox', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.15
}));
buttonBg.tint = 0xDDA0DD;
buttonBg.alpha = 0.8;
var buttonText = buttonContainer.addChild(new Text2(i + 1 + '. ' + self.currentRiddle.answers[i], {
size: 26,
fill: 0x000000
}));
buttonText.anchor.set(0.5, 0.5);
buttonContainer.down = function (x, y, obj) {
this.alpha = 0.7;
var container = this;
LK.setTimeout(function () {
container.alpha = 1;
}, 100);
if (container.answerIndex === self.currentRiddle.correct) {
self.onCorrectAnswer();
} else {
self.onWrongAnswer();
}
};
self.answerButtons.push(buttonContainer);
}
};
self.onCorrectAnswer = function () {
var randomType = bubbleTypes[Math.floor(Math.random() * bubbleTypes.length)];
lipoints[randomType] += 40;
updateLipointsDisplay();
checkLevelUp();
self.showResultMessage('Bravo ! Le Chafée t\'offre 40 LIPOINTS de ' + randomType + ' !', 0x00FF00);
LK.getSound('success').play();
LK.setTimeout(function () {
self.closeRiddle();
}, 5000);
};
self.onWrongAnswer = function () {
var stolenType = Math.random() < 0.5 ? 'destiny' : 'lollipop';
var stolenAmount = stolenType === 'destiny' ? 15 : 20;
if (lipoints[stolenType] >= stolenAmount) {
lipoints[stolenType] -= stolenAmount;
} else {
lipoints[stolenType] = 0;
}
updateLipointsDisplay();
self.showResultMessage('Dommage ! Le Chafée te vole ' + stolenAmount + ' LIPOINTS de ' + stolenType + ' !', 0xFF0000);
LK.getSound('fail').play();
LK.setTimeout(function () {
self.closeRiddle();
}, 5000);
};
self.showResultMessage = function (message, color) {
var resultText = self.riddleContainer.addChild(new Text2(message, {
size: 32,
fill: color
}));
resultText.anchor.set(0.5, 0.5);
resultText.y = 120;
};
self.closeRiddle = function () {
if (self.riddleContainer) {
self.riddleContainer.destroy();
}
isPaused = false;
self.destroy();
characters.splice(characters.indexOf(self), 1);
};
return self;
});
var Challenge = Container.expand(function (type) {
var self = Container.call(this);
var challengeGraphics = self.attachAsset('challengeBox', {
anchorX: 0.5,
anchorY: 0.5
});
challengeGraphics.alpha = 0.9;
self.challengeType = type;
self.attempts = 0;
self.maxAttempts = 3;
self.isActive = true;
// Challenge text
self.titleText = self.addChild(new Text2('', {
size: 40,
fill: 0xFFFFFF
}));
self.titleText.anchor.set(0.5, 0.5);
self.titleText.y = -120;
self.instructionText = self.addChild(new Text2('', {
size: 24,
fill: 0xFFFFFF
}));
self.instructionText.anchor.set(0.5, 0.5);
self.instructionText.y = -60;
self.resultText = self.addChild(new Text2('', {
size: 30,
fill: 0xFFFFFF
}));
self.resultText.anchor.set(0.5, 0.5);
self.resultText.y = 100;
self.setupChallenge = function () {
switch (self.challengeType) {
case 'light':
self.setupLightChallenge();
break;
case 'destiny':
self.setupDestinyChallenge();
break;
case 'shadow':
self.setupShadowChallenge();
break;
case 'lollipop':
self.setupLollipopChallenge();
break;
case 'ocean':
self.setupOceanChallenge();
break;
}
};
self.setupLightChallenge = function () {
self.titleText.setText('Défi de la LumiÚre');
self.instructionText.setText('Appuie pour allumer les lampes par la force de ta pensée !');
// Create lamps
self.lamps = [];
for (var i = 0; i < 3; i++) {
var lamp = self.addChild(LK.getAsset('lamp', {
anchorX: 0.5,
anchorY: 0.5
}));
lamp.x = (i - 1) * 80;
lamp.y = 20;
lamp.lit = false;
self.lamps.push(lamp);
}
};
self.setupDestinyChallenge = function () {
self.titleText.setText('Défi du Destin');
self.currentQuestion = destinyQuestions[Math.floor(Math.random() * destinyQuestions.length)];
self.instructionText.setText(self.currentQuestion.question);
self.instructionText.y = -100;
// Create answer buttons
self.answerButtons = [];
for (var i = 0; i < self.currentQuestion.answers.length; i++) {
// Create button container
var buttonContainer = self.addChild(new Container());
buttonContainer.x = 0;
buttonContainer.y = -20 + i * 60;
buttonContainer.answerIndex = i;
// Create button background shape
var buttonBg = buttonContainer.addChild(LK.getAsset('challengeBox', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.2
}));
buttonBg.tint = 0xE6E6FA; // Light lavender background
buttonBg.alpha = 0.8;
// Create button text
var buttonText = buttonContainer.addChild(new Text2(i + 1 + '. ' + self.currentQuestion.answers[i], {
size: 28,
fill: 0x000000
}));
buttonText.anchor.set(0.5, 0.5);
// Add click handler to button container
buttonContainer.down = function (x, y, obj) {
// Visual feedback
this.alpha = 0.7;
var container = this;
LK.setTimeout(function () {
container.alpha = 1;
}, 100);
// Process answer
if (container.answerIndex === self.currentQuestion.correct) {
container.children[0].tint = 0x00FF00; // Green for correct
self.onSuccess();
} else {
container.children[0].tint = 0xFF0000; // Red for incorrect
self.onFailure();
}
};
self.answerButtons.push(buttonContainer);
}
self.isQuizChallenge = true;
};
self.setupShadowChallenge = function () {
self.titleText.setText('Défi de l\'Ombre');
self.instructionText.setText('Ăteins le soleil brillant avec la magie de l\'ombre !\nAppuie pour crĂ©er des ombres !');
};
self.setupLollipopChallenge = function () {
self.titleText.setText('Défi des Sucettes');
self.currentQuestion = lollipopQuestions[Math.floor(Math.random() * lollipopQuestions.length)];
self.instructionText.setText(self.currentQuestion.question);
self.instructionText.y = -100;
// Create answer buttons
self.answerButtons = [];
for (var i = 0; i < self.currentQuestion.answers.length; i++) {
// Create button container
var buttonContainer = self.addChild(new Container());
buttonContainer.x = 0;
buttonContainer.y = -20 + i * 60;
buttonContainer.answerIndex = i;
// Create button background shape
var buttonBg = buttonContainer.addChild(LK.getAsset('challengeBox', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.2
}));
buttonBg.tint = 0xFFB6C1; // Light pink background
buttonBg.alpha = 0.8;
// Create button text
var buttonText = buttonContainer.addChild(new Text2(i + 1 + '. ' + self.currentQuestion.answers[i], {
size: 28,
fill: 0x000000
}));
buttonText.anchor.set(0.5, 0.5);
// Add click handler to button container
buttonContainer.down = function (x, y, obj) {
// Visual feedback
this.alpha = 0.7;
var container = this;
LK.setTimeout(function () {
container.alpha = 1;
}, 100);
// Process answer
if (container.answerIndex === self.currentQuestion.correct) {
container.children[0].tint = 0x00FF00; // Green for correct
self.onSuccess();
} else {
container.children[0].tint = 0xFF0000; // Red for incorrect
self.onFailure();
}
};
self.answerButtons.push(buttonContainer);
}
self.isQuizChallenge = true;
};
self.setupOceanChallenge = function () {
self.titleText.setText('Défi des Océans');
self.currentQuestion = oceanQuestions[Math.floor(Math.random() * oceanQuestions.length)];
self.instructionText.setText(self.currentQuestion.question);
self.instructionText.y = -100;
// Create answer buttons
self.answerButtons = [];
for (var i = 0; i < self.currentQuestion.answers.length; i++) {
// Create button container
var buttonContainer = self.addChild(new Container());
buttonContainer.x = 0;
buttonContainer.y = -20 + i * 60;
buttonContainer.answerIndex = i;
// Create button background shape
var buttonBg = buttonContainer.addChild(LK.getAsset('challengeBox', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.2
}));
buttonBg.tint = 0x87CEEB; // Sky blue background
buttonBg.alpha = 0.8;
// Create button text
var buttonText = buttonContainer.addChild(new Text2(i + 1 + '. ' + self.currentQuestion.answers[i], {
size: 28,
fill: 0x000000
}));
buttonText.anchor.set(0.5, 0.5);
// Add click handler to button container
buttonContainer.down = function (x, y, obj) {
// Visual feedback
this.alpha = 0.7;
var container = this;
LK.setTimeout(function () {
container.alpha = 1;
}, 100);
// Process answer
if (container.answerIndex === self.currentQuestion.correct) {
container.children[0].tint = 0x00FF00; // Green for correct
self.onSuccess();
} else {
container.children[0].tint = 0xFF0000; // Red for incorrect
self.onFailure();
}
};
self.answerButtons.push(buttonContainer);
}
self.isQuizChallenge = true;
};
self.down = function (x, y, obj) {
if (!self.isActive) return;
// Handle action challenges (light, shadow) - quiz challenges now handle clicks through individual button handlers
if (self.challengeType === 'light' || self.challengeType === 'shadow') {
self.attempts++;
var success = Math.random() < 0.3;
if (success) {
self.onSuccess();
} else {
self.onFailure();
}
}
};
self.onSuccess = function () {
self.resultText.setText('Réussi ! +5 LIPOINTS');
self.resultText.fill = "#00FF00";
LK.getSound('success').play();
// Award LIPOINTS
lipoints[self.challengeType] += 5;
updateLipointsDisplay();
checkLevelUp();
LK.setTimeout(function () {
self.closeChallenge();
}, 2000);
};
self.onFailure = function () {
if (self.isQuizChallenge || self.attempts >= self.maxAttempts) {
self.resultText.setText('DĂ©fi ĂchouĂ© !');
self.resultText.fill = "#FF0000";
LK.getSound('fail').play();
LK.setTimeout(function () {
self.closeChallenge();
}, 2000);
} else {
self.resultText.setText('Réessaie ! (' + (self.maxAttempts - self.attempts) + ' essais restants)');
self.resultText.fill = "#FFFF00";
}
};
self.closeChallenge = function () {
self.isActive = false;
activeChallenge = null;
self.destroy();
isPaused = false;
};
return self;
});
var Dogie = Container.expand(function () {
var self = Container.call(this);
var dogieGraphics = self.attachAsset('dogie', {
anchorX: 0.5,
anchorY: 0.5
});
self.encountered = false;
self.remarks = ["Attention Lisa ! Le ChafĂ©e prĂ©pare encore une de ses blagues pourries !", "Tu savais que le ChafĂ©e collectionne les devinettes ratĂ©es ? Il en a des millions !", "Le ChafĂ©e m'a dit qu'il connaĂźt la blague la plus nulle du monde... Je pense qu'il dit vrai !", "MĂ©fie-toi, Lisa ! Le ChafĂ©e a encore inventĂ© une Ă©nigme qui ne rime Ă rien !", "Le ChafĂ©e pense qu'il est drĂŽle, mais mĂȘme les pierres bĂąillent quand il raconte ses blagues !", "Tu veux entendre la pire blague du ChafĂ©e ? Non ? Tu as raison, garde tes oreilles !", "Le ChafĂ©e m'a demandĂ© si je trouvais ses blagues amusantes... J'ai fait le mort !", "Lisa, si le ChafĂ©e te pose une devinette, prĂ©pare-toi Ă perdre quelques neurones !", "Le ChafĂ©e croit qu'il est un gĂ©nie de l'humour... Moi je dis qu'il est un gĂ©nie du ridicule !", "Attention ! Le ChafĂ©e a encore trouvĂ© une Ă©nigme dans un paquet de cĂ©rĂ©ales !", "Le ChafĂ©e m'a dit qu'il Ă©crit un livre de blagues... Je pense qu'il devrait plutĂŽt Ă©crire des excuses !", "Tu sais pourquoi je n'aime pas le ChafĂ©e ? Parce que ses blagues me donnent mal aux oreilles !", "Le ChafĂ©e prĂ©tend connaĂźtre 1000 devinettes... Dommage qu'aucune ne soit drĂŽle !", "Lisa, le ChafĂ©e va sĂ»rement te raconter sa blague prĂ©fĂ©rĂ©e... Prends tes jambes Ă ton cou !", "Le ChafĂ©e pense qu'il peut me faire rire avec ses Ă©nigmes... Il se trompe de planĂšte !", "MĂ©fie-toi du ChafĂ©e ! Il cache ses blagues pourries partout dans la forĂȘt !", "Le ChafĂ©e m'a demandĂ© si je voulais entendre sa nouvelle devinette... J'ai dit ouaf, c'est NON !", "Lisa, le ChafĂ©e collectionne aussi les mauvaises blagues qu'il n'a pas encore inventĂ©es !", "Le ChafĂ©e croit qu'il est le roi de l'humour... Moi je dis qu'il est plutĂŽt le roi des nouilles !", "Attention ! Le ChafĂ©e prĂ©pare encore un de ses quiz impossibles !", "Le ChafĂ©e m'a dit qu'il avait une devinette gĂ©niale... Je lui ai dit d'aller voir un docteur !", "Tu veux savoir le secret du ChafĂ©e ? Il invente ses blagues en dormant... Et ça se voit !", "Lisa, si le ChafĂ©e te demande ton avis sur ses blagues, dis-lui que tu es muette !", "Le ChafĂ©e pense qu'il va devenir cĂ©lĂšbre avec ses Ă©nigmes... CĂ©lĂšbre pour les mauvaises raisons !", "MĂ©fie-toi ! Le ChafĂ©e a encore lu un livre de devinettes pour enfants de 3 ans !", "Le ChafĂ©e m'a proposĂ© de devenir son assistant... J'ai prĂ©fĂ©rĂ© rester avec ma dignitĂ© !", "Lisa, le ChafĂ©e va te dire qu'il connaĂźt LA blague du siĂšcle... Ne l'Ă©coute pas, il ment !", "Le ChafĂ©e croit que ses Ă©nigmes sont mystĂ©rieuses... Elles sont surtout incomprĂ©hensibles !", "Attention ! Le ChafĂ©e a trouvĂ© de nouvelles devinettes dans un magazine de 1982 !", "Le ChafĂ©e m'a dit qu'il allait rĂ©volutionner l'humour... J'ai dit qu'il ferait mieux de commencer par l'apprendre !", "Lisa, le ChafĂ©e va sĂ»rement te poser une Ă©nigme sur les chaussettes... C'est son truc bizarre !", "Le ChafĂ©e pense qu'il est plus malin que moi... Mais mĂȘme une sardine est plus drĂŽle que lui !", "MĂ©fie-toi du ChafĂ©e ! Il cache ses blagues ratĂ©es sous les feuilles mortes !", "Le ChafĂ©e m'a demandĂ© si je connaissais une bonne blague... Je lui ai dit de se regarder dans un miroir !", "Lisa, le ChafĂ©e collectionne les devinettes comme moi je collectionne les os... Mais au moins mes os sont utiles !", "Le ChafĂ©e croit qu'il peut m'impressionner avec ses Ă©nigmes... Il ferait mieux d'essayer avec une mĂ©duse !", "Attention ! Le ChafĂ©e prĂ©pare encore une de ses questions sans rĂ©ponse logique !", "Le ChafĂ©e m'a dit qu'il Ă©tait le maĂźtre des devinettes... Je lui ai dit qu'il Ă©tait plutĂŽt le maĂźtre des catastrophes !", "Lisa, si le ChafĂ©e te propose un duel de blagues, cours plus vite que moi quand je vois le vĂ©tĂ©rinaire !", "Le ChafĂ©e pense que ses Ă©nigmes sont profondes... Elles sont surtout profondĂ©ment ennuyeuses !", "MĂ©fie-toi ! Le ChafĂ©e a encore inventĂ© une devinette en mĂ©langeant deux blagues ratĂ©es !", "Le ChafĂ©e m'a proposĂ© de tester ses nouvelles Ă©nigmes... J'ai prĂ©fĂ©rĂ© aller chez le toiletteur !", "Lisa, le ChafĂ©e va te dire qu'il connaĂźt le secret de l'humour... Son secret c'est de ne pas en avoir !", "Le ChafĂ©e croit qu'il peut me rendre fou avec ses devinettes... Il y est presque arrivĂ© !", "Attention ! Le ChafĂ©e a trouvĂ© un livre de blagues dans une poubelle... Et ça se sent !", "Le ChafĂ©e m'a demandĂ© mon avis sur sa derniĂšre Ă©nigme... Je lui ai dit qu'elle Ă©tait parfaite... pour faire fuir les mouches !", "Lisa, le ChafĂ©e va sĂ»rement te raconter l'histoire de la blague qui n'a pas de fin... Comme toutes les siennes !", "Le ChafĂ©e pense qu'il est l'Einstein de l'humour... Moi je pense qu'il est plutĂŽt l'Einstein de la bĂȘtise !", "MĂ©fie-toi du ChafĂ©e ! Il prĂ©pare encore une Ă©nigme Ă base de fromage qui pue !", "Le ChafĂ©e m'a dit qu'il allait m'apprendre l'humour... Je lui ai dit que j'Ă©tais allergique !", "Lisa, le ChafĂ©e collectionne les devinettes comme moi je collectionne les puces... En moins utile !", "Le ChafĂ©e croit qu'il peut m'Ă©mouvoir avec ses blagues... Il m'Ă©meut... de pitiĂ© !", "Attention ! Le ChafĂ©e a encore mĂ©langĂ© une devinette avec une recette de cuisine !", "Le ChafĂ©e m'a proposĂ© d'Ă©crire un livre ensemble... 'Les pires blagues du monde' ça vous dit ?", "Lisa, si le ChafĂ©e te demande de deviner quelque chose, dis-lui que tu devines qu'il va dire n'importe quoi !", "Le ChafĂ©e pense que ses Ă©nigmes sont des Ćuvres d'art... Des Ćuvres d'art moderne trĂšs trĂšs moderne !", "MĂ©fie-toi ! Le ChafĂ©e a encore trouvĂ© une devinette dans un paquet de chips vide !", "Le ChafĂ©e m'a dit qu'il connaissait la rĂ©ponse Ă tout... Sauf Ă la question 'Comment ĂȘtre drĂŽle ?' !", "Lisa, le ChafĂ©e va te poser une Ă©nigme sur les escargots... C'est son obsession du moment !", "Le ChafĂ©e croit qu'il peut me faire pleurer de rire... Il me fait pleurer c'est sĂ»r, mais pas de rire !", "Attention ! Le ChafĂ©e prĂ©pare encore une de ses devinettes Ă rallonge sans queue ni tĂȘte !", "Le ChafĂ©e m'a demandĂ© si j'aimais les surprises... Je lui ai dit que ses blagues m'avaient vaccinĂ© contre !", "Lisa, le ChafĂ©e va sĂ»rement te dire qu'il a inventĂ© l'humour... Ne le crois pas, il a juste inventĂ© l'anti-humour !", "Le ChafĂ©e pense qu'il est le plus drĂŽle de la forĂȘt... Il a raison : il est tellement pas drĂŽle que c'en est drĂŽle !", "MĂ©fie-toi du ChafĂ©e ! Il cache ses Ă©nigmes ratĂ©es dans des boĂźtes Ă chaussures !", "Le ChafĂ©e m'a proposĂ© de devenir son public... J'ai dit que j'Ă©tais dĂ©jĂ occupĂ© Ă ĂȘtre un chien !", "Lisa, le dernier conseil de Dogie : si le ChafĂ©e commence une phrase par 'Tu connais celle-lĂ ?', cours trĂšs trĂšs vite !"];
self.update = function () {
self.x -= scrollSpeed;
// Check collision with Lisa
if (!self.encountered && self.intersects(lisa)) {
self.encountered = true;
self.startDialogue();
}
};
self.startDialogue = function () {
isPaused = true;
// Choose a random remark
var randomRemark = self.remarks[Math.floor(Math.random() * self.remarks.length)];
// Create dialogue UI
self.dialogueContainer = game.addChild(new Container());
self.dialogueContainer.x = 1024;
self.dialogueContainer.y = 1366;
// Background
var bg = self.dialogueContainer.addChild(LK.getAsset('challengeBox', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.3,
scaleY: 0.8
}));
bg.alpha = 0.9;
bg.tint = 0x8B4513; // Brown color for dog
// Title
var titleText = self.dialogueContainer.addChild(new Text2('Dogie - Le Chien Anti-Chafée', {
size: 32,
fill: 0xFFFFFF
}));
titleText.anchor.set(0.5, 0.5);
titleText.y = -120;
// Dialogue text
self.dialogueText = self.dialogueContainer.addChild(new Text2(randomRemark, {
size: 30,
fill: 0xFFFFFF
}));
self.dialogueText.anchor.set(0.5, 0.5);
self.dialogueText.y = -20;
// OK button
self.okButton = self.dialogueContainer.addChild(new Container());
self.okButton.x = 0;
self.okButton.y = 80;
var okBg = self.okButton.addChild(LK.getAsset('challengeBox', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.3,
scaleY: 0.15
}));
okBg.tint = 0x32CD32;
var okText = self.okButton.addChild(new Text2('OK', {
size: 26,
fill: 0x000000
}));
okText.anchor.set(0.5, 0.5);
self.okButton.down = function () {
self.closeDialogue();
};
};
self.closeDialogue = function () {
if (self.dialogueContainer) {
self.dialogueContainer.destroy();
}
isPaused = false;
self.destroy();
characters.splice(characters.indexOf(self), 1);
};
return self;
});
var Estella = Container.expand(function () {
var self = Container.call(this);
var estellaGraphics = self.attachAsset('estella', {
anchorX: 0.5,
anchorY: 0.5
});
self.encountered = false;
self.update = function () {
self.x -= scrollSpeed;
// Check collision with Lisa
if (!self.encountered && self.intersects(lisa)) {
self.encountered = true;
self.startPowerChoice();
}
};
self.startPowerChoice = function () {
isPaused = true;
// Create choice UI
self.choiceContainer = game.addChild(new Container());
self.choiceContainer.x = 1024;
self.choiceContainer.y = 1366;
// Background
var bg = self.choiceContainer.addChild(LK.getAsset('challengeBox', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2,
scaleY: 1.0
}));
bg.alpha = 0.9;
bg.tint = 0x9370DB; // Purple color for Estella
// Title
var titleText = self.choiceContainer.addChild(new Text2('Estella - Dresseuse de Pouvoirs', {
size: 32,
fill: 0xFFD700
}));
titleText.anchor.set(0.5, 0.5);
titleText.y = -150;
// Instructions
var instructText = self.choiceContainer.addChild(new Text2('Je t\'offre 50 LIPOINTS de poussiÚre d\'étoiles !\nChoisis le type de pouvoir à renforcer :', {
size: 28,
fill: 0xFFFFFF
}));
instructText.anchor.set(0.5, 0.5);
instructText.y = -80;
// Create choice buttons for each LIPOINT type
var choices = [{
type: 'light',
name: 'LumiĂšre',
color: 0xFFFF00
}, {
type: 'destiny',
name: 'Destin',
color: 0x9370DB
}, {
type: 'shadow',
name: 'Ombre',
color: 0x2F4F4F
}, {
type: 'lollipop',
name: 'Sucettes',
color: 0xFF69B4
}, {
type: 'ocean',
name: 'Océans',
color: 0x1E90FF
}];
for (var i = 0; i < choices.length; i++) {
var choice = choices[i];
var buttonContainer = self.choiceContainer.addChild(new Container());
buttonContainer.x = 0;
buttonContainer.y = -20 + i * 40;
buttonContainer.choiceType = choice.type;
var buttonBg = buttonContainer.addChild(LK.getAsset('challengeBox', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.15
}));
buttonBg.tint = choice.color;
buttonBg.alpha = 0.8;
var buttonText = buttonContainer.addChild(new Text2(choice.name + ' (+50)', {
size: 26,
fill: 0x000000
}));
buttonText.anchor.set(0.5, 0.5);
buttonContainer.down = function (x, y, obj) {
this.alpha = 0.7;
var container = this;
LK.setTimeout(function () {
container.alpha = 1;
}, 100);
self.grantPower(container.choiceType);
};
}
};
self.grantPower = function (chosenType) {
// Give 50 LIPOINTS of chosen type
lipoints[chosenType] += 50;
updateLipointsDisplay();
checkLevelUp();
// Show confirmation message
var confirmText = self.choiceContainer.addChild(new Text2('Parfait ! Tu as reçu 50 LIPOINTS de ' + chosenType + ' !', {
size: 28,
fill: 0x00FF00
}));
confirmText.anchor.set(0.5, 0.5);
confirmText.y = 120;
LK.getSound('success').play();
LK.setTimeout(function () {
self.closeChoice();
}, 3000);
};
self.closeChoice = function () {
if (self.choiceContainer) {
self.choiceContainer.destroy();
}
isPaused = false;
self.destroy();
characters.splice(characters.indexOf(self), 1);
};
return self;
});
var Lisa = Container.expand(function () {
var self = Container.call(this);
var lisaGraphics = self.attachAsset('lisa', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityY = 0;
self.isJumping = false;
self.onGround = false;
self.update = function () {
// Apply gravity
if (!self.onGround) {
self.velocityY += 0.8;
}
self.y += self.velocityY;
// Check collision with trees
self.onGround = false;
for (var i = 0; i < trees.length; i++) {
var tree = trees[i];
if (self.intersects(tree) && self.velocityY > 0) {
self.y = tree.y - tree.height / 2 - self.height / 2;
self.velocityY = 0;
self.onGround = true;
self.isJumping = false;
break;
}
}
// Fall off screen check
if (self.y > 2732 + 100) {
resetLisaPosition();
}
};
self.jump = function () {
if (self.onGround && !self.isJumping) {
self.velocityY = -18;
self.isJumping = true;
self.onGround = false;
LK.getSound('jump').play();
}
};
return self;
});
var Malicia = Container.expand(function () {
var self = Container.call(this);
var maliciaGraphics = self.attachAsset('malicia', {
anchorX: 0.5,
anchorY: 0.5
});
self.encountered = false;
self.dialogues = ["Ah, Lisa ! Je vois dans mes cristaux que tu as un grand destin...", "Mes potions magiques Ă base d'Ă©corce de licorne et de bave de dragon pourraient t'aider !", "Hmm... Je sens que tu dĂ©velopperas bientĂŽt le pouvoir de parler aux Ă©toiles !", "Cette potion violette Ă base de pĂ©tales de roses Ă©ternelles rĂ©vĂšlera ta vraie nature !", "Les astres me disent que ton futur pouvoir sera... spectaculaire !", "Veux-tu que je te prĂ©pare une potion Ă base de champignons phosphorescents ?", "J'ai ici une recette secrĂšte avec des plumes de phoenix et du miel d'abeilles dorĂ©es...", "Ton aura me dit que tu maĂźtriseras bientĂŽt la magie des Ă©lĂ©ments !", "Les nuages violets me murmurent que tu dĂ©couvriras le secret des chaussettes qui dansent toutes seules !", "Ma boule de cristal Ă paillettes prĂ©dit que tu parleras couramment le langage des cuillĂšres enchantĂ©es !", "Je vois dans le marc de cafĂ© de licorne que tu deviendras l'amie des nuages grognons !", "Mes cartes en Ă©corce de dragon annoncent que tu contrĂŽleras l'art de faire pousser des arbres Ă bonbons !", "L'Ă©cho de ma grotte magique rĂ©vĂšle que tu sauras transformer les larmes en perles de lune !", "Ma potion Ă base de rires de gnomes indique que tu maĂźtriseras le pouvoir de faire chanter les pierres !", "Les vapeurs de ma marmite aux algues cosmiques prĂ©voient que tu ouvriras des portails vers le pays des chaussettes perdues !", "Je sens dans l'air parfumĂ© aux pets de fĂ©es que tu dĂ©velopperas le don de comprendre les disputes des fourchettes !", "Ma baguette en bois de rĂ©glisse magique vibre : tu sauras invoquer des pluies de gĂąteaux au chocolat !", "Les Ă©cailles de poisson-lune dans ma main rĂ©vĂšlent que tu commanderas une armĂ©e de brosses Ă dents rebelles !", "Mon pendule en dent de mammouth rose prĂ©dit que tu dĂ©couvriras la recette du parfum qui rend invisible aux moustiques !", "La fumĂ©e violette de mes herbes chelou annonce que tu parleras aux fantĂŽmes de pizzas mangĂ©es !", "Mes runes gravĂ©es sur des croĂ»tes de fromage magique prĂ©disent que tu chevaucheras des licornes Ă rayures !", "L'esprit de ma thĂ©iĂšre hantĂ©e murmure que tu possĂ©deras le pouvoir de faire rougir les tomates !", "Ma boussole qui pointe vers les rĂȘves bizarres indique que tu crĂ©eras des arc-en-ciel carrĂ©s !", "Les bulles de ma potion aux larmes de crocodile vĂ©gĂ©tarien rĂ©vĂšlent que tu sauras rĂ©parer les cĆurs brisĂ©s avec du scotch magique !", "Mon miroir qui ment toujours prĂ©dit que tu ne dĂ©couvriras jamais comment apprivoiser les chats-dragons volants !", "Les plumes de mes coqs Ă trois pattes annoncent que tu maĂźtriseras l'art de faire fondre les regards mĂ©chants !", "Ma casserole en mĂ©tal d'Ă©toile filante vibre : tu ouvriras une Ă©cole pour enseigner aux papillons Ă chanter !", "Les cailloux colorĂ©s de ma riviĂšre enchantĂ©e prĂ©disent que tu inventeras le premier parapluie anti-cauchemars !", "Mon livre qui s'Ă©crit tout seul rĂ©vĂšle que tu dĂ©couvriras pourquoi les chaussettes disparaissent dans la machine Ă laver !", "La poudre de mes escargots lumineux annonce que tu parleras couramment la langue des bulles de savon !", "Ma loupe qui grossit les Ă©motions prĂ©dit que tu sauras transformer les disputes en batailles de chatouilles !", "Les pĂ©tales de mes roses qui poussent Ă l'envers rĂ©vĂšlent que tu commanderas une flotte de bateaux en papier gĂ©ants !", "Mon sablier rempli de poussiĂšre de comĂštes indique que tu possĂ©deras le don de faire pleurer de joie les nuages !", "La mĂ©lodie de ma harpe en cheveux d'ange prĂ©dit que tu crĂ©eras des ponts en rayons de soleil solidifiĂ©s !", "Mes billes qui roulent vers l'avenir annoncent que tu sauras convaincre les montagnes de changer de place !", "Mon collier en perles de rosĂ©e magique vibre : tu dĂ©couvriras le secret pour faire pousser des fleurs qui sonnent comme des cloches !", "Les Ă©chos de ma caverne qui rit toute seule rĂ©vĂšlent que tu maĂźtriseras l'art de peindre avec des rayons de lune !", "Ma baguette qui ne marche qu'Ă l'envers prĂ©dit que tu ouvriras un cafĂ© pour les fantĂŽmes timides !", "Les vapeurs de ma potion aux sourires d'enfants indiquent que tu sauras faire danser les Ă©toiles en formation !", "Mon chapeau pointu qui change de couleur selon l'humeur annonce que tu parleras aux esprit des vieilles chaussures !", "La mousse magique de mon chaudron rĂ©vĂšle que tu crĂ©eras des nuages-coussins pour les anges fatiguĂ©s !", "Mes lunettes qui voient dans le passĂ© des objets prĂ©disent que tu dĂ©couvriras l'histoire secrĂšte de chaque grain de sable !"];
self.currentDialogueIndex = 0;
self.update = function () {
self.x -= scrollSpeed;
// Check collision with Lisa
if (!self.encountered && self.intersects(lisa)) {
self.encountered = true;
self.startDialogue();
}
};
self.startDialogue = function () {
isPaused = true;
self.currentDialogueIndex = 0;
self.showDialogue();
};
self.showDialogue = function () {
// Create dialogue UI
self.dialogueContainer = game.addChild(new Container());
self.dialogueContainer.x = 1024;
self.dialogueContainer.y = 1366;
// Background
var bg = self.dialogueContainer.addChild(LK.getAsset('challengeBox', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.3,
scaleY: 0.8
}));
bg.alpha = 0.9;
bg.tint = 0x4B0082;
// Title
var titleText = self.dialogueContainer.addChild(new Text2('Malicia - SorciĂšre aux Potions Bizarres', {
size: 32,
fill: 0x9370DB
}));
titleText.anchor.set(0.5, 0.5);
titleText.y = -120;
// Dialogue text
self.dialogueText = self.dialogueContainer.addChild(new Text2(self.dialogues[self.currentDialogueIndex], {
size: 30,
fill: 0xFFFFFF
}));
self.dialogueText.anchor.set(0.5, 0.5);
self.dialogueText.y = -20;
// Next button
if (self.currentDialogueIndex < self.dialogues.length - 1) {
self.nextButton = self.dialogueContainer.addChild(new Container());
self.nextButton.x = 0;
self.nextButton.y = 80;
var nextBg = self.nextButton.addChild(LK.getAsset('challengeBox', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.3,
scaleY: 0.15
}));
nextBg.tint = 0x32CD32;
var nextText = self.nextButton.addChild(new Text2('Suivant', {
size: 26,
fill: 0x000000
}));
nextText.anchor.set(0.5, 0.5);
self.nextButton.down = function () {
self.nextDialogue();
};
} else {
// OK button for final dialogue
self.okButton = self.dialogueContainer.addChild(new Container());
self.okButton.x = 0;
self.okButton.y = 80;
var okBg = self.okButton.addChild(LK.getAsset('challengeBox', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.3,
scaleY: 0.15
}));
okBg.tint = 0xFF6347;
var okText = self.okButton.addChild(new Text2('OK', {
size: 26,
fill: 0x000000
}));
okText.anchor.set(0.5, 0.5);
self.okButton.down = function () {
self.closeDialogue();
};
}
};
self.nextDialogue = function () {
self.currentDialogueIndex++;
self.dialogueContainer.destroy();
self.showDialogue();
};
self.closeDialogue = function () {
if (self.dialogueContainer) {
self.dialogueContainer.destroy();
}
isPaused = false;
self.destroy();
characters.splice(characters.indexOf(self), 1);
};
return self;
});
var Margot = Container.expand(function () {
var self = Container.call(this);
var margotGraphics = self.attachAsset('margot', {
anchorX: 0.5,
anchorY: 0.5
});
self.encountered = false;
self.update = function () {
self.x -= scrollSpeed;
// Check collision with Lisa
if (!self.encountered && self.intersects(lisa)) {
self.encountered = true;
self.giveGift();
}
};
self.giveGift = function () {
var randomType = bubbleTypes[Math.floor(Math.random() * bubbleTypes.length)];
lipoints[randomType] += 25;
updateLipointsDisplay();
checkLevelUp();
self.showGiftMessage(randomType);
LK.getSound('success').play();
LK.setTimeout(function () {
self.destroy();
characters.splice(characters.indexOf(self), 1);
}, 5000);
};
self.showGiftMessage = function (type) {
var messageContainer = game.addChild(new Container());
messageContainer.x = lisa.x;
messageContainer.y = lisa.y - 100;
var messageText = messageContainer.addChild(new Text2('Margot, ta sĆur, t\'offre 25 LIPOINTS de ' + type + ' !', {
size: 28,
fill: 0xFF69B4
}));
messageText.anchor.set(0.5, 0.5);
tween(messageContainer, {
alpha: 0
}, {
duration: 5000,
onFinish: function onFinish() {
messageContainer.destroy();
}
});
};
return self;
});
var Mazz = Container.expand(function () {
var self = Container.call(this);
var mazzGraphics = self.attachAsset('mazz', {
anchorX: 0.5,
anchorY: 0.5
});
self.encountered = false;
self.update = function () {
self.x -= scrollSpeed;
// Check collision with Lisa
if (!self.encountered && self.intersects(lisa)) {
self.encountered = true;
self.breatheFire();
}
};
self.breatheFire = function () {
// Choose random LIPOINT type to burn
var burnableTypes = [];
for (var type in lipoints) {
if (lipoints[type] > 0) {
burnableTypes.push(type);
}
}
if (burnableTypes.length === 0) {
// No LIPOINTS to burn
self.showMessage('Mazz crache du feu mais tu n\'as pas de LIPOINTS à brûler !');
} else {
var randomType = burnableTypes[Math.floor(Math.random() * burnableTypes.length)];
var stolenAmount = Math.min(30, lipoints[randomType]);
lipoints[randomType] -= stolenAmount;
updateLipointsDisplay();
var typeName = randomType === 'light' ? 'lumiÚre' : randomType === 'destiny' ? 'destin' : randomType === 'shadow' ? 'ombre' : randomType === 'lollipop' ? 'sucettes' : 'océans';
self.showMessage('Mazz s\'amuse à cracher du feu ! Il a brûlé ' + stolenAmount + ' LIPOINTS de ' + typeName + ' par accident !');
}
LK.setTimeout(function () {
self.destroy();
characters.splice(characters.indexOf(self), 1);
}, 10000);
};
self.showMessage = function (message) {
var messageContainer = game.addChild(new Container());
messageContainer.x = lisa.x;
messageContainer.y = lisa.y - 100;
var messageBg = messageContainer.addChild(LK.getAsset('challengeBox', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.0,
scaleY: 0.3
}));
messageBg.tint = 0xFF4500; // Orange-red for fire
messageBg.alpha = 0.9;
var messageText = messageContainer.addChild(new Text2(message, {
size: 28,
fill: 0xFFFFFF
}));
messageText.anchor.set(0.5, 0.5);
// Add fire effect animation
tween(messageBg, {
scaleX: 1.1,
scaleY: 0.35
}, {
duration: 500,
easing: tween.easeInOut
});
tween(messageBg, {
scaleX: 1.0,
scaleY: 0.3
}, {
duration: 500,
easing: tween.easeInOut
});
LK.setTimeout(function () {
messageContainer.destroy();
}, 10000);
};
return self;
});
var PowerBubble = Container.expand(function (type) {
var self = Container.call(this);
var bubbleAsset = type + 'Bubble';
var bubbleGraphics = self.attachAsset(bubbleAsset, {
anchorX: 0.5,
anchorY: 0.5
});
self.bubbleType = type;
self.collected = false;
self.update = function () {
self.x -= scrollSpeed;
// Check collision with Lisa
if (!self.collected && self.intersects(lisa)) {
self.collected = true;
LK.getSound('collect').play();
startChallenge(self.bubbleType);
self.destroy();
bubbles.splice(bubbles.indexOf(self), 1);
}
};
return self;
});
var Stella = Container.expand(function () {
var self = Container.call(this);
var stellaGraphics = self.attachAsset('stella', {
anchorX: 0.5,
anchorY: 0.5
});
self.encountered = false;
self.pathChosen = false;
self.update = function () {
self.x -= scrollSpeed;
// Check collision with Lisa
if (!self.encountered && self.intersects(lisa)) {
self.encountered = true;
self.showPathChoice();
}
};
self.showPathChoice = function () {
isPaused = true;
// Create path choice UI
self.pathContainer = game.addChild(new Container());
self.pathContainer.x = 1024;
self.pathContainer.y = 1366;
// Background
var bg = self.pathContainer.addChild(LK.getAsset('challengeBox', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2,
scaleY: 0.8
}));
bg.alpha = 0.9;
// Title
var titleText = self.pathContainer.addChild(new Text2('FĂ©e Stella - Guide ĂtoilĂ©e', {
size: 36,
fill: 0xFFD700
}));
titleText.anchor.set(0.5, 0.5);
titleText.y = -120;
// Instructions
var instructText = self.pathContainer.addChild(new Text2('Choisis ton chemin mystérieux !', {
size: 28,
fill: 0xFFFFFF
}));
instructText.anchor.set(0.5, 0.5);
instructText.y = -60;
// Left path button
var leftPath = self.pathContainer.addChild(new Container());
leftPath.x = -120;
leftPath.y = 20;
var leftArrow = leftPath.addChild(LK.getAsset('arrow', {
anchorX: 0.5,
anchorY: 0.5
}));
leftArrow.rotation = Math.PI;
var leftText = leftPath.addChild(new Text2('Chemin\nde Gauche', {
size: 24,
fill: 0xFFFFFF
}));
leftText.anchor.set(0.5, 0.5);
leftText.y = 50;
leftPath.down = function () {
self.chooseLeftPath();
};
// Right path button
var rightPath = self.pathContainer.addChild(new Container());
rightPath.x = 120;
rightPath.y = 20;
var rightArrow = rightPath.addChild(LK.getAsset('arrow', {
anchorX: 0.5,
anchorY: 0.5
}));
var rightText = rightPath.addChild(new Text2('Chemin\nde Droite', {
size: 24,
fill: 0xFFFFFF
}));
rightText.anchor.set(0.5, 0.5);
rightText.y = 50;
rightPath.down = function () {
self.chooseRightPath();
};
};
self.chooseLeftPath = function () {
self.createMagicBubble(-100);
self.closePath();
};
self.chooseRightPath = function () {
self.createMagicBubble(100);
self.closePath();
};
self.createMagicBubble = function (offsetX) {
// Find a suitable tree platform for the magic bubble
var suitableTrees = [];
for (var i = 0; i < trees.length; i++) {
var tree = trees[i];
if (tree.x > self.x && tree.x < self.x + 800) {
suitableTrees.push(tree);
}
}
var targetTree = null;
if (suitableTrees.length > 0) {
// Choose tree based on path direction
if (offsetX < 0) {
// Left path - choose leftmost suitable tree
targetTree = suitableTrees[0];
for (var j = 1; j < suitableTrees.length; j++) {
if (suitableTrees[j].x < targetTree.x) {
targetTree = suitableTrees[j];
}
}
} else {
// Right path - choose rightmost suitable tree
targetTree = suitableTrees[0];
for (var j = 1; j < suitableTrees.length; j++) {
if (suitableTrees[j].x > targetTree.x) {
targetTree = suitableTrees[j];
}
}
}
}
var magicBubble = game.addChild(new Container());
var bubbleGraphics = magicBubble.attachAsset('magicBubble', {
anchorX: 0.5,
anchorY: 0.5
});
if (targetTree) {
magicBubble.x = targetTree.x;
magicBubble.y = targetTree.y - targetTree.height / 2 - 40;
} else {
magicBubble.x = self.x + offsetX;
magicBubble.y = self.y - 60;
}
magicBubble.collected = false;
// Sparkle effect
tween(bubbleGraphics, {
rotation: Math.PI * 2
}, {
duration: 2000,
easing: tween.linear
});
magicBubble.update = function () {
this.x -= scrollSpeed;
if (!this.collected && this.intersects(lisa)) {
this.collected = true;
self.giveReward();
this.destroy();
}
};
magicBubbles.push(magicBubble);
};
self.giveReward = function () {
var rewardAmount = 20 + Math.floor(Math.random() * 31); // 20-50 LIPOINTS
var randomType = bubbleTypes[Math.floor(Math.random() * bubbleTypes.length)];
lipoints[randomType] += rewardAmount;
updateLipointsDisplay();
checkLevelUp();
self.showRewardMessage(rewardAmount, randomType);
LK.getSound('success').play();
};
self.showRewardMessage = function (amount, type) {
var messageContainer = game.addChild(new Container());
messageContainer.x = lisa.x;
messageContainer.y = lisa.y - 100;
var messageText = messageContainer.addChild(new Text2('Stella t\'offre ' + amount + ' LIPOINTS de ' + type + ' !', {
size: 28,
fill: 0xFFD700
}));
messageText.anchor.set(0.5, 0.5);
LK.setTimeout(function () {
messageContainer.destroy();
}, 5000);
};
self.closePath = function () {
if (self.pathContainer) {
self.pathContainer.destroy();
}
isPaused = false;
self.destroy();
characters.splice(characters.indexOf(self), 1);
};
return self;
});
var Tree = Container.expand(function () {
var self = Container.call(this);
var treeGraphics = self.attachAsset('tree', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
self.x -= scrollSpeed;
};
return self;
});
var Twins = Container.expand(function () {
var self = Container.call(this);
var twinsGraphics = self.attachAsset('twins', {
anchorX: 0.5,
anchorY: 0.5
});
self.encountered = false;
self.questions = [{
question: "Quelle est ta couleur préférée ?",
answers: ["Rouge", "Bleu", "Vert", "Jaune"],
difficulty: 1
}, {
question: "Si tu pouvais avoir un super-pouvoir, lequel choisirais-tu ?",
answers: ["Voler", "Lire les pensées", "Devenir invisible", "ContrÎler le temps"],
difficulty: 2
}, {
question: "Dans un monde parfait, que ferais-tu en premier ?",
answers: ["Aider tous les animaux", "Découvrir de nouveaux mondes", "Créer de la beauté", "Rassembler tous les peuples"],
difficulty: 3
}, {
question: "Quel est ton animal préféré ?",
answers: ["Chat", "Chien", "Oiseau", "Poisson"],
difficulty: 1
}, {
question: "Que fais-tu quand tu es triste ?",
answers: ["Je pleure", "Je me cache", "Je parle Ă quelqu'un", "Je dessine"],
difficulty: 1
}, {
question: "Quelle est ta saison favorite ?",
answers: ["Printemps", "ĂtĂ©", "Automne", "Hiver"],
difficulty: 1
}, {
question: "OĂč aimerais-tu voyager ?",
answers: ["à la plage", "En montagne", "Dans l'espace", "Sous l'océan"],
difficulty: 2
}, {
question: "Quel mĂ©tier te fait rĂȘver ?",
answers: ["Docteur", "Astronaute", "Artiste", "Enseignant"],
difficulty: 2
}, {
question: "Comment préfÚres-tu apprendre ?",
answers: ["En lisant", "En écoutant", "En pratiquant", "En imaginant"],
difficulty: 2
}, {
question: "Quelle est ta plus grande peur ?",
answers: ["Le noir", "Les monstres", "Ătre seul", "L'Ă©chec"],
difficulty: 3
}, {
question: "Si tu trouvais un trésor, que ferais-tu ?",
answers: ["Le garder", "Le partager", "Le cacher", "L'échanger"],
difficulty: 2
}, {
question: "Quel livre aimerais-tu écrire ?",
answers: ["Une aventure", "Une histoire d'amour", "Un livre de magie", "Une encyclopédie"],
difficulty: 3
}, {
question: "Comment résous-tu les problÚmes ?",
answers: ["Seul", "Avec de l'aide", "En réfléchissant longtemps", "Rapidement"],
difficulty: 3
}, {
question: "Quel est ton rĂȘve le plus fou ?",
answers: ["Devenir célÚbre", "Sauver le monde", "Découvrir un nouveau pays", "Parler aux animaux"],
difficulty: 3
}, {
question: "Que collectionnes-tu ?",
answers: ["Des pierres", "Des autocollants", "Des livres", "Des souvenirs"],
difficulty: 1
}, {
question: "Comment te vois-tu dans 10 ans ?",
answers: ["Heureux", "Riche", "CélÚbre", "Sage"],
difficulty: 3
}, {
question: "Quel est ton jeu préféré ?",
answers: ["Cache-cache", "Jeux vidéo", "Sports", "Jeux de société"],
difficulty: 1
}, {
question: "Quelle invention aimerais-tu créer ?",
answers: ["Un robot", "Une machine volante", "Un remÚde magique", "Un téléporteur"],
difficulty: 3
}, {
question: "Comment exprimes-tu tes émotions ?",
answers: ["Par des mots", "Par l'art", "Par la musique", "Par le silence"],
difficulty: 2
}, {
question: "Quel don aimerais-tu avoir ?",
answers: ["Guérir les gens", "Prédire l'avenir", "Comprendre les animaux", "Voler"],
difficulty: 2
}, {
question: "Comment organises-tu ta chambre ?",
answers: ["TrÚs rangée", "Un peu désordonnée", "Créative", "Pratique"],
difficulty: 1
}, {
question: "Quelle langue aimerais-tu parler ?",
answers: ["Le langage des dauphins", "Le langage des arbres", "Le langage des étoiles", "Toutes les langues"],
difficulty: 2
}, {
question: "Si tu étais invisible pour une journée ?",
answers: ["J'aiderais les gens", "J'explorerais", "Je ferais des blagues", "J'apprendrais des secrets"],
difficulty: 2
}, {
question: "Quel élément représente ton ùme ?",
answers: ["Le feu", "L'eau", "La terre", "L'air"],
difficulty: 3
}, {
question: "Comment voudrais-tu ĂȘtre rappelĂ© ?",
answers: ["Comme quelqu'un de gentil", "Comme un héros", "Comme un génie", "Comme un ami fidÚle"],
difficulty: 3
}, {
question: "Quelle serait ta maison idéale ?",
answers: ["Dans les arbres", "Sous l'eau", "Dans les nuages", "Sous terre"],
difficulty: 2
}, {
question: "Quel message voudrais-tu transmettre au monde ?",
answers: ["Soyez gentils", "Suivez vos rĂȘves", "ProtĂ©gez la nature", "Aimez-vous les uns les autres"],
difficulty: 3
}, {
question: "Comment choisis-tu tes amis ?",
answers: ["Par le cĆur", "Par les intĂ©rĂȘts communs", "Par la loyautĂ©", "Par le hasard"],
difficulty: 2
}, {
question: "Quelle serait ta devise ?",
answers: ["Jamais abandonner", "Toujours sourire", "Aider les autres", "Rester curieux"],
difficulty: 3
}, {
question: "Si tu pouvais changer une chose dans le monde ?",
answers: ["ArrĂȘter la pollution", "Ăliminer la tristesse", "Donner de la magie Ă tous", "CrĂ©er la paix"],
difficulty: 3
}, {
question: "Quel trait de caractÚre te définit le mieux ?",
answers: ["La générosité", "La curiosité", "Le courage", "La créativité"],
difficulty: 2
}, {
question: "Comment veux-tu passer ton temps libre ?",
answers: ["En crĂ©ant", "En explorant", "En aidant", "En rĂȘvant"],
difficulty: 2
}, {
question: "Quelle serait ta baguette magique idéale ?",
answers: ["En bois d'étoile", "En cristal de lune", "En branche d'arbre ancien", "En rayon de soleil"],
difficulty: 2
}, {
question: "Quel est ton plus grand talent caché ?",
answers: ["Faire rire", "Ăcouter", "Imaginer", "Comprendre"],
difficulty: 2
}, {
question: "Comment vois-tu l'avenir de l'humanité ?",
answers: ["Plein d'espoir", "Technologique", "Magique", "Uni"],
difficulty: 3
}];
self.currentQuestionIndex = 0;
self.wrongAnswers = 0;
self.update = function () {
self.x -= scrollSpeed;
// Check collision with Lisa
if (!self.encountered && self.intersects(lisa)) {
self.encountered = true;
self.startQuiz();
}
};
self.startQuiz = function () {
isPaused = true;
self.currentQuestionIndex = 0;
self.wrongAnswers = 0;
self.showQuestion();
};
self.showQuestion = function () {
// Create quiz UI
self.quizContainer = game.addChild(new Container());
self.quizContainer.x = 1024;
self.quizContainer.y = 1366;
// Background
var bg = self.quizContainer.addChild(LK.getAsset('challengeBox', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2,
scaleY: 1.0
}));
bg.alpha = 0.9;
bg.tint = 0xFF1493;
// Title
var titleText = self.quizContainer.addChild(new Text2('Lylou et Sandra - Les Jumelles Curieuses', {
size: 30,
fill: 0xFFFFFF
}));
titleText.anchor.set(0.5, 0.5);
titleText.y = -150;
// Question
var currentQuestion = self.questions[self.currentQuestionIndex];
var questionText = self.quizContainer.addChild(new Text2(currentQuestion.question, {
size: 30,
fill: 0xFFFFFF
}));
questionText.anchor.set(0.5, 0.5);
questionText.y = -80;
// Answer buttons
self.answerButtons = [];
for (var i = 0; i < currentQuestion.answers.length; i++) {
var buttonContainer = self.quizContainer.addChild(new Container());
buttonContainer.x = 0;
buttonContainer.y = -20 + i * 50;
buttonContainer.answerIndex = i;
var buttonBg = buttonContainer.addChild(LK.getAsset('challengeBox', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.15
}));
buttonBg.tint = 0xFFB6C1;
buttonBg.alpha = 0.8;
var buttonText = buttonContainer.addChild(new Text2(i + 1 + '. ' + currentQuestion.answers[i], {
size: 26,
fill: 0x000000
}));
buttonText.anchor.set(0.5, 0.5);
buttonContainer.down = function (x, y, obj) {
this.alpha = 0.7;
var container = this;
LK.setTimeout(function () {
container.alpha = 1;
}, 100);
self.processAnswer(container.answerIndex);
};
self.answerButtons.push(buttonContainer);
}
};
self.processAnswer = function (answerIndex) {
// For the twins, any answer can be "wrong" to make it harder
var isCorrect = Math.random() < 0.6; // 60% chance of being "correct"
if (isCorrect || self.currentQuestionIndex >= self.questions.length - 1) {
self.onSuccess();
} else {
self.wrongAnswers++;
self.onWrongAnswer();
}
};
self.onSuccess = function () {
lipoints.lollipop += 6;
updateLipointsDisplay();
checkLevelUp();
self.showResultMessage('Bravo ! Les jumelles t\'offrent 6 LIPOINTS de sucettes !', 0x00FF00);
LK.getSound('success').play();
LK.setTimeout(function () {
self.closeQuiz();
}, 5000);
};
self.onWrongAnswer = function () {
if (self.currentQuestionIndex < self.questions.length - 1) {
self.showResultMessage('Les jumelles veulent une question plus difficile !', 0xFFFF00);
LK.setTimeout(function () {
self.currentQuestionIndex++;
self.quizContainer.destroy();
self.showQuestion();
}, 2000);
} else {
// If we've run out of questions, they have to accept the last answer
self.onSuccess();
}
};
self.showResultMessage = function (message, color) {
var resultText = self.quizContainer.addChild(new Text2(message, {
size: 30,
fill: color
}));
resultText.anchor.set(0.5, 0.5);
resultText.y = 120;
};
self.closeQuiz = function () {
if (self.quizContainer) {
self.quizContainer.destroy();
}
isPaused = false;
self.destroy();
characters.splice(characters.indexOf(self), 1);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game variables
var lisa;
var trees = [];
var bubbles = [];
var activeChallenge = null;
var isPaused = false;
var characters = [];
var magicBubbles = [];
// Character spawn tracking
var stellaSpawnTracker = 0;
var stellaSpawned = false;
var margotSpawnCounter = 0;
var margotSpawned = false;
var chafeeCanSpawn = false;
var chafeeSpawned = false;
var chafeeCurrentCycle = -1;
var maliciaSpawnCounter = 0;
var maliciaSpawnedThisCycle = 0;
var maliciaCurrentCycle = -1;
var twinsSpawnCounter = 0;
var twinsSpawned = false;
// New character spawn tracking
var dogieSpawnCounter = 0;
var dogieSpawned = false;
var estellaSpawnCounter = 0;
var estellaSpawned = false;
var mazzSpawnCounter = 0;
var mazzSpawned = false;
// Scrolling
var scrollSpeed = 3;
var cameraX = 0;
// Quiz questions databases in French
var destinyQuestions = [{
question: "Quel sera ton plus grand rĂȘve dans la vie ?",
answers: ["Devenir célÚbre", "Aider les autres", "Découvrir le monde", "Créer quelque chose de beau"],
correct: 1
}, {
question: "Quelle couleur représente le mieux ton avenir ?",
answers: ["Rouge passion", "Bleu sérénité", "Vert nature", "Jaune soleil"],
correct: 2
}, {
question: "Quel animal te guidera dans ta destinée ?",
answers: ["Un chat mystérieux", "Un chien fidÚle", "Un oiseau libre", "Un dauphin sage"],
correct: 3
}, {
question: "Dans quel endroit trouveras-tu ton bonheur ?",
answers: ["En montagne", "Au bord de la mer", "Dans une forĂȘt", "Dans une grande ville"],
correct: 1
}, {
question: "Quel pouvoir magique aimerais-tu avoir ?",
answers: ["Lire dans les pensées", "Voler dans le ciel", "Parler aux animaux", "ContrÎler le temps"],
correct: 2
}, {
question: "Quelle est ta plus grande peur Ă surmonter ?",
answers: ["Le noir", "Les araignĂ©es", "Ătre seul(e)", "L'Ă©chec"],
correct: 3
}, {
question: "Quel métier feras-tu plus tard ?",
answers: ["Médecin", "Artiste", "Enseignant", "Aventurier"],
correct: 0
}, {
question: "Combien d'enfants auras-tu ?",
answers: ["Aucun", "Un ou deux", "Trois ou quatre", "Beaucoup"],
correct: 1
}, {
question: "Dans combien de pays voyageras-tu ?",
answers: ["Moins de 5", "Entre 5 et 10", "Entre 10 et 20", "Plus de 20"],
correct: 2
}, {
question: "Ă quel Ăąge trouveras-tu l'amour ?",
answers: ["Avant 20 ans", "Entre 20 et 30 ans", "Entre 30 et 40 ans", "AprĂšs 40 ans"],
correct: 1
}, {
question: "Quelle sera ta plus grande réussite ?",
answers: ["Professionnelle", "Familiale", "Artistique", "Sportive"],
correct: 1
}, {
question: "Quel trésor découvriras-tu ?",
answers: ["De l'or", "Des diamants", "Un livre magique", "Une carte secrĂšte"],
correct: 2
}, {
question: "Quelle planĂšte visiteras-tu en premier ?",
answers: ["Mars", "Venus", "Jupiter", "Saturne"],
correct: 0
}, {
question: "Quel super-héros deviendras-tu ?",
answers: ["Captain Courage", "Wonder Wisdom", "Magic Master", "Super Smile"],
correct: 1
}, {
question: "Quelle invention créeras-tu ?",
answers: ["Une machine à bonheur", "Un téléporteur", "Une potion magique", "Un robot ami"],
correct: 0
}, {
question: "Quel monstre amical rencontreras-tu ?",
answers: ["Un dragon gentil", "Une licorne dorée", "Un géant souriant", "Une fée malicieuse"],
correct: 1
}, {
question: "Quelle étoile éclairera ton chemin ?",
answers: ["L'étoile polaire", "Une étoile filante", "L'étoile du berger", "Une constellation magique"],
correct: 3
}, {
question: "Quel don développeras-tu ?",
answers: ["Le chant", "La danse", "La peinture", "La cuisine"],
correct: 2
}, {
question: "Quelle surprise t'attend demain ?",
answers: ["Un cadeau", "Une nouvelle amitié", "Une découverte", "Une aventure"],
correct: 1
}, {
question: "Quel sera ton animal de compagnie ?",
answers: ["Un chat magique", "Un chien volant", "Un lapin parlant", "Un oiseau chanteur"],
correct: 0
}, {
question: "Dans quel chĂąteau vivras-tu ?",
answers: ["Un chĂąteau de glace", "Un chĂąteau de nuages", "Un chĂąteau sous-marin", "Un chĂąteau dans les arbres"],
correct: 3
}, {
question: "Quel fruit magique goûteras-tu ?",
answers: ["Une pomme dorée", "Une poire argentée", "Une fraise géante", "Un raisin arc-en-ciel"],
correct: 0
}, {
question: "Quelle danse apprendras-tu ?",
answers: ["La danse des étoiles", "La danse des fleurs", "La danse des vagues", "La danse du vent"],
correct: 1
}, {
question: "Quel livre magique liras-tu ?",
answers: ["Le livre des secrets", "Le livre des rĂȘves", "Le livre du temps", "Le livre des souhaits"],
correct: 3
}, {
question: "Quelle potion prépareras-tu ?",
answers: ["Potion de courage", "Potion de sagesse", "Potion de joie", "Potion d'amitié"],
correct: 2
}, {
question: "Quel véhicule magique conduiras-tu ?",
answers: ["Un tapis volant", "Une voiture nuage", "Un bateau-étoile", "Un train-arc-en-ciel"],
correct: 0
}, {
question: "Quelle couronne porteras-tu ?",
answers: ["Couronne de fleurs", "Couronne d'étoiles", "Couronne de cristal", "Couronne de lumiÚre"],
correct: 1
}, {
question: "Quel jardin secret découvriras-tu ?",
answers: ["Jardin de roses", "Jardin de papillons", "Jardin de cristaux", "Jardin de musique"],
correct: 2
}, {
question: "Quelle magie maĂźtriseras-tu ?",
answers: ["Magie des Ă©lĂ©ments", "Magie des Ă©motions", "Magie des saisons", "Magie des rĂȘves"],
correct: 3
}, {
question: "Quel cadeau recevras-tu ?",
answers: ["Une baguette magique", "Un collier enchanté", "Des bottes de sept lieues", "Un miroir parlant"],
correct: 0
}, {
question: "Quelle pierre précieuse guidera ta destinée ?",
answers: ["Diamant de vĂ©ritĂ©", "Rubis d'amour", "Ămeraude d'espoir", "Saphir de sagesse"],
correct: 2
}, {
question: "Quel élément naturel résonne avec ton ùme ?",
answers: ["Le feu passionné", "L'eau fluide", "La terre stable", "L'air libre"],
correct: 1
}, {
question: "Dans quelle époque aurais-tu vécu ?",
answers: ["L'Ăgypte antique", "Le Moyen Ăge", "La Renaissance", "L'Ă©poque moderne"],
correct: 2
}, {
question: "Quel mystÚre résoudras-tu ?",
answers: ["L'Atlantide perdue", "Les pyramides", "Les crop circles", "Le triangle des Bermudes"],
correct: 0
}, {
question: "Quelle est ta mission secrĂšte ?",
answers: ["Protéger la nature", "Sauver les animaux", "Découvrir des trésors", "Unir les peuples"],
correct: 3
}, {
question: "Quel talent caché possÚdes-tu ?",
answers: ["Télépathie", "Clairvoyance", "Guérison", "Prémonition"],
correct: 1
}, {
question: "Dans quel royaume magique appartiens-tu ?",
answers: ["Royaume des nuages", "Royaume des ocĂ©ans", "Royaume des forĂȘts", "Royaume des Ă©toiles"],
correct: 3
}, {
question: "Quel sera ton compagnon de route ?",
answers: ["Un phoenix", "Un dragon blanc", "Une licorne", "Un loup argenté"],
correct: 2
}, {
question: "Quelle légende incarneras-tu ?",
answers: ["Le héros courageux", "La sage protectrice", "L'explorateur intrépide", "Le guérisseur bienveillant"],
correct: 1
}, {
question: "Quel secret de l'univers découvriras-tu ?",
answers: ["L'origine des étoiles", "Le langage des planÚtes", "La musique des sphÚres", "La danse du cosmos"],
correct: 2
}, {
question: "Quelle transformation t'attend ?",
answers: ["Devenir immortel", "Acquérir la sagesse absolue", "Maßtriser tous les éléments", "Comprendre tous les langages"],
correct: 1
}, {
question: "Quel cadeau apporteras-tu au monde ?",
answers: ["La paix éternelle", "La joie infinie", "L'amour universel", "La sagesse divine"],
correct: 2
}, {
question: "Dans quel temple trouveras-tu la vérité ?",
answers: ["Temple du soleil", "Temple de la lune", "Temple des Ă©toiles", "Temple du cĆur"],
correct: 3
}, {
question: "Quelle prophétie se réalisera grùce à toi ?",
answers: ["Le retour de la lumiÚre", "L'harmonie des éléments", "La réconciliation des mondes", "L'éveil de la conscience"],
correct: 3
}, {
question: "Quel héritage laisseras-tu ?",
answers: ["Un royaume prospĂšre", "Une Ćuvre d'art Ă©ternelle", "Une dĂ©couverte rĂ©volutionnaire", "Un exemple d'amour"],
correct: 3
}];
var lollipopQuestions = [{
question: "Quelle est la saveur de sucette la plus populaire ?",
answers: ["Fraise", "Pomme", "Cerise", "Orange"],
correct: 0
}, {
question: "De quelle couleur est une sucette Ă la menthe ?",
answers: ["Rouge", "Jaune", "Verte", "Bleue"],
correct: 2
}, {
question: "Combien de calories contient une petite sucette ?",
answers: ["20-30", "50-60", "80-90", "100-110"],
correct: 0
}, {
question: "Dans quel pays a été inventée la sucette ?",
answers: ["France", "Ătats-Unis", "Angleterre", "Allemagne"],
correct: 1
}, {
question: "Quel est l'ingrédient principal d'une sucette ?",
answers: ["Chocolat", "Sucre", "Miel", "Sirop"],
correct: 1
}, {
question: "Comment appelle-t-on une sucette géante ?",
answers: ["Mega-pop", "Super-sucette", "Lolly géante", "Maxi-pop"],
correct: 0
}, {
question: "Quelle forme ont la plupart des sucettes ?",
answers: ["Carrée", "Triangulaire", "Ronde", "Ovale"],
correct: 2
}, {
question: "Combien de temps faut-il pour finir une sucette moyenne ?",
answers: ["5 minutes", "15 minutes", "30 minutes", "1 heure"],
correct: 1
}, {
question: "Quelle sucette change de couleur en la léchant ?",
answers: ["Rainbow pop", "Color-pop", "Magic pop", "Change-pop"],
correct: 2
}, {
question: "Quel animal trouve-t-on sur certaines sucettes ?",
answers: ["Chat", "Chien", "Coq", "Tous"],
correct: 3
}, {
question: "Quelle sucette fait du bruit ?",
answers: ["Whistle pop", "Sound pop", "Music pop", "Noise pop"],
correct: 0
}, {
question: "Dans quel film voit-on des sucettes magiques ?",
answers: ["Charlie et la chocolaterie", "Harry Potter", "Shrek", "Frozen"],
correct: 0
}, {
question: "Quelle est la plus grosse sucette du monde ?",
answers: ["1 kg", "5 kg", "10 kg", "37 kg"],
correct: 3
}, {
question: "Combien de saveurs peut avoir une sucette arc-en-ciel ?",
answers: ["3", "5", "7", "10"],
correct: 2
}, {
question: "Quel goût bizarre peut avoir une sucette ?",
answers: ["Pizza", "Fromage", "Poisson", "Tous"],
correct: 3
}, {
question: "Quelle sucette est bonne pour la gorge ?",
answers: ["Au miel", "Au citron", "Ă l'eucalyptus", "Toutes"],
correct: 3
}, {
question: "Comment s'appelle le bĂąton de la sucette ?",
answers: ["Stick", "Tige", "BĂątonnet", "Tous"],
correct: 3
}, {
question: "Quelle sucette peut exploser en bouche ?",
answers: ["Pop rocks", "Bubble pop", "Crack pop", "Bang pop"],
correct: 0
}, {
question: "Dans quelle décennie les sucettes sont devenues populaires ?",
answers: ["1920", "1940", "1960", "1980"],
correct: 1
}, {
question: "Quelle forme de sucette est la plus rigolote ?",
answers: ["Dinosaure", "Voiture", "Fleur", "Toutes"],
correct: 3
}, {
question: "Combien coûte une sucette classique ?",
answers: ["0,50âŹ", "1âŹ", "2âŹ", "5âŹ"],
correct: 0
}, {
question: "Quelle sucette a un goût piquant ?",
answers: ["Piment", "Poivre", "Gingembre", "Toutes"],
correct: 3
}, {
question: "Dans quel magasin trouve-t-on le plus de sucettes ?",
answers: ["Boulangerie", "Confiserie", "Supermarché", "Pharmacie"],
correct: 1
}, {
question: "Quelle sucette brille dans le noir ?",
answers: ["Glow pop", "Fluo pop", "Light pop", "Bright pop"],
correct: 0
}, {
question: "Combien de sucettes mange un enfant par mois ?",
answers: ["2-3", "5-6", "10-12", "15-20"],
correct: 1
}, {
question: "Quelle sucette a plusieurs couches ?",
answers: ["Layer pop", "Multi pop", "Gobstopper", "Stack pop"],
correct: 2
}, {
question: "Quel est le problĂšme avec les sucettes ?",
answers: ["Caries", "Mal au ventre", "Taches", "Tous"],
correct: 3
}, {
question: "Quelle sucette fond le plus vite ?",
answers: ["Au chocolat", "Au caramel", "Aux fruits", "Ă la glace"],
correct: 3
}, {
question: "Combien de sucettes sont vendues par jour dans le monde ?",
answers: ["1 million", "10 millions", "100 millions", "1 milliard"],
correct: 2
}, {
question: "Quelle sucette a été inventée par accident ?",
answers: ["Sucette classique", "Chupa Chups", "Dum Dum", "Blow Pop"],
correct: 0
}, {
question: "Dans quelle saison mange-t-on le plus de sucettes ?",
answers: ["Printemps", "ĂtĂ©", "Automne", "Hiver"],
correct: 1
}, {
question: "Quelle sucette peut servir de sifflet ?",
answers: ["Whistle pop", "Sound stick", "Music lolly", "Sing pop"],
correct: 0
}, {
question: "Combien de temps peut se conserver une sucette ?",
answers: ["1 semaine", "1 mois", "6 mois", "2 ans"],
correct: 3
}, {
question: "Quelle est la sucette la plus célÚbre ?",
answers: ["Chupa Chups", "Lollipop", "Dum Dum", "Blow Pop"],
correct: 0
}, {
question: "Quel ùge a la plus vieille sucette retrouvée ?",
answers: ["50 ans", "100 ans", "500 ans", "4000 ans"],
correct: 3
}, {
question: "Quelle sucette a une surprise à l'intérieur ?",
answers: ["Surprise pop", "Chupa Chups Melody", "Wonder Ball", "Kinder pop"],
correct: 2
}, {
question: "Combien de léchouilles faut-il pour finir un Chupa Chups ?",
answers: ["144", "252", "364", "500"],
correct: 2
}, {
question: "Quelle sucette contient de la vitamine C ?",
answers: ["Citron", "Orange", "Tous les agrumes", "Toutes"],
correct: 2
}, {
question: "Quel est le record du monde de la plus petite sucette ?",
answers: ["1mm", "3mm", "5mm", "1cm"],
correct: 0
}, {
question: "Quelle sucette peut changer de température ?",
answers: ["Ice pop", "Fire pop", "Thermo pop", "Magic temp"],
correct: 2
}, {
question: "Dans quel pays mange-t-on le plus de sucettes ?",
answers: ["USA", "Japon", "Brésil", "Mexique"],
correct: 3
}, {
question: "Quelle sucette a été créée pour les astronautes ?",
answers: ["Space pop", "Galaxy lolly", "Astro candy", "Zero-G pop"],
correct: 0
}, {
question: "Combien de sucettes peut-on faire avec 1kg de sucre ?",
answers: ["50", "100", "200", "300"],
correct: 1
}, {
question: "Quelle sucette contient des insectes comestibles ?",
answers: ["Cricket pop", "Ant lolly", "Scorpion candy", "Toutes"],
correct: 3
}, {
question: "Quel goût de sucette est le plus rare ?",
answers: ["Bacon", "Ail", "Wasabi", "Durian"],
correct: 3
}, {
question: "Combien de temps faut-il pour fabriquer une sucette ?",
answers: ["30 secondes", "2 minutes", "5 minutes", "10 minutes"],
correct: 1
}, {
question: "Quelle sucette peut servir de thermomĂštre ?",
answers: ["Thermo pop", "Temp lolly", "Heat candy", "Fever pop"],
correct: 0
}, {
question: "Dans quelle usine produit-on le plus de sucettes ?",
answers: ["Chupa Chups Espagne", "Perfetti Van Melle", "Tootsie Pop USA", "Haribo Allemagne"],
correct: 0
}, {
question: "Quelle sucette coûte le plus cher au monde ?",
answers: ["Or 24 carats", "Diamant lolly", "Truffe pop", "Caviar candy"],
correct: 0
}, {
question: "Combien de sucettes sont jetées chaque jour ?",
answers: ["1 million", "5 millions", "10 millions", "50 millions"],
correct: 2
}, {
question: "Quelle sucette aide Ă arrĂȘter de fumer ?",
answers: ["Nicotine pop", "Fresh lolly", "Stop candy", "Quit pop"],
correct: 0
}, {
question: "Quel animal ne peut pas manger de sucettes ?",
answers: ["Chien", "Chat", "Oiseau", "Tous"],
correct: 3
}, {
question: "Combien de bactéries y a-t-il sur une sucette léchée ?",
answers: ["1000", "10000", "100000", "1 million"],
correct: 3
}, {
question: "Quelle sucette contient de l'alcool ?",
answers: ["Champagne pop", "Vodka lolly", "Whisky candy", "Toutes"],
correct: 3
}, {
question: "Dans quel musée peut-on voir des sucettes géantes ?",
answers: ["Musée des bonbons", "Smithsonian", "Louvre", "British Museum"],
correct: 0
}];
var oceanQuestions = [{
question: "Quel est le plus grand océan du monde ?",
answers: ["Atlantique", "Indien", "Pacifique", "Arctique"],
correct: 2
}, {
question: "Combien d'océans y a-t-il sur Terre ?",
answers: ["3", "4", "5", "6"],
correct: 2
}, {
question: "Quel animal est le plus gros de l'océan ?",
answers: ["Requin", "Baleine bleue", "Pieuvre géante", "Raie manta"],
correct: 1
}, {
question: "Ă quelle profondeur peut-on trouver la fosse des Mariannes ?",
answers: ["5000m", "8000m", "11000m", "15000m"],
correct: 2
}, {
question: "Quel pourcentage de la Terre est couvert par les océans ?",
answers: ["50%", "60%", "70%", "80%"],
correct: 2
}, {
question: "Comment s'appelle le mouvement de l'eau dans l'océan ?",
answers: ["Vague", "Courant", "Marée", "Tous"],
correct: 3
}, {
question: "Quel poisson peut voler au-dessus de l'eau ?",
answers: ["Poisson-volant", "Thon", "Sardine", "Maquereau"],
correct: 0
}, {
question: "Quelle est la température de l'eau au fond de l'océan ?",
answers: ["0°C", "4°C", "10°C", "20°C"],
correct: 1
}, {
question: "Combien de sel contient l'eau de mer ?",
answers: ["1%", "3.5%", "7%", "10%"],
correct: 1
}, {
question: "Quel animal peut changer de couleur sous l'eau ?",
answers: ["Poisson-clown", "Pieuvre", "Ătoile de mer", "Crabe"],
correct: 1
}, {
question: "Comment respire un dauphin ?",
answers: ["Avec des branchies", "Par la peau", "Avec des poumons", "Par la bouche"],
correct: 2
}, {
question: "Quelle est la vitesse d'un tsunami ?",
answers: ["50 km/h", "200 km/h", "500 km/h", "800 km/h"],
correct: 3
}, {
question: "Combien d'espĂšces marines sont encore inconnues ?",
answers: ["50%", "70%", "80%", "95%"],
correct: 2
}, {
question: "Quel requin est le plus dangereux ?",
answers: ["Requin blanc", "Requin tigre", "Requin marteau", "Tous égaux"],
correct: 0
}, {
question: "Ă quelle profondeur la lumiĂšre disparaĂźt-elle ?",
answers: ["100m", "200m", "500m", "1000m"],
correct: 3
}, {
question: "Combien pĂšse une baleine bleue ?",
answers: ["50 tonnes", "100 tonnes", "150 tonnes", "200 tonnes"],
correct: 2
}, {
question: "Quel est l'animal le plus intelligent de l'océan ?",
answers: ["Dauphin", "Pieuvre", "Baleine", "Tous"],
correct: 3
}, {
question: "Comment les poissons voient-ils sous l'eau ?",
answers: ["En noir et blanc", "En couleurs", "Flou", "TrĂšs net"],
correct: 1
}, {
question: "Quelle tortue vit le plus longtemps ?",
answers: ["Tortue verte", "Tortue imbriquée", "Tortue luth", "Tortue caouanne"],
correct: 0
}, {
question: "Combien de temps peut retenir sa respiration une baleine ?",
answers: ["10 minutes", "30 minutes", "1 heure", "2 heures"],
correct: 3
}, {
question: "Quel corail construit des récifs ?",
answers: ["Corail dur", "Corail mou", "Corail noir", "Tous"],
correct: 0
}, {
question: "Ă quelle vitesse nage un thon ?",
answers: ["20 km/h", "40 km/h", "70 km/h", "100 km/h"],
correct: 2
}, {
question: "Combien d'eau les océans contiennent-ils ?",
answers: ["1 milliard de litres", "1 trillion de litres", "1 quintillion de litres", "Impossible Ă mesurer"],
correct: 2
}, {
question: "Quel animal produit des perles ?",
answers: ["HuĂźtre", "Moule", "Coquille Saint-Jacques", "Toutes"],
correct: 3
}, {
question: "Comment les baleines communiquent-elles ?",
answers: ["Par des cris", "Par des chants", "Par des gestes", "Toutes"],
correct: 3
}, {
question: "Quel poisson a des dents trĂšs pointues ?",
answers: ["Piranha", "Barracuda", "Requin", "Tous"],
correct: 3
}, {
question: "Ă quelle profondeur vivent les poissons des abysses ?",
answers: ["1000m", "2000m", "4000m", "6000m+"],
correct: 3
}, {
question: "Combien d'Ćufs pond une tortue de mer ?",
answers: ["10-20", "50-100", "100-200", "200-300"],
correct: 2
}, {
question: "Quel mammifÚre marin a une défense ?",
answers: ["Morse", "Narval", "Phoque", "Tous"],
correct: 1
}, {
question: "Comment s'appelle le bébé de la baleine ?",
answers: ["Baleineau", "Petit", "Veau", "Tous"],
correct: 0
}, {
question: "Quelle algue peut devenir trĂšs grande ?",
answers: ["Kelp", "Varech", "Fucus", "Toutes"],
correct: 0
}, {
question: "Combien de cĆurs a une pieuvre ?",
answers: ["1", "2", "3", "4"],
correct: 2
}, {
question: "Quel poisson peut survivre hors de l'eau ?",
answers: ["Poisson-chat", "Anguille", "Mudskipper", "Tous"],
correct: 3
}, {
question: "à quelle température gÚle l'eau de mer ?",
answers: ["-2°C", "0°C", "2°C", "4°C"],
correct: 0
}, {
question: "Combien de plastique y a-t-il dans les océans ?",
answers: ["1 million de tonnes", "8 millions de tonnes", "50 millions de tonnes", "150 millions de tonnes"],
correct: 3
}, {
question: "Quel est l'animal marin le plus rapide ?",
answers: ["Dauphin", "Espadon", "Requin mako", "Marlins"],
correct: 1
}, {
question: "Combien de tentacules a une méduse ?",
answers: ["4", "8", "Variable", "Infini"],
correct: 2
}, {
question: "Quel poisson produit de l'électricité ?",
answers: ["Anguille électrique", "Raie torpille", "Poisson-chat électrique", "Tous"],
correct: 3
}, {
question: "Ă quelle profondeur vit le poisson le plus profond ?",
answers: ["5000m", "7000m", "8000m", "11000m"],
correct: 3
}, {
question: "Combien de dents peut avoir un requin dans sa vie ?",
answers: ["1000", "10000", "25000", "50000"],
correct: 2
}, {
question: "Quel est le plus petit poisson de l'océan ?",
answers: ["Gobie nain", "Poisson-lanterne", "Anchois", "Sardine"],
correct: 0
}, {
question: "Combien de kilomĂštres parcourt une baleine par an ?",
answers: ["5000 km", "15000 km", "25000 km", "50000 km"],
correct: 2
}, {
question: "Quel pourcentage de l'océan a été exploré ?",
answers: ["5%", "20%", "50%", "80%"],
correct: 0
}, {
question: "Combien d'années peut vivre une tortue marine ?",
answers: ["50 ans", "100 ans", "150 ans", "200 ans"],
correct: 2
}, {
question: "Quel animal marin a le cerveau le plus développé ?",
answers: ["Dauphin", "Cachalot", "Pieuvre", "Orque"],
correct: 1
}, {
question: "à quelle vitesse remonte une bulle d'air dans l'océan ?",
answers: ["1 m/s", "5 m/s", "10 m/s", "Variable"],
correct: 3
}, {
question: "Combien de litres d'eau filtre une baleine bleue par jour ?",
answers: ["1000 L", "10000 L", "100000 L", "1 million L"],
correct: 3
}, {
question: "Quel est le prédateur du grand requin blanc ?",
answers: ["Orque", "Cachalot", "Aucun", "L'homme"],
correct: 0
}, {
question: "Combien de plancton une baleine mange-t-elle par jour ?",
answers: ["100 kg", "1 tonne", "4 tonnes", "10 tonnes"],
correct: 2
}, {
question: "Quel poisson peut changer de sexe ?",
answers: ["Poisson-clown", "Mérou", "Labre", "Tous"],
correct: 3
}, {
question: "Ă quelle distance peut-on entendre le chant des baleines ?",
answers: ["10 km", "100 km", "1000 km", "10000 km"],
correct: 2
}, {
question: "Combien de fois son poids une étoile de mer peut-elle régénérer ?",
answers: ["1 fois", "2 fois", "5 fois", "EntiĂšrement"],
correct: 3
}, {
question: "Quel est l'ùge de la plus vieille créature marine ?",
answers: ["200 ans", "500 ans", "1000 ans", "4000 ans"],
correct: 3
}, {
question: "Combien de pression subit un poisson Ă 10000m ?",
answers: ["100 fois", "500 fois", "1000 fois", "1100 fois"],
correct: 3
}, {
question: "Quel pourcentage d'oxygÚne produit l'océan ?",
answers: ["30%", "50%", "70%", "90%"],
correct: 2
}];
// LIPOINTS system
var lipoints = storage.lipoints || {
light: 0,
destiny: 0,
shadow: 0,
lollipop: 0,
ocean: 0
};
var currentLevel = storage.currentLevel || 1;
var totalLipoints = storage.totalLipoints || 0;
// UI elements
var levelText = new Text2('Niveau: 1', {
size: 36,
fill: 0xFFFFFF
});
levelText.anchor.set(1, 0);
levelText.x = -20;
levelText.y = 20;
LK.gui.topRight.addChild(levelText);
var lipointsText = new Text2('', {
size: 24,
fill: 0xFFFFFF
});
lipointsText.anchor.set(1, 0);
lipointsText.y = 50;
LK.gui.topRight.addChild(lipointsText);
// Add custom background
var backgroundImage = game.addChild(LK.getAsset('customBackground', {
anchorX: 0,
anchorY: 0,
scaleX: 1,
scaleY: 1
}));
backgroundImage.x = 0;
backgroundImage.y = 0;
// Make sure background is behind all other elements
game.setChildIndex(backgroundImage, 0);
// Initialize Lisa
lisa = game.addChild(new Lisa());
lisa.x = 300;
lisa.y = 2000;
// Create initial trees
function createTree(x, y) {
var tree = game.addChild(new Tree());
tree.x = x;
tree.y = y;
trees.push(tree);
return tree;
}
// Create starting platform
createTree(300, 2200);
createTree(600, 2100);
createTree(900, 2000);
createTree(1200, 2150);
// Bubble types
var bubbleTypes = ['light', 'destiny', 'shadow', 'lollipop', 'ocean'];
function createBubble() {
if (bubbles.length < 3) {
var randomType = bubbleTypes[Math.floor(Math.random() * bubbleTypes.length)];
var bubble = game.addChild(new PowerBubble(randomType));
bubble.x = 2200 + Math.random() * 400;
bubble.y = 1800 + Math.random() * 400;
bubbles.push(bubble);
}
}
function resetLisaPosition() {
lisa.x = 300;
lisa.y = 2000;
lisa.velocityY = 0;
lisa.onGround = false;
}
function startChallenge(type) {
if (activeChallenge) return;
isPaused = true;
activeChallenge = game.addChild(new Challenge(type));
activeChallenge.x = 1024;
activeChallenge.y = 1366;
activeChallenge.setupChallenge();
}
function updateLipointsDisplay() {
var displayText = 'LIPOINTS:\n';
displayText += 'LumiĂšre: ' + lipoints.light + '\n';
displayText += 'Destin: ' + lipoints.destiny + '\n';
displayText += 'Ombre: ' + lipoints.shadow + '\n';
displayText += 'Sucettes: ' + lipoints.lollipop + '\n';
displayText += 'Océans: ' + lipoints.ocean;
lipointsText.setText(displayText);
// Save to storage
storage.lipoints = lipoints;
}
function checkLevelUp() {
totalLipoints = lipoints.light + lipoints.destiny + lipoints.shadow + lipoints.lollipop + lipoints.ocean;
var requiredPoints = 10 * Math.pow(2, currentLevel - 1);
if (totalLipoints >= requiredPoints && currentLevel < 50) {
currentLevel++;
levelText.setText('Niveau: ' + currentLevel);
storage.currentLevel = currentLevel;
storage.totalLipoints = totalLipoints;
// Check for game completion
if (currentLevel >= 50) {
var highestType = getHighestLipointType();
LK.setTimeout(function () {
LK.showYouWin();
}, 1000);
}
}
}
function getHighestLipointType() {
var highest = 0;
var highestType = 'light';
for (var type in lipoints) {
if (lipoints[type] > highest) {
highest = lipoints[type];
highestType = type;
}
}
return highestType;
}
function findSuitablePlatform() {
// Find a tree platform ahead of Lisa that's suitable for character placement
var minX = cameraX + 1000; // Spawn ahead of current view
var maxX = cameraX + 2500; // But not too far ahead
var suitableTrees = [];
for (var i = 0; i < trees.length; i++) {
var tree = trees[i];
if (tree.x >= minX && tree.x <= maxX) {
suitableTrees.push(tree);
}
}
if (suitableTrees.length > 0) {
var chosenTree = suitableTrees[Math.floor(Math.random() * suitableTrees.length)];
return {
x: chosenTree.x,
y: chosenTree.y - chosenTree.height / 2 - 40 // Position on top of tree
};
}
// Fallback to random position if no suitable trees found
return {
x: cameraX + 2048 + Math.random() * 200,
y: 1900 + Math.random() * 300
};
}
// Game controls
game.down = function (x, y, obj) {
if (activeChallenge) return;
lisa.jump();
};
// Game update loop
var treeSpawnTimer = 0;
var bubbleSpawnTimer = 0;
game.update = function () {
if (isPaused) return;
// Update camera following Lisa
cameraX = lisa.x - 400;
// Update background position for parallax scrolling effect
if (backgroundImage) {
backgroundImage.x = cameraX * 0.3; // Slower parallax movement
}
// Spawn trees
treeSpawnTimer++;
if (treeSpawnTimer > 60) {
// Spawn more frequently
var lastTree = trees[trees.length - 1];
var rightmostX = cameraX + 2048; // Right edge of screen
// Always ensure there are trees ahead of Lisa
while (!lastTree || lastTree.x < rightmostX + 800) {
var newX = lastTree ? lastTree.x + 250 + Math.random() * 150 : rightmostX + 300;
var newY = 1900 + Math.random() * 400;
var newTree = createTree(newX, newY);
lastTree = newTree;
// Prevent infinite loop - maximum 3 trees per update
if (trees.length > 0 && trees[trees.length - 1].x > rightmostX + 1200) break;
}
treeSpawnTimer = 0;
}
// Spawn bubbles
bubbleSpawnTimer++;
if (bubbleSpawnTimer > 180) {
createBubble();
bubbleSpawnTimer = 0;
}
// Clean up off-screen trees
for (var i = trees.length - 1; i >= 0; i--) {
if (trees[i].x < cameraX - 300) {
trees[i].destroy();
trees.splice(i, 1);
}
}
// Clean up off-screen bubbles
for (var i = bubbles.length - 1; i >= 0; i--) {
if (bubbles[i].x < cameraX - 300) {
bubbles[i].destroy();
bubbles.splice(i, 1);
}
}
// Clean up off-screen characters
for (var i = characters.length - 1; i >= 0; i--) {
if (characters[i].x < cameraX - 300) {
characters[i].destroy();
characters.splice(i, 1);
}
}
// Clean up off-screen magic bubbles
for (var i = magicBubbles.length - 1; i >= 0; i--) {
if (magicBubbles[i].x < cameraX - 300) {
magicBubbles[i].destroy();
magicBubbles.splice(i, 1);
}
}
// Character spawning logic
game.spawnCharacters();
};
// Initialize display
updateLipointsDisplay();
levelText.setText('Niveau: ' + currentLevel);
// Character spawning function
game.spawnCharacters = function () {
// 1. Stella - every 1000 lipoints after level 10
if (currentLevel >= 10) {
var currentTotalLipoints = lipoints.light + lipoints.destiny + lipoints.shadow + lipoints.lollipop + lipoints.ocean;
var stellaThreshold = Math.floor(currentTotalLipoints / 1000);
if (stellaThreshold > stellaSpawnTracker && !stellaSpawned) {
stellaSpawnTracker = stellaThreshold;
stellaSpawned = true;
game.createStella();
// Reset spawn flag when reaching next threshold
LK.setTimeout(function () {
stellaSpawned = false;
}, 10000); // Reset after 10 seconds to ensure one spawn per threshold
}
}
// 2. Margot - every 2 levels
if (currentLevel >= 2) {
var margotLevelThreshold = Math.floor(currentLevel / 2);
if (margotLevelThreshold > margotSpawnCounter && !margotSpawned) {
margotSpawnCounter = margotLevelThreshold;
margotSpawned = true;
game.createMargot();
// Reset spawn flag when level increases
LK.setTimeout(function () {
if (Math.floor(currentLevel / 2) > margotLevelThreshold) {
margotSpawned = false;
}
}, 3000);
}
}
// 3. Chafée - randomly once every 4 levels starting from level 12
if (currentLevel >= 12) {
var chafeeCycle = Math.floor((currentLevel - 12) / 4);
if (chafeeCycle > chafeeCurrentCycle) {
chafeeCurrentCycle = chafeeCycle;
chafeeSpawned = false; // Reset for new cycle
}
if (!chafeeSpawned && Math.random() < 0.02) {
// 2% chance per update, only once per cycle
chafeeSpawned = true;
game.createChafee();
}
}
// 4. Malicia - twice every 4 levels starting from level 19
if (currentLevel >= 19) {
var maliciaCycle = Math.floor((currentLevel - 19) / 4);
if (maliciaCycle > maliciaCurrentCycle) {
maliciaCurrentCycle = maliciaCycle;
maliciaSpawnedThisCycle = 0; // Reset for new cycle
}
if (maliciaSpawnedThisCycle < 2 && Math.random() < 0.01) {
// 1% chance per update, maximum twice per cycle
maliciaSpawnedThisCycle++;
game.createMalicia();
}
}
// 5. Twins - once every 3 levels starting from level 8
if (currentLevel >= 8) {
var twinsLevelThreshold = Math.floor((currentLevel - 8) / 3);
if (twinsLevelThreshold > twinsSpawnCounter && !twinsSpawned) {
twinsSpawnCounter = twinsLevelThreshold;
twinsSpawned = true;
game.createTwins();
// Reset spawn flag when level threshold increases
LK.setTimeout(function () {
if (Math.floor((currentLevel - 8) / 3) > twinsLevelThreshold) {
twinsSpawned = false;
}
}, 3000);
}
}
// 6. Dogie - once every level
if (currentLevel >= 1) {
if (currentLevel > dogieSpawnCounter && !dogieSpawned) {
dogieSpawnCounter = currentLevel;
dogieSpawned = true;
game.createDogie();
// Reset spawn flag when level increases
LK.setTimeout(function () {
if (currentLevel > dogieSpawnCounter) {
dogieSpawned = false;
}
}, 3000);
}
}
// 7. Estella - once every 3 levels starting from level 21
if (currentLevel >= 21) {
var estellaLevelThreshold = Math.floor((currentLevel - 21) / 3);
if (estellaLevelThreshold > estellaSpawnCounter && !estellaSpawned) {
estellaSpawnCounter = estellaLevelThreshold;
estellaSpawned = true;
game.createEstella();
// Reset spawn flag when level threshold increases
LK.setTimeout(function () {
if (Math.floor((currentLevel - 21) / 3) > estellaLevelThreshold) {
estellaSpawned = false;
}
}, 3000);
}
}
// 8. Mazz - once every 2 levels starting from level 24
if (currentLevel >= 24) {
var mazzLevelThreshold = Math.floor((currentLevel - 24) / 2);
if (mazzLevelThreshold > mazzSpawnCounter && !mazzSpawned) {
mazzSpawnCounter = mazzLevelThreshold;
mazzSpawned = true;
game.createMazz();
// Reset spawn flag when level threshold increases
LK.setTimeout(function () {
if (Math.floor((currentLevel - 24) / 2) > mazzLevelThreshold) {
mazzSpawned = false;
}
}, 3000);
}
}
};
game.createStella = function () {
var stella = game.addChild(new Stella());
var position = findSuitablePlatform();
stella.x = position.x;
stella.y = position.y;
characters.push(stella);
};
game.createMargot = function () {
var margot = game.addChild(new Margot());
var position = findSuitablePlatform();
margot.x = position.x;
margot.y = position.y;
characters.push(margot);
};
game.createChafee = function () {
var chafee = game.addChild(new Chafee());
var position = findSuitablePlatform();
chafee.x = position.x;
chafee.y = position.y;
characters.push(chafee);
};
game.createMalicia = function () {
var malicia = game.addChild(new Malicia());
var position = findSuitablePlatform();
malicia.x = position.x;
malicia.y = position.y;
characters.push(malicia);
};
game.createTwins = function () {
var twins = game.addChild(new Twins());
var position = findSuitablePlatform();
twins.x = position.x;
twins.y = position.y;
characters.push(twins);
};
game.createDogie = function () {
var dogie = game.addChild(new Dogie());
var position = findSuitablePlatform();
dogie.x = position.x;
dogie.y = position.y;
characters.push(dogie);
};
game.createEstella = function () {
var estella = game.addChild(new Estella());
var position = findSuitablePlatform();
estella.x = position.x;
estella.y = position.y;
characters.push(estella);
};
game.createMazz = function () {
var mazz = game.addChild(new Mazz());
var position = findSuitablePlatform();
mazz.x = position.x;
mazz.y = position.y;
characters.push(mazz);
};
// Start background music
LK.playMusic('background');
;
FeÌe. In-Game asset. 2d. High contrast. No shadows
Arbre magique rose. In-Game asset. 2d. High contrast. No shadows
Bulle de lumieÌre. In-Game asset. 2d. High contrast. No shadows
Bulle du destin. In-Game asset. 2d. High contrast. No shadows
Bulle de l'ombre. In-Game asset. 2d. High contrast. No shadows
Bulle de sucette. In-Game asset. 2d. High contrast. No shadows
Bulle de l'oceÌan. In-Game asset. 2d. High contrast. No shadows
Lampe torche. In-Game asset. 2d. High contrast. No shadows
Fond eÌcran sucette. In-Game asset. 2d. High contrast. No shadows
Fond d'eÌcran monde feÌerique. In-Game asset. 2d. High contrast. No shadows
fleÌche. In-Game asset. 2d. High contrast. No shadows
FeÌe stella. In-Game asset. 2d. High contrast. No shadows
FeÌe margot. In-Game asset. 2d. High contrast. No shadows
Chat feÌe. In-Game asset. 2d. High contrast. No shadows
La sorcieÌre Malicia. In-Game asset. 2d. High contrast. No shadows
Petite fille soeurs jumelles. In-Game asset. 2d. High contrast. No shadows
Bulle magique de mysteÌre. In-Game asset. 2d. High contrast. No shadows
Mazz le dragon. In-Game asset. 2d. High contrast. No shadows
Chien avec des ailes de feÌe. In-Game asset. 2d. High contrast. No shadows
Estella la dresseuse de pouvoirs. In-Game asset. 2d. High contrast. No shadows