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, laĢ il n'y a que les leĢgendaires ! Chaque type de chiots (fantoĢmes, sireĢ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 leĢgendaires ! CorrigeĢ ç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
CorrigeĢ les probleĢmes
User prompt
Ajoute ces nouveauteĢs a Hot-puppy : en plus, des chiots normaux, Le joueur peut acheter diffeĢrents types suppleĢmentaires de chiots (couĢt en SM) qui ont chacun leurs speĢcialiteĢs, les voici: 1) Chiots fantoĢmes : le joueur peut en acheter 1 a 5 maximum par achat s'il est niveau infeĢrieur a 10, Et de 1 jusqu'aĢ 13 par achat s'il est niveau supeĢrieur a 10, Les chiots fantoĢmes sont simplement des chiots ignoreĢ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 aĢ la porte de la sortie, et gagner des chiens sauveĢs dans son score,! Le systeĢme des aĢges s'applique aux chiots fantoĢmes, (CouĢ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 aĢ 6 par achat s'il est de niveau infeĢrieur aĢ 20, et jusqu'aĢ 15 par achat s'il est niveau supeĢ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 meĢme façon que les chiots normaux! les chiots dragons comptent triple quand le joueur les sauve! Le systeĢme d'aĢge ne s'applique pas aux chiots dragons (CouĢte 15 SM par achat) 3) Chiots SireĢ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 infeĢrieur a 30, et jusqu'aĢ 20 par achat s'il est niveau 30 au supeĢrieur! Les chiots sireĢnes ne sont attrapables seulement par Gabriel, Monsieur pervers les ignore totalement, Et les chiots sireĢnes comptent quadruples quand le joueur les sauve! Le systeĢme d'aĢge ne s'applique pas aux chiots sireĢnes (coute 25 SM par achat) 4) Chiots Vampires : le joueur peut en acheter seulement aĢ partir du niveau 15! le joueur peut en acheter de 1 a 9 par achat s'il est niveau infeĢrieur a 40, et jusqu'aĢ 25 s'il est niveau 40 au SupeĢ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 couĢtent Cinquple lors de leur sauvetage ! Le systeĢme des aĢges ne s'applique pas aux chiots vampires (CouĢte 50 SM par achat) 5) Chiots leĢgendaires : disponible seulement pour les joueurs avances aĢ partir du niveau 90! le joueur peut en acheter de 1 aĢ 3 par achat s'il est niveau 90 a 150, Et jusqu'aĢ 7 par achat s'il est niveau supeĢrieur a 150 , jusqu'aĢ la niveau maximal du jeu : le niveau 200! les chiots leĢgendaires, ont tout les pouvoirs, ils sont ignoreĢs par Monsieur pervers et Gabriel, les endorment pendant 10 minutes (que ce soit monsieur pervers ou meĢme Gabriel), deĢ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! (CouĢte 1000 SM par achat) Le joueur peut acheter des chiots speĢ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 griseĢ, sur lequels le joueur ne peut pas appuyer ni seĢlectionner pour acheter), Le joueur appuie donc sur le type de chiots speĢciaux qu'ils veut acheter, Et le jeu lui demande via un eĢcran qui s'affiche combien il veut en acheter, Il y a donc un keyboard simple bleu avec des touches qui repreĢsentent chaque chiffre, Pour que le joueur entre un chiffre et valide en appuyant sur valider! Les chiots speĢciaux du type acheter ,et le nombre de chiots acheter apparaissent donc dans le jeu jusqu'aĢ leur sauvetage ! āŖš” Consider importing and using the following plugins: @upit/storage.v1, @upit/tween.v1
User prompt
Ajoute un systeĢme d'aĢge pour les chiots dans Hot-puppy : Chaque chiot a un aĢge aleĢatoire (entre 1 mois minimum et jusqu'aĢ 20 mois maximum), l'aĢge de chaque chiot est eĢcrit aĢ coĢteĢ de son nom au-dessus de sa teĢte, L'aĢge de chaque chiot ajoute une strateĢ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 compeĢtences speĢ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 preĢcieux, Lors de leur sauvetage ils comptent comme 2 chiots sauveĢ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 nouveauteĢ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 peĢre (monsieur pervers), Eva, a le pouvoir d'invoquer Samantha, sans que le joueur est a l'invoquer lui meĢme avec ses SM! Eva ne peut apparaiĢtre dans le jeu, seulement quand le joueur est niveau 5 au supeĢrieur, Eva a 50% de chance d'apparaiĢtre tout les 6 chiots sauveĢ, Mais seulement si Samantha n'est pas deĢjaĢ preĢsente, Eva apparaiĢt aĢ l'eĢcran, puis a une de chance d'invoquer Samantha, qui apparaiĢt et endort monsieur pervers gratuitement sans que le joueur n'est a deĢpense des SMS, Mais Eva n'apparaiĢt pas aĢ chaque fois! Et meĢme quand elle n'apparaiĢt, la deĢcision selon laquelle elle va invoquer Samantha ou non est aleĢatoire ! elle disparaiĢ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, freĢre de Samantha) : Gabriel, contrairement a Samantha ou Eva, N'est pas un allieĢ du joueur, mais un allieĢ de Monsieur pervers !! Il est d'accord avec le business de son peĢ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 sauveĢ, Mais gabriel ne lui reĢpond pas toujours, La deĢcision selon laquelle Gabriel lui reĢpond ou non, est aleĢatoire, Mais si Monsieur pervers reĢussit a invoquer son fils, il apparaiĢt dans le jeu, et aide son peĢre, Ça signifie, qu'il poursuit lui aussi les chiots pour les attraper, il est encore plus dangereux que son peĢre, car Gabriel peut attraper les chiots avant meĢme que le joueur n'appuie sur eux! La diffeĢ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 attrapeĢ - Lucie (11 ans, autre sÅur de Samantha) : Lucie est assez neutre par rapport a tout ça, Mais elle deĢ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 apparaiĢt dans le jeu toutes les 2 invocations de Samantha, Elle apparaiĢt aĢ l'eĢcran durant 20 secondes, puis baisse le prix des SM requis a l'invocation de samantha de 60% durant 2 minutes ! ApreĢ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 allieĢe du joueur dans le jeu, elle n'est pas d'accord avec le business tordu de son peĢre, Et essaye d'aider le joueur, Mais attention, elle n'apparaiĢt seulement quand certaines conditions sont remplis : - ajoute une monnaie du jeu : Les SM permettent d'invoquer Samantha, Pour invoquer Samantha , cela couĢte 5 SM la premieĢ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, meĢme apreĢs un game over, le joueur peut voir son nombre de SM posseĢder dans son ui a l'eĢcran dans le jeu, pour invoquer Samantha, Le joueur appuie sur un bouton rose a texte blanc : "Invoque Sam", et Samantha apparaiĢt a l'eĢ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 laĢ, Puis, durant le temps eĢcouleĢ, Samantha disparaiĢt, et monsieur pervers se reĢ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 meĢ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 succeĢs, Monsieur Pervers n'est pas content et un message aleĢatoire (parmi une base de donneĢes de 75 messages) mesquin s'affiche a l'eĢcran en gras durant et disparaiĢ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 eĢtre geĢneĢrer quand il y en a plus dans le jeu a l'eĢcran. et le nombre de chiots a sauveĢ commence par 3 au niveau 1 pour passer au niveau 2, puis double apreĢs a chaque nouveau niveau par rapport au niveau preĢceĢdent
Code edit (1 edits merged)
Please save this source code
User prompt
Hot-puppy
Initial prompt
CreĢer mon jeu "Hot-puppy", Un jeu dans lequel le joueur doit sauver des chiots, d'un fou nommeĢ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'eĢ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 preĢsente le jeu : Le jeu se deĢroule dans un restaurant (je mettrais un fond personnaliseĢ de restaurant, Merci de me laisser choisir mon assiette personnaliseĢ pour le fond du jeu), le jeu posseĢde 200 niveaux, le jeu se preĢsente ainsi : des chiots apparaissent aleĢatoirement a l'eĢcran (1 seul aĢ la fois si le joueur est de niveau infeĢrieur a 5, entre 2 et 5 en meĢ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 supeĢrieur aĢ 10), De nouveaux chiots sont geĢneĢrer en jeu dans le restaurant, quand il y en a plus a l'eĢcran. une porte de sortie se situe en bas du jeu, Le joueur doit deĢplaceĢ chaque chiot un par un, vers la porte de sortie, quand le chiot entre en collision avec la porte de sortie, il disparaiĢt, et il est sauveĢ, Le joueur gagne 1 chiot sauveĢ dans son score de chiots sauveĢ du jeu, le joueur deĢplace chaque chiot en appuyant sur le chiot, et en utilisant des bouttons directionnels pour le deĢplacer, Le fou monsieur pervers est aussi preĢsent dans ce restaurant, il avance lentement, mais il est surtout occupeĢ aĢ faire cuire de la viande par-dessus une marmite (repreĢsente ça dans le jeu), il ne s'inteĢressera a un chiot, seulement aĢ partir du moment ouĢ le joueur a appuyeĢ dessus pour le deĢ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 disparaiĢt, et le fou la eut! Le joueur perd 1 chiot sauveĢ dans son score de chiots sauveĢ Le joueur doit avoir sauveĢ 3 chiots pour passer du niveau 1 au niveau 2, 6 chiots pour passer du niveau 2 au niveau 3, Et aĢ chaque nouveau niveau, le nombre de chiots a sauveĢ double par rapport au niveau preĢceĢdent pour monter au niveau supeĢrieur ! Le nom du fou est eĢcrit au-dessus de lui dans le jeu, et chaque chiot a un nom geĢneĢreĢ aleĢatoirement par le jeu parmi une base de donneĢes de 50 noms de chiots diffeĢrents, le nom de chaque chiot est eĢcrit en dessous de lui VoilaĢ!
/**** * 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(typeButton.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); // 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
@@ -1382,27 +1382,82 @@
console.log('Invalid puppy type:', typeKey);
return;
}
var maxPuppies = getMaxPuppiesForType(typeKey);
- // Create number selector background
+ // 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
- var selectorTitle = new Text2('Combien de chiots ' + type.name + '?', {
+ // 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 = 900;
+ 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,
@@ -1412,9 +1467,9 @@
numberDisplay.x = 1024;
numberDisplay.y = 1100;
numberDisplay.selectorElement = true;
game.addChild(numberDisplay);
- // Cost display
+ // Cost display with type-specific styling
var costDisplay = new Text2('Coƻt: ' + currentNumber * type.cost + ' SM', {
size: 40,
fill: 0xFFFFFF
});
@@ -1422,9 +1477,9 @@
costDisplay.x = 1024;
costDisplay.y = 1200;
costDisplay.selectorElement = true;
game.addChild(costDisplay);
- // Number buttons (1-9, 0)
+ // 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++) {
@@ -1433,8 +1488,9 @@
var numberGraphics = numberButton.attachAsset('numberButton', {
anchorX: 0.5,
anchorY: 0.5
});
+ numberGraphics.tint = bgColor;
var numText = new Text2(num.toString(), {
size: 30,
fill: 0xFFFFFF
});
@@ -1458,22 +1514,22 @@
costDisplay.setText('Coƻt: ' + currentNumber * type.cost + ' SM');
};
game.addChild(numberButton);
}
- // Validate button
+ // 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('Valider', {
- size: 30,
+ var validateText = new Text2('Acheter ' + type.name, {
+ size: 25,
fill: 0xFFFFFF
});
validateText.anchor.set(0.5, 0.5);
validateButton.addChild(validateText);
- validateButton.x = 1024;
+ validateButton.x = 924;
validateButton.y = 1600;
validateButton.selectorElement = true;
validateButton.down = function (x, y, obj) {
var totalCost = currentNumber * type.cost;
@@ -1495,10 +1551,10 @@
fill: 0xFFFFFF
});
cancelText.anchor.set(0.5, 0.5);
cancelButton.addChild(cancelText);
- cancelButton.x = 1024;
- cancelButton.y = 1700;
+ cancelButton.x = 1124;
+ cancelButton.y = 1600;
cancelButton.selectorElement = true;
cancelButton.down = function (x, y, obj) {
closeNumberSelector();
};
Fond d'eĢ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 fantoĢme (animal). In-Game asset. 2d. High contrast. No shadows
Chiot dragon (animal). In-Game asset. 2d. High contrast. No shadows
Chiot doreĢe (animal). In-Game asset. 2d. High contrast. No shadows
Chiot vampire. In-Game asset. 2d. High contrast. No shadows
Chiot sireĢne. In-Game asset. 2d. High contrast. No shadows
fond mignon kawaii rose. In-Game asset. 2d. High contrast. No shadows