JavaScript must be enabled to play.
Browser lacks capabilities required to play.
Upgrade or switch to another browser.
Loading…
<script> (async function() { console.log("Script chargé pour le passage 'Avertissement'."); const loadingMessage = SugarCube.State.variables.chargement || "Chargement en cours..."; const container = document.getElementById("warningText"); // Afficher uniquement le message de chargement container.innerHTML = `<p style="text-align: center; font-weight: bold; font-size: 2em;">${loadingMessage}</p>`; try { const originalPart1 = "ATTENTION :"; const originalPart2 = "Cette histoire est destinée aux adultes uniquement."; const originalPart3 = "Elle met en scène exclusivement des personnages gays et explore des fétiches tels que les odeurs, l'adoration, l'humiliation et la torture. Veuillez continuer uniquement si vous êtes à l'aise avec ces thèmes."; const originalPart4 = "Avant de plonger dans l'histoire, vous devrez répondre à quelques questions."; const buttonText = "Continuer"; const targetLang = window.detectedLanguage || "fr"; console.log("Langue cible pour la traduction :", targetLang); let translatedPart1 = originalPart1; let translatedPart2 = originalPart2; let translatedPart3 = originalPart3; let translatedPart4 = originalPart4; let translatedButtonText = buttonText; if (targetLang !== "fr") { console.log("Traduction en cours..."); translatedPart1 = await translateText(originalPart1, targetLang); translatedPart2 = await translateText(originalPart2, targetLang); translatedPart3 = await translateText(originalPart3, targetLang); translatedPart4 = await translateText(originalPart4, targetLang); translatedButtonText = await translateText(buttonText, targetLang); } // Afficher le texte formaté après la traduction container.innerHTML = ` <span style="color: red; font-weight: bold;">${translatedPart1}</span><br/> <span>${translatedPart2}</span><br/><br/> <span>${translatedPart3}</span><br/><br/> <span>${translatedPart4}</span> `; document.getElementById("continueButton").innerText = translatedButtonText; SugarCube.State.variables.translatedAvertissementText = `${translatedPart1}\n${translatedPart2}\n${translatedPart3}\n${translatedPart4}`; // Texte pour l'audio window.translationReady = true; if (!SugarCube.State.variables.speechEnabled) { document.getElementById("continueButton").style.display = "inline-block"; } } catch (error) { console.error("Erreur lors de la traduction :", error); container.innerHTML = `<p style="text-align: center; font-weight: bold; font-size: 2em; color: red;">Erreur lors de la traduction.</p>`; document.getElementById("continueButton").innerText = "Continuer"; window.translationReady = true; document.getElementById("continueButton").style.display = "inline-block"; } })(); </script> <p id="warningText"></p> <a id="continueButton" href="javascript:void(0);" onclick="SugarCube.Engine.play('question')" style="display: none;">Continuer</a> <<if $speechEnabled is true>> <script> const waitForTranslationAvertissement = async () => { while (!window.translationReady) { await new Promise(resolve => setTimeout(resolve, 10)); } // Configurer et lire l'audio uniquement une fois const utterance = new SpeechSynthesisUtterance(SugarCube.State.variables.translatedAvertissementText); utterance.lang = SugarCube.State.variables.audioLang || "fr-FR"; utterance.onend = () => { document.getElementById("continueButton").style.display = "inline-block"; }; utterance.onerror = () => { document.getElementById("continueButton").style.display = "inline-block"; }; window.speechSynthesis.cancel(); // Annule toute lecture précédente window.speechSynthesis.speak(utterance); }; waitForTranslationAvertissement(); </script> <</if>>
<script> (async function () { console.log("Script chargé pour le passage 'question'."); const loadingMessage = SugarCube.State.variables.chargement; let container = document.getElementById("progressContainer"); // Si le conteneur n'existe pas, le créer if (!container) { container = document.createElement("div"); container.id = "progressContainer"; document.body.appendChild(container); } // Afficher le message de chargement const loadingTextElement = document.createElement("p"); loadingTextElement.id = "loadingText"; loadingTextElement.innerText = loadingMessage; loadingTextElement.style.textAlign = "center"; loadingTextElement.style.marginTop = "20px"; container.appendChild(loadingTextElement); try { const originalParts = { part1: `Choisissez un prénom pour votre personnage.`, confirmationMessagePart1: `Votre prénom, {name}, a été enregistré.`, confirmationMessagePart2: `Quelle est votre race ?`, placeholderText: `Veuillez entrer un prénom ici.`, buttonText: `Valider le prénom`, buttonmodifieText: `Je modifie`, buttoncontinueText: `Continuer`, raceMessagePart1: `Votre race, {race}, a été enregistrée.`, raceMessagePart2: `Voulez-vous être soumis ou dominant ? (Les autres personnages seront l'inverse.)`, submissiveText: `Soumis`, dominantText: `Dominant`, roleMessage: `Votre rôle, {role}, a été enregistré.`, otherRaceQuestionText: `Quelle est la race des autres personnages ?`, humanText: `Humain`, anthroText: `Anthro`, recapTitle: `Merci pour vos choix, voici un récapitulatif :`, recapName: `Vous vous appelez :`, recapRace: `Vous êtes de race :`, recapRole: `Vous êtes :`, recapOtherRace: `Les autres personnages sont :`, progressTemplate: `Question {current}/{total}`, progressFinished: `Question terminé`, invalidNameAlert: `Le prénom doit contenir uniquement des lettres.`, }; const targetLang = window.detectedLanguage || "fr"; const translatedParts = {}; // Traduire chaque partie séparément si nécessaire for (const key in originalParts) { translatedParts[key] = targetLang.startsWith("fr") ? originalParts[key] : await translateText(originalParts[key], targetLang); } SugarCube.State.variables.translationsQuestion = translatedParts; // Supprimer le message de chargement loadingTextElement.remove(); const elements = initializeInterface(translatedParts, 1, 4); // Préparer l'audio si activé if (SugarCube.State.variables.speechEnabled) { await prepareAudio(translatedParts.part1, () => { elements.nameInput.style.display = "block"; elements.submitButton.style.display = "block"; }); } else { elements.nameInput.style.display = "block"; elements.submitButton.style.display = "block"; } } catch (error) { console.error("Erreur lors de l'initialisation :", error); loadingTextElement.innerText = "Erreur lors du chargement de la traduction."; } })(); async function prepareAudio(text, callback) { return new Promise((resolve) => { const utterance = new SpeechSynthesisUtterance(text); utterance.lang = SugarCube.State.variables.translationsQuestion.lang || "fr-FR"; utterance.onend = () => { resolve(); if (callback) callback(); }; utterance.onerror = () => resolve(); window.speechSynthesis.cancel(); window.speechSynthesis.speak(utterance); }); } // Fonction pour valider le prénom function handleNameValidation(elements, translations) { const playerName = elements.nameInput.value.trim(); if (!/^[a-zA-ZÀ-ÖØ-öø-ÿ\s'-]+$/.test(playerName)) { alert(translations.invalidNameAlert); return; } const formattedName = playerName.charAt(0).toUpperCase() + playerName.slice(1).toLowerCase(); SugarCube.State.variables.name = formattedName; updateProgress(2, 4, translations, elements.progressBar, elements.progressLabel); const narration = `${translations.confirmationMessagePart1.replace("{name}", formattedName)} ${translations.confirmationMessagePart2}`; elements.promptText.innerHTML = ` ${translations.confirmationMessagePart1.replace("{name}", formattedName)} <br/><br/> ${translations.confirmationMessagePart2} `; elements.nameInput.style.display = "none"; elements.submitButton.style.display = "none"; if (SugarCube.State.variables.speechEnabled) { prepareAudio(narration, () => displayRaceOptions(elements, translations)); } else { displayRaceOptions(elements, translations); } } function displayRaceOptions(elements, translations) { const humanButton = document.createElement("button"); humanButton.className = "action-button"; humanButton.innerText = translations.humanText; humanButton.addEventListener("click", () => handleRaceSelection(translations.humanText, elements, translations)); const anthroButton = document.createElement("button"); anthroButton.className = "action-button"; anthroButton.innerText = translations.anthroText; anthroButton.addEventListener("click", () => handleRaceSelection(translations.anthroText, elements, translations)); elements.raceSelection.appendChild(humanButton); elements.raceSelection.appendChild(anthroButton); } // Fonction pour gérer la sélection de la race function handleRaceSelection(race, elements, translations) { // Enregistrer la sélection dans la variable globale SugarCube.State.variables.race = race; // Modification pour mettre à jour la valeur de "p_role" SugarCube.State.variables.p_role = (race === translations.humanText); updateProgress(3, 4, translations, elements.progressBar, elements.progressLabel); const narration = `${translations.raceMessagePart1.replace("{race}", race)} ${translations.raceMessagePart2}`; elements.promptText.innerHTML = ` ${translations.raceMessagePart1.replace("{race}", race)} <br/><br/> ${translations.raceMessagePart2} `; elements.raceSelection.innerHTML = ""; // Vider les options précédentes if (SugarCube.State.variables.speechEnabled) { prepareAudio(narration, () => displayRoleOptions(elements, translations)); } else { displayRoleOptions(elements, translations); } } function displayRoleOptions(elements, translations) { const submissiveButton = document.createElement("button"); submissiveButton.className = "action-button"; submissiveButton.innerText = translations.submissiveText; submissiveButton.addEventListener("click", () => handleRoleSelection(true, elements, translations)); const dominantButton = document.createElement("button"); dominantButton.className = "action-button"; dominantButton.innerText = translations.dominantText; dominantButton.addEventListener("click", () => handleRoleSelection(false, elements, translations)); elements.raceSelection.appendChild(submissiveButton); elements.raceSelection.appendChild(dominantButton); } // Gérer la sélection du rôle function handleRoleSelection(isSubmissive, elements, translations) { const role = isSubmissive ? translations.submissiveText : translations.dominantText; const otherRole = isSubmissive ? translations.dominantText : translations.submissiveText; SugarCube.State.variables.role = role; SugarCube.State.variables.otherRole = otherRole; SugarCube.State.variables.p_soumi = (role === translations.submissiveText); updateProgress(4, 4, translations, elements.progressBar, elements.progressLabel); const narration = `${translations.roleMessage.replace("{role}", role)} ${translations.otherRaceQuestionText}`; elements.promptText.innerHTML = ` ${translations.roleMessage.replace("{role}", role)} <br/><br/> ${translations.otherRaceQuestionText} `; elements.raceSelection.innerHTML = ""; // Vider les options précédentes if (SugarCube.State.variables.speechEnabled) { prepareAudio(narration, () => displayOtherRaceOptions(elements, translations)); } else { displayOtherRaceOptions(elements, translations); } } function displayOtherRaceOptions(elements, translations) { const humanButton = document.createElement("button"); humanButton.className = "action-button"; humanButton.innerText = translations.humanText; humanButton.addEventListener("click", () => handleOtherRaceSelection(translations.humanText, elements, translations)); const anthroButton = document.createElement("button"); anthroButton.className = "action-button"; anthroButton.innerText = translations.anthroText; anthroButton.addEventListener("click", () => handleOtherRaceSelection(translations.anthroText, elements, translations)); elements.raceSelection.appendChild(humanButton); elements.raceSelection.appendChild(anthroButton); } // Gérer la sélection de la race des autres personnages function handleOtherRaceSelection(otherRace, elements, translations) { SugarCube.State.variables.otherRace = otherRace; // Modification pour mettre à jour la valeur de "o_role" SugarCube.State.variables.o_role = (otherRace === translations.humanText); updateProgress(5, 4, translations, elements.progressBar, elements.progressLabel); const narration = `${translations.recapTitle} ${translations.recapName} ${SugarCube.State.variables.name}. ${translations.recapRace} ${SugarCube.State.variables.race}. ${translations.recapRole} ${SugarCube.State.variables.role}. ${translations.recapOtherRace} ${otherRace}, ${SugarCube.State.variables.otherRole}.`; elements.promptText.innerHTML = ` <h3>${translations.recapTitle}</h3> <ul> <li>${translations.recapName} ${SugarCube.State.variables.name}</li> <li>${translations.recapRace} ${SugarCube.State.variables.race}</li> <li>${translations.recapRole} ${SugarCube.State.variables.role}</li> <li>${translations.recapOtherRace} ${otherRace}, ${SugarCube.State.variables.otherRole}</li> </ul> `; elements.raceSelection.innerHTML = ""; // Vider les options précédentes console.log("Contenu de translations :", translations); displayRecapButtons(elements, translations); if (SugarCube.State.variables.speechEnabled) { prepareAudio(narration, () => displayRecapButtons(elements)); } else { displayRecapButtons(elements); } } function displayRecapButtons(elements, translations) { // Vérifier si 'elements.raceSelection' existe if (!elements.raceSelection) { console.error("'elements.raceSelection' est manquant ou non défini."); return; } // Vérifier si les clés de traduction existent if (!translations || !translations.buttonmodifieText || !translations.buttoncontinueText) { console.error("Les clés 'buttonmodifieText' ou 'buttoncontinueText' sont manquantes dans les traductions.", translations); return; } // Créer le bouton pour modifier const modifyButton = document.createElement("button"); modifyButton.className = "action-button"; modifyButton.innerText = translations.buttonmodifieText; modifyButton.style.display = "none"; // Masquer initialement modifyButton.addEventListener("click", () => { try { SugarCube.Engine.play('question'); } catch (error) { console.error("Erreur lors de la navigation vers 'question':", error); } }); // Créer le bouton pour continuer const continueButton = document.createElement("button"); continueButton.className = "action-button"; continueButton.innerText = translations.buttoncontinueText; continueButton.style.display = "none"; // Masquer initialement continueButton.addEventListener("click", () => { try { SugarCube.Engine.play('nextPassage'); } catch (error) { console.error("Erreur lors de la navigation vers 'nextPassage':", error); } }); // Ajouter les boutons à l'élément 'raceSelection' elements.raceSelection.appendChild(modifyButton); elements.raceSelection.appendChild(continueButton); // Si l'audio est activé, les boutons sont affichés après la fin de l'audio if (SugarCube.State.variables.speechEnabled) { const utterance = new SpeechSynthesisUtterance(SugarCube.State.variables.translationsQuestion.recapTitle); utterance.lang = SugarCube.State.variables.translationsQuestion.lang || "fr-FR"; utterance.onend = () => { modifyButton.style.display = "inline-block"; continueButton.style.display = "inline-block"; }; utterance.onerror = () => { modifyButton.style.display = "inline-block"; continueButton.style.display = "inline-block"; }; window.speechSynthesis.speak(utterance); } else { modifyButton.style.display = "inline-block"; continueButton.style.display = "inline-block"; } } // Initialisation de l'interface function initializeInterface(translations, stepStart, stepEnd) { const container = document.getElementById("progressContainer"); const progressBar = createProgressBar(); const progressLabel = createProgressLabel(); const promptText = createPromptText(translations.part1); const nameInput = createNameInput(translations.placeholderText); const submitButton = createSubmitButton(translations.buttonText); const raceSelection = createRaceSelection(); container.appendChild(progressBar); container.appendChild(progressLabel); container.appendChild(promptText); container.appendChild(nameInput); container.appendChild(submitButton); container.appendChild(raceSelection); updateProgress(stepStart, stepEnd, translations, progressBar, progressLabel); submitButton.addEventListener("click", () => handleNameValidation({ progressBar, progressLabel, promptText, nameInput, submitButton, raceSelection }, translations) ); return { progressBar, progressLabel, promptText, nameInput, submitButton, raceSelection }; } // Crée la barre de progression function createProgressBar() { const progressBar = document.createElement("progress"); progressBar.id = "progressBar"; progressBar.max = 4; progressBar.value = 1; progressBar.style.width = "80%"; progressBar.style.height = "30px"; progressBar.style.margin = "20px auto"; progressBar.style.display = "block"; return progressBar; } // Crée le label de la barre de progression function createProgressLabel() { const label = document.createElement("p"); label.id = "progressLabel"; label.style.textAlign = "center"; label.style.fontSize = "1.5em"; return label; } // Crée le texte de la question function createPromptText(content) { const prompt = document.createElement("p"); prompt.id = "promptText"; prompt.innerHTML = content; prompt.style.textAlign = "left"; return prompt; } // Crée le champ d'entrée pour le prénom function createNameInput(placeholder) { const input = document.createElement("input"); input.type = "text"; input.id = "nameInput"; input.placeholder = placeholder; input.style.display = "none"; return input; } // Crée le bouton de validation function createSubmitButton(text) { const button = document.createElement("button"); button.id = "submitButton"; button.innerText = text; button.style.display = "none"; return button; } // Crée l'espace pour les options de race function createRaceSelection() { const raceSelection = document.createElement("div"); raceSelection.id = "raceSelection"; raceSelection.style.textAlign = "left"; // Pas centré return raceSelection; } // Mettre à jour la barre de progression function updateProgress(step, total, translations, progressBar, progressLabel) { progressBar.value = step; progressBar.max = total; if (step <= total) { progressLabel.innerHTML = `<span style="font-weight: bold; color: cyan;">${translations.progressTemplate.replace("{current}", step).replace("{total}", total)}</span>`; } else { progressLabel.innerHTML = `<span style="font-weight: bold; color: cyan;">${translations.progressFinished}</span>`; } } </script> <style> /* Centrage de l'interface */ #progressContainer { text-align: center; } #progressBar { margin: 0 auto; background-color: #d3d3d3; border: 1px solid #555; border-radius: 5px; } #progressLabel { margin-top: 5px; } #raceSelection { margin-top: 10px; } .action-button { display: inline-block; margin: 10px; padding: 10px 20px; background-color: #007BFF; color: white; border: none; border-radius: 5px; cursor: pointer; } .action-button:hover { background-color: #0056b3; } </style> <div id="progressContainer"></div>
<<script>> // Détecter la langue du navigateur de l'utilisateur et l'attribuer directement var userLang = navigator.language || navigator.userLanguage; // Par défaut, prendre les deux premiers caractères pour la langue State.variables.language = userLang <</script>> <<goto "script-audio">>
<<script>> // Définir l'URL de base window.baseURL = "https://hao.inovaperf.me/The%20Colossus%20Challenge/images/"; // Liste des images à précharger (sans extension .jpg) let imagesToPreload = ["quentin"]; // Ajouter les noms des images ici sans .jpg // Objet pour stocker les images préchargées window.preloadedImages = {}; // Fonction pour précharger les images function preloadImages(images) { images.forEach(name => { const img = new Image(); img.src = window.baseURL + name + ".jpg"; // Ajouter l'extension .jpg ici window.preloadedImages[name] = img; // Stocker l'image avec son nom comme clé }); } // Appel de la fonction pour précharger toutes les images preloadImages(imagesToPreload); // Fonction pour afficher une image préchargée par son nom (sans .jpg) window.showImage = function(imgId, imgName) { const img = window.preloadedImages[imgName]; // Récupérer l'image par son nom if (img) { img.style.maxWidth = "300px"; // Définir la largeur maximale img.style.height = "auto"; // Ajuster automatiquement la hauteur pour conserver les proportions document.getElementById(imgId).appendChild(img); } else { console.error("L'image " + imgName + " n'a pas été trouvée."); } }; <</script>> <<goto "Detecteur de langue">>
<script> // Script : Lecture audio (fonction appelée ailleurs) window.initSpeech = async function() { console.log("Attente de la fin de la traduction pour l'audio..."); // Vérification de la disponibilité de SpeechSynthesis if (!window.speechSynthesis) { console.error("Synthèse vocale non disponible."); setTimeout(() => SugarCube.Engine.play("Avertissement"), 5); return; } // Rendre les boutons invisibles pour éviter les clics multiples document.getElementById("avecButton").style.display = "none"; document.getElementById("sansButton").style.display = "none"; // Lecture de l'audio depuis le texte traduit const utterance = new SpeechSynthesisUtterance(window.translatedAudioText); utterance.lang = SugarCube.State.variables.audioLang || "fr-FR"; // Définir la langue pour l'audio // Gestion des événements de la synthèse vocale utterance.onstart = () => console.log("Lecture audio commencée."); utterance.onend = () => { console.log("Lecture audio terminée."); setTimeout(() => SugarCube.Engine.play("Avertissement"), 2); // Redirection après l'audio }; utterance.onerror = (e) => { console.error("Erreur lors de la synthèse vocale :", e.error); setTimeout(() => SugarCube.Engine.play("Avertissement"), 1); // Redirection même en cas d'erreur }; // Lancer la lecture window.speechSynthesis.cancel(); // Annule toute lecture en cours window.speechSynthesis.speak(utterance); SugarCube.State.variables.speechEnabled = true; // Indiquer que l'audio est activé }; // Gestion de l'interface utilisateur dans ce passage (async function() { console.log("Script chargé pour le passage 'Activer'."); const loadingMessage = SugarCube.State.variables.chargement || "Chargement de la traduction..."; const container = document.getElementById("warningText"); // Afficher uniquement le message de chargement container.innerHTML = `<p style="text-align: center; font-weight: bold; font-size: 2em;">${loadingMessage}</p>`; document.getElementById("avecButton").style.display = "none"; document.getElementById("sansButton").style.display = "none"; try { // Diviser le texte original en plusieurs parties const part1 = "Bienvenue !"; const part2 = "Voulez-vous commencer avec l'audio ou sans ?"; const part3 = "Bonjour, l'audio est activé. Vous allez être redirigé vers la page suivante dans quelques instants." const button1Text = "Commencer l'histoire avec l'audio"; // Texte du bouton à traduire const button2Text = "Commencer l'histoire sans l'audio"; // Texte du bouton à traduire console.log("Texte original chargé :", part1, part2, part3); // Utiliser la langue détectée et enregistrée const targetLang = window.detectedLanguage || "fr"; console.log("Langue cible pour la traduction :", targetLang); let translatedPart1 = part1; // Par défaut, reste en français let translatedPart2 = part2; // Par défaut, reste en français let translatedPart3 = part3; let translatedButton1Text = button1Text; let translatedButton2Text = button2Text; // Traduire uniquement si la langue n'est pas le français if (targetLang !== "fr") { console.log("Envoi d'une requête de traduction pour les textes principaux et les boutons."); translatedPart1 = await translateText(part1, targetLang); translatedPart2 = await translateText(part2, targetLang); translatedPart3 = await translateText(part3, targetLang); translatedButton1Text = await translateText(button1Text, targetLang); translatedButton2Text = await translateText(button2Text, targetLang); console.log("Textes traduits reçus :", translatedPart1, translatedPart2, translatedPart3); console.log("Textes des boutons traduits reçus :", translatedButton1Text, translatedButton2Text); } else { console.log("Langue cible est le français. Aucune traduction nécessaire."); } // Ajouter les styles HTML pour le texte const styledPart1 = `<span style="color: #007BFF; font-weight: bold;">${translatedPart1}</span>`; // Afficher le texte formaté container.innerHTML = `${styledPart1}<br/><br/>${translatedPart2}`; // Mettre à jour les boutons document.getElementById("avecButton").innerText = translatedButton1Text; document.getElementById("sansButton").innerText = translatedButton2Text; // Enregistrer le texte traduit pour l'audio window.translatedAudioText = `${translatedPart3}`; // Attendre que l'audio soit prêt avant d'afficher les boutons while (!window.speechSynthesis) { await new Promise(resolve => setTimeout(resolve, 100)); } document.getElementById("avecButton").style.display = "inline-block"; document.getElementById("sansButton").style.display = "inline-block"; // Indiquer que la traduction et la préparation sont terminées window.translationReadyActiver = true; console.log("Traduction et préparation audio terminées."); } catch (error) { console.error("Erreur lors de la traduction ou de l'initialisation :", error); container.innerHTML = `<p style="text-align: center; font-weight: bold; font-size: 2em; color: red;">Une erreur est survenue lors de la traduction. Veuillez réessayer.</p>`; document.getElementById("avecButton").innerText = "Commencer l'histoire avec l'audio"; document.getElementById("sansButton").innerText = "Commencer l'histoire sans l'audio"; window.translationReadyActiver = true; // Considérer la traduction terminée même en cas d'erreur document.getElementById("avecButton").style.display = "inline-block"; document.getElementById("sansButton").style.display = "inline-block"; } })(); </script> <p id="warningText">Chargement de la traduction...</p> <button id="avecButton" href="javascript:void(0);" onclick="initSpeech()" style="display: none;">Commencer l'histoire avec l'audio</button> <button id="sansButton" href="javascript:void(0);" onclick="SugarCube.Engine.play('Avertissement')" style="display: none;">Commencer l'histoire sans l'audio</button>
<<script>> // Script 1 : Traduction dynamique et lecture audio (async function translateAndPlayAudioText() { const originalText = "Bonjour, l'audio est activé. Vous allez être redirigé vers la page suivante dans quelques instants."; // Texte en français const loadingText = "Chargement de la traduction en cours...."; // Texte à traduire const targetLang = window.detectedLanguage || "fr"; console.log("Langue cible pour la traduction :", targetLang); try { console.log("Début de la traduction pour l'audio."); // Traduire le texte de chargement if (targetLang !== "fr") { window.translatedLoadingText = await translateText(loadingText, targetLang); console.log("Texte traduit pour le chargement :", window.translatedLoadingText); } else { window.translatedLoadingText = loadingText; // Texte original pour le français console.log("Langue cible est le français. Aucun besoin de traduction pour le chargement."); } // Stocker le texte traduit dans une variable SugarCube SugarCube.State.variables.chargement = window.translatedLoadingText; console.log("Variable 'chargement' définie :", SugarCube.State.variables.chargement); // Traduire uniquement si la langue n'est pas le français if (targetLang !== "fr") { window.translatedAudioText = await translateText(originalText, targetLang); console.log("Texte traduit pour l'audio :", window.translatedAudioText); } else { window.translatedAudioText = originalText; // Texte original pour le français console.log("Langue cible est le français. Aucun besoin de traduction."); } // Lecture audio uniquement si activée if (State.variables.speechEnabled) { console.log("Lecture audio activée."); autoReadText(window.translatedAudioText); // Lire le texte traduit ou original } // Indiquer que la traduction est terminée window.translationReadyActiver = true; // Redirection après l'audio setTimeout(() => Engine.play("age"), 5); // Rediriger après 5 secondes } catch (error) { console.error("Erreur lors de la traduction pour l'audio :", error); window.translatedAudioText = originalText; // Fallback au texte original window.translatedLoadingText = loadingText; // Fallback au texte original pour le chargement SugarCube.State.variables.chargement = window.translatedLoadingText; window.translationReadyActiver = true; // Lecture du texte original en cas d'erreur if (State.variables.speechEnabled) { console.log("Lecture audio activée pour le texte par défaut."); autoReadText(window.translatedAudioText); } // Redirection après l'audio setTimeout(() => Engine.play("age"), 4); // Rediriger après 4 secondes } })(); <</script>>
<<script>> window.autoReadText = function(text) { console.log("Fonction autoReadText appelée avec : ", text); const synth = window.speechSynthesis; if (!synth) { console.error("Synthèse vocale non disponible !"); return; } const utterance = new SpeechSynthesisUtterance(text); utterance.lang = State.variables.audioLang; // Utilise la langue définie utterance.onstart = () => console.log("Lecture commencée"); utterance.onend = () => console.log("Lecture terminée"); utterance.onerror = (e) => { console.error("Erreur lors de la synthèse vocale :", e.error); console.log("Langue utilisée :", utterance.lang); console.log("Texte à lire :", utterance.text); console.log("Voix utilisée :", utterance.voice ? utterance.voice.name : "Aucune voix définie"); }; synth.speak(utterance); }; <</script>> { // Redirige vers le passage de gestion des images <<goto "trans">> }
<<script>> // Vérifie si la synthèse vocale est disponible dans le navigateur if ('speechSynthesis' in window) { // Associer la langue détectée à l'API Web Speech var langMap = State.variables.language // Obtenir la langue détectée par votre passage précédent var detectedLang = State.variables.language; // Vérifier si la langue détectée est supportée if (langMap) { State.variables.audioLang = langMap; State.variables.audioSupported = true; // Redirige vers le passage "audio" si tout est OK setTimeout(function() { Engine.play("audio"); }, 0); } else { State.variables.audioLang = 'fr-FR'; // Par défaut, français State.variables.audioSupported = false; alert("La langue détectée n'est pas prise en charge pour la synthèse vocale. Merci de contacter le support via le discord et de donner: $language"); } } else { // Si la synthèse vocale n'est pas disponible alert("La synthèse vocale n'est pas prise en charge par votre navigateur. Merci de contacter le support via le discord et de donner: $language"); State.variables.audioSupported = false; } <</script>>
<<script>> window.translateText = async function(text, targetLang) { try { const response = await fetch("http://transcri.freeboxos.fr:32769/translate", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ q: text, source: "fr", target: targetLang, format: "text" }) }); if (!response.ok) { throw new Error("Translation request failed"); } const data = await response.json(); return data.translatedText; } catch (error) { console.error("Translation error:", error); return text; // Fallback to the original text } }; // Vérification et enregistrement de la langue détectée window.detectedLanguage = State.variables.language.substring(0, 2) || "fr"; // Langue par défaut : français console.log("Langue détectée enregistrée pour la traduction :", window.detectedLanguage); <</script>> { // Redirige vers le passage de gestion des images <<goto "init">> }
<script> (async function() { console.log("Script de vérification d'âge chargé."); const loadingMessage = SugarCube.State.variables.chargement || "Chargement en cours..."; const container = document.getElementById("age-container"); // Masquer tout le contenu sauf le message de chargement container.innerHTML = `<p style="text-align: center; font-weight: bold; font-size: 2em;">${loadingMessage}</p>`; try { const originalWarningPart1 = `ATTENTION :`; const originalWarningPart2 = `Ce contenu est destiné aux adultes uniquement.`; const originalWarningPart3 = `Veuillez vérifier votre âge avant de continuer.`; const styledWarning = ` <span style="color: red; font-weight: bold; text-decoration: underline;">${originalWarningPart1}</span> <br/> <span>${originalWarningPart2}</span> <br/><br/> <span>${originalWarningPart3}</span> `; const agePromptText = `Entrez votre date de naissance :`; const verifyButtonText = `Vérifier`; const accessGrantedText = `Accès autorisé.`; const accessDeniedText = `Accès refusé. Vous n'êtes pas majeur.`; const selectBirthDateText = `Veuillez sélectionner une date de naissance.`; const ageTooHighText = `Âge invalide. Veuillez entrer une date de naissance correcte.`; const targetLang = window.detectedLanguage || "fr"; console.log("Langue cible pour la traduction :", targetLang); let displayedWarning = styledWarning; let translatedAgePromptText = agePromptText; let translatedVerifyButtonText = verifyButtonText; let translatedAccessGrantedText = accessGrantedText; let translatedAccessDeniedText = accessDeniedText; let translatedSelectBirthDateText = selectBirthDateText; let translatedAgeTooHighText = ageTooHighText; // Charger l'âge légal depuis une source JSON const ageData = await fetch("https://raw.githubusercontent.com/laboriens/age/refs/heads/main/legal_ages.json") .then(response => { if (!response.ok) { throw new Error("Erreur lors du chargement des âges légaux."); } return response.json(); }); const geoData = await fetch("https://ipapi.co/json/") .then(response => { if (!response.ok) { throw new Error("Erreur lors de la détection du pays."); } return response.json(); }); const countryCode = geoData.country_code.toLowerCase(); window.geoCountryCode = countryCode; // Assigner le code pays pour la redirection window.legalAge = ageData[countryCode.toUpperCase()] || 18; // Par défaut, 18 ans console.log("Pays détecté :", countryCode); console.log("Âge légal pour ce pays :", window.legalAge); // Traduire uniquement le texte sans le HTML si nécessaire if (targetLang !== "fr") { console.log("Traduction en cours..."); const translatedWarningPart1 = await translateText(originalWarningPart1, targetLang); const translatedWarningPart2 = await translateText(originalWarningPart2, targetLang); const translatedWarningPart3 = await translateText(originalWarningPart3, targetLang); displayedWarning = ` <span style="color: red; font-weight: bold; text-decoration: underline;">${translatedWarningPart1}</span> <br/> <span>${translatedWarningPart2}</span> <br/><br/> <span>${translatedWarningPart3}</span> `; translatedAgePromptText = await translateText(agePromptText, targetLang); translatedVerifyButtonText = await translateText(verifyButtonText, targetLang); translatedAccessGrantedText = await translateText(accessGrantedText, targetLang); translatedAccessDeniedText = await translateText(accessDeniedText, targetLang); translatedSelectBirthDateText = await translateText(selectBirthDateText, targetLang); translatedAgeTooHighText = await translateText(ageTooHighText, targetLang); } // Afficher le contenu traduit container.innerHTML = ` <div id="age-warning">${displayedWarning}</div> <div> <label id="birthDateLabel" for="birthDate"><br/>${translatedAgePromptText}<br/></label> <input id="birthDate" type="date" /> <button id="verifyButton" onclick="verifyAge()">${translatedVerifyButtonText}</button> </div> `; SugarCube.State.variables.translatedAgeTexts = { accessGrantedText: translatedAccessGrantedText, accessDeniedText: translatedAccessDeniedText, selectBirthDateText: translatedSelectBirthDateText, ageTooHighText: translatedAgeTooHighText }; window.translationReadyAge = true; } catch (error) { console.error("Erreur lors de la traduction ou du chargement des données :", error); container.innerHTML = `<p style="text-align: center; font-weight: bold; font-size: 2em; color: red;">Erreur lors du chargement.</p>`; window.translationReadyAge = true; } })(); function verifyAge() { const birthDate = document.getElementById("birthDate").value; if (!birthDate) { alert(SugarCube.State.variables.translatedAgeTexts.selectBirthDateText); return; } const today = new Date(); const birth = new Date(birthDate); let age = today.getFullYear() - birth.getFullYear(); const monthDiff = today.getMonth() - birth.getMonth(); const dayDiff = today.getDate() - birth.getDate(); if (monthDiff < 0 || (monthDiff === 0 && dayDiff < 0)) { age--; } console.log("Âge calculé :", age); console.log("Âge légal requis :", window.legalAge); if (age > 100) { alert(SugarCube.State.variables.translatedAgeTexts.ageTooHighText); return; } if (age >= window.legalAge) { alert(SugarCube.State.variables.translatedAgeTexts.accessGrantedText); setTimeout(() => SugarCube.Engine.play("errorText"), 0); } else { alert(SugarCube.State.variables.translatedAgeTexts.accessDeniedText); window.location.href = `https://www.google.${window.geoCountryCode}`; } } </script> <div id="age-container"></div> <<if $speechEnabled is true>> <script> const waitForTranslationAge = async () => { while (!window.translationReadyAge) { await new Promise(resolve => setTimeout(resolve, 100)); } autoReadText(document.getElementById("age-warning").innerText); }; waitForTranslationAge(); </script> <</if>>
<<if $p_role is true>> <<goto "player humain">> <<else>> <<goto "message anthro">> <</if>>
<<if window.translatedErrorText && window.errorTranslationReady>> <p><<print window.translatedErrorText>></p> <<if $speechEnabled is true>> <script> const waitForErrorTextAudio = async () => { while (!window.errorTranslationReady) { await new Promise(resolve => setTimeout(resolve, 100)); // Attendre que la traduction soit prête } // Lire le texte traduit si l'audio est activé autoReadText(window.translatedErrorText); }; waitForErrorTextAudio(); </script> <</if>> <</if>>
<<script>> // Script : Traduction dynamique pour errorText (async function translateErrorText() { const originalErrorText = "Bonjour, je suis désolé, mais cette page n'est pas encore construite."; // Texte en français const targetLang = window.detectedLanguage || "fr"; console.log("Langue cible pour la traduction :", targetLang); try { console.log("Début de la traduction pour errorText."); // Traduire uniquement si la langue cible n'est pas le français if (targetLang !== "fr") { window.translatedErrorText = await translateText(originalErrorText, targetLang); console.log("Texte traduit pour errorText :", window.translatedErrorText); } else { window.translatedErrorText = originalErrorText; // Texte original pour le français console.log("Langue cible est le français. Aucun besoin de traduction."); } // Indiquer que la traduction est terminée window.errorTranslationReady = true; // Redirection immédiate setTimeout(() => Engine.play("activer"), 5); // Délai court pour garantir la continuité } catch (error) { console.error("Erreur lors de la traduction pour errorText :", error); // Fallback : utiliser le texte original window.translatedErrorText = originalErrorText; window.errorTranslationReady = true; // Redirection après erreur setTimeout(() => Engine.play("activer"), 5); } })(); <</script>>
{ // Initialisation des variables de base <<set $name to "">> <<set $language to "">> // La variable langue est vide au début // Redirige vers le passage de gestion des images <<goto "ImageLoader">> }
<script> (async function() { console.log("Script chargé pour le passage 'Player humain'."); const loadingMessage = SugarCube.State.variables.chargement || "Chargement en cours..."; const container = document.getElementById("warningText"); const name = SugarCube.State.variables.name; const role = SugarCube.State.variables.role; const variables = { "{name}": SugarCube.State.variables.name, "{role}": SugarCube.State.variables.role.toLowerCase(), "{race}": SugarCube.State.variables.race.toLowerCase() }; // Afficher uniquement le message de chargement container.innerHTML = `<p style="text-align: center; font-weight: bold; font-size: 2em;">${loadingMessage}</p>`; try { const originalPart1 = "Merci pour toutes ces réponses. L'histoire peut maintenant commencer :"; const originalPart2 = "Tu t'appelles {name}. Tu es un homme gay {role} qui vit sur Terre parce que tu es un {race}. Ta famille, ton entourage, et toutes les personnes que tu croises se moquent de toi parce que tu es gay et que tu vis dans une grande ville où l'homophobie est omniprésente."; const originalPart3 = ""; const originalPart4 = ""; const buttonText = "Continuer"; const targetLang = window.detectedLanguage || "fr"; console.log("Langue cible pour la traduction :", targetLang); let translatedPart1 = originalPart1; let translatedPart2 = originalPart2; let translatedPart3 = originalPart3; let translatedPart4 = originalPart4; let translatedButtonText = buttonText; if (targetLang !== "fr") { console.log("Traduction en cours..."); translatedPart1 = await translateText(originalPart1, targetLang); translatedPart2 = await translateText(originalPart2, targetLang); translatedPart3 = await translateText(originalPart3, targetLang); translatedPart4 = await translateText(originalPart4, targetLang); translatedButtonText = await translateText(buttonText, targetLang); } // Afficher le texte formaté après la traduction container.innerHTML = ` <span style="color: cyan; font-weight: bold;">${translatedPart1}</span><br/> <br/> <span>${translatedPart2.replace(/{\w+}/g, match => variables[match] || match)}</span><br/> <span>${translatedPart3}</span><br/> <span>${translatedPart4}</span> `; document.getElementById("continueButton").innerText = translatedButtonText; SugarCube.State.variables.translatedp_humainText = `${translatedPart1}\n${translatedPart2.replace(/{\w+}/g, match => variables[match] || match)}\n${translatedPart3}\n${translatedPart4}`; // Texte pour l'audio window.translationReady = true; if (!SugarCube.State.variables.speechEnabled) { document.getElementById("continueButton").style.display = "inline-block"; } } catch (error) { console.error("Erreur lors de la traduction :", error); container.innerHTML = `<p style="text-align: center; font-weight: bold; font-size: 2em; color: red;">Erreur lors de la traduction.</p>`; document.getElementById("continueButton").innerText = "Continuer"; window.translationReady = true; document.getElementById("continueButton").style.display = "inline-block"; } })(); </script> <p id="warningText"></p> <a id="continueButton" href="javascript:void(0);" onclick="SugarCube.Engine.play('départ')" style="display: none;">translatedButtonText}</a> <<if $speechEnabled is true>> <script> const waitForTranslationp_humain = async () => { while (!window.translationReady) { await new Promise(resolve => setTimeout(resolve, 10)); } // Configurer et lire l'audio uniquement une fois const utterance = new SpeechSynthesisUtterance(SugarCube.State.variables.translatedp_humainText); utterance.lang = SugarCube.State.variables.audioLang || "fr-FR"; utterance.onend = () => { document.getElementById("continueButton").style.display = "inline-block"; }; utterance.onerror = () => { document.getElementById("continueButton").style.display = "inline-block"; }; window.speechSynthesis.cancel(); // Annule toute lecture précédente window.speechSynthesis.speak(utterance); }; waitForTranslationp_humain(); </script> <</if>>
<script> (async function() { console.log("Script chargé pour le passage 'Player anthro'."); const loadingMessage = SugarCube.State.variables.chargement || "Chargement en cours..."; const container = document.getElementById("warningText"); const name = SugarCube.State.variables.name; const role = SugarCube.State.variables.role; const race2 = SugarCube.State.variables.race2; const variables = { "{name}": SugarCube.State.variables.name, "{role}": SugarCube.State.variables.role.toLowerCase(), "{race}": SugarCube.State.variables.race.toLowerCase(), "{race2}": SugarCube.State.variables.race2.toLowerCase() }; // Afficher uniquement le message de chargement container.innerHTML = `<p style="text-align: center; font-weight: bold; font-size: 2em;">${loadingMessage}</p>`; try { const originalPart1 = "Merci pour toutes ces réponses. L'histoire peut maintenant commencer :"; const originalPart2 = "Tu t'appelles {name}. Tu es un homme gay {role} qui vit sur Terre alternatif parce que tu es un {race} {race2}. Ta famille, ton entourage, et toutes les personnes que tu croises se moquent de toi parce que tu es gay et que tu vis dans une grande ville où l'homophobie est omniprésente."; const originalPart3 = ""; const originalPart4 = ""; const buttonText = "Continuer"; const targetLang = window.detectedLanguage || "fr"; console.log("Langue cible pour la traduction :", targetLang); let translatedPart1 = originalPart1; let translatedPart2 = originalPart2; let translatedPart3 = originalPart3; let translatedPart4 = originalPart4; let translatedButtonText = buttonText; if (targetLang !== "fr") { console.log("Traduction en cours..."); translatedPart1 = await translateText(originalPart1, targetLang); translatedPart2 = await translateText(originalPart2, targetLang); translatedPart3 = await translateText(originalPart3, targetLang); translatedPart4 = await translateText(originalPart4, targetLang); translatedButtonText = await translateText(buttonText, targetLang); } // Afficher le texte formaté après la traduction container.innerHTML = ` <span style="color: cyan; font-weight: bold;">${translatedPart1}</span><br/> <br/> <span>${translatedPart2.replace(/{\w+}/g, match => variables[match] || match)}</span><br/> <span>${translatedPart3.replace(/{\w+}/g, match => variables[match] || match)}</span><br/> <span>${translatedPart4.replace(/{\w+}/g, match => variables[match] || match)}</span> `; document.getElementById("continueButton").innerText = translatedButtonText; SugarCube.State.variables.translatedp_humainText = `${translatedPart1}\n${translatedPart2.replace(/{\w+}/g, match => variables[match] || match)}\n${translatedPart3}\n${translatedPart4}`; // Texte pour l'audio window.translationReady = true; if (!SugarCube.State.variables.speechEnabled) { document.getElementById("continueButton").style.display = "inline-block"; } } catch (error) { console.error("Erreur lors de la traduction :", error); container.innerHTML = `<p style="text-align: center; font-weight: bold; font-size: 2em; color: red;">Erreur lors de la traduction.</p>`; document.getElementById("continueButton").innerText = "Continuer"; window.translationReady = true; document.getElementById("continueButton").style.display = "inline-block"; } })(); </script> <p id="warningText"></p> <a id="continueButton" href="javascript:void(0);" onclick="SugarCube.Engine.play('départ')" style="display: none;">Continuer</a> <<if $speechEnabled is true>> <script> const waitForTranslationp_humain = async () => { while (!window.translationReady) { await new Promise(resolve => setTimeout(resolve, 10)); } // Configurer et lire l'audio uniquement une fois const utterance = new SpeechSynthesisUtterance(SugarCube.State.variables.translatedp_humainText); utterance.lang = SugarCube.State.variables.audioLang || "fr-FR"; utterance.onend = () => { document.getElementById("continueButton").style.display = "inline-block"; }; utterance.onerror = () => { document.getElementById("continueButton").style.display = "inline-block"; }; window.speechSynthesis.cancel(); // Annule toute lecture précédente window.speechSynthesis.speak(utterance); }; waitForTranslationp_humain(); </script> <</if>>
<<if $p_role is true>><<if $p_soumi is true>> <<goto "h-soumi">><<else>> <<goto "h-domi">> <</if>> <<else>><<if $p_soumi is true>> <<goto "a-soumi">><<else>> <<goto "a-domi">> <</if>><</if>>
<script> (async function() { console.log("Script chargé pour le passage 'h-soumi'."); const loadingMessage = SugarCube.State.variables.chargement || "Chargement en cours..."; const container = document.getElementById("warningText"); SugarCube.State.variables.nameh = "ZoaLodge"; if (SugarCube.State.variables.o_role == true){ SugarCube.State.variables.nameh = "HumaniLodge"; } const nameh = SugarCube.State.variables.nameh; const role = SugarCube.State.variables.role; const variables = { "{nameh}": SugarCube.State.variables.nameh, "{role}": SugarCube.State.variables.role.toLowerCase(), "{race}": SugarCube.State.variables.race.toLowerCase() }; container.innerHTML = `<p style="text-align: center; font-weight: bold; font-size: 2em;">${loadingMessage}</p>`; try { const originalPart1 = "En pleine nuit, sous une lune verte, étrange car unique, tu décides de quitter cette ville pour essayer de trouver un endroit où les gens sont aussi gays, avec certains fétiches, dont celui que tu as d'être torturé et humilié par des mâles alpha, sans qu'ils ne te laissent le choix."; const originalPart2 = "Tu prends la route. Quelques minutes plus tard, un énorme brouillard épais apparaît, si dense que tu ne vois plus rien. De plus, à cause de la couleur de la lune, le brouillard ressemble à un nuage de flatulence vert."; const originalPart3 = "Quand le brouillard disparaît, ta voiture tombe en panne. Il n'y a rien autour, sauf un hôtel bizarre. L'hôtel s'appelle {nameh}. Il est étrange car tu as l'impression que l'hôtel est vivant et qu'il te regarde. De plus, tu ne peux pas voir la hauteur de l'hôtel car il dépasse les nuages, on dirait qu'il a une hauteur illimitée."; const originalPart4 = "ou"; const buttonText = "Entrer dans l'hôtel"; const button2Text = "Attendre dans la voiture"; const targetLang = window.detectedLanguage || "fr"; console.log("Langue cible pour la traduction :", targetLang); let translatedPart1 = originalPart1; let translatedPart2 = originalPart2; let translatedPart3 = originalPart3; let translatedPart4 = originalPart4; let translatedButtonText = buttonText; let translatedButton2Text = button2Text; if (targetLang !== "fr") { console.log("Traduction en cours..."); translatedPart1 = await translateText(originalPart1, targetLang); translatedPart2 = await translateText(originalPart2, targetLang); translatedPart3 = await translateText(originalPart3, targetLang); translatedPart4 = await translateText(originalPart4, targetLang); translatedButtonText = await translateText(buttonText, targetLang); translatedButton2Text = await translateText(button2Text, targetLang); } container.innerHTML = ` <span>${translatedPart1}</span><br/><br/> <span>${translatedPart2.replace(/{\w+}/g, match => variables[match] || match)}</span><br/><br/> <span>${translatedPart3.replace(/{\w+}/g, match => variables[match] || match)}</span><br/> <span></span> `; document.getElementById("continueButton").innerText = translatedButtonText; document.getElementById("middleButton").innerText = translatedPart4; document.getElementById("resteButton").innerText = translatedButton2Text; SugarCube.State.variables.translatedh_soumisText = `${translatedPart1}\n${translatedPart2.replace(/{\w+}/g, match => variables[match] || match)}\n${translatedPart3.replace(/{\w+}/g, match => variables[match] || match)}`; window.translationReady = true; if (!SugarCube.State.variables.speechEnabled) { document.getElementById("continueButton").style.display = "inline-block"; document.getElementById("middleButton").style.display = "inline-block"; document.getElementById("resteButton").style.display = "inline-block"; } } catch (error) { console.error("Erreur lors de la traduction :", error); container.innerHTML = `<p style="text-align: center; font-weight: bold; font-size: 2em; color: red;">Erreur lors de la traduction.</p>`; document.getElementById("continueButton").innerText = "Entrer dans l'hôtel"; document.getElementById("middleButton").innerText = "ou"; document.getElementById("resteButton").innerText = "Attendre dans la voiture"; window.translationReady = true; document.getElementById("continueButton").style.display = "inline-block"; document.getElementById("middleButton").style.display = "inline-block"; document.getElementById("resteButton").style.display = "inline-block"; } })(); </script> <p id="warningText"></p> <div style="text-align: center;"><a id="continueButton" href="javascript:void(0);" onclick="SugarCube.Engine.play('porte-entrée')" style="display: none;">Entrer dans l'hôtel</a> <a id="middleButton" href="javascript:void(0);" style="display: none; cursor: default; color: white;">ou</a> <a id="resteButton" href="javascript:void(0);" onclick="SugarCube.Engine.play('Fin-voiture')" style="display: none;">Attendre dans la voiture</a> </div> <<if $speechEnabled is true>> <script> const waitForTranslationh_soumis = async () => { while (!window.translationReady) { await new Promise(resolve => setTimeout(resolve, 10)); } const utterance = new SpeechSynthesisUtterance(SugarCube.State.variables.translatedh_soumisText); utterance.lang = SugarCube.State.variables.audioLang || "fr-FR"; utterance.onend = () => { document.getElementById("continueButton").style.display = "inline-block"; document.getElementById("middleButton").style.display = "inline-block"; document.getElementById("resteButton").style.display = "inline-block"; }; utterance.onerror = () => { document.getElementById("continueButton").style.display = "inline-block"; document.getElementById("middleButton").style.display = "inline-block"; document.getElementById("resteButton").style.display = "inline-block"; }; window.speechSynthesis.cancel(); window.speechSynthesis.speak(utterance); }; waitForTranslationh_soumis(); </script> <<endif>>
<<goto "non construis">>
<<goto "non construis">>
<<goto "non construis">>
<script> (async function () { console.log("Script chargé pour le passage 'question anthro'."); const loadingMessage = SugarCube.State.variables.chargement || "Chargement..."; let container = document.getElementById("questionContainer"); // Si le conteneur n'existe pas, le créer if (!container) { container = document.createElement("div"); container.id = "questionContainer"; document.body.appendChild(container); } // Afficher le message de chargement const loadingTextElement = document.createElement("p"); loadingTextElement.id = "loadingText"; loadingTextElement.innerText = loadingMessage; loadingTextElement.style.textAlign = "center"; loadingTextElement.style.marginTop = "20px"; container.appendChild(loadingTextElement); try { const originalParts = { questionText: "Choisissez la race d'anthro de votre personnage.", confirmationMessage: "Votre race, {race}, a été enregistrée. Voulez-vous continuer ou modifier votre choix ?", buttonModifyText: "Modifier", buttonContinueText: "Continuer", foxText: "Renard", wolfText: "Loup", catText: "Chat", dogText: "Chien", horseText: "Cheval", mouseText: "Souris", elephantText: "Éléphant", skunkText: "Mouffette", bearText: "Ours" }; const targetLang = window.detectedLanguage || "fr"; const translatedParts = {}; // Traduire chaque partie séparément si nécessaire for (const key in originalParts) { const lowerCaseText = originalParts[key].toLowerCase(); const translatedText = targetLang === "fr" ? lowerCaseText : await translateText(lowerCaseText, targetLang); translatedParts[key] = capitalizeFirstLetter(translatedText); } SugarCube.State.variables.translationsQuestionAnthro = translatedParts; SugarCube.State.variables.translatedq_anthroText = translatedParts.questionText; // Texte pour l'audio console.log("Traductions :", translatedParts); // Supprimer le message de chargement loadingTextElement.remove(); // Initialiser l'interface avec une seule question initializeSingleQuestionInterface(translatedParts); } catch (error) { console.error("Erreur lors de l'initialisation :", error); loadingTextElement.innerText = "Erreur lors du chargement de la traduction."; } })(); function capitalizeFirstLetter(string) { return string.charAt(0).toUpperCase() + string.slice(1); } function initializeSingleQuestionInterface(translations) { const container = document.getElementById("questionContainer"); container.innerHTML = ""; // Clear previous content const promptText = createPromptText(translations.questionText); const raceSelection = createRaceSelection(); container.appendChild(promptText); container.appendChild(raceSelection); if (SugarCube.State.variables.speechEnabled) { const utterance = new SpeechSynthesisUtterance(translations.questionText); utterance.lang = SugarCube.State.variables.audioLang || "fr-FR"; utterance.onend = () => displayRaceOptions(raceSelection, translations); window.speechSynthesis.cancel(); window.speechSynthesis.speak(utterance); } else { displayRaceOptions(raceSelection, translations); } } function createPromptText(content) { const prompt = document.createElement("p"); prompt.id = "promptText"; prompt.innerHTML = content; prompt.style.textAlign = "left"; return prompt; } function createRaceSelection() { const raceSelection = document.createElement("div"); raceSelection.id = "raceSelection"; raceSelection.style.textAlign = "left"; return raceSelection; } function displayRaceOptions(container, translations) { container.innerHTML = ""; // Clear previous options if (SugarCube.State.variables.p_soumi) { const foxButton = createRaceButton(translations.foxText, () => handleRaceSelection(translations.foxText, translations)); const catButton = createRaceButton(translations.catText, () => handleRaceSelection(translations.catText, translations)); const dogButton = createRaceButton(translations.dogText, () => handleRaceSelection(translations.dogText, translations)); const mouseButton = createRaceButton(translations.mouseText, () => handleRaceSelection(translations.mouseText, translations)); const wolfButton = createRaceButton(translations.wolfText, () => handleRaceSelection(translations.wolfText, translations)); container.appendChild(foxButton); container.appendChild(catButton); container.appendChild(dogButton); container.appendChild(mouseButton); container.appendChild(wolfButton); } else { const dogButton = createRaceButton(translations.dogText, () => handleRaceSelection(translations.dogText, translations)); const wolfButton = createRaceButton(translations.wolfText, () => handleRaceSelection(translations.wolfText, translations)); const bearButton = createRaceButton(translations.bearText, () => handleRaceSelection(translations.bearText, translations)); const skunkButton = createRaceButton(translations.skunkText, () => handleRaceSelection(translations.skunkText, translations)); const horseButton = createRaceButton(translations.horseText, () => handleRaceSelection(translations.horseText, translations)); const elephantButton = createRaceButton(translations.elephantText, () => handleRaceSelection(translations.elephantText, translations)); container.appendChild(dogButton); container.appendChild(wolfButton); container.appendChild(bearButton); container.appendChild(skunkButton); container.appendChild(horseButton); container.appendChild(elephantButton); } } function createRaceButton(text, onClick) { const button = document.createElement("button"); button.className = "action-button"; button.innerText = text; button.addEventListener("click", onClick); return button; } function handleRaceSelection(race, translations) { SugarCube.State.variables.race2 = race; const container = document.getElementById("questionContainer"); container.innerHTML = ""; // Clear previous content const confirmationText = document.createElement("p"); confirmationText.innerHTML = translations.confirmationMessage.replace("{race}", race); confirmationText.style.textAlign = "center"; container.appendChild(confirmationText); if (SugarCube.State.variables.speechEnabled) { const confirmationUtterance = new SpeechSynthesisUtterance(translations.confirmationMessage.replace("{race}", race)); confirmationUtterance.lang = SugarCube.State.variables.audioLang || "fr-FR"; confirmationUtterance.onend = () => showButtons(container, translations); window.speechSynthesis.cancel(); window.speechSynthesis.speak(confirmationUtterance); } else { showButtons(container, translations); } } function showButtons(container, translations) { const modifyButton = document.createElement("button"); modifyButton.className = "action-button"; modifyButton.innerText = translations.buttonModifyText; modifyButton.addEventListener("click", () => { initializeSingleQuestionInterface(translations); }); const continueButton = document.createElement("button"); continueButton.className = "action-button"; continueButton.innerText = translations.buttonContinueText; continueButton.addEventListener("click", () => { SugarCube.Engine.play('player anthro'); }); container.appendChild(modifyButton); container.appendChild(continueButton); } </script> <style> #questionContainer { text-align: center; } .action-button { display: inline-block; margin: 10px; padding: 10px 20px; background-color: #007BFF; color: white; border: none; border-radius: 5px; cursor: pointer; } .action-button:hover { background-color: #0056b3; } </style> <div id="questionContainer"></div>
<script> (async function() { console.log("Script chargé pour le passage 'message anthro'."); const loadingMessage = SugarCube.State.variables.chargement || "Chargement en cours..."; const container = document.getElementById("warningText"); const name = SugarCube.State.variables.name; const role = SugarCube.State.variables.role; const variables = { "{name}": SugarCube.State.variables.name, "{role}": SugarCube.State.variables.role.toLowerCase(), "{race}": SugarCube.State.variables.race.toLowerCase() }; // Afficher uniquement le message de chargement container.innerHTML = `<p style="text-align: center; font-weight: bold; font-size: 2em;">${loadingMessage}</p>`; try { const originalPart1 = "Merci pour toutes ces réponses."; const originalPart2 = "Puisque tu as choisi d'être un anthro, tu dois répondre à une dernière question pour connaître ta race d'anthro."; const originalPart3 = ""; const originalPart4 = ""; const buttonText = "Continuer"; const targetLang = window.detectedLanguage || "fr"; console.log("Langue cible pour la traduction :", targetLang); let translatedPart1 = originalPart1; let translatedPart2 = originalPart2; let translatedPart3 = originalPart3; let translatedPart4 = originalPart4; let translatedButtonText = buttonText; if (targetLang !== "fr") { console.log("Traduction en cours..."); translatedPart1 = await translateText(originalPart1, targetLang); translatedPart2 = await translateText(originalPart2, targetLang); translatedPart3 = await translateText(originalPart3, targetLang); translatedPart4 = await translateText(originalPart4, targetLang); translatedButtonText = await translateText(buttonText, targetLang); } // Afficher le texte formaté après la traduction container.innerHTML = ` <span style="color: cyan; font-weight: bold;">${translatedPart1}</span><br/> <br/> <span>${translatedPart2.replace(/{\w+}/g, match => variables[match] || match)}</span><br/> <span>${translatedPart3}</span><br/> <span>${translatedPart4}</span> `; document.getElementById("continueButton").innerText = translatedButtonText; SugarCube.State.variables.translatedm_anthroText = `${translatedPart1}\n${translatedPart2.replace(/{\w+}/g, match => variables[match] || match)}\n${translatedPart3}\n${translatedPart4}`; // Texte pour l'audio window.translationReady = true; if (!SugarCube.State.variables.speechEnabled) { document.getElementById("continueButton").style.display = "inline-block"; } } catch (error) { console.error("Erreur lors de la traduction :", error); container.innerHTML = `<p style="text-align: center; font-weight: bold; font-size: 2em; color: red;">Erreur lors de la traduction.</p>`; document.getElementById("continueButton").innerText = "Continuer"; window.translationReady = true; document.getElementById("continueButton").style.display = "inline-block"; } })(); </script> <p id="warningText"></p> <a id="continueButton" href="javascript:void(0);" onclick="SugarCube.Engine.play('question anthro')" style="display: none;">Continuer</a> <<if $speechEnabled is true>> <script> const waitForTranslationm_anthro = async () => { while (!window.translationReady) { await new Promise(resolve => setTimeout(resolve, 10)); } // Configurer et lire l'audio uniquement une fois const utterance = new SpeechSynthesisUtterance(SugarCube.State.variables.translatedm_anthroText); utterance.lang = SugarCube.State.variables.audioLang || "fr-FR"; utterance.onend = () => { document.getElementById("continueButton").style.display = "inline-block"; }; utterance.onerror = () => { document.getElementById("continueButton").style.display = "inline-block"; }; window.speechSynthesis.cancel(); // Annule toute lecture précédente window.speechSynthesis.speak(utterance); }; waitForTranslationm_anthro(); </script> <</if>>
<script> (async function() { console.log("Script chargé pour le passage 'fin voiture'."); const loadingMessage = SugarCube.State.variables.chargement || "Chargement en cours..."; const container = document.getElementById("warningText"); const name = SugarCube.State.variables.name; const role = SugarCube.State.variables.role; const variables = { "{name}": SugarCube.State.variables.name, "{role}": SugarCube.State.variables.role.toLowerCase(), "{race}": SugarCube.State.variables.race.toLowerCase() }; // Afficher uniquement le message de chargement container.innerHTML = `<p style="text-align: center; font-weight: bold; font-size: 2em;">${loadingMessage}</p>`; try { const originalPart1 = "Merci pour toutes ces réponses. L'histoire peut maintenant commencer :"; const originalPart2 = "coucou"; const originalPart3 = ""; const originalPart4 = ""; const targetLang = window.detectedLanguage || "fr"; console.log("Langue cible pour la traduction :", targetLang); let translatedPart1 = originalPart1; let translatedPart2 = originalPart2; let translatedPart3 = originalPart3; let translatedPart4 = originalPart4; if (targetLang !== "fr") { console.log("Traduction en cours..."); translatedPart1 = await translateText(originalPart1, targetLang); translatedPart2 = await translateText(originalPart2, targetLang); translatedPart3 = await translateText(originalPart3, targetLang); translatedPart4 = await translateText(originalPart4, targetLang); } // Afficher le texte formaté après la traduction container.innerHTML = ` <span>${translatedPart1.replace(/{\w+}/g, match => variables[match] || match)}</span><br/> <br/> <span style="color: red; font-weight: bold;">${translatedPart2.replace(/{\w+}/g, match => variables[match] || match)}</span><br/> <span>${translatedPart3}</span><br/> <span>${translatedPart4}</span> `; SugarCube.State.variables.translatedfin_voitureText = `${translatedPart1.replace(/{\w+}/g, match => variables[match] || match)}\n${translatedPart2.replace(/{\w+}/g, match => variables[match] || match)}\n${translatedPart3}\n${translatedPart4}`; // Texte pour l'audio window.translationReady = true; if (!SugarCube.State.variables.speechEnabled) { } } catch (error) { console.error("Erreur lors de la traduction :", error); container.innerHTML = `<p style="text-align: center; font-weight: bold; font-size: 2em; color: red;">Erreur lors de la traduction.</p>`; window.translationReady = true; } })(); </script> <p id="warningText"></p> <<if $speechEnabled is true>> <script> const waitForTranslationfin_voiture = async () => { while (!window.translationReady) { await new Promise(resolve => setTimeout(resolve, 10)); } // Configurer et lire l'audio uniquement une fois const utterance = new SpeechSynthesisUtterance(SugarCube.State.variables.translatedfin_voitureText); utterance.lang = SugarCube.State.variables.audioLang || "fr-FR"; window.speechSynthesis.cancel(); // Annule toute lecture précédente window.speechSynthesis.speak(utterance); }; waitForTranslationfin_voiture(); </script> <</if>>