Outils pour utilisateurs

Outils du site


brouillon10

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
brouillon10 [2026/04/29 16:57] nanakibrouillon10 [2026/04/29 23:56] (Version actuelle) nanaki
Ligne 1: Ligne 1:
-<!DOCTYPE html> 
 <html> <html>
 <head> <head>
Ligne 21: Ligne 20:
 } }
  
-/* MOBILE FIX */ +select margin:3px; max-width:150px; } 
-input { +input margin:3px; width:50px; }
-  width:50px; +
-+
- +
-select { +
-  max-width:180px; +
-}+
  
 .statLine { .statLine {
   display:flex;   display:flex;
   justify-content:space-between;   justify-content:space-between;
-  margin-bottom:4px;+  max-width:260px;
 } }
  
 .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 52: Ligne 52:
  
 <h3>Stats de base</h3> <h3>Stats de base</h3>
-<div id="baseStats"></div>+<pre id="baseStats"></pre>
 </div> </div>
  
Ligne 81: Ligne 81:
 </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 96: Ligne 96:
 }; };
  
-// ===== COSTS =====+// ===== COST =====
 const costTable = { const costTable = {
 cc:[100,50,30], ct:[110,50,30], cc:[100,50,30], ct:[110,50,30],
Ligne 113: Ligne 113:
 // ===== PASSIFS ===== // ===== PASSIFS =====
 const skills = [ const skills = [
-"Fulgurance", +{name:"Fulgurance",desc:"+1 esquive"}
-"Duelliste", +{name:"Couverture",desc:"85% CC / 15% AGI"}
-"Encaisser", +{name:"Réflexes fulgurants",desc:"85% AGI / 15% CC"}
-"Anguille", +{name:"Anguille",desc:"Avantage esquive"}
-"Couverture", +
-"Inépuisable", +
-"Maitre bretteur"+
 ]; ];
  
-// ===== ÉQUIPEMENTS (simplifié mais extensible) =====+ 
 +// ===== ÉQUIPEMENTS =====
 const equipments = [ const equipments = [
-{name:"Lance",slot:"weapon",stats:{cc:1,f:1}}, + 
-{name:"Arc long",slot:"weapon2h",stats:{ct:2,cc:-2}}, +/* ================= COMMUNS ================= */ 
-{name:"Targe",slot:"offhand",stats:{cc:1}}, + 
-{name:"Targe renforcée",slot:"offhand",stats:{cc:1,pv:10}}, +{name:"Arc",race:"all",slot:"weapon2h",stats:{cc:-1,ct:1}}, 
-{name:"Armure sylvestre",slot:"body",stats:{e:2,mvt:-1},magicBlock:true}, +{name:"Armure matelassée",race:"all",slot:"body",stats:{e:1,agi:-2}}, 
-{name:"Bottes Tâlroval",slot:"feet",stats:{mvt:2}}, +{name:"Bâton de marche",race:"all",slot:"weapon",stats:{mvt:1}}, 
-{name:"Cape de chasse",slot:"cape",stats:{ct:1}}, +{name:"Bottes de marche",race:"all",slot:"feet",stats:{mvt:1}}, 
-{name:"Visière",slot:"head",stats:{p:1}}, +{name:"Bouclier Parma",race:"all",slot:"offhand",stats:{e:1,agi:-2}}, 
-{name:"Collier tressé",slot:"neck",stats:{pv:5,pm:5}}, +{name:"Fustibale",race:"all",slot:"weapon",stats:{cc:-2,ct:1}}, 
-{name:"Anneau Finesse",slot:"ring",stats:{cc:1}}+{name:"Gladius",race:"all",slot:"weapon",stats:{cc:1}}, 
 +{name:"Sceptre",race:"all",slot:"weapon",stats:{fm:1}}, 
 +{name:"Lance",race:"all",slot:"weapon",stats:{ct:1,cc:-1}}, 
 +{name:"Targe",race:"all",slot:"offhand",stats:{cc:1,agi:-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}}, 
 + 
 +/* ================= ELFES ================= */ 
 + 
 +{name:"Bâton du Pèlerin",race:"Elfe",slot:"weapon",stats:{mvt:1,fm:1}}, 
 +{name:"Bottes Tâlroval",race:"Elfe",slot:"feet",stats:{mvt:2}}, 
 +{name:"Cuirasse",race:"Elfe",slot:"body",stats:{e:1,r:2}}, 
 +{name:"Lance de garde Sylvestre",race:"Elfe",slot:"weapon",stats:{cc:1,f:1}}, 
 +{name:"Sceptre de mage",race:"Elfe",slot:"weapon2h",stats:{m:1,fm:1}}, 
 +{name:"Arc Ensorcelé",race:"Elfe",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:"Toge de feuillage",race:"Elfe",slot:"body",stats:{fm:1,agi:1,pv:5}}, 
 +{name:"Marque Forestière",race:"Elfe",slot:"neck",stats:{pm:10,r:1}}, 
 +{name:"Capuche du chasseur",race:"Elfe",slot:"head",stats:{ct:1,r:1}}, 
 + 
 +/* ================= NAINS ================= */ 
 + 
 +{name:"Cotte de mailles",race:"Nain",slot:"body",stats:{e:2,agi:-4}}, 
 +{name:"Labrys",race:"Nain",slot:"weapon",stats:{cc:1,f:1}}, 
 +{name:"Marteau de guerre",race:"Nain",slot:"weapon2h",stats:{f:2,cc:-1}}, 
 +{name:"Targe renforcée naine",race:"Nain",slot:"offhand",stats:{cc:1,pv:10}}, 
 +{name:"Armure runique",race:"Nain",slot:"body",stats:{e:1,pm:8}}, 
 +{name:"Cape dorée",race:"Nain",slot:"cape",stats:{m:1,fm:1},magicBlock:true}, 
 +{name:"Solerets",race:"Nain",slot:"feet",stats:{mvt:1,pm:5,pv:5}}, 
 +{name:"Casque grossissant",race:"Nain",slot:"head",stats:{ct:2,p:-1}}, 
 + 
 +/* ================= GÉANTS ================= */ 
 + 
 +{name:"Bouclier Clipeus",race:"Géant",slot:"offhand",stats:{e:1,pv:10}}, 
 +{name:"Masse d'arme",race:"Géant",slot:"weapon",stats:{cc:1,f:1}}, 
 +{name:"Hallebarde de pierre",race:"Géant",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:"Géant",slot:"weapon",stats:{f:2,ct:-1,cc:-1}}, 
 +{name:"Broigne",race:"Géant",slot:"body",stats:{e:2,f:-1}}, 
 +{name:"Fétiche de shaman",race:"Géant",slot:"offhand",stats:{r:2,pm:5}}, 
 +{name:"Bottes incandescentes",race:"Géant",slot:"feet",stats:{mvt:1,r:1,pv:5}}, 
 +{name:"Médaillon hanté",race:"Géant",slot:"neck",stats:{cc:1,ct:1}}, 
 + 
 +/* ================= HS ================= */ 
 + 
 +{name:"Bâton de sage",race:"HS",slot:"weapon2h",stats:{m:1,agi:1}}, 
 +{name:"Orbe de mana",race:"HS",slot:"weapon2h",stats:{m:1,rm:1}}, 
 +{name:"Cape de mage",race:"HS",slot:"cape",stats:{fm:1,rm:1}}, 
 +{name:"Armure de fourrure",race:"HS",slot:"body",stats:{e:2,rm:-3}}, 
 +{name:"Ceste",race:"HS",slot:"weapon",stats:{f:1,cc:1}}, 
 +{name:"Collier d'apaisement",race:"HS",slot:"neck",stats:{pv:10,pm:5}}, 
 +{name:"Bottes de voleur",race:"HS",slot:"feet",stats:{mvt:1,agi:1}}, 
 +{name:"Sarbacane",race:"HS",slot:"weapon",stats:{ct:1,f:10,cc:-1}}, 
 +{name:"Bouclier en lianes",race:"HS",slot:"offhand",stats:{cc:1,agi:1}}, 
 + 
 +/* ================= OLYMPIENS ================= */ 
 + 
 +{name:"Armure hoplitique",race:"Olympien",slot:"body",stats:{e:1,m:1}}, 
 +{name:"Bouclier Ancile",race:"Olympien",slot:"offhand",stats:{e:1}}, 
 +{name:"Diadème",race:"Olympien",slot:"head",stats:{r:1,rm:2}}, 
 +{name:"Pilum",race:"Olympien",slot:"weapon",stats:{ct:1,f:1,cc:-1}}, 
 +{name:"Spatha",race:"Olympien",slot:"weapon",stats:{cc:1,f:1}}, 
 +{name:"Sceptre de puissance",race:"Olympien",slot:"weapon",stats:{m:1,pm:8}}, 
 +{name:"Lame Sainte",race:"Olympien",slot:"weapon",stats:{cc:1,m:1}}, 
 +{name:"Tiare d'Oracle",race:"Olympien",slot:"head",stats:{fm:1,p:1}}, 
 +{name:"Cnémides",race:"Olympien",slot:"feet",stats:{mvt:1,rm:1,r:1}}, 
 + 
 +/* ================= 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}} 
 ]; ];
  
Ligne 141: Ligne 221:
 const baseDiv = document.getElementById("baseStats"); const baseDiv = document.getElementById("baseStats");
  
-const slots = ["head","neck","cape","rightHand","leftHand","body","ring","feet"]; 
- 
-// race select 
 for(let r in races){ for(let r in races){
 raceSelect.innerHTML += `<option>${r}</option>`; raceSelect.innerHTML += `<option>${r}</option>`;
 } }
  
-// stats inputs+// stats UI
 for(let s in costTable){ for(let s in costTable){
-statsDiv.innerHTML += `<div class="statLine">${s} <input id="${s}" type="numbervalue="0"></div>`;+statsDiv.innerHTML += ` 
 +<div class="statLine"
 +<span>${s}</span> 
 +<input type="number" id="${s}" value="0min="0"> 
 +</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>`;
 }); });
  
-// ===== BASE STATS DISPLAY =====+// base stats
 function displayBase(){ function displayBase(){
-let r = races[raceSelect.value]+baseDiv.textContent JSON.stringify(races[raceSelect.value],null,2);
-baseDiv.innerHTML = JSON.stringify(r,null,2);+
 } }
 +raceSelect.addEventListener("change", displayBase);
 +displayBase();
  
-// ===== EQUIP ===== +// ===== COST ===== 
-function resetEquip(){ +function calcCost(b,m1,m2,n){ 
-slots.forEach(id=>+let total=0,last=b; 
-document.getElementById(id).innerHTML = `<option value="">--</option>`; +for(let i=1;i<=n;i++)
-});+if(i===1) last=b; 
 +else if(i<=3) last+=m1; 
 +else last+=m2; 
 +total+=last; 
 +
 +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 ===== 
 +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(){ function fillEquip(){
 +let r=raceSelect.value;
 +
 equipments.forEach((e,i)=>{ equipments.forEach((e,i)=>{
-if(e.slot==="weapon"||e.slot==="weapon2h") +if(e.race!=="all"&&e.race!==r) return; 
-rightHand.innerHTML += `<option value="${i}">${e.name}</option>`; + 
-if(e.slot==="offhand") +if(e.slot==="weapon"||e.slot==="weapon2h") rightHand.innerHTML+=`<option value="${i}">${e.name}</option>`; 
-leftHand.innerHTML += `<option value="${i}">${e.name}</option>`; +if(e.slot==="offhand") leftHand.innerHTML+=`<option value="${i}">${e.name}</option>`; 
-if(e.slot==="body") +if(e.slot==="body") body.innerHTML+=`<option value="${i}">${e.name}</option>`; 
-body.innerHTML += `<option value="${i}">${e.name}</option>`; +if(e.slot==="head") head.innerHTML+=`<option value="${i}">${e.name}</option>`; 
-if(e.slot==="head") +if(e.slot==="neck") neck.innerHTML+=`<option value="${i}">${e.name}</option>`; 
-head.innerHTML += `<option value="${i}">${e.name}</option>`; +if(e.slot==="cape") cape.innerHTML+=`<option value="${i}">${e.name}</option>`; 
-if(e.slot==="neck") +if(e.slot==="feet") feet.innerHTML+=`<option value="${i}">${e.name}</option>`; 
-neck.innerHTML += `<option value="${i}">${e.name}</option>`; +if(e.slot==="ring") ring.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", ()=>{ +raceSelect.addEventListener("change",()=>
-displayBase(); +resetSlots();
-resetEquip();+
 fillEquip(); fillEquip();
 +autoCalculate();
 }); });
  
-displayBase();+resetSlots();
 fillEquip(); fillEquip();
  
-// ===== COST ===== +// ===== BONUS ===== 
-function calcCost(b,m1,m2,n){ +function displayStats(select,id){ 
-let total=0, last=b+let v=select.value; 
-for(let i=1;i<=n;i++){ +let el=document.getElementById(id)
-if(i===1last=b+if(v===""){el.innerHTML="";return;
-else if(i<=3last+=m1+let e=equipments[v]; 
-else last+=m2+let txt=""; 
-total+=last;+for(let s in e.stats){ 
 +let val=e.stats[s]; 
 +txt+=val>0?`+${val} ${s} `:`${val} ${s} `; 
 +
 +el.innerHTML=txt; 
 +
 + 
 +Object.entries(slots).forEach(([k,s])=>
 +s.addEventListener("change",()=>{ 
 +displayStats(s,k+"Stats"); 
 +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);
 } }
-return total; 
 } }
  
Ligne 216: Ligne 352:
 function calculate(){ function calculate(){
  
-let char = {...races[raceSelect.value]}+let char={...races[raceSelect.value]};
-let totalPI = 0; +
-let equipCount = 0;+
  
-// stats+// 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; 
-char[s]+=v; +char[s]=(char[s]||0)+v;
-let [b,m1,m2]=costTable[s]+
-totalPI += calcCost(b,m1,m2,v);+
 } }
  
 // equip // equip
-slots.forEach(id=>{ +Object.values(slots).forEach(sel=>{ 
-let val = document.getElementById(id).value+if(sel.value==="") return
-if(val==="") return;+let e=equipments[sel.value]; 
 +for(let s in e.stats){ 
 +char[s]=(char[s]||0)+e.stats[s]; 
 +
 +});
  
-let equipments[val];+// esquive 
 +let esquive=Math.round(char.agi*0.75+char.cc*0.25);
  
-if(e.slot!=="ring"equipCount++;+let checked=[...document.querySelectorAll(".skill:checked")].map(e=>e.dataset.name);
  
-for(let stat in e.stats){ +if(checked.includes("Réflexes fulgurants")
-char[stat]=(char[stat]||0)+e.stats[stat];+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; 
 + 
 +// affichage 
 +result.textContent = 
 +"===== STATS =====\n"
 +JSON.stringify(char,null,2)+ 
 +"\n\n⚔ CC : "+char.cc+ 
 +"\n🎯 CT : "+char.ct+ 
 +"\n✨ FM : "+char.fm+ 
 +"\n🛡 Esquive : "+esquive;
 } }
 +
 +// ===== AUTO =====
 +function autoCalculate(){
 +updateCost();
 +calculate();
 +}
 +
 +// events stats
 +document.querySelectorAll("#stats input").forEach(i=>{
 +i.addEventListener("input", autoCalculate);
 }); });
  
-// limite +// passifs 
-document.getElementById("limitWarn").innerText = +document.querySelectorAll(".skill").forEach(s=>
-equipCount>3 ? "⚠ Trop d'objets !" : "";+s.addEventListener("change", autoCalculate); 
 +});
  
-// ===== SCORE ===== +// ===== RESET ===== 
-let cc = char.cc; +function resetAll(){
-let fm = char.fm; +
-let ct1 = char.ct; +
-let ct2 = char.ct -1; +
-let ct3 = char.ct -2; +
-let ct4 = char.ct -3;+
  
-let esquiveTir = Math.round(char.agi*0.75 + char.cc*0.25);+document.querySelectorAll("#stats input").forEach(i=>i.value=0);
  
-// ===== RESULT ====+Object.values(slots).forEach(s=>{ 
-result.innerText = +s.value=""; 
-JSON.stringify(char,null,2) +s.disabled=false; 
-"\n\n💰 PI : "+totalPI +});
-+ "\n\n⚔ CC : "+cc +
-+ "\n🎯 CT (1-4 cases): "+ct1+"/"+ct2+"/"+ct3+"/"+ct4 +
-+ "\n✨ FM : "+fm +
-+ "\n🛡 Esquive tir : "+esquiveTir;+
  
 +document.querySelectorAll(".skill").forEach(s=>s.checked=false);
 +
 +resetSlots();
 +fillEquip();
 +displayBase();
 +checkLimit();
 +autoCalculate();
 } }
  
-</script>+// init 
 +autoCalculate();
  
 +</script>
 </body> </body>
 </html> </html>
brouillon10.1777474624.txt.gz · Dernière modification : 2026/04/29 16:57 de nanaki