User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'typeKey')' in or related to this line: 'selectPuppyType(obj.parent.typeKey);' Line Number: 1387
User prompt
Non, là il n'y a que les légendaires ! Chaque type de chiots (fantômes, sirènes , vampires, dragons) , doivent aussi avoir leur interface quand le joueur appuie dessus pour en acheter !
User prompt
chaque type de chiots doit avoir sa propre interface pour l'achat! La il y a seulement pour les légendaires ! Corrigé ça ↪💡 Consider importing and using the following plugins: @upit/storage.v1, @upit/tween.v1
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'typeKey')' in or related to this line: 'selectPuppyType(obj.parent.typeKey);' Line Number: 1387
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'name')' in or related to this line: 'var selectorTitle = new Text2('Combien de chiots ' + type.name + '?', {' Line Number: 1433
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'typeKey')' in or related to this line: 'selectPuppyType(obj.parent.typeKey);' Line Number: 1387
User prompt
Corrigé les problèmes
User prompt
Ajoute ces nouveautés a Hot-puppy : en plus, des chiots normaux, Le joueur peut acheter différents types supplémentaires de chiots (coût en SM) qui ont chacun leurs spécialités, les voici: 1) Chiots fantômes : le joueur peut en acheter 1 a 5 maximum par achat s'il est niveau inférieur a 10, Et de 1 jusqu'à 13 par achat s'il est niveau supérieur a 10, Les chiots fantômes sont simplement des chiots ignorés par Monsieur pervers et Gabriel, Monsieur pervers et Gabriel les ignorent, et ne les attrapent pas, ils ne les voient tout simplement pas, ce qui laisse le temps au joueur de les emmener facilement à la porte de la sortie, et gagner des chiens sauvés dans son score,! Le système des âges s'applique aux chiots fantômes, (Coûte 6 SM par achat) 2) Chiots Dragons : le joueur ne peut pas en acheter avant le niveau 7, le joueur peut en acheter 1 à 6 par achat s'il est de niveau inférieur à 20, et jusqu'à 15 par achat s'il est niveau supérieur a 20! Les chiots dragons, sont visibles et attrapables seulement par Monsieur pervers, et pas par Gabriel, Gabriel les ignores, Mais monsieur pervers peut les attraper de la même façon que les chiots normaux! les chiots dragons comptent triple quand le joueur les sauve! Le système d'âge ne s'applique pas aux chiots dragons (Coûte 15 SM par achat) 3) Chiots Sirènes : le joueur peut en acheter seulement s'il est au moins au niveau 10! le joueur peut en acheter seulement de 1 a 7 par achat s'il est niveau inférieur a 30, et jusqu'à 20 par achat s'il est niveau 30 au supérieur! Les chiots sirènes ne sont attrapables seulement par Gabriel, Monsieur pervers les ignore totalement, Et les chiots sirènes comptent quadruples quand le joueur les sauve! Le système d'âge ne s'applique pas aux chiots sirènes (coute 25 SM par achat) 4) Chiots Vampires : le joueur peut en acheter seulement à partir du niveau 15! le joueur peut en acheter de 1 a 9 par achat s'il est niveau inférieur a 40, et jusqu'à 25 s'il est niveau 40 au Supérieur ! les chiots vampires,sont attrapables par Gabriel et Monsieur pervers, mais endorment monsieur pervers pendant 2 minutes quand il attrape un chiot vampire ! les chiots vampires coûtent Cinquple lors de leur sauvetage ! Le système des âges ne s'applique pas aux chiots vampires (Coûte 50 SM par achat) 5) Chiots légendaires : disponible seulement pour les joueurs avances à partir du niveau 90! le joueur peut en acheter de 1 à 3 par achat s'il est niveau 90 a 150, Et jusqu'à 7 par achat s'il est niveau supérieur a 150 , jusqu'à la niveau maximal du jeu : le niveau 200! les chiots légendaires, ont tout les pouvoirs, ils sont ignorés par Monsieur pervers et Gabriel, les endorment pendant 10 minutes (que ce soit monsieur pervers ou même Gabriel), dès qu'ils rentrent en collision avec , et comptent, comme 20 chiots lors de leur sauvetage ! C'est vraiment les goals des chiots dans le jeu! (Coûte 1000 SM par achat) Le joueur peut acheter des chiots spéciaux disponibles pour son niveau, en appuyant sur un bouton rouge a texte noir "boutique", Un menu s'ouvre donc, avec la liste des types de chiots disponibles (avec ceux pas encore disponible pour le niveau du joueur grisé, sur lequels le joueur ne peut pas appuyer ni sélectionner pour acheter), Le joueur appuie donc sur le type de chiots spéciaux qu'ils veut acheter, Et le jeu lui demande via un écran qui s'affiche combien il veut en acheter, Il y a donc un keyboard simple bleu avec des touches qui représentent chaque chiffre, Pour que le joueur entre un chiffre et valide en appuyant sur valider! Les chiots spéciaux du type acheter ,et le nombre de chiots acheter apparaissent donc dans le jeu jusqu'à leur sauvetage ! ↪💡 Consider importing and using the following plugins: @upit/storage.v1, @upit/tween.v1
User prompt
Ajoute un système d'âge pour les chiots dans Hot-puppy : Chaque chiot a un âge aléatoire (entre 1 mois minimum et jusqu'à 20 mois maximum), l'âge de chaque chiot est écrit à côté de son nom au-dessus de sa tête, L'âge de chaque chiot ajoute une stratégie dans le jeu, sur quels chiots ils faut sauver les premiers, et lesquels faut laisser tomber! : Les chiots de moins de 10 mois, ou de 10 mois maximum (70 % des chiots du jeu), N'ont pas de compétences spéciales, Ils comptent comme un seul chiot lors de leur sauvetage ou de leur perte Mais les chiots de plus de 10 mois, donc 30 % des chiots, Sont plus précieux, Lors de leur sauvetage ils comptent comme 2 chiots sauvés ! ↪💡 Consider importing and using the following plugins: @upit/storage.v1, @upit/tween.v1
User prompt
Ajoute les assets pour Gabriel, Lucie et Eva !
User prompt
Ajoute ces nouveautés au jeu Hot-puppy : - Eva (9 ans, sœur de Samantha) : Eva, tout comme Samantha, n'est pas d'accord avec le business horrible de leur père (monsieur pervers), Eva, a le pouvoir d'invoquer Samantha, sans que le joueur est a l'invoquer lui même avec ses SM! Eva ne peut apparaître dans le jeu, seulement quand le joueur est niveau 5 au supérieur, Eva a 50% de chance d'apparaître tout les 6 chiots sauvé, Mais seulement si Samantha n'est pas déjà présente, Eva apparaît à l'écran, puis a une de chance d'invoquer Samantha, qui apparaît et endort monsieur pervers gratuitement sans que le joueur n'est a dépense des SMS, Mais Eva n'apparaît pas à chaque fois! Et même quand elle n'apparaît, la décision selon laquelle elle va invoquer Samantha ou non est aléatoire ! elle disparaît au bout de 15 secondes si elle n'a pas invoquer Samantha, ou des que Samantha arrive si Eva a invoquer Samantha - Gabriel (12 ans, frère de Samantha) : Gabriel, contrairement a Samantha ou Eva, N'est pas un allié du joueur, mais un allié de Monsieur pervers !! Il est d'accord avec le business de son père, Mais c'est seulement car il a peur de Monsieur pervers en vrai, Monsieur pervers tante d'invoquer son fils Gabriel tout les 3 chiots sauvé, Mais gabriel ne lui répond pas toujours, La décision selon laquelle Gabriel lui répond ou non, est aléatoire, Mais si Monsieur pervers réussit a invoquer son fils, il apparaît dans le jeu, et aide son père, Ça signifie, qu'il poursuit lui aussi les chiots pour les attraper, il est encore plus dangereux que son père, car Gabriel peut attraper les chiots avant même que le joueur n'appuie sur eux! La différence, est qu'il n'y a pas de game over ou de perte de points si ce n'est que Gabriel qui les a attrapé - Lucie (11 ans, autre sœur de Samantha) : Lucie est assez neutre par rapport a tout ça, Mais elle déteste que sa sœur Samantha demande beaucoup de SM pour une simple invocation pour des sauvetages normaux , c'est pour cela que Lucie peut diminuer temporairement le prix des SM requis pour invoquer Samantha!, Lucie apparaît dans le jeu toutes les 2 invocations de Samantha, Elle apparaît à l'écran durant 20 secondes, puis baisse le prix des SM requis a l'invocation de samantha de 60% durant 2 minutes ! Après ce temps, le prix normal de l'invocation est remis ! ↪💡 Consider importing and using the following plugins: @upit/tween.v1, @upit/storage.v1
User prompt
Attention, Samantha ne touche pas les chiots, elle ne leur veut aucun mal, et monsieur pervers ne peut rien faire aux chiots quand il est endormi
User prompt
Ajoute l'asset requis pour les apparitions de Samantha
User prompt
Ajoute cela au jeu Hot-puppy : Samanta (10 ans, fille de Monsieur pervers) : Samantha est la fille de Monsieur pervers, mais c'est une alliée du joueur dans le jeu, elle n'est pas d'accord avec le business tordu de son père, Et essaye d'aider le joueur, Mais attention, elle n'apparaît seulement quand certaines conditions sont remplis : - ajoute une monnaie du jeu : Les SM permettent d'invoquer Samantha, Pour invoquer Samantha , cela coûte 5 SM la première fois, Mais plus on l'invoque, plus le prix augmente, A chaque nouvelle invocation, Le prix d'invocation augmente de 30% le joueur gagne des SMS lorsqu'il sauve des chiots (le joueur gagne 3 SM par chiot sauver), Les SM du joueur sont sauvegarder entre les parties ! Le joueur garde ses SM, même après un game over, le joueur peut voir son nombre de SM posséder dans son ui a l'écran dans le jeu, pour invoquer Samantha, Le joueur appuie sur un bouton rose a texte blanc : "Invoque Sam", et Samantha apparaît a l'écran, elle se dirige vers monsieur pervers, quand Samantha est invoquer, monsieur pervers s'endort durant 6 minutes , Laissant le joueur sauver un maximum de chiots durant ce temps là, Puis, durant le temps écoulé, Samantha disparaît, et monsieur pervers se réveille ! ↪💡 Consider importing and using the following plugins: @upit/storage.v1, @upit/tween.v1
User prompt
Tout Les messages mesquins doivent avoir un lien avec le fait qu'il est mécontent car il voulait tuer les chiots et les servir en hot dog a ses clients
User prompt
Ajoute ça au jeu Hot-puppy : a chaque fois que le joueur sauve un chiot avec succès, Monsieur Pervers n'est pas content et un message aléatoire (parmi une base de données de 75 messages) mesquin s'affiche a l'écran en gras durant et disparaît au bout de 15 secondes ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Fait en sorte que le niveau maximal du jeu soit le niveau 200, et que le joueur recommence au niveau 1 une fois le niveau 200 atteint
User prompt
Ajoute une musique de fond en boucle au jeu
User prompt
De nouveaux chiots doivent être générer quand il y en a plus dans le jeu a l'écran. et le nombre de chiots a sauvé commence par 3 au niveau 1 pour passer au niveau 2, puis double après a chaque nouveau niveau par rapport au niveau précédent
Code edit (1 edits merged)
Please save this source code
User prompt
Hot-puppy
Initial prompt
Créer mon jeu "Hot-puppy", Un jeu dans lequel le joueur doit sauver des chiots, d'un fou nommée monsieur Pervers qui veut les tuer pour les cuisiner et les manger! Monsieur pervers veut transformer les chiots en hot dogs et les servir en tant que plat dans son restaurant horrible, Le but du joueur est d'éviter cela, et sauver la vie des chiots Plus le joueur sauve de chiots, plus il gagne des points et monte en niveau Voici comment se présente le jeu : Le jeu se déroule dans un restaurant (je mettrais un fond personnalisé de restaurant, Merci de me laisser choisir mon assiette personnalisé pour le fond du jeu), le jeu possède 200 niveaux, le jeu se présente ainsi : des chiots apparaissent aléatoirement a l'écran (1 seul à la fois si le joueur est de niveau inférieur a 5, entre 2 et 5 en même temps si le joueur est de niveau 5 a 10, et entre 5 et 10 a la fois si le joueur est de niveau supérieur à 10), De nouveaux chiots sont générer en jeu dans le restaurant, quand il y en a plus a l'écran. une porte de sortie se situe en bas du jeu, Le joueur doit déplacé chaque chiot un par un, vers la porte de sortie, quand le chiot entre en collision avec la porte de sortie, il disparaît, et il est sauvé, Le joueur gagne 1 chiot sauvé dans son score de chiots sauvé du jeu, le joueur déplace chaque chiot en appuyant sur le chiot, et en utilisant des bouttons directionnels pour le déplacer, Le fou monsieur pervers est aussi présent dans ce restaurant, il avance lentement, mais il est surtout occupé à faire cuire de la viande par-dessus une marmite (représente ça dans le jeu), il ne s'intéressera a un chiot, seulement à partir du moment où le joueur a appuyé dessus pour le déplacer, Il se dirigera alors doucement vers le chiot, Et il faudra que le joueur le fasse atteindre la porte de sortie avant que Monsieur pervers entre en collision avec le chiot, Sinon, le chiot disparaît, et le fou la eut! Le joueur perd 1 chiot sauvé dans son score de chiots sauvé Le joueur doit avoir sauvé 3 chiots pour passer du niveau 1 au niveau 2, 6 chiots pour passer du niveau 2 au niveau 3, Et à chaque nouveau niveau, le nombre de chiots a sauvé double par rapport au niveau précédent pour monter au niveau supérieur ! Le nom du fou est écrit au-dessus de lui dans le jeu, et chaque chiot a un nom généré aléatoirement par le jeu parmi une base de données de 50 noms de chiots différents, le nom de chaque chiot est écrit en dessous de lui Voilà!
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var DirectionalButton = Container.expand(function (direction) { var self = Container.call(this); var buttonGraphics = self.attachAsset(direction + 'button', { anchorX: 0.5, anchorY: 0.5 }); var buttonText = new Text2(direction.toUpperCase(), { size: 30, fill: 0x000000 }); buttonText.anchor.set(0.5, 0.5); self.addChild(buttonText); self.direction = direction; self.down = function (x, y, obj) { if (selectedPuppy && selectedPuppy.isSelected) { var moveDistance = 60; switch (self.direction) { case 'up': selectedPuppy.y -= moveDistance; break; case 'down': selectedPuppy.y += moveDistance; break; case 'left': selectedPuppy.x -= moveDistance; break; case 'right': selectedPuppy.x += moveDistance; break; } // Keep puppy within bounds selectedPuppy.x = Math.max(60, Math.min(1988, selectedPuppy.x)); selectedPuppy.y = Math.max(60, Math.min(2400, selectedPuppy.y)); } }; return self; }); var DragonPuppy = Container.expand(function () { var self = Container.call(this); var puppyGraphics = self.attachAsset('dragonpuppy', { anchorX: 0.5, anchorY: 0.5 }); puppyGraphics.tint = 0xff4444; // Red tint for dragon var puppyNames = ['Buddy', 'Max', 'Bella', 'Charlie', 'Lucy', 'Cooper', 'Luna', 'Bailey', 'Daisy', 'Rocky', 'Molly', 'Jack', 'Lola', 'Duke', 'Sadie', 'Tucker', 'Chloe', 'Bear', 'Sophie', 'Teddy', 'Roxy', 'Buster', 'Coco', 'Gus', 'Penny', 'Oscar', 'Nala', 'Milo', 'Rosie', 'Leo', 'Zoey', 'Zeus', 'Lily', 'Finn', 'Ruby', 'Ollie', 'Stella', 'Jasper', 'Ellie', 'Murphy', 'Maggie', 'Toby', 'Gracie', 'Oliver', 'Abby', 'Winston', 'Zoe', 'Bentley', 'Mia', 'Harley']; self.name = puppyNames[Math.floor(Math.random() * puppyNames.length)]; self.isSelected = false; self.moveSpeed = 8; self.lastX = 0; self.lastY = 0; self.type = 'dragon'; var nameText = new Text2(self.name + ' [Dragon]', { size: 35, fill: 0xff4444 }); nameText.anchor.set(0.5, 0.5); nameText.y = -80; self.addChild(nameText); self.down = function (x, y, obj) { selectedPuppy = self; // Clear all selections for (var i = 0; i < puppies.length; i++) { puppies[i].isSelected = false; puppies[i].tint = 0xFFFFFF; } for (var i = 0; i < ghostPuppies.length; i++) { ghostPuppies[i].isSelected = false; ghostPuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < dragonPuppies.length; i++) { dragonPuppies[i].isSelected = false; dragonPuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < sirenPuppies.length; i++) { sirenPuppies[i].isSelected = false; sirenPuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < vampirePuppies.length; i++) { vampirePuppies[i].isSelected = false; vampirePuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < legendaryPuppies.length; i++) { legendaryPuppies[i].isSelected = false; legendaryPuppies[i].tint = 0xFFFFFF; } self.isSelected = true; self.tint = 0xFFFF00; }; self.moveTowards = function (targetX, targetY) { var dx = targetX - self.x; var dy = targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > self.moveSpeed) { self.x += dx / distance * self.moveSpeed; self.y += dy / distance * self.moveSpeed; } else { self.x = targetX; self.y = targetY; } }; return self; }); var Eva = Container.expand(function () { var self = Container.call(this); var evaGraphics = self.attachAsset('eva', { anchorX: 0.5, anchorY: 0.5 }); var nameText = new Text2('Eva', { size: 40, fill: 0x9932CC }); nameText.anchor.set(0.5, 0.5); nameText.y = -100; self.addChild(nameText); return self; }); var Gabriel = Container.expand(function () { var self = Container.call(this); var gabrielGraphics = self.attachAsset('gabriel', { anchorX: 0.5, anchorY: 0.5 }); var nameText = new Text2('Gabriel', { size: 40, fill: 0x8B0000 }); nameText.anchor.set(0.5, 0.5); nameText.y = -100; self.addChild(nameText); self.moveSpeed = 4; self.targetPuppy = null; self.update = function () { if (selectedPuppy && selectedPuppy.isSelected) { self.targetPuppy = selectedPuppy; } if (self.targetPuppy) { var dx = self.targetPuppy.x - self.x; var dy = self.targetPuppy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > self.moveSpeed) { self.x += dx / distance * self.moveSpeed; self.y += dy / distance * self.moveSpeed; } } }; return self; }); var GhostPuppy = Container.expand(function () { var self = Container.call(this); var puppyGraphics = self.attachAsset('ghostpuppy', { anchorX: 0.5, anchorY: 0.5 }); puppyGraphics.alpha = 0.7; // Semi-transparent for ghost effect var puppyNames = ['Buddy', 'Max', 'Bella', 'Charlie', 'Lucy', 'Cooper', 'Luna', 'Bailey', 'Daisy', 'Rocky', 'Molly', 'Jack', 'Lola', 'Duke', 'Sadie', 'Tucker', 'Chloe', 'Bear', 'Sophie', 'Teddy', 'Roxy', 'Buster', 'Coco', 'Gus', 'Penny', 'Oscar', 'Nala', 'Milo', 'Rosie', 'Leo', 'Zoey', 'Zeus', 'Lily', 'Finn', 'Ruby', 'Ollie', 'Stella', 'Jasper', 'Ellie', 'Murphy', 'Maggie', 'Toby', 'Gracie', 'Oliver', 'Abby', 'Winston', 'Zoe', 'Bentley', 'Mia', 'Harley']; self.name = puppyNames[Math.floor(Math.random() * puppyNames.length)]; self.age = Math.floor(Math.random() * 20) + 1; // Random age between 1-20 months self.isSelected = false; self.moveSpeed = 8; self.lastX = 0; self.lastY = 0; self.type = 'ghost'; var nameText = new Text2(self.name + ' (' + self.age + ' mois) [Fantôme]', { size: 35, fill: 0x9999ff }); nameText.anchor.set(0.5, 0.5); nameText.y = -80; self.addChild(nameText); self.down = function (x, y, obj) { selectedPuppy = self; // Clear all selections for (var i = 0; i < puppies.length; i++) { puppies[i].isSelected = false; puppies[i].tint = 0xFFFFFF; } for (var i = 0; i < ghostPuppies.length; i++) { ghostPuppies[i].isSelected = false; ghostPuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < dragonPuppies.length; i++) { dragonPuppies[i].isSelected = false; dragonPuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < sirenPuppies.length; i++) { sirenPuppies[i].isSelected = false; sirenPuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < vampirePuppies.length; i++) { vampirePuppies[i].isSelected = false; vampirePuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < legendaryPuppies.length; i++) { legendaryPuppies[i].isSelected = false; legendaryPuppies[i].tint = 0xFFFFFF; } self.isSelected = true; self.tint = 0xFFFF00; }; self.moveTowards = function (targetX, targetY) { var dx = targetX - self.x; var dy = targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > self.moveSpeed) { self.x += dx / distance * self.moveSpeed; self.y += dy / distance * self.moveSpeed; } else { self.x = targetX; self.y = targetY; } }; return self; }); var LegendaryPuppy = Container.expand(function () { var self = Container.call(this); var puppyGraphics = self.attachAsset('legendarypuppy', { anchorX: 0.5, anchorY: 0.5 }); puppyGraphics.tint = 0xFFD700; // Gold tint for legendary var puppyNames = ['Buddy', 'Max', 'Bella', 'Charlie', 'Lucy', 'Cooper', 'Luna', 'Bailey', 'Daisy', 'Rocky', 'Molly', 'Jack', 'Lola', 'Duke', 'Sadie', 'Tucker', 'Chloe', 'Bear', 'Sophie', 'Teddy', 'Roxy', 'Buster', 'Coco', 'Gus', 'Penny', 'Oscar', 'Nala', 'Milo', 'Rosie', 'Leo', 'Zoey', 'Zeus', 'Lily', 'Finn', 'Ruby', 'Ollie', 'Stella', 'Jasper', 'Ellie', 'Murphy', 'Maggie', 'Toby', 'Gracie', 'Oliver', 'Abby', 'Winston', 'Zoe', 'Bentley', 'Mia', 'Harley']; self.name = puppyNames[Math.floor(Math.random() * puppyNames.length)]; self.isSelected = false; self.moveSpeed = 8; self.lastX = 0; self.lastY = 0; self.type = 'legendary'; var nameText = new Text2(self.name + ' [LÉGENDAIRE]', { size: 35, fill: 0xFFD700 }); nameText.anchor.set(0.5, 0.5); nameText.y = -80; self.addChild(nameText); self.down = function (x, y, obj) { selectedPuppy = self; // Clear all selections for (var i = 0; i < puppies.length; i++) { puppies[i].isSelected = false; puppies[i].tint = 0xFFFFFF; } for (var i = 0; i < ghostPuppies.length; i++) { ghostPuppies[i].isSelected = false; ghostPuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < dragonPuppies.length; i++) { dragonPuppies[i].isSelected = false; dragonPuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < sirenPuppies.length; i++) { sirenPuppies[i].isSelected = false; sirenPuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < vampirePuppies.length; i++) { vampirePuppies[i].isSelected = false; vampirePuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < legendaryPuppies.length; i++) { legendaryPuppies[i].isSelected = false; legendaryPuppies[i].tint = 0xFFFFFF; } self.isSelected = true; self.tint = 0xFFFF00; }; self.moveTowards = function (targetX, targetY) { var dx = targetX - self.x; var dy = targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > self.moveSpeed) { self.x += dx / distance * self.moveSpeed; self.y += dy / distance * self.moveSpeed; } else { self.x = targetX; self.y = targetY; } }; return self; }); var Lucie = Container.expand(function () { var self = Container.call(this); var lucieGraphics = self.attachAsset('lucie', { anchorX: 0.5, anchorY: 0.5 }); var nameText = new Text2('Lucie', { size: 40, fill: 0x00CED1 }); nameText.anchor.set(0.5, 0.5); nameText.y = -100; self.addChild(nameText); return self; }); var MrPervers = Container.expand(function () { var self = Container.call(this); var chefGraphics = self.attachAsset('mrpervers', { anchorX: 0.5, anchorY: 0.5 }); var nameText = new Text2('Mr. Pervers', { size: 50, fill: 0xFF0000 }); nameText.anchor.set(0.5, 0.5); nameText.y = -100; self.addChild(nameText); self.moveSpeed = 3; self.targetPuppy = null; self.lastTargetX = 0; self.lastTargetY = 0; self.update = function () { // Don't move if Samantha made Mr. Pervers sleep if (samanthaActive) { return; } if (selectedPuppy && selectedPuppy.isSelected) { self.targetPuppy = selectedPuppy; } if (self.targetPuppy) { var dx = self.targetPuppy.x - self.x; var dy = self.targetPuppy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > self.moveSpeed) { self.x += dx / distance * self.moveSpeed; self.y += dy / distance * self.moveSpeed; } } }; return self; }); var Puppy = Container.expand(function () { var self = Container.call(this); var puppyGraphics = self.attachAsset('puppy', { anchorX: 0.5, anchorY: 0.5 }); var puppyNames = ['Buddy', 'Max', 'Bella', 'Charlie', 'Lucy', 'Cooper', 'Luna', 'Bailey', 'Daisy', 'Rocky', 'Molly', 'Jack', 'Lola', 'Duke', 'Sadie', 'Tucker', 'Chloe', 'Bear', 'Sophie', 'Teddy', 'Roxy', 'Buster', 'Coco', 'Gus', 'Penny', 'Oscar', 'Nala', 'Milo', 'Rosie', 'Leo', 'Zoey', 'Zeus', 'Lily', 'Finn', 'Ruby', 'Ollie', 'Stella', 'Jasper', 'Ellie', 'Murphy', 'Maggie', 'Toby', 'Gracie', 'Oliver', 'Abby', 'Winston', 'Zoe', 'Bentley', 'Mia', 'Harley']; self.name = puppyNames[Math.floor(Math.random() * puppyNames.length)]; self.age = Math.floor(Math.random() * 20) + 1; // Random age between 1-20 months self.isSelected = false; self.moveSpeed = 8; self.lastX = 0; self.lastY = 0; var nameText = new Text2(self.name + ' (' + self.age + ' mois)', { size: 40, fill: 0x000000 }); nameText.anchor.set(0.5, 0.5); nameText.y = -80; self.addChild(nameText); self.down = function (x, y, obj) { selectedPuppy = self; // Clear all selections for (var i = 0; i < puppies.length; i++) { puppies[i].isSelected = false; puppies[i].tint = 0xFFFFFF; } for (var i = 0; i < ghostPuppies.length; i++) { ghostPuppies[i].isSelected = false; ghostPuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < dragonPuppies.length; i++) { dragonPuppies[i].isSelected = false; dragonPuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < sirenPuppies.length; i++) { sirenPuppies[i].isSelected = false; sirenPuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < vampirePuppies.length; i++) { vampirePuppies[i].isSelected = false; vampirePuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < legendaryPuppies.length; i++) { legendaryPuppies[i].isSelected = false; legendaryPuppies[i].tint = 0xFFFFFF; } self.isSelected = true; self.tint = 0xFFFF00; }; self.moveTowards = function (targetX, targetY) { var dx = targetX - self.x; var dy = targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > self.moveSpeed) { self.x += dx / distance * self.moveSpeed; self.y += dy / distance * self.moveSpeed; } else { self.x = targetX; self.y = targetY; } }; return self; }); var Samantha = Container.expand(function () { var self = Container.call(this); // Use dedicated Samantha asset var samanthaGraphics = self.attachAsset('samantha', { anchorX: 0.5, anchorY: 0.5 }); var nameText = new Text2('Samantha', { size: 40, fill: 0xFF1493 }); nameText.anchor.set(0.5, 0.5); nameText.y = -100; self.addChild(nameText); self.moveSpeed = 5; self.moveTowards = function (targetX, targetY) { var dx = targetX - self.x; var dy = targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > self.moveSpeed) { self.x += dx / distance * self.moveSpeed; self.y += dy / distance * self.moveSpeed; } else { self.x = targetX; self.y = targetY; } }; return self; }); var SirenPuppy = Container.expand(function () { var self = Container.call(this); var puppyGraphics = self.attachAsset('sirenpuppy', { anchorX: 0.5, anchorY: 0.5 }); puppyGraphics.tint = 0x44ffff; // Cyan tint for siren var puppyNames = ['Buddy', 'Max', 'Bella', 'Charlie', 'Lucy', 'Cooper', 'Luna', 'Bailey', 'Daisy', 'Rocky', 'Molly', 'Jack', 'Lola', 'Duke', 'Sadie', 'Tucker', 'Chloe', 'Bear', 'Sophie', 'Teddy', 'Roxy', 'Buster', 'Coco', 'Gus', 'Penny', 'Oscar', 'Nala', 'Milo', 'Rosie', 'Leo', 'Zoey', 'Zeus', 'Lily', 'Finn', 'Ruby', 'Ollie', 'Stella', 'Jasper', 'Ellie', 'Murphy', 'Maggie', 'Toby', 'Gracie', 'Oliver', 'Abby', 'Winston', 'Zoe', 'Bentley', 'Mia', 'Harley']; self.name = puppyNames[Math.floor(Math.random() * puppyNames.length)]; self.isSelected = false; self.moveSpeed = 8; self.lastX = 0; self.lastY = 0; self.type = 'siren'; var nameText = new Text2(self.name + ' [Sirène]', { size: 35, fill: 0x44ffff }); nameText.anchor.set(0.5, 0.5); nameText.y = -80; self.addChild(nameText); self.down = function (x, y, obj) { selectedPuppy = self; // Clear all selections for (var i = 0; i < puppies.length; i++) { puppies[i].isSelected = false; puppies[i].tint = 0xFFFFFF; } for (var i = 0; i < ghostPuppies.length; i++) { ghostPuppies[i].isSelected = false; ghostPuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < dragonPuppies.length; i++) { dragonPuppies[i].isSelected = false; dragonPuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < sirenPuppies.length; i++) { sirenPuppies[i].isSelected = false; sirenPuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < vampirePuppies.length; i++) { vampirePuppies[i].isSelected = false; vampirePuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < legendaryPuppies.length; i++) { legendaryPuppies[i].isSelected = false; legendaryPuppies[i].tint = 0xFFFFFF; } self.isSelected = true; self.tint = 0xFFFF00; }; self.moveTowards = function (targetX, targetY) { var dx = targetX - self.x; var dy = targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > self.moveSpeed) { self.x += dx / distance * self.moveSpeed; self.y += dy / distance * self.moveSpeed; } else { self.x = targetX; self.y = targetY; } }; return self; }); var VampirePuppy = Container.expand(function () { var self = Container.call(this); var puppyGraphics = self.attachAsset('vampirepuppy', { anchorX: 0.5, anchorY: 0.5 }); puppyGraphics.tint = 0x800080; // Purple tint for vampire var puppyNames = ['Buddy', 'Max', 'Bella', 'Charlie', 'Lucy', 'Cooper', 'Luna', 'Bailey', 'Daisy', 'Rocky', 'Molly', 'Jack', 'Lola', 'Duke', 'Sadie', 'Tucker', 'Chloe', 'Bear', 'Sophie', 'Teddy', 'Roxy', 'Buster', 'Coco', 'Gus', 'Penny', 'Oscar', 'Nala', 'Milo', 'Rosie', 'Leo', 'Zoey', 'Zeus', 'Lily', 'Finn', 'Ruby', 'Ollie', 'Stella', 'Jasper', 'Ellie', 'Murphy', 'Maggie', 'Toby', 'Gracie', 'Oliver', 'Abby', 'Winston', 'Zoe', 'Bentley', 'Mia', 'Harley']; self.name = puppyNames[Math.floor(Math.random() * puppyNames.length)]; self.isSelected = false; self.moveSpeed = 8; self.lastX = 0; self.lastY = 0; self.type = 'vampire'; var nameText = new Text2(self.name + ' [Vampire]', { size: 35, fill: 0x800080 }); nameText.anchor.set(0.5, 0.5); nameText.y = -80; self.addChild(nameText); self.down = function (x, y, obj) { selectedPuppy = self; // Clear all selections for (var i = 0; i < puppies.length; i++) { puppies[i].isSelected = false; puppies[i].tint = 0xFFFFFF; } for (var i = 0; i < ghostPuppies.length; i++) { ghostPuppies[i].isSelected = false; ghostPuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < dragonPuppies.length; i++) { dragonPuppies[i].isSelected = false; dragonPuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < sirenPuppies.length; i++) { sirenPuppies[i].isSelected = false; sirenPuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < vampirePuppies.length; i++) { vampirePuppies[i].isSelected = false; vampirePuppies[i].tint = 0xFFFFFF; } for (var i = 0; i < legendaryPuppies.length; i++) { legendaryPuppies[i].isSelected = false; legendaryPuppies[i].tint = 0xFFFFFF; } self.isSelected = true; self.tint = 0xFFFF00; }; self.moveTowards = function (targetX, targetY) { var dx = targetX - self.x; var dy = targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > self.moveSpeed) { self.x += dx / distance * self.moveSpeed; self.y += dy / distance * self.moveSpeed; } else { self.x = targetX; self.y = targetY; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xF5DEB3 }); /**** * Game Code ****/ // Game variables var currentLevel = storage.currentLevel || 1; var puppiesSaved = 0; var puppiesRequired = currentLevel === 1 ? 3 : Math.pow(2, currentLevel - 1) * 3; var puppies = []; var selectedPuppy = null; var mrPervers = null; var exitDoor = null; var pot = null; var upButton = null; var downButton = null; var leftButton = null; var rightButton = null; // SM currency system var playerSM = storage.playerSM || 0; var samanthaCost = storage.samanthaCost || 5; var originalSamanthaCost = samanthaCost; var samanthaActive = false; var samanthaEndTime = 0; var samanthaCharacter = null; // Eva tracking var puppiesSavedForEva = 0; var evaCharacter = null; var evaEndTime = 0; // Gabriel tracking var puppiesSavedForGabriel = 0; var gabrielCharacter = null; // Lucie tracking var samanthaInvocations = 0; var lucieCharacter = null; var lucieActive = false; var lucieEndTime = 0; var lucieDiscountActive = false; var lucieDiscountEndTime = 0; // Special puppy shop system var specialPuppyShop = { isOpen: false, selectedType: null }; // Special puppy types and costs var PUPPY_TYPES = { GHOST: { name: 'Fantômes', cost: 6, multiplier: 1, hasAge: true }, DRAGON: { name: 'Dragons', cost: 15, multiplier: 3, hasAge: false }, SIREN: { name: 'Sirènes', cost: 25, multiplier: 4, hasAge: false }, VAMPIRE: { name: 'Vampires', cost: 50, multiplier: 5, hasAge: false }, LEGENDARY: { name: 'Légendaires', cost: 1000, multiplier: 20, hasAge: false } }; // Special puppies arrays var ghostPuppies = []; var dragonPuppies = []; var sirenPuppies = []; var vampirePuppies = []; var legendaryPuppies = []; // Mr. Pervers mean messages var perversMessages = ["NON! Mes hot dogs de chiot!", "Ce chiot était parfait pour ma saucisse!", "Tu ruines mon menu hot dog!", "J'avais prévu de le servir grillé!", "Mes clients voulaient ce hot dog!", "Cette viande de chiot était premium!", "Tu gâches ma spécialité hot dog!", "Ce chiot aurait fait un délicieux hot dog!", "Mes hot dogs de chiot sont célèbres!", "Tu m'empêches de cuisiner mes hot dogs!", "Ce chiot était destiné à ma marmite!", "Mes hot dogs seront moins savoureux!", "Tu voles mes ingrédients à hot dog!", "Ce chiot était ma recette secrète!", "Mes clients adorent mes hot dogs de chiot!", "Tu sabotes ma production de hot dogs!", "Cette viande était parfaite pour griller!", "Mes hot dogs de chiot sont uniques!", "Tu détruis mon business de hot dogs!", "Ce chiot aurait nourri mes clients!", "Ma spécialité hot dog est ruinée!", "Tu m'empêches de servir mes hot dogs!", "Cette viande de chiot était fraîche!", "Mes hot dogs perdent leur goût!", "Tu voles ma matière première!", "Ce chiot était mon meilleur ingrédient!", "Mes hot dogs de chiot sont ma fierté!", "Tu ruines ma réputation de hot dogs!", "Cette viande était prête à cuire!", "Mes clients vont être déçus!", "Tu gâches ma recette de hot dog!", "Ce chiot était parfait pour les saucisses!", "Mes hot dogs de chiot sont artistiques!", "Tu m'empêches de nourrir mes clients!", "Cette viande aurait été délicieuse!", "Mes hot dogs perdent leur originalité!", "Tu sabotes ma cuisine de hot dogs!", "Ce chiot était ma fortune culinaire!", "Mes hot dogs de chiot sont légendaires!", "Tu détruis mon art du hot dog!", "Cette viande était mon inspiration!", "Mes hot dogs ne seront plus pareils!", "Tu voles mes profits de hot dogs!", "Ce chiot était destiné au grill!", "Mes hot dogs de chiot sont ma passion!", "Tu ruines mes ventes de hot dogs!", "Cette viande était exceptionnelle!", "Mes hot dogs perdent leur magie!", "Tu gâches ma tradition culinaire!", "Ce chiot était mon chef-d'œuvre!", "Mes hot dogs de chiot sont irremplaçables!", "Tu m'empêches de régaler mes clients!", "Cette viande était ma signature!", "Mes hot dogs perdent leur authenticité!", "Tu sabotes mon empire hot dog!", "Ce chiot était mon trésor culinaire!", "Mes hot dogs de chiot sont mon héritage!", "Tu détruis ma chaîne de restaurants!", "Cette viande était ma spécialité!", "Mes hot dogs ne seront plus uniques!", "Tu voles mon succès culinaire!", "Ce chiot était parfait pour mes saucisses!", "Mes hot dogs de chiot sont ma vie!", "Tu ruines mes rêves de restaurateur!", "Cette viande était mon avenir!", "Mes hot dogs perdent leur saveur!", "Tu gâches ma réputation mondiale!", "Ce chiot était destiné à mes clients!", "Mes hot dogs de chiot sont mon génie!", "Tu m'empêches de devenir riche!", "Cette viande était ma révolution!", "Mes hot dogs ne seront plus parfaits!", "Tu sabotes mon innovation culinaire!", "Ce chiot était mon diamant brut!", "Mes hot dogs de chiot sont mon destin!", "Tu détruis mon rêve américain!"]; var messageText = null; // UI elements var levelText = new Text2('Level: ' + currentLevel, { size: 60, fill: 0x000000 }); levelText.anchor.set(0, 0); levelText.x = 120; levelText.y = 50; LK.gui.topLeft.addChild(levelText); var savedText = new Text2('Saved: 0/' + puppiesRequired, { size: 60, fill: 0x000000 }); savedText.anchor.set(0.5, 0); savedText.x = 0; savedText.y = 50; LK.gui.top.addChild(savedText); var scoreText = new Text2('Score: ' + LK.getScore(), { size: 60, fill: 0x000000 }); scoreText.anchor.set(1, 0); scoreText.x = 0; scoreText.y = 50; LK.gui.topRight.addChild(scoreText); var smText = new Text2('SM: ' + playerSM, { size: 50, fill: 0x000000 }); smText.anchor.set(1, 0); smText.x = 0; smText.y = 120; LK.gui.topRight.addChild(smText); // Background var background = game.addChild(LK.getAsset('background', { anchorX: 0, anchorY: 0, x: 0, y: 0 })); // Exit door exitDoor = game.addChild(LK.getAsset('exitdoor', { anchorX: 0.5, anchorY: 1, x: 1024, y: 2700 })); var exitText = new Text2('EXIT', { size: 40, fill: 0xFFFFFF }); exitText.anchor.set(0.5, 0.5); exitText.y = -150; exitDoor.addChild(exitText); // Cooking pot pot = game.addChild(LK.getAsset('pot', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 400 })); // Mr. Pervers mrPervers = game.addChild(new MrPervers()); mrPervers.x = 1024; mrPervers.y = 500; // Directional buttons upButton = game.addChild(new DirectionalButton('up')); upButton.x = 1700; upButton.y = 2200; downButton = game.addChild(new DirectionalButton('down')); downButton.x = 1700; downButton.y = 2400; leftButton = game.addChild(new DirectionalButton('left')); leftButton.x = 1600; leftButton.y = 2300; rightButton = game.addChild(new DirectionalButton('right')); rightButton.x = 1800; rightButton.y = 2300; // Invoke Samantha button var invokeSamButton = new Container(); var invokeSamGraphics = invokeSamButton.attachAsset('downbutton', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 1.5 }); invokeSamGraphics.tint = 0xFF69B4; // Pink color var invokeSamText = new Text2('Invoque Sam\n(' + samanthaCost + ' SM)', { size: 30, fill: 0xFFFFFF }); invokeSamText.anchor.set(0.5, 0.5); invokeSamButton.addChild(invokeSamText); invokeSamButton.x = 300; invokeSamButton.y = 2300; invokeSamButton.down = function (x, y, obj) { var currentCost = lucieDiscountActive ? Math.ceil(samanthaCost * 0.4) : samanthaCost; if (playerSM >= currentCost && !samanthaActive) { invokeSamantha(); } }; game.addChild(invokeSamButton); // Shop button var shopButton = new Container(); var shopGraphics = shopButton.attachAsset('shopButton', { anchorX: 0.5, anchorY: 0.5 }); var shopText = new Text2('Boutique', { size: 30, fill: 0x000000 }); shopText.anchor.set(0.5, 0.5); shopButton.addChild(shopText); shopButton.x = 500; shopButton.y = 2300; shopButton.down = function (x, y, obj) { if (!specialPuppyShop.isOpen) { openShop(); } }; game.addChild(shopButton); // Functions function spawnPuppies() { var numPuppies = 1; if (currentLevel >= 11) { numPuppies = Math.floor(Math.random() * 6) + 5; // 5-10 puppies } else if (currentLevel >= 5) { numPuppies = Math.floor(Math.random() * 4) + 2; // 2-5 puppies } for (var i = 0; i < numPuppies; i++) { var puppy = new Puppy(); puppy.x = Math.random() * 1500 + 300; puppy.y = Math.random() * 1000 + 800; puppy.lastX = puppy.x; puppy.lastY = puppy.y; puppies.push(puppy); game.addChild(puppy); } } function checkCollisions() { // Check normal puppies for (var i = puppies.length - 1; i >= 0; i--) { var puppy = puppies[i]; // Check if puppy reached exit if (puppy.intersects(exitDoor)) { // Puppies over 10 months count as 2 saved puppies var puppyValue = puppy.age > 10 ? 2 : 1; puppiesSaved += puppyValue; puppiesSavedForEva += puppyValue; puppiesSavedForGabriel += puppyValue; LK.setScore(LK.getScore() + puppyValue); // Give SM reward playerSM += 3; storage.playerSM = playerSM; LK.getSound('puppysaved').play(); // Show Mr. Pervers angry message (only if Mr. Pervers is awake) if (!samanthaActive) { showPerversMessage(); } // Check Eva appearance (level 5+, every 6 puppies saved, 50% chance) if (currentLevel >= 5 && puppiesSavedForEva >= 6 && !samanthaActive && !evaCharacter) { puppiesSavedForEva = 0; if (Math.random() < 0.5) { spawnEva(); } } // Check Gabriel appearance (every 3 puppies saved, random chance) if (puppiesSavedForGabriel >= 3 && !gabrielCharacter) { puppiesSavedForGabriel = 0; if (Math.random() < 0.5) { spawnGabriel(); } } puppy.destroy(); puppies.splice(i, 1); if (selectedPuppy === puppy) { selectedPuppy = null; } updateUI(); if (puppiesSaved >= puppiesRequired) { nextLevel(); } continue; } // Check if puppy caught by Mr. Pervers (only if Mr. Pervers is not sleeping) if (puppy.intersects(mrPervers) && !samanthaActive && LK.ticks >= vampireSleepEndTime) { LK.setScore(LK.getScore() - 1); LK.getSound('puppycaught').play(); puppy.destroy(); puppies.splice(i, 1); if (selectedPuppy === puppy) { selectedPuppy = null; } updateUI(); if (puppies.length === 0 && puppiesSaved < puppiesRequired) { LK.showGameOver(); } } // Check if puppy caught by Gabriel (no game over, just remove puppy) if (gabrielCharacter && puppy.intersects(gabrielCharacter)) { puppy.destroy(); puppies.splice(i, 1); if (selectedPuppy === puppy) { selectedPuppy = null; } continue; } } // Check ghost puppies (ignored by Mr. Pervers and Gabriel) for (var i = ghostPuppies.length - 1; i >= 0; i--) { var puppy = ghostPuppies[i]; if (puppy.intersects(exitDoor)) { var puppyValue = puppy.age > 10 ? 2 : 1; puppiesSaved += puppyValue; puppiesSavedForEva += puppyValue; puppiesSavedForGabriel += puppyValue; LK.setScore(LK.getScore() + puppyValue); playerSM += 3; storage.playerSM = playerSM; LK.getSound('puppysaved').play(); if (!samanthaActive) { showPerversMessage(); } // Check Eva and Gabriel appearances if (currentLevel >= 5 && puppiesSavedForEva >= 6 && !samanthaActive && !evaCharacter) { puppiesSavedForEva = 0; if (Math.random() < 0.5) { spawnEva(); } } if (puppiesSavedForGabriel >= 3 && !gabrielCharacter) { puppiesSavedForGabriel = 0; if (Math.random() < 0.5) { spawnGabriel(); } } puppy.destroy(); ghostPuppies.splice(i, 1); if (selectedPuppy === puppy) { selectedPuppy = null; } updateUI(); if (puppiesSaved >= puppiesRequired) { nextLevel(); } } } // Check dragon puppies (only catchable by Mr. Pervers, ignored by Gabriel) for (var i = dragonPuppies.length - 1; i >= 0; i--) { var puppy = dragonPuppies[i]; if (puppy.intersects(exitDoor)) { var puppyValue = 3; // Dragons count triple puppiesSaved += puppyValue; puppiesSavedForEva += puppyValue; puppiesSavedForGabriel += puppyValue; LK.setScore(LK.getScore() + puppyValue); playerSM += 9; // 3x reward storage.playerSM = playerSM; LK.getSound('puppysaved').play(); if (!samanthaActive) { showPerversMessage(); } // Check Eva and Gabriel appearances if (currentLevel >= 5 && puppiesSavedForEva >= 6 && !samanthaActive && !evaCharacter) { puppiesSavedForEva = 0; if (Math.random() < 0.5) { spawnEva(); } } if (puppiesSavedForGabriel >= 3 && !gabrielCharacter) { puppiesSavedForGabriel = 0; if (Math.random() < 0.5) { spawnGabriel(); } } puppy.destroy(); dragonPuppies.splice(i, 1); if (selectedPuppy === puppy) { selectedPuppy = null; } updateUI(); if (puppiesSaved >= puppiesRequired) { nextLevel(); } continue; } // Dragons can be caught by Mr. Pervers if (puppy.intersects(mrPervers) && !samanthaActive && LK.ticks >= vampireSleepEndTime) { LK.setScore(LK.getScore() - 3); LK.getSound('puppycaught').play(); puppy.destroy(); dragonPuppies.splice(i, 1); if (selectedPuppy === puppy) { selectedPuppy = null; } updateUI(); } } // Check siren puppies (only catchable by Gabriel, ignored by Mr. Pervers) for (var i = sirenPuppies.length - 1; i >= 0; i--) { var puppy = sirenPuppies[i]; if (puppy.intersects(exitDoor)) { var puppyValue = 4; // Sirens count quadruple puppiesSaved += puppyValue; puppiesSavedForEva += puppyValue; puppiesSavedForGabriel += puppyValue; LK.setScore(LK.getScore() + puppyValue); playerSM += 12; // 4x reward storage.playerSM = playerSM; LK.getSound('puppysaved').play(); if (!samanthaActive) { showPerversMessage(); } // Check Eva and Gabriel appearances if (currentLevel >= 5 && puppiesSavedForEva >= 6 && !samanthaActive && !evaCharacter) { puppiesSavedForEva = 0; if (Math.random() < 0.5) { spawnEva(); } } if (puppiesSavedForGabriel >= 3 && !gabrielCharacter) { puppiesSavedForGabriel = 0; if (Math.random() < 0.5) { spawnGabriel(); } } puppy.destroy(); sirenPuppies.splice(i, 1); if (selectedPuppy === puppy) { selectedPuppy = null; } updateUI(); if (puppiesSaved >= puppiesRequired) { nextLevel(); } continue; } // Sirens can be caught by Gabriel if (gabrielCharacter && puppy.intersects(gabrielCharacter)) { puppy.destroy(); sirenPuppies.splice(i, 1); if (selectedPuppy === puppy) { selectedPuppy = null; } continue; } } // Check vampire puppies (catchable by both, but put Mr. Pervers to sleep) for (var i = vampirePuppies.length - 1; i >= 0; i--) { var puppy = vampirePuppies[i]; if (puppy.intersects(exitDoor)) { var puppyValue = 5; // Vampires count quintuple puppiesSaved += puppyValue; puppiesSavedForEva += puppyValue; puppiesSavedForGabriel += puppyValue; LK.setScore(LK.getScore() + puppyValue); playerSM += 15; // 5x reward storage.playerSM = playerSM; LK.getSound('puppysaved').play(); if (!samanthaActive) { showPerversMessage(); } // Check Eva and Gabriel appearances if (currentLevel >= 5 && puppiesSavedForEva >= 6 && !samanthaActive && !evaCharacter) { puppiesSavedForEva = 0; if (Math.random() < 0.5) { spawnEva(); } } if (puppiesSavedForGabriel >= 3 && !gabrielCharacter) { puppiesSavedForGabriel = 0; if (Math.random() < 0.5) { spawnGabriel(); } } puppy.destroy(); vampirePuppies.splice(i, 1); if (selectedPuppy === puppy) { selectedPuppy = null; } updateUI(); if (puppiesSaved >= puppiesRequired) { nextLevel(); } continue; } // Vampires can be caught by Mr. Pervers but put him to sleep if (puppy.intersects(mrPervers) && !samanthaActive && LK.ticks >= vampireSleepEndTime) { LK.setScore(LK.getScore() - 5); LK.getSound('puppycaught').play(); // Put Mr. Pervers to sleep for 2 minutes vampireSleepEndTime = LK.ticks + 2 * 60 * 60; // 2 minutes at 60 FPS mrPervers.tint = 0x808080; // Gray tint to show sleeping puppy.destroy(); vampirePuppies.splice(i, 1); if (selectedPuppy === puppy) { selectedPuppy = null; } updateUI(); continue; } // Vampires can be caught by Gabriel if (gabrielCharacter && puppy.intersects(gabrielCharacter)) { puppy.destroy(); vampirePuppies.splice(i, 1); if (selectedPuppy === puppy) { selectedPuppy = null; } continue; } } // Check legendary puppies (ignored by both, put them to sleep on collision) for (var i = legendaryPuppies.length - 1; i >= 0; i--) { var puppy = legendaryPuppies[i]; if (puppy.intersects(exitDoor)) { var puppyValue = 20; // Legendaries count as 20 puppiesSaved += puppyValue; puppiesSavedForEva += puppyValue; puppiesSavedForGabriel += puppyValue; LK.setScore(LK.getScore() + puppyValue); playerSM += 60; // 20x reward storage.playerSM = playerSM; LK.getSound('puppysaved').play(); if (!samanthaActive) { showPerversMessage(); } // Check Eva and Gabriel appearances if (currentLevel >= 5 && puppiesSavedForEva >= 6 && !samanthaActive && !evaCharacter) { puppiesSavedForEva = 0; if (Math.random() < 0.5) { spawnEva(); } } if (puppiesSavedForGabriel >= 3 && !gabrielCharacter) { puppiesSavedForGabriel = 0; if (Math.random() < 0.5) { spawnGabriel(); } } puppy.destroy(); legendaryPuppies.splice(i, 1); if (selectedPuppy === puppy) { selectedPuppy = null; } updateUI(); if (puppiesSaved >= puppiesRequired) { nextLevel(); } continue; } // Legendary puppies put Mr. Pervers to sleep on collision if (puppy.intersects(mrPervers)) { vampireSleepEndTime = LK.ticks + 10 * 60 * 60; // 10 minutes at 60 FPS mrPervers.tint = 0x808080; // Gray tint to show sleeping } // Legendary puppies put Gabriel to sleep on collision if (gabrielCharacter && puppy.intersects(gabrielCharacter)) { gabrielCharacter.destroy(); gabrielCharacter = null; } } } function updateUI() { savedText.setText('Saved: ' + puppiesSaved + '/' + puppiesRequired); scoreText.setText('Score: ' + LK.getScore()); smText.setText('SM: ' + playerSM); var displayCost = lucieDiscountActive ? Math.ceil(samanthaCost * 0.4) : samanthaCost; var costText = lucieDiscountActive ? displayCost + ' SM (60% OFF!)' : displayCost + ' SM'; invokeSamText.setText('Invoque Sam\n(' + costText + ')'); } function showPerversMessage() { // Remove existing message if any if (messageText) { messageText.destroy(); messageText = null; } // Get random message var randomMessage = perversMessages[Math.floor(Math.random() * perversMessages.length)]; // Create message text messageText = new Text2(randomMessage, { size: 80, fill: 0xFF0000 }); messageText.anchor.set(0.5, 0.5); messageText.x = 1024; messageText.y = 1200; messageText.alpha = 1; // Add to game game.addChild(messageText); // Animate message appearing with scale and fade tween(messageText, { scaleX: 1.2, scaleY: 1.2 }, { duration: 300, easing: tween.bounceOut }); // Fade out and remove after 15 seconds LK.setTimeout(function () { if (messageText) { tween(messageText, { alpha: 0 }, { duration: 1000, easing: tween.easeOut, onFinish: function onFinish() { if (messageText) { messageText.destroy(); messageText = null; } } }); } }, 15000); } function invokeSamantha() { // Apply Lucie discount if active var currentCost = lucieDiscountActive ? Math.ceil(samanthaCost * 0.4) : samanthaCost; // Deduct SM cost playerSM -= currentCost; storage.playerSM = playerSM; // Increase cost for next invocation (30% increase) samanthaCost = Math.ceil(samanthaCost * 1.3); storage.samanthaCost = samanthaCost; // Track invocations for Lucie samanthaInvocations++; // Create Samantha samanthaCharacter = game.addChild(new Samantha()); samanthaCharacter.x = 100; samanthaCharacter.y = 1000; // Set Mr. Pervers to sleep and Samantha active samanthaActive = true; samanthaEndTime = LK.ticks + 6 * 60 * 60; // 6 minutes at 60 FPS // Make Mr. Pervers sleep (stop moving and change tint) mrPervers.tint = 0x808080; // Gray tint to show sleeping // Check Lucie appearance (every 2 invocations) if (samanthaInvocations >= 2 && !lucieCharacter) { samanthaInvocations = 0; spawnLucie(); } updateUI(); } function wakeMrPervers() { samanthaActive = false; mrPervers.tint = 0xFFFFFF; // Reset tint // Remove Samantha if (samanthaCharacter) { samanthaCharacter.destroy(); samanthaCharacter = null; } } function spawnEva() { evaCharacter = game.addChild(new Eva()); evaCharacter.x = 200; evaCharacter.y = 1500; evaEndTime = LK.ticks + 15 * 60; // 15 seconds at 60 FPS // 50% chance Eva will invoke Samantha if (Math.random() < 0.5) { // Eva invokes Samantha after 2 seconds LK.setTimeout(function () { if (evaCharacter && !samanthaActive) { // Create Samantha for free samanthaCharacter = game.addChild(new Samantha()); samanthaCharacter.x = 100; samanthaCharacter.y = 1000; samanthaActive = true; samanthaEndTime = LK.ticks + 6 * 60 * 60; // 6 minutes at 60 FPS mrPervers.tint = 0x808080; // Gray tint to show sleeping // Remove Eva immediately when Samantha arrives if (evaCharacter) { evaCharacter.destroy(); evaCharacter = null; } } }, 2000); } } function spawnGabriel() { gabrielCharacter = game.addChild(new Gabriel()); gabrielCharacter.x = 1800; gabrielCharacter.y = 1000; } function spawnLucie() { lucieCharacter = game.addChild(new Lucie()); lucieCharacter.x = 1024; lucieCharacter.y = 1500; lucieActive = true; lucieEndTime = LK.ticks + 20 * 60; // 20 seconds at 60 FPS // After Lucie appears, activate 60% discount for 2 minutes LK.setTimeout(function () { if (lucieCharacter) { lucieCharacter.destroy(); lucieCharacter = null; lucieActive = false; // Activate discount lucieDiscountActive = true; lucieDiscountEndTime = LK.ticks + 2 * 60 * 60; // 2 minutes at 60 FPS updateUI(); } }, 20000); } // Vampire sleep tracking var vampireSleepEndTime = 0; function getMaxPuppiesForType(type) { switch (type) { case 'GHOST': if (currentLevel < 10) return currentLevel < 10 ? 5 : 0; return currentLevel > 10 ? 13 : 5; case 'DRAGON': if (currentLevel < 7) return 0; return currentLevel < 20 ? 6 : 15; case 'SIREN': if (currentLevel < 10) return 0; return currentLevel < 30 ? 7 : 20; case 'VAMPIRE': if (currentLevel < 15) return 0; return currentLevel < 40 ? 9 : 25; case 'LEGENDARY': if (currentLevel < 90) return 0; if (currentLevel <= 150) return 3; return 7; default: return 0; } } function isTypeAvailable(type) { switch (type) { case 'GHOST': return true; case 'DRAGON': return currentLevel >= 7; case 'SIREN': return currentLevel >= 10; case 'VAMPIRE': return currentLevel >= 15; case 'LEGENDARY': return currentLevel >= 90; default: return false; } } function openShop() { specialPuppyShop.isOpen = true; // Create shop background var shopBg = game.addChild(LK.getAsset('shopBackground', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366, alpha: 0.9 })); shopBg.shopElement = true; // Shop title var shopTitle = new Text2('Boutique de Chiots Spéciaux', { size: 60, fill: 0xFFFFFF }); shopTitle.anchor.set(0.5, 0.5); shopTitle.x = 1024; shopTitle.y = 800; shopTitle.shopElement = true; game.addChild(shopTitle); // Create type buttons var yPos = 1000; var buttonIndex = 0; for (var typeKey in PUPPY_TYPES) { var type = PUPPY_TYPES[typeKey]; var available = isTypeAvailable(typeKey); var maxPuppies = getMaxPuppiesForType(typeKey); var typeButton = new Container(); var buttonGraphics = typeButton.attachAsset('typeButton', { anchorX: 0.5, anchorY: 0.5 }); if (!available) { buttonGraphics.tint = 0x666666; // Gray out unavailable types } var buttonText = new Text2(type.name + '\n' + type.cost + ' SM\nMax: ' + maxPuppies, { size: 25, fill: available ? 0xFFFFFF : 0x999999 }); buttonText.anchor.set(0.5, 0.5); typeButton.addChild(buttonText); typeButton.x = 1024; typeButton.y = yPos; typeButton.shopElement = true; typeButton.typeKey = typeKey; if (available && maxPuppies > 0) { typeButton.down = function (x, y, obj) { selectPuppyType(this.typeKey); }; } game.addChild(typeButton); yPos += 120; buttonIndex++; } // Close button var closeButton = new Container(); var closeGraphics = closeButton.attachAsset('typeButton', { anchorX: 0.5, anchorY: 0.5 }); closeGraphics.tint = 0xff0000; var closeText = new Text2('Fermer', { size: 30, fill: 0xFFFFFF }); closeText.anchor.set(0.5, 0.5); closeButton.addChild(closeText); closeButton.x = 1024; closeButton.y = 1800; closeButton.shopElement = true; closeButton.down = function (x, y, obj) { closeShop(); }; game.addChild(closeButton); } function selectPuppyType(typeKey) { specialPuppyShop.selectedType = typeKey; closeShop(); openNumberSelector(typeKey); } function openNumberSelector(typeKey) { var type = PUPPY_TYPES[typeKey]; if (!type) { console.log('Invalid puppy type:', typeKey); return; } var maxPuppies = getMaxPuppiesForType(typeKey); if (!isTypeAvailable(typeKey) || maxPuppies === 0) { console.log('Type not available or max reached:', typeKey); return; } // Define colors and special text for each type var typeColors = { GHOST: 0x9999ff, DRAGON: 0xff4444, SIREN: 0x44ffff, VAMPIRE: 0x800080, LEGENDARY: 0xFFD700 }; var typeDescriptions = { GHOST: 'Ignorés par Mr. Pervers et Gabriel\nSystème d\'âge appliqué', DRAGON: 'Visibles par Mr. Pervers seulement\nComptent triple au sauvetage', SIREN: 'Attrapables par Gabriel seulement\nComptent quadruple au sauvetage', VAMPIRE: 'Endorment Mr. Pervers 2 minutes\nComptent quintuple au sauvetage', LEGENDARY: 'Ignorent tout, endorment 10 min\nComptent comme 20 chiots!' }; var bgColor = typeColors[typeKey] || 0x4444ff; // Create number selector background with type-specific color var selectorBg = game.addChild(LK.getAsset('shopBackground', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366, alpha: 0.9 })); selectorBg.tint = bgColor; selectorBg.selectorElement = true; // Title with type-specific styling var selectorTitle = new Text2('Achat de Chiots ' + type.name, { size: 50, fill: 0xFFFFFF }); selectorTitle.anchor.set(0.5, 0.5); selectorTitle.x = 1024; selectorTitle.y = 800; selectorTitle.selectorElement = true; game.addChild(selectorTitle); // Type description var descriptionText = new Text2(typeDescriptions[typeKey], { size: 30, fill: 0xFFFFFF }); descriptionText.anchor.set(0.5, 0.5); descriptionText.x = 1024; descriptionText.y = 900; descriptionText.selectorElement = true; game.addChild(descriptionText); // Level requirement and max display var requirementText = ''; switch (typeKey) { case 'GHOST': requirementText = 'Disponible dès le niveau 1'; break; case 'DRAGON': requirementText = 'Requis niveau 7+'; break; case 'SIREN': requirementText = 'Requis niveau 10+'; break; case 'VAMPIRE': requirementText = 'Requis niveau 15+'; break; case 'LEGENDARY': requirementText = 'Requis niveau 90+'; break; } var reqText = new Text2(requirementText + ' | Maximum: ' + maxPuppies, { size: 25, fill: 0xFFFFFF }); reqText.anchor.set(0.5, 0.5); reqText.x = 1024; reqText.y = 980; reqText.selectorElement = true; game.addChild(reqText); // Current number display var currentNumber = 1; var numberDisplay = new Text2(currentNumber.toString(), { size: 80, fill: 0xFFFFFF }); numberDisplay.anchor.set(0.5, 0.5); numberDisplay.x = 1024; numberDisplay.y = 1100; numberDisplay.selectorElement = true; game.addChild(numberDisplay); // Cost display with type-specific styling var costDisplay = new Text2('Coût: ' + currentNumber * type.cost + ' SM', { size: 40, fill: 0xFFFFFF }); costDisplay.anchor.set(0.5, 0.5); costDisplay.x = 1024; costDisplay.y = 1200; costDisplay.selectorElement = true; game.addChild(costDisplay); // Number buttons with type-specific color var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]; var startX = 1024 - 200; var startY = 1300; for (var i = 0; i < numbers.length; i++) { var num = numbers[i]; var numberButton = new Container(); var numberGraphics = numberButton.attachAsset('numberButton', { anchorX: 0.5, anchorY: 0.5 }); numberGraphics.tint = bgColor; var numText = new Text2(num.toString(), { size: 30, fill: 0xFFFFFF }); numText.anchor.set(0.5, 0.5); numberButton.addChild(numText); numberButton.x = startX + i % 5 * 100; numberButton.y = startY + Math.floor(i / 5) * 100; numberButton.selectorElement = true; numberButton.number = num; numberButton.down = function (x, y, obj) { var digit = obj.parent.number; if (currentNumber === 0 || currentNumber.toString().length >= 2) { currentNumber = digit; } else { currentNumber = currentNumber * 10 + digit; } if (currentNumber > maxPuppies) { currentNumber = maxPuppies; } numberDisplay.setText(currentNumber.toString()); costDisplay.setText('Coût: ' + currentNumber * type.cost + ' SM'); }; game.addChild(numberButton); } // Validate button with type-specific color var validateButton = new Container(); var validateGraphics = validateButton.attachAsset('typeButton', { anchorX: 0.5, anchorY: 0.5 }); validateGraphics.tint = 0x00ff00; var validateText = new Text2('Acheter ' + type.name, { size: 25, fill: 0xFFFFFF }); validateText.anchor.set(0.5, 0.5); validateButton.addChild(validateText); validateButton.x = 924; validateButton.y = 1600; validateButton.selectorElement = true; validateButton.down = function (x, y, obj) { var totalCost = currentNumber * type.cost; if (playerSM >= totalCost && currentNumber > 0) { purchasePuppies(typeKey, currentNumber, totalCost); } closeNumberSelector(); }; game.addChild(validateButton); // Cancel button var cancelButton = new Container(); var cancelGraphics = cancelButton.attachAsset('typeButton', { anchorX: 0.5, anchorY: 0.5 }); cancelGraphics.tint = 0xff0000; var cancelText = new Text2('Annuler', { size: 30, fill: 0xFFFFFF }); cancelText.anchor.set(0.5, 0.5); cancelButton.addChild(cancelText); cancelButton.x = 1124; cancelButton.y = 1600; cancelButton.selectorElement = true; cancelButton.down = function (x, y, obj) { closeNumberSelector(); }; game.addChild(cancelButton); } function closeShop() { specialPuppyShop.isOpen = false; // Remove all shop elements for (var i = game.children.length - 1; i >= 0; i--) { var child = game.children[i]; if (child.shopElement) { child.destroy(); } } } function closeNumberSelector() { // Remove all selector elements for (var i = game.children.length - 1; i >= 0; i--) { var child = game.children[i]; if (child.selectorElement) { child.destroy(); } } } function purchasePuppies(typeKey, count, totalCost) { playerSM -= totalCost; storage.playerSM = playerSM; for (var i = 0; i < count; i++) { var puppy; switch (typeKey) { case 'GHOST': puppy = new GhostPuppy(); ghostPuppies.push(puppy); break; case 'DRAGON': puppy = new DragonPuppy(); dragonPuppies.push(puppy); break; case 'SIREN': puppy = new SirenPuppy(); sirenPuppies.push(puppy); break; case 'VAMPIRE': puppy = new VampirePuppy(); vampirePuppies.push(puppy); break; case 'LEGENDARY': puppy = new LegendaryPuppy(); legendaryPuppies.push(puppy); break; } puppy.x = Math.random() * 1500 + 300; puppy.y = Math.random() * 1000 + 800; puppy.lastX = puppy.x; puppy.lastY = puppy.y; game.addChild(puppy); } updateUI(); } function nextLevel() { currentLevel++; // Reset to level 1 if we've completed level 200 if (currentLevel > 200) { currentLevel = 1; } storage.currentLevel = currentLevel; puppiesSaved = 0; puppiesSavedForEva = 0; puppiesSavedForGabriel = 0; puppiesRequired = currentLevel === 1 ? 3 : Math.pow(2, currentLevel - 1) * 3; // Clear existing puppies for (var i = 0; i < puppies.length; i++) { puppies[i].destroy(); } puppies = []; // Clear special puppies for (var i = 0; i < ghostPuppies.length; i++) { ghostPuppies[i].destroy(); } ghostPuppies = []; for (var i = 0; i < dragonPuppies.length; i++) { dragonPuppies[i].destroy(); } dragonPuppies = []; for (var i = 0; i < sirenPuppies.length; i++) { sirenPuppies[i].destroy(); } sirenPuppies = []; for (var i = 0; i < vampirePuppies.length; i++) { vampirePuppies[i].destroy(); } vampirePuppies = []; for (var i = 0; i < legendaryPuppies.length; i++) { legendaryPuppies[i].destroy(); } legendaryPuppies = []; selectedPuppy = null; // Reset vampire sleep vampireSleepEndTime = 0; // Reset Mr. Pervers tint and position mrPervers.tint = 0xFFFFFF; mrPervers.x = 1024; mrPervers.y = 500; mrPervers.targetPuppy = null; // Clear all active characters if (evaCharacter) { evaCharacter.destroy(); evaCharacter = null; } if (gabrielCharacter) { gabrielCharacter.destroy(); gabrielCharacter = null; } if (lucieCharacter) { lucieCharacter.destroy(); lucieCharacter = null; lucieActive = false; } if (samanthaCharacter && !samanthaActive) { samanthaCharacter.destroy(); samanthaCharacter = null; } // Update UI levelText.setText('Level: ' + currentLevel); updateUI(); // Spawn new puppies spawnPuppies(); } // Initialize first level spawnPuppies(); // Start background music LK.playMusic('bgmusic'); game.update = function () { checkCollisions(); // Handle Samantha timer if (samanthaActive && LK.ticks >= samanthaEndTime) { wakeMrPervers(); } // Move Samantha towards Mr. Pervers if active if (samanthaActive && samanthaCharacter) { samanthaCharacter.moveTowards(mrPervers.x, mrPervers.y); } // Handle Eva timer if (evaCharacter && LK.ticks >= evaEndTime) { evaCharacter.destroy(); evaCharacter = null; } // Handle Lucie discount timer if (lucieDiscountActive && LK.ticks >= lucieDiscountEndTime) { lucieDiscountActive = false; updateUI(); } // Handle vampire sleep timer if (LK.ticks >= vampireSleepEndTime && vampireSleepEndTime > 0) { mrPervers.tint = 0xFFFFFF; // Reset tint when waking up } // Spawn new puppies if screen is empty and we haven't completed the level var totalPuppies = puppies.length + ghostPuppies.length + dragonPuppies.length + sirenPuppies.length + vampirePuppies.length + legendaryPuppies.length; if (totalPuppies === 0 && puppiesSaved < puppiesRequired) { spawnPuppies(); } };
===================================================================
--- original.js
+++ change.js
@@ -1342,9 +1342,9 @@
typeButton.shopElement = true;
typeButton.typeKey = typeKey;
if (available && maxPuppies > 0) {
typeButton.down = function (x, y, obj) {
- selectPuppyType(obj.parent.typeKey);
+ selectPuppyType(this.typeKey);
};
}
game.addChild(typeButton);
yPos += 120;
Fond d'écran restaurant. In-Game asset. 2d. High contrast. No shadows
Porte de sortie. In-Game asset. 2d. High contrast. No shadows
Cuisiniere. In-Game asset. 2d. High contrast. No shadows
Homme bizzare. In-Game asset. 2d. High contrast. No shadows
Chiot (animal). In-Game asset. 2d. High contrast. No shadows
Petite fille de 10 ans. In-Game asset. 2d. High contrast. No shadows
Petit garçon de 12 ans. In-Game asset. 2d. High contrast. No shadows
Chiot fantôme (animal). In-Game asset. 2d. High contrast. No shadows
Chiot dragon (animal). In-Game asset. 2d. High contrast. No shadows
Chiot dorée (animal). In-Game asset. 2d. High contrast. No shadows
Chiot vampire. In-Game asset. 2d. High contrast. No shadows
Chiot sirène. In-Game asset. 2d. High contrast. No shadows
fond mignon kawaii rose. In-Game asset. 2d. High contrast. No shadows