/g,">"); } function norm(s){ s=String(s||"").toLowerCase(); if(s.normalize){s=s.normalize("NFD").replace(/[̀-ͯ]/g,"");} s=s.replace(/\s+/g," " ).trim(); return s; } function stripSpacesLower(s){ return String(s||"").toLowerCase().replace(/\s+/g,""); } function htmlFromText(txt){ var t = String(txt||"" ); t = t.replace(/\\n/g, "\n"); t = t.replace(/\r\n?/g, "\n"); t = t.split("{{nome}}").join(player.name); t = esc(t).replace(/\n/g, " "); return t; } function start(){ const root = $("#root"); var h = "" + "
"+esc(story.title||"Avventura")+"
"+ "
Avventura testuale — digita i comandi (es. attraverso la porta)
"+ "
"+ ""+ ""+ "
"+ ""; root.innerHTML = h; document.getElementById("btnBegin").addEventListener("click", begin); } function begin(){ var v = (document.getElementById("pname").value||"").trim(); player.name = v || "Viaggiatore"; goto(story.start || (story.nodes[0] && story.nodes[0].id) || ""); } function nodeById(id){ var list = story.nodes||[]; for(var i=0;i= itemsLen) used.length = 0; var pool = []; for(var i=0;iScena non trovata: "+esc(id)+""; return; } if(n.isFinal && !canFinish()){ showMsg("⚠️ Non puoi ancora accedere alla scena finale. Completa prima i requisiti."); return; } if(n.isSecret && !window.__secretSeen?.has(n.id)){ window.__secretSeen = window.__secretSeen || new Set(); window.__secretSeen.add(n.id); progress.secrets += 1; } renderScene(n); } function renderScene(n){ progress.visited.add(n.id); var quiz = ensureActiveQuiz(n); var base = String(n.text||"");if(quiz){if(base.indexOf("{{prompt}}")!==-1){ base = base.replace(/\{\{prompt\}\}/g, quiz.prompt); } else { base = base + (base?"\n\n":"") + quiz.prompt; } } var html = ""; html += "
"; html += ""; html += ""; $("#root").innerHTML = html; var inp = document.getElementById("cmd"); inp.focus(); inp.addEventListener("keydown", function(ev){ if(ev.key==="Enter"){ var raw = inp.value; inp.value=""; handleCommand(n, raw); } }); } function hudHTML(){ var y = (story.totalRequired|0); var s = "