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

Prochaine révision
Révision précédente
simulateur [2026/04/29 20:30] – créée nanakisimulateur [2026/05/01 10:18] (Version actuelle) nanaki
Ligne 1: Ligne 1:
-<!DOCTYPE html>+Voici un simulateur en version beta, n'hésitez pas à faire vos remarques sur le discord ou le forum. 
 <html> <html>
 <head> <head>
Ligne 31: Ligne 32:
  
 .result { .result {
-  background:#111;+  background:#000; 
 +  color:#00ffcc;
   padding:10px;   padding:10px;
 +  white-space:pre-wrap;
 +}
 +
 +.small {
 +  font-size:12px;
 +  color:#aaa;
 } }
 </style> </style>
Ligne 75: Ligne 83:
 </div> </div>
  
-<button onclick="calculate()">Calculer</button>+<button onclick="resetAll()">Reset</button>
  
 <pre id="result" class="result"></pre> <pre id="result" class="result"></pre>
Ligne 83: Ligne 91:
 // ===== RACES ===== // ===== RACES =====
 const races = { const races = {
-Elfe:{cc:9,ct:10,f:9,e:4,agi:9,p:5,mvt:5,pv:55,pm:30,r:4,rm:6,fm:8,m:6}, +Elfe:{cc:9,ct:10,f:9,e:4,agi:9,p:5,mvt:5,pv:55,pm:30,r:4,rm:6,fm:8,m:6,a:2}, 
-Nain:{cc:11,ct:8,f:11,e:6,agi:6,p:4,mvt:4,pv:50,pm:15,r:5,rm:4,fm:10,m:3}, +Nain:{cc:11,ct:8,f:11,e:6,agi:6,p:4,mvt:4,pv:50,pm:15,r:5,rm:4,fm:10,m:3,a:2}, 
-Géant:{cc:9,ct:10,f:12,e:4,agi:7,p:4,mvt:5,pv:65,pm:20,r:5,rm:5,fm:6,m:5}, +Géant:{cc:9,ct:10,f:12,e:4,agi:7,p:4,mvt:5,pv:65,pm:20,r:5,rm:5,fm:6,m:5,a:2}, 
-Olympien:{cc:10,ct:9,f:10,e:5,agi:8,p:4,mvt:5,pv:60,pm:30,r:5,rm:6,fm:7,m:5}, +Olympien:{cc:10,ct:9,f:10,e:5,agi:8,p:4,mvt:5,pv:60,pm:30,r:5,rm:6,fm:7,m:5,a:2}, 
-HS:{cc:8,ct:9,f:7,e:3,agi:11,p:5,mvt:6,pv:45,pm:40,r:3,rm:7,fm:9,m:5}+HS:{cc:8,ct:9,f:7,e:3,agi:11,p:5,mvt:6,pv:45,pm:40,r:3,rm:7,fm:9,m:5,a:2}
 }; };
  
 // ===== COST ===== // ===== COST =====
 const costTable = { const costTable = {
 +a:[800,200,100],
 cc:[100,50,30], ct:[110,50,30], cc:[100,50,30], ct:[110,50,30],
 f:[120,55,30], e:[120,55,30], f:[120,55,30], e:[120,55,30],
Ligne 107: Ligne 116:
 // ===== PASSIFS ===== // ===== PASSIFS =====
 const skills = [ const skills = [
-"Fulgurance","Duelliste","Encaisser", +{name:"Fulgurance",desc:"+1 toucher au cac + 1 esquive tous les 5 mouvements"}, 
-"Anguille","Couverture","Inépuisable","Maitre bretteur"+{name:"Couverture",desc:"85% CC / 15% AGI"}
 +{name:"Réflexes fulgurants",desc:"85% AGI / 15% CC"}, 
 +{name:"Berserker",desc:"+1 toucher au cac tous les 10 pv perdus"}, 
 +{name:"Griffes",desc:"+3 dégâts au poings"}, 
 +{name:"Anguille",desc:"Avantage esquive"}
 ]; ];
  
-// ===== ÉQUIPEMENTS ===== 
 const equipments = [ const equipments = [
  
Ligne 133: Ligne 145:
 {name:"Arc long",race:"all",slot:"weapon2h",stats:{ct:2,f:-1,cc:-2}}, {name:"Arc long",race:"all",slot:"weapon2h",stats:{ct:2,f:-1,cc:-2}},
 {name:"Targe renforcée",race:"all",slot:"offhand",stats:{cc:1,pv:10}}, {name:"Targe renforcée",race:"all",slot:"offhand",stats:{cc:1,pv:10}},
 +
 +/* ===== NOUVEAUX COMMUNS ===== */
 +
 +{name:"Torche",race:"all",slot:"weapon",stats:{cc:-2,f:-2}},
 +{name:"Hache de jet",race:"all",slot:"weapon",stats:{ct:1}},
 +{name:"Pierre Noire",race:"all",slot:"weapon",stats:{f:1,cc:-1}},
 +{name:"Main-gauche offensive",race:"all",slot:"offhand",stats:{cc:2,f:-1}},
  
 /* ================= ELFES ================= */ /* ================= ELFES ================= */
  
-{name:"Bâton du Pèlerin",race:"Elfe",slot:"weapon",stats:{mvt:1,fm:1}}, +{name:"Bâton du Pèlerin",race:"all",slot:"weapon",stats:{mvt:1,fm:1}}, 
-{name:"Bottes Tâlroval",race:"Elfe",slot:"feet",stats:{mvt:2}}, +{name:"Bottes Tâlroval",race:"all",slot:"feet",stats:{mvt:2}}, 
-{name:"Cuirasse",race:"Elfe",slot:"body",stats:{e:1,r:2}}, +{name:"Cuirasse",race:"all",slot:"body",stats:{e:1,r:2}}, 
-{name:"Lance de garde Sylvestre",race:"Elfe",slot:"weapon",stats:{cc:1,f:1}}, +{name:"Lance de garde Sylvestre",race:"all",slot:"weapon",stats:{cc:1,f:1}}, 
-{name:"Sceptre de mage",race:"Elfe",slot:"weapon2h",stats:{m:1,fm:1}}, +{name:"Sceptre de mage",race:"all",slot:"weapon2h",stats:{m:1,fm:1}}, 
-{name:"Arc Ensorcelé",race:"Elfe",slot:"weapon2h",stats:{ct:1,rm:2,cc:-1}}, +{name:"Arc Ensorcelé",race:"all",slot:"weapon2h",stats:{ct:1,rm:2,cc:-1}}, 
-{name:"Armure de garde Sylvestre",race:"Elfe",slot:"body",stats:{e:2,mvt:-1},magicBlock:true}, +{name:"Armure de garde Sylvestre",race:"all",slot:"body",stats:{e:2,mvt:-1},magicBlock:true}, 
-{name:"Toge de feuillage",race:"Elfe",slot:"body",stats:{fm:1,agi:1,pv:5}}, +{name:"Toge de feuillage",race:"all",slot:"body",stats:{fm:1,agi:1,pv:5}}, 
-{name:"Marque Forestière",race:"Elfe",slot:"neck",stats:{pm:10,r:1}}, +{name:"Marque Forestière",race:"all",slot:"neck",stats:{pm:10,r:1}}, 
-{name:"Capuche du chasseur",race:"Elfe",slot:"head",stats:{ct:1,r:1}},+{name:"Capuche du chasseur",race:"all",slot:"head",stats:{ct:1,r:1}}, 
 + 
 +// spécifique elfe 
 +{name:"Arc Elfique",race:"Elfe",slot:"weapon2h",stats:{ct:2,cc:-1}},
  
 /* ================= NAINS ================= */ /* ================= NAINS ================= */
  
-{name:"Cotte de mailles",race:"Nain",slot:"body",stats:{e:2,agi:-4}}, +{name:"Cotte de mailles",race:"all",slot:"body",stats:{e:2,agi:-4}}, 
-{name:"Labrys",race:"Nain",slot:"weapon",stats:{cc:1,f:1}}, +{name:"Labrys",race:"all",slot:"weapon",stats:{cc:1,f:1}}, 
-{name:"Marteau de guerre",race:"Nain",slot:"weapon2h",stats:{f:2,cc:-1}}, +{name:"Marteau de guerre",race:"all",slot:"weapon2h",stats:{f:2,cc:-1}}, 
-{name:"Targe renforcée naine",race:"Nain",slot:"offhand",stats:{cc:1,pv:10}}, +{name:"Targe renforcée naine",race:"all",slot:"offhand",stats:{cc:1,pv:10}}, 
-{name:"Armure runique",race:"Nain",slot:"body",stats:{e:1,pm:8}}, +{name:"Armure runique",race:"all",slot:"body",stats:{e:1,pm:8}}, 
-{name:"Cape dorée",race:"Nain",slot:"cape",stats:{m:1,fm:1},magicBlock:true}, +{name:"Cape dorée",race:"all",slot:"cape",stats:{m:1,fm:1},magicBlock:true}, 
-{name:"Solerets",race:"Nain",slot:"feet",stats:{mvt:1,pm:5,pv:5}}, +{name:"Solerets",race:"all",slot:"feet",stats:{mvt:1,pm:5,pv:5}}, 
-{name:"Casque grossissant",race:"Nain",slot:"head",stats:{ct:2,p:-1}},+{name:"Casque grossissant",race:"all",slot:"head",stats:{ct:2,p:-1}}, 
 + 
 +// spécifiques nains 
 +{name:"Bâton d'archimage",race:"Nain",slot:"weapon2h",stats:{m:2,fm:-1}}, 
 +{name:"Hache runique",race:"Nain",slot:"weapon",stats:{cc:1,f:2}},
  
 /* ================= GÉANTS ================= */ /* ================= GÉANTS ================= */
  
-{name:"Bouclier Clipeus",race:"Géant",slot:"offhand",stats:{e:1,pv:10}}, +{name:"Bouclier Clipeus",race:"all",slot:"offhand",stats:{e:1,pv:10}}, 
-{name:"Masse d'arme",race:"Géant",slot:"weapon",stats:{cc:1,f:1}}, +{name:"Masse d'arme",race:"all",slot:"weapon",stats:{cc:1,f:1}}, 
-{name:"Hallebarde de pierre",race:"Géant",slot:"weapon",stats:{cc:2,f:-1}},+{name:"Hallebarde de pierre",race:"all",slot:"weapon",stats:{cc:2,f:-1}},
 {name:"Bâton de shaman",race:"Géant",slot:"weapon2h",stats:{fm:2,pv:-5}}, {name:"Bâton de shaman",race:"Géant",slot:"weapon2h",stats:{fm:2,pv:-5}},
-{name:"Javelot lourd",race:"Géant",slot:"weapon",stats:{f:2,ct:-1,cc:-1}}, +{name:"Javelot lourd",race:"all",slot:"weapon",stats:{f:2,ct:-1,cc:-1}}, 
-{name:"Broigne",race:"Géant",slot:"body",stats:{e:2,f:-1}}, +{name:"Broigne",race:"all",slot:"body",stats:{e:2,f:-1}}, 
-{name:"Fétiche de shaman",race:"Géant",slot:"offhand",stats:{r:2,pm:5}}, +{name:"Fétiche de shaman",race:"all",slot:"offhand",stats:{r:2,pm:5}}, 
-{name:"Bottes incandescentes",race:"Géant",slot:"feet",stats:{mvt:1,r:1,pv:5}}, +{name:"Bottes incandescentes",race:"all",slot:"feet",stats:{mvt:1,r:1,pv:5}}, 
-{name:"Médaillon hanté",race:"Géant",slot:"neck",stats:{cc:1,ct:1}},+{name:"Médaillon hanté",race:"all",slot:"neck",stats:{cc:1,ct:1}}, 
 + 
 +// spécifique géant 
 +{name:"Peau de granit manifiée",race:"Géant",slot:"body",stats:{m:1,rm:2,agi:-2}},
  
 /* ================= HS ================= */ /* ================= HS ================= */
  
-{name:"Bâton de sage",race:"HS",slot:"weapon2h",stats:{m:1,agi:1}}, +{name:"Bâton de sage",race:"all",slot:"weapon2h",stats:{m:1,agi:1}}, 
-{name:"Orbe de mana",race:"HS",slot:"weapon2h",stats:{m:1,rm:1}}, +{name:"Orbe de mana",race:"all",slot:"weapon2h",stats:{m:1,rm:1}}, 
-{name:"Cape de mage",race:"HS",slot:"cape",stats:{fm:1,rm:1}}, +{name:"Cape de mage",race:"all",slot:"cape",stats:{fm:1,rm:1}}, 
-{name:"Armure de fourrure",race:"HS",slot:"body",stats:{e:2,rm:-3}}, +{name:"Armure de fourrure",race:"all",slot:"body",stats:{e:2,rm:-3}}, 
-{name:"Ceste",race:"HS",slot:"weapon",stats:{f:1,cc:1}}, +{name:"Ceste",race:"all",slot:"weapon",stats:{f:1,cc:1}}, 
-{name:"Collier d'apaisement",race:"HS",slot:"neck",stats:{pv:10,pm:5}}, +{name:"Collier d'apaisement",race:"all",slot:"neck",stats:{pv:10,pm:5}}, 
-{name:"Bottes de voleur",race:"HS",slot:"feet",stats:{mvt:1,agi:1}}, +{name:"Bottes de voleur",race:"all",slot:"feet",stats:{mvt:1,agi:1}}, 
-{name:"Sarbacane",race:"HS",slot:"weapon",stats:{ct:1,f:10,cc:-1}}, +{name:"Sarbacane",race:"all",slot:"weapon",stats:{ct:1,f:10,cc:-1}}, 
-{name:"Bouclier en lianes",race:"HS",slot:"offhand",stats:{cc:1,agi:1}},+{name:"Bouclier en lianes",race:"all",slot:"offhand",stats:{cc:1,agi:1}}, 
 + 
 +// spécifiques HS 
 +{name:"Manteau de feuillage",race:"HS",slot:"body",stats:{e:1,agi:2}}, 
 +{name:"Bottes griffues",race:"HS",slot:"feet",stats:{cc:1,f:1,pv:5}},
  
 /* ================= OLYMPIENS ================= */ /* ================= OLYMPIENS ================= */
  
-{name:"Armure hoplitique",race:"Olympien",slot:"body",stats:{e:1,m:1}}, +{name:"Armure hoplitique",race:"all",slot:"body",stats:{e:1,m:1}}, 
-{name:"Bouclier Ancile",race:"Olympien",slot:"offhand",stats:{e:1}}, +{name:"Bouclier Ancile",race:"all",slot:"offhand",stats:{e:1}}, 
-{name:"Diadème",race:"Olympien",slot:"head",stats:{r:1,rm:2}}, +{name:"Diadème",race:"all",slot:"head",stats:{r:1,rm:2}}, 
-{name:"Pilum",race:"Olympien",slot:"weapon",stats:{ct:1,f:1,cc:-1}}, +{name:"Pilum",race:"all",slot:"weapon",stats:{ct:1,f:1,cc:-1}}, 
-{name:"Spatha",race:"Olympien",slot:"weapon",stats:{cc:1,f:1}}, +{name:"Spatha",race:"all",slot:"weapon",stats:{cc:1,f:1}}, 
-{name:"Sceptre de puissance",race:"Olympien",slot:"weapon",stats:{m:1,pm:8}}, +{name:"Sceptre de puissance",race:"all",slot:"weapon",stats:{m:1,pm:8}}, 
-{name:"Lame Sainte",race:"Olympien",slot:"weapon",stats:{cc:1,m:1}}, +{name:"Lame Sainte",race:"all",slot:"weapon",stats:{cc:1,m:1}}, 
-{name:"Tiare d'Oracle",race:"Olympien",slot:"head",stats:{fm:1,p:1}}, +{name:"Tiare d'Oracle",race:"all",slot:"head",stats:{fm:1,p:1}}, 
-{name:"Cnémides",race:"Olympien",slot:"feet",stats:{mvt:1,rm:1,r:1}},+{name:"Cnémides",race:"all",slot:"feet",stats:{mvt:1,rm:1,r:1}}, 
 + 
 +// spécifique olympien 
 +{name:"Lorica",race:"Olympien",slot:"body",stats:{e:2,agi:-2}},
  
 /* ================= ANNEAUX ================= */ /* ================= ANNEAUX ================= */
Ligne 206: Ligne 242:
  
 ]; ];
- 
- 
- 
- 
  
 // ===== INIT ===== // ===== INIT =====
Ligne 216: Ligne 248:
 const baseDiv = document.getElementById("baseStats"); const baseDiv = document.getElementById("baseStats");
  
-// races 
 for(let r in races){ for(let r in races){
 raceSelect.innerHTML += `<option>${r}</option>`; raceSelect.innerHTML += `<option>${r}</option>`;
Ligne 222: Ligne 253:
  
 // stats UI // stats UI
-const statOrder = ["cc","ct","f","e","agi","m","fm","p","pv","pm","mvt","r","rm"]; +for(let in costTable){
-const statNames = { +
-cc:"CC", ct:"CT", f:"Force", e:"Endurance", +
-agi:"Agilité", m:"Magie", fm:"FM", +
-p:"Perception", pv:"PV", pm:"PM", +
-mvt:"Mvt", r:"Récup", rm:"RM" +
-}; +
- +
-statOrder.forEach(s=>{+
 statsDiv.innerHTML += ` statsDiv.innerHTML += `
 <div class="statLine"> <div class="statLine">
-<span>${statNames[s]}</span>+<span>${s}</span>
 <input type="number" id="${s}" value="0" min="0"> <input type="number" id="${s}" value="0" min="0">
 </div>`; </div>`;
-});+}
  
 // passifs // passifs
 skills.forEach(s=>{ skills.forEach(s=>{
-document.getElementById("skills").innerHTML += `<label><input type="checkbox"> ${s}</label><br>`;+document.getElementById("skills").innerHTML += ` 
 +<label> 
 +<input type="checkbox" class="skill" data-name="${s.name}"
 +<b>${s.name}</b><br> 
 +<span class="small">${s.desc}</span> 
 +</label><br>`;
 }); });
  
Ligne 247: Ligne 275:
 baseDiv.textContent = JSON.stringify(races[raceSelect.value],null,2); baseDiv.textContent = JSON.stringify(races[raceSelect.value],null,2);
 } }
- 
 raceSelect.addEventListener("change", displayBase); raceSelect.addEventListener("change", displayBase);
 displayBase(); displayBase();
Ligne 253: Ligne 280:
 // ===== COST ===== // ===== COST =====
 function calcCost(b,m1,m2,n){ function calcCost(b,m1,m2,n){
-let total=0, last=b;+let total=0,last=b;
 for(let i=1;i<=n;i++){ for(let i=1;i<=n;i++){
 if(i===1) last=b; if(i===1) last=b;
Ligne 261: Ligne 288:
 } }
 return total; return total;
 +}
 +
 +function updateCost(){
 +let total=0;
 +for(let s in costTable){
 +let v=+document.getElementById(s).value||0;
 +let [b,m1,m2]=costTable[s];
 +total+=calcCost(b,m1,m2,v);
 +}
 +document.getElementById("cost").innerHTML="💰 PI : "+total;
 } }
  
 // ===== SLOTS ===== // ===== SLOTS =====
-const head document.getElementById("head"); +const slots 
-const neck = document.getElementById("neck"); +head:head,neck:neck,cape:cape,rightHand:rightHand, 
-const cape = document.getElementById("cape"); +leftHand:leftHand,body:body,ring:ring,feet:feet 
-const rightHand = document.getElementById("rightHand"); +};
-const leftHand = document.getElementById("leftHand"); +
-const body = document.getElementById("body"); +
-const ring = document.getElementById("ring"); +
-const feet = document.getElementById("feet");+
  
-// reset slots 
 function resetSlots(){ function resetSlots(){
-[head,neck,cape,rightHand,leftHand,body,ring,feet].forEach(sel=>+Object.values(slots).forEach(s=>s.innerHTML="<option value=''>--</option>");
-sel.innerHTML = `<option value="">--</option>`; +
-});+
 } }
  
-// remplir équipements 
 function fillEquip(){ function fillEquip(){
-let r = raceSelect.value;+let r=raceSelect.value;
  
 equipments.forEach((e,i)=>{ equipments.forEach((e,i)=>{
 +if(e.race!=="all"&&e.race!==r) return;
  
-if(e.race !== "all&& e.race !== rreturn;+if(e.slot==="weapon"||e.slot==="weapon2h") rightHand.innerHTML+=`<option value="${i}">${e.name}</option>`; 
 +if(e.slot==="offhand") leftHand.innerHTML+=`<option value="${i}">${e.name}</option>`; 
 +if(e.slot==="body") body.innerHTML+=`<option value="${i}">${e.name}</option>`; 
 +if(e.slot==="head") head.innerHTML+=`<option value="${i}">${e.name}</option>`; 
 +if(e.slot==="neck") neck.innerHTML+=`<option value="${i}">${e.name}</option>`; 
 +if(e.slot==="cape") cape.innerHTML+=`<option value="${i}">${e.name}</option>`; 
 +if(e.slot==="feet") feet.innerHTML+=`<option value="${i}">${e.name}</option>`; 
 +if(e.slot==="ring") ring.innerHTML+=`<option value="${i}">${e.name}</option>`; 
 +}); 
 +}
  
-// main droite +raceSelect.addEventListener("change",()=>{ 
-if(e.slot==="weapon" || e.slot==="weapon2h") +resetSlots(); 
-rightHand.innerHTML +`<option value="${i}">${e.name}</option>`;+fillEquip(); 
 +autoCalculate(); 
 +});
  
-// main gauche +resetSlots(); 
-if(e.slot==="offhand"+fillEquip();
-leftHand.innerHTML += `<option value="${i}">${e.name}</option>`;+
  
-// corps +// ===== BONUS ===== 
-if(e.slot==="body") +function displayStats(select,id){ 
-body.innerHTML += `<option value="${i}">${e.name}</option>`;+let v=select.value; 
 +let el=document.getElementById(id); 
 +if(v===""){el.innerHTML="";return;
 +let e=equipments[v]; 
 +let txt=""
 +for(let s in e.stats){ 
 +let val=e.stats[s]; 
 +txt+=val>0?`+${val} ${s} `:`${val} ${s} `; 
 +
 +el.innerHTML=txt; 
 +}
  
-// tête +const slotToStatId 
-if(e.slot==="head") +head:"headStats", 
-head.innerHTML += `<option value="${i}">${e.name}</option>`;+neck:"neckStats"
 +cape:"capeStats", 
 +rightHand:"rightStats", 
 +leftHand:"leftStats", 
 +body:"bodyStats", 
 +ring:"ringStats", 
 +feet:"feetStats" 
 +};
  
-// cou +Object.entries(slots).forEach(([k,s])=>{ 
-if(e.slot==="neck"+s.addEventListener("change",()=>{ 
-neck.innerHTML += `<option value="${i}">${e.name}</option>`;+displayStats(s, slotToStatId[k]); 
 +checkLimit(); 
 +autoCalculate(); 
 +}); 
 +});
  
-// dos +// ===== LIMIT ===== 
-if(e.slot==="cape"+function checkLimit(){ 
-cape.innerHTML +`<option value="${i}">${e.name}</option>`+let count=0
- +Object.entries(slots).forEach(([k,s])=>{ 
-// pieds +if(k!=="ring"&&s.value!=="") count++; 
-if(e.slot==="feet") +});
-feet.innerHTML +`<option value="${i}">${e.name}</option>`; +
- +
-// anneau +
-if(e.slot==="ring"+
-ring.innerHTML += `<option value="${i}">${e.name}</option>`;+
  
 +if(count>=3){
 +limitWarn.innerText="Limite atteinte";
 +Object.entries(slots).forEach(([k,s])=>{
 +if(k!=="ring"&&s.value==="") s.disabled=true;
 }); });
 +}else{
 +limitWarn.innerText="";
 +Object.values(slots).forEach(s=>s.disabled=false);
 +}
 } }
  
-head.addEventListener("change", ()=> displayStats(head,"headStats")); +// ===== CALCUL ===== 
-neck.addEventListener("change", ()=> displayStats(neck,"neckStats")); +function calculate(){
-cape.addEventListener("change", ()=> displayStats(cape,"capeStats")); +
-rightHand.addEventListener("change", ()=> displayStats(rightHand,"rightStats")); +
-leftHand.addEventListener("change", ()=> displayStats(leftHand,"leftStats")); +
-body.addEventListener("change", ()=> displayStats(body,"bodyStats")); +
-ring.addEventListener("change", ()=> displayStats(ring,"ringStats")); +
-feet.addEventListener("change", ()=> displayStats(feet,"feetStats"));+
  
-// update race +let char={...races[raceSelect.value]}; 
-raceSelect.addEventListener("change", ()=>{ + 
-resetSlots(); +// stats investies 
-fillEquip();+for(let s in costTable){ 
 +let v=+document.getElementById(s).value||0; 
 +char[s]=(char[s]||0)+v; 
 +
 + 
 +// equip 
 +Object.values(slots).forEach(sel=>{ 
 +if(sel.value===""return
 +let e=equipments[sel.value]; 
 +for(let s in e.stats)
 +char[s]=(char[s]||0)+e.stats[s]; 
 +}
 }); });
  
-// init +// ===== ESQUIVE ===== 
-resetSlots(); +let esquive=Math.round(char.agi*0.75+char.cc*0.25);
-fillEquip();+
  
 +let checked=[...document.querySelectorAll(".skill:checked")].map(e=>e.dataset.name);
  
-// ===== AFFICHAGE BONUS ÉQUIPEMENT ===== +if(checked.includes("Réflexes fulgurants")
-function displayStats(select, targetId){ +esquive=Math.round(char.agi*0.85+char.cc*0.15);
-  let id select.value; +
-  let target = document.getElementById(targetId);+
  
-  if(id===""){ +if(checked.includes("Couverture")) 
-    target.innerHTML ""; +esquive=Math.round(char.cc*0.85+char.agi*0.15);
-    return; +
-  }+
  
-  let item equipments[id];+if(checked.includes("Fulgurance")) 
 +esquive+=1;
  
-  let txt "<span style='color:lightgreen'>";+// ===== MAGIE ===== 
 +let jetFM = char.fm * 2;
  
-  for(let stat in item.stats){ +let sorts = ""; 
-    let val item.stats[stat];+for(let lvl=1; lvl<=5; lvl++){ 
 +let seuil = 6 + 6 * lvl; 
 +let reussite = jetFM >seuil ? "✅" : "❌";
  
-    if(val > 0){ +sorts += `Niveau ${lvl→ Seuil ${seuil| Jet ${jetFM} ${reussite}\n`; 
-      txt += `+${val} ${stat.toUpperCase()`; +}
-    } else { +
-      txt += `<span style="color:#ff6b6b">${val} ${stat.toUpperCase()}</span> `; +
-    } +
-  }+
  
-  txt += "</span>";+// ===== AFFICHAGE ===== 
 +result.textContent = 
 +"===== STATS =====\n"
 +JSON.stringify(char,null,2)+
  
-  if(item.magicBlock){ +"\n\n⚔ CC : "+char.cc+ 
-    txt +<span style='color:orange'>❗ No Magic</span>"; +"\n🎯 CT : "+char.ct+ 
-  }+"\n✨ FM : "+char.fm+ 
 +"\n🛡 Esquive : "+esquive+
  
-  target.innerHTML txt;+"\n\n===== MAGIE =====\n"
 +"Jet FM (x2) : "+jetFM+"\n\n"
 +sorts;
 } }
  
 +// ===== AUTO =====
 +function autoCalculate(){
 +updateCost();
 +calculate();
 +}
  
-// ===== CALCUL ===== +// events stats 
-function calculate(){+document.querySelectorAll("#stats input").forEach(i=>{ 
 +i.addEventListener("input", autoCalculate)
 +});
  
-let char = {...races[raceSelect.value]}+// passifs 
-let totalPI = 0;+document.querySelectorAll(".skill").forEach(s=>
 +s.addEventListener("change", autoCalculate)
 +});
  
-// stats +// ===== RESET ===== 
-for(let s in costTable){ +function resetAll(){
-let v +document.getElementById(s).value || 0; +
-char[s]+=v; +
-let [b,m1,m2]=costTable[s]; +
-totalPI += calcCost(b,m1,m2,v)+
-}+
  
-// résumé +document.querySelectorAll("#stats input").forEach(i=>i.value=0);
-let esquive = Math.round(char.agi*0.75 + char.cc*0.25);+
  
-result.textContent = +Object.values(slots).forEach(s=>{ 
-JSON.stringify(char,null,2) +s.value=""; 
-+ "\n\n💰 PI : "+totalPI +s.disabled=false; 
-+ "\n⚔ CC : "+char.cc +});
-+ "\n🎯 CT 1-4 : "+char.ct+"/"+(char.ct-1)+"/"+(char.ct-2)+"/"+(char.ct-3) +
-+ "\n✨ FM : "+char.fm +
-+ "\n🛡 Esquive tir : "+esquive;+
  
 +document.querySelectorAll(".skill").forEach(s=>s.checked=false);
 +
 +resetSlots();
 +fillEquip();
 +displayBase();
 +checkLimit();
 +autoCalculate();
 } }
  
-</script>+// init 
 +autoCalculate();
  
 +</script>
 </body> </body>
 </html> </html>
simulateur.1777487437.txt.gz · Dernière modification : 2026/04/29 20:30 de nanaki