User prompt
Ajoute une fonctionnalité qui compte le nombre de Dauphins que le joueur a élevé depuis ses débuts dans le jeu, A chaque nouveau dauphins élever (lors d'une nouvelle partie, ou un dauphin acheter), Le compteur de dauphins élever monte de 1 a chaque dauphin élever, Le nombre de dauphins élever est persistant d'une partie a une autre, Et est affiché a l'ui du joueur ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Fait en sorte que le joueur garde ses dauphins d'une partie a une autre ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Je veux personnalisé le fond du jeu avec mon propre asset
User prompt
Ajoute ces expressions pour les dauphins : * Expressions / États : Heureux (cœurs flottants, étincelles), Affamé (bulle de pensée avec un poisson), Neutre, Triste (si négligé). ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Ajoute 54 nouvelles questions au quizz
User prompt
Fait en sorte que le joueur puisse gagner de la dauphibouffe en répondant correctement aux quizz, ou à chaque fois qu'il caresse un dauphin (le joueur gagne 5 dauphibouffe a chaque fois qu'il caresse un dauphin, et aléatoirement entre 10 et 30 dauphibouffe a chaque quizz répondue correctement), ajoute un boutton rose a texte blanc "nourrir" sous chaque dauphin du joueur, ou le joueur, en appuyant dessus peut nourir son dauphin ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Toute la progression du joueur (les noms de ses dauphins, leurs niveaux,leurs cerceaux possèdes ) doivent être sauvegardée de manière persistante dans le storage ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Au pire fait en sorte que les noms générique de dauphins soient aléatoires entre une base de données de 80 noms de dauphins différents (pas de flipper , des noms originaux stp) ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Tu comprends donc rien, je te demande de faire en sorte que quand le joueur choisis le nom de son dauphin, le nom personnalisé de son dauphin reste le nom personnalisé de son dauphin, Meme si le joueur rejoue plus tard, ça doit être sauvegardée avec le storage, et ne plus affiche de nom générique ou flipper etc...NON juste le nom personnalisé choisis par le joueur ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Tu comprends donc rien, je te demande de faire en sorte que quand le joueur choisis le nom de son dauphin, le nom personnalisé de son dauphin reste le nom personnalisé de son dauphin, Meme si le joueur rejoue plus tard, ça doit être sauvegardée avec le storage, et ne plus affiche de nom générique ou flipper etc...NON juste le nom personnalisé choisis par le joueur ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Au pire au lieu d'un nom générique de dauphins, fait en sorte que le nom du dauphin soit de façon permanente le nom choisis par le joueur ! ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Mais faut que le nouveau nom du dauphin soit sauvegarder de façon persistante dès que le joueur change le nom du dauphin !!!! Et que ça soit sauvegarder localement ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Mais faut que le nouveau nom du dauphin soit sauvegarder de façon persistante dès que le joueur change le nom du dauphin !!!! Et que ça soit sauvegarder localement ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Mais faut que le nouveau nom du dauphin soit sauvegarder de façon persistante dès que le joueur change le nom du dauphin !!!! ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Fait en sorte que au lieu du nom flipper, il y est le nom personnalisé du dauphin qui soit sauvegarder de façon persistante si le joueur la précédemment changer, et ça pour chaque dauphin que possède le joueur ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Fait en sorte que au lieu du nom flipper, il y est le nom personnalisé du dauphin qui soit sauvegarder de façon persistante si le joueur la précédemment changer, et ça pour chaque dauphin que possède le joueur ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Fait en sorte que les noms des dauphins, les dauphins posséder par le joueur, leurs cerceaux posséder et leur niveau soit sauvegarder (quand le joueur change le nom de son dauphin le nouveau nom doit être sauvegardée de façon permanente et remplacer l'ancien) ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Fait en sorte que les noms des dauphins, les dauphins posséder par le joueur, leurs cerceaux posséder et leur niveau soit sauvegarder (quand le joueur change le nom de son dauphin le nouveau nom doit être sauvegardée de façon permanente et remplacer l'ancien) ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Fait en sorte que les noms des dauphins, les dauphins posséder par le joueur, leurs cerceaux posséder et leur niveau soit sauvegarder (et que quand le joueur change le nom de son dauphin, le nouveau nom soit sauvegarder de manière permanente) ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Fait en sorte que les noms des dauphins, les dauphins posséder par le joueur, leurs cerceaux posséder et leur niveau soit sauvegarder ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Fait en sorte que les noms des dauphins, les dauphins posséder par le joueur, leurs cerceaux posséder et leur niveau soit sauvegarder ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toGlobal')' in or related to this line: 'var localPos = self.toLocal(obj.parent.toGlobal(obj.position));' Line Number: 240
User prompt
Corrigé les problemes
User prompt
Ajoute la fonctionnalité qui permet au joueur de caresser ses dauphins (3 Dauphicoins par caresse et une caresse par dauphin toutes les minutes seulement) avec un bouton violet a texte blanc "caresser" sous chaque dauphin du joueur Par la même occasion, fait en sorte que la progression du joueur et de ses dauphins (Nombre de Dauphicoins, dauphibouffe, cerceaux achetés et posséder par les dauphins, niveaux des dauphins , noms des Dauphins) Soient sauvegardes ! ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Corrigé les problèmes
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Coral = Container.expand(function (type, x, y) { var self = Container.call(this); var coralTypes = ['coral1', 'coral2', 'coral3']; var coralAsset = coralTypes[type % 3]; var coral = self.attachAsset(coralAsset, { anchorX: 0.5, anchorY: 1 }); self.x = x || 0; self.y = y || 0; self.update = function () { // Gentle swaying animation coral.rotation = Math.sin(Date.now() * 0.0008) * 0.1; }; return self; }); var Dolphin = Container.expand(function (name, x, y) { var self = Container.call(this); // Dolphin properties self.dolphinName = name || 'Flipper'; self.happiness = Math.floor(Math.random() * 50) + 25; self.level = 1; self.lastPetTime = 0; self.petCooldown = 60000; // 1 minute self.maxHappiness = 100; self.ownedHoops = []; // Track owned hoops self.hoopIcons = []; // Visual representations of owned hoops // Expression/emotion system self.currentExpression = 'neutral'; self.lastFeedTime = 0; self.expressionElements = []; self.lastExpressionUpdate = 0; // Graphics var dolphinBody = self.attachAsset('dolphin', { anchorX: 0.5, anchorY: 0.5 }); // Happiness bar background var happinessBarBg = self.attachAsset('happinessBarBg', { anchorX: 0.5, anchorY: 0.5, x: 0, y: -80 }); // Happiness bar var happinessBar = self.attachAsset('happinessBar', { anchorX: 0, anchorY: 0.5, x: -80, y: -80 }); // Cooldown bar background var cooldownBarBg = self.attachAsset('cooldownBarBg', { anchorX: 0.5, anchorY: 0.5, x: 0, y: -55 }); // Cooldown bar var cooldownBar = self.attachAsset('cooldownBar', { anchorX: 0, anchorY: 0.5, x: -80, y: -55 }); // Name text var nameText = new Text2(self.dolphinName, { size: 36, fill: 0xFFFFFF }); nameText.anchor.set(0.5, 0.5); nameText.x = 0; nameText.y = -120; self.addChild(nameText); // Store reference for external access self.nameText = nameText; // Pet button var petButton = self.attachAsset('petButton', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 80 }); var petButtonText = new Text2('Caresser', { size: 28, fill: 0xFFFFFF }); petButtonText.anchor.set(0.5, 0.5); petButtonText.x = 0; petButtonText.y = 80; self.addChild(petButtonText); // Feed button var feedButton = self.attachAsset('petButton', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 140 }); feedButton.tint = 0xE91E63; // Pink color var feedButtonText = new Text2('Nourrir', { size: 28, fill: 0xFFFFFF }); feedButtonText.anchor.set(0.5, 0.5); feedButtonText.x = 0; feedButtonText.y = 140; self.addChild(feedButtonText); // Level text var levelText = new Text2('Niv.' + self.level, { size: 28, fill: 0xFFEB3B }); levelText.anchor.set(0.5, 0.5); levelText.x = 0; levelText.y = -100; self.addChild(levelText); // Store reference for external access self.levelText = levelText; self.updateHappinessBar = function () { var percentage = self.happiness / self.maxHappiness; happinessBar.scaleX = percentage; if (self.happiness >= self.maxHappiness) { self.levelUp(); } }; self.updateCooldownBar = function () { var now = Date.now(); var timeSinceLastPet = now - self.lastPetTime; var cooldownRemaining = Math.max(0, self.petCooldown - timeSinceLastPet); var percentage = cooldownRemaining / self.petCooldown; cooldownBar.scaleX = percentage; cooldownBar.visible = percentage > 0; cooldownBarBg.visible = percentage > 0; }; self.clearExpressionElements = function () { for (var i = 0; i < self.expressionElements.length; i++) { self.expressionElements[i].destroy(); } self.expressionElements = []; }; self.updateExpression = function () { var now = Date.now(); // Clear old expression elements self.clearExpressionElements(); // Determine current expression based on state var timeSinceLastPet = now - self.lastPetTime; var timeSinceLastFeed = now - self.lastFeedTime; if (self.happiness >= 80) { self.currentExpression = 'happy'; } else if (timeSinceLastFeed > 300000 || self.happiness < 30) { // 5 minutes since last feed or low happiness self.currentExpression = 'hungry'; } else if (self.happiness < 50 && timeSinceLastPet > 180000) { // Low happiness and 3 minutes since pet self.currentExpression = 'sad'; } else { self.currentExpression = 'neutral'; } // Create expression elements based on current state if (self.currentExpression === 'happy') { // Create floating hearts for (var i = 0; i < 3; i++) { var heart = self.attachAsset('heart', { anchorX: 0.5, anchorY: 0.5, x: Math.random() * 60 - 30, y: -40 - Math.random() * 20 }); self.expressionElements.push(heart); // Animate hearts floating up tween(heart, { y: heart.y - 50, alpha: 0 }, { duration: 2000, easing: tween.easeOut }); } // Create sparkles for (var i = 0; i < 4; i++) { var sparkle = self.attachAsset('sparkle', { anchorX: 0.5, anchorY: 0.5, x: Math.random() * 80 - 40, y: Math.random() * 40 - 20 }); self.expressionElements.push(sparkle); // Animate sparkles twinkling tween(sparkle, { scaleX: 1.5, scaleY: 1.5, alpha: 0 }, { duration: 1500, easing: tween.easeInOut }); } } else if (self.currentExpression === 'hungry') { // Create thought bubble with fish var thoughtBubble = self.attachAsset('thoughtBubble', { anchorX: 0.5, anchorY: 0.5, x: 60, y: -60, alpha: 0.8 }); self.expressionElements.push(thoughtBubble); var fish = self.attachAsset('fish', { anchorX: 0.5, anchorY: 0.5, x: 60, y: -60 }); self.expressionElements.push(fish); // Animate thought bubble pulsing tween(thoughtBubble, { scaleX: 1.1, scaleY: 1.1 }, { duration: 1000, easing: tween.easeInOut, onFinish: function onFinish() { tween(thoughtBubble, { scaleX: 1, scaleY: 1 }, { duration: 1000, easing: tween.easeInOut }); } }); } else if (self.currentExpression === 'sad') { // Tint dolphin slightly blue for sadness tween(dolphinBody, { tint: 0x8bb6d6 }, { duration: 500 }); } else { // Neutral - ensure normal tint tween(dolphinBody, { tint: 0x4fa8d8 }, { duration: 500 }); } self.lastExpressionUpdate = now; }; self.addHoopIcon = function (hoopType) { // Add hoop type to owned hoops self.ownedHoops.push(hoopType); // Create small hoop icon var hoopAssetNames = ['hoop', 'hoopCute', 'hoopTricolore', 'hoopEnflamme', 'hoopOcean']; var hoopIcon = self.attachAsset(hoopAssetNames[hoopType] || 'hoop', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.3, scaleY: 0.3 }); // Position icon next to dolphin var iconIndex = self.hoopIcons.length; hoopIcon.x = 120 + iconIndex * 40; hoopIcon.y = 0; self.hoopIcons.push(hoopIcon); // Save hoop progression immediately updateUI(); }; self.canPet = function () { var now = Date.now(); return now - self.lastPetTime >= self.petCooldown; }; self.pet = function () { if (!self.canPet()) return false; self.lastPetTime = Date.now(); self.happiness = Math.min(self.happiness + 10, self.maxHappiness); dauphicoins += 3; dauphibouffe += 5; // Player gains 5 dauphibouffe per pet // Pet animation tween(dolphinBody, { scaleX: 1.2, scaleY: 1.2 }, { duration: 200, easing: tween.easeOut }); tween(dolphinBody, { scaleX: 1, scaleY: 1 }, { duration: 200, easing: tween.easeIn }); LK.getSound('pet').play(); LK.getSound('coin').play(); self.updateHappinessBar(); // Trigger happy expression immediately self.updateExpression(); updateUI(); return true; }; self.feed = function () { if (dauphibouffe <= 0) return false; dauphibouffe--; self.lastFeedTime = Date.now(); self.happiness = Math.min(self.happiness + 20, self.maxHappiness); // Feed animation tween(dolphinBody, { tint: 0x8bc34a }, { duration: 300 }); tween(dolphinBody, { tint: 0x4fa8d8 }, { duration: 300 }); self.updateHappinessBar(); // Update expression after feeding self.updateExpression(); updateUI(); return true; }; self.levelUp = function () { self.level++; self.happiness = 0; self.maxHappiness += 10; trainerXP += 10; // Level up animation LK.effects.flashObject(self, 0xffeb3b, 1000); LK.getSound('levelup').play(); self.levelText.setText('Niv.' + self.level); self.updateHappinessBar(); updateUI(); // Check trainer level up var newTrainerLevel = Math.floor(trainerXP / 50) + 1; if (newTrainerLevel > trainerLevel) { trainerLevel = newTrainerLevel; updateUI(); } }; self.down = function (x, y, obj) { var localPos; if (obj && obj.parent && obj.parent.toGlobal) { localPos = self.toLocal(obj.parent.toGlobal(obj.position)); } else { localPos = { x: x, y: y }; } // Check if pet button was clicked if (localPos.x >= -80 && localPos.x <= 80 && localPos.y >= 50 && localPos.y <= 110) { if (self.canPet()) { self.pet(); } } else if (localPos.x >= -80 && localPos.x <= 80 && localPos.y >= 110 && localPos.y <= 170) { // Check if feed button was clicked if (dauphibouffe > 0) { self.feed(); } } else { // Original dolphin body click behavior if (self.canPet()) { self.pet(); } else { // Show feed option if has food if (dauphibouffe > 0) { self.feed(); } } } }; self.update = function () { self.updateCooldownBar(); // Gentle floating animation dolphinBody.y = Math.sin(Date.now() * 0.001) * 10; // Update expressions every 3 seconds var now = Date.now(); if (now - self.lastExpressionUpdate > 3000) { self.updateExpression(); } }; // Position dolphin self.x = x || 0; self.y = y || 0; // Initialize bars self.updateHappinessBar(); self.updateCooldownBar(); return self; }); var Hoop = Container.expand(function (x, y) { var self = Container.call(this); var hoop = self.attachAsset('hoop', { anchorX: 0.5, anchorY: 0.5 }); // Make hoop hollow by reducing alpha in center hoop.alpha = 0.3; self.hoopType = 0; // Default to golden hoop self.attachedDolphin = null; self.x = x || 0; self.y = y || 0; self.update = function () { // Gentle rotation hoop.rotation += 0.01; // Apply color based on hoop type if (hoopTypes && hoopTypes[self.hoopType]) { hoop.tint = hoopTypes[self.hoopType].color; } // Follow attached dolphin if any if (self.attachedDolphin) { self.x = self.attachedDolphin.x; self.y = self.attachedDolphin.y - 50; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x0066cc }); /**** * Game Code ****/ // Game variables var dolphins = []; var corals = []; var hoops = []; var dauphicoins = storage.dauphicoins !== undefined ? storage.dauphicoins : 50; var dauphibouffe = storage.dauphibouffe !== undefined ? storage.dauphibouffe : 3; var trainerLevel = storage.trainerLevel !== undefined ? storage.trainerLevel : 1; var trainerXP = storage.trainerXP !== undefined ? storage.trainerXP : 0; // Database of 80 unique dolphin names var dolphinNames = ['Luna', 'Neptune', 'Océan', 'Azur', 'Coral', 'Marina', 'Aqua', 'Bleu', 'Splash', 'Bubble', 'Wave', 'Tide', 'Storm', 'Misty', 'Pearl', 'Crystal', 'Echo', 'Sonic', 'Melody', 'Harmony', 'Rhythm', 'Jazz', 'Blues', 'Tempo', 'Atlas', 'Zeus', 'Triton', 'Poseidon', 'Apollo', 'Orion', 'Cosmos', 'Nova', 'Star', 'Comet', 'Galaxy', 'Meteor', 'Stellar', 'Solar', 'Lunar', 'Cosmic', 'Aquarius', 'Pisces', 'Delphinus', 'Cetus', 'Orca', 'Narval', 'Beluga', 'Marlin', 'Spirit', 'Dream', 'Hope', 'Joy', 'Grace', 'Faith', 'Love', 'Peace', 'Thunder', 'Lightning', 'Rain', 'Frost', 'Snow', 'Ice', 'Wind', 'Breeze', 'Coral', 'Reef', 'Lagoon', 'Bay', 'Cove', 'Shore', 'Beach', 'Dune', 'Captain', 'Admiral', 'Sailor', 'Navigator', 'Explorer', 'Voyager', 'Pioneer', 'Ranger']; // Track used names to avoid duplicates - load from storage var usedNames = storage.usedNames || []; // Hoop types with their properties var hoopTypes = [{ name: 'Cerceau Doré', price: 50, color: 0xFFD700 }, { name: 'Cerceau Cute', price: 25, color: 0xFF69B4 }, { name: 'Cerceau Tricolore', price: 34, color: 0x0000FF }, { name: 'Cerceau Enflammé', price: 45, color: 0xFF4500 }, { name: 'Cerceau de l\'Océan', price: 50, color: 0x00CED1 }]; // UI elements var coinText, foodText, trainerText; var shopModal = null; var quizModal = null; var hoopSelectionModal = null; var dolphinSelectionModal = null; var namingModal = null; var keyboardModal = null; var selectedHoopType = null; var selectedDolphinForNaming = null; var currentInputText = ''; // Quiz questions var quizQuestions = [{ question: "Qu'utilisent les dauphins pour l'écholocation ?", answers: ["Ondes sonores", "Ondes lumineuses", "Champs magnétiques", "Champs électriques"], correct: 0 }, { question: "Combien de temps les dauphins peuvent-ils retenir leur respiration ?", answers: ["5 minutes", "15 minutes", "30 minutes", "1 heure"], correct: 1 }, { question: "Comment appelle-t-on un groupe de dauphins ?", answers: ["Banc", "Pod", "Troupeau", "Meute"], correct: 1 }, { question: "Comment les dauphins dorment-ils ?", answers: ["Complètement inconscients", "Une moitié du cerveau à la fois", "Ne dorment jamais", "Seulement la nuit"], correct: 1 }, { question: "Quelle est la plus grande espèce de dauphin ?", answers: ["Grand dauphin", "Orque", "Dauphin à long bec", "Dauphin sombre"], correct: 1 }, { question: "À quelle profondeur les dauphins peuvent-ils plonger ?", answers: ["50 mètres", "200 mètres", "500 mètres", "1000 mètres"], correct: 2 }, { question: "Combien de dents a un grand dauphin adulte ?", answers: ["20-30", "40-50", "80-100", "120-140"], correct: 2 }, { question: "Quelle est la vitesse maximale d'un dauphin ?", answers: ["15 km/h", "35 km/h", "55 km/h", "75 km/h"], correct: 2 }, { question: "Où vivent les dauphins roses ?", answers: ["Océan Pacifique", "Mer Méditerranée", "Fleuve Amazone", "Océan Arctique"], correct: 2 }, { question: "Quel est le nom scientifique du grand dauphin ?", answers: ["Delphinus delphis", "Tursiops truncatus", "Orcinus orca", "Stenella longirostris"], correct: 1 }, { question: "Combien pèse un dauphin adulte en moyenne ?", answers: ["50-100 kg", "150-300 kg", "400-500 kg", "600-800 kg"], correct: 1 }, { question: "Quelle est la durée de gestation d'un dauphin ?", answers: ["6 mois", "9 mois", "12 mois", "18 mois"], correct: 2 }, { question: "À quel âge les dauphins atteignent-ils la maturité sexuelle ?", answers: ["2-3 ans", "5-7 ans", "10-12 ans", "15-20 ans"], correct: 1 }, { question: "Comment les dauphins communiquent-ils principalement ?", answers: ["Gestes", "Couleurs", "Sons et sifflements", "Odeurs"], correct: 2 }, { question: "Quelle est la température corporelle d'un dauphin ?", answers: ["32°C", "37°C", "42°C", "45°C"], correct: 1 }, { question: "Combien de chambres a le cœur d'un dauphin ?", answers: ["2", "3", "4", "5"], correct: 2 }, { question: "Quel pourcentage du cerveau utilisent les dauphins ?", answers: ["10%", "50%", "80%", "100%"], correct: 3 }, { question: "Comment s'appelle le bébé dauphin ?", answers: ["Poulain", "Veau", "Petit", "Chiot"], correct: 1 }, { question: "Quelle distance peuvent parcourir les dauphins en une journée ?", answers: ["10 km", "50 km", "100 km", "200 km"], correct: 2 }, { question: "Dans quels océans trouve-t-on des dauphins ?", answers: ["Seulement Atlantique", "Seulement Pacifique", "Tous les océans", "Seulement Indien"], correct: 2 }, { question: "Combien de vertèbres cervicales ont les dauphins ?", answers: ["5", "7", "9", "12"], correct: 1 }, { question: "Quelle est la principale menace pour les dauphins ?", answers: ["Requins", "Pollution", "Maladies", "Froid"], correct: 1 }, { question: "Comment les dauphins régulent-ils leur température ?", answers: ["Poils", "Graisse", "Glandes sudoripares", "Respiration"], correct: 1 }, { question: "Quel est le plus petit dauphin au monde ?", answers: ["Dauphin de Maui", "Dauphin commun", "Marsouin du Pacifique", "Dauphin de Risso"], correct: 0 }, { question: "Combien d'estomacs ont les dauphins ?", answers: ["1", "2", "3", "4"], correct: 2 }, { question: "À quelle fréquence respirent les dauphins ?", answers: ["En continu", "Toutes les 30 secondes", "Toutes les 8-10 minutes", "Une fois par heure"], correct: 2 }, { question: "Comment les dauphins voient-ils sous l'eau ?", answers: ["Mal", "En noir et blanc", "Très bien", "Seulement de près"], correct: 2 }, { question: "Quelle est la structure sociale des dauphins ?", answers: ["Solitaires", "En couples", "En groupes", "En familles"], correct: 2 }, { question: "Comment s'appelle l'évent des dauphins ?", answers: ["Narine", "Spiracle", "Blowhole", "Trou respiratoire"], correct: 2 }, { question: "Quelle est la portée de l'écholocation des dauphins ?", answers: ["10 mètres", "50 mètres", "100 mètres", "500 mètres"], correct: 2 }, { question: "Les dauphins sont-ils des mammifères ?", answers: ["Non, ce sont des poissons", "Oui", "Parfois", "Seulement les grands"], correct: 1 }, { question: "Quel sens est le plus développé chez les dauphins ?", answers: ["Vue", "Ouïe", "Odorat", "Toucher"], correct: 1 }, { question: "Combien de sons différents un dauphin peut-il produire ?", answers: ["10", "50", "200", "Plus de 1000"], correct: 3 }, { question: "Comment les dauphins reconnaissent-ils leurs proches ?", answers: ["Par l'odeur", "Par la vue", "Par leur signature sifflée", "Par le toucher"], correct: 2 }, { question: "Quelle est la couleur typique d'un grand dauphin ?", answers: ["Blanc", "Gris", "Bleu", "Noir"], correct: 1 }, { question: "À quelle profondeur vivent principalement les dauphins ?", answers: ["Surface seulement", "0-200 mètres", "200-500 mètres", "Plus de 1000 mètres"], correct: 1 }, { question: "Comment naissent les bébés dauphins ?", answers: ["Tête première", "Queue première", "Sur le côté", "Dans un œuf"], correct: 1 }, { question: "Combien de temps un bébé dauphin reste-t-il avec sa mère ?", answers: ["6 mois", "1-2 ans", "3-6 ans", "10 ans"], correct: 2 }, { question: "Quel est le prédateur principal des dauphins ?", answers: ["Baleine", "Requin", "Pieuvre", "Raie"], correct: 1 }, { question: "Comment les dauphins chassent-ils en groupe ?", answers: ["Individuellement", "En cercle", "En ligne", "Au hasard"], correct: 1 }, { question: "Quelle est la nourriture préférée des dauphins ?", answers: ["Algues", "Plancton", "Poissons", "Crustacés"], correct: 2 }, { question: "Les dauphins peuvent-ils sauter hors de l'eau ?", answers: ["Non, jamais", "Rarement", "Souvent", "Seulement en captivité"], correct: 2 }, { question: "Combien de nageoires a un dauphin ?", answers: ["2", "3", "4", "5"], correct: 3 }, { question: "Quelle est la fonction de la nageoire dorsale ?", answers: ["Nager plus vite", "Stabilité", "Communication", "Respiration"], correct: 1 }, { question: "Comment s'appelle la queue d'un dauphin ?", answers: ["Palme", "Nageoire caudale", "Gouvernail", "Aileron"], correct: 1 }, { question: "Les dauphins migrent-ils ?", answers: ["Non, jamais", "Oui, tous", "Certaines espèces", "Seulement les jeunes"], correct: 2 }, { question: "Quelle distance peut couvrir l'écholocation d'un dauphin ?", answers: ["1 mètre", "10 mètres", "100 mètres", "1 kilomètre"], correct: 2 }, { question: "Comment les dauphins expriment-ils la joie ?", answers: ["En chantant", "En sautant", "En nageant vite", "En se touchant"], correct: 1 }, { question: "Quel âge peut atteindre un dauphin en liberté ?", answers: ["10-15 ans", "20-25 ans", "30-45 ans", "50-60 ans"], correct: 2 }, { question: "Comment les dauphins nettoient-ils leur peau ?", answers: ["Avec du sable", "En se frottant", "Avec des algues", "Avec l'aide d'autres poissons"], correct: 3 }, { question: "Quelle partie du corps utilisent les dauphins pour l'écholocation ?", answers: ["Les yeux", "Le melon", "La queue", "Les nageoires"], correct: 1 }, { question: "Les dauphins peuvent-ils reconnaître leur reflet ?", answers: ["Non", "Oui", "Parfois", "Seulement les adultes"], correct: 1 }, { question: "Comment s'appelle le groupe de dauphins qui chasse ensemble ?", answers: ["Banc", "Pod", "Alliance", "Meute"], correct: 2 }, { question: "Quelle est la particularité des dauphins roses d'Amazonie ?", answers: ["Ils volent", "Ils vivent en eau douce", "Ils sont très petits", "Ils ne nagent pas"], correct: 1 }, { question: "Comment les dauphins apprennent-ils à chasser ?", answers: ["Instinct seulement", "En observant leur mère", "En essayant seuls", "Ils savent déjà"], correct: 1 }, { question: "Quelle est la forme du crâne des dauphins ?", answers: ["Rond", "Pointu", "Allongé", "Plat"], correct: 2 }, { question: "Les dauphins ont-ils des cordes vocales ?", answers: ["Oui", "Non", "Seulement les mâles", "Seulement les femelles"], correct: 1 }, { question: "Comment les dauphins se dirigent-ils dans l'obscurité ?", answers: ["Au hasard", "Avec l'écholocation", "En suivant les courants", "Grâce aux étoiles"], correct: 1 }, { question: "Quel est le rôle du père chez les dauphins ?", answers: ["Protéger le bébé", "Chasser pour la famille", "Enseigner la nage", "Aucun rôle particulier"], correct: 3 }, { question: "Comment les dauphins montrent-ils leur affection ?", answers: ["En se touchant", "En chantant", "En nageant ensemble", "Toutes ces réponses"], correct: 3 }, { question: "Quelle est la principale différence entre dauphins et marsouins ?", answers: ["La taille", "La forme du bec", "La couleur", "L'habitat"], correct: 1 }]; function getRandomDolphinName() { // If all names are used, reset the used names array if (usedNames.length >= dolphinNames.length) { usedNames = []; } var availableNames = []; for (var i = 0; i < dolphinNames.length; i++) { var name = dolphinNames[i]; var nameUsed = false; for (var j = 0; j < usedNames.length; j++) { if (usedNames[j] === name) { nameUsed = true; break; } } if (!nameUsed) { availableNames.push(name); } } // Pick random name from available names var randomIndex = Math.floor(Math.random() * availableNames.length); var selectedName = availableNames[randomIndex]; // Mark this name as used usedNames.push(selectedName); return selectedName; } function updateUI() { if (coinText) coinText.setText('Dauphicoins: ' + dauphicoins); if (foodText) foodText.setText('Dauphibouffe: ' + dauphibouffe); if (trainerText) trainerText.setText('Dresseur Niv.' + trainerLevel + ' (' + trainerXP + ' XP)'); // Save to storage with error handling try { storage.dauphicoins = dauphicoins; storage.dauphibouffe = dauphibouffe; storage.trainerLevel = trainerLevel; storage.trainerXP = trainerXP; // Save complete dolphin progression data including names, levels, and owned hoops var dolphinData = []; for (var i = 0; i < dolphins.length; i++) { var dolphin = dolphins[i]; if (dolphin && dolphin.dolphinName) { dolphinData.push({ name: dolphin.dolphinName, happiness: dolphin.happiness, level: dolphin.level, maxHappiness: dolphin.maxHappiness, lastPetTime: dolphin.lastPetTime, ownedHoops: dolphin.ownedHoops || [], x: dolphin.x, y: dolphin.y, petCooldown: dolphin.petCooldown }); } } storage.dolphinData = dolphinData; // Save complete game progression storage.dolphinCount = dolphins.length; storage.usedNames = usedNames; } catch (e) { console.log('Storage error:', e); } } function createShopModal() { if (shopModal) return; shopModal = new Container(); var modalBg = shopModal.attachAsset('modalBg', { anchorX: 0.5, anchorY: 0.5, alpha: 0.9 }); var panel = shopModal.attachAsset('panel', { anchorX: 0.5, anchorY: 0.5 }); var titleText = new Text2('Boutique des Dauphins', { size: 70, fill: 0x000000 }); titleText.anchor.set(0.5, 0.5); titleText.x = 0; titleText.y = -320; shopModal.addChild(titleText); // New dolphin button var newDolphinBtn = shopModal.attachAsset('button', { anchorX: 0.5, anchorY: 0.5, x: 0, y: -180, scaleX: 1.5, scaleY: 1.3 }); var dolphinBtnText = new Text2('Nouveau Dauphin (100 Dauphicoins)', { size: 36, fill: 0x000000 }); dolphinBtnText.anchor.set(0.5, 0.5); dolphinBtnText.x = 0; dolphinBtnText.y = -180; shopModal.addChild(dolphinBtnText); // Hoop buttons for each type for (var h = 0; h < hoopTypes.length; h++) { var hoopBtn = shopModal.attachAsset('button', { anchorX: 0.5, anchorY: 0.5, x: (h % 3 - 1) * 300, y: -60 + Math.floor(h / 3) * 140, scaleX: 1.4, scaleY: 1.2 }); var hoopBtnText = new Text2(hoopTypes[h].name + ' (' + hoopTypes[h].price + ' Dauphicoins)', { size: 32, fill: 0x000000 }); hoopBtnText.anchor.set(0.5, 0.5); hoopBtnText.x = (h % 3 - 1) * 300; hoopBtnText.y = -60 + Math.floor(h / 3) * 140; shopModal.addChild(hoopBtnText); } // Close button var closeBtn = shopModal.attachAsset('button', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 250, scaleX: 1.2, scaleY: 1.0 }); var closeBtnText = new Text2('Fermer', { size: 42, fill: 0x000000 }); closeBtnText.anchor.set(0.5, 0.5); closeBtnText.x = 0; closeBtnText.y = 250; shopModal.addChild(closeBtnText); shopModal.x = 1024; shopModal.y = 1366; shopModal.down = function (x, y, obj) { var localPos; if (obj.parent && obj.parent.toGlobal) { localPos = shopModal.toLocal(obj.parent.toGlobal(obj.position)); } else { localPos = { x: x, y: y }; } // Check new dolphin button if (localPos.x >= -150 && localPos.x <= 150 && localPos.y >= -220 && localPos.y <= -140) { if (dauphicoins >= 100) { dauphicoins -= 100; // Create unique random name for new dolphin var randomName = getRandomDolphinName(); var newDolphin = new Dolphin(randomName, 400 + dolphins.length % 3 * 300, 800 + Math.floor(dolphins.length / 3) * 300); dolphins.push(newDolphin); game.addChild(newDolphin); updateUI(); LK.getSound('coin').play(); } } // Check hoop buttons for (var h = 0; h < hoopTypes.length; h++) { var btnX = (h % 3 - 1) * 300; var btnY = -60 + Math.floor(h / 3) * 140; if (localPos.x >= btnX - 140 && localPos.x <= btnX + 140 && localPos.y >= btnY - 50 && localPos.y <= btnY + 50) { if (dauphicoins >= hoopTypes[h].price) { selectedHoopType = h; game.removeChild(shopModal); shopModal = null; createHoopSelectionModal(); } break; } } // Check close button if (localPos.x >= -120 && localPos.x <= 120 && localPos.y >= 210 && localPos.y <= 290) { game.removeChild(shopModal); shopModal = null; } }; game.addChild(shopModal); } function createHoopSelectionModal() { if (hoopSelectionModal || dolphins.length === 0) return; hoopSelectionModal = new Container(); var modalBg = hoopSelectionModal.attachAsset('modalBg', { anchorX: 0.5, anchorY: 0.5, alpha: 0.8 }); var panel = hoopSelectionModal.attachAsset('panel', { anchorX: 0.5, anchorY: 0.5 }); var titleText = new Text2('Choisir un Dauphin pour le Cerceau', { size: 50, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 0; titleText.y = -300; hoopSelectionModal.addChild(titleText); // Dolphin selection buttons for (var d = 0; d < dolphins.length; d++) { var dolphinBtn = hoopSelectionModal.attachAsset('button', { anchorX: 0.5, anchorY: 0.5, x: 0, y: -200 + d * 80 }); var dolphinBtnText = new Text2(dolphins[d].dolphinName, { size: 36, fill: 0xFFFFFF }); dolphinBtnText.anchor.set(0.5, 0.5); dolphinBtnText.x = 0; dolphinBtnText.y = -200 + d * 80; hoopSelectionModal.addChild(dolphinBtnText); } // Cancel button var cancelBtn = hoopSelectionModal.attachAsset('button', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 200, scaleX: 0.8, scaleY: 0.8 }); var cancelBtnText = new Text2('Annuler', { size: 36, fill: 0xFFFFFF }); cancelBtnText.anchor.set(0.5, 0.5); cancelBtnText.x = 0; cancelBtnText.y = 200; hoopSelectionModal.addChild(cancelBtnText); hoopSelectionModal.x = 1024; hoopSelectionModal.y = 1366; hoopSelectionModal.down = function (x, y, obj) { var localPos; if (obj.parent && obj.parent.toGlobal) { localPos = hoopSelectionModal.toLocal(obj.parent.toGlobal(obj.position)); } else { localPos = { x: x, y: y }; } // Check dolphin buttons for (var d = 0; d < dolphins.length; d++) { var buttonY = -200 + d * 80; if (localPos.x >= -100 && localPos.x <= 100 && localPos.y >= buttonY - 30 && localPos.y <= buttonY + 30) { // Purchase hoop for selected dolphin dauphicoins -= hoopTypes[selectedHoopType].price; dolphins[d].addHoopIcon(selectedHoopType); // Save updated hoop data immediately updateUI(); LK.getSound('coin').play(); game.removeChild(hoopSelectionModal); hoopSelectionModal = null; break; } } // Check cancel button if (localPos.x >= -80 && localPos.x <= 80 && localPos.y >= 170 && localPos.y <= 230) { game.removeChild(hoopSelectionModal); hoopSelectionModal = null; } }; game.addChild(hoopSelectionModal); } function createDolphinNamingModal() { if (namingModal || dolphins.length === 0) return; namingModal = new Container(); var modalBg = namingModal.attachAsset('modalBg', { anchorX: 0.5, anchorY: 0.5, alpha: 0.8 }); var panel = namingModal.attachAsset('panel', { anchorX: 0.5, anchorY: 0.5 }); var titleText = new Text2('Choisir un Dauphin à Renommer', { size: 50, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 0; titleText.y = -300; namingModal.addChild(titleText); // Dolphin selection buttons for (var d = 0; d < dolphins.length; d++) { var dolphinBtn = namingModal.attachAsset('button', { anchorX: 0.5, anchorY: 0.5, x: 0, y: -200 + d * 80 }); var dolphinBtnText = new Text2(dolphins[d].dolphinName, { size: 36, fill: 0xFFFFFF }); dolphinBtnText.anchor.set(0.5, 0.5); dolphinBtnText.x = 0; dolphinBtnText.y = -200 + d * 80; namingModal.addChild(dolphinBtnText); } // Cancel button var cancelBtn = namingModal.attachAsset('button', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 200, scaleX: 0.8, scaleY: 0.8 }); var cancelBtnText = new Text2('Annuler', { size: 36, fill: 0xFFFFFF }); cancelBtnText.anchor.set(0.5, 0.5); cancelBtnText.x = 0; cancelBtnText.y = 200; namingModal.addChild(cancelBtnText); namingModal.x = 1024; namingModal.y = 1366; namingModal.down = function (x, y, obj) { var localPos; if (obj.parent && obj.parent.toGlobal) { localPos = namingModal.toLocal(obj.parent.toGlobal(obj.position)); } else { localPos = { x: x, y: y }; } // Check dolphin buttons for (var d = 0; d < dolphins.length; d++) { var buttonY = -200 + d * 80; if (localPos.x >= -100 && localPos.x <= 100 && localPos.y >= buttonY - 30 && localPos.y <= buttonY + 30) { selectedDolphinForNaming = dolphins[d]; currentInputText = dolphins[d].dolphinName; game.removeChild(namingModal); namingModal = null; createKeyboardModal(); break; } } // Check cancel button if (localPos.x >= -80 && localPos.x <= 80 && localPos.y >= 170 && localPos.y <= 230) { game.removeChild(namingModal); namingModal = null; } }; game.addChild(namingModal); } function createKeyboardModal() { if (keyboardModal) return; keyboardModal = new Container(); var modalBg = keyboardModal.attachAsset('modalBg', { anchorX: 0.5, anchorY: 0.5, alpha: 0.95 }); var panel = keyboardModal.attachAsset('panel', { anchorX: 0.5, anchorY: 0.5 }); var titleText = new Text2('Nouveau Nom', { size: 60, fill: 0x000000 }); titleText.anchor.set(0.5, 0.5); titleText.x = 0; titleText.y = -350; keyboardModal.addChild(titleText); // Input display var inputText = new Text2(currentInputText, { size: 50, fill: 0x1976D2 }); inputText.anchor.set(0.5, 0.5); inputText.x = 0; inputText.y = -280; keyboardModal.addChild(inputText); // Keyboard layout with better spacing var keyboard = [['A', 'B', 'C', 'D', 'E', 'F', 'G'], ['H', 'I', 'J', 'K', 'L', 'M', 'N'], ['O', 'P', 'Q', 'R', 'S', 'T', 'U'], ['V', 'W', 'X', 'Y', 'Z', '1', '2'], ['3', '4', '5', '6', '7', '8', '9'], ['0', 'ESPACE', 'EFFACER', 'TOUT EFFACER', 'VALIDER']]; for (var row = 0; row < keyboard.length; row++) { for (var col = 0; col < keyboard[row].length; col++) { var key = keyboard[row][col]; // Better spacing calculation to prevent overlap var keySpacing = key.length > 1 ? 120 : 90; var startOffset = row === 5 ? -200 : (keyboard[row].length - 1) * keySpacing * -0.5; var keyBtn = keyboardModal.attachAsset('button', { anchorX: 0.5, anchorY: 0.5, x: startOffset + col * keySpacing, y: -150 + row * 70, scaleX: key.length > 1 ? 1.6 : 1.2, scaleY: 1.2 }); // Set button background color based on key type if (key === 'EFFACER') { keyBtn.tint = 0xFF6644; } else if (key === 'TOUT EFFACER') { keyBtn.tint = 0xFF4444; } else if (key === 'VALIDER') { keyBtn.tint = 0x44AA44; } else if (key === 'ESPACE') { keyBtn.tint = 0x4488CC; } else { keyBtn.tint = 0xFFFFFF; } // Create text with better visibility var keyText = new Text2(key, { size: key.length > 1 ? 20 : 28, fill: 0x000000 }); keyText.anchor.set(0.5, 0.5); keyText.x = startOffset + col * keySpacing; keyText.y = -150 + row * 70; keyboardModal.addChild(keyText); } } keyboardModal.x = 1024; keyboardModal.y = 1366; keyboardModal.down = function (x, y, obj) { var localPos; if (obj.parent && obj.parent.toGlobal) { localPos = keyboardModal.toLocal(obj.parent.toGlobal(obj.position)); } else { localPos = { x: x, y: y }; } // Check keyboard buttons with updated spacing for (var row = 0; row < keyboard.length; row++) { for (var col = 0; col < keyboard[row].length; col++) { var key = keyboard[row][col]; // Updated position calculation to match button creation var keySpacing = key.length > 1 ? 120 : 90; var startOffset = row === 5 ? -200 : (keyboard[row].length - 1) * keySpacing * -0.5; var keyX = startOffset + col * keySpacing; var keyY = -150 + row * 70; var keyWidth = key.length > 1 ? 96 : 54; // Based on scale factors var keyHeight = 36; // Based on scale factors if (localPos.x >= keyX - keyWidth && localPos.x <= keyX + keyWidth && localPos.y >= keyY - keyHeight && localPos.y <= keyY + keyHeight) { if (key === 'ESPACE') { if (currentInputText.length < 15) { currentInputText += ' '; } } else if (key === 'EFFACER') { if (currentInputText.length > 0) { currentInputText = currentInputText.slice(0, -1); } } else if (key === 'TOUT EFFACER') { currentInputText = ''; } else if (key === 'VALIDER') { if (currentInputText.length > 0 && selectedDolphinForNaming) { // Permanently set the custom name chosen by player selectedDolphinForNaming.dolphinName = currentInputText; // Update dolphin name display to show custom name selectedDolphinForNaming.nameText.setText(currentInputText); // Immediately force save the custom name to ensure it persists between sessions try { var dolphinData = []; for (var i = 0; i < dolphins.length; i++) { var dolphin = dolphins[i]; if (dolphin && dolphin.dolphinName) { dolphinData.push({ name: dolphin.dolphinName, happiness: dolphin.happiness, level: dolphin.level, maxHappiness: dolphin.maxHappiness, lastPetTime: dolphin.lastPetTime, ownedHoops: dolphin.ownedHoops || [], x: dolphin.x, y: dolphin.y }); } } storage.dolphinData = dolphinData; // Force save immediately to ensure persistence storage.dolphinCount = dolphins.length; } catch (e) { console.log('Storage error saving dolphin name:', e); } // Also update UI to save other game data updateUI(); } game.removeChild(keyboardModal); keyboardModal = null; selectedDolphinForNaming = null; currentInputText = ''; return; } else if (currentInputText.length < 15) { currentInputText += key; } inputText.setText(currentInputText); return; } } } }; game.addChild(keyboardModal); } function createQuizModal() { if (quizModal) return; var currentQuestion = quizQuestions[Math.floor(Math.random() * quizQuestions.length)]; quizModal = new Container(); var modalBg = quizModal.attachAsset('modalBg', { anchorX: 0.5, anchorY: 0.5, alpha: 0.8 }); var panel = quizModal.attachAsset('panel', { anchorX: 0.5, anchorY: 0.5 }); var titleText = new Text2('Quiz Marin', { size: 60, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 0; titleText.y = -350; quizModal.addChild(titleText); var questionText = new Text2(currentQuestion.question, { size: 44, fill: 0xFFFFFF }); questionText.anchor.set(0.5, 0.5); questionText.x = 0; questionText.y = -250; quizModal.addChild(questionText); // Answer buttons for (var i = 0; i < currentQuestion.answers.length; i++) { var answerBtn = quizModal.attachAsset('button', { anchorX: 0.5, anchorY: 0.5, x: 0, y: -100 + i * 80 }); var answerText = new Text2(currentQuestion.answers[i], { size: 36, fill: 0xFFFFFF }); answerText.anchor.set(0.5, 0.5); answerText.x = 0; answerText.y = -100 + i * 80; quizModal.addChild(answerText); } quizModal.x = 1024; quizModal.y = 1366; quizModal.down = function (x, y, obj) { var localPos; if (obj.parent && obj.parent.toGlobal) { localPos = quizModal.toLocal(obj.parent.toGlobal(obj.position)); } else { localPos = { x: x, y: y }; } // Check answer buttons for (var i = 0; i < currentQuestion.answers.length; i++) { var buttonY = -100 + i * 80; if (localPos.x >= -100 && localPos.x <= 100 && localPos.y >= buttonY - 30 && localPos.y <= buttonY + 30) { if (i === currentQuestion.correct) { var quizReward = Math.floor(Math.random() * 21) + 10; // Random between 10-30 dauphibouffe += quizReward; LK.getSound('correct').play(); LK.effects.flashScreen(0x4caf50, 500); } else { LK.effects.flashScreen(0xf44336, 500); } updateUI(); game.removeChild(quizModal); quizModal = null; break; } } }; game.addChild(quizModal); } // Create background corals for (var i = 0; i < 8; i++) { var coral = new Coral(i, 200 + i * 250, 2700 - Math.random() * 200); corals.push(coral); game.addChild(coral); } // Load saved dolphins or create starting dolphin if (storage.dolphinData && storage.dolphinData.length > 0) { for (var i = 0; i < storage.dolphinData.length; i++) { var data = storage.dolphinData[i]; if (data && data.name) { // Create dolphin with the exact saved custom name - this is permanent var savedDolphin = new Dolphin(data.name, data.x || 1024, data.y || 1200); savedDolphin.happiness = data.happiness || 50; savedDolphin.level = data.level || 1; savedDolphin.maxHappiness = data.maxHappiness || 100; savedDolphin.lastPetTime = data.lastPetTime || 0; savedDolphin.petCooldown = data.petCooldown || 60000; savedDolphin.ownedHoops = data.ownedHoops || []; // Ensure the custom name is permanently retained - no generic names savedDolphin.dolphinName = data.name; // Display the custom name permanently savedDolphin.nameText.setText(data.name); // Update level display to match saved level using stored reference if (savedDolphin.levelText) { savedDolphin.levelText.setText('Niv.' + savedDolphin.level); } // Update happiness bars to reflect saved state savedDolphin.updateHappinessBar(); // Initialize expression system savedDolphin.lastFeedTime = data.lastFeedTime || 0; savedDolphin.updateExpression(); // Restore hoop icons without triggering additional saves for (var h = 0; h < savedDolphin.ownedHoops.length; h++) { // Create small hoop icon var hoopAssetNames = ['hoop', 'hoopCute', 'hoopTricolore', 'hoopEnflamme', 'hoopOcean']; var hoopIcon = savedDolphin.attachAsset(hoopAssetNames[savedDolphin.ownedHoops[h]] || 'hoop', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.3, scaleY: 0.3 }); // Position icon next to dolphin hoopIcon.x = 120 + h * 40; hoopIcon.y = 0; savedDolphin.hoopIcons.push(hoopIcon); } dolphins.push(savedDolphin); game.addChild(savedDolphin); } } } else { // Create starting dolphin with random name that can be changed var randomStartName = getRandomDolphinName(); var firstDolphin = new Dolphin(randomStartName, 1024, 1200); // Initialize expression system for new dolphin firstDolphin.updateExpression(); dolphins.push(firstDolphin); game.addChild(firstDolphin); } // Create UI coinText = new Text2('Dauphicoins: ' + dauphicoins, { size: 48, fill: 0xFFEB3B }); coinText.anchor.set(0, 0); coinText.x = 120; coinText.y = 50; LK.gui.topLeft.addChild(coinText); foodText = new Text2('Dauphibouffe: ' + dauphibouffe, { size: 48, fill: 0x8BC34A }); foodText.anchor.set(0, 0); foodText.x = 120; foodText.y = 120; LK.gui.topLeft.addChild(foodText); trainerText = new Text2('Dresseur Niv.' + trainerLevel + ' (' + trainerXP + ' XP)', { size: 48, fill: 0xFFFFFF }); trainerText.anchor.set(0.5, 0); trainerText.x = 0; trainerText.y = 50; LK.gui.top.addChild(trainerText); // Shop button var shopBtn = LK.gui.bottomLeft.attachAsset('shopButton', { anchorX: 0, anchorY: 1, x: 50, y: -50 }); var shopBtnText = new Text2('Boutique', { size: 36, fill: 0xFFFFFF }); shopBtnText.anchor.set(0, 1); shopBtnText.x = 50; shopBtnText.y = -50; LK.gui.bottomLeft.addChild(shopBtnText); // Quiz button var quizBtn = LK.gui.bottomRight.attachAsset('quizButton', { anchorX: 1, anchorY: 1, x: -50, y: -50 }); var quizBtnText = new Text2('Quiz', { size: 36, fill: 0xFFFFFF }); quizBtnText.anchor.set(1, 1); quizBtnText.x = -50; quizBtnText.y = -50; LK.gui.bottomRight.addChild(quizBtnText); // Naming button var namingBtn = LK.gui.bottomRight.attachAsset('button', { anchorX: 1, anchorY: 1, x: -50, y: -130, scaleX: 1.2, scaleY: 0.8 }); var namingBtnText = new Text2('Nommer un dauphin', { size: 28, fill: 0xFFFFFF }); namingBtnText.anchor.set(1, 1); namingBtnText.x = -50; namingBtnText.y = -130; LK.gui.bottomRight.addChild(namingBtnText); // Button event handlers LK.gui.bottomLeft.down = function (x, y, obj) { createShopModal(); }; LK.gui.bottomRight.down = function (x, y, obj) { // Check if naming button was clicked if (y >= -160 && y <= -100) { createDolphinNamingModal(); } else if (y >= -80 && y <= -20) { createQuizModal(); } }; // Play background music LK.playMusic('underwater'); // Initialize UI updateUI(); // Game update loop game.update = function () { // Update all dolphins for (var i = 0; i < dolphins.length; i++) { dolphins[i].update(); } // Update corals for (var i = 0; i < corals.length; i++) { corals[i].update(); } // Update hoops for (var i = 0; i < hoops.length; i++) { hoops[i].update(); } };
===================================================================
--- original.js
+++ change.js
@@ -33,8 +33,13 @@
self.petCooldown = 60000; // 1 minute
self.maxHappiness = 100;
self.ownedHoops = []; // Track owned hoops
self.hoopIcons = []; // Visual representations of owned hoops
+ // Expression/emotion system
+ self.currentExpression = 'neutral';
+ self.lastFeedTime = 0;
+ self.expressionElements = [];
+ self.lastExpressionUpdate = 0;
// Graphics
var dolphinBody = self.attachAsset('dolphin', {
anchorX: 0.5,
anchorY: 0.5
@@ -135,8 +140,122 @@
cooldownBar.scaleX = percentage;
cooldownBar.visible = percentage > 0;
cooldownBarBg.visible = percentage > 0;
};
+ self.clearExpressionElements = function () {
+ for (var i = 0; i < self.expressionElements.length; i++) {
+ self.expressionElements[i].destroy();
+ }
+ self.expressionElements = [];
+ };
+ self.updateExpression = function () {
+ var now = Date.now();
+ // Clear old expression elements
+ self.clearExpressionElements();
+ // Determine current expression based on state
+ var timeSinceLastPet = now - self.lastPetTime;
+ var timeSinceLastFeed = now - self.lastFeedTime;
+ if (self.happiness >= 80) {
+ self.currentExpression = 'happy';
+ } else if (timeSinceLastFeed > 300000 || self.happiness < 30) {
+ // 5 minutes since last feed or low happiness
+ self.currentExpression = 'hungry';
+ } else if (self.happiness < 50 && timeSinceLastPet > 180000) {
+ // Low happiness and 3 minutes since pet
+ self.currentExpression = 'sad';
+ } else {
+ self.currentExpression = 'neutral';
+ }
+ // Create expression elements based on current state
+ if (self.currentExpression === 'happy') {
+ // Create floating hearts
+ for (var i = 0; i < 3; i++) {
+ var heart = self.attachAsset('heart', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: Math.random() * 60 - 30,
+ y: -40 - Math.random() * 20
+ });
+ self.expressionElements.push(heart);
+ // Animate hearts floating up
+ tween(heart, {
+ y: heart.y - 50,
+ alpha: 0
+ }, {
+ duration: 2000,
+ easing: tween.easeOut
+ });
+ }
+ // Create sparkles
+ for (var i = 0; i < 4; i++) {
+ var sparkle = self.attachAsset('sparkle', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: Math.random() * 80 - 40,
+ y: Math.random() * 40 - 20
+ });
+ self.expressionElements.push(sparkle);
+ // Animate sparkles twinkling
+ tween(sparkle, {
+ scaleX: 1.5,
+ scaleY: 1.5,
+ alpha: 0
+ }, {
+ duration: 1500,
+ easing: tween.easeInOut
+ });
+ }
+ } else if (self.currentExpression === 'hungry') {
+ // Create thought bubble with fish
+ var thoughtBubble = self.attachAsset('thoughtBubble', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 60,
+ y: -60,
+ alpha: 0.8
+ });
+ self.expressionElements.push(thoughtBubble);
+ var fish = self.attachAsset('fish', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 60,
+ y: -60
+ });
+ self.expressionElements.push(fish);
+ // Animate thought bubble pulsing
+ tween(thoughtBubble, {
+ scaleX: 1.1,
+ scaleY: 1.1
+ }, {
+ duration: 1000,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(thoughtBubble, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 1000,
+ easing: tween.easeInOut
+ });
+ }
+ });
+ } else if (self.currentExpression === 'sad') {
+ // Tint dolphin slightly blue for sadness
+ tween(dolphinBody, {
+ tint: 0x8bb6d6
+ }, {
+ duration: 500
+ });
+ } else {
+ // Neutral - ensure normal tint
+ tween(dolphinBody, {
+ tint: 0x4fa8d8
+ }, {
+ duration: 500
+ });
+ }
+ self.lastExpressionUpdate = now;
+ };
self.addHoopIcon = function (hoopType) {
// Add hoop type to owned hoops
self.ownedHoops.push(hoopType);
// Create small hoop icon
@@ -182,14 +301,17 @@
});
LK.getSound('pet').play();
LK.getSound('coin').play();
self.updateHappinessBar();
+ // Trigger happy expression immediately
+ self.updateExpression();
updateUI();
return true;
};
self.feed = function () {
if (dauphibouffe <= 0) return false;
dauphibouffe--;
+ self.lastFeedTime = Date.now();
self.happiness = Math.min(self.happiness + 20, self.maxHappiness);
// Feed animation
tween(dolphinBody, {
tint: 0x8bc34a
@@ -201,8 +323,10 @@
}, {
duration: 300
});
self.updateHappinessBar();
+ // Update expression after feeding
+ self.updateExpression();
updateUI();
return true;
};
self.levelUp = function () {
@@ -258,8 +382,13 @@
self.update = function () {
self.updateCooldownBar();
// Gentle floating animation
dolphinBody.y = Math.sin(Date.now() * 0.001) * 10;
+ // Update expressions every 3 seconds
+ var now = Date.now();
+ if (now - self.lastExpressionUpdate > 3000) {
+ self.updateExpression();
+ }
};
// Position dolphin
self.x = x || 0;
self.y = y || 0;
@@ -1212,8 +1341,11 @@
savedDolphin.levelText.setText('Niv.' + savedDolphin.level);
}
// Update happiness bars to reflect saved state
savedDolphin.updateHappinessBar();
+ // Initialize expression system
+ savedDolphin.lastFeedTime = data.lastFeedTime || 0;
+ savedDolphin.updateExpression();
// Restore hoop icons without triggering additional saves
for (var h = 0; h < savedDolphin.ownedHoops.length; h++) {
// Create small hoop icon
var hoopAssetNames = ['hoop', 'hoopCute', 'hoopTricolore', 'hoopEnflamme', 'hoopOcean'];
@@ -1235,8 +1367,10 @@
} else {
// Create starting dolphin with random name that can be changed
var randomStartName = getRandomDolphinName();
var firstDolphin = new Dolphin(randomStartName, 1024, 1200);
+ // Initialize expression system for new dolphin
+ firstDolphin.updateExpression();
dolphins.push(firstDolphin);
game.addChild(firstDolphin);
}
// Create UI
Bouton bleu. In-Game asset. 2d. High contrast. No shadows
Coral. In-Game asset. 2d. High contrast. No shadows
Coral bleu. In-Game asset. 2d. High contrast. No shadows
Coral rouge. In-Game asset. 2d. High contrast. No shadows
nourriture pour dauphins. In-Game asset. 2d. High contrast. No shadows
Cerceau dorée. In-Game asset. 2d. High contrast. No shadows
Fond d'écran océan mignon. In-Game asset. 2d. High contrast. No shadows
Dauphin. In-Game asset. 2d. High contrast. No shadows
Cerceau de couleur rose mignon. In-Game asset. 2d. High contrast. No shadows
Cerceau enflammé. In-Game asset. 2d. High contrast. No shadows
Cerceau tricolore. In-Game asset. 2d. High contrast. No shadows
Cerceau de l'océan. In-Game asset. 2d. High contrast. No shadows
Poisson. In-Game asset. 2d. High contrast. No shadows
Coeur. In-Game asset. 2d. High contrast. No shadows
éclat. In-Game asset. 2d. High contrast. No shadows
Fond d'écran océan mignon. In-Game asset. 2d. High contrast. No shadows