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/04/30 00:14] nanakibrouillon6 [2026/05/02 00:09] (Version actuelle) nanaki
Ligne 1: Ligne 1:
- 
 <html> <html>
 <head> <head>
Ligne 6: Ligne 5:
  
 <style> <style>
-body {font-family:Arial;background:#0b1a13;color:#f5e6b3;padding:10px;+body { 
-.box {border:1px solid gold;padding:10px;margin-bottom:10px;+  font-family: Arial; 
-select,input {margin:3px;+  background:#0b1a13; 
-input {width:50px;} +  color:#7dd3fc; 
-.result {background:#000;color:#00ffcc;padding:10px;white-space:pre-line;} +  padding:10px
-.warn {color:red;}+
 +h1,h2 { color:gold;} 
 +.box { border:1px solid gold; padding:10px; margin-bottom:10px;
 +select { margin:3px; max-width:150px; } 
 +input { margin:3px; width:60px; } 
 +.statLine { display:flex; justify-content:space-between; max-width:260px; } 
 +.result { background:#000; color:#00ffcc; padding:10px; white-space:pre-wrap; } 
 +.small font-size:12px; color:#aaa; }
 </style> </style>
 </head> </head>
Ligne 17: Ligne 23:
 <body> <body>
  
-<h1>Simulateur RPG</h1>+<h1>🎲 Simulateur</h1>
  
 <div class="box"> <div class="box">
-Race <select id="race"></select>+Race 
 +<select id="race"></select
 +<h3>Stats de base</h3>
 <pre id="baseStats"></pre> <pre id="baseStats"></pre>
 </div> </div>
Ligne 32: Ligne 40:
 <div class="box"> <div class="box">
 <h3>Équipement (3 max + 1 anneau)</h3> <h3>Équipement (3 max + 1 anneau)</h3>
- 
 Tête <select id="head"></select> <span id="headStats"></span><br> Tête <select id="head"></select> <span id="headStats"></span><br>
 Cou <select id="neck"></select> <span id="neckStats"></span><br> Cou <select id="neck"></select> <span id="neckStats"></span><br>
Ligne 41: Ligne 48:
 Anneau <select id="ring"></select> <span id="ringStats"></span><br> Anneau <select id="ring"></select> <span id="ringStats"></span><br>
 Pieds <select id="feet"></select> <span id="feetStats"></span> Pieds <select id="feet"></select> <span id="feetStats"></span>
- +<div id="limitWarn" style="color:red;"></div>
-<div id="limitWarn" class="warn"></div>+
 </div> </div>
  
Ligne 48: Ligne 54:
 <h3>Passifs</h3> <h3>Passifs</h3>
 <div id="skills"></div> <div id="skills"></div>
 +</div>
 +
 +<!-- ================= POUSSEE ================= -->
 +<div class="box">
 +<h3>Simulateur de poussée</h3>
 +
 +Force assaillant <input id="pushF" type="number" value="10">
 +Renforcement <select id="pushBuff"><option value="0">0</option><option value="6">+6</option></select><br>
 +
 +Endurance <input id="pushE" type="number" value="5">
 +Agilité <input id="pushAgi" type="number" value="5"><br>
 +
 +PV actuels <input id="pushPV" type="number" value="50"><br>
 +
 +Instabilité <select id="pushDebuff"><option value="0">0</option><option value="-6">-6</option></select>
 +Stabilité <select id="pushStab"><option value="0">0</option><option value="6">+6</option><option value="12">+12</option><option value="18">+18</option></select>
 +
 +<pre id="pushResult" class="result"></pre>
 </div> </div>
  
Ligne 58: 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}, +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}, +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}, +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}, +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}+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 81: Ligne 106:
  
 // ===== PASSIFS ===== // ===== PASSIFS =====
-const passifs = [ +const skills = [ 
-{name:"Fulgurance",effect:(c)=>{c.cc+=1;c.esquive+=1}}, +{name:"Fulgurance",desc:"+1 toucher au cac + 1 esquive tous les 5 mouvements"}
-{name:"Duelliste",effect:(c)=>{c.cc+=1}}, +{name:"Couverture",desc:"85% CC / 15% AGI"}, 
-{name:"Anguille",effect:(c)=>{c.esquive+=2}}, +{name:"Réflexes fulgurants",desc:"85% AGI / 15% CC"}, 
-{name:"Couverture",effect:(c)=>{c.esquive = Math.round(c.cc*0.85 c.agi*0.15)}}, +{name:"Berserker",desc:"+1 toucher au cac tous les 10 pv perdus"}, 
-{name:"Réflexes fulgurants",effect:(c)=>{c.esquive = Math.round(c.agi*0.85 + c.cc*0.15)}}+{name:"Griffes",desc:"+3 dégâts au poings"}, 
 +{name:"Anguille",desc:"Avantage esquive"}
 ]; ];
  
-// ===== ÉQUIPEMENTS ===== +
-// ===== ÉQUIPEMENTS =====+
 const equipments = [ const equipments = [
  
Ligne 112: Ligne 137:
 {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 186: Ligne 235:
 ]; ];
  
-// ===== DOM =====+ 
 +// ===== INIT =====
 const raceSelect = document.getElementById("race"); const raceSelect = document.getElementById("race");
 const statsDiv = document.getElementById("stats"); const statsDiv = document.getElementById("stats");
-const costDiv = document.getElementById("cost"); +const baseDiv = document.getElementById("baseStats");
-const result = document.getElementById("result");+
  
-// slots +for(let r in races)
-const slots = { +raceSelect.innerHTML += `<option>${r}</option>`; 
-head,neck,cape,rightHand,leftHand,body,ring,feet +}
-}; +
- +
-// ===== INIT ===== +
-for(let r in races) raceSelect.innerHTML+=`<option>${r}</option>`;+
  
 // stats UI // stats UI
 for(let s in costTable){ for(let s in costTable){
-statsDiv.innerHTML+=`${s}<input type="number" id="${s}" value="0"><br>`;+statsDiv.innerHTML += ` 
 +<div class="statLine"> 
 +<span>${s}</span> 
 +<input type="number" id="${s}" value="0" min="0"> 
 +</div>`;
 } }
  
-// passifs UI +// passifs 
-passifs.forEach(p=>{ +skills.forEach(s=>{ 
-skills.innerHTML+=`<label><input type="checkbox" value="${p.name}"> ${p.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>`;
 }); });
  
-// ===== EQUIP =====+// base stats 
 +function displayBase(){ 
 +baseDiv.textContent JSON.stringify(races[raceSelect.value],null,2); 
 +
 +raceSelect.addEventListener("change", displayBase); 
 +displayBase(); 
 + 
 +// ===== COST ====
 +function calcCost(b,m1,m2,n){ 
 +let total=0,last=b; 
 +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(){ function resetSlots(){
-Object.values(slots).forEach(sel=>sel.innerHTML="<option value=''>--</option>");+Object.values(slots).forEach(s=>s.innerHTML="<option value=''>--</option>");
 } }
  
Ligne 219: Ligne 307:
  
 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==="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==="offhand") leftHand.innerHTML+=`<option value="${i}">${e.name}</option>`; 
-if(e.slot=="cape") cape.innerHTML+=`<option value="${i}">${e.name}</option>`; +if(e.slot==="body") body.innerHTML+=`<option value="${i}">${e.name}</option>`; 
-if(e.slot=="ring") ring.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 ===== // ===== LIMIT =====
 function checkLimit(){ function checkLimit(){
 let count=0; let count=0;
- +Object.entries(slots).forEach(([k,s])=>{ 
-["head","neck","cape","body","feet","rightHand","leftHand"].forEach(id=>{ +if(k!=="ring"&&s.value!=="") count++;
-if(document.getElementById(id).value) count++;+
 }); });
  
-if(count>3){ +if(count>=3){ 
-limitWarn.innerText="⚠ Trop d'objets";+limitWarn.innerText="Limite atteinte"
 +Object.entries(slots).forEach(([k,s])=>
 +if(k!=="ring"&&s.value==="") s.disabled=true; 
 +});
 }else{ }else{
 limitWarn.innerText=""; limitWarn.innerText="";
 +Object.values(slots).forEach(s=>s.disabled=false);
 } }
 } }
Ligne 247: Ligne 384:
  
 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);+
 } }
  
-// équipement+// equip
 Object.values(slots).forEach(sel=>{ Object.values(slots).forEach(sel=>{
-let id=sel.value+if(sel.value==="") return; 
-if(id==="") return; +let e=equipments[sel.value]; 
-let e=equipments[id]; +for(let in e.stats){ 
-for(let stat in e.stats){ +char[s]=(char[s]||0)+e.stats[s];
-char[stat]=(char[stat]||0)+e.stats[stat];+
 } }
 }); });
  
-// esquive base +// ===== ESQUIVE ===== 
-char.esquive=Math.round(char.agi*0.75+char.cc*0.25);+let esquive=Math.round(char.agi*0.75+char.cc*0.25);
  
-// passifs +let checked=[...document.querySelectorAll(".skill:checked")].map(e=>e.dataset.name);
-document.querySelectorAll("#skills input:checked").forEach(p=>+
-let obj=passifs.find(x=>x.name==p.value); +
-if(obj) obj.effect(char); +
-});+
  
-// CT distance +if(checked.includes("Réflexes fulgurants")) 
-let ct1=char.ct; +esquive=Math.round(char.agi*0.85+char.cc*0.15);
-let ct2=char.ct-1; +
-let ct3=char.ct-2; +
-let ct4=char.ct-3;+
  
-// FM moyenne +if(checked.includes("Couverture")) 
-let fmAvg=char.fm*2;+esquive=Math.round(char.cc*0.85+char.agi*0.15);
  
-// sorts +if(checked.includes("Fulgurance")) 
-let sorts=[]+esquive+=1; 
-for(let i=1;i<=5;i++){ + 
-if(fmAvg>=6+6*i) sorts.push(i);+// ===== MAGIE ===== 
 +let jetFM = char.fm * 2; 
 + 
 +let sorts = ""
 +for(let lvl=1; lvl<=5; lvl++){ 
 +let seuil = 6 + 6 * lvl; 
 +let reussite = jetFM >= seuil ? "✅" : "❌"; 
 + 
 +sorts += `Niveau ${lvl} → Seuil ${seuil} | Jet ${jetFM} ${reussite}\n`;
 } }
  
-costDiv.innerText="💰 PI: "+totalPI;+// ===== AFFICHAGE ===== 
 +result.textContent = 
 +"===== STATS =====\n"+ 
 +JSON.stringify(char,null,2)+
  
-result.innerText= +"\n\n⚔ CC : "+char.cc
-JSON.stringify(char,null,2) +"\n🎯 CT : "+char.ct+ 
-+"\n\n🎯 CT: "+ct1+"/"+ct2+"/"+ct3+"/"+ct4 +"\n✨ FM : "+char.fm+ 
-+"\n🛡 Esquive: "+char.esquive +"\n🛡 Esquive : "+esquive+
-+"\n✨ FM moyen: "+fmAvg +
-+"\n🧙 Sorts: "+(sorts.join(", ")||"Aucun");+
  
 +"\n\n===== MAGIE =====\n"+
 +"Jet FM (x2) : "+jetFM+"\n\n"+
 +sorts;
 } }
  
-// ===== COST FUNC ===== +// ===== AUTO ===== 
-function calcCost(b,m1,m2,n){ +function autoCalculate(){ 
-let t=0,l=b; +updateCost(); 
-for(let i=1;i<=n;i++)+calculate();
-if(i==1) l=b+
-else if(i<=3l+=m1; +
-else l+=m2; +
-t+=l; +
-+
-return t;+
 } }
  
-// ===== EVENTS ===== +// events stats 
-document.querySelectorAll("input,select").forEach(e=>{ +document.querySelectorAll("#stats input").forEach(i=>{ 
-e.addEventListener("change",()=>{calculate();checkLimit();});+i.addEventListener("input", autoCalculate);
 }); });
  
-raceSelect.addEventListener("change",()=>{ +// passifs 
-resetSlots();fillEquip();calculate();+document.querySelectorAll(".skill").forEach(s=>{ 
 +s.addEventListener("change", autoCalculate);
 }); });
  
 // ===== RESET ===== // ===== RESET =====
 function resetAll(){ function resetAll(){
-document.querySelectorAll("input").forEach(i=>i.value=0); 
-document.querySelectorAll("select").forEach(s=>s.selectedIndex=0); 
-calculate(); 
-} 
  
-// init+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(); resetSlots();
 fillEquip(); fillEquip();
 +displayBase();
 +checkLimit();
 +autoCalculate();
 +}
 +
 +// init
 +autoCalculate();
 +
 +
 +
 +// ===== POUSSEE =====
 +function calculatePush(){
 +
 +let F=+pushF.value;
 +let buff=+pushBuff.value;
 +
 +let E=+pushE.value;
 +let agi=+pushAgi.value;
 +let pv=+pushPV.value;
 +
 +let instability=+pushDebuff.value;
 +let stability=+pushStab.value;
 +
 +let attaque=F+buff;
 +let defense=Math.max(E+4,agi)+(pv/10)+instability+stability;
 +
 +pushResult.textContent=
 +"Attaque: "+attaque+
 +"\nDéfense: "+defense.toFixed(1)+
 +"\n"+(attaque>=defense?"✅ PUSH":"❌ FAIL");
 +}
 +
 +// ===== EVENTS =====
 +document.querySelectorAll("input").forEach(i=>i.addEventListener("input",()=>{
 +updateCost(); calculate(); calculatePush();
 +}));
 +
 +document.querySelectorAll("select").forEach(i=>i.addEventListener("change",()=>{
 +updateCost(); calculate(); calculatePush();
 +}));
 +
 +// ===== INIT =====
 +updateCost();
 calculate(); calculate();
 +calculatePush();
  
 </script> </script>
 </body> </body>
 </html> </html>
brouillon6.1777500863.txt.gz · Dernière modification : 2026/04/30 00:14 de nanaki