Outils pour utilisateurs

Outils du site


brouillon6

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
brouillon6 [2026/05/01 23:39] nanakibrouillon6 [2026/05/02 00:09] (Version actuelle) nanaki
Ligne 1: Ligne 1:
-<!DOCTYPE html> 
 <html> <html>
 <head> <head>
Ligne 9: Ligne 8:
   font-family: Arial;   font-family: Arial;
   background:#0b1a13;   background:#0b1a13;
-  color:#e0d3a3;+  color:#7dd3fc;
   padding:10px;   padding:10px;
 } }
Ligne 59: Ligne 58:
 <!-- ================= POUSSEE ================= --> <!-- ================= POUSSEE ================= -->
 <div class="box"> <div class="box">
-<h3>💥 Simulateur de poussée</h3>+<h3>Simulateur de poussée</h3>
  
 Force assaillant <input id="pushF" type="number" value="10"> Force assaillant <input id="pushF" type="number" value="10">
Ligne 83: Ligne 82:
 // ===== 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,a:2}, +Elfe:{a:2,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}, 
-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}, +Nain:{a:2,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}, 
-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}, +Géant:{a:2,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}, 
-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}, +Olympien:{a:2,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}, 
-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}+HS:{a:2,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}
 }; };
  
 // ===== 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 102: Ligne 102:
 mvt:[100,50,30], mvt:[100,50,30],
 r:[40,30,15], r:[40,30,15],
-rm:[50,40,20], +rm:[50,40,20]
-a:[800,200,100]+
 }; };
  
 // ===== PASSIFS ===== // ===== PASSIFS =====
 const skills = [ const skills = [
-{name:"Fulgurance",desc:"+1 esquive"},+{name:"Fulgurance",desc:"+1 toucher au cac + 1 esquive tous les 5 mouvements"},
 {name:"Couverture",desc:"85% CC / 15% AGI"}, {name:"Couverture",desc:"85% CC / 15% AGI"},
-{name:"Réflexes fulgurants",desc:"85% AGI / 15% CC"}+{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 RACCOURCIS ICI+
 const equipments = [ const equipments = [
 +
 +/* ================= COMMUNS ================= */
 +
 +{name:"Arc",race:"all",slot:"weapon2h",stats:{cc:-1,ct:1}},
 +{name:"Armure matelassée",race:"all",slot:"body",stats:{e:1,agi:-2}},
 +{name:"Bâton de marche",race:"all",slot:"weapon",stats:{mvt:1}},
 +{name:"Bottes de marche",race:"all",slot:"feet",stats:{mvt:1}},
 +{name:"Bouclier Parma",race:"all",slot:"offhand",stats:{e:1,agi:-2}},
 +{name:"Fustibale",race:"all",slot:"weapon",stats:{cc:-2,ct:1}},
 {name:"Gladius",race:"all",slot:"weapon",stats:{cc:1}}, {name:"Gladius",race:"all",slot:"weapon",stats:{cc:1}},
-{name:"Arc",race:"all",slot:"weapon2h",stats:{ct:1,cc:-1}}, +{name:"Sceptre",race:"all",slot:"weapon",stats:{fm:1}}, 
-{name:"Targe",race:"all",slot:"offhand",stats:{cc:1}}, +{name:"Lance",race:"all",slot:"weapon",stats:{ct:1,cc:-1}}, 
-{name:"Armure matelassée",race:"all",slot:"body",stats:{e:1}}, +{name:"Targe",race:"all",slot:"offhand",stats:{cc:1,agi:-1}}, 
-{name:"Bottes de marche",race:"all",slot:"feet",stats:{mvt:1}}+{name:"Visière",race:"all",slot:"head",stats:{p:1,cc:-1,fm:-1}}, 
 +{name:"Cape de chasse",race:"all",slot:"cape",stats:{ct:1}}, 
 +{name:"Collier tressé",race:"all",slot:"neck",stats:{pv:5,pm:5}}, 
 +{name:"Couronne d'Adonis",race:"all",slot:"head",stats:{rm:1}}, 
 +{name:"Ceinture",race:"all",slot:"body",stats:{r:1}}, 
 +{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}}, 
 + 
 +/* ===== 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 ================= */ 
 + 
 +{name:"Bâton du Pèlerin",race:"all",slot:"weapon",stats:{mvt:1,fm:1}}, 
 +{name:"Bottes Tâlroval",race:"all",slot:"feet",stats:{mvt:2}}, 
 +{name:"Cuirasse",race:"all",slot:"body",stats:{e:1,r:2}}, 
 +{name:"Lance de garde Sylvestre",race:"all",slot:"weapon",stats:{cc:1,f:1}}, 
 +{name:"Sceptre de mage",race:"all",slot:"weapon2h",stats:{m:1,fm:1}}, 
 +{name:"Arc Ensorcelé",race:"all",slot:"weapon2h",stats:{ct:1,rm:2,cc:-1}}, 
 +{name:"Armure de garde Sylvestre",race:"all",slot:"body",stats:{e:2,mvt:-1},magicBlock:true}, 
 +{name:"Toge de feuillage",race:"all",slot:"body",stats:{fm:1,agi:1,pv:5}}, 
 +{name:"Marque Forestière",race:"all",slot:"neck",stats:{pm:10,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 ================= */ 
 + 
 +{name:"Cotte de mailles",race:"all",slot:"body",stats:{e:2,agi:-4}}, 
 +{name:"Labrys",race:"all",slot:"weapon",stats:{cc:1,f:1}}, 
 +{name:"Marteau de guerre",race:"all",slot:"weapon2h",stats:{f:2,cc:-1}}, 
 +{name:"Targe renforcée naine",race:"all",slot:"offhand",stats:{cc:1,pv:10}}, 
 +{name:"Armure runique",race:"all",slot:"body",stats:{e:1,pm:8}}, 
 +{name:"Cape dorée",race:"all",slot:"cape",stats:{m:1,fm:1},magicBlock:true}, 
 +{name:"Solerets",race:"all",slot:"feet",stats:{mvt:1,pm:5,pv:5}}, 
 +{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 ================= */ 
 + 
 +{name:"Bouclier Clipeus",race:"all",slot:"offhand",stats:{e:1,pv:10}}, 
 +{name:"Masse d'arme",race:"all",slot:"weapon",stats:{cc:1,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:"Javelot lourd",race:"all",slot:"weapon",stats:{f:2,ct:-1,cc:-1}}, 
 +{name:"Broigne",race:"all",slot:"body",stats:{e:2,f:-1}}, 
 +{name:"Fétiche de shaman",race:"all",slot:"offhand",stats:{r:2,pm:5}}, 
 +{name:"Bottes incandescentes",race:"all",slot:"feet",stats:{mvt:1,r:1,pv:5}}, 
 +{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 ================= */ 
 + 
 +{name:"Bâton de sage",race:"all",slot:"weapon2h",stats:{m:1,agi:1}}, 
 +{name:"Orbe de mana",race:"all",slot:"weapon2h",stats:{m:1,rm:1}}, 
 +{name:"Cape de mage",race:"all",slot:"cape",stats:{fm:1,rm:1}}, 
 +{name:"Armure de fourrure",race:"all",slot:"body",stats:{e:2,rm:-3}}, 
 +{name:"Ceste",race:"all",slot:"weapon",stats:{f:1,cc:1}}, 
 +{name:"Collier d'apaisement",race:"all",slot:"neck",stats:{pv:10,pm:5}}, 
 +{name:"Bottes de voleur",race:"all",slot:"feet",stats:{mvt:1,agi:1}}
 +{name:"Sarbacane",race:"all",slot:"weapon",stats:{ct:1,f:10,cc:-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 ================= */ 
 + 
 +{name:"Armure hoplitique",race:"all",slot:"body",stats:{e:1,m:1}}, 
 +{name:"Bouclier Ancile",race:"all",slot:"offhand",stats:{e:1}}, 
 +{name:"Diadème",race:"all",slot:"head",stats:{r:1,rm:2}}, 
 +{name:"Pilum",race:"all",slot:"weapon",stats:{ct:1,f:1,cc:-1}}, 
 +{name:"Spatha",race:"all",slot:"weapon",stats:{cc:1,f:1}}, 
 +{name:"Sceptre de puissance",race:"all",slot:"weapon",stats:{m:1,pm:8}}, 
 +{name:"Lame Sainte",race:"all",slot:"weapon",stats:{cc:1,m:1}}, 
 +{name:"Tiare d'Oracle",race:"all",slot:"head",stats:{fm:1,p: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 ================= */ 
 + 
 +{name:"Anneau Caprice",race:"all",slot:"ring",stats:{fm:1}}, 
 +{name:"Anneau Férocité",race:"all",slot:"ring",stats:{f:1}}, 
 +{name:"Anneau Horizon",race:"all",slot:"ring",stats:{p:1}}, 
 +{name:"Anneau Prétention",race:"all",slot:"ring",stats:{ct:1}}, 
 +{name:"Anneau Souplesse",race:"all",slot:"ring",stats:{agi:1}}, 
 +{name:"Anneau Tenacité",race:"all",slot:"ring",stats:{e:1}}, 
 +{name:"Anneau Puissance",race:"all",slot:"ring",stats:{m:1}}, 
 +{name:"Anneau Finesse",race:"all",slot:"ring",stats:{cc:1}} 
 ]; ];
 +
  
 // ===== INIT ===== // ===== INIT =====
Ligne 131: Ligne 245:
 } }
  
 +// stats UI
 for(let s in costTable){ for(let s in costTable){
-statsDiv.innerHTML += `<div class="statLine"><span>${s}</span><input type="number" id="${s}" value="0"></div>`;+statsDiv.innerHTML += ` 
 +<div class="statLine"> 
 +<span>${s}</span> 
 +<input type="number" id="${s}" value="0" min="0"> 
 +</div>`;
 } }
  
 +// passifs
 skills.forEach(s=>{ skills.forEach(s=>{
-skills.innerHTML += `<label><input type="checkbox" class="skill" data-name="${s.name}">${s.name}</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>`;
 }); });
  
-// ===== BASE =====+// base stats
 function displayBase(){ function displayBase(){
 baseDiv.textContent = JSON.stringify(races[raceSelect.value],null,2); baseDiv.textContent = JSON.stringify(races[raceSelect.value],null,2);
Ligne 165: Ligne 290:
 total+=calcCost(b,m1,m2,v); total+=calcCost(b,m1,m2,v);
 } }
-document.getElementById("cost").innerHTML="💰 "+total;+document.getElementById("cost").innerHTML="💰 PI : "+total; 
 +
 + 
 +// ===== SLOTS ===== 
 +const slots = { 
 +head:head,neck:neck,cape:cape,rightHand:rightHand, 
 +leftHand:leftHand,body:body,ring:ring,feet:feet 
 +}; 
 + 
 +function resetSlots(){ 
 +Object.values(slots).forEach(s=>s.innerHTML="<option value=''>--</option>"); 
 +
 + 
 +function fillEquip(){ 
 +let r=raceSelect.value; 
 + 
 +equipments.forEach((e,i)=>
 +if(e.race!=="all"&&e.race!==r) return; 
 + 
 +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>`; 
 +}); 
 +
 + 
 +raceSelect.addEventListener("change",()=>
 +resetSlots(); 
 +fillEquip(); 
 +autoCalculate(); 
 +}); 
 + 
 +resetSlots(); 
 +fillEquip(); 
 + 
 +// ===== BONUS ===== 
 +function displayStats(select,id){ 
 +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; 
 +
 + 
 +const slotToStatId = { 
 +head:"headStats", 
 +neck:"neckStats", 
 +cape:"capeStats", 
 +rightHand:"rightStats", 
 +leftHand:"leftStats", 
 +body:"bodyStats", 
 +ring:"ringStats", 
 +feet:"feetStats" 
 +}; 
 + 
 +Object.entries(slots).forEach(([k,s])=>
 +s.addEventListener("change",()=>
 +displayStats(s, slotToStatId[k]); 
 +checkLimit(); 
 +autoCalculate(); 
 +}); 
 +}); 
 + 
 +// ===== LIMIT ===== 
 +function checkLimit(){ 
 +let count=0; 
 +Object.entries(slots).forEach(([k,s])=>
 +if(k!=="ring"&&s.value!=="") count++; 
 +}); 
 + 
 +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); 
 +}
 } }
  
Ligne 173: Ligne 385:
 let char={...races[raceSelect.value]}; let char={...races[raceSelect.value]};
  
 +// stats investies
 for(let s in costTable){ for(let s in costTable){
 let v=+document.getElementById(s).value||0; let v=+document.getElementById(s).value||0;
Ligne 178: Ligne 391:
 } }
  
 +// 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];
 +}
 +});
 +
 +// ===== ESQUIVE =====
 let esquive=Math.round(char.agi*0.75+char.cc*0.25); let esquive=Math.round(char.agi*0.75+char.cc*0.25);
  
 +let checked=[...document.querySelectorAll(".skill:checked")].map(e=>e.dataset.name);
 +
 +if(checked.includes("Réflexes fulgurants"))
 +esquive=Math.round(char.agi*0.85+char.cc*0.15);
 +
 +if(checked.includes("Couverture"))
 +esquive=Math.round(char.cc*0.85+char.agi*0.15);
 +
 +if(checked.includes("Fulgurance"))
 +esquive+=1;
 +
 +// ===== MAGIE =====
 let jetFM = char.fm * 2; let jetFM = char.fm * 2;
  
-let sorts=""; +let sorts = ""; 
-for(let lvl=1;lvl<=5;lvl++){ +for(let lvl=1; lvl<=5; lvl++){ 
-let seuil=6+6*lvl; +let seuil = 6 + 6 * lvl; 
-sorts+=`Niv ${lvl} : ${jetFM>=seuil?"✅":"❌"}\n`;+let reussite = jetFM >= seuil ? "✅" : "❌"
 + 
 +sorts += `Niveau ${lvl} → Seuil ${seuil} | Jet ${jetFM} ${reussite}\n`;
 } }
  
 +// ===== AFFICHAGE =====
 result.textContent = result.textContent =
 +"===== STATS =====\n"+
 JSON.stringify(char,null,2)+ JSON.stringify(char,null,2)+
-"\n⚡ A : "+char.a++ 
 +"\n\n⚔ CC : "+char.cc+ 
 +"\n🎯 CT : "+char.ct+ 
 +"\n✨ FM : "+char.fm+
 "\n🛡 Esquive : "+esquive+ "\n🛡 Esquive : "+esquive+
-"\n\n"+sorts;+ 
 +"\n\n===== MAGIE =====\n"
 +"Jet FM (x2) : "+jetFM+"\n\n"+ 
 +sorts;
 } }
 +
 +// ===== AUTO =====
 +function autoCalculate(){
 +updateCost();
 +calculate();
 +}
 +
 +// events stats
 +document.querySelectorAll("#stats input").forEach(i=>{
 +i.addEventListener("input", autoCalculate);
 +});
 +
 +// passifs
 +document.querySelectorAll(".skill").forEach(s=>{
 +s.addEventListener("change", autoCalculate);
 +});
 +
 +// ===== RESET =====
 +function resetAll(){
 +
 +document.querySelectorAll("#stats input").forEach(i=>i.value=0);
 +
 +Object.values(slots).forEach(s=>{
 +s.value="";
 +s.disabled=false;
 +});
 +
 +document.querySelectorAll(".skill").forEach(s=>s.checked=false);
 +
 +resetSlots();
 +fillEquip();
 +displayBase();
 +checkLimit();
 +autoCalculate();
 +}
 +
 +// init
 +autoCalculate();
 +
 +
  
 // ===== POUSSEE ===== // ===== POUSSEE =====
brouillon6.1777671552.txt.gz · Dernière modification : 2026/05/01 23:39 de nanaki