Outils pour utilisateurs

Outils du site


simulateur

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
simulateur [2026/05/05 09:34] nanakisimulateur [2026/05/20 16:46] (Version actuelle) nanaki
Ligne 86: Ligne 86:
  
 <button onclick="resetAll()">Reset</button> <button onclick="resetAll()">Reset</button>
 +
 +<button onclick="exportBuild()">📤 Export</button>
 +<button onclick="importBuild()">📥 Import</button>
 +<button onclick="copyLink()">🔗 Lien</button>
  
 <pre id="result" class="result"></pre> <pre id="result" class="result"></pre>
Ligne 487: Ligne 491:
  
  
 +// ===== ESQUIVE =====
  
-// ===== ESQUIVE ===== 
 let checked = [...document.querySelectorAll(".skill:checked")].map(e=>e.dataset.name); let checked = [...document.querySelectorAll(".skill:checked")].map(e=>e.dataset.name);
  
 +// ===== ESQUIVE CAC =====
 +// règle : meilleur entre CC et AGI (dés), puis conversion jet + protection
  
-let esquiveCC = ccDice + bestProt; +let esquiveCAC = Math.max(ccDiceagiDice);
-let esquiveAGI = agiDice + bestProt; +
- +
- +
-let esquiveCAC = Math.max(esquiveCCesquiveAGI);+
  
 +// conversion en jet + protection
 +esquiveCAC = esquiveCAC + bestProt;
  
  
 // ===== ESQUIVE TIR ===== // ===== ESQUIVE TIR =====
 +// règle : 
 +// max entre : 
 +// (3/4 CC + 1/4 AGI) 
 +// (1/4 CC + 3/4 AGI) 
 +// arrondi inférieur → dés → ×2 → + protection
  
 let esquiveA = Math.floor(char.cc * 0.75 + char.agi * 0.25); let esquiveA = Math.floor(char.cc * 0.75 + char.agi * 0.25);
 let esquiveB = Math.floor(char.cc * 0.25 + char.agi * 0.75); let esquiveB = Math.floor(char.cc * 0.25 + char.agi * 0.75);
  
 +// passifs qui remplacent le calcul
 let esquiveStat; let esquiveStat;
  
Ligne 518: Ligne 527:
 } }
  
-// 👉 conversion en jet (dés ×2) + protection UNE FOIS +// conversion en jet 
-let esquive = esquiveStat * 2 + bestProt;+let esquiveTir = esquiveStat * 2;
  
-// bonus+// protection (UNE seule fois) 
 +esquiveTir += bestProt; 
 + 
 +// bonus passifs
 if(checked.includes("Fulgurance")) if(checked.includes("Fulgurance"))
-    esquive += 1+    esquiveTir += 1;
- +
-// bonus protection +
-esquive += bestProt;+
  
  
 // ===== ESQUIVE MAGIQUE ===== // ===== ESQUIVE MAGIQUE =====
 +// règle : FM en jet + protection
 +
 let esquiveFM = fmDice + bestProt; let esquiveFM = fmDice + bestProt;
  
Ligne 548: Ligne 559:
  
 result.textContent = result.textContent =
-"===== STATS =====\n"++ 
 +"===== PERSONNAGE =====\n"
 +"Race : "+raceSelect.value+ 
 + 
 +"\n\n===== STATS =====\n"+
 JSON.stringify(char,null,2)+ JSON.stringify(char,null,2)+
  
Ligne 558: Ligne 573:
 "\n\n===== JET DEFENSIF =====\n"+ "\n\n===== JET DEFENSIF =====\n"+
 "\n🛡 Esquive CAC : "+esquiveCAC+ "\n🛡 Esquive CAC : "+esquiveCAC+
-"\n🏹 Esquive tir : "+esquive+"\n🏹 Esquive tir : "+esquiveTir
-"\n✨ Esquive FM : "+(fmDice + bestProt)++"\n✨ Esquive FM : "+esquiveFM+
  
 "\n\n===== JET DISTANCE =====\n"+ "\n\n===== JET DISTANCE =====\n"+
Ligne 571: Ligne 586:
 "Jet FM : "+jetFM+"\n\n"+ "Jet FM : "+jetFM+"\n\n"+
 sorts; sorts;
- 
- 
 } }
  
Ligne 654: Ligne 667:
 updateCost(); calculate(); calculatePush(); updateCost(); calculate(); calculatePush();
 })); }));
 +
  
 // ===== INIT ===== // ===== INIT =====
Ligne 659: Ligne 673:
 calculate(); calculate();
 calculatePush(); calculatePush();
 +
 +
 +// =====================================
 +// ENCODE / DECODE
 +// =====================================
 +
 +function encodeBuild(data){
 +    return encodeURIComponent(JSON.stringify(data));
 +}
 +
 +function decodeBuild(code){
 +    return JSON.parse(decodeURIComponent(code));
 +}
 +
 +// =====================================
 +// BUILD DATA
 +// =====================================
 +
 +function getBuildData(){
 +
 +    let data = {
 +        race: raceSelect.value,
 +        stats: {},
 +        equip: {},
 +        skills: [],
 +        spells: []
 +    };
 +
 +    // stats
 +    for(let s in costTable){
 +        data.stats[s] = +document.getElementById(s).value || 0;
 +    }
 +
 +    // équipements
 +    Object.entries(slots).forEach(([k,s])=>{
 +        data.equip[k] = s.value;
 +    });
 +
 +    // passifs
 +    document.querySelectorAll(".skill:checked").forEach(s=>{
 +        data.skills.push(s.dataset.name);
 +    });
 +
 +    // sorts
 +    document.querySelectorAll(".spell:checked").forEach(s=>{
 +        data.spells.push({
 +            dex: +s.dataset.dex,
 +            prot: +s.dataset.prot
 +        });
 +    });
 +
 +    return data;
 +}
 +
 +// =====================================
 +// APPLY BUILD
 +// =====================================
 +
 +function applyBuild(data){
 +
 +    // race
 +    raceSelect.value = data.race || "Elfe";
 +
 +    // recharge équipements race
 +    resetSlots();
 +    fillEquip();
 +
 +    // stats
 +    for(let s in costTable){
 +        document.getElementById(s).value =
 +            data.stats?.[s] || 0;
 +    }
 +    
 +    // équipements
 +    Object.entries(slots).forEach(([k,s])=>{
 +        s.value = data.equip?.[k] || "";
 +    });
 +
 +    // refresh affichage bonus équipements
 +    Object.entries(slots).forEach(([k,s])=>{
 +        displayStats(s, slotToStatId[k]);
 +    });
 +    
 +
 +    // passifs
 +    document.querySelectorAll(".skill").forEach(s=>{
 +        s.checked =
 +            data.skills?.includes(s.dataset.name);
 +    });
 +
 +    // sorts
 +    document.querySelectorAll(".spell").forEach(s=>{
 +
 +        s.checked = data.spells?.some(sp =>
 +            sp.dex == +s.dataset.dex &&
 +            sp.prot == +s.dataset.prot
 +        );
 +
 +    });
 +
 +    displayBase();
 +    checkLimit();
 +    autoCalculate();
 +}
 +
 +// =====================================
 +// EXPORT
 +// =====================================
 +
 +function exportBuild(){
 +
 +    let data = getBuildData();
 +
 +    let code = encodeBuild(data);
 +
 +    prompt("Copie ton build :", code);
 +}
 +
 +// =====================================
 +// IMPORT
 +// =====================================
 +
 +function importBuild(codeInput){
 +
 +    let code = codeInput;
 +
 +    if(!code){
 +        code = prompt("Colle le code du build :");
 +    }
 +
 +    if(!code) return;
 +
 +    try{
 +
 +        code = code.trim();
 +
 +        let data = decodeBuild(code);
 +
 +        applyBuild(data);
 +
 +        alert("✅ Build importé");
 +
 +    }catch(e){
 +
 +        console.log(e);
 +
 +        alert("❌ Code invalide");
 +    }
 +}
 +
 +// =====================================
 +// LIEN PARTAGE
 +// =====================================
 +
 +function copyLink(){
 +
 +    let data = getBuildData();
 +
 +    let code = encodeBuild(data);
 +
 +    let url =
 +        window.location.origin +
 +        window.location.pathname +
 +        "?id=simulateur&build=" + code;
 +
 +    navigator.clipboard.writeText(url).then(()=>{
 +
 +        alert("🔗 Lien copié !");
 +
 +    }).catch(()=>{
 +
 +        prompt("Copie ce lien :", url);
 +
 +    });
 +}
 +
 +// =====================================
 +// AUTO LOAD URL
 +// =====================================
 +
 +(function(){
 +
 +    try{
 +
 +        let params =
 +            new URLSearchParams(window.location.search);
 +
 +        let code = params.get("build");
 +
 +        if(!code) return;
 +
 +        let data = decodeBuild(code);
 +
 +        applyBuild(data);
 +
 +        console.log("✅ Build URL chargé");
 +
 +    }catch(e){
 +
 +        console.log("Erreur chargement URL", e);
 +
 +    }
 +
 +})();
  
 </script> </script>
 </body> </body>
 </html> </html>
simulateur.1777966443.txt.gz · Dernière modification : 2026/05/05 09:34 de nanaki