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 19:14] nanakibrouillon10 [2026/04/29 23:56] (Version actuelle) nanaki
Ligne 1: Ligne 1:
-<!DOCTYPE html> 
 <html> <html>
 <head> <head>
Ligne 31: Ligne 30:
  
 .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 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 107: Ligne 113:
 // ===== PASSIFS ===== // ===== PASSIFS =====
 const skills = [ const skills = [
-"Fulgurance","Duelliste","Encaisser", +{name:"Fulgurance",desc:"+1 esquive"}, 
-"Anguille","Couverture","Inépuisable","Maitre bretteur"+{name:"Couverture",desc:"85% CC / 15% AGI"}
 +{name:"Réflexes fulgurants",desc:"85% AGI / 15% CC"}, 
 +{name:"Anguille",desc:"Avantage esquive"}
 ]; ];
 +
  
 // ===== ÉQUIPEMENTS ===== // ===== ÉQUIPEMENTS =====
Ligne 206: Ligne 215:
  
 ]; ];
- 
- 
- 
- 
  
 // ===== INIT ===== // ===== INIT =====
Ligne 216: Ligne 221:
 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 226:
  
 // 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 248:
 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 253:
 // ===== 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 261:
 } }
 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 !== 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>`; 
-// main droite +if(e.slot==="body") body.innerHTML+=`<option value="${i}">${e.name}</option>`; 
-if(e.slot==="weapon" || e.slot==="weapon2h") +if(e.slot==="head") head.innerHTML+=`<option value="${i}">${e.name}</option>`; 
-rightHand.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>`; 
-// main gauche +if(e.slot==="feet") feet.innerHTML+=`<option value="${i}">${e.name}</option>`; 
-if(e.slot==="offhand") +if(e.slot==="ring") ring.innerHTML+=`<option value="${i}">${e.name}</option>`;
-leftHand.innerHTML += `<option value="${i}">${e.name}</option>`; +
- +
-// corps +
-if(e.slot==="body") +
-body.innerHTML += `<option value="${i}">${e.name}</option>`; +
- +
-// tête +
-if(e.slot==="head") +
-head.innerHTML += `<option value="${i}">${e.name}</option>`; +
- +
-// cou +
-if(e.slot==="neck") +
-neck.innerHTML += `<option value="${i}">${e.name}</option>`; +
- +
-// dos +
-if(e.slot==="cape") +
-cape.innerHTML += `<option value="${i}">${e.name}</option>`; +
- +
-// pieds +
-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>`; +
 }); });
 } }
  
-// update race +raceSelect.addEventListener("change",()=>{
-raceSelect.addEventListener("change", ()=>{+
 resetSlots(); resetSlots();
 fillEquip(); fillEquip();
 +autoCalculate();
 }); });
  
-// init 
 resetSlots(); resetSlots();
 fillEquip(); 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;
 +}
  
 +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);
 +}
 +}
  
 // ===== CALCUL ===== // ===== CALCUL =====
 function calculate(){ function calculate(){
  
-let char = {...races[raceSelect.value]}+let char={...races[raceSelect.value]};
-let totalPI = 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);+
 } }
  
-// résumé +// equip 
-let esquive Math.round(char.agi*0.75 char.cc*0.25);+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 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;
 +
 +// affichage
 result.textContent = result.textContent =
-JSON.stringify(char,null,2) +"===== STATS =====\n"
-"\n\n💰 PI : "+totalPI +JSON.stringify(char,null,2)+ 
-+ "\n⚔ CC : "+char.cc +"\n\n⚔ CC : "+char.cc+ 
-+ "\n🎯 CT 1-4 : "+char.ct+"/"+(char.ct-1)+"/"+(char.ct-2)+"/"+(char.ct-3) +"\n🎯 CT : "+char.ct+ 
-"\n✨ FM : "+char.fm +"\n✨ FM : "+char.fm+ 
-+ "\n🛡 Esquive tir : "+esquive;+"\n🛡 Esquive : "+esquive; 
 +}
  
 +// ===== AUTO =====
 +function autoCalculate(){
 +updateCost();
 +calculate();
 } }
  
-</script>+// 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();
 +
 +</script>
 </body> </body>
 </html> </html>
brouillon10.1777482870.txt.gz · Dernière modification : 2026/04/29 19:14 de nanaki